weevar 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/parseDataWvSource.ts","../src/vite/babelAddSource.ts","../src/vite/tailwindProbe.ts","../src/vite/plugin.ts"],"names":["path","t","babel","fs","pathToFileURL"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,SAAS,mBAAmB,GAAA,EAA6B;AAC9D,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,IAC1B,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,KAAK,GAAA,CAAI;AAAA,GACV,CAAA;AACD,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,IAAI,CAAC,CAAC,CAAA;AAChD;;;ACrBA,SAAS,qBAAA,CAAsB,SAAiB,GAAA,EAAwB;AACtE,EAAA,MAAM,GAAA,GAAMA,sBAAA,CAAK,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA,CAAE,KAAA,CAAMA,sBAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,OAAA;AACrE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,kBAAkB,CAAA,EAAG;AACnB,QAAA,MAAM,GAAA,GAAM,EAAE,IAAA,CAAK,GAAA;AACnB,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,CAAK,UAAA;AACrB,QAAA,IACE,KAAA,CAAM,IAAA;AAAA,UACJ,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,KAAS,cAAA,IACX,MAAA,IAAU,CAAA,IACV,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,eAAA,IAChB,CAAA,CAAE,KAAK,IAAA,KAAS;AAAA,SACpB;AAEA,UAAA;AACF,QAAA,MAAM,UAAU,kBAAA,CAAmB;AAAA,UACjC,IAAA,EAAM,GAAA;AAAA,UACN,IAAA,EAAM,IAAI,KAAA,CAAM,IAAA;AAAA,UAChB,GAAA,EAAK,IAAI,KAAA,CAAM;AAAA,SAChB,CAAA;AACD,QAAA,KAAA,CAAM,IAAA;AAAA,UACFC,0BAAeA,YAAA,CAAA,aAAA,CAAc,gBAAgB,CAAA,EAAKA,YAAA,CAAA,aAAA,CAAc,OAAO,CAAC;AAAA,SAC5E;AAAA,MACF;AAAA;AACF,GACF;AACF;AAEO,SAAS,4BAAA,CACd,IAAA,EACA,OAAA,EACA,GAAA,EAC4D;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAeC,+BAAc,IAAA,EAAM;AAAA,MACvC,QAAA,EAAU,OAAA;AAAA,MACV,GAAA;AAAA,MACA,GAAA,EAAK,KAAA;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,CAAC,0BAAA,EAA4B,EAAE,OAAO,IAAA,EAAM,aAAA,EAAe,MAAM,CAAA;AAAA,QACjE,CAAC,qBAAA,EAAuB,EAAE,OAAA,EAAS,aAAa;AAAA,OAClD;AAAA,MACA,OAAA,EAAS,CAAC,qBAAA,CAAsB,OAAA,EAAS,GAAG,CAAC;AAAA,KAC9C,CAAA;AACD,IAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAO,IAAA;AAC1B,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,GAAA,EAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACjDA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,uBAAuB,GAAA,EAAiC;AAC/D,EAAA,KAAA,MAAW,KAAK,qBAAA,EAAuB;AACrC,IAAA,MAAM,CAAA,GAAIF,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA;AAC1B,IAAA,IAAIG,mBAAA,CAAG,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,wBAAwB,GAAA,EAAsB;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUH,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AAC7C,IAAA,IAAI,CAACG,mBAAA,CAAG,UAAA,CAAW,OAAO,GAAG,OAAO,KAAA;AACpC,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMA,oBAAG,YAAA,CAAa,OAAA,EAAS,MAAM,CAAC,CAAA;AAIvD,IAAA,OAAO,OAAA;AAAA,MACL,GAAA,CAAI,YAAA,EAAc,WAAA,IAAe,GAAA,CAAI,eAAA,EAAiB;AAAA,KACxD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,sCAAsC,GAAA,EAAmC;AACvF,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,8BAA8B,CAAA;AAClD,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,MAAM,KAAA,GAAQ,EAAE,CAAC,CAAA;AACjB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,KAAA,GAAQ,mBAAA;AACd,EAAA,IAAI,EAAA;AACJ,EAAA,OAAQ,EAAA,GAAK,MAAM,IAAA,CAAK,KAAK,GAAI,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AACjD,EAAA,OAAO,KAAA,CAAM,SAAS,KAAA,GAAQ,MAAA;AAChC;AAEA,eAAe,wBAAwB,GAAA,EAAqC;AAC1E,EAAA,MAAM,GAAA,GAAM,uBAAuB,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,MAAM,GAAA,GAAMH,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAsB;AAAA,IAC1B,UAAA,EAAY,GAAA;AAAA,IACZ,sBAAA,EAAwB,wBAAwB,GAAG;AAAA,GACrD;AACA,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMG,mBAAA,CAAG,YAAA,CAAa,GAAA,EAAK,MAAM,CAAA;AACvC,MAAA,MAAM,KAAA,GAAQ,sCAAsC,GAAG,CAAA;AACvD,MAAA,OAAO,OAAO,MAAA,GAAS,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,OAAM,GAAI,IAAA;AAAA,IAC5D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAOC,kBAAc,GAAG,CAAA,CAAE,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAA;AACvD,IAAA,MAAM,GAAA,GAAO,MAAM,OAAO,IAAA,CAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAS,OAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAQ,CAAA;AACtE,MAAA,IAAI,MAAM,MAAA,EAAQ,OAAO,EAAE,GAAG,IAAA,EAAM,cAAc,KAAA,EAAM;AAAA,IAC1D;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMD,mBAAA,CAAG,YAAA,CAAa,GAAA,EAAK,MAAM,CAAA;AACvC,MAAA,MAAM,KAAA,GAAQ,sCAAsC,GAAG,CAAA;AACvD,MAAA,OAAO,OAAO,MAAA,GAAS,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,OAAM,GAAI,IAAA;AAAA,IAC5D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,eAAsB,mBAAmB,GAAA,EAAqC;AAC5E,EAAA,MAAM,GAAA,GAAM,wBAAwB,GAAG,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,uBAAuB,GAAG,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,GAAA,SAAY,EAAC;AAC9B,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,GAAG,CAAA;AAClD,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,sBAAA,EAAwB,OAAO,QAAA,CAAS,sBAAA;AAAA,IACxC,UAAA,EAAY,SAAS,UAAA,IAAc;AAAA,GACrC;AACF;;;ACjGA,IAAM,OAAA,GAAU,yBAAA;AAEhB,SAAS,cAAc,CAAA,EAA0C;AAC/D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEA,SAAS,SAAA,CACP,MACA,IAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAA+B,EAAE,GAAG,IAAA,EAAK;AAC/C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,EAAA,GAAK,KAAK,GAAG,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,KAAK,GAAG,CAAA;AACnB,IAAA,IAAI,aAAA,CAAc,EAAE,CAAA,IAAK,aAAA,CAAc,EAAE,CAAA,EAAG;AAC1C,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,SAAA,CAAU,EAAA,EAAI,EAAE,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,EAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,eAAe,qBAAqB,GAAA,EAA+C;AACjF,EAAA,MAAM,OAAA,GAAUH,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,mBAAmB,CAAA;AAClD,EAAA,MAAM,MAAA,GAASA,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,kBAAkB,CAAA;AAChD,EAAA,MAAM,IAAA,GAAOG,mBAAAA,CAAG,UAAA,CAAW,OAAO,CAAA,GAAI,UAAUA,mBAAAA,CAAG,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AACjF,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAOC,kBAAc,IAAI,CAAA,CAAE,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAA;AACxD,IAAA,MAAM,GAAA,GAAO,MAAM,OAAO,IAAA,CAAA;AAC1B,IAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAChB,IAAA,OAAO,aAAA,CAAc,GAAG,CAAA,GAAI,GAAA,GAAM,EAAC;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAGA,eAAsB,uBAAuB,GAAA,EAA+C;AAC1F,EAAA,MAAM,QAAA,GAAWJ,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,oBAAoB,CAAA;AACpD,EAAA,IAAI,UAAmC,EAAC;AACxC,EAAA,IAAI;AACF,IAAA,IAAIG,mBAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAMA,oBAAG,YAAA,CAAa,QAAA,EAAU,MAAM,CAAC,CAAA;AAC3D,MAAA,OAAA,GAAU,aAAA,CAAc,MAAM,CAAA,GAAI,MAAA,GAAS,EAAC;AAAA,IAC9C;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,GAAU,EAAC;AAAA,EACb;AACA,EAAA,MAAM,SAAA,GAAY,MAAM,oBAAA,CAAqB,GAAG,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,EAAS,SAAS,CAAA;AAE3C,EAAA,MAAM,EAAA,GAAK,MAAM,kBAAA,CAAmB,GAAG,CAAA;AAEvC,EAAA,IAAI,GAAG,UAAA,IAAc,EAAA,CAAG,sBAAA,IAA0B,EAAA,CAAG,cAAc,MAAA,EAAQ;AACzE,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA,GAAI,EAAE,GAAG,MAAA,CAAO,OAAA,EAAQ,GAAI,EAAC;AACzE,IAAA,IACE,OAAA,CAAQ,uBAAA,KAA4B,MAAA,KACnC,EAAA,CAAG,cAAc,EAAA,CAAG,sBAAA,CAAA;AAErB,MAAA,OAAA,CAAQ,uBAAA,GAA0B,IAAA;AACpC,IAAA,IAAI,EAAA,CAAG,YAAA,EAAc,MAAA,IAAU,OAAA,CAAQ,oBAAA,KAAyB,MAAA;AAC9D,MAAA,OAAA,CAAQ,uBAAuB,EAAA,CAAG,YAAA;AACpC,IAAA,IAAI,EAAA,CAAG,UAAA,IAAc,OAAA,CAAQ,kBAAA,KAAuB,MAAA;AAClD,MAAA,OAAA,CAAQ,qBAAqB,EAAA,CAAG,UAAA;AAClC,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AAAA,EACnB;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,MAAA,GAAiB;AAC/B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,UAAU,EAAA,EAAI;AACZ,MAAA,IAAI,EAAA,KAAO,yBAAyB,OAAO,OAAA;AAAA,IAC7C,CAAA;AAAA,IACA,MAAM,KAAK,EAAA,EAAI;AACb,MAAA,IAAI,EAAA,KAAO,SAAS,OAAO,IAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAAuB,OAAA,CAAQ,KAAK,CAAA;AACvD,MAAA,OAAO,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,SAAA,CAAU,MAAM,EAAA,EAAI;AAClB,MAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,EAAE,GAAG,OAAO,IAAA;AACrC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,cAAc,CAAA,EAAG,OAAO,IAAA;AACxC,MAAA,MAAM,MAAM,4BAAA,CAA6B,IAAA,EAAM,EAAA,EAAI,OAAA,CAAQ,KAAK,CAAA;AAChE,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,GAAA,EAAK,GAAA,CAAI,OAAO,MAAA,EAAU;AAAA,IACrD;AAAA,GACF;AACF","file":"vite.js","sourcesContent":["import type { SourceLocation } from \"./layoutTypes\";\n\nfunction decodeBase64Json(raw: string): SourceLocation | undefined {\n try {\n const bin = atob(raw.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n const j = JSON.parse(bin) as { file?: string; line?: number; col?: number };\n if (!j?.file || !Number.isFinite(j.line)) return undefined;\n return { file: String(j.file), line: Number(j.line), col: Number(j.col ?? 0) };\n } catch {\n return undefined;\n }\n}\n\n/** `data-wv-source` = base64(JSON.stringify({file,line,col})) from optional tooling. */\nexport function parseDataWvSource(el: Element): SourceLocation | undefined {\n const raw = el.getAttribute(\"data-wv-source\");\n if (!raw) return undefined;\n return decodeBase64Json(raw);\n}\n\nexport function encodeDataWvSource(loc: SourceLocation): string {\n const json = JSON.stringify({\n file: loc.file,\n line: loc.line,\n col: loc.col,\n });\n return btoa(unescape(encodeURIComponent(json)));\n}\n","import * as babel from \"@babel/core\";\nimport * as t from \"@babel/types\";\nimport path from \"node:path\";\nimport type { PluginObj } from \"@babel/core\";\nimport { encodeDataWvSource } from \"../engine/parseDataWvSource\";\n\nfunction weevarJsxSourcePlugin(absFile: string, cwd: string): PluginObj {\n const rel = path.relative(cwd, absFile).split(path.sep).join(\"/\") || absFile;\n return {\n name: \"weevar-jsx-source-attr\",\n visitor: {\n JSXOpeningElement(p) {\n const loc = p.node.loc;\n if (!loc) return;\n const attrs = p.node.attributes;\n if (\n attrs.some(\n (a) =>\n a.type === \"JSXAttribute\" &&\n \"name\" in a &&\n a.name.type === \"JSXIdentifier\" &&\n a.name.name === \"data-wv-source\",\n )\n )\n return;\n const payload = encodeDataWvSource({\n file: rel,\n line: loc.start.line,\n col: loc.start.column,\n });\n attrs.push(\n t.jsxAttribute(t.jsxIdentifier(\"data-wv-source\"), t.stringLiteral(payload)),\n );\n },\n },\n };\n}\n\nexport function transformJsxWithWeevarSource(\n code: string,\n absFile: string,\n cwd: string,\n): { code: string; map: babel.BabelFileResult[\"map\"] } | null {\n try {\n const result = babel.transformSync(code, {\n filename: absFile,\n cwd,\n ast: false,\n babelrc: false,\n configFile: false,\n sourceMaps: true,\n presets: [\n [\"@babel/preset-typescript\", { isTSX: true, allExtensions: true }],\n [\"@babel/preset-react\", { runtime: \"automatic\" }],\n ],\n plugins: [weevarJsxSourcePlugin(absFile, cwd)],\n });\n if (!result?.code) return null;\n return { code: result.code, map: result.map ?? null };\n } catch {\n return null;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport type TailwindHints = {\n /** Relative path to the resolved Tailwind config file, if any. */\n configPath?: string;\n /** Best-effort glob strings from `content:` (regex scan of JS/TS source). */\n contentGlobs?: string[];\n /** True when `tailwindcss` appears in package.json dependencies. */\n tailwindPackagePresent?: boolean;\n};\n\nconst TAILWIND_CONFIG_NAMES = [\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n];\n\nfunction findTailwindConfigPath(cwd: string): string | undefined {\n for (const n of TAILWIND_CONFIG_NAMES) {\n const p = path.join(cwd, n);\n if (fs.existsSync(p)) return n;\n }\n return undefined;\n}\n\nfunction readTailwindPackageFlag(cwd: string): boolean {\n try {\n const pkgPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(pkgPath)) return false;\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n return Boolean(\n pkg.dependencies?.tailwindcss ?? pkg.devDependencies?.tailwindcss,\n );\n } catch {\n return false;\n }\n}\n\n/** Pull quoted strings from the first top-level `content: [...]` block (best-effort). */\nexport function extractContentGlobsFromTailwindSource(src: string): string[] | undefined {\n const m = src.match(/content\\s*:\\s*\\[([\\s\\S]*?)\\]/);\n if (!m) return undefined;\n const inner = m[1];\n const globs: string[] = [];\n const strRe = /['\"]([^'\"]+)['\"]/g;\n let sm: RegExpExecArray | null;\n while ((sm = strRe.exec(inner))) globs.push(sm[1]);\n return globs.length ? globs : undefined;\n}\n\nasync function tryImportTailwindConfig(cwd: string): Promise<TailwindHints> {\n const rel = findTailwindConfigPath(cwd);\n if (!rel) return {};\n const abs = path.join(cwd, rel);\n const base: TailwindHints = {\n configPath: rel,\n tailwindPackagePresent: readTailwindPackageFlag(cwd),\n };\n if (rel.endsWith(\".ts\")) {\n try {\n const src = fs.readFileSync(abs, \"utf8\");\n const globs = extractContentGlobsFromTailwindSource(src);\n return globs?.length ? { ...base, contentGlobs: globs } : base;\n } catch {\n return base;\n }\n }\n try {\n const href = pathToFileURL(abs).href + `?t=${Date.now()}`;\n const mod = (await import(href)) as { default?: { content?: unknown } };\n const content = mod.default?.content;\n if (Array.isArray(content)) {\n const globs = content.filter((x): x is string => typeof x === \"string\");\n if (globs.length) return { ...base, contentGlobs: globs };\n }\n } catch {\n try {\n const src = fs.readFileSync(abs, \"utf8\");\n const globs = extractContentGlobsFromTailwindSource(src);\n return globs?.length ? { ...base, contentGlobs: globs } : base;\n } catch {\n return base;\n }\n }\n return base;\n}\n\n/** Resolve Tailwind presence and optional `content` hints for virtual config / prompts. */\nexport async function probeTailwindHints(cwd: string): Promise<TailwindHints> {\n const pkg = readTailwindPackageFlag(cwd);\n const cfgPath = findTailwindConfigPath(cwd);\n if (!cfgPath && !pkg) return {};\n const imported = await tryImportTailwindConfig(cwd);\n return {\n ...imported,\n tailwindPackagePresent: pkg || imported.tailwindPackagePresent,\n configPath: imported.configPath ?? cfgPath,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Plugin } from \"vite\";\nimport { transformJsxWithWeevarSource } from \"./babelAddSource\";\nimport { probeTailwindHints } from \"./tailwindProbe\";\n\nconst VIRTUAL = \"\\0virtual:weevar-config\";\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction deepMerge(\n base: Record<string, unknown>,\n over: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const key of Object.keys(over)) {\n const bv = over[key];\n const av = base[key];\n if (isPlainObject(bv) && isPlainObject(av)) {\n out[key] = deepMerge(av, bv);\n } else {\n out[key] = bv;\n }\n }\n return out;\n}\n\nasync function loadOptionalJsConfig(cwd: string): Promise<Record<string, unknown>> {\n const mjsPath = path.join(cwd, \"weevar.config.mjs\");\n const jsPath = path.join(cwd, \"weevar.config.js\");\n const pick = fs.existsSync(mjsPath) ? mjsPath : fs.existsSync(jsPath) ? jsPath : null;\n if (!pick) return {};\n try {\n const href = pathToFileURL(pick).href + `?t=${Date.now()}`;\n const mod = (await import(href)) as { default?: unknown };\n const def = mod.default;\n return isPlainObject(def) ? def : {};\n } catch {\n return {};\n }\n}\n\n/** Merges `weevar.config.json` with optional `weevar.config.mjs` / `weevar.config.js` (JS wins on overlap). */\nexport async function loadMergedWeevarConfig(cwd: string): Promise<Record<string, unknown>> {\n const jsonPath = path.join(cwd, \"weevar.config.json\");\n let jsonObj: Record<string, unknown> = {};\n try {\n if (fs.existsSync(jsonPath)) {\n const parsed = JSON.parse(fs.readFileSync(jsonPath, \"utf8\")) as unknown;\n jsonObj = isPlainObject(parsed) ? parsed : {};\n }\n } catch {\n jsonObj = {};\n }\n const jsOverlay = await loadOptionalJsConfig(cwd);\n const merged = deepMerge(jsonObj, jsOverlay);\n\n const tw = await probeTailwindHints(cwd);\n\n if (tw.configPath || tw.tailwindPackagePresent || tw.contentGlobs?.length) {\n const prompts = isPlainObject(merged.prompts) ? { ...merged.prompts } : {};\n if (\n prompts.tailwindVerbatimClasses === undefined &&\n (tw.configPath || tw.tailwindPackagePresent)\n )\n prompts.tailwindVerbatimClasses = true;\n if (tw.contentGlobs?.length && prompts.tailwindContentGlobs === undefined)\n prompts.tailwindContentGlobs = tw.contentGlobs;\n if (tw.configPath && prompts.tailwindConfigPath === undefined)\n prompts.tailwindConfigPath = tw.configPath;\n merged.prompts = prompts;\n }\n return merged;\n}\n\n/**\n * Vite integration:\n * - `virtual:weevar-config` — merged JSON + optional JS config, Tailwind file hint.\n * - JSX/TSX transform — injects `data-wv-source` when missing (build-time source map).\n */\nexport function weevar(): Plugin {\n return {\n name: \"weevar\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === \"virtual:weevar-config\") return VIRTUAL;\n },\n async load(id) {\n if (id !== VIRTUAL) return null;\n const data = await loadMergedWeevarConfig(process.cwd());\n return `export default ${JSON.stringify(data)};`;\n },\n transform(code, id) {\n if (!/\\.(tsx|jsx)$/.test(id)) return null;\n if (id.includes(\"node_modules\")) return null;\n const out = transformJsxWithWeevarSource(code, id, process.cwd());\n if (!out) return null;\n return { code: out.code, map: out.map ?? undefined };\n },\n };\n}\n"]}
package/dist/vite.mjs ADDED
@@ -0,0 +1,172 @@
1
+ import { transformJsxWithWeevarSource } from './chunk-LFEEXHSC.mjs';
2
+ import './chunk-IXK7HELP.mjs';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { pathToFileURL } from 'url';
6
+
7
+ var TAILWIND_CONFIG_NAMES = [
8
+ "tailwind.config.js",
9
+ "tailwind.config.cjs",
10
+ "tailwind.config.mjs",
11
+ "tailwind.config.ts"
12
+ ];
13
+ function findTailwindConfigPath(cwd) {
14
+ for (const n of TAILWIND_CONFIG_NAMES) {
15
+ const p = path.join(cwd, n);
16
+ if (fs.existsSync(p)) return n;
17
+ }
18
+ return void 0;
19
+ }
20
+ function readTailwindPackageFlag(cwd) {
21
+ try {
22
+ const pkgPath = path.join(cwd, "package.json");
23
+ if (!fs.existsSync(pkgPath)) return false;
24
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
25
+ return Boolean(
26
+ pkg.dependencies?.tailwindcss ?? pkg.devDependencies?.tailwindcss
27
+ );
28
+ } catch {
29
+ return false;
30
+ }
31
+ }
32
+ function extractContentGlobsFromTailwindSource(src) {
33
+ const m = src.match(/content\s*:\s*\[([\s\S]*?)\]/);
34
+ if (!m) return void 0;
35
+ const inner = m[1];
36
+ const globs = [];
37
+ const strRe = /['"]([^'"]+)['"]/g;
38
+ let sm;
39
+ while (sm = strRe.exec(inner)) globs.push(sm[1]);
40
+ return globs.length ? globs : void 0;
41
+ }
42
+ async function tryImportTailwindConfig(cwd) {
43
+ const rel = findTailwindConfigPath(cwd);
44
+ if (!rel) return {};
45
+ const abs = path.join(cwd, rel);
46
+ const base = {
47
+ configPath: rel,
48
+ tailwindPackagePresent: readTailwindPackageFlag(cwd)
49
+ };
50
+ if (rel.endsWith(".ts")) {
51
+ try {
52
+ const src = fs.readFileSync(abs, "utf8");
53
+ const globs = extractContentGlobsFromTailwindSource(src);
54
+ return globs?.length ? { ...base, contentGlobs: globs } : base;
55
+ } catch {
56
+ return base;
57
+ }
58
+ }
59
+ try {
60
+ const href = pathToFileURL(abs).href + `?t=${Date.now()}`;
61
+ const mod = await import(href);
62
+ const content = mod.default?.content;
63
+ if (Array.isArray(content)) {
64
+ const globs = content.filter((x) => typeof x === "string");
65
+ if (globs.length) return { ...base, contentGlobs: globs };
66
+ }
67
+ } catch {
68
+ try {
69
+ const src = fs.readFileSync(abs, "utf8");
70
+ const globs = extractContentGlobsFromTailwindSource(src);
71
+ return globs?.length ? { ...base, contentGlobs: globs } : base;
72
+ } catch {
73
+ return base;
74
+ }
75
+ }
76
+ return base;
77
+ }
78
+ async function probeTailwindHints(cwd) {
79
+ const pkg = readTailwindPackageFlag(cwd);
80
+ const cfgPath = findTailwindConfigPath(cwd);
81
+ if (!cfgPath && !pkg) return {};
82
+ const imported = await tryImportTailwindConfig(cwd);
83
+ return {
84
+ ...imported,
85
+ tailwindPackagePresent: pkg || imported.tailwindPackagePresent,
86
+ configPath: imported.configPath ?? cfgPath
87
+ };
88
+ }
89
+
90
+ // src/vite/plugin.ts
91
+ var VIRTUAL = "\0virtual:weevar-config";
92
+ function isPlainObject(v) {
93
+ return typeof v === "object" && v !== null && !Array.isArray(v);
94
+ }
95
+ function deepMerge(base, over) {
96
+ const out = { ...base };
97
+ for (const key of Object.keys(over)) {
98
+ const bv = over[key];
99
+ const av = base[key];
100
+ if (isPlainObject(bv) && isPlainObject(av)) {
101
+ out[key] = deepMerge(av, bv);
102
+ } else {
103
+ out[key] = bv;
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ async function loadOptionalJsConfig(cwd) {
109
+ const mjsPath = path.join(cwd, "weevar.config.mjs");
110
+ const jsPath = path.join(cwd, "weevar.config.js");
111
+ const pick = fs.existsSync(mjsPath) ? mjsPath : fs.existsSync(jsPath) ? jsPath : null;
112
+ if (!pick) return {};
113
+ try {
114
+ const href = pathToFileURL(pick).href + `?t=${Date.now()}`;
115
+ const mod = await import(href);
116
+ const def = mod.default;
117
+ return isPlainObject(def) ? def : {};
118
+ } catch {
119
+ return {};
120
+ }
121
+ }
122
+ async function loadMergedWeevarConfig(cwd) {
123
+ const jsonPath = path.join(cwd, "weevar.config.json");
124
+ let jsonObj = {};
125
+ try {
126
+ if (fs.existsSync(jsonPath)) {
127
+ const parsed = JSON.parse(fs.readFileSync(jsonPath, "utf8"));
128
+ jsonObj = isPlainObject(parsed) ? parsed : {};
129
+ }
130
+ } catch {
131
+ jsonObj = {};
132
+ }
133
+ const jsOverlay = await loadOptionalJsConfig(cwd);
134
+ const merged = deepMerge(jsonObj, jsOverlay);
135
+ const tw = await probeTailwindHints(cwd);
136
+ if (tw.configPath || tw.tailwindPackagePresent || tw.contentGlobs?.length) {
137
+ const prompts = isPlainObject(merged.prompts) ? { ...merged.prompts } : {};
138
+ if (prompts.tailwindVerbatimClasses === void 0 && (tw.configPath || tw.tailwindPackagePresent))
139
+ prompts.tailwindVerbatimClasses = true;
140
+ if (tw.contentGlobs?.length && prompts.tailwindContentGlobs === void 0)
141
+ prompts.tailwindContentGlobs = tw.contentGlobs;
142
+ if (tw.configPath && prompts.tailwindConfigPath === void 0)
143
+ prompts.tailwindConfigPath = tw.configPath;
144
+ merged.prompts = prompts;
145
+ }
146
+ return merged;
147
+ }
148
+ function weevar() {
149
+ return {
150
+ name: "weevar",
151
+ enforce: "pre",
152
+ resolveId(id) {
153
+ if (id === "virtual:weevar-config") return VIRTUAL;
154
+ },
155
+ async load(id) {
156
+ if (id !== VIRTUAL) return null;
157
+ const data = await loadMergedWeevarConfig(process.cwd());
158
+ return `export default ${JSON.stringify(data)};`;
159
+ },
160
+ transform(code, id) {
161
+ if (!/\.(tsx|jsx)$/.test(id)) return null;
162
+ if (id.includes("node_modules")) return null;
163
+ const out = transformJsxWithWeevarSource(code, id, process.cwd());
164
+ if (!out) return null;
165
+ return { code: out.code, map: out.map ?? void 0 };
166
+ }
167
+ };
168
+ }
169
+
170
+ export { loadMergedWeevarConfig, weevar };
171
+ //# sourceMappingURL=vite.mjs.map
172
+ //# sourceMappingURL=vite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite/tailwindProbe.ts","../src/vite/plugin.ts"],"names":["path","fs","pathToFileURL"],"mappings":"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","file":"vite.mjs","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport type TailwindHints = {\n /** Relative path to the resolved Tailwind config file, if any. */\n configPath?: string;\n /** Best-effort glob strings from `content:` (regex scan of JS/TS source). */\n contentGlobs?: string[];\n /** True when `tailwindcss` appears in package.json dependencies. */\n tailwindPackagePresent?: boolean;\n};\n\nconst TAILWIND_CONFIG_NAMES = [\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n];\n\nfunction findTailwindConfigPath(cwd: string): string | undefined {\n for (const n of TAILWIND_CONFIG_NAMES) {\n const p = path.join(cwd, n);\n if (fs.existsSync(p)) return n;\n }\n return undefined;\n}\n\nfunction readTailwindPackageFlag(cwd: string): boolean {\n try {\n const pkgPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(pkgPath)) return false;\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n return Boolean(\n pkg.dependencies?.tailwindcss ?? pkg.devDependencies?.tailwindcss,\n );\n } catch {\n return false;\n }\n}\n\n/** Pull quoted strings from the first top-level `content: [...]` block (best-effort). */\nexport function extractContentGlobsFromTailwindSource(src: string): string[] | undefined {\n const m = src.match(/content\\s*:\\s*\\[([\\s\\S]*?)\\]/);\n if (!m) return undefined;\n const inner = m[1];\n const globs: string[] = [];\n const strRe = /['\"]([^'\"]+)['\"]/g;\n let sm: RegExpExecArray | null;\n while ((sm = strRe.exec(inner))) globs.push(sm[1]);\n return globs.length ? globs : undefined;\n}\n\nasync function tryImportTailwindConfig(cwd: string): Promise<TailwindHints> {\n const rel = findTailwindConfigPath(cwd);\n if (!rel) return {};\n const abs = path.join(cwd, rel);\n const base: TailwindHints = {\n configPath: rel,\n tailwindPackagePresent: readTailwindPackageFlag(cwd),\n };\n if (rel.endsWith(\".ts\")) {\n try {\n const src = fs.readFileSync(abs, \"utf8\");\n const globs = extractContentGlobsFromTailwindSource(src);\n return globs?.length ? { ...base, contentGlobs: globs } : base;\n } catch {\n return base;\n }\n }\n try {\n const href = pathToFileURL(abs).href + `?t=${Date.now()}`;\n const mod = (await import(href)) as { default?: { content?: unknown } };\n const content = mod.default?.content;\n if (Array.isArray(content)) {\n const globs = content.filter((x): x is string => typeof x === \"string\");\n if (globs.length) return { ...base, contentGlobs: globs };\n }\n } catch {\n try {\n const src = fs.readFileSync(abs, \"utf8\");\n const globs = extractContentGlobsFromTailwindSource(src);\n return globs?.length ? { ...base, contentGlobs: globs } : base;\n } catch {\n return base;\n }\n }\n return base;\n}\n\n/** Resolve Tailwind presence and optional `content` hints for virtual config / prompts. */\nexport async function probeTailwindHints(cwd: string): Promise<TailwindHints> {\n const pkg = readTailwindPackageFlag(cwd);\n const cfgPath = findTailwindConfigPath(cwd);\n if (!cfgPath && !pkg) return {};\n const imported = await tryImportTailwindConfig(cwd);\n return {\n ...imported,\n tailwindPackagePresent: pkg || imported.tailwindPackagePresent,\n configPath: imported.configPath ?? cfgPath,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Plugin } from \"vite\";\nimport { transformJsxWithWeevarSource } from \"./babelAddSource\";\nimport { probeTailwindHints } from \"./tailwindProbe\";\n\nconst VIRTUAL = \"\\0virtual:weevar-config\";\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction deepMerge(\n base: Record<string, unknown>,\n over: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const key of Object.keys(over)) {\n const bv = over[key];\n const av = base[key];\n if (isPlainObject(bv) && isPlainObject(av)) {\n out[key] = deepMerge(av, bv);\n } else {\n out[key] = bv;\n }\n }\n return out;\n}\n\nasync function loadOptionalJsConfig(cwd: string): Promise<Record<string, unknown>> {\n const mjsPath = path.join(cwd, \"weevar.config.mjs\");\n const jsPath = path.join(cwd, \"weevar.config.js\");\n const pick = fs.existsSync(mjsPath) ? mjsPath : fs.existsSync(jsPath) ? jsPath : null;\n if (!pick) return {};\n try {\n const href = pathToFileURL(pick).href + `?t=${Date.now()}`;\n const mod = (await import(href)) as { default?: unknown };\n const def = mod.default;\n return isPlainObject(def) ? def : {};\n } catch {\n return {};\n }\n}\n\n/** Merges `weevar.config.json` with optional `weevar.config.mjs` / `weevar.config.js` (JS wins on overlap). */\nexport async function loadMergedWeevarConfig(cwd: string): Promise<Record<string, unknown>> {\n const jsonPath = path.join(cwd, \"weevar.config.json\");\n let jsonObj: Record<string, unknown> = {};\n try {\n if (fs.existsSync(jsonPath)) {\n const parsed = JSON.parse(fs.readFileSync(jsonPath, \"utf8\")) as unknown;\n jsonObj = isPlainObject(parsed) ? parsed : {};\n }\n } catch {\n jsonObj = {};\n }\n const jsOverlay = await loadOptionalJsConfig(cwd);\n const merged = deepMerge(jsonObj, jsOverlay);\n\n const tw = await probeTailwindHints(cwd);\n\n if (tw.configPath || tw.tailwindPackagePresent || tw.contentGlobs?.length) {\n const prompts = isPlainObject(merged.prompts) ? { ...merged.prompts } : {};\n if (\n prompts.tailwindVerbatimClasses === undefined &&\n (tw.configPath || tw.tailwindPackagePresent)\n )\n prompts.tailwindVerbatimClasses = true;\n if (tw.contentGlobs?.length && prompts.tailwindContentGlobs === undefined)\n prompts.tailwindContentGlobs = tw.contentGlobs;\n if (tw.configPath && prompts.tailwindConfigPath === undefined)\n prompts.tailwindConfigPath = tw.configPath;\n merged.prompts = prompts;\n }\n return merged;\n}\n\n/**\n * Vite integration:\n * - `virtual:weevar-config` — merged JSON + optional JS config, Tailwind file hint.\n * - JSX/TSX transform — injects `data-wv-source` when missing (build-time source map).\n */\nexport function weevar(): Plugin {\n return {\n name: \"weevar\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === \"virtual:weevar-config\") return VIRTUAL;\n },\n async load(id) {\n if (id !== VIRTUAL) return null;\n const data = await loadMergedWeevarConfig(process.cwd());\n return `export default ${JSON.stringify(data)};`;\n },\n transform(code, id) {\n if (!/\\.(tsx|jsx)$/.test(id)) return null;\n if (id.includes(\"node_modules\")) return null;\n const out = transformJsxWithWeevarSource(code, id, process.cwd());\n if (!out) return null;\n return { code: out.code, map: out.map ?? undefined };\n },\n };\n}\n"]}
@@ -0,0 +1,27 @@
1
+ type LoaderCallback = (err: Error | null, content?: string, map?: object | string) => void;
2
+ type WebpackLoaderThis = {
3
+ resourcePath: string;
4
+ rootContext: string;
5
+ async(): LoaderCallback;
6
+ };
7
+ /**
8
+ * Webpack 5 loader — inject `data-wv-source` into JSX/TSX (same transform as Vite).
9
+ *
10
+ * ```js
11
+ * module.exports = {
12
+ * module: {
13
+ * rules: [
14
+ * {
15
+ * test: /\.(tsx|jsx)$/,
16
+ * exclude: /node_modules/,
17
+ * enforce: "pre",
18
+ * loader: "weevar/webpack-loader",
19
+ * },
20
+ * ],
21
+ * },
22
+ * };
23
+ * ```
24
+ */
25
+ declare function weevarWebpackLoader(this: WebpackLoaderThis, source: string): void;
26
+
27
+ export { weevarWebpackLoader as default };
@@ -0,0 +1,27 @@
1
+ type LoaderCallback = (err: Error | null, content?: string, map?: object | string) => void;
2
+ type WebpackLoaderThis = {
3
+ resourcePath: string;
4
+ rootContext: string;
5
+ async(): LoaderCallback;
6
+ };
7
+ /**
8
+ * Webpack 5 loader — inject `data-wv-source` into JSX/TSX (same transform as Vite).
9
+ *
10
+ * ```js
11
+ * module.exports = {
12
+ * module: {
13
+ * rules: [
14
+ * {
15
+ * test: /\.(tsx|jsx)$/,
16
+ * exclude: /node_modules/,
17
+ * enforce: "pre",
18
+ * loader: "weevar/webpack-loader",
19
+ * },
20
+ * ],
21
+ * },
22
+ * };
23
+ * ```
24
+ */
25
+ declare function weevarWebpackLoader(this: WebpackLoaderThis, source: string): void;
26
+
27
+ export { weevarWebpackLoader as default };
@@ -0,0 +1,110 @@
1
+ 'use strict';
2
+
3
+ var babel = require('@babel/core');
4
+ var t = require('@babel/types');
5
+ var path = require('path');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var babel__namespace = /*#__PURE__*/_interopNamespace(babel);
28
+ var t__namespace = /*#__PURE__*/_interopNamespace(t);
29
+ var path__default = /*#__PURE__*/_interopDefault(path);
30
+
31
+ // src/vite/babelAddSource.ts
32
+
33
+ // src/engine/parseDataWvSource.ts
34
+ function encodeDataWvSource(loc) {
35
+ const json = JSON.stringify({
36
+ file: loc.file,
37
+ line: loc.line,
38
+ col: loc.col
39
+ });
40
+ return btoa(unescape(encodeURIComponent(json)));
41
+ }
42
+
43
+ // src/vite/babelAddSource.ts
44
+ function weevarJsxSourcePlugin(absFile, cwd) {
45
+ const rel = path__default.default.relative(cwd, absFile).split(path__default.default.sep).join("/") || absFile;
46
+ return {
47
+ name: "weevar-jsx-source-attr",
48
+ visitor: {
49
+ JSXOpeningElement(p) {
50
+ const loc = p.node.loc;
51
+ if (!loc) return;
52
+ const attrs = p.node.attributes;
53
+ if (attrs.some(
54
+ (a) => a.type === "JSXAttribute" && "name" in a && a.name.type === "JSXIdentifier" && a.name.name === "data-wv-source"
55
+ ))
56
+ return;
57
+ const payload = encodeDataWvSource({
58
+ file: rel,
59
+ line: loc.start.line,
60
+ col: loc.start.column
61
+ });
62
+ attrs.push(
63
+ t__namespace.jsxAttribute(t__namespace.jsxIdentifier("data-wv-source"), t__namespace.stringLiteral(payload))
64
+ );
65
+ }
66
+ }
67
+ };
68
+ }
69
+ function transformJsxWithWeevarSource(code, absFile, cwd) {
70
+ try {
71
+ const result = babel__namespace.transformSync(code, {
72
+ filename: absFile,
73
+ cwd,
74
+ ast: false,
75
+ babelrc: false,
76
+ configFile: false,
77
+ sourceMaps: true,
78
+ presets: [
79
+ ["@babel/preset-typescript", { isTSX: true, allExtensions: true }],
80
+ ["@babel/preset-react", { runtime: "automatic" }]
81
+ ],
82
+ plugins: [weevarJsxSourcePlugin(absFile, cwd)]
83
+ });
84
+ if (!result?.code) return null;
85
+ return { code: result.code, map: result.map ?? null };
86
+ } catch {
87
+ return null;
88
+ }
89
+ }
90
+
91
+ // src/vite/webpackLoader.ts
92
+ function weevarWebpackLoader(source) {
93
+ const callback = this.async();
94
+ const p = this.resourcePath;
95
+ if (!/\.(tsx|jsx)$/.test(p)) {
96
+ callback(null, source);
97
+ return;
98
+ }
99
+ const cwd = this.rootContext || process.cwd();
100
+ const out = transformJsxWithWeevarSource(source, p, cwd);
101
+ if (!out?.code) {
102
+ callback(null, source);
103
+ return;
104
+ }
105
+ callback(null, out.code, out.map ?? void 0);
106
+ }
107
+
108
+ module.exports = weevarWebpackLoader;
109
+ //# sourceMappingURL=webpack-loader.js.map
110
+ //# sourceMappingURL=webpack-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/parseDataWvSource.ts","../src/vite/babelAddSource.ts","../src/vite/webpackLoader.ts"],"names":["path","t","babel"],"mappings":"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","file":"webpack-loader.js","sourcesContent":["import type { SourceLocation } from \"./layoutTypes\";\n\nfunction decodeBase64Json(raw: string): SourceLocation | undefined {\n try {\n const bin = atob(raw.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n const j = JSON.parse(bin) as { file?: string; line?: number; col?: number };\n if (!j?.file || !Number.isFinite(j.line)) return undefined;\n return { file: String(j.file), line: Number(j.line), col: Number(j.col ?? 0) };\n } catch {\n return undefined;\n }\n}\n\n/** `data-wv-source` = base64(JSON.stringify({file,line,col})) from optional tooling. */\nexport function parseDataWvSource(el: Element): SourceLocation | undefined {\n const raw = el.getAttribute(\"data-wv-source\");\n if (!raw) return undefined;\n return decodeBase64Json(raw);\n}\n\nexport function encodeDataWvSource(loc: SourceLocation): string {\n const json = JSON.stringify({\n file: loc.file,\n line: loc.line,\n col: loc.col,\n });\n return btoa(unescape(encodeURIComponent(json)));\n}\n","import * as babel from \"@babel/core\";\nimport * as t from \"@babel/types\";\nimport path from \"node:path\";\nimport type { PluginObj } from \"@babel/core\";\nimport { encodeDataWvSource } from \"../engine/parseDataWvSource\";\n\nfunction weevarJsxSourcePlugin(absFile: string, cwd: string): PluginObj {\n const rel = path.relative(cwd, absFile).split(path.sep).join(\"/\") || absFile;\n return {\n name: \"weevar-jsx-source-attr\",\n visitor: {\n JSXOpeningElement(p) {\n const loc = p.node.loc;\n if (!loc) return;\n const attrs = p.node.attributes;\n if (\n attrs.some(\n (a) =>\n a.type === \"JSXAttribute\" &&\n \"name\" in a &&\n a.name.type === \"JSXIdentifier\" &&\n a.name.name === \"data-wv-source\",\n )\n )\n return;\n const payload = encodeDataWvSource({\n file: rel,\n line: loc.start.line,\n col: loc.start.column,\n });\n attrs.push(\n t.jsxAttribute(t.jsxIdentifier(\"data-wv-source\"), t.stringLiteral(payload)),\n );\n },\n },\n };\n}\n\nexport function transformJsxWithWeevarSource(\n code: string,\n absFile: string,\n cwd: string,\n): { code: string; map: babel.BabelFileResult[\"map\"] } | null {\n try {\n const result = babel.transformSync(code, {\n filename: absFile,\n cwd,\n ast: false,\n babelrc: false,\n configFile: false,\n sourceMaps: true,\n presets: [\n [\"@babel/preset-typescript\", { isTSX: true, allExtensions: true }],\n [\"@babel/preset-react\", { runtime: \"automatic\" }],\n ],\n plugins: [weevarJsxSourcePlugin(absFile, cwd)],\n });\n if (!result?.code) return null;\n return { code: result.code, map: result.map ?? null };\n } catch {\n return null;\n }\n}\n","import { transformJsxWithWeevarSource } from \"./babelAddSource\";\n\ntype LoaderCallback = (err: Error | null, content?: string, map?: object | string) => void;\n\ntype WebpackLoaderThis = {\n resourcePath: string;\n rootContext: string;\n async(): LoaderCallback;\n};\n\n/**\n * Webpack 5 loader — inject `data-wv-source` into JSX/TSX (same transform as Vite).\n *\n * ```js\n * module.exports = {\n * module: {\n * rules: [\n * {\n * test: /\\.(tsx|jsx)$/,\n * exclude: /node_modules/,\n * enforce: \"pre\",\n * loader: \"weevar/webpack-loader\",\n * },\n * ],\n * },\n * };\n * ```\n */\nexport default function weevarWebpackLoader(\n this: WebpackLoaderThis,\n source: string,\n): void {\n const callback = this.async();\n const p = this.resourcePath;\n if (!/\\.(tsx|jsx)$/.test(p)) {\n callback(null, source);\n return;\n }\n const cwd = this.rootContext || process.cwd();\n const out = transformJsxWithWeevarSource(source, p, cwd);\n if (!out?.code) {\n callback(null, source);\n return;\n }\n callback(null, out.code, out.map ?? undefined);\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import { transformJsxWithWeevarSource } from './chunk-LFEEXHSC.mjs';
2
+ import './chunk-IXK7HELP.mjs';
3
+
4
+ // src/vite/webpackLoader.ts
5
+ function weevarWebpackLoader(source) {
6
+ const callback = this.async();
7
+ const p = this.resourcePath;
8
+ if (!/\.(tsx|jsx)$/.test(p)) {
9
+ callback(null, source);
10
+ return;
11
+ }
12
+ const cwd = this.rootContext || process.cwd();
13
+ const out = transformJsxWithWeevarSource(source, p, cwd);
14
+ if (!out?.code) {
15
+ callback(null, source);
16
+ return;
17
+ }
18
+ callback(null, out.code, out.map ?? void 0);
19
+ }
20
+
21
+ export { weevarWebpackLoader as default };
22
+ //# sourceMappingURL=webpack-loader.mjs.map
23
+ //# sourceMappingURL=webpack-loader.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite/webpackLoader.ts"],"names":[],"mappings":";;;;AA4Be,SAAR,oBAEL,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,EAAM;AAC5B,EAAA,MAAM,IAAI,IAAA,CAAK,YAAA;AACf,EAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAG;AAC3B,IAAA,QAAA,CAAS,MAAM,MAAM,CAAA;AACrB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAI;AAC5C,EAAA,MAAM,GAAA,GAAM,4BAAA,CAA6B,MAAA,EAAQ,CAAA,EAAG,GAAG,CAAA;AACvD,EAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,IAAA,QAAA,CAAS,MAAM,MAAM,CAAA;AACrB,IAAA;AAAA,EACF;AACA,EAAA,QAAA,CAAS,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,MAAS,CAAA;AAC/C","file":"webpack-loader.mjs","sourcesContent":["import { transformJsxWithWeevarSource } from \"./babelAddSource\";\n\ntype LoaderCallback = (err: Error | null, content?: string, map?: object | string) => void;\n\ntype WebpackLoaderThis = {\n resourcePath: string;\n rootContext: string;\n async(): LoaderCallback;\n};\n\n/**\n * Webpack 5 loader — inject `data-wv-source` into JSX/TSX (same transform as Vite).\n *\n * ```js\n * module.exports = {\n * module: {\n * rules: [\n * {\n * test: /\\.(tsx|jsx)$/,\n * exclude: /node_modules/,\n * enforce: \"pre\",\n * loader: \"weevar/webpack-loader\",\n * },\n * ],\n * },\n * };\n * ```\n */\nexport default function weevarWebpackLoader(\n this: WebpackLoaderThis,\n source: string,\n): void {\n const callback = this.async();\n const p = this.resourcePath;\n if (!/\\.(tsx|jsx)$/.test(p)) {\n callback(null, source);\n return;\n }\n const cwd = this.rootContext || process.cwd();\n const out = transformJsxWithWeevarSource(source, p, cwd);\n if (!out?.code) {\n callback(null, source);\n return;\n }\n callback(null, out.code, out.map ?? undefined);\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "weevar",
3
+ "version": "1.0.0",
4
+ "description": "Dev overlay: manipulate live UI and copy structured prompts for AI assistants",
5
+ "homepage": "https://weevar.com",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/weevar/weevar.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/weevar/weevar/issues"
12
+ },
13
+ "license": "MIT",
14
+ "keywords": [
15
+ "ui",
16
+ "overlay",
17
+ "ai",
18
+ "prompt",
19
+ "react",
20
+ "vite",
21
+ "developer-tools"
22
+ ],
23
+ "engines": {
24
+ "node": ">=18.18"
25
+ },
26
+ "sideEffects": false,
27
+ "main": "./dist/react.prod.js",
28
+ "module": "./dist/react.prod.mjs",
29
+ "types": "./dist/react.prod.d.ts",
30
+ "exports": {
31
+ "./react": {
32
+ "development": {
33
+ "types": "./dist/react.dev.d.ts",
34
+ "import": "./dist/react.dev.mjs",
35
+ "require": "./dist/react.dev.js"
36
+ },
37
+ "default": {
38
+ "types": "./dist/react.prod.d.ts",
39
+ "import": "./dist/react.prod.mjs",
40
+ "require": "./dist/react.prod.js"
41
+ }
42
+ },
43
+ "./vite": {
44
+ "types": "./dist/vite.d.ts",
45
+ "import": "./dist/vite.mjs",
46
+ "require": "./dist/vite.js"
47
+ },
48
+ "./swc": {
49
+ "types": "./dist/swc.d.ts",
50
+ "import": "./dist/swc.mjs",
51
+ "require": "./dist/swc.js"
52
+ },
53
+ "./webpack-loader": {
54
+ "types": "./dist/webpack-loader.d.ts",
55
+ "import": "./dist/webpack-loader.mjs",
56
+ "require": "./dist/webpack-loader.js"
57
+ }
58
+ },
59
+ "files": [
60
+ "dist"
61
+ ],
62
+ "peerDependencies": {
63
+ "@swc/core": ">=1.3.0",
64
+ "react": ">=17.0.0",
65
+ "react-dom": ">=17.0.0"
66
+ },
67
+ "peerDependenciesMeta": {
68
+ "@swc/core": {
69
+ "optional": true
70
+ }
71
+ },
72
+ "dependencies": {
73
+ "@babel/core": "^7.26.0",
74
+ "@babel/preset-react": "^7.26.3",
75
+ "@babel/preset-typescript": "^7.26.0",
76
+ "@babel/types": "^7.26.3"
77
+ },
78
+ "devDependencies": {
79
+ "@swc/core": "^1.15.33",
80
+ "@types/node": "^22.10.0",
81
+ "@types/react": "^18.3.12",
82
+ "@types/react-dom": "^18.3.1",
83
+ "jsdom": "^25.0.1",
84
+ "react": "^18.3.1",
85
+ "react-dom": "^18.3.1",
86
+ "tsup": "^8.3.5",
87
+ "typescript": "^5.6.3",
88
+ "vite": "^8.0.10",
89
+ "vitest": "^4.1.5"
90
+ },
91
+ "scripts": {
92
+ "build": "tsup",
93
+ "dev": "tsup --watch",
94
+ "test": "vitest run",
95
+ "bench": "vitest bench --run",
96
+ "verify": "npm run build && npm run test",
97
+ "prepublishOnly": "npm run verify"
98
+ },
99
+ "publishConfig": {
100
+ "access": "public"
101
+ }
102
+ }