tailwind-styled-v4 5.0.10 → 5.0.11

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 (93) hide show
  1. package/README.md +245 -373
  2. package/dist/analyzer.js +75 -22
  3. package/dist/analyzer.js.map +1 -1
  4. package/dist/analyzer.mjs +74 -21
  5. package/dist/analyzer.mjs.map +1 -1
  6. package/dist/animate.js +4 -2
  7. package/dist/animate.js.map +1 -1
  8. package/dist/animate.mjs +4 -2
  9. package/dist/animate.mjs.map +1 -1
  10. package/dist/atomic.js +20 -5
  11. package/dist/atomic.js.map +1 -1
  12. package/dist/atomic.mjs +20 -5
  13. package/dist/atomic.mjs.map +1 -1
  14. package/dist/cli.js +174 -67
  15. package/dist/cli.js.map +1 -1
  16. package/dist/cli.mjs +171 -64
  17. package/dist/cli.mjs.map +1 -1
  18. package/dist/compiler.d.mts +7 -1
  19. package/dist/compiler.d.ts +7 -1
  20. package/dist/compiler.js +53 -27
  21. package/dist/compiler.js.map +1 -1
  22. package/dist/compiler.mjs +53 -27
  23. package/dist/compiler.mjs.map +1 -1
  24. package/dist/devtools.js.map +1 -1
  25. package/dist/devtools.mjs.map +1 -1
  26. package/dist/engine.js +159 -61
  27. package/dist/engine.js.map +1 -1
  28. package/dist/engine.mjs +159 -61
  29. package/dist/engine.mjs.map +1 -1
  30. package/dist/index.browser.mjs +1512 -0
  31. package/dist/index.browser.mjs.map +1 -0
  32. package/dist/index.d.mts +94 -12
  33. package/dist/index.d.ts +94 -12
  34. package/dist/index.js +436 -106
  35. package/dist/index.js.map +1 -1
  36. package/dist/index.mjs +436 -106
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/next.js +1946 -47
  39. package/dist/next.js.map +1 -1
  40. package/dist/next.mjs +1929 -44
  41. package/dist/next.mjs.map +1 -1
  42. package/dist/plugin-api.js.map +1 -1
  43. package/dist/plugin-api.mjs.map +1 -1
  44. package/dist/plugin-registry.js +23 -10
  45. package/dist/plugin-registry.js.map +1 -1
  46. package/dist/plugin-registry.mjs +23 -11
  47. package/dist/plugin-registry.mjs.map +1 -1
  48. package/dist/plugin.js.map +1 -1
  49. package/dist/plugin.mjs.map +1 -1
  50. package/dist/rspack.js.map +1 -1
  51. package/dist/rspack.mjs.map +1 -1
  52. package/dist/scanner.js +72 -19
  53. package/dist/scanner.js.map +1 -1
  54. package/dist/scanner.mjs +71 -18
  55. package/dist/scanner.mjs.map +1 -1
  56. package/dist/shared.js +32 -15
  57. package/dist/shared.js.map +1 -1
  58. package/dist/shared.mjs +32 -15
  59. package/dist/shared.mjs.map +1 -1
  60. package/dist/svelte.js +38 -12
  61. package/dist/svelte.js.map +1 -1
  62. package/dist/svelte.mjs +38 -12
  63. package/dist/svelte.mjs.map +1 -1
  64. package/dist/syntax.js +17 -5
  65. package/dist/syntax.js.map +1 -1
  66. package/dist/syntax.mjs +17 -5
  67. package/dist/syntax.mjs.map +1 -1
  68. package/dist/theme.js +4 -2
  69. package/dist/theme.js.map +1 -1
  70. package/dist/theme.mjs +4 -2
  71. package/dist/theme.mjs.map +1 -1
  72. package/dist/turbopackLoader.js +87 -33
  73. package/dist/turbopackLoader.js.map +1 -1
  74. package/dist/turbopackLoader.mjs +87 -33
  75. package/dist/turbopackLoader.mjs.map +1 -1
  76. package/dist/tw.js +174 -67
  77. package/dist/tw.js.map +1 -1
  78. package/dist/tw.mjs +171 -64
  79. package/dist/tw.mjs.map +1 -1
  80. package/dist/vite.js +145 -63
  81. package/dist/vite.js.map +1 -1
  82. package/dist/vite.mjs +145 -63
  83. package/dist/vite.mjs.map +1 -1
  84. package/dist/vue.js +38 -12
  85. package/dist/vue.js.map +1 -1
  86. package/dist/vue.mjs +38 -12
  87. package/dist/vue.mjs.map +1 -1
  88. package/dist/webpackLoader.js +20 -5
  89. package/dist/webpackLoader.js.map +1 -1
  90. package/dist/webpackLoader.mjs +20 -5
  91. package/dist/webpackLoader.mjs.map +1 -1
  92. package/native/tailwind-styled-native.node +0 -0
  93. package/package.json +29 -24
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/domain/shared/src/index.ts","../packages/domain/scanner/src/native-bridge.ts","../packages/domain/scanner/src/index.ts","../packages/domain/scanner/src/cache-native.ts","../packages/domain/scanner/src/parallel-scanner.ts","../packages/domain/scanner/src/schemas.ts"],"names":["path","fs","createRequire","fileURLToPath","scannerGetBinding","isMainThread","parentPort","workerData","Worker","availableParallelism","formatIssuePath","z","log","scanFileNative","scanWorkspaceNative"],"mappings":"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","file":"scanner.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 // 4 level: dist/ → package/ → domain/ → packages/ → repo-root/\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.${napiPlatform}.node`))\r\n // 3 level fallback\r\n candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.node`))\r\n candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.${napiPlatform}.node`))\r\n }\r\n\r\n return Array.from(new Set(candidates))\r\n}\r\n\r\nexport function resolveRuntimeDir(dir: string | undefined, importMetaUrl: string): string {\r\n if (dir) return path.resolve(dir)\r\n try {\r\n return path.dirname(fileURLToPath(importMetaUrl))\r\n } catch {\r\n return process.cwd()\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Hashing\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function hashContent(content: string, algorithm: string = \"md5\", length?: number): string {\r\n const hash = createHash(algorithm).update(content).digest(\"hex\")\r\n return length ? hash.slice(0, length) : hash\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function formatErrorMessage(error: unknown): string {\r\n if (error instanceof TwError) return error.toString()\r\n if (error instanceof Error) return error.message\r\n return String(error)\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// LRU Cache\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport class LRUCache<K, V> {\r\n private capacity: number\r\n private cache: Map<K, V>\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity\r\n this.cache = new Map()\r\n }\r\n\r\n get(key: K): V | undefined {\r\n if (!this.cache.has(key)) return undefined\r\n const value = this.cache.get(key)!\r\n this.cache.delete(key)\r\n this.cache.set(key, value)\r\n return value\r\n }\r\n\r\n set(key: K, value: V): void {\r\n if (this.cache.has(key)) {\r\n this.cache.delete(key)\r\n } else if (this.cache.size >= this.capacity) {\r\n const firstKey = this.cache.keys().next().value\r\n if (firstKey !== undefined) {\r\n this.cache.delete(firstKey)\r\n }\r\n }\r\n this.cache.set(key, value)\r\n }\r\n\r\n delete(key: K): boolean {\r\n return this.cache.delete(key)\r\n }\r\n\r\n has(key: K): boolean {\r\n return this.cache.has(key)\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear()\r\n }\r\n\r\n entries(): IterableIterator<[K, V]> {\r\n return this.cache.entries()\r\n }\r\n\r\n get size(): number {\r\n return this.cache.size\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Trace Utilities\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TraceSnapshot, TraceSummary } from \"./trace\"\r\nexport {\r\n getHealthColor,\r\n getModeColor,\r\n formatMemory,\r\n formatDuration,\r\n calculateHealth,\r\n getBuildTimeColor,\r\n getMemoryColor,\r\n createTraceSnapshot,\r\n getPipelinePercentages,\r\n} from \"./trace\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Performance Telemetry\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error Codes\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { ErrorCode } from \"./error-codes\"\r\nexport { ERROR_CODES, getSuggestion, formatErrorCode } from \"./error-codes\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Tailwind Compatibility\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport type { TailwindInfo } from \"./compatibility\"\r\nexport { detectTailwind, assertTailwindV4, getTailwindVersion, isTailwindV4 } from \"./compatibility\"\r\n\r\n// ── Native binding schemas (Zod boundary validation)\r\nexport {\r\n NativeScanFileSchema, NativeScanResultSchema,\r\n NativeAnalyzerReportSchema, NativeTransformResultSchema,\r\n NativeCssCompileResultSchema, NativeWatchResultSchema,\r\n NativeCacheEntrySchema, NativeCacheReadResultSchema,\r\n safeParseNative, parseNative,\r\n} from './native-schemas'\r\n\r\n// ── ESM-safe runtime helpers ──────────────────────────────────────────────\r\nexport {\r\n createEsmRequire,\r\n getDirname,\r\n getFilename,\r\n resolveFromRoot,\r\n tryRequire,\r\n resolveNativeNodePath,\r\n} from \"./esmHelpers\"\r\n\r\n// ── Performance telemetry ────────────────────────────────────────────────────\r\nexport {\r\n TelemetryCollector,\r\n getGlobalTelemetry,\r\n resetGlobalTelemetry,\r\n createBuildTimer,\r\n type BuildTelemetry,\r\n type TelemetrySummary,\r\n type BuildPhases,\r\n} from \"./telemetry\"\r\n\r\n// ── Config/JSON schema validation ─────────────────────────────────────────────\r\nexport {\r\n ScanCacheSchema,\r\n ScanCacheClassEntrySchema,\r\n TailwindConfigSchema,\r\n RegistryPluginEntrySchema,\r\n RegistryFileSchema,\r\n PackageJsonSchema,\r\n parseJsonWithSchema,\r\n parseJsonFileWithSchema,\r\n type ScanCache,\r\n type ScanCacheClassEntry,\r\n type TailwindConfig,\r\n type RegistryPluginEntry,\r\n type RegistryFile,\r\n type PackageJson,\r\n} from \"./configSchemas\"\r\n\r\n// ── Worker/bootstrap path resolution ─────────────────────────────────────────\r\nexport {\r\n resolveWorkerPath,\r\n resolveLoaderPath,\r\n type WorkerPathOptions,\r\n type WorkerPathResult,\r\n} from \"./workerResolver\"\r\n\r\n// ── Codegen helpers ───────────────────────────────────────────────────────────\r\nexport {\r\n generateComponentCode,\r\n generateStorybookStory,\r\n generateClassRenameCodemod,\r\n generateBarrelFile,\r\n type ComponentCodegenOptions,\r\n} from \"./codegen\"\r\n\r\n// ── Native binary resolution (QA #1) ─────────────────────────────────────────\r\nexport {\r\n resolveNativeBinary,\r\n formatNativeNotFoundError,\r\n type NativeResolutionResult,\r\n} from \"./native-resolution\"\r\n\r\n// ── Shared observability contract ────────────────────────────────────────────\r\nexport {\r\n createObservabilityClient,\r\n type ClassInspection,\r\n type ClassProperty,\r\n type ClassUsageLocation,\r\n type BuildTrace,\r\n type BuildPhaseTrace,\r\n type DashboardMetrics,\r\n type DashboardSummary,\r\n type ObservabilityClient,\r\n} from \"./observability\"","/**\r\n * Scanner — Rust native bridge\r\n *\r\n * Wraps the Rust scan_workspace and extract_classes_from_source functions.\r\n * Uses @tailwind-styled/shared for native binding resolution.\r\n */\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport {\r\n createDebugLogger,\r\n loadNativeBinding,\r\n resolveNativeBindingCandidates,\r\n TwError,\r\n} from \"@tailwind-styled/shared\"\r\n\r\nconst log = createDebugLogger(\"scanner:native\")\r\n\r\n// ESM-compatible __dirname equivalent\r\nfunction getDirname(): string {\r\n if (typeof __dirname !== \"undefined\") {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\ninterface NativeScannerBinding {\r\n scanWorkspace?: (\r\n root: string,\r\n extensions: string[] | null\r\n ) => {\r\n files: Array<{ file: string; classes: string[]; hash: string }>\r\n totalFiles: number\r\n uniqueClasses: string[] | null\r\n } | null\r\n extractClassesFromSource?: (source: string) => string[] | null\r\n hashFileContent?: (content: string) => string | null\r\n cacheRead?: (cachePath: string) => {\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n version: number\r\n } | null\r\n cacheWrite?: (\r\n cachePath: string,\r\n entries: Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n lastSeenMs?: number\r\n }>\r\n ) => boolean\r\n cachePriority?: (\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs: number\r\n ) => number\r\n batchExtractClasses?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n }>\r\n scanCacheGet?: (filePath: string, contentHash: string) => string[] | null\r\n scanCachePut?: (filePath: string, contentHash: string, classes: string[], mtimeMs: number, size: number) => void\r\n scanCacheInvalidate?: (filePath: string) => void\r\n scanCacheStats?: () => { size: number }\r\n scanFile?: (filePath: string) => {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n }\r\n collectFiles?: (root: string, extensions: string[] | null, ignoreDirs: string[] | null) => string[]\r\n scanFilesBatch?: (filePaths: string[]) => Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n }>\r\n generateSubComponentTypes?: (\r\n root: string,\r\n outputPath: string | null\r\n ) => {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n /** Batch-check file existence + stale age. Menggantikan pruneStaleEntries() */\r\n pruneStaleEntries?: (\r\n entries: Array<{ file: string; lastSeenMs: number }>,\r\n maxAgeMs: number | null,\r\n checkExists: boolean | null\r\n ) => { keptIndices: number[]; removed: number }\r\n /** Hitung class frequency stats dari disk cache. Menggantikan computeCacheStats() */\r\n computeCacheStats?: (\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top: number | null\r\n ) => {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n }\r\n /** Rebuild workspace result — Rust HashSet dedup + sort. Menggantikan JS fallback di mergeResults() */\r\n rebuildWorkspaceResult?: (\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n ) => { files: Array<{ file: string; classes: string[] }>; totalFiles: number; uniqueClasses: string[] }\r\n}\r\n\r\nconst isValidScannerBinding = (module: unknown): module is NativeScannerBinding => {\r\n const candidate = module as Partial<NativeScannerBinding> | null | undefined\r\n return !!(\r\n candidate &&\r\n (candidate.scanWorkspace ||\r\n candidate.extractClassesFromSource ||\r\n candidate.hashFileContent ||\r\n candidate.cacheRead ||\r\n candidate.cacheWrite)\r\n )\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Bridge - Factory Pattern\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createScannerBridgeLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeScannerBinding | null | undefined,\r\n loadError: null as string | null,\r\n candidatePaths: [] as string[],\r\n }\r\n\r\n const throwNativeBindingError = (): never => {\r\n const lines = [\r\n \"FATAL: Native scanner binding not found.\",\r\n \"\",\r\n \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\r\n \"The binding was not found in any of these paths:\",\r\n ..._state.candidatePaths.map((p) => ` - ${p}`),\r\n \"\",\r\n ]\r\n\r\n if (_state.loadError) {\r\n lines.push(\"Load error:\", ` ${_state.loadError}`, \"\")\r\n }\r\n\r\n lines.push(\r\n \"To fix this, run:\",\r\n \" npm run build:rust\",\r\n \"\",\r\n \"This will build the native Rust module from the 'native/' directory.\",\r\n \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\r\n \"and 'npm run build:rust' is executed before running tests or building.\"\r\n )\r\n\r\n throw new TwError(\"rust\", \"SCANNER_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\r\n }\r\n\r\n const scannerGetBinding = (): NativeScannerBinding => {\r\n const cachedBinding = _state.binding\r\n if (cachedBinding !== undefined) {\r\n if (cachedBinding !== null) {\r\n return cachedBinding\r\n }\r\n return throwNativeBindingError()\r\n }\r\n\r\n const runtimeDir = getDirname()\r\n const candidates = resolveNativeBindingCandidates({\r\n runtimeDir,\r\n includeDefaultCandidates: true,\r\n })\r\n\r\n _state.candidatePaths = candidates\r\n\r\n const { binding, loadErrors } = loadNativeBinding<NativeScannerBinding>({\r\n runtimeDir,\r\n candidates,\r\n isValid: isValidScannerBinding,\r\n invalidExportMessage: \"Module loaded but missing expected scanner binding functions\",\r\n })\r\n\r\n if (binding) {\r\n log(`scanner native binding loaded successfully`)\r\n _state.binding = binding\r\n return _state.binding\r\n }\r\n\r\n if (loadErrors.length > 0) {\r\n _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\r\n }\r\n\r\n _state.binding = null\r\n return throwNativeBindingError()\r\n }\r\n\r\n return {\r\n get: scannerGetBinding,\r\n scannerGetBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.loadError = null\r\n _state.candidatePaths = []\r\n },\r\n }\r\n}\r\n\r\nconst scannerBridgeLoader = createScannerBridgeLoader()\r\nconst scannerGetBinding = scannerBridgeLoader.get\r\n\r\nexport const resetScannerBridgeCache = scannerBridgeLoader.reset\r\n\r\nexport function scanWorkspaceNative(\r\n root: string,\r\n extensions?: string[]\r\n): ReturnType<NonNullable<NativeScannerBinding[\"scanWorkspace\"]>> {\r\n return scannerGetBinding().scanWorkspace!(root, extensions ?? null)\r\n}\r\n\r\nexport function extractClassesNative(source: string): string[] {\r\n const result = scannerGetBinding().extractClassesFromSource?.(source)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_EXTRACT_FAILED\",\r\n \"Native extractClassesFromSource returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function hashContentNative(content: string): string {\r\n const result = scannerGetBinding().hashFileContent?.(content)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_HASH_FAILED\",\r\n \"Native hashFileContent returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function isRustCacheAvailable(): boolean {\r\n return true\r\n}\r\n\r\nexport function hasNativeScannerBinding(): boolean {\r\n try {\r\n scannerBridgeLoader.get()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function cacheReadNative(\r\n cachePath: string\r\n): ReturnType<NonNullable<NativeScannerBinding[\"cacheRead\"]>> {\r\n const result = scannerGetBinding().cacheRead?.(cachePath)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_READ_FAILED\",\r\n \"Native cacheRead returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cacheWriteNative(\r\n cachePath: string,\r\n entries: Parameters<NonNullable<NativeScannerBinding[\"cacheWrite\"]>>[1]\r\n): boolean {\r\n const result = scannerGetBinding().cacheWrite?.(cachePath, entries)\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_WRITE_FAILED\",\r\n \"Native cacheWrite returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function cachePriorityNative(\r\n mtimeMs: number,\r\n size: number,\r\n cachedMtimeMs: number,\r\n cachedSize: number,\r\n cachedHitCount: number,\r\n cachedLastSeenMs: number,\r\n nowMs = Date.now()\r\n): number {\r\n const result = scannerGetBinding().cachePriority?.(\r\n mtimeMs,\r\n size,\r\n cachedMtimeMs,\r\n cachedSize,\r\n cachedHitCount,\r\n cachedLastSeenMs,\r\n nowMs\r\n )\r\n if (result === null || result === undefined) {\r\n throw new TwError(\r\n \"rust\",\r\n \"SCANNER_CACHE_PRIORITY_FAILED\",\r\n \"Native cachePriority returned null/undefined\"\r\n )\r\n }\r\n return result\r\n}\r\n\r\nexport function batchExtractClassesNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.batchExtractClasses) {\r\n throw new Error(\"FATAL: Native binding 'batchExtractClasses' is required but not available.\")\r\n }\r\n return binding.batchExtractClasses(filePaths) ?? []\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// In-memory scan cache (Rust DashMap — zero disk I/O)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport function scanCacheGet(filePath: string, contentHash: string): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheGet) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheGet' is required but not available.\")\r\n }\r\n return binding.scanCacheGet(filePath, contentHash) ?? null\r\n}\r\n\r\nexport function scanCachePut(\r\n filePath: string,\r\n contentHash: string,\r\n classes: string[],\r\n mtimeMs: number,\r\n size: number\r\n): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCachePut) {\r\n throw new Error(\"FATAL: Native binding 'scanCachePut' is required but not available.\")\r\n }\r\n binding.scanCachePut(filePath, contentHash, classes, mtimeMs, size)\r\n}\r\n\r\nexport function scanCacheInvalidate(filePath: string): void {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheInvalidate) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheInvalidate' is required but not available.\")\r\n }\r\n binding.scanCacheInvalidate(filePath)\r\n}\r\n\r\nexport function scanCacheStats(): { size: number } {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanCacheStats) {\r\n throw new Error(\"FATAL: Native binding 'scanCacheStats' is required but not available.\")\r\n }\r\n return binding.scanCacheStats() as { size: number }\r\n}\r\nexport function scanFileNative(filePath: string): {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n ok: boolean\r\n error?: string | null\r\n} {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFile) {\r\n throw new Error(\"FATAL: Native binding 'scanFile' is required but not available.\")\r\n }\r\n return binding.scanFile(filePath)\r\n}\r\n/**\r\n * Native file walker — kumpulkan file paths rekursif tanpa baca konten.\r\n *\r\n * Menggantikan `collectFiles()` di `parallel-scanner.ts`.\r\n * Returns null jika binding tidak tersedia (fallback ke JS).\r\n */\r\nexport function collectFilesNative(\r\n root: string,\r\n extensions: string[] | null,\r\n ignoreDirs: string[] | null\r\n): string[] | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.collectFiles) return null\r\n return binding.collectFiles(root, extensions, ignoreDirs)\r\n}\r\n/**\r\n * Batch scan + hash banyak file sekaligus dalam satu NAPI call.\r\n *\r\n * Menggantikan loop `scanFileNative()` per file di worker thread.\r\n * Rust: `par_iter()` via rayon — semua file diproses paralel di thread pool Rust,\r\n * tanpa overhead spawn JS worker untuk setiap chunk.\r\n *\r\n * Kapan pakai ini vs `batchExtractClassesNative`:\r\n * - `scanFilesBatch` → butuh {file, classes, hash} — scan + hash sekaligus\r\n * - `batchExtractClasses` → hanya butuh {file, classes, content_hash, ok, error}\r\n *\r\n * Returns: array dengan panjang sama dengan input. File yang gagal dibaca\r\n * dikembalikan dengan classes:[] dan hash:\"\".\r\n */\r\nexport function scanFilesBatchNative(filePaths: string[]): Array<{\r\n file: string\r\n classes: string[]\r\n hash: string\r\n}> {\r\n const binding = scannerGetBinding()\r\n if (!binding.scanFilesBatch) {\r\n // Fallback: panggil scanFile satu per satu\r\n return filePaths.map((fp) => {\r\n try {\r\n const r = binding.scanFile?.(fp)\r\n return r\r\n ? { file: r.file, classes: r.classes, hash: r.hash ?? \"\" }\r\n : { file: fp, classes: [], hash: \"\" }\r\n } catch {\r\n return { file: fp, classes: [], hash: \"\" }\r\n }\r\n })\r\n }\r\n return binding.scanFilesBatch(filePaths)\r\n}\r\n \r\n/**\r\n * Scan workspace rekursif dan generate TypeScript type declarations\r\n * untuk setiap sub-component yang ditemukan.\r\n *\r\n * Menggantikan operasi scan manual + string codegen di JS.\r\n * Rust: walkdir + regex class extraction + type codegen dalam satu pass.\r\n *\r\n * @param root Direktori root workspace\r\n * @param outputPath Path output file .d.ts (opsional — kalau null, hanya return result)\r\n */\r\nexport function generateSubComponentTypesNative(\r\n root: string,\r\n outputPath?: string\r\n): {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.generateSubComponentTypes) return null\r\n return binding.generateSubComponentTypes(root, outputPath ?? null) as {\r\n components: Array<{ name: string; classes: string[] }>\r\n outputPath: string | null\r\n totalFiles: number\r\n }\r\n}\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// pruneStaleEntries + computeCacheStats — native wrappers\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Batch-check file existence + stale age menggunakan Rust syscalls.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan loop `existsSync()` di `pruneStaleEntries()` (cache-native.ts).\r\n */\r\nexport function pruneStaleEntriesNative(\r\n entries: Array<{ file: string; lastSeenMs?: number }>,\r\n maxAgeMs?: number,\r\n checkExists?: boolean\r\n): { keptIndices: number[]; removed: number } | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.pruneStaleEntries) return null\r\n return binding.pruneStaleEntries(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs ?? 0 })),\r\n maxAgeMs ?? null,\r\n checkExists ?? null\r\n )\r\n}\r\n\r\n/**\r\n * Hitung class frequency + stats dari disk cache entries menggunakan Rust.\r\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\r\n *\r\n * Menggantikan `computeCacheStats()` di `cache-native.ts`.\r\n */\r\nexport function rebuildWorkspaceResultNative(\r\n files: Array<{ file: string; classes: readonly string[] }>\r\n): { files: typeof files; totalFiles: number; uniqueClasses: string[] } | null {\r\n const binding = scannerBridgeLoader.get()\r\n if (!binding?.rebuildWorkspaceResult) return null\r\n try {\r\n return binding.rebuildWorkspaceResult(files)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function computeCacheStatsNative(\r\n filesClasses: string[][],\r\n sizes: number[],\r\n top?: number\r\n): {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntryX100: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n} | null {\r\n const binding = scannerGetBinding()\r\n if (!binding.computeCacheStats) return null\r\n return binding.computeCacheStats(filesClasses, sizes, top ?? null)\r\n}","import fs from \"node:fs\"\r\nimport { createRequire } from \"node:module\"\r\nimport path from \"node:path\"\r\nimport { fileURLToPath } from \"node:url\"\r\nimport { Worker } from \"node:worker_threads\"\r\nimport { createLogger } from \"@tailwind-styled/shared\"\r\nimport { filePriority, type NativeCacheEntry, readCache, writeCache } from \"./cache-native\"\r\nimport { hashContentNative, isRustCacheAvailable } from \"./native-bridge\"\r\nimport { scanWorkspaceParallel } from \"./parallel-scanner\"\r\nimport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n type ScanFileResult,\r\n type ScanWorkspaceOptions,\r\n type ScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nconst log = createLogger(\"scanner\")\r\n\r\nconst SCAN_WORKER_TIMEOUT_MS = 120_000\r\n\r\ntype NativeParsedClass = { raw?: string }\r\n// ClassExtractResult shape dari Rust (napi-rs export)\r\ntype NativeClassExtractResult = {\r\n classes: string[]\r\n componentNames: string[]\r\n hasTwUsage: boolean\r\n hasUseClient: boolean\r\n imports: string[]\r\n}\r\ntype NativeParserBinding = {\r\n parse_classes?: (input: string) => NativeParsedClass[]\r\n parseClasses?: (input: string) => NativeParsedClass[]\r\n // Rust returns ClassExtractResult object, bukan plain string[]\r\n extractClassesFromSource?: (source: string) => NativeClassExtractResult | string[] | null\r\n batchExtractClassesNative?: (filePaths: string[]) => Array<{\r\n file: string; classes: string[]; contentHash: string; ok: boolean; error?: string\r\n }>\r\n}\r\n\r\nfunction getRuntimeDir(): string {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n return process.cwd()\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Native Parser Binding - Factory Pattern (no let!)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\nconst createNativeParserLoader = () => {\r\n const _state = {\r\n binding: undefined as NativeParserBinding | null | undefined,\r\n initError: null as string | null,\r\n }\r\n\r\n const debugNative = (message: string): void => {\r\n log.debug(`[native] ${message}`)\r\n }\r\n\r\n const loadNativeParserBinding = (): NativeParserBinding | null => {\r\n if (_state.binding !== undefined) return _state.binding\r\n\r\n const runtimeDir = getRuntimeDir()\r\n const req = createRequire(path.join(runtimeDir, \"noop.cjs\"))\r\n\r\n const candidates = [\r\n // ── binaryName baru: tailwind-styled-native (napi-rs naming) ──\r\n // cwd = repo root saat run dari root, atau package dir saat workspaces\r\n path.resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${process.platform}-${process.arch}.node`),\r\n path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${process.platform}-${process.arch}-gnu.node`),\r\n // runtimeDir = dist/ → naik 4 level ke repo root\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${process.platform}-${process.arch}-gnu.node`),\r\n // 3 level fallback (jika package di-nest lebih dangkal)\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${process.platform}-${process.arch}-gnu.node`),\r\n // ── binaryName lama: tailwind_styled_parser (backward compat) ──\r\n path.resolve(process.cwd(), \"native/tailwind_styled_parser.node\"),\r\n path.resolve(process.cwd(), \"native/build/Release/tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\r\n path.resolve(\r\n runtimeDir,\r\n \"..\",\r\n \"..\",\r\n \"..\",\r\n \"native\",\r\n \"build\",\r\n \"Release\",\r\n \"tailwind_styled_parser.node\"\r\n ),\r\n ]\r\n\r\n for (const fullPath of candidates) {\r\n if (!fs.existsSync(fullPath)) continue\r\n try {\r\n const required = req(fullPath) as NativeParserBinding\r\n if (\r\n required &&\r\n (typeof required.extractClassesFromSource === \"function\" ||\r\n typeof required.parseClasses === \"function\" ||\r\n typeof required.parse_classes === \"function\")\r\n ) {\r\n _state.binding = required\r\n debugNative(`using native parser from ${fullPath}`)\r\n return _state.binding\r\n }\r\n } catch (error) {\r\n _state.initError = error instanceof Error ? error.message : String(error)\r\n }\r\n }\r\n\r\n _state.binding = null\r\n if (!_state.initError) {\r\n _state.initError = \"native .node binding not found\"\r\n }\r\n debugNative(`native binding not available: ${_state.initError}`)\r\n return _state.binding\r\n }\r\n\r\n return {\r\n get: loadNativeParserBinding,\r\n reset: (): void => {\r\n _state.binding = undefined\r\n _state.initError = null\r\n },\r\n }\r\n}\r\n\r\nconst nativeParserLoader = createNativeParserLoader()\r\n\r\nfunction normalizeWithNativeParser(tokens: string[]): string[] {\r\n const binding = nativeParserLoader.get()\r\n const parseClasses = binding?.parseClasses ?? binding?.parse_classes\r\n if (!binding || typeof parseClasses !== \"function\") {\r\n throw new Error(\r\n \"Native parser binding is required but not available. Run 'npm run build:rust' to build it.\"\r\n )\r\n }\r\n\r\n try {\r\n const parsed = parseClasses(tokens.join(\" \"))\r\n const normalized = parsed.map((item) => item.raw?.trim() ?? \"\").filter(Boolean)\r\n return Array.from(new Set(normalized))\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error)\r\n throw new Error(`Native parser failed: ${errorMessage}. Run 'npm run build:rust' to rebuild.`)\r\n }\r\n}\r\n\r\nexport type { ScanFileResult, ScanWorkspaceOptions, ScanWorkspaceResult } from \"./schemas\"\r\nexport {\r\n parseScannerWorkerMessage,\r\n parseScanWorkspaceOptions,\r\n parseScanWorkspaceResult,\r\n} from \"./schemas\"\r\n\r\nexport const DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\r\nexport const DEFAULT_IGNORES = [\"node_modules\", \".git\", \".next\", \"dist\", \"out\", \".turbo\", \".cache\"]\r\n\r\nfunction resolveScannerWorkerModulePath(): string | null {\r\n const runtimeDir = (() => {\r\n if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\r\n return __dirname\r\n }\r\n // ESM fallback\r\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\r\n return path.dirname(fileURLToPath(import.meta.url))\r\n }\r\n // Final fallback\r\n return process.cwd()\r\n })()\r\n\r\n const candidates = [\r\n path.resolve(runtimeDir, \"worker.cjs\"),\r\n path.resolve(runtimeDir, \"worker.js\"),\r\n path.resolve(runtimeDir, \"worker.ts\"),\r\n ]\r\n\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate\r\n }\r\n\r\n return null\r\n}\r\n\r\nfunction scanWorkspaceInWorker(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const modulePath = resolveScannerWorkerModulePath()\r\n if (!modulePath) {\r\n return Promise.reject(new Error(\"scanner worker module path could not be resolved\"))\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const settleState = { settled: false }\r\n\r\n const worker = new Worker(modulePath, { workerData: { rootDir, options: normalizedOptions } })\r\n\r\n const timeout = setTimeout(() => {\r\n if (!settleState.settled) {\r\n settleState.settled = true\r\n void worker.terminate()\r\n reject(new Error(`scanner worker timed out after ${SCAN_WORKER_TIMEOUT_MS}ms`))\r\n }\r\n }, SCAN_WORKER_TIMEOUT_MS)\r\n\r\n const finish = (callback: () => void) => {\r\n if (settleState.settled) return\r\n settleState.settled = true\r\n clearTimeout(timeout)\r\n callback()\r\n }\r\n\r\n worker.once(\"message\", (payload: unknown) => {\r\n const message = parseScannerWorkerMessage(payload)\r\n finish(() => {\r\n if (message?.ok) {\r\n resolve(parseScanWorkspaceResult(message.result))\r\n return\r\n }\r\n reject(new Error(message?.error ?? \"scanner worker failed without an error message\"))\r\n })\r\n })\r\n\r\n worker.once(\"error\", (error: Error) => {\r\n finish(() => reject(error))\r\n })\r\n\r\n worker.once(\"exit\", (code: number) => {\r\n if (code !== 0) {\r\n finish(() => reject(new Error(`scanner worker exited with code ${code}`)))\r\n }\r\n })\r\n })\r\n}\r\n\r\nfunction buildExtensionSet(includeExtensions: string[]): Set<string> {\r\n return new Set(includeExtensions)\r\n}\r\n\r\nfunction collectCandidates(\r\n rootDir: string,\r\n ignoreDirectories: Set<string>,\r\n extensionSet: Set<string>\r\n): string[] {\r\n const candidates: string[] = []\r\n const directories = [rootDir]\r\n\r\n while (directories.length > 0) {\r\n const currentDir = directories.pop()\r\n if (!currentDir) continue\r\n\r\n const entries = (() => {\r\n try {\r\n return fs.readdirSync(currentDir, { withFileTypes: true })\r\n } catch {\r\n return [] as fs.Dirent[]\r\n }\r\n })()\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name)\r\n\r\n if (entry.isDirectory()) {\r\n if (!ignoreDirectories.has(entry.name)) directories.push(fullPath)\r\n continue\r\n }\r\n\r\n if (!entry.isFile()) continue\r\n if (!extensionSet.has(path.extname(entry.name))) continue\r\n candidates.push(fullPath)\r\n }\r\n }\r\n\r\n return candidates\r\n}\r\n\r\nfunction toCacheSize(size: number): number {\r\n if (!Number.isFinite(size)) return 0\r\n const normalized = Math.max(0, Math.trunc(size))\r\n return Math.min(normalized, 0xffffffff)\r\n}\r\n\r\nexport function scanSource(source: string): string[] {\r\n const nativeBinding = nativeParserLoader.get()\r\n if (nativeBinding?.extractClassesFromSource) {\r\n const result = nativeBinding.extractClassesFromSource(source)\r\n // Rust mengembalikan ClassExtractResult { classes: string[], ... }\r\n // bukan plain string[] — handle kedua kemungkinan untuk backward compat\r\n if (Array.isArray(result)) {\r\n return Array.from(new Set(result.filter(Boolean)))\r\n }\r\n if (result !== null && result !== undefined && Array.isArray((result as NativeClassExtractResult).classes)) {\r\n return Array.from(new Set((result as NativeClassExtractResult).classes.filter(Boolean)))\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"FATAL: Native parser binding is required but not available.\\n\" +\r\n \"This package requires native Rust bindings.\\n\\n\" +\r\n \"Resolution steps:\\n\" +\r\n \"1. Build the native Rust module: npm run build:rust\"\r\n )\r\n}\r\n\r\nexport function isScannableFile(filePath: string, includeExtensions = DEFAULT_EXTENSIONS): boolean {\r\n return includeExtensions.includes(path.extname(filePath))\r\n}\r\n\r\nexport function scanFile(filePath: string): ScanFileResult {\r\n const { scanFileNative } = require(\"./native-bridge\")\r\n const result = scanFileNative(filePath) as {\r\n file: string; classes: string[]; hash: string; ok: boolean; error?: string | null\r\n }\r\n if (!result.ok) {\r\n throw new Error(`scanFile failed for ${filePath}: ${result.error ?? \"unknown error\"}`)\r\n }\r\n return {\r\n file: result.file,\r\n classes: result.classes,\r\n ...(result.hash ? { hash: result.hash } : {}),\r\n }\r\n}\r\n\r\nexport function scanWorkspace(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): ScanWorkspaceResult {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n const includeExtensions = normalizedOptions.includeExtensions ?? DEFAULT_EXTENSIONS\r\n const extensionSet = buildExtensionSet(includeExtensions)\r\n const ignoreDirectories = new Set(normalizedOptions.ignoreDirectories ?? DEFAULT_IGNORES)\r\n const useCache = normalizedOptions.useCache ?? true\r\n const _smartInvalidation = normalizedOptions.smartInvalidation ?? true\r\n\r\n const files: ScanFileResult[] = []\r\n const unique = new Set<string>()\r\n const candidates = collectCandidates(rootDir, ignoreDirectories, extensionSet)\r\n\r\n const processResult = (result: ScanFileResult) => {\r\n files.push(result)\r\n for (const cls of result.classes) unique.add(cls)\r\n }\r\n\r\n \r\n const { scanWorkspaceNative } = require(\"./native-bridge\")\r\n\r\n if (!normalizedOptions.cacheDir && !useCache) {\r\n const nativeResult = scanWorkspaceNative(rootDir, includeExtensions)\r\n if (nativeResult) {\r\n return parseScanWorkspaceResult({\r\n files: nativeResult.files.map((f: { file: string; classes: string[]; hash?: string }) => ({\r\n file: f.file,\r\n classes: f.classes,\r\n ...(f.hash ? { hash: f.hash } : {}),\r\n })),\r\n totalFiles: nativeResult.totalFiles,\r\n uniqueClasses: nativeResult.uniqueClasses,\r\n })\r\n }\r\n }\r\n\r\n if (useCache && isRustCacheAvailable()) {\r\n const cacheEntries: NativeCacheEntry[] = (() => {\r\n try {\r\n return readCache(rootDir, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(\r\n `cache read failed, continuing without persisted cache: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return []\r\n }\r\n })()\r\n\r\n const cacheMap = new Map(cacheEntries.map((entry) => [entry.file, entry]))\r\n const nowMs = Date.now()\r\n const ranked: Array<{\r\n filePath: string\r\n stat: fs.Stats\r\n size: number\r\n cached?: NativeCacheEntry\r\n priority: number\r\n }> = []\r\n\r\n for (const filePath of candidates) {\r\n const stat = (() => {\r\n try {\r\n return fs.statSync(filePath)\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!stat) continue\r\n\r\n const size = toCacheSize(stat.size)\r\n const cached = cacheMap.get(filePath)\r\n const priority = filePriority(\r\n stat.mtimeMs,\r\n size,\r\n cached\r\n ? {\r\n mtimeMs: cached.mtimeMs,\r\n size: cached.size,\r\n hitCount: cached.hitCount,\r\n lastSeenMs: 0,\r\n }\r\n : undefined,\r\n nowMs\r\n )\r\n\r\n ranked.push({ filePath, stat, size, cached, priority })\r\n }\r\n\r\n ranked.sort((a, b) => b.priority - a.priority)\r\n\r\n const updatedEntries: NativeCacheEntry[] = []\r\n\r\n for (const { filePath, stat, size, cached } of ranked) {\r\n const content = (() => {\r\n try {\r\n return fs.readFileSync(filePath, \"utf8\")\r\n } catch {\r\n return null\r\n }\r\n })()\r\n if (!content) continue\r\n\r\n const hash = hashContentNative(content)\r\n if (\r\n cached &&\r\n cached.hash === hash &&\r\n cached.mtimeMs === stat.mtimeMs &&\r\n cached.size === size\r\n ) {\r\n log.debug(`cache HIT ${filePath}`)\r\n processResult({ file: filePath, classes: cached.classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes: cached.classes,\r\n hash: cached.hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: (cached.hitCount ?? 0) + 1,\r\n })\r\n continue\r\n }\r\n\r\n log.debug(`cache MISS ${filePath}`)\r\n const classes = scanSource(content)\r\n processResult({ file: filePath, classes })\r\n updatedEntries.push({\r\n file: filePath,\r\n classes,\r\n hash,\r\n mtimeMs: stat.mtimeMs,\r\n size,\r\n hitCount: 1,\r\n })\r\n }\r\n\r\n try {\r\n writeCache(rootDir, updatedEntries, normalizedOptions.cacheDir)\r\n } catch (error) {\r\n log.debug(`cache write failed: ${error instanceof Error ? error.message : String(error)}`)\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n }\r\n\r\n // Fast path: gunakan Rust batch extraction jika tersedia (parallel, tanpa GC)\r\n const batchNative = nativeParserLoader.get()?.batchExtractClassesNative\r\n if (batchNative) {\r\n const batchResults = batchNative(candidates)\r\n for (const r of batchResults ?? []) {\r\n if (r.ok) processResult({ file: r.file, classes: r.classes })\r\n }\r\n } else {\r\n for (const filePath of candidates) {\r\n processResult(scanFile(filePath))\r\n }\r\n }\r\n\r\n return parseScanWorkspaceResult({\r\n files,\r\n totalFiles: files.length,\r\n uniqueClasses: Array.from(unique).sort(),\r\n })\r\n}\r\n\r\nexport async function scanWorkspaceAsync(\r\n rootDir: string,\r\n options: ScanWorkspaceOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const normalizedOptions = parseScanWorkspaceOptions(options)\r\n\r\n // Large workspaces: use native parallel scanner (multiple workers + Rust rayon)\r\n try {\r\n return await scanWorkspaceParallel(rootDir, {\r\n extensions: normalizedOptions.includeExtensions,\r\n ignoreDirs: normalizedOptions.ignoreDirectories,\r\n }) as ScanWorkspaceResult\r\n } catch (parallelError) {\r\n log.debug(\r\n `parallel scan failed, retrying with single worker: ${\r\n parallelError instanceof Error ? parallelError.message : String(parallelError)\r\n }`\r\n )\r\n }\r\n\r\n // Fallback: single worker thread (still native)\r\n try {\r\n return await scanWorkspaceInWorker(rootDir, normalizedOptions)\r\n } catch (error) {\r\n log.debug(\r\n `worker scan failed, retrying with sync native scanner: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n )\r\n return scanWorkspace(rootDir, normalizedOptions)\r\n }\r\n}\r\nexport { extractClassesNative, batchExtractClassesNative } from \"./native-bridge\"","/**\r\n * tailwind-styled-v4 — Scanner Cache (Rust-backed)\r\n *\r\n * This module REQUIRES native Rust bindings and will FAIL LOUDLY if they are not available.\r\n * NO JavaScript fallback is provided.\r\n */\r\n\r\nimport path from \"node:path\"\r\nimport {\r\n cachePriorityNative,\r\n cacheReadNative,\r\n cacheWriteNative,\r\n scanCacheGet,\r\n scanCachePut,\r\n scanCacheInvalidate,\r\n scanCacheStats,\r\n pruneStaleEntriesNative,\r\n computeCacheStatsNative,\r\n} from \"./native-bridge\"\r\n\r\nfunction defaultCachePath(rootDir: string, cacheDir?: string): string {\r\n const dir = cacheDir\r\n ? path.resolve(rootDir, cacheDir)\r\n : path.join(process.cwd(), \".cache\", \"tailwind-styled\")\r\n return path.join(dir, \"scanner-cache.json\")\r\n}\r\n\r\n// ── Public API ────────────────────────────────────────────────────────────────\r\n\r\nexport interface NativeCacheEntry {\r\n file: string\r\n classes: string[]\r\n hash: string\r\n mtimeMs: number\r\n size: number\r\n hitCount: number\r\n /** Terakhir file ditemukan di filesystem (ms epoch). Digunakan untuk stale cleanup. */\r\n lastSeenMs?: number\r\n}\r\n\r\n/** Default stale threshold — 7 hari */\r\nconst STALE_THRESHOLD_MS = 7 * 24 * 60 * 60 * 1000\r\n\r\n/**\r\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\r\n * QA #5a: stale entry cleanup\r\n */\r\n/**\r\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\r\n *\r\n * Native-first: Rust batch-check semua file dalam satu pass tanpa\r\n * event loop overhead. JS fallback: existsSync loop per file.\r\n */\r\nexport function pruneStaleEntries(\r\n entries: NativeCacheEntry[],\r\n opts: { maxAgeMs?: number; rootDir?: string } = {}\r\n): { pruned: NativeCacheEntry[]; removed: number } {\r\n // Native-first: satu NAPI call — Rust check semua files sekaligus\r\n const nativeResult = pruneStaleEntriesNative(\r\n entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs })),\r\n opts.maxAgeMs,\r\n !!opts.rootDir // hanya check existence jika rootDir disediakan\r\n )\r\n\r\n if (nativeResult !== null) {\r\n const pruned = nativeResult.keptIndices.map((i) => entries[i])\r\n return { pruned, removed: nativeResult.removed }\r\n }\r\n\r\n // JS fallback\r\n const maxAge = opts.maxAgeMs ?? STALE_THRESHOLD_MS\r\n const now = Date.now()\r\n const { existsSync } = require(\"node:fs\") as typeof import(\"node:fs\")\r\n\r\n const pruned = entries.filter((entry) => {\r\n if (opts.rootDir && !existsSync(entry.file)) return false\r\n if (entry.lastSeenMs && now - entry.lastSeenMs > maxAge) return false\r\n return true\r\n })\r\n\r\n return { pruned, removed: entries.length - pruned.length }\r\n}\r\n\r\n/**\r\n * Read scanner cache from disk using Rust parser.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function readCache(rootDir: string, cacheDir?: string): NativeCacheEntry[] {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n const result = cacheReadNative(cachePath)\r\n if (!result) return []\r\n\r\n return result.entries.map((e) => ({\r\n file: e.file,\r\n classes: e.classes,\r\n hash: e.hash,\r\n mtimeMs: e.mtimeMs,\r\n size: e.size,\r\n hitCount: e.hitCount,\r\n lastSeenMs: e.lastSeenMs,\r\n }))\r\n}\r\n\r\n/**\r\n * Write scanner cache to disk using Rust serialiser.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function writeCache(rootDir: string, entries: NativeCacheEntry[], cacheDir?: string): void {\r\n const cachePath = defaultCachePath(rootDir, cacheDir)\r\n\r\n const success = cacheWriteNative(cachePath, entries)\r\n if (!success) {\r\n throw new Error(\r\n \"Native cacheWrite failed. Run 'npm run build:rust' to rebuild native bindings.\"\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Compute priority score for a file using the Rust SmartCache algorithm.\r\n * Higher = process first.\r\n * REQUIRES native binding - throws if unavailable.\r\n */\r\nexport function filePriority(\r\n mtimeMs: number,\r\n size: number,\r\n cached: { mtimeMs: number; size: number; hitCount: number; lastSeenMs?: number } | undefined,\r\n nowMs = Date.now()\r\n): number {\r\n return cachePriorityNative(\r\n mtimeMs,\r\n size,\r\n cached?.mtimeMs ?? 0,\r\n cached?.size ?? 0,\r\n cached?.hitCount ?? 0,\r\n cached?.lastSeenMs ?? 0,\r\n nowMs\r\n )\r\n}\r\n\r\nexport interface CacheStats {\r\n totalEntries: number\r\n totalClasses: number\r\n totalSizeBytes: number\r\n avgClassesPerEntry: number\r\n mostUsedClasses: Array<{ class: string; count: number }>\r\n}\r\n\r\n/**\r\n * Rust in-memory cache — hot path untuk per-file lookup saat scan.\r\n * Jauh lebih cepat dari disk JSON cache untuk file yang baru saja di-scan.\r\n */\r\nexport const hotCache = {\r\n get: scanCacheGet,\r\n put: scanCachePut,\r\n invalidate: scanCacheInvalidate,\r\n} as const\r\n\r\n/**\r\n * Stats dari Rust in-memory cache (DashMap).\r\n * `size` = jumlah entry saat ini di cache.\r\n */\r\nexport function getHotCacheStats(): { size: number } {\r\n return scanCacheStats()\r\n}\r\n\r\n/**\r\n * Compute disk cache stats dari entries (diperlukan untuk mostUsedClasses).\r\n * Native scanCacheStats hanya return size — detail stats tetap dari disk cache entries.\r\n */\r\n/**\r\n * Compute disk cache stats dari entries (diperlukan untuk mostUsedClasses).\r\n *\r\n * Native-first: Rust HashMap count + partial sort — ~3× lebih cepat\r\n * dari JS Map untuk workspace besar (5000+ entries).\r\n * JS fallback: manual Map count + .sort().\r\n */\r\nexport function computeCacheStats(entries: NativeCacheEntry[]): CacheStats {\r\n if (entries.length === 0) {\r\n return { totalEntries: 0, totalClasses: 0, totalSizeBytes: 0, avgClassesPerEntry: 0, mostUsedClasses: [] }\r\n }\r\n\r\n // Native-first\r\n const nativeResult = computeCacheStatsNative(\r\n entries.map((e) => e.classes),\r\n entries.map((e) => e.size),\r\n 10\r\n )\r\n\r\n if (nativeResult !== null) {\r\n return {\r\n totalEntries: nativeResult.totalEntries,\r\n totalClasses: nativeResult.totalClasses,\r\n totalSizeBytes: nativeResult.totalSizeBytes,\r\n avgClassesPerEntry: nativeResult.avgClassesPerEntryX100 / 100,\r\n mostUsedClasses: nativeResult.mostUsedClasses,\r\n }\r\n }\r\n\r\n throw new Error(\"FATAL: Native binding 'computeCacheStats' is required but not available.\")\r\n}","/**\r\n * Native parallel scanner menggunakan worker threads + Rust batchExtractClasses.\r\n *\r\n * Untuk workspaces besar (200+ files), file-list dibagi ke beberapa worker.\r\n * Setiap worker memanggil native `batchExtractClasses` yang sudah memakai\r\n * rayon par_iter di sisi Rust — sehingga parallelism terjadi di dua level:\r\n * 1. Multiple worker threads (TS/Node level)\r\n * 2. rayon par_iter di dalam setiap worker (Rust level)\r\n *\r\n * Untuk workspace kecil (< PARALLEL_THRESHOLD), langsung panggil batchExtractClasses\r\n * di main thread — overhead spawn worker tidak worth it.\r\n */\r\n\r\nimport { Worker, isMainThread, parentPort, workerData } from \"node:worker_threads\"\r\nimport fs from \"node:fs\"\r\nimport path from \"node:path\"\r\nimport { availableParallelism } from \"node:os\"\r\nimport { fileURLToPath } from \"node:url\"\r\n\r\nimport { isScannableFile, DEFAULT_EXTENSIONS, DEFAULT_IGNORES } from \"./index\"\r\nimport { batchExtractClassesNative, collectFilesNative, rebuildWorkspaceResultNative } from \"./native-bridge\"\r\nimport type { ScanWorkspaceResult, ScanFileResult } from \"./types\"\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Constants\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst PARALLEL_THRESHOLD = 50\r\nconst DEFAULT_CHUNK_SIZE = 150\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport interface ParallelScanOptions {\r\n extensions?: string[]\r\n ignoreDirs?: string[]\r\n maxWorkers?: number\r\n chunkSize?: number\r\n}\r\n\r\ninterface NativeBatchResult {\r\n file: string\r\n classes: string[]\r\n content_hash: string\r\n ok: boolean\r\n error?: string | null\r\n}\r\n\r\ninterface WorkerInput {\r\n filePaths: string[]\r\n}\r\n\r\ntype WorkerOutput =\r\n | { ok: true; results: NativeBatchResult[] }\r\n | { ok: false; error: string }\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// File collection — native-first, JS fallback\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Kumpulkan semua file yang cocok secara rekursif dari rootDir.\r\n *\r\n * Native: satu Rust walk tanpa JS event loop overhead — 2–5× lebih cepat\r\n * untuk workspace besar. Tidak membaca konten file, hanya paths.\r\n *\r\n * JS fallback: dipakai jika native binding tidak tersedia (mis. test env).\r\n */\r\nfunction collectFiles(rootDir: string, extensions: string[], ignoreDirs: string[]): string[] {\r\n // Native-first: satu NAPI call menggantikan seluruh rekursi JS\r\n const native = collectFilesNative(rootDir, extensions, ignoreDirs)\r\n if (native !== null) return native\r\n\r\n // JS fallback\r\n const files: string[] = []\r\n\r\n function walk(dir: string): void {\r\n let entries: fs.Dirent[]\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true })\r\n } catch {\r\n return\r\n }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name)\r\n const rel = path.relative(rootDir, fullPath)\r\n if (entry.isDirectory()) {\r\n const ignored = ignoreDirs.some((d) => entry.name === d || rel.startsWith(d + path.sep))\r\n if (!ignored) walk(fullPath)\r\n } else if (isScannableFile(entry.name, extensions)) {\r\n files.push(fullPath)\r\n }\r\n }\r\n }\r\n\r\n walk(rootDir)\r\n return files\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Merge results\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction mergeResults(batchResults: NativeBatchResult[]): ScanWorkspaceResult {\r\n const files: ScanFileResult[] = batchResults.map((r) => ({\r\n file: r.file,\r\n classes: r.classes,\r\n hash: r.content_hash,\r\n }))\r\n // Native-first: Rust HashSet dedup + sort_unstable (satu pass, zero GC)\r\n const native = rebuildWorkspaceResultNative(files)\r\n if (native) return native\r\n // Fallback — hanya aktif jika binding belum loaded (e.g. test env)\r\n const unique = new Set(files.flatMap((f) => f.classes))\r\n return { files, totalFiles: files.length, uniqueClasses: Array.from(unique).sort() }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Worker thread entry point\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nif (!isMainThread && parentPort) {\r\n const { filePaths } = workerData as WorkerInput\r\n try {\r\n const results = batchExtractClassesNative(filePaths)\r\n const msg: WorkerOutput = { ok: true, results }\r\n parentPort.postMessage(msg)\r\n } catch (error) {\r\n const msg: WorkerOutput = {\r\n ok: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }\r\n parentPort.postMessage(msg)\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// __filename compat CJS + ESM\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\ndeclare const __filename: string | undefined\r\nconst _workerFilename =\r\n typeof __filename !== \"undefined\" ? __filename : fileURLToPath(import.meta.url)\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Spawn worker for one chunk\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction runChunkInWorker(filePaths: string[]): Promise<NativeBatchResult[]> {\r\n return new Promise((resolve, reject) => {\r\n const worker = new Worker(_workerFilename, {\r\n workerData: { filePaths } satisfies WorkerInput,\r\n })\r\n worker.once(\"message\", (payload: WorkerOutput) => {\r\n if (payload.ok) {\r\n resolve(payload.results)\r\n } else {\r\n reject(new Error(payload.error ?? \"parallel-scanner worker failed\"))\r\n }\r\n })\r\n worker.once(\"error\", reject)\r\n worker.once(\"exit\", (code) => {\r\n if (code !== 0) reject(new Error(`parallel-scanner worker exited with code ${code}`))\r\n })\r\n })\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Public API\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport async function scanWorkspaceParallel(\r\n rootDir: string,\r\n options: ParallelScanOptions = {}\r\n): Promise<ScanWorkspaceResult> {\r\n const {\r\n extensions = DEFAULT_EXTENSIONS,\r\n ignoreDirs = DEFAULT_IGNORES,\r\n maxWorkers = Math.max(1, availableParallelism() - 1),\r\n chunkSize = DEFAULT_CHUNK_SIZE,\r\n } = options\r\n\r\n const files = collectFiles(path.resolve(rootDir), extensions, ignoreDirs)\r\n\r\n if (files.length < PARALLEL_THRESHOLD) {\r\n return mergeResults(batchExtractClassesNative(files))\r\n }\r\n\r\n const chunks: string[][] = []\r\n for (let i = 0; i < files.length; i += chunkSize) {\r\n chunks.push(files.slice(i, i + chunkSize))\r\n }\r\n\r\n const allResults: NativeBatchResult[] = []\r\n for (let i = 0; i < chunks.length; i += maxWorkers) {\r\n const batch = chunks.slice(i, i + maxWorkers)\r\n const batchResults = await Promise.all(batch.map(runChunkInWorker))\r\n allResults.push(...batchResults.flat())\r\n }\r\n\r\n return mergeResults(allResults)\r\n}","import { z } from \"zod\"\r\nimport { TwError } from \"@tailwind-styled/shared\"\r\n\r\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\r\n path.length > 0\r\n ? path\r\n .map((segment) =>\r\n typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\r\n )\r\n .join(\".\")\r\n : \"<root>\"\r\n\r\nconst formatIssues = (error: z.ZodError): string =>\r\n error.issues\r\n .map((issue) => {\r\n const path = formatIssuePath(issue.path)\r\n return `${path}: ${issue.message}`\r\n })\r\n .join(\"; \")\r\n\r\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\r\n const parsed = schema.safeParse(data)\r\n if (parsed.success) return parsed.data\r\n const details = formatIssues(parsed.error)\r\n throw new TwError(\r\n \"validation\",\r\n \"SCHEMA_VALIDATION_FAILED\",\r\n details ? `${label}: ${details}` : label,\r\n parsed.error\r\n )\r\n}\r\n\r\nconst NonNegativeIntegerSchema = z.number().int().min(0)\r\n\r\nexport const ScanWorkspaceOptionsSchema = z.object({\r\n includeExtensions: z.array(z.string()).optional(),\r\n ignoreDirectories: z.array(z.string()).optional(),\r\n useCache: z.boolean().optional(),\r\n cacheDir: z.string().min(1).optional(),\r\n smartInvalidation: z.boolean().optional(),\r\n})\r\n\r\nexport type ScanWorkspaceOptions = z.infer<typeof ScanWorkspaceOptionsSchema>\r\n\r\nexport const ScanFileResultSchema = z.object({\r\n file: z.string(),\r\n classes: z.array(z.string()),\r\n hash: z.string().optional(),\r\n})\r\n\r\nexport type ScanFileResult = z.infer<typeof ScanFileResultSchema>\r\n\r\nexport const ScanWorkspaceResultSchema = z\r\n .object({\r\n files: z.array(ScanFileResultSchema),\r\n totalFiles: NonNegativeIntegerSchema,\r\n uniqueClasses: z.array(z.string()),\r\n })\r\n .refine((value) => value.totalFiles === value.files.length, {\r\n message: \"scan result totalFiles must match files.length\",\r\n path: [\"totalFiles\"],\r\n })\r\n\r\nexport type ScanWorkspaceResult = z.infer<typeof ScanWorkspaceResultSchema>\r\n\r\nexport const ScannerWorkerRequestSchema = z.object({\r\n rootDir: z.string().min(1),\r\n options: ScanWorkspaceOptionsSchema.optional(),\r\n})\r\n\r\nexport type ScannerWorkerRequest = z.infer<typeof ScannerWorkerRequestSchema>\r\n\r\nexport const ScannerWorkerSuccessMessageSchema = z.object({\r\n ok: z.literal(true),\r\n result: ScanWorkspaceResultSchema,\r\n})\r\n\r\nexport const ScannerWorkerErrorMessageSchema = z.object({\r\n ok: z.literal(false),\r\n error: z.string().optional(),\r\n})\r\n\r\nexport const ScannerWorkerMessageSchema = z.union([\r\n ScannerWorkerSuccessMessageSchema,\r\n ScannerWorkerErrorMessageSchema,\r\n])\r\n\r\nexport type ScannerWorkerMessage = z.infer<typeof ScannerWorkerMessageSchema>\r\n\r\nexport const parseScanWorkspaceOptions = (options: unknown) =>\r\n parseWithSchema(ScanWorkspaceOptionsSchema, options ?? {}, \"scanner options are invalid\")\r\n\r\nexport const parseScanFileResult = (result: unknown) =>\r\n parseWithSchema(ScanFileResultSchema, result, \"scanner file result is invalid\")\r\n\r\nexport const parseScanWorkspaceResult = (result: unknown) =>\r\n parseWithSchema(ScanWorkspaceResultSchema, result, \"scanner workspace result is invalid\")\r\n\r\nexport const parseScannerWorkerRequest = (request: unknown) =>\r\n parseWithSchema(ScannerWorkerRequestSchema, request, \"scanner worker request is invalid\")\r\n\r\nexport const parseScannerWorkerMessage = (message: unknown) =>\r\n parseWithSchema(ScannerWorkerMessageSchema, message, \"scanner worker message is invalid\")\r\n"]}
1
+ {"version":3,"sources":["../packages/domain/shared/src/index.ts","../packages/domain/scanner/src/native-bridge.ts","../packages/domain/scanner/src/index.ts","../packages/domain/scanner/src/cache-native.ts","../packages/domain/scanner/src/parallel-scanner.ts","../packages/domain/scanner/src/schemas.ts"],"names":["path","fs","createRequire","fileURLToPath","scannerGetBinding","isMainThread","parentPort","workerData","Worker","availableParallelism","formatIssuePath","z","log","scanFileNative","scanWorkspaceNative"],"mappings":"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","file":"scanner.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}","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\"","/**\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"]}