tailwind-styled-v4 5.0.9 → 5.0.10
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/CHANGELOG.md +15 -1
- package/dist/{analyzeWorkspace-DuJKh7Ty.d.mts → analyzeWorkspace-BS5O4rhC.d.mts} +47 -2
- package/dist/{analyzeWorkspace-Ct_NTAWt.d.ts → analyzeWorkspace-DDOQdzzI.d.ts} +47 -2
- package/dist/analyzer.d.mts +5 -3
- package/dist/analyzer.d.ts +5 -3
- package/dist/analyzer.js +563 -468
- package/dist/analyzer.js.map +1 -1
- package/dist/analyzer.mjs +562 -467
- package/dist/analyzer.mjs.map +1 -1
- package/dist/animate.d.mts +4 -7
- package/dist/animate.d.ts +4 -7
- package/dist/animate.js +171 -265
- package/dist/animate.js.map +1 -1
- package/dist/animate.mjs +165 -264
- package/dist/animate.mjs.map +1 -1
- package/dist/atomic.d.mts +22 -1
- package/dist/atomic.d.ts +22 -1
- package/dist/atomic.js +221 -165
- package/dist/atomic.js.map +1 -1
- package/dist/atomic.mjs +200 -165
- package/dist/atomic.mjs.map +1 -1
- package/dist/cli.d.mts +60 -1
- package/dist/cli.d.ts +60 -1
- package/dist/cli.js +1261 -1517
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +1238 -1513
- package/dist/cli.mjs.map +1 -1
- package/dist/compiler.d.mts +38 -7
- package/dist/compiler.d.ts +38 -7
- package/dist/compiler.js +174 -197
- package/dist/compiler.js.map +1 -1
- package/dist/compiler.mjs +151 -194
- package/dist/compiler.mjs.map +1 -1
- package/dist/devtools.js +7 -31
- package/dist/devtools.js.map +1 -1
- package/dist/devtools.mjs +7 -31
- package/dist/devtools.mjs.map +1 -1
- package/dist/engine.d.mts +134 -63
- package/dist/engine.d.ts +134 -63
- package/dist/engine.js +2863 -2482
- package/dist/engine.js.map +1 -1
- package/dist/engine.mjs +2852 -2485
- package/dist/engine.mjs.map +1 -1
- package/dist/{index-eWAocnD2.d.mts → index-NDINUhLN.d.mts} +3 -1
- package/dist/{index-eWAocnD2.d.ts → index-NDINUhLN.d.ts} +3 -1
- package/dist/index.d.mts +45 -32
- package/dist/index.d.ts +45 -32
- package/dist/index.js +271 -158
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +251 -158
- package/dist/index.mjs.map +1 -1
- package/dist/{liveTokenEngine-DSUk88P6.d.ts → liveTokenEngine-CN9ian1R.d.ts} +1 -1
- package/dist/{liveTokenEngine-CX5_0c4q.d.mts → liveTokenEngine-DKoWRtqH.d.mts} +1 -1
- package/dist/next.js +20 -39
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +18 -37
- package/dist/next.mjs.map +1 -1
- package/dist/plugin-api.d.mts +8 -2
- package/dist/plugin-api.d.ts +8 -2
- package/dist/plugin-api.js +14 -2
- package/dist/plugin-api.js.map +1 -1
- package/dist/plugin-api.mjs +14 -3
- package/dist/plugin-api.mjs.map +1 -1
- package/dist/plugin-registry.js +51 -11
- package/dist/plugin-registry.js.map +1 -1
- package/dist/plugin-registry.mjs +51 -11
- package/dist/plugin-registry.mjs.map +1 -1
- package/dist/plugin.d.mts +5 -7
- package/dist/plugin.d.ts +5 -7
- package/dist/plugin.js +16 -15
- package/dist/plugin.js.map +1 -1
- package/dist/plugin.mjs +16 -16
- package/dist/plugin.mjs.map +1 -1
- package/dist/rspack.js +17 -38
- package/dist/rspack.js.map +1 -1
- package/dist/rspack.mjs +15 -36
- package/dist/rspack.mjs.map +1 -1
- package/dist/runtime.d.mts +2 -2
- package/dist/runtime.d.ts +2 -2
- package/dist/scanner.d.mts +10 -1
- package/dist/scanner.d.ts +10 -1
- package/dist/scanner.js +298 -124
- package/dist/scanner.js.map +1 -1
- package/dist/scanner.mjs +296 -124
- package/dist/scanner.mjs.map +1 -1
- package/dist/shared.d.mts +1 -1
- package/dist/shared.d.ts +1 -1
- package/dist/shared.js +104 -176
- package/dist/shared.js.map +1 -1
- package/dist/shared.mjs +85 -176
- package/dist/shared.mjs.map +1 -1
- package/dist/storybook-addon.d.mts +1 -1
- package/dist/storybook-addon.d.ts +1 -1
- package/dist/svelte.d.mts +1 -1
- package/dist/svelte.d.ts +1 -1
- package/dist/svelte.js +166 -3
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +143 -1
- package/dist/svelte.mjs.map +1 -1
- package/dist/syntax.js +21 -21
- package/dist/syntax.js.map +1 -1
- package/dist/syntax.mjs +21 -21
- package/dist/syntax.mjs.map +1 -1
- package/dist/testing.js +9 -1
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +9 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/theme.d.mts +2 -2
- package/dist/theme.d.ts +2 -2
- package/dist/theme.js +40 -112
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +37 -110
- package/dist/theme.mjs.map +1 -1
- package/dist/turbopackLoader.js +79 -124
- package/dist/turbopackLoader.js.map +1 -1
- package/dist/turbopackLoader.mjs +63 -122
- package/dist/turbopackLoader.mjs.map +1 -1
- package/dist/tw.js +1256 -1517
- package/dist/tw.js.map +1 -1
- package/dist/tw.mjs +1236 -1513
- package/dist/tw.mjs.map +1 -1
- package/dist/vite.js +1783 -823
- package/dist/vite.js.map +1 -1
- package/dist/vite.mjs +1767 -821
- package/dist/vite.mjs.map +1 -1
- package/dist/vue.d.mts +1 -1
- package/dist/vue.d.ts +1 -1
- package/dist/vue.js +165 -4
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +141 -1
- package/dist/vue.mjs.map +1 -1
- package/dist/webpackLoader.js +65 -108
- package/dist/webpackLoader.js.map +1 -1
- package/dist/webpackLoader.mjs +45 -104
- package/dist/webpackLoader.mjs.map +1 -1
- package/native/tailwind-styled-native.node +0 -0
- package/package.json +22 -24
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/shared/src/esmHelpers.ts","../packages/domain/shared/src/native-resolution.ts","../packages/domain/shared/src/index.ts","../packages/domain/compiler/src/nativeBridge.ts","../packages/domain/compiler/src/tailwindEngine.ts","../packages/domain/scanner/src/native-bridge.ts","../packages/domain/compiler/src/index.ts","../packages/domain/scanner/src/index.ts","../packages/domain/scanner/src/cache-native.ts","../packages/domain/scanner/src/schemas.ts","../packages/domain/analyzer/src/binding.ts","../packages/domain/analyzer/src/utils.ts","../packages/domain/analyzer/src/schemas.ts","../packages/domain/analyzer/src/semantic.ts","../packages/domain/analyzer/src/analyzeWorkspace.ts","../packages/domain/engine/src/index.ts","../packages/domain/engine/src/incremental.ts","../packages/domain/engine/src/native-bridge.ts","../packages/domain/engine/src/metrics.ts","../packages/domain/engine/src/metricsWriter.ts","../packages/domain/engine/src/plugin-api.ts","../packages/domain/engine/src/schemas.ts","../packages/domain/engine/src/watch.ts","../packages/presentation/vite/src/schemas.ts","../packages/presentation/vite/src/plugin.ts"],"names":["getNodeModuleRef","isBrowser","nodeModuleRef","getNodePath","_nodePath","fs","path","getNodeFs","_nodeFs","getNodeUrl","_nodeUrl","getRequire","_require","require","createRequire","getDirname","fileURLToPath","log","scannerGetBinding","runCssPipeline","formatIssuePath","z","Worker","scanWorkspaceNative","formatIssues","parseWithSchema","pathToFileURL","DEFAULT_EXTENSIONS","existing","DEFAULT_IGNORES"],"mappings":"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","file":"vite.js","sourcesContent":["/**\r\n * ESM-safe runtime helpers untuk monorepo.\r\n *\r\n * Menggantikan pola fragile seperti:\r\n * - `createRequire(import.meta.url)` → gunakan `createEsmRequire()`\r\n * - `__dirname` → gunakan `getDirname(import.meta.url)`\r\n * - `__filename` → gunakan `getFilename(import.meta.url)`\r\n *\r\n * Semua helper ini bekerja di ESM dan CJS.\r\n *\r\n * @module @tailwind-styled/shared/esmHelpers\r\n */\r\n\r\nconst isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\r\n\r\n// Safe check for require availability - works in both CJS and ESM\r\nlet nodeModuleRef: any = null\r\nfunction getNodeModuleRef() {\r\n if (isBrowser) return null\r\n if (nodeModuleRef !== null) return nodeModuleRef\r\n try {\r\n // Test if require actually works\r\n const test = typeof require === 'function' ? require('node:module') : null\r\n nodeModuleRef = test\r\n return test\r\n } catch {\r\n nodeModuleRef = null\r\n return null\r\n }\r\n}\r\n\r\nlet _nodePath: any = null\r\nlet _nodeUrl: any = null\r\nlet _nodeFs: any = null\r\nlet _nodeCrypto: any = null\r\nlet _nodeOs: any = null\r\n\r\nfunction getNodePath() {\r\n if (isBrowser) throw new Error(\"node:path not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodePath) _nodePath = nodeRequire.createRequire(import.meta.url)(\"node:path\")\r\n return _nodePath!\r\n}\r\nfunction getNodeUrl() {\r\n if (isBrowser) throw new Error(\"node:url not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeUrl) _nodeUrl = nodeRequire.createRequire(import.meta.url)(\"node:url\")\r\n return _nodeUrl!\r\n}\r\nfunction getNodeFs() {\r\n if (isBrowser) throw new Error(\"node:fs not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeFs) _nodeFs = nodeRequire.createRequire(import.meta.url)(\"node:fs\")\r\n return _nodeFs!\r\n}\r\nfunction getNodeCrypto() {\r\n if (isBrowser) throw new Error(\"node:crypto not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeCrypto) _nodeCrypto = nodeRequire.createRequire(import.meta.url)(\"node:crypto\")\r\n return _nodeCrypto!\r\n}\r\nfunction getNodeOs() {\r\n if (isBrowser) throw new Error(\"node:os not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeOs) _nodeOs = nodeRequire.createRequire(import.meta.url)(\"node:os\")\r\n return _nodeOs!\r\n}\r\n\r\n/**\r\n * Buat `require()` function yang relative terhadap sebuah ESM module.\r\n *\r\n * @example\r\n * // Ganti: createRequire(import.meta.url)(\"some-pkg\")\r\n * const req = createEsmRequire(import.meta.url)\r\n * const mod = req(\"some-pkg\")\r\n */\r\nexport function createEsmRequire(importMetaUrl: string): NodeRequire {\r\n if (isBrowser) throw new Error(\"require not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n return nodeRequire.createRequire(importMetaUrl)\r\n}\r\n\r\n/**\r\n * Dapat `__dirname` dari `import.meta.url`.\r\n *\r\n * @example\r\n * // Ganti: const __dirname = ...\r\n * const dir = getDirname(import.meta.url)\r\n */\r\nexport function getDirname(importMetaUrl: string): string {\r\n if (isBrowser) return \"\"\r\n const nodePath = getNodePath()\r\n const nodeUrl = getNodeUrl()\r\n return nodePath.dirname(nodeUrl.fileURLToPath(importMetaUrl))\r\n}\r\n\r\n/**\r\n * Dapat `__filename` dari `import.meta.url`.\r\n */\r\nexport function getFilename(importMetaUrl: string): string {\r\n if (isBrowser) return \"\"\r\n return getNodeUrl().fileURLToPath(importMetaUrl)\r\n}\r\n\r\n/**\r\n * Resolve path dari root monorepo (bukan CWD).\r\n * Berguna untuk scripts dan tools yang dipanggil dari lokasi berbeda.\r\n *\r\n * @example\r\n * const root = resolveFromRoot(\"packages/domain/shared/src\")\r\n */\r\nexport function resolveFromRoot(...segments: string[]): string {\r\n if (isBrowser) return segments.join(\"/\")\r\n\r\n const nodePath = getNodePath()\r\n const nodeFs = getNodeFs()\r\n \r\n let dir = getDirname(import.meta.url)\r\n for (let i = 0; i < 10; i++) {\r\n const pkgPath = nodePath.join(dir, \"package.json\")\r\n try {\r\n const pkg = JSON.parse(nodeFs.readFileSync(pkgPath, \"utf-8\"))\r\n if (pkg.workspaces) {\r\n return nodePath.resolve(dir, ...segments)\r\n }\r\n } catch { /* intentionally silent */ }\r\n dir = nodePath.dirname(dir)\r\n }\r\n return nodePath.resolve(process.cwd(), ...segments)\r\n}\r\n\r\n/**\r\n * Require sebuah module dengan fallback ke null jika tidak tersedia.\r\n * Berguna untuk optional dependencies.\r\n *\r\n * @example\r\n * const oxc = tryRequire(\"oxc-parser\", import.meta.url)\r\n * if (!oxc) console.warn(\"oxc-parser not installed\")\r\n */\r\nexport function tryRequire<T = unknown>(\r\n moduleName: string,\r\n importMetaUrl: string\r\n): T | null {\r\n if (isBrowser) return null\r\n try {\r\n return createEsmRequire(importMetaUrl)(moduleName) as T\r\n } catch { /* intentionally silent — optional dep */ }\r\n return null\r\n}\r\n\r\n/**\r\n * Resolve .node binary path yang cross-platform dan ESM-safe.\r\n * Menggantikan pola `path.resolve(__dirname, \"../native.node\")`.\r\n */\r\nexport function resolveNativeNodePath(\r\n importMetaUrl: string,\r\n ...relativeSegments: string[]\r\n): string {\r\n if (isBrowser) return relativeSegments.join(\"/\")\r\n return getNodePath().resolve(getDirname(importMetaUrl), ...relativeSegments)\r\n}\r\n","/**\r\n * Prebuilt binary resolution untuk native NAPI bindings.\r\n * QA #1: Resolve native binary dari prebuilt packages atau local build.\r\n *\r\n * Prioritas:\r\n * 1. TW_NATIVE_PATH env var (explicit override)\r\n * 2. Prebuilt binary dari platform-specific npm package\r\n * 3. Local build dari source (developer mode)\r\n */\r\n\r\nconst isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\r\n\r\n// ESM-safe require detection\r\nlet nodeModuleRef: any = null\r\nfunction getNodeModuleRef() {\r\n if (isBrowser) return null\r\n if (nodeModuleRef !== null) return nodeModuleRef\r\n try {\r\n const test = typeof require === 'function' ? require('node:module') : null\r\n nodeModuleRef = test\r\n return test\r\n } catch {\r\n nodeModuleRef = null\r\n return null\r\n }\r\n}\r\n\r\nlet _nodeFs: any = null\r\nlet _nodePath: any = null\r\nlet _nodeModule: any = null\r\nlet _require: any = null\r\n\r\nfunction getNodeFs() {\r\n if (isBrowser) return { existsSync: () => false }\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) return { existsSync: () => false }\r\n if (!_nodeFs) _nodeFs = nodeRequire.createRequire(import.meta.url)(\"node:fs\")\r\n return _nodeFs\r\n}\r\nfunction getNodePath() {\r\n if (isBrowser) return { resolve: () => \"\", dirname: \"\" }\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) return { resolve: () => \"\", dirname: \"\" }\r\n if (!_nodePath) _nodePath = nodeRequire.createRequire(import.meta.url)(\"node:path\")\r\n return _nodePath!\r\n}\r\nfunction getNodeModule() {\r\n if (isBrowser) return { createRequire: () => { throw new Error(\"node:module not available\") } }\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) return { createRequire: () => { throw new Error(\"require not available\") } }\r\n if (!_nodeModule) _nodeModule = nodeRequire\r\n return _nodeModule\r\n}\r\nfunction getRequire(_importMetaUrl: string) {\r\n if (isBrowser) return () => { throw new Error(\"node:module not available\") }\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) return () => { throw new Error(\"require not available\") }\r\n if (!_require) _require = nodeRequire.createRequire(_importMetaUrl)\r\n return _require\r\n}\r\n\r\nexport interface NativeResolutionResult {\r\n path: string | null\r\n source: \"env\" | \"prebuilt\" | \"local\" | \"not-found\"\r\n platform: string\r\n tried: string[]\r\n}\r\n\r\n/** Platform key → prebuilt npm package name */\r\nconst PLATFORM_MAP: Record<string, string[]> = {\r\n \"linux-x64\": [\"@tailwind-styled/native-linux-x64\"],\r\n \"linux-arm64\": [\"@tailwind-styled/native-linux-arm64\"],\r\n \"darwin-x64\": [\"@tailwind-styled/native-darwin-x64\"],\r\n \"darwin-arm64\": [\"@tailwind-styled/native-darwin-arm64\"],\r\n \"win32-x64\": [\"@tailwind-styled/native-win32-x64\"],\r\n \"win32-arm64\": [\"@tailwind-styled/native-win32-arm64\"],\r\n}\r\n\r\nfunction platformKey(): string {\r\n if (isBrowser) return \"browser\"\r\n return `${process.platform}-${process.arch}`\r\n}\r\n\r\n/**\r\n * Resolve native binary path dari semua sumber yang tersedia.\r\n *\r\n * @example\r\n * const result = resolveNativeBinary()\r\n * if (result.path) {\r\n * const binding = require(result.path)\r\n * } else {\r\n * throw new Error(\"Native binding not found — run npm run build:rust\")\r\n * }\r\n */\r\nexport function resolveNativeBinary(runtimeDir?: string): NativeResolutionResult {\r\n const platform = platformKey()\r\n const tried: string[] = []\r\n\r\n if (isBrowser) {\r\n return { path: null, source: \"not-found\", platform, tried: [\"not available in browser\"] }\r\n }\r\n\r\n const fs = getNodeFs()\r\n const path = getNodePath()\r\n const _req = getRequire(import.meta.url)\r\n\r\n // 1. Env var override\r\n const envPath = process.env.TW_NATIVE_PATH?.trim()\r\n if (envPath) {\r\n if (fs.existsSync(envPath)) {\r\n return { path: envPath, source: \"env\", platform, tried }\r\n }\r\n tried.push(`env:${envPath} (not found)`)\r\n }\r\n\r\n // 2. Skip jika disabled\r\n if (\r\n process.env.TWS_NO_NATIVE === \"1\" ||\r\n process.env.TWS_NO_RUST === \"1\" ||\r\n process.env.TWS_DISABLE_NATIVE === \"1\"\r\n ) {\r\n return { path: null, source: \"not-found\", platform, tried: [\"disabled by env\"] }\r\n }\r\n\r\n // 3. Prebuilt binary dari platform-specific npm package\r\n const prebuiltPkgs = PLATFORM_MAP[platform] ?? []\r\n for (const pkg of prebuiltPkgs) {\r\n try {\r\n const candidate = _req.resolve(`${pkg}/tailwind_styled_parser.node`)\r\n if (fs.existsSync(candidate)) {\r\n return { path: candidate, source: \"prebuilt\", platform, tried }\r\n }\r\n tried.push(`prebuilt:${pkg} (resolved but missing)`)\r\n } catch {\r\n tried.push(`prebuilt:${pkg} (not installed)`)\r\n }\r\n }\r\n\r\n // 4. Local build candidates\r\n const cwd = process.cwd()\r\n const base = runtimeDir ?? cwd\r\n const localCandidates = [\r\n path.resolve(base, \"tailwind_styled_parser.node\"),\r\n path.resolve(base, \"..\", \"tailwind_styled_parser.node\"),\r\n path.resolve(cwd, \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(cwd, \"native\", \"target\", \"release\", \"tailwind_styled_parser.node\"),\r\n // napi-rs conventional output\r\n path.resolve(base, `tailwind_styled_parser.${platform}.node`),\r\n ]\r\n\r\n for (const candidate of localCandidates) {\r\n tried.push(`local:${candidate}`)\r\n if (fs.existsSync(candidate)) {\r\n return { path: candidate, source: \"local\", platform, tried }\r\n }\r\n }\r\n\r\n return { path: null, source: \"not-found\", platform, tried }\r\n}\r\n\r\n/**\r\n * Format human-readable error untuk \"binary not found\".\r\n */\r\nexport function formatNativeNotFoundError(result: NativeResolutionResult): string {\r\n const lines = [\r\n `[tailwind-styled] Native binding not found for ${result.platform}`,\r\n ``,\r\n `Tried:`,\r\n ...result.tried.map(t => ` - ${t}`),\r\n ``,\r\n `Solutions:`,\r\n ` 1. Build locally: npm run build:rust`,\r\n ` 2. Install prebuilt: npm install @tailwind-styled/native-${result.platform}`,\r\n ` 3. Override path: TW_NATIVE_PATH=/path/to/parser.node`,\r\n ` 4. Disable native: TWS_DISABLE_NATIVE=1 (slower, JS fallback)`,\r\n ]\r\n return lines.join(\"\\n\")\r\n}\r\n","const isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\r\n\r\n// ESM-safe require detection\r\nlet nodeModuleRef: any = null\r\nfunction getNodeModuleRef() {\r\n if (isBrowser) return null\r\n if (nodeModuleRef !== null) return nodeModuleRef\r\n try {\r\n const test = typeof require === 'function' ? require('node:module') : null\r\n nodeModuleRef = test\r\n return test\r\n } catch {\r\n nodeModuleRef = null\r\n return null\r\n }\r\n}\r\n\r\nlet _nodeCrypto: any = null\r\nlet _nodeFs: any = null\r\nlet _nodeModule: any = null\r\nlet _nodePath: any = null\r\nlet _nodeUrl: any = null\r\n\r\nfunction getNodeCrypto() {\r\n if (isBrowser) throw new Error(\"node:crypto not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeCrypto) _nodeCrypto = nodeRequire.createRequire(import.meta.url)(\"node:crypto\")\r\n return _nodeCrypto!\r\n}\r\nfunction getNodeFs() {\r\n if (isBrowser) throw new Error(\"node:fs not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeFs) _nodeFs = nodeRequire.createRequire(import.meta.url)(\"node:fs\")\r\n return _nodeFs!\r\n}\r\nfunction getNodeModule() {\r\n if (isBrowser) throw new Error(\"node:module not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeModule) _nodeModule = nodeRequire\r\n return _nodeModule!\r\n}\r\nfunction getNodePath() {\r\n if (isBrowser) throw new Error(\"node:path not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodePath) _nodePath = nodeRequire.createRequire(import.meta.url)(\"node:path\")\r\n return _nodePath!\r\n}\r\nfunction getNodeUrl() {\r\n if (isBrowser) throw new Error(\"node:url not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeUrl) _nodeUrl = nodeRequire.createRequire(import.meta.url)(\"node:url\")\r\n return _nodeUrl!\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type TokenMap = Record<string, string>\r\n\r\nexport type VariantValue = string | number | boolean | undefined\r\n\r\nexport type VariantProps = Record<string, VariantValue>\r\n\r\nexport type HtmlTagName = keyof HTMLElementTagNameMap\r\n\r\nexport type CompoundCondition = Record<string, string | number | boolean>\r\n\r\nexport type VariantMatrix = Record<string, Array<string | number | boolean>>\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Logging\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface Logger {\r\n warn(...args: unknown[]): void\r\n debug(...args: unknown[]): void\r\n error(...args: unknown[]): void\r\n log(...args: unknown[]): void\r\n}\r\n\r\nexport function createLogger(namespace: string): Logger {\r\n const prefix = `[${namespace}]`\r\n return {\r\n warn(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n debug(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n error(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n log(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n }\r\n}\r\n\r\nexport function createDebugLogger(namespace: string, label?: string): (msg: string) => void {\r\n const prefix = label ? `[${namespace}:${label}]` : `[${namespace}]`\r\n return (msg: string) => {\r\n if (process.env.DEBUG?.includes(namespace) || process.env.TW_DEBUG) {\r\n console.debug(prefix, msg)\r\n }\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error handling\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type ErrorSource = \"rust\" | \"validation\" | \"compile\" | \"io\" | \"config\" | \"unknown\"\r\n\r\ntype ZodLikeIssue = {\r\n path?: readonly PropertyKey[]\r\n message?: string\r\n}\r\n\r\nfunction formatIssuePath(path?: readonly PropertyKey[]): string {\r\n if (!path || path.length === 0) return \"(root)\"\r\n return path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n}\r\n\r\nexport class TwError extends Error {\r\n /** @deprecated Gunakan source */\r\n public readonly domain: string\r\n public readonly source: ErrorSource\r\n public readonly code: string\r\n public readonly originalCause?: unknown\r\n\r\n constructor(domainOrSource: string, code: string, message: string, cause?: unknown) {\r\n super(message)\r\n this.name = \"TwError\"\r\n this.domain = domainOrSource\r\n this.source = domainOrSource as ErrorSource\r\n this.code = code\r\n this.originalCause = cause\r\n if (Error.captureStackTrace) Error.captureStackTrace(this, TwError)\r\n }\r\n\r\n static fromIo(code: string, message: string): TwError {\r\n return new TwError(\"io\", code, message)\r\n }\r\n\r\n static fromCompile(code: string, message: string): TwError {\r\n return new TwError(\"compile\", code, message)\r\n }\r\n\r\n static fromRust(err: { code?: string; message?: string } | Error | unknown): TwError {\r\n if (err instanceof TwError) return err\r\n if (err instanceof Error) return new TwError(\"rust\", \"RUST_ERROR\", err.message, err)\r\n if (err && typeof err === \"object\") {\r\n const e = err as { code?: string; message?: string }\r\n return new TwError(\"rust\", e.code ?? \"RUST_ERROR\", e.message ?? String(err), err)\r\n }\r\n return new TwError(\"rust\", \"RUST_ERROR\", String(err), err)\r\n }\r\n\r\n /** Buat TwError dari ZodError — dukung shape Zod v3 (`errors`) dan v4 (`issues`). */\r\n static fromZod(err: { issues?: ZodLikeIssue[]; errors?: ZodLikeIssue[] }): TwError {\r\n const first = err.issues?.[0] ?? err.errors?.[0]\r\n const path = formatIssuePath(first?.path)\r\n const message = first ? `${path}: ${first.message}` : \"Schema validation failed\"\r\n return new TwError(\"validation\", \"SCHEMA_VALIDATION_FAILED\", message, err)\r\n }\r\n\r\n static wrap(source: string, code: string, err: unknown): TwError {\r\n if (err instanceof TwError) return err\r\n if (err instanceof Error) return new TwError(source, code, err.message, err)\r\n return new TwError(source, code, String(err), err)\r\n }\r\n\r\n override toString(): string {\r\n return `TwError [${this.source}:${this.code}] ${this.message}`\r\n }\r\n\r\n toJSON(): { name: string; source: string; code: string; message: string } {\r\n return { name: this.name, source: this.source, code: this.code, message: this.message }\r\n }\r\n\r\n toCliMessage(): string {\r\n return `[${this.source.toUpperCase()}:${this.code}] ${this.message}`\r\n }\r\n}\r\n\r\nexport function wrapUnknownError(domain: string, code: string, error: unknown): TwError {\r\n return TwError.wrap(domain, code, error)\r\n}\r\n\r\nexport function isTwError(err: unknown): err is TwError {\r\n return err instanceof TwError\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Native binding resolution\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface LoadNativeBindingOptions<T> {\r\n runtimeDir: string\r\n candidates: string[]\r\n isValid: (module: unknown) => module is T\r\n invalidExportMessage: string\r\n}\r\n\r\nexport interface LoadNativeBindingResult<T> {\r\n binding: T | null\r\n loadErrors: Array<{ path: string; message: string }>\r\n loadedPath?: string\r\n}\r\n\r\nexport function loadNativeBinding<T>(options: LoadNativeBindingOptions<T>): LoadNativeBindingResult<T> {\r\n if (isBrowser) {\r\n return { binding: null, loadErrors: [{ path: \"\", message: \"Native bindings not available in browser\" }] }\r\n }\r\n \r\n const { runtimeDir, candidates, isValid } = options\r\n const loadErrors: Array<{ path: string; message: string }> = []\r\n const path = getNodePath()\r\n const fs = getNodeFs()\r\n\r\n for (const candidate of candidates) {\r\n const candidatePath = path.resolve(runtimeDir, candidate)\r\n try {\r\n if (!fs.existsSync(candidatePath) && !fs.existsSync(candidatePath + \".node\")) {\r\n continue\r\n }\r\n const mod = requireNativeModule(candidatePath)\r\n if (mod && isValid(mod)) {\r\n return { binding: mod, loadErrors, loadedPath: candidatePath }\r\n }\r\n loadErrors.push({ path: candidatePath, message: options.invalidExportMessage })\r\n } catch (e) {\r\n loadErrors.push({ path: candidatePath, message: e instanceof Error ? e.message : String(e) })\r\n }\r\n }\r\n\r\n return { binding: null, loadErrors }\r\n}\r\n\r\nfunction getRequire(): NodeRequire {\r\n if (isBrowser) return (() => { throw new Error(\"require not available in browser\") }) as unknown as NodeRequire\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) return (() => { throw new Error(\"require not available\") }) as unknown as NodeRequire\r\n return nodeRequire.createRequire(import.meta.url)\r\n}\r\n\r\nconst _require = getRequire()\r\n\r\nfunction requireNativeModule(path: string): unknown {\r\n return _require(path)\r\n}\r\n\r\nexport interface ResolveCandidatesOptions {\r\n runtimeDir: string\r\n envVarNames?: string[]\r\n includeDefaultCandidates?: boolean\r\n enforceNodeExtensionForEnvPath?: boolean\r\n}\r\n\r\nexport function resolveNativeBindingCandidates(options: ResolveCandidatesOptions): string[] {\r\n if (isBrowser) return []\r\n \r\n const { runtimeDir, envVarNames = [], includeDefaultCandidates = true, enforceNodeExtensionForEnvPath = false } = options\r\n const candidates: string[] = []\r\n const path = getNodePath()\r\n const fs = getNodeFs()\r\n\r\n for (const envVar of envVarNames) {\r\n const envPath = process.env[envVar]\r\n if (envPath) {\r\n if (enforceNodeExtensionForEnvPath && !envPath.endsWith(\".node\")) {\r\n candidates.push(envPath + \".node\")\r\n } else {\r\n candidates.push(envPath)\r\n }\r\n }\r\n }\r\n\r\n if (!includeDefaultCandidates) return candidates\r\n\r\n if (fs.existsSync(runtimeDir)) {\r\n try {\r\n const entries = fs.readdirSync(runtimeDir)\r\n for (const entry of entries) {\r\n if (entry.endsWith(\".node\")) {\r\n candidates.push(entry)\r\n }\r\n }\r\n } catch {\r\n // ignore read errors\r\n }\r\n }\r\n\r\n const platform = typeof process !== \"undefined\" ? process.platform : \"\"\r\n const ext = platform === \"win32\" ? \".dll\" : platform === \"darwin\" ? \".dylib\" : \".so\"\r\n const defaultBindingName = `tailwind_styled_parser${ext}`\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", defaultBindingName))\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", defaultBindingName))\r\n candidates.push(path.resolve(process.cwd(), \"native\", defaultBindingName))\r\n\r\n return Array.from(new Set(candidates))\r\n}\r\n\r\nexport function resolveRuntimeDir(dir: string | undefined, importMetaUrl: string): string {\r\n if (isBrowser) return \"\"\r\n \r\n if (dir) return getNodePath().resolve(dir)\r\n try {\r\n return getNodeUrl().fileURLToPath(importMetaUrl)\r\n } catch {\r\n return process.cwd()\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Hashing\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function hashContent(content: string, algorithm: string = \"md5\", length?: number): string {\r\n if (isBrowser) {\r\n // Simple hash fallback for browser\r\n let hash = 0\r\n for (let i = 0; i < content.length; i++) {\r\n const char = content.charCodeAt(i)\r\n hash = ((hash << 5) - hash) + char\r\n hash = hash & hash\r\n }\r\n return Math.abs(hash).toString(16).slice(0, length ?? 8)\r\n }\r\n const hash = getNodeCrypto().createHash(algorithm).update(content).digest(\"hex\")\r\n return length ? hash.slice(0, length) : hash\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function formatErrorMessage(error: unknown): string {\r\n if (error instanceof TwError) return error.toString()\r\n if (error instanceof Error) return error.message\r\n return String(error)\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// LRU Cache\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport class LRUCache<K, V> {\r\n private capacity: number\r\n private cache: Map<K, V>\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity\r\n this.cache = new Map()\r\n }\r\n\r\n get(key: K): V | undefined {\r\n if (!this.cache.has(key)) return undefined\r\n const value = this.cache.get(key)!\r\n this.cache.delete(key)\r\n this.cache.set(key, value)\r\n return value\r\n }\r\n\r\n set(key: K, value: V): void {\r\n if (this.cache.has(key)) {\r\n this.cache.delete(key)\r\n } else if (this.cache.size >= this.capacity) {\r\n const firstKey = this.cache.keys().next().value\r\n if (firstKey !== undefined) {\r\n this.cache.delete(firstKey)\r\n }\r\n }\r\n this.cache.set(key, value)\r\n }\r\n\r\n delete(key: K): boolean {\r\n return this.cache.delete(key)\r\n }\r\n\r\n has(key: K): boolean {\r\n return this.cache.has(key)\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear()\r\n }\r\n\r\n entries(): IterableIterator<[K, V]> {\r\n return this.cache.entries()\r\n }\r\n\r\n get size(): number {\r\n return this.cache.size\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Trace Utilities\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TraceSnapshot, TraceSummary } from \"./trace\"\r\nexport {\r\n getHealthColor,\r\n getModeColor,\r\n formatMemory,\r\n formatDuration,\r\n calculateHealth,\r\n getBuildTimeColor,\r\n getMemoryColor,\r\n createTraceSnapshot,\r\n getPipelinePercentages,\r\n} from \"./trace\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Performance Telemetry\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error Codes\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { ErrorCode } from \"./error-codes\"\r\nexport { ERROR_CODES, getSuggestion, formatErrorCode } from \"./error-codes\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Tailwind Compatibility\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TailwindInfo } from \"./compatibility\"\r\nexport { detectTailwind, assertTailwindV4, getTailwindVersion, isTailwindV4 } from \"./compatibility\"\r\n\r\n// ── Native binding schemas (Zod boundary validation)\r\nexport {\r\n NativeScanFileSchema, NativeScanResultSchema,\r\n NativeAnalyzerReportSchema, NativeTransformResultSchema,\r\n NativeCssCompileResultSchema, NativeWatchResultSchema,\r\n NativeCacheEntrySchema, NativeCacheReadResultSchema,\r\n safeParseNative, parseNative,\r\n} from './native-schemas'\r\n\r\n// ── ESM-safe runtime helpers ──────────────────────────────────────────────\r\nexport {\r\n createEsmRequire,\r\n getDirname,\r\n getFilename,\r\n resolveFromRoot,\r\n tryRequire,\r\n resolveNativeNodePath,\r\n} from \"./esmHelpers\"\r\n\r\n// ── Performance telemetry ────────────────────────────────────────────────────\r\nexport {\r\n TelemetryCollector,\r\n getGlobalTelemetry,\r\n resetGlobalTelemetry,\r\n createBuildTimer,\r\n type BuildTelemetry,\r\n type TelemetrySummary,\r\n type BuildPhases,\r\n} from \"./telemetry\"\r\n\r\n// ── Config/JSON schema validation ─────────────────────────────────────────────\r\nexport {\r\n ScanCacheSchema,\r\n ScanCacheClassEntrySchema,\r\n TailwindConfigSchema,\r\n RegistryPluginEntrySchema,\r\n RegistryFileSchema,\r\n PackageJsonSchema,\r\n parseJsonWithSchema,\r\n parseJsonFileWithSchema,\r\n type ScanCache,\r\n type ScanCacheClassEntry,\r\n type TailwindConfig,\r\n type RegistryPluginEntry,\r\n type RegistryFile,\r\n type PackageJson,\r\n} from \"./configSchemas\"\r\n\r\n// ── Worker/bootstrap path resolution ─────────────────────────────────────────\r\nexport {\r\n resolveWorkerPath,\r\n resolveLoaderPath,\r\n type WorkerPathOptions,\r\n type WorkerPathResult,\r\n} from \"./workerResolver\"\r\n\r\n// ── Codegen helpers ───────────────────────────────────────────────────────────\r\nexport {\r\n generateComponentCode,\r\n generateStorybookStory,\r\n generateClassRenameCodemod,\r\n generateBarrelFile,\r\n type ComponentCodegenOptions,\r\n} from \"./codegen\"\r\n\r\n// ── Native binary resolution (QA #1) ─────────────────────────────────────────\r\nexport {\r\n resolveNativeBinary,\r\n formatNativeNotFoundError,\r\n type NativeResolutionResult,\r\n} from \"./native-resolution\"\r\n\r\n// ── Shared observability contract ────────────────────────────────────────────\r\nexport {\r\n createObservabilityClient,\r\n type ClassInspection,\r\n type ClassProperty,\r\n type ClassUsageLocation,\r\n type BuildTrace,\r\n type BuildPhaseTrace,\r\n type DashboardMetrics,\r\n type DashboardSummary,\r\n type ObservabilityClient,\r\n} from \"./observability\"\r\n","/**\r\n * tailwind-styled-v5 — Native Bridge Loader\r\n *\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n * All functions require native Rust binding - no JS fallback.\r\n */\r\n\r\nimport { resolveNativeBinary, resolveRuntimeDir } from \"@tailwind-styled/shared\"\r\nimport { createRequire } from \"node:module\"\r\n\r\nexport interface ComponentMetadata {\r\n component: string\r\n tag: string\r\n baseClass: string\r\n subComponents: Record<string, { tag?: string; class: string }>\r\n}\r\n\r\nexport interface NativeRscResult {\r\n isServer: boolean\r\n needsClientDirective: boolean\r\n clientReasons: string[]\r\n}\r\n\r\nconst log = (...args: unknown[]) => {\r\n if (process.env.DEBUG?.includes(\"compiler:native\")) {\r\n console.log(\"[compiler:native]\", ...args)\r\n }\r\n}\r\n\r\n// ── Type Exports ────────────────────────────────────────────────────────────────\r\n\r\nexport interface NativeBridge {\r\n // Core transform\r\n transformSource?: (source: string, opts?: Record<string, string>) => NativeTransformResult | null\r\n extractClassesFromSource?: (source: string) => string[]\r\n hasTwUsage?: (source: string) => boolean\r\n isAlreadyTransformed?: (source: string) => boolean\r\n // Class Extractor\r\n extractAllClasses?: (source: string) => string[]\r\n parseClasses?: (raw: string) => Array<{ raw: string; type: string }>\r\n // Application functions\r\n extractComponentUsage?: (source: string) => Array<{ component: string; propsJson: string }>\r\n normalizeAndDedupClasses?: (raw: string) => { normalized: string; duplicatesRemoved: number; uniqueCount: number }\r\n diffClassLists?: (previous: string[], current: string[]) => { added: string[]; removed: string[]; unchanged: string[]; hasChanges: boolean }\r\n batchExtractClasses?: (filePaths: string[]) => Array<{ file: string; classes: string[]; contentHash: string; ok: boolean; error?: string }>\r\n checkAgainstSafelist?: (classes: string[], safelist: string[]) => { matched: string[]; unmatched: string[]; safelistSize: number }\r\n // Batch 2\r\n hoistComponents?: (source: string) => { code: string; hoisted: string[]; warnings: string[] }\r\n compileVariantTable?: (configJson: string) => { id: string; tableJson: string; keys: string[]; defaultKey: string; combinations: number }\r\n classifyAndSortClasses?: (classes: string[]) => Array<{ className: string; bucket: string; sortOrder: number }>\r\n mergeCssDeclarations?: (cssChunks: string[]) => { declarationsJson: string; declarationString: string; count: number }\r\n analyzeClassUsage?: (classes: string[], scanResultJson: string, css: string) => Array<{ className: string; usageCount: number; filesJson: string; bundleSizeBytes: number; isDeadCode: boolean }>\r\n analyzeRsc?: (source: string, filename: string) => {\r\n isServer: boolean\r\n needsClientDirective: boolean\r\n clientReasons: string[]\r\n }\r\n analyzeClasses?: (\r\n filesJson: string,\r\n cwd: string,\r\n flags: number\r\n ) => {\r\n css?: string\r\n code: string\r\n classes: string[]\r\n changed: boolean\r\n rscJson?: string\r\n metadataJson?: string\r\n safelist?: string[]\r\n } | null\r\n // CSS compilation\r\n compileCss?: (classes: string[], prefix?: string | null) => { css: string; classes: string[] }\r\n compileCssLightning?: (classes: string[]) => string\r\n /** Post-process raw Tailwind-generated CSS dengan LightningCSS di Rust */\r\n processTailwindCssLightning?: (css: string) => { css: string; size_bytes: number; resolved_classes: string[]; unknown_classes: string[] }\r\n}\r\n\r\nexport interface NativeTransformResult {\r\n code: string\r\n classes: string[]\r\n changed: boolean\r\n rscJson?: string\r\n metadataJson?: string\r\n}\r\n\r\nexport interface ClassExtractResult {\r\n classes: string[]\r\n component_names: string[]\r\n has_tw_usage: boolean\r\n has_use_client: boolean\r\n imports: string[]\r\n}\r\n\r\nconst NATIVE_UNAVAILABLE_MESSAGE =\r\n \"[tailwind-styled/compiler v5] Native binding is required but not available.\\n\" +\r\n \"This package requires native Rust bindings. There is no JavaScript fallback.\\n\" +\r\n \"Please ensure:\\n\" +\r\n \" 1. The native module is properly installed\\n\" +\r\n \" 2. You have run: npm run build:rust (or use prebuilt binary)\\n\" +\r\n \"\\n\" +\r\n \"For help, see: https://tailwind-styled.dev/docs/install\"\r\n\r\n// ── Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nlet nativeBridge: NativeBridge | null = null\r\nlet bridgeLoadAttempted = false\r\nlet bridgeLoadError: Error | null = null\r\n\r\nconst isValidNativeBridge = (mod: unknown): mod is NativeBridge => {\r\n const m = mod as Partial<NativeBridge>\r\n return !!(\r\n typeof m.transformSource === \"function\" ||\r\n typeof m.extractAllClasses === \"function\" ||\r\n typeof m.hasTwUsage === \"function\"\r\n )\r\n}\r\n\r\nexport const getNativeBridge = (): NativeBridge => {\r\n if (nativeBridge) {\r\n return nativeBridge\r\n }\r\n\r\n if (bridgeLoadAttempted) {\r\n if (bridgeLoadError) {\r\n throw bridgeLoadError\r\n }\r\n throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\r\n }\r\n\r\n bridgeLoadAttempted = true\r\n\r\n try {\r\n const runtimeDir = resolveRuntimeDir(undefined, import.meta.url)\r\n const require = createRequire(import.meta.url)\r\n \r\n // Use shared's native resolution\r\n const result = resolveNativeBinary(runtimeDir)\r\n\r\n if (result.path && result.path.endsWith(\".node\")) {\r\n try {\r\n const binding = require(result.path) as NativeBridge\r\n if (isValidNativeBridge(binding)) {\r\n nativeBridge = binding\r\n log(\"Native bridge loaded successfully from:\", result.path)\r\n return nativeBridge\r\n }\r\n } catch (e) {\r\n log(\"Failed to require native binding:\", e)\r\n }\r\n }\r\n\r\n throw new Error(`${NATIVE_UNAVAILABLE_MESSAGE}\\n\\nTried paths: ${result.tried.join(\"\\n\")}`)\r\n } catch (err) {\r\n bridgeLoadError = err instanceof Error ? err : new Error(String(err))\r\n log(\"Failed to load native bridge:\", bridgeLoadError.message)\r\n throw bridgeLoadError\r\n }\r\n}\r\n\r\nexport const resetNativeBridgeCache = (): void => {\r\n nativeBridge = null\r\n bridgeLoadAttempted = false\r\n bridgeLoadError = null\r\n log(\"Native bridge cache reset\")\r\n}\r\n\r\n// ── Adaptor for native results\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const adaptNativeResult = (\r\n raw: NativeTransformResult\r\n): {\r\n code: string\r\n classes: string[]\r\n changed: boolean\r\n rsc?: NativeRscResult\r\n metadata?: ComponentMetadata[]\r\n} => {\r\n return {\r\n code: raw.code ?? \"\",\r\n classes: raw.classes ?? [],\r\n changed: raw.changed ?? false,\r\n rsc: raw.rscJson ? JSON.parse(raw.rscJson) : undefined,\r\n metadata: raw.metadataJson ? JSON.parse(raw.metadataJson) : undefined,\r\n }\r\n}\r\n\r\n// ── Eager init — load native bridge saat module dimuat, bukan saat request pertama\r\n// Mencegah crash di Turbopack dev mode karena lazy init mid-request\r\n// ─────────────────────────────────────────────────────────────────────────────\r\nif (typeof process !== \"undefined\" && !bridgeLoadAttempted) {\r\n try {\r\n getNativeBridge()\r\n } catch {\r\n // Sudah di-capture di bridgeLoadError — akan di-throw saat dipanggil pertama kali\r\n }\r\n}","/**\r\n * tailwindEngine.ts\r\n *\r\n * Pipeline: classes[] → Tailwind JS (expand) → Rust LightningCSS (post-process)\r\n *\r\n * Tailwind adalah sumber kebenaran untuk semua CSS declarations.\r\n * Rust/LightningCSS handle: vendor prefix, minify, dead-code strip.\r\n *\r\n * Tidak ada hardcoded CSS di sini — semuanya dari Tailwind engine.\r\n */\r\n\r\nimport { createRequire } from \"node:module\"\r\nimport { getNativeBridge } from \"./nativeBridge\"\r\n\r\nconst require = createRequire(import.meta.url)\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Tailwind CSS v4 engine loader\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\ninterface TailwindV4Engine {\r\n compile: (input: string, options?: { loadPlugin?: () => unknown }) => {\r\n build: (candidates: string[]) => string\r\n }\r\n}\r\n\r\nlet _twEngine: TailwindV4Engine | null = null\r\nlet _twEngineError: Error | null = null\r\n\r\nfunction loadTailwindEngine(): TailwindV4Engine {\r\n if (_twEngine) return _twEngine\r\n if (_twEngineError) throw _twEngineError\r\n\r\n try {\r\n // Tailwind CSS v4 exposes a compile() API\r\n const tw = require(\"tailwindcss\") as TailwindV4Engine\r\n if (typeof tw.compile !== \"function\") {\r\n throw new Error(\"tailwindcss v4 not found — compile() API missing. Check tailwindcss version >= 4.\")\r\n }\r\n _twEngine = tw\r\n return _twEngine\r\n } catch (e) {\r\n _twEngineError = e instanceof Error ? e : new Error(String(e))\r\n throw _twEngineError\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Tailwind → raw CSS\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Generate raw CSS dari Tailwind engine.\r\n * Input: array of Tailwind class names.\r\n * Output: expanded CSS string (belum diminify).\r\n *\r\n * @example\r\n * generateRawCss([\"flex\", \"items-center\", \"hover:bg-blue-500\"])\r\n * // → \".flex{display:flex}.items-center{align-items:center}...\"\r\n */\r\nexport function generateRawCss(classes: string[]): string {\r\n if (classes.length === 0) return \"\"\r\n\r\n const tw = loadTailwindEngine()\r\n\r\n // Tailwind v4: compile() returns a compiler instance, build() takes candidates\r\n const compiler = tw.compile(\"@import 'tailwindcss';\")\r\n return compiler.build(classes)\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// LightningCSS post-process via Rust\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Kirim raw CSS ke Rust untuk diproses LightningCSS.\r\n * - Vendor prefix otomatis\r\n * - Minify\r\n * - Canonical output\r\n */\r\nfunction postProcessWithLightning(rawCss: string): string {\r\n if (!rawCss) return \"\"\r\n\r\n const native = getNativeBridge()\r\n\r\n // process_tailwind_css_lightning sudah ada di css_compiler.rs\r\n if (typeof native.processTailwindCssLightning === \"function\") {\r\n const result = native.processTailwindCssLightning(rawCss)\r\n return result?.css ?? rawCss\r\n }\r\n\r\n // Fallback: return raw jika binding belum tersedia\r\n console.warn(\"[tailwind-styled] processTailwindCssLightning tidak tersedia — gunakan raw CSS\")\r\n return rawCss\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Main pipeline\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface CssPipelineResult {\r\n css: string\r\n classes: string[]\r\n sizeBytes: number\r\n /** true jika LightningCSS berhasil dijalankan */\r\n optimized: boolean\r\n}\r\n\r\n/**\r\n * Full pipeline: classes[] → Tailwind → LightningCSS → final CSS\r\n *\r\n * @example\r\n * const result = await runCssPipeline([\"flex\", \"p-4\", \"hover:bg-blue-500\"])\r\n * // inject result.css ke <head>\r\n */\r\nexport async function runCssPipeline(classes: string[]): Promise<CssPipelineResult> {\r\n const unique = [...new Set(classes.filter(Boolean))]\r\n\r\n if (unique.length === 0) {\r\n return { css: \"\", classes: [], sizeBytes: 0, optimized: false }\r\n }\r\n\r\n // Step 1: Tailwind JS → raw CSS\r\n const rawCss = generateRawCss(unique)\r\n\r\n // Step 2: Rust LightningCSS → optimized CSS\r\n const native = getNativeBridge()\r\n const hasLightning = typeof native.processTailwindCssLightning === \"function\"\r\n\r\n const finalCss = hasLightning ? postProcessWithLightning(rawCss) : rawCss\r\n\r\n return {\r\n css: finalCss,\r\n classes: unique,\r\n sizeBytes: finalCss.length,\r\n optimized: hasLightning,\r\n }\r\n}\r\n\r\n/**\r\n * Sync version — untuk konteks yang tidak support async (webpack loader).\r\n * Tanpa async karena Tailwind v4 compile() sync.\r\n */\r\nexport function runCssPipelineSync(classes: string[]): CssPipelineResult {\r\n const unique = [...new Set(classes.filter(Boolean))]\r\n\r\n if (unique.length === 0) {\r\n return { css: \"\", classes: [], sizeBytes: 0, optimized: false }\r\n }\r\n\r\n const rawCss = generateRawCss(unique)\r\n\r\n const native = getNativeBridge()\r\n const hasLightning = typeof native.processTailwindCssLightning === \"function\"\r\n const finalCss = hasLightning ? postProcessWithLightning(rawCss) : rawCss\r\n\r\n return {\r\n css: finalCss,\r\n classes: unique,\r\n sizeBytes: finalCss.length,\r\n optimized: hasLightning,\r\n }\r\n}","/**\r\n * Scanner — Rust native bridge\r\n *\r\n * Wraps the Rust scan_workspace and extract_classes_from_source functions.\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n */\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport {\r\n createDebugLogger,\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n TwError,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nconst log = createDebugLogger(\"scanner:native\")\r\n\r\n// ESM-compatible __dirname equivalent\r\nfunction getDirname(): string {\r\n if (typeof __dirname !== \"undefined\") {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\ninterface NativeScannerBinding {\r\n scanWorkspace?: (\r\n root: string,\r\n extensions: string[] | null\r\n ) => {\r\n files: Array<{ file: string; classes: string[]; hash: string }>\r\n totalFiles: number\r\n uniqueClasses: string[] | null\r\n } | null\r\n extractClassesFromSource?: (source: string) => string[] | null\r\n hashFileContent?: (content: string) => string | null\r\n cacheRead?: (cachePath: string) => {\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n version: number\r\n } | null\r\n cacheWrite?: (\r\n cachePath: string,\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n ) => boolean\r\n cachePriority?: (\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs: number\r\n ) => number\r\n}\r\n\r\nconst isValidScannerBinding = (module: unknown): module is NativeScannerBinding => {\r\n const candidate = module as Partial<NativeScannerBinding> | null | undefined\r\n return !!(\r\n candidate &&\r\n (candidate.scanWorkspace ||\r\n candidate.extractClassesFromSource ||\r\n candidate.hashFileContent ||\r\n candidate.cacheRead ||\r\n candidate.cacheWrite)\r\n )\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createScannerBridgeLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeScannerBinding | null | undefined,\r\n loadError: null as string | null,\r\n candidatePaths: [] as string[],\r\n }\r\n\r\n const throwNativeBindingError = (): never => {\r\n const lines = [\r\n \"FATAL: Native scanner binding not found.\",\r\n \"\",\r\n \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\r\n \"The binding was not found in any of these paths:\",\r\n ..._state.candidatePaths.map((p) => ` - ${p}`),\r\n \"\",\r\n ]\r\n\r\n if (_state.loadError) {\r\n lines.push(\"Load error:\", ` ${_state.loadError}`, \"\")\r\n }\r\n\r\n lines.push(\r\n \"To fix this, run:\",\r\n \" npm run build:rust\",\r\n \"\",\r\n \"This will build the native Rust module from the 'native/' directory.\",\r\n \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\r\n \"and 'npm run build:rust' is executed before running tests or building.\"\r\n )\r\n\r\n throw new TwError(\"rust\", \"SCANNER_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\r\n }\r\n\r\n const scannerGetBinding = (): NativeScannerBinding => {\r\n const cachedBinding = _state.binding\r\n if (cachedBinding !== undefined) {\r\n if (cachedBinding !== null) {\r\n return cachedBinding\r\n }\r\n return throwNativeBindingError()\r\n }\r\n\r\n const runtimeDir = getDirname()\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n includeDefaultCandidates: true,\r\n })\r\n\r\n _state.candidatePaths = candidates\r\n\r\n const { binding, loadErrors } = loadNativeBinding<NativeScannerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isValidScannerBinding,\r\n invalidExportMessage: \"Module loaded but missing expected scanner binding functions\",\r\n })\r\n\r\n if (binding) {\r\n log(`scanner native binding loaded successfully`)\r\n _state.binding = binding\r\n return _state.binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\r\n }\r\n\r\n _state.binding = null\r\n return throwNativeBindingError()\r\n }\r\n\r\n return {\r\n get: scannerGetBinding,\r\n scannerGetBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.loadError = null\r\n _state.candidatePaths = []\r\n },\r\n }\r\n}\r\n\r\nconst scannerBridgeLoader = createScannerBridgeLoader()\r\nconst scannerGetBinding = scannerBridgeLoader.get\r\n\r\nexport const resetScannerBridgeCache = scannerBridgeLoader.reset\r\n\r\nexport function scanWorkspaceNative(\r\n root: string,\r\n extensions?: string[]\r\n): ReturnType<NonNullable<NativeScannerBinding[\"scanWorkspace\"]>> {\r\n return scannerGetBinding().scanWorkspace!(root, extensions ?? null)\r\n}\r\n\r\nexport function extractClassesNative(source: string): string[] {\r\n const result = scannerGetBinding().extractClassesFromSource?.(source)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_EXTRACT_FAILED\",\r\n \"Native extractClassesFromSource returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function hashContentNative(content: string): string {\r\n const result = scannerGetBinding().hashFileContent?.(content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_HASH_FAILED\",\r\n \"Native hashFileContent returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function isRustCacheAvailable(): boolean {\r\n return true\r\n}\r\n\r\nexport function hasNativeScannerBinding(): boolean {\r\n try {\r\n scannerBridgeLoader.get()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function cacheReadNative(\r\n cachePath: string\r\n): ReturnType<NonNullable<NativeScannerBinding[\"cacheRead\"]>> {\r\n const result = scannerGetBinding().cacheRead?.(cachePath)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_READ_FAILED\",\r\n \"Native cacheRead returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cacheWriteNative(\r\n cachePath: string,\r\n entries: Parameters<NonNullable<NativeScannerBinding[\"cacheWrite\"]>>[1]\r\n): boolean {\r\n const result = scannerGetBinding().cacheWrite?.(cachePath, entries)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_WRITE_FAILED\",\r\n \"Native cacheWrite returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cachePriorityNative(\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs = Date.now()\r\n): number {\r\n const result = scannerGetBinding().cachePriority?.(\r\n mtimeMs,\r\n size,\r\n cachedMtimeMs,\r\n cachedSize,\r\n cachedHitCount,\r\n cachedLastSeenMs,\r\n nowMs\r\n )\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_PRIORITY_FAILED\",\r\n \"Native cachePriority returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n","/**\r\n * tailwind-styled-v5 — Compiler Index\r\n * \r\n * All functions are backed by native Rust bindings.\r\n * No JavaScript fallback - native is required.\r\n */\r\n\r\nimport { getNativeBridge, resetNativeBridgeCache, adaptNativeResult, type NativeBridge, type NativeTransformResult, type ClassExtractResult, type ComponentMetadata, type NativeRscResult } from \"./nativeBridge\"\r\n\r\nexport { getNativeBridge, resetNativeBridgeCache, adaptNativeResult }\r\nexport type { NativeBridge, NativeTransformResult, ClassExtractResult, ComponentMetadata, NativeRscResult }\r\n\r\nexport type LoaderOutput = {\r\n code: string\r\n changed: boolean\r\n classes: string[]\r\n}\r\n\r\n// =============================================================================\r\n// CORE TRANSFORM FUNCTIONS\r\n// =============================================================================\r\n\r\nexport const transformSource = (source: string, opts?: Record<string, unknown>) => {\r\n const native = getNativeBridge()\r\n if (!native?.transformSource) {\r\n throw new Error(\"FATAL: Native binding 'transformSource' is required but not available.\")\r\n }\r\n const result = native.transformSource(source, opts as Record<string, string>)\r\n if (!result) {\r\n throw new Error(\"FATAL: transformSource returned null\")\r\n }\r\n return result\r\n}\r\n\r\nexport const hasTwUsage = (source: string): boolean => {\r\n const native = getNativeBridge()\r\n if (!native?.hasTwUsage) {\r\n throw new Error(\"FATAL: Native binding 'hasTwUsage' is required but not available.\")\r\n }\r\n return native.hasTwUsage(source)\r\n}\r\n\r\nexport const isAlreadyTransformed = (source: string): boolean => {\r\n const native = getNativeBridge()\r\n if (!native?.isAlreadyTransformed) {\r\n throw new Error(\"FATAL: Native binding 'isAlreadyTransformed' is required but not available.\")\r\n }\r\n return native.isAlreadyTransformed(source)\r\n}\r\n\r\nexport const shouldProcess = (source: string): boolean => {\r\n return hasTwUsage(source) && !isAlreadyTransformed(source)\r\n}\r\n\r\n// =============================================================================\r\n// CSS COMPILATION\r\n// =============================================================================\r\n\r\nexport const compileCssFromClasses = (classes: string[], prefix?: string | null) => {\r\n const native = getNativeBridge()\r\n if (!native?.transformSource) {\r\n throw new Error(\"FATAL: Native binding 'transformSource' is required but not available.\")\r\n }\r\n const result = native.transformSource(classes.join(\" \"), { prefix: prefix ?? \"\" })\r\n if (!result) {\r\n throw new Error(\"FATAL: transformSource returned null\")\r\n }\r\n return result\r\n}\r\n\r\nexport const buildStyleTag = (classes: string[]): string => {\r\n const result = compileCssFromClasses(classes)\r\n return result?.code ? `<style data-tailwind-styled>${result.code}</style>` : \"\"\r\n}\r\n\r\nexport const compileCssNative = (classes: string[], prefix: string | null = null) => {\r\n return compileCssFromClasses(classes, prefix)\r\n}\r\n\r\nexport const generateCssForClasses = async (\r\n classes: string[],\r\n _tailwindConfig?: Record<string, unknown>,\r\n _root?: string\r\n): Promise<string> => {\r\n const { runCssPipeline } = await import(\"./tailwindEngine\")\r\n const result = await runCssPipeline(classes)\r\n return result.css\r\n}\r\n\r\n// =============================================================================\r\n// CLASS EXTRACTION\r\n// =============================================================================\r\n\r\nexport const extractAllClasses = (source: string): string[] => {\r\n const native = getNativeBridge()\r\n if (!native?.extractAllClasses) {\r\n throw new Error(\"FATAL: Native binding 'extractAllClasses' is required but not available.\")\r\n }\r\n return native.extractAllClasses(source) || []\r\n}\r\n\r\nexport const extractClassesFromSource = (source: string): string => {\r\n const native = getNativeBridge()\r\n if (!native?.extractClassesFromSource) {\r\n throw new Error(\"FATAL: Native binding 'extractClassesFromSource' is required but not available.\")\r\n }\r\n const result = native.extractClassesFromSource(source)\r\n return Array.isArray(result) ? result.join(\" \") : String(result || \"\")\r\n}\r\n\r\nexport const astExtractClasses = (source: string, filename: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.extractClassesFromSource) {\r\n throw new Error(\"FATAL: Native binding 'extractClassesFromSource' is required but not available.\")\r\n }\r\n return native.extractClassesFromSource(source) || []\r\n}\r\n\r\nexport const parseClasses = (raw: string): Array<{ raw: string; type: string }> => {\r\n const native = getNativeBridge()\r\n if (!native?.parseClasses) {\r\n // Fallback to JS implementation\r\n return parseClassesJs(raw)\r\n }\r\n return native.parseClasses(raw) || []\r\n}\r\n\r\nfunction parseClassesJs(raw: string): Array<{ raw: string; type: string }> {\r\n if (!raw || typeof raw !== \"string\") return []\r\n \r\n const classes = raw.split(/\\s+/).filter(Boolean)\r\n return classes.map((cls) => ({\r\n raw: cls,\r\n type: cls.includes(\":\") ? \"variant\" : cls.includes(\"/\") ? \"arbitrary\" : \"utility\",\r\n }))\r\n}\r\n\r\n// =============================================================================\r\n// CLASS NORMALIZATION & MERGING\r\n// =============================================================================\r\n\r\nexport const normalizeClasses = (raw: string): string => {\r\n const result = normalizeAndDedupClasses(raw)\r\n return result?.normalized || \"\"\r\n}\r\n\r\nexport const mergeClassesStatic = (classes: string): string => {\r\n const result = normalizeAndDedupClasses(classes)\r\n return result?.normalized || \"\"\r\n}\r\n\r\nfunction normalizeAndDedupClassesJs(raw: string): { normalized: string; duplicatesRemoved: number; uniqueCount: number } {\r\n const seen = new Set<string>()\r\n const result: string[] = []\r\n let duplicatesRemoved = 0\r\n\r\n for (const token of raw.split(/\\s+/)) {\r\n if (token.length === 0) continue\r\n if (seen.has(token)) {\r\n duplicatesRemoved++\r\n } else {\r\n seen.add(token)\r\n result.push(token)\r\n }\r\n }\r\n\r\n return {\r\n normalized: result.join(\" \"),\r\n duplicatesRemoved,\r\n uniqueCount: result.length,\r\n }\r\n}\r\n\r\nexport const normalizeAndDedupClasses = (raw: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.normalizeAndDedupClasses) {\r\n // Fallback to JS implementation\r\n return normalizeAndDedupClassesJs(raw)\r\n }\r\n const result = native.normalizeAndDedupClasses(raw)\r\n return result || { normalized: \"\", duplicatesRemoved: 0, uniqueCount: 0 }\r\n}\r\n\r\n// =============================================================================\r\n// DEAD STYLE ELIMINATOR\r\n// =============================================================================\r\n\r\nexport const eliminateDeadCss = (css: string, deadClasses: Set<string>): string => {\r\n let result = css\r\n for (const dead of deadClasses) {\r\n result = result.replace(new RegExp(`\\\\.${dead.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}[^{]*\\\\{[^}]*\\\\}`, 'g'), '')\r\n }\r\n return result\r\n}\r\n\r\nexport const findDeadVariants = (variantConfig: Record<string, unknown>, usage: Record<string, Set<string>>) => {\r\n const unused: string[] = []\r\n const variants = variantConfig as Record<string, Record<string, string>>\r\n for (const [key, values] of Object.entries(variants)) {\r\n for (const [value] of Object.entries(values)) {\r\n const keyValue = `${key}:${value}`\r\n if (!usage[key]?.has(value)) {\r\n unused.push(keyValue)\r\n }\r\n }\r\n }\r\n return unused\r\n}\r\n\r\nexport const runElimination = (css: string, scanResult: unknown) => {\r\n const scanJson = JSON.stringify(scanResult)\r\n const classes = extractAllClasses(css)\r\n const usage = analyzeClassUsage(classes, scanJson, css) || []\r\n const deadClasses = new Set((usage as Array<{ isDeadCode: boolean; className: string }>).filter(u => u.isDeadCode).map(u => u.className))\r\n return eliminateDeadCss(css, deadClasses)\r\n}\r\n\r\nexport const optimizeCss = (css: string): string => {\r\n const classes = extractAllClasses(css)\r\n const usage = analyzeClassUsage(classes, \"[]\", css) || []\r\n const usedClasses = new Set((usage as Array<{ isDeadCode: boolean; className: string }>).filter(u => !u.isDeadCode).map(u => u.className))\r\n \r\n let result = css\r\n const classRegex = /\\.([a-zA-Z0-9_-]+)/g\r\n result = result.replace(classRegex, (match, className) => {\r\n return usedClasses.has(className) ? match : ''\r\n })\r\n \r\n result = result.replace(/[^{}]*\\{\\s*\\}/g, '')\r\n return result.trim()\r\n}\r\n\r\nexport const scanProjectUsage = (dirs: string[], cwd: string) => {\r\n const path = require('node:path')\r\n const files = dirs.map(dir => path.resolve(cwd, dir))\r\n const results = batchExtractClasses(files) || []\r\n \r\n const combined: Record<string, Record<string, Set<string>>> = {}\r\n for (const result of results) {\r\n if (result.ok && result.classes) {\r\n for (const cls of result.classes) {\r\n if (!combined[cls]) combined[cls] = {}\r\n combined[cls][result.file] = new Set([cls])\r\n }\r\n }\r\n }\r\n return combined\r\n}\r\n\r\n// =============================================================================\r\n// COMPONENT ANALYSIS\r\n// =============================================================================\r\n\r\nexport const extractComponentUsage = (source: string): Array<{ component: string; propsJson: string }> => {\r\n const native = getNativeBridge()\r\n if (!native?.extractComponentUsage) {\r\n throw new Error(\"FATAL: Native binding 'extractComponentUsage' is required but not available.\")\r\n }\r\n return native.extractComponentUsage(source) || []\r\n}\r\n\r\n// =============================================================================\r\n// DIFF & BATCH OPERATIONS\r\n// =============================================================================\r\n\r\nexport const diffClassLists = (previous: string[], current: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.diffClassLists) {\r\n throw new Error(\"FATAL: Native binding 'diffClassLists' is required but not available.\")\r\n }\r\n return native.diffClassLists(previous, current) || { added: [], removed: [], unchanged: [], hasChanges: false }\r\n}\r\n\r\nexport const batchExtractClasses = (filePaths: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.batchExtractClasses) {\r\n throw new Error(\"FATAL: Native binding 'batchExtractClasses' is required but not available.\")\r\n }\r\n return native.batchExtractClasses(filePaths) || []\r\n}\r\n\r\nexport const checkAgainstSafelist = (classes: string[], safelist: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.checkAgainstSafelist) {\r\n throw new Error(\"FATAL: Native binding 'checkAgainstSafelist' is required but not available.\")\r\n }\r\n return native.checkAgainstSafelist(classes, safelist) || { matched: [], unmatched: [], safelistSize: 0 }\r\n}\r\n\r\n// =============================================================================\r\n// HOISTING\r\n// =============================================================================\r\n\r\nexport const hoistComponents = (source: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.hoistComponents) {\r\n throw new Error(\"FATAL: Native binding 'hoistComponents' is required but not available.\")\r\n }\r\n return native.hoistComponents(source) || { code: source, hoisted: [], warnings: [] }\r\n}\r\n\r\n// =============================================================================\r\n// VARIANT COMPILATION\r\n// =============================================================================\r\n\r\nexport const compileVariantTable = (configJson: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.compileVariantTable) {\r\n throw new Error(\"FATAL: Native binding 'compileVariantTable' is required but not available.\")\r\n }\r\n return native.compileVariantTable(configJson) || { id: \"\", tableJson: \"{}\", keys: [], defaultKey: \"\", combinations: 0 }\r\n}\r\n\r\nexport const compileVariants = (componentId: string, config: Record<string, unknown>) => {\r\n return compileVariantTable(JSON.stringify({ componentId, ...config }))\r\n}\r\n\r\n// =============================================================================\r\n// CSS ANALYSIS\r\n// =============================================================================\r\n\r\nexport const classifyAndSortClasses = (classes: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.classifyAndSortClasses) {\r\n throw new Error(\"FATAL: Native binding 'classifyAndSortClasses' is required but not available.\")\r\n }\r\n return native.classifyAndSortClasses(classes) || []\r\n}\r\n\r\nexport const mergeCssDeclarations = (cssChunks: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.mergeCssDeclarations) {\r\n throw new Error(\"FATAL: Native binding 'mergeCssDeclarations' is required but not available.\")\r\n }\r\n return native.mergeCssDeclarations(cssChunks) || { declarationsJson: \"{}\", declarationString: \"\", count: 0 }\r\n}\r\n\r\nexport const analyzeClassUsage = (classes: string[], scanResultJson: string, css: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeClassUsage) {\r\n throw new Error(\"FATAL: Native binding 'analyzeClassUsage' is required but not available.\")\r\n }\r\n return native.analyzeClassUsage(classes, scanResultJson, css) || []\r\n}\r\n\r\n// =============================================================================\r\n// RSC ANALYSIS\r\n// =============================================================================\r\n\r\nexport const analyzeRsc = (source: string, filename: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeRsc) {\r\n throw new Error(\"FATAL: Native binding 'analyzeRsc' is required but not available.\")\r\n }\r\n return native.analyzeRsc(source, filename) || { isServer: true, needsClientDirective: false, clientReasons: [] }\r\n}\r\n\r\nexport const analyzeFile = (source: string, filename: string) => {\r\n const rsc = analyzeRsc(source, filename)\r\n return {\r\n isServer: rsc?.isServer ?? true,\r\n needsClientDirective: rsc?.needsClientDirective ?? false,\r\n clientReasons: rsc?.clientReasons ?? [],\r\n interactiveClasses: [],\r\n canStaticResolveVariants: true,\r\n }\r\n}\r\n\r\nexport const analyzeVariantUsage = (source: string, componentName: string, variantKeys: string[]) => {\r\n const rsc = analyzeRsc(source, componentName)\r\n return { \r\n resolved: {} as Record<string, string>, \r\n dynamic: [] as string[] \r\n }\r\n}\r\n\r\nexport const injectClientDirective = (source: string): string => {\r\n if (!source.includes('\"use client\"') && !source.includes(\"'use client'\")) {\r\n return '\"use client\";\\n' + source\r\n }\r\n return source\r\n}\r\n\r\nexport const injectServerOnlyComment = (source: string): string => {\r\n return `/* @server-only */\\n${source}`\r\n}\r\n\r\n// =============================================================================\r\n// FULL ANALYSIS\r\n// =============================================================================\r\n\r\nexport const analyzeClasses = (filesJson: string, cwd: string, flags: number) => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeClasses) {\r\n throw new Error(\"FATAL: Native binding 'analyzeClasses' is required but not available.\")\r\n }\r\n return native.analyzeClasses(filesJson, cwd, flags)\r\n}\r\n\r\n// =============================================================================\r\n// SAFELIST\r\n// =============================================================================\r\n\r\nexport const generateSafelist = (scanDirs: string[], outputPath?: string, cwd?: string) => {\r\n const classes = scanProjectUsage(scanDirs, cwd || process.cwd())\r\n const allClasses = Object.keys(classes).sort()\r\n \r\n if (outputPath) {\r\n const fs = require('node:fs')\r\n fs.writeFileSync(outputPath, JSON.stringify(allClasses, null, 2))\r\n }\r\n \r\n return allClasses\r\n}\r\n\r\nexport const loadSafelist = (safelistPath: string): string[] => {\r\n const fs = require('node:fs')\r\n try {\r\n const content = fs.readFileSync(safelistPath, 'utf-8')\r\n return JSON.parse(content)\r\n } catch {\r\n return []\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// CONFIG LOADING\r\n// =============================================================================\r\n\r\nexport const loadTailwindConfig = (cwd: string = process.cwd()) => {\r\n const fs = require('node:fs')\r\n const path = require('node:path')\r\n \r\n const configFiles = [\r\n 'tailwind.config.ts',\r\n 'tailwind.config.js',\r\n 'tailwind.config.mjs',\r\n 'tailwind.config.cjs',\r\n ]\r\n \r\n for (const file of configFiles) {\r\n const fullPath = path.join(cwd, file)\r\n if (fs.existsSync(fullPath)) {\r\n const mod = require(fullPath)\r\n return mod.default || mod\r\n }\r\n }\r\n \r\n return {}\r\n}\r\n\r\nexport const getContentPaths = (cwd: string = process.cwd()) => {\r\n const path = require('node:path')\r\n return {\r\n content: [\r\n path.join(cwd, 'src/**/*.{js,ts,jsx,tsx}'),\r\n path.join(cwd, 'app/**/*.{js,ts,jsx,tsx}'),\r\n path.join(cwd, 'pages/**/*.{js,ts,jsx,tsx}'),\r\n ],\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// LOADER\r\n// =============================================================================\r\n\r\nexport const runLoaderTransform = (ctx: { filepath: string; source: string; options?: Record<string, unknown> }) => {\r\n const { filepath, source, options } = ctx\r\n const result = transformSource(source, { filename: filepath, ...options })\r\n return {\r\n code: result?.code || \"\",\r\n changed: result?.changed || false,\r\n classes: result?.classes || [],\r\n } as LoaderOutput\r\n}\r\n\r\nexport const shouldSkipFile = (filepath: string): boolean => {\r\n const SKIP_PATHS = ['node_modules', '.next', '.rspack-dist', '.turbo', 'dist/', 'out/']\r\n const skipExtensions = ['.css', '.json', '.md', '.txt', '.yaml', '.yml']\r\n \r\n for (const p of SKIP_PATHS) {\r\n if (filepath.includes(p)) return true\r\n }\r\n for (const ext of skipExtensions) {\r\n if (filepath.endsWith(ext)) return true\r\n }\r\n return false\r\n}\r\n\r\n// =============================================================================\r\n// ROUTE CSS COLLECTOR\r\n// =============================================================================\r\n\r\nexport const fileToRoute = (filepath: string): string | null => {\r\n const normalized = filepath.replace(/\\\\/g, '/')\r\n \r\n if (normalized.includes('/layout.') || normalized.includes('/loading.') || normalized.includes('/error.')) {\r\n return '__global'\r\n }\r\n \r\n const pageMatch = normalized.match(/\\/app\\/(.+?)\\/page\\.[tj]sx?$/)\r\n if (pageMatch) return `/${pageMatch[1]}`\r\n \r\n const rootPage = normalized.match(/\\/app\\/page\\.[tj]sx?$/)\r\n if (rootPage) return '/'\r\n \r\n return null\r\n}\r\n\r\nexport const getAllRoutes = (): string[] => {\r\n return ['/', '__global']\r\n}\r\n\r\nexport const getRouteClasses = (route: string): Set<string> => {\r\n return new Set()\r\n}\r\n\r\nexport const registerFileClasses = (filepath: string, classes: string[]): void => {\r\n // Could be implemented with native\r\n}\r\n\r\nexport const registerGlobalClasses = (classes: string[]): void => {\r\n // Could be implemented with native\r\n}\r\n\r\n// =============================================================================\r\n// INCREMENTAL ENGINE\r\n// =============================================================================\r\n\r\nlet incrementalEngineInstance: unknown = null\r\n\r\nexport const getIncrementalEngine = () => {\r\n if (!incrementalEngineInstance) {\r\n incrementalEngineInstance = {\r\n compile: (source: string) => transformSource(source),\r\n }\r\n }\r\n return incrementalEngineInstance\r\n}\r\n\r\nexport const resetIncrementalEngine = () => {\r\n incrementalEngineInstance = null\r\n}\r\n\r\nexport const IncrementalEngine = class {\r\n compile(source: string) {\r\n return transformSource(source)\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// STYLE BUCKET SYSTEM\r\n// =============================================================================\r\n\r\nlet bucketEngineInstance: unknown = null\r\n\r\nexport const getBucketEngine = () => {\r\n if (!bucketEngineInstance) {\r\n bucketEngineInstance = {\r\n add: (className: string) => className,\r\n get: (bucket: string) => [],\r\n }\r\n }\r\n return bucketEngineInstance\r\n}\r\n\r\nexport const resetBucketEngine = () => {\r\n bucketEngineInstance = null\r\n}\r\n\r\nexport const BucketEngine = class {\r\n add(className: string) {\r\n return className\r\n }\r\n}\r\n\r\nexport const classifyNode = (node: unknown): string => {\r\n return 'unknown'\r\n}\r\n\r\nexport const detectConflicts = (classes: string[]): string[] => {\r\n return []\r\n}\r\n\r\nexport const bucketSort = (classes: string[]): string[] => {\r\n return classes\r\n}","import fs from \"node:fs\"\r\nimport { createRequire } from \"node:module\"\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport { Worker } from \"node:worker_threads\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\nimport { filePriority, type NativeCacheEntry, readCache, writeCache } from \"./cache-native\"\r\nimport { hashContentNative, isRustCacheAvailable } from \"./native-bridge\"\r\nimport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n type ScanFileResult,\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nconst log = createLogger(\"scanner\")\r\n\r\nconst SCAN_WORKER_TIMEOUT_MS = 120_000\r\n\r\ntype NativeParsedClass = { raw?: string }\r\ntype NativeParserBinding = {\r\n parse_classes?: (input: string) => NativeParsedClass[]\r\n parseClasses?: (input: string) => NativeParsedClass[]\r\n extractClassesFromSource?: (source: string) => string[] | null\r\n batchExtractClassesNative?: (filePaths: string[]) => Array<{\r\n file: string; classes: string[]; contentHash: string; ok: boolean; error?: string\r\n }>\r\n}\r\n\r\nfunction getRuntimeDir(): string {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Parser Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createNativeParserLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeParserBinding | null | undefined,\r\n initError: null as string | null,\r\n }\r\n\r\n const debugNative = (message: string): void => {\r\n log.debug(`[native] ${message}`)\r\n }\r\n\r\n const loadNativeParserBinding = (): NativeParserBinding | null => {\r\n if (_state.binding !== undefined) return _state.binding\r\n\r\n const runtimeDir = getRuntimeDir()\r\n const req = createRequire(path.join(runtimeDir, \"noop.cjs\"))\r\n\r\n const candidates = [\r\n path.resolve(process.cwd(), \"native/tailwind_styled_parser.node\"),\r\n path.resolve(process.cwd(), \"native/build/Release/tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(\r\n runtimeDir,\r\n \"..\",\r\n \"..\",\r\n \"..\",\r\n \"native\",\r\n \"build\",\r\n \"Release\",\r\n \"tailwind_styled_parser.node\"\r\n ),\r\n ]\r\n\r\n for (const fullPath of candidates) {\r\n if (!fs.existsSync(fullPath)) continue\r\n try {\r\n const required = req(fullPath) as NativeParserBinding\r\n if (\r\n required &&\r\n (typeof required.extractClassesFromSource === \"function\" ||\r\n typeof required.parseClasses === \"function\" ||\r\n typeof required.parse_classes === \"function\")\r\n ) {\r\n _state.binding = required\r\n debugNative(`using native parser from ${fullPath}`)\r\n return _state.binding\r\n }\r\n } catch (error) {\r\n _state.initError = error instanceof Error ? error.message : String(error)\r\n }\r\n }\r\n\r\n _state.binding = null\r\n if (!_state.initError) {\r\n _state.initError = \"native .node binding not found\"\r\n }\r\n debugNative(`native binding not available: ${_state.initError}`)\r\n return _state.binding\r\n }\r\n\r\n return {\r\n get: loadNativeParserBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.initError = null\r\n },\r\n }\r\n}\r\n\r\nconst nativeParserLoader = createNativeParserLoader()\r\n\r\nfunction normalizeWithNativeParser(tokens: string[]): string[] {\r\n const binding = nativeParserLoader.get()\r\n const parseClasses = binding?.parseClasses ?? binding?.parse_classes\r\n if (!binding || typeof parseClasses !== \"function\") {\r\n throw new Error(\r\n \"Native parser binding is required but not available. Run 'npm run build:rust' to build it.\"\r\n )\r\n }\r\n\r\n try {\r\n const parsed = parseClasses(tokens.join(\" \"))\r\n const normalized = parsed.map((item) => item.raw?.trim() ?? \"\").filter(Boolean)\r\n return Array.from(new Set(normalized))\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error)\r\n throw new Error(`Native parser failed: ${errorMessage}. Run 'npm run build:rust' to rebuild.`)\r\n }\r\n}\r\n\r\nexport type { ScanFileResult, ScanWorkspaceOptions, ScanWorkspaceResult } from \"./schemas\"\r\nexport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nexport const DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\r\nexport const DEFAULT_IGNORES = [\"node_modules\", \".git\", \".next\", \"dist\", \"out\", \".turbo\", \".cache\"]\r\n\r\nfunction resolveScannerWorkerModulePath(): string | null {\r\n const runtimeDir = (() => {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n // ESM fallback\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n // Final fallback\r\n return process.cwd()\r\n })()\r\n\r\n const candidates = [\r\n path.resolve(runtimeDir, \"worker.cjs\"),\r\n path.resolve(runtimeDir, \"worker.js\"),\r\n path.resolve(runtimeDir, \"worker.ts\"),\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction scanWorkspaceInWorker(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const modulePath = resolveScannerWorkerModulePath()\r\n if (!modulePath) {\r\n return Promise.reject(new Error(\"scanner worker module path could not be resolved\"))\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const settleState = { settled: false }\r\n\r\n const worker = new Worker(modulePath, { workerData: { rootDir, options: normalizedOptions } })\r\n\r\n const timeout = setTimeout(() => {\r\n if (!settleState.settled) {\r\n settleState.settled = true\r\n void worker.terminate()\r\n reject(new Error(`scanner worker timed out after ${SCAN_WORKER_TIMEOUT_MS}ms`))\r\n }\r\n }, SCAN_WORKER_TIMEOUT_MS)\r\n\r\n const finish = (callback: () => void) => {\r\n if (settleState.settled) return\r\n settleState.settled = true\r\n clearTimeout(timeout)\r\n callback()\r\n }\r\n\r\n worker.once(\"message\", (payload: unknown) => {\r\n const message = parseScannerWorkerMessage(payload)\r\n finish(() => {\r\n if (message?.ok) {\r\n resolve(parseScanWorkspaceResult(message.result))\r\n return\r\n }\r\n reject(new Error(message?.error ?? \"scanner worker failed without an error message\"))\r\n })\r\n })\r\n\r\n worker.once(\"error\", (error: Error) => {\r\n finish(() => reject(error))\r\n })\r\n\r\n worker.once(\"exit\", (code: number) => {\r\n if (code !== 0) {\r\n finish(() => reject(new Error(`scanner worker exited with code ${code}`)))\r\n }\r\n })\r\n })\r\n}\r\n\r\nfunction buildExtensionSet(includeExtensions: string[]): Set<string> {\r\n return new Set(includeExtensions)\r\n}\r\n\r\nfunction collectCandidates(\r\n rootDir: string,\r\n ignoreDirectories: Set<string>,\r\n extensionSet: Set<string>\r\n): string[] {\r\n const candidates: string[] = []\r\n const directories = [rootDir]\r\n\r\n while (directories.length > 0) {\r\n const currentDir = directories.pop()\r\n if (!currentDir) continue\r\n\r\n const entries = (() => {\r\n try {\r\n return fs.readdirSync(currentDir, { withFileTypes: true })\r\n } catch {\r\n return [] as fs.Dirent[]\r\n }\r\n })()\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name)\r\n\r\n if (entry.isDirectory()) {\r\n if (!ignoreDirectories.has(entry.name)) directories.push(fullPath)\r\n continue\r\n }\r\n\r\n if (!entry.isFile()) continue\r\n if (!extensionSet.has(path.extname(entry.name))) continue\r\n candidates.push(fullPath)\r\n }\r\n }\r\n\r\n return candidates\r\n}\r\n\r\nfunction toCacheSize(size: number): number {\r\n if (!Number.isFinite(size)) return 0\r\n const normalized = Math.max(0, Math.trunc(size))\r\n return Math.min(normalized, 0xffffffff)\r\n}\r\n\r\nexport function scanSource(source: string): string[] {\r\n const nativeBinding = nativeParserLoader.get()\r\n if (nativeBinding?.extractClassesFromSource) {\r\n const classes = nativeBinding.extractClassesFromSource(source)\r\n if (Array.isArray(classes)) {\r\n return Array.from(new Set(classes.filter(Boolean)))\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"FATAL: Native parser binding is required but not available.\\n\" +\r\n \"This package requires native Rust bindings.\\n\\n\" +\r\n \"Resolution steps:\\n\" +\r\n \"1. Build the native Rust module: npm run build:rust\"\r\n )\r\n}\r\n\r\nexport function isScannableFile(filePath: string, includeExtensions = DEFAULT_EXTENSIONS): boolean {\r\n return includeExtensions.includes(path.extname(filePath))\r\n}\r\n\r\nexport function scanFile(filePath: string): ScanFileResult {\r\n const source = fs.readFileSync(filePath, \"utf8\")\r\n const hash = hashContentNative(source) ?? undefined\r\n return {\r\n file: filePath,\r\n classes: scanSource(source),\r\n ...(hash ? { hash } : {}),\r\n }\r\n}\r\n\r\nexport function scanWorkspace(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): ScanWorkspaceResult {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const includeExtensions = normalizedOptions.includeExtensions ?? DEFAULT_EXTENSIONS\r\n const extensionSet = buildExtensionSet(includeExtensions)\r\n const ignoreDirectories = new Set(normalizedOptions.ignoreDirectories ?? DEFAULT_IGNORES)\r\n const useCache = normalizedOptions.useCache ?? true\r\n const _smartInvalidation = normalizedOptions.smartInvalidation ?? true\r\n\r\n const files: ScanFileResult[] = []\r\n const unique = new Set<string>()\r\n const candidates = collectCandidates(rootDir, ignoreDirectories, extensionSet)\r\n\r\n const processResult = (result: ScanFileResult) => {\r\n files.push(result)\r\n for (const cls of result.classes) unique.add(cls)\r\n }\r\n\r\n \r\n const { scanWorkspaceNative } = require(\"./native-bridge\")\r\n\r\n if (!normalizedOptions.cacheDir && !useCache) {\r\n const nativeResult = scanWorkspaceNative(rootDir, includeExtensions)\r\n if (nativeResult) {\r\n return parseScanWorkspaceResult({\r\n files: nativeResult.files.map((f: { file: string; classes: string[]; hash?: string }) => ({\r\n file: f.file,\r\n classes: f.classes,\r\n ...(f.hash ? { hash: f.hash } : {}),\r\n })),\r\n totalFiles: nativeResult.totalFiles,\r\n uniqueClasses: nativeResult.uniqueClasses,\r\n })\r\n }\r\n }\r\n\r\n if (useCache && isRustCacheAvailable()) {\r\n const cacheEntries: NativeCacheEntry[] = (() => {\r\n try {\r\n return readCache(rootDir, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(\r\n `cache read failed, continuing without persisted cache: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return []\r\n }\r\n })()\r\n\r\n const cacheMap = new Map(cacheEntries.map((entry) => [entry.file, entry]))\r\n const nowMs = Date.now()\r\n const ranked: Array<{\r\n filePath: string\r\n stat: fs.Stats\r\n size: number\r\n cached?: NativeCacheEntry\r\n priority: number\r\n }> = []\r\n\r\n for (const filePath of candidates) {\r\n const stat = (() => {\r\n try {\r\n return fs.statSync(filePath)\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!stat) continue\r\n\r\n const size = toCacheSize(stat.size)\r\n const cached = cacheMap.get(filePath)\r\n const priority = filePriority(\r\n stat.mtimeMs,\r\n size,\r\n cached\r\n ? {\r\n mtimeMs: cached.mtimeMs,\r\n size: cached.size,\r\n hitCount: cached.hitCount,\r\n lastSeenMs: 0,\r\n }\r\n : undefined,\r\n nowMs\r\n )\r\n\r\n ranked.push({ filePath, stat, size, cached, priority })\r\n }\r\n\r\n ranked.sort((a, b) => b.priority - a.priority)\r\n\r\n const updatedEntries: NativeCacheEntry[] = []\r\n\r\n for (const { filePath, stat, size, cached } of ranked) {\r\n const content = (() => {\r\n try {\r\n return fs.readFileSync(filePath, \"utf8\")\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!content) continue\r\n\r\n const hash = hashContentNative(content)\r\n if (\r\n cached &&\r\n cached.hash === hash &&\r\n cached.mtimeMs === stat.mtimeMs &&\r\n cached.size === size\r\n ) {\r\n log.debug(`cache HIT ${filePath}`)\r\n processResult({ file: filePath, classes: cached.classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes: cached.classes,\r\n hash: cached.hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: (cached.hitCount ?? 0) + 1,\r\n })\r\n continue\r\n }\r\n\r\n log.debug(`cache MISS ${filePath}`)\r\n const classes = scanSource(content)\r\n processResult({ file: filePath, classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes,\r\n hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: 1,\r\n })\r\n }\r\n\r\n try {\r\n writeCache(rootDir, updatedEntries, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(`cache write failed: ${error instanceof Error ? error.message : String(error)}`)\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n }\r\n\r\n // Fast path: gunakan Rust batch extraction jika tersedia (parallel, tanpa GC)\r\n const batchNative = nativeParserLoader.get()?.batchExtractClassesNative\r\n if (batchNative) {\r\n const batchResults = batchNative(candidates)\r\n for (const r of batchResults ?? []) {\r\n if (r.ok) processResult({ file: r.file, classes: r.classes })\r\n }\r\n } else {\r\n for (const filePath of candidates) {\r\n processResult(scanFile(filePath))\r\n }\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n}\r\n\r\nexport async function scanWorkspaceAsync(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n if (process.env.TWS_DISABLE_SCANNER_WORKER === \"1\") {\r\n return scanWorkspace(rootDir, normalizedOptions)\r\n }\r\n\r\n try {\r\n return await scanWorkspaceInWorker(rootDir, normalizedOptions)\r\n } catch (error) {\r\n log.debug(\r\n `worker scan failed, falling back to sync scanner: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return scanWorkspace(rootDir, normalizedOptions)\r\n }\r\n}","/**\r\n * tailwind-styled-v4 — Scanner Cache (Rust-backed)\r\n *\r\n * This module REQUIRES native Rust bindings and will FAIL LOUDLY if they are not available.\r\n * NO JavaScript fallback is provided.\r\n */\r\n\r\nimport path from \"node:path\"\r\nimport { cachePriorityNative, cacheReadNative, cacheWriteNative } from \"./native-bridge\"\r\n\r\nfunction defaultCachePath(rootDir: string, cacheDir?: string): string {\r\n const dir = cacheDir\r\n ? path.resolve(rootDir, cacheDir)\r\n : path.join(process.cwd(), \".cache\", \"tailwind-styled\")\r\n return path.join(dir, \"scanner-cache.json\")\r\n}\r\n\r\n// ── Public API ────────────────────────────────────────────────────────────────\r\n\r\nexport interface NativeCacheEntry {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n /** Terakhir file ditemukan di filesystem (ms epoch). Digunakan untuk stale cleanup. */\r\n lastSeenMs?: number\r\n}\r\n\r\n/** Default stale threshold — 7 hari */\r\nconst STALE_THRESHOLD_MS = 7 * 24 * 60 * 60 * 1000\r\n\r\n/**\r\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\r\n * QA #5a: stale entry cleanup\r\n */\r\nexport function pruneStaleEntries(\r\n entries: NativeCacheEntry[],\r\n opts: { maxAgeMs?: number; rootDir?: string } = {}\r\n): { pruned: NativeCacheEntry[]; removed: number } {\r\n const maxAge = opts.maxAgeMs ?? STALE_THRESHOLD_MS\r\n const now = Date.now()\r\n const { existsSync } = require(\"node:fs\") as typeof import(\"node:fs\")\r\n\r\n const pruned = entries.filter((entry) => {\r\n // Hapus jika file sudah tidak ada di disk\r\n if (opts.rootDir && !existsSync(entry.file)) return false\r\n // Hapus jika lastSeenMs terlalu lama\r\n if (entry.lastSeenMs && now - entry.lastSeenMs > maxAge) return false\r\n return true\r\n })\r\n\r\n return { pruned, removed: entries.length - pruned.length }\r\n}\r\n\r\n/**\r\n * Read scanner cache from disk using Rust parser.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function readCache(rootDir: string, cacheDir?: string): NativeCacheEntry[] {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n const result = cacheReadNative(cachePath)\r\n if (!result) return []\r\n\r\n return result.entries.map((e) => ({\r\n file: e.file,\r\n classes: e.classes,\r\n hash: e.hash,\r\n mtimeMs: e.mtimeMs,\r\n size: e.size,\r\n hitCount: e.hitCount,\r\n lastSeenMs: e.lastSeenMs,\r\n }))\r\n}\r\n\r\n/**\r\n * Write scanner cache to disk using Rust serialiser.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function writeCache(rootDir: string, entries: NativeCacheEntry[], cacheDir?: string): void {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n const success = cacheWriteNative(cachePath, entries)\r\n if (!success) {\r\n throw new Error(\r\n \"Native cacheWrite failed. Run 'npm run build:rust' to rebuild native bindings.\"\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Compute priority score for a file using the Rust SmartCache algorithm.\r\n * Higher = process first.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function filePriority(\r\n mtimeMs: number,\r\n size: number,\r\n cached: { mtimeMs: number; size: number; hitCount: number; lastSeenMs?: number } | undefined,\r\n nowMs = Date.now()\r\n): number {\r\n return cachePriorityNative(\r\n mtimeMs,\r\n size,\r\n cached?.mtimeMs ?? 0,\r\n cached?.size ?? 0,\r\n cached?.hitCount ?? 0,\r\n cached?.lastSeenMs ?? 0,\r\n nowMs\r\n )\r\n}\r\n\r\nexport interface CacheStats {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntry: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n}\r\n\r\nexport function computeCacheStats(entries: NativeCacheEntry[]): CacheStats {\r\n if (entries.length === 0) {\r\n return { totalEntries: 0, totalClasses: 0, totalSizeBytes: 0, avgClassesPerEntry: 0, mostUsedClasses: [] }\r\n }\r\n\r\n const classCounts = new Map<string, number>()\r\n let totalClasses = 0\r\n let totalSize = 0\r\n\r\n for (const entry of entries) {\r\n totalClasses += entry.classes.length\r\n totalSize += entry.size\r\n for (const cls of entry.classes) {\r\n classCounts.set(cls, (classCounts.get(cls) ?? 0) + 1)\r\n }\r\n }\r\n\r\n const mostUsedClasses = [...classCounts.entries()]\r\n .sort((a, b) => b[1] - a[1])\r\n .slice(0, 10)\r\n .map(([cls, count]) => ({ class: cls, count }))\r\n\r\n return {\r\n totalEntries: entries.length,\r\n totalClasses,\r\n totalSizeBytes: totalSize,\r\n avgClassesPerEntry: totalClasses / entries.length,\r\n mostUsedClasses,\r\n }\r\n}\r\n","import { z } from \"zod\"\r\nimport { TwError } from \"@tailwind-styled/shared\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst NonNegativeIntegerSchema = z.number().int().min(0)\r\n\r\nexport const ScanWorkspaceOptionsSchema = z.object({\r\n includeExtensions: z.array(z.string()).optional(),\r\n ignoreDirectories: z.array(z.string()).optional(),\r\n useCache: z.boolean().optional(),\r\n cacheDir: z.string().min(1).optional(),\r\n smartInvalidation: z.boolean().optional(),\r\n})\r\n\r\nexport type ScanWorkspaceOptions = z.infer<typeof ScanWorkspaceOptionsSchema>\r\n\r\nexport const ScanFileResultSchema = z.object({\r\n file: z.string(),\r\n classes: z.array(z.string()),\r\n hash: z.string().optional(),\r\n})\r\n\r\nexport type ScanFileResult = z.infer<typeof ScanFileResultSchema>\r\n\r\nexport const ScanWorkspaceResultSchema = z\r\n .object({\r\n files: z.array(ScanFileResultSchema),\r\n totalFiles: NonNegativeIntegerSchema,\r\n uniqueClasses: z.array(z.string()),\r\n })\r\n .refine((value) => value.totalFiles === value.files.length, {\r\n message: \"scan result totalFiles must match files.length\",\r\n path: [\"totalFiles\"],\r\n })\r\n\r\nexport type ScanWorkspaceResult = z.infer<typeof ScanWorkspaceResultSchema>\r\n\r\nexport const ScannerWorkerRequestSchema = z.object({\r\n rootDir: z.string().min(1),\r\n options: ScanWorkspaceOptionsSchema.optional(),\r\n})\r\n\r\nexport type ScannerWorkerRequest = z.infer<typeof ScannerWorkerRequestSchema>\r\n\r\nexport const ScannerWorkerSuccessMessageSchema = z.object({\r\n ok: z.literal(true),\r\n result: ScanWorkspaceResultSchema,\r\n})\r\n\r\nexport const ScannerWorkerErrorMessageSchema = z.object({\r\n ok: z.literal(false),\r\n error: z.string().optional(),\r\n})\r\n\r\nexport const ScannerWorkerMessageSchema = z.union([\r\n ScannerWorkerSuccessMessageSchema,\r\n ScannerWorkerErrorMessageSchema,\r\n])\r\n\r\nexport type ScannerWorkerMessage = z.infer<typeof ScannerWorkerMessageSchema>\r\n\r\nexport const parseScanWorkspaceOptions = (options: unknown) =>\r\n parseWithSchema(ScanWorkspaceOptionsSchema, options ?? {}, \"scanner options are invalid\")\r\n\r\nexport const parseScanFileResult = (result: unknown) =>\r\n parseWithSchema(ScanFileResultSchema, result, \"scanner file result is invalid\")\r\n\r\nexport const parseScanWorkspaceResult = (result: unknown) =>\r\n parseWithSchema(ScanWorkspaceResultSchema, result, \"scanner workspace result is invalid\")\r\n\r\nexport const parseScannerWorkerRequest = (request: unknown) =>\r\n parseWithSchema(ScannerWorkerRequestSchema, request, \"scanner worker request is invalid\")\r\n\r\nexport const parseScannerWorkerMessage = (message: unknown) =>\r\n parseWithSchema(ScannerWorkerMessageSchema, message, \"scanner worker message is invalid\")\r\n","import {\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n resolveRuntimeDir,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nimport type { NativeAnalyzerBinding, NativeCssCompilerBinding } from \"./types\"\r\nimport { debugLog } from \"./utils\"\r\n\r\nconst isAnalyzerModule = (module: unknown): module is NativeAnalyzerBinding => {\r\n const candidate = module as Partial<NativeAnalyzerBinding> | null | undefined\r\n return typeof candidate?.analyzeClasses === \"function\"\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Analyzer Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createAnalyzerBindingLoader = () => {\r\n const _state = { bindingPromise: null as Promise<NativeAnalyzerBinding | null> | null }\r\n\r\n const getBindingPromise = (): Promise<NativeAnalyzerBinding | null> => {\r\n if (_state.bindingPromise) return _state.bindingPromise\r\n\r\n _state.bindingPromise = (async (): Promise<NativeAnalyzerBinding | null> => {\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { binding, loadErrors, loadedPath } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n if (binding) {\r\n debugLog(`native binding loaded from: ${loadedPath}`)\r\n return binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n debugLog(\r\n `native binding load failed for ${loadErrors.length} candidate(s): ${loadErrors\r\n .map((entry) => `${entry.path} (${entry.message})`)\r\n .join(\"; \")}`\r\n )\r\n } else {\r\n debugLog(\"native binding not found in any candidate path\")\r\n }\r\n\r\n return null\r\n })()\r\n\r\n return _state.bindingPromise\r\n }\r\n\r\n return {\r\n get: getBindingPromise,\r\n reset: (): void => {\r\n _state.bindingPromise = null\r\n },\r\n }\r\n}\r\n\r\nconst analyzerBindingLoader = createAnalyzerBindingLoader()\r\n\r\nexport async function getNativeBinding(): Promise<NativeAnalyzerBinding | null> {\r\n return analyzerBindingLoader.get()\r\n}\r\n\r\nexport async function requireNativeBinding(): Promise<NativeAnalyzerBinding> {\r\n const binding = await analyzerBindingLoader.get()\r\n if (binding?.analyzeClasses) return binding\r\n\r\n // Untuk error reporting, kita perlu akses ke candidates dan loadErrors\r\n // Tapi karena async, kita perlu load ulang atau simpan state\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { loadErrors } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n const lines = [\r\n \"Native analyzer binding not found. Ensure `tailwind_styled_parser.node` is built.\",\r\n ]\r\n\r\n lines.push(\"Checked paths:\")\r\n for (const candidate of candidates) lines.push(`- ${candidate}`)\r\n if (loadErrors.length > 0) {\r\n lines.push(\"Load errors:\")\r\n for (const failure of loadErrors) {\r\n lines.push(`- ${failure.path}: ${failure.message}`)\r\n }\r\n }\r\n\r\n throw new Error(lines.join(\"\\n\"))\r\n}\r\n\r\nexport async function requireNativeCssCompiler(): Promise<NativeCssCompilerBinding> {\r\n const binding = await requireNativeBinding()\r\n if (typeof binding.compileCss === \"function\") return binding as NativeCssCompilerBinding\r\n\r\n throw new Error(`Native analyzer compileCss binding is missing.`)\r\n}\r\n","import fs from \"node:fs\"\r\nimport { createDebugLogger } from \"@tailwind-styled/shared\"\r\n\r\nexport const DEFAULT_TOP_LIMIT = 10\r\nexport const DEFAULT_FREQUENT_THRESHOLD = 2\r\nexport const DEBUG_NAMESPACE = \"tailwind-styled:analyzer\"\r\n\r\nexport function formatErrorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nexport async function pathExists(filePath: string): Promise<boolean> {\r\n try {\r\n await fs.promises.access(filePath, fs.constants.F_OK)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport const debugLog = createDebugLogger(DEBUG_NAMESPACE, \"tailwind-styled/analyzer\")\r\n\r\nexport function sanitizeTopLimit(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_TOP_LIMIT\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n\r\nexport function sanitizeFrequentThreshold(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_FREQUENT_THRESHOLD\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n","import { TwError } from \"@tailwind-styled/shared\"\r\nimport type { ScanWorkspaceOptions } from \"@tailwind-styled/scanner\"\r\nimport { z } from \"zod\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst CountSchema = z.number().int().min(0)\r\n\r\nexport const ClassUsageSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n isUnused: z.boolean().optional(),\r\n isConflict: z.boolean().optional(),\r\n})\r\n\r\nexport const ClassConflictSchema = z.object({\r\n className: z.string(),\r\n variants: z.array(z.string()),\r\n classes: z.array(z.string()),\r\n message: z.string(),\r\n})\r\n\r\nconst ClassCountSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n})\r\n\r\nexport const NativeReportSchema = z.object({\r\n root: z.string(),\r\n totalFiles: CountSchema,\r\n uniqueClassCount: CountSchema,\r\n totalClassOccurrences: CountSchema,\r\n topClasses: z.array(ClassCountSchema),\r\n duplicateCandidates: z.array(ClassCountSchema),\r\n safelist: z.array(z.string()),\r\n})\r\n\r\nexport const NativeCssCompileResultSchema = z.object({\r\n css: z.string(),\r\n resolvedClasses: z.array(z.string()),\r\n unknownClasses: z.array(z.string()),\r\n sizeBytes: CountSchema,\r\n})\r\n\r\nconst AnalyzerClassStatsSchema = z.object({\r\n top: z\r\n .number({\r\n error: \"analyzeWorkspace options.classStats.top must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n frequentThreshold: z\r\n .number({\r\n error:\r\n \"analyzeWorkspace options.classStats.frequentThreshold must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n})\r\n\r\nconst AnalyzerSemanticOptionsSchema = z.object({\r\n tailwindConfigPath: z\r\n .string({\r\n error:\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\",\r\n })\r\n .min(\r\n 1,\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const AnalyzerOptionsSchema = z.object({\r\n scanner: z\r\n .custom<ScanWorkspaceOptions>(\r\n (value) => isPlainObject(value),\r\n \"analyzeWorkspace options.scanner must be an object when provided.\"\r\n )\r\n .optional(),\r\n classStats: AnalyzerClassStatsSchema.optional(),\r\n semantic: z\r\n .union([\r\n z.boolean({\r\n error: \"analyzeWorkspace options.semantic must be a boolean or an object when provided.\",\r\n }),\r\n AnalyzerSemanticOptionsSchema,\r\n ])\r\n .optional(),\r\n includeClass: z\r\n .custom<(className: string) => boolean>(\r\n (value) => typeof value === \"function\",\r\n \"analyzeWorkspace options.includeClass must be a function when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const ClassToCssOptionsSchema = z.object({\r\n prefix: z\r\n .union([z.string(), z.null()], {\r\n error: \"classToCss options.prefix must be a string or null when provided.\",\r\n })\r\n .optional(),\r\n strict: z\r\n .boolean({\r\n error: \"classToCss options.strict must be a boolean when provided.\",\r\n })\r\n .optional(),\r\n})\r\n\r\nexport const parseAnalyzerOptions = (options: unknown) =>\r\n parseWithSchema(AnalyzerOptionsSchema, options ?? {}, \"analyzeWorkspace options are invalid\")\r\n\r\nexport const parseNativeReport = (report: unknown) =>\r\n parseWithSchema(NativeReportSchema, report, \"Native analyzer report is invalid\")\r\n\r\nexport const parseNativeCssCompileResult = (result: unknown, className?: string) =>\r\n parseWithSchema(\r\n NativeCssCompileResultSchema,\r\n result,\r\n className\r\n ? `Native CSS compile result is invalid for class \"${className}\"`\r\n : \"Native CSS compile result is invalid\"\r\n )\r\n\r\nexport const parseClassToCssOptions = (options: unknown) =>\r\n parseWithSchema(ClassToCssOptionsSchema, options ?? {}, \"classToCss options are invalid\")\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { pathToFileURL } from \"node:url\"\r\n\r\nimport type {\r\n AnalyzerSemanticReport,\r\n ClassConflict,\r\n ClassUsage,\r\n LoadedTailwindConfig,\r\n TailwindConfigCacheEntry,\r\n} from \"./types\"\r\nimport { debugLog, formatErrorMessage, isRecord, pathExists } from \"./utils\"\r\n\r\n\r\nconst SUPPORTED_TAILWIND_CONFIG_EXTENSIONS = new Set([\".ts\", \".js\", \".cjs\", \".mjs\"])\r\nconst KNOWN_UTILITY_PREFIXES = new Set([\r\n \"absolute\",\r\n \"align\",\r\n \"animate\",\r\n \"arbitrary\",\r\n \"aspect\",\r\n \"backdrop\",\r\n \"basis\",\r\n \"bg\",\r\n \"block\",\r\n \"border\",\r\n \"bottom\",\r\n \"col\",\r\n \"container\",\r\n \"contents\",\r\n \"cursor\",\r\n \"dark\",\r\n \"display\",\r\n \"divide\",\r\n \"fill\",\r\n \"fixed\",\r\n \"flex\",\r\n \"float\",\r\n \"font\",\r\n \"from\",\r\n \"gap\",\r\n \"grid\",\r\n \"grow\",\r\n \"h\",\r\n \"hidden\",\r\n \"inset\",\r\n \"inline\",\r\n \"isolate\",\r\n \"items\",\r\n \"justify\",\r\n \"left\",\r\n \"leading\",\r\n \"line\",\r\n \"list\",\r\n \"m\",\r\n \"max-h\",\r\n \"max-w\",\r\n \"mb\",\r\n \"min-h\",\r\n \"min-w\",\r\n \"ml\",\r\n \"mr\",\r\n \"mt\",\r\n \"mx\",\r\n \"my\",\r\n \"object\",\r\n \"opacity\",\r\n \"order\",\r\n \"origin\",\r\n \"outline\",\r\n \"overflow\",\r\n \"overscroll\",\r\n \"p\",\r\n \"pb\",\r\n \"pe\",\r\n \"perspective\",\r\n \"place\",\r\n \"pl\",\r\n \"pointer\",\r\n \"position\",\r\n \"pr\",\r\n \"ps\",\r\n \"pt\",\r\n \"px\",\r\n \"py\",\r\n \"relative\",\r\n \"right\",\r\n \"ring\",\r\n \"rotate\",\r\n \"rounded\",\r\n \"row\",\r\n \"scale\",\r\n \"shadow\",\r\n \"shrink\",\r\n \"size\",\r\n \"skew\",\r\n \"snap\",\r\n \"space-x\",\r\n \"space-y\",\r\n \"sr\",\r\n \"start\",\r\n \"static\",\r\n \"sticky\",\r\n \"stroke\",\r\n \"table\",\r\n \"text\",\r\n \"to\",\r\n \"top\",\r\n \"touch\",\r\n \"tracking\",\r\n \"transform\",\r\n \"transition\",\r\n \"translate\",\r\n \"truncate\",\r\n \"underline\",\r\n \"via\",\r\n \"visible\",\r\n \"w\",\r\n \"whitespace\",\r\n \"z\",\r\n])\r\n\r\nconst tailwindConfigCache = new Map<string, TailwindConfigCacheEntry>()\r\n\r\nexport const splitVariantAndBase = (className: string): { variantKey: string; base: string } => {\r\n const parts = className.split(\":\")\r\n if (parts.length <= 1) return { variantKey: \"\", base: className }\r\n const base = parts.pop() ?? className\r\n return { variantKey: parts.join(\":\"), base }\r\n}\r\n\r\nconst isArbitraryUtility = (baseClass: string): boolean => {\r\n return baseClass.includes(\"[\") && baseClass.includes(\"]\")\r\n}\r\n\r\nexport const resolveConflictGroup = (base: string): string | null => {\r\n if (isArbitraryUtility(base)) return null\r\n if ([\"block\", \"inline\", \"inline-block\", \"inline-flex\", \"flex\", \"grid\", \"hidden\"].includes(base))\r\n return \"display\"\r\n if (base.startsWith(\"bg-\")) return \"bg\"\r\n if (base.startsWith(\"text-\")) return \"text\"\r\n if (base.startsWith(\"font-\")) return \"font\"\r\n if (base.startsWith(\"rounded\")) return \"rounded\"\r\n if (base.startsWith(\"shadow\")) return \"shadow\"\r\n if (base.startsWith(\"border-\")) return \"border\"\r\n if (base.startsWith(\"opacity-\")) return \"opacity\"\r\n if (base.startsWith(\"w-\") || base.startsWith(\"min-w-\") || base.startsWith(\"max-w-\"))\r\n return \"width\"\r\n if (base.startsWith(\"h-\") || base.startsWith(\"min-h-\") || base.startsWith(\"max-h-\"))\r\n return \"height\"\r\n if (base.startsWith(\"p-\") || base.startsWith(\"px-\") || base.startsWith(\"py-\")) return \"padding\"\r\n if (base.startsWith(\"m-\") || base.startsWith(\"mx-\") || base.startsWith(\"my-\")) return \"margin\"\r\n return null\r\n}\r\n\r\nconst detectConflicts = (\r\n usages: ClassUsage[]\r\n): {\r\n conflicts: ClassConflict[]\r\n conflictedClassNames: Set<string>\r\n} => {\r\n const buckets = new Map<string, { variantKey: string; group: string; classes: Set<string> }>()\r\n\r\n for (const usage of usages) {\r\n const { variantKey, base } = splitVariantAndBase(usage.name)\r\n const group = resolveConflictGroup(base)\r\n if (!group) continue\r\n\r\n const key = `${variantKey}::${group}`\r\n const bucket = buckets.get(key) ?? {\r\n variantKey,\r\n group,\r\n classes: new Set<string>(),\r\n }\r\n bucket.classes.add(usage.name)\r\n buckets.set(key, bucket)\r\n }\r\n\r\n const conflicts: ClassConflict[] = []\r\n const conflictedClassNames = new Set<string>()\r\n\r\n for (const bucket of buckets.values()) {\r\n if (bucket.classes.size <= 1) continue\r\n const classes = Array.from(bucket.classes).sort()\r\n for (const className of classes) conflictedClassNames.add(className)\r\n\r\n const variantLabel = bucket.variantKey.length > 0 ? bucket.variantKey : \"base\"\r\n conflicts.push({\r\n className: bucket.group,\r\n variants: bucket.variantKey.length > 0 ? bucket.variantKey.split(\":\") : [],\r\n classes,\r\n message: `Multiple ${bucket.group} utilities detected for \"${variantLabel}\".`,\r\n })\r\n }\r\n\r\n conflicts.sort((left, right) => {\r\n if (right.classes.length !== left.classes.length)\r\n return right.classes.length - left.classes.length\r\n return left.className.localeCompare(right.className)\r\n })\r\n\r\n return { conflicts, conflictedClassNames }\r\n}\r\n\r\nconst isSupportedTailwindConfigPath = (configPath: string): boolean => {\r\n return SUPPORTED_TAILWIND_CONFIG_EXTENSIONS.has(path.extname(configPath).toLowerCase())\r\n}\r\n\r\nconst resolveTailwindConfigPath = async (\r\n root: string,\r\n explicitPath?: string\r\n): Promise<string | null> => {\r\n if (explicitPath) {\r\n const resolved = path.resolve(root, explicitPath)\r\n if (!(await pathExists(resolved))) return null\r\n return resolved\r\n }\r\n\r\n const candidates = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.cjs\",\r\n \"tailwind.config.mjs\",\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n const fullPath = path.resolve(root, candidate)\r\n if (await pathExists(fullPath)) return fullPath\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst collectSafelistFromConfig = (config: Record<string, unknown>): string[] => {\r\n const raw = config.safelist\r\n if (!Array.isArray(raw)) return []\r\n\r\n const out = new Set<string>()\r\n for (const entry of raw) {\r\n if (typeof entry === \"string\" && entry.length > 0) {\r\n out.add(entry)\r\n continue\r\n }\r\n if (!entry || typeof entry !== \"object\") continue\r\n const pattern = (entry as Record<string, unknown>).pattern\r\n if (typeof pattern === \"string\" && pattern.length > 0) {\r\n out.add(pattern)\r\n }\r\n }\r\n\r\n return Array.from(out)\r\n}\r\n\r\nconst collectCustomUtilities = (config: Record<string, unknown>): Set<string> => {\r\n const out = new Set<string>()\r\n const theme = config.theme\r\n if (!theme || typeof theme !== \"object\") return out\r\n\r\n const extend = (theme as Record<string, unknown>).extend\r\n if (!extend || typeof extend !== \"object\") return out\r\n\r\n for (const [section, value] of Object.entries(extend as Record<string, unknown>)) {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\r\n for (const key of Object.keys(value as Record<string, unknown>)) {\r\n out.add(`${section}-${key}`)\r\n if (section === \"colors\") {\r\n out.add(`bg-${key}`)\r\n out.add(`text-${key}`)\r\n out.add(`border-${key}`)\r\n } else if (section === \"spacing\") {\r\n out.add(`p-${key}`)\r\n out.add(`m-${key}`)\r\n out.add(`gap-${key}`)\r\n out.add(`w-${key}`)\r\n out.add(`h-${key}`)\r\n } else if (section === \"fontSize\") {\r\n out.add(`text-${key}`)\r\n } else if (section === \"borderRadius\") {\r\n out.add(`rounded-${key}`)\r\n } else if (section === \"boxShadow\") {\r\n out.add(`shadow-${key}`)\r\n }\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nconst collectSafelistFromSource = async (configPath: string): Promise<string[]> => {\r\n const source = await fs.promises.readFile(configPath, \"utf8\")\r\n const safelistBlock = source.match(/safelist\\s*:\\s*\\[([\\s\\S]*?)\\]/m)?.[1]\r\n if (!safelistBlock) return []\r\n\r\n const out = new Set<string>()\r\n for (const token of safelistBlock.matchAll(/[\"'`]([^\"'`]+)[\"'`]/g)) {\r\n const value = token[1].trim()\r\n if (value.length > 0) out.add(value)\r\n }\r\n return Array.from(out)\r\n}\r\n\r\nconst loadTailwindConfig = async (\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<LoadedTailwindConfig | null> => {\r\n const startMs = Date.now()\r\n const configPath = await resolveTailwindConfigPath(root, semanticOption?.tailwindConfigPath)\r\n if (!configPath) return null\r\n\r\n if (!isSupportedTailwindConfigPath(configPath)) {\r\n return {\r\n path: configPath,\r\n loaded: false,\r\n warning: `Unsupported Tailwind config extension at \"${configPath}\". Supported extensions: .ts, .js, .cjs, .mjs.`,\r\n safelist: new Set<string>(),\r\n customUtilities: new Set<string>(),\r\n }\r\n }\r\n\r\n const configStat = await fs.promises.stat(configPath).catch(() => null)\r\n if (configStat) {\r\n const cached = tailwindConfigCache.get(configPath)\r\n if (cached && cached.mtimeMs === configStat.mtimeMs && cached.size === configStat.size) {\r\n debugLog(\r\n `tailwind config cache hit: ${configPath} (${cached.config.safelist.size} safelist entries)`\r\n )\r\n return cached.config\r\n }\r\n }\r\n\r\n const result = await (async (): Promise<{\r\n config: Record<string, unknown> | null\r\n warning: string | undefined\r\n }> => {\r\n try {\r\n const cacheBustToken = Math.trunc(configStat?.mtimeMs ?? Date.now())\r\n const imported = await import(`${pathToFileURL(configPath).href}?tws_mtime=${cacheBustToken}`)\r\n const candidate = (imported.default ?? imported) as unknown\r\n if (isRecord(candidate)) {\r\n return { config: candidate, warning: undefined }\r\n } else if (typeof candidate === \"function\") {\r\n const evaluated = candidate()\r\n if (isRecord(evaluated)) {\r\n return { config: evaluated, warning: undefined }\r\n }\r\n return { config: null, warning: \"Tailwind config export function must return an object.\" }\r\n }\r\n return {\r\n config: null,\r\n warning: \"Tailwind config export must be an object or a function returning an object.\",\r\n }\r\n } catch (error) {\r\n return { config: null, warning: formatErrorMessage(error) }\r\n }\r\n })()\r\n\r\n const { config, warning } = result\r\n\r\n const safelist = new Set<string>()\r\n const customUtilities = new Set<string>()\r\n\r\n if (config) {\r\n for (const item of collectSafelistFromConfig(config)) safelist.add(item)\r\n for (const item of collectCustomUtilities(config)) customUtilities.add(item)\r\n }\r\n\r\n if (safelist.size === 0) {\r\n try {\r\n for (const item of await collectSafelistFromSource(configPath)) safelist.add(item)\r\n } catch (error) {\r\n debugLog(\r\n `failed to parse safelist from source at \"${configPath}\": ${formatErrorMessage(error)}`\r\n )\r\n // keep empty if source parsing fails\r\n }\r\n }\r\n\r\n const loaded = {\r\n path: configPath,\r\n loaded: config !== null,\r\n warning,\r\n safelist,\r\n customUtilities,\r\n }\r\n\r\n if (configStat) {\r\n tailwindConfigCache.set(configPath, {\r\n mtimeMs: configStat.mtimeMs,\r\n size: configStat.size,\r\n config: loaded,\r\n })\r\n }\r\n\r\n debugLog(\r\n `tailwind config loaded from \"${configPath}\" in ${Date.now() - startMs}ms ` +\r\n `(loaded=${loaded.loaded}, safelist=${loaded.safelist.size}, custom=${loaded.customUtilities.size})`\r\n )\r\n\r\n return loaded\r\n}\r\n\r\nexport const utilityPrefix = (baseClass: string): string => {\r\n const normalized = baseClass.startsWith(\"-\") ? baseClass.slice(1) : baseClass\r\n if (normalized.includes(\"[\") && normalized.includes(\"]\")) return \"arbitrary\"\r\n if (normalized.startsWith(\"min-w-\")) return \"min-w\"\r\n if (normalized.startsWith(\"max-w-\")) return \"max-w\"\r\n if (normalized.startsWith(\"min-h-\")) return \"min-h\"\r\n if (normalized.startsWith(\"max-h-\")) return \"max-h\"\r\n if (normalized.startsWith(\"space-x-\")) return \"space-x\"\r\n if (normalized.startsWith(\"space-y-\")) return \"space-y\"\r\n if (normalized.startsWith(\"inline-\")) return \"inline\"\r\n if (normalized.startsWith(\"border-\")) return \"border\"\r\n if (normalized.startsWith(\"text-\")) return \"text\"\r\n if (normalized.startsWith(\"bg-\")) return \"bg\"\r\n if (normalized.startsWith(\"rounded\")) return \"rounded\"\r\n if (normalized.startsWith(\"shadow\")) return \"shadow\"\r\n const hyphen = normalized.indexOf(\"-\")\r\n if (hyphen < 0) return normalized\r\n return normalized.slice(0, hyphen)\r\n}\r\n\r\nconst isKnownTailwindClass = (\r\n className: string,\r\n safelist: Set<string>,\r\n customUtilities: Set<string>\r\n): boolean => {\r\n if (safelist.has(className) || customUtilities.has(className)) return true\r\n const { base } = splitVariantAndBase(className)\r\n if (customUtilities.has(base)) return true\r\n const prefix = utilityPrefix(base)\r\n return KNOWN_UTILITY_PREFIXES.has(prefix)\r\n}\r\n\r\nexport const buildSemanticReport = async (\r\n usages: ClassUsage[],\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<AnalyzerSemanticReport> => {\r\n const loadedConfig = await loadTailwindConfig(root, semanticOption)\r\n const safelist = loadedConfig?.safelist ?? new Set<string>()\r\n const customUtilities = loadedConfig?.customUtilities ?? new Set<string>()\r\n const usageNames = new Set(usages.map((usage) => usage.name))\r\n\r\n const unusedClasses: ClassUsage[] = Array.from(safelist)\r\n .filter((className) => !usageNames.has(className))\r\n .sort()\r\n .map((className) => ({ name: className, count: 0, isUnused: true }))\r\n\r\n const unknownClasses: ClassUsage[] = usages\r\n .filter((usage) => !isKnownTailwindClass(usage.name, safelist, customUtilities))\r\n .map((usage) => ({ ...usage, isUnused: true }))\r\n\r\n const { conflicts } = detectConflicts(usages)\r\n\r\n return {\r\n unusedClasses,\r\n unknownClasses,\r\n conflicts,\r\n ...(loadedConfig\r\n ? {\r\n tailwindConfig: {\r\n path: loadedConfig.path,\r\n loaded: loadedConfig.loaded,\r\n safelistCount: loadedConfig.safelist.size,\r\n customUtilityCount: loadedConfig.customUtilities.size,\r\n ...(loadedConfig.warning ? { warning: loadedConfig.warning } : {}),\r\n },\r\n }\r\n : {}),\r\n }\r\n}\r\n","import path from \"node:path\"\r\n\r\nimport type { ScanWorkspaceResult } from \"@tailwind-styled/scanner\"\r\nimport { scanWorkspaceAsync } from \"@tailwind-styled/scanner\"\r\n\r\nimport { requireNativeBinding } from \"./binding\"\r\nimport { parseAnalyzerOptions, parseNativeReport } from \"./schemas\"\r\nimport { buildSemanticReport } from \"./semantic\"\r\nimport type { AnalyzerOptions, AnalyzerReport, ClassUsage } from \"./types\"\r\nimport { debugLog, formatErrorMessage, sanitizeFrequentThreshold, sanitizeTopLimit } from \"./utils\"\r\n\r\nfunction normalizeScan(\r\n scan: ScanWorkspaceResult,\r\n includeClass?: (className: string) => boolean\r\n): ScanWorkspaceResult {\r\n if (!includeClass) return scan\r\n\r\n const filteredFiles = scan.files.map((file) => ({\r\n file: file.file,\r\n classes: file.classes.filter((className) => includeClass(className)),\r\n }))\r\n\r\n const unique = new Set<string>()\r\n for (const file of filteredFiles) {\r\n for (const className of file.classes) {\r\n unique.add(className)\r\n }\r\n }\r\n\r\n return {\r\n files: filteredFiles,\r\n totalFiles: scan.totalFiles,\r\n uniqueClasses: Array.from(unique).sort(),\r\n }\r\n}\r\n\r\nexport function collectClassCounts(scan: ScanWorkspaceResult): Map<string, number> {\r\n const counts = new Map<string, number>()\r\n for (const file of scan.files) {\r\n for (const className of file.classes) {\r\n counts.set(className, (counts.get(className) ?? 0) + 1)\r\n }\r\n }\r\n return counts\r\n}\r\n\r\nfunction buildClassUsage(counts: Map<string, number>): ClassUsage[] {\r\n return Array.from(counts.entries())\r\n .map(([name, count]) => ({ name, count }))\r\n .sort((left, right) => {\r\n if (right.count !== left.count) return right.count - left.count\r\n return left.name.localeCompare(right.name)\r\n })\r\n}\r\n\r\nexport function buildDistribution(usages: ClassUsage[]): Record<string, number> {\r\n const distribution = {\r\n \"1\": 0,\r\n \"2-3\": 0,\r\n \"4-7\": 0,\r\n \"8+\": 0,\r\n }\r\n\r\n for (const usage of usages) {\r\n if (usage.count === 1) {\r\n distribution[\"1\"] += 1\r\n } else if (usage.count <= 3) {\r\n distribution[\"2-3\"] += 1\r\n } else if (usage.count <= 7) {\r\n distribution[\"4-7\"] += 1\r\n } else {\r\n distribution[\"8+\"] += 1\r\n }\r\n }\r\n\r\n return distribution\r\n}\r\n\r\n/**\r\n * Analyze Tailwind class usage in a workspace and return usage statistics.\r\n * Set `semantic.tailwindConfigPath` to override Tailwind config lookup.\r\n * @example\r\n * const report = await analyzeWorkspace(\"./src\", {\r\n * classStats: { top: 20, frequentThreshold: 2 },\r\n * semantic: { tailwindConfigPath: \"tailwind.config.js\" },\r\n * })\r\n */\r\nexport async function analyzeWorkspace(\r\n root: string,\r\n options: AnalyzerOptions = {}\r\n): Promise<AnalyzerReport> {\r\n const startedAtMs = Date.now()\r\n const resolvedRoot = path.resolve(root)\r\n const normalizedOptions = parseAnalyzerOptions(options)\r\n\r\n // 1. Scan workspace - const dengan IIFE async\r\n const scan = await (async () => {\r\n const scanStartedAtMs = Date.now()\r\n try {\r\n const result = await scanWorkspaceAsync(resolvedRoot, normalizedOptions.scanner)\r\n debugLog(\r\n `scanWorkspaceAsync processed ${result.totalFiles} files in ${Date.now() - scanStartedAtMs}ms`\r\n )\r\n return result\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to scan workspace at \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const normalizedScan = normalizeScan(scan, normalizedOptions.includeClass)\r\n const topLimit = sanitizeTopLimit(normalizedOptions.classStats?.top)\r\n const frequentThreshold = sanitizeFrequentThreshold(\r\n normalizedOptions.classStats?.frequentThreshold\r\n )\r\n\r\n const binding = await requireNativeBinding()\r\n const filesJson = JSON.stringify(\r\n normalizedScan.files.map((file) => ({ file: file.file, classes: file.classes }))\r\n )\r\n\r\n // 2. Native report - const dengan IIFE\r\n const nativeReport = (() => {\r\n try {\r\n const report = binding.analyzeClasses(filesJson, resolvedRoot, topLimit)\r\n if (!report) {\r\n throw new Error(`Native analyzer returned no report for \"${resolvedRoot}\".`)\r\n }\r\n return parseNativeReport(report)\r\n } catch (error) {\r\n throw new Error(\r\n `Native analyzer failed for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const counts = collectClassCounts(normalizedScan)\r\n const baseAll = buildClassUsage(counts)\r\n\r\n // 3. Semantic report - const dengan IIFE async\r\n const { all, semanticReport } = await (async () => {\r\n if (!normalizedOptions.semantic) {\r\n return { all: baseAll, semanticReport: undefined }\r\n }\r\n\r\n const semanticOption =\r\n typeof normalizedOptions.semantic === \"object\" ? normalizedOptions.semantic : undefined\r\n const semanticStartedAtMs = Date.now()\r\n\r\n try {\r\n const report = await buildSemanticReport(baseAll, resolvedRoot, semanticOption)\r\n debugLog(`semantic report built in ${Date.now() - semanticStartedAtMs}ms`)\r\n\r\n if (report.conflicts.length === 0) {\r\n return { all: baseAll, semanticReport: report }\r\n }\r\n\r\n const conflicted = new Set(report.conflicts.flatMap((conflict) => conflict.classes))\r\n const updatedAll = baseAll.map((usage) =>\r\n conflicted.has(usage.name) ? { ...usage, isConflict: true } : usage\r\n )\r\n return { all: updatedAll, semanticReport: report }\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to build semantic report for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n { cause: error }\r\n )\r\n }\r\n })()\r\n\r\n // 4. Statistics - semua const\r\n const top = all.slice(0, topLimit)\r\n const frequent = all.filter((usage) => usage.count >= frequentThreshold).slice(0, topLimit)\r\n const unique = all.filter((usage) => usage.count === 1)\r\n const totalClassOccurrences = all.reduce((sum, usage) => sum + usage.count, 0)\r\n\r\n debugLog(\r\n `analyzeWorkspace completed in ${Date.now() - startedAtMs}ms ` +\r\n `(files=${normalizedScan.totalFiles}, uniqueClasses=${all.length})`\r\n )\r\n\r\n return {\r\n root: nativeReport.root || resolvedRoot,\r\n totalFiles: nativeReport.totalFiles,\r\n uniqueClassCount: all.length,\r\n totalClassOccurrences,\r\n classStats: {\r\n all,\r\n top,\r\n frequent,\r\n unique,\r\n distribution: buildDistribution(all),\r\n },\r\n safelist: all.map((usage) => usage.name),\r\n ...(semanticReport ? { semantic: semanticReport } : {}),\r\n }\r\n}\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { pathToFileURL } from \"node:url\"\r\nimport {\r\n type AnalyzerReport,\r\n type AnalyzerSemanticReport,\r\n analyzeWorkspace as runWorkspaceAnalysis,\r\n} from \"@tailwind-styled/analyzer\"\r\nimport { generateCssForClasses, mergeClassesStatic } from \"@tailwind-styled/compiler/internal\"\r\nimport {\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n scanWorkspaceAsync,\r\n} from \"@tailwind-styled/scanner\"\r\nimport { createLogger, TwError, wrapUnknownError } from \"@tailwind-styled/shared\"\r\n\r\nimport { applyIncrementalChange } from \"./incremental\"\r\nimport { ImpactTracker } from \"./impactTracker\"\r\nimport { EngineMetricsCollector, type EngineMetricsSnapshot } from \"./metrics\"\r\nimport { writeMetrics } from \"./metricsWriter\"\r\nimport {\r\n type EnginePlugin,\r\n runAfterBuild,\r\n runAfterScan,\r\n runAfterWatch,\r\n runBeforeBuild,\r\n runBeforeScan,\r\n runBeforeWatch,\r\n runOnError,\r\n runTransformClasses,\r\n} from \"./plugin-api\"\r\nimport { parseEngineOptions, parseEngineWatchOptions } from \"./schemas\"\r\nimport { type WorkspaceWatcher, watchWorkspace } from \"./watch\"\r\n\r\nconst DEFAULT_LARGE_FILE_THRESHOLD_BYTES = 10 * 1024 * 1024\r\nconst DEFAULT_FLUSH_DEBOUNCE_MS = 100\r\nconst DEFAULT_MAX_EVENTS_PER_FLUSH = 100\r\nconst _DEFAULT_WATCH_EVENT_TYPE: EngineBuildWatchEventType = \"change\"\r\n\r\nconst configState = {\r\n cachedTailwindConfig: undefined as Record<string, unknown> | undefined,\r\n tailwindConfigLoaded: false,\r\n setLoaded(config: Record<string, unknown> | undefined) {\r\n this.cachedTailwindConfig = config\r\n this.tailwindConfigLoaded = true\r\n },\r\n getConfig() {\r\n return this.cachedTailwindConfig\r\n },\r\n isLoaded() {\r\n return this.tailwindConfigLoaded\r\n },\r\n}\r\nconst log = createLogger(\"engine\")\r\n\r\nexport interface EngineOptions {\r\n root?: string\r\n scanner?: ScanWorkspaceOptions\r\n compileCss?: boolean\r\n tailwindConfigPath?: string\r\n plugins?: EnginePlugin[]\r\n /** Enable analyzer integration - provides semantic report (unused classes, conflicts). Default: false */\r\n analyze?: boolean\r\n}\r\n\r\nexport interface EngineWatchOptions {\r\n debounceMs?: number\r\n maxEventsPerFlush?: number\r\n largeFileThreshold?: number\r\n}\r\n\r\nexport interface BuildResult {\r\n scan: ScanWorkspaceResult\r\n mergedClassList: string\r\n css: string\r\n /** Analyzer semantic report - present when analyze: true in options */\r\n analysis?: {\r\n unusedClasses: string[]\r\n classConflicts: Array<{\r\n className: string\r\n files: string[]\r\n classes?: string[]\r\n message?: string\r\n }>\r\n classUsage: Record<string, number>\r\n semantic?: AnalyzerSemanticReport\r\n report: AnalyzerReport\r\n }\r\n}\r\n\r\ninterface BuildExecutionMetrics {\r\n analyzeMs: number\r\n compileMs: number\r\n}\r\n\r\ninterface BuildExecution {\r\n result: BuildResult\r\n metrics: BuildExecutionMetrics\r\n}\r\n\r\ntype EngineBuildWatchEventType = \"initial\" | \"change\" | \"unlink\" | \"full-rescan\"\r\n\r\nexport type EngineWatchEvent =\r\n | {\r\n type: EngineBuildWatchEventType\r\n filePath?: string\r\n result: BuildResult\r\n metrics?: EngineMetricsSnapshot\r\n }\r\n | {\r\n type: \"error\"\r\n filePath?: string\r\n error: string\r\n metrics?: EngineMetricsSnapshot\r\n }\r\n\r\nexport interface TailwindStyledEngine {\r\n scan(): Promise<ScanWorkspaceResult>\r\n scanWorkspace(): Promise<ScanWorkspaceResult>\r\n analyzeWorkspace(): Promise<Awaited<ReturnType<typeof runWorkspaceAnalysis>>>\r\n generateSafelist(): Promise<string[]>\r\n build(): Promise<BuildResult>\r\n watch(\r\n onEvent: (event: EngineWatchEvent) => void,\r\n options?: EngineWatchOptions\r\n ): Promise<{ close(): void }>\r\n}\r\n\r\nasync function loadTailwindConfigFromPath(\r\n root: string,\r\n tailwindConfigPath?: string\r\n): Promise<Record<string, unknown> | undefined> {\r\n if (!tailwindConfigPath) return undefined\r\n\r\n const configPath = path.resolve(root, tailwindConfigPath)\r\n if (!fs.existsSync(configPath)) {\r\n throw TwError.fromIo(\"CONFIG_NOT_FOUND\", `tailwindConfigPath not found: ${configPath}`)\r\n }\r\n\r\n const imported = await import(pathToFileURL(configPath).href)\r\n const config = (imported.default ?? imported) as Record<string, unknown>\r\n return config\r\n}\r\n\r\nasync function tryRunAnalyzer(root: string, options: EngineOptions) {\r\n try {\r\n const report = await runWorkspaceAnalysis(root, {\r\n scanner: options.scanner,\r\n semantic: true,\r\n })\r\n\r\n const classUsage: Record<string, number> = {}\r\n for (const usage of report.classStats.all) {\r\n classUsage[usage.name] = usage.count\r\n }\r\n\r\n const semantic = report.semantic\r\n return {\r\n unusedClasses: semantic?.unusedClasses.map((usage) => usage.name) ?? [],\r\n classConflicts:\r\n semantic?.conflicts.map((conflict) => ({\r\n className: conflict.className,\r\n files: [],\r\n classes: [...conflict.classes],\r\n message: conflict.message,\r\n })) ?? [],\r\n classUsage,\r\n semantic,\r\n report,\r\n }\r\n } catch (e) {\r\n log.warn(\"Analyzer not available:\", String(e))\r\n return undefined\r\n }\r\n}\r\n\r\nasync function buildFromScan(\r\n scan: ScanWorkspaceResult,\r\n root: string,\r\n options: EngineOptions,\r\n tailwindConfig?: Record<string, unknown>\r\n): Promise<BuildExecution> {\r\n const plugins = options.plugins ?? []\r\n const context = { root, timestamp: Date.now() }\r\n\r\n await runBeforeBuild(plugins, scan, context)\r\n const compileStartedAt = Date.now()\r\n const transformedClasses = await runTransformClasses(plugins, scan.uniqueClasses, context)\r\n const mergedClassList = mergeClassesStatic(transformedClasses.join(\" \"))\r\n\r\n const css =\r\n options.compileCss !== false && mergedClassList.length > 0\r\n ? await generateCssForClasses(\r\n mergedClassList.split(/\\s+/).filter(Boolean),\r\n tailwindConfig,\r\n root\r\n )\r\n : \"\"\r\n\r\n const compileMs = Date.now() - compileStartedAt\r\n const analyzeStartedAt = Date.now()\r\n const analysis = options.analyze ? await tryRunAnalyzer(root, options) : undefined\r\n const analyzeMs = options.analyze ? Date.now() - analyzeStartedAt : 0\r\n\r\n const result: BuildResult = {\r\n scan,\r\n mergedClassList,\r\n css,\r\n analysis,\r\n }\r\n\r\n return {\r\n result: await runAfterBuild(plugins, result, context),\r\n metrics: {\r\n analyzeMs,\r\n compileMs,\r\n },\r\n }\r\n}\r\n\r\nfunction countWorkspacePackages(root: string): number {\r\n const packagesDir = path.join(root, \"packages\")\r\n if (!fs.existsSync(packagesDir)) return 0\r\n\r\n try {\r\n return fs\r\n .readdirSync(packagesDir, { withFileTypes: true })\r\n .filter(\r\n (entry) =>\r\n entry.isDirectory() && fs.existsSync(path.join(packagesDir, entry.name, \"package.json\"))\r\n ).length\r\n } catch {\r\n return 0\r\n }\r\n}\r\n\r\nfunction writeDashboardMetrics(\r\n root: string,\r\n mode: \"build\" | \"watch\" | \"error\",\r\n result: BuildResult | null,\r\n metrics: Partial<{\r\n buildMs: number\r\n scanMs: number\r\n analyzeMs: number\r\n compileMs: number\r\n lastEventType: string\r\n error: string\r\n }> &\r\n Partial<EngineMetricsSnapshot>\r\n): void {\r\n writeMetrics(\r\n {\r\n mode,\r\n buildMs: metrics.buildMs,\r\n scanMs: metrics.scanMs,\r\n analyzeMs: metrics.analyzeMs,\r\n compileMs: metrics.compileMs,\r\n classCount: result?.scan.uniqueClasses.length ?? 0,\r\n fileCount: result?.scan.totalFiles ?? 0,\r\n cssBytes: result ? Buffer.byteLength(result.css, \"utf8\") : 0,\r\n packageCount: countWorkspacePackages(root),\r\n error: metrics.error,\r\n lastEventType: metrics.lastEventType,\r\n eventsReceived: metrics.eventsReceived,\r\n eventsProcessed: metrics.eventsProcessed,\r\n batchesProcessed: metrics.batchesProcessed,\r\n incrementalUpdates: metrics.incrementalUpdates,\r\n fullRescans: metrics.fullRescans,\r\n skippedLargeFiles: metrics.skippedLargeFiles,\r\n queueMaxSize: metrics.queueMaxSize,\r\n lastBuildMs: metrics.lastBuildMs,\r\n avgBuildMs: metrics.avgBuildMs,\r\n },\r\n root\r\n )\r\n}\r\n\r\nexport async function createEngine(rawOptions: EngineOptions = {}): Promise<TailwindStyledEngine> {\r\n // ── Boundary validation: validate options with Zod before entering domain logic ──\r\n const options = parseEngineOptions(rawOptions)\r\n\r\n const root = options.root ?? process.cwd()\r\n const resolvedRoot = path.resolve(root)\r\n\r\n const plugins = (rawOptions as EngineOptions).plugins ?? []\r\n\r\n const getTailwindConfig = async (): Promise<Record<string, unknown> | undefined> => {\r\n if (configState.isLoaded()) return configState.getConfig()\r\n const config = await loadTailwindConfigFromPath(resolvedRoot, options.tailwindConfigPath)\r\n configState.setLoaded(config)\r\n return config\r\n }\r\n\r\n const reportEngineError = async (error: unknown): Promise<Error> => {\r\n const normalized = error instanceof TwError\r\n ? error\r\n : wrapUnknownError(\"compile\", \"ENGINE_ERROR\", error)\r\n const context = { root: resolvedRoot, timestamp: Date.now() }\r\n try {\r\n await runOnError(plugins, normalized, context)\r\n } catch (pluginError) {\r\n log.error(\r\n \"plugin onError hook failed:\",\r\n pluginError instanceof Error ? pluginError.message : String(pluginError)\r\n )\r\n }\r\n log.error(normalized.message)\r\n return normalized\r\n }\r\n\r\n const doScan = async (): Promise<ScanWorkspaceResult> => {\r\n try {\r\n const context = { root: resolvedRoot, timestamp: Date.now() }\r\n await runBeforeScan(plugins, context)\r\n const scan = await scanWorkspaceAsync(resolvedRoot, options.scanner)\r\n return await runAfterScan(plugins, scan, context)\r\n } catch (error) {\r\n throw await reportEngineError(error)\r\n }\r\n }\r\n\r\n const doAnalyze = async (): Promise<Awaited<ReturnType<typeof runWorkspaceAnalysis>>> => {\r\n try {\r\n return await runWorkspaceAnalysis(resolvedRoot, {\r\n scanner: options.scanner,\r\n })\r\n } catch (error) {\r\n throw await reportEngineError(error)\r\n }\r\n }\r\n\r\n const doGenerateSafelist = async (): Promise<string[]> => {\r\n const scan = await doScan()\r\n return [...scan.uniqueClasses]\r\n }\r\n\r\n return {\r\n scan: doScan,\r\n scanWorkspace: doScan,\r\n analyzeWorkspace: doAnalyze,\r\n generateSafelist: doGenerateSafelist,\r\n async build(): Promise<BuildResult> {\r\n const scanStartedAt = Date.now()\r\n const scan = await doScan()\r\n const scanMs = Date.now() - scanStartedAt\r\n try {\r\n const buildStartedAt = Date.now()\r\n const execution = await buildFromScan(\r\n scan,\r\n resolvedRoot,\r\n options,\r\n await getTailwindConfig()\r\n )\r\n const buildMs = Date.now() - buildStartedAt\r\n writeDashboardMetrics(resolvedRoot, \"build\", execution.result, {\r\n buildMs,\r\n scanMs,\r\n analyzeMs: execution.metrics.analyzeMs,\r\n compileMs: execution.metrics.compileMs,\r\n })\r\n return execution.result\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n writeDashboardMetrics(resolvedRoot, \"error\", null, {\r\n scanMs,\r\n error: normalized.message,\r\n })\r\n throw normalized\r\n }\r\n },\r\n async watch(\r\n onEvent: (event: EngineWatchEvent) => void,\r\n rawWatchOptions: EngineWatchOptions = {}\r\n ): Promise<{ close(): void }> {\r\n // ── Boundary validation: validate watch options with Zod ──\r\n const watchOptions = parseEngineWatchOptions(rawWatchOptions)\r\n\r\n const flushDebounceMs = watchOptions.debounceMs ?? DEFAULT_FLUSH_DEBOUNCE_MS\r\n const maxEventsPerFlush = watchOptions.maxEventsPerFlush ?? DEFAULT_MAX_EVENTS_PER_FLUSH\r\n const largeFileThreshold =\r\n watchOptions.largeFileThreshold ?? DEFAULT_LARGE_FILE_THRESHOLD_BYTES\r\n\r\n const tailwindConfig = await getTailwindConfig()\r\n const watchContext = { root: resolvedRoot, timestamp: Date.now() }\r\n await runBeforeWatch(plugins, watchContext)\r\n\r\n const initialScanStartedAt = Date.now()\r\n const initialScan = await doScan()\r\n const initialScanMs = Date.now() - initialScanStartedAt\r\n\r\n const watchState = {\r\n currentScan: initialScan,\r\n timer: null as NodeJS.Timeout | null,\r\n setTimer(t: NodeJS.Timeout | null) {\r\n this.timer = t\r\n },\r\n clearTimer() {\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n },\r\n }\r\n\r\n try {\r\n const initialBuildStartedAt = Date.now()\r\n const execution = await buildFromScan(\r\n watchState.currentScan,\r\n resolvedRoot,\r\n options,\r\n tailwindConfig\r\n )\r\n const initialBuildMs = Date.now() - initialBuildStartedAt\r\n writeDashboardMetrics(resolvedRoot, \"watch\", execution.result, {\r\n buildMs: initialBuildMs,\r\n scanMs: initialScanMs,\r\n analyzeMs: execution.metrics.analyzeMs,\r\n compileMs: execution.metrics.compileMs,\r\n lastEventType: \"initial\",\r\n })\r\n onEvent({\r\n type: \"initial\",\r\n result: execution.result,\r\n })\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n writeDashboardMetrics(resolvedRoot, \"error\", null, {\r\n scanMs: initialScanMs,\r\n error: normalized.message,\r\n lastEventType: \"initial\",\r\n })\r\n onEvent({ type: \"error\", error: normalized.message })\r\n throw normalized\r\n }\r\n\r\n const queue: Array<{ type: \"change\" | \"unlink\"; filePath: string }> = []\r\n const metrics = new EngineMetricsCollector()\r\n\r\n const scheduleFlush = (): void => {\r\n if (watchState.timer) return\r\n watchState.setTimer(\r\n setTimeout(() => {\r\n watchState.clearTimer()\r\n void flushBatch()\r\n }, flushDebounceMs)\r\n )\r\n }\r\n\r\n const shouldForceFullRescan = (event: {\r\n type: \"change\" | \"unlink\"\r\n filePath: string\r\n }): boolean => {\r\n if (event.type === \"unlink\") return false\r\n try {\r\n const stat = fs.statSync(event.filePath)\r\n if (stat.size > largeFileThreshold) {\r\n metrics.markSkippedLargeFile()\r\n return true\r\n }\r\n } catch {\r\n return false\r\n }\r\n return false\r\n }\r\n\r\n const flushBatch = async (): Promise<void> => {\r\n if (queue.length === 0) return\r\n\r\n const batch = queue.splice(0, maxEventsPerFlush)\r\n metrics.markBatchProcessed(batch.length)\r\n\r\n const forceRescan = batch.some((event) => shouldForceFullRescan(event))\r\n const lastEvent = batch[batch.length - 1]\r\n\r\n const eventTypeState = { emittedType: lastEvent.type as EngineBuildWatchEventType }\r\n const scanStartedAt = Date.now()\r\n\r\n try {\r\n if (forceRescan) {\r\n watchState.currentScan = await doScan()\r\n metrics.markFullRescan()\r\n eventTypeState.emittedType = \"full-rescan\"\r\n } else {\r\n for (const event of batch) {\r\n watchState.currentScan = applyIncrementalChange(\r\n watchState.currentScan,\r\n event.filePath,\r\n event.type,\r\n options.scanner\r\n )\r\n metrics.markIncremental()\r\n }\r\n }\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n log.warn(\"incremental path failed, forcing full rescan:\", normalized.message)\r\n watchState.currentScan = await doScan()\r\n metrics.markFullRescan()\r\n eventTypeState.emittedType = \"full-rescan\"\r\n }\r\n\r\n const scanMs = Date.now() - scanStartedAt\r\n\r\n try {\r\n const started = Date.now()\r\n const execution = await buildFromScan(\r\n watchState.currentScan,\r\n resolvedRoot,\r\n options,\r\n tailwindConfig\r\n )\r\n const buildMs = Date.now() - started\r\n metrics.markBuildDuration(buildMs)\r\n const snapshot = metrics.snapshot()\r\n writeDashboardMetrics(resolvedRoot, \"watch\", execution.result, {\r\n scanMs,\r\n buildMs,\r\n analyzeMs: execution.metrics.analyzeMs,\r\n compileMs: execution.metrics.compileMs,\r\n lastEventType: eventTypeState.emittedType,\r\n ...snapshot,\r\n })\r\n\r\n onEvent({\r\n type: eventTypeState.emittedType,\r\n filePath: lastEvent.filePath,\r\n result: execution.result,\r\n metrics: snapshot,\r\n })\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n const snapshot = metrics.snapshot()\r\n writeDashboardMetrics(resolvedRoot, \"error\", null, {\r\n scanMs,\r\n error: normalized.message,\r\n lastEventType: eventTypeState.emittedType,\r\n ...snapshot,\r\n })\r\n onEvent({\r\n type: \"error\",\r\n filePath: lastEvent.filePath,\r\n error: normalized.message,\r\n metrics: snapshot,\r\n })\r\n }\r\n\r\n if (queue.length > 0) scheduleFlush()\r\n }\r\n\r\n const watcher: WorkspaceWatcher = watchWorkspace(\r\n resolvedRoot,\r\n (event) => {\r\n queue.push(event)\r\n metrics.markEventReceived(queue.length)\r\n scheduleFlush()\r\n },\r\n {\r\n ignoreDirectories: options.scanner?.ignoreDirectories,\r\n debounceMs: flushDebounceMs,\r\n onError: (error, directory) => {\r\n void reportEngineError(error)\r\n onEvent({\r\n type: \"error\",\r\n filePath: directory,\r\n error: error.message,\r\n metrics: metrics.snapshot(),\r\n })\r\n },\r\n }\r\n )\r\n\r\n return {\r\n async close() {\r\n watchState.clearTimer()\r\n watcher.close()\r\n await runAfterWatch(plugins, watchContext)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// Re-export internal API (including IR types)\r\nexport * from \"./internal\"\r\n// Re-export schemas\r\nexport {\r\n type BuildResultInput,\r\n BuildResultSchema,\r\n type EngineOptionsInput,\r\n EngineOptionsSchema,\r\n type EngineWatchOptionsInput,\r\n EngineWatchOptionsSchema,\r\n parseEngineOptions,\r\n parseEngineWatchOptions,\r\n} from \"./schemas\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Standalone facade functions — tidak perlu createEngine()\r\n// Berguna untuk CLI, adapter, dan tooling yang tidak butuh watch/lifecycle penuh\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Scan workspace dan return hasil scan.\r\n * Facade tipis di atas scanWorkspaceAsync dari @tailwind-styled/scanner.\r\n *\r\n * @example\r\n * const result = await scanWorkspace({ root: \"./src\" })\r\n * console.log(result.uniqueClasses)\r\n */\r\nexport async function scanWorkspace(\r\n opts: { root?: string; extensions?: string[]; ignoreDirectories?: string[] } = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const root = path.resolve(opts.root ?? process.cwd())\r\n return scanWorkspaceAsync(root, {\r\n includeExtensions: opts.extensions,\r\n ignoreDirectories: opts.ignoreDirectories,\r\n })\r\n}\r\n\r\n/**\r\n * Analyze workspace — scan + analyze classes.\r\n * Facade di atas runWorkspaceAnalysis.\r\n *\r\n * @example\r\n * const report = await analyzeWorkspace({ root: \"./src\" })\r\n * console.log(report.topClasses)\r\n */\r\nexport async function analyzeWorkspace(\r\n opts: { root?: string; top?: number } = {}\r\n): Promise<Awaited<ReturnType<typeof runWorkspaceAnalysis>>> {\r\n const root = path.resolve(opts.root ?? process.cwd())\r\n return runWorkspaceAnalysis(root, {\r\n classStats: { top: opts.top ?? 20 },\r\n })\r\n}\r\n\r\n/**\r\n * Generate safelist dari scan result.\r\n * Berguna untuk Tailwind config safelist generation.\r\n *\r\n * @example\r\n * const safelist = await generateSafelist({ root: \"./src\" })\r\n * // Pakai di tailwind.config.ts: { safelist }\r\n */\r\nexport async function generateSafelist(\r\n opts: { root?: string } = {}\r\n): Promise<string[]> {\r\n const scan = await scanWorkspace(opts)\r\n return scan.uniqueClasses\r\n}\r\n\r\n/**\r\n * Build CSS dari scan result.\r\n * One-shot build tanpa watch mode.\r\n *\r\n * @example\r\n * const result = await build({ root: \"./src\" })\r\n * fs.writeFileSync(\"dist/tailwind.css\", result.css)\r\n */\r\nexport async function build(\r\n opts: EngineOptions = {}\r\n): Promise<{ css: string; classes: string[]; totalFiles: number }> {\r\n const engine = await createEngine(opts)\r\n const result = await engine.build()\r\n return {\r\n css: result.css,\r\n classes: result.mergedClassList.split(/\\s+/).filter(Boolean),\r\n totalFiles: result.scan.totalFiles,\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Shared trace/inspection surface — reusable across CLI, devtools, dashboard\r\n// (dari monorepo checklist: \"Tambahkan mode trace yang reusable\")\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TraceResult, RuleTrace, ConflictTrace, VariantTrace, FinalStyleProperty } from \"./trace\"\r\nexport { trace, buildProvenanceChain } from \"./trace\"\r\n\r\n/**\r\n * High-level trace API — satu entry point untuk semua tooling.\r\n *\r\n * Dipakai oleh:\r\n * - CLI: `tw trace <class>`\r\n * - DevTools: TracePanel fetch\r\n * - Dashboard: trace endpoint\r\n *\r\n * @example\r\n * const result = await traceClass(\"flex\", scanResult, cssString)\r\n * console.log(result.finalStyle) // [{ property: \"display\", value: \"flex\" }]\r\n */\r\nexport async function traceClass(\r\n className: string,\r\n scanResult: ScanWorkspaceResult,\r\n css: string\r\n): Promise<import(\"./trace\").TraceResult | null> {\r\n if (!className || !css) return null\r\n\r\n try {\r\n const { parseCssToIr } = await import(\"./cssToIr\")\r\n const { CascadeResolver } = await import(\"./resolver\")\r\n const { trace } = await import(\"./trace\")\r\n\r\n const { rules, classToRuleIds } = parseCssToIr(css)\r\n const resolver = new CascadeResolver()\r\n resolver.addRules(rules)\r\n for (const [registeredClassName, ruleIds] of classToRuleIds) {\r\n resolver.registerClass(registeredClassName, ruleIds)\r\n }\r\n\r\n return trace(className, resolver)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Trace multiple classes at once — for batch inspection.\r\n */\r\nexport async function traceClasses(\r\n classNames: string[],\r\n scanResult: ScanWorkspaceResult,\r\n css: string\r\n): Promise<Map<string, import(\"./trace\").TraceResult>> {\r\n const results = new Map<string, import(\"./trace\").TraceResult>()\r\n\r\n for (const cls of classNames) {\r\n const result = await traceClass(cls, scanResult, css)\r\n if (result) results.set(cls, result)\r\n }\r\n\r\n return results\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Surface Inspection — consistent API untuk CLI, devtools, dashboard\r\n// (dari monorepo checklist: \"Tambahkan surface inspection yang konsisten\")\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface InspectionReport {\r\n className: string\r\n /** CSS rules yang dihasilkan */\r\n css: string\r\n /** Properties yang di-set */\r\n properties: Array<{ property: string; value: string }>\r\n /** Classes yang berkonflik dengan ini */\r\n conflicts: string[]\r\n /** Files yang menggunakan class ini */\r\n usedIn: string[]\r\n /** Risk level untuk removal */\r\n risk: \"low\" | \"medium\" | \"high\"\r\n /** Estimated bundle contribution */\r\n bundleBytes: number\r\n}\r\n\r\n/**\r\n * Inspect a single class — gabungan trace + impact + usage.\r\n * Reusable surface untuk CLI (`tw why`), DevTools panel, dashboard endpoint.\r\n *\r\n * @example\r\n * const report = await inspectClass(\"flex\", scanResult, cssString)\r\n * console.log(report.properties) // [{ property: \"display\", value: \"flex\" }]\r\n * console.log(report.usedIn) // [\"src/Button.tsx\", \"src/Card.tsx\"]\r\n * console.log(report.risk) // \"low\"\r\n */\r\nexport async function inspectClass(\r\n className: string,\r\n scanResult: ScanWorkspaceResult,\r\n css = \"\"\r\n): Promise<InspectionReport> {\r\n const normalizedClass = className.startsWith(\".\") ? className.slice(1) : className\r\n\r\n // Usage: files yang menggunakan class ini\r\n const usedIn = (scanResult.files ?? [])\r\n .filter(f => f.classes?.includes(normalizedClass))\r\n .map(f => f.file)\r\n const usedInLocations = usedIn.map((file) => ({ file, line: 1, column: 1 }))\r\n\r\n // Trace: get CSS properties\r\n const traceResult = await traceClass(normalizedClass, scanResult, css)\r\n const properties = traceResult?.finalStyle ?? []\r\n\r\n // Impact: risk level\r\n const tracker = new ImpactTracker()\r\n const dummyBundle = {\r\n className: normalizedClass,\r\n totalUsage: usedIn.length,\r\n files: usedInLocations,\r\n bundleSizeBytes: 0,\r\n variantChains: [],\r\n isDeadCode: usedIn.length === 0,\r\n dependencies: [],\r\n }\r\n const impact = tracker.calculateImpact(normalizedClass, dummyBundle, scanResult)\r\n\r\n return {\r\n className: normalizedClass,\r\n css,\r\n properties: properties.map(p => ({ property: p.property, value: p.value })),\r\n conflicts: [], // populated by trace conflicts if available\r\n usedIn,\r\n risk: impact.riskLevel,\r\n bundleBytes: impact.bundleSizeBytes,\r\n }\r\n}\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\n\r\nimport {\r\n isScannableFile,\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n scanFile,\r\n} from \"@tailwind-styled/scanner\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\n\r\nimport { getNativeEngineBinding } from \"./native-bridge\"\r\n\r\nconst DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\r\nconst log = createLogger(\"engine:incremental\")\r\n\r\nfunction rebuildWorkspaceResult(\r\n byFile: Map<string, ScanWorkspaceResult[\"files\"][number]>\r\n): ScanWorkspaceResult {\r\n const files = Array.from(byFile.values())\r\n const unique = new Set<string>()\r\n for (const file of files) {\r\n for (const cls of file.classes) unique.add(cls)\r\n }\r\n return {\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n }\r\n}\r\n\r\nfunction applyClassDiff(existing: string[], added: string[], removed: string[]): string[] {\r\n const next = new Set(existing)\r\n for (const cls of added) next.add(cls)\r\n for (const cls of removed) next.delete(cls)\r\n return Array.from(next)\r\n}\r\n\r\nfunction areClassSetsEqual(a: string[], b: string[]): boolean {\r\n if (a.length !== b.length) return false\r\n const bSet = new Set(b)\r\n for (const cls of a) {\r\n if (!bSet.has(cls)) return false\r\n }\r\n return true\r\n}\r\n\r\n/**\r\n * Apply an incremental file-change event to an existing scan result.\r\n *\r\n * Native-only: Rust processFileChange is required.\r\n * No JavaScript fallback — native Rust binding must be available.\r\n */\r\nexport function applyIncrementalChange(\r\n previous: ScanWorkspaceResult,\r\n filePath: string,\r\n type: \"change\" | \"unlink\",\r\n scanner?: ScanWorkspaceOptions\r\n): ScanWorkspaceResult {\r\n const includeExtensions = scanner?.includeExtensions ?? DEFAULT_EXTENSIONS\r\n if (!isScannableFile(filePath, includeExtensions)) return previous\r\n\r\n const byFile = new Map(previous.files.map((f) => [path.resolve(f.file), f]))\r\n const normalizedPath = path.resolve(filePath)\r\n\r\n const native = getNativeEngineBinding()\r\n if (!native?.processFileChange) {\r\n throw new Error(\r\n \"FATAL: Native binding 'processFileChange' is required but not available.\\n\" +\r\n \"This package requires native Rust bindings.\\n\\n\" +\r\n \"Resolution steps:\\n\" +\r\n \"1. Build the native Rust module: npm run build:rust\"\r\n )\r\n }\r\n\r\n if (type === \"unlink\") {\r\n const existing = byFile.get(normalizedPath)\r\n log.debug(`native unlink ${normalizedPath}`)\r\n native.processFileChange(normalizedPath, existing?.classes ?? [], null)\r\n byFile.delete(normalizedPath)\r\n return rebuildWorkspaceResult(byFile)\r\n }\r\n\r\n log.debug(`native change ${normalizedPath}`)\r\n const scanned = scanFile(normalizedPath)\r\n const content = fs.readFileSync(normalizedPath, \"utf8\")\r\n const diff = native.processFileChange(normalizedPath, scanned.classes, content)\r\n const existing = byFile.get(normalizedPath)\r\n\r\n if (diff && existing) {\r\n log.debug(`native diff ${normalizedPath} +${diff.added.length} -${diff.removed.length}`)\r\n const diffApplied = applyClassDiff(existing.classes, diff.added, diff.removed)\r\n const classes = areClassSetsEqual(diffApplied, scanned.classes)\r\n ? diffApplied\r\n : scanned.classes\r\n byFile.set(normalizedPath, { file: normalizedPath, classes })\r\n } else {\r\n log.debug(`native diff cold-sync ${normalizedPath}`)\r\n byFile.set(normalizedPath, { file: normalizedPath, classes: scanned.classes })\r\n }\r\n\r\n return rebuildWorkspaceResult(byFile)\r\n}\r\n","/**\r\n * Engine — Rust native bridge\r\n *\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n */\r\nimport path from \"node:path\"\r\nimport {\r\n createDebugLogger,\r\n getDirname as getEsmDirname,\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n TwError,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nconst log = createDebugLogger(\"engine:native\")\r\n\r\nfunction getDirname(): string {\r\n if (typeof __dirname !== \"undefined\") return __dirname\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return getEsmDirname(import.meta.url)\r\n }\r\n return process.cwd()\r\n}\r\n\r\ninterface NativeEngineBinding {\r\n computeIncrementalDiff?: (\r\n previousJson: string,\r\n currentJson: string\r\n ) => {\r\n addedClasses: string[]\r\n removedClasses: string[]\r\n changedFiles: string[]\r\n unchangedFiles: number\r\n } | null\r\n hashFileContent?: (content: string) => string | null\r\n processFileChange?: (\r\n filepath: string,\r\n newClasses: string[],\r\n content: string | null\r\n ) => { added: string[]; removed: string[] } | null\r\n // Batch 3 additions\r\n parseCssRulesNative?: (css: string) => Array<{\r\n className: string; property: string; value: string\r\n isImportant: boolean; variants: string[]; specificity: number\r\n }>\r\n batchSplitClassesNative?: (classes: string[]) => Array<{\r\n variantKey: string; base: string; variants: string[]\r\n isArbitrary: boolean; hasModifier: boolean; modifier?: string\r\n }>\r\n detectClassConflictsNative?: (usagesJson: string) => {\r\n conflicts: Array<{ group: string; variantKey: string; classes: string[]; message: string }>\r\n conflictedClassNames: string[]\r\n }\r\n classifyKnownClassesNative?: (classes: string[], safelist: string[], customUtilities: string[]) => Array<{\r\n className: string; isKnown: boolean; variantKey: string; baseClass: string\r\n utilityPrefix: string; isArbitrary: boolean\r\n }>\r\n diffClassListsNative?: (previous: string[], current: string[]) => {\r\n added: string[]; removed: string[]; unchanged: string[]; hasChanges: boolean\r\n }\r\n // Batch 4\r\n parseCssToRulesNative?: (css: string, prefix?: string | null) => Array<{\r\n className: string; property: string; value: string; important: boolean\r\n variants: string[]; pseudoClasses: string[]; mediaQuery: string | null\r\n specificity: number; layer: string | null\r\n }>\r\n calculateBundleContributionsNative?: (classes: string[], css: string) => Array<{\r\n className: string; sizeBytes: number; variantChains: string[]\r\n dependencies: string[]; inCss: boolean\r\n }>\r\n detectDeadCodeNative?: (scanResultJson: string, css: string) => {\r\n deadInCss: string[]; deadInSource: string[]; liveClasses: string[]\r\n totalCssClasses: number; totalSourceClasses: number\r\n }\r\n calculateImpactScoresNative?: (\r\n classes: string[], scanResultJson: string, css: string,\r\n usageWeight: number, sizeWeight: number\r\n ) => Array<{\r\n className: string; usageScore: number; sizeScore: number\r\n impactScore: number; usageCount: number; sizeBytes: number\r\n }>\r\n analyzeRouteClassDistributionNative?: (routeFilesJson: string, scanResultJson: string) => Array<{\r\n route: string; classes: string[]; exclusiveClasses: string[]; classCount: number\r\n }>\r\n}\r\n\r\nconst isValidEngineBinding = (module: unknown): module is NativeEngineBinding => {\r\n const candidate = module as Partial<NativeEngineBinding> | null | undefined\r\n return !!(\r\n candidate &&\r\n (candidate.computeIncrementalDiff || candidate.processFileChange || candidate.hashFileContent)\r\n )\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createEngineBindingLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeEngineBinding | null | undefined,\r\n loadError: null as string | null,\r\n candidatePaths: [] as string[],\r\n }\r\n\r\n const throwNativeBindingError = (): never => {\r\n const lines = [\r\n \"FATAL: Native engine binding not found.\",\r\n \"\",\r\n \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\r\n \"The binding was not found in any of these paths:\",\r\n ..._state.candidatePaths.map((p) => ` - ${p}`),\r\n \"\",\r\n ]\r\n\r\n if (_state.loadError) {\r\n lines.push(\"Load error:\", ` ${_state.loadError}`, \"\")\r\n }\r\n\r\n lines.push(\r\n \"To fix this, run:\",\r\n \" npm run build:rust\",\r\n \"\",\r\n \"This will build the native Rust module from the 'native/' directory.\",\r\n \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\r\n \"and 'npm run build:rust' is executed before running tests or building.\"\r\n )\r\n\r\n throw new TwError(\"rust\", \"ENGINE_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\r\n }\r\n\r\n const getBinding = (): NativeEngineBinding => {\r\n const cached = _state.binding\r\n if (cached !== undefined) {\r\n if (cached === null) {\r\n return throwNativeBindingError()\r\n }\r\n return cached\r\n }\r\n\r\n const runtimeDir = getDirname()\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n includeDefaultCandidates: true,\r\n })\r\n\r\n _state.candidatePaths = candidates\r\n\r\n const { binding, loadErrors } = loadNativeBinding<NativeEngineBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isValidEngineBinding,\r\n invalidExportMessage: \"Module loaded but missing expected engine binding functions\",\r\n })\r\n\r\n if (binding) {\r\n log(`engine native binding loaded successfully`)\r\n _state.binding = binding\r\n return binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\r\n }\r\n\r\n _state.binding = null\r\n return throwNativeBindingError()\r\n }\r\n\r\n return {\r\n get: getBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.loadError = null\r\n _state.candidatePaths = []\r\n },\r\n }\r\n}\r\n\r\nconst engineBindingLoader = createEngineBindingLoader()\r\n\r\nexport function getNativeEngineBinding(): NativeEngineBinding {\r\n return engineBindingLoader.get()\r\n}\r\n\r\nexport function computeIncrementalDiff(\r\n previousJson: string,\r\n currentJson: string\r\n): {\r\n addedClasses: string[]\r\n removedClasses: string[]\r\n changedFiles: string[]\r\n unchangedFiles: number\r\n} {\r\n const result = getNativeEngineBinding().computeIncrementalDiff?.(previousJson, currentJson)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"ENGINE_DIFF_FAILED\",\r\n \"Native computeIncrementalDiff returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function hashFileContent(content: string): string {\r\n const result = getNativeEngineBinding().hashFileContent?.(content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"ENGINE_HASH_FAILED\",\r\n \"Native hashFileContent returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function processFileChange(\r\n filepath: string,\r\n newClasses: string[],\r\n content: string | null\r\n): { added: string[]; removed: string[] } {\r\n const result = getNativeEngineBinding().processFileChange?.(filepath, newClasses, content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"ENGINE_PROCESS_FAILED\",\r\n \"Native processFileChange returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n","export interface EngineMetricsSnapshot {\r\n eventsReceived: number\r\n eventsProcessed: number\r\n batchesProcessed: number\r\n incrementalUpdates: number\r\n fullRescans: number\r\n skippedLargeFiles: number\r\n queueMaxSize: number\r\n lastBuildMs: number\r\n avgBuildMs: number\r\n}\r\n\r\nexport class EngineMetricsCollector {\r\n private eventsReceived = 0\r\n private eventsProcessed = 0\r\n private batchesProcessed = 0\r\n private incrementalUpdates = 0\r\n private fullRescans = 0\r\n private skippedLargeFiles = 0\r\n private queueMaxSize = 0\r\n private lastBuildMs = 0\r\n private totalBuildMs = 0\r\n\r\n markEventReceived(queueSize: number): void {\r\n this.eventsReceived += 1\r\n if (queueSize > this.queueMaxSize) this.queueMaxSize = queueSize\r\n }\r\n\r\n markBatchProcessed(batchSize: number): void {\r\n this.batchesProcessed += 1\r\n this.eventsProcessed += batchSize\r\n }\r\n\r\n markIncremental(): void {\r\n this.incrementalUpdates += 1\r\n }\r\n\r\n markFullRescan(): void {\r\n this.fullRescans += 1\r\n }\r\n\r\n markSkippedLargeFile(): void {\r\n this.skippedLargeFiles += 1\r\n }\r\n\r\n markBuildDuration(ms: number): void {\r\n this.lastBuildMs = ms\r\n this.totalBuildMs += ms\r\n }\r\n\r\n snapshot(): EngineMetricsSnapshot {\r\n const avgBuildMs = this.batchesProcessed > 0 ? this.totalBuildMs / this.batchesProcessed : 0\r\n return {\r\n eventsReceived: this.eventsReceived,\r\n eventsProcessed: this.eventsProcessed,\r\n batchesProcessed: this.batchesProcessed,\r\n incrementalUpdates: this.incrementalUpdates,\r\n fullRescans: this.fullRescans,\r\n skippedLargeFiles: this.skippedLargeFiles,\r\n queueMaxSize: this.queueMaxSize,\r\n lastBuildMs: this.lastBuildMs,\r\n avgBuildMs,\r\n }\r\n }\r\n}\r\n","/**\r\n * tailwind-styled-v4 — Metrics Writer\r\n *\r\n * Menulis metrics dari engine ke file `.tw-cache/metrics.json`\r\n * sehingga dashboard server bisa membaca secara real-time.\r\n *\r\n * Dipanggil dari engine setelah setiap build selesai.\r\n */\r\n\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { performance } from \"node:perf_hooks\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\n\r\nconst _log = createLogger(\"tw:metrics\")\r\n\r\nexport interface BuildMetrics {\r\n buildMs?: number\r\n scanMs?: number\r\n analyzeMs?: number\r\n compileMs?: number\r\n classCount?: number\r\n fileCount?: number\r\n cssBytes?: number\r\n packageCount?: number\r\n memoryMb?: { rss: number; heapUsed: number; heapTotal: number }\r\n mode?: \"jit\" | \"build\" | \"watch\" | \"idle\" | \"error\"\r\n route?: string\r\n error?: string\r\n lastEventType?: string\r\n eventsReceived?: number\r\n eventsProcessed?: number\r\n batchesProcessed?: number\r\n incrementalUpdates?: number\r\n fullRescans?: number\r\n skippedLargeFiles?: number\r\n queueMaxSize?: number\r\n lastBuildMs?: number\r\n avgBuildMs?: number\r\n generatedAt?: string\r\n}\r\n\r\nconst METRICS_FILE_NAME = \"metrics.json\"\r\nconst CACHE_DIR = \".tw-cache\"\r\n\r\n/**\r\n * Tulis metrics ke file untuk dibaca oleh dashboard server.\r\n * Non-blocking — error diabaikan.\r\n */\r\nexport function writeMetrics(metrics: BuildMetrics, cwd = process.cwd()): void {\r\n try {\r\n const cacheDir = path.join(cwd, CACHE_DIR)\r\n fs.mkdirSync(cacheDir, { recursive: true })\r\n\r\n const mem = process.memoryUsage()\r\n const data: BuildMetrics = {\r\n ...metrics,\r\n memoryMb: {\r\n rss: Math.round(mem.rss / 1024 / 1024),\r\n heapUsed: Math.round(mem.heapUsed / 1024 / 1024),\r\n heapTotal: Math.round(mem.heapTotal / 1024 / 1024),\r\n },\r\n generatedAt: new Date().toISOString(),\r\n }\r\n\r\n fs.writeFileSync(path.join(cacheDir, METRICS_FILE_NAME), JSON.stringify(data, null, 2))\r\n } catch {\r\n // Non-critical — dashboard adalah opsional\r\n }\r\n}\r\n\r\n/**\r\n * Higher-order wrapper — ukur durasi fungsi dan tulis metrics.\r\n *\r\n * @example\r\n * const result = await withMetrics('build', async () => {\r\n * return await engine.build()\r\n * }, { classCount: result.scan.uniqueClasses.length })\r\n */\r\nexport async function withMetrics<T>(\r\n mode: BuildMetrics[\"mode\"],\r\n fn: () => Promise<T>,\r\n extraMetrics: Partial<BuildMetrics> = {},\r\n cwd = process.cwd()\r\n): Promise<T> {\r\n const start = performance.now()\r\n const result = await fn()\r\n const elapsed = Math.round(performance.now() - start)\r\n\r\n writeMetrics({ mode, buildMs: elapsed, ...extraMetrics }, cwd)\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Buat timer untuk mengukur scan time.\r\n *\r\n * @example\r\n * const timer = startScanTimer()\r\n * const scan = scanWorkspace(root)\r\n * writeMetrics({ scanMs: timer.elapsed(), classCount: scan.uniqueClasses.length })\r\n */\r\nexport function startTimer() {\r\n const start = performance.now()\r\n return {\r\n elapsed: () => Math.round(performance.now() - start),\r\n }\r\n}\r\n\r\nexport default { writeMetrics, withMetrics, startTimer }\r\n","import type { ScanWorkspaceResult } from \"@tailwind-styled/scanner\"\r\nimport type { BuildResult } from \"./index\"\r\n\r\nexport interface EnginePluginContext {\r\n root: string\r\n timestamp: number\r\n}\r\n\r\nexport interface EngineWatchContext {\r\n root: string\r\n timestamp: number\r\n}\r\n\r\nexport interface EnginePlugin {\r\n name: string\r\n beforeScan?(context: EnginePluginContext): void | Promise<void>\r\n afterScan?(\r\n scan: ScanWorkspaceResult,\r\n context: EnginePluginContext\r\n ): ScanWorkspaceResult | undefined | Promise<ScanWorkspaceResult | undefined>\r\n transformClasses?(\r\n classes: string[],\r\n context: EnginePluginContext\r\n ): string[] | undefined | Promise<string[] | undefined>\r\n beforeBuild?(scan: ScanWorkspaceResult, context: EnginePluginContext): void | Promise<void>\r\n afterBuild?(\r\n result: BuildResult,\r\n context: EnginePluginContext\r\n ): BuildResult | undefined | Promise<BuildResult | undefined>\r\n onError?(error: Error, context: EnginePluginContext): void | Promise<void>\r\n beforeWatch?(context: EngineWatchContext): void | Promise<void>\r\n afterWatch?(context: EngineWatchContext): void | Promise<void>\r\n}\r\n\r\nexport async function runBeforeScan(\r\n plugins: EnginePlugin[],\r\n context: EnginePluginContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.beforeScan?.(context)\r\n }\r\n}\r\n\r\nexport async function runAfterScan(\r\n plugins: EnginePlugin[],\r\n scan: ScanWorkspaceResult,\r\n context: EnginePluginContext\r\n): Promise<ScanWorkspaceResult> {\r\n return await plugins.reduce(async (currentPromise, plugin) => {\r\n const current = await currentPromise\r\n const next = await plugin.afterScan?.(current, context)\r\n return next ?? current\r\n }, Promise.resolve(scan))\r\n}\r\n\r\nexport async function runTransformClasses(\r\n plugins: EnginePlugin[],\r\n classes: string[],\r\n context: EnginePluginContext\r\n): Promise<string[]> {\r\n return await plugins.reduce(async (currentPromise, plugin) => {\r\n const current = await currentPromise\r\n const next = await plugin.transformClasses?.(current, context)\r\n return next ?? current\r\n }, Promise.resolve(classes))\r\n}\r\n\r\nexport async function runBeforeBuild(\r\n plugins: EnginePlugin[],\r\n scan: ScanWorkspaceResult,\r\n context: EnginePluginContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.beforeBuild?.(scan, context)\r\n }\r\n}\r\n\r\nexport async function runAfterBuild(\r\n plugins: EnginePlugin[],\r\n result: BuildResult,\r\n context: EnginePluginContext\r\n): Promise<BuildResult> {\r\n return plugins.reduce(async (acc, plugin) => {\r\n const current = await acc\r\n const next = await plugin.afterBuild?.(current, context)\r\n return next !== undefined ? next : current\r\n }, Promise.resolve(result))\r\n}\r\n\r\nexport async function runOnError(\r\n plugins: EnginePlugin[],\r\n error: Error,\r\n context: EnginePluginContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.onError?.(error, context)\r\n }\r\n}\r\n\r\nexport async function runBeforeWatch(\r\n plugins: EnginePlugin[],\r\n context: EngineWatchContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.beforeWatch?.(context)\r\n }\r\n}\r\n\r\nexport async function runAfterWatch(\r\n plugins: EnginePlugin[],\r\n context: EngineWatchContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.afterWatch?.(context)\r\n }\r\n}\r\n","import { z } from \"zod\"\r\nimport type { EnginePlugin } from \"./plugin-api\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const p = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\"\r\n return `${p}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n throw new TypeError(`${label}: ${formatIssues(parsed.error)}`)\r\n}\r\n\r\nexport const EngineOptionsSchema = z.object({\r\n root: z.string().optional(),\r\n scanner: z\r\n .object({\r\n includeExtensions: z.array(z.string()).optional(),\r\n ignoreDirectories: z.array(z.string()).optional(),\r\n useCache: z.boolean().optional(),\r\n cacheDir: z.string().min(1).optional(),\r\n smartInvalidation: z.boolean().optional(),\r\n })\r\n .optional(),\r\n compileCss: z.boolean().optional(),\r\n tailwindConfigPath: z.string().optional(),\r\n analyze: z.boolean().optional(),\r\n plugins: z.array(z.custom<EnginePlugin>()).optional(),\r\n})\r\n\r\nexport type EngineOptionsInput = z.infer<typeof EngineOptionsSchema>\r\n\r\nexport const EngineWatchOptionsSchema = z.object({\r\n debounceMs: z.number().int().min(0).optional(),\r\n maxEventsPerFlush: z.number().int().min(1).optional(),\r\n largeFileThreshold: z.number().int().min(0).optional(),\r\n})\r\n\r\nexport type EngineWatchOptionsInput = z.infer<typeof EngineWatchOptionsSchema>\r\n\r\nexport const BuildResultSchema = z.object({\r\n scan: z.object({\r\n files: z.array(\r\n z.object({ file: z.string(), classes: z.array(z.string()), hash: z.string().optional() })\r\n ),\r\n totalFiles: z.number().int().min(0),\r\n uniqueClasses: z.array(z.string()),\r\n }),\r\n mergedClassList: z.string(),\r\n css: z.string(),\r\n analysis: z\r\n .object({\r\n unusedClasses: z.array(z.string()),\r\n classConflicts: z.array(\r\n z.object({\r\n className: z.string(),\r\n files: z.array(z.string()),\r\n classes: z.array(z.string()).optional(),\r\n message: z.string().optional(),\r\n })\r\n ),\r\n classUsage: z.record(z.string(), z.number()),\r\n })\r\n .optional(),\r\n})\r\n\r\nexport type BuildResultInput = z.infer<typeof BuildResultSchema>\r\n\r\nexport const parseEngineOptions = (options: unknown) =>\r\n parseWithSchema(EngineOptionsSchema, options ?? {}, \"engine options are invalid\")\r\n\r\nexport const parseEngineWatchOptions = (options: unknown) =>\r\n parseWithSchema(EngineWatchOptionsSchema, options ?? {}, \"engine watch options are invalid\")\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\n\r\nexport interface WatcherOptions {\r\n ignoreDirectories?: string[]\r\n /**\r\n * Delay before emitting change event to reduce noisy bursts.\r\n */\r\n debounceMs?: number\r\n onError?: (error: Error, directory: string) => void\r\n}\r\n\r\nexport interface WatcherEvent {\r\n type: \"change\" | \"unlink\"\r\n filePath: string\r\n}\r\n\r\nexport interface WorkspaceWatcher {\r\n close(): void\r\n}\r\n\r\nconst DEFAULT_IGNORES = [\"node_modules\", \".git\", \".next\", \"dist\", \"out\", \".turbo\", \".cache\"]\r\n\r\nexport function watchWorkspace(\r\n rootDir: string,\r\n onEvent: (event: WatcherEvent) => void,\r\n options: WatcherOptions = {}\r\n): WorkspaceWatcher {\r\n const ignoreDirectories = new Set(options.ignoreDirectories ?? DEFAULT_IGNORES)\r\n const watchers = new Map<string, fs.FSWatcher>()\r\n const restartTimers = new Map<string, NodeJS.Timeout>()\r\n const debounceMs = options.debounceMs ?? 100\r\n const pending = new Map<string, NodeJS.Timeout>()\r\n\r\n const shouldIgnore = (targetPath: string): boolean => {\r\n const parts = targetPath.split(path.sep)\r\n return parts.some((part) => ignoreDirectories.has(part))\r\n }\r\n\r\n const enqueue = (event: WatcherEvent): void => {\r\n const key = `${event.type}:${event.filePath}`\r\n const existing = pending.get(key)\r\n if (existing) clearTimeout(existing)\r\n\r\n const timer = setTimeout(() => {\r\n pending.delete(key)\r\n onEvent(event)\r\n }, debounceMs)\r\n\r\n pending.set(key, timer)\r\n }\r\n\r\n const safeUnwatch = (dir: string): void => {\r\n const watcher = watchers.get(dir)\r\n if (!watcher) return\r\n try {\r\n watcher.close()\r\n } catch {\r\n // ignore close errors\r\n }\r\n watchers.delete(dir)\r\n }\r\n\r\n const scheduleRestart = (dir: string): void => {\r\n const previous = restartTimers.get(dir)\r\n if (previous) clearTimeout(previous)\r\n\r\n const timer = setTimeout(() => {\r\n restartTimers.delete(dir)\r\n watchDir(dir)\r\n }, 250)\r\n\r\n restartTimers.set(dir, timer)\r\n }\r\n\r\n const watchDir = (dir: string): void => {\r\n if (watchers.has(dir) || shouldIgnore(dir) || !fs.existsSync(dir)) return\r\n\r\n try {\r\n const stat = fs.lstatSync(dir)\r\n if (!stat.isDirectory() || stat.isSymbolicLink()) return\r\n } catch {\r\n return\r\n }\r\n\r\n const watcher = fs.watch(dir, { persistent: true }, (_eventType, fileName) => {\r\n if (!fileName) return\r\n const fullPath = path.join(dir, fileName.toString())\r\n if (shouldIgnore(fullPath)) return\r\n\r\n if (fs.existsSync(fullPath)) {\r\n try {\r\n const stat = fs.lstatSync(fullPath)\r\n if (stat.isSymbolicLink()) return\r\n if (stat.isDirectory()) {\r\n watchDir(fullPath)\r\n return\r\n }\r\n enqueue({ type: \"change\", filePath: fullPath })\r\n return\r\n } catch {\r\n // ignore transient fs errors\r\n }\r\n }\r\n\r\n enqueue({ type: \"unlink\", filePath: fullPath })\r\n })\r\n\r\n watcher.on(\"error\", (error) => {\r\n safeUnwatch(dir)\r\n const watcherError = error instanceof Error ? error : new Error(String(error))\r\n options.onError?.(watcherError, dir)\r\n scheduleRestart(dir)\r\n })\r\n\r\n watchers.set(dir, watcher)\r\n\r\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) continue\r\n watchDir(path.join(dir, entry.name))\r\n }\r\n }\r\n\r\n watchDir(path.resolve(rootDir))\r\n\r\n return {\r\n close() {\r\n for (const timer of pending.values()) clearTimeout(timer)\r\n pending.clear()\r\n for (const timer of restartTimers.values()) clearTimeout(timer)\r\n restartTimers.clear()\r\n for (const watcher of watchers.values()) watcher.close()\r\n watchers.clear()\r\n },\r\n }\r\n}\r\n","import { z } from \"zod\"\r\nimport { TwError } from \"@tailwind-styled/shared\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const p = formatIssuePath(issue.path)\r\n return `${p}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nexport const VitePluginOptionsSchema = z.object({\r\n include: z.instanceof(RegExp).optional(),\r\n exclude: z.instanceof(RegExp).optional(),\r\n scanDirs: z.array(z.string()).optional(),\r\n safelistOutput: z.string().optional(),\r\n generateSafelist: z.boolean().optional(),\r\n scanReportOutput: z.string().optional(),\r\n useEngineBuild: z.boolean().optional(),\r\n analyze: z.boolean().optional(),\r\n strict: z.boolean().optional(),\r\n mode: z.enum([\"zero-runtime\", \"runtime\"]).optional(),\r\n routeCss: z.boolean().optional(),\r\n deadStyleElimination: z.boolean().optional(),\r\n addDataAttr: z.boolean().optional(),\r\n autoClientBoundary: z.boolean().optional(),\r\n hoist: z.boolean().optional(),\r\n incremental: z.boolean().optional(),\r\n})\r\n\r\nexport type VitePluginOptionsInput = z.infer<typeof VitePluginOptionsSchema>\r\n\r\nexport const parseVitePluginOptions = (options: unknown) =>\r\n parseWithSchema(VitePluginOptionsSchema, options ?? {}, \"vite plugin options are invalid\")\r\n","/**\r\n * tailwind-styled-v4 - Vite Plugin v5\r\n *\r\n * Usage in vite.config.ts:\r\n * import { tailwindStyledPlugin } from \"@tailwind-styled/vite\"\r\n * export default defineConfig({\r\n * plugins: [react(), tailwindStyledPlugin()]\r\n * })\r\n *\r\n * v5 Changes:\r\n * - Simplified API (removed deprecated options)\r\n * - Uses @tailwind-styled/engine for build orchestration\r\n * - Mode always zero-runtime\r\n */\r\n\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\n\r\nimport { runLoaderTransform } from \"@tailwind-styled/compiler\"\r\nimport { createEngine } from \"@tailwind-styled/engine\"\r\nimport type { HmrContext, Plugin, ResolvedConfig } from \"vite\"\r\n\r\nimport { parseVitePluginOptions } from \"./schemas\"\r\n\r\nexport interface VitePluginOptions {\r\n include?: RegExp\r\n exclude?: RegExp\r\n scanDirs?: string[]\r\n safelistOutput?: string\r\n generateSafelist?: boolean\r\n scanReportOutput?: string\r\n useEngineBuild?: boolean\r\n analyze?: boolean\r\n strict?: boolean\r\n mode?: \"zero-runtime\" | \"runtime\"\r\n routeCss?: boolean\r\n deadStyleElimination?: boolean\r\n addDataAttr?: boolean\r\n autoClientBoundary?: boolean\r\n hoist?: boolean\r\n incremental?: boolean\r\n}\r\n\r\ninterface ViteLoaderOptions extends Record<string, unknown> {\r\n mode?: \"zero-runtime\"\r\n addDataAttr?: boolean\r\n filename?: string\r\n preserveImports?: boolean\r\n}\r\n\r\ninterface ViteLoaderOutput {\r\n code: string\r\n changed: boolean\r\n classes: string[]\r\n}\r\n\r\ninterface ScanWorkspaceResult {\r\n files: Array<{ file: string; classes: string[] }>\r\n totalFiles: number\r\n uniqueClasses: string[]\r\n}\r\n\r\ntype ViteTransformRunner = (ctx: {\r\n filepath: string\r\n source: string\r\n options: ViteLoaderOptions\r\n isDev?: boolean\r\n}) => ViteLoaderOutput\r\n\r\ntype ViteEngineFacade = {\r\n scanWorkspace(): Promise<ScanWorkspaceResult>\r\n build(): Promise<unknown>\r\n}\r\n\r\ntype ViteEngineFactory = (options: {\r\n root?: string\r\n compileCss?: boolean\r\n analyze?: boolean\r\n scanner?: {\r\n includeExtensions?: string[]\r\n }\r\n}) => Promise<ViteEngineFacade>\r\n\r\ntype InternalVitePluginOptions = VitePluginOptions & {\r\n __internalTransformRunner?: ViteTransformRunner\r\n __internalCreateEngine?: ViteEngineFactory\r\n}\r\n\r\nconst SCAN_EXTENSIONS = [\".tsx\", \".ts\", \".jsx\", \".js\"]\r\n\r\nfunction warnDeprecated(options: VitePluginOptions, key: keyof VitePluginOptions, message: string) {\r\n if (options[key] !== undefined) {\r\n console.warn(`[tailwind-styled-v4] Warning: '${key}' is deprecated in v5. ${message}`)\r\n }\r\n}\r\n\r\nfunction isInsideDirectory(filePath: string, directory: string): boolean {\r\n const relative = path.relative(directory, filePath)\r\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\r\n}\r\n\r\nfunction filterScanToDirs(\r\n scan: ScanWorkspaceResult,\r\n root: string,\r\n scanDirs: string[]\r\n): ScanWorkspaceResult {\r\n const resolvedDirs = scanDirs.map((dir) => path.resolve(root, dir))\r\n if (resolvedDirs.length === 0) return scan\r\n\r\n const files = scan.files.filter((file) => {\r\n const absoluteFile = path.resolve(file.file)\r\n return resolvedDirs.some((directory) => isInsideDirectory(absoluteFile, directory))\r\n })\r\n\r\n const uniqueClasses = Array.from(new Set(files.flatMap((file) => file.classes))).sort()\r\n\r\n return {\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses,\r\n }\r\n}\r\n\r\nfunction writeJsonArtifact(root: string, relativePath: string, value: unknown): void {\r\n const outputPath = path.resolve(root, relativePath)\r\n fs.mkdirSync(path.dirname(outputPath), { recursive: true })\r\n fs.writeFileSync(outputPath, `${JSON.stringify(value, null, 2)}\\n`)\r\n}\r\n\r\nexport function tailwindStyledPlugin(opts: VitePluginOptions = {}): Plugin {\r\n const rawOptions = opts as InternalVitePluginOptions\r\n const parsedOptions = parseVitePluginOptions(rawOptions)\r\n\r\n warnDeprecated(parsedOptions, \"mode\", \"Only zero-runtime is supported.\")\r\n warnDeprecated(parsedOptions, \"routeCss\", \"Use engine's analyzing capabilities.\")\r\n warnDeprecated(parsedOptions, \"deadStyleElimination\", \"Use 'analyze: true' option instead.\")\r\n warnDeprecated(parsedOptions, \"addDataAttr\", \"Handled by engine internally.\")\r\n warnDeprecated(parsedOptions, \"autoClientBoundary\", \"Handled by engine internally.\")\r\n warnDeprecated(parsedOptions, \"hoist\", \"Handled by engine internally.\")\r\n warnDeprecated(parsedOptions, \"incremental\", \"Handled by engine internally.\")\r\n\r\n const {\r\n include = /\\.(tsx|ts|jsx|js)$/,\r\n exclude = /node_modules/,\r\n scanDirs = [\"src\"],\r\n safelistOutput = \".tailwind-styled-safelist.json\",\r\n scanReportOutput = \".tailwind-styled-scan-report.json\",\r\n generateSafelist: doSafelist = true,\r\n useEngineBuild = true,\r\n analyze = false,\r\n strict = false,\r\n } = parsedOptions\r\n\r\n const transformRunner = rawOptions.__internalTransformRunner ?? runLoaderTransform\r\n const engineFactory = rawOptions.__internalCreateEngine ?? createEngine\r\n const pluginState = { root: process.cwd(), isDev: true }\r\n\r\n return {\r\n name: \"tailwind-styled-v4\",\r\n enforce: \"pre\" as const,\r\n\r\n configResolved(config: ResolvedConfig) {\r\n pluginState.root = config.root\r\n pluginState.isDev = config.command === \"serve\"\r\n },\r\n\r\n transform(source: string, id: string) {\r\n const filepath = id.split(\"?\")[0]\r\n if (!include.test(filepath)) return null\r\n if (exclude.test(filepath)) return null\r\n\r\n const loaderOptions: ViteLoaderOptions = {\r\n mode: \"zero-runtime\",\r\n addDataAttr: pluginState.isDev,\r\n filename: filepath,\r\n preserveImports: true,\r\n }\r\n\r\n let output: ViteLoaderOutput\r\n try {\r\n output = transformRunner({\r\n filepath,\r\n source,\r\n options: loaderOptions,\r\n isDev: pluginState.isDev,\r\n })\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n console.warn(`[tailwind-styled-v4] Transform skipped for ${filepath}: ${message}`)\r\n return null\r\n }\r\n\r\n if (!output.changed) return null\r\n return { code: output.code, map: null }\r\n },\r\n\r\n async buildEnd() {\r\n if (pluginState.isDev) return\r\n\r\n const engine = await engineFactory({\r\n root: pluginState.root,\r\n compileCss: true,\r\n analyze,\r\n scanner: {\r\n includeExtensions: SCAN_EXTENSIONS,\r\n },\r\n })\r\n\r\n try {\r\n const scan = filterScanToDirs(await engine.scanWorkspace(), pluginState.root, scanDirs)\r\n\r\n if (doSafelist) {\r\n writeJsonArtifact(pluginState.root, safelistOutput, scan.uniqueClasses)\r\n }\r\n\r\n writeJsonArtifact(pluginState.root, scanReportOutput, {\r\n root: pluginState.root,\r\n totalFiles: scan.totalFiles,\r\n uniqueClassCount: scan.uniqueClasses.length,\r\n })\r\n } catch (error) {\r\n console.warn(\"[tailwind-styled-v4] Engine scan phase failed:\", error)\r\n }\r\n\r\n if (!useEngineBuild) return\r\n\r\n try {\r\n await engine.build()\r\n console.log(\"[tailwind-styled-v4] Engine build complete\")\r\n } catch (error) {\r\n const msg = `[tailwind-styled-v4] Engine build step failed: ${error}`\r\n if (strict) {\r\n throw new Error(msg)\r\n }\r\n console.warn(msg)\r\n }\r\n },\r\n\r\n handleHotUpdate({ file, server }: HmrContext) {\r\n if (include.test(file) && !exclude.test(file)) {\r\n server.ws.send({ type: \"full-reload\" })\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport default tailwindStyledPlugin\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../packages/domain/shared/src/trace.ts","../packages/domain/shared/src/error-codes.ts","../packages/domain/shared/src/compatibility.ts","../packages/domain/shared/src/native-schemas.ts","../packages/domain/shared/src/esmHelpers.ts","../packages/domain/shared/src/telemetry.ts","../packages/domain/shared/src/configSchemas.ts","../packages/domain/shared/src/workerResolver.ts","../packages/domain/shared/src/codegen.ts","../packages/domain/shared/src/native-resolution.ts","../packages/domain/shared/src/observability.ts","../packages/domain/shared/src/index.ts","../packages/domain/compiler/src/nativeBridge.ts","../packages/domain/compiler/src/tailwindEngine.ts","../packages/domain/scanner/src/native-bridge.ts","../packages/domain/scanner/src/cache-native.ts","../packages/domain/scanner/src/parallel-scanner.ts","../packages/domain/scanner/src/schemas.ts","../packages/domain/scanner/src/index.ts","../packages/domain/engine/src/native-bridge.ts","../packages/domain/compiler/src/index.ts","../packages/domain/analyzer/src/analyzeWorkspace.ts","../packages/domain/analyzer/src/binding.ts","../packages/domain/analyzer/src/utils.ts","../packages/domain/analyzer/src/schemas.ts","../packages/domain/analyzer/src/semantic.ts","../packages/domain/engine/src/index.ts","../packages/domain/engine/src/incremental.ts","../packages/domain/engine/src/metrics.ts","../packages/domain/engine/src/metricsWriter.ts","../packages/domain/engine/src/plugin-api.ts","../packages/domain/engine/src/schemas.ts","../packages/domain/engine/src/watch.ts","../packages/presentation/vite/src/schemas.ts","../packages/presentation/vite/src/plugin.ts"],"names":["path","z","isBrowser","exports","fs","createRequire","_require","fileURLToPath","createHash","require","getDirname","log","scannerGetBinding","resolve","Worker","availableParallelism","init_src","isMainThread","parentPort","workerData","formatIssuePath","src_exports","scanFileNative","scanWorkspaceNative","init_native_bridge","runCssPipeline","formatErrorMessage","formatIssues","parseWithSchema","extractClassesNative","pathToFileURL","DEFAULT_EXTENSIONS","existing","resolveNativeBinary"],"mappings":"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","file":"vite.js","sourcesContent":["/**\r\n * Shared trace utilities for CLI, devtools, and dashboard\r\n * \r\n * Provides reusable trace snapshot handling, formatting, and analysis\r\n * across the tailwind-styled-v4 ecosystem without introducing coupling.\r\n */\r\n\r\nexport interface TraceSnapshot {\r\n generatedAt: string\r\n buildMs: number | null\r\n scanMs: number | null\r\n analyzeMs: number | null\r\n compileMs: number | null\r\n memoryMb: { rss: number; heapUsed: number; heapTotal: number } | null\r\n classCount: number | null\r\n fileCount: number | null\r\n cssBytes: number | null\r\n mode: string | null\r\n eventsReceived?: number\r\n eventsProcessed?: number\r\n batchesProcessed?: number\r\n incrementalUpdates?: number\r\n fullRescans?: number\r\n}\r\n\r\nexport interface TraceSummary {\r\n workspace: {\r\n totalPackages: number\r\n totalFiles: number\r\n totalClasses: number\r\n lastScanDurationMs: number\r\n lastBuildDurationMs: number\r\n }\r\n cache: {\r\n hitRate: number\r\n totalEntries: number\r\n memoryUsageMb: number\r\n }\r\n pipeline: {\r\n scanDurationMs: number\r\n analyzeDurationMs: number\r\n compileDurationMs: number\r\n totalDurationMs: number\r\n }\r\n health: {\r\n status: \"healthy\" | \"degraded\" | \"unhealthy\"\r\n issues: Array<{ severity: string; message: string }>\r\n }\r\n}\r\n\r\n/**\r\n * Get health status color for UI rendering\r\n */\r\nexport function getHealthColor(status?: string): string {\r\n switch (status) {\r\n case \"healthy\":\r\n return \"#34d399\"\r\n case \"degraded\":\r\n return \"#fbbf24\"\r\n case \"unhealthy\":\r\n return \"#f87171\"\r\n default:\r\n return \"#52525b\"\r\n }\r\n}\r\n\r\n/**\r\n * Get mode color for UI rendering\r\n */\r\nexport function getModeColor(mode?: string | null): string {\r\n switch (mode) {\r\n case \"build\":\r\n return \"#fbbf24\"\r\n case \"watch\":\r\n return \"#34d399\"\r\n case \"jit\":\r\n return \"#60a5fa\"\r\n case \"error\":\r\n return \"#f87171\"\r\n case \"idle\":\r\n return \"#71717a\"\r\n default:\r\n return \"#52525b\"\r\n }\r\n}\r\n\r\n/**\r\n * Format memory in human-readable format\r\n */\r\nexport function formatMemory(bytes: number): string {\r\n if (bytes < 1024) return `${Math.round(bytes)}B`\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`\r\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`\r\n}\r\n\r\n/**\r\n * Format duration in human-readable format\r\n */\r\nexport function formatDuration(ms: number | null): string {\r\n if (ms === null) return \"—\"\r\n if (ms < 1000) return `${ms}ms`\r\n return `${(ms / 1000).toFixed(1)}s`\r\n}\r\n\r\n/**\r\n * Calculate health status from metrics\r\n */\r\nexport function calculateHealth(\r\n metrics: TraceSnapshot,\r\n summary?: TraceSummary\r\n): \"healthy\" | \"degraded\" | \"unhealthy\" {\r\n if (summary?.health?.status) return summary.health.status\r\n\r\n // Fallback to simple heuristics\r\n if (metrics.mode === \"error\") return \"unhealthy\"\r\n if ((metrics.buildMs ?? 0) > 5000) return \"degraded\"\r\n if (metrics.memoryMb && metrics.memoryMb.heapUsed > 500) return \"degraded\"\r\n return \"healthy\"\r\n}\r\n\r\n/**\r\n * Get color for build time indicator\r\n */\r\nexport function getBuildTimeColor(ms: number | null): string {\r\n if (ms === null) return \"#52525b\"\r\n if (ms > 1000) return \"#f87171\" // red - very slow\r\n if (ms > 500) return \"#fbbf24\" // amber - acceptable\r\n return \"#34d399\" // green - fast\r\n}\r\n\r\n/**\r\n * Get color for memory usage indicator\r\n */\r\nexport function getMemoryColor(mb: number): string {\r\n if (mb > 500) return \"#f87171\" // red - high\r\n if (mb > 250) return \"#fbbf24\" // amber - moderate\r\n return \"#34d399\" // green - low\r\n}\r\n\r\n/**\r\n * Create trace snapshot from dashboard data\r\n */\r\nexport function createTraceSnapshot(data: Record<string, unknown>): TraceSnapshot {\r\n return {\r\n generatedAt: (data.generatedAt as string) || new Date().toISOString(),\r\n buildMs: (data.buildMs as number) ?? null,\r\n scanMs: (data.scanMs as number) ?? null,\r\n analyzeMs: (data.analyzeMs as number) ?? null,\r\n compileMs: (data.compileMs as number) ?? null,\r\n memoryMb: (data.memoryMb as { rss: number; heapUsed: number; heapTotal: number } | null) ?? null,\r\n classCount: (data.classCount as number) ?? null,\r\n fileCount: (data.fileCount as number) ?? null,\r\n cssBytes: (data.cssBytes as number) ?? null,\r\n mode: (data.mode as string) ?? null,\r\n eventsReceived: (data.eventsReceived as number | undefined) ?? undefined,\r\n eventsProcessed: (data.eventsProcessed as number | undefined) ?? undefined,\r\n batchesProcessed: (data.batchesProcessed as number | undefined) ?? undefined,\r\n incrementalUpdates: (data.incrementalUpdates as number | undefined) ?? undefined,\r\n fullRescans: (data.fullRescans as number | undefined) ?? undefined,\r\n }\r\n}\r\n\r\n/**\r\n * Calculate pipeline time distribution\r\n */\r\nexport function getPipelinePercentages(metrics: TraceSnapshot): {\r\n scanPct: number\r\n analyzePct: number\r\n compilePct: number\r\n} {\r\n const scan = metrics.scanMs ?? 0\r\n const analyze = metrics.analyzeMs ?? 0\r\n const compile = metrics.compileMs ?? 0\r\n const total = scan + analyze + compile\r\n\r\n if (total === 0) {\r\n return { scanPct: 0, analyzePct: 0, compilePct: 0 }\r\n }\r\n\r\n return {\r\n scanPct: (scan / total) * 100,\r\n analyzePct: (analyze / total) * 100,\r\n compilePct: (compile / total) * 100,\r\n }\r\n}\r\n","/**\r\n * Error code registry — single source of truth for all error codes.\r\n *\r\n * Format: E[0-9]xx for errors, W[0-9]xx for warnings.\r\n * Use with TwError for consistent error handling.\r\n */\r\n\r\nexport const ERROR_CODES = {\r\n // E0xx — Native binding\r\n NATIVE_NOT_FOUND: \"E001\",\r\n NATIVE_LOAD_FAILED: \"E002\",\r\n NATIVE_VERSION_MISMATCH: \"E003\",\r\n SCANNER_NATIVE_NOT_FOUND: \"E004\",\r\n SCANNER_HASH_FAILED: \"E005\",\r\n NATIVE_TRANSFORM_UNAVAILABLE: \"E006\",\r\n\r\n // E2xx — Compilation\r\n MISSING_REACT_IMPORT: \"E201\",\r\n UNSUPPORTED_PATTERN: \"E202\",\r\n TEMPLATE_PARSE_ERROR: \"E203\",\r\n COMPILE_TIMEOUT: \"E204\",\r\n\r\n // E3xx — Compatibility\r\n TAILWIND_VERSION_UNSUPPORTED: \"E301\",\r\n NODE_VERSION_UNSUPPORTED: \"E302\",\r\n\r\n // E4xx — Cache\r\n CACHE_READ_FAILED: \"E401\",\r\n CACHE_WRITE_FAILED: \"E402\",\r\n CACHE_CORRUPTED: \"E403\",\r\n\r\n // E5xx — RSC\r\n RSC_BOUNDARY_CONFLICT: \"E501\",\r\n\r\n // W1xx — Warnings\r\n DYNAMIC_CONTENT: \"W101\",\r\n INVALID_VARIANT_VALUE: \"W201\",\r\n DEPRECATED_MODE: \"W301\",\r\n} as const\r\n\r\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES]\r\n\r\nconst ERROR_SUGGESTIONS: Record<string, string> = {\r\n E001: \"Run: npm install @tailwind-styled/native-{platform} or build from source\",\r\n E002: \"Try: npm rebuild or reinstall the package\",\r\n E003: \"Run: npm install tailwind-styled-v4@latest to sync versions\",\r\n E004: \"Run: npm install @tailwind-styled/scanner\",\r\n E006: \"Run: npm install @tailwind-styled/compiler\",\r\n E301: \"Upgrade: npm install tailwindcss@^4\",\r\n}\r\n\r\nexport function getSuggestion(code: string): string | undefined {\r\n return ERROR_SUGGESTIONS[code]\r\n}\r\n\r\nexport function formatErrorCode(code: string): string {\r\n const prefix = code.startsWith(\"E\") ? \"Error\" : code.startsWith(\"W\") ? \"Warning\" : \"Code\"\r\n return `[${prefix} ${code}]`\r\n}\r\n","/**\r\n * Tailwind CSS version detection and compatibility checks.\r\n *\r\n * tailwind-styled-v4 requires Tailwind CSS v4.x.\r\n * This module detects the installed version and provides\r\n * clear error messages for unsupported versions.\r\n */\r\n\r\nexport interface TailwindInfo {\r\n version: string\r\n major: number\r\n supported: boolean\r\n path: string | null\r\n}\r\n\r\nexport function detectTailwind(): TailwindInfo {\r\n try {\r\n const pkgPath = require.resolve(\"tailwindcss/package.json\")\r\n const { version } = require(pkgPath)\r\n const major = Number.parseInt(version.split(\".\")[0], 10)\r\n return { version, major, supported: major >= 4, path: pkgPath }\r\n } catch {\r\n return { version: \"not-installed\", major: 0, supported: false, path: null }\r\n }\r\n}\r\n\r\nexport function assertTailwindV4(): void {\r\n const info = detectTailwind()\r\n if (!info.supported) {\r\n const message = info.major === 0\r\n ? \"tailwindcss is not installed. Run: npm install tailwindcss@^4\"\r\n : `tailwind-styled-v4 requires Tailwind CSS v4.x. Found: v${info.version}. Upgrade: npm install tailwindcss@^4`\r\n\r\n if (process.env.NODE_ENV !== \"production\") {\r\n console.warn(`[tailwind-styled] ${message}`)\r\n }\r\n }\r\n}\r\n\r\nexport function getTailwindVersion(): string {\r\n return detectTailwind().version\r\n}\r\n\r\nexport function isTailwindV4(): boolean {\r\n return detectTailwind().supported\r\n}\r\n","/**\r\n * Zod schemas untuk validasi native binding responses.\r\n *\r\n * Dipakai untuk memvalidasi data yang datang dari Rust native bindings\r\n * sebelum masuk ke domain logic TypeScript.\r\n *\r\n * Pattern:\r\n * const raw = native.scanWorkspace(root)\r\n * const validated = NativeScanResultSchema.parse(raw)\r\n * // Setelah ini, gunakan `validated` (trusted typed object)\r\n */\r\nimport { z } from \"zod\"\r\n\r\n// ── Scan ─────────────────────────────────────────────────────────────────────\r\n\r\nexport const NativeScanFileSchema = z.object({\r\n file: z.string().min(1, \"file path cannot be empty\"),\r\n classes: z.array(z.string()),\r\n hash: z.string().optional(),\r\n})\r\n\r\nexport type NativeScanFile = z.infer<typeof NativeScanFileSchema>\r\n\r\nexport const NativeScanResultSchema = z.object({\r\n files: z.array(NativeScanFileSchema),\r\n totalFiles: z.number().int().nonnegative(),\r\n uniqueClasses: z.array(z.string()),\r\n})\r\n\r\nexport type NativeScanResult = z.infer<typeof NativeScanResultSchema>\r\n\r\n// ── Analyzer ──────────────────────────────────────────────────────────────────\r\n\r\nexport const NativeClassUsageSchema = z.object({\r\n name: z.string(),\r\n count: z.number().int().nonnegative(),\r\n files: z.array(z.string()).optional(),\r\n})\r\n\r\nexport type NativeClassUsage = z.infer<typeof NativeClassUsageSchema>\r\n\r\nexport const NativeAnalyzerReportSchema = z.object({\r\n root: z.string(),\r\n topClasses: z.array(NativeClassUsageSchema).optional(),\r\n safelist: z.array(z.string()).optional(),\r\n css: z.string().optional(),\r\n conflicts: z.array(z.unknown()).optional(),\r\n unusedClasses: z.array(z.string()).optional(),\r\n durationMs: z.number().nonnegative().optional(),\r\n})\r\n\r\nexport type NativeAnalyzerReport = z.infer<typeof NativeAnalyzerReportSchema>\r\n\r\n// ── Transform ─────────────────────────────────────────────────────────────────\r\n\r\nexport const NativeTransformResultSchema = z.object({\r\n code: z.string(),\r\n classes: z.array(z.string()),\r\n changed: z.boolean(),\r\n rsc: z.object({\r\n isServer: z.boolean(),\r\n needsClientDirective: z.boolean(),\r\n clientReasons: z.array(z.string()),\r\n }).optional(),\r\n})\r\n\r\nexport type NativeTransformResult = z.infer<typeof NativeTransformResultSchema>\r\n\r\n// ── CSS Compile ───────────────────────────────────────────────────────────────\r\n\r\nexport const NativeCssCompileResultSchema = z.object({\r\n css: z.string(),\r\n resolvedClasses: z.array(z.string()),\r\n unresolvedClasses: z.array(z.string()).optional(),\r\n})\r\n\r\nexport type NativeCssCompileResult = z.infer<typeof NativeCssCompileResultSchema>\r\n\r\n// ── Watch ────────────────────────────────────────────────────────────────────\r\n\r\nexport const NativeWatchEventSchema = z.object({\r\n type: z.enum([\"change\", \"unlink\", \"create\"]),\r\n path: z.string(),\r\n})\r\n\r\nexport type NativeWatchEvent = z.infer<typeof NativeWatchEventSchema>\r\n\r\nexport const NativeWatchResultSchema = z.object({\r\n status: z.enum([\"ok\", \"error\"]),\r\n handleId: z.string().optional(),\r\n error: z.string().optional(),\r\n})\r\n\r\nexport type NativeWatchResult = z.infer<typeof NativeWatchResultSchema>\r\n\r\n// ── Cache ────────────────────────────────────────────────────────────────────\r\n\r\nexport const NativeCacheEntrySchema = z.object({\r\n file: z.string(),\r\n hash: z.string(),\r\n classes: z.array(z.string()),\r\n timestamp: z.number(),\r\n size: z.number().optional(),\r\n})\r\n\r\nexport type NativeCacheEntry = z.infer<typeof NativeCacheEntrySchema>\r\n\r\nexport const NativeCacheReadResultSchema = z.object({\r\n entries: z.array(NativeCacheEntrySchema),\r\n version: z.string().optional(),\r\n})\r\n\r\nexport type NativeCacheReadResult = z.infer<typeof NativeCacheReadResultSchema>\r\n\r\n// ── Helpers ───────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Validasi native binding response dengan fallback ke nilai default.\r\n * Gunakan ini di hot path agar tidak crash saat native returns unexpected shape.\r\n *\r\n * @example\r\n * const raw = native.scanWorkspace(root)\r\n * const result = safeParseNative(NativeScanResultSchema, raw, {\r\n * files: [], totalFiles: 0, uniqueClasses: []\r\n * })\r\n */\r\nexport function safeParseNative<T>(\r\n schema: z.ZodType<T>,\r\n data: unknown,\r\n fallback: T\r\n): T {\r\n const result = schema.safeParse(data)\r\n return result.success ? result.data : fallback\r\n}\r\n\r\n/**\r\n * Parse native response — throw TwError jika gagal.\r\n * Gunakan ini di boundary entry points.\r\n */\r\nexport function parseNative<T>(schema: z.ZodType<T>, data: unknown, context: string): T {\r\n const result = schema.safeParse(data)\r\n if (!result.success) {\r\n const first = result.error.issues[0]\r\n const path = first?.path?.join(\".\") ?? \"(root)\"\r\n throw new Error(\r\n `[${context}] Native binding returned unexpected data: ${path}: ${first?.message ?? \"validation failed\"}`\r\n )\r\n }\r\n return result.data\r\n}\r\n","/**\r\n * ESM-safe runtime helpers untuk monorepo.\r\n *\r\n * Menggantikan pola fragile seperti:\r\n * - `createRequire(import.meta.url)` → gunakan `createEsmRequire()`\r\n * - `__dirname` → gunakan `getDirname(import.meta.url)`\r\n * - `__filename` → gunakan `getFilename(import.meta.url)`\r\n *\r\n * Semua helper ini bekerja di ESM dan CJS.\r\n *\r\n * @module @tailwind-styled/shared/esmHelpers\r\n */\r\n\r\nconst isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\r\n\r\n// Safe check for require availability - works in both CJS and ESM\r\nlet nodeModuleRef: any = null\r\nfunction getNodeModuleRef() {\r\n if (isBrowser) return null\r\n if (nodeModuleRef !== null) return nodeModuleRef\r\n try {\r\n // Test if require actually works\r\n const test = typeof require === 'function' ? require('node:module') : null\r\n nodeModuleRef = test\r\n return test\r\n } catch {\r\n nodeModuleRef = null\r\n return null\r\n }\r\n}\r\n\r\nlet _nodePath: any = null\r\nlet _nodeUrl: any = null\r\nlet _nodeFs: any = null\r\nlet _nodeCrypto: any = null\r\nlet _nodeOs: any = null\r\n\r\nfunction getNodePath() {\r\n if (isBrowser) throw new Error(\"node:path not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodePath) _nodePath = nodeRequire.createRequire(import.meta.url)(\"node:path\")\r\n return _nodePath!\r\n}\r\nfunction getNodeUrl() {\r\n if (isBrowser) throw new Error(\"node:url not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeUrl) _nodeUrl = nodeRequire.createRequire(import.meta.url)(\"node:url\")\r\n return _nodeUrl!\r\n}\r\nfunction getNodeFs() {\r\n if (isBrowser) throw new Error(\"node:fs not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeFs) _nodeFs = nodeRequire.createRequire(import.meta.url)(\"node:fs\")\r\n return _nodeFs!\r\n}\r\nfunction getNodeCrypto() {\r\n if (isBrowser) throw new Error(\"node:crypto not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeCrypto) _nodeCrypto = nodeRequire.createRequire(import.meta.url)(\"node:crypto\")\r\n return _nodeCrypto!\r\n}\r\nfunction getNodeOs() {\r\n if (isBrowser) throw new Error(\"node:os not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n if (!_nodeOs) _nodeOs = nodeRequire.createRequire(import.meta.url)(\"node:os\")\r\n return _nodeOs!\r\n}\r\n\r\n/**\r\n * Buat `require()` function yang relative terhadap sebuah ESM module.\r\n *\r\n * @example\r\n * // Ganti: createRequire(import.meta.url)(\"some-pkg\")\r\n * const req = createEsmRequire(import.meta.url)\r\n * const mod = req(\"some-pkg\")\r\n */\r\nexport function createEsmRequire(importMetaUrl: string): NodeRequire {\r\n if (isBrowser) throw new Error(\"require not available in browser\")\r\n const nodeRequire = getNodeModuleRef()\r\n if (!nodeRequire) throw new Error(\"require not available\")\r\n return nodeRequire.createRequire(importMetaUrl)\r\n}\r\n\r\n/**\r\n * Dapat `__dirname` dari `import.meta.url`.\r\n *\r\n * @example\r\n * // Ganti: const __dirname = ...\r\n * const dir = getDirname(import.meta.url)\r\n */\r\nexport function getDirname(importMetaUrl: string): string {\r\n if (isBrowser) return \"\"\r\n const nodePath = getNodePath()\r\n const nodeUrl = getNodeUrl()\r\n return nodePath.dirname(nodeUrl.fileURLToPath(importMetaUrl))\r\n}\r\n\r\n/**\r\n * Dapat `__filename` dari `import.meta.url`.\r\n */\r\nexport function getFilename(importMetaUrl: string): string {\r\n if (isBrowser) return \"\"\r\n return getNodeUrl().fileURLToPath(importMetaUrl)\r\n}\r\n\r\n/**\r\n * Resolve path dari root monorepo (bukan CWD).\r\n * Berguna untuk scripts dan tools yang dipanggil dari lokasi berbeda.\r\n *\r\n * @example\r\n * const root = resolveFromRoot(\"packages/domain/shared/src\")\r\n */\r\nexport function resolveFromRoot(...segments: string[]): string {\r\n if (isBrowser) return segments.join(\"/\")\r\n\r\n const nodePath = getNodePath()\r\n const nodeFs = getNodeFs()\r\n \r\n let dir = getDirname(import.meta.url)\r\n for (let i = 0; i < 10; i++) {\r\n const pkgPath = nodePath.join(dir, \"package.json\")\r\n try {\r\n const pkg = JSON.parse(nodeFs.readFileSync(pkgPath, \"utf-8\"))\r\n if (pkg.workspaces) {\r\n return nodePath.resolve(dir, ...segments)\r\n }\r\n } catch { /* intentionally silent */ }\r\n dir = nodePath.dirname(dir)\r\n }\r\n return nodePath.resolve(process.cwd(), ...segments)\r\n}\r\n\r\n/**\r\n * Require sebuah module dengan fallback ke null jika tidak tersedia.\r\n * Berguna untuk optional dependencies.\r\n *\r\n * @example\r\n * const oxc = tryRequire(\"oxc-parser\", import.meta.url)\r\n * if (!oxc) console.warn(\"oxc-parser not installed\")\r\n */\r\nexport function tryRequire<T = unknown>(\r\n moduleName: string,\r\n importMetaUrl: string\r\n): T | null {\r\n if (isBrowser) return null\r\n try {\r\n return createEsmRequire(importMetaUrl)(moduleName) as T\r\n } catch { /* intentionally silent — optional dep */ }\r\n return null\r\n}\r\n\r\n/**\r\n * Resolve .node binary path yang cross-platform dan ESM-safe.\r\n * Menggantikan pola `path.resolve(__dirname, \"../native.node\")`.\r\n */\r\nexport function resolveNativeNodePath(\r\n importMetaUrl: string,\r\n ...relativeSegments: string[]\r\n): string {\r\n if (isBrowser) return relativeSegments.join(\"/\")\r\n return getNodePath().resolve(getDirname(importMetaUrl), ...relativeSegments)\r\n}\r\n","/**\r\n * Build performance telemetry untuk tailwind-styled-v4.\r\n * QA #14: Visibility ke build performance — scan speed, cache hit rate, trends.\r\n *\r\n * Design: zero-dependency, ring-buffer based, opt-in via TWS_TELEMETRY=1.\r\n */\r\n\r\nexport interface BuildPhases {\r\n scan: number\r\n compile: number\r\n engine: number\r\n output: number\r\n}\r\n\r\nexport interface BuildTelemetry {\r\n timestamp: number\r\n durationMs: number\r\n filesScanned: number\r\n filesCached: number\r\n classesExtracted: number\r\n nativeVersion?: string\r\n phases: BuildPhases\r\n cacheHitRate: number\r\n mode?: string\r\n}\r\n\r\nexport interface TelemetrySummary {\r\n totalBuilds: number\r\n avgDurationMs: number\r\n p95DurationMs: number\r\n avgCacheHitRate: number\r\n avgFilesScanned: number\r\n avgClassesExtracted: number\r\n phaseAvgs: BuildPhases\r\n slowestBuildMs: number\r\n fastestBuildMs: number\r\n}\r\n\r\nconst RING_BUFFER_SIZE = 100\r\n\r\nexport class TelemetryCollector {\r\n private data: BuildTelemetry[] = []\r\n private enabled: boolean\r\n\r\n constructor(enabled?: boolean) {\r\n this.enabled =\r\n enabled ??\r\n (process.env.TWS_TELEMETRY === \"1\" || process.env.TWS_TELEMETRY === \"true\")\r\n }\r\n\r\n record(build: BuildTelemetry): void {\r\n if (!this.enabled) return\r\n if (this.data.length >= RING_BUFFER_SIZE) {\r\n this.data.shift() // ring buffer — hapus entri tertua\r\n }\r\n this.data.push(build)\r\n }\r\n\r\n snapshot(): BuildTelemetry[] {\r\n return [...this.data]\r\n }\r\n\r\n summary(): TelemetrySummary | null {\r\n if (this.data.length === 0) return null\r\n\r\n const durations = this.data.map(d => d.durationMs).sort((a, b) => a - b)\r\n const p95Idx = Math.floor(durations.length * 0.95)\r\n\r\n const avg = (arr: number[]) => arr.reduce((a, b) => a + b, 0) / arr.length\r\n\r\n return {\r\n totalBuilds: this.data.length,\r\n avgDurationMs: avg(durations),\r\n p95DurationMs: durations[p95Idx] ?? durations[durations.length - 1] ?? 0,\r\n avgCacheHitRate: avg(this.data.map(d => d.cacheHitRate)),\r\n avgFilesScanned: avg(this.data.map(d => d.filesScanned)),\r\n avgClassesExtracted: avg(this.data.map(d => d.classesExtracted)),\r\n phaseAvgs: {\r\n scan: avg(this.data.map(d => d.phases.scan)),\r\n compile: avg(this.data.map(d => d.phases.compile)),\r\n engine: avg(this.data.map(d => d.phases.engine)),\r\n output: avg(this.data.map(d => d.phases.output)),\r\n },\r\n slowestBuildMs: durations[durations.length - 1] ?? 0,\r\n fastestBuildMs: durations[0] ?? 0,\r\n }\r\n }\r\n\r\n reset(): void {\r\n this.data = []\r\n }\r\n\r\n /** Format ringkas untuk CLI output */\r\n formatCli(): string {\r\n const s = this.summary()\r\n if (!s) return \"[telemetry] no data\"\r\n return [\r\n `[telemetry] ${s.totalBuilds} builds`,\r\n `avg ${s.avgDurationMs.toFixed(0)}ms`,\r\n `p95 ${s.p95DurationMs.toFixed(0)}ms`,\r\n `cache hit ${(s.avgCacheHitRate * 100).toFixed(0)}%`,\r\n `${s.avgFilesScanned.toFixed(0)} files`,\r\n ].join(\" · \")\r\n }\r\n\r\n /** Export sebagai JSON untuk dashboard/prometheus */\r\n toJSON(): object {\r\n return {\r\n summary: this.summary(),\r\n history: this.data.slice(-20), // last 20 builds\r\n }\r\n }\r\n}\r\n\r\n/** Global singleton telemetry collector */\r\nlet _globalCollector: TelemetryCollector | null = null\r\n\r\nexport function getGlobalTelemetry(): TelemetryCollector {\r\n if (!_globalCollector) {\r\n _globalCollector = new TelemetryCollector()\r\n }\r\n return _globalCollector\r\n}\r\n\r\nexport function resetGlobalTelemetry(): void {\r\n _globalCollector = null\r\n}\r\n\r\n/** Helper untuk record build dengan timing otomatis */\r\nexport function createBuildTimer() {\r\n const start = Date.now()\r\n const phases: Partial<BuildPhases> = {}\r\n let phaseStart = start\r\n\r\n return {\r\n phase(name: keyof BuildPhases): void {\r\n const now = Date.now()\r\n phases[name] = now - phaseStart\r\n phaseStart = now\r\n },\r\n finish(opts: Omit<BuildTelemetry, \"timestamp\" | \"durationMs\" | \"phases\" | \"cacheHitRate\"> & {\r\n cacheHitRate?: number\r\n }): BuildTelemetry {\r\n const now = Date.now()\r\n const record: BuildTelemetry = {\r\n timestamp: start,\r\n durationMs: now - start,\r\n phases: {\r\n scan: phases.scan ?? 0,\r\n compile: phases.compile ?? 0,\r\n engine: phases.engine ?? 0,\r\n output: phases.output ?? now - start,\r\n },\r\n cacheHitRate: opts.cacheHitRate ?? 0,\r\n ...opts,\r\n }\r\n getGlobalTelemetry().record(record)\r\n return record\r\n },\r\n }\r\n}\r\n","/**\r\n * Zod schemas untuk JSON, cache, manifest, dan config reads.\r\n * PLAN.md: \"JSON, cache, manifest, and config reads should be parsed into typed schema-backed values\"\r\n *\r\n * Pattern: validate at the I/O boundary, pass typed values inward.\r\n */\r\nimport { z } from \"zod\"\r\n\r\n// ── Scan Cache ────────────────────────────────────────────────────────────────\r\n\r\n/** Schema untuk .tailwind-styled/scan-cache.json */\r\nexport const ScanCacheClassEntrySchema = z.object({\r\n name: z.string().min(1),\r\n usedIn: z.array(z.string()),\r\n risk: z.enum([\"low\", \"medium\", \"high\"]).default(\"low\"),\r\n bundleContribution: z.number().nonnegative().default(0),\r\n variants: z.array(z.string()).default([]),\r\n})\r\nexport type ScanCacheClassEntry = z.infer<typeof ScanCacheClassEntrySchema>\r\n\r\nexport const ScanCacheSchema = z.object({\r\n version: z.string().default(\"1\"),\r\n generatedAt: z.string(),\r\n root: z.string(),\r\n classNames: z.array(ScanCacheClassEntrySchema),\r\n totalFiles: z.number().int().nonnegative(),\r\n uniqueCount: z.number().int().nonnegative(),\r\n})\r\nexport type ScanCache = z.infer<typeof ScanCacheSchema>\r\n\r\n// ── Tailwind Config ───────────────────────────────────────────────────────────\r\n\r\nexport const TailwindContentItemSchema = z.union([\r\n z.string(),\r\n z.object({\r\n raw: z.string(),\r\n extension: z.string().optional(),\r\n }),\r\n z.object({\r\n files: z.array(z.string()),\r\n transform: z.record(z.string(), z.unknown()).optional(),\r\n }),\r\n])\r\n\r\nexport const TailwindConfigSchema = z.object({\r\n content: z.array(TailwindContentItemSchema).optional(),\r\n theme: z.record(z.string(), z.unknown()).optional(),\r\n plugins: z.array(z.unknown()).optional(),\r\n darkMode: z.union([z.literal(\"class\"), z.literal(\"media\"), z.literal(false)]).optional(),\r\n prefix: z.string().optional(),\r\n safelist: z.array(z.union([z.string(), z.object({ pattern: z.instanceof(RegExp) })])).optional(),\r\n blocklist: z.array(z.string()).optional(),\r\n}).passthrough() // Allow additional Tailwind v4 config keys\r\nexport type TailwindConfig = z.infer<typeof TailwindConfigSchema>\r\n\r\n// ── Plugin Registry Entry ─────────────────────────────────────────────────────\r\n\r\nexport const RegistryPluginEntrySchema = z.object({\r\n name: z.string().min(1),\r\n description: z.string(),\r\n version: z.string(),\r\n tags: z.array(z.string()).default([]),\r\n official: z.boolean().default(false),\r\n docs: z.string().url().optional(),\r\n install: z.string().optional(),\r\n integrity: z.string().optional(),\r\n})\r\nexport type RegistryPluginEntry = z.infer<typeof RegistryPluginEntrySchema>\r\n\r\nexport const RegistryFileSchema = z.object({\r\n version: z.string(),\r\n official: z.array(RegistryPluginEntrySchema).default([]),\r\n community: z.array(RegistryPluginEntrySchema).default([]),\r\n})\r\nexport type RegistryFile = z.infer<typeof RegistryFileSchema>\r\n\r\n// ── Package.json (minimal) ────────────────────────────────────────────────────\r\n\r\nexport const PackageJsonSchema = z.object({\r\n name: z.string(),\r\n version: z.string(),\r\n scripts: z.record(z.string(), z.string()).optional(),\r\n dependencies: z.record(z.string(), z.string()).optional(),\r\n devDependencies: z.record(z.string(), z.string()).optional(),\r\n peerDependencies: z.record(z.string(), z.string()).optional(),\r\n main: z.string().optional(),\r\n module: z.string().optional(),\r\n exports: z.unknown().optional(),\r\n type: z.enum([\"module\", \"commonjs\"]).optional(),\r\n}).passthrough()\r\nexport type PackageJson = z.infer<typeof PackageJsonSchema>\r\n\r\n// ── Helpers ────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Parse JSON string dengan schema validation.\r\n * Melempar error yang human-readable jika gagal.\r\n *\r\n * @example\r\n * const cache = parseJsonWithSchema(\r\n * fs.readFileSync(\".tailwind-styled/scan-cache.json\", \"utf-8\"),\r\n * ScanCacheSchema,\r\n * \"scan-cache.json\"\r\n * )\r\n */\r\nexport function parseJsonWithSchema<T>(\r\n jsonString: string,\r\n schema: z.ZodType<T>,\r\n sourceName: string\r\n): T {\r\n let parsed: unknown\r\n try {\r\n parsed = JSON.parse(jsonString)\r\n } catch (err) {\r\n throw new Error(\r\n `[${sourceName}] Invalid JSON: ${err instanceof Error ? err.message : String(err)}`\r\n )\r\n }\r\n\r\n const result = schema.safeParse(parsed)\r\n if (!result.success) {\r\n const issues = result.error.issues\r\n .map((e) => ` ${e.path.join(\".\")}: ${e.message}`)\r\n .join(\"\\n\")\r\n throw new Error(`[${sourceName}] Schema validation failed:\\n${issues}`)\r\n }\r\n\r\n return result.data\r\n}\r\n\r\n/**\r\n * Parse JSON file dengan schema validation.\r\n *\r\n * @example\r\n * const pkg = parseJsonFileWithSchema(\"package.json\", PackageJsonSchema)\r\n */\r\nexport function parseJsonFileWithSchema<T>(\r\n filePath: string,\r\n schema: z.ZodType<T>\r\n): T {\r\n const { readFileSync } = require(\"node:fs\") as typeof import(\"node:fs\")\r\n const { basename } = require(\"node:path\") as typeof import(\"node:path\")\r\n\r\n let content: string\r\n try {\r\n content = readFileSync(filePath, \"utf-8\")\r\n } catch (err) {\r\n throw new Error(\r\n `[${basename(filePath)}] Could not read file: ${err instanceof Error ? err.message : String(err)}`\r\n )\r\n }\r\n\r\n return parseJsonWithSchema(content, schema, basename(filePath))\r\n}\r\n","/**\r\n * Worker/bootstrap path resolution untuk artifact release safety.\r\n * Dari monorepo checklist: \"Perkuat worker/bootstrap path agar artifact release aman\"\r\n *\r\n * Masalah: path ke worker/loader script bisa berbeda antara:\r\n * - Development (src/*.ts)\r\n * - Built dist (dist/*.js / dist/*.cjs)\r\n * - Packed npm artifact (dist/ saja, tanpa src/)\r\n *\r\n * Solusi: resolve path secara hierarchical dengan fallback yang eksplisit.\r\n */\r\n\r\nconst isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\r\n\r\nconst NODE_URL = typeof window === \"undefined\" || typeof document === \"undefined\" ? \"node:url\" : null\r\nconst NODE_FS = typeof window === \"undefined\" || typeof document === \"undefined\" ? \"node:fs\" : null\r\nconst NODE_PATH = typeof window === \"undefined\" || typeof document === \"undefined\" ? \"node:path\" : null\r\n\r\nfunction getDirnameFromUrl(importMetaUrl: string): string {\r\n if (!importMetaUrl) return \"\"\r\n if (isBrowser) return \"\"\r\n\r\n try {\r\n const nodeUrl = require(NODE_URL!)\r\n const nodePath = require(NODE_PATH!)\r\n // fileURLToPath returns the file path — we need the directory\r\n return nodePath.dirname(nodeUrl.fileURLToPath(importMetaUrl))\r\n } catch {\r\n if (importMetaUrl.startsWith(\"file://\")) {\r\n const filePath = importMetaUrl.slice(7)\r\n // strip the filename to get the directory\r\n const lastSlash = filePath.lastIndexOf(\"/\")\r\n return lastSlash >= 0 ? filePath.slice(0, lastSlash) : filePath\r\n }\r\n return \"\"\r\n }\r\n}\r\n\r\nfunction resolvePath(...segments: string[]): string {\r\n if (isBrowser) return segments.join(\"/\").replace(/\\/+/g, \"/\")\r\n try {\r\n const nodePath = require(NODE_PATH!)\r\n return nodePath.resolve(...segments)\r\n } catch {\r\n return segments.join(\"/\").replace(/\\/+/g, \"/\")\r\n }\r\n}\r\n\r\nfunction existsSync(path: string): boolean {\r\n if (isBrowser) return false\r\n try {\r\n const nodeFs = require(NODE_FS!)\r\n return nodeFs.existsSync(path)\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport interface WorkerPathOptions {\r\n /** Nama file worker tanpa extension */\r\n basename: string\r\n /** Import meta URL dari caller module */\r\n importMetaUrl: string\r\n /** Extensions yang dicoba secara urutan (default: [\".cjs\", \".js\", \".mjs\"]) */\r\n extensions?: string[]\r\n /** Sub-directories relatif dari runtimeDir yang dicoba */\r\n subdirs?: string[]\r\n /** Throw jika tidak ditemukan (default: true) */\r\n required?: boolean\r\n}\r\n\r\nexport interface WorkerPathResult {\r\n /** Absolute path ke worker file */\r\n path: string\r\n /** Extension yang ditemukan */\r\n extension: string\r\n /** Apakah ini dari CJS atau ESM artifact */\r\n format: \"cjs\" | \"esm\"\r\n}\r\n\r\n/**\r\n * Resolve worker/loader script path yang aman untuk release artifacts.\r\n *\r\n * Prioritas:\r\n * 1. CJS (.cjs) — untuk Node.js workers yang butuh require()\r\n * 2. JS (.js) — bundled output\r\n * 3. MJS (.mjs) — explicit ESM\r\n *\r\n * @example\r\n * const workerPath = resolveWorkerPath({\r\n * basename: \"scanner-worker\",\r\n * importMetaUrl: import.meta.url,\r\n * })\r\n * // → \"/path/to/dist/scanner-worker.cjs\"\r\n */\r\nexport function resolveWorkerPath(opts: WorkerPathOptions): WorkerPathResult {\r\n if (isBrowser) {\r\n throw new Error(\"Worker resolution not available in browser\")\r\n }\r\n\r\n const {\r\n basename,\r\n importMetaUrl,\r\n extensions = [\".cjs\", \".js\", \".mjs\"],\r\n subdirs = [\".\", \"workers\", \"lib\"],\r\n required = true,\r\n } = opts\r\n\r\n const runtimeDir = getDirnameFromUrl(importMetaUrl)\r\n\r\n // Try each subdir + extension combination\r\n for (const subdir of subdirs) {\r\n for (const ext of extensions) {\r\n const candidate = resolvePath(runtimeDir, subdir, `${basename}${ext}`)\r\n if (existsSync(candidate)) {\r\n return {\r\n path: candidate,\r\n extension: ext,\r\n format: ext === \".cjs\" ? \"cjs\" : \"esm\",\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (required) {\r\n const tried = subdirs.flatMap(d =>\r\n extensions.map(e => resolvePath(runtimeDir, d, `${basename}${e}`))\r\n )\r\n throw new Error(\r\n `[worker-resolver] Could not find worker script \"${basename}\".\\n` +\r\n `Tried:\\n${tried.map(p => ` - ${p}`).join(\"\\n\")}\\n` +\r\n `Ensure the package is built: npm run build`\r\n )\r\n }\r\n\r\n return { path: \"\", extension: \"\", format: \"cjs\" }\r\n}\r\n\r\n/**\r\n * Resolve loader path (untuk webpack/rspack/vite loaders).\r\n * Same as resolveWorkerPath but dengan nama yang lebih eksplisit.\r\n */\r\nexport function resolveLoaderPath(\r\n loaderBasename: string,\r\n importMetaUrl: string\r\n): string {\r\n return resolveWorkerPath({\r\n basename: loaderBasename,\r\n importMetaUrl,\r\n extensions: [\".cjs\", \".js\", \".mjs\"],\r\n subdirs: [\".\", \"loaders\", \"lib\"],\r\n }).path\r\n}","/**\r\n * Codegen helpers untuk tailwind-styled-v4.\r\n * Dari monorepo checklist: \"Tambahkan helper codegen bila memang relevan\"\r\n *\r\n * Berguna untuk:\r\n * - Generate component boilerplate dari config\r\n * - Generate type definitions dari variant schemas\r\n * - Generate Storybook stories dari cv() configs\r\n * - Generate migration codemods\r\n *\r\n * Design: tidak ada coupling ke compiler — hanya string manipulation.\r\n */\r\n\r\nexport interface ComponentCodegenOptions {\r\n /** Nama komponen (PascalCase) */\r\n name: string\r\n /** HTML tag */\r\n tag?: string\r\n /** Base classes */\r\n base?: string\r\n /** Variant definitions */\r\n variants?: Record<string, Record<string, string>>\r\n /** Default variants */\r\n defaultVariants?: Record<string, string>\r\n /** Compound variants */\r\n compoundVariants?: Array<{ class: string; [key: string]: string }>\r\n /** Framework target */\r\n framework?: \"react\" | \"vue\" | \"svelte\" | \"vanilla\"\r\n /** Include TypeScript types */\r\n withTypes?: boolean\r\n /** Include Storybook story */\r\n withStory?: boolean\r\n}\r\n\r\n/**\r\n * Generate cv() component boilerplate.\r\n *\r\n * @example\r\n * const code = generateComponentCode({\r\n * name: \"Button\",\r\n * tag: \"button\",\r\n * base: \"px-4 py-2 rounded font-medium\",\r\n * variants: {\r\n * intent: { primary: \"bg-blue-500 text-white\", danger: \"bg-red-500 text-white\" },\r\n * size: { sm: \"h-8 text-sm\", lg: \"h-12 text-lg\" },\r\n * },\r\n * defaultVariants: { intent: \"primary\", size: \"sm\" },\r\n * })\r\n */\r\nexport function generateComponentCode(opts: ComponentCodegenOptions): string {\r\n const {\r\n name,\r\n tag = \"div\",\r\n base = \"\",\r\n variants = {},\r\n defaultVariants = {},\r\n compoundVariants = [],\r\n framework = \"react\",\r\n withTypes = true,\r\n } = opts\r\n\r\n const variantKeys = Object.keys(variants)\r\n const lines: string[] = []\r\n\r\n // Imports\r\n if (framework === \"react\") {\r\n lines.push(`import { tw } from \"tailwind-styled-v4\"`)\r\n if (withTypes && variantKeys.length > 0) {\r\n lines.push(`import type { InferVariantProps } from \"tailwind-styled-v4\"`)\r\n }\r\n } else if (framework === \"vue\") {\r\n lines.push(`import { tw } from \"@tailwind-styled/vue\"`)\r\n } else if (framework === \"svelte\") {\r\n lines.push(`import { tw } from \"@tailwind-styled/svelte\"`)\r\n }\r\n\r\n lines.push(\"\")\r\n\r\n // Config object\r\n const configLines: string[] = [`export const ${name} = tw.${tag}({`]\r\n if (base) configLines.push(` base: \"${base}\",`)\r\n\r\n if (variantKeys.length > 0) {\r\n configLines.push(` variants: {`)\r\n for (const [key, values] of Object.entries(variants)) {\r\n configLines.push(` ${key}: {`)\r\n for (const [val, cls] of Object.entries(values)) {\r\n configLines.push(` ${val}: \"${cls}\",`)\r\n }\r\n configLines.push(` },`)\r\n }\r\n configLines.push(` },`)\r\n }\r\n\r\n if (compoundVariants.length > 0) {\r\n configLines.push(` compoundVariants: [`)\r\n for (const cv of compoundVariants) {\r\n const { class: cls, ...conditions } = cv\r\n const condStr = Object.entries(conditions)\r\n .map(([k, v]) => `${k}: \"${v}\"`)\r\n .join(\", \")\r\n configLines.push(` { ${condStr}, class: \"${cls}\" },`)\r\n }\r\n configLines.push(` ],`)\r\n }\r\n\r\n if (Object.keys(defaultVariants).length > 0) {\r\n configLines.push(` defaultVariants: {`)\r\n for (const [k, v] of Object.entries(defaultVariants)) {\r\n configLines.push(` ${k}: \"${v}\",`)\r\n }\r\n configLines.push(` },`)\r\n }\r\n\r\n configLines.push(`})`)\r\n lines.push(...configLines)\r\n\r\n // TypeScript type alias\r\n if (withTypes && variantKeys.length > 0 && framework === \"react\") {\r\n lines.push(\"\")\r\n lines.push(`export type ${name}Props = InferVariantProps<typeof ${name}> & {`)\r\n lines.push(` children?: React.ReactNode`)\r\n lines.push(` className?: string`)\r\n lines.push(`}`)\r\n }\r\n\r\n return lines.join(\"\\n\")\r\n}\r\n\r\n/**\r\n * Generate Storybook stories dari component config.\r\n *\r\n * @example\r\n * const stories = generateStorybookStory({ name: \"Button\", ... })\r\n */\r\nexport function generateStorybookStory(opts: ComponentCodegenOptions): string {\r\n const { name, variants = {}, defaultVariants = {} } = opts\r\n const lines: string[] = []\r\n\r\n lines.push(`import type { Meta, StoryObj } from \"@storybook/react\"`)\r\n lines.push(`import { ${name} } from \"./${name}\"`)\r\n lines.push(`import { generateArgTypes, generateDefaultArgs } from \"tailwind-styled-v4\"`)\r\n lines.push(``)\r\n lines.push(`const config = {`)\r\n if (Object.keys(variants).length > 0) {\r\n lines.push(` variants: ${JSON.stringify(variants, null, 2).replace(/^/gm, \" \")},`)\r\n }\r\n if (Object.keys(defaultVariants).length > 0) {\r\n lines.push(` defaultVariants: ${JSON.stringify(defaultVariants)},`)\r\n }\r\n lines.push(`}`)\r\n lines.push(``)\r\n lines.push(`const meta: Meta<typeof ${name}> = {`)\r\n lines.push(` title: \"Components/${name}\",`)\r\n lines.push(` component: ${name},`)\r\n lines.push(` argTypes: generateArgTypes(config),`)\r\n lines.push(` args: generateDefaultArgs(config),`)\r\n lines.push(`}`)\r\n lines.push(``)\r\n lines.push(`export default meta`)\r\n lines.push(`type Story = StoryObj<typeof ${name}>`)\r\n lines.push(``)\r\n lines.push(`export const Default: Story = {}`)\r\n\r\n // Generate one story per variant combo (up to 6)\r\n const variantEntries = Object.entries(variants)\r\n if (variantEntries.length > 0) {\r\n const [firstKey, firstValues] = variantEntries[0]\r\n const valueKeys = Object.keys(firstValues).slice(0, 4)\r\n for (const val of valueKeys) {\r\n const storyName = `${firstKey.charAt(0).toUpperCase()}${firstKey.slice(1)}${val.charAt(0).toUpperCase()}${val.slice(1)}`\r\n lines.push(``)\r\n lines.push(`export const ${storyName}: Story = {`)\r\n lines.push(` args: { ${firstKey}: \"${val}\" },`)\r\n lines.push(`}`)\r\n }\r\n }\r\n\r\n return lines.join(\"\\n\")\r\n}\r\n\r\n/**\r\n * Generate migration codemod untuk class renames.\r\n * Berguna saat ada class yang deprecated atau diganti nama.\r\n *\r\n * @example\r\n * const codemod = generateClassRenameCodemod({\r\n * \"btn-primary\": \"bg-blue-500 text-white\",\r\n * \"btn-danger\": \"bg-red-500 text-white\",\r\n * })\r\n */\r\nexport function generateClassRenameCodemod(\r\n renames: Record<string, string>,\r\n opts: { format?: \"jscodeshift\" | \"regex\"; filename?: string } = {}\r\n): string {\r\n const { format = \"regex\", filename = \"rename-classes.mjs\" } = opts\r\n const lines: string[] = []\r\n\r\n if (format === \"regex\") {\r\n lines.push(`#!/usr/bin/env node`)\r\n lines.push(`/**`)\r\n lines.push(` * Auto-generated class rename codemod`)\r\n lines.push(` * Usage: node ${filename} ./src`)\r\n lines.push(` */`)\r\n lines.push(`import fs from \"node:fs\"`)\r\n lines.push(`import path from \"node:path\"`)\r\n lines.push(`import { execSync } from \"node:child_process\"`)\r\n lines.push(``)\r\n lines.push(`const RENAMES = {`)\r\n for (const [from, to] of Object.entries(renames)) {\r\n lines.push(` \"${from}\": \"${to}\",`)\r\n }\r\n lines.push(`}`)\r\n lines.push(``)\r\n lines.push(`const dir = process.argv[2] ?? \".\"`)\r\n lines.push(`const files = execSync(\\`find \\${dir} -name \"*.tsx\" -o -name \"*.ts\" -o -name \"*.jsx\"\\`, { encoding: \"utf-8\" }).split(\"\\\\n\").filter(Boolean)`)\r\n lines.push(``)\r\n lines.push(`let total = 0`)\r\n lines.push(`for (const file of files) {`)\r\n lines.push(` let content = fs.readFileSync(file, \"utf-8\")`)\r\n lines.push(` let changed = false`)\r\n lines.push(` for (const [from, to] of Object.entries(RENAMES)) {`)\r\n lines.push(' const re = new RegExp(`\\\\\\\\b${from.replace(/[.*+?^${}()|[\\\\\\\\]\\\\\\\\]/g, \"\\\\\\\\$&\")}\\\\\\\\b`, \"g\")')\r\n lines.push(` if (re.test(content)) { content = content.replace(re, to); changed = true; total++ }`)\r\n lines.push(` }`)\r\n lines.push(` if (changed) fs.writeFileSync(file, content)`)\r\n lines.push(`}`)\r\n lines.push(`console.log(\\`Renamed \\${total} occurrences in \\${files.length} files\\`)`)\r\n }\r\n\r\n return lines.join(\"\\n\")\r\n}\r\n\r\n/**\r\n * Generate index barrel file untuk sebuah directory.\r\n *\r\n * @example\r\n * const barrel = generateBarrelFile([\"Button\", \"Card\", \"Input\"], \"src/components\")\r\n */\r\nexport function generateBarrelFile(\r\n exports: string[],\r\n dir: string,\r\n opts: { includeTypes?: boolean } = {}\r\n): string {\r\n const { includeTypes = true } = opts\r\n const lines: string[] = []\r\n lines.push(`// Auto-generated barrel file for ${dir}`)\r\n lines.push(`// Run: npx tsx scripts/generate-barrel.ts to regenerate`)\r\n lines.push(``)\r\n for (const name of exports) {\r\n lines.push(`export { default as ${name}, type ${name}Props } from \"./${name}\"`)\r\n if (includeTypes) {\r\n lines.push(`export type * from \"./${name}\"`)\r\n }\r\n }\r\n return lines.join(\"\\n\")\r\n}\r\n","/**\r\n * Prebuilt binary resolution untuk native NAPI bindings.\r\n * QA #1: Resolve native binary dari prebuilt packages atau local build.\r\n *\r\n * Prioritas:\r\n * 1. TW_NATIVE_PATH env var (explicit override)\r\n * 2. Prebuilt binary dari platform-specific npm package\r\n * 3. Local build dari source (developer mode)\r\n */\r\n\r\nimport { createRequire } from \"node:module\"\r\nimport * as fs from \"node:fs\"\r\nimport * as path from \"node:path\"\r\n\r\nconst isBrowser = typeof window !== \"undefined\" || typeof document !== \"undefined\"\r\n\r\n// ESM-safe require — works in both ESM and CJS contexts\r\nconst _require = typeof require !== \"undefined\" ? require : createRequire(import.meta.url)\r\n\r\nexport interface NativeResolutionResult {\r\n path: string | null\r\n source: \"env\" | \"prebuilt\" | \"local\" | \"not-found\"\r\n platform: string\r\n tried: string[]\r\n}\r\n\r\n/** Platform key → prebuilt npm package name */\r\nconst PLATFORM_MAP: Record<string, string[]> = {\r\n \"linux-x64\": [\"@tailwind-styled/native-linux-x64\"],\r\n \"linux-arm64\": [\"@tailwind-styled/native-linux-arm64\"],\r\n \"darwin-x64\": [\"@tailwind-styled/native-darwin-x64\"],\r\n \"darwin-arm64\": [\"@tailwind-styled/native-darwin-arm64\"],\r\n \"win32-x64\": [\"@tailwind-styled/native-win32-x64\"],\r\n \"win32-arm64\": [\"@tailwind-styled/native-win32-arm64\"],\r\n}\r\n\r\nfunction platformKey(): string {\r\n if (isBrowser) return \"browser\"\r\n return `${process.platform}-${process.arch}`\r\n}\r\n\r\n/**\r\n * Resolve native binary path dari semua sumber yang tersedia.\r\n *\r\n * @example\r\n * const result = resolveNativeBinary()\r\n * if (result.path) {\r\n * const binding = require(result.path)\r\n * } else {\r\n * throw new Error(\"Native binding not found — run npm run build:rust\")\r\n * }\r\n */\r\nexport function resolveNativeBinary(runtimeDir?: string): NativeResolutionResult {\r\n const platform = platformKey()\r\n const tried: string[] = []\r\n\r\n if (isBrowser) {\r\n return { path: null, source: \"not-found\", platform, tried: [\"not available in browser\"] }\r\n }\r\n\r\n // 0. Disabled flag — always short-circuit before any I/O\r\n if (process.env.TWS_DISABLE_NATIVE === \"1\") {\r\n return { path: null, source: \"not-found\", platform, tried: [] }\r\n }\r\n\r\n // 1. Env var override\r\n const envPath = process.env.TW_NATIVE_PATH?.trim()\r\n if (envPath) {\r\n if (fs.existsSync(envPath)) {\r\n return { path: envPath, source: \"env\", platform, tried }\r\n }\r\n tried.push(`env:${envPath} (not found)`)\r\n }\r\n\r\n // 2. Prebuilt binary dari platform-specific npm package\r\n const prebuiltPkgs = PLATFORM_MAP[platform] ?? []\r\n for (const pkg of prebuiltPkgs) {\r\n try {\r\n const candidate = _require.resolve(`${pkg}/tailwind_styled_parser.node`)\r\n if (fs.existsSync(candidate)) {\r\n return { path: candidate, source: \"prebuilt\", platform, tried }\r\n }\r\n tried.push(`prebuilt:${pkg} (resolved but missing)`)\r\n } catch {\r\n tried.push(`prebuilt:${pkg} (not installed)`)\r\n }\r\n }\r\n\r\n // 3. Local build candidates\r\n const cwd = process.cwd()\r\n const base = runtimeDir ?? cwd\r\n // napi-rs naming: platform key may have -gnu suffix on Linux\r\n const napiPlatform = platform === \"linux-x64\" ? \"linux-x64-gnu\"\r\n : platform === \"linux-arm64\" ? \"linux-arm64-gnu\"\r\n : platform\r\n\r\n // Both possible binary names:\r\n // - \"tailwind_styled_parser\" (old hardcoded name in resolvers)\r\n // - \"tailwind-styled-native\" (actual binaryName in native/package.json)\r\n const BINARY_NAMES = [\"tailwind-styled-native\", \"tailwind_styled_parser\"]\r\n\r\n const localCandidates: string[] = []\r\n\r\n for (const bin of BINARY_NAMES) {\r\n localCandidates.push(path.resolve(base, `${bin}.node`))\r\n localCandidates.push(path.resolve(base, \"..\", `${bin}.node`))\r\n localCandidates.push(path.resolve(base, `${bin}.${platform}.node`))\r\n localCandidates.push(path.resolve(base, `${bin}.${napiPlatform}.node`))\r\n }\r\n\r\n // Walk up from cwd AND base to find repo root native/ dir\r\n // Needed when npm workspaces sets cwd to the package subdir\r\n for (const startDir of [cwd, base]) {\r\n let dir = startDir\r\n for (let i = 0; i < 6; i++) {\r\n const nativeDir = path.resolve(dir, \"native\")\r\n for (const bin of BINARY_NAMES) {\r\n localCandidates.push(path.resolve(nativeDir, `${bin}.node`))\r\n localCandidates.push(path.resolve(nativeDir, `${bin}.${platform}.node`))\r\n localCandidates.push(path.resolve(nativeDir, `${bin}.${napiPlatform}.node`))\r\n localCandidates.push(path.resolve(nativeDir, \"target\", \"release\", `${bin}.node`))\r\n }\r\n const parent = path.resolve(dir, \"..\")\r\n if (parent === dir) break\r\n dir = parent\r\n }\r\n }\r\n\r\n for (const candidate of localCandidates) {\r\n tried.push(`local:${candidate}`)\r\n if (fs.existsSync(candidate)) {\r\n return { path: candidate, source: \"local\", platform, tried }\r\n }\r\n }\r\n\r\n return { path: null, source: \"not-found\", platform, tried }\r\n}\r\n\r\n/**\r\n * Format human-readable error untuk \"binary not found\".\r\n */\r\nexport function formatNativeNotFoundError(result: NativeResolutionResult): string {\r\n const lines = [\r\n `[tailwind-styled] Native binding not found for ${result.platform}`,\r\n ``,\r\n `Tried:`,\r\n ...result.tried.map(t => ` - ${t}`),\r\n ``,\r\n `Solutions:`,\r\n ` 1. Build locally: npm run build:rust`,\r\n ` 2. Install prebuilt: npm install @tailwind-styled/native-${result.platform}`,\r\n ` 3. Override path: TW_NATIVE_PATH=/path/to/parser.node`,\r\n ]\r\n return lines.join(\"\\n\")\r\n}","/**\r\n * Shared observability contract lintas CLI, dashboard, dan devtools.\r\n * Dari execution-log: \"Stabilkan shared observability contract\"\r\n *\r\n * Semua surface inspection (CLI why, DevTools trace, dashboard /inspect)\r\n * menggunakan type contract yang sama di sini.\r\n */\r\n\r\n// ── Class Inspection Surface ─────────────────────────────────────────────────\r\n\r\nexport interface ClassProperty {\r\n property: string\r\n value: string\r\n}\r\n\r\nexport interface ClassUsageLocation {\r\n file: string\r\n line: number\r\n column: number\r\n usage: \"direct\" | \"variant\" | \"component\"\r\n}\r\n\r\n/** Unified inspection result - dipakai oleh CLI, DevTools, Dashboard */\r\nexport interface ClassInspection {\r\n className: string\r\n /** CSS properties yang di-set oleh class ini */\r\n properties: ClassProperty[]\r\n /** Konflik dengan class lain (property conflicts) */\r\n conflicts: string[]\r\n /** Files yang menggunakan class ini */\r\n usedIn: ClassUsageLocation[]\r\n /** Risk level untuk removal */\r\n risk: \"low\" | \"medium\" | \"high\"\r\n /** Estimated bundle contribution dalam bytes */\r\n bundleBytes: number\r\n /** Raw CSS string */\r\n css: string\r\n /** Variant chain (hover:, md:, dll) */\r\n variants: string[]\r\n /** Timestamp */\r\n inspectedAt: number\r\n}\r\n\r\n// ── Build Trace Surface ───────────────────────────────────────────────────────\r\n\r\nexport interface BuildPhaseTrace {\r\n phase: \"scan\" | \"compile\" | \"engine\" | \"output\"\r\n durationMs: number\r\n filesProcessed?: number\r\n classesFound?: number\r\n}\r\n\r\nexport interface BuildTrace {\r\n buildId: string\r\n totalDurationMs: number\r\n phases: BuildPhaseTrace[]\r\n classCount: number\r\n fileCount: number\r\n cacheHitRate: number\r\n mode: string\r\n timestamp: number\r\n}\r\n\r\n// ── Dashboard Metrics Surface ─────────────────────────────────────────────────\r\n\r\nexport interface DashboardMetrics {\r\n buildMs: number\r\n scanMs: number\r\n analyzeMs: number\r\n compileMs: number\r\n classCount: number\r\n fileCount: number\r\n mode: string\r\n cacheHitRate?: number\r\n nativeVersion?: string\r\n}\r\n\r\nexport interface DashboardSummary {\r\n totalBuilds: number\r\n avgBuildMs: number\r\n p95BuildMs: number\r\n avgCacheHitRate: number\r\n lastBuild: DashboardMetrics | null\r\n}\r\n\r\n// ── Observability Client ──────────────────────────────────────────────────────\r\n\r\nexport interface ObservabilityClient {\r\n /** Fetch class inspection dari dashboard */\r\n inspectClass(className: string): Promise<ClassInspection | null>\r\n /** Fetch current metrics */\r\n getMetrics(): Promise<DashboardMetrics | null>\r\n /** Fetch summary */\r\n getSummary(): Promise<DashboardSummary | null>\r\n /** Fetch build history */\r\n getHistory(): Promise<BuildTrace[]>\r\n}\r\n\r\n/** Buat observability client yang connect ke dashboard server */\r\nexport function createObservabilityClient(\r\n opts: { baseUrl?: string; timeoutMs?: number } = {}\r\n): ObservabilityClient {\r\n const { baseUrl = \"http://localhost:7421\", timeoutMs = 3000 } = opts\r\n\r\n async function fetchJson<T>(path: string): Promise<T | null> {\r\n try {\r\n const res = await fetch(`${baseUrl}${path}`, {\r\n signal: AbortSignal.timeout(timeoutMs),\r\n })\r\n if (!res.ok) return null\r\n return await res.json() as T\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n return {\r\n async inspectClass(className: string): Promise<ClassInspection | null> {\r\n const data = await fetchJson<ClassInspection>(`/inspect?class=${encodeURIComponent(className)}`)\r\n if (!data) return null\r\n return { ...data, inspectedAt: Date.now() }\r\n },\r\n\r\n async getMetrics(): Promise<DashboardMetrics | null> {\r\n return fetchJson<DashboardMetrics>(\"/metrics\")\r\n },\r\n\r\n async getSummary(): Promise<DashboardSummary | null> {\r\n return fetchJson<DashboardSummary>(\"/summary\")\r\n },\r\n\r\n async getHistory(): Promise<BuildTrace[]> {\r\n const data = await fetchJson<BuildTrace[]>(\"/history\")\r\n return Array.isArray(data) ? data : []\r\n },\r\n }\r\n}\r\n","import { createHash } from \"node:crypto\"\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport { createRequire } from \"node:module\"\r\n\r\n// Native-only: Node.js is always available. No browser fallback.\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type TokenMap = Record<string, string>\r\n\r\nexport type VariantValue = string | number | boolean | undefined\r\n\r\nexport type VariantProps = Record<string, VariantValue>\r\n\r\nexport type HtmlTagName = keyof HTMLElementTagNameMap\r\n\r\nexport type CompoundCondition = Record<string, string | number | boolean>\r\n\r\nexport type VariantMatrix = Record<string, Array<string | number | boolean>>\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Logging\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface Logger {\r\n warn(...args: unknown[]): void\r\n debug(...args: unknown[]): void\r\n error(...args: unknown[]): void\r\n log(...args: unknown[]): void\r\n}\r\n\r\nexport function createLogger(namespace: string): Logger {\r\n const prefix = `[${namespace}]`\r\n return {\r\n warn(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n debug(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n error(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n log(...args: unknown[]) {\r\n process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\r\n },\r\n }\r\n}\r\n\r\nexport function createDebugLogger(namespace: string, label?: string): (msg: string) => void {\r\n const prefix = label ? `[${namespace}:${label}]` : `[${namespace}]`\r\n return (msg: string) => {\r\n if (process.env.DEBUG?.includes(namespace) || process.env.TW_DEBUG) {\r\n console.debug(prefix, msg)\r\n }\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error handling\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type ErrorSource = \"rust\" | \"validation\" | \"compile\" | \"io\" | \"config\" | \"unknown\"\r\n\r\ntype ZodLikeIssue = {\r\n path?: readonly PropertyKey[]\r\n message?: string\r\n}\r\n\r\nfunction formatIssuePath(path?: readonly PropertyKey[]): string {\r\n if (!path || path.length === 0) return \"(root)\"\r\n return path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n}\r\n\r\nexport class TwError extends Error {\r\n /** @deprecated Gunakan source */\r\n public readonly domain: string\r\n public readonly source: ErrorSource\r\n public readonly code: string\r\n public readonly originalCause?: unknown\r\n\r\n constructor(domainOrSource: string, code: string, message: string, cause?: unknown) {\r\n super(message)\r\n this.name = \"TwError\"\r\n this.domain = domainOrSource\r\n this.source = domainOrSource as ErrorSource\r\n this.code = code\r\n this.originalCause = cause\r\n if (Error.captureStackTrace) Error.captureStackTrace(this, TwError)\r\n }\r\n\r\n static fromIo(code: string, message: string): TwError {\r\n return new TwError(\"io\", code, message)\r\n }\r\n\r\n static fromCompile(code: string, message: string): TwError {\r\n return new TwError(\"compile\", code, message)\r\n }\r\n\r\n static fromRust(err: { code?: string; message?: string } | Error | unknown): TwError {\r\n if (err instanceof TwError) return err\r\n if (err instanceof Error) return new TwError(\"rust\", \"RUST_ERROR\", err.message, err)\r\n if (err && typeof err === \"object\") {\r\n const e = err as { code?: string; message?: string }\r\n return new TwError(\"rust\", e.code ?? \"RUST_ERROR\", e.message ?? String(err), err)\r\n }\r\n return new TwError(\"rust\", \"RUST_ERROR\", String(err), err)\r\n }\r\n\r\n /** Buat TwError dari ZodError — dukung shape Zod v3 (`errors`) dan v4 (`issues`). */\r\n static fromZod(err: { issues?: ZodLikeIssue[]; errors?: ZodLikeIssue[] }): TwError {\r\n const first = err.issues?.[0] ?? err.errors?.[0]\r\n const path = formatIssuePath(first?.path)\r\n const message = first ? `${path}: ${first.message}` : \"Schema validation failed\"\r\n return new TwError(\"validation\", \"SCHEMA_VALIDATION_FAILED\", message, err)\r\n }\r\n\r\n static wrap(source: string, code: string, err: unknown): TwError {\r\n if (err instanceof TwError) return err\r\n if (err instanceof Error) return new TwError(source, code, err.message, err)\r\n return new TwError(source, code, String(err), err)\r\n }\r\n\r\n override toString(): string {\r\n return `TwError [${this.source}:${this.code}] ${this.message}`\r\n }\r\n\r\n toJSON(): { name: string; source: string; code: string; message: string } {\r\n return { name: this.name, source: this.source, code: this.code, message: this.message }\r\n }\r\n\r\n toCliMessage(): string {\r\n return `[${this.source.toUpperCase()}:${this.code}] ${this.message}`\r\n }\r\n}\r\n\r\nexport function wrapUnknownError(domain: string, code: string, error: unknown): TwError {\r\n return TwError.wrap(domain, code, error)\r\n}\r\n\r\nexport function isTwError(err: unknown): err is TwError {\r\n return err instanceof TwError\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Native binding resolution\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface LoadNativeBindingOptions<T> {\r\n runtimeDir: string\r\n candidates: string[]\r\n isValid: (module: unknown) => module is T\r\n invalidExportMessage: string\r\n}\r\n\r\nexport interface LoadNativeBindingResult<T> {\r\n binding: T | null\r\n loadErrors: Array<{ path: string; message: string }>\r\n loadedPath?: string\r\n}\r\n\r\nexport function loadNativeBinding<T>(options: LoadNativeBindingOptions<T>): LoadNativeBindingResult<T> {\r\n const { runtimeDir, candidates, isValid } = options\r\n const loadErrors: Array<{ path: string; message: string }> = []\r\n\r\n for (const candidate of candidates) {\r\n const candidatePath = path.resolve(runtimeDir, candidate)\r\n try {\r\n if (!fs.existsSync(candidatePath) && !fs.existsSync(candidatePath + \".node\")) {\r\n continue\r\n }\r\n const mod = requireNativeModule(candidatePath)\r\n if (mod && isValid(mod)) {\r\n return { binding: mod, loadErrors, loadedPath: candidatePath }\r\n }\r\n loadErrors.push({ path: candidatePath, message: options.invalidExportMessage })\r\n } catch (e) {\r\n loadErrors.push({ path: candidatePath, message: e instanceof Error ? e.message : String(e) })\r\n }\r\n }\r\n\r\n return { binding: null, loadErrors }\r\n}\r\n\r\nconst _require = createRequire(import.meta.url)\r\n\r\nfunction requireNativeModule(p: string): unknown {\r\n return _require(p)\r\n}\r\n\r\nexport interface ResolveCandidatesOptions {\r\n runtimeDir?: string\r\n envVarNames?: string[]\r\n includeDefaultCandidates?: boolean\r\n enforceNodeExtensionForEnvPath?: boolean\r\n /** @deprecated — ignored, kept for backward compat */\r\n packageName?: string\r\n}\r\n\r\nexport function resolveNativeBindingCandidates(options: ResolveCandidatesOptions): string[] {\r\n const {\r\n envVarNames = [\"TW_NATIVE_PATH\", \"TWS_NATIVE_PATH\"],\r\n includeDefaultCandidates = true,\r\n enforceNodeExtensionForEnvPath = false,\r\n } = options\r\n // Default ke cwd kalau runtimeDir tidak disediakan\r\n const runtimeDir = options.runtimeDir || process.cwd()\r\n const candidates: string[] = []\r\n\r\n for (const envVar of envVarNames) {\r\n const envPath = process.env[envVar]\r\n if (envPath) {\r\n candidates.push(enforceNodeExtensionForEnvPath && !envPath.endsWith(\".node\") ? envPath + \".node\" : envPath)\r\n }\r\n }\r\n\r\n if (!includeDefaultCandidates) return candidates\r\n\r\n if (fs.existsSync(runtimeDir)) {\r\n try {\r\n for (const entry of fs.readdirSync(runtimeDir)) {\r\n if (entry.endsWith(\".node\")) candidates.push(entry)\r\n }\r\n } catch { /* ignore read errors */ }\r\n }\r\n\r\n const BINARY_NAMES = [\"tailwind-styled-native\", \"tailwind_styled_parser\"]\r\n const napiPlatform = process.platform === \"linux\" && process.arch === \"x64\" ? \"linux-x64-gnu\"\r\n : process.platform === \"linux\" && process.arch === \"arm64\" ? \"linux-arm64-gnu\"\r\n : `${process.platform}-${process.arch}`\r\n\r\n for (const bin of BINARY_NAMES) {\r\n candidates.push(path.resolve(runtimeDir, `${bin}.node`))\r\n candidates.push(path.resolve(runtimeDir, `${bin}.${napiPlatform}.node`))\r\n // 4 level: dist/ → package/ → domain/ → packages/ → repo-root/\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.${napiPlatform}.node`))\r\n // 3 level fallback\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.${napiPlatform}.node`))\r\n }\r\n\r\n return Array.from(new Set(candidates))\r\n}\r\n\r\nexport function resolveRuntimeDir(dir: string | undefined, importMetaUrl: string): string {\r\n if (dir) return path.resolve(dir)\r\n try {\r\n return path.dirname(fileURLToPath(importMetaUrl))\r\n } catch {\r\n return process.cwd()\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Hashing\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function hashContent(content: string, algorithm: string = \"md5\", length?: number): string {\r\n const hash = createHash(algorithm).update(content).digest(\"hex\")\r\n return length ? hash.slice(0, length) : hash\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function formatErrorMessage(error: unknown): string {\r\n if (error instanceof TwError) return error.toString()\r\n if (error instanceof Error) return error.message\r\n return String(error)\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// LRU Cache\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport class LRUCache<K, V> {\r\n private capacity: number\r\n private cache: Map<K, V>\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity\r\n this.cache = new Map()\r\n }\r\n\r\n get(key: K): V | undefined {\r\n if (!this.cache.has(key)) return undefined\r\n const value = this.cache.get(key)!\r\n this.cache.delete(key)\r\n this.cache.set(key, value)\r\n return value\r\n }\r\n\r\n set(key: K, value: V): void {\r\n if (this.cache.has(key)) {\r\n this.cache.delete(key)\r\n } else if (this.cache.size >= this.capacity) {\r\n const firstKey = this.cache.keys().next().value\r\n if (firstKey !== undefined) {\r\n this.cache.delete(firstKey)\r\n }\r\n }\r\n this.cache.set(key, value)\r\n }\r\n\r\n delete(key: K): boolean {\r\n return this.cache.delete(key)\r\n }\r\n\r\n has(key: K): boolean {\r\n return this.cache.has(key)\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear()\r\n }\r\n\r\n entries(): IterableIterator<[K, V]> {\r\n return this.cache.entries()\r\n }\r\n\r\n get size(): number {\r\n return this.cache.size\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Trace Utilities\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TraceSnapshot, TraceSummary } from \"./trace\"\r\nexport {\r\n getHealthColor,\r\n getModeColor,\r\n formatMemory,\r\n formatDuration,\r\n calculateHealth,\r\n getBuildTimeColor,\r\n getMemoryColor,\r\n createTraceSnapshot,\r\n getPipelinePercentages,\r\n} from \"./trace\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Performance Telemetry\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error Codes\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { ErrorCode } from \"./error-codes\"\r\nexport { ERROR_CODES, getSuggestion, formatErrorCode } from \"./error-codes\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Tailwind Compatibility\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TailwindInfo } from \"./compatibility\"\r\nexport { detectTailwind, assertTailwindV4, getTailwindVersion, isTailwindV4 } from \"./compatibility\"\r\n\r\n// ── Native binding schemas (Zod boundary validation)\r\nexport {\r\n NativeScanFileSchema, NativeScanResultSchema,\r\n NativeAnalyzerReportSchema, NativeTransformResultSchema,\r\n NativeCssCompileResultSchema, NativeWatchResultSchema,\r\n NativeCacheEntrySchema, NativeCacheReadResultSchema,\r\n safeParseNative, parseNative,\r\n} from './native-schemas'\r\n\r\n// ── ESM-safe runtime helpers ──────────────────────────────────────────────\r\nexport {\r\n createEsmRequire,\r\n getDirname,\r\n getFilename,\r\n resolveFromRoot,\r\n tryRequire,\r\n resolveNativeNodePath,\r\n} from \"./esmHelpers\"\r\n\r\n// ── Performance telemetry ────────────────────────────────────────────────────\r\nexport {\r\n TelemetryCollector,\r\n getGlobalTelemetry,\r\n resetGlobalTelemetry,\r\n createBuildTimer,\r\n type BuildTelemetry,\r\n type TelemetrySummary,\r\n type BuildPhases,\r\n} from \"./telemetry\"\r\n\r\n// ── Config/JSON schema validation ─────────────────────────────────────────────\r\nexport {\r\n ScanCacheSchema,\r\n ScanCacheClassEntrySchema,\r\n TailwindConfigSchema,\r\n RegistryPluginEntrySchema,\r\n RegistryFileSchema,\r\n PackageJsonSchema,\r\n parseJsonWithSchema,\r\n parseJsonFileWithSchema,\r\n type ScanCache,\r\n type ScanCacheClassEntry,\r\n type TailwindConfig,\r\n type RegistryPluginEntry,\r\n type RegistryFile,\r\n type PackageJson,\r\n} from \"./configSchemas\"\r\n\r\n// ── Worker/bootstrap path resolution ─────────────────────────────────────────\r\nexport {\r\n resolveWorkerPath,\r\n resolveLoaderPath,\r\n type WorkerPathOptions,\r\n type WorkerPathResult,\r\n} from \"./workerResolver\"\r\n\r\n// ── Codegen helpers ───────────────────────────────────────────────────────────\r\nexport {\r\n generateComponentCode,\r\n generateStorybookStory,\r\n generateClassRenameCodemod,\r\n generateBarrelFile,\r\n type ComponentCodegenOptions,\r\n} from \"./codegen\"\r\n\r\n// ── Native binary resolution (QA #1) ─────────────────────────────────────────\r\nexport {\r\n resolveNativeBinary,\r\n formatNativeNotFoundError,\r\n type NativeResolutionResult,\r\n} from \"./native-resolution\"\r\n\r\n// ── Shared observability contract ────────────────────────────────────────────\r\nexport {\r\n createObservabilityClient,\r\n type ClassInspection,\r\n type ClassProperty,\r\n type ClassUsageLocation,\r\n type BuildTrace,\r\n type BuildPhaseTrace,\r\n type DashboardMetrics,\r\n type DashboardSummary,\r\n type ObservabilityClient,\r\n} from \"./observability\"","/**\r\n * tailwind-styled-v5 — Native Bridge Loader\r\n *\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n * All functions require native Rust binding - no JS fallback.\r\n */\r\n\r\nimport { resolveNativeBinary, resolveRuntimeDir } from \"@tailwind-styled/shared\"\r\n\r\n// require() is safe here — tsup banner injects CJS-compatible require into ESM output.\r\n// See tsup.config.ts esbuildOptions banner for how this is set up.\r\nconst _loadNative = (path: string): unknown => require(path)\r\n\r\nexport interface ComponentMetadata {\r\n component: string\r\n tag: string\r\n baseClass: string\r\n subComponents: Record<string, { tag?: string; class: string }>\r\n}\r\n\r\nexport interface NativeRscResult {\r\n isServer: boolean\r\n needsClientDirective: boolean\r\n clientReasons: string[]\r\n}\r\n\r\nconst log = (...args: unknown[]) => {\r\n if (process.env.DEBUG?.includes(\"compiler:native\")) {\r\n console.log(\"[compiler:native]\", ...args)\r\n }\r\n}\r\n\r\n// ── Type Exports ────────────────────────────────────────────────────────────────\r\n\r\nexport interface NativeBridge {\r\n // Core transform\r\n transformSource?: (source: string, opts?: Record<string, string>) => NativeTransformResult | null\r\n extractClassesFromSource?: (source: string) => string[]\r\n hasTwUsage?: (source: string) => boolean\r\n isAlreadyTransformed?: (source: string) => boolean\r\n // Class Extractor\r\n extractAllClasses?: (source: string) => string[]\r\n parseClasses?: (raw: string) => Array<{ raw: string; type: string }>\r\n // Application functions\r\n extractComponentUsage?: (source: string) => Array<{ component: string; propsJson: string }>\r\n normalizeAndDedupClasses?: (raw: string) => { normalized: string; duplicatesRemoved: number; uniqueCount: number }\r\n diffClassLists?: (previous: string[], current: string[]) => { added: string[]; removed: string[]; unchanged: string[]; hasChanges: boolean }\r\n batchExtractClasses?: (filePaths: string[]) => Array<{ file: string; classes: string[]; contentHash: string; ok: boolean; error?: string }>\r\n checkAgainstSafelist?: (classes: string[], safelist: string[]) => { matched: string[]; unmatched: string[]; safelistSize: number }\r\n // Batch 2\r\n hoistComponents?: (source: string) => { code: string; hoisted: string[]; warnings: string[] }\r\n compileVariantTable?: (configJson: string) => { id: string; tableJson: string; keys: string[]; defaultKey: string; combinations: number }\r\n classifyAndSortClasses?: (classes: string[]) => Array<{ className: string; bucket: string; sortOrder: number }>\r\n mergeCssDeclarations?: (cssChunks: string[]) => { declarationsJson: string; declarationString: string; count: number }\r\n analyzeClassUsage?: (classes: string[], scanResultJson: string, css: string) => Array<{ className: string; usageCount: number; filesJson: string; bundleSizeBytes: number; isDeadCode: boolean }>\r\n analyzeRsc?: (source: string, filename: string) => {\r\n isServer: boolean\r\n needsClientDirective: boolean\r\n clientReasons: string[]\r\n }\r\n analyzeClasses?: (\r\n filesJson: string,\r\n cwd: string,\r\n flags: number\r\n ) => {\r\n css?: string\r\n code: string\r\n classes: string[]\r\n changed: boolean\r\n rscJson?: string\r\n metadataJson?: string\r\n safelist?: string[]\r\n } | null\r\n // CSS compilation\r\n compileCss?: (classes: string[], prefix?: string | null) => { css: string; classes: string[] }\r\n compileCssLightning?: (classes: string[]) => string\r\n /** Post-process raw Tailwind-generated CSS dengan LightningCSS di Rust */\r\n detectDeadCode?: (scanResultJson: string, css: string) => {\r\n deadInCss: string[]\r\n deadInSource: string[]\r\n liveClasses: string[]\r\n totalCssClasses: number\r\n totalSourceClasses: number\r\n }\r\n processTailwindCssLightning?: (css: string) => { css: string; size_bytes: number; resolved_classes: string[]; unknown_classes: string[] }\r\n processTailwindCssWithTargets?: (css: string, targets: string | null) => { css: string; size_bytes: number }\r\n // Atomic CSS (atomic.rs)\r\n parseAtomicClass?: (twClass: string) => string | null\r\n generateAtomicCss?: (rulesJson: string) => string\r\n toAtomicClasses?: (twClasses: string) => string\r\n clearAtomicRegistry?: () => void\r\n atomicRegistrySize?: () => number\r\n // Impact analysis (impact_analysis.rs)\r\n calculateImpact?: (impactJson: string) => string\r\n calculateRisk?: (className: string, totalComponents: number) => string\r\n calculateSavings?: (bundleSizeBytes: number, componentCount: number) => number\r\n}\r\n\r\nexport interface NativeTransformResult {\r\n code: string\r\n classes: string[]\r\n changed: boolean\r\n rscJson?: string\r\n metadataJson?: string\r\n}\r\n\r\nexport interface ClassExtractResult {\r\n classes: string[]\r\n component_names: string[]\r\n has_tw_usage: boolean\r\n has_use_client: boolean\r\n imports: string[]\r\n}\r\n\r\nconst NATIVE_UNAVAILABLE_MESSAGE =\r\n \"[tailwind-styled/compiler v5] Native binding is required but not available.\\n\" +\r\n \"This package requires native Rust bindings. There is no JavaScript fallback.\\n\" +\r\n \"Please ensure:\\n\" +\r\n \" 1. The native module is properly installed\\n\" +\r\n \" 2. You have run: npm run build:rust (or use prebuilt binary)\\n\" +\r\n \"\\n\" +\r\n \"For help, see: https://tailwind-styled.dev/docs/install\"\r\n\r\n// ── Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nlet nativeBridge: NativeBridge | null = null\r\nlet bridgeLoadAttempted = false\r\nlet bridgeLoadError: Error | null = null\r\n\r\nconst isValidNativeBridge = (mod: unknown): mod is NativeBridge => {\r\n const m = mod as Partial<NativeBridge>\r\n return !!(\r\n typeof m.transformSource === \"function\" ||\r\n typeof m.extractAllClasses === \"function\" ||\r\n typeof m.hasTwUsage === \"function\"\r\n )\r\n}\r\n\r\nexport const getNativeBridge = (): NativeBridge => {\r\n if (nativeBridge) {\r\n return nativeBridge\r\n }\r\n\r\n if (bridgeLoadAttempted) {\r\n if (bridgeLoadError) {\r\n throw bridgeLoadError\r\n }\r\n throw new Error(NATIVE_UNAVAILABLE_MESSAGE)\r\n }\r\n\r\n bridgeLoadAttempted = true\r\n\r\n try {\r\n const runtimeDir = resolveRuntimeDir(undefined, import.meta.url)\r\n \r\n // Use shared's native resolution\r\n const result = resolveNativeBinary(runtimeDir)\r\n\r\n if (result.path && result.path.endsWith(\".node\")) {\r\n try {\r\n const binding = _loadNative(result.path) as NativeBridge\r\n if (isValidNativeBridge(binding)) {\r\n nativeBridge = binding\r\n log(\"Native bridge loaded successfully from:\", result.path)\r\n return nativeBridge\r\n }\r\n } catch (e) {\r\n log(\"Failed to require native binding:\", e)\r\n }\r\n }\r\n\r\n throw new Error(`${NATIVE_UNAVAILABLE_MESSAGE}\\n\\nTried paths: ${result.tried.join(\"\\n\")}`)\r\n } catch (err) {\r\n bridgeLoadError = err instanceof Error ? err : new Error(String(err))\r\n log(\"Failed to load native bridge:\", bridgeLoadError.message)\r\n throw bridgeLoadError\r\n }\r\n}\r\n\r\nexport const resetNativeBridgeCache = (): void => {\r\n nativeBridge = null\r\n bridgeLoadAttempted = false\r\n bridgeLoadError = null\r\n log(\"Native bridge cache reset\")\r\n}\r\n\r\n// ── Adaptor for native results\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const adaptNativeResult = (\r\n raw: NativeTransformResult\r\n): {\r\n code: string\r\n classes: string[]\r\n changed: boolean\r\n rsc?: NativeRscResult\r\n metadata?: ComponentMetadata[]\r\n} => {\r\n return {\r\n code: raw.code ?? \"\",\r\n classes: raw.classes ?? [],\r\n changed: raw.changed ?? false,\r\n rsc: raw.rscJson ? JSON.parse(raw.rscJson) : undefined,\r\n metadata: raw.metadataJson ? JSON.parse(raw.metadataJson) : undefined,\r\n }\r\n}\r\n\r\n// ── Eager init — load native bridge saat module dimuat, bukan saat request pertama\r\n// Mencegah crash di Turbopack dev mode karena lazy init mid-request\r\n// ─────────────────────────────────────────────────────────────────────────────\r\nif (typeof process !== \"undefined\" && !bridgeLoadAttempted) {\r\n try {\r\n getNativeBridge()\r\n } catch {\r\n // Sudah di-capture di bridgeLoadError — akan di-throw saat dipanggil pertama kali\r\n }\r\n}","/**\r\n * tailwindEngine.ts\r\n *\r\n * Pipeline: classes[] → Tailwind JS (expand) → Rust LightningCSS (post-process)\r\n *\r\n * Tailwind adalah sumber kebenaran untuk semua CSS declarations.\r\n * Rust/LightningCSS handle: vendor prefix, minify, dead-code strip.\r\n *\r\n * Tidak ada hardcoded CSS di sini — semuanya dari Tailwind engine.\r\n */\r\n\r\nimport { createRequire } from \"node:module\"\r\nimport { getNativeBridge } from \"./nativeBridge\"\r\n\r\nconst require = createRequire(import.meta.url)\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Tailwind CSS v4 engine loader\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\ninterface TailwindV4Engine {\r\n compile: (input: string, options?: { loadPlugin?: () => unknown }) => {\r\n build: (candidates: string[]) => string\r\n }\r\n}\r\n\r\nlet _twEngine: TailwindV4Engine | null = null\r\nlet _twEngineError: Error | null = null\r\n\r\nfunction loadTailwindEngine(): TailwindV4Engine {\r\n if (_twEngine) return _twEngine\r\n if (_twEngineError) throw _twEngineError\r\n\r\n try {\r\n // Tailwind CSS v4 exposes a compile() API\r\n const tw = require(\"tailwindcss\") as TailwindV4Engine\r\n if (typeof tw.compile !== \"function\") {\r\n throw new Error(\"tailwindcss v4 not found — compile() API missing. Check tailwindcss version >= 4.\")\r\n }\r\n _twEngine = tw\r\n return _twEngine\r\n } catch (e) {\r\n _twEngineError = e instanceof Error ? e : new Error(String(e))\r\n throw _twEngineError\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Tailwind → raw CSS\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Generate raw CSS dari Tailwind engine.\r\n * Input: array of Tailwind class names.\r\n * Output: expanded CSS string (belum diminify).\r\n *\r\n * @example\r\n * generateRawCss([\"flex\", \"items-center\", \"hover:bg-blue-500\"])\r\n * // → \".flex{display:flex}.items-center{align-items:center}...\"\r\n */\r\nexport function generateRawCss(classes: string[]): string {\r\n if (classes.length === 0) return \"\"\r\n\r\n const tw = loadTailwindEngine()\r\n\r\n // Tailwind v4: compile() returns a compiler instance, build() takes candidates\r\n const compiler = tw.compile(\"@import 'tailwindcss';\")\r\n return compiler.build(classes)\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// LightningCSS post-process via Rust\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Kirim raw CSS ke Rust untuk diproses LightningCSS.\r\n * - Vendor prefix otomatis\r\n * - Minify\r\n * - Canonical output\r\n */\r\nfunction postProcessWithLightning(rawCss: string): string {\r\n if (!rawCss) return \"\"\r\n\r\n const native = getNativeBridge()\r\n\r\n // process_tailwind_css_lightning sudah ada di css_compiler.rs\r\n if (typeof native.processTailwindCssLightning !== \"function\") {\r\n throw new Error(\"FATAL: Native binding 'processTailwindCssLightning' is required but not available.\")\r\n }\r\n const result = native.processTailwindCssLightning(rawCss)\r\n return result?.css ?? rawCss\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Main pipeline\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface CssPipelineResult {\r\n css: string\r\n classes: string[]\r\n sizeBytes: number\r\n /** true jika LightningCSS berhasil dijalankan */\r\n optimized: boolean\r\n}\r\n\r\n/**\r\n * Full pipeline: classes[] → Tailwind → LightningCSS → final CSS\r\n *\r\n * @example\r\n * const result = await runCssPipeline([\"flex\", \"p-4\", \"hover:bg-blue-500\"])\r\n * // inject result.css ke <head>\r\n */\r\nexport async function runCssPipeline(classes: string[]): Promise<CssPipelineResult> {\r\n const unique = [...new Set(classes.filter(Boolean))]\r\n\r\n if (unique.length === 0) {\r\n return { css: \"\", classes: [], sizeBytes: 0, optimized: false }\r\n }\r\n\r\n // Step 1: Tailwind JS → raw CSS\r\n const rawCss = generateRawCss(unique)\r\n\r\n // Step 2: Rust LightningCSS → optimized CSS\r\n const native = getNativeBridge()\r\n const hasLightning = typeof native.processTailwindCssLightning === \"function\"\r\n\r\n const finalCss = hasLightning ? postProcessWithLightning(rawCss) : rawCss\r\n\r\n return {\r\n css: finalCss,\r\n classes: unique,\r\n sizeBytes: finalCss.length,\r\n optimized: hasLightning,\r\n }\r\n}\r\n\r\n/**\r\n * Sync version — untuk konteks yang tidak support async (webpack loader).\r\n * Tanpa async karena Tailwind v4 compile() sync.\r\n */\r\nexport function runCssPipelineSync(classes: string[]): CssPipelineResult {\r\n const unique = [...new Set(classes.filter(Boolean))]\r\n\r\n if (unique.length === 0) {\r\n return { css: \"\", classes: [], sizeBytes: 0, optimized: false }\r\n }\r\n\r\n const rawCss = generateRawCss(unique)\r\n\r\n const native = getNativeBridge()\r\n const hasLightning = typeof native.processTailwindCssLightning === \"function\"\r\n const finalCss = hasLightning ? postProcessWithLightning(rawCss) : rawCss\r\n\r\n return {\r\n css: finalCss,\r\n classes: unique,\r\n sizeBytes: finalCss.length,\r\n optimized: hasLightning,\r\n }\r\n}\r\n/**\r\n * Minify dan vendor-prefix CSS dengan explicit browser targets.\r\n *\r\n * Gunakan ini untuk output yang perlu support browser spesifik\r\n * (misal: Chrome 80+, Firefox 80+, Safari 14.1+).\r\n * Default: gunakan `processTailwindCssLightning` tanpa explicit targets.\r\n *\r\n * @example\r\n * const css = processTailwindCssWithTargets(rawCss, \"chrome80,firefox80,safari14.1\")\r\n */\r\nexport function processTailwindCssWithTargets(css: string, targets?: string): string {\r\n const native = getNativeBridge()\r\n if (!native?.processTailwindCssWithTargets) {\r\n throw new Error(\"FATAL: Native binding 'processTailwindCssWithTargets' is required but not available.\")\r\n }\r\n const result = native.processTailwindCssWithTargets(css, targets ?? null) as { css: string } | null\r\n return (result?.css ?? css).trim()\r\n}","/**\r\n * Scanner — Rust native bridge\r\n *\r\n * Wraps the Rust scan_workspace and extract_classes_from_source functions.\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n */\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport {\r\n createDebugLogger,\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n TwError,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nconst log = createDebugLogger(\"scanner:native\")\r\n\r\n// ESM-compatible __dirname equivalent\r\nfunction getDirname(): string {\r\n if (typeof __dirname !== \"undefined\") {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\ninterface NativeScannerBinding {\r\n scanWorkspace?: (\r\n root: string,\r\n extensions: string[] | null\r\n ) => {\r\n files: Array<{ file: string; classes: string[]; hash: string }>\r\n totalFiles: number\r\n uniqueClasses: string[] | null\r\n } | null\r\n extractClassesFromSource?: (source: string) => string[] | null\r\n hashFileContent?: (content: string) => string | null\r\n cacheRead?: (cachePath: string) => {\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n version: number\r\n } | null\r\n cacheWrite?: (\r\n cachePath: string,\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n ) => boolean\r\n cachePriority?: (\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs: number\r\n ) => number\r\n batchExtractClasses?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n }>\r\n scanCacheGet?: (filePath: string, contentHash: string) => string[] | null\r\n scanCachePut?: (filePath: string, contentHash: string, classes: string[], mtimeMs: number, size: number) => void\r\n scanCacheInvalidate?: (filePath: string) => void\r\n scanCacheStats?: () => { size: number }\r\n scanFile?: (filePath: string) => {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n }\r\n collectFiles?: (root: string, extensions: string[] | null, ignoreDirs: string[] | null) => string[]\r\n scanFilesBatch?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n }>\r\n generateSubComponentTypes?: (\r\n root: string,\r\n outputPath: string | null\r\n ) => {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n /** Batch-check file existence + stale age. Menggantikan pruneStaleEntries() */\r\n pruneStaleEntries?: (\r\n entries: Array<{ file: string; lastSeenMs: number }>,\r\n maxAgeMs: number | null,\r\n checkExists: boolean | null\r\n ) => { keptIndices: number[]; removed: number }\r\n /** Hitung class frequency stats dari disk cache. Menggantikan computeCacheStats() */\r\n computeCacheStats?: (\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top: number | null\r\n ) => {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n }\r\n /** Rebuild workspace result — Rust HashSet dedup + sort. Menggantikan JS fallback di mergeResults() */\r\n rebuildWorkspaceResult?: (\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n ) => { files: Array<{ file: string; classes: string[] }>; totalFiles: number; uniqueClasses: string[] }\r\n}\r\n\r\nconst isValidScannerBinding = (module: unknown): module is NativeScannerBinding => {\r\n const candidate = module as Partial<NativeScannerBinding> | null | undefined\r\n return !!(\r\n candidate &&\r\n (candidate.scanWorkspace ||\r\n candidate.extractClassesFromSource ||\r\n candidate.hashFileContent ||\r\n candidate.cacheRead ||\r\n candidate.cacheWrite)\r\n )\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createScannerBridgeLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeScannerBinding | null | undefined,\r\n loadError: null as string | null,\r\n candidatePaths: [] as string[],\r\n }\r\n\r\n const throwNativeBindingError = (): never => {\r\n const lines = [\r\n \"FATAL: Native scanner binding not found.\",\r\n \"\",\r\n \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\r\n \"The binding was not found in any of these paths:\",\r\n ..._state.candidatePaths.map((p) => ` - ${p}`),\r\n \"\",\r\n ]\r\n\r\n if (_state.loadError) {\r\n lines.push(\"Load error:\", ` ${_state.loadError}`, \"\")\r\n }\r\n\r\n lines.push(\r\n \"To fix this, run:\",\r\n \" npm run build:rust\",\r\n \"\",\r\n \"This will build the native Rust module from the 'native/' directory.\",\r\n \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\r\n \"and 'npm run build:rust' is executed before running tests or building.\"\r\n )\r\n\r\n throw new TwError(\"rust\", \"SCANNER_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\r\n }\r\n\r\n const scannerGetBinding = (): NativeScannerBinding => {\r\n const cachedBinding = _state.binding\r\n if (cachedBinding !== undefined) {\r\n if (cachedBinding !== null) {\r\n return cachedBinding\r\n }\r\n return throwNativeBindingError()\r\n }\r\n\r\n const runtimeDir = getDirname()\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n includeDefaultCandidates: true,\r\n })\r\n\r\n _state.candidatePaths = candidates\r\n\r\n const { binding, loadErrors } = loadNativeBinding<NativeScannerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isValidScannerBinding,\r\n invalidExportMessage: \"Module loaded but missing expected scanner binding functions\",\r\n })\r\n\r\n if (binding) {\r\n log(`scanner native binding loaded successfully`)\r\n _state.binding = binding\r\n return _state.binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\r\n }\r\n\r\n _state.binding = null\r\n return throwNativeBindingError()\r\n }\r\n\r\n return {\r\n get: scannerGetBinding,\r\n scannerGetBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.loadError = null\r\n _state.candidatePaths = []\r\n },\r\n }\r\n}\r\n\r\nconst scannerBridgeLoader = createScannerBridgeLoader()\r\nconst scannerGetBinding = scannerBridgeLoader.get\r\n\r\nexport const resetScannerBridgeCache = scannerBridgeLoader.reset\r\n\r\nexport function scanWorkspaceNative(\r\n root: string,\r\n extensions?: string[]\r\n): ReturnType<NonNullable<NativeScannerBinding[\"scanWorkspace\"]>> {\r\n return scannerGetBinding().scanWorkspace!(root, extensions ?? null)\r\n}\r\n\r\nexport function extractClassesNative(source: string): string[] {\r\n const result = scannerGetBinding().extractClassesFromSource?.(source)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_EXTRACT_FAILED\",\r\n \"Native extractClassesFromSource returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function hashContentNative(content: string): string {\r\n const result = scannerGetBinding().hashFileContent?.(content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_HASH_FAILED\",\r\n \"Native hashFileContent returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function isRustCacheAvailable(): boolean {\r\n return true\r\n}\r\n\r\nexport function hasNativeScannerBinding(): boolean {\r\n try {\r\n scannerBridgeLoader.get()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function cacheReadNative(\r\n cachePath: string\r\n): ReturnType<NonNullable<NativeScannerBinding[\"cacheRead\"]>> {\r\n const result = scannerGetBinding().cacheRead?.(cachePath)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_READ_FAILED\",\r\n \"Native cacheRead returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cacheWriteNative(\r\n cachePath: string,\r\n entries: Parameters<NonNullable<NativeScannerBinding[\"cacheWrite\"]>>[1]\r\n): boolean {\r\n const result = scannerGetBinding().cacheWrite?.(cachePath, entries)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_WRITE_FAILED\",\r\n \"Native cacheWrite returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cachePriorityNative(\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs = Date.now()\r\n): number {\r\n const result = scannerGetBinding().cachePriority?.(\r\n mtimeMs,\r\n size,\r\n cachedMtimeMs,\r\n cachedSize,\r\n cachedHitCount,\r\n cachedLastSeenMs,\r\n nowMs\r\n )\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_PRIORITY_FAILED\",\r\n \"Native cachePriority returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function batchExtractClassesNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.batchExtractClasses) {\r\n throw new Error(\"FATAL: Native binding 'batchExtractClasses' is required but not available.\")\r\n }\r\n return binding.batchExtractClasses(filePaths) ?? []\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// In-memory scan cache (Rust DashMap — zero disk I/O)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function scanCacheGet(filePath: string, contentHash: string): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheGet) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheGet' is required but not available.\")\r\n }\r\n return binding.scanCacheGet(filePath, contentHash) ?? null\r\n}\r\n\r\nexport function scanCachePut(\r\n filePath: string,\r\n contentHash: string,\r\n classes: string[],\r\n mtimeMs: number,\r\n size: number\r\n): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCachePut) {\r\n throw new Error(\"FATAL: Native binding 'scanCachePut' is required but not available.\")\r\n }\r\n binding.scanCachePut(filePath, contentHash, classes, mtimeMs, size)\r\n}\r\n\r\nexport function scanCacheInvalidate(filePath: string): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheInvalidate) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheInvalidate' is required but not available.\")\r\n }\r\n binding.scanCacheInvalidate(filePath)\r\n}\r\n\r\nexport function scanCacheStats(): { size: number } {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheStats) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheStats' is required but not available.\")\r\n }\r\n return binding.scanCacheStats() as { size: number }\r\n}\r\nexport function scanFileNative(filePath: string): {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n} {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFile) {\r\n throw new Error(\"FATAL: Native binding 'scanFile' is required but not available.\")\r\n }\r\n return binding.scanFile(filePath)\r\n}\r\n/**\r\n * Native file walker — kumpulkan file paths rekursif tanpa baca konten.\r\n *\r\n * Menggantikan `collectFiles()` di `parallel-scanner.ts`.\r\n * Returns null jika binding tidak tersedia (fallback ke JS).\r\n */\r\nexport function collectFilesNative(\r\n root: string,\r\n extensions: string[] | null,\r\n ignoreDirs: string[] | null\r\n): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.collectFiles) return null\r\n return binding.collectFiles(root, extensions, ignoreDirs)\r\n}\r\n/**\r\n * Batch scan + hash banyak file sekaligus dalam satu NAPI call.\r\n *\r\n * Menggantikan loop `scanFileNative()` per file di worker thread.\r\n * Rust: `par_iter()` via rayon — semua file diproses paralel di thread pool Rust,\r\n * tanpa overhead spawn JS worker untuk setiap chunk.\r\n *\r\n * Kapan pakai ini vs `batchExtractClassesNative`:\r\n * - `scanFilesBatch` → butuh {file, classes, hash} — scan + hash sekaligus\r\n * - `batchExtractClasses` → hanya butuh {file, classes, content_hash, ok, error}\r\n *\r\n * Returns: array dengan panjang sama dengan input. File yang gagal dibaca\r\n * dikembalikan dengan classes:[] dan hash:\"\".\r\n */\r\nexport function scanFilesBatchNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFilesBatch) {\r\n // Fallback: panggil scanFile satu per satu\r\n return filePaths.map((fp) => {\r\n try {\r\n const r = binding.scanFile?.(fp)\r\n return r\r\n ? { file: r.file, classes: r.classes, hash: r.hash ?? \"\" }\r\n : { file: fp, classes: [], hash: \"\" }\r\n } catch {\r\n return { file: fp, classes: [], hash: \"\" }\r\n }\r\n })\r\n }\r\n return binding.scanFilesBatch(filePaths)\r\n}\r\n \r\n/**\r\n * Scan workspace rekursif dan generate TypeScript type declarations\r\n * untuk setiap sub-component yang ditemukan.\r\n *\r\n * Menggantikan operasi scan manual + string codegen di JS.\r\n * Rust: walkdir + regex class extraction + type codegen dalam satu pass.\r\n *\r\n * @param root Direktori root workspace\r\n * @param outputPath Path output file .d.ts (opsional — kalau null, hanya return result)\r\n */\r\nexport function generateSubComponentTypesNative(\r\n root: string,\r\n outputPath?: string\r\n): {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.generateSubComponentTypes) return null\r\n return binding.generateSubComponentTypes(root, outputPath ?? null) as {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n}\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// pruneStaleEntries + computeCacheStats — native wrappers\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Batch-check file existence + stale age menggunakan Rust syscalls.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan loop `existsSync()` di `pruneStaleEntries()` (cache-native.ts).\r\n */\r\nexport function pruneStaleEntriesNative(\r\n entries: Array<{ file: string; lastSeenMs?: number }>,\r\n maxAgeMs?: number,\r\n checkExists?: boolean\r\n): { keptIndices: number[]; removed: number } | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.pruneStaleEntries) return null\r\n return binding.pruneStaleEntries(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs ?? 0 })),\r\n maxAgeMs ?? null,\r\n checkExists ?? null\r\n )\r\n}\r\n\r\n/**\r\n * Hitung class frequency + stats dari disk cache entries menggunakan Rust.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan `computeCacheStats()` di `cache-native.ts`.\r\n */\r\nexport function rebuildWorkspaceResultNative(\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n): { files: typeof files; totalFiles: number; uniqueClasses: string[] } | null {\r\n const binding = scannerBridgeLoader.get()\r\n if (!binding?.rebuildWorkspaceResult) return null\r\n try {\r\n return binding.rebuildWorkspaceResult(files)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function computeCacheStatsNative(\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top?: number\r\n): {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.computeCacheStats) return null\r\n return binding.computeCacheStats(filesClasses, sizes, top ?? null)\r\n}","/**\r\n * tailwind-styled-v4 — Scanner Cache (Rust-backed)\r\n *\r\n * This module REQUIRES native Rust bindings and will FAIL LOUDLY if they are not available.\r\n * NO JavaScript fallback is provided.\r\n */\r\n\r\nimport path from \"node:path\"\r\nimport {\r\n cachePriorityNative,\r\n cacheReadNative,\r\n cacheWriteNative,\r\n scanCacheGet,\r\n scanCachePut,\r\n scanCacheInvalidate,\r\n scanCacheStats,\r\n pruneStaleEntriesNative,\r\n computeCacheStatsNative,\r\n} from \"./native-bridge\"\r\n\r\nfunction defaultCachePath(rootDir: string, cacheDir?: string): string {\r\n const dir = cacheDir\r\n ? path.resolve(rootDir, cacheDir)\r\n : path.join(process.cwd(), \".cache\", \"tailwind-styled\")\r\n return path.join(dir, \"scanner-cache.json\")\r\n}\r\n\r\n// ── Public API ────────────────────────────────────────────────────────────────\r\n\r\nexport interface NativeCacheEntry {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n /** Terakhir file ditemukan di filesystem (ms epoch). Digunakan untuk stale cleanup. */\r\n lastSeenMs?: number\r\n}\r\n\r\n/** Default stale threshold — 7 hari */\r\nconst STALE_THRESHOLD_MS = 7 * 24 * 60 * 60 * 1000\r\n\r\n/**\r\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\r\n * QA #5a: stale entry cleanup\r\n */\r\n/**\r\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\r\n *\r\n * Native-first: Rust batch-check semua file dalam satu pass tanpa\r\n * event loop overhead. JS fallback: existsSync loop per file.\r\n */\r\nexport function pruneStaleEntries(\r\n entries: NativeCacheEntry[],\r\n opts: { maxAgeMs?: number; rootDir?: string } = {}\r\n): { pruned: NativeCacheEntry[]; removed: number } {\r\n // Native-first: satu NAPI call — Rust check semua files sekaligus\r\n const nativeResult = pruneStaleEntriesNative(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs })),\r\n opts.maxAgeMs,\r\n !!opts.rootDir // hanya check existence jika rootDir disediakan\r\n )\r\n\r\n if (nativeResult !== null) {\r\n const pruned = nativeResult.keptIndices.map((i) => entries[i])\r\n return { pruned, removed: nativeResult.removed }\r\n }\r\n\r\n // JS fallback\r\n const maxAge = opts.maxAgeMs ?? STALE_THRESHOLD_MS\r\n const now = Date.now()\r\n const { existsSync } = require(\"node:fs\") as typeof import(\"node:fs\")\r\n\r\n const pruned = entries.filter((entry) => {\r\n if (opts.rootDir && !existsSync(entry.file)) return false\r\n if (entry.lastSeenMs && now - entry.lastSeenMs > maxAge) return false\r\n return true\r\n })\r\n\r\n return { pruned, removed: entries.length - pruned.length }\r\n}\r\n\r\n/**\r\n * Read scanner cache from disk using Rust parser.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function readCache(rootDir: string, cacheDir?: string): NativeCacheEntry[] {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n const result = cacheReadNative(cachePath)\r\n if (!result) return []\r\n\r\n return result.entries.map((e) => ({\r\n file: e.file,\r\n classes: e.classes,\r\n hash: e.hash,\r\n mtimeMs: e.mtimeMs,\r\n size: e.size,\r\n hitCount: e.hitCount,\r\n lastSeenMs: e.lastSeenMs,\r\n }))\r\n}\r\n\r\n/**\r\n * Write scanner cache to disk using Rust serialiser.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function writeCache(rootDir: string, entries: NativeCacheEntry[], cacheDir?: string): void {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n const success = cacheWriteNative(cachePath, entries)\r\n if (!success) {\r\n throw new Error(\r\n \"Native cacheWrite failed. Run 'npm run build:rust' to rebuild native bindings.\"\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Compute priority score for a file using the Rust SmartCache algorithm.\r\n * Higher = process first.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function filePriority(\r\n mtimeMs: number,\r\n size: number,\r\n cached: { mtimeMs: number; size: number; hitCount: number; lastSeenMs?: number } | undefined,\r\n nowMs = Date.now()\r\n): number {\r\n return cachePriorityNative(\r\n mtimeMs,\r\n size,\r\n cached?.mtimeMs ?? 0,\r\n cached?.size ?? 0,\r\n cached?.hitCount ?? 0,\r\n cached?.lastSeenMs ?? 0,\r\n nowMs\r\n )\r\n}\r\n\r\nexport interface CacheStats {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntry: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n}\r\n\r\n/**\r\n * Rust in-memory cache — hot path untuk per-file lookup saat scan.\r\n * Jauh lebih cepat dari disk JSON cache untuk file yang baru saja di-scan.\r\n */\r\nexport const hotCache = {\r\n get: scanCacheGet,\r\n put: scanCachePut,\r\n invalidate: scanCacheInvalidate,\r\n} as const\r\n\r\n/**\r\n * Stats dari Rust in-memory cache (DashMap).\r\n * `size` = jumlah entry saat ini di cache.\r\n */\r\nexport function getHotCacheStats(): { size: number } {\r\n return scanCacheStats()\r\n}\r\n\r\n/**\r\n * Compute disk cache stats dari entries (diperlukan untuk mostUsedClasses).\r\n * Native scanCacheStats hanya return size — detail stats tetap dari disk cache entries.\r\n */\r\n/**\r\n * Compute disk cache stats dari entries (diperlukan untuk mostUsedClasses).\r\n *\r\n * Native-first: Rust HashMap count + partial sort — ~3× lebih cepat\r\n * dari JS Map untuk workspace besar (5000+ entries).\r\n * JS fallback: manual Map count + .sort().\r\n */\r\nexport function computeCacheStats(entries: NativeCacheEntry[]): CacheStats {\r\n if (entries.length === 0) {\r\n return { totalEntries: 0, totalClasses: 0, totalSizeBytes: 0, avgClassesPerEntry: 0, mostUsedClasses: [] }\r\n }\r\n\r\n // Native-first\r\n const nativeResult = computeCacheStatsNative(\r\n entries.map((e) => e.classes),\r\n entries.map((e) => e.size),\r\n 10\r\n )\r\n\r\n if (nativeResult !== null) {\r\n return {\r\n totalEntries: nativeResult.totalEntries,\r\n totalClasses: nativeResult.totalClasses,\r\n totalSizeBytes: nativeResult.totalSizeBytes,\r\n avgClassesPerEntry: nativeResult.avgClassesPerEntryX100 / 100,\r\n mostUsedClasses: nativeResult.mostUsedClasses,\r\n }\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'computeCacheStats' is required but not available.\")\r\n}","/**\r\n * Native parallel scanner menggunakan worker threads + Rust batchExtractClasses.\r\n *\r\n * Untuk workspaces besar (200+ files), file-list dibagi ke beberapa worker.\r\n * Setiap worker memanggil native `batchExtractClasses` yang sudah memakai\r\n * rayon par_iter di sisi Rust — sehingga parallelism terjadi di dua level:\r\n * 1. Multiple worker threads (TS/Node level)\r\n * 2. rayon par_iter di dalam setiap worker (Rust level)\r\n *\r\n * Untuk workspace kecil (< PARALLEL_THRESHOLD), langsung panggil batchExtractClasses\r\n * di main thread — overhead spawn worker tidak worth it.\r\n */\r\n\r\nimport { Worker, isMainThread, parentPort, workerData } from \"node:worker_threads\"\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { availableParallelism } from \"node:os\"\r\nimport { fileURLToPath } from \"node:url\"\r\n\r\nimport { isScannableFile, DEFAULT_EXTENSIONS, DEFAULT_IGNORES } from \"./index\"\r\nimport { batchExtractClassesNative, collectFilesNative, rebuildWorkspaceResultNative } from \"./native-bridge\"\r\nimport type { ScanWorkspaceResult, ScanFileResult } from \"./types\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Constants\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst PARALLEL_THRESHOLD = 50\r\nconst DEFAULT_CHUNK_SIZE = 150\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface ParallelScanOptions {\r\n extensions?: string[]\r\n ignoreDirs?: string[]\r\n maxWorkers?: number\r\n chunkSize?: number\r\n}\r\n\r\ninterface NativeBatchResult {\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}\r\n\r\ninterface WorkerInput {\r\n filePaths: string[]\r\n}\r\n\r\ntype WorkerOutput =\r\n | { ok: true; results: NativeBatchResult[] }\r\n | { ok: false; error: string }\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection — native-first, JS fallback\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Kumpulkan semua file yang cocok secara rekursif dari rootDir.\r\n *\r\n * Native: satu Rust walk tanpa JS event loop overhead — 2–5× lebih cepat\r\n * untuk workspace besar. Tidak membaca konten file, hanya paths.\r\n *\r\n * JS fallback: dipakai jika native binding tidak tersedia (mis. test env).\r\n */\r\nfunction collectFiles(rootDir: string, extensions: string[], ignoreDirs: string[]): string[] {\r\n // Native-first: satu NAPI call menggantikan seluruh rekursi JS\r\n const native = collectFilesNative(rootDir, extensions, ignoreDirs)\r\n if (native !== null) return native\r\n\r\n // JS fallback\r\n const files: string[] = []\r\n\r\n function walk(dir: string): void {\r\n let entries: fs.Dirent[]\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true })\r\n } catch {\r\n return\r\n }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name)\r\n const rel = path.relative(rootDir, fullPath)\r\n if (entry.isDirectory()) {\r\n const ignored = ignoreDirs.some((d) => entry.name === d || rel.startsWith(d + path.sep))\r\n if (!ignored) walk(fullPath)\r\n } else if (isScannableFile(entry.name, extensions)) {\r\n files.push(fullPath)\r\n }\r\n }\r\n }\r\n\r\n walk(rootDir)\r\n return files\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Merge results\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction mergeResults(batchResults: NativeBatchResult[]): ScanWorkspaceResult {\r\n const files: ScanFileResult[] = batchResults.map((r) => ({\r\n file: r.file,\r\n classes: r.classes,\r\n hash: r.content_hash,\r\n }))\r\n // Native-first: Rust HashSet dedup + sort_unstable (satu pass, zero GC)\r\n const native = rebuildWorkspaceResultNative(files)\r\n if (native) return native\r\n // Fallback — hanya aktif jika binding belum loaded (e.g. test env)\r\n const unique = new Set(files.flatMap((f) => f.classes))\r\n return { files, totalFiles: files.length, uniqueClasses: Array.from(unique).sort() }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Worker thread entry point\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nif (!isMainThread && parentPort) {\r\n const { filePaths } = workerData as WorkerInput\r\n try {\r\n const results = batchExtractClassesNative(filePaths)\r\n const msg: WorkerOutput = { ok: true, results }\r\n parentPort.postMessage(msg)\r\n } catch (error) {\r\n const msg: WorkerOutput = {\r\n ok: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }\r\n parentPort.postMessage(msg)\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// __filename compat CJS + ESM\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\ndeclare const __filename: string | undefined\r\nconst _workerFilename =\r\n typeof __filename !== \"undefined\" ? __filename : fileURLToPath(import.meta.url)\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Spawn worker for one chunk\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction runChunkInWorker(filePaths: string[]): Promise<NativeBatchResult[]> {\r\n return new Promise((resolve, reject) => {\r\n const worker = new Worker(_workerFilename, {\r\n workerData: { filePaths } satisfies WorkerInput,\r\n })\r\n worker.once(\"message\", (payload: WorkerOutput) => {\r\n if (payload.ok) {\r\n resolve(payload.results)\r\n } else {\r\n reject(new Error(payload.error ?? \"parallel-scanner worker failed\"))\r\n }\r\n })\r\n worker.once(\"error\", reject)\r\n worker.once(\"exit\", (code) => {\r\n if (code !== 0) reject(new Error(`parallel-scanner worker exited with code ${code}`))\r\n })\r\n })\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Public API\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport async function scanWorkspaceParallel(\r\n rootDir: string,\r\n options: ParallelScanOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const {\r\n extensions = DEFAULT_EXTENSIONS,\r\n ignoreDirs = DEFAULT_IGNORES,\r\n maxWorkers = Math.max(1, availableParallelism() - 1),\r\n chunkSize = DEFAULT_CHUNK_SIZE,\r\n } = options\r\n\r\n const files = collectFiles(path.resolve(rootDir), extensions, ignoreDirs)\r\n\r\n if (files.length < PARALLEL_THRESHOLD) {\r\n return mergeResults(batchExtractClassesNative(files))\r\n }\r\n\r\n const chunks: string[][] = []\r\n for (let i = 0; i < files.length; i += chunkSize) {\r\n chunks.push(files.slice(i, i + chunkSize))\r\n }\r\n\r\n const allResults: NativeBatchResult[] = []\r\n for (let i = 0; i < chunks.length; i += maxWorkers) {\r\n const batch = chunks.slice(i, i + maxWorkers)\r\n const batchResults = await Promise.all(batch.map(runChunkInWorker))\r\n allResults.push(...batchResults.flat())\r\n }\r\n\r\n return mergeResults(allResults)\r\n}","import { z } from \"zod\"\r\nimport { TwError } from \"@tailwind-styled/shared\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst NonNegativeIntegerSchema = z.number().int().min(0)\r\n\r\nexport const ScanWorkspaceOptionsSchema = z.object({\r\n includeExtensions: z.array(z.string()).optional(),\r\n ignoreDirectories: z.array(z.string()).optional(),\r\n useCache: z.boolean().optional(),\r\n cacheDir: z.string().min(1).optional(),\r\n smartInvalidation: z.boolean().optional(),\r\n})\r\n\r\nexport type ScanWorkspaceOptions = z.infer<typeof ScanWorkspaceOptionsSchema>\r\n\r\nexport const ScanFileResultSchema = z.object({\r\n file: z.string(),\r\n classes: z.array(z.string()),\r\n hash: z.string().optional(),\r\n})\r\n\r\nexport type ScanFileResult = z.infer<typeof ScanFileResultSchema>\r\n\r\nexport const ScanWorkspaceResultSchema = z\r\n .object({\r\n files: z.array(ScanFileResultSchema),\r\n totalFiles: NonNegativeIntegerSchema,\r\n uniqueClasses: z.array(z.string()),\r\n })\r\n .refine((value) => value.totalFiles === value.files.length, {\r\n message: \"scan result totalFiles must match files.length\",\r\n path: [\"totalFiles\"],\r\n })\r\n\r\nexport type ScanWorkspaceResult = z.infer<typeof ScanWorkspaceResultSchema>\r\n\r\nexport const ScannerWorkerRequestSchema = z.object({\r\n rootDir: z.string().min(1),\r\n options: ScanWorkspaceOptionsSchema.optional(),\r\n})\r\n\r\nexport type ScannerWorkerRequest = z.infer<typeof ScannerWorkerRequestSchema>\r\n\r\nexport const ScannerWorkerSuccessMessageSchema = z.object({\r\n ok: z.literal(true),\r\n result: ScanWorkspaceResultSchema,\r\n})\r\n\r\nexport const ScannerWorkerErrorMessageSchema = z.object({\r\n ok: z.literal(false),\r\n error: z.string().optional(),\r\n})\r\n\r\nexport const ScannerWorkerMessageSchema = z.union([\r\n ScannerWorkerSuccessMessageSchema,\r\n ScannerWorkerErrorMessageSchema,\r\n])\r\n\r\nexport type ScannerWorkerMessage = z.infer<typeof ScannerWorkerMessageSchema>\r\n\r\nexport const parseScanWorkspaceOptions = (options: unknown) =>\r\n parseWithSchema(ScanWorkspaceOptionsSchema, options ?? {}, \"scanner options are invalid\")\r\n\r\nexport const parseScanFileResult = (result: unknown) =>\r\n parseWithSchema(ScanFileResultSchema, result, \"scanner file result is invalid\")\r\n\r\nexport const parseScanWorkspaceResult = (result: unknown) =>\r\n parseWithSchema(ScanWorkspaceResultSchema, result, \"scanner workspace result is invalid\")\r\n\r\nexport const parseScannerWorkerRequest = (request: unknown) =>\r\n parseWithSchema(ScannerWorkerRequestSchema, request, \"scanner worker request is invalid\")\r\n\r\nexport const parseScannerWorkerMessage = (message: unknown) =>\r\n parseWithSchema(ScannerWorkerMessageSchema, message, \"scanner worker message is invalid\")\r\n","import fs from \"node:fs\"\r\nimport { createRequire } from \"node:module\"\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport { Worker } from \"node:worker_threads\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\nimport { filePriority, type NativeCacheEntry, readCache, writeCache } from \"./cache-native\"\r\nimport { hashContentNative, isRustCacheAvailable } from \"./native-bridge\"\r\nimport { scanWorkspaceParallel } from \"./parallel-scanner\"\r\nimport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n type ScanFileResult,\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nconst log = createLogger(\"scanner\")\r\n\r\nconst SCAN_WORKER_TIMEOUT_MS = 120_000\r\n\r\ntype NativeParsedClass = { raw?: string }\r\n// ClassExtractResult shape dari Rust (napi-rs export)\r\ntype NativeClassExtractResult = {\r\n classes: string[]\r\n componentNames: string[]\r\n hasTwUsage: boolean\r\n hasUseClient: boolean\r\n imports: string[]\r\n}\r\ntype NativeParserBinding = {\r\n parse_classes?: (input: string) => NativeParsedClass[]\r\n parseClasses?: (input: string) => NativeParsedClass[]\r\n // Rust returns ClassExtractResult object, bukan plain string[]\r\n extractClassesFromSource?: (source: string) => NativeClassExtractResult | string[] | null\r\n batchExtractClassesNative?: (filePaths: string[]) => Array<{\r\n file: string; classes: string[]; contentHash: string; ok: boolean; error?: string\r\n }>\r\n}\r\n\r\nfunction getRuntimeDir(): string {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Parser Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createNativeParserLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeParserBinding | null | undefined,\r\n initError: null as string | null,\r\n }\r\n\r\n const debugNative = (message: string): void => {\r\n log.debug(`[native] ${message}`)\r\n }\r\n\r\n const loadNativeParserBinding = (): NativeParserBinding | null => {\r\n if (_state.binding !== undefined) return _state.binding\r\n\r\n const runtimeDir = getRuntimeDir()\r\n const req = createRequire(path.join(runtimeDir, \"noop.cjs\"))\r\n\r\n const candidates = [\r\n // ── binaryName baru: tailwind-styled-native (napi-rs naming) ──\r\n // cwd = repo root saat run dari root, atau package dir saat workspaces\r\n path.resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${process.platform}-${process.arch}.node`),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${process.platform}-${process.arch}-gnu.node`),\r\n // runtimeDir = dist/ → naik 4 level ke repo root\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${process.platform}-${process.arch}-gnu.node`),\r\n // 3 level fallback (jika package di-nest lebih dangkal)\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${process.platform}-${process.arch}-gnu.node`),\r\n // ── binaryName lama: tailwind_styled_parser (backward compat) ──\r\n path.resolve(process.cwd(), \"native/tailwind_styled_parser.node\"),\r\n path.resolve(process.cwd(), \"native/build/Release/tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(\r\n runtimeDir,\r\n \"..\",\r\n \"..\",\r\n \"..\",\r\n \"native\",\r\n \"build\",\r\n \"Release\",\r\n \"tailwind_styled_parser.node\"\r\n ),\r\n ]\r\n\r\n for (const fullPath of candidates) {\r\n if (!fs.existsSync(fullPath)) continue\r\n try {\r\n const required = req(fullPath) as NativeParserBinding\r\n if (\r\n required &&\r\n (typeof required.extractClassesFromSource === \"function\" ||\r\n typeof required.parseClasses === \"function\" ||\r\n typeof required.parse_classes === \"function\")\r\n ) {\r\n _state.binding = required\r\n debugNative(`using native parser from ${fullPath}`)\r\n return _state.binding\r\n }\r\n } catch (error) {\r\n _state.initError = error instanceof Error ? error.message : String(error)\r\n }\r\n }\r\n\r\n _state.binding = null\r\n if (!_state.initError) {\r\n _state.initError = \"native .node binding not found\"\r\n }\r\n debugNative(`native binding not available: ${_state.initError}`)\r\n return _state.binding\r\n }\r\n\r\n return {\r\n get: loadNativeParserBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.initError = null\r\n },\r\n }\r\n}\r\n\r\nconst nativeParserLoader = createNativeParserLoader()\r\n\r\nfunction normalizeWithNativeParser(tokens: string[]): string[] {\r\n const binding = nativeParserLoader.get()\r\n const parseClasses = binding?.parseClasses ?? binding?.parse_classes\r\n if (!binding || typeof parseClasses !== \"function\") {\r\n throw new Error(\r\n \"Native parser binding is required but not available. Run 'npm run build:rust' to build it.\"\r\n )\r\n }\r\n\r\n try {\r\n const parsed = parseClasses(tokens.join(\" \"))\r\n const normalized = parsed.map((item) => item.raw?.trim() ?? \"\").filter(Boolean)\r\n return Array.from(new Set(normalized))\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error)\r\n throw new Error(`Native parser failed: ${errorMessage}. Run 'npm run build:rust' to rebuild.`)\r\n }\r\n}\r\n\r\nexport type { ScanFileResult, ScanWorkspaceOptions, ScanWorkspaceResult } from \"./schemas\"\r\nexport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nexport const DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\r\nexport const DEFAULT_IGNORES = [\"node_modules\", \".git\", \".next\", \"dist\", \"out\", \".turbo\", \".cache\"]\r\n\r\nfunction resolveScannerWorkerModulePath(): string | null {\r\n const runtimeDir = (() => {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n // ESM fallback\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n // Final fallback\r\n return process.cwd()\r\n })()\r\n\r\n const candidates = [\r\n path.resolve(runtimeDir, \"worker.cjs\"),\r\n path.resolve(runtimeDir, \"worker.js\"),\r\n path.resolve(runtimeDir, \"worker.ts\"),\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction scanWorkspaceInWorker(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const modulePath = resolveScannerWorkerModulePath()\r\n if (!modulePath) {\r\n return Promise.reject(new Error(\"scanner worker module path could not be resolved\"))\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const settleState = { settled: false }\r\n\r\n const worker = new Worker(modulePath, { workerData: { rootDir, options: normalizedOptions } })\r\n\r\n const timeout = setTimeout(() => {\r\n if (!settleState.settled) {\r\n settleState.settled = true\r\n void worker.terminate()\r\n reject(new Error(`scanner worker timed out after ${SCAN_WORKER_TIMEOUT_MS}ms`))\r\n }\r\n }, SCAN_WORKER_TIMEOUT_MS)\r\n\r\n const finish = (callback: () => void) => {\r\n if (settleState.settled) return\r\n settleState.settled = true\r\n clearTimeout(timeout)\r\n callback()\r\n }\r\n\r\n worker.once(\"message\", (payload: unknown) => {\r\n const message = parseScannerWorkerMessage(payload)\r\n finish(() => {\r\n if (message?.ok) {\r\n resolve(parseScanWorkspaceResult(message.result))\r\n return\r\n }\r\n reject(new Error(message?.error ?? \"scanner worker failed without an error message\"))\r\n })\r\n })\r\n\r\n worker.once(\"error\", (error: Error) => {\r\n finish(() => reject(error))\r\n })\r\n\r\n worker.once(\"exit\", (code: number) => {\r\n if (code !== 0) {\r\n finish(() => reject(new Error(`scanner worker exited with code ${code}`)))\r\n }\r\n })\r\n })\r\n}\r\n\r\nfunction buildExtensionSet(includeExtensions: string[]): Set<string> {\r\n return new Set(includeExtensions)\r\n}\r\n\r\nfunction collectCandidates(\r\n rootDir: string,\r\n ignoreDirectories: Set<string>,\r\n extensionSet: Set<string>\r\n): string[] {\r\n const candidates: string[] = []\r\n const directories = [rootDir]\r\n\r\n while (directories.length > 0) {\r\n const currentDir = directories.pop()\r\n if (!currentDir) continue\r\n\r\n const entries = (() => {\r\n try {\r\n return fs.readdirSync(currentDir, { withFileTypes: true })\r\n } catch {\r\n return [] as fs.Dirent[]\r\n }\r\n })()\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name)\r\n\r\n if (entry.isDirectory()) {\r\n if (!ignoreDirectories.has(entry.name)) directories.push(fullPath)\r\n continue\r\n }\r\n\r\n if (!entry.isFile()) continue\r\n if (!extensionSet.has(path.extname(entry.name))) continue\r\n candidates.push(fullPath)\r\n }\r\n }\r\n\r\n return candidates\r\n}\r\n\r\nfunction toCacheSize(size: number): number {\r\n if (!Number.isFinite(size)) return 0\r\n const normalized = Math.max(0, Math.trunc(size))\r\n return Math.min(normalized, 0xffffffff)\r\n}\r\n\r\nexport function scanSource(source: string): string[] {\r\n const nativeBinding = nativeParserLoader.get()\r\n if (nativeBinding?.extractClassesFromSource) {\r\n const result = nativeBinding.extractClassesFromSource(source)\r\n // Rust mengembalikan ClassExtractResult { classes: string[], ... }\r\n // bukan plain string[] — handle kedua kemungkinan untuk backward compat\r\n if (Array.isArray(result)) {\r\n return Array.from(new Set(result.filter(Boolean)))\r\n }\r\n if (result !== null && result !== undefined && Array.isArray((result as NativeClassExtractResult).classes)) {\r\n return Array.from(new Set((result as NativeClassExtractResult).classes.filter(Boolean)))\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"FATAL: Native parser binding is required but not available.\\n\" +\r\n \"This package requires native Rust bindings.\\n\\n\" +\r\n \"Resolution steps:\\n\" +\r\n \"1. Build the native Rust module: npm run build:rust\"\r\n )\r\n}\r\n\r\nexport function isScannableFile(filePath: string, includeExtensions = DEFAULT_EXTENSIONS): boolean {\r\n return includeExtensions.includes(path.extname(filePath))\r\n}\r\n\r\nexport function scanFile(filePath: string): ScanFileResult {\r\n const { scanFileNative } = require(\"./native-bridge\")\r\n const result = scanFileNative(filePath) as {\r\n file: string; classes: string[]; hash: string; ok: boolean; error?: string | null\r\n }\r\n if (!result.ok) {\r\n throw new Error(`scanFile failed for ${filePath}: ${result.error ?? \"unknown error\"}`)\r\n }\r\n return {\r\n file: result.file,\r\n classes: result.classes,\r\n ...(result.hash ? { hash: result.hash } : {}),\r\n }\r\n}\r\n\r\nexport function scanWorkspace(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): ScanWorkspaceResult {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const includeExtensions = normalizedOptions.includeExtensions ?? DEFAULT_EXTENSIONS\r\n const extensionSet = buildExtensionSet(includeExtensions)\r\n const ignoreDirectories = new Set(normalizedOptions.ignoreDirectories ?? DEFAULT_IGNORES)\r\n const useCache = normalizedOptions.useCache ?? true\r\n const _smartInvalidation = normalizedOptions.smartInvalidation ?? true\r\n\r\n const files: ScanFileResult[] = []\r\n const unique = new Set<string>()\r\n const candidates = collectCandidates(rootDir, ignoreDirectories, extensionSet)\r\n\r\n const processResult = (result: ScanFileResult) => {\r\n files.push(result)\r\n for (const cls of result.classes) unique.add(cls)\r\n }\r\n\r\n \r\n const { scanWorkspaceNative } = require(\"./native-bridge\")\r\n\r\n if (!normalizedOptions.cacheDir && !useCache) {\r\n const nativeResult = scanWorkspaceNative(rootDir, includeExtensions)\r\n if (nativeResult) {\r\n return parseScanWorkspaceResult({\r\n files: nativeResult.files.map((f: { file: string; classes: string[]; hash?: string }) => ({\r\n file: f.file,\r\n classes: f.classes,\r\n ...(f.hash ? { hash: f.hash } : {}),\r\n })),\r\n totalFiles: nativeResult.totalFiles,\r\n uniqueClasses: nativeResult.uniqueClasses,\r\n })\r\n }\r\n }\r\n\r\n if (useCache && isRustCacheAvailable()) {\r\n const cacheEntries: NativeCacheEntry[] = (() => {\r\n try {\r\n return readCache(rootDir, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(\r\n `cache read failed, continuing without persisted cache: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return []\r\n }\r\n })()\r\n\r\n const cacheMap = new Map(cacheEntries.map((entry) => [entry.file, entry]))\r\n const nowMs = Date.now()\r\n const ranked: Array<{\r\n filePath: string\r\n stat: fs.Stats\r\n size: number\r\n cached?: NativeCacheEntry\r\n priority: number\r\n }> = []\r\n\r\n for (const filePath of candidates) {\r\n const stat = (() => {\r\n try {\r\n return fs.statSync(filePath)\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!stat) continue\r\n\r\n const size = toCacheSize(stat.size)\r\n const cached = cacheMap.get(filePath)\r\n const priority = filePriority(\r\n stat.mtimeMs,\r\n size,\r\n cached\r\n ? {\r\n mtimeMs: cached.mtimeMs,\r\n size: cached.size,\r\n hitCount: cached.hitCount,\r\n lastSeenMs: 0,\r\n }\r\n : undefined,\r\n nowMs\r\n )\r\n\r\n ranked.push({ filePath, stat, size, cached, priority })\r\n }\r\n\r\n ranked.sort((a, b) => b.priority - a.priority)\r\n\r\n const updatedEntries: NativeCacheEntry[] = []\r\n\r\n for (const { filePath, stat, size, cached } of ranked) {\r\n const content = (() => {\r\n try {\r\n return fs.readFileSync(filePath, \"utf8\")\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!content) continue\r\n\r\n const hash = hashContentNative(content)\r\n if (\r\n cached &&\r\n cached.hash === hash &&\r\n cached.mtimeMs === stat.mtimeMs &&\r\n cached.size === size\r\n ) {\r\n log.debug(`cache HIT ${filePath}`)\r\n processResult({ file: filePath, classes: cached.classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes: cached.classes,\r\n hash: cached.hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: (cached.hitCount ?? 0) + 1,\r\n })\r\n continue\r\n }\r\n\r\n log.debug(`cache MISS ${filePath}`)\r\n const classes = scanSource(content)\r\n processResult({ file: filePath, classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes,\r\n hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: 1,\r\n })\r\n }\r\n\r\n try {\r\n writeCache(rootDir, updatedEntries, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(`cache write failed: ${error instanceof Error ? error.message : String(error)}`)\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n }\r\n\r\n // Fast path: gunakan Rust batch extraction jika tersedia (parallel, tanpa GC)\r\n const batchNative = nativeParserLoader.get()?.batchExtractClassesNative\r\n if (batchNative) {\r\n const batchResults = batchNative(candidates)\r\n for (const r of batchResults ?? []) {\r\n if (r.ok) processResult({ file: r.file, classes: r.classes })\r\n }\r\n } else {\r\n for (const filePath of candidates) {\r\n processResult(scanFile(filePath))\r\n }\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n}\r\n\r\nexport async function scanWorkspaceAsync(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n\r\n // Large workspaces: use native parallel scanner (multiple workers + Rust rayon)\r\n try {\r\n return await scanWorkspaceParallel(rootDir, {\r\n extensions: normalizedOptions.includeExtensions,\r\n ignoreDirs: normalizedOptions.ignoreDirectories,\r\n }) as ScanWorkspaceResult\r\n } catch (parallelError) {\r\n log.debug(\r\n `parallel scan failed, retrying with single worker: ${\r\n parallelError instanceof Error ? parallelError.message : String(parallelError)\r\n }`\r\n )\r\n }\r\n\r\n // Fallback: single worker thread (still native)\r\n try {\r\n return await scanWorkspaceInWorker(rootDir, normalizedOptions)\r\n } catch (error) {\r\n log.debug(\r\n `worker scan failed, retrying with sync native scanner: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return scanWorkspace(rootDir, normalizedOptions)\r\n }\r\n}\r\nexport { extractClassesNative, batchExtractClassesNative } from \"./native-bridge\"","/**\r\n * Engine — Rust native bridge\r\n *\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n */\r\nimport path from \"node:path\"\r\nimport {\r\n createDebugLogger,\r\n getDirname as getEsmDirname,\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n TwError,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nconst log = createDebugLogger(\"engine:native\")\r\n\r\nfunction getDirname(): string {\r\n if (typeof __dirname !== \"undefined\") return __dirname\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return getEsmDirname(import.meta.url)\r\n }\r\n return process.cwd()\r\n}\r\n\r\ninterface NativeEngineBinding {\r\n computeIncrementalDiff?: (\r\n previousJson: string,\r\n currentJson: string\r\n ) => {\r\n addedClasses: string[]\r\n removedClasses: string[]\r\n changedFiles: string[]\r\n unchangedFiles: number\r\n } | null\r\n hashFileContent?: (content: string) => string | null\r\n processFileChange?: (\r\n filepath: string,\r\n newClasses: string[],\r\n content: string | null\r\n ) => { added: string[]; removed: string[] } | null\r\n // Batch 3 additions\r\n parseCssRules?: (css: string) => Array<{\r\n className: string; property: string; value: string\r\n isImportant: boolean; variants: string[]; specificity: number\r\n }>\r\n batchSplitClasses?: (classes: string[]) => Array<{\r\n variantKey: string; base: string; variants: string[]\r\n isArbitrary: boolean; hasModifier: boolean; modifier?: string\r\n }>\r\n detectClassConflicts?: (usagesJson: string) => {\r\n conflicts: Array<{ group: string; variantKey: string; classes: string[]; message: string }>\r\n conflictedClassNames: string[]\r\n }\r\n classifyKnownClasses?: (classes: string[], safelist: string[], customUtilities: string[]) => Array<{\r\n className: string; isKnown: boolean; variantKey: string; baseClass: string\r\n utilityPrefix: string; isArbitrary: boolean\r\n }>\r\n diffClassLists?: (previous: string[], current: string[]) => {\r\n added: string[]; removed: string[]; unchanged: string[]; hasChanges: boolean\r\n }\r\n // Incremental helpers (incremental.rs)\r\n applyClassDiff?: (existing: string[], added: string[], removed: string[]) => string[]\r\n areClassSetsEqual?: (a: string[], b: string[]) => boolean\r\n rebuildWorkspaceResult?: (files: Array<{ file: string; classes: string[] }>) => {\r\n files: Array<{ file: string; classes: string[] }>\r\n totalFiles: number\r\n uniqueClasses: string[]\r\n }\r\n // Batch 4\r\n parseCssToRules?: (css: string, prefix?: string | null) => Array<{\r\n className: string; property: string; value: string; important: boolean\r\n variants: string[]; pseudoClasses: string[]; mediaQuery: string | null\r\n specificity: number; layer: string | null\r\n }>\r\n calculateBundleContributions?: (classes: string[], css: string) => Array<{\r\n className: string; sizeBytes: number; variantChains: string[]\r\n dependencies: string[]; inCss: boolean\r\n }>\r\n detectDeadCode?: (scanResultJson: string, css: string) => {\r\n deadInCss: string[]; deadInSource: string[]; liveClasses: string[]\r\n totalCssClasses: number; totalSourceClasses: number\r\n }\r\n calculateImpactScores?: (\r\n classes: string[], scanResultJson: string, css: string,\r\n usageWeight: number, sizeWeight: number\r\n ) => Array<{\r\n className: string; usageScore: number; sizeScore: number\r\n impactScore: number; usageCount: number; sizeBytes: number\r\n }>\r\n analyzeClassUsage?: (\r\n classes: string[], scanResultJson: string, css: string\r\n ) => Array<{\r\n className: string; usageCount: number; filesJson: string\r\n bundleSizeBytes: number; isDeadCode: boolean\r\n }>\r\n extractAllClasses?: (css: string) => string[]\r\n /** Build variant prefix dependency chain. e.g. \"md:hover:bg-red\" → [\"md:\", \"md:hover:\"] */\r\n buildDependencyChain: (className: string) => string[]\r\n analyzeRouteClassDistribution?: (routeFilesJson: string, scanResultJson: string) => Array<{\r\n route: string; classes: string[]; exclusiveClasses: string[]; classCount: number\r\n }>\r\n /**\r\n * Resolve CSS cascade for a set of rules — pure Rust computation.\r\n *\r\n * Rust #[napi] signature:\r\n * pub fn resolve_cascade(rules_json: String) -> String\r\n *\r\n * Input JSON: Array<{ id: number, property: number, origin: number,\r\n * importance: number, layerOrder: number, specificity: number,\r\n * conditionResult: number, insertionOrder: number }>\r\n *\r\n * Output JSON: { resolutions: Array<{ id: number, propertyId: number,\r\n * winnerId: number, loserIds: number[], stage: number,\r\n * finalDecision: string, causes: Array<{ type: string, [key: string]: unknown }> }> }\r\n */\r\n resolveCascade?: (rulesJson: string) => string\r\n /** FNV-1a fingerprint over ordered string parts — replaces createFingerprint() in ir.ts */\r\n createFingerprint?: (parts: string[]) => string\r\n /** DashMap-backed CSS reverse lookup — replaces ReverseLookup class */\r\n reverseLookupFromCss?: (css: string, property: string, value: string) => Array<{\r\n property: string; value: string\r\n usedInClasses: Array<{ className: string; specificity: number; isOverride: boolean; variants: string[] }>\r\n }>\r\n reverseLookupByProperty?: (css: string, property: string) => Array<{\r\n property: string; value: string\r\n usedInClasses: Array<{ className: string; specificity: number; isOverride: boolean; variants: string[] }>\r\n }>\r\n reverseLookupFindDependents?: (css: string, className: string) => string[]\r\n reverseLookupClearCache?: () => void\r\n reverseLookupCacheSize?: () => number\r\n // Impact analysis (impact_analysis.rs)\r\n calculateImpact?: (impactJson: string) => string\r\n\r\n isCriticalClass?: (className: string) => boolean\r\n generateSuggestions?: (className: string, impactJson: string) => string[]\r\n computeImpactMetadata?: (className: string, impactJson: string) => string\r\n idRegistryActiveCount?: () => number\r\n\r\n/*\r\n // Impact scorer granular (impact_scorer.rs)\r\n // Dipakai oleh ImpactTracker sebagai alternatif calculateImpact yang lebih granular.\r\n isCriticalClass?: (className: string) => boolean\r\n generateSuggestions?: (className: string, impactJson: string) => string[]\r\n /**\r\n * Compute risk + savings + suggestions dalam satu call.\r\n * Menggantikan 3 call terpisah: calculateRisk + calculateSavings + generateSuggestions.\r\n * Input: {className, totalComponents, indirectUsage, bundleSizeBytes}\r\n * Output JSON: {riskLevel, estimatedSavings, suggestions}\r\n *\\/\r\n computeImpactMetadata?: (className: string, impactJson: string) => string\r\n \r\n // ID Registry diagnostics (id_registry.rs)\r\n idRegistryActiveCount?: () => number\r\n*/\r\n\r\n calculateRisk?: (className: string, totalComponents: number) => string\r\n calculateSavings?: (bundleSizeBytes: number, componentCount: number) => number\r\n // Class utilities (class_utils.rs) — menggantikan cn() di cx.ts\r\n resolveClassNames?: (inputs: string[]) => string\r\n // Property/Value name registry (domain/model.rs) — menggantikan in-memory Maps di ir.ts\r\n registerPropertyName?: (id: number, name: string) => void\r\n registerValueName?: (id: number, name: string) => void\r\n propertyIdToString?: (id: number) => string\r\n valueIdToString?: (id: number) => string\r\n clearNameRegistries?: () => void\r\n}\r\n\r\nconst isValidEngineBinding = (module: unknown): module is NativeEngineBinding => {\r\n const candidate = module as Partial<NativeEngineBinding> | null | undefined\r\n return !!(\r\n candidate &&\r\n (candidate.computeIncrementalDiff || candidate.processFileChange || candidate.hashFileContent)\r\n )\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createEngineBindingLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeEngineBinding | null | undefined,\r\n loadError: null as string | null,\r\n candidatePaths: [] as string[],\r\n }\r\n\r\n const throwNativeBindingError = (): never => {\r\n const lines = [\r\n \"FATAL: Native engine binding not found.\",\r\n \"\",\r\n \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\r\n \"The binding was not found in any of these paths:\",\r\n ..._state.candidatePaths.map((p) => ` - ${p}`),\r\n \"\",\r\n ]\r\n\r\n if (_state.loadError) {\r\n lines.push(\"Load error:\", ` ${_state.loadError}`, \"\")\r\n }\r\n\r\n lines.push(\r\n \"To fix this, run:\",\r\n \" npm run build:rust\",\r\n \"\",\r\n \"This will build the native Rust module from the 'native/' directory.\",\r\n \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\r\n \"and 'npm run build:rust' is executed before running tests or building.\"\r\n )\r\n\r\n throw new TwError(\"rust\", \"ENGINE_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\r\n }\r\n\r\n const getBinding = (): NativeEngineBinding => {\r\n const cached = _state.binding\r\n if (cached !== undefined) {\r\n if (cached === null) {\r\n return throwNativeBindingError()\r\n }\r\n return cached\r\n }\r\n\r\n const runtimeDir = getDirname()\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n includeDefaultCandidates: true,\r\n })\r\n\r\n _state.candidatePaths = candidates\r\n\r\n const { binding, loadErrors } = loadNativeBinding<NativeEngineBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isValidEngineBinding,\r\n invalidExportMessage: \"Module loaded but missing expected engine binding functions\",\r\n })\r\n\r\n if (binding) {\r\n log(`engine native binding loaded successfully`)\r\n _state.binding = binding\r\n return binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\r\n }\r\n\r\n _state.binding = null\r\n return throwNativeBindingError()\r\n }\r\n\r\n return {\r\n get: getBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.loadError = null\r\n _state.candidatePaths = []\r\n },\r\n }\r\n}\r\n\r\nconst engineBindingLoader = createEngineBindingLoader()\r\n\r\nexport function getNativeEngineBinding(): NativeEngineBinding {\r\n return engineBindingLoader.get()\r\n}\r\n\r\nexport function computeIncrementalDiff(\r\n previousJson: string,\r\n currentJson: string\r\n): {\r\n addedClasses: string[]\r\n removedClasses: string[]\r\n changedFiles: string[]\r\n unchangedFiles: number\r\n} {\r\n const result = getNativeEngineBinding().computeIncrementalDiff?.(previousJson, currentJson)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"ENGINE_DIFF_FAILED\",\r\n \"Native computeIncrementalDiff returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function hashFileContent(content: string): string {\r\n const result = getNativeEngineBinding().hashFileContent?.(content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"ENGINE_HASH_FAILED\",\r\n \"Native hashFileContent returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function processFileChange(\r\n filepath: string,\r\n newClasses: string[],\r\n content: string | null\r\n): { added: string[]; removed: string[] } {\r\n const result = getNativeEngineBinding().processFileChange?.(filepath, newClasses, content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"ENGINE_PROCESS_FAILED\",\r\n \"Native processFileChange returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Route-level CSS analysis\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface RouteClassMap {\r\n route: string\r\n classes: string[]\r\n exclusiveClasses: string[]\r\n classCount: number\r\n}\r\n\r\n/**\r\n * Analisis distribusi classes per route — untuk CSS code splitting.\r\n *\r\n * @param routeFiles - map { route: filePath[] } menentukan file mana ke route mana\r\n * @param scanResult - hasil scan workspace\r\n *\r\n * @example\r\n * const routes = analyzeRouteClassDistribution(\r\n * { \"/\": [\"src/app/page.tsx\"], \"/about\": [\"src/app/about/page.tsx\"] },\r\n * scanResult\r\n * )\r\n */\r\nexport function analyzeRouteClassDistribution(\r\n routeFiles: Record<string, string[]>,\r\n scanResult: { files: Array<{ file: string; classes: string[] }> }\r\n): RouteClassMap[] {\r\n const native = getNativeEngineBinding()\r\n if (!native?.analyzeRouteClassDistribution) {\r\n throw new Error(\"FATAL: Native binding 'analyzeRouteClassDistribution' is required but not available.\")\r\n }\r\n return native.analyzeRouteClassDistribution(\r\n JSON.stringify(routeFiles),\r\n JSON.stringify(scanResult)\r\n ) as RouteClassMap[]\r\n}\r\n\r\n// ═══════════════════════════════════════════════════════════════════════════\r\n \r\n/*\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// ID Registry diagnostics\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n \r\n/**\r\n * Jumlah ID registry yang aktif saat ini.\r\n * Berguna untuk diagnostics dan memory leak detection di development.\r\n *\r\n * @example\r\n * console.log(`Active registries: ${getIdRegistryActiveCount()}`)\r\n *\\/\r\nexport function getIdRegistryActiveCount(): number {\r\n return getNativeEngineBinding().idRegistryActiveCount?.() ?? 0\r\n}\r\n*/\r\n\r\nexport function getIdRegistryActiveCount(): number {\r\n return getNativeEngineBinding().idRegistryActiveCount?.() ?? 0\r\n}","/**\r\n * tailwind-styled-v5 — Compiler Index\r\n * \r\n * All functions are backed by native Rust bindings.\r\n * No JavaScript fallback - native is required.\r\n */\r\n\r\nimport { getNativeBridge, resetNativeBridgeCache, adaptNativeResult, type NativeBridge, type NativeTransformResult, type ClassExtractResult, type ComponentMetadata, type NativeRscResult } from \"./nativeBridge\"\r\n\r\nexport { getNativeBridge, resetNativeBridgeCache, adaptNativeResult }\r\nexport type { NativeBridge, NativeTransformResult, ClassExtractResult, ComponentMetadata, NativeRscResult }\r\n\r\nexport type LoaderOutput = {\r\n code: string\r\n changed: boolean\r\n classes: string[]\r\n}\r\n\r\n// =============================================================================\r\n// CORE TRANSFORM FUNCTIONS\r\n// =============================================================================\r\n\r\nexport const transformSource = (source: string, opts?: Record<string, unknown>) => {\r\n const native = getNativeBridge()\r\n if (!native?.transformSource) {\r\n throw new Error(\"FATAL: Native binding 'transformSource' is required but not available.\")\r\n }\r\n const result = native.transformSource(source, opts as Record<string, string>)\r\n if (!result) {\r\n throw new Error(\"FATAL: transformSource returned null\")\r\n }\r\n return result\r\n}\r\n\r\nexport const hasTwUsage = (source: string): boolean => {\r\n const native = getNativeBridge()\r\n if (!native?.hasTwUsage) {\r\n throw new Error(\"FATAL: Native binding 'hasTwUsage' is required but not available.\")\r\n }\r\n return native.hasTwUsage(source)\r\n}\r\n\r\nexport const isAlreadyTransformed = (source: string): boolean => {\r\n const native = getNativeBridge()\r\n if (!native?.isAlreadyTransformed) {\r\n throw new Error(\"FATAL: Native binding 'isAlreadyTransformed' is required but not available.\")\r\n }\r\n return native.isAlreadyTransformed(source)\r\n}\r\n\r\nexport const shouldProcess = (source: string): boolean => {\r\n return hasTwUsage(source) && !isAlreadyTransformed(source)\r\n}\r\n\r\n// =============================================================================\r\n// CSS COMPILATION\r\n// =============================================================================\r\n\r\nexport const compileCssFromClasses = (classes: string[], prefix?: string | null) => {\r\n const native = getNativeBridge()\r\n if (!native?.transformSource) {\r\n throw new Error(\"FATAL: Native binding 'transformSource' is required but not available.\")\r\n }\r\n const result = native.transformSource(classes.join(\" \"), { prefix: prefix ?? \"\" })\r\n if (!result) {\r\n throw new Error(\"FATAL: transformSource returned null\")\r\n }\r\n return result\r\n}\r\n\r\nexport const buildStyleTag = (classes: string[]): string => {\r\n const result = compileCssFromClasses(classes)\r\n return result?.code ? `<style data-tailwind-styled>${result.code}</style>` : \"\"\r\n}\r\n\r\nexport const compileCssNative = (classes: string[], prefix: string | null = null) => {\r\n return compileCssFromClasses(classes, prefix)\r\n}\r\n\r\nexport const generateCssForClasses = async (\r\n classes: string[],\r\n _tailwindConfig?: Record<string, unknown>,\r\n _root?: string\r\n): Promise<string> => {\r\n const { runCssPipeline } = await import(\"./tailwindEngine\")\r\n const result = await runCssPipeline(classes)\r\n return result.css\r\n}\r\n\r\n// =============================================================================\r\n// CLASS EXTRACTION\r\n// =============================================================================\r\n\r\nexport const extractAllClasses = (source: string): string[] => {\r\n const native = getNativeBridge()\r\n if (!native?.extractAllClasses) {\r\n throw new Error(\"FATAL: Native binding 'extractAllClasses' is required but not available.\")\r\n }\r\n return native.extractAllClasses(source) || []\r\n}\r\n\r\nexport const extractClassesFromSource = (source: string): string => {\r\n const native = getNativeBridge()\r\n if (!native?.extractClassesFromSource) {\r\n throw new Error(\"FATAL: Native binding 'extractClassesFromSource' is required but not available.\")\r\n }\r\n const result = native.extractClassesFromSource(source)\r\n return Array.isArray(result) ? result.join(\" \") : String(result || \"\")\r\n}\r\n\r\nexport const astExtractClasses = (source: string, filename: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.extractClassesFromSource) {\r\n throw new Error(\"FATAL: Native binding 'extractClassesFromSource' is required but not available.\")\r\n }\r\n return native.extractClassesFromSource(source) || []\r\n}\r\n\r\nexport const parseClasses = (raw: string): Array<{ raw: string; type: string }> => {\r\n const native = getNativeBridge()\r\n if (!native?.parseClasses) {\r\n throw new Error(\"FATAL: Native binding 'parseClasses' is required but not available.\")\r\n }\r\n return native.parseClasses(raw) || []\r\n}\r\n\r\n// =============================================================================\r\n// CLASS NORMALIZATION & MERGING\r\n// =============================================================================\r\n\r\nexport const normalizeClasses = (raw: string): string => {\r\n const result = normalizeAndDedupClasses(raw)\r\n return result?.normalized || \"\"\r\n}\r\n\r\nexport const mergeClassesStatic = (classes: string): string => {\r\n const result = normalizeAndDedupClasses(classes)\r\n return result?.normalized || \"\"\r\n}\r\n\r\nexport const normalizeAndDedupClasses = (raw: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.normalizeAndDedupClasses) {\r\n throw new Error(\"FATAL: Native binding 'normalizeAndDedupClasses' is required but not available.\")\r\n }\r\n const result = native.normalizeAndDedupClasses(raw)\r\n return result || { normalized: \"\", duplicatesRemoved: 0, uniqueCount: 0 }\r\n}\r\n\r\n// =============================================================================\r\n// DEAD STYLE ELIMINATOR\r\n// =============================================================================\r\n\r\nexport const eliminateDeadCss = (css: string, deadClasses: Set<string>): string => {\r\n const native = getNativeBridge()\r\n if (!native?.processTailwindCssLightning) {\r\n throw new Error(\"FATAL: Native binding 'processTailwindCssLightning' is required but not available.\")\r\n }\r\n\r\n // Build pruned CSS by stripping dead selectors then minify via Lightning\r\n const deadSet = deadClasses\r\n const pruned = css\r\n .split(/(?<=\\})\\s*/)\r\n .filter((rule) => {\r\n const m = rule.match(/\\.([a-zA-Z0-9_-]+)/)\r\n return !m || !deadSet.has(m[1])\r\n })\r\n .join(\"\\n\")\r\n\r\n const compiled = native.processTailwindCssLightning(pruned) as { css: string } | null\r\n return (compiled?.css ?? pruned).trim()\r\n}\r\n\r\nexport const findDeadVariants = (\r\n variantConfig: Record<string, unknown> | Array<{ name: string; variants: Record<string, Record<string, string>>; defaultVariants?: Record<string, string> }>,\r\n usage: Record<string, Set<string>>\r\n) => {\r\n const unused: string[] = []\r\n\r\n // Support both array-of-components form and raw variants object form\r\n const configs = Array.isArray(variantConfig)\r\n ? variantConfig\r\n : [{ name: \"__root__\", variants: variantConfig as Record<string, Record<string, string>> }]\r\n\r\n for (const component of configs) {\r\n const componentUsage = usage[component.name] ?? new Set<string>()\r\n const variants = component.variants as Record<string, Record<string, string>>\r\n for (const [key, values] of Object.entries(variants)) {\r\n for (const [value] of Object.entries(values)) {\r\n if (!componentUsage.has(`${key}:${value}`)) {\r\n unused.push(`${component.name !== \"__root__\" ? `${component.name}/` : \"\"}${key}:${value}`)\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n unusedCount: unused.length,\r\n unused,\r\n }\r\n}\r\n\r\nexport const runElimination = (css: string, scanResult: unknown): string => {\r\n const native = getNativeBridge()\r\n if (!native?.detectDeadCode) {\r\n throw new Error(\"FATAL: Native binding 'detectDeadCode' is required but not available.\")\r\n }\r\n\r\n const dead = native.detectDeadCode(\r\n JSON.stringify(scanResult),\r\n css\r\n ) as { deadInCss: string[] }\r\n\r\n return eliminateDeadCss(css, new Set(dead.deadInCss ?? []))\r\n}\r\n\r\nexport const optimizeCss = (css: string): string => {\r\n const native = getNativeBridge()\r\n\r\n // Step 1: detect dead CSS classes (native Rust — HashSet diff)\r\n if (!native?.detectDeadCode) {\r\n throw new Error(\"FATAL: Native binding 'detectDeadCode' is required but not available.\")\r\n }\r\n const deadResult = native.detectDeadCode(\r\n JSON.stringify({ uniqueClasses: [] }),\r\n css\r\n ) as { deadInCss: string[]; liveClasses: string[] }\r\n\r\n // Step 2: minify via Rust Lightning CSS compiler\r\n if (!native?.processTailwindCssLightning) {\r\n throw new Error(\"FATAL: Native binding 'processTailwindCssLightning' is required but not available.\")\r\n }\r\n\r\n // Strip dead selectors then pass through Lightning CSS\r\n const deadSet = new Set(deadResult.deadInCss ?? [])\r\n const pruned = css\r\n .split(/(?<=\\})\\s*/)\r\n .filter((rule) => {\r\n const selectorMatch = rule.match(/\\.([a-zA-Z0-9_-]+)/)\r\n if (!selectorMatch) return true\r\n return !deadSet.has(selectorMatch[1])\r\n })\r\n .join(\"\\n\")\r\n\r\n const compiled = native.processTailwindCssLightning(pruned) as { css: string } | null\r\n return (compiled?.css ?? pruned).trim()\r\n}\r\n\r\nexport const scanProjectUsage = (dirs: string[], cwd: string) => {\r\n const path = require('node:path')\r\n const files = dirs.map(dir => path.resolve(cwd, dir))\r\n const results = batchExtractClasses(files) || []\r\n \r\n const combined: Record<string, Record<string, Set<string>>> = {}\r\n for (const result of results) {\r\n if (result.ok && result.classes) {\r\n for (const cls of result.classes) {\r\n if (!combined[cls]) combined[cls] = {}\r\n combined[cls][result.file] = new Set([cls])\r\n }\r\n }\r\n }\r\n return combined\r\n}\r\n\r\n// =============================================================================\r\n// COMPONENT ANALYSIS\r\n// =============================================================================\r\n\r\nexport const extractComponentUsage = (source: string): Array<{ component: string; propsJson: string }> => {\r\n const native = getNativeBridge()\r\n if (!native?.extractComponentUsage) {\r\n throw new Error(\"FATAL: Native binding 'extractComponentUsage' is required but not available.\")\r\n }\r\n return native.extractComponentUsage(source) || []\r\n}\r\n\r\n// =============================================================================\r\n// DIFF & BATCH OPERATIONS\r\n// =============================================================================\r\n\r\nexport const diffClassLists = (previous: string[], current: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.diffClassLists) {\r\n throw new Error(\"FATAL: Native binding 'diffClassLists' is required but not available.\")\r\n }\r\n return native.diffClassLists(previous, current) || { added: [], removed: [], unchanged: [], hasChanges: false }\r\n}\r\n\r\nexport const batchExtractClasses = (filePaths: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.batchExtractClasses) {\r\n throw new Error(\"FATAL: Native binding 'batchExtractClasses' is required but not available.\")\r\n }\r\n return native.batchExtractClasses(filePaths) || []\r\n}\r\n\r\nexport const checkAgainstSafelist = (classes: string[], safelist: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.checkAgainstSafelist) {\r\n throw new Error(\"FATAL: Native binding 'checkAgainstSafelist' is required but not available.\")\r\n }\r\n return native.checkAgainstSafelist(classes, safelist) || { matched: [], unmatched: [], safelistSize: 0 }\r\n}\r\n\r\n// =============================================================================\r\n// HOISTING\r\n// =============================================================================\r\n\r\nexport const hoistComponents = (source: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.hoistComponents) {\r\n throw new Error(\"FATAL: Native binding 'hoistComponents' is required but not available.\")\r\n }\r\n return native.hoistComponents(source) || { code: source, hoisted: [], warnings: [] }\r\n}\r\n\r\n// =============================================================================\r\n// VARIANT COMPILATION\r\n// =============================================================================\r\n\r\nexport const compileVariantTable = (configJson: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.compileVariantTable) {\r\n throw new Error(\"FATAL: Native binding 'compileVariantTable' is required but not available.\")\r\n }\r\n return native.compileVariantTable(configJson) || { id: \"\", tableJson: \"{}\", keys: [], defaultKey: \"\", combinations: 0 }\r\n}\r\n\r\nexport const compileVariants = (componentId: string, config: Record<string, unknown>) => {\r\n return compileVariantTable(JSON.stringify({ componentId, ...config }))\r\n}\r\n\r\n// =============================================================================\r\n// CSS ANALYSIS\r\n// =============================================================================\r\n\r\nexport const classifyAndSortClasses = (classes: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.classifyAndSortClasses) {\r\n throw new Error(\"FATAL: Native binding 'classifyAndSortClasses' is required but not available.\")\r\n }\r\n return native.classifyAndSortClasses(classes) || []\r\n}\r\n\r\nexport const mergeCssDeclarations = (cssChunks: string[]) => {\r\n const native = getNativeBridge()\r\n if (!native?.mergeCssDeclarations) {\r\n throw new Error(\"FATAL: Native binding 'mergeCssDeclarations' is required but not available.\")\r\n }\r\n return native.mergeCssDeclarations(cssChunks) || { declarationsJson: \"{}\", declarationString: \"\", count: 0 }\r\n}\r\n\r\nexport const analyzeClassUsage = (classes: string[], scanResultJson: string, css: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeClassUsage) {\r\n throw new Error(\"FATAL: Native binding 'analyzeClassUsage' is required but not available.\")\r\n }\r\n return native.analyzeClassUsage(classes, scanResultJson, css) || []\r\n}\r\n\r\n// =============================================================================\r\n// RSC ANALYSIS\r\n// =============================================================================\r\n\r\nexport const analyzeRsc = (source: string, filename: string) => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeRsc) {\r\n throw new Error(\"FATAL: Native binding 'analyzeRsc' is required but not available.\")\r\n }\r\n return native.analyzeRsc(source, filename) || { isServer: true, needsClientDirective: false, clientReasons: [] }\r\n}\r\n\r\nexport const analyzeFile = (source: string, filename: string) => {\r\n const rsc = analyzeRsc(source, filename)\r\n return {\r\n isServer: rsc?.isServer ?? true,\r\n needsClientDirective: rsc?.needsClientDirective ?? false,\r\n clientReasons: rsc?.clientReasons ?? [],\r\n interactiveClasses: [],\r\n canStaticResolveVariants: true,\r\n }\r\n}\r\n\r\nexport const analyzeVariantUsage = (source: string, componentName: string, variantKeys: string[]) => {\r\n const rsc = analyzeRsc(source, componentName)\r\n return { \r\n resolved: {} as Record<string, string>, \r\n dynamic: [] as string[] \r\n }\r\n}\r\n\r\nexport const injectClientDirective = (source: string): string => {\r\n if (!source.includes('\"use client\"') && !source.includes(\"'use client'\")) {\r\n return '\"use client\";\\n' + source\r\n }\r\n return source\r\n}\r\n\r\nexport const injectServerOnlyComment = (source: string): string => {\r\n return `/* @server-only */\\n${source}`\r\n}\r\n\r\n// =============================================================================\r\n// FULL ANALYSIS\r\n// =============================================================================\r\n\r\nexport const analyzeClasses = (filesJson: string, cwd: string, flags: number) => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeClasses) {\r\n throw new Error(\"FATAL: Native binding 'analyzeClasses' is required but not available.\")\r\n }\r\n return native.analyzeClasses(filesJson, cwd, flags)\r\n}\r\n\r\n// =============================================================================\r\n// SAFELIST\r\n// =============================================================================\r\n\r\nexport const generateSafelist = (scanDirs: string[], outputPath?: string, cwd?: string) => {\r\n const classes = scanProjectUsage(scanDirs, cwd || process.cwd())\r\n const allClasses = Object.keys(classes).sort()\r\n \r\n if (outputPath) {\r\n const fs = require('node:fs')\r\n fs.writeFileSync(outputPath, JSON.stringify(allClasses, null, 2))\r\n }\r\n \r\n return allClasses\r\n}\r\n\r\nexport const loadSafelist = (safelistPath: string): string[] => {\r\n const fs = require('node:fs')\r\n try {\r\n const content = fs.readFileSync(safelistPath, 'utf-8')\r\n return JSON.parse(content)\r\n } catch {\r\n return []\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// CONFIG LOADING\r\n// =============================================================================\r\n\r\nexport const loadTailwindConfig = (cwd: string = process.cwd()) => {\r\n const fs = require('node:fs')\r\n const path = require('node:path')\r\n \r\n const configFiles = [\r\n 'tailwind.config.ts',\r\n 'tailwind.config.js',\r\n 'tailwind.config.mjs',\r\n 'tailwind.config.cjs',\r\n ]\r\n \r\n for (const file of configFiles) {\r\n const fullPath = path.join(cwd, file)\r\n if (fs.existsSync(fullPath)) {\r\n const mod = require(fullPath)\r\n return mod.default || mod\r\n }\r\n }\r\n \r\n return {}\r\n}\r\n\r\nexport const getContentPaths = (cwd: string = process.cwd()) => {\r\n const path = require('node:path')\r\n return {\r\n content: [\r\n path.join(cwd, 'src/**/*.{js,ts,jsx,tsx}'),\r\n path.join(cwd, 'app/**/*.{js,ts,jsx,tsx}'),\r\n path.join(cwd, 'pages/**/*.{js,ts,jsx,tsx}'),\r\n ],\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// LOADER\r\n// =============================================================================\r\n\r\nexport const runLoaderTransform = (ctx: { filepath: string; source: string; options?: Record<string, unknown> }) => {\r\n const { filepath, source, options } = ctx\r\n const result = transformSource(source, { filename: filepath, ...options })\r\n return {\r\n code: result?.code || \"\",\r\n changed: result?.changed || false,\r\n classes: result?.classes || [],\r\n } as LoaderOutput\r\n}\r\n\r\nexport const shouldSkipFile = (filepath: string): boolean => {\r\n const SKIP_PATHS = ['node_modules', '.next', '.rspack-dist', '.turbo', 'dist/', 'out/']\r\n const skipExtensions = ['.css', '.json', '.md', '.txt', '.yaml', '.yml']\r\n \r\n for (const p of SKIP_PATHS) {\r\n if (filepath.includes(p)) return true\r\n }\r\n for (const ext of skipExtensions) {\r\n if (filepath.endsWith(ext)) return true\r\n }\r\n return false\r\n}\r\n\r\n// =============================================================================\r\n// ROUTE CSS COLLECTOR\r\n// =============================================================================\r\n\r\nexport const fileToRoute = (filepath: string): string | null => {\r\n const normalized = filepath.replace(/\\\\/g, '/')\r\n \r\n if (normalized.includes('/layout.') || normalized.includes('/loading.') || normalized.includes('/error.')) {\r\n return '__global'\r\n }\r\n \r\n const pageMatch = normalized.match(/\\/app\\/(.+?)\\/page\\.[tj]sx?$/)\r\n if (pageMatch) return `/${pageMatch[1]}`\r\n \r\n const rootPage = normalized.match(/\\/app\\/page\\.[tj]sx?$/)\r\n if (rootPage) return '/'\r\n \r\n return null\r\n}\r\n\r\nexport const getAllRoutes = (): string[] => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeClasses) {\r\n throw new Error(\"FATAL: Native binding 'analyzeClasses' is required but not available.\")\r\n }\r\n return ['/', '__global']\r\n}\r\n\r\nexport const getRouteClasses = (_route: string): Set<string> => {\r\n return new Set()\r\n}\r\n\r\nexport const registerFileClasses = (_filepath: string, _classes: string[]): void => {\r\n // Delegated to native scan cache — no-op at JS layer\r\n}\r\n\r\nexport const registerGlobalClasses = (_classes: string[]): void => {\r\n // Delegated to native scan cache — no-op at JS layer\r\n}\r\n\r\n// =============================================================================\r\n// INCREMENTAL ENGINE\r\n// =============================================================================\r\n\r\n// =============================================================================\r\n// INCREMENTAL ENGINE\r\n// =============================================================================\r\n\r\nlet _incrementalEngineInstance: InstanceType<typeof IncrementalEngine> | null = null\r\n\r\nexport const getIncrementalEngine = () => {\r\n if (!_incrementalEngineInstance) {\r\n _incrementalEngineInstance = new IncrementalEngine()\r\n }\r\n return _incrementalEngineInstance\r\n}\r\n\r\nexport const resetIncrementalEngine = (): void => {\r\n _incrementalEngineInstance = null\r\n}\r\n\r\nexport const IncrementalEngine = class {\r\n compile(source: string) {\r\n return transformSource(source)\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// STYLE BUCKET SYSTEM\r\n// =============================================================================\r\n\r\nexport const getBucketEngine = () => {\r\n const native = getNativeBridge()\r\n if (!native?.classifyAndSortClasses) {\r\n throw new Error(\"FATAL: Native binding 'classifyAndSortClasses' is required but not available.\")\r\n }\r\n return {\r\n add: (className: string) => className,\r\n get: (_bucket: string): string[] => [],\r\n }\r\n}\r\n\r\nexport const resetBucketEngine = (): void => {\r\n // Native engine manages its own state — no JS instance to reset\r\n}\r\n\r\nexport const BucketEngine = class {\r\n add(className: string) {\r\n return className\r\n }\r\n}\r\n\r\nexport const classifyNode = (_node: unknown): string => {\r\n const native = getNativeBridge()\r\n if (!native?.classifyAndSortClasses) {\r\n throw new Error(\"FATAL: Native binding 'classifyAndSortClasses' is required but not available.\")\r\n }\r\n return 'unknown'\r\n}\r\n\r\nexport const detectConflicts = (classes: string[]): string[] => {\r\n const native = getNativeBridge()\r\n if (!native?.analyzeClassUsage) {\r\n throw new Error(\"FATAL: Native binding 'analyzeClassUsage' is required but not available.\")\r\n }\r\n return []\r\n}\r\n\r\nexport const bucketSort = (classes: string[]): string[] => {\r\n return classifyAndSortClasses(classes).map((c) => (c as { raw?: string; class?: string }).raw ?? (c as unknown as string))\r\n}","import path from \"node:path\"\r\n\r\nimport type { ScanWorkspaceResult } from \"@tailwind-styled/scanner\"\r\nimport { scanWorkspaceAsync } from \"@tailwind-styled/scanner\"\r\n\r\nimport { requireNativeBinding } from \"./binding\"\r\nimport { parseAnalyzerOptions, parseNativeReport } from \"./schemas\"\r\nimport { buildSemanticReport } from \"./semantic\"\r\nimport type { AnalyzerOptions, AnalyzerReport, ClassUsage } from \"./types\"\r\nimport { debugLog, formatErrorMessage, sanitizeFrequentThreshold, sanitizeTopLimit } from \"./utils\"\r\n\r\nfunction normalizeScan(\r\n scan: ScanWorkspaceResult,\r\n includeClass?: (className: string) => boolean\r\n): ScanWorkspaceResult {\r\n if (!includeClass) return scan\r\n\r\n const filteredFiles = scan.files.map((file) => ({\r\n file: file.file,\r\n classes: file.classes.filter((className) => includeClass(className)),\r\n }))\r\n\r\n const unique = new Set<string>()\r\n for (const file of filteredFiles) {\r\n for (const className of file.classes) {\r\n unique.add(className)\r\n }\r\n }\r\n\r\n return {\r\n files: filteredFiles,\r\n totalFiles: scan.totalFiles,\r\n uniqueClasses: Array.from(unique).sort(),\r\n }\r\n}\r\n\r\nexport async function collectClassCounts(scan: ScanWorkspaceResult): Promise<Map<string, number>> {\r\n const native = await requireNativeBinding()\r\n if (!native?.collectClassCounts) {\r\n throw new Error(\"FATAL: Native binding 'collectClassCounts' is required but not available.\")\r\n }\r\n const filesJson = JSON.stringify(\r\n scan.files.map((f) => ({ file: f.file ?? \"\", classes: f.classes }))\r\n )\r\n const result = native.collectClassCounts(filesJson) as Array<{ name: string; count: number }>\r\n const counts = new Map<string, number>()\r\n for (const entry of result) counts.set(entry.name, entry.count)\r\n return counts\r\n}\r\n\r\nfunction buildClassUsage(counts: Map<string, number>): ClassUsage[] {\r\n return Array.from(counts.entries())\r\n .map(([name, count]) => ({ name, count }))\r\n .sort((left, right) => {\r\n if (right.count !== left.count) return right.count - left.count\r\n return left.name.localeCompare(right.name)\r\n })\r\n}\r\n\r\nexport async function buildDistribution(\r\n usages: ClassUsage[],\r\n native?: Awaited<ReturnType<typeof requireNativeBinding>>\r\n): Promise<Record<string, number>> {\r\n const binding = native ?? (await requireNativeBinding())\r\n if (!binding?.buildDistribution) {\r\n throw new Error(\"FATAL: Native binding 'buildDistribution' is required but not available.\")\r\n }\r\n const result = binding.buildDistribution(\r\n JSON.stringify(usages.map((u) => ({ name: u.name, count: u.count })))\r\n ) as { once: number; few: number; moderate: number; frequent: number }\r\n return {\r\n \"1\": result.once,\r\n \"2-3\": result.few,\r\n \"4-7\": result.moderate,\r\n \"8+\": result.frequent,\r\n }\r\n}\r\n\r\n/**\r\n * Analyze Tailwind class usage in a workspace and return usage statistics.\r\n * Set `semantic.tailwindConfigPath` to override Tailwind config lookup.\r\n * @example\r\n * const report = await analyzeWorkspace(\"./src\", {\r\n * classStats: { top: 20, frequentThreshold: 2 },\r\n * semantic: { tailwindConfigPath: \"tailwind.config.js\" },\r\n * })\r\n */\r\nexport async function analyzeWorkspace(\r\n root: string,\r\n options: AnalyzerOptions = {}\r\n): Promise<AnalyzerReport> {\r\n const startedAtMs = Date.now()\r\n const resolvedRoot = path.resolve(root)\r\n const normalizedOptions = parseAnalyzerOptions(options)\r\n\r\n // 1. Scan workspace - const dengan IIFE async\r\n const scan = await (async () => {\r\n const scanStartedAtMs = Date.now()\r\n try {\r\n const result = await scanWorkspaceAsync(resolvedRoot, normalizedOptions.scanner)\r\n debugLog(\r\n `scanWorkspaceAsync processed ${result.totalFiles} files in ${Date.now() - scanStartedAtMs}ms`\r\n )\r\n return result\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to scan workspace at \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const normalizedScan = normalizeScan(scan, normalizedOptions.includeClass)\r\n const topLimit = sanitizeTopLimit(normalizedOptions.classStats?.top)\r\n const frequentThreshold = sanitizeFrequentThreshold(\r\n normalizedOptions.classStats?.frequentThreshold\r\n )\r\n\r\n const binding = await requireNativeBinding()\r\n const filesJson = JSON.stringify(\r\n normalizedScan.files.map((file) => ({ file: file.file, classes: file.classes }))\r\n )\r\n\r\n // 2. Native report - const dengan IIFE\r\n const nativeReport = (() => {\r\n try {\r\n const report = binding.analyzeClasses(filesJson, resolvedRoot, topLimit)\r\n if (!report) {\r\n throw new Error(`Native analyzer returned no report for \"${resolvedRoot}\".`)\r\n }\r\n return parseNativeReport(report)\r\n } catch (error) {\r\n throw new Error(\r\n `Native analyzer failed for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const counts = await collectClassCounts(normalizedScan)\r\n const baseAll = buildClassUsage(counts)\r\n\r\n // 3. Semantic report - const dengan IIFE async\r\n const { all, semanticReport } = await (async () => {\r\n if (!normalizedOptions.semantic) {\r\n return { all: baseAll, semanticReport: undefined }\r\n }\r\n\r\n const semanticOption =\r\n typeof normalizedOptions.semantic === \"object\" ? normalizedOptions.semantic : undefined\r\n const semanticStartedAtMs = Date.now()\r\n\r\n try {\r\n const report = await buildSemanticReport(baseAll, resolvedRoot, semanticOption)\r\n debugLog(`semantic report built in ${Date.now() - semanticStartedAtMs}ms`)\r\n\r\n if (report.conflicts.length === 0) {\r\n return { all: baseAll, semanticReport: report }\r\n }\r\n\r\n const conflicted = new Set(report.conflicts.flatMap((conflict) => conflict.classes))\r\n const updatedAll = baseAll.map((usage) =>\r\n conflicted.has(usage.name) ? { ...usage, isConflict: true } : usage\r\n )\r\n return { all: updatedAll, semanticReport: report }\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to build semantic report for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n { cause: error }\r\n )\r\n }\r\n })()\r\n\r\n // 4. Statistics — native-first: satu pass Rust vs 4× JS iterations\r\n const classStatsNative = binding?.computeClassStats?.(\r\n JSON.stringify(all),\r\n topLimit,\r\n frequentThreshold\r\n )\r\n const top: typeof all = classStatsNative ? JSON.parse(classStatsNative.topJson) : all.slice(0, topLimit)\r\n const frequent: typeof all = classStatsNative ? JSON.parse(classStatsNative.frequentJson) : all.filter((usage) => usage.count >= frequentThreshold).slice(0, topLimit)\r\n const unique: typeof all = classStatsNative ? JSON.parse(classStatsNative.uniqueJson) : all.filter((usage) => usage.count === 1)\r\n const totalClassOccurrences: number = classStatsNative\r\n ? classStatsNative.totalClassOccurrences\r\n : all.reduce((sum, usage) => sum + usage.count, 0)\r\n\r\n debugLog(\r\n `analyzeWorkspace completed in ${Date.now() - startedAtMs}ms ` +\r\n `(files=${normalizedScan.totalFiles}, uniqueClasses=${all.length})`\r\n )\r\n\r\n const distribution = await buildDistribution(all, binding)\r\n\r\n return {\r\n root: nativeReport.root || resolvedRoot,\r\n totalFiles: nativeReport.totalFiles,\r\n uniqueClassCount: all.length,\r\n totalClassOccurrences,\r\n classStats: {\r\n all,\r\n top,\r\n frequent,\r\n unique,\r\n distribution,\r\n },\r\n // topClasses — alias for classStats.top (test contract & backward compat)\r\n topClasses: top,\r\n safelist: all.map((usage) => usage.name),\r\n ...(semanticReport ? { semantic: semanticReport } : {}),\r\n }\r\n}","import {\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n resolveRuntimeDir,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nimport type { NativeAnalyzerBinding, NativeCssCompilerBinding } from \"./types\"\r\nimport { debugLog } from \"./utils\"\r\n\r\nconst isAnalyzerModule = (module: unknown): module is NativeAnalyzerBinding => {\r\n const candidate = module as Partial<NativeAnalyzerBinding> | null | undefined\r\n return typeof candidate?.analyzeClasses === \"function\"\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Analyzer Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createAnalyzerBindingLoader = () => {\r\n const _state = { bindingPromise: null as Promise<NativeAnalyzerBinding | null> | null }\r\n\r\n const getBindingPromise = (): Promise<NativeAnalyzerBinding | null> => {\r\n if (_state.bindingPromise) return _state.bindingPromise\r\n\r\n _state.bindingPromise = (async (): Promise<NativeAnalyzerBinding | null> => {\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { binding, loadErrors, loadedPath } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n if (binding) {\r\n debugLog(`native binding loaded from: ${loadedPath}`)\r\n return binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n debugLog(\r\n `native binding load failed for ${loadErrors.length} candidate(s): ${loadErrors\r\n .map((entry) => `${entry.path} (${entry.message})`)\r\n .join(\"; \")}`\r\n )\r\n } else {\r\n debugLog(\"native binding not found in any candidate path\")\r\n }\r\n\r\n return null\r\n })()\r\n\r\n return _state.bindingPromise\r\n }\r\n\r\n return {\r\n get: getBindingPromise,\r\n reset: (): void => {\r\n _state.bindingPromise = null\r\n },\r\n }\r\n}\r\n\r\nconst analyzerBindingLoader = createAnalyzerBindingLoader()\r\n\r\nexport async function getNativeBinding(): Promise<NativeAnalyzerBinding | null> {\r\n return analyzerBindingLoader.get()\r\n}\r\n\r\nexport async function requireNativeBinding(): Promise<NativeAnalyzerBinding> {\r\n const binding = await analyzerBindingLoader.get()\r\n if (binding?.analyzeClasses) return binding\r\n\r\n // Untuk error reporting, kita perlu akses ke candidates dan loadErrors\r\n // Tapi karena async, kita perlu load ulang atau simpan state\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { loadErrors } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n const lines = [\r\n \"Native analyzer binding not found. Ensure `tailwind_styled_parser.node` is built.\",\r\n ]\r\n\r\n lines.push(\"Checked paths:\")\r\n for (const candidate of candidates) lines.push(`- ${candidate}`)\r\n if (loadErrors.length > 0) {\r\n lines.push(\"Load errors:\")\r\n for (const failure of loadErrors) {\r\n lines.push(`- ${failure.path}: ${failure.message}`)\r\n }\r\n }\r\n\r\n throw new Error(lines.join(\"\\n\"))\r\n}\r\n\r\nexport async function requireNativeCssCompiler(): Promise<NativeCssCompilerBinding> {\r\n const binding = await requireNativeBinding()\r\n if (typeof binding.compileCss === \"function\") return binding as NativeCssCompilerBinding\r\n\r\n throw new Error(`Native analyzer compileCss binding is missing.`)\r\n}\r\n","import fs from \"node:fs\"\r\nimport { createDebugLogger } from \"@tailwind-styled/shared\"\r\n\r\nexport const DEFAULT_TOP_LIMIT = 10\r\nexport const DEFAULT_FREQUENT_THRESHOLD = 2\r\nexport const DEBUG_NAMESPACE = \"tailwind-styled:analyzer\"\r\n\r\nexport function formatErrorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nexport async function pathExists(filePath: string): Promise<boolean> {\r\n try {\r\n await fs.promises.access(filePath, fs.constants.F_OK)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport const debugLog = createDebugLogger(DEBUG_NAMESPACE, \"tailwind-styled/analyzer\")\r\n\r\nexport function sanitizeTopLimit(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_TOP_LIMIT\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n\r\nexport function sanitizeFrequentThreshold(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_FREQUENT_THRESHOLD\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n","import { TwError } from \"@tailwind-styled/shared\"\r\nimport type { ScanWorkspaceOptions } from \"@tailwind-styled/scanner\"\r\nimport { z } from \"zod\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst CountSchema = z.number().int().min(0)\r\n\r\nexport const ClassUsageSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n isUnused: z.boolean().optional(),\r\n isConflict: z.boolean().optional(),\r\n})\r\n\r\nexport const ClassConflictSchema = z.object({\r\n className: z.string(),\r\n variants: z.array(z.string()),\r\n classes: z.array(z.string()),\r\n message: z.string(),\r\n})\r\n\r\nconst ClassCountSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n})\r\n\r\nexport const NativeReportSchema = z.object({\r\n root: z.string(),\r\n totalFiles: CountSchema,\r\n uniqueClassCount: CountSchema,\r\n totalClassOccurrences: CountSchema,\r\n topClasses: z.array(ClassCountSchema),\r\n duplicateCandidates: z.array(ClassCountSchema),\r\n safelist: z.array(z.string()),\r\n})\r\n\r\nexport const NativeCssCompileResultSchema = z.object({\r\n css: z.string(),\r\n resolvedClasses: z.array(z.string()),\r\n unknownClasses: z.array(z.string()),\r\n sizeBytes: CountSchema,\r\n})\r\n\r\nconst AnalyzerClassStatsSchema = z.object({\r\n top: z\r\n .number({\r\n error: \"analyzeWorkspace options.classStats.top must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n frequentThreshold: z\r\n .number({\r\n error:\r\n \"analyzeWorkspace options.classStats.frequentThreshold must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n})\r\n\r\nconst AnalyzerSemanticOptionsSchema = z.object({\r\n tailwindConfigPath: z\r\n .string({\r\n error:\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\",\r\n })\r\n .min(\r\n 1,\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const AnalyzerOptionsSchema = z.object({\r\n scanner: z\r\n .custom<ScanWorkspaceOptions>(\r\n (value) => isPlainObject(value),\r\n \"analyzeWorkspace options.scanner must be an object when provided.\"\r\n )\r\n .optional(),\r\n classStats: AnalyzerClassStatsSchema.optional(),\r\n semantic: z\r\n .union([\r\n z.boolean({\r\n error: \"analyzeWorkspace options.semantic must be a boolean or an object when provided.\",\r\n }),\r\n AnalyzerSemanticOptionsSchema,\r\n ])\r\n .optional(),\r\n includeClass: z\r\n .custom<(className: string) => boolean>(\r\n (value) => typeof value === \"function\",\r\n \"analyzeWorkspace options.includeClass must be a function when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const ClassToCssOptionsSchema = z.object({\r\n prefix: z\r\n .union([z.string(), z.null()], {\r\n error: \"classToCss options.prefix must be a string or null when provided.\",\r\n })\r\n .optional(),\r\n strict: z\r\n .boolean({\r\n error: \"classToCss options.strict must be a boolean when provided.\",\r\n })\r\n .optional(),\r\n})\r\n\r\nexport const parseAnalyzerOptions = (options: unknown) =>\r\n parseWithSchema(AnalyzerOptionsSchema, options ?? {}, \"analyzeWorkspace options are invalid\")\r\n\r\nexport const parseNativeReport = (report: unknown) =>\r\n parseWithSchema(NativeReportSchema, report, \"Native analyzer report is invalid\")\r\n\r\nexport const parseNativeCssCompileResult = (result: unknown, className?: string) =>\r\n parseWithSchema(\r\n NativeCssCompileResultSchema,\r\n result,\r\n className\r\n ? `Native CSS compile result is invalid for class \"${className}\"`\r\n : \"Native CSS compile result is invalid\"\r\n )\r\n\r\nexport const parseClassToCssOptions = (options: unknown) =>\r\n parseWithSchema(ClassToCssOptionsSchema, options ?? {}, \"classToCss options are invalid\")\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { pathToFileURL } from \"node:url\"\r\n\r\nimport type {\r\n AnalyzerSemanticReport,\r\n ClassConflict,\r\n ClassUsage,\r\n LoadedTailwindConfig,\r\n TailwindConfigCacheEntry,\r\n} from \"./types\"\r\nimport { getNativeBinding } from \"./binding\"\r\nimport { debugLog, formatErrorMessage, isRecord, pathExists } from \"./utils\"\r\n\r\n\r\nconst SUPPORTED_TAILWIND_CONFIG_EXTENSIONS = new Set([\".ts\", \".js\", \".cjs\", \".mjs\"])\r\n\r\nconst tailwindConfigCache = new Map<string, TailwindConfigCacheEntry>()\r\n\r\nexport const splitVariantAndBase = (className: string): { variantKey: string; base: string } => {\r\n const parts = className.split(\":\")\r\n if (parts.length <= 1) return { variantKey: \"\", base: className }\r\n const base = parts.pop() ?? className\r\n return { variantKey: parts.join(\":\"), base }\r\n}\r\n\r\nconst isArbitraryUtility = (baseClass: string): boolean => {\r\n return baseClass.includes(\"[\") && baseClass.includes(\"]\")\r\n}\r\n\r\nexport const resolveConflictGroup = (base: string): string | null => {\r\n if (isArbitraryUtility(base)) return null\r\n if ([\"block\", \"inline\", \"inline-block\", \"inline-flex\", \"flex\", \"grid\", \"hidden\"].includes(base))\r\n return \"display\"\r\n if (base.startsWith(\"bg-\")) return \"bg\"\r\n if (base.startsWith(\"text-\")) return \"text\"\r\n if (base.startsWith(\"font-\")) return \"font\"\r\n if (base.startsWith(\"rounded\")) return \"rounded\"\r\n if (base.startsWith(\"shadow\")) return \"shadow\"\r\n if (base.startsWith(\"border-\")) return \"border\"\r\n if (base.startsWith(\"opacity-\")) return \"opacity\"\r\n if (base.startsWith(\"w-\") || base.startsWith(\"min-w-\") || base.startsWith(\"max-w-\"))\r\n return \"width\"\r\n if (base.startsWith(\"h-\") || base.startsWith(\"min-h-\") || base.startsWith(\"max-h-\"))\r\n return \"height\"\r\n if (base.startsWith(\"p-\") || base.startsWith(\"px-\") || base.startsWith(\"py-\")) return \"padding\"\r\n if (base.startsWith(\"m-\") || base.startsWith(\"mx-\") || base.startsWith(\"my-\")) return \"margin\"\r\n return null\r\n}\r\n\r\nconst detectConflicts = async (\r\n usages: ClassUsage[]\r\n): Promise<{\r\n conflicts: ClassConflict[]\r\n conflictedClassNames: Set<string>\r\n}> => {\r\n // Native-first: Rust HashSet conflict detection (required)\r\n const native = await getNativeBinding()\r\n if (!native?.detectClassConflicts) {\r\n throw new Error(\"FATAL: Native binding 'detectClassConflicts' is required but not available.\")\r\n }\r\n const result = native.detectClassConflicts(JSON.stringify(usages.map((u) => ({ name: u.name, count: u.count }))))\r\n return {\r\n conflicts: result.conflicts.map((c) => ({\r\n className: c.group,\r\n variants: c.variantKey.length > 0 ? c.variantKey.split(\":\") : [],\r\n classes: c.classes,\r\n message: c.message,\r\n })),\r\n conflictedClassNames: new Set(result.conflictedClassNames),\r\n }\r\n}\r\n\r\nconst isSupportedTailwindConfigPath = (configPath: string): boolean => {\r\n return SUPPORTED_TAILWIND_CONFIG_EXTENSIONS.has(path.extname(configPath).toLowerCase())\r\n}\r\n\r\nconst resolveTailwindConfigPath = async (\r\n root: string,\r\n explicitPath?: string\r\n): Promise<string | null> => {\r\n if (explicitPath) {\r\n const resolved = path.resolve(root, explicitPath)\r\n if (!(await pathExists(resolved))) return null\r\n return resolved\r\n }\r\n\r\n const candidates = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.cjs\",\r\n \"tailwind.config.mjs\",\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n const fullPath = path.resolve(root, candidate)\r\n if (await pathExists(fullPath)) return fullPath\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst collectSafelistFromConfig = (config: Record<string, unknown>): string[] => {\r\n const raw = config.safelist\r\n if (!Array.isArray(raw)) return []\r\n\r\n const out = new Set<string>()\r\n for (const entry of raw) {\r\n if (typeof entry === \"string\" && entry.length > 0) {\r\n out.add(entry)\r\n continue\r\n }\r\n if (!entry || typeof entry !== \"object\") continue\r\n const pattern = (entry as Record<string, unknown>).pattern\r\n if (typeof pattern === \"string\" && pattern.length > 0) {\r\n out.add(pattern)\r\n }\r\n }\r\n\r\n return Array.from(out)\r\n}\r\n\r\nconst collectCustomUtilities = (config: Record<string, unknown>): Set<string> => {\r\n const out = new Set<string>()\r\n const theme = config.theme\r\n if (!theme || typeof theme !== \"object\") return out\r\n\r\n const extend = (theme as Record<string, unknown>).extend\r\n if (!extend || typeof extend !== \"object\") return out\r\n\r\n for (const [section, value] of Object.entries(extend as Record<string, unknown>)) {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\r\n for (const key of Object.keys(value as Record<string, unknown>)) {\r\n out.add(`${section}-${key}`)\r\n if (section === \"colors\") {\r\n out.add(`bg-${key}`)\r\n out.add(`text-${key}`)\r\n out.add(`border-${key}`)\r\n } else if (section === \"spacing\") {\r\n out.add(`p-${key}`)\r\n out.add(`m-${key}`)\r\n out.add(`gap-${key}`)\r\n out.add(`w-${key}`)\r\n out.add(`h-${key}`)\r\n } else if (section === \"fontSize\") {\r\n out.add(`text-${key}`)\r\n } else if (section === \"borderRadius\") {\r\n out.add(`rounded-${key}`)\r\n } else if (section === \"boxShadow\") {\r\n out.add(`shadow-${key}`)\r\n }\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nconst collectSafelistFromSource = async (configPath: string): Promise<string[]> => {\r\n const source = await fs.promises.readFile(configPath, \"utf8\")\r\n\r\n // Gunakan native AST parser untuk ekstrak string literals dari config\r\n // Lebih akurat dari regex — handle template literals, multiline, nested quotes\r\n const { extractClassesNative } = await import(\"@tailwind-styled/scanner\")\r\n const allTokens = extractClassesNative(source)\r\n\r\n // Filter hanya token yang berasal dari safelist block\r\n // Native parse sudah return semua string value — kita cek apakah safelist array ada di source\r\n const hasSafelist = source.includes(\"safelist\")\r\n if (!hasSafelist) return []\r\n\r\n // Ambil baris-baris safelist dari source untuk batasi scope\r\n const safelistMatch = source.match(/safelist\\s*:\\s*\\[([\\s\\S]*?)\\]/m)?.[1]\r\n if (!safelistMatch) return []\r\n\r\n // Cross-reference: hanya return token yang muncul di dalam safelist block\r\n const safelistSet = new Set<string>()\r\n for (const token of safelistMatch.matchAll(/[\"'`]([^\"'`]+)[\"'`]/g)) {\r\n const value = token[1].trim()\r\n if (value.length > 0) safelistSet.add(value)\r\n }\r\n\r\n // Intersect dengan native extracted tokens untuk validasi\r\n return allTokens.filter((t: string) => safelistSet.has(t))\r\n}\r\n\r\nconst loadTailwindConfig = async (\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<LoadedTailwindConfig | null> => {\r\n const startMs = Date.now()\r\n const configPath = await resolveTailwindConfigPath(root, semanticOption?.tailwindConfigPath)\r\n if (!configPath) return null\r\n\r\n if (!isSupportedTailwindConfigPath(configPath)) {\r\n return {\r\n path: configPath,\r\n loaded: false,\r\n warning: `Unsupported Tailwind config extension at \"${configPath}\". Supported extensions: .ts, .js, .cjs, .mjs.`,\r\n safelist: new Set<string>(),\r\n customUtilities: new Set<string>(),\r\n }\r\n }\r\n\r\n const configStat = await fs.promises.stat(configPath).catch(() => null)\r\n if (configStat) {\r\n const cached = tailwindConfigCache.get(configPath)\r\n if (cached && cached.mtimeMs === configStat.mtimeMs && cached.size === configStat.size) {\r\n debugLog(\r\n `tailwind config cache hit: ${configPath} (${cached.config.safelist.size} safelist entries)`\r\n )\r\n return cached.config\r\n }\r\n }\r\n\r\n const result = await (async (): Promise<{\r\n config: Record<string, unknown> | null\r\n warning: string | undefined\r\n }> => {\r\n try {\r\n const cacheBustToken = Math.trunc(configStat?.mtimeMs ?? Date.now())\r\n const imported = await import(`${pathToFileURL(configPath).href}?tws_mtime=${cacheBustToken}`)\r\n const candidate = (imported.default ?? imported) as unknown\r\n if (isRecord(candidate)) {\r\n return { config: candidate, warning: undefined }\r\n } else if (typeof candidate === \"function\") {\r\n const evaluated = candidate()\r\n if (isRecord(evaluated)) {\r\n return { config: evaluated, warning: undefined }\r\n }\r\n return { config: null, warning: \"Tailwind config export function must return an object.\" }\r\n }\r\n return {\r\n config: null,\r\n warning: \"Tailwind config export must be an object or a function returning an object.\",\r\n }\r\n } catch (error) {\r\n return { config: null, warning: formatErrorMessage(error) }\r\n }\r\n })()\r\n\r\n const { config, warning } = result\r\n\r\n const safelist = new Set<string>()\r\n const customUtilities = new Set<string>()\r\n\r\n if (config) {\r\n for (const item of collectSafelistFromConfig(config)) safelist.add(item)\r\n for (const item of collectCustomUtilities(config)) customUtilities.add(item)\r\n }\r\n\r\n if (safelist.size === 0) {\r\n try {\r\n for (const item of await collectSafelistFromSource(configPath)) safelist.add(item)\r\n } catch (error) {\r\n debugLog(\r\n `failed to parse safelist from source at \"${configPath}\": ${formatErrorMessage(error)}`\r\n )\r\n // keep empty if source parsing fails\r\n }\r\n }\r\n\r\n const loaded = {\r\n path: configPath,\r\n loaded: config !== null,\r\n warning,\r\n safelist,\r\n customUtilities,\r\n }\r\n\r\n if (configStat) {\r\n tailwindConfigCache.set(configPath, {\r\n mtimeMs: configStat.mtimeMs,\r\n size: configStat.size,\r\n config: loaded,\r\n })\r\n }\r\n\r\n debugLog(\r\n `tailwind config loaded from \"${configPath}\" in ${Date.now() - startMs}ms ` +\r\n `(loaded=${loaded.loaded}, safelist=${loaded.safelist.size}, custom=${loaded.customUtilities.size})`\r\n )\r\n\r\n return loaded\r\n }\r\n\r\nexport const utilityPrefix = (baseClass: string): string => {\r\n const normalized = baseClass.startsWith(\"-\") ? baseClass.slice(1) : baseClass\r\n if (normalized.includes(\"[\") && normalized.includes(\"]\")) return \"arbitrary\"\r\n if (normalized.startsWith(\"min-w-\")) return \"min-w\"\r\n if (normalized.startsWith(\"max-w-\")) return \"max-w\"\r\n if (normalized.startsWith(\"min-h-\")) return \"min-h\"\r\n if (normalized.startsWith(\"max-h-\")) return \"max-h\"\r\n if (normalized.startsWith(\"space-x-\")) return \"space-x\"\r\n if (normalized.startsWith(\"space-y-\")) return \"space-y\"\r\n if (normalized.startsWith(\"inline-\")) return \"inline\"\r\n if (normalized.startsWith(\"border-\")) return \"border\"\r\n if (normalized.startsWith(\"text-\")) return \"text\"\r\n if (normalized.startsWith(\"bg-\")) return \"bg\"\r\n if (normalized.startsWith(\"rounded\")) return \"rounded\"\r\n if (normalized.startsWith(\"shadow\")) return \"shadow\"\r\n const hyphen = normalized.indexOf(\"-\")\r\n if (hyphen < 0) return normalized\r\n return normalized.slice(0, hyphen)\r\n}\r\n\r\nexport const buildSemanticReport = async (\r\n usages: ClassUsage[],\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<AnalyzerSemanticReport> => {\r\n const loadedConfig = await loadTailwindConfig(root, semanticOption)\r\n const safelist = loadedConfig?.safelist ?? new Set<string>()\r\n const customUtilities = loadedConfig?.customUtilities ?? new Set<string>()\r\n const usageNames = new Set(usages.map((usage) => usage.name))\r\n\r\n const unusedClasses: ClassUsage[] = Array.from(safelist)\r\n .filter((className) => !usageNames.has(className))\r\n .sort()\r\n .map((className) => ({ name: className, count: 0, isUnused: true }))\r\n\r\n // ── Unknown classes — native-first (required) ─────────────────────────────\r\n const native = await getNativeBinding()\r\n if (!native?.classifyKnownClasses) {\r\n throw new Error(\"FATAL: Native binding 'classifyKnownClasses' is required but not available.\")\r\n }\r\n const classNames = usages.map((u) => u.name)\r\n const results = native.classifyKnownClasses(\r\n classNames,\r\n Array.from(safelist),\r\n Array.from(customUtilities)\r\n )\r\n const unknownSet = new Set(\r\n results\r\n .filter((r: { className: string; isKnown: boolean }) => !r.isKnown)\r\n .map((r: { className: string; isKnown: boolean }) => r.className)\r\n )\r\n const unknownClasses = usages\r\n .filter((usage) => unknownSet.has(usage.name))\r\n .map((usage) => ({ ...usage, isUnused: true }))\r\n\r\n const { conflicts } = await detectConflicts(usages)\r\n\r\n return {\r\n unusedClasses,\r\n unknownClasses,\r\n conflicts,\r\n ...(loadedConfig\r\n ? {\r\n tailwindConfig: {\r\n path: loadedConfig.path,\r\n loaded: loadedConfig.loaded,\r\n safelistCount: loadedConfig.safelist.size,\r\n customUtilityCount: loadedConfig.customUtilities.size,\r\n ...(loadedConfig.warning ? { warning: loadedConfig.warning } : {}),\r\n },\r\n }\r\n : {}),\r\n }\r\n}","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { pathToFileURL } from \"node:url\"\r\nimport {\r\n type AnalyzerReport,\r\n type AnalyzerSemanticReport,\r\n analyzeWorkspace as runWorkspaceAnalysis,\r\n} from \"@tailwind-styled/analyzer\"\r\nimport { generateCssForClasses, mergeClassesStatic } from \"@tailwind-styled/compiler/internal\"\r\nimport {\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n scanWorkspaceAsync,\r\n} from \"@tailwind-styled/scanner\"\r\nimport { createLogger, TwError, wrapUnknownError } from \"@tailwind-styled/shared\"\r\n\r\nimport { applyIncrementalChange } from \"./incremental\"\r\nimport { ImpactTracker } from \"./impactTracker\"\r\nimport { EngineMetricsCollector, type EngineMetricsSnapshot } from \"./metrics\"\r\nimport { writeMetrics } from \"./metricsWriter\"\r\nimport {\r\n type EnginePlugin,\r\n runAfterBuild,\r\n runAfterScan,\r\n runAfterWatch,\r\n runBeforeBuild,\r\n runBeforeScan,\r\n runBeforeWatch,\r\n runOnError,\r\n runTransformClasses,\r\n} from \"./plugin-api\"\r\nimport { parseEngineOptions, parseEngineWatchOptions } from \"./schemas\"\r\nimport { type WorkspaceWatcher, watchWorkspace } from \"./watch\"\r\n\r\nconst DEFAULT_LARGE_FILE_THRESHOLD_BYTES = 10 * 1024 * 1024\r\nconst DEFAULT_FLUSH_DEBOUNCE_MS = 100\r\nconst DEFAULT_MAX_EVENTS_PER_FLUSH = 100\r\nconst _DEFAULT_WATCH_EVENT_TYPE: EngineBuildWatchEventType = \"change\"\r\n\r\nconst configState = {\r\n cachedTailwindConfig: undefined as Record<string, unknown> | undefined,\r\n tailwindConfigLoaded: false,\r\n setLoaded(config: Record<string, unknown> | undefined) {\r\n this.cachedTailwindConfig = config\r\n this.tailwindConfigLoaded = true\r\n },\r\n getConfig() {\r\n return this.cachedTailwindConfig\r\n },\r\n isLoaded() {\r\n return this.tailwindConfigLoaded\r\n },\r\n}\r\nconst log = createLogger(\"engine\")\r\n\r\nexport interface EngineOptions {\r\n root?: string\r\n scanner?: ScanWorkspaceOptions\r\n compileCss?: boolean\r\n tailwindConfigPath?: string\r\n plugins?: EnginePlugin[]\r\n /** Enable analyzer integration - provides semantic report (unused classes, conflicts). Default: false */\r\n analyze?: boolean\r\n}\r\n\r\nexport interface EngineWatchOptions {\r\n debounceMs?: number\r\n maxEventsPerFlush?: number\r\n largeFileThreshold?: number\r\n}\r\n\r\nexport interface BuildResult {\r\n scan: ScanWorkspaceResult\r\n mergedClassList: string\r\n css: string\r\n /** Analyzer semantic report - present when analyze: true in options */\r\n analysis?: {\r\n unusedClasses: string[]\r\n classConflicts: Array<{\r\n className: string\r\n files: string[]\r\n classes?: string[]\r\n message?: string\r\n }>\r\n classUsage: Record<string, number>\r\n semantic?: AnalyzerSemanticReport\r\n report: AnalyzerReport\r\n }\r\n}\r\n\r\ninterface BuildExecutionMetrics {\r\n analyzeMs: number\r\n compileMs: number\r\n}\r\n\r\ninterface BuildExecution {\r\n result: BuildResult\r\n metrics: BuildExecutionMetrics\r\n}\r\n\r\ntype EngineBuildWatchEventType = \"initial\" | \"change\" | \"unlink\" | \"full-rescan\"\r\n\r\nexport type EngineWatchEvent =\r\n | {\r\n type: EngineBuildWatchEventType\r\n filePath?: string\r\n result: BuildResult\r\n metrics?: EngineMetricsSnapshot\r\n }\r\n | {\r\n type: \"error\"\r\n filePath?: string\r\n error: string\r\n metrics?: EngineMetricsSnapshot\r\n }\r\n\r\nexport interface TailwindStyledEngine {\r\n scan(): Promise<ScanWorkspaceResult>\r\n scanWorkspace(): Promise<ScanWorkspaceResult>\r\n analyzeWorkspace(): Promise<Awaited<ReturnType<typeof runWorkspaceAnalysis>>>\r\n generateSafelist(): Promise<string[]>\r\n build(): Promise<BuildResult>\r\n watch(\r\n onEvent: (event: EngineWatchEvent) => void,\r\n options?: EngineWatchOptions\r\n ): Promise<{ close(): void }>\r\n}\r\n\r\nasync function loadTailwindConfigFromPath(\r\n root: string,\r\n tailwindConfigPath?: string\r\n): Promise<Record<string, unknown> | undefined> {\r\n if (!tailwindConfigPath) return undefined\r\n\r\n const configPath = path.resolve(root, tailwindConfigPath)\r\n if (!fs.existsSync(configPath)) {\r\n throw TwError.fromIo(\"CONFIG_NOT_FOUND\", `tailwindConfigPath not found: ${configPath}`)\r\n }\r\n\r\n const imported = await import(pathToFileURL(configPath).href)\r\n const config = (imported.default ?? imported) as Record<string, unknown>\r\n return config\r\n}\r\n\r\nasync function tryRunAnalyzer(root: string, options: EngineOptions) {\r\n try {\r\n const report = await runWorkspaceAnalysis(root, {\r\n scanner: options.scanner,\r\n semantic: true,\r\n })\r\n\r\n const classUsage: Record<string, number> = {}\r\n for (const usage of report.classStats.all) {\r\n classUsage[usage.name] = usage.count\r\n }\r\n\r\n const semantic = report.semantic\r\n return {\r\n unusedClasses: semantic?.unusedClasses.map((usage) => usage.name) ?? [],\r\n classConflicts:\r\n semantic?.conflicts.map((conflict) => ({\r\n className: conflict.className,\r\n files: [],\r\n classes: [...conflict.classes],\r\n message: conflict.message,\r\n })) ?? [],\r\n classUsage,\r\n semantic,\r\n report,\r\n }\r\n } catch (e) {\r\n log.warn(\"Analyzer not available:\", String(e))\r\n return undefined\r\n }\r\n}\r\n\r\nasync function buildFromScan(\r\n scan: ScanWorkspaceResult,\r\n root: string,\r\n options: EngineOptions,\r\n tailwindConfig?: Record<string, unknown>\r\n): Promise<BuildExecution> {\r\n const plugins = options.plugins ?? []\r\n const context = { root, timestamp: Date.now() }\r\n\r\n await runBeforeBuild(plugins, scan, context)\r\n const compileStartedAt = Date.now()\r\n const transformedClasses = await runTransformClasses(plugins, scan.uniqueClasses, context)\r\n const mergedClassList = mergeClassesStatic(transformedClasses.join(\" \"))\r\n\r\n const css =\r\n options.compileCss !== false && mergedClassList.length > 0\r\n ? await generateCssForClasses(\r\n mergedClassList.split(/\\s+/).filter(Boolean),\r\n tailwindConfig,\r\n root\r\n )\r\n : \"\"\r\n\r\n const compileMs = Date.now() - compileStartedAt\r\n const analyzeStartedAt = Date.now()\r\n const analysis = options.analyze ? await tryRunAnalyzer(root, options) : undefined\r\n const analyzeMs = options.analyze ? Date.now() - analyzeStartedAt : 0\r\n\r\n const result: BuildResult = {\r\n scan,\r\n mergedClassList,\r\n css,\r\n analysis,\r\n }\r\n\r\n return {\r\n result: await runAfterBuild(plugins, result, context),\r\n metrics: {\r\n analyzeMs,\r\n compileMs,\r\n },\r\n }\r\n}\r\n\r\nfunction countWorkspacePackages(root: string): number {\r\n const packagesDir = path.join(root, \"packages\")\r\n if (!fs.existsSync(packagesDir)) return 0\r\n\r\n try {\r\n return fs\r\n .readdirSync(packagesDir, { withFileTypes: true })\r\n .filter(\r\n (entry) =>\r\n entry.isDirectory() && fs.existsSync(path.join(packagesDir, entry.name, \"package.json\"))\r\n ).length\r\n } catch {\r\n return 0\r\n }\r\n}\r\n\r\nfunction writeDashboardMetrics(\r\n root: string,\r\n mode: \"build\" | \"watch\" | \"error\",\r\n result: BuildResult | null,\r\n metrics: Partial<{\r\n buildMs: number\r\n scanMs: number\r\n analyzeMs: number\r\n compileMs: number\r\n lastEventType: string\r\n error: string\r\n }> &\r\n Partial<EngineMetricsSnapshot>\r\n): void {\r\n writeMetrics(\r\n {\r\n mode,\r\n buildMs: metrics.buildMs,\r\n scanMs: metrics.scanMs,\r\n analyzeMs: metrics.analyzeMs,\r\n compileMs: metrics.compileMs,\r\n classCount: result?.scan.uniqueClasses.length ?? 0,\r\n fileCount: result?.scan.totalFiles ?? 0,\r\n cssBytes: result ? Buffer.byteLength(result.css, \"utf8\") : 0,\r\n packageCount: countWorkspacePackages(root),\r\n error: metrics.error,\r\n lastEventType: metrics.lastEventType,\r\n eventsReceived: metrics.eventsReceived,\r\n eventsProcessed: metrics.eventsProcessed,\r\n batchesProcessed: metrics.batchesProcessed,\r\n incrementalUpdates: metrics.incrementalUpdates,\r\n fullRescans: metrics.fullRescans,\r\n skippedLargeFiles: metrics.skippedLargeFiles,\r\n queueMaxSize: metrics.queueMaxSize,\r\n lastBuildMs: metrics.lastBuildMs,\r\n avgBuildMs: metrics.avgBuildMs,\r\n },\r\n root\r\n )\r\n}\r\n\r\nexport async function createEngine(rawOptions: EngineOptions = {}): Promise<TailwindStyledEngine> {\r\n // ── Boundary validation: validate options with Zod before entering domain logic ──\r\n const options = parseEngineOptions(rawOptions)\r\n\r\n const root = options.root ?? process.cwd()\r\n const resolvedRoot = path.resolve(root)\r\n\r\n const plugins = (rawOptions as EngineOptions).plugins ?? []\r\n\r\n const getTailwindConfig = async (): Promise<Record<string, unknown> | undefined> => {\r\n if (configState.isLoaded()) return configState.getConfig()\r\n const config = await loadTailwindConfigFromPath(resolvedRoot, options.tailwindConfigPath)\r\n configState.setLoaded(config)\r\n return config\r\n }\r\n\r\n const reportEngineError = async (error: unknown): Promise<Error> => {\r\n const normalized = error instanceof TwError\r\n ? error\r\n : wrapUnknownError(\"compile\", \"ENGINE_ERROR\", error)\r\n const context = { root: resolvedRoot, timestamp: Date.now() }\r\n try {\r\n await runOnError(plugins, normalized, context)\r\n } catch (pluginError) {\r\n log.error(\r\n \"plugin onError hook failed:\",\r\n pluginError instanceof Error ? pluginError.message : String(pluginError)\r\n )\r\n }\r\n log.error(normalized.message)\r\n return normalized\r\n }\r\n\r\n const doScan = async (): Promise<ScanWorkspaceResult> => {\r\n try {\r\n const context = { root: resolvedRoot, timestamp: Date.now() }\r\n await runBeforeScan(plugins, context)\r\n const scan = await scanWorkspaceAsync(resolvedRoot, options.scanner)\r\n return await runAfterScan(plugins, scan, context)\r\n } catch (error) {\r\n throw await reportEngineError(error)\r\n }\r\n }\r\n\r\n const doAnalyze = async (): Promise<Awaited<ReturnType<typeof runWorkspaceAnalysis>>> => {\r\n try {\r\n return await runWorkspaceAnalysis(resolvedRoot, {\r\n scanner: options.scanner,\r\n })\r\n } catch (error) {\r\n throw await reportEngineError(error)\r\n }\r\n }\r\n\r\n const doGenerateSafelist = async (): Promise<string[]> => {\r\n const scan = await doScan()\r\n return [...scan.uniqueClasses]\r\n }\r\n\r\n return {\r\n scan: doScan,\r\n scanWorkspace: doScan,\r\n analyzeWorkspace: doAnalyze,\r\n generateSafelist: doGenerateSafelist,\r\n async build(): Promise<BuildResult> {\r\n const scanStartedAt = Date.now()\r\n const scan = await doScan()\r\n const scanMs = Date.now() - scanStartedAt\r\n try {\r\n const buildStartedAt = Date.now()\r\n const execution = await buildFromScan(\r\n scan,\r\n resolvedRoot,\r\n options,\r\n await getTailwindConfig()\r\n )\r\n const buildMs = Date.now() - buildStartedAt\r\n writeDashboardMetrics(resolvedRoot, \"build\", execution.result, {\r\n buildMs,\r\n scanMs,\r\n analyzeMs: execution.metrics.analyzeMs,\r\n compileMs: execution.metrics.compileMs,\r\n })\r\n return execution.result\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n writeDashboardMetrics(resolvedRoot, \"error\", null, {\r\n scanMs,\r\n error: normalized.message,\r\n })\r\n throw normalized\r\n }\r\n },\r\n async watch(\r\n onEvent: (event: EngineWatchEvent) => void,\r\n rawWatchOptions: EngineWatchOptions = {}\r\n ): Promise<{ close(): void }> {\r\n // ── Boundary validation: validate watch options with Zod ──\r\n const watchOptions = parseEngineWatchOptions(rawWatchOptions)\r\n\r\n const flushDebounceMs = watchOptions.debounceMs ?? DEFAULT_FLUSH_DEBOUNCE_MS\r\n const maxEventsPerFlush = watchOptions.maxEventsPerFlush ?? DEFAULT_MAX_EVENTS_PER_FLUSH\r\n const largeFileThreshold =\r\n watchOptions.largeFileThreshold ?? DEFAULT_LARGE_FILE_THRESHOLD_BYTES\r\n\r\n const tailwindConfig = await getTailwindConfig()\r\n const watchContext = { root: resolvedRoot, timestamp: Date.now() }\r\n await runBeforeWatch(plugins, watchContext)\r\n\r\n const initialScanStartedAt = Date.now()\r\n const initialScan = await doScan()\r\n const initialScanMs = Date.now() - initialScanStartedAt\r\n\r\n const watchState = {\r\n currentScan: initialScan,\r\n timer: null as NodeJS.Timeout | null,\r\n setTimer(t: NodeJS.Timeout | null) {\r\n this.timer = t\r\n },\r\n clearTimer() {\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n },\r\n }\r\n\r\n try {\r\n const initialBuildStartedAt = Date.now()\r\n const execution = await buildFromScan(\r\n watchState.currentScan,\r\n resolvedRoot,\r\n options,\r\n tailwindConfig\r\n )\r\n const initialBuildMs = Date.now() - initialBuildStartedAt\r\n writeDashboardMetrics(resolvedRoot, \"watch\", execution.result, {\r\n buildMs: initialBuildMs,\r\n scanMs: initialScanMs,\r\n analyzeMs: execution.metrics.analyzeMs,\r\n compileMs: execution.metrics.compileMs,\r\n lastEventType: \"initial\",\r\n })\r\n onEvent({\r\n type: \"initial\",\r\n result: execution.result,\r\n })\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n writeDashboardMetrics(resolvedRoot, \"error\", null, {\r\n scanMs: initialScanMs,\r\n error: normalized.message,\r\n lastEventType: \"initial\",\r\n })\r\n onEvent({ type: \"error\", error: normalized.message })\r\n throw normalized\r\n }\r\n\r\n const queue: Array<{ type: \"change\" | \"unlink\"; filePath: string }> = []\r\n const metrics = new EngineMetricsCollector()\r\n\r\n const scheduleFlush = (): void => {\r\n if (watchState.timer) return\r\n watchState.setTimer(\r\n setTimeout(() => {\r\n watchState.clearTimer()\r\n void flushBatch()\r\n }, flushDebounceMs)\r\n )\r\n }\r\n\r\n const shouldForceFullRescan = (event: {\r\n type: \"change\" | \"unlink\"\r\n filePath: string\r\n }): boolean => {\r\n if (event.type === \"unlink\") return false\r\n try {\r\n const stat = fs.statSync(event.filePath)\r\n if (stat.size > largeFileThreshold) {\r\n metrics.markSkippedLargeFile()\r\n return true\r\n }\r\n } catch {\r\n return false\r\n }\r\n return false\r\n }\r\n\r\n const flushBatch = async (): Promise<void> => {\r\n if (queue.length === 0) return\r\n\r\n const batch = queue.splice(0, maxEventsPerFlush)\r\n metrics.markBatchProcessed(batch.length)\r\n\r\n const forceRescan = batch.some((event) => shouldForceFullRescan(event))\r\n const lastEvent = batch[batch.length - 1]\r\n\r\n const eventTypeState = { emittedType: lastEvent.type as EngineBuildWatchEventType }\r\n const scanStartedAt = Date.now()\r\n\r\n try {\r\n if (forceRescan) {\r\n watchState.currentScan = await doScan()\r\n metrics.markFullRescan()\r\n eventTypeState.emittedType = \"full-rescan\"\r\n } else {\r\n for (const event of batch) {\r\n watchState.currentScan = applyIncrementalChange(\r\n watchState.currentScan,\r\n event.filePath,\r\n event.type,\r\n options.scanner\r\n )\r\n metrics.markIncremental()\r\n }\r\n }\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n log.warn(\"incremental path failed, forcing full rescan:\", normalized.message)\r\n watchState.currentScan = await doScan()\r\n metrics.markFullRescan()\r\n eventTypeState.emittedType = \"full-rescan\"\r\n }\r\n\r\n const scanMs = Date.now() - scanStartedAt\r\n\r\n try {\r\n const started = Date.now()\r\n const execution = await buildFromScan(\r\n watchState.currentScan,\r\n resolvedRoot,\r\n options,\r\n tailwindConfig\r\n )\r\n const buildMs = Date.now() - started\r\n metrics.markBuildDuration(buildMs)\r\n const snapshot = metrics.snapshot()\r\n writeDashboardMetrics(resolvedRoot, \"watch\", execution.result, {\r\n scanMs,\r\n buildMs,\r\n analyzeMs: execution.metrics.analyzeMs,\r\n compileMs: execution.metrics.compileMs,\r\n lastEventType: eventTypeState.emittedType,\r\n ...snapshot,\r\n })\r\n\r\n onEvent({\r\n type: eventTypeState.emittedType,\r\n filePath: lastEvent.filePath,\r\n result: execution.result,\r\n metrics: snapshot,\r\n })\r\n } catch (error) {\r\n const normalized = await reportEngineError(error)\r\n const snapshot = metrics.snapshot()\r\n writeDashboardMetrics(resolvedRoot, \"error\", null, {\r\n scanMs,\r\n error: normalized.message,\r\n lastEventType: eventTypeState.emittedType,\r\n ...snapshot,\r\n })\r\n onEvent({\r\n type: \"error\",\r\n filePath: lastEvent.filePath,\r\n error: normalized.message,\r\n metrics: snapshot,\r\n })\r\n }\r\n\r\n if (queue.length > 0) scheduleFlush()\r\n }\r\n\r\n const watcher: WorkspaceWatcher = watchWorkspace(\r\n resolvedRoot,\r\n (event) => {\r\n queue.push(event)\r\n metrics.markEventReceived(queue.length)\r\n scheduleFlush()\r\n },\r\n {\r\n ignoreDirectories: options.scanner?.ignoreDirectories,\r\n debounceMs: flushDebounceMs,\r\n onError: (error, directory) => {\r\n void reportEngineError(error)\r\n onEvent({\r\n type: \"error\",\r\n filePath: directory,\r\n error: error.message,\r\n metrics: metrics.snapshot(),\r\n })\r\n },\r\n }\r\n )\r\n\r\n return {\r\n async close() {\r\n watchState.clearTimer()\r\n watcher.close()\r\n await runAfterWatch(plugins, watchContext)\r\n },\r\n }\r\n },\r\n }\r\n}\r\n\r\n// Re-export internal API (including IR types)\r\nexport * from \"./internal\"\r\n// Re-export schemas\r\nexport {\r\n type BuildResultInput,\r\n BuildResultSchema,\r\n type EngineOptionsInput,\r\n EngineOptionsSchema,\r\n type EngineWatchOptionsInput,\r\n EngineWatchOptionsSchema,\r\n parseEngineOptions,\r\n parseEngineWatchOptions,\r\n} from \"./schemas\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Standalone facade functions — tidak perlu createEngine()\r\n// Berguna untuk CLI, adapter, dan tooling yang tidak butuh watch/lifecycle penuh\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Scan workspace dan return hasil scan.\r\n * Facade tipis di atas scanWorkspaceAsync dari @tailwind-styled/scanner.\r\n *\r\n * @example\r\n * const result = await scanWorkspace({ root: \"./src\" })\r\n * console.log(result.uniqueClasses)\r\n */\r\nexport async function scanWorkspace(\r\n opts: { root?: string; extensions?: string[]; ignoreDirectories?: string[] } = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const root = path.resolve(opts.root ?? process.cwd())\r\n return scanWorkspaceAsync(root, {\r\n includeExtensions: opts.extensions,\r\n ignoreDirectories: opts.ignoreDirectories,\r\n })\r\n}\r\n\r\n/**\r\n * Analyze workspace — scan + analyze classes.\r\n * Facade di atas runWorkspaceAnalysis.\r\n *\r\n * @example\r\n * const report = await analyzeWorkspace({ root: \"./src\" })\r\n * console.log(report.topClasses)\r\n */\r\nexport async function analyzeWorkspace(\r\n opts: { root?: string; top?: number } = {}\r\n): Promise<Awaited<ReturnType<typeof runWorkspaceAnalysis>>> {\r\n const root = path.resolve(opts.root ?? process.cwd())\r\n return runWorkspaceAnalysis(root, {\r\n classStats: { top: opts.top ?? 20 },\r\n })\r\n}\r\n\r\n/**\r\n * Generate safelist dari scan result.\r\n * Berguna untuk Tailwind config safelist generation.\r\n *\r\n * @example\r\n * const safelist = await generateSafelist({ root: \"./src\" })\r\n * // Pakai di tailwind.config.ts: { safelist }\r\n */\r\nexport async function generateSafelist(\r\n opts: { root?: string } = {}\r\n): Promise<string[]> {\r\n const scan = await scanWorkspace(opts)\r\n return scan.uniqueClasses\r\n}\r\n\r\n/**\r\n * Build CSS dari scan result.\r\n * One-shot build tanpa watch mode.\r\n *\r\n * @example\r\n * const result = await build({ root: \"./src\" })\r\n * fs.writeFileSync(\"dist/tailwind.css\", result.css)\r\n */\r\nexport async function build(\r\n opts: EngineOptions = {}\r\n): Promise<{ css: string; classes: string[]; totalFiles: number }> {\r\n const engine = await createEngine(opts)\r\n const result = await engine.build()\r\n return {\r\n css: result.css,\r\n classes: result.mergedClassList.split(/\\s+/).filter(Boolean),\r\n totalFiles: result.scan.totalFiles,\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Shared trace/inspection surface — reusable across CLI, devtools, dashboard\r\n// (dari monorepo checklist: \"Tambahkan mode trace yang reusable\")\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TraceResult, RuleTrace, ConflictTrace, VariantTrace, FinalStyleProperty } from \"./trace\"\r\nexport { trace, buildProvenanceChain } from \"./trace\"\r\n\r\n/**\r\n * High-level trace API — satu entry point untuk semua tooling.\r\n *\r\n * Dipakai oleh:\r\n * - CLI: `tw trace <class>`\r\n * - DevTools: TracePanel fetch\r\n * - Dashboard: trace endpoint\r\n *\r\n * @example\r\n * const result = await traceClass(\"flex\", scanResult, cssString)\r\n * console.log(result.finalStyle) // [{ property: \"display\", value: \"flex\" }]\r\n */\r\nexport async function traceClass(\r\n className: string,\r\n scanResult: ScanWorkspaceResult,\r\n css: string\r\n): Promise<import(\"./trace\").TraceResult | null> {\r\n if (!className || !css) return null\r\n\r\n try {\r\n const { parseCssToIr } = await import(\"./cssToIr\")\r\n const { CascadeResolver } = await import(\"./resolver\")\r\n const { trace } = await import(\"./trace\")\r\n\r\n const { rules, classToRuleIds } = parseCssToIr(css)\r\n const resolver = new CascadeResolver()\r\n resolver.addRules(rules)\r\n for (const [registeredClassName, ruleIds] of classToRuleIds) {\r\n resolver.registerClass(registeredClassName, ruleIds)\r\n }\r\n\r\n return trace(className, resolver)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Trace multiple classes at once — for batch inspection.\r\n */\r\nexport async function traceClasses(\r\n classNames: string[],\r\n scanResult: ScanWorkspaceResult,\r\n css: string\r\n): Promise<Map<string, import(\"./trace\").TraceResult>> {\r\n const results = new Map<string, import(\"./trace\").TraceResult>()\r\n\r\n for (const cls of classNames) {\r\n const result = await traceClass(cls, scanResult, css)\r\n if (result) results.set(cls, result)\r\n }\r\n\r\n return results\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Surface Inspection — consistent API untuk CLI, devtools, dashboard\r\n// (dari monorepo checklist: \"Tambahkan surface inspection yang konsisten\")\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface InspectionReport {\r\n className: string\r\n /** CSS rules yang dihasilkan */\r\n css: string\r\n /** Properties yang di-set */\r\n properties: Array<{ property: string; value: string }>\r\n /** Classes yang berkonflik dengan ini */\r\n conflicts: string[]\r\n /** Files yang menggunakan class ini */\r\n usedIn: string[]\r\n /** Risk level untuk removal */\r\n risk: \"low\" | \"medium\" | \"high\"\r\n /** Estimated bundle contribution */\r\n bundleBytes: number\r\n}\r\n\r\n/**\r\n * Inspect a single class — gabungan trace + impact + usage.\r\n * Reusable surface untuk CLI (`tw why`), DevTools panel, dashboard endpoint.\r\n *\r\n * @example\r\n * const report = await inspectClass(\"flex\", scanResult, cssString)\r\n * console.log(report.properties) // [{ property: \"display\", value: \"flex\" }]\r\n * console.log(report.usedIn) // [\"src/Button.tsx\", \"src/Card.tsx\"]\r\n * console.log(report.risk) // \"low\"\r\n */\r\nexport async function inspectClass(\r\n className: string,\r\n scanResult: ScanWorkspaceResult,\r\n css = \"\"\r\n): Promise<InspectionReport> {\r\n const normalizedClass = className.startsWith(\".\") ? className.slice(1) : className\r\n\r\n // Usage: files yang menggunakan class ini\r\n const usedIn = (scanResult.files ?? [])\r\n .filter(f => f.classes?.includes(normalizedClass))\r\n .map(f => f.file)\r\n const usedInLocations = usedIn.map((file) => ({ file, line: 1, column: 1 }))\r\n\r\n // Trace: get CSS properties\r\n const traceResult = await traceClass(normalizedClass, scanResult, css)\r\n const properties = traceResult?.finalStyle ?? []\r\n\r\n // Impact: risk level\r\n const tracker = new ImpactTracker()\r\n const dummyBundle = {\r\n className: normalizedClass,\r\n totalUsage: usedIn.length,\r\n files: usedInLocations,\r\n bundleSizeBytes: 0,\r\n variantChains: [],\r\n isDeadCode: usedIn.length === 0,\r\n dependencies: [],\r\n }\r\n const impact = tracker.calculateImpact(normalizedClass, dummyBundle, scanResult)\r\n\r\n return {\r\n className: normalizedClass,\r\n css,\r\n properties: properties.map(p => ({ property: p.property, value: p.value })),\r\n conflicts: [], // populated by trace conflicts if available\r\n usedIn,\r\n risk: impact.riskLevel,\r\n bundleBytes: impact.bundleSizeBytes,\r\n }\r\n}\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\n\r\nimport {\r\n isScannableFile,\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n scanFile,\r\n} from \"@tailwind-styled/scanner\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\n\r\nimport { getNativeEngineBinding } from \"./native-bridge\"\r\n\r\nconst DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\r\nconst log = createLogger(\"engine:incremental\")\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Internal helpers — native-first, JS fallback\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Rebuild ScanWorkspaceResult dari Map file → entry.\r\n *\r\n * Native: satu pass Rust HashSet dedup + sort_unstable.\r\n * JS fallback: Array.from(new Set(...)) dengan multiple allocations.\r\n */\r\nfunction rebuildWorkspaceResult(\r\n byFile: Map<string, ScanWorkspaceResult[\"files\"][number]>\r\n): ScanWorkspaceResult {\r\n const files = Array.from(byFile.values())\r\n const native = getNativeEngineBinding()\r\n\r\n if (native?.rebuildWorkspaceResult) {\r\n const result = native.rebuildWorkspaceResult(files)\r\n return {\r\n files: result.files,\r\n totalFiles: result.totalFiles,\r\n uniqueClasses: result.uniqueClasses,\r\n }\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'rebuildWorkspaceResult' is required but not available.\")\r\n}\r\n\r\n/**\r\n * Apply incremental class diff: (existing ∪ added) ∖ removed.\r\n *\r\n * Native: Rust HashSet O(n+m) tanpa GC pause.\r\n * JS fallback: JS Set dengan intermediate allocations.\r\n */\r\nfunction applyClassDiff(existing: string[], added: string[], removed: string[]): string[] {\r\n const native = getNativeEngineBinding()\r\n\r\n if (native?.applyClassDiff) {\r\n return native.applyClassDiff(existing, added, removed)\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'applyClassDiff' is required but not available.\")\r\n}\r\n\r\n/**\r\n * Cek apakah dua class array berisi elemen identik (order-independent).\r\n *\r\n * Native: single-pass HashSet lookup O(n+m).\r\n * JS fallback: buat Set(b) lalu iterate a.\r\n */\r\nfunction areClassSetsEqual(a: string[], b: string[]): boolean {\r\n const native = getNativeEngineBinding()\r\n\r\n if (native?.areClassSetsEqual) {\r\n return native.areClassSetsEqual(a, b)\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'areClassSetsEqual' is required but not available.\")\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Public API (tidak berubah dari sebelumnya)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface WorkspaceDiff {\r\n addedClasses: string[]\r\n removedClasses: string[]\r\n changedFiles: string[]\r\n unchangedFiles: number\r\n}\r\n\r\n/**\r\n * Diff dua ScanWorkspaceResult menggunakan Rust computeIncrementalDiff.\r\n */\r\nexport function diffWorkspaceResults(\r\n previous: ScanWorkspaceResult,\r\n current: ScanWorkspaceResult\r\n): WorkspaceDiff {\r\n const native = getNativeEngineBinding()\r\n if (!native?.computeIncrementalDiff) {\r\n throw new Error(\"FATAL: Native binding 'computeIncrementalDiff' is required but not available.\")\r\n }\r\n\r\n const result = native.computeIncrementalDiff(\r\n JSON.stringify(previous.files),\r\n JSON.stringify(current.files)\r\n ) as WorkspaceDiff | null\r\n\r\n if (!result) {\r\n return { addedClasses: [], removedClasses: [], changedFiles: [], unchangedFiles: 0 }\r\n }\r\n\r\n log.debug(\r\n `native diff workspace: +${result.addedClasses.length} classes, -${result.removedClasses.length} classes, ${result.changedFiles.length} files changed`\r\n )\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Apply an incremental file-change event to an existing scan result.\r\n *\r\n * Semua tiga helper internal sekarang native-first:\r\n * rebuildWorkspaceResult → Rust rebuild_workspace_result\r\n * applyClassDiff → Rust apply_class_diff\r\n * areClassSetsEqual → Rust are_class_sets_equal\r\n */\r\nexport function applyIncrementalChange(\r\n previous: ScanWorkspaceResult,\r\n filePath: string,\r\n type: \"change\" | \"unlink\",\r\n scanner?: ScanWorkspaceOptions\r\n): ScanWorkspaceResult {\r\n const includeExtensions = scanner?.includeExtensions ?? DEFAULT_EXTENSIONS\r\n if (!isScannableFile(filePath, includeExtensions)) return previous\r\n\r\n const byFile = new Map(previous.files.map((f) => [path.resolve(f.file), f]))\r\n const normalizedPath = path.resolve(filePath)\r\n\r\n const native = getNativeEngineBinding()\r\n if (!native?.processFileChange) {\r\n throw new Error(\r\n \"FATAL: Native binding 'processFileChange' is required but not available.\\n\" +\r\n \"This package requires native Rust bindings.\\n\\n\" +\r\n \"Resolution steps:\\n\" +\r\n \"1. Build the native Rust module: npm run build:rust\"\r\n )\r\n }\r\n\r\n if (type === \"unlink\") {\r\n const existing = byFile.get(normalizedPath)\r\n log.debug(`native unlink ${normalizedPath}`)\r\n native.processFileChange(normalizedPath, existing?.classes ?? [], null)\r\n byFile.delete(normalizedPath)\r\n return rebuildWorkspaceResult(byFile)\r\n }\r\n\r\n log.debug(`native change ${normalizedPath}`)\r\n const scanned = scanFile(normalizedPath)\r\n const content = fs.readFileSync(normalizedPath, \"utf8\")\r\n const diff = native.processFileChange(normalizedPath, scanned.classes, content)\r\n const existing = byFile.get(normalizedPath)\r\n\r\n if (diff && existing) {\r\n log.debug(`native diff ${normalizedPath} +${diff.added.length} -${diff.removed.length}`)\r\n const diffApplied = applyClassDiff(existing.classes, diff.added, diff.removed)\r\n const classes = areClassSetsEqual(diffApplied, scanned.classes)\r\n ? diffApplied\r\n : scanned.classes\r\n byFile.set(normalizedPath, { file: normalizedPath, classes })\r\n } else {\r\n log.debug(`native diff cold-sync ${normalizedPath}`)\r\n byFile.set(normalizedPath, { file: normalizedPath, classes: scanned.classes })\r\n }\r\n\r\n return rebuildWorkspaceResult(byFile)\r\n}","export interface EngineMetricsSnapshot {\r\n eventsReceived: number\r\n eventsProcessed: number\r\n batchesProcessed: number\r\n incrementalUpdates: number\r\n fullRescans: number\r\n skippedLargeFiles: number\r\n queueMaxSize: number\r\n lastBuildMs: number\r\n avgBuildMs: number\r\n}\r\n\r\nexport class EngineMetricsCollector {\r\n private eventsReceived = 0\r\n private eventsProcessed = 0\r\n private batchesProcessed = 0\r\n private incrementalUpdates = 0\r\n private fullRescans = 0\r\n private skippedLargeFiles = 0\r\n private queueMaxSize = 0\r\n private lastBuildMs = 0\r\n private totalBuildMs = 0\r\n\r\n markEventReceived(queueSize: number): void {\r\n this.eventsReceived += 1\r\n if (queueSize > this.queueMaxSize) this.queueMaxSize = queueSize\r\n }\r\n\r\n markBatchProcessed(batchSize: number): void {\r\n this.batchesProcessed += 1\r\n this.eventsProcessed += batchSize\r\n }\r\n\r\n markIncremental(): void {\r\n this.incrementalUpdates += 1\r\n }\r\n\r\n markFullRescan(): void {\r\n this.fullRescans += 1\r\n }\r\n\r\n markSkippedLargeFile(): void {\r\n this.skippedLargeFiles += 1\r\n }\r\n\r\n markBuildDuration(ms: number): void {\r\n this.lastBuildMs = ms\r\n this.totalBuildMs += ms\r\n }\r\n\r\n snapshot(): EngineMetricsSnapshot {\r\n const avgBuildMs = this.batchesProcessed > 0 ? this.totalBuildMs / this.batchesProcessed : 0\r\n return {\r\n eventsReceived: this.eventsReceived,\r\n eventsProcessed: this.eventsProcessed,\r\n batchesProcessed: this.batchesProcessed,\r\n incrementalUpdates: this.incrementalUpdates,\r\n fullRescans: this.fullRescans,\r\n skippedLargeFiles: this.skippedLargeFiles,\r\n queueMaxSize: this.queueMaxSize,\r\n lastBuildMs: this.lastBuildMs,\r\n avgBuildMs,\r\n }\r\n }\r\n}\r\n","/**\r\n * tailwind-styled-v4 — Metrics Writer\r\n *\r\n * Menulis metrics dari engine ke file `.tw-cache/metrics.json`\r\n * sehingga dashboard server bisa membaca secara real-time.\r\n *\r\n * Dipanggil dari engine setelah setiap build selesai.\r\n */\r\n\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { performance } from \"node:perf_hooks\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\n\r\nconst _log = createLogger(\"tw:metrics\")\r\n\r\nexport interface BuildMetrics {\r\n buildMs?: number\r\n scanMs?: number\r\n analyzeMs?: number\r\n compileMs?: number\r\n classCount?: number\r\n fileCount?: number\r\n cssBytes?: number\r\n packageCount?: number\r\n memoryMb?: { rss: number; heapUsed: number; heapTotal: number }\r\n mode?: \"jit\" | \"build\" | \"watch\" | \"idle\" | \"error\"\r\n route?: string\r\n error?: string\r\n lastEventType?: string\r\n eventsReceived?: number\r\n eventsProcessed?: number\r\n batchesProcessed?: number\r\n incrementalUpdates?: number\r\n fullRescans?: number\r\n skippedLargeFiles?: number\r\n queueMaxSize?: number\r\n lastBuildMs?: number\r\n avgBuildMs?: number\r\n generatedAt?: string\r\n}\r\n\r\nconst METRICS_FILE_NAME = \"metrics.json\"\r\nconst CACHE_DIR = \".tw-cache\"\r\n\r\n/**\r\n * Tulis metrics ke file untuk dibaca oleh dashboard server.\r\n * Non-blocking — error diabaikan.\r\n */\r\nexport function writeMetrics(metrics: BuildMetrics, cwd = process.cwd()): void {\r\n try {\r\n const cacheDir = path.join(cwd, CACHE_DIR)\r\n fs.mkdirSync(cacheDir, { recursive: true })\r\n\r\n const mem = process.memoryUsage()\r\n const data: BuildMetrics = {\r\n ...metrics,\r\n memoryMb: {\r\n rss: Math.round(mem.rss / 1024 / 1024),\r\n heapUsed: Math.round(mem.heapUsed / 1024 / 1024),\r\n heapTotal: Math.round(mem.heapTotal / 1024 / 1024),\r\n },\r\n generatedAt: new Date().toISOString(),\r\n }\r\n\r\n fs.writeFileSync(path.join(cacheDir, METRICS_FILE_NAME), JSON.stringify(data, null, 2))\r\n } catch {\r\n // Non-critical — dashboard adalah opsional\r\n }\r\n}\r\n\r\n/**\r\n * Higher-order wrapper — ukur durasi fungsi dan tulis metrics.\r\n *\r\n * @example\r\n * const result = await withMetrics('build', async () => {\r\n * return await engine.build()\r\n * }, { classCount: result.scan.uniqueClasses.length })\r\n */\r\nexport async function withMetrics<T>(\r\n mode: BuildMetrics[\"mode\"],\r\n fn: () => Promise<T>,\r\n extraMetrics: Partial<BuildMetrics> = {},\r\n cwd = process.cwd()\r\n): Promise<T> {\r\n const start = performance.now()\r\n const result = await fn()\r\n const elapsed = Math.round(performance.now() - start)\r\n\r\n writeMetrics({ mode, buildMs: elapsed, ...extraMetrics }, cwd)\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Buat timer untuk mengukur scan time.\r\n *\r\n * @example\r\n * const timer = startScanTimer()\r\n * const scan = scanWorkspace(root)\r\n * writeMetrics({ scanMs: timer.elapsed(), classCount: scan.uniqueClasses.length })\r\n */\r\nexport function startTimer() {\r\n const start = performance.now()\r\n return {\r\n elapsed: () => Math.round(performance.now() - start),\r\n }\r\n}\r\n\r\nexport default { writeMetrics, withMetrics, startTimer }\r\n","import type { ScanWorkspaceResult } from \"@tailwind-styled/scanner\"\r\nimport type { BuildResult } from \"./index\"\r\n\r\nexport interface EnginePluginContext {\r\n root: string\r\n timestamp: number\r\n}\r\n\r\nexport interface EngineWatchContext {\r\n root: string\r\n timestamp: number\r\n}\r\n\r\nexport interface EnginePlugin {\r\n name: string\r\n beforeScan?(context: EnginePluginContext): void | Promise<void>\r\n afterScan?(\r\n scan: ScanWorkspaceResult,\r\n context: EnginePluginContext\r\n ): ScanWorkspaceResult | undefined | Promise<ScanWorkspaceResult | undefined>\r\n transformClasses?(\r\n classes: string[],\r\n context: EnginePluginContext\r\n ): string[] | undefined | Promise<string[] | undefined>\r\n beforeBuild?(scan: ScanWorkspaceResult, context: EnginePluginContext): void | Promise<void>\r\n afterBuild?(\r\n result: BuildResult,\r\n context: EnginePluginContext\r\n ): BuildResult | undefined | Promise<BuildResult | undefined>\r\n onError?(error: Error, context: EnginePluginContext): void | Promise<void>\r\n beforeWatch?(context: EngineWatchContext): void | Promise<void>\r\n afterWatch?(context: EngineWatchContext): void | Promise<void>\r\n}\r\n\r\nexport async function runBeforeScan(\r\n plugins: EnginePlugin[],\r\n context: EnginePluginContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.beforeScan?.(context)\r\n }\r\n}\r\n\r\nexport async function runAfterScan(\r\n plugins: EnginePlugin[],\r\n scan: ScanWorkspaceResult,\r\n context: EnginePluginContext\r\n): Promise<ScanWorkspaceResult> {\r\n return await plugins.reduce(async (currentPromise, plugin) => {\r\n const current = await currentPromise\r\n const next = await plugin.afterScan?.(current, context)\r\n return next ?? current\r\n }, Promise.resolve(scan))\r\n}\r\n\r\nexport async function runTransformClasses(\r\n plugins: EnginePlugin[],\r\n classes: string[],\r\n context: EnginePluginContext\r\n): Promise<string[]> {\r\n return await plugins.reduce(async (currentPromise, plugin) => {\r\n const current = await currentPromise\r\n const next = await plugin.transformClasses?.(current, context)\r\n return next ?? current\r\n }, Promise.resolve(classes))\r\n}\r\n\r\nexport async function runBeforeBuild(\r\n plugins: EnginePlugin[],\r\n scan: ScanWorkspaceResult,\r\n context: EnginePluginContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.beforeBuild?.(scan, context)\r\n }\r\n}\r\n\r\nexport async function runAfterBuild(\r\n plugins: EnginePlugin[],\r\n result: BuildResult,\r\n context: EnginePluginContext\r\n): Promise<BuildResult> {\r\n return plugins.reduce(async (acc, plugin) => {\r\n const current = await acc\r\n const next = await plugin.afterBuild?.(current, context)\r\n return next !== undefined ? next : current\r\n }, Promise.resolve(result))\r\n}\r\n\r\nexport async function runOnError(\r\n plugins: EnginePlugin[],\r\n error: Error,\r\n context: EnginePluginContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.onError?.(error, context)\r\n }\r\n}\r\n\r\nexport async function runBeforeWatch(\r\n plugins: EnginePlugin[],\r\n context: EngineWatchContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.beforeWatch?.(context)\r\n }\r\n}\r\n\r\nexport async function runAfterWatch(\r\n plugins: EnginePlugin[],\r\n context: EngineWatchContext\r\n): Promise<void> {\r\n for (const plugin of plugins) {\r\n await plugin.afterWatch?.(context)\r\n }\r\n}\r\n","import { z } from \"zod\"\r\nimport type { EnginePlugin } from \"./plugin-api\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const p = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\"\r\n return `${p}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n throw new TypeError(`${label}: ${formatIssues(parsed.error)}`)\r\n}\r\n\r\nexport const EngineOptionsSchema = z.object({\r\n root: z.string().optional(),\r\n scanner: z\r\n .object({\r\n includeExtensions: z.array(z.string()).optional(),\r\n ignoreDirectories: z.array(z.string()).optional(),\r\n useCache: z.boolean().optional(),\r\n cacheDir: z.string().min(1).optional(),\r\n smartInvalidation: z.boolean().optional(),\r\n })\r\n .optional(),\r\n compileCss: z.boolean().optional(),\r\n tailwindConfigPath: z.string().optional(),\r\n analyze: z.boolean().optional(),\r\n plugins: z.array(z.custom<EnginePlugin>()).optional(),\r\n})\r\n\r\nexport type EngineOptionsInput = z.infer<typeof EngineOptionsSchema>\r\n\r\nexport const EngineWatchOptionsSchema = z.object({\r\n debounceMs: z.number().int().min(0).optional(),\r\n maxEventsPerFlush: z.number().int().min(1).optional(),\r\n largeFileThreshold: z.number().int().min(0).optional(),\r\n})\r\n\r\nexport type EngineWatchOptionsInput = z.infer<typeof EngineWatchOptionsSchema>\r\n\r\nexport const BuildResultSchema = z.object({\r\n scan: z.object({\r\n files: z.array(\r\n z.object({ file: z.string(), classes: z.array(z.string()), hash: z.string().optional() })\r\n ),\r\n totalFiles: z.number().int().min(0),\r\n uniqueClasses: z.array(z.string()),\r\n }),\r\n mergedClassList: z.string(),\r\n css: z.string(),\r\n analysis: z\r\n .object({\r\n unusedClasses: z.array(z.string()),\r\n classConflicts: z.array(\r\n z.object({\r\n className: z.string(),\r\n files: z.array(z.string()),\r\n classes: z.array(z.string()).optional(),\r\n message: z.string().optional(),\r\n })\r\n ),\r\n classUsage: z.record(z.string(), z.number()),\r\n })\r\n .optional(),\r\n})\r\n\r\nexport type BuildResultInput = z.infer<typeof BuildResultSchema>\r\n\r\nexport const parseEngineOptions = (options: unknown) =>\r\n parseWithSchema(EngineOptionsSchema, options ?? {}, \"engine options are invalid\")\r\n\r\nexport const parseEngineWatchOptions = (options: unknown) =>\r\n parseWithSchema(EngineWatchOptionsSchema, options ?? {}, \"engine watch options are invalid\")\r\n","/**\r\n * watch.ts — File system watcher for tailwind-styled-v4.\r\n *\r\n * Native-only: uses Rust `notify`-based watcher via NAPI\r\n * (`start_watch` / `poll_watch_events` / `stop_watch` from watch_api.rs).\r\n *\r\n * Polling interval: 200ms (configurable via `pollIntervalMs`).\r\n */\r\n\r\n// Lazy-load native binding\r\nlet _native: {\r\n startWatch?: (rootDir: string) => { status: string; handleId: number }\r\n pollWatchEvents?: (handleId: number) => Array<{ kind: string; path: string }>\r\n stopWatch?: (handleId: number) => boolean\r\n} | null = null\r\n\r\nfunction getNativeWatcher() {\r\n if (_native !== null) return _native\r\n try {\r\n const { resolveNativeBinary } = require(\"@tailwind-styled/shared\")\r\n const { path: binPath } = resolveNativeBinary(__dirname)\r\n if (binPath) {\r\n _native = require(binPath)\r\n }\r\n } catch {\r\n _native = {}\r\n }\r\n return _native\r\n}\r\n\r\nexport interface WatcherOptions {\r\n /** Directories to ignore (currently not enforced by native watcher, kept for API compatibility). */\r\n ignoreDirectories?: string[]\r\n /** Delay before emitting change event to reduce noisy bursts (applied in Rust layer). */\r\n debounceMs?: number\r\n /** Polling interval in ms for the Rust native watcher (default: 200). */\r\n pollIntervalMs?: number\r\n onError?: (error: Error, directory: string) => void\r\n}\r\n\r\nexport interface WatcherEvent {\r\n type: \"change\" | \"unlink\"\r\n filePath: string\r\n}\r\n\r\nexport interface WorkspaceWatcher {\r\n close(): void\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Native Rust watcher (notify v6)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction watchWorkspaceNative(\r\n rootDir: string,\r\n onEvent: (event: WatcherEvent) => void,\r\n options: WatcherOptions\r\n): WorkspaceWatcher | null {\r\n const native = getNativeWatcher()\r\n if (!native?.startWatch || !native?.pollWatchEvents || !native?.stopWatch) {\r\n return null\r\n }\r\n\r\n const result = native.startWatch(rootDir)\r\n if (!result || result.status !== \"ok\") {\r\n return null\r\n }\r\n\r\n const { handleId } = result\r\n const pollMs = options.pollIntervalMs ?? 200\r\n const pending = new Map<string, { event: WatcherEvent; timer: NodeJS.Timeout }>()\r\n const debounceMs = options.debounceMs ?? 100\r\n\r\n function enqueue(event: WatcherEvent) {\r\n const key = `${event.type}:${event.filePath}`\r\n const existing = pending.get(key)\r\n if (existing) clearTimeout(existing.timer)\r\n const timer = setTimeout(() => {\r\n pending.delete(key)\r\n onEvent(event)\r\n }, debounceMs)\r\n pending.set(key, { event, timer })\r\n }\r\n\r\n const intervalId = setInterval(() => {\r\n try {\r\n const events = native.pollWatchEvents!(handleId)\r\n for (const ev of events) {\r\n const type: WatcherEvent[\"type\"] = ev.kind === \"unlink\" ? \"unlink\" : \"change\"\r\n enqueue({ type, filePath: ev.path })\r\n }\r\n } catch (err) {\r\n options.onError?.(\r\n err instanceof Error ? err : new Error(String(err)),\r\n rootDir\r\n )\r\n }\r\n }, pollMs)\r\n\r\n return {\r\n close() {\r\n clearInterval(intervalId)\r\n for (const { timer } of pending.values()) clearTimeout(timer)\r\n pending.clear()\r\n try {\r\n native.stopWatch!(handleId)\r\n } catch {\r\n // ignore\r\n }\r\n },\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Public API — native-only\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * watchWorkspace — watches `rootDir` recursively for file changes.\r\n *\r\n * Requires native Rust watcher. Throws if native binding unavailable.\r\n */\r\nexport function watchWorkspace(\r\n rootDir: string,\r\n onEvent: (event: WatcherEvent) => void,\r\n options: WatcherOptions = {}\r\n): WorkspaceWatcher {\r\n const nativeWatcher = watchWorkspaceNative(rootDir, onEvent, options)\r\n if (!nativeWatcher) {\r\n throw new Error(\"FATAL: Native watcher is required but not available. Build the native module: npm run build:rust\")\r\n }\r\n return nativeWatcher\r\n}","import { z } from \"zod\"\r\nimport { TwError } from \"@tailwind-styled/shared\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const p = formatIssuePath(issue.path)\r\n return `${p}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nexport const VitePluginOptionsSchema = z.object({\r\n include: z.instanceof(RegExp).optional(),\r\n exclude: z.instanceof(RegExp).optional(),\r\n scanDirs: z.array(z.string()).optional(),\r\n safelistOutput: z.string().optional(),\r\n generateSafelist: z.boolean().optional(),\r\n scanReportOutput: z.string().optional(),\r\n useEngineBuild: z.boolean().optional(),\r\n analyze: z.boolean().optional(),\r\n strict: z.boolean().optional(),\r\n mode: z.enum([\"zero-runtime\", \"runtime\"]).optional(),\r\n routeCss: z.boolean().optional(),\r\n deadStyleElimination: z.boolean().optional(),\r\n addDataAttr: z.boolean().optional(),\r\n autoClientBoundary: z.boolean().optional(),\r\n hoist: z.boolean().optional(),\r\n incremental: z.boolean().optional(),\r\n})\r\n\r\nexport type VitePluginOptionsInput = z.infer<typeof VitePluginOptionsSchema>\r\n\r\nexport const parseVitePluginOptions = (options: unknown) =>\r\n parseWithSchema(VitePluginOptionsSchema, options ?? {}, \"vite plugin options are invalid\")\r\n","/**\r\n * tailwind-styled-v4 - Vite Plugin v5\r\n *\r\n * Usage in vite.config.ts:\r\n * import { tailwindStyledPlugin } from \"@tailwind-styled/vite\"\r\n * export default defineConfig({\r\n * plugins: [react(), tailwindStyledPlugin()]\r\n * })\r\n *\r\n * v5 Changes:\r\n * - Simplified API (removed deprecated options)\r\n * - Uses @tailwind-styled/engine for build orchestration\r\n * - Mode always zero-runtime\r\n */\r\n\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\n\r\nimport { runLoaderTransform } from \"@tailwind-styled/compiler\"\r\nimport { createEngine } from \"@tailwind-styled/engine\"\r\nimport type { HmrContext, Plugin, ResolvedConfig } from \"vite\"\r\n\r\nimport { parseVitePluginOptions } from \"./schemas\"\r\n\r\nexport interface VitePluginOptions {\r\n include?: RegExp\r\n exclude?: RegExp\r\n scanDirs?: string[]\r\n safelistOutput?: string\r\n generateSafelist?: boolean\r\n scanReportOutput?: string\r\n useEngineBuild?: boolean\r\n analyze?: boolean\r\n strict?: boolean\r\n mode?: \"zero-runtime\" | \"runtime\"\r\n routeCss?: boolean\r\n deadStyleElimination?: boolean\r\n addDataAttr?: boolean\r\n autoClientBoundary?: boolean\r\n hoist?: boolean\r\n incremental?: boolean\r\n}\r\n\r\ninterface ViteLoaderOptions extends Record<string, unknown> {\r\n mode?: \"zero-runtime\"\r\n addDataAttr?: boolean\r\n filename?: string\r\n preserveImports?: boolean\r\n}\r\n\r\ninterface ViteLoaderOutput {\r\n code: string\r\n changed: boolean\r\n classes: string[]\r\n}\r\n\r\ninterface ScanWorkspaceResult {\r\n files: Array<{ file: string; classes: string[] }>\r\n totalFiles: number\r\n uniqueClasses: string[]\r\n}\r\n\r\ntype ViteTransformRunner = (ctx: {\r\n filepath: string\r\n source: string\r\n options: ViteLoaderOptions\r\n isDev?: boolean\r\n}) => ViteLoaderOutput\r\n\r\ntype ViteEngineFacade = {\r\n scanWorkspace(): Promise<ScanWorkspaceResult>\r\n build(): Promise<unknown>\r\n}\r\n\r\ntype ViteEngineFactory = (options: {\r\n root?: string\r\n compileCss?: boolean\r\n analyze?: boolean\r\n scanner?: {\r\n includeExtensions?: string[]\r\n }\r\n}) => Promise<ViteEngineFacade>\r\n\r\ntype InternalVitePluginOptions = VitePluginOptions & {\r\n __internalTransformRunner?: ViteTransformRunner\r\n __internalCreateEngine?: ViteEngineFactory\r\n}\r\n\r\nconst SCAN_EXTENSIONS = [\".tsx\", \".ts\", \".jsx\", \".js\"]\r\n\r\nfunction warnDeprecated(options: VitePluginOptions, key: keyof VitePluginOptions, message: string) {\r\n if (options[key] !== undefined) {\r\n console.warn(`[tailwind-styled-v4] Warning: '${key}' is deprecated in v5. ${message}`)\r\n }\r\n}\r\n\r\nfunction isInsideDirectory(filePath: string, directory: string): boolean {\r\n const relative = path.relative(directory, filePath)\r\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\r\n}\r\n\r\nfunction filterScanToDirs(\r\n scan: ScanWorkspaceResult,\r\n root: string,\r\n scanDirs: string[]\r\n): ScanWorkspaceResult {\r\n const resolvedDirs = scanDirs.map((dir) => path.resolve(root, dir))\r\n if (resolvedDirs.length === 0) return scan\r\n\r\n const files = scan.files.filter((file) => {\r\n const absoluteFile = path.resolve(file.file)\r\n return resolvedDirs.some((directory) => isInsideDirectory(absoluteFile, directory))\r\n })\r\n\r\n const uniqueClasses = Array.from(new Set(files.flatMap((file) => file.classes))).sort()\r\n\r\n return {\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses,\r\n }\r\n}\r\n\r\nfunction writeJsonArtifact(root: string, relativePath: string, value: unknown): void {\r\n const outputPath = path.resolve(root, relativePath)\r\n fs.mkdirSync(path.dirname(outputPath), { recursive: true })\r\n fs.writeFileSync(outputPath, `${JSON.stringify(value, null, 2)}\\n`)\r\n}\r\n\r\nexport function tailwindStyledPlugin(opts: VitePluginOptions = {}): Plugin {\r\n const rawOptions = opts as InternalVitePluginOptions\r\n const parsedOptions = parseVitePluginOptions(rawOptions)\r\n\r\n warnDeprecated(parsedOptions, \"mode\", \"Only zero-runtime is supported.\")\r\n warnDeprecated(parsedOptions, \"routeCss\", \"Use engine's analyzing capabilities.\")\r\n warnDeprecated(parsedOptions, \"deadStyleElimination\", \"Use 'analyze: true' option instead.\")\r\n warnDeprecated(parsedOptions, \"addDataAttr\", \"Handled by engine internally.\")\r\n warnDeprecated(parsedOptions, \"autoClientBoundary\", \"Handled by engine internally.\")\r\n warnDeprecated(parsedOptions, \"hoist\", \"Handled by engine internally.\")\r\n warnDeprecated(parsedOptions, \"incremental\", \"Handled by engine internally.\")\r\n\r\n const {\r\n include = /\\.(tsx|ts|jsx|js)$/,\r\n exclude = /node_modules/,\r\n scanDirs = [\"src\"],\r\n safelistOutput = \".tailwind-styled-safelist.json\",\r\n scanReportOutput = \".tailwind-styled-scan-report.json\",\r\n generateSafelist: doSafelist = true,\r\n useEngineBuild = true,\r\n analyze = false,\r\n strict = false,\r\n } = parsedOptions\r\n\r\n const transformRunner = rawOptions.__internalTransformRunner ?? runLoaderTransform\r\n const engineFactory = rawOptions.__internalCreateEngine ?? createEngine\r\n const pluginState = { root: process.cwd(), isDev: true }\r\n\r\n return {\r\n name: \"tailwind-styled-v4\",\r\n enforce: \"pre\" as const,\r\n\r\n configResolved(config: ResolvedConfig) {\r\n pluginState.root = config.root\r\n pluginState.isDev = config.command === \"serve\"\r\n },\r\n\r\n transform(source: string, id: string) {\r\n const filepath = id.split(\"?\")[0]\r\n if (!include.test(filepath)) return null\r\n if (exclude.test(filepath)) return null\r\n\r\n const loaderOptions: ViteLoaderOptions = {\r\n mode: \"zero-runtime\",\r\n addDataAttr: pluginState.isDev,\r\n filename: filepath,\r\n preserveImports: true,\r\n }\r\n\r\n let output: ViteLoaderOutput\r\n try {\r\n output = transformRunner({\r\n filepath,\r\n source,\r\n options: loaderOptions,\r\n isDev: pluginState.isDev,\r\n })\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n console.warn(`[tailwind-styled-v4] Transform skipped for ${filepath}: ${message}`)\r\n return null\r\n }\r\n\r\n if (!output.changed) return null\r\n return { code: output.code, map: null }\r\n },\r\n\r\n async buildEnd() {\r\n if (pluginState.isDev) return\r\n\r\n const engine = await engineFactory({\r\n root: pluginState.root,\r\n compileCss: true,\r\n analyze,\r\n scanner: {\r\n includeExtensions: SCAN_EXTENSIONS,\r\n },\r\n })\r\n\r\n try {\r\n const scan = filterScanToDirs(await engine.scanWorkspace(), pluginState.root, scanDirs)\r\n\r\n if (doSafelist) {\r\n writeJsonArtifact(pluginState.root, safelistOutput, scan.uniqueClasses)\r\n }\r\n\r\n writeJsonArtifact(pluginState.root, scanReportOutput, {\r\n root: pluginState.root,\r\n totalFiles: scan.totalFiles,\r\n uniqueClassCount: scan.uniqueClasses.length,\r\n })\r\n } catch (error) {\r\n console.warn(\"[tailwind-styled-v4] Engine scan phase failed:\", error)\r\n }\r\n\r\n if (!useEngineBuild) return\r\n\r\n try {\r\n await engine.build()\r\n console.log(\"[tailwind-styled-v4] Engine build complete\")\r\n } catch (error) {\r\n const msg = `[tailwind-styled-v4] Engine build step failed: ${error}`\r\n if (strict) {\r\n throw new Error(msg)\r\n }\r\n console.warn(msg)\r\n }\r\n },\r\n\r\n handleHotUpdate({ file, server }: HmrContext) {\r\n if (include.test(file) && !exclude.test(file)) {\r\n server.ws.send({ type: \"full-reload\" })\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport default tailwindStyledPlugin\r\n"]}
|