@firebuzz/design-mode 0.1.1 → 0.1.3

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.js CHANGED
@@ -1,11 +1,2 @@
1
- 'use strict';var c=require('fs/promises'),t=require('path'),f=require('esbuild');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var c__default=/*#__PURE__*/_interopDefault(c);var t__default=/*#__PURE__*/_interopDefault(t);var f__namespace=/*#__PURE__*/_interopNamespace(f);function m(d){let o=process.env.NODE_ENV==="development"&&process.env.VITE_DESIGN_MODE!=="false",n=process.cwd(),r=t__default.default.resolve(n,d?.tailwindConfigPath||"./tailwind.config.js"),a=t__default.default.resolve(n,d?.outputPath||"./src/design-mode/tailwind.config.json"),s=t__default.default.resolve(n,"./.fb-tailwind.config.js");return {name:"vite-plugin-firebuzz-design-mode",enforce:"pre",async buildStart(){if(o)try{await u();}catch(e){console.warn("[Firebuzz Design Mode] Could not generate Tailwind config:",e);}},configureServer(e){if(o)try{e.watcher.add(r),e.watcher.on("change",async i=>{t__default.default.normalize(i)===t__default.default.normalize(r)&&await u();});}catch(i){console.warn("[Firebuzz Design Mode] Could not watch Tailwind config:",i);}},transformIndexHtml(e){if(!o)return e;let l=`
2
- <script type="module">
3
- // Load Tailwind config and make it available globally
4
- const response = await fetch('${a.replace(n,"")}');
5
- const config = await response.json();
6
- window.__FIREBUZZ_TAILWIND_CONFIG__ = config;
7
-
8
- // Then load the overlay using package import
9
- await import('@firebuzz/design-mode/overlay');
10
- </script>`;return e.replace("</body>",`${l}</body>`)}};async function u(){try{await f__namespace.build({entryPoints:[r],outfile:s,bundle:!0,format:"esm",banner:{js:'import { createRequire } from "module"; const require = createRequire(import.meta.url);'}});let e=await import(`${s}?update=${Date.now()}`);if(!e?.default)throw new Error("Invalid Tailwind config structure");let{default:i}=await import('tailwindcss/resolveConfig.js'),l=i(e.default),g=t__default.default.dirname(a);await c__default.default.mkdir(g,{recursive:!0}),await c__default.default.writeFile(a,JSON.stringify(l,null,2)),await c__default.default.unlink(s).catch(()=>{}),console.log("[Firebuzz Design Mode] Generated Tailwind config JSON successfully");}catch(e){throw console.error("[Firebuzz Design Mode] Error generating config:",e),e}}}exports.firebuzzDesignMode=m;//# sourceMappingURL=index.js.map
1
+ 'use strict';var l=require('fs/promises'),r=require('path'),g=require('esbuild');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var l__default=/*#__PURE__*/_interopDefault(l);var r__default=/*#__PURE__*/_interopDefault(r);var g__namespace=/*#__PURE__*/_interopNamespace(g);function w(d){let t=process.env.NODE_ENV==="development"&&process.env.VITE_DESIGN_MODE!=="false",o=process.cwd(),n=r__default.default.resolve(o,d?.tailwindConfigPath||"./tailwind.config.js"),u=r__default.default.resolve(o,d?.outputPath||"./src/design-mode/tailwind.config.json"),a=r__default.default.resolve(o,"./.fb-tailwind.config.js"),s="virtual:firebuzz-design-mode-overlay",c=`\0${s}`;return {name:"vite-plugin-firebuzz-design-mode",enforce:"pre",async buildStart(){if(t)try{await f();}catch(e){console.warn("[Firebuzz Design Mode] Could not generate Tailwind config:",e);}},configureServer(e){if(t)try{e.watcher.add(n),e.watcher.on("change",async i=>{r__default.default.normalize(i)===r__default.default.normalize(n)&&await f();});}catch(i){console.warn("[Firebuzz Design Mode] Could not watch Tailwind config:",i);}},resolveId(e){if(e===s)return c},load(e){if(e===c)return "export * from '@firebuzz/design-mode/overlay';"},transformIndexHtml(e){return t?e.replace("</body>",`<script type="module" src="${s}"></script></body>`):e}};async function f(){try{await g__namespace.build({entryPoints:[n],outfile:a,bundle:!0,format:"esm",banner:{js:'import { createRequire } from "module"; const require = createRequire(import.meta.url);'}});let e=await import(`${a}?update=${Date.now()}`);if(!e?.default)throw new Error("Invalid Tailwind config structure");let{default:i}=await import('tailwindcss/resolveConfig.js'),m=i(e.default),p=r__default.default.dirname(u);await l__default.default.mkdir(p,{recursive:!0}),await l__default.default.writeFile(u,JSON.stringify(m,null,2)),await l__default.default.unlink(a).catch(()=>{}),console.log("[Firebuzz Design Mode] Generated Tailwind config JSON successfully");}catch(e){throw console.error("[Firebuzz Design Mode] Error generating config:",e),e}}}exports.firebuzzDesignMode=w;//# sourceMappingURL=index.js.map
11
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vite-plugin.ts"],"names":["firebuzzDesignMode","options","isDesignModeEnabled","projectRoot","tailwindConfigFile","path","tailwindJsonOutfile","tailwindIntermediateFile","generateTailwindConfig","error","server","changedPath","html","scripts","f","userConfig","resolveConfig","resolvedConfig","outputDir","fs"],"mappings":"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","file":"index.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as esbuild from \"esbuild\";\nimport type { Plugin } from \"vite\";\n\n/**\n * Vite plugin that enables design mode features for Firebuzz templates\n * - Generates Tailwind config JSON for client-side use\n * - Injects overlay script for element selection\n *\n * NOTE: This plugin does NOT modify JSX/TSX files.\n * Element tracking is done at runtime using React Fiber's _debugSource.\n *\n * @param options - Plugin configuration options\n * @param options.tailwindConfigPath - Path to tailwind.config.js (default: \"./tailwind.config.js\")\n * @param options.outputPath - Path to output tailwind.config.json (default: \"./src/design-mode/tailwind.config.json\")\n */\nexport function firebuzzDesignMode(options?: {\n\ttailwindConfigPath?: string;\n\toutputPath?: string;\n}): Plugin {\n\t// Only enable in development, never in production builds\n\tconst isDesignModeEnabled =\n\t\tprocess.env.NODE_ENV === \"development\" &&\n\t\tprocess.env.VITE_DESIGN_MODE !== \"false\";\n\n\tconst projectRoot = process.cwd();\n\tconst tailwindConfigFile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.tailwindConfigPath || \"./tailwind.config.js\",\n\t);\n\tconst tailwindJsonOutfile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.outputPath || \"./src/design-mode/tailwind.config.json\",\n\t);\n\tconst tailwindIntermediateFile = path.resolve(\n\t\tprojectRoot,\n\t\t\"./.fb-tailwind.config.js\",\n\t);\n\n\treturn {\n\t\tname: \"vite-plugin-firebuzz-design-mode\",\n\t\tenforce: \"pre\",\n\n\t\tasync buildStart() {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Generate Tailwind config JSON for client-side use\n\t\t\ttry {\n\t\t\t\tawait generateTailwindConfig();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not generate Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Watch Tailwind config for changes\n\t\t\ttry {\n\t\t\t\tserver.watcher.add(tailwindConfigFile);\n\t\t\t\tserver.watcher.on(\"change\", async (changedPath) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tpath.normalize(changedPath) === path.normalize(tailwindConfigFile)\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait generateTailwindConfig();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not watch Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\ttransformIndexHtml(html) {\n\t\t\tif (!isDesignModeEnabled) return html;\n\n\t\t\t// Inject Tailwind config as a global variable first\n\t\t\tconst configJsonPath = tailwindJsonOutfile.replace(projectRoot, \"\");\n\n\t\t\t// Inject the overlay script before </body>\n\t\t\tconst scripts = `\n<script type=\"module\">\n\t// Load Tailwind config and make it available globally\n\tconst response = await fetch('${configJsonPath}');\n\tconst config = await response.json();\n\twindow.__FIREBUZZ_TAILWIND_CONFIG__ = config;\n\n\t// Then load the overlay using package import\n\tawait import('@firebuzz/design-mode/overlay');\n</script>`;\n\n\t\t\treturn html.replace(\"</body>\", `${scripts}</body>`);\n\t\t},\n\t};\n\n\tasync function generateTailwindConfig() {\n\t\ttry {\n\t\t\t// Bundle Tailwind config using esbuild\n\t\t\tawait esbuild.build({\n\t\t\t\tentryPoints: [tailwindConfigFile],\n\t\t\t\toutfile: tailwindIntermediateFile,\n\t\t\t\tbundle: true,\n\t\t\t\tformat: \"esm\",\n\t\t\t\tbanner: {\n\t\t\t\t\tjs: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Import and resolve the config\n\t\t\tconst userConfig = await import(\n\t\t\t\t`${tailwindIntermediateFile}?update=${Date.now()}`\n\t\t\t);\n\n\t\t\tif (!userConfig?.default) {\n\t\t\t\tthrow new Error(\"Invalid Tailwind config structure\");\n\t\t\t}\n\n\t\t\t// Dynamically import tailwindcss/resolveConfig\n\t\t\tconst { default: resolveConfig } = await import(\n\t\t\t\t\"tailwindcss/resolveConfig.js\"\n\t\t\t);\n\t\t\tconst resolvedConfig = resolveConfig(userConfig.default);\n\n\t\t\t// Ensure output directory exists\n\t\t\tconst outputDir = path.dirname(tailwindJsonOutfile);\n\t\t\tawait fs.mkdir(outputDir, { recursive: true });\n\n\t\t\t// Write resolved config to JSON\n\t\t\tawait fs.writeFile(\n\t\t\t\ttailwindJsonOutfile,\n\t\t\t\tJSON.stringify(resolvedConfig, null, 2),\n\t\t\t);\n\n\t\t\t// Clean up intermediate file\n\t\t\tawait fs.unlink(tailwindIntermediateFile).catch(() => {});\n\n\t\t\tconsole.log(\n\t\t\t\t\"[Firebuzz Design Mode] Generated Tailwind config JSON successfully\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Firebuzz Design Mode] Error generating config:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/vite-plugin.ts"],"names":["firebuzzDesignMode","options","isDesignModeEnabled","projectRoot","tailwindConfigFile","path","tailwindJsonOutfile","tailwindIntermediateFile","virtualModuleId","resolvedVirtualModuleId","generateTailwindConfig","error","server","changedPath","id","html","g","userConfig","resolveConfig","resolvedConfig","outputDir","fs"],"mappings":"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","file":"index.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as esbuild from \"esbuild\";\nimport type { Plugin } from \"vite\";\n\n/**\n * Vite plugin that enables design mode features for Firebuzz templates\n * - Generates Tailwind config JSON for client-side use\n * - Injects overlay script for element selection\n *\n * NOTE: This plugin does NOT modify JSX/TSX files.\n * Element tracking is done at runtime using React Fiber's _debugSource.\n *\n * @param options - Plugin configuration options\n * @param options.tailwindConfigPath - Path to tailwind.config.js (default: \"./tailwind.config.js\")\n * @param options.outputPath - Path to output tailwind.config.json (default: \"./src/design-mode/tailwind.config.json\")\n */\nexport function firebuzzDesignMode(options?: {\n\ttailwindConfigPath?: string;\n\toutputPath?: string;\n}): Plugin {\n\t// Only enable in development, never in production builds\n\tconst isDesignModeEnabled =\n\t\tprocess.env.NODE_ENV === \"development\" &&\n\t\tprocess.env.VITE_DESIGN_MODE !== \"false\";\n\n\tconst projectRoot = process.cwd();\n\tconst tailwindConfigFile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.tailwindConfigPath || \"./tailwind.config.js\",\n\t);\n\tconst tailwindJsonOutfile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.outputPath || \"./src/design-mode/tailwind.config.json\",\n\t);\n\tconst tailwindIntermediateFile = path.resolve(\n\t\tprojectRoot,\n\t\t\"./.fb-tailwind.config.js\",\n\t);\n\n\tconst virtualModuleId = \"virtual:firebuzz-design-mode-overlay\";\n\tconst resolvedVirtualModuleId = `\\0${virtualModuleId}`;\n\n\treturn {\n\t\tname: \"vite-plugin-firebuzz-design-mode\",\n\t\tenforce: \"pre\",\n\n\t\tasync buildStart() {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Generate Tailwind config JSON for client-side use\n\t\t\ttry {\n\t\t\t\tawait generateTailwindConfig();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not generate Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Watch Tailwind config for changes\n\t\t\ttry {\n\t\t\t\tserver.watcher.add(tailwindConfigFile);\n\t\t\t\tserver.watcher.on(\"change\", async (changedPath) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tpath.normalize(changedPath) === path.normalize(tailwindConfigFile)\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait generateTailwindConfig();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not watch Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tresolveId(id) {\n\t\t\tif (id === virtualModuleId) {\n\t\t\t\treturn resolvedVirtualModuleId;\n\t\t\t}\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (id === resolvedVirtualModuleId) {\n\t\t\t\t// Return a simple re-export from the actual overlay module\n\t\t\t\treturn `export * from '@firebuzz/design-mode/overlay';`;\n\t\t\t}\n\t\t},\n\n\t\ttransformIndexHtml(html) {\n\t\t\tif (!isDesignModeEnabled) return html;\n\n\t\t\t// Inject the overlay script before </body> using virtual module\n\t\t\treturn html.replace(\n\t\t\t\t\"</body>\",\n\t\t\t\t`<script type=\"module\" src=\"${virtualModuleId}\"></script></body>`,\n\t\t\t);\n\t\t},\n\t};\n\n\tasync function generateTailwindConfig() {\n\t\ttry {\n\t\t\t// Bundle Tailwind config using esbuild\n\t\t\tawait esbuild.build({\n\t\t\t\tentryPoints: [tailwindConfigFile],\n\t\t\t\toutfile: tailwindIntermediateFile,\n\t\t\t\tbundle: true,\n\t\t\t\tformat: \"esm\",\n\t\t\t\tbanner: {\n\t\t\t\t\tjs: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Import and resolve the config\n\t\t\tconst userConfig = await import(\n\t\t\t\t`${tailwindIntermediateFile}?update=${Date.now()}`\n\t\t\t);\n\n\t\t\tif (!userConfig?.default) {\n\t\t\t\tthrow new Error(\"Invalid Tailwind config structure\");\n\t\t\t}\n\n\t\t\t// Dynamically import tailwindcss/resolveConfig\n\t\t\tconst { default: resolveConfig } = await import(\n\t\t\t\t\"tailwindcss/resolveConfig.js\"\n\t\t\t);\n\t\t\tconst resolvedConfig = resolveConfig(userConfig.default);\n\n\t\t\t// Ensure output directory exists\n\t\t\tconst outputDir = path.dirname(tailwindJsonOutfile);\n\t\t\tawait fs.mkdir(outputDir, { recursive: true });\n\n\t\t\t// Write resolved config to JSON\n\t\t\tawait fs.writeFile(\n\t\t\t\ttailwindJsonOutfile,\n\t\t\t\tJSON.stringify(resolvedConfig, null, 2),\n\t\t\t);\n\n\t\t\t// Clean up intermediate file\n\t\t\tawait fs.unlink(tailwindIntermediateFile).catch(() => {});\n\n\t\t\tconsole.log(\n\t\t\t\t\"[Firebuzz Design Mode] Generated Tailwind config JSON successfully\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Firebuzz Design Mode] Error generating config:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,11 +1,2 @@
1
- import c from'fs/promises';import t from'path';import*as f from'esbuild';function m(d){let o=process.env.NODE_ENV==="development"&&process.env.VITE_DESIGN_MODE!=="false",n=process.cwd(),r=t.resolve(n,d?.tailwindConfigPath||"./tailwind.config.js"),a=t.resolve(n,d?.outputPath||"./src/design-mode/tailwind.config.json"),s=t.resolve(n,"./.fb-tailwind.config.js");return {name:"vite-plugin-firebuzz-design-mode",enforce:"pre",async buildStart(){if(o)try{await u();}catch(e){console.warn("[Firebuzz Design Mode] Could not generate Tailwind config:",e);}},configureServer(e){if(o)try{e.watcher.add(r),e.watcher.on("change",async i=>{t.normalize(i)===t.normalize(r)&&await u();});}catch(i){console.warn("[Firebuzz Design Mode] Could not watch Tailwind config:",i);}},transformIndexHtml(e){if(!o)return e;let l=`
2
- <script type="module">
3
- // Load Tailwind config and make it available globally
4
- const response = await fetch('${a.replace(n,"")}');
5
- const config = await response.json();
6
- window.__FIREBUZZ_TAILWIND_CONFIG__ = config;
7
-
8
- // Then load the overlay using package import
9
- await import('@firebuzz/design-mode/overlay');
10
- </script>`;return e.replace("</body>",`${l}</body>`)}};async function u(){try{await f.build({entryPoints:[r],outfile:s,bundle:!0,format:"esm",banner:{js:'import { createRequire } from "module"; const require = createRequire(import.meta.url);'}});let e=await import(`${s}?update=${Date.now()}`);if(!e?.default)throw new Error("Invalid Tailwind config structure");let{default:i}=await import('tailwindcss/resolveConfig.js'),l=i(e.default),g=t.dirname(a);await c.mkdir(g,{recursive:!0}),await c.writeFile(a,JSON.stringify(l,null,2)),await c.unlink(s).catch(()=>{}),console.log("[Firebuzz Design Mode] Generated Tailwind config JSON successfully");}catch(e){throw console.error("[Firebuzz Design Mode] Error generating config:",e),e}}}export{m as firebuzzDesignMode};//# sourceMappingURL=index.mjs.map
1
+ import l from'fs/promises';import r from'path';import*as g from'esbuild';function w(d){let t=process.env.NODE_ENV==="development"&&process.env.VITE_DESIGN_MODE!=="false",o=process.cwd(),n=r.resolve(o,d?.tailwindConfigPath||"./tailwind.config.js"),u=r.resolve(o,d?.outputPath||"./src/design-mode/tailwind.config.json"),a=r.resolve(o,"./.fb-tailwind.config.js"),s="virtual:firebuzz-design-mode-overlay",c=`\0${s}`;return {name:"vite-plugin-firebuzz-design-mode",enforce:"pre",async buildStart(){if(t)try{await f();}catch(e){console.warn("[Firebuzz Design Mode] Could not generate Tailwind config:",e);}},configureServer(e){if(t)try{e.watcher.add(n),e.watcher.on("change",async i=>{r.normalize(i)===r.normalize(n)&&await f();});}catch(i){console.warn("[Firebuzz Design Mode] Could not watch Tailwind config:",i);}},resolveId(e){if(e===s)return c},load(e){if(e===c)return "export * from '@firebuzz/design-mode/overlay';"},transformIndexHtml(e){return t?e.replace("</body>",`<script type="module" src="${s}"></script></body>`):e}};async function f(){try{await g.build({entryPoints:[n],outfile:a,bundle:!0,format:"esm",banner:{js:'import { createRequire } from "module"; const require = createRequire(import.meta.url);'}});let e=await import(`${a}?update=${Date.now()}`);if(!e?.default)throw new Error("Invalid Tailwind config structure");let{default:i}=await import('tailwindcss/resolveConfig.js'),m=i(e.default),p=r.dirname(u);await l.mkdir(p,{recursive:!0}),await l.writeFile(u,JSON.stringify(m,null,2)),await l.unlink(a).catch(()=>{}),console.log("[Firebuzz Design Mode] Generated Tailwind config JSON successfully");}catch(e){throw console.error("[Firebuzz Design Mode] Error generating config:",e),e}}}export{w as firebuzzDesignMode};//# sourceMappingURL=index.mjs.map
11
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vite-plugin.ts"],"names":["firebuzzDesignMode","options","isDesignModeEnabled","projectRoot","tailwindConfigFile","path","tailwindJsonOutfile","tailwindIntermediateFile","generateTailwindConfig","error","server","changedPath","html","scripts","userConfig","resolveConfig","resolvedConfig","outputDir","fs"],"mappings":"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","file":"index.mjs","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as esbuild from \"esbuild\";\nimport type { Plugin } from \"vite\";\n\n/**\n * Vite plugin that enables design mode features for Firebuzz templates\n * - Generates Tailwind config JSON for client-side use\n * - Injects overlay script for element selection\n *\n * NOTE: This plugin does NOT modify JSX/TSX files.\n * Element tracking is done at runtime using React Fiber's _debugSource.\n *\n * @param options - Plugin configuration options\n * @param options.tailwindConfigPath - Path to tailwind.config.js (default: \"./tailwind.config.js\")\n * @param options.outputPath - Path to output tailwind.config.json (default: \"./src/design-mode/tailwind.config.json\")\n */\nexport function firebuzzDesignMode(options?: {\n\ttailwindConfigPath?: string;\n\toutputPath?: string;\n}): Plugin {\n\t// Only enable in development, never in production builds\n\tconst isDesignModeEnabled =\n\t\tprocess.env.NODE_ENV === \"development\" &&\n\t\tprocess.env.VITE_DESIGN_MODE !== \"false\";\n\n\tconst projectRoot = process.cwd();\n\tconst tailwindConfigFile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.tailwindConfigPath || \"./tailwind.config.js\",\n\t);\n\tconst tailwindJsonOutfile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.outputPath || \"./src/design-mode/tailwind.config.json\",\n\t);\n\tconst tailwindIntermediateFile = path.resolve(\n\t\tprojectRoot,\n\t\t\"./.fb-tailwind.config.js\",\n\t);\n\n\treturn {\n\t\tname: \"vite-plugin-firebuzz-design-mode\",\n\t\tenforce: \"pre\",\n\n\t\tasync buildStart() {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Generate Tailwind config JSON for client-side use\n\t\t\ttry {\n\t\t\t\tawait generateTailwindConfig();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not generate Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Watch Tailwind config for changes\n\t\t\ttry {\n\t\t\t\tserver.watcher.add(tailwindConfigFile);\n\t\t\t\tserver.watcher.on(\"change\", async (changedPath) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tpath.normalize(changedPath) === path.normalize(tailwindConfigFile)\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait generateTailwindConfig();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not watch Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\ttransformIndexHtml(html) {\n\t\t\tif (!isDesignModeEnabled) return html;\n\n\t\t\t// Inject Tailwind config as a global variable first\n\t\t\tconst configJsonPath = tailwindJsonOutfile.replace(projectRoot, \"\");\n\n\t\t\t// Inject the overlay script before </body>\n\t\t\tconst scripts = `\n<script type=\"module\">\n\t// Load Tailwind config and make it available globally\n\tconst response = await fetch('${configJsonPath}');\n\tconst config = await response.json();\n\twindow.__FIREBUZZ_TAILWIND_CONFIG__ = config;\n\n\t// Then load the overlay using package import\n\tawait import('@firebuzz/design-mode/overlay');\n</script>`;\n\n\t\t\treturn html.replace(\"</body>\", `${scripts}</body>`);\n\t\t},\n\t};\n\n\tasync function generateTailwindConfig() {\n\t\ttry {\n\t\t\t// Bundle Tailwind config using esbuild\n\t\t\tawait esbuild.build({\n\t\t\t\tentryPoints: [tailwindConfigFile],\n\t\t\t\toutfile: tailwindIntermediateFile,\n\t\t\t\tbundle: true,\n\t\t\t\tformat: \"esm\",\n\t\t\t\tbanner: {\n\t\t\t\t\tjs: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Import and resolve the config\n\t\t\tconst userConfig = await import(\n\t\t\t\t`${tailwindIntermediateFile}?update=${Date.now()}`\n\t\t\t);\n\n\t\t\tif (!userConfig?.default) {\n\t\t\t\tthrow new Error(\"Invalid Tailwind config structure\");\n\t\t\t}\n\n\t\t\t// Dynamically import tailwindcss/resolveConfig\n\t\t\tconst { default: resolveConfig } = await import(\n\t\t\t\t\"tailwindcss/resolveConfig.js\"\n\t\t\t);\n\t\t\tconst resolvedConfig = resolveConfig(userConfig.default);\n\n\t\t\t// Ensure output directory exists\n\t\t\tconst outputDir = path.dirname(tailwindJsonOutfile);\n\t\t\tawait fs.mkdir(outputDir, { recursive: true });\n\n\t\t\t// Write resolved config to JSON\n\t\t\tawait fs.writeFile(\n\t\t\t\ttailwindJsonOutfile,\n\t\t\t\tJSON.stringify(resolvedConfig, null, 2),\n\t\t\t);\n\n\t\t\t// Clean up intermediate file\n\t\t\tawait fs.unlink(tailwindIntermediateFile).catch(() => {});\n\n\t\t\tconsole.log(\n\t\t\t\t\"[Firebuzz Design Mode] Generated Tailwind config JSON successfully\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Firebuzz Design Mode] Error generating config:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/vite-plugin.ts"],"names":["firebuzzDesignMode","options","isDesignModeEnabled","projectRoot","tailwindConfigFile","path","tailwindJsonOutfile","tailwindIntermediateFile","virtualModuleId","resolvedVirtualModuleId","generateTailwindConfig","error","server","changedPath","id","html","userConfig","resolveConfig","resolvedConfig","outputDir","fs"],"mappings":"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","file":"index.mjs","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as esbuild from \"esbuild\";\nimport type { Plugin } from \"vite\";\n\n/**\n * Vite plugin that enables design mode features for Firebuzz templates\n * - Generates Tailwind config JSON for client-side use\n * - Injects overlay script for element selection\n *\n * NOTE: This plugin does NOT modify JSX/TSX files.\n * Element tracking is done at runtime using React Fiber's _debugSource.\n *\n * @param options - Plugin configuration options\n * @param options.tailwindConfigPath - Path to tailwind.config.js (default: \"./tailwind.config.js\")\n * @param options.outputPath - Path to output tailwind.config.json (default: \"./src/design-mode/tailwind.config.json\")\n */\nexport function firebuzzDesignMode(options?: {\n\ttailwindConfigPath?: string;\n\toutputPath?: string;\n}): Plugin {\n\t// Only enable in development, never in production builds\n\tconst isDesignModeEnabled =\n\t\tprocess.env.NODE_ENV === \"development\" &&\n\t\tprocess.env.VITE_DESIGN_MODE !== \"false\";\n\n\tconst projectRoot = process.cwd();\n\tconst tailwindConfigFile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.tailwindConfigPath || \"./tailwind.config.js\",\n\t);\n\tconst tailwindJsonOutfile = path.resolve(\n\t\tprojectRoot,\n\t\toptions?.outputPath || \"./src/design-mode/tailwind.config.json\",\n\t);\n\tconst tailwindIntermediateFile = path.resolve(\n\t\tprojectRoot,\n\t\t\"./.fb-tailwind.config.js\",\n\t);\n\n\tconst virtualModuleId = \"virtual:firebuzz-design-mode-overlay\";\n\tconst resolvedVirtualModuleId = `\\0${virtualModuleId}`;\n\n\treturn {\n\t\tname: \"vite-plugin-firebuzz-design-mode\",\n\t\tenforce: \"pre\",\n\n\t\tasync buildStart() {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Generate Tailwind config JSON for client-side use\n\t\t\ttry {\n\t\t\t\tawait generateTailwindConfig();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not generate Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tif (!isDesignModeEnabled) return;\n\n\t\t\t// Watch Tailwind config for changes\n\t\t\ttry {\n\t\t\t\tserver.watcher.add(tailwindConfigFile);\n\t\t\t\tserver.watcher.on(\"change\", async (changedPath) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tpath.normalize(changedPath) === path.normalize(tailwindConfigFile)\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait generateTailwindConfig();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[Firebuzz Design Mode] Could not watch Tailwind config:\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tresolveId(id) {\n\t\t\tif (id === virtualModuleId) {\n\t\t\t\treturn resolvedVirtualModuleId;\n\t\t\t}\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (id === resolvedVirtualModuleId) {\n\t\t\t\t// Return a simple re-export from the actual overlay module\n\t\t\t\treturn `export * from '@firebuzz/design-mode/overlay';`;\n\t\t\t}\n\t\t},\n\n\t\ttransformIndexHtml(html) {\n\t\t\tif (!isDesignModeEnabled) return html;\n\n\t\t\t// Inject the overlay script before </body> using virtual module\n\t\t\treturn html.replace(\n\t\t\t\t\"</body>\",\n\t\t\t\t`<script type=\"module\" src=\"${virtualModuleId}\"></script></body>`,\n\t\t\t);\n\t\t},\n\t};\n\n\tasync function generateTailwindConfig() {\n\t\ttry {\n\t\t\t// Bundle Tailwind config using esbuild\n\t\t\tawait esbuild.build({\n\t\t\t\tentryPoints: [tailwindConfigFile],\n\t\t\t\toutfile: tailwindIntermediateFile,\n\t\t\t\tbundle: true,\n\t\t\t\tformat: \"esm\",\n\t\t\t\tbanner: {\n\t\t\t\t\tjs: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Import and resolve the config\n\t\t\tconst userConfig = await import(\n\t\t\t\t`${tailwindIntermediateFile}?update=${Date.now()}`\n\t\t\t);\n\n\t\t\tif (!userConfig?.default) {\n\t\t\t\tthrow new Error(\"Invalid Tailwind config structure\");\n\t\t\t}\n\n\t\t\t// Dynamically import tailwindcss/resolveConfig\n\t\t\tconst { default: resolveConfig } = await import(\n\t\t\t\t\"tailwindcss/resolveConfig.js\"\n\t\t\t);\n\t\t\tconst resolvedConfig = resolveConfig(userConfig.default);\n\n\t\t\t// Ensure output directory exists\n\t\t\tconst outputDir = path.dirname(tailwindJsonOutfile);\n\t\t\tawait fs.mkdir(outputDir, { recursive: true });\n\n\t\t\t// Write resolved config to JSON\n\t\t\tawait fs.writeFile(\n\t\t\t\ttailwindJsonOutfile,\n\t\t\t\tJSON.stringify(resolvedConfig, null, 2),\n\t\t\t);\n\n\t\t\t// Clean up intermediate file\n\t\t\tawait fs.unlink(tailwindIntermediateFile).catch(() => {});\n\n\t\t\tconsole.log(\n\t\t\t\t\"[Firebuzz Design Mode] Generated Tailwind config JSON successfully\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Firebuzz Design Mode] Error generating config:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firebuzz/design-mode",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Design mode overlay and utilities for Firebuzz landing page templates",
5
5
  "author": "Firebuzz Team",
6
6
  "license": "MIT",