tailwind-styled-v4 5.0.8 → 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 +204 -416
- package/README.md +45 -15
- 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 +63 -32
- package/dist/index.d.ts +63 -32
- package/dist/index.js +335 -169
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +315 -169
- 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.d.mts +10 -4
- package/dist/next.d.ts +10 -4
- package/dist/next.js +32 -45
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +30 -43
- 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 +84 -126
- package/dist/turbopackLoader.js.map +1 -1
- package/dist/turbopackLoader.mjs +68 -124
- 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 +69 -108
- package/dist/webpackLoader.js.map +1 -1
- package/dist/webpackLoader.mjs +49 -104
- package/dist/webpackLoader.mjs.map +1 -1
- package/native/tailwind-styled-native.node +0 -0
- package/package.json +22 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/domain/shared/src/native-resolution.ts","../packages/domain/shared/src/index.ts","../packages/domain/compiler/src/nativeBridge.ts","../packages/domain/compiler/src/index.ts","../packages/presentation/next/src/webpackLoader.ts"],"names":["path","getNodeModuleRef","isBrowser","nodeModuleRef","getRequire","require","createRequire","z"],"mappings":"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","file":"webpackLoader.js","sourcesContent":["/**\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 * 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}","/**\r\n * tailwind-styled-v4 - Webpack Loader\r\n */\r\n\r\nimport {\r\n type LoaderOutput,\r\n runLoaderTransform,\r\n shouldSkipFile,\r\n registerFileClasses,\r\n} from \"@tailwind-styled/compiler/internal\"\r\nimport path from \"node:path\"\r\nimport { z } from \"zod\"\r\n\r\ninterface WebpackLoaderOptions {\r\n mode?: \"zero-runtime\"\r\n autoClientBoundary?: boolean\r\n addDataAttr?: boolean\r\n hoist?: boolean\r\n routeCss?: boolean\r\n incremental?: boolean\r\n verbose?: boolean\r\n preserveImports?: boolean\r\n}\r\n\r\ninterface WebpackContext {\r\n resourcePath: string\r\n getOptions(): WebpackLoaderOptions\r\n async?(): ((err: Error | null, result?: string) => void) | undefined\r\n cacheable?(flag?: boolean): void\r\n}\r\n\r\nconst WebpackLoaderOptionsSchema = z.object({\r\n mode: z.literal(\"zero-runtime\").optional(),\r\n autoClientBoundary: z.boolean().optional(),\r\n addDataAttr: z.boolean().optional(),\r\n hoist: z.boolean().optional(),\r\n routeCss: z.boolean().optional(),\r\n incremental: z.boolean().optional(),\r\n verbose: z.boolean().optional(),\r\n preserveImports: z.boolean().optional(),\r\n})\r\n\r\nconst isNextBuildArtifact = (filepath: string): boolean =>\r\n filepath.includes(`${path.sep}.next${path.sep}`)\r\n\r\nexport default function webpackLoader(this: WebpackContext, source: string): void {\r\n const callback = this.async?.()\r\n if (!callback) {\r\n throw new Error(\"[tailwind-styled] Async loader callback is not available.\")\r\n }\r\n\r\n this.cacheable?.(true)\r\n const filepath = this.resourcePath\r\n\r\n if (shouldSkipFile(filepath) || isNextBuildArtifact(filepath)) {\r\n callback(null, source)\r\n return\r\n }\r\n\r\n try {\r\n const options = WebpackLoaderOptionsSchema.parse(this.getOptions())\r\n\r\n const output: LoaderOutput = runLoaderTransform({\r\n filepath,\r\n source,\r\n options: {\r\n mode: options.mode,\r\n autoClientBoundary: options.autoClientBoundary ?? true,\r\n addDataAttr: options.addDataAttr,\r\n hoist: options.hoist,\r\n filename: filepath,\r\n routeCss: options.routeCss,\r\n incremental: options.incremental,\r\n verbose: options.verbose,\r\n preserveImports: options.preserveImports ?? true,\r\n },\r\n })\r\n\r\n if (typeof output.code !== \"string\") {\r\n throw new TypeError(`[tailwind-styled] Invalid transform output for ${filepath}: code is not a string`)\r\n }\r\n\r\n if (options.verbose && output.changed) {\r\n const rsc = (output as any).rsc\r\n const engine = (output as any).engine ?? \"js\"\r\n const env = rsc?.isServer ? \"server\" : \"client\"\r\n const name = path.basename(filepath)\r\n process.stdout.write(\r\n `[tailwind-styled/webpack] ${name} -> ${output.classes.length} classes (${env}) [${engine}]\\n`\r\n )\r\n }\r\n\r\n // Register classes ke route map untuk TwCssInjector\r\n if (output.classes.length > 0) {\r\n registerFileClasses(filepath, output.classes)\r\n }\r\n\r\n callback(null, output.code)\r\n } catch (err) {\r\n if (process.env.NODE_ENV === \"production\") {\r\n callback(err instanceof Error ? err : new Error(String(err)))\r\n return\r\n }\r\n\r\n console.warn(`[tailwind-styled-v4] Webpack transform failed for ${filepath}:`, err)\r\n callback(null, source)\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../packages/domain/shared/src/native-resolution.ts","../packages/domain/shared/src/index.ts","../packages/domain/compiler/src/nativeBridge.ts","../packages/domain/compiler/src/index.ts","../packages/presentation/next/src/webpackLoader.ts"],"names":["fs","path","createRequire","fileURLToPath","z"],"mappings":"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","file":"webpackLoader.js","sourcesContent":["/**\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}","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 * 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}","/**\r\n * tailwind-styled-v4 - Webpack Loader\r\n */\r\n\r\nimport {\r\n type LoaderOutput,\r\n runLoaderTransform,\r\n shouldSkipFile,\r\n registerFileClasses,\r\n} from \"@tailwind-styled/compiler/internal\"\r\nimport path from \"node:path\"\r\nimport { z } from \"zod\"\r\n\r\ninterface WebpackLoaderOptions {\r\n mode?: \"zero-runtime\"\r\n autoClientBoundary?: boolean\r\n addDataAttr?: boolean\r\n hoist?: boolean\r\n routeCss?: boolean\r\n incremental?: boolean\r\n verbose?: boolean\r\n preserveImports?: boolean\r\n}\r\n\r\ninterface WebpackContext {\r\n resourcePath: string\r\n getOptions(): WebpackLoaderOptions\r\n async?(): ((err: Error | null, result?: string) => void) | undefined\r\n cacheable?(flag?: boolean): void\r\n}\r\n\r\nconst WebpackLoaderOptionsSchema = z.object({\r\n mode: z.literal(\"zero-runtime\").optional(),\r\n autoClientBoundary: z.boolean().optional(),\r\n addDataAttr: z.boolean().optional(),\r\n hoist: z.boolean().optional(),\r\n routeCss: z.boolean().optional(),\r\n incremental: z.boolean().optional(),\r\n verbose: z.boolean().optional(),\r\n preserveImports: z.boolean().optional(),\r\n})\r\n\r\nconst isNextBuildArtifact = (filepath: string): boolean =>\r\n filepath.includes(`${path.sep}.next${path.sep}`)\r\n\r\nexport default function webpackLoader(this: WebpackContext, source: string): void {\r\n const callback = this.async?.()\r\n if (!callback) {\r\n throw new Error(\"[tailwind-styled] Async loader callback is not available.\")\r\n }\r\n\r\n this.cacheable?.(true)\r\n const filepath = this.resourcePath\r\n\r\n if (shouldSkipFile(filepath) || isNextBuildArtifact(filepath)) {\r\n callback(null, source)\r\n return\r\n }\r\n\r\n try {\r\n const options = WebpackLoaderOptionsSchema.parse(this.getOptions())\r\n\r\n const output: LoaderOutput = runLoaderTransform({\r\n filepath,\r\n source,\r\n options: {\r\n mode: options.mode,\r\n autoClientBoundary: options.autoClientBoundary ?? true,\r\n addDataAttr: options.addDataAttr,\r\n hoist: options.hoist,\r\n filename: filepath,\r\n routeCss: options.routeCss,\r\n incremental: options.incremental,\r\n verbose: options.verbose,\r\n preserveImports: options.preserveImports ?? true,\r\n },\r\n })\r\n\r\n if (typeof output.code !== \"string\") {\r\n throw new TypeError(`[tailwind-styled] Invalid transform output for ${filepath}: code is not a string`)\r\n }\r\n\r\n // Tidak ada perubahan — Rust kembalikan source asli, bukan string kosong.\r\n // Return source asli via callback agar webpack pipeline tidak memperlakukan\r\n // file sebagai \"modified\" dan RSC boundary Next.js tetap utuh.\r\n if (!output.changed) {\r\n callback(null, source)\r\n return\r\n }\r\n\r\n if (options.verbose && output.changed) {\r\n const rsc = (output as any).rsc\r\n const engine = (output as any).engine ?? \"js\"\r\n const env = rsc?.isServer ? \"server\" : \"client\"\r\n const name = path.basename(filepath)\r\n process.stdout.write(\r\n `[tailwind-styled/webpack] ${name} -> ${output.classes.length} classes (${env}) [${engine}]\\n`\r\n )\r\n }\r\n\r\n // Register classes ke route map untuk TwCssInjector\r\n if (output.classes.length > 0) {\r\n registerFileClasses(filepath, output.classes)\r\n }\r\n\r\n callback(null, output.code)\r\n } catch (err) {\r\n if (process.env.NODE_ENV === \"production\") {\r\n callback(err instanceof Error ? err : new Error(String(err)))\r\n return\r\n }\r\n\r\n console.warn(`[tailwind-styled-v4] Webpack transform failed for ${filepath}:`, err)\r\n callback(null, source)\r\n }\r\n}"]}
|
package/dist/webpackLoader.mjs
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { createRequire } from 'module';
|
|
2
|
-
import
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import path__default from 'path';
|
|
5
|
+
import 'crypto';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
3
7
|
import { z } from 'zod';
|
|
4
8
|
|
|
5
9
|
/* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
@@ -13,45 +17,6 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
13
17
|
var __esm = (fn, res) => function __init() {
|
|
14
18
|
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
15
19
|
};
|
|
16
|
-
|
|
17
|
-
// packages/domain/shared/src/native-resolution.ts
|
|
18
|
-
function getNodeModuleRef() {
|
|
19
|
-
if (isBrowser) return null;
|
|
20
|
-
if (nodeModuleRef !== null) return nodeModuleRef;
|
|
21
|
-
try {
|
|
22
|
-
const test = typeof __require === "function" ? __require("module") : null;
|
|
23
|
-
nodeModuleRef = test;
|
|
24
|
-
return test;
|
|
25
|
-
} catch {
|
|
26
|
-
nodeModuleRef = null;
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function getNodeFs() {
|
|
31
|
-
if (isBrowser) return { existsSync: () => false };
|
|
32
|
-
const nodeRequire = getNodeModuleRef();
|
|
33
|
-
if (!nodeRequire) return { existsSync: () => false };
|
|
34
|
-
if (!_nodeFs) _nodeFs = nodeRequire.createRequire(import.meta.url)("node:fs");
|
|
35
|
-
return _nodeFs;
|
|
36
|
-
}
|
|
37
|
-
function getNodePath() {
|
|
38
|
-
if (isBrowser) return { resolve: () => "", dirname: "" };
|
|
39
|
-
const nodeRequire = getNodeModuleRef();
|
|
40
|
-
if (!nodeRequire) return { resolve: () => "", dirname: "" };
|
|
41
|
-
if (!_nodePath) _nodePath = nodeRequire.createRequire(import.meta.url)("node:path");
|
|
42
|
-
return _nodePath;
|
|
43
|
-
}
|
|
44
|
-
function getRequire(_importMetaUrl) {
|
|
45
|
-
if (isBrowser) return () => {
|
|
46
|
-
throw new Error("node:module not available");
|
|
47
|
-
};
|
|
48
|
-
const nodeRequire = getNodeModuleRef();
|
|
49
|
-
if (!nodeRequire) return () => {
|
|
50
|
-
throw new Error("require not available");
|
|
51
|
-
};
|
|
52
|
-
if (!_require) _require = nodeRequire.createRequire(_importMetaUrl);
|
|
53
|
-
return _require;
|
|
54
|
-
}
|
|
55
20
|
function platformKey() {
|
|
56
21
|
if (isBrowser) return "browser";
|
|
57
22
|
return `${process.platform}-${process.arch}`;
|
|
@@ -62,9 +27,9 @@ function resolveNativeBinary(runtimeDir) {
|
|
|
62
27
|
if (isBrowser) {
|
|
63
28
|
return { path: null, source: "not-found", platform, tried: ["not available in browser"] };
|
|
64
29
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
30
|
+
if (process.env.TWS_DISABLE_NATIVE === "1") {
|
|
31
|
+
return { path: null, source: "not-found", platform, tried: [] };
|
|
32
|
+
}
|
|
68
33
|
const envPath = process.env.TW_NATIVE_PATH?.trim();
|
|
69
34
|
if (envPath) {
|
|
70
35
|
if (fs.existsSync(envPath)) {
|
|
@@ -72,13 +37,10 @@ function resolveNativeBinary(runtimeDir) {
|
|
|
72
37
|
}
|
|
73
38
|
tried.push(`env:${envPath} (not found)`);
|
|
74
39
|
}
|
|
75
|
-
if (process.env.TWS_NO_NATIVE === "1" || process.env.TWS_NO_RUST === "1" || process.env.TWS_DISABLE_NATIVE === "1") {
|
|
76
|
-
return { path: null, source: "not-found", platform, tried: ["disabled by env"] };
|
|
77
|
-
}
|
|
78
40
|
const prebuiltPkgs = PLATFORM_MAP[platform] ?? [];
|
|
79
41
|
for (const pkg of prebuiltPkgs) {
|
|
80
42
|
try {
|
|
81
|
-
const candidate =
|
|
43
|
+
const candidate = _require.resolve(`${pkg}/tailwind_styled_parser.node`);
|
|
82
44
|
if (fs.existsSync(candidate)) {
|
|
83
45
|
return { path: candidate, source: "prebuilt", platform, tried };
|
|
84
46
|
}
|
|
@@ -89,14 +51,30 @@ function resolveNativeBinary(runtimeDir) {
|
|
|
89
51
|
}
|
|
90
52
|
const cwd = process.cwd();
|
|
91
53
|
const base = runtimeDir ?? cwd;
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
54
|
+
const napiPlatform = platform === "linux-x64" ? "linux-x64-gnu" : platform === "linux-arm64" ? "linux-arm64-gnu" : platform;
|
|
55
|
+
const BINARY_NAMES = ["tailwind-styled-native", "tailwind_styled_parser"];
|
|
56
|
+
const localCandidates = [];
|
|
57
|
+
for (const bin of BINARY_NAMES) {
|
|
58
|
+
localCandidates.push(path.resolve(base, `${bin}.node`));
|
|
59
|
+
localCandidates.push(path.resolve(base, "..", `${bin}.node`));
|
|
60
|
+
localCandidates.push(path.resolve(base, `${bin}.${platform}.node`));
|
|
61
|
+
localCandidates.push(path.resolve(base, `${bin}.${napiPlatform}.node`));
|
|
62
|
+
}
|
|
63
|
+
for (const startDir of [cwd, base]) {
|
|
64
|
+
let dir = startDir;
|
|
65
|
+
for (let i = 0; i < 6; i++) {
|
|
66
|
+
const nativeDir = path.resolve(dir, "native");
|
|
67
|
+
for (const bin of BINARY_NAMES) {
|
|
68
|
+
localCandidates.push(path.resolve(nativeDir, `${bin}.node`));
|
|
69
|
+
localCandidates.push(path.resolve(nativeDir, `${bin}.${platform}.node`));
|
|
70
|
+
localCandidates.push(path.resolve(nativeDir, `${bin}.${napiPlatform}.node`));
|
|
71
|
+
localCandidates.push(path.resolve(nativeDir, "target", "release", `${bin}.node`));
|
|
72
|
+
}
|
|
73
|
+
const parent = path.resolve(dir, "..");
|
|
74
|
+
if (parent === dir) break;
|
|
75
|
+
dir = parent;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
100
78
|
for (const candidate of localCandidates) {
|
|
101
79
|
tried.push(`local:${candidate}`);
|
|
102
80
|
if (fs.existsSync(candidate)) {
|
|
@@ -105,14 +83,11 @@ function resolveNativeBinary(runtimeDir) {
|
|
|
105
83
|
}
|
|
106
84
|
return { path: null, source: "not-found", platform, tried };
|
|
107
85
|
}
|
|
108
|
-
var isBrowser,
|
|
86
|
+
var isBrowser, _require, PLATFORM_MAP;
|
|
109
87
|
var init_native_resolution = __esm({
|
|
110
88
|
"packages/domain/shared/src/native-resolution.ts"() {
|
|
111
89
|
isBrowser = typeof window !== "undefined" || typeof document !== "undefined";
|
|
112
|
-
|
|
113
|
-
_nodeFs = null;
|
|
114
|
-
_nodePath = null;
|
|
115
|
-
_require = null;
|
|
90
|
+
_require = typeof __require !== "undefined" ? __require : createRequire(import.meta.url);
|
|
116
91
|
PLATFORM_MAP = {
|
|
117
92
|
"linux-x64": ["@tailwind-styled/native-linux-x64"],
|
|
118
93
|
"linux-arm64": ["@tailwind-styled/native-linux-arm64"],
|
|
@@ -123,59 +98,26 @@ var init_native_resolution = __esm({
|
|
|
123
98
|
};
|
|
124
99
|
}
|
|
125
100
|
});
|
|
126
|
-
|
|
127
|
-
// packages/domain/shared/src/index.ts
|
|
128
|
-
function getNodeModuleRef2() {
|
|
129
|
-
if (isBrowser2) return null;
|
|
130
|
-
if (nodeModuleRef2 !== null) return nodeModuleRef2;
|
|
131
|
-
try {
|
|
132
|
-
const test = typeof __require === "function" ? __require("module") : null;
|
|
133
|
-
nodeModuleRef2 = test;
|
|
134
|
-
return test;
|
|
135
|
-
} catch {
|
|
136
|
-
nodeModuleRef2 = null;
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
function getNodeUrl() {
|
|
141
|
-
if (isBrowser2) throw new Error("node:url not available in browser");
|
|
142
|
-
const nodeRequire = getNodeModuleRef2();
|
|
143
|
-
if (!nodeRequire) throw new Error("require not available");
|
|
144
|
-
if (!_nodeUrl) _nodeUrl = nodeRequire.createRequire(import.meta.url)("node:url");
|
|
145
|
-
return _nodeUrl;
|
|
146
|
-
}
|
|
147
|
-
function getRequire2() {
|
|
148
|
-
if (isBrowser2) return (() => {
|
|
149
|
-
throw new Error("require not available in browser");
|
|
150
|
-
});
|
|
151
|
-
const nodeRequire = getNodeModuleRef2();
|
|
152
|
-
if (!nodeRequire) return (() => {
|
|
153
|
-
throw new Error("require not available");
|
|
154
|
-
});
|
|
155
|
-
return nodeRequire.createRequire(import.meta.url);
|
|
156
|
-
}
|
|
157
101
|
function resolveRuntimeDir(dir, importMetaUrl) {
|
|
158
|
-
if (isBrowser2) return "";
|
|
159
102
|
try {
|
|
160
|
-
return
|
|
103
|
+
return path__default.dirname(fileURLToPath(importMetaUrl));
|
|
161
104
|
} catch {
|
|
162
105
|
return process.cwd();
|
|
163
106
|
}
|
|
164
107
|
}
|
|
165
|
-
var isBrowser2, nodeModuleRef2, _nodeUrl;
|
|
166
108
|
var init_src = __esm({
|
|
167
109
|
"packages/domain/shared/src/index.ts"() {
|
|
168
110
|
init_native_resolution();
|
|
169
|
-
|
|
170
|
-
nodeModuleRef2 = null;
|
|
171
|
-
_nodeUrl = null;
|
|
172
|
-
getRequire2();
|
|
111
|
+
createRequire(import.meta.url);
|
|
173
112
|
}
|
|
174
113
|
});
|
|
175
|
-
|
|
114
|
+
|
|
115
|
+
// packages/domain/compiler/src/nativeBridge.ts
|
|
116
|
+
var _loadNative, log, NATIVE_UNAVAILABLE_MESSAGE, nativeBridge, bridgeLoadAttempted, bridgeLoadError, isValidNativeBridge, getNativeBridge;
|
|
176
117
|
var init_nativeBridge = __esm({
|
|
177
118
|
"packages/domain/compiler/src/nativeBridge.ts"() {
|
|
178
119
|
init_src();
|
|
120
|
+
_loadNative = (path4) => __require(path4);
|
|
179
121
|
log = (...args) => {
|
|
180
122
|
if (process.env.DEBUG?.includes("compiler:native")) {
|
|
181
123
|
console.log("[compiler:native]", ...args);
|
|
@@ -202,11 +144,10 @@ var init_nativeBridge = __esm({
|
|
|
202
144
|
bridgeLoadAttempted = true;
|
|
203
145
|
try {
|
|
204
146
|
const runtimeDir = resolveRuntimeDir(void 0, import.meta.url);
|
|
205
|
-
const require2 = createRequire(import.meta.url);
|
|
206
147
|
const result = resolveNativeBinary(runtimeDir);
|
|
207
148
|
if (result.path && result.path.endsWith(".node")) {
|
|
208
149
|
try {
|
|
209
|
-
const binding =
|
|
150
|
+
const binding = _loadNative(result.path);
|
|
210
151
|
if (isValidNativeBridge(binding)) {
|
|
211
152
|
nativeBridge = binding;
|
|
212
153
|
log("Native bridge loaded successfully from:", result.path);
|
|
@@ -267,7 +208,7 @@ var shouldSkipFile = (filepath) => {
|
|
|
267
208
|
}
|
|
268
209
|
return false;
|
|
269
210
|
};
|
|
270
|
-
var registerFileClasses = (
|
|
211
|
+
var registerFileClasses = (_filepath, _classes) => {
|
|
271
212
|
};
|
|
272
213
|
var WebpackLoaderOptionsSchema = z.object({
|
|
273
214
|
mode: z.literal("zero-runtime").optional(),
|
|
@@ -279,7 +220,7 @@ var WebpackLoaderOptionsSchema = z.object({
|
|
|
279
220
|
verbose: z.boolean().optional(),
|
|
280
221
|
preserveImports: z.boolean().optional()
|
|
281
222
|
});
|
|
282
|
-
var isNextBuildArtifact = (filepath) => filepath.includes(`${
|
|
223
|
+
var isNextBuildArtifact = (filepath) => filepath.includes(`${path__default.sep}.next${path__default.sep}`);
|
|
283
224
|
function webpackLoader(source) {
|
|
284
225
|
const callback = this.async?.();
|
|
285
226
|
if (!callback) {
|
|
@@ -311,11 +252,15 @@ function webpackLoader(source) {
|
|
|
311
252
|
if (typeof output.code !== "string") {
|
|
312
253
|
throw new TypeError(`[tailwind-styled] Invalid transform output for ${filepath}: code is not a string`);
|
|
313
254
|
}
|
|
255
|
+
if (!output.changed) {
|
|
256
|
+
callback(null, source);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
314
259
|
if (options.verbose && output.changed) {
|
|
315
260
|
const rsc = output.rsc;
|
|
316
261
|
const engine = output.engine ?? "js";
|
|
317
262
|
const env = rsc?.isServer ? "server" : "client";
|
|
318
|
-
const name =
|
|
263
|
+
const name = path__default.basename(filepath);
|
|
319
264
|
process.stdout.write(
|
|
320
265
|
`[tailwind-styled/webpack] ${name} -> ${output.classes.length} classes (${env}) [${engine}]
|
|
321
266
|
`
|