tailwind-styled-v4 5.0.11 → 5.0.12

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.
Files changed (107) hide show
  1. package/dist/{analyzeWorkspace-DDOQdzzI.d.ts → analyzeWorkspace-CopJNGmi.d.ts} +2 -0
  2. package/dist/{analyzeWorkspace-BS5O4rhC.d.mts → analyzeWorkspace-DpVPccjz.d.mts} +2 -0
  3. package/dist/analyzer.d.mts +4 -4
  4. package/dist/analyzer.d.ts +4 -4
  5. package/dist/analyzer.js +34 -69
  6. package/dist/analyzer.js.map +1 -1
  7. package/dist/analyzer.mjs +33 -68
  8. package/dist/analyzer.mjs.map +1 -1
  9. package/dist/animate.js +11 -11
  10. package/dist/animate.js.map +1 -1
  11. package/dist/animate.mjs +11 -11
  12. package/dist/animate.mjs.map +1 -1
  13. package/dist/atomic.js +16 -7
  14. package/dist/atomic.js.map +1 -1
  15. package/dist/atomic.mjs +16 -7
  16. package/dist/atomic.mjs.map +1 -1
  17. package/dist/cli.js +262 -190
  18. package/dist/cli.js.map +1 -1
  19. package/dist/cli.mjs +259 -187
  20. package/dist/cli.mjs.map +1 -1
  21. package/dist/compiler.d.mts +2543 -109
  22. package/dist/compiler.d.ts +2543 -109
  23. package/dist/compiler.js +1962 -435
  24. package/dist/compiler.js.map +1 -1
  25. package/dist/compiler.mjs +1816 -382
  26. package/dist/compiler.mjs.map +1 -1
  27. package/dist/devtools.js +17 -4
  28. package/dist/devtools.js.map +1 -1
  29. package/dist/devtools.mjs +17 -4
  30. package/dist/devtools.mjs.map +1 -1
  31. package/dist/engine.d.mts +11 -470
  32. package/dist/engine.d.ts +11 -470
  33. package/dist/engine.js +1442 -417
  34. package/dist/engine.js.map +1 -1
  35. package/dist/engine.mjs +1442 -417
  36. package/dist/engine.mjs.map +1 -1
  37. package/dist/index-BDQw13kn.d.ts +464 -0
  38. package/dist/index-DJv28Uzq.d.mts +464 -0
  39. package/dist/index.browser.mjs +143 -255
  40. package/dist/index.browser.mjs.map +1 -1
  41. package/dist/index.d.mts +23 -39
  42. package/dist/index.d.ts +23 -39
  43. package/dist/index.js +6000 -1463
  44. package/dist/index.js.map +1 -1
  45. package/dist/index.mjs +5995 -1458
  46. package/dist/index.mjs.map +1 -1
  47. package/dist/next.d.mts +44 -1
  48. package/dist/next.d.ts +44 -1
  49. package/dist/next.js +3197 -1128
  50. package/dist/next.js.map +1 -1
  51. package/dist/next.mjs +3196 -1129
  52. package/dist/next.mjs.map +1 -1
  53. package/dist/rspack.d.mts +9 -0
  54. package/dist/rspack.d.ts +9 -0
  55. package/dist/rspack.js +99 -61
  56. package/dist/rspack.js.map +1 -1
  57. package/dist/rspack.mjs +99 -61
  58. package/dist/rspack.mjs.map +1 -1
  59. package/dist/runtime-css.d.mts +8 -0
  60. package/dist/runtime-css.d.ts +8 -0
  61. package/dist/runtime-css.js +23 -7
  62. package/dist/runtime-css.js.map +1 -1
  63. package/dist/runtime-css.mjs +23 -7
  64. package/dist/runtime-css.mjs.map +1 -1
  65. package/dist/scanner.js +16 -37
  66. package/dist/scanner.js.map +1 -1
  67. package/dist/scanner.mjs +15 -36
  68. package/dist/scanner.mjs.map +1 -1
  69. package/dist/shared.d.mts +107 -1
  70. package/dist/shared.d.ts +107 -1
  71. package/dist/shared.js +1627 -376
  72. package/dist/shared.js.map +1 -1
  73. package/dist/shared.mjs +1620 -354
  74. package/dist/shared.mjs.map +1 -1
  75. package/dist/svelte.js +39 -35
  76. package/dist/svelte.js.map +1 -1
  77. package/dist/svelte.mjs +38 -34
  78. package/dist/svelte.mjs.map +1 -1
  79. package/dist/theme.js +85 -76
  80. package/dist/theme.js.map +1 -1
  81. package/dist/theme.mjs +83 -74
  82. package/dist/theme.mjs.map +1 -1
  83. package/dist/turbopackLoader.js +943 -76
  84. package/dist/turbopackLoader.js.map +1 -1
  85. package/dist/turbopackLoader.mjs +943 -76
  86. package/dist/turbopackLoader.mjs.map +1 -1
  87. package/dist/tw.js +262 -190
  88. package/dist/tw.js.map +1 -1
  89. package/dist/tw.mjs +259 -187
  90. package/dist/tw.mjs.map +1 -1
  91. package/dist/vite.js +1336 -296
  92. package/dist/vite.js.map +1 -1
  93. package/dist/vite.mjs +1336 -296
  94. package/dist/vite.mjs.map +1 -1
  95. package/dist/vue.js +39 -35
  96. package/dist/vue.js.map +1 -1
  97. package/dist/vue.mjs +38 -34
  98. package/dist/vue.mjs.map +1 -1
  99. package/dist/webpackLoader.js +140 -34
  100. package/dist/webpackLoader.js.map +1 -1
  101. package/dist/webpackLoader.mjs +140 -34
  102. package/dist/webpackLoader.mjs.map +1 -1
  103. package/native/index.node +0 -0
  104. package/native/tailwind-styled-native.node +0 -0
  105. package/native/tailwind-styled-native.win32-x64-msvc.node +0 -0
  106. package/package.json +9 -4
  107. package/CHANGELOG.md +0 -285
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/domain/shared/src/index.ts","../packages/domain/scanner/src/native-bridge.ts","../packages/domain/scanner/src/cache-native.ts","../packages/domain/scanner/src/parallel-scanner.ts","../packages/domain/scanner/src/schemas.ts","../packages/domain/scanner/src/index.ts","../packages/domain/analyzer/src/analyzeWorkspace.ts","../packages/domain/analyzer/src/binding.ts","../packages/domain/analyzer/src/utils.ts","../packages/domain/analyzer/src/schemas.ts","../packages/domain/analyzer/src/semantic.ts","../packages/domain/analyzer/src/classToCss.ts","../packages/domain/analyzer/src/index.ts"],"names":["path","fs","fileURLToPath","createRequire","scannerGetBinding","Worker","availableParallelism","init_src","isMainThread","parentPort","workerData","formatIssuePath","z","scanFileNative","scanWorkspaceNative","log","formatIssues","parseWithSchema","extractClassesNative","pathToFileURL"],"mappings":"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","file":"analyzer.js","sourcesContent":["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 // 1 level: dist/ → package-root/native/ (published npm package)\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.${napiPlatform}.node`))\r\n // cwd fallback (user project root)\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 // 4 level: dist/ → package/ → domain/ → packages/ → repo-root/ (monorepo dev)\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 }\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 * Scanner — Rust native bridge\r\n *\r\n * Wraps the Rust scan_workspace and extract_classes_from_source functions.\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n */\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport {\r\n createDebugLogger,\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n TwError,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nconst log = createDebugLogger(\"scanner:native\")\r\n\r\n// ESM-compatible __dirname equivalent\r\nfunction getDirname(): string {\r\n if (typeof __dirname !== \"undefined\") {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\ninterface NativeScannerBinding {\r\n scanWorkspace?: (\r\n root: string,\r\n extensions: string[] | null\r\n ) => {\r\n files: Array<{ file: string; classes: string[]; hash: string }>\r\n totalFiles: number\r\n uniqueClasses: string[] | null\r\n } | null\r\n extractClassesFromSource?: (source: string) => string[] | null\r\n hashFileContent?: (content: string) => string | null\r\n cacheRead?: (cachePath: string) => {\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n version: number\r\n } | null\r\n cacheWrite?: (\r\n cachePath: string,\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n ) => boolean\r\n cachePriority?: (\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs: number\r\n ) => number\r\n batchExtractClasses?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n }>\r\n scanCacheGet?: (filePath: string, contentHash: string) => string[] | null\r\n scanCachePut?: (filePath: string, contentHash: string, classes: string[], mtimeMs: number, size: number) => void\r\n scanCacheInvalidate?: (filePath: string) => void\r\n scanCacheStats?: () => { size: number }\r\n scanFile?: (filePath: string) => {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n }\r\n collectFiles?: (root: string, extensions: string[] | null, ignoreDirs: string[] | null) => string[]\r\n scanFilesBatch?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n }>\r\n generateSubComponentTypes?: (\r\n root: string,\r\n outputPath: string | null\r\n ) => {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n /** Batch-check file existence + stale age. Menggantikan pruneStaleEntries() */\r\n pruneStaleEntries?: (\r\n entries: Array<{ file: string; lastSeenMs: number }>,\r\n maxAgeMs: number | null,\r\n checkExists: boolean | null\r\n ) => { keptIndices: number[]; removed: number }\r\n /** Hitung class frequency stats dari disk cache. Menggantikan computeCacheStats() */\r\n computeCacheStats?: (\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top: number | null\r\n ) => {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n }\r\n /** Rebuild workspace result — Rust HashSet dedup + sort. Menggantikan JS fallback di mergeResults() */\r\n rebuildWorkspaceResult?: (\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n ) => { files: Array<{ file: string; classes: string[] }>; totalFiles: number; uniqueClasses: string[] }\r\n\r\n // ── Watch API (QA #12) ──────────────────────────────────────────────────\r\n /** Mulai native file watcher via `notify` crate. Returns handleId. */\r\n startWatch?: (rootDir: string) => { status: string; handleId: number }\r\n /** Poll events yang terkumpul sejak poll terakhir. Queue dikosongkan setelah dipoll. */\r\n pollWatchEvents?: (handleId: number) => Array<{ kind: string; path: string }>\r\n /** Hentikan watcher dengan handleId. */\r\n stopWatch?: (handleId: number) => boolean\r\n}\r\n\r\nconst isValidScannerBinding = (module: unknown): module is NativeScannerBinding => {\r\n const candidate = module as Partial<NativeScannerBinding> | null | undefined\r\n return !!(\r\n candidate &&\r\n (candidate.scanWorkspace ||\r\n candidate.extractClassesFromSource ||\r\n candidate.hashFileContent ||\r\n candidate.cacheRead ||\r\n candidate.cacheWrite)\r\n )\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createScannerBridgeLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeScannerBinding | null | undefined,\r\n loadError: null as string | null,\r\n candidatePaths: [] as string[],\r\n }\r\n\r\n const throwNativeBindingError = (): never => {\r\n const lines = [\r\n \"FATAL: Native scanner binding not found.\",\r\n \"\",\r\n \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\r\n \"The binding was not found in any of these paths:\",\r\n ..._state.candidatePaths.map((p) => ` - ${p}`),\r\n \"\",\r\n ]\r\n\r\n if (_state.loadError) {\r\n lines.push(\"Load error:\", ` ${_state.loadError}`, \"\")\r\n }\r\n\r\n lines.push(\r\n \"To fix this, run:\",\r\n \" npm run build:rust\",\r\n \"\",\r\n \"This will build the native Rust module from the 'native/' directory.\",\r\n \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\r\n \"and 'npm run build:rust' is executed before running tests or building.\"\r\n )\r\n\r\n throw new TwError(\"rust\", \"SCANNER_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\r\n }\r\n\r\n const scannerGetBinding = (): NativeScannerBinding => {\r\n const cachedBinding = _state.binding\r\n if (cachedBinding !== undefined) {\r\n if (cachedBinding !== null) {\r\n return cachedBinding\r\n }\r\n return throwNativeBindingError()\r\n }\r\n\r\n const runtimeDir = getDirname()\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n includeDefaultCandidates: true,\r\n })\r\n\r\n _state.candidatePaths = candidates\r\n\r\n const { binding, loadErrors } = loadNativeBinding<NativeScannerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isValidScannerBinding,\r\n invalidExportMessage: \"Module loaded but missing expected scanner binding functions\",\r\n })\r\n\r\n if (binding) {\r\n log(`scanner native binding loaded successfully`)\r\n _state.binding = binding\r\n return _state.binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\r\n }\r\n\r\n _state.binding = null\r\n return throwNativeBindingError()\r\n }\r\n\r\n return {\r\n get: scannerGetBinding,\r\n scannerGetBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.loadError = null\r\n _state.candidatePaths = []\r\n },\r\n }\r\n}\r\n\r\nconst scannerBridgeLoader = createScannerBridgeLoader()\r\nconst scannerGetBinding = scannerBridgeLoader.get\r\n\r\nexport const resetScannerBridgeCache = scannerBridgeLoader.reset\r\n\r\nexport function scanWorkspaceNative(\r\n root: string,\r\n extensions?: string[]\r\n): ReturnType<NonNullable<NativeScannerBinding[\"scanWorkspace\"]>> {\r\n return scannerGetBinding().scanWorkspace!(root, extensions ?? null)\r\n}\r\n\r\nexport function extractClassesNative(source: string): string[] {\r\n const result = scannerGetBinding().extractClassesFromSource?.(source)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_EXTRACT_FAILED\",\r\n \"Native extractClassesFromSource returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function hashContentNative(content: string): string {\r\n const result = scannerGetBinding().hashFileContent?.(content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_HASH_FAILED\",\r\n \"Native hashFileContent returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function isRustCacheAvailable(): boolean {\r\n return true\r\n}\r\n\r\nexport function hasNativeScannerBinding(): boolean {\r\n try {\r\n scannerBridgeLoader.get()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function cacheReadNative(\r\n cachePath: string\r\n): ReturnType<NonNullable<NativeScannerBinding[\"cacheRead\"]>> {\r\n const result = scannerGetBinding().cacheRead?.(cachePath)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_READ_FAILED\",\r\n \"Native cacheRead returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cacheWriteNative(\r\n cachePath: string,\r\n entries: Parameters<NonNullable<NativeScannerBinding[\"cacheWrite\"]>>[1]\r\n): boolean {\r\n const result = scannerGetBinding().cacheWrite?.(cachePath, entries)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_WRITE_FAILED\",\r\n \"Native cacheWrite returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cachePriorityNative(\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs = Date.now()\r\n): number {\r\n const result = scannerGetBinding().cachePriority?.(\r\n mtimeMs,\r\n size,\r\n cachedMtimeMs,\r\n cachedSize,\r\n cachedHitCount,\r\n cachedLastSeenMs,\r\n nowMs\r\n )\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_PRIORITY_FAILED\",\r\n \"Native cachePriority returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function batchExtractClassesNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.batchExtractClasses) {\r\n throw new Error(\"FATAL: Native binding 'batchExtractClasses' is required but not available.\")\r\n }\r\n return binding.batchExtractClasses(filePaths) ?? []\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// In-memory scan cache (Rust DashMap — zero disk I/O)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function scanCacheGet(filePath: string, contentHash: string): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheGet) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheGet' is required but not available.\")\r\n }\r\n return binding.scanCacheGet(filePath, contentHash) ?? null\r\n}\r\n\r\nexport function scanCachePut(\r\n filePath: string,\r\n contentHash: string,\r\n classes: string[],\r\n mtimeMs: number,\r\n size: number\r\n): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCachePut) {\r\n throw new Error(\"FATAL: Native binding 'scanCachePut' is required but not available.\")\r\n }\r\n binding.scanCachePut(filePath, contentHash, classes, mtimeMs, size)\r\n}\r\n\r\nexport function scanCacheInvalidate(filePath: string): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheInvalidate) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheInvalidate' is required but not available.\")\r\n }\r\n binding.scanCacheInvalidate(filePath)\r\n}\r\n\r\nexport function scanCacheStats(): { size: number } {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheStats) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheStats' is required but not available.\")\r\n }\r\n return binding.scanCacheStats() as { size: number }\r\n}\r\nexport function scanFileNative(filePath: string): {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n} {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFile) {\r\n throw new Error(\"FATAL: Native binding 'scanFile' is required but not available.\")\r\n }\r\n return binding.scanFile(filePath)\r\n}\r\n/**\r\n * Native file walker — kumpulkan file paths rekursif tanpa baca konten.\r\n *\r\n * Menggantikan `collectFiles()` di `parallel-scanner.ts`.\r\n * Returns null jika binding tidak tersedia (fallback ke JS).\r\n */\r\nexport function collectFilesNative(\r\n root: string,\r\n extensions: string[] | null,\r\n ignoreDirs: string[] | null\r\n): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.collectFiles) return null\r\n return binding.collectFiles(root, extensions, ignoreDirs)\r\n}\r\n/**\r\n * Batch scan + hash banyak file sekaligus dalam satu NAPI call.\r\n *\r\n * Menggantikan loop `scanFileNative()` per file di worker thread.\r\n * Rust: `par_iter()` via rayon — semua file diproses paralel di thread pool Rust,\r\n * tanpa overhead spawn JS worker untuk setiap chunk.\r\n *\r\n * Kapan pakai ini vs `batchExtractClassesNative`:\r\n * - `scanFilesBatch` → butuh {file, classes, hash} — scan + hash sekaligus\r\n * - `batchExtractClasses` → hanya butuh {file, classes, content_hash, ok, error}\r\n *\r\n * Returns: array dengan panjang sama dengan input. File yang gagal dibaca\r\n * dikembalikan dengan classes:[] dan hash:\"\".\r\n */\r\nexport function scanFilesBatchNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFilesBatch) {\r\n // Fallback: panggil scanFile satu per satu\r\n return filePaths.map((fp) => {\r\n try {\r\n const r = binding.scanFile?.(fp)\r\n return r\r\n ? { file: r.file, classes: r.classes, hash: r.hash ?? \"\" }\r\n : { file: fp, classes: [], hash: \"\" }\r\n } catch {\r\n return { file: fp, classes: [], hash: \"\" }\r\n }\r\n })\r\n }\r\n return binding.scanFilesBatch(filePaths)\r\n}\r\n \r\n/**\r\n * Scan workspace rekursif dan generate TypeScript type declarations\r\n * untuk setiap sub-component yang ditemukan.\r\n *\r\n * Menggantikan operasi scan manual + string codegen di JS.\r\n * Rust: walkdir + regex class extraction + type codegen dalam satu pass.\r\n *\r\n * @param root Direktori root workspace\r\n * @param outputPath Path output file .d.ts (opsional — kalau null, hanya return result)\r\n */\r\nexport function generateSubComponentTypesNative(\r\n root: string,\r\n outputPath?: string\r\n): {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.generateSubComponentTypes) return null\r\n return binding.generateSubComponentTypes(root, outputPath ?? null) as {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n}\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// pruneStaleEntries + computeCacheStats — native wrappers\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Batch-check file existence + stale age menggunakan Rust syscalls.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan loop `existsSync()` di `pruneStaleEntries()` (cache-native.ts).\r\n */\r\nexport function pruneStaleEntriesNative(\r\n entries: Array<{ file: string; lastSeenMs?: number }>,\r\n maxAgeMs?: number,\r\n checkExists?: boolean\r\n): { keptIndices: number[]; removed: number } | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.pruneStaleEntries) return null\r\n return binding.pruneStaleEntries(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs ?? 0 })),\r\n maxAgeMs ?? null,\r\n checkExists ?? null\r\n )\r\n}\r\n\r\n/**\r\n * Hitung class frequency + stats dari disk cache entries menggunakan Rust.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan `computeCacheStats()` di `cache-native.ts`.\r\n */\r\nexport function rebuildWorkspaceResultNative(\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n): { files: typeof files; totalFiles: number; uniqueClasses: string[] } | null {\r\n const binding = scannerBridgeLoader.get()\r\n if (!binding?.rebuildWorkspaceResult) return null\r\n try {\r\n return binding.rebuildWorkspaceResult(files)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function computeCacheStatsNative(\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top?: number\r\n): {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.computeCacheStats) return null\r\n return binding.computeCacheStats(filesClasses, sizes, top ?? null)\r\n}\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Watch API — native wrappers (QA #12)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Mulai native file watcher menggunakan `notify` crate (Rust).\r\n * Returns `null` jika binding tidak tersedia — fallback ke fs.watch JS.\r\n */\r\nexport function startWatchNative(rootDir: string): { status: string; handleId: number } | null {\r\n try {\r\n const binding = scannerGetBinding()\r\n if (!binding.startWatch) return null\r\n return binding.startWatch(rootDir)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Poll events dari native watcher queue. Queue dikosongkan setelah dipoll.\r\n * Returns array kosong jika tidak ada events atau binding tidak tersedia.\r\n */\r\nexport function pollWatchEventsNative(handleId: number): Array<{ kind: string; path: string }> {\r\n try {\r\n const binding = scannerGetBinding()\r\n if (!binding.pollWatchEvents) return []\r\n return binding.pollWatchEvents(handleId)\r\n } catch {\r\n return []\r\n }\r\n}\r\n\r\n/**\r\n * Hentikan native watcher dengan handleId.\r\n */\r\nexport function stopWatchNative(handleId: number): boolean {\r\n try {\r\n const binding = scannerGetBinding()\r\n if (!binding.stopWatch) return false\r\n return binding.stopWatch(handleId)\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Cek apakah native watch API tersedia.\r\n */\r\nexport function hasNativeWatchBinding(): boolean {\r\n try {\r\n const binding = scannerGetBinding()\r\n return !!(binding.startWatch && binding.pollWatchEvents && binding.stopWatch)\r\n } catch {\r\n return false\r\n }\r\n}","/**\r\n * tailwind-styled-v4 — Scanner Cache (Rust-backed)\r\n *\r\n * This module REQUIRES native Rust bindings and will FAIL LOUDLY if they are not available.\r\n * NO JavaScript fallback is provided.\r\n */\r\n\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport {\r\n cachePriorityNative,\r\n cacheReadNative,\r\n cacheWriteNative,\r\n scanCacheGet,\r\n scanCachePut,\r\n scanCacheInvalidate,\r\n scanCacheStats,\r\n pruneStaleEntriesNative,\r\n computeCacheStatsNative,\r\n} from \"./native-bridge\"\r\n\r\nfunction defaultCachePath(rootDir: string, cacheDir?: string): string {\r\n const dir = cacheDir\r\n ? path.resolve(rootDir, cacheDir)\r\n : path.join(process.cwd(), \".cache\", \"tailwind-styled\")\r\n return path.join(dir, \"scanner-cache.json\")\r\n}\r\n\r\n// ── Public API ────────────────────────────────────────────────────────────────\r\n\r\nexport interface NativeCacheEntry {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n /** Terakhir file ditemukan di filesystem (ms epoch). Digunakan untuk stale cleanup. */\r\n lastSeenMs?: number\r\n}\r\n\r\n/** Default stale threshold — 7 hari */\r\nconst STALE_THRESHOLD_MS = 7 * 24 * 60 * 60 * 1000\r\n\r\n/**\r\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\r\n *\r\n * Native-first: Rust batch-check semua file dalam satu pass tanpa\r\n * event loop overhead. JS fallback: existsSync loop per file.\r\n */\r\nexport function pruneStaleEntries(\r\n entries: NativeCacheEntry[],\r\n opts: { maxAgeMs?: number; rootDir?: string } = {}\r\n): { pruned: NativeCacheEntry[]; removed: number } {\r\n // Native-first: satu NAPI call — Rust check semua files sekaligus\r\n const nativeResult = pruneStaleEntriesNative(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs })),\r\n opts.maxAgeMs,\r\n !!opts.rootDir // hanya check existence jika rootDir disediakan\r\n )\r\n\r\n if (nativeResult !== null) {\r\n const pruned = nativeResult.keptIndices.map((i) => entries[i])\r\n return { pruned, removed: nativeResult.removed }\r\n }\r\n\r\n // JS fallback\r\n const maxAge = opts.maxAgeMs ?? STALE_THRESHOLD_MS\r\n const now = Date.now()\r\n const { existsSync } = require(\"node:fs\") as typeof import(\"node:fs\")\r\n\r\n const pruned = entries.filter((entry) => {\r\n if (opts.rootDir && !existsSync(entry.file)) return false\r\n if (entry.lastSeenMs && now - entry.lastSeenMs > maxAge) return false\r\n return true\r\n })\r\n\r\n return { pruned, removed: entries.length - pruned.length }\r\n}\r\n\r\n/**\r\n * Read scanner cache from disk using Rust parser.\r\n * REQUIRES native binding - throws if unavailable.\r\n *\r\n * FIX: Pastikan folder cache ada sebelum Rust coba baca file,\r\n * supaya tidak error \"os error 3 (path not found)\" pada first run.\r\n */\r\nexport function readCache(rootDir: string, cacheDir?: string): NativeCacheEntry[] {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n // Buat folder cache jika belum ada — cegah \"os error 3\" pada first run\r\n fs.mkdirSync(path.dirname(cachePath), { recursive: true })\r\n\r\n const result = cacheReadNative(cachePath)\r\n if (!result) return []\r\n\r\n return result.entries.map((e) => ({\r\n file: e.file,\r\n classes: e.classes,\r\n hash: e.hash,\r\n mtimeMs: e.mtimeMs,\r\n size: e.size,\r\n hitCount: e.hitCount,\r\n lastSeenMs: e.lastSeenMs,\r\n }))\r\n}\r\n\r\n/**\r\n * Write scanner cache to disk using Rust serialiser.\r\n * REQUIRES native binding - throws if unavailable.\r\n *\r\n * FIX: Pastikan folder cache ada sebelum Rust coba tulis file.\r\n */\r\nexport function writeCache(rootDir: string, entries: NativeCacheEntry[], cacheDir?: string): void {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n // Buat folder cache jika belum ada — cegah write gagal pada first run\r\n fs.mkdirSync(path.dirname(cachePath), { recursive: true })\r\n\r\n const success = cacheWriteNative(cachePath, entries)\r\n if (!success) {\r\n throw new Error(\r\n \"Native cacheWrite failed. Run 'npm run build:rust' to rebuild native bindings.\"\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Compute priority score for a file using the Rust SmartCache algorithm.\r\n * Higher = process first.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function filePriority(\r\n mtimeMs: number,\r\n size: number,\r\n cached: { mtimeMs: number; size: number; hitCount: number; lastSeenMs?: number } | undefined,\r\n nowMs = Date.now()\r\n): number {\r\n return cachePriorityNative(\r\n mtimeMs,\r\n size,\r\n cached?.mtimeMs ?? 0,\r\n cached?.size ?? 0,\r\n cached?.hitCount ?? 0,\r\n cached?.lastSeenMs ?? 0,\r\n nowMs\r\n )\r\n}\r\n\r\nexport interface CacheStats {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntry: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n}\r\n\r\n/**\r\n * Rust in-memory cache — hot path untuk per-file lookup saat scan.\r\n * Jauh lebih cepat dari disk JSON cache untuk file yang baru saja di-scan.\r\n */\r\nexport const hotCache = {\r\n get: scanCacheGet,\r\n put: scanCachePut,\r\n invalidate: scanCacheInvalidate,\r\n} as const\r\n\r\n/**\r\n * Stats dari Rust in-memory cache (DashMap).\r\n * `size` = jumlah entry saat ini di cache.\r\n */\r\nexport function getHotCacheStats(): { size: number } {\r\n return scanCacheStats()\r\n}\r\n\r\n/**\r\n * Compute disk cache stats dari entries (diperlukan untuk mostUsedClasses).\r\n *\r\n * Native-first: Rust HashMap count + partial sort — ~3× lebih cepat\r\n * dari JS Map untuk workspace besar (5000+ entries).\r\n * JS fallback: manual Map count + .sort().\r\n */\r\nexport function computeCacheStats(entries: NativeCacheEntry[]): CacheStats {\r\n if (entries.length === 0) {\r\n return { totalEntries: 0, totalClasses: 0, totalSizeBytes: 0, avgClassesPerEntry: 0, mostUsedClasses: [] }\r\n }\r\n\r\n // Native-first\r\n const nativeResult = computeCacheStatsNative(\r\n entries.map((e) => e.classes),\r\n entries.map((e) => e.size),\r\n 10\r\n )\r\n\r\n if (nativeResult !== null) {\r\n return {\r\n totalEntries: nativeResult.totalEntries,\r\n totalClasses: nativeResult.totalClasses,\r\n totalSizeBytes: nativeResult.totalSizeBytes,\r\n avgClassesPerEntry: nativeResult.avgClassesPerEntryX100 / 100,\r\n mostUsedClasses: nativeResult.mostUsedClasses,\r\n }\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'computeCacheStats' is required but not available.\")\r\n}","/**\r\n * Native parallel scanner menggunakan worker threads + Rust batchExtractClasses.\r\n *\r\n * Untuk workspaces besar (200+ files), file-list dibagi ke beberapa worker.\r\n * Setiap worker memanggil native `batchExtractClasses` yang sudah memakai\r\n * rayon par_iter di sisi Rust — sehingga parallelism terjadi di dua level:\r\n * 1. Multiple worker threads (TS/Node level)\r\n * 2. rayon par_iter di dalam setiap worker (Rust level)\r\n *\r\n * Untuk workspace kecil (< PARALLEL_THRESHOLD), langsung panggil batchExtractClasses\r\n * di main thread — overhead spawn worker tidak worth it.\r\n */\r\n\r\nimport { Worker, isMainThread, parentPort, workerData } from \"node:worker_threads\"\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { availableParallelism } from \"node:os\"\r\nimport { fileURLToPath } from \"node:url\"\r\n\r\nimport { isScannableFile, DEFAULT_EXTENSIONS, DEFAULT_IGNORES } from \"./index\"\r\nimport { batchExtractClassesNative, collectFilesNative, rebuildWorkspaceResultNative } from \"./native-bridge\"\r\nimport type { ScanWorkspaceResult, ScanFileResult } from \"./types\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Constants\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst PARALLEL_THRESHOLD = 50\r\nconst DEFAULT_CHUNK_SIZE = 150\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface ParallelScanOptions {\r\n extensions?: string[]\r\n ignoreDirs?: string[]\r\n maxWorkers?: number\r\n chunkSize?: number\r\n}\r\n\r\ninterface NativeBatchResult {\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}\r\n\r\ninterface WorkerInput {\r\n filePaths: string[]\r\n}\r\n\r\ntype WorkerOutput =\r\n | { ok: true; results: NativeBatchResult[] }\r\n | { ok: false; error: string }\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection — native-first, JS fallback\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Kumpulkan semua file yang cocok secara rekursif dari rootDir.\r\n *\r\n * Native: satu Rust walk tanpa JS event loop overhead — 2–5× lebih cepat\r\n * untuk workspace besar. Tidak membaca konten file, hanya paths.\r\n *\r\n * JS fallback: dipakai jika native binding tidak tersedia (mis. test env).\r\n */\r\nfunction collectFiles(rootDir: string, extensions: string[], ignoreDirs: string[]): string[] {\r\n // Native-first: satu NAPI call menggantikan seluruh rekursi JS\r\n const native = collectFilesNative(rootDir, extensions, ignoreDirs)\r\n if (native !== null) return native\r\n\r\n // JS fallback\r\n const files: string[] = []\r\n\r\n function walk(dir: string): void {\r\n let entries: fs.Dirent[]\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true })\r\n } catch {\r\n return\r\n }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name)\r\n const rel = path.relative(rootDir, fullPath)\r\n if (entry.isDirectory()) {\r\n const ignored = ignoreDirs.some((d) => entry.name === d || rel.startsWith(d + path.sep))\r\n if (!ignored) walk(fullPath)\r\n } else if (isScannableFile(entry.name, extensions)) {\r\n files.push(fullPath)\r\n }\r\n }\r\n }\r\n\r\n walk(rootDir)\r\n return files\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Merge results\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction mergeResults(batchResults: NativeBatchResult[]): ScanWorkspaceResult {\r\n const files: ScanFileResult[] = batchResults.map((r) => ({\r\n file: r.file,\r\n classes: r.classes,\r\n hash: r.content_hash,\r\n }))\r\n // Native-first: Rust HashSet dedup + sort_unstable (satu pass, zero GC)\r\n const native = rebuildWorkspaceResultNative(files)\r\n if (native) return native\r\n // Fallback — hanya aktif jika binding belum loaded (e.g. test env)\r\n const unique = new Set(files.flatMap((f) => f.classes))\r\n return { files, totalFiles: files.length, uniqueClasses: Array.from(unique).sort() }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Worker thread entry point\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nif (!isMainThread && parentPort) {\r\n const { filePaths } = workerData as WorkerInput\r\n try {\r\n const results = batchExtractClassesNative(filePaths)\r\n const msg: WorkerOutput = { ok: true, results }\r\n parentPort.postMessage(msg)\r\n } catch (error) {\r\n const msg: WorkerOutput = {\r\n ok: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }\r\n parentPort.postMessage(msg)\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// __filename compat CJS + ESM\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\ndeclare const __filename: string | undefined\r\nconst _workerFilename =\r\n typeof __filename !== \"undefined\" ? __filename : fileURLToPath(import.meta.url)\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Spawn worker for one chunk\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction runChunkInWorker(filePaths: string[]): Promise<NativeBatchResult[]> {\r\n return new Promise((resolve, reject) => {\r\n const worker = new Worker(_workerFilename, {\r\n workerData: { filePaths } satisfies WorkerInput,\r\n })\r\n worker.once(\"message\", (payload: WorkerOutput) => {\r\n if (payload.ok) {\r\n resolve(payload.results)\r\n } else {\r\n reject(new Error(payload.error ?? \"parallel-scanner worker failed\"))\r\n }\r\n })\r\n worker.once(\"error\", reject)\r\n worker.once(\"exit\", (code) => {\r\n if (code !== 0) reject(new Error(`parallel-scanner worker exited with code ${code}`))\r\n })\r\n })\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Public API\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport async function scanWorkspaceParallel(\r\n rootDir: string,\r\n options: ParallelScanOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const {\r\n extensions = DEFAULT_EXTENSIONS,\r\n ignoreDirs = DEFAULT_IGNORES,\r\n maxWorkers = Math.max(1, availableParallelism() - 1),\r\n chunkSize = DEFAULT_CHUNK_SIZE,\r\n } = options\r\n\r\n const files = collectFiles(path.resolve(rootDir), extensions, ignoreDirs)\r\n\r\n if (files.length < PARALLEL_THRESHOLD) {\r\n return mergeResults(batchExtractClassesNative(files))\r\n }\r\n\r\n const chunks: string[][] = []\r\n for (let i = 0; i < files.length; i += chunkSize) {\r\n chunks.push(files.slice(i, i + chunkSize))\r\n }\r\n\r\n const allResults: NativeBatchResult[] = []\r\n for (let i = 0; i < chunks.length; i += maxWorkers) {\r\n const batch = chunks.slice(i, i + maxWorkers)\r\n const batchResults = await Promise.all(batch.map(runChunkInWorker))\r\n allResults.push(...batchResults.flat())\r\n }\r\n\r\n return mergeResults(allResults)\r\n}","import { z } from \"zod\"\r\nimport { TwError } from \"@tailwind-styled/shared\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst NonNegativeIntegerSchema = z.number().int().min(0)\r\n\r\nexport const ScanWorkspaceOptionsSchema = z.object({\r\n includeExtensions: z.array(z.string()).optional(),\r\n ignoreDirectories: z.array(z.string()).optional(),\r\n useCache: z.boolean().optional(),\r\n cacheDir: z.string().min(1).optional(),\r\n smartInvalidation: z.boolean().optional(),\r\n})\r\n\r\nexport type ScanWorkspaceOptions = z.infer<typeof ScanWorkspaceOptionsSchema>\r\n\r\nexport const ScanFileResultSchema = z.object({\r\n file: z.string(),\r\n classes: z.array(z.string()),\r\n hash: z.string().optional(),\r\n})\r\n\r\nexport type ScanFileResult = z.infer<typeof ScanFileResultSchema>\r\n\r\nexport const ScanWorkspaceResultSchema = z\r\n .object({\r\n files: z.array(ScanFileResultSchema),\r\n totalFiles: NonNegativeIntegerSchema,\r\n uniqueClasses: z.array(z.string()),\r\n })\r\n .refine((value) => value.totalFiles === value.files.length, {\r\n message: \"scan result totalFiles must match files.length\",\r\n path: [\"totalFiles\"],\r\n })\r\n\r\nexport type ScanWorkspaceResult = z.infer<typeof ScanWorkspaceResultSchema>\r\n\r\nexport const ScannerWorkerRequestSchema = z.object({\r\n rootDir: z.string().min(1),\r\n options: ScanWorkspaceOptionsSchema.optional(),\r\n})\r\n\r\nexport type ScannerWorkerRequest = z.infer<typeof ScannerWorkerRequestSchema>\r\n\r\nexport const ScannerWorkerSuccessMessageSchema = z.object({\r\n ok: z.literal(true),\r\n result: ScanWorkspaceResultSchema,\r\n})\r\n\r\nexport const ScannerWorkerErrorMessageSchema = z.object({\r\n ok: z.literal(false),\r\n error: z.string().optional(),\r\n})\r\n\r\nexport const ScannerWorkerMessageSchema = z.union([\r\n ScannerWorkerSuccessMessageSchema,\r\n ScannerWorkerErrorMessageSchema,\r\n])\r\n\r\nexport type ScannerWorkerMessage = z.infer<typeof ScannerWorkerMessageSchema>\r\n\r\nexport const parseScanWorkspaceOptions = (options: unknown) =>\r\n parseWithSchema(ScanWorkspaceOptionsSchema, options ?? {}, \"scanner options are invalid\")\r\n\r\nexport const parseScanFileResult = (result: unknown) =>\r\n parseWithSchema(ScanFileResultSchema, result, \"scanner file result is invalid\")\r\n\r\nexport const parseScanWorkspaceResult = (result: unknown) =>\r\n parseWithSchema(ScanWorkspaceResultSchema, result, \"scanner workspace result is invalid\")\r\n\r\nexport const parseScannerWorkerRequest = (request: unknown) =>\r\n parseWithSchema(ScannerWorkerRequestSchema, request, \"scanner worker request is invalid\")\r\n\r\nexport const parseScannerWorkerMessage = (message: unknown) =>\r\n parseWithSchema(ScannerWorkerMessageSchema, message, \"scanner worker message is invalid\")\r\n","import fs from \"node:fs\"\r\nimport { createRequire } from \"node:module\"\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport { Worker } from \"node:worker_threads\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\nimport { filePriority, type NativeCacheEntry, readCache, writeCache } from \"./cache-native\"\r\nimport { hashContentNative, isRustCacheAvailable } from \"./native-bridge\"\r\nimport { scanWorkspaceParallel } from \"./parallel-scanner\"\r\nimport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n type ScanFileResult,\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nconst log = createLogger(\"scanner\")\r\n\r\nconst SCAN_WORKER_TIMEOUT_MS = 120_000\r\n\r\ntype NativeParsedClass = { raw?: string }\r\n// ClassExtractResult shape dari Rust (napi-rs export)\r\ntype NativeClassExtractResult = {\r\n classes: string[]\r\n componentNames: string[]\r\n hasTwUsage: boolean\r\n hasUseClient: boolean\r\n imports: string[]\r\n}\r\ntype NativeParserBinding = {\r\n parse_classes?: (input: string) => NativeParsedClass[]\r\n parseClasses?: (input: string) => NativeParsedClass[]\r\n // Rust returns ClassExtractResult object, bukan plain string[]\r\n extractClassesFromSource?: (source: string) => NativeClassExtractResult | string[] | null\r\n batchExtractClassesNative?: (filePaths: string[]) => Array<{\r\n file: string; classes: string[]; contentHash: string; ok: boolean; error?: string\r\n }>\r\n}\r\n\r\nfunction getRuntimeDir(): string {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Parser Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createNativeParserLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeParserBinding | null | undefined,\r\n initError: null as string | null,\r\n }\r\n\r\n const debugNative = (message: string): void => {\r\n log.debug(`[native] ${message}`)\r\n }\r\n\r\n const loadNativeParserBinding = (): NativeParserBinding | null => {\r\n if (_state.binding !== undefined) return _state.binding\r\n\r\n const runtimeDir = getRuntimeDir()\r\n const req = createRequire(path.join(runtimeDir, \"noop.cjs\"))\r\n\r\n const _platform = process.platform\r\n const _arch = process.arch\r\n const _platformArch = `${_platform}-${_arch}`\r\n const _platformArchGnu = _platformArch === \"linux-x64\" ? \"linux-x64-gnu\"\r\n : _platformArch === \"linux-arm64\" ? \"linux-arm64-gnu\"\r\n : _platformArch\r\n\r\n const candidates = [\r\n // ── binaryName baru: tailwind-styled-native (napi-rs naming) ──\r\n // cwd = repo root saat run dari root, atau package dir saat workspaces\r\n path.resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${_platformArch}.node`),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // runtimeDir = dist/ → naik 1 level ke package root (npm install case)\r\n // e.g. node_modules/tailwind-styled-v4/dist/ → node_modules/tailwind-styled-v4/native/\r\n path.resolve(runtimeDir, \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_platformArch}.node`),\r\n path.resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // runtimeDir = dist/ → naik 4 level ke repo root (monorepo dev case)\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // 3 level fallback (jika package di-nest lebih dangkal)\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // ── binaryName lama: tailwind_styled_parser (backward compat) ──\r\n path.resolve(process.cwd(), \"native/tailwind_styled_parser.node\"),\r\n path.resolve(process.cwd(), \"native/build/Release/tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(\r\n runtimeDir,\r\n \"..\",\r\n \"..\",\r\n \"..\",\r\n \"native\",\r\n \"build\",\r\n \"Release\",\r\n \"tailwind_styled_parser.node\"\r\n ),\r\n ]\r\n\r\n for (const fullPath of candidates) {\r\n if (!fs.existsSync(fullPath)) continue\r\n try {\r\n const required = req(fullPath) as NativeParserBinding\r\n if (\r\n required &&\r\n (typeof required.extractClassesFromSource === \"function\" ||\r\n typeof required.parseClasses === \"function\" ||\r\n typeof required.parse_classes === \"function\")\r\n ) {\r\n _state.binding = required\r\n debugNative(`using native parser from ${fullPath}`)\r\n return _state.binding\r\n }\r\n } catch (error) {\r\n _state.initError = error instanceof Error ? error.message : String(error)\r\n }\r\n }\r\n\r\n _state.binding = null\r\n if (!_state.initError) {\r\n _state.initError = \"native .node binding not found\"\r\n }\r\n debugNative(`native binding not available: ${_state.initError}`)\r\n return _state.binding\r\n }\r\n\r\n return {\r\n get: loadNativeParserBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.initError = null\r\n },\r\n }\r\n}\r\n\r\nconst nativeParserLoader = createNativeParserLoader()\r\n\r\nfunction normalizeWithNativeParser(tokens: string[]): string[] {\r\n const binding = nativeParserLoader.get()\r\n const parseClasses = binding?.parseClasses ?? binding?.parse_classes\r\n if (!binding || typeof parseClasses !== \"function\") {\r\n throw new Error(\r\n \"Native parser binding is required but not available. Run 'npm run build:rust' to build it.\"\r\n )\r\n }\r\n\r\n try {\r\n const parsed = parseClasses(tokens.join(\" \"))\r\n const normalized = parsed.map((item) => item.raw?.trim() ?? \"\").filter(Boolean)\r\n return Array.from(new Set(normalized))\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error)\r\n throw new Error(`Native parser failed: ${errorMessage}. Run 'npm run build:rust' to rebuild.`)\r\n }\r\n}\r\n\r\nexport type { ScanFileResult, ScanWorkspaceOptions, ScanWorkspaceResult } from \"./schemas\"\r\nexport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nexport const DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\r\nexport const DEFAULT_IGNORES = [\"node_modules\", \".git\", \".next\", \"dist\", \"out\", \".turbo\", \".cache\"]\r\n\r\nfunction resolveScannerWorkerModulePath(): string | null {\r\n const runtimeDir = (() => {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n // ESM fallback\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n // Final fallback\r\n return process.cwd()\r\n })()\r\n\r\n const candidates = [\r\n path.resolve(runtimeDir, \"worker.cjs\"),\r\n path.resolve(runtimeDir, \"worker.js\"),\r\n path.resolve(runtimeDir, \"worker.ts\"),\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction scanWorkspaceInWorker(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const modulePath = resolveScannerWorkerModulePath()\r\n if (!modulePath) {\r\n return Promise.reject(new Error(\"scanner worker module path could not be resolved\"))\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const settleState = { settled: false }\r\n\r\n const worker = new Worker(modulePath, { workerData: { rootDir, options: normalizedOptions } })\r\n\r\n const timeout = setTimeout(() => {\r\n if (!settleState.settled) {\r\n settleState.settled = true\r\n void worker.terminate()\r\n reject(new Error(`scanner worker timed out after ${SCAN_WORKER_TIMEOUT_MS}ms`))\r\n }\r\n }, SCAN_WORKER_TIMEOUT_MS)\r\n\r\n const finish = (callback: () => void) => {\r\n if (settleState.settled) return\r\n settleState.settled = true\r\n clearTimeout(timeout)\r\n callback()\r\n }\r\n\r\n worker.once(\"message\", (payload: unknown) => {\r\n const message = parseScannerWorkerMessage(payload)\r\n finish(() => {\r\n if (message?.ok) {\r\n resolve(parseScanWorkspaceResult(message.result))\r\n return\r\n }\r\n reject(new Error(message?.error ?? \"scanner worker failed without an error message\"))\r\n })\r\n })\r\n\r\n worker.once(\"error\", (error: Error) => {\r\n finish(() => reject(error))\r\n })\r\n\r\n worker.once(\"exit\", (code: number) => {\r\n if (code !== 0) {\r\n finish(() => reject(new Error(`scanner worker exited with code ${code}`)))\r\n }\r\n })\r\n })\r\n}\r\n\r\nfunction buildExtensionSet(includeExtensions: string[]): Set<string> {\r\n return new Set(includeExtensions)\r\n}\r\n\r\nfunction collectCandidates(\r\n rootDir: string,\r\n ignoreDirectories: Set<string>,\r\n extensionSet: Set<string>\r\n): string[] {\r\n const candidates: string[] = []\r\n const directories = [rootDir]\r\n\r\n while (directories.length > 0) {\r\n const currentDir = directories.pop()\r\n if (!currentDir) continue\r\n\r\n const entries = (() => {\r\n try {\r\n return fs.readdirSync(currentDir, { withFileTypes: true })\r\n } catch {\r\n return [] as fs.Dirent[]\r\n }\r\n })()\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name)\r\n\r\n if (entry.isDirectory()) {\r\n if (!ignoreDirectories.has(entry.name)) directories.push(fullPath)\r\n continue\r\n }\r\n\r\n if (!entry.isFile()) continue\r\n if (!extensionSet.has(path.extname(entry.name))) continue\r\n candidates.push(fullPath)\r\n }\r\n }\r\n\r\n return candidates\r\n}\r\n\r\nfunction toCacheSize(size: number): number {\r\n if (!Number.isFinite(size)) return 0\r\n const normalized = Math.max(0, Math.trunc(size))\r\n return Math.min(normalized, 0xffffffff)\r\n}\r\n\r\nexport function scanSource(source: string): string[] {\r\n const nativeBinding = nativeParserLoader.get()\r\n if (nativeBinding?.extractClassesFromSource) {\r\n const result = nativeBinding.extractClassesFromSource(source)\r\n // Rust mengembalikan ClassExtractResult { classes: string[], ... }\r\n // bukan plain string[] — handle kedua kemungkinan untuk backward compat\r\n if (Array.isArray(result)) {\r\n return Array.from(new Set(result.filter(Boolean)))\r\n }\r\n if (result !== null && result !== undefined && Array.isArray((result as NativeClassExtractResult).classes)) {\r\n return Array.from(new Set((result as NativeClassExtractResult).classes.filter(Boolean)))\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"FATAL: Native parser binding is required but not available.\\n\" +\r\n \"This package requires native Rust bindings.\\n\\n\" +\r\n \"Resolution steps:\\n\" +\r\n \"1. Build the native Rust module: npm run build:rust\"\r\n )\r\n}\r\n\r\nexport function isScannableFile(filePath: string, includeExtensions = DEFAULT_EXTENSIONS): boolean {\r\n return includeExtensions.includes(path.extname(filePath))\r\n}\r\n\r\nexport function scanFile(filePath: string): ScanFileResult {\r\n const { scanFileNative } = require(\"./native-bridge\")\r\n const result = scanFileNative(filePath) as {\r\n file: string; classes: string[]; hash: string; ok: boolean; error?: string | null\r\n }\r\n if (!result.ok) {\r\n throw new Error(`scanFile failed for ${filePath}: ${result.error ?? \"unknown error\"}`)\r\n }\r\n return {\r\n file: result.file,\r\n classes: result.classes,\r\n ...(result.hash ? { hash: result.hash } : {}),\r\n }\r\n}\r\n\r\nexport function scanWorkspace(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): ScanWorkspaceResult {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const includeExtensions = normalizedOptions.includeExtensions ?? DEFAULT_EXTENSIONS\r\n const extensionSet = buildExtensionSet(includeExtensions)\r\n const ignoreDirectories = new Set(normalizedOptions.ignoreDirectories ?? DEFAULT_IGNORES)\r\n const useCache = normalizedOptions.useCache ?? true\r\n const _smartInvalidation = normalizedOptions.smartInvalidation ?? true\r\n\r\n const files: ScanFileResult[] = []\r\n const unique = new Set<string>()\r\n const candidates = collectCandidates(rootDir, ignoreDirectories, extensionSet)\r\n\r\n const processResult = (result: ScanFileResult) => {\r\n files.push(result)\r\n for (const cls of result.classes) unique.add(cls)\r\n }\r\n\r\n \r\n const { scanWorkspaceNative } = require(\"./native-bridge\")\r\n\r\n if (!normalizedOptions.cacheDir && !useCache) {\r\n const nativeResult = scanWorkspaceNative(rootDir, includeExtensions)\r\n if (nativeResult) {\r\n return parseScanWorkspaceResult({\r\n files: nativeResult.files.map((f: { file: string; classes: string[]; hash?: string }) => ({\r\n file: f.file,\r\n classes: f.classes,\r\n ...(f.hash ? { hash: f.hash } : {}),\r\n })),\r\n totalFiles: nativeResult.totalFiles,\r\n uniqueClasses: nativeResult.uniqueClasses,\r\n })\r\n }\r\n }\r\n\r\n if (useCache && isRustCacheAvailable()) {\r\n const cacheEntries: NativeCacheEntry[] = (() => {\r\n try {\r\n return readCache(rootDir, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(\r\n `cache read failed, continuing without persisted cache: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return []\r\n }\r\n })()\r\n\r\n const cacheMap = new Map(cacheEntries.map((entry) => [entry.file, entry]))\r\n const nowMs = Date.now()\r\n const ranked: Array<{\r\n filePath: string\r\n stat: fs.Stats\r\n size: number\r\n cached?: NativeCacheEntry\r\n priority: number\r\n }> = []\r\n\r\n for (const filePath of candidates) {\r\n const stat = (() => {\r\n try {\r\n return fs.statSync(filePath)\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!stat) continue\r\n\r\n const size = toCacheSize(stat.size)\r\n const cached = cacheMap.get(filePath)\r\n const priority = filePriority(\r\n stat.mtimeMs,\r\n size,\r\n cached\r\n ? {\r\n mtimeMs: cached.mtimeMs,\r\n size: cached.size,\r\n hitCount: cached.hitCount,\r\n lastSeenMs: 0,\r\n }\r\n : undefined,\r\n nowMs\r\n )\r\n\r\n ranked.push({ filePath, stat, size, cached, priority })\r\n }\r\n\r\n ranked.sort((a, b) => b.priority - a.priority)\r\n\r\n const updatedEntries: NativeCacheEntry[] = []\r\n\r\n for (const { filePath, stat, size, cached } of ranked) {\r\n const content = (() => {\r\n try {\r\n return fs.readFileSync(filePath, \"utf8\")\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!content) continue\r\n\r\n const hash = hashContentNative(content)\r\n if (\r\n cached &&\r\n cached.hash === hash &&\r\n cached.mtimeMs === stat.mtimeMs &&\r\n cached.size === size\r\n ) {\r\n log.debug(`cache HIT ${filePath}`)\r\n processResult({ file: filePath, classes: cached.classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes: cached.classes,\r\n hash: cached.hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: (cached.hitCount ?? 0) + 1,\r\n })\r\n continue\r\n }\r\n\r\n log.debug(`cache MISS ${filePath}`)\r\n const classes = scanSource(content)\r\n processResult({ file: filePath, classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes,\r\n hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: 1,\r\n })\r\n }\r\n\r\n try {\r\n writeCache(rootDir, updatedEntries, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(`cache write failed: ${error instanceof Error ? error.message : String(error)}`)\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n }\r\n\r\n // Fast path: gunakan Rust batch extraction jika tersedia (parallel, tanpa GC)\r\n const batchNative = nativeParserLoader.get()?.batchExtractClassesNative\r\n if (batchNative) {\r\n const batchResults = batchNative(candidates)\r\n for (const r of batchResults ?? []) {\r\n if (r.ok) processResult({ file: r.file, classes: r.classes })\r\n }\r\n } else {\r\n for (const filePath of candidates) {\r\n processResult(scanFile(filePath))\r\n }\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n}\r\n\r\nexport async function scanWorkspaceAsync(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n\r\n // Large workspaces: use native parallel scanner (multiple workers + Rust rayon)\r\n try {\r\n return await scanWorkspaceParallel(rootDir, {\r\n extensions: normalizedOptions.includeExtensions,\r\n ignoreDirs: normalizedOptions.ignoreDirectories,\r\n }) as ScanWorkspaceResult\r\n } catch (parallelError) {\r\n log.debug(\r\n `parallel scan failed, retrying with single worker: ${\r\n parallelError instanceof Error ? parallelError.message : String(parallelError)\r\n }`\r\n )\r\n }\r\n\r\n // Fallback: single worker thread (still native)\r\n try {\r\n return await scanWorkspaceInWorker(rootDir, normalizedOptions)\r\n } catch (error) {\r\n log.debug(\r\n `worker scan failed, retrying with sync native scanner: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return scanWorkspace(rootDir, normalizedOptions)\r\n }\r\n}\r\nexport { extractClassesNative, batchExtractClassesNative } from \"./native-bridge\"","import path from \"node:path\"\r\n\r\nimport type { ScanWorkspaceResult } from \"@tailwind-styled/scanner\"\r\nimport { scanWorkspaceAsync } from \"@tailwind-styled/scanner\"\r\n\r\nimport { requireNativeBinding } from \"./binding\"\r\nimport { parseAnalyzerOptions, parseNativeReport } from \"./schemas\"\r\nimport { buildSemanticReport } from \"./semantic\"\r\nimport type { AnalyzerOptions, AnalyzerReport, ClassUsage } from \"./types\"\r\nimport { debugLog, formatErrorMessage, sanitizeFrequentThreshold, sanitizeTopLimit } from \"./utils\"\r\n\r\nfunction normalizeScan(\r\n scan: ScanWorkspaceResult,\r\n includeClass?: (className: string) => boolean\r\n): ScanWorkspaceResult {\r\n if (!includeClass) return scan\r\n\r\n const filteredFiles = scan.files.map((file) => ({\r\n file: file.file,\r\n classes: file.classes.filter((className) => includeClass(className)),\r\n }))\r\n\r\n const unique = new Set<string>()\r\n for (const file of filteredFiles) {\r\n for (const className of file.classes) {\r\n unique.add(className)\r\n }\r\n }\r\n\r\n return {\r\n files: filteredFiles,\r\n totalFiles: scan.totalFiles,\r\n uniqueClasses: Array.from(unique).sort(),\r\n }\r\n}\r\n\r\nexport async function collectClassCounts(scan: ScanWorkspaceResult): Promise<Map<string, number>> {\r\n const native = await requireNativeBinding()\r\n if (!native?.collectClassCounts) {\r\n throw new Error(\"FATAL: Native binding 'collectClassCounts' is required but not available.\")\r\n }\r\n const filesJson = JSON.stringify(\r\n scan.files.map((f) => ({ file: f.file ?? \"\", classes: f.classes }))\r\n )\r\n const result = native.collectClassCounts(filesJson) as Array<{ name: string; count: number }>\r\n const counts = new Map<string, number>()\r\n for (const entry of result) counts.set(entry.name, entry.count)\r\n return counts\r\n}\r\n\r\nfunction buildClassUsage(counts: Map<string, number>): ClassUsage[] {\r\n return Array.from(counts.entries())\r\n .map(([name, count]) => ({ name, count }))\r\n .sort((left, right) => {\r\n if (right.count !== left.count) return right.count - left.count\r\n return left.name.localeCompare(right.name)\r\n })\r\n}\r\n\r\nexport async function buildDistribution(\r\n usages: ClassUsage[],\r\n native?: Awaited<ReturnType<typeof requireNativeBinding>>\r\n): Promise<Record<string, number>> {\r\n const binding = native ?? (await requireNativeBinding())\r\n if (!binding?.buildDistribution) {\r\n throw new Error(\"FATAL: Native binding 'buildDistribution' is required but not available.\")\r\n }\r\n const result = binding.buildDistribution(\r\n JSON.stringify(usages.map((u) => ({ name: u.name, count: u.count })))\r\n ) as { once: number; few: number; moderate: number; frequent: number }\r\n return {\r\n \"1\": result.once,\r\n \"2-3\": result.few,\r\n \"4-7\": result.moderate,\r\n \"8+\": result.frequent,\r\n }\r\n}\r\n\r\n/**\r\n * Analyze Tailwind class usage in a workspace and return usage statistics.\r\n * Set `semantic.tailwindConfigPath` to override Tailwind config lookup.\r\n * @example\r\n * const report = await analyzeWorkspace(\"./src\", {\r\n * classStats: { top: 20, frequentThreshold: 2 },\r\n * semantic: { tailwindConfigPath: \"tailwind.config.js\" },\r\n * })\r\n */\r\nexport async function analyzeWorkspace(\r\n root: string,\r\n options: AnalyzerOptions = {}\r\n): Promise<AnalyzerReport> {\r\n const startedAtMs = Date.now()\r\n const resolvedRoot = path.resolve(root)\r\n const normalizedOptions = parseAnalyzerOptions(options)\r\n\r\n // 1. Scan workspace - const dengan IIFE async\r\n const scan = await (async () => {\r\n const scanStartedAtMs = Date.now()\r\n try {\r\n const result = await scanWorkspaceAsync(resolvedRoot, normalizedOptions.scanner)\r\n debugLog(\r\n `scanWorkspaceAsync processed ${result.totalFiles} files in ${Date.now() - scanStartedAtMs}ms`\r\n )\r\n return result\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to scan workspace at \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const normalizedScan = normalizeScan(scan, normalizedOptions.includeClass)\r\n const topLimit = sanitizeTopLimit(normalizedOptions.classStats?.top)\r\n const frequentThreshold = sanitizeFrequentThreshold(\r\n normalizedOptions.classStats?.frequentThreshold\r\n )\r\n\r\n const binding = await requireNativeBinding()\r\n const filesJson = JSON.stringify(\r\n normalizedScan.files.map((file) => ({ file: file.file, classes: file.classes }))\r\n )\r\n\r\n // 2. Native report - const dengan IIFE\r\n const nativeReport = (() => {\r\n try {\r\n const report = binding.analyzeClasses(filesJson, resolvedRoot, topLimit)\r\n if (!report) {\r\n throw new Error(`Native analyzer returned no report for \"${resolvedRoot}\".`)\r\n }\r\n return parseNativeReport(report)\r\n } catch (error) {\r\n throw new Error(\r\n `Native analyzer failed for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const counts = await collectClassCounts(normalizedScan)\r\n const baseAll = buildClassUsage(counts)\r\n\r\n // 3. Semantic report - const dengan IIFE async\r\n const { all, semanticReport } = await (async () => {\r\n if (!normalizedOptions.semantic) {\r\n return { all: baseAll, semanticReport: undefined }\r\n }\r\n\r\n const semanticOption =\r\n typeof normalizedOptions.semantic === \"object\" ? normalizedOptions.semantic : undefined\r\n const semanticStartedAtMs = Date.now()\r\n\r\n try {\r\n const report = await buildSemanticReport(baseAll, resolvedRoot, semanticOption)\r\n debugLog(`semantic report built in ${Date.now() - semanticStartedAtMs}ms`)\r\n\r\n if (report.conflicts.length === 0) {\r\n return { all: baseAll, semanticReport: report }\r\n }\r\n\r\n const conflicted = new Set(report.conflicts.flatMap((conflict) => conflict.classes))\r\n const updatedAll = baseAll.map((usage) =>\r\n conflicted.has(usage.name) ? { ...usage, isConflict: true } : usage\r\n )\r\n return { all: updatedAll, semanticReport: report }\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to build semantic report for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n { cause: error }\r\n )\r\n }\r\n })()\r\n\r\n // 4. Statistics — native-first: satu pass Rust vs 4× JS iterations\r\n const classStatsNative = binding?.computeClassStats?.(\r\n JSON.stringify(all),\r\n topLimit,\r\n frequentThreshold\r\n )\r\n const top: typeof all = classStatsNative ? JSON.parse(classStatsNative.topJson) : all.slice(0, topLimit)\r\n const frequent: typeof all = classStatsNative ? JSON.parse(classStatsNative.frequentJson) : all.filter((usage) => usage.count >= frequentThreshold).slice(0, topLimit)\r\n const unique: typeof all = classStatsNative ? JSON.parse(classStatsNative.uniqueJson) : all.filter((usage) => usage.count === 1)\r\n const totalClassOccurrences: number = classStatsNative\r\n ? classStatsNative.totalClassOccurrences\r\n : all.reduce((sum, usage) => sum + usage.count, 0)\r\n\r\n debugLog(\r\n `analyzeWorkspace completed in ${Date.now() - startedAtMs}ms ` +\r\n `(files=${normalizedScan.totalFiles}, uniqueClasses=${all.length})`\r\n )\r\n\r\n const distribution = await buildDistribution(all, binding)\r\n\r\n return {\r\n root: nativeReport.root || resolvedRoot,\r\n totalFiles: nativeReport.totalFiles,\r\n uniqueClassCount: all.length,\r\n totalClassOccurrences,\r\n classStats: {\r\n all,\r\n top,\r\n frequent,\r\n unique,\r\n distribution,\r\n },\r\n // topClasses — alias for classStats.top (test contract & backward compat)\r\n topClasses: top,\r\n safelist: all.map((usage) => usage.name),\r\n ...(semanticReport ? { semantic: semanticReport } : {}),\r\n }\r\n}","import {\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n resolveRuntimeDir,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nimport type { NativeAnalyzerBinding, NativeCssCompilerBinding } from \"./types\"\r\nimport { debugLog } from \"./utils\"\r\n\r\nconst isAnalyzerModule = (module: unknown): module is NativeAnalyzerBinding => {\r\n const candidate = module as Partial<NativeAnalyzerBinding> | null | undefined\r\n return typeof candidate?.analyzeClasses === \"function\"\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Analyzer Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createAnalyzerBindingLoader = () => {\r\n const _state = { bindingPromise: null as Promise<NativeAnalyzerBinding | null> | null }\r\n\r\n const getBindingPromise = (): Promise<NativeAnalyzerBinding | null> => {\r\n if (_state.bindingPromise) return _state.bindingPromise\r\n\r\n _state.bindingPromise = (async (): Promise<NativeAnalyzerBinding | null> => {\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { binding, loadErrors, loadedPath } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n if (binding) {\r\n debugLog(`native binding loaded from: ${loadedPath}`)\r\n return binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n debugLog(\r\n `native binding load failed for ${loadErrors.length} candidate(s): ${loadErrors\r\n .map((entry) => `${entry.path} (${entry.message})`)\r\n .join(\"; \")}`\r\n )\r\n } else {\r\n debugLog(\"native binding not found in any candidate path\")\r\n }\r\n\r\n return null\r\n })()\r\n\r\n return _state.bindingPromise\r\n }\r\n\r\n return {\r\n get: getBindingPromise,\r\n reset: (): void => {\r\n _state.bindingPromise = null\r\n },\r\n }\r\n}\r\n\r\nconst analyzerBindingLoader = createAnalyzerBindingLoader()\r\n\r\nexport async function getNativeBinding(): Promise<NativeAnalyzerBinding | null> {\r\n return analyzerBindingLoader.get()\r\n}\r\n\r\nexport async function requireNativeBinding(): Promise<NativeAnalyzerBinding> {\r\n const binding = await analyzerBindingLoader.get()\r\n if (binding?.analyzeClasses) return binding\r\n\r\n // Untuk error reporting, kita perlu akses ke candidates dan loadErrors\r\n // Tapi karena async, kita perlu load ulang atau simpan state\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { loadErrors } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n const lines = [\r\n \"Native analyzer binding not found. Ensure `tailwind_styled_parser.node` is built.\",\r\n ]\r\n\r\n lines.push(\"Checked paths:\")\r\n for (const candidate of candidates) lines.push(`- ${candidate}`)\r\n if (loadErrors.length > 0) {\r\n lines.push(\"Load errors:\")\r\n for (const failure of loadErrors) {\r\n lines.push(`- ${failure.path}: ${failure.message}`)\r\n }\r\n }\r\n\r\n throw new Error(lines.join(\"\\n\"))\r\n}\r\n\r\nexport async function requireNativeCssCompiler(): Promise<NativeCssCompilerBinding> {\r\n const binding = await requireNativeBinding()\r\n if (typeof binding.compileCss === \"function\") return binding as NativeCssCompilerBinding\r\n\r\n throw new Error(`Native analyzer compileCss binding is missing.`)\r\n}\r\n","import fs from \"node:fs\"\r\nimport { createDebugLogger } from \"@tailwind-styled/shared\"\r\n\r\nexport const DEFAULT_TOP_LIMIT = 10\r\nexport const DEFAULT_FREQUENT_THRESHOLD = 2\r\nexport const DEBUG_NAMESPACE = \"tailwind-styled:analyzer\"\r\n\r\nexport function formatErrorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nexport async function pathExists(filePath: string): Promise<boolean> {\r\n try {\r\n await fs.promises.access(filePath, fs.constants.F_OK)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport const debugLog = createDebugLogger(DEBUG_NAMESPACE, \"tailwind-styled/analyzer\")\r\n\r\nexport function sanitizeTopLimit(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_TOP_LIMIT\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n\r\nexport function sanitizeFrequentThreshold(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_FREQUENT_THRESHOLD\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n","import { TwError } from \"@tailwind-styled/shared\"\r\nimport type { ScanWorkspaceOptions } from \"@tailwind-styled/scanner\"\r\nimport { z } from \"zod\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst CountSchema = z.number().int().min(0)\r\n\r\nexport const ClassUsageSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n isUnused: z.boolean().optional(),\r\n isConflict: z.boolean().optional(),\r\n})\r\n\r\nexport const ClassConflictSchema = z.object({\r\n className: z.string(),\r\n variants: z.array(z.string()),\r\n classes: z.array(z.string()),\r\n message: z.string(),\r\n})\r\n\r\nconst ClassCountSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n})\r\n\r\nexport const NativeReportSchema = z.object({\r\n root: z.string(),\r\n totalFiles: CountSchema,\r\n uniqueClassCount: CountSchema,\r\n totalClassOccurrences: CountSchema,\r\n topClasses: z.array(ClassCountSchema),\r\n duplicateCandidates: z.array(ClassCountSchema),\r\n safelist: z.array(z.string()),\r\n})\r\n\r\nexport const NativeCssCompileResultSchema = z.object({\r\n css: z.string(),\r\n resolvedClasses: z.array(z.string()),\r\n unknownClasses: z.array(z.string()),\r\n sizeBytes: CountSchema,\r\n})\r\n\r\nconst AnalyzerClassStatsSchema = z.object({\r\n top: z\r\n .number({\r\n error: \"analyzeWorkspace options.classStats.top must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n frequentThreshold: z\r\n .number({\r\n error:\r\n \"analyzeWorkspace options.classStats.frequentThreshold must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n})\r\n\r\nconst AnalyzerSemanticOptionsSchema = z.object({\r\n tailwindConfigPath: z\r\n .string({\r\n error:\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\",\r\n })\r\n .min(\r\n 1,\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const AnalyzerOptionsSchema = z.object({\r\n scanner: z\r\n .custom<ScanWorkspaceOptions>(\r\n (value) => isPlainObject(value),\r\n \"analyzeWorkspace options.scanner must be an object when provided.\"\r\n )\r\n .optional(),\r\n classStats: AnalyzerClassStatsSchema.optional(),\r\n semantic: z\r\n .union([\r\n z.boolean({\r\n error: \"analyzeWorkspace options.semantic must be a boolean or an object when provided.\",\r\n }),\r\n AnalyzerSemanticOptionsSchema,\r\n ])\r\n .optional(),\r\n includeClass: z\r\n .custom<(className: string) => boolean>(\r\n (value) => typeof value === \"function\",\r\n \"analyzeWorkspace options.includeClass must be a function when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const ClassToCssOptionsSchema = z.object({\r\n prefix: z\r\n .union([z.string(), z.null()], {\r\n error: \"classToCss options.prefix must be a string or null when provided.\",\r\n })\r\n .optional(),\r\n strict: z\r\n .boolean({\r\n error: \"classToCss options.strict must be a boolean when provided.\",\r\n })\r\n .optional(),\r\n})\r\n\r\nexport const parseAnalyzerOptions = (options: unknown) =>\r\n parseWithSchema(AnalyzerOptionsSchema, options ?? {}, \"analyzeWorkspace options are invalid\")\r\n\r\nexport const parseNativeReport = (report: unknown) =>\r\n parseWithSchema(NativeReportSchema, report, \"Native analyzer report is invalid\")\r\n\r\nexport const parseNativeCssCompileResult = (result: unknown, className?: string) =>\r\n parseWithSchema(\r\n NativeCssCompileResultSchema,\r\n result,\r\n className\r\n ? `Native CSS compile result is invalid for class \"${className}\"`\r\n : \"Native CSS compile result is invalid\"\r\n )\r\n\r\nexport const parseClassToCssOptions = (options: unknown) =>\r\n parseWithSchema(ClassToCssOptionsSchema, options ?? {}, \"classToCss options are invalid\")\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { pathToFileURL } from \"node:url\"\r\n\r\nimport type {\r\n AnalyzerSemanticReport,\r\n ClassConflict,\r\n ClassUsage,\r\n LoadedTailwindConfig,\r\n TailwindConfigCacheEntry,\r\n} from \"./types\"\r\nimport { getNativeBinding } from \"./binding\"\r\nimport { debugLog, formatErrorMessage, isRecord, pathExists } from \"./utils\"\r\n\r\n\r\nconst SUPPORTED_TAILWIND_CONFIG_EXTENSIONS = new Set([\".ts\", \".js\", \".cjs\", \".mjs\"])\r\n\r\nconst tailwindConfigCache = new Map<string, TailwindConfigCacheEntry>()\r\n\r\nexport const splitVariantAndBase = (className: string): { variantKey: string; base: string } => {\r\n const parts = className.split(\":\")\r\n if (parts.length <= 1) return { variantKey: \"\", base: className }\r\n const base = parts.pop() ?? className\r\n return { variantKey: parts.join(\":\"), base }\r\n}\r\n\r\nconst isArbitraryUtility = (baseClass: string): boolean => {\r\n return baseClass.includes(\"[\") && baseClass.includes(\"]\")\r\n}\r\n\r\nexport const resolveConflictGroup = (base: string): string | null => {\r\n if (isArbitraryUtility(base)) return null\r\n if ([\"block\", \"inline\", \"inline-block\", \"inline-flex\", \"flex\", \"grid\", \"hidden\"].includes(base))\r\n return \"display\"\r\n if (base.startsWith(\"bg-\")) return \"bg\"\r\n if (base.startsWith(\"text-\")) return \"text\"\r\n if (base.startsWith(\"font-\")) return \"font\"\r\n if (base.startsWith(\"rounded\")) return \"rounded\"\r\n if (base.startsWith(\"shadow\")) return \"shadow\"\r\n if (base.startsWith(\"border-\")) return \"border\"\r\n if (base.startsWith(\"opacity-\")) return \"opacity\"\r\n if (base.startsWith(\"w-\") || base.startsWith(\"min-w-\") || base.startsWith(\"max-w-\"))\r\n return \"width\"\r\n if (base.startsWith(\"h-\") || base.startsWith(\"min-h-\") || base.startsWith(\"max-h-\"))\r\n return \"height\"\r\n if (base.startsWith(\"p-\") || base.startsWith(\"px-\") || base.startsWith(\"py-\")) return \"padding\"\r\n if (base.startsWith(\"m-\") || base.startsWith(\"mx-\") || base.startsWith(\"my-\")) return \"margin\"\r\n return null\r\n}\r\n\r\nconst detectConflicts = async (\r\n usages: ClassUsage[]\r\n): Promise<{\r\n conflicts: ClassConflict[]\r\n conflictedClassNames: Set<string>\r\n}> => {\r\n // Native-first: Rust HashSet conflict detection (required)\r\n const native = await getNativeBinding()\r\n if (!native?.detectClassConflicts) {\r\n throw new Error(\"FATAL: Native binding 'detectClassConflicts' is required but not available.\")\r\n }\r\n const result = native.detectClassConflicts(JSON.stringify(usages.map((u) => ({ name: u.name, count: u.count }))))\r\n return {\r\n conflicts: result.conflicts.map((c) => ({\r\n className: c.group,\r\n variants: c.variantKey.length > 0 ? c.variantKey.split(\":\") : [],\r\n classes: c.classes,\r\n message: c.message,\r\n })),\r\n conflictedClassNames: new Set(result.conflictedClassNames),\r\n }\r\n}\r\n\r\nconst isSupportedTailwindConfigPath = (configPath: string): boolean => {\r\n return SUPPORTED_TAILWIND_CONFIG_EXTENSIONS.has(path.extname(configPath).toLowerCase())\r\n}\r\n\r\nconst resolveTailwindConfigPath = async (\r\n root: string,\r\n explicitPath?: string\r\n): Promise<string | null> => {\r\n if (explicitPath) {\r\n const resolved = path.resolve(root, explicitPath)\r\n if (!(await pathExists(resolved))) return null\r\n return resolved\r\n }\r\n\r\n const candidates = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.cjs\",\r\n \"tailwind.config.mjs\",\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n const fullPath = path.resolve(root, candidate)\r\n if (await pathExists(fullPath)) return fullPath\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst collectSafelistFromConfig = (config: Record<string, unknown>): string[] => {\r\n const raw = config.safelist\r\n if (!Array.isArray(raw)) return []\r\n\r\n const out = new Set<string>()\r\n for (const entry of raw) {\r\n if (typeof entry === \"string\" && entry.length > 0) {\r\n out.add(entry)\r\n continue\r\n }\r\n if (!entry || typeof entry !== \"object\") continue\r\n const pattern = (entry as Record<string, unknown>).pattern\r\n if (typeof pattern === \"string\" && pattern.length > 0) {\r\n out.add(pattern)\r\n }\r\n }\r\n\r\n return Array.from(out)\r\n}\r\n\r\nconst collectCustomUtilities = (config: Record<string, unknown>): Set<string> => {\r\n const out = new Set<string>()\r\n const theme = config.theme\r\n if (!theme || typeof theme !== \"object\") return out\r\n\r\n const extend = (theme as Record<string, unknown>).extend\r\n if (!extend || typeof extend !== \"object\") return out\r\n\r\n for (const [section, value] of Object.entries(extend as Record<string, unknown>)) {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\r\n for (const key of Object.keys(value as Record<string, unknown>)) {\r\n out.add(`${section}-${key}`)\r\n if (section === \"colors\") {\r\n out.add(`bg-${key}`)\r\n out.add(`text-${key}`)\r\n out.add(`border-${key}`)\r\n } else if (section === \"spacing\") {\r\n out.add(`p-${key}`)\r\n out.add(`m-${key}`)\r\n out.add(`gap-${key}`)\r\n out.add(`w-${key}`)\r\n out.add(`h-${key}`)\r\n } else if (section === \"fontSize\") {\r\n out.add(`text-${key}`)\r\n } else if (section === \"borderRadius\") {\r\n out.add(`rounded-${key}`)\r\n } else if (section === \"boxShadow\") {\r\n out.add(`shadow-${key}`)\r\n }\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nconst collectSafelistFromSource = async (configPath: string): Promise<string[]> => {\r\n const source = await fs.promises.readFile(configPath, \"utf8\")\r\n\r\n // Gunakan native AST parser untuk ekstrak string literals dari config\r\n // Lebih akurat dari regex — handle template literals, multiline, nested quotes\r\n const { extractClassesNative } = await import(\"@tailwind-styled/scanner\")\r\n const allTokens = extractClassesNative(source)\r\n\r\n // Filter hanya token yang berasal dari safelist block\r\n // Native parse sudah return semua string value — kita cek apakah safelist array ada di source\r\n const hasSafelist = source.includes(\"safelist\")\r\n if (!hasSafelist) return []\r\n\r\n // Ambil baris-baris safelist dari source untuk batasi scope\r\n const safelistMatch = source.match(/safelist\\s*:\\s*\\[([\\s\\S]*?)\\]/m)?.[1]\r\n if (!safelistMatch) return []\r\n\r\n // Cross-reference: hanya return token yang muncul di dalam safelist block\r\n const safelistSet = new Set<string>()\r\n for (const token of safelistMatch.matchAll(/[\"'`]([^\"'`]+)[\"'`]/g)) {\r\n const value = token[1].trim()\r\n if (value.length > 0) safelistSet.add(value)\r\n }\r\n\r\n // Intersect dengan native extracted tokens untuk validasi\r\n return allTokens.filter((t: string) => safelistSet.has(t))\r\n}\r\n\r\nconst loadTailwindConfig = async (\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<LoadedTailwindConfig | null> => {\r\n const startMs = Date.now()\r\n const configPath = await resolveTailwindConfigPath(root, semanticOption?.tailwindConfigPath)\r\n if (!configPath) return null\r\n\r\n if (!isSupportedTailwindConfigPath(configPath)) {\r\n return {\r\n path: configPath,\r\n loaded: false,\r\n warning: `Unsupported Tailwind config extension at \"${configPath}\". Supported extensions: .ts, .js, .cjs, .mjs.`,\r\n safelist: new Set<string>(),\r\n customUtilities: new Set<string>(),\r\n }\r\n }\r\n\r\n const configStat = await fs.promises.stat(configPath).catch(() => null)\r\n if (configStat) {\r\n const cached = tailwindConfigCache.get(configPath)\r\n if (cached && cached.mtimeMs === configStat.mtimeMs && cached.size === configStat.size) {\r\n debugLog(\r\n `tailwind config cache hit: ${configPath} (${cached.config.safelist.size} safelist entries)`\r\n )\r\n return cached.config\r\n }\r\n }\r\n\r\n const result = await (async (): Promise<{\r\n config: Record<string, unknown> | null\r\n warning: string | undefined\r\n }> => {\r\n try {\r\n const cacheBustToken = Math.trunc(configStat?.mtimeMs ?? Date.now())\r\n const imported = await import(`${pathToFileURL(configPath).href}?tws_mtime=${cacheBustToken}`)\r\n const candidate = (imported.default ?? imported) as unknown\r\n if (isRecord(candidate)) {\r\n return { config: candidate, warning: undefined }\r\n } else if (typeof candidate === \"function\") {\r\n const evaluated = candidate()\r\n if (isRecord(evaluated)) {\r\n return { config: evaluated, warning: undefined }\r\n }\r\n return { config: null, warning: \"Tailwind config export function must return an object.\" }\r\n }\r\n return {\r\n config: null,\r\n warning: \"Tailwind config export must be an object or a function returning an object.\",\r\n }\r\n } catch (error) {\r\n return { config: null, warning: formatErrorMessage(error) }\r\n }\r\n })()\r\n\r\n const { config, warning } = result\r\n\r\n const safelist = new Set<string>()\r\n const customUtilities = new Set<string>()\r\n\r\n if (config) {\r\n for (const item of collectSafelistFromConfig(config)) safelist.add(item)\r\n for (const item of collectCustomUtilities(config)) customUtilities.add(item)\r\n }\r\n\r\n if (safelist.size === 0) {\r\n try {\r\n for (const item of await collectSafelistFromSource(configPath)) safelist.add(item)\r\n } catch (error) {\r\n debugLog(\r\n `failed to parse safelist from source at \"${configPath}\": ${formatErrorMessage(error)}`\r\n )\r\n // keep empty if source parsing fails\r\n }\r\n }\r\n\r\n const loaded = {\r\n path: configPath,\r\n loaded: config !== null,\r\n warning,\r\n safelist,\r\n customUtilities,\r\n }\r\n\r\n if (configStat) {\r\n tailwindConfigCache.set(configPath, {\r\n mtimeMs: configStat.mtimeMs,\r\n size: configStat.size,\r\n config: loaded,\r\n })\r\n }\r\n\r\n debugLog(\r\n `tailwind config loaded from \"${configPath}\" in ${Date.now() - startMs}ms ` +\r\n `(loaded=${loaded.loaded}, safelist=${loaded.safelist.size}, custom=${loaded.customUtilities.size})`\r\n )\r\n\r\n return loaded\r\n }\r\n\r\nexport const utilityPrefix = (baseClass: string): string => {\r\n const normalized = baseClass.startsWith(\"-\") ? baseClass.slice(1) : baseClass\r\n if (normalized.includes(\"[\") && normalized.includes(\"]\")) return \"arbitrary\"\r\n if (normalized.startsWith(\"min-w-\")) return \"min-w\"\r\n if (normalized.startsWith(\"max-w-\")) return \"max-w\"\r\n if (normalized.startsWith(\"min-h-\")) return \"min-h\"\r\n if (normalized.startsWith(\"max-h-\")) return \"max-h\"\r\n if (normalized.startsWith(\"space-x-\")) return \"space-x\"\r\n if (normalized.startsWith(\"space-y-\")) return \"space-y\"\r\n if (normalized.startsWith(\"inline-\")) return \"inline\"\r\n if (normalized.startsWith(\"border-\")) return \"border\"\r\n if (normalized.startsWith(\"text-\")) return \"text\"\r\n if (normalized.startsWith(\"bg-\")) return \"bg\"\r\n if (normalized.startsWith(\"rounded\")) return \"rounded\"\r\n if (normalized.startsWith(\"shadow\")) return \"shadow\"\r\n const hyphen = normalized.indexOf(\"-\")\r\n if (hyphen < 0) return normalized\r\n return normalized.slice(0, hyphen)\r\n}\r\n\r\nexport const buildSemanticReport = async (\r\n usages: ClassUsage[],\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<AnalyzerSemanticReport> => {\r\n const loadedConfig = await loadTailwindConfig(root, semanticOption)\r\n const safelist = loadedConfig?.safelist ?? new Set<string>()\r\n const customUtilities = loadedConfig?.customUtilities ?? new Set<string>()\r\n const usageNames = new Set(usages.map((usage) => usage.name))\r\n\r\n const unusedClasses: ClassUsage[] = Array.from(safelist)\r\n .filter((className) => !usageNames.has(className))\r\n .sort()\r\n .map((className) => ({ name: className, count: 0, isUnused: true }))\r\n\r\n // ── Unknown classes — native-first (required) ─────────────────────────────\r\n const native = await getNativeBinding()\r\n if (!native?.classifyKnownClasses) {\r\n throw new Error(\"FATAL: Native binding 'classifyKnownClasses' is required but not available.\")\r\n }\r\n const classNames = usages.map((u) => u.name)\r\n const results = native.classifyKnownClasses(\r\n classNames,\r\n Array.from(safelist),\r\n Array.from(customUtilities)\r\n )\r\n const unknownSet = new Set(\r\n results\r\n .filter((r: { className: string; isKnown: boolean }) => !r.isKnown)\r\n .map((r: { className: string; isKnown: boolean }) => r.className)\r\n )\r\n const unknownClasses = usages\r\n .filter((usage) => unknownSet.has(usage.name))\r\n .map((usage) => ({ ...usage, isUnused: true }))\r\n\r\n const { conflicts } = await detectConflicts(usages)\r\n\r\n return {\r\n unusedClasses,\r\n unknownClasses,\r\n conflicts,\r\n ...(loadedConfig\r\n ? {\r\n tailwindConfig: {\r\n path: loadedConfig.path,\r\n loaded: loadedConfig.loaded,\r\n safelistCount: loadedConfig.safelist.size,\r\n customUtilityCount: loadedConfig.customUtilities.size,\r\n ...(loadedConfig.warning ? { warning: loadedConfig.warning } : {}),\r\n },\r\n }\r\n : {}),\r\n }\r\n}","import { requireNativeCssCompiler } from \"./binding\"\r\nimport { parseClassToCssOptions, parseNativeCssCompileResult } from \"./schemas\"\r\nimport type { ClassToCssOptions, ClassToCssResult } from \"./types\"\r\nimport { formatErrorMessage } from \"./utils\"\r\n\r\nexport const normalizeClassInput = (input: string | string[], _binding?: { normalizeClassInput?: (s: string) => string[] }): string[] => {\r\n // Native-first: untuk single string, delegate ke Rust yang lebih cepat\r\n if (typeof input === \"string\") {\r\n if (_binding?.normalizeClassInput) {\r\n return _binding.normalizeClassInput(input)\r\n }\r\n return input\r\n .split(/\\s+/)\r\n .map((item) => item.trim())\r\n .filter((item) => item.length > 0)\r\n }\r\n\r\n if (!Array.isArray(input)) {\r\n throw new TypeError(\"classToCss input must be a string or an array of strings.\")\r\n }\r\n\r\n const out: string[] = []\r\n for (const item of input) {\r\n if (typeof item !== \"string\") {\r\n throw new TypeError(\"classToCss input array must contain only strings.\")\r\n }\r\n const value = item.trim()\r\n if (value.length > 0) out.push(value)\r\n }\r\n return out\r\n}\r\n\r\nconst normalizeClassToCssOptions = (\r\n options: ClassToCssOptions\r\n): {\r\n prefix: string | null\r\n strict: boolean\r\n} => {\r\n const parsed = parseClassToCssOptions(options)\r\n const strict = parsed.strict ?? false\r\n const prefix = parsed.prefix ?? null\r\n\r\n return { prefix, strict }\r\n}\r\n\r\nconst mergeDeclarationMap = (\r\n target: Map<string, string>,\r\n css: string,\r\n binding: { parseCssRules?: (css: string) => Array<{ property: string; value: string; isImportant: boolean }> }\r\n): void => {\r\n if (!binding.parseCssRules) {\r\n throw new Error(\"FATAL: Native binding 'parseCssRules' is required but not available.\")\r\n }\r\n const rules = binding.parseCssRules(css)\r\n for (const rule of rules) {\r\n if (target.has(rule.property)) target.delete(rule.property)\r\n target.set(rule.property, rule.isImportant ? `${rule.value} !important` : rule.value)\r\n }\r\n}\r\n\r\nconst declarationMapToString = (\r\n declarationMap: Map<string, string>,\r\n binding?: { declarationMapToString?: (entries: Array<{ property: string; value: string }>) => string }\r\n): string => {\r\n // Native-first: serialize entries via Rust (satu allocation vs JS multiple)\r\n const entries = Array.from(declarationMap.entries()).map(([property, value]) => ({ property, value }))\r\n if (binding?.declarationMapToString) {\r\n return binding.declarationMapToString(entries)\r\n }\r\n // JS fallback\r\n return entries.map(({ property, value }) => `${property}: ${value}`).join(\"; \")\r\n}\r\n\r\n/**\r\n * Convert Tailwind class input into atomic CSS output via native binding.\r\n * @example\r\n * const css = await classToCss(\"opacity-0 translate-y-2\", { strict: true })\r\n */\r\nexport const classToCss = async (\r\n input: string | string[],\r\n options: ClassToCssOptions = {}\r\n): Promise<ClassToCssResult> => {\r\n const binding = await requireNativeCssCompiler()\r\n const inputClasses = normalizeClassInput(input, binding)\r\n const normalizedOptions = normalizeClassToCssOptions(options)\r\n\r\n if (inputClasses.length === 0) {\r\n return {\r\n inputClasses: [],\r\n css: \"\",\r\n declarations: \"\",\r\n resolvedClasses: [],\r\n unknownClasses: [],\r\n sizeBytes: 0,\r\n }\r\n }\r\n\r\n const prefix = normalizedOptions.prefix\r\n\r\n const results = await Promise.all(\r\n inputClasses.map(async (className) => {\r\n const compiled = (() => {\r\n try {\r\n return binding.compileCss([className], prefix)\r\n } catch (error) {\r\n throw new Error(\r\n `Native analyzer failed while compiling class \"${className}\": ${formatErrorMessage(error)}`,\r\n { cause: error }\r\n )\r\n }\r\n })()\r\n\r\n if (!compiled) {\r\n throw new Error(`Native analyzer returned no result for class \"${className}\".`)\r\n }\r\n\r\n const validated = parseNativeCssCompileResult(compiled, className)\r\n\r\n return {\r\n className,\r\n css: validated.css,\r\n resolvedClasses: validated.resolvedClasses,\r\n unknownClasses: validated.unknownClasses,\r\n sizeBytes: validated.sizeBytes,\r\n }\r\n })\r\n )\r\n\r\n const cssChunks = results.map((r) => r.css)\r\n const resolvedClasses = results.flatMap((r) => r.resolvedClasses)\r\n const unknownClasses = results.flatMap((r) => r.unknownClasses)\r\n const sizeBytes = results.reduce((sum, r) => sum + r.sizeBytes, 0)\r\n\r\n const declarationMap = new Map<string, string>()\r\n for (const result of results) {\r\n mergeDeclarationMap(declarationMap, result.css, binding)\r\n }\r\n\r\n const uniqueUnknown = Array.from(new Set(unknownClasses))\r\n if (normalizedOptions.strict && uniqueUnknown.length > 0) {\r\n throw new Error(`Unknown Tailwind classes: ${uniqueUnknown.join(\", \")}`)\r\n }\r\n\r\n return {\r\n inputClasses,\r\n css: cssChunks.filter((chunk) => chunk.length > 0).join(\"\\n\"),\r\n declarations: declarationMapToString(declarationMap, binding),\r\n resolvedClasses: Array.from(new Set(resolvedClasses)),\r\n unknownClasses: uniqueUnknown,\r\n sizeBytes,\r\n }\r\n}","/**\r\n * @tailwind-styled/analyzer v5\r\n *\r\n * Native-first async analyzer with semantic reporting.\r\n */\r\n\r\nimport { analyzeWorkspace, buildDistribution, collectClassCounts } from \"./analyzeWorkspace\"\r\nimport { classToCss, normalizeClassInput } from \"./classToCss\"\r\nimport {\r\n parseAnalyzerOptions,\r\n parseClassToCssOptions,\r\n parseNativeCssCompileResult,\r\n parseNativeReport,\r\n} from \"./schemas\"\r\nimport { resolveConflictGroup, splitVariantAndBase, utilityPrefix } from \"./semantic\"\r\n\r\nexport type {\r\n AnalyzerOptions,\r\n AnalyzerReport,\r\n AnalyzerSemanticReport,\r\n ClassConflict,\r\n ClassToCssOptions,\r\n ClassToCssResult,\r\n ClassUsage,\r\n} from \"./types\"\r\n\r\nexport { analyzeWorkspace, classToCss }\r\n\r\n export const __internal = {\r\n normalizeClassInput,\r\n splitVariantAndBase,\r\n resolveConflictGroup,\r\n collectClassCounts,\r\n buildDistribution,\r\n utilityPrefix,\r\n parseAnalyzerOptions,\r\n parseClassToCssOptions,\r\n parseNativeReport,\r\n parseNativeCssCompileResult,\r\n }\r\n"]}
1
+ {"version":3,"sources":["../packages/domain/shared/src/index.ts","../packages/domain/scanner/src/native-bridge.ts","../packages/domain/scanner/src/cache-native.ts","../packages/domain/scanner/src/parallel-scanner.ts","../packages/domain/scanner/src/schemas.ts","../packages/domain/scanner/src/index.ts","../packages/domain/analyzer/src/analyzeWorkspace.ts","../packages/domain/analyzer/src/binding.ts","../packages/domain/analyzer/src/utils.ts","../packages/domain/analyzer/src/schemas.ts","../packages/domain/analyzer/src/semantic.ts","../packages/domain/analyzer/src/classToCss.ts","../packages/domain/analyzer/src/index.ts"],"names":["path","fs","fileURLToPath","createRequire","scannerGetBinding","Worker","availableParallelism","init_src","isMainThread","parentPort","workerData","formatIssuePath","z","isScannableFile","scanFileNative","scanWorkspaceNative","log","formatIssues","parseWithSchema","extractClassesNative","pathToFileURL"],"mappings":"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","file":"analyzer.js","sourcesContent":["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 // 1 level: dist/ → package-root/native/ (published npm package)\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.${napiPlatform}.node`))\r\n // cwd fallback (user project root)\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 // 4 level: dist/ → package/ → domain/ → packages/ → repo-root/ (monorepo dev)\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 }\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\r\nexport {\r\n TW_STATE_STATIC_FILENAME,\r\n extractStaticStateCss,\r\n appendStaticStateCssToSafelist,\r\n type TwStateConfigEntry,\r\n type StaticStateCssInput,\r\n type GeneratedStateRule,\r\n type StaticStateExtractionResult,\r\n} from \"./staticStateExtractor\"\r\nexport { setGlobalLogFile } from \"./logger\"","/**\r\n * Scanner — Rust native bridge\r\n *\r\n * Wraps the Rust scan_workspace and extract_classes_from_source functions.\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n */\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport {\r\n createDebugLogger,\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n TwError,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nconst log = createDebugLogger(\"scanner:native\")\r\n\r\n// ESM-compatible __dirname equivalent\r\nfunction getDirname(): string {\r\n if (typeof __dirname !== \"undefined\") {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\ninterface NativeScannerBinding {\r\n scanWorkspace?: (\r\n root: string,\r\n extensions: string[] | null\r\n ) => {\r\n files: Array<{ file: string; classes: string[]; hash: string }>\r\n totalFiles: number\r\n uniqueClasses: string[] | null\r\n } | null\r\n extractClassesFromSource?: (source: string) => string[] | null\r\n hashFileContent?: (content: string) => string | null\r\n cacheRead?: (cachePath: string) => {\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n version: number\r\n } | null\r\n cacheWrite?: (\r\n cachePath: string,\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n ) => boolean\r\n cachePriority?: (\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs: number\r\n ) => number\r\n batchExtractClasses?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n }>\r\n scanCacheGet?: (filePath: string, contentHash: string) => string[] | null\r\n scanCachePut?: (filePath: string, contentHash: string, classes: string[], mtimeMs: number, size: number) => void\r\n scanCacheInvalidate?: (filePath: string) => void\r\n scanCacheStats?: () => { size: number }\r\n scanFile?: (filePath: string) => {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n }\r\n collectFiles?: (root: string, extensions: string[] | null, ignoreDirs: string[] | null) => string[]\r\n scanFilesBatch?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n }>\r\n generateSubComponentTypes?: (\r\n root: string,\r\n outputPath: string | null\r\n ) => {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n /** Batch-check file existence + stale age. Menggantikan pruneStaleEntries() */\r\n pruneStaleEntries?: (\r\n entries: Array<{ file: string; lastSeenMs: number }>,\r\n maxAgeMs: number | null,\r\n checkExists: boolean | null\r\n ) => { keptIndices: number[]; removed: number }\r\n /** Hitung class frequency stats dari disk cache. Menggantikan computeCacheStats() */\r\n computeCacheStats?: (\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top: number | null\r\n ) => {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n }\r\n /** Rebuild workspace result — Rust HashSet dedup + sort. Menggantikan JS fallback di mergeResults() */\r\n rebuildWorkspaceResult?: (\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n ) => { files: Array<{ file: string; classes: string[] }>; totalFiles: number; uniqueClasses: string[] }\r\n\r\n // ── Watch API (QA #12) ──────────────────────────────────────────────────\r\n /** Mulai native file watcher via `notify` crate. Returns handleId. */\r\n startWatch?: (rootDir: string) => { status: string; handleId: number }\r\n /** Poll events yang terkumpul sejak poll terakhir. Queue dikosongkan setelah dipoll. */\r\n pollWatchEvents?: (handleId: number) => Array<{ kind: string; path: string }>\r\n /** Hentikan watcher dengan handleId. */\r\n stopWatch?: (handleId: number) => boolean\r\n}\r\n\r\nconst isValidScannerBinding = (module: unknown): module is NativeScannerBinding => {\r\n const candidate = module as Partial<NativeScannerBinding> | null | undefined\r\n return !!(\r\n candidate &&\r\n (candidate.scanWorkspace ||\r\n candidate.extractClassesFromSource ||\r\n candidate.hashFileContent ||\r\n candidate.cacheRead ||\r\n candidate.cacheWrite)\r\n )\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createScannerBridgeLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeScannerBinding | null | undefined,\r\n loadError: null as string | null,\r\n candidatePaths: [] as string[],\r\n }\r\n\r\n const throwNativeBindingError = (): never => {\r\n const lines = [\r\n \"FATAL: Native scanner binding not found.\",\r\n \"\",\r\n \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\r\n \"The binding was not found in any of these paths:\",\r\n ..._state.candidatePaths.map((p) => ` - ${p}`),\r\n \"\",\r\n ]\r\n\r\n if (_state.loadError) {\r\n lines.push(\"Load error:\", ` ${_state.loadError}`, \"\")\r\n }\r\n\r\n lines.push(\r\n \"To fix this, run:\",\r\n \" npm run build:rust\",\r\n \"\",\r\n \"This will build the native Rust module from the 'native/' directory.\",\r\n \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\r\n \"and 'npm run build:rust' is executed before running tests or building.\"\r\n )\r\n\r\n throw new TwError(\"rust\", \"SCANNER_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\r\n }\r\n\r\n const scannerGetBinding = (): NativeScannerBinding => {\r\n const cachedBinding = _state.binding\r\n if (cachedBinding !== undefined) {\r\n if (cachedBinding !== null) {\r\n return cachedBinding\r\n }\r\n return throwNativeBindingError()\r\n }\r\n\r\n const runtimeDir = getDirname()\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n includeDefaultCandidates: true,\r\n })\r\n\r\n _state.candidatePaths = candidates\r\n\r\n const { binding, loadErrors } = loadNativeBinding<NativeScannerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isValidScannerBinding,\r\n invalidExportMessage: \"Module loaded but missing expected scanner binding functions\",\r\n })\r\n\r\n if (binding) {\r\n log(`scanner native binding loaded successfully`)\r\n _state.binding = binding\r\n return _state.binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\r\n }\r\n\r\n _state.binding = null\r\n return throwNativeBindingError()\r\n }\r\n\r\n return {\r\n get: scannerGetBinding,\r\n scannerGetBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.loadError = null\r\n _state.candidatePaths = []\r\n },\r\n }\r\n}\r\n\r\nconst scannerBridgeLoader = createScannerBridgeLoader()\r\nconst scannerGetBinding = scannerBridgeLoader.get\r\n\r\nexport const resetScannerBridgeCache = scannerBridgeLoader.reset\r\n\r\nexport function scanWorkspaceNative(\r\n root: string,\r\n extensions?: string[]\r\n): ReturnType<NonNullable<NativeScannerBinding[\"scanWorkspace\"]>> {\r\n return scannerGetBinding().scanWorkspace!(root, extensions ?? null)\r\n}\r\n\r\nexport function extractClassesNative(source: string): string[] {\r\n const result = scannerGetBinding().extractClassesFromSource?.(source)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_EXTRACT_FAILED\",\r\n \"Native extractClassesFromSource returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function hashContentNative(content: string): string {\r\n const result = scannerGetBinding().hashFileContent?.(content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_HASH_FAILED\",\r\n \"Native hashFileContent returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function isRustCacheAvailable(): boolean {\r\n return true\r\n}\r\n\r\nexport function hasNativeScannerBinding(): boolean {\r\n try {\r\n scannerBridgeLoader.get()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function cacheReadNative(\r\n cachePath: string\r\n): ReturnType<NonNullable<NativeScannerBinding[\"cacheRead\"]>> {\r\n const result = scannerGetBinding().cacheRead?.(cachePath)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_READ_FAILED\",\r\n \"Native cacheRead returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cacheWriteNative(\r\n cachePath: string,\r\n entries: Parameters<NonNullable<NativeScannerBinding[\"cacheWrite\"]>>[1]\r\n): boolean {\r\n const result = scannerGetBinding().cacheWrite?.(cachePath, entries)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_WRITE_FAILED\",\r\n \"Native cacheWrite returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cachePriorityNative(\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs = Date.now()\r\n): number {\r\n const result = scannerGetBinding().cachePriority?.(\r\n mtimeMs,\r\n size,\r\n cachedMtimeMs,\r\n cachedSize,\r\n cachedHitCount,\r\n cachedLastSeenMs,\r\n nowMs\r\n )\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_PRIORITY_FAILED\",\r\n \"Native cachePriority returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function batchExtractClassesNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.batchExtractClasses) {\r\n throw new Error(\"FATAL: Native binding 'batchExtractClasses' is required but not available.\")\r\n }\r\n return binding.batchExtractClasses(filePaths) ?? []\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// In-memory scan cache (Rust DashMap — zero disk I/O)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function scanCacheGet(filePath: string, contentHash: string): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheGet) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheGet' is required but not available.\")\r\n }\r\n return binding.scanCacheGet(filePath, contentHash) ?? null\r\n}\r\n\r\nexport function scanCachePut(\r\n filePath: string,\r\n contentHash: string,\r\n classes: string[],\r\n mtimeMs: number,\r\n size: number\r\n): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCachePut) {\r\n throw new Error(\"FATAL: Native binding 'scanCachePut' is required but not available.\")\r\n }\r\n binding.scanCachePut(filePath, contentHash, classes, mtimeMs, size)\r\n}\r\n\r\nexport function scanCacheInvalidate(filePath: string): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheInvalidate) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheInvalidate' is required but not available.\")\r\n }\r\n binding.scanCacheInvalidate(filePath)\r\n}\r\n\r\nexport function scanCacheStats(): { size: number } {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheStats) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheStats' is required but not available.\")\r\n }\r\n return binding.scanCacheStats() as { size: number }\r\n}\r\nexport function scanFileNative(filePath: string): {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n} {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFile) {\r\n throw new Error(\"FATAL: Native binding 'scanFile' is required but not available.\")\r\n }\r\n return binding.scanFile(filePath)\r\n}\r\n/**\r\n * Native file walker — kumpulkan file paths rekursif tanpa baca konten.\r\n *\r\n * Menggantikan `collectFiles()` di `parallel-scanner.ts`.\r\n * Returns null jika binding tidak tersedia (fallback ke JS).\r\n */\r\nexport function collectFilesNative(\r\n root: string,\r\n extensions: string[] | null,\r\n ignoreDirs: string[] | null\r\n): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.collectFiles) return null\r\n return binding.collectFiles(root, extensions, ignoreDirs)\r\n}\r\n/**\r\n * Batch scan + hash banyak file sekaligus dalam satu NAPI call.\r\n *\r\n * Menggantikan loop `scanFileNative()` per file di worker thread.\r\n * Rust: `par_iter()` via rayon — semua file diproses paralel di thread pool Rust,\r\n * tanpa overhead spawn JS worker untuk setiap chunk.\r\n *\r\n * Kapan pakai ini vs `batchExtractClassesNative`:\r\n * - `scanFilesBatch` → butuh {file, classes, hash} — scan + hash sekaligus\r\n * - `batchExtractClasses` → hanya butuh {file, classes, content_hash, ok, error}\r\n *\r\n * Returns: array dengan panjang sama dengan input. File yang gagal dibaca\r\n * dikembalikan dengan classes:[] dan hash:\"\".\r\n */\r\nexport function scanFilesBatchNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFilesBatch) {\r\n // Fallback: panggil scanFile satu per satu\r\n return filePaths.map((fp) => {\r\n try {\r\n const r = binding.scanFile?.(fp)\r\n return r\r\n ? { file: r.file, classes: r.classes, hash: r.hash ?? \"\" }\r\n : { file: fp, classes: [], hash: \"\" }\r\n } catch {\r\n return { file: fp, classes: [], hash: \"\" }\r\n }\r\n })\r\n }\r\n return binding.scanFilesBatch(filePaths)\r\n}\r\n \r\n/**\r\n * Scan workspace rekursif dan generate TypeScript type declarations\r\n * untuk setiap sub-component yang ditemukan.\r\n *\r\n * Menggantikan operasi scan manual + string codegen di JS.\r\n * Rust: walkdir + regex class extraction + type codegen dalam satu pass.\r\n *\r\n * @param root Direktori root workspace\r\n * @param outputPath Path output file .d.ts (opsional — kalau null, hanya return result)\r\n */\r\nexport function generateSubComponentTypesNative(\r\n root: string,\r\n outputPath?: string\r\n): {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.generateSubComponentTypes) return null\r\n return binding.generateSubComponentTypes(root, outputPath ?? null) as {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n}\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// pruneStaleEntries + computeCacheStats — native wrappers\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Batch-check file existence + stale age menggunakan Rust syscalls.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan loop `existsSync()` di `pruneStaleEntries()` (cache-native.ts).\r\n */\r\nexport function pruneStaleEntriesNative(\r\n entries: Array<{ file: string; lastSeenMs?: number }>,\r\n maxAgeMs?: number,\r\n checkExists?: boolean\r\n): { keptIndices: number[]; removed: number } | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.pruneStaleEntries) return null\r\n return binding.pruneStaleEntries(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs ?? 0 })),\r\n maxAgeMs ?? null,\r\n checkExists ?? null\r\n )\r\n}\r\n\r\n/**\r\n * Hitung class frequency + stats dari disk cache entries menggunakan Rust.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan `computeCacheStats()` di `cache-native.ts`.\r\n */\r\nexport function rebuildWorkspaceResultNative(\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n): { files: typeof files; totalFiles: number; uniqueClasses: string[] } | null {\r\n const binding = scannerBridgeLoader.get()\r\n if (!binding?.rebuildWorkspaceResult) return null\r\n try {\r\n return binding.rebuildWorkspaceResult(files)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function computeCacheStatsNative(\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top?: number\r\n): {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.computeCacheStats) return null\r\n return binding.computeCacheStats(filesClasses, sizes, top ?? null)\r\n}\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Watch API — native wrappers (QA #12)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Mulai native file watcher menggunakan `notify` crate (Rust).\r\n * Returns `null` jika binding tidak tersedia — fallback ke fs.watch JS.\r\n */\r\nexport function startWatchNative(rootDir: string): { status: string; handleId: number } | null {\r\n try {\r\n const binding = scannerGetBinding()\r\n if (!binding.startWatch) return null\r\n return binding.startWatch(rootDir)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Poll events dari native watcher queue. Queue dikosongkan setelah dipoll.\r\n * Returns array kosong jika tidak ada events atau binding tidak tersedia.\r\n */\r\nexport function pollWatchEventsNative(handleId: number): Array<{ kind: string; path: string }> {\r\n try {\r\n const binding = scannerGetBinding()\r\n if (!binding.pollWatchEvents) return []\r\n return binding.pollWatchEvents(handleId)\r\n } catch {\r\n return []\r\n }\r\n}\r\n\r\n/**\r\n * Hentikan native watcher dengan handleId.\r\n */\r\nexport function stopWatchNative(handleId: number): boolean {\r\n try {\r\n const binding = scannerGetBinding()\r\n if (!binding.stopWatch) return false\r\n return binding.stopWatch(handleId)\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Cek apakah native watch API tersedia.\r\n */\r\nexport function hasNativeWatchBinding(): boolean {\r\n try {\r\n const binding = scannerGetBinding()\r\n return !!(binding.startWatch && binding.pollWatchEvents && binding.stopWatch)\r\n } catch {\r\n return false\r\n }\r\n}","/**\r\n * tailwind-styled-v4 — Scanner Cache (Rust-backed)\r\n *\r\n * This module REQUIRES native Rust bindings and will FAIL LOUDLY if they are not available.\r\n * NO JavaScript fallback is provided.\r\n */\r\n\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport {\r\n cachePriorityNative,\r\n cacheReadNative,\r\n cacheWriteNative,\r\n scanCacheGet,\r\n scanCachePut,\r\n scanCacheInvalidate,\r\n scanCacheStats,\r\n pruneStaleEntriesNative,\r\n computeCacheStatsNative,\r\n} from \"./native-bridge\"\r\n\r\nfunction defaultCachePath(rootDir: string, cacheDir?: string): string {\r\n const dir = cacheDir\r\n ? path.resolve(rootDir, cacheDir)\r\n : path.join(process.cwd(), \".cache\", \"tailwind-styled\")\r\n return path.join(dir, \"scanner-cache.json\")\r\n}\r\n\r\n// ── Public API ────────────────────────────────────────────────────────────────\r\n\r\nexport interface NativeCacheEntry {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n /** Terakhir file ditemukan di filesystem (ms epoch). Digunakan untuk stale cleanup. */\r\n lastSeenMs?: number\r\n}\r\n\r\n/** Default stale threshold — 7 hari */\r\nconst STALE_THRESHOLD_MS = 7 * 24 * 60 * 60 * 1000\r\n\r\n/**\r\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\r\n *\r\n * Native-first: Rust batch-check semua file dalam satu pass tanpa\r\n * event loop overhead. JS fallback: existsSync loop per file.\r\n */\r\nexport function pruneStaleEntries(\r\n entries: NativeCacheEntry[],\r\n opts: { maxAgeMs?: number; rootDir?: string } = {}\r\n): { pruned: NativeCacheEntry[]; removed: number } {\r\n const nativeResult = pruneStaleEntriesNative(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs })),\r\n opts.maxAgeMs,\r\n !!opts.rootDir\r\n )\r\n\r\n if (nativeResult !== null) {\r\n const pruned = nativeResult.keptIndices.map((i) => entries[i])\r\n return { pruned, removed: nativeResult.removed }\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'pruneStaleEntries' is required but not available.\")\r\n}\r\n\r\n/**\r\n * Read scanner cache from disk using Rust parser.\r\n * REQUIRES native binding - throws if unavailable.\r\n *\r\n * FIX: Pastikan folder cache ada sebelum Rust coba baca file,\r\n * supaya tidak error \"os error 3 (path not found)\" pada first run.\r\n */\r\nexport function readCache(rootDir: string, cacheDir?: string): NativeCacheEntry[] {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n // Buat folder cache jika belum ada — cegah \"os error 3\" pada first run\r\n fs.mkdirSync(path.dirname(cachePath), { recursive: true })\r\n\r\n const result = cacheReadNative(cachePath)\r\n if (!result) return []\r\n\r\n return result.entries.map((e) => ({\r\n file: e.file,\r\n classes: e.classes,\r\n hash: e.hash,\r\n mtimeMs: e.mtimeMs,\r\n size: e.size,\r\n hitCount: e.hitCount,\r\n lastSeenMs: e.lastSeenMs,\r\n }))\r\n}\r\n\r\n/**\r\n * Write scanner cache to disk using Rust serialiser.\r\n * REQUIRES native binding - throws if unavailable.\r\n *\r\n * FIX: Pastikan folder cache ada sebelum Rust coba tulis file.\r\n */\r\nexport function writeCache(rootDir: string, entries: NativeCacheEntry[], cacheDir?: string): void {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n // Buat folder cache jika belum ada — cegah write gagal pada first run\r\n fs.mkdirSync(path.dirname(cachePath), { recursive: true })\r\n\r\n const success = cacheWriteNative(cachePath, entries)\r\n if (!success) {\r\n throw new Error(\r\n \"Native cacheWrite failed. Run 'npm run build:rust' to rebuild native bindings.\"\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Compute priority score for a file using the Rust SmartCache algorithm.\r\n * Higher = process first.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function filePriority(\r\n mtimeMs: number,\r\n size: number,\r\n cached: { mtimeMs: number; size: number; hitCount: number; lastSeenMs?: number } | undefined,\r\n nowMs = Date.now()\r\n): number {\r\n return cachePriorityNative(\r\n mtimeMs,\r\n size,\r\n cached?.mtimeMs ?? 0,\r\n cached?.size ?? 0,\r\n cached?.hitCount ?? 0,\r\n cached?.lastSeenMs ?? 0,\r\n nowMs\r\n )\r\n}\r\n\r\nexport interface CacheStats {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntry: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n}\r\n\r\n/**\r\n * Rust in-memory cache — hot path untuk per-file lookup saat scan.\r\n * Jauh lebih cepat dari disk JSON cache untuk file yang baru saja di-scan.\r\n */\r\nexport const hotCache = {\r\n get: scanCacheGet,\r\n put: scanCachePut,\r\n invalidate: scanCacheInvalidate,\r\n} as const\r\n\r\n/**\r\n * Stats dari Rust in-memory cache (DashMap).\r\n * `size` = jumlah entry saat ini di cache.\r\n */\r\nexport function getHotCacheStats(): { size: number } {\r\n return scanCacheStats()\r\n}\r\n\r\n/**\r\n * Compute disk cache stats dari entries (diperlukan untuk mostUsedClasses).\r\n *\r\n * Native-first: Rust HashMap count + partial sort — ~3× lebih cepat\r\n * dari JS Map untuk workspace besar (5000+ entries).\r\n * JS fallback: manual Map count + .sort().\r\n */\r\nexport function computeCacheStats(entries: NativeCacheEntry[]): CacheStats {\r\n if (entries.length === 0) {\r\n return { totalEntries: 0, totalClasses: 0, totalSizeBytes: 0, avgClassesPerEntry: 0, mostUsedClasses: [] }\r\n }\r\n\r\n // Native-first\r\n const nativeResult = computeCacheStatsNative(\r\n entries.map((e) => e.classes),\r\n entries.map((e) => e.size),\r\n 10\r\n )\r\n\r\n if (nativeResult !== null) {\r\n return {\r\n totalEntries: nativeResult.totalEntries,\r\n totalClasses: nativeResult.totalClasses,\r\n totalSizeBytes: nativeResult.totalSizeBytes,\r\n avgClassesPerEntry: nativeResult.avgClassesPerEntryX100 / 100,\r\n mostUsedClasses: nativeResult.mostUsedClasses,\r\n }\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'computeCacheStats' is required but not available.\")\r\n}","/**\r\n * Native parallel scanner menggunakan worker threads + Rust batchExtractClasses.\r\n *\r\n * Untuk workspaces besar (200+ files), file-list dibagi ke beberapa worker.\r\n * Setiap worker memanggil native `batchExtractClasses` yang sudah memakai\r\n * rayon par_iter di sisi Rust — sehingga parallelism terjadi di dua level:\r\n * 1. Multiple worker threads (TS/Node level)\r\n * 2. rayon par_iter di dalam setiap worker (Rust level)\r\n *\r\n * Untuk workspace kecil (< PARALLEL_THRESHOLD), langsung panggil batchExtractClasses\r\n * di main thread — overhead spawn worker tidak worth it.\r\n */\r\n\r\nimport { Worker, isMainThread, parentPort, workerData } from \"node:worker_threads\"\r\nimport path from \"node:path\"\r\nimport { availableParallelism } from \"node:os\"\r\nimport { fileURLToPath } from \"node:url\"\r\n\r\nimport { isScannableFile, DEFAULT_EXTENSIONS, DEFAULT_IGNORES } from \"./index\"\r\nimport { batchExtractClassesNative, collectFilesNative, rebuildWorkspaceResultNative } from \"./native-bridge\"\r\nimport type { ScanWorkspaceResult, ScanFileResult } from \"./types\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Constants\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst PARALLEL_THRESHOLD = 50\r\nconst DEFAULT_CHUNK_SIZE = 150\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface ParallelScanOptions {\r\n extensions?: string[]\r\n ignoreDirs?: string[]\r\n maxWorkers?: number\r\n chunkSize?: number\r\n}\r\n\r\ninterface NativeBatchResult {\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}\r\n\r\ninterface WorkerInput {\r\n filePaths: string[]\r\n}\r\n\r\ntype WorkerOutput =\r\n | { ok: true; results: NativeBatchResult[] }\r\n | { ok: false; error: string }\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection — native-first, JS fallback\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Kumpulkan semua file yang cocok secara rekursif dari rootDir.\r\n *\r\n * Native: satu Rust walk tanpa JS event loop overhead — 2–5× lebih cepat\r\n * untuk workspace besar. Tidak membaca konten file, hanya paths.\r\n *\r\n * JS fallback: dipakai jika native binding tidak tersedia (mis. test env).\r\n */\r\nfunction collectFiles(rootDir: string, extensions: string[], ignoreDirs: string[]): string[] {\r\n const native = collectFilesNative(rootDir, extensions, ignoreDirs)\r\n if (native !== null) return native\r\n throw new Error(\"FATAL: Native binding 'collectFiles' is required but not available.\")\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Merge results\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction mergeResults(batchResults: NativeBatchResult[]): ScanWorkspaceResult {\r\n const files: ScanFileResult[] = batchResults.map((r) => ({\r\n file: r.file,\r\n classes: r.classes,\r\n hash: r.content_hash,\r\n }))\r\n const native = rebuildWorkspaceResultNative(files)\r\n if (native) return native\r\n throw new Error(\"FATAL: Native binding 'rebuildWorkspaceResult' is required but not available.\")\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Worker thread entry point\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nif (!isMainThread && parentPort) {\r\n const { filePaths } = workerData as WorkerInput\r\n try {\r\n const results = batchExtractClassesNative(filePaths)\r\n const msg: WorkerOutput = { ok: true, results }\r\n parentPort.postMessage(msg)\r\n } catch (error) {\r\n const msg: WorkerOutput = {\r\n ok: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }\r\n parentPort.postMessage(msg)\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// __filename compat CJS + ESM\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\ndeclare const __filename: string | undefined\r\nconst _workerFilename =\r\n typeof __filename !== \"undefined\" ? __filename : fileURLToPath(import.meta.url)\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Spawn worker for one chunk\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction runChunkInWorker(filePaths: string[]): Promise<NativeBatchResult[]> {\r\n return new Promise((resolve, reject) => {\r\n const worker = new Worker(_workerFilename, {\r\n workerData: { filePaths } satisfies WorkerInput,\r\n })\r\n worker.once(\"message\", (payload: WorkerOutput) => {\r\n if (payload.ok) {\r\n resolve(payload.results)\r\n } else {\r\n reject(new Error(payload.error ?? \"parallel-scanner worker failed\"))\r\n }\r\n })\r\n worker.once(\"error\", reject)\r\n worker.once(\"exit\", (code) => {\r\n if (code !== 0) reject(new Error(`parallel-scanner worker exited with code ${code}`))\r\n })\r\n })\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Public API\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport async function scanWorkspaceParallel(\r\n rootDir: string,\r\n options: ParallelScanOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const {\r\n extensions = DEFAULT_EXTENSIONS,\r\n ignoreDirs = DEFAULT_IGNORES,\r\n maxWorkers = Math.max(1, availableParallelism() - 1),\r\n chunkSize = DEFAULT_CHUNK_SIZE,\r\n } = options\r\n\r\n const files = collectFiles(path.resolve(rootDir), extensions, ignoreDirs)\r\n\r\n if (files.length < PARALLEL_THRESHOLD) {\r\n return mergeResults(batchExtractClassesNative(files))\r\n }\r\n\r\n const chunks: string[][] = []\r\n for (let i = 0; i < files.length; i += chunkSize) {\r\n chunks.push(files.slice(i, i + chunkSize))\r\n }\r\n\r\n const allResults: NativeBatchResult[] = []\r\n for (let i = 0; i < chunks.length; i += maxWorkers) {\r\n const batch = chunks.slice(i, i + maxWorkers)\r\n const batchResults = await Promise.all(batch.map(runChunkInWorker))\r\n allResults.push(...batchResults.flat())\r\n }\r\n\r\n return mergeResults(allResults)\r\n}","import { z } from \"zod\"\r\nimport { TwError } from \"@tailwind-styled/shared\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst NonNegativeIntegerSchema = z.number().int().min(0)\r\n\r\nexport const ScanWorkspaceOptionsSchema = z.object({\r\n includeExtensions: z.array(z.string()).optional(),\r\n ignoreDirectories: z.array(z.string()).optional(),\r\n useCache: z.boolean().optional(),\r\n cacheDir: z.string().min(1).optional(),\r\n smartInvalidation: z.boolean().optional(),\r\n})\r\n\r\nexport type ScanWorkspaceOptions = z.infer<typeof ScanWorkspaceOptionsSchema>\r\n\r\nexport const ScanFileResultSchema = z.object({\r\n file: z.string(),\r\n classes: z.array(z.string()),\r\n hash: z.string().optional(),\r\n})\r\n\r\nexport type ScanFileResult = z.infer<typeof ScanFileResultSchema>\r\n\r\nexport const ScanWorkspaceResultSchema = z\r\n .object({\r\n files: z.array(ScanFileResultSchema),\r\n totalFiles: NonNegativeIntegerSchema,\r\n uniqueClasses: z.array(z.string()),\r\n })\r\n .refine((value) => value.totalFiles === value.files.length, {\r\n message: \"scan result totalFiles must match files.length\",\r\n path: [\"totalFiles\"],\r\n })\r\n\r\nexport type ScanWorkspaceResult = z.infer<typeof ScanWorkspaceResultSchema>\r\n\r\nexport const ScannerWorkerRequestSchema = z.object({\r\n rootDir: z.string().min(1),\r\n options: ScanWorkspaceOptionsSchema.optional(),\r\n})\r\n\r\nexport type ScannerWorkerRequest = z.infer<typeof ScannerWorkerRequestSchema>\r\n\r\nexport const ScannerWorkerSuccessMessageSchema = z.object({\r\n ok: z.literal(true),\r\n result: ScanWorkspaceResultSchema,\r\n})\r\n\r\nexport const ScannerWorkerErrorMessageSchema = z.object({\r\n ok: z.literal(false),\r\n error: z.string().optional(),\r\n})\r\n\r\nexport const ScannerWorkerMessageSchema = z.union([\r\n ScannerWorkerSuccessMessageSchema,\r\n ScannerWorkerErrorMessageSchema,\r\n])\r\n\r\nexport type ScannerWorkerMessage = z.infer<typeof ScannerWorkerMessageSchema>\r\n\r\nexport const parseScanWorkspaceOptions = (options: unknown) =>\r\n parseWithSchema(ScanWorkspaceOptionsSchema, options ?? {}, \"scanner options are invalid\")\r\n\r\nexport const parseScanFileResult = (result: unknown) =>\r\n parseWithSchema(ScanFileResultSchema, result, \"scanner file result is invalid\")\r\n\r\nexport const parseScanWorkspaceResult = (result: unknown) =>\r\n parseWithSchema(ScanWorkspaceResultSchema, result, \"scanner workspace result is invalid\")\r\n\r\nexport const parseScannerWorkerRequest = (request: unknown) =>\r\n parseWithSchema(ScannerWorkerRequestSchema, request, \"scanner worker request is invalid\")\r\n\r\nexport const parseScannerWorkerMessage = (message: unknown) =>\r\n parseWithSchema(ScannerWorkerMessageSchema, message, \"scanner worker message is invalid\")\r\n","import fs from \"node:fs\"\r\nimport { createRequire } from \"node:module\"\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport { Worker } from \"node:worker_threads\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\nimport { filePriority, type NativeCacheEntry, readCache, writeCache } from \"./cache-native\"\r\nimport { hashContentNative, isRustCacheAvailable } from \"./native-bridge\"\r\nimport { scanWorkspaceParallel } from \"./parallel-scanner\"\r\nimport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n type ScanFileResult,\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nconst log = createLogger(\"scanner\")\r\n\r\nconst SCAN_WORKER_TIMEOUT_MS = 120_000\r\n\r\ntype NativeParsedClass = { raw?: string }\r\n// ClassExtractResult shape dari Rust (napi-rs export)\r\ntype NativeClassExtractResult = {\r\n classes: string[]\r\n componentNames: string[]\r\n hasTwUsage: boolean\r\n hasUseClient: boolean\r\n imports: string[]\r\n}\r\ntype NativeParserBinding = {\r\n parse_classes?: (input: string) => NativeParsedClass[]\r\n parseClasses?: (input: string) => NativeParsedClass[]\r\n // Rust returns ClassExtractResult object, bukan plain string[]\r\n extractClassesFromSource?: (source: string) => NativeClassExtractResult | string[] | null\r\n batchExtractClassesNative?: (filePaths: string[]) => Array<{\r\n file: string; classes: string[]; contentHash: string; ok: boolean; error?: string\r\n }>\r\n}\r\n\r\nfunction getRuntimeDir(): string {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Parser Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createNativeParserLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeParserBinding | null | undefined,\r\n initError: null as string | null,\r\n }\r\n\r\n const debugNative = (message: string): void => {\r\n log.debug(`[native] ${message}`)\r\n }\r\n\r\n const loadNativeParserBinding = (): NativeParserBinding | null => {\r\n if (_state.binding !== undefined) return _state.binding\r\n\r\n const runtimeDir = getRuntimeDir()\r\n const req = createRequire(path.join(runtimeDir, \"noop.cjs\"))\r\n\r\n const _platform = process.platform\r\n const _arch = process.arch\r\n const _platformArch = `${_platform}-${_arch}`\r\n const _platformArchGnu = _platformArch === \"linux-x64\" ? \"linux-x64-gnu\"\r\n : _platformArch === \"linux-arm64\" ? \"linux-arm64-gnu\"\r\n : _platformArch\r\n\r\n const candidates = [\r\n // ── binaryName baru: tailwind-styled-native (napi-rs naming) ──\r\n // cwd = repo root saat run dari root, atau package dir saat workspaces\r\n path.resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${_platformArch}.node`),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // runtimeDir = dist/ → naik 1 level ke package root (npm install case)\r\n // e.g. node_modules/tailwind-styled-v4/dist/ → node_modules/tailwind-styled-v4/native/\r\n path.resolve(runtimeDir, \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_platformArch}.node`),\r\n path.resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // runtimeDir = dist/ → naik 4 level ke repo root (monorepo dev case)\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // 3 level fallback (jika package di-nest lebih dangkal)\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\r\n // ── binaryName lama: tailwind_styled_parser (backward compat) ──\r\n path.resolve(process.cwd(), \"native/tailwind_styled_parser.node\"),\r\n path.resolve(process.cwd(), \"native/build/Release/tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(\r\n runtimeDir,\r\n \"..\",\r\n \"..\",\r\n \"..\",\r\n \"native\",\r\n \"build\",\r\n \"Release\",\r\n \"tailwind_styled_parser.node\"\r\n ),\r\n ]\r\n\r\n for (const fullPath of candidates) {\r\n if (!fs.existsSync(fullPath)) continue\r\n try {\r\n const required = req(fullPath) as NativeParserBinding\r\n if (\r\n required &&\r\n (typeof required.extractClassesFromSource === \"function\" ||\r\n typeof required.parseClasses === \"function\" ||\r\n typeof required.parse_classes === \"function\")\r\n ) {\r\n _state.binding = required\r\n debugNative(`using native parser from ${fullPath}`)\r\n return _state.binding\r\n }\r\n } catch (error) {\r\n _state.initError = error instanceof Error ? error.message : String(error)\r\n }\r\n }\r\n\r\n _state.binding = null\r\n if (!_state.initError) {\r\n _state.initError = \"native .node binding not found\"\r\n }\r\n debugNative(`native binding not available: ${_state.initError}`)\r\n return _state.binding\r\n }\r\n\r\n return {\r\n get: loadNativeParserBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.initError = null\r\n },\r\n }\r\n}\r\n\r\nconst nativeParserLoader = createNativeParserLoader()\r\n\r\nfunction normalizeWithNativeParser(tokens: string[]): string[] {\r\n const binding = nativeParserLoader.get()\r\n const parseClasses = binding?.parseClasses ?? binding?.parse_classes\r\n if (!binding || typeof parseClasses !== \"function\") {\r\n throw new Error(\r\n \"Native parser binding is required but not available. Run 'npm run build:rust' to build it.\"\r\n )\r\n }\r\n\r\n try {\r\n const parsed = parseClasses(tokens.join(\" \"))\r\n const normalized = parsed.map((item) => item.raw?.trim() ?? \"\").filter(Boolean)\r\n return Array.from(new Set(normalized))\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error)\r\n throw new Error(`Native parser failed: ${errorMessage}. Run 'npm run build:rust' to rebuild.`)\r\n }\r\n}\r\n\r\nexport type { ScanFileResult, ScanWorkspaceOptions, ScanWorkspaceResult } from \"./schemas\"\r\nexport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nexport const DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\r\nexport const DEFAULT_IGNORES = [\"node_modules\", \".git\", \".next\", \"dist\", \"out\", \".turbo\", \".cache\"]\r\n\r\nfunction resolveScannerWorkerModulePath(): string | null {\r\n const runtimeDir = (() => {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n // ESM fallback\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n // Final fallback\r\n return process.cwd()\r\n })()\r\n\r\n const candidates = [\r\n path.resolve(runtimeDir, \"worker.cjs\"),\r\n path.resolve(runtimeDir, \"worker.js\"),\r\n path.resolve(runtimeDir, \"worker.ts\"),\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction scanWorkspaceInWorker(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const modulePath = resolveScannerWorkerModulePath()\r\n if (!modulePath) {\r\n return Promise.reject(new Error(\"scanner worker module path could not be resolved\"))\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const settleState = { settled: false }\r\n\r\n const worker = new Worker(modulePath, { workerData: { rootDir, options: normalizedOptions } })\r\n\r\n const timeout = setTimeout(() => {\r\n if (!settleState.settled) {\r\n settleState.settled = true\r\n void worker.terminate()\r\n reject(new Error(`scanner worker timed out after ${SCAN_WORKER_TIMEOUT_MS}ms`))\r\n }\r\n }, SCAN_WORKER_TIMEOUT_MS)\r\n\r\n const finish = (callback: () => void) => {\r\n if (settleState.settled) return\r\n settleState.settled = true\r\n clearTimeout(timeout)\r\n callback()\r\n }\r\n\r\n worker.once(\"message\", (payload: unknown) => {\r\n const message = parseScannerWorkerMessage(payload)\r\n finish(() => {\r\n if (message?.ok) {\r\n resolve(parseScanWorkspaceResult(message.result))\r\n return\r\n }\r\n reject(new Error(message?.error ?? \"scanner worker failed without an error message\"))\r\n })\r\n })\r\n\r\n worker.once(\"error\", (error: Error) => {\r\n finish(() => reject(error))\r\n })\r\n\r\n worker.once(\"exit\", (code: number) => {\r\n if (code !== 0) {\r\n finish(() => reject(new Error(`scanner worker exited with code ${code}`)))\r\n }\r\n })\r\n })\r\n}\r\n\r\nfunction buildExtensionSet(includeExtensions: string[]): Set<string> {\r\n return new Set(includeExtensions)\r\n}\r\n\r\nfunction collectCandidates(\r\n rootDir: string,\r\n ignoreDirectories: Set<string>,\r\n extensionSet: Set<string>\r\n): string[] {\r\n const candidates: string[] = []\r\n const directories = [rootDir]\r\n\r\n while (directories.length > 0) {\r\n const currentDir = directories.pop()\r\n if (!currentDir) continue\r\n\r\n const entries = (() => {\r\n try {\r\n return fs.readdirSync(currentDir, { withFileTypes: true })\r\n } catch {\r\n return [] as fs.Dirent[]\r\n }\r\n })()\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name)\r\n\r\n if (entry.isDirectory()) {\r\n if (!ignoreDirectories.has(entry.name)) directories.push(fullPath)\r\n continue\r\n }\r\n\r\n if (!entry.isFile()) continue\r\n if (!extensionSet.has(path.extname(entry.name))) continue\r\n candidates.push(fullPath)\r\n }\r\n }\r\n\r\n return candidates\r\n}\r\n\r\nfunction toCacheSize(size: number): number {\r\n if (!Number.isFinite(size)) return 0\r\n const normalized = Math.max(0, Math.trunc(size))\r\n return Math.min(normalized, 0xffffffff)\r\n}\r\n\r\nexport function scanSource(source: string): string[] {\r\n const nativeBinding = nativeParserLoader.get()\r\n if (nativeBinding?.extractClassesFromSource) {\r\n const result = nativeBinding.extractClassesFromSource(source)\r\n // Rust mengembalikan ClassExtractResult { classes: string[], ... }\r\n // bukan plain string[] — handle kedua kemungkinan untuk backward compat\r\n if (Array.isArray(result)) {\r\n return Array.from(new Set(result.filter(Boolean)))\r\n }\r\n if (result !== null && result !== undefined && Array.isArray((result as NativeClassExtractResult).classes)) {\r\n return Array.from(new Set((result as NativeClassExtractResult).classes.filter(Boolean)))\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"FATAL: Native parser binding is required but not available.\\n\" +\r\n \"This package requires native Rust bindings.\\n\\n\" +\r\n \"Resolution steps:\\n\" +\r\n \"1. Build the native Rust module: npm run build:rust\"\r\n )\r\n}\r\n\r\nexport function isScannableFile(filePath: string, includeExtensions = DEFAULT_EXTENSIONS): boolean {\r\n return includeExtensions.includes(path.extname(filePath))\r\n}\r\n\r\nexport function scanFile(filePath: string): ScanFileResult {\r\n const { scanFileNative } = require(\"./native-bridge\")\r\n const result = scanFileNative(filePath) as {\r\n file: string; classes: string[]; hash: string; ok: boolean; error?: string | null\r\n }\r\n if (!result.ok) {\r\n throw new Error(`scanFile failed for ${filePath}: ${result.error ?? \"unknown error\"}`)\r\n }\r\n return {\r\n file: result.file,\r\n classes: result.classes,\r\n ...(result.hash ? { hash: result.hash } : {}),\r\n }\r\n}\r\n\r\nexport function scanWorkspace(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): ScanWorkspaceResult {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const includeExtensions = normalizedOptions.includeExtensions ?? DEFAULT_EXTENSIONS\r\n const extensionSet = buildExtensionSet(includeExtensions)\r\n const ignoreDirectories = new Set(normalizedOptions.ignoreDirectories ?? DEFAULT_IGNORES)\r\n const useCache = normalizedOptions.useCache ?? true\r\n const _smartInvalidation = normalizedOptions.smartInvalidation ?? true\r\n\r\n const files: ScanFileResult[] = []\r\n const unique = new Set<string>()\r\n const candidates = collectCandidates(rootDir, ignoreDirectories, extensionSet)\r\n\r\n const processResult = (result: ScanFileResult) => {\r\n files.push(result)\r\n for (const cls of result.classes) unique.add(cls)\r\n }\r\n\r\n \r\n const { scanWorkspaceNative } = require(\"./native-bridge\")\r\n\r\n if (!normalizedOptions.cacheDir && !useCache) {\r\n const nativeResult = scanWorkspaceNative(rootDir, includeExtensions)\r\n if (nativeResult) {\r\n return parseScanWorkspaceResult({\r\n files: nativeResult.files.map((f: { file: string; classes: string[]; hash?: string }) => ({\r\n file: f.file,\r\n classes: f.classes,\r\n ...(f.hash ? { hash: f.hash } : {}),\r\n })),\r\n totalFiles: nativeResult.totalFiles,\r\n uniqueClasses: nativeResult.uniqueClasses,\r\n })\r\n }\r\n }\r\n\r\n if (useCache && isRustCacheAvailable()) {\r\n const cacheEntries: NativeCacheEntry[] = (() => {\r\n try {\r\n return readCache(rootDir, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(\r\n `cache read failed, continuing without persisted cache: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return []\r\n }\r\n })()\r\n\r\n const cacheMap = new Map(cacheEntries.map((entry) => [entry.file, entry]))\r\n const nowMs = Date.now()\r\n const ranked: Array<{\r\n filePath: string\r\n stat: fs.Stats\r\n size: number\r\n cached?: NativeCacheEntry\r\n priority: number\r\n }> = []\r\n\r\n for (const filePath of candidates) {\r\n const stat = (() => {\r\n try {\r\n return fs.statSync(filePath)\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!stat) continue\r\n\r\n const size = toCacheSize(stat.size)\r\n const cached = cacheMap.get(filePath)\r\n const priority = filePriority(\r\n stat.mtimeMs,\r\n size,\r\n cached\r\n ? {\r\n mtimeMs: cached.mtimeMs,\r\n size: cached.size,\r\n hitCount: cached.hitCount,\r\n lastSeenMs: 0,\r\n }\r\n : undefined,\r\n nowMs\r\n )\r\n\r\n ranked.push({ filePath, stat, size, cached, priority })\r\n }\r\n\r\n ranked.sort((a, b) => b.priority - a.priority)\r\n\r\n const updatedEntries: NativeCacheEntry[] = []\r\n\r\n for (const { filePath, stat, size, cached } of ranked) {\r\n const content = (() => {\r\n try {\r\n return fs.readFileSync(filePath, \"utf8\")\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!content) continue\r\n\r\n const hash = hashContentNative(content)\r\n if (\r\n cached &&\r\n cached.hash === hash &&\r\n cached.mtimeMs === stat.mtimeMs &&\r\n cached.size === size\r\n ) {\r\n log.debug(`cache HIT ${filePath}`)\r\n processResult({ file: filePath, classes: cached.classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes: cached.classes,\r\n hash: cached.hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: (cached.hitCount ?? 0) + 1,\r\n })\r\n continue\r\n }\r\n\r\n log.debug(`cache MISS ${filePath}`)\r\n const classes = scanSource(content)\r\n processResult({ file: filePath, classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes,\r\n hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: 1,\r\n })\r\n }\r\n\r\n try {\r\n writeCache(rootDir, updatedEntries, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(`cache write failed: ${error instanceof Error ? error.message : String(error)}`)\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n }\r\n\r\n // Fast path: gunakan Rust batch extraction jika tersedia (parallel, tanpa GC)\r\n const batchNative = nativeParserLoader.get()?.batchExtractClassesNative\r\n if (batchNative) {\r\n const batchResults = batchNative(candidates)\r\n for (const r of batchResults ?? []) {\r\n if (r.ok) processResult({ file: r.file, classes: r.classes })\r\n }\r\n } else {\r\n for (const filePath of candidates) {\r\n processResult(scanFile(filePath))\r\n }\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n}\r\n\r\nexport async function scanWorkspaceAsync(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n\r\n // Large workspaces: use native parallel scanner (multiple workers + Rust rayon)\r\n try {\r\n return await scanWorkspaceParallel(rootDir, {\r\n extensions: normalizedOptions.includeExtensions,\r\n ignoreDirs: normalizedOptions.ignoreDirectories,\r\n }) as ScanWorkspaceResult\r\n } catch (parallelError) {\r\n log.debug(\r\n `parallel scan failed, retrying with single worker: ${\r\n parallelError instanceof Error ? parallelError.message : String(parallelError)\r\n }`\r\n )\r\n }\r\n\r\n // Fallback: single worker thread (still native)\r\n try {\r\n return await scanWorkspaceInWorker(rootDir, normalizedOptions)\r\n } catch (error) {\r\n log.debug(\r\n `worker scan failed, retrying with sync native scanner: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return scanWorkspace(rootDir, normalizedOptions)\r\n }\r\n}\r\nexport { extractClassesNative, batchExtractClassesNative } from \"./native-bridge\"","import path from \"node:path\"\r\n\r\nimport type { ScanWorkspaceResult } from \"@tailwind-styled/scanner\"\r\nimport { scanWorkspaceAsync } from \"@tailwind-styled/scanner\"\r\n\r\nimport { requireNativeBinding } from \"./binding\"\r\nimport { parseAnalyzerOptions, parseNativeReport } from \"./schemas\"\r\nimport { buildSemanticReport } from \"./semantic\"\r\nimport type { AnalyzerOptions, AnalyzerReport, ClassUsage } from \"./types\"\r\nimport { debugLog, formatErrorMessage, sanitizeFrequentThreshold, sanitizeTopLimit } from \"./utils\"\r\n\r\nfunction normalizeScan(\r\n scan: ScanWorkspaceResult,\r\n includeClass?: (className: string) => boolean\r\n): ScanWorkspaceResult {\r\n if (!includeClass) return scan\r\n\r\n const filteredFiles = scan.files.map((file) => ({\r\n file: file.file,\r\n classes: file.classes.filter((className) => includeClass(className)),\r\n }))\r\n\r\n const unique = new Set<string>()\r\n for (const file of filteredFiles) {\r\n for (const className of file.classes) {\r\n unique.add(className)\r\n }\r\n }\r\n\r\n return {\r\n files: filteredFiles,\r\n totalFiles: scan.totalFiles,\r\n uniqueClasses: Array.from(unique).sort(),\r\n }\r\n}\r\n\r\nexport async function collectClassCounts(scan: ScanWorkspaceResult): Promise<Map<string, number>> {\r\n const native = await requireNativeBinding()\r\n if (!native?.collectClassCounts) {\r\n throw new Error(\"FATAL: Native binding 'collectClassCounts' is required but not available.\")\r\n }\r\n const filesJson = JSON.stringify(\r\n scan.files.map((f) => ({ file: f.file ?? \"\", classes: f.classes }))\r\n )\r\n const result = native.collectClassCounts(filesJson) as Array<{ name: string; count: number }>\r\n const counts = new Map<string, number>()\r\n for (const entry of result) counts.set(entry.name, entry.count)\r\n return counts\r\n}\r\n\r\nfunction buildClassUsage(counts: Map<string, number>): ClassUsage[] {\r\n return Array.from(counts.entries())\r\n .map(([name, count]) => ({ name, count }))\r\n .sort((left, right) => {\r\n if (right.count !== left.count) return right.count - left.count\r\n return left.name.localeCompare(right.name)\r\n })\r\n}\r\n\r\nexport async function buildDistribution(\r\n usages: ClassUsage[],\r\n native?: Awaited<ReturnType<typeof requireNativeBinding>>\r\n): Promise<Record<string, number>> {\r\n const binding = native ?? (await requireNativeBinding())\r\n if (!binding?.buildDistribution) {\r\n throw new Error(\"FATAL: Native binding 'buildDistribution' is required but not available.\")\r\n }\r\n const result = binding.buildDistribution(\r\n JSON.stringify(usages.map((u) => ({ name: u.name, count: u.count })))\r\n ) as { once: number; few: number; moderate: number; frequent: number }\r\n return {\r\n \"1\": result.once,\r\n \"2-3\": result.few,\r\n \"4-7\": result.moderate,\r\n \"8+\": result.frequent,\r\n }\r\n}\r\n\r\n/**\r\n * Analyze Tailwind class usage in a workspace and return usage statistics.\r\n * Set `semantic.tailwindConfigPath` to override Tailwind config lookup.\r\n * @example\r\n * const report = await analyzeWorkspace(\"./src\", {\r\n * classStats: { top: 20, frequentThreshold: 2 },\r\n * semantic: { tailwindConfigPath: \"tailwind.config.js\" },\r\n * })\r\n */\r\nexport async function analyzeWorkspace(\r\n root: string,\r\n options: AnalyzerOptions = {}\r\n): Promise<AnalyzerReport> {\r\n const startedAtMs = Date.now()\r\n const resolvedRoot = path.resolve(root)\r\n const normalizedOptions = parseAnalyzerOptions(options)\r\n\r\n // 1. Scan workspace - const dengan IIFE async\r\n const scan = await (async () => {\r\n const scanStartedAtMs = Date.now()\r\n try {\r\n const result = await scanWorkspaceAsync(resolvedRoot, normalizedOptions.scanner)\r\n debugLog(\r\n `scanWorkspaceAsync processed ${result.totalFiles} files in ${Date.now() - scanStartedAtMs}ms`\r\n )\r\n return result\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to scan workspace at \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const normalizedScan = normalizeScan(scan, normalizedOptions.includeClass)\r\n const topLimit = sanitizeTopLimit(normalizedOptions.classStats?.top)\r\n const frequentThreshold = sanitizeFrequentThreshold(\r\n normalizedOptions.classStats?.frequentThreshold\r\n )\r\n\r\n const binding = await requireNativeBinding()\r\n const filesJson = JSON.stringify(\r\n normalizedScan.files.map((file) => ({ file: file.file, classes: file.classes }))\r\n )\r\n\r\n // 2. Native report - const dengan IIFE\r\n const nativeReport = (() => {\r\n try {\r\n const report = binding.analyzeClasses(filesJson, resolvedRoot, topLimit)\r\n if (!report) {\r\n throw new Error(`Native analyzer returned no report for \"${resolvedRoot}\".`)\r\n }\r\n return parseNativeReport(report)\r\n } catch (error) {\r\n throw new Error(\r\n `Native analyzer failed for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n {\r\n cause: error,\r\n }\r\n )\r\n }\r\n })()\r\n\r\n const counts = await collectClassCounts(normalizedScan)\r\n const baseAll = buildClassUsage(counts)\r\n\r\n // 3. Semantic report - const dengan IIFE async\r\n const { all, semanticReport } = await (async () => {\r\n if (!normalizedOptions.semantic) {\r\n return { all: baseAll, semanticReport: undefined }\r\n }\r\n\r\n const semanticOption =\r\n typeof normalizedOptions.semantic === \"object\" ? normalizedOptions.semantic : undefined\r\n const semanticStartedAtMs = Date.now()\r\n\r\n try {\r\n const report = await buildSemanticReport(baseAll, resolvedRoot, semanticOption)\r\n debugLog(`semantic report built in ${Date.now() - semanticStartedAtMs}ms`)\r\n\r\n if (report.conflicts.length === 0) {\r\n return { all: baseAll, semanticReport: report }\r\n }\r\n\r\n const conflicted = new Set(report.conflicts.flatMap((conflict) => conflict.classes))\r\n const updatedAll = baseAll.map((usage) =>\r\n conflicted.has(usage.name) ? { ...usage, isConflict: true } : usage\r\n )\r\n return { all: updatedAll, semanticReport: report }\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to build semantic report for \"${resolvedRoot}\": ${formatErrorMessage(error)}`,\r\n { cause: error }\r\n )\r\n }\r\n })()\r\n\r\n // 4. Statistics — native-first: satu pass Rust vs 4× JS iterations\r\n const classStatsNative = binding?.computeClassStats?.(\r\n JSON.stringify(all),\r\n topLimit,\r\n frequentThreshold\r\n )\r\n const top: typeof all = classStatsNative ? JSON.parse(classStatsNative.topJson) : all.slice(0, topLimit)\r\n const frequent: typeof all = classStatsNative ? JSON.parse(classStatsNative.frequentJson) : all.filter((usage) => usage.count >= frequentThreshold).slice(0, topLimit)\r\n const unique: typeof all = classStatsNative ? JSON.parse(classStatsNative.uniqueJson) : all.filter((usage) => usage.count === 1)\r\n const totalClassOccurrences: number = classStatsNative\r\n ? classStatsNative.totalClassOccurrences\r\n : all.reduce((sum, usage) => sum + usage.count, 0)\r\n\r\n debugLog(\r\n `analyzeWorkspace completed in ${Date.now() - startedAtMs}ms ` +\r\n `(files=${normalizedScan.totalFiles}, uniqueClasses=${all.length})`\r\n )\r\n\r\n const distribution = await buildDistribution(all, binding)\r\n\r\n return {\r\n root: nativeReport.root || resolvedRoot,\r\n totalFiles: nativeReport.totalFiles,\r\n uniqueClassCount: all.length,\r\n totalClassOccurrences,\r\n classStats: {\r\n all,\r\n top,\r\n frequent,\r\n unique,\r\n distribution,\r\n },\r\n // topClasses — alias for classStats.top (test contract & backward compat)\r\n topClasses: top,\r\n safelist: all.map((usage) => usage.name),\r\n ...(semanticReport ? { semantic: semanticReport } : {}),\r\n }\r\n}","import {\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n resolveRuntimeDir,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nimport type { NativeAnalyzerBinding, NativeCssCompilerBinding } from \"./types\"\r\nimport { debugLog } from \"./utils\"\r\n\r\nconst isAnalyzerModule = (module: unknown): module is NativeAnalyzerBinding => {\r\n const candidate = module as Partial<NativeAnalyzerBinding> | null | undefined\r\n return typeof candidate?.analyzeClasses === \"function\"\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Analyzer Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createAnalyzerBindingLoader = () => {\r\n const _state = { bindingPromise: null as Promise<NativeAnalyzerBinding | null> | null }\r\n\r\n const getBindingPromise = (): Promise<NativeAnalyzerBinding | null> => {\r\n if (_state.bindingPromise) return _state.bindingPromise\r\n\r\n _state.bindingPromise = (async (): Promise<NativeAnalyzerBinding | null> => {\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { binding, loadErrors, loadedPath } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n if (binding) {\r\n debugLog(`native binding loaded from: ${loadedPath}`)\r\n return binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n debugLog(\r\n `native binding load failed for ${loadErrors.length} candidate(s): ${loadErrors\r\n .map((entry) => `${entry.path} (${entry.message})`)\r\n .join(\"; \")}`\r\n )\r\n } else {\r\n debugLog(\"native binding not found in any candidate path\")\r\n }\r\n\r\n return null\r\n })()\r\n\r\n return _state.bindingPromise\r\n }\r\n\r\n return {\r\n get: getBindingPromise,\r\n reset: (): void => {\r\n _state.bindingPromise = null\r\n },\r\n }\r\n}\r\n\r\nconst analyzerBindingLoader = createAnalyzerBindingLoader()\r\n\r\nexport async function getNativeBinding(): Promise<NativeAnalyzerBinding | null> {\r\n return analyzerBindingLoader.get()\r\n}\r\n\r\nexport async function requireNativeBinding(): Promise<NativeAnalyzerBinding> {\r\n const binding = await analyzerBindingLoader.get()\r\n if (binding?.analyzeClasses) return binding\r\n\r\n // Untuk error reporting, kita perlu akses ke candidates dan loadErrors\r\n // Tapi karena async, kita perlu load ulang atau simpan state\r\n const runtimeDir = resolveRuntimeDir(\r\n typeof __dirname === \"string\" ? __dirname : undefined,\r\n import.meta.url\r\n )\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n envVarNames: [\"TWS_NATIVE_PATH\"],\r\n })\r\n\r\n const { loadErrors } = await loadNativeBinding<NativeAnalyzerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isAnalyzerModule,\r\n invalidExportMessage: \"Module loaded but missing `analyzeClasses` export.\",\r\n })\r\n\r\n const lines = [\r\n \"Native analyzer binding not found. Ensure `tailwind_styled_parser.node` is built.\",\r\n ]\r\n\r\n lines.push(\"Checked paths:\")\r\n for (const candidate of candidates) lines.push(`- ${candidate}`)\r\n if (loadErrors.length > 0) {\r\n lines.push(\"Load errors:\")\r\n for (const failure of loadErrors) {\r\n lines.push(`- ${failure.path}: ${failure.message}`)\r\n }\r\n }\r\n\r\n throw new Error(lines.join(\"\\n\"))\r\n}\r\n\r\nexport async function requireNativeCssCompiler(): Promise<NativeCssCompilerBinding> {\r\n const binding = await requireNativeBinding()\r\n if (typeof binding.compileCss === \"function\") return binding as NativeCssCompilerBinding\r\n\r\n throw new Error(`Native analyzer compileCss binding is missing.`)\r\n}\r\n","import fs from \"node:fs\"\r\nimport { createDebugLogger } from \"@tailwind-styled/shared\"\r\n\r\nexport const DEFAULT_TOP_LIMIT = 10\r\nexport const DEFAULT_FREQUENT_THRESHOLD = 2\r\nexport const DEBUG_NAMESPACE = \"tailwind-styled:analyzer\"\r\n\r\nexport function formatErrorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nexport async function pathExists(filePath: string): Promise<boolean> {\r\n try {\r\n await fs.promises.access(filePath, fs.constants.F_OK)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport const debugLog = createDebugLogger(DEBUG_NAMESPACE, \"tailwind-styled/analyzer\")\r\n\r\nexport function sanitizeTopLimit(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_TOP_LIMIT\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n\r\nexport function sanitizeFrequentThreshold(value: number | undefined): number {\r\n if (!Number.isFinite(value)) return DEFAULT_FREQUENT_THRESHOLD\r\n return Math.max(1, Math.trunc(value as number))\r\n}\r\n","import { TwError } from \"@tailwind-styled/shared\"\r\nimport type { ScanWorkspaceOptions } from \"@tailwind-styled/scanner\"\r\nimport { z } from \"zod\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false\r\n const proto = Object.getPrototypeOf(value)\r\n return proto === Object.prototype || proto === null\r\n}\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst CountSchema = z.number().int().min(0)\r\n\r\nexport const ClassUsageSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n isUnused: z.boolean().optional(),\r\n isConflict: z.boolean().optional(),\r\n})\r\n\r\nexport const ClassConflictSchema = z.object({\r\n className: z.string(),\r\n variants: z.array(z.string()),\r\n classes: z.array(z.string()),\r\n message: z.string(),\r\n})\r\n\r\nconst ClassCountSchema = z.object({\r\n name: z.string(),\r\n count: CountSchema,\r\n})\r\n\r\nexport const NativeReportSchema = z.object({\r\n root: z.string(),\r\n totalFiles: CountSchema,\r\n uniqueClassCount: CountSchema,\r\n totalClassOccurrences: CountSchema,\r\n topClasses: z.array(ClassCountSchema),\r\n duplicateCandidates: z.array(ClassCountSchema),\r\n safelist: z.array(z.string()),\r\n})\r\n\r\nexport const NativeCssCompileResultSchema = z.object({\r\n css: z.string(),\r\n resolvedClasses: z.array(z.string()),\r\n unknownClasses: z.array(z.string()),\r\n sizeBytes: CountSchema,\r\n})\r\n\r\nconst AnalyzerClassStatsSchema = z.object({\r\n top: z\r\n .number({\r\n error: \"analyzeWorkspace options.classStats.top must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n frequentThreshold: z\r\n .number({\r\n error:\r\n \"analyzeWorkspace options.classStats.frequentThreshold must be a number when provided.\",\r\n })\r\n .finite()\r\n .optional(),\r\n})\r\n\r\nconst AnalyzerSemanticOptionsSchema = z.object({\r\n tailwindConfigPath: z\r\n .string({\r\n error:\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\",\r\n })\r\n .min(\r\n 1,\r\n \"analyzeWorkspace options.semantic.tailwindConfigPath must be a non-empty string when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const AnalyzerOptionsSchema = z.object({\r\n scanner: z\r\n .custom<ScanWorkspaceOptions>(\r\n (value) => isPlainObject(value),\r\n \"analyzeWorkspace options.scanner must be an object when provided.\"\r\n )\r\n .optional(),\r\n classStats: AnalyzerClassStatsSchema.optional(),\r\n semantic: z\r\n .union([\r\n z.boolean({\r\n error: \"analyzeWorkspace options.semantic must be a boolean or an object when provided.\",\r\n }),\r\n AnalyzerSemanticOptionsSchema,\r\n ])\r\n .optional(),\r\n includeClass: z\r\n .custom<(className: string) => boolean>(\r\n (value) => typeof value === \"function\",\r\n \"analyzeWorkspace options.includeClass must be a function when provided.\"\r\n )\r\n .optional(),\r\n})\r\n\r\nexport const ClassToCssOptionsSchema = z.object({\r\n prefix: z\r\n .union([z.string(), z.null()], {\r\n error: \"classToCss options.prefix must be a string or null when provided.\",\r\n })\r\n .optional(),\r\n strict: z\r\n .boolean({\r\n error: \"classToCss options.strict must be a boolean when provided.\",\r\n })\r\n .optional(),\r\n})\r\n\r\nexport const parseAnalyzerOptions = (options: unknown) =>\r\n parseWithSchema(AnalyzerOptionsSchema, options ?? {}, \"analyzeWorkspace options are invalid\")\r\n\r\nexport const parseNativeReport = (report: unknown) =>\r\n parseWithSchema(NativeReportSchema, report, \"Native analyzer report is invalid\")\r\n\r\nexport const parseNativeCssCompileResult = (result: unknown, className?: string) =>\r\n parseWithSchema(\r\n NativeCssCompileResultSchema,\r\n result,\r\n className\r\n ? `Native CSS compile result is invalid for class \"${className}\"`\r\n : \"Native CSS compile result is invalid\"\r\n )\r\n\r\nexport const parseClassToCssOptions = (options: unknown) =>\r\n parseWithSchema(ClassToCssOptionsSchema, options ?? {}, \"classToCss options are invalid\")\r\n","import fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { pathToFileURL } from \"node:url\"\r\n\r\nimport type {\r\n AnalyzerSemanticReport,\r\n ClassConflict,\r\n ClassUsage,\r\n LoadedTailwindConfig,\r\n TailwindConfigCacheEntry,\r\n} from \"./types\"\r\nimport { getNativeBinding } from \"./binding\"\r\nimport { debugLog, formatErrorMessage, isRecord, pathExists } from \"./utils\"\r\n\r\n\r\nconst SUPPORTED_TAILWIND_CONFIG_EXTENSIONS = new Set([\".ts\", \".js\", \".cjs\", \".mjs\"])\r\n\r\nconst tailwindConfigCache = new Map<string, TailwindConfigCacheEntry>()\r\n\r\nexport const splitVariantAndBase = (className: string): { variantKey: string; base: string } => {\r\n const parts = className.split(\":\")\r\n if (parts.length <= 1) return { variantKey: \"\", base: className }\r\n const base = parts.pop() ?? className\r\n return { variantKey: parts.join(\":\"), base }\r\n}\r\n\r\n/**\r\n * resolveConflictGroup — delegates ke Rust `resolve_conflict_group`.\r\n * Return: string | null — null jika tidak ada conflict group.\r\n */\r\nexport const resolveConflictGroup = async (base: string): Promise<string | null> => {\r\n const native = await getNativeBinding()\r\n if (!native?.resolveConflictGroup) {\r\n throw new Error(\"Native binding 'resolveConflictGroup' is required but not available.\")\r\n }\r\n const result = native.resolveConflictGroup(base) as string\r\n return result.length > 0 ? result : null\r\n}\r\n\r\nconst detectConflicts = async (\r\n usages: ClassUsage[]\r\n): Promise<{\r\n conflicts: ClassConflict[]\r\n conflictedClassNames: Set<string>\r\n}> => {\r\n // Native-first: Rust HashSet conflict detection (required)\r\n const native = await getNativeBinding()\r\n if (!native?.detectClassConflicts) {\r\n throw new Error(\"FATAL: Native binding 'detectClassConflicts' is required but not available.\")\r\n }\r\n const result = native.detectClassConflicts(JSON.stringify(usages.map((u) => ({ name: u.name, count: u.count }))))\r\n return {\r\n conflicts: result.conflicts.map((c) => ({\r\n className: c.group,\r\n variants: c.variantKey.length > 0 ? c.variantKey.split(\":\") : [],\r\n classes: c.classes,\r\n message: c.message,\r\n })),\r\n conflictedClassNames: new Set(result.conflictedClassNames),\r\n }\r\n}\r\n\r\nconst isSupportedTailwindConfigPath = (configPath: string): boolean => {\r\n return SUPPORTED_TAILWIND_CONFIG_EXTENSIONS.has(path.extname(configPath).toLowerCase())\r\n}\r\n\r\nconst resolveTailwindConfigPath = async (\r\n root: string,\r\n explicitPath?: string\r\n): Promise<string | null> => {\r\n if (explicitPath) {\r\n const resolved = path.resolve(root, explicitPath)\r\n if (!(await pathExists(resolved))) return null\r\n return resolved\r\n }\r\n\r\n const candidates = [\r\n \"tailwind.config.ts\",\r\n \"tailwind.config.js\",\r\n \"tailwind.config.cjs\",\r\n \"tailwind.config.mjs\",\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n const fullPath = path.resolve(root, candidate)\r\n if (await pathExists(fullPath)) return fullPath\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst collectSafelistFromConfig = (config: Record<string, unknown>): string[] => {\r\n const raw = config.safelist\r\n if (!Array.isArray(raw)) return []\r\n\r\n const out = new Set<string>()\r\n for (const entry of raw) {\r\n if (typeof entry === \"string\" && entry.length > 0) {\r\n out.add(entry)\r\n continue\r\n }\r\n if (!entry || typeof entry !== \"object\") continue\r\n const pattern = (entry as Record<string, unknown>).pattern\r\n if (typeof pattern === \"string\" && pattern.length > 0) {\r\n out.add(pattern)\r\n }\r\n }\r\n\r\n return Array.from(out)\r\n}\r\n\r\nconst collectCustomUtilities = (config: Record<string, unknown>): Set<string> => {\r\n const out = new Set<string>()\r\n const theme = config.theme\r\n if (!theme || typeof theme !== \"object\") return out\r\n\r\n const extend = (theme as Record<string, unknown>).extend\r\n if (!extend || typeof extend !== \"object\") return out\r\n\r\n for (const [section, value] of Object.entries(extend as Record<string, unknown>)) {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\r\n for (const key of Object.keys(value as Record<string, unknown>)) {\r\n out.add(`${section}-${key}`)\r\n if (section === \"colors\") {\r\n out.add(`bg-${key}`)\r\n out.add(`text-${key}`)\r\n out.add(`border-${key}`)\r\n } else if (section === \"spacing\") {\r\n out.add(`p-${key}`)\r\n out.add(`m-${key}`)\r\n out.add(`gap-${key}`)\r\n out.add(`w-${key}`)\r\n out.add(`h-${key}`)\r\n } else if (section === \"fontSize\") {\r\n out.add(`text-${key}`)\r\n } else if (section === \"borderRadius\") {\r\n out.add(`rounded-${key}`)\r\n } else if (section === \"boxShadow\") {\r\n out.add(`shadow-${key}`)\r\n }\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nconst collectSafelistFromSource = async (configPath: string): Promise<string[]> => {\r\n const source = await fs.promises.readFile(configPath, \"utf8\")\r\n\r\n // Gunakan native AST parser untuk ekstrak string literals dari config\r\n // Lebih akurat dari regex — handle template literals, multiline, nested quotes\r\n const { extractClassesNative } = await import(\"@tailwind-styled/scanner\")\r\n const allTokens = extractClassesNative(source)\r\n\r\n // Filter hanya token yang berasal dari safelist block\r\n // Native parse sudah return semua string value — kita cek apakah safelist array ada di source\r\n const hasSafelist = source.includes(\"safelist\")\r\n if (!hasSafelist) return []\r\n\r\n // Ambil baris-baris safelist dari source untuk batasi scope\r\n const safelistMatch = source.match(/safelist\\s*:\\s*\\[([\\s\\S]*?)\\]/m)?.[1]\r\n if (!safelistMatch) return []\r\n\r\n // Cross-reference: hanya return token yang muncul di dalam safelist block\r\n const safelistSet = new Set<string>()\r\n for (const token of safelistMatch.matchAll(/[\"'`]([^\"'`]+)[\"'`]/g)) {\r\n const value = token[1].trim()\r\n if (value.length > 0) safelistSet.add(value)\r\n }\r\n\r\n // Intersect dengan native extracted tokens untuk validasi\r\n return allTokens.filter((t: string) => safelistSet.has(t))\r\n}\r\n\r\nconst loadTailwindConfig = async (\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<LoadedTailwindConfig | null> => {\r\n const startMs = Date.now()\r\n const configPath = await resolveTailwindConfigPath(root, semanticOption?.tailwindConfigPath)\r\n if (!configPath) return null\r\n\r\n if (!isSupportedTailwindConfigPath(configPath)) {\r\n return {\r\n path: configPath,\r\n loaded: false,\r\n warning: `Unsupported Tailwind config extension at \"${configPath}\". Supported extensions: .ts, .js, .cjs, .mjs.`,\r\n safelist: new Set<string>(),\r\n customUtilities: new Set<string>(),\r\n }\r\n }\r\n\r\n const configStat = await fs.promises.stat(configPath).catch(() => null)\r\n if (configStat) {\r\n const cached = tailwindConfigCache.get(configPath)\r\n if (cached && cached.mtimeMs === configStat.mtimeMs && cached.size === configStat.size) {\r\n debugLog(\r\n `tailwind config cache hit: ${configPath} (${cached.config.safelist.size} safelist entries)`\r\n )\r\n return cached.config\r\n }\r\n }\r\n\r\n const result = await (async (): Promise<{\r\n config: Record<string, unknown> | null\r\n warning: string | undefined\r\n }> => {\r\n try {\r\n const cacheBustToken = Math.trunc(configStat?.mtimeMs ?? Date.now())\r\n const imported = await import(`${pathToFileURL(configPath).href}?tws_mtime=${cacheBustToken}`)\r\n const candidate = (imported.default ?? imported) as unknown\r\n if (isRecord(candidate)) {\r\n return { config: candidate, warning: undefined }\r\n } else if (typeof candidate === \"function\") {\r\n const evaluated = candidate()\r\n if (isRecord(evaluated)) {\r\n return { config: evaluated, warning: undefined }\r\n }\r\n return { config: null, warning: \"Tailwind config export function must return an object.\" }\r\n }\r\n return {\r\n config: null,\r\n warning: \"Tailwind config export must be an object or a function returning an object.\",\r\n }\r\n } catch (error) {\r\n return { config: null, warning: formatErrorMessage(error) }\r\n }\r\n })()\r\n\r\n const { config, warning } = result\r\n\r\n const safelist = new Set<string>()\r\n const customUtilities = new Set<string>()\r\n\r\n if (config) {\r\n for (const item of collectSafelistFromConfig(config)) safelist.add(item)\r\n for (const item of collectCustomUtilities(config)) customUtilities.add(item)\r\n }\r\n\r\n if (safelist.size === 0) {\r\n try {\r\n for (const item of await collectSafelistFromSource(configPath)) safelist.add(item)\r\n } catch (error) {\r\n debugLog(\r\n `failed to parse safelist from source at \"${configPath}\": ${formatErrorMessage(error)}`\r\n )\r\n // keep empty if source parsing fails\r\n }\r\n }\r\n\r\n const loaded = {\r\n path: configPath,\r\n loaded: config !== null,\r\n warning,\r\n safelist,\r\n customUtilities,\r\n }\r\n\r\n if (configStat) {\r\n tailwindConfigCache.set(configPath, {\r\n mtimeMs: configStat.mtimeMs,\r\n size: configStat.size,\r\n config: loaded,\r\n })\r\n }\r\n\r\n debugLog(\r\n `tailwind config loaded from \"${configPath}\" in ${Date.now() - startMs}ms ` +\r\n `(loaded=${loaded.loaded}, safelist=${loaded.safelist.size}, custom=${loaded.customUtilities.size})`\r\n )\r\n\r\n return loaded\r\n }\r\n\r\nexport const utilityPrefix = (baseClass: string): string => {\r\n const normalized = baseClass.startsWith(\"-\") ? baseClass.slice(1) : baseClass\r\n if (normalized.includes(\"[\") && normalized.includes(\"]\")) return \"arbitrary\"\r\n if (normalized.startsWith(\"min-w-\")) return \"min-w\"\r\n if (normalized.startsWith(\"max-w-\")) return \"max-w\"\r\n if (normalized.startsWith(\"min-h-\")) return \"min-h\"\r\n if (normalized.startsWith(\"max-h-\")) return \"max-h\"\r\n if (normalized.startsWith(\"space-x-\")) return \"space-x\"\r\n if (normalized.startsWith(\"space-y-\")) return \"space-y\"\r\n if (normalized.startsWith(\"inline-\")) return \"inline\"\r\n if (normalized.startsWith(\"border-\")) return \"border\"\r\n if (normalized.startsWith(\"text-\")) return \"text\"\r\n if (normalized.startsWith(\"bg-\")) return \"bg\"\r\n if (normalized.startsWith(\"rounded\")) return \"rounded\"\r\n if (normalized.startsWith(\"shadow\")) return \"shadow\"\r\n const hyphen = normalized.indexOf(\"-\")\r\n if (hyphen < 0) return normalized\r\n return normalized.slice(0, hyphen)\r\n}\r\n\r\nexport const buildSemanticReport = async (\r\n usages: ClassUsage[],\r\n root: string,\r\n semanticOption?: { tailwindConfigPath?: string }\r\n): Promise<AnalyzerSemanticReport> => {\r\n const loadedConfig = await loadTailwindConfig(root, semanticOption)\r\n const safelist = loadedConfig?.safelist ?? new Set<string>()\r\n const customUtilities = loadedConfig?.customUtilities ?? new Set<string>()\r\n const usageNames = new Set(usages.map((usage) => usage.name))\r\n\r\n const unusedClasses: ClassUsage[] = Array.from(safelist)\r\n .filter((className) => !usageNames.has(className))\r\n .sort()\r\n .map((className) => ({ name: className, count: 0, isUnused: true }))\r\n\r\n // ── Unknown classes — native-first (required) ─────────────────────────────\r\n const native = await getNativeBinding()\r\n if (!native?.classifyKnownClasses) {\r\n throw new Error(\"FATAL: Native binding 'classifyKnownClasses' is required but not available.\")\r\n }\r\n const classNames = usages.map((u) => u.name)\r\n const results = native.classifyKnownClasses(\r\n classNames,\r\n Array.from(safelist),\r\n Array.from(customUtilities)\r\n )\r\n const unknownSet = new Set(\r\n results\r\n .filter((r: { className: string; isKnown: boolean }) => !r.isKnown)\r\n .map((r: { className: string; isKnown: boolean }) => r.className)\r\n )\r\n const unknownClasses = usages\r\n .filter((usage) => unknownSet.has(usage.name))\r\n .map((usage) => ({ ...usage, isUnused: true }))\r\n\r\n const { conflicts } = await detectConflicts(usages)\r\n\r\n return {\r\n unusedClasses,\r\n unknownClasses,\r\n conflicts,\r\n ...(loadedConfig\r\n ? {\r\n tailwindConfig: {\r\n path: loadedConfig.path,\r\n loaded: loadedConfig.loaded,\r\n safelistCount: loadedConfig.safelist.size,\r\n customUtilityCount: loadedConfig.customUtilities.size,\r\n ...(loadedConfig.warning ? { warning: loadedConfig.warning } : {}),\r\n },\r\n }\r\n : {}),\r\n }\r\n}","import { requireNativeCssCompiler } from \"./binding\"\r\nimport { parseClassToCssOptions, parseNativeCssCompileResult } from \"./schemas\"\r\nimport type { ClassToCssOptions, ClassToCssResult } from \"./types\"\r\nimport { formatErrorMessage } from \"./utils\"\r\n\r\nexport const normalizeClassInput = (input: string | string[], binding: { normalizeClassInput?: (s: string) => string[] }): string[] => {\r\n if (typeof input === \"string\") {\r\n if (!binding.normalizeClassInput) {\r\n throw new Error(\"FATAL: Native binding 'normalizeClassInput' is required but not available.\")\r\n }\r\n return binding.normalizeClassInput(input)\r\n }\r\n\r\n if (!Array.isArray(input)) {\r\n throw new TypeError(\"classToCss input must be a string or an array of strings.\")\r\n }\r\n\r\n const out: string[] = []\r\n for (const item of input) {\r\n if (typeof item !== \"string\") {\r\n throw new TypeError(\"classToCss input array must contain only strings.\")\r\n }\r\n const value = item.trim()\r\n if (value.length > 0) out.push(value)\r\n }\r\n return out\r\n}\r\n\r\nconst normalizeClassToCssOptions = (\r\n options: ClassToCssOptions\r\n): {\r\n prefix: string | null\r\n strict: boolean\r\n} => {\r\n const parsed = parseClassToCssOptions(options)\r\n const strict = parsed.strict ?? false\r\n const prefix = parsed.prefix ?? null\r\n\r\n return { prefix, strict }\r\n}\r\n\r\nconst mergeDeclarationMap = (\r\n target: Map<string, string>,\r\n css: string,\r\n binding: { parseCssRules?: (css: string) => Array<{ property: string; value: string; isImportant: boolean }> }\r\n): void => {\r\n if (!binding.parseCssRules) {\r\n throw new Error(\"FATAL: Native binding 'parseCssRules' is required but not available.\")\r\n }\r\n const rules = binding.parseCssRules(css)\r\n for (const rule of rules) {\r\n if (target.has(rule.property)) target.delete(rule.property)\r\n target.set(rule.property, rule.isImportant ? `${rule.value} !important` : rule.value)\r\n }\r\n}\r\n\r\nconst declarationMapToString = (\r\n declarationMap: Map<string, string>,\r\n binding: { declarationMapToString?: (entries: Array<{ property: string; value: string }>) => string }\r\n): string => {\r\n if (!binding.declarationMapToString) {\r\n throw new Error(\"FATAL: Native binding 'declarationMapToString' is required but not available.\")\r\n }\r\n const entries = Array.from(declarationMap.entries()).map(([property, value]) => ({ property, value }))\r\n return binding.declarationMapToString(entries)\r\n}\r\n\r\n/**\r\n * Convert Tailwind class input into atomic CSS output via native binding.\r\n * @example\r\n * const css = await classToCss(\"opacity-0 translate-y-2\", { strict: true })\r\n */\r\nexport const classToCss = async (\r\n input: string | string[],\r\n options: ClassToCssOptions = {}\r\n): Promise<ClassToCssResult> => {\r\n const binding = await requireNativeCssCompiler()\r\n const inputClasses = normalizeClassInput(input, binding)\r\n const normalizedOptions = normalizeClassToCssOptions(options)\r\n\r\n if (inputClasses.length === 0) {\r\n return {\r\n inputClasses: [],\r\n css: \"\",\r\n declarations: \"\",\r\n resolvedClasses: [],\r\n unknownClasses: [],\r\n sizeBytes: 0,\r\n }\r\n }\r\n\r\n const prefix = normalizedOptions.prefix\r\n\r\n const results = await Promise.all(\r\n inputClasses.map(async (className) => {\r\n const compiled = (() => {\r\n try {\r\n return binding.compileCss([className], prefix)\r\n } catch (error) {\r\n throw new Error(\r\n `Native analyzer failed while compiling class \"${className}\": ${formatErrorMessage(error)}`,\r\n { cause: error }\r\n )\r\n }\r\n })()\r\n\r\n if (!compiled) {\r\n throw new Error(`Native analyzer returned no result for class \"${className}\".`)\r\n }\r\n\r\n const validated = parseNativeCssCompileResult(compiled, className)\r\n\r\n return {\r\n className,\r\n css: validated.css,\r\n resolvedClasses: validated.resolvedClasses,\r\n unknownClasses: validated.unknownClasses,\r\n sizeBytes: validated.sizeBytes,\r\n }\r\n })\r\n )\r\n\r\n const cssChunks = results.map((r) => r.css)\r\n const resolvedClasses = results.flatMap((r) => r.resolvedClasses)\r\n const unknownClasses = results.flatMap((r) => r.unknownClasses)\r\n const sizeBytes = results.reduce((sum, r) => sum + r.sizeBytes, 0)\r\n\r\n const declarationMap = new Map<string, string>()\r\n for (const result of results) {\r\n mergeDeclarationMap(declarationMap, result.css, binding)\r\n }\r\n\r\n const uniqueUnknown = Array.from(new Set(unknownClasses))\r\n if (normalizedOptions.strict && uniqueUnknown.length > 0) {\r\n throw new Error(`Unknown Tailwind classes: ${uniqueUnknown.join(\", \")}`)\r\n }\r\n\r\n return {\r\n inputClasses,\r\n css: cssChunks.filter((chunk) => chunk.length > 0).join(\"\\n\"),\r\n declarations: declarationMapToString(declarationMap, binding),\r\n resolvedClasses: Array.from(new Set(resolvedClasses)),\r\n unknownClasses: uniqueUnknown,\r\n sizeBytes,\r\n }\r\n}","/**\r\n * @tailwind-styled/analyzer v5\r\n *\r\n * Native-first async analyzer with semantic reporting.\r\n */\r\n\r\nimport { analyzeWorkspace, buildDistribution, collectClassCounts } from \"./analyzeWorkspace\"\r\nimport { classToCss, normalizeClassInput } from \"./classToCss\"\r\nimport {\r\n parseAnalyzerOptions,\r\n parseClassToCssOptions,\r\n parseNativeCssCompileResult,\r\n parseNativeReport,\r\n} from \"./schemas\"\r\nimport { resolveConflictGroup, splitVariantAndBase, utilityPrefix } from \"./semantic\"\r\n\r\nexport type {\r\n AnalyzerOptions,\r\n AnalyzerReport,\r\n AnalyzerSemanticReport,\r\n ClassConflict,\r\n ClassToCssOptions,\r\n ClassToCssResult,\r\n ClassUsage,\r\n} from \"./types\"\r\n\r\nexport { analyzeWorkspace, classToCss }\r\n\r\n export const __internal = {\r\n normalizeClassInput,\r\n splitVariantAndBase,\r\n resolveConflictGroup,\r\n collectClassCounts,\r\n buildDistribution,\r\n utilityPrefix,\r\n parseAnalyzerOptions,\r\n parseClassToCssOptions,\r\n parseNativeReport,\r\n parseNativeCssCompileResult,\r\n }\r\n"]}