{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../packages/domain/shared/src/index.ts","../packages/domain/scanner/src/native-bridge.ts","../src/umbrella/scanner.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"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { createHash } from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { createRequire } from \"node:module\"\n\n// Native-only: Node.js is always available. No browser fallback.\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TokenMap = Record<string, string>\n\nexport type VariantValue = string | number | boolean | undefined\n\nexport type VariantProps = Record<string, VariantValue>\n\nexport type HtmlTagName = keyof HTMLElementTagNameMap\n\nexport type CompoundCondition = Record<string, string | number | boolean>\n\nexport type VariantMatrix = Record<string, Array<string | number | boolean>>\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logging\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Logger {\n  warn(...args: unknown[]): void\n  debug(...args: unknown[]): void\n  error(...args: unknown[]): void\n  log(...args: unknown[]): void\n}\n\nexport function createLogger(namespace: string): Logger {\n  const prefix = `[${namespace}]`\n  return {\n    warn(...args: unknown[]) {\n      process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n    },\n    debug(...args: unknown[]) {\n      process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n    },\n    error(...args: unknown[]) {\n      process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n    },\n    log(...args: unknown[]) {\n      process.stderr.write(`${prefix} ${args.map(a => typeof a === \"string\" ? a : String(a)).join(\" \")}\\n`)\n    },\n  }\n}\n\nexport function createDebugLogger(namespace: string, label?: string): (msg: string) => void {\n  const prefix = label ? `[${namespace}:${label}]` : `[${namespace}]`\n  return (msg: string) => {\n    if (process.env.DEBUG?.includes(namespace) || process.env.TW_DEBUG) {\n      console.debug(prefix, msg)\n    }\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error handling\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ErrorSource = \"rust\" | \"validation\" | \"compile\" | \"io\" | \"config\" | \"unknown\"\n\ntype ZodLikeIssue = {\n  path?: readonly PropertyKey[]\n  message?: string\n}\n\nfunction formatIssuePath(path?: readonly PropertyKey[]): string {\n  if (!path || path.length === 0) return \"(root)\"\n  return path\n    .map((segment) =>\n      typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\n    )\n    .join(\".\")\n}\n\nexport class TwError extends Error {\n  /** @deprecated Gunakan source */\n  public readonly domain: string\n  public readonly source: ErrorSource\n  public readonly code: string\n  public readonly originalCause?: unknown\n\n  constructor(domainOrSource: string, code: string, message: string, cause?: unknown) {\n    super(message)\n    this.name = \"TwError\"\n    this.domain = domainOrSource\n    this.source = domainOrSource as ErrorSource\n    this.code = code\n    this.originalCause = cause\n    if (Error.captureStackTrace) Error.captureStackTrace(this, TwError)\n  }\n\n  static fromIo(code: string, message: string): TwError {\n    return new TwError(\"io\", code, message)\n  }\n\n  static fromCompile(code: string, message: string): TwError {\n    return new TwError(\"compile\", code, message)\n  }\n\n  static fromRust(err: { code?: string; message?: string } | Error | unknown): TwError {\n    if (err instanceof TwError) return err\n    if (err instanceof Error) return new TwError(\"rust\", \"RUST_ERROR\", err.message, err)\n    if (err && typeof err === \"object\") {\n      const e = err as { code?: string; message?: string }\n      return new TwError(\"rust\", e.code ?? \"RUST_ERROR\", e.message ?? String(err), err)\n    }\n    return new TwError(\"rust\", \"RUST_ERROR\", String(err), err)\n  }\n\n  /** Buat TwError dari ZodError — dukung shape Zod v3 (`errors`) dan v4 (`issues`). */\n  static fromZod(err: { issues?: ZodLikeIssue[]; errors?: ZodLikeIssue[] }): TwError {\n    const first = err.issues?.[0] ?? err.errors?.[0]\n    const path = formatIssuePath(first?.path)\n    const message = first ? `${path}: ${first.message}` : \"Schema validation failed\"\n    return new TwError(\"validation\", \"SCHEMA_VALIDATION_FAILED\", message, err)\n  }\n\n  static wrap(source: string, code: string, err: unknown): TwError {\n    if (err instanceof TwError) return err\n    if (err instanceof Error) return new TwError(source, code, err.message, err)\n    return new TwError(source, code, String(err), err)\n  }\n\n  override toString(): string {\n    return `TwError [${this.source}:${this.code}] ${this.message}`\n  }\n\n  toJSON(): { name: string; source: string; code: string; message: string } {\n    return { name: this.name, source: this.source, code: this.code, message: this.message }\n  }\n\n  toCliMessage(): string {\n    return `[${this.source.toUpperCase()}:${this.code}] ${this.message}`\n  }\n}\n\nexport function wrapUnknownError(domain: string, code: string, error: unknown): TwError {\n  return TwError.wrap(domain, code, error)\n}\n\nexport function isTwError(err: unknown): err is TwError {\n  return err instanceof TwError\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Native binding resolution\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface LoadNativeBindingOptions<T> {\n  runtimeDir: string\n  candidates: string[]\n  isValid: (module: unknown) => module is T\n  invalidExportMessage: string\n}\n\nexport interface LoadNativeBindingResult<T> {\n  binding: T | null\n  loadErrors: Array<{ path: string; message: string }>\n  loadedPath?: string\n}\n\nexport function loadNativeBinding<T>(options: LoadNativeBindingOptions<T>): LoadNativeBindingResult<T> {\n  const { runtimeDir, candidates, isValid } = options\n  const loadErrors: Array<{ path: string; message: string }> = []\n\n  for (const candidate of candidates) {\n    const candidatePath = path.resolve(runtimeDir, candidate)\n    try {\n      if (!fs.existsSync(candidatePath) && !fs.existsSync(candidatePath + \".node\")) {\n        continue\n      }\n      const mod = requireNativeModule(candidatePath)\n      if (mod && isValid(mod)) {\n        return { binding: mod, loadErrors, loadedPath: candidatePath }\n      }\n      loadErrors.push({ path: candidatePath, message: options.invalidExportMessage })\n    } catch (e) {\n      loadErrors.push({ path: candidatePath, message: e instanceof Error ? e.message : String(e) })\n    }\n  }\n\n  return { binding: null, loadErrors }\n}\n\nconst _require = createRequire(\n  typeof __filename !== \"undefined\"\n    ? `file://${__filename}`\n    : (import.meta.url ?? \"file://unknown\")\n)\n\nfunction requireNativeModule(p: string): unknown {\n  return _require(p)\n}\n\nexport interface ResolveCandidatesOptions {\n  runtimeDir?: string\n  envVarNames?: string[]\n  includeDefaultCandidates?: boolean\n  enforceNodeExtensionForEnvPath?: boolean\n  /** @deprecated — ignored, kept for backward compat */\n  packageName?: string\n}\n\nexport function resolveNativeBindingCandidates(options: ResolveCandidatesOptions): string[] {\n  const {\n    envVarNames = [\"TW_NATIVE_PATH\", \"TWS_NATIVE_PATH\"],\n    includeDefaultCandidates = true,\n    enforceNodeExtensionForEnvPath = false,\n  } = options\n  // Default ke cwd kalau runtimeDir tidak disediakan\n  const runtimeDir = options.runtimeDir || process.cwd()\n  const candidates: string[] = []\n\n  for (const envVar of envVarNames) {\n    const envPath = process.env[envVar]\n    if (envPath) {\n      candidates.push(enforceNodeExtensionForEnvPath && !envPath.endsWith(\".node\") ? envPath + \".node\" : envPath)\n    }\n  }\n\n  if (!includeDefaultCandidates) return candidates\n\n  if (fs.existsSync(runtimeDir)) {\n    try {\n      for (const entry of fs.readdirSync(runtimeDir)) {\n        if (entry.endsWith(\".node\")) candidates.push(entry)\n      }\n    } catch { /* ignore read errors */ }\n  }\n\n  const BINARY_NAMES = [\"tailwind-styled-native\", \"tailwind_styled_parser\"]\n  const napiPlatform = process.platform === \"linux\" && process.arch === \"x64\" ? \"linux-x64-gnu\"\n    : process.platform === \"linux\" && process.arch === \"arm64\" ? \"linux-arm64-gnu\"\n      : `${process.platform}-${process.arch}`\n\n  for (const bin of BINARY_NAMES) {\n    candidates.push(path.resolve(runtimeDir, `${bin}.node`))\n    candidates.push(path.resolve(runtimeDir, `${bin}.${napiPlatform}.node`))\n    // 1 level: dist/ → package-root/native/ (published npm package)\n    candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.node`))\n    candidates.push(path.resolve(runtimeDir, \"..\", \"native\", `${bin}.${napiPlatform}.node`))\n    // cwd fallback (user project root)\n    candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.node`))\n    candidates.push(path.resolve(process.cwd(), \"native\", `${bin}.${napiPlatform}.node`))\n    // 4 level: dist/ → package/ → domain/ → packages/ → repo-root/ (monorepo dev)\n    candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\n    candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `${bin}.${napiPlatform}.node`))\n    // 3 level fallback\n    candidates.push(path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `${bin}.node`))\n  }\n\n  return Array.from(new Set(candidates))\n}\n\nexport function resolveRuntimeDir(dir: string | undefined, importMetaUrl: string): string {\n  if (dir) return path.resolve(dir)\n  try {\n    return path.dirname(fileURLToPath(importMetaUrl))\n  } catch {\n    return process.cwd()\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hashing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function hashContent(content: string, algorithm: string = \"md5\", length?: number): string {\n  const hash = createHash(algorithm).update(content).digest(\"hex\")\n  return length ? hash.slice(0, length) : hash\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error formatting\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function formatErrorMessage(error: unknown): string {\n  if (error instanceof TwError) return error.toString()\n  if (error instanceof Error) return error.message\n  return String(error)\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LRU Cache\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class LRUCache<K, V> {\n  private capacity: number\n  private cache: Map<K, V>\n\n  constructor(capacity: number) {\n    this.capacity = capacity\n    this.cache = new Map()\n  }\n\n  get(key: K): V | undefined {\n    if (!this.cache.has(key)) return undefined\n    const value = this.cache.get(key)!\n    this.cache.delete(key)\n    this.cache.set(key, value)\n    return value\n  }\n\n  set(key: K, value: V): void {\n    if (this.cache.has(key)) {\n      this.cache.delete(key)\n    } else if (this.cache.size >= this.capacity) {\n      const firstKey = this.cache.keys().next().value\n      if (firstKey !== undefined) {\n        this.cache.delete(firstKey)\n      }\n    }\n    this.cache.set(key, value)\n  }\n\n  delete(key: K): boolean {\n    return this.cache.delete(key)\n  }\n\n  has(key: K): boolean {\n    return this.cache.has(key)\n  }\n\n  clear(): void {\n    this.cache.clear()\n  }\n\n  entries(): IterableIterator<[K, V]> {\n    return this.cache.entries()\n  }\n\n  get size(): number {\n    return this.cache.size\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Trace Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { TraceSnapshot, TraceSummary } from \"./trace\"\nexport {\n  getHealthColor,\n  getModeColor,\n  formatMemory,\n  formatDuration,\n  calculateHealth,\n  getBuildTimeColor,\n  getMemoryColor,\n  createTraceSnapshot,\n  getPipelinePercentages,\n} from \"./trace\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Performance Telemetry\n// ─────────────────────────────────────────────────────────────────────────────\n\n\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error Codes\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { ErrorCode } from \"./error-codes\"\nexport { ERROR_CODES, getSuggestion, formatErrorCode } from \"./error-codes\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tailwind Compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type { TailwindInfo } from \"./compatibility\"\nexport { detectTailwind, assertTailwindV4, getTailwindVersion, isTailwindV4 } from \"./compatibility\"\n\n// ── Native binding schemas (Zod boundary validation)\nexport {\n  NativeScanFileSchema, NativeScanResultSchema,\n  NativeAnalyzerReportSchema, NativeTransformResultSchema,\n  NativeCssCompileResultSchema, NativeWatchResultSchema,\n  NativeCacheEntrySchema, NativeCacheReadResultSchema,\n  safeParseNative, parseNative,\n} from './native-schemas'\n\n// ── ESM-safe runtime helpers ──────────────────────────────────────────────\nexport {\n  createEsmRequire,\n  getDirname,\n  getFilename,\n  resolveFromRoot,\n  tryRequire,\n  resolveNativeNodePath,\n} from \"./esmHelpers\"\n\n// ── Performance telemetry ────────────────────────────────────────────────────\nexport {\n  TelemetryCollector,\n  getGlobalTelemetry,\n  resetGlobalTelemetry,\n  createBuildTimer,\n  type BuildTelemetry,\n  type TelemetrySummary,\n  type BuildPhases,\n} from \"./telemetry\"\n\n// ── Config/JSON schema validation ─────────────────────────────────────────────\nexport {\n  ScanCacheSchema,\n  ScanCacheClassEntrySchema,\n  TailwindConfigSchema,\n  RegistryPluginEntrySchema,\n  RegistryFileSchema,\n  PackageJsonSchema,\n  parseJsonWithSchema,\n  parseJsonFileWithSchema,\n  type ScanCache,\n  type ScanCacheClassEntry,\n  type TailwindConfig,\n  type RegistryPluginEntry,\n  type RegistryFile,\n  type PackageJson,\n} from \"./configSchemas\"\n\n// ── Worker/bootstrap path resolution ─────────────────────────────────────────\nexport {\n  resolveWorkerPath,\n  resolveLoaderPath,\n  type WorkerPathOptions,\n  type WorkerPathResult,\n} from \"./workerResolver\"\n\n// ── Codegen helpers ───────────────────────────────────────────────────────────\nexport {\n  generateComponentCode,\n  generateStorybookStory,\n  generateClassRenameCodemod,\n  generateBarrelFile,\n  type ComponentCodegenOptions,\n} from \"./codegen\"\n\n// ── Native binary resolution (QA #1) ─────────────────────────────────────────\nexport {\n  resolveNativeBinary,\n  formatNativeNotFoundError,\n  type NativeResolutionResult,\n} from \"./native-resolution\"\n\n// ── Shared observability contract ────────────────────────────────────────────\nexport {\n  createObservabilityClient,\n  type ClassInspection,\n  type ClassProperty,\n  type ClassUsageLocation,\n  type BuildTrace,\n  type BuildPhaseTrace,\n  type DashboardMetrics,\n  type DashboardSummary,\n  type ObservabilityClient,\n} from \"./observability\"\n\nexport {\n  TW_STATE_STATIC_FILENAME,\n  extractStaticStateCss,\n  appendStaticStateCssToSafelist,\n  type TwStateConfigEntry,\n  type StaticStateCssInput,\n  type GeneratedStateRule,\n  type StaticStateExtractionResult,\n} from \"./staticStateExtractor\"\nexport { setGlobalLogFile } from \"./logger\"","/**\n * Scanner — Rust native bridge\n *\n * Wraps the Rust scan_workspace and extract_classes_from_source functions.\n * Uses @tailwind-styled/shared for native binding resolution.\n */\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport {\n  createDebugLogger,\n  loadNativeBinding,\n  resolveNativeBindingCandidates,\n  TwError,\n} from \"@tailwind-styled/shared\"\n\nconst log = createDebugLogger(\"scanner:native\")\n\n// ESM-compatible __dirname equivalent\nfunction getDirname(): string {\n  if (typeof __dirname !== \"undefined\") {\n    return __dirname\n  }\n  if (typeof import.meta !== \"undefined\" && import.meta.url) {\n    return path.dirname(fileURLToPath(import.meta.url))\n  }\n  return process.cwd()\n}\n\ninterface NativeScannerBinding {\n  scanWorkspace?: (\n    root: string,\n    extensions: string[] | null\n  ) => {\n    files: Array<{ file: string; classes: string[]; hash: string }>\n    totalFiles: number\n    uniqueClasses: string[] | null\n  } | null\n  extractClassesFromSource?: (source: string) => string[] | null\n  hashFileContent?: (content: string) => string | null\n  cacheRead?: (cachePath: string) => {\n    entries: Array<{\n      file: string\n      classes: string[]\n      hash: string\n      mtimeMs: number\n      size: number\n      hitCount: number\n      lastSeenMs?: number\n    }>\n    version: number\n  } | null\n  cacheWrite?: (\n    cachePath: string,\n    entries: Array<{\n      file: string\n      classes: string[]\n      hash: string\n      mtimeMs: number\n      size: number\n      hitCount: number\n      lastSeenMs?: number\n    }>\n  ) => boolean\n  cachePriority?: (\n    mtimeMs: number,\n    size: number,\n    cachedMtimeMs: number,\n    cachedSize: number,\n    cachedHitCount: number,\n    cachedLastSeenMs: number,\n    nowMs: number\n  ) => number\n  batchExtractClasses?: (filePaths: string[]) => Array<{\n    file: string\n    classes: string[]\n    content_hash: string\n    ok: boolean\n    error?: string | null\n  }>\n  scanCacheGet?: (filePath: string, contentHash: string) => string[] | null\n  scanCachePut?: (filePath: string, contentHash: string, classes: string[], mtimeMs: number, size: number) => void\n  scanCacheInvalidate?: (filePath: string) => void\n  scanCacheStats?: () => { size: number }\n  scanFile?: (filePath: string) => {\n    file: string\n    classes: string[]\n    hash: string\n    ok: boolean\n    error?: string | null\n  }\n  collectFiles?: (root: string, extensions: string[] | null, ignoreDirs: string[] | null) => string[]\n  scanFilesBatch?: (filePaths: string[]) => Array<{\n    file: string\n    classes: string[]\n    hash: string\n  }>\n  generateSubComponentTypes?: (\n    root: string,\n    outputPath: string | null\n  ) => {\n    components: Array<{ name: string; classes: string[] }>\n    outputPath: string | null\n    totalFiles: number\n  }\n  /** Batch-check file existence + stale age. Menggantikan pruneStaleEntries() */\n  pruneStaleEntries?: (\n    entries: Array<{ file: string; lastSeenMs: number }>,\n    maxAgeMs: number | null,\n    checkExists: boolean | null\n  ) => { keptIndices: number[]; removed: number }\n  /** Hitung class frequency stats dari disk cache. Menggantikan computeCacheStats() */\n  computeCacheStats?: (\n    filesClasses: string[][],\n    sizes: number[],\n    top: number | null\n  ) => {\n    totalEntries: number\n    totalClasses: number\n    totalSizeBytes: number\n    avgClassesPerEntryX100: number\n    mostUsedClasses: Array<{ class: string; count: number }>\n  }\n   /** Rebuild workspace result — Rust HashSet dedup + sort. Menggantikan JS fallback di mergeResults() */\n   rebuildWorkspaceResult?: (\n     files: Array<{ file: string; classes: readonly string[] }>\n   ) => { files: Array<{ file: string; classes: string[] }>; totalFiles: number; uniqueClasses: string[] }\n\n  // ── Watch API (QA #12) ──────────────────────────────────────────────────\n  /** Mulai native file watcher via `notify` crate. Returns handleId. */\n  startWatch?: (rootDir: string) => { status: string; handleId: number }\n  /** Poll events yang terkumpul sejak poll terakhir. Queue dikosongkan setelah dipoll. */\n  pollWatchEvents?: (handleId: number) => Array<{ kind: string; path: string }>\n  /** Hentikan watcher dengan handleId. */\n  stopWatch?: (handleId: number) => boolean\n}\n\nconst isValidScannerBinding = (module: unknown): module is NativeScannerBinding => {\n  const candidate = module as Partial<NativeScannerBinding> | null | undefined\n  return !!(\n    candidate &&\n    (candidate.scanWorkspace ||\n      candidate.extractClassesFromSource ||\n      candidate.hashFileContent ||\n      candidate.cacheRead ||\n      candidate.cacheWrite)\n  )\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Native Bridge - Factory Pattern\n// ─────────────────────────────────────────────────────────────────────────\n\nconst createScannerBridgeLoader = () => {\n  const _state = {\n    binding: undefined as NativeScannerBinding | null | undefined,\n    loadError: null as string | null,\n    candidatePaths: [] as string[],\n    loadedPath: null as string | null,\n  }\n\n  const throwNativeBindingError = (): never => {\n    const lines = [\n      \"FATAL: Native scanner binding not found.\",\n      \"\",\n      \"This package requires the Rust native binding 'tailwind_styled_parser.node'.\",\n      \"The binding was not found in any of these paths:\",\n      ..._state.candidatePaths.map((p) => `  - ${p}`),\n      \"\",\n    ]\n\n    if (_state.loadError) {\n      lines.push(\"Load error:\", `  ${_state.loadError}`, \"\")\n    }\n\n    lines.push(\n      \"To fix this, run:\",\n      \"  npm run build:rust\",\n      \"\",\n      \"This will build the native Rust module from the 'native/' directory.\",\n      \"If you're using this package in a CI/CD environment, ensure Rust toolchain is installed\",\n      \"and 'npm run build:rust' is executed before running tests or building.\"\n    )\n\n    throw new TwError(\"rust\", \"SCANNER_NATIVE_BINDING_NOT_FOUND\", lines.join(\"\\n\"))\n  }\n\n  const scannerGetBinding = (): NativeScannerBinding => {\n    const cachedBinding = _state.binding\n    if (cachedBinding !== undefined) {\n      if (cachedBinding !== null) {\n        return cachedBinding\n      }\n      return throwNativeBindingError()\n    }\n\n    const runtimeDir = getDirname()\n    const candidates = resolveNativeBindingCandidates({\n      runtimeDir,\n      includeDefaultCandidates: true,\n    })\n\n    _state.candidatePaths = candidates\n\n    const { binding, loadedPath, loadErrors } = loadNativeBinding<NativeScannerBinding>({\n      runtimeDir,\n      candidates,\n      isValid: isValidScannerBinding,\n      invalidExportMessage: \"Module loaded but missing expected scanner binding functions\",\n    })\n\n    if (binding) {\n      log(`scanner native binding loaded successfully`)\n      _state.binding = binding\n      _state.loadedPath = loadedPath ?? null\n      return _state.binding\n    }\n\n    if (loadErrors.length > 0) {\n      _state.loadError = loadErrors.map((e) => `${e.path}: ${e.message}`).join(\"; \")\n    }\n\n    _state.binding = null\n    return throwNativeBindingError()\n  }\n\n  return {\n    get: scannerGetBinding,\n    scannerGetBinding,\n    getLoadedPath: (): string | null => _state.loadedPath,\n    reset: (): void => {\n      _state.binding = undefined\n      _state.loadError = null\n      _state.candidatePaths = []\n      _state.loadedPath = null\n    },\n  }\n}\n\nconst scannerBridgeLoader = createScannerBridgeLoader()\nconst scannerGetBinding = scannerBridgeLoader.get\n\nexport const resetScannerBridgeCache = scannerBridgeLoader.reset\n\n/**\n * Path .node binary native yang lagi dipakai sekarang (kalau ada).\n * Dipakai buat fingerprint cache invalidation — lihat cache-native.ts.\n * Memanggil scannerGetBinding() dulu supaya binding ke-load (loadedPath\n * cuma keisi setelah binding berhasil di-resolve sekali).\n */\nexport function getLoadedScannerBindingPath(): string | null {\n  try {\n    scannerGetBinding()\n  } catch {\n    // Binding gagal load — loadedPath tetap null, biar caller decide fallback-nya\n  }\n  return scannerBridgeLoader.getLoadedPath()\n}\n\nexport function scanWorkspaceNative(\n  root: string,\n  extensions?: string[]\n): ReturnType<NonNullable<NativeScannerBinding[\"scanWorkspace\"]>> {\n  return scannerGetBinding().scanWorkspace!(root, extensions ?? null)\n}\n\nexport function extractClassesNative(source: string): string[] {\n  const result = scannerGetBinding().extractClassesFromSource?.(source)\n  if (result === null || result === undefined) {\n    throw new TwError(\n      \"rust\",\n      \"SCANNER_EXTRACT_FAILED\",\n      \"Native extractClassesFromSource returned null/undefined\"\n    )\n  }\n  return result\n}\n\nexport function hashContentNative(content: string): string {\n  const result = scannerGetBinding().hashFileContent?.(content)\n  if (result === null || result === undefined) {\n    throw new TwError(\n      \"rust\",\n      \"SCANNER_HASH_FAILED\",\n      \"Native hashFileContent returned null/undefined\"\n    )\n  }\n  return result\n}\n\nexport function isRustCacheAvailable(): boolean {\n  return true\n}\n\nexport function hasNativeScannerBinding(): boolean {\n  try {\n    scannerBridgeLoader.get()\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport function cacheReadNative(\n  cachePath: string\n): ReturnType<NonNullable<NativeScannerBinding[\"cacheRead\"]>> {\n  const result = scannerGetBinding().cacheRead?.(cachePath)\n  if (result === null || result === undefined) {\n    throw new TwError(\n      \"rust\",\n      \"SCANNER_CACHE_READ_FAILED\",\n      \"Native cacheRead returned null/undefined\"\n    )\n  }\n  return result\n}\n\nexport function cacheWriteNative(\n  cachePath: string,\n  entries: Parameters<NonNullable<NativeScannerBinding[\"cacheWrite\"]>>[1]\n): boolean {\n  const result = scannerGetBinding().cacheWrite?.(cachePath, entries)\n  if (result === null || result === undefined) {\n    throw new TwError(\n      \"rust\",\n      \"SCANNER_CACHE_WRITE_FAILED\",\n      \"Native cacheWrite returned null/undefined\"\n    )\n  }\n  return result\n}\n\nexport function cachePriorityNative(\n  mtimeMs: number,\n  size: number,\n  cachedMtimeMs: number,\n  cachedSize: number,\n  cachedHitCount: number,\n  cachedLastSeenMs: number,\n  nowMs = Date.now()\n): number {\n  const result = scannerGetBinding().cachePriority?.(\n    mtimeMs,\n    size,\n    cachedMtimeMs,\n    cachedSize,\n    cachedHitCount,\n    cachedLastSeenMs,\n    nowMs\n  )\n  if (result === null || result === undefined) {\n    throw new TwError(\n      \"rust\",\n      \"SCANNER_CACHE_PRIORITY_FAILED\",\n      \"Native cachePriority returned null/undefined\"\n    )\n  }\n  return result\n}\n\nexport function batchExtractClassesNative(filePaths: string[]): Array<{\n  file: string\n  classes: string[]\n  content_hash: string\n  ok: boolean\n  error?: string | null\n}> {\n  const binding = scannerGetBinding()\n  if (!binding.batchExtractClasses) {\n    throw new Error(\"FATAL: Native binding 'batchExtractClasses' is required but not available.\")\n  }\n  return binding.batchExtractClasses(filePaths) ?? []\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// In-memory scan cache (Rust DashMap — zero disk I/O)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function scanCacheGet(filePath: string, contentHash: string): string[] | null {\n  const binding = scannerGetBinding()\n  if (!binding.scanCacheGet) {\n    throw new Error(\"FATAL: Native binding 'scanCacheGet' is required but not available.\")\n  }\n  return binding.scanCacheGet(filePath, contentHash) ?? null\n}\n\nexport function scanCachePut(\n  filePath: string,\n  contentHash: string,\n  classes: string[],\n  mtimeMs: number,\n  size: number\n): void {\n  const binding = scannerGetBinding()\n  if (!binding.scanCachePut) {\n    throw new Error(\"FATAL: Native binding 'scanCachePut' is required but not available.\")\n  }\n  binding.scanCachePut(filePath, contentHash, classes, mtimeMs, size)\n}\n\nexport function scanCacheInvalidate(filePath: string): void {\n  const binding = scannerGetBinding()\n  if (!binding.scanCacheInvalidate) {\n    throw new Error(\"FATAL: Native binding 'scanCacheInvalidate' is required but not available.\")\n  }\n  binding.scanCacheInvalidate(filePath)\n}\n\nexport function scanCacheStats(): { size: number } {\n  const binding = scannerGetBinding()\n  if (!binding.scanCacheStats) {\n    throw new Error(\"FATAL: Native binding 'scanCacheStats' is required but not available.\")\n  }\n  return binding.scanCacheStats() as { size: number }\n}\nexport function scanFileNative(filePath: string): {\n  file: string\n  classes: string[]\n  hash: string\n  ok: boolean\n  error?: string | null\n} {\n  const binding = scannerGetBinding()\n  if (!binding.scanFile) {\n    throw new Error(\"FATAL: Native binding 'scanFile' is required but not available.\")\n  }\n  return binding.scanFile(filePath)\n}\n/**\n * Native file walker — kumpulkan file paths rekursif tanpa baca konten.\n *\n * Menggantikan `collectFiles()` di `parallel-scanner.ts`.\n * Returns null jika binding tidak tersedia (fallback ke JS).\n */\nexport function collectFilesNative(\n  root: string,\n  extensions: string[] | null,\n  ignoreDirs: string[] | null\n): string[] | null {\n  const binding = scannerGetBinding()\n  if (!binding.collectFiles) return null\n  return binding.collectFiles(root, extensions, ignoreDirs)\n}\n/**\n * Batch scan + hash banyak file sekaligus dalam satu NAPI call.\n *\n * Menggantikan loop `scanFileNative()` per file di worker thread.\n * Rust: `par_iter()` via rayon — semua file diproses paralel di thread pool Rust,\n * tanpa overhead spawn JS worker untuk setiap chunk.\n *\n * Kapan pakai ini vs `batchExtractClassesNative`:\n * - `scanFilesBatch`       → butuh {file, classes, hash} — scan + hash sekaligus\n * - `batchExtractClasses`  → hanya butuh {file, classes, content_hash, ok, error}\n *\n * Returns: array dengan panjang sama dengan input. File yang gagal dibaca\n * dikembalikan dengan classes:[] dan hash:\"\".\n */\nexport function scanFilesBatchNative(filePaths: string[]): Array<{\n  file: string\n  classes: string[]\n  hash: string\n}> {\n  const binding = scannerGetBinding()\n  if (!binding.scanFilesBatch) {\n    // Fallback: panggil scanFile satu per satu\n    return filePaths.map((fp) => {\n      try {\n        const r = binding.scanFile?.(fp)\n        return r\n          ? { file: r.file, classes: r.classes, hash: r.hash ?? \"\" }\n          : { file: fp, classes: [], hash: \"\" }\n      } catch {\n        return { file: fp, classes: [], hash: \"\" }\n      }\n    })\n  }\n  return binding.scanFilesBatch(filePaths)\n}\n \n/**\n * Scan workspace rekursif dan generate TypeScript type declarations\n * untuk setiap sub-component yang ditemukan.\n *\n * Menggantikan operasi scan manual + string codegen di JS.\n * Rust: walkdir + regex class extraction + type codegen dalam satu pass.\n *\n * @param root       Direktori root workspace\n * @param outputPath Path output file .d.ts (opsional — kalau null, hanya return result)\n */\nexport function generateSubComponentTypesNative(\n  root: string,\n  outputPath?: string\n): {\n  components: Array<{ name: string; classes: string[] }>\n  outputPath: string | null\n  totalFiles: number\n} | null {\n  const binding = scannerGetBinding()\n  if (!binding.generateSubComponentTypes) return null\n  return binding.generateSubComponentTypes(root, outputPath ?? null) as {\n    components: Array<{ name: string; classes: string[] }>\n    outputPath: string | null\n    totalFiles: number\n  }\n}\n// ─────────────────────────────────────────────────────────────────────────────\n// pruneStaleEntries + computeCacheStats — native wrappers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Batch-check file existence + stale age menggunakan Rust syscalls.\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\n *\n * Menggantikan loop `existsSync()` di `pruneStaleEntries()` (cache-native.ts).\n */\nexport function pruneStaleEntriesNative(\n  entries: Array<{ file: string; lastSeenMs?: number }>,\n  maxAgeMs?: number,\n  checkExists?: boolean\n): { keptIndices: number[]; removed: number } | null {\n  const binding = scannerGetBinding()\n  if (!binding.pruneStaleEntries) return null\n  return binding.pruneStaleEntries(\n    entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs ?? 0 })),\n    maxAgeMs ?? null,\n    checkExists ?? null\n  )\n}\n\n/**\n * Hitung class frequency + stats dari disk cache entries menggunakan Rust.\n * Returns `null` jika native tidak tersedia (JS fallback di caller).\n *\n * Menggantikan `computeCacheStats()` di `cache-native.ts`.\n */\nexport function rebuildWorkspaceResultNative(\n  files: Array<{ file: string; classes: readonly string[] }>\n): { files: typeof files; totalFiles: number; uniqueClasses: string[] } | null {\n  const binding = scannerBridgeLoader.get()\n  if (!binding?.rebuildWorkspaceResult) return null\n  try {\n    return binding.rebuildWorkspaceResult(files)\n  } catch {\n    return null\n  }\n}\n\nexport function computeCacheStatsNative(\n  filesClasses: string[][],\n  sizes: number[],\n  top?: number\n): {\n  totalEntries: number\n  totalClasses: number\n  totalSizeBytes: number\n  avgClassesPerEntryX100: number\n  mostUsedClasses: Array<{ class: string; count: number }>\n} | null {\n  const binding = scannerGetBinding()\n  if (!binding.computeCacheStats) return null\n  return binding.computeCacheStats(filesClasses, sizes, top ?? null)\n}\n// ─────────────────────────────────────────────────────────────────────────────\n// Watch API — native wrappers (QA #12)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Mulai native file watcher menggunakan `notify` crate (Rust).\n * Returns `null` jika binding tidak tersedia — fallback ke fs.watch JS.\n */\nexport function startWatchNative(rootDir: string): { status: string; handleId: number } | null {\n  try {\n    const binding = scannerGetBinding()\n    if (!binding.startWatch) return null\n    return binding.startWatch(rootDir)\n  } catch {\n    return null\n  }\n}\n\n/**\n * Poll events dari native watcher queue. Queue dikosongkan setelah dipoll.\n * Returns array kosong jika tidak ada events atau binding tidak tersedia.\n */\nexport function pollWatchEventsNative(handleId: number): Array<{ kind: string; path: string }> {\n  try {\n    const binding = scannerGetBinding()\n    if (!binding.pollWatchEvents) return []\n    return binding.pollWatchEvents(handleId)\n  } catch {\n    return []\n  }\n}\n\n/**\n * Hentikan native watcher dengan handleId.\n */\nexport function stopWatchNative(handleId: number): boolean {\n  try {\n    const binding = scannerGetBinding()\n    if (!binding.stopWatch) return false\n    return binding.stopWatch(handleId)\n  } catch {\n    return false\n  }\n}\n\n/**\n * Cek apakah native watch API tersedia.\n */\nexport function hasNativeWatchBinding(): boolean {\n  try {\n    const binding = scannerGetBinding()\n    return !!(binding.startWatch && binding.pollWatchEvents && binding.stopWatch)\n  } catch {\n    return false\n  }\n}","export * from \"@tailwind-styled/scanner\"\n","import fs from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { Worker } from \"node:worker_threads\"\nimport { createLogger } from \"@tailwind-styled/shared\"\nimport { filePriority, type NativeCacheEntry, readCache, writeCache } from \"./cache-native\"\nimport { hashContentNative, isRustCacheAvailable } from \"./native-bridge\"\nimport { scanWorkspaceParallel } from \"./parallel-scanner\"\nimport {\n  parseScannerWorkerMessage,\n  parseScanWorkspaceOptions,\n  parseScanWorkspaceResult,\n  type ScanFileResult,\n  type ScanWorkspaceOptions,\n  type ScanWorkspaceResult,\n} from \"./schemas\"\n\nconst log = createLogger(\"scanner\")\n\nconst SCAN_WORKER_TIMEOUT_MS = 120_000\n\ntype NativeParsedClass = { raw?: string }\n// ClassExtractResult shape dari Rust (napi-rs export)\ntype NativeClassExtractResult = {\n  classes: string[]\n  componentNames: string[]\n  hasTwUsage: boolean\n  hasUseClient: boolean\n  imports: string[]\n}\ntype NativeParserBinding = {\n  parse_classes?: (input: string) => NativeParsedClass[]\n  parseClasses?: (input: string) => NativeParsedClass[]\n  // Rust returns ClassExtractResult object, bukan plain string[]\n  extractClassesFromSource?: (source: string) => NativeClassExtractResult | string[] | null\n  batchExtractClassesNative?: (filePaths: string[]) => Array<{\n    file: string; classes: string[]; contentHash: string; ok: boolean; error?: string\n  }>\n}\n\nfunction getRuntimeDir(): string {\n  if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\n    return __dirname\n  }\n  if (typeof import.meta !== \"undefined\" && import.meta.url) {\n    return path.dirname(fileURLToPath(import.meta.url))\n  }\n  return process.cwd()\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Native Parser Binding - Factory Pattern (no let!)\n// ─────────────────────────────────────────────────────────────────────────\n\nconst createNativeParserLoader = () => {\n  const _state = {\n    binding: undefined as NativeParserBinding | null | undefined,\n    initError: null as string | null,\n  }\n\n  const debugNative = (message: string): void => {\n    log.debug(`[native] ${message}`)\n  }\n\n  const loadNativeParserBinding = (): NativeParserBinding | null => {\n    if (_state.binding !== undefined) return _state.binding\n\n    const runtimeDir = getRuntimeDir()\n    const req = createRequire(path.join(runtimeDir, \"noop.cjs\"))\n\n    const _platform = process.platform\n    const _arch = process.arch\n    const _platformArch = `${_platform}-${_arch}`\n    const _platformArchGnu = _platformArch === \"linux-x64\" ? \"linux-x64-gnu\"\n      : _platformArch === \"linux-arm64\" ? \"linux-arm64-gnu\"\n      : _platformArch\n\n    const candidates = [\n      // ── binaryName baru: tailwind-styled-native (napi-rs naming) ──\n      // cwd = repo root saat run dari root, atau package dir saat workspaces\n      path.resolve(process.cwd(), \"native\", \"tailwind-styled-native.node\"),\n      path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${_platformArch}.node`),\n      path.resolve(process.cwd(), \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\n      // runtimeDir = dist/ → naik 1 level ke package root (npm install case)\n      // e.g. node_modules/tailwind-styled-v4/dist/ → node_modules/tailwind-styled-v4/native/\n      path.resolve(runtimeDir, \"..\", \"native\", \"tailwind-styled-native.node\"),\n      path.resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_platformArch}.node`),\n      path.resolve(runtimeDir, \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\n      // runtimeDir = dist/ → naik 4 level ke repo root (monorepo dev case)\n      path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n      path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\n      // 3 level fallback (jika package di-nest lebih dangkal)\n      path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind-styled-native.node\"),\n      path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", `tailwind-styled-native.${_platformArchGnu}.node`),\n      // ── binaryName lama: tailwind_styled_parser (backward compat) ──\n      path.resolve(process.cwd(), \"native/tailwind_styled_parser.node\"),\n      path.resolve(process.cwd(), \"native/build/Release/tailwind_styled_parser.node\"),\n      path.resolve(runtimeDir, \"..\", \"native\", \"tailwind_styled_parser.node\"),\n      path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n      path.resolve(runtimeDir, \"..\", \"..\", \"..\", \"native\", \"tailwind_styled_parser.node\"),\n      path.resolve(\n        runtimeDir,\n        \"..\",\n        \"..\",\n        \"..\",\n        \"native\",\n        \"build\",\n        \"Release\",\n        \"tailwind_styled_parser.node\"\n      ),\n    ]\n\n    for (const fullPath of candidates) {\n      if (!fs.existsSync(fullPath)) continue\n      try {\n        const required = req(fullPath) as NativeParserBinding\n        if (\n          required &&\n          (typeof required.extractClassesFromSource === \"function\" ||\n            typeof required.parseClasses === \"function\" ||\n            typeof required.parse_classes === \"function\")\n        ) {\n          _state.binding = required\n          debugNative(`using native parser from ${fullPath}`)\n          return _state.binding\n        }\n      } catch (error) {\n        _state.initError = error instanceof Error ? error.message : String(error)\n      }\n    }\n\n    _state.binding = null\n    if (!_state.initError) {\n      _state.initError = \"native .node binding not found\"\n    }\n    debugNative(`native binding not available: ${_state.initError}`)\n    return _state.binding\n  }\n\n  return {\n    get: loadNativeParserBinding,\n    reset: (): void => {\n      _state.binding = undefined\n      _state.initError = null\n    },\n  }\n}\n\nconst nativeParserLoader = createNativeParserLoader()\n\nfunction normalizeWithNativeParser(tokens: string[]): string[] {\n  const binding = nativeParserLoader.get()\n  const parseClasses = binding?.parseClasses ?? binding?.parse_classes\n  if (!binding || typeof parseClasses !== \"function\") {\n    throw new Error(\n      \"Native parser binding is required but not available. Run 'npm run build:rust' to build it.\"\n    )\n  }\n\n  try {\n    const parsed = parseClasses(tokens.join(\" \"))\n    const normalized = parsed.map((item) => item.raw?.trim() ?? \"\").filter(Boolean)\n    return Array.from(new Set(normalized))\n  } catch (error) {\n    const errorMessage = error instanceof Error ? error.message : String(error)\n    throw new Error(`Native parser failed: ${errorMessage}. Run 'npm run build:rust' to rebuild.`)\n  }\n}\n\nexport type { ScanFileResult, ScanWorkspaceOptions, ScanWorkspaceResult } from \"./schemas\"\nexport {\n  parseScannerWorkerMessage,\n  parseScanWorkspaceOptions,\n  parseScanWorkspaceResult,\n} from \"./schemas\"\n\nexport const DEFAULT_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"]\nexport const DEFAULT_IGNORES = [\"node_modules\", \".git\", \".next\", \"dist\", \"out\", \".turbo\", \".cache\"]\n\nfunction resolveScannerWorkerModulePath(): string | null {\n  const runtimeDir = (() => {\n    if (typeof __dirname !== \"undefined\" && __dirname.length > 0) {\n      return __dirname\n    }\n    // ESM fallback\n    if (typeof import.meta !== \"undefined\" && import.meta.url) {\n      return path.dirname(fileURLToPath(import.meta.url))\n    }\n    // Final fallback\n    return process.cwd()\n  })()\n\n  const candidates = [\n    path.resolve(runtimeDir, \"worker.cjs\"),\n    path.resolve(runtimeDir, \"worker.js\"),\n    path.resolve(runtimeDir, \"worker.ts\"),\n  ]\n\n  for (const candidate of candidates) {\n    if (fs.existsSync(candidate)) return candidate\n  }\n\n  return null\n}\n\nfunction scanWorkspaceInWorker(\n  rootDir: string,\n  options: ScanWorkspaceOptions\n): Promise<ScanWorkspaceResult> {\n  const normalizedOptions = parseScanWorkspaceOptions(options)\n  const modulePath = resolveScannerWorkerModulePath()\n  if (!modulePath) {\n    return Promise.reject(new Error(\"scanner worker module path could not be resolved\"))\n  }\n\n  return new Promise((resolve, reject) => {\n    const settleState = { settled: false }\n\n    const worker = new Worker(modulePath, { workerData: { rootDir, options: normalizedOptions } })\n\n    const timeout = setTimeout(() => {\n      if (!settleState.settled) {\n        settleState.settled = true\n        void worker.terminate()\n        reject(new Error(`scanner worker timed out after ${SCAN_WORKER_TIMEOUT_MS}ms`))\n      }\n    }, SCAN_WORKER_TIMEOUT_MS)\n\n    const finish = (callback: () => void) => {\n      if (settleState.settled) return\n      settleState.settled = true\n      clearTimeout(timeout)\n      callback()\n    }\n\n    worker.once(\"message\", (payload: unknown) => {\n      const message = parseScannerWorkerMessage(payload)\n      finish(() => {\n        if (message?.ok) {\n          resolve(parseScanWorkspaceResult(message.result))\n          return\n        }\n        reject(new Error(message?.error ?? \"scanner worker failed without an error message\"))\n      })\n    })\n\n    worker.once(\"error\", (error: Error) => {\n      finish(() => reject(error))\n    })\n\n    worker.once(\"exit\", (code: number) => {\n      if (code !== 0) {\n        finish(() => reject(new Error(`scanner worker exited with code ${code}`)))\n      }\n    })\n  })\n}\n\nfunction buildExtensionSet(includeExtensions: string[]): Set<string> {\n  return new Set(includeExtensions)\n}\n\nfunction collectCandidates(\n  rootDir: string,\n  ignoreDirectories: Set<string>,\n  extensionSet: Set<string>\n): string[] {\n  const candidates: string[] = []\n  const directories = [rootDir]\n\n  while (directories.length > 0) {\n    const currentDir = directories.pop()\n    if (!currentDir) continue\n\n    const entries = (() => {\n      try {\n        return fs.readdirSync(currentDir, { withFileTypes: true })\n      } catch {\n        return [] as fs.Dirent[]\n      }\n    })()\n\n    for (const entry of entries) {\n      const fullPath = path.join(currentDir, entry.name)\n\n      if (entry.isDirectory()) {\n        if (!ignoreDirectories.has(entry.name)) directories.push(fullPath)\n        continue\n      }\n\n      if (!entry.isFile()) continue\n      if (!extensionSet.has(path.extname(entry.name))) continue\n      candidates.push(fullPath)\n    }\n  }\n\n  return candidates\n}\n\nfunction toCacheSize(size: number): number {\n  if (!Number.isFinite(size)) return 0\n  const normalized = Math.max(0, Math.trunc(size))\n  return Math.min(normalized, 0xffffffff)\n}\n\nexport function scanSource(source: string): string[] {\n  const nativeBinding = nativeParserLoader.get()\n  if (nativeBinding?.extractClassesFromSource) {\n    const result = nativeBinding.extractClassesFromSource(source)\n    // Rust mengembalikan ClassExtractResult { classes: string[], ... }\n    // bukan plain string[] — handle kedua kemungkinan untuk backward compat\n    if (Array.isArray(result)) {\n      return Array.from(new Set(result.filter(Boolean)))\n    }\n    if (result !== null && result !== undefined && Array.isArray((result as NativeClassExtractResult).classes)) {\n      return Array.from(new Set((result as NativeClassExtractResult).classes.filter(Boolean)))\n    }\n  }\n\n  throw new Error(\n    \"FATAL: Native parser binding is required but not available.\\n\" +\n    \"This package requires native Rust bindings.\\n\\n\" +\n    \"Resolution steps:\\n\" +\n    \"1. Build the native Rust module: npm run build:rust\"\n  )\n}\n\nexport function isScannableFile(filePath: string, includeExtensions = DEFAULT_EXTENSIONS): boolean {\n  return includeExtensions.includes(path.extname(filePath))\n}\n\nexport function scanFile(filePath: string): ScanFileResult {\n  const { scanFileNative } = require(\"./native-bridge\")\n  const result = scanFileNative(filePath) as {\n    file: string; classes: string[]; hash: string; ok: boolean; error?: string | null\n  }\n  if (!result.ok) {\n    throw new Error(`scanFile failed for ${filePath}: ${result.error ?? \"unknown error\"}`)\n  }\n  return {\n    file: result.file,\n    classes: result.classes,\n    ...(result.hash ? { hash: result.hash } : {}),\n  }\n}\n\nexport function scanWorkspace(\n  rootDir: string,\n  options: ScanWorkspaceOptions = {}\n): ScanWorkspaceResult {\n  const normalizedOptions = parseScanWorkspaceOptions(options)\n  const includeExtensions = normalizedOptions.includeExtensions ?? DEFAULT_EXTENSIONS\n  const extensionSet = buildExtensionSet(includeExtensions)\n  const ignoreDirectories = new Set(normalizedOptions.ignoreDirectories ?? DEFAULT_IGNORES)\n  const useCache = normalizedOptions.useCache ?? true\n  const _smartInvalidation = normalizedOptions.smartInvalidation ?? true\n\n  const files: ScanFileResult[] = []\n  const unique = new Set<string>()\n  const candidates = collectCandidates(rootDir, ignoreDirectories, extensionSet)\n\n  const processResult = (result: ScanFileResult) => {\n    files.push(result)\n    for (const cls of result.classes) unique.add(cls)\n  }\n\n  \n  const { scanWorkspaceNative } = require(\"./native-bridge\")\n\n  if (!normalizedOptions.cacheDir && !useCache) {\n    const nativeResult = scanWorkspaceNative(rootDir, includeExtensions)\n    if (nativeResult) {\n      return parseScanWorkspaceResult({\n        files: nativeResult.files.map((f: { file: string; classes: string[]; hash?: string }) => ({\n          file: f.file,\n          classes: f.classes,\n          ...(f.hash ? { hash: f.hash } : {}),\n        })),\n        totalFiles: nativeResult.totalFiles,\n        uniqueClasses: nativeResult.uniqueClasses,\n      })\n    }\n  }\n\n  if (useCache && isRustCacheAvailable()) {\n    const cacheEntries: NativeCacheEntry[] = (() => {\n      try {\n        return readCache(rootDir, normalizedOptions.cacheDir)\n      } catch (error) {\n        log.debug(\n          `cache read failed, continuing without persisted cache: ${\n            error instanceof Error ? error.message : String(error)\n          }`\n        )\n        return []\n      }\n    })()\n\n    const cacheMap = new Map(cacheEntries.map((entry) => [entry.file, entry]))\n    const nowMs = Date.now()\n    const ranked: Array<{\n      filePath: string\n      stat: fs.Stats\n      size: number\n      cached?: NativeCacheEntry\n      priority: number\n    }> = []\n\n    for (const filePath of candidates) {\n      const stat = (() => {\n        try {\n          return fs.statSync(filePath)\n        } catch {\n          return null\n        }\n      })()\n      if (!stat) continue\n\n      const size = toCacheSize(stat.size)\n      const cached = cacheMap.get(filePath)\n      const priority = filePriority(\n        stat.mtimeMs,\n        size,\n        cached\n          ? {\n              mtimeMs: cached.mtimeMs,\n              size: cached.size,\n              hitCount: cached.hitCount,\n              lastSeenMs: 0,\n            }\n          : undefined,\n        nowMs\n      )\n\n      ranked.push({ filePath, stat, size, cached, priority })\n    }\n\n    ranked.sort((a, b) => b.priority - a.priority)\n\n    const updatedEntries: NativeCacheEntry[] = []\n\n    for (const { filePath, stat, size, cached } of ranked) {\n      const content = (() => {\n        try {\n          return fs.readFileSync(filePath, \"utf8\")\n        } catch {\n          return null\n        }\n      })()\n      if (!content) continue\n\n      const hash = hashContentNative(content)\n      if (\n        cached &&\n        cached.hash === hash &&\n        cached.mtimeMs === stat.mtimeMs &&\n        cached.size === size\n      ) {\n        log.debug(`cache HIT ${filePath}`)\n        processResult({ file: filePath, classes: cached.classes })\n        updatedEntries.push({\n          file: filePath,\n          classes: cached.classes,\n          hash: cached.hash,\n          mtimeMs: stat.mtimeMs,\n          size,\n          hitCount: (cached.hitCount ?? 0) + 1,\n        })\n        continue\n      }\n\n      log.debug(`cache MISS ${filePath}`)\n      const classes = scanSource(content)\n      processResult({ file: filePath, classes })\n      updatedEntries.push({\n        file: filePath,\n        classes,\n        hash,\n        mtimeMs: stat.mtimeMs,\n        size,\n        hitCount: 1,\n      })\n    }\n\n    try {\n      writeCache(rootDir, updatedEntries, normalizedOptions.cacheDir)\n    } catch (error) {\n      log.debug(`cache write failed: ${error instanceof Error ? error.message : String(error)}`)\n    }\n\n    return parseScanWorkspaceResult({\n      files,\n      totalFiles: files.length,\n      uniqueClasses: Array.from(unique).sort(),\n    })\n  }\n\n  // Fast path: gunakan Rust batch extraction jika tersedia (parallel, tanpa GC)\n  const batchNative = nativeParserLoader.get()?.batchExtractClassesNative\n  if (batchNative) {\n    const batchResults = batchNative(candidates)\n    for (const r of batchResults ?? []) {\n      if (r.ok) processResult({ file: r.file, classes: r.classes })\n    }\n  } else {\n    for (const filePath of candidates) {\n      processResult(scanFile(filePath))\n    }\n  }\n\n  return parseScanWorkspaceResult({\n    files,\n    totalFiles: files.length,\n    uniqueClasses: Array.from(unique).sort(),\n  })\n}\n\nexport async function scanWorkspaceAsync(\n  rootDir: string,\n  options: ScanWorkspaceOptions = {}\n): Promise<ScanWorkspaceResult> {\n  const normalizedOptions = parseScanWorkspaceOptions(options)\n\n  // Large workspaces: use native parallel scanner (multiple workers + Rust rayon)\n  try {\n    return await scanWorkspaceParallel(rootDir, {\n      extensions: normalizedOptions.includeExtensions,\n      ignoreDirs: normalizedOptions.ignoreDirectories,\n    }) as ScanWorkspaceResult\n  } catch (parallelError) {\n    log.debug(\n      `parallel scan failed, retrying with single worker: ${\n        parallelError instanceof Error ? parallelError.message : String(parallelError)\n      }`\n    )\n  }\n\n  // Fallback: single worker thread (still native)\n  try {\n    return await scanWorkspaceInWorker(rootDir, normalizedOptions)\n  } catch (error) {\n    log.debug(\n      `worker scan failed, retrying with sync native scanner: ${\n        error instanceof Error ? error.message : String(error)\n      }`\n    )\n    return scanWorkspace(rootDir, normalizedOptions)\n  }\n}\nexport { extractClassesNative, batchExtractClassesNative } from \"./native-bridge\"","/**\n * tailwind-styled-v4 — Scanner Cache (Rust-backed)\n *\n * This module REQUIRES native Rust bindings and will FAIL LOUDLY if they are not available.\n * NO JavaScript fallback is provided.\n */\n\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport {\n  cachePriorityNative,\n  cacheReadNative,\n  cacheWriteNative,\n  scanCacheGet,\n  scanCachePut,\n  scanCacheInvalidate,\n  scanCacheStats,\n  pruneStaleEntriesNative,\n  computeCacheStatsNative,\n  getLoadedScannerBindingPath,\n} from \"./native-bridge\"\n\nfunction defaultCachePath(rootDir: string, cacheDir?: string): string {\n  const dir = cacheDir\n    ? path.resolve(rootDir, cacheDir)\n    : path.join(process.cwd(), \".cache\", \"tailwind-styled\")\n  return path.join(dir, \"scanner-cache.json\")\n}\n\nfunction metaPathFor(cachePath: string): string {\n  return cachePath.replace(/\\.json$/, \".meta.json\")\n}\n\n/**\n * Fingerprint binary native yang lagi dipakai (mtime + size dari file .node).\n *\n * Root cause fix: cache_read() Rust selama ini hardcode `version: 2` tanpa\n * pernah benar-benar baca field version dari file (lihat cache_store.rs).\n * Jadi cache lama (hasil compiler/transform versi sebelumnya, misal sebelum\n * is_chained guard ditambahkan) gak pernah ke-invalidate otomatis walau\n * binary native-nya udah di-rebuild — selama isi file SOURCE-nya gak berubah.\n *\n * Fix ini independen dari versioning di Rust (yang masih non-functional\n * sampai di-rebuild) — fingerprint dihitung di sisi TS dari mtime+size file\n * .node itu sendiri, jadi setiap kali binary native di-rebuild ulang,\n * fingerprint otomatis berubah dan cache lama langsung dianggap stale,\n * TANPA perlu compiler/binary mana pun \"mengingat\" versi berapa dia.\n *\n * Kalau path binary gak diketahui (binding belum/gagal load), return null —\n * caller harus treat ini sebagai \"gak bisa diverifikasi\" dan skip optimisasi\n * cache (aman, cuma ngurangin cache-hit rate, gak bikin behavior salah).\n */\nlet _cachedFingerprint: string | null | undefined\nfunction getBinaryFingerprint(): string | null {\n  if (_cachedFingerprint !== undefined) return _cachedFingerprint\n  try {\n    const loadedPath = getLoadedScannerBindingPath()\n    if (!loadedPath) {\n      _cachedFingerprint = null\n      return null\n    }\n    const stat = fs.statSync(loadedPath)\n    _cachedFingerprint = `${stat.mtimeMs}:${stat.size}`\n  } catch {\n    _cachedFingerprint = null\n  }\n  return _cachedFingerprint\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface NativeCacheEntry {\n  file: string\n  classes: string[]\n  hash: string\n  mtimeMs: number\n  size: number\n  hitCount: number\n  /** Terakhir file ditemukan di filesystem (ms epoch). Digunakan untuk stale cleanup. */\n  lastSeenMs?: number\n}\n\n/** Default stale threshold — 7 hari */\nconst STALE_THRESHOLD_MS = 7 * 24 * 60 * 60 * 1000\n\n/**\n * Hapus entri cache yang sudah stale (file sudah tidak ada atau lastSeenMs terlalu lama).\n *\n * Native-first: Rust batch-check semua file dalam satu pass tanpa\n * event loop overhead. JS fallback: existsSync loop per file.\n */\nexport function pruneStaleEntries(\n  entries: NativeCacheEntry[],\n  opts: { maxAgeMs?: number; rootDir?: string } = {}\n): { pruned: NativeCacheEntry[]; removed: number } {\n  const nativeResult = pruneStaleEntriesNative(\n    entries.map((e) => ({ file: e.file, lastSeenMs: e.lastSeenMs })),\n    opts.maxAgeMs,\n    !!opts.rootDir\n  )\n\n  if (nativeResult !== null) {\n    const pruned = nativeResult.keptIndices.map((i) => entries[i])\n    return { pruned, removed: nativeResult.removed }\n  }\n\n  throw new Error(\"FATAL: Native binding 'pruneStaleEntries' is required but not available.\")\n}\n\n/**\n * Read scanner cache from disk using Rust parser.\n * REQUIRES native binding - throws if unavailable.\n *\n * FIX: Pastikan folder cache ada sebelum Rust coba baca file,\n * supaya tidak error \"os error 3 (path not found)\" pada first run.\n */\nexport function readCache(rootDir: string, cacheDir?: string): NativeCacheEntry[] {\n  const cachePath = defaultCachePath(rootDir, cacheDir)\n\n  // Buat folder cache jika belum ada — cegah \"os error 3\" pada first run\n  fs.mkdirSync(path.dirname(cachePath), { recursive: true })\n\n  // Cek fingerprint binary native dulu. Kalau beda dari pas cache ini ditulis\n  // (atau meta belum ada sama sekali) → binary udah di-rebuild sejak itu,\n  // seluruh cache gak bisa dipercaya lagi. Lihat getBinaryFingerprint() di atas.\n  const currentFingerprint = getBinaryFingerprint()\n  if (currentFingerprint !== null) {\n    const metaPath = metaPathFor(cachePath)\n    let storedFingerprint: string | null = null\n    try {\n      storedFingerprint = JSON.parse(fs.readFileSync(metaPath, \"utf8\")).binaryFingerprint ?? null\n    } catch {\n      // Meta belum ada (first run) atau corrupt — treat sebagai mismatch\n    }\n    if (storedFingerprint !== currentFingerprint) {\n      console.warn(\n        \"[scanner] cache invalidated: native binary berubah sejak cache terakhir ditulis\"\n      )\n      return []\n    }\n  }\n\n  const result = cacheReadNative(cachePath)\n  if (!result) return []\n\n  return result.entries.map((e) => ({\n    file: e.file,\n    classes: e.classes,\n    hash: e.hash,\n    mtimeMs: e.mtimeMs,\n    size: e.size,\n    hitCount: e.hitCount,\n    lastSeenMs: e.lastSeenMs,\n  }))\n}\n\n/**\n * Write scanner cache to disk using Rust serialiser.\n * REQUIRES native binding - throws if unavailable.\n *\n * FIX: Pastikan folder cache ada sebelum Rust coba tulis file.\n */\nexport function writeCache(rootDir: string, entries: NativeCacheEntry[], cacheDir?: string): void {\n  const cachePath = defaultCachePath(rootDir, cacheDir)\n\n  // Buat folder cache jika belum ada — cegah write gagal pada first run\n  fs.mkdirSync(path.dirname(cachePath), { recursive: true })\n\n  const success = cacheWriteNative(cachePath, entries)\n  if (!success) {\n    throw new Error(\n      \"Native cacheWrite failed. Run 'npm run build:rust' to rebuild native bindings.\"\n    )\n  }\n\n  // Catat fingerprint binary native saat ini, biar readCache() berikutnya\n  // bisa deteksi kalau binary udah di-rebuild sejak cache ini ditulis.\n  const currentFingerprint = getBinaryFingerprint()\n  if (currentFingerprint !== null) {\n    try {\n      fs.writeFileSync(\n        metaPathFor(cachePath),\n        JSON.stringify({ binaryFingerprint: currentFingerprint }),\n        \"utf8\"\n      )\n    } catch {\n      // Gagal nulis meta gak fatal — efeknya cuma cache di-treat stale di run berikutnya\n    }\n  }\n}\n\n/**\n * Compute priority score for a file using the Rust SmartCache algorithm.\n * Higher = process first.\n * REQUIRES native binding - throws if unavailable.\n */\nexport function filePriority(\n  mtimeMs: number,\n  size: number,\n  cached: { mtimeMs: number; size: number; hitCount: number; lastSeenMs?: number } | undefined,\n  nowMs = Date.now()\n): number {\n  return cachePriorityNative(\n    mtimeMs,\n    size,\n    cached?.mtimeMs ?? 0,\n    cached?.size ?? 0,\n    cached?.hitCount ?? 0,\n    cached?.lastSeenMs ?? 0,\n    nowMs\n  )\n}\n\nexport interface CacheStats {\n  totalEntries: number\n  totalClasses: number\n  totalSizeBytes: number\n  avgClassesPerEntry: number\n  mostUsedClasses: Array<{ class: string; count: number }>\n}\n\n/**\n * Rust in-memory cache — hot path untuk per-file lookup saat scan.\n * Jauh lebih cepat dari disk JSON cache untuk file yang baru saja di-scan.\n */\nexport const hotCache = {\n  get: scanCacheGet,\n  put: scanCachePut,\n  invalidate: scanCacheInvalidate,\n} as const\n\n/**\n * Stats dari Rust in-memory cache (DashMap).\n * `size` = jumlah entry saat ini di cache.\n */\nexport function getHotCacheStats(): { size: number } {\n  return scanCacheStats()\n}\n\n/**\n * Compute disk cache stats dari entries (diperlukan untuk mostUsedClasses).\n *\n * Native-first: Rust HashMap count + partial sort — ~3× lebih cepat\n * dari JS Map untuk workspace besar (5000+ entries).\n * JS fallback: manual Map count + .sort().\n */\nexport function computeCacheStats(entries: NativeCacheEntry[]): CacheStats {\n  if (entries.length === 0) {\n    return { totalEntries: 0, totalClasses: 0, totalSizeBytes: 0, avgClassesPerEntry: 0, mostUsedClasses: [] }\n  }\n\n  // Native-first\n  const nativeResult = computeCacheStatsNative(\n    entries.map((e) => e.classes),\n    entries.map((e) => e.size),\n    10\n  )\n\n  if (nativeResult !== null) {\n    return {\n      totalEntries: nativeResult.totalEntries,\n      totalClasses: nativeResult.totalClasses,\n      totalSizeBytes: nativeResult.totalSizeBytes,\n      avgClassesPerEntry: nativeResult.avgClassesPerEntryX100 / 100,\n      mostUsedClasses: nativeResult.mostUsedClasses,\n    }\n  }\n\n  throw new Error(\"FATAL: Native binding 'computeCacheStats' is required but not available.\")\n}","/**\n * Native parallel scanner menggunakan worker threads + Rust batchExtractClasses.\n *\n * Untuk workspaces besar (200+ files), file-list dibagi ke beberapa worker.\n * Setiap worker memanggil native `batchExtractClasses` yang sudah memakai\n * rayon par_iter di sisi Rust — sehingga parallelism terjadi di dua level:\n *   1. Multiple worker threads (TS/Node level)\n *   2. rayon par_iter di dalam setiap worker (Rust level)\n *\n * Untuk workspace kecil (< PARALLEL_THRESHOLD), langsung panggil batchExtractClasses\n * di main thread — overhead spawn worker tidak worth it.\n */\n\nimport { Worker, isMainThread, parentPort, workerData } from \"node:worker_threads\"\nimport path from \"node:path\"\nimport { availableParallelism } from \"node:os\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { isScannableFile, DEFAULT_EXTENSIONS, DEFAULT_IGNORES } from \"./index\"\nimport { batchExtractClassesNative, collectFilesNative, rebuildWorkspaceResultNative } from \"./native-bridge\"\nimport type { ScanWorkspaceResult, ScanFileResult } from \"./types\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst PARALLEL_THRESHOLD = 50\nconst DEFAULT_CHUNK_SIZE = 150\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ParallelScanOptions {\n  extensions?: string[]\n  ignoreDirs?: string[]\n  maxWorkers?: number\n  chunkSize?: number\n}\n\ninterface NativeBatchResult {\n  file: string\n  classes: string[]\n  content_hash: string\n  ok: boolean\n  error?: string | null\n}\n\ninterface WorkerInput {\n  filePaths: string[]\n}\n\ntype WorkerOutput =\n  | { ok: true; results: NativeBatchResult[] }\n  | { ok: false; error: string }\n\n// ─────────────────────────────────────────────────────────────────────────────\n// File collection\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─────────────────────────────────────────────────────────────────────────────\n// File collection — native-first, JS fallback\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Kumpulkan semua file yang cocok secara rekursif dari rootDir.\n *\n * Native: satu Rust walk tanpa JS event loop overhead — 2–5× lebih cepat\n * untuk workspace besar. Tidak membaca konten file, hanya paths.\n *\n * JS fallback: dipakai jika native binding tidak tersedia (mis. test env).\n */\nfunction collectFiles(rootDir: string, extensions: string[], ignoreDirs: string[]): string[] {\n  const native = collectFilesNative(rootDir, extensions, ignoreDirs)\n  if (native !== null) return native\n  throw new Error(\"FATAL: Native binding 'collectFiles' is required but not available.\")\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Merge results\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction mergeResults(batchResults: NativeBatchResult[]): ScanWorkspaceResult {\n  const files: ScanFileResult[] = batchResults.map((r) => ({\n    file: r.file,\n    classes: r.classes,\n    hash: r.content_hash,\n  }))\n  const native = rebuildWorkspaceResultNative(files)\n  if (native) return native\n  throw new Error(\"FATAL: Native binding 'rebuildWorkspaceResult' is required but not available.\")\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Worker thread entry point\n// ─────────────────────────────────────────────────────────────────────────────\n\nif (!isMainThread && parentPort) {\n  const { filePaths } = workerData as WorkerInput\n  try {\n    const results = batchExtractClassesNative(filePaths)\n    const msg: WorkerOutput = { ok: true, results }\n    parentPort.postMessage(msg)\n  } catch (error) {\n    const msg: WorkerOutput = {\n      ok: false,\n      error: error instanceof Error ? error.message : String(error),\n    }\n    parentPort.postMessage(msg)\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// __filename compat CJS + ESM\n// ─────────────────────────────────────────────────────────────────────────────\n\ndeclare const __filename: string | undefined\nconst _workerFilename =\n  typeof __filename !== \"undefined\" ? __filename : fileURLToPath(import.meta.url)\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Spawn worker for one chunk\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction runChunkInWorker(filePaths: string[]): Promise<NativeBatchResult[]> {\n  return new Promise((resolve, reject) => {\n    const worker = new Worker(_workerFilename, {\n      workerData: { filePaths } satisfies WorkerInput,\n    })\n    worker.once(\"message\", (payload: WorkerOutput) => {\n      if (payload.ok) {\n        resolve(payload.results)\n      } else {\n        reject(new Error(payload.error ?? \"parallel-scanner worker failed\"))\n      }\n    })\n    worker.once(\"error\", reject)\n    worker.once(\"exit\", (code) => {\n      if (code !== 0) reject(new Error(`parallel-scanner worker exited with code ${code}`))\n    })\n  })\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport async function scanWorkspaceParallel(\n  rootDir: string,\n  options: ParallelScanOptions = {}\n): Promise<ScanWorkspaceResult> {\n  const {\n    extensions = DEFAULT_EXTENSIONS,\n    ignoreDirs = DEFAULT_IGNORES,\n    maxWorkers = Math.max(1, availableParallelism() - 1),\n    chunkSize = DEFAULT_CHUNK_SIZE,\n  } = options\n\n  const files = collectFiles(path.resolve(rootDir), extensions, ignoreDirs)\n\n  if (files.length < PARALLEL_THRESHOLD) {\n    return mergeResults(batchExtractClassesNative(files))\n  }\n\n  const chunks: string[][] = []\n  for (let i = 0; i < files.length; i += chunkSize) {\n    chunks.push(files.slice(i, i + chunkSize))\n  }\n\n  const allResults: NativeBatchResult[] = []\n  for (let i = 0; i < chunks.length; i += maxWorkers) {\n    const batch = chunks.slice(i, i + maxWorkers)\n    const batchResults = await Promise.all(batch.map(runChunkInWorker))\n    allResults.push(...batchResults.flat())\n  }\n\n  return mergeResults(allResults)\n}","import { z } from \"zod\"\nimport { TwError } from \"@tailwind-styled/shared\"\n\nconst formatIssuePath = (path: readonly PropertyKey[]): string =>\n  path.length > 0\n    ? path\n        .map((segment) =>\n          typeof segment === \"symbol\" ? segment.description ?? segment.toString() : String(segment)\n        )\n        .join(\".\")\n    : \"<root>\"\n\nconst formatIssues = (error: z.ZodError): string =>\n  error.issues\n    .map((issue) => {\n      const path = formatIssuePath(issue.path)\n      return `${path}: ${issue.message}`\n    })\n    .join(\"; \")\n\nconst parseWithSchema = <T>(schema: z.ZodType<T>, data: unknown, label: string): T => {\n  const parsed = schema.safeParse(data)\n  if (parsed.success) return parsed.data\n  const details = formatIssues(parsed.error)\n  throw new TwError(\n    \"validation\",\n    \"SCHEMA_VALIDATION_FAILED\",\n    details ? `${label}: ${details}` : label,\n    parsed.error\n  )\n}\n\nconst NonNegativeIntegerSchema = z.number().int().min(0)\n\nexport const ScanWorkspaceOptionsSchema = z.object({\n  includeExtensions: z.array(z.string()).optional(),\n  ignoreDirectories: z.array(z.string()).optional(),\n  useCache: z.boolean().optional(),\n  cacheDir: z.string().min(1).optional(),\n  smartInvalidation: z.boolean().optional(),\n})\n\nexport type ScanWorkspaceOptions = z.infer<typeof ScanWorkspaceOptionsSchema>\n\nexport const ScanFileResultSchema = z.object({\n  file: z.string(),\n  classes: z.array(z.string()),\n  hash: z.string().optional(),\n})\n\nexport type ScanFileResult = z.infer<typeof ScanFileResultSchema>\n\nexport const ScanWorkspaceResultSchema = z\n  .object({\n    files: z.array(ScanFileResultSchema),\n    totalFiles: NonNegativeIntegerSchema,\n    uniqueClasses: z.array(z.string()),\n  })\n  .refine((value) => value.totalFiles === value.files.length, {\n    message: \"scan result totalFiles must match files.length\",\n    path: [\"totalFiles\"],\n  })\n\nexport type ScanWorkspaceResult = z.infer<typeof ScanWorkspaceResultSchema>\n\nexport const ScannerWorkerRequestSchema = z.object({\n  rootDir: z.string().min(1),\n  options: ScanWorkspaceOptionsSchema.optional(),\n})\n\nexport type ScannerWorkerRequest = z.infer<typeof ScannerWorkerRequestSchema>\n\nexport const ScannerWorkerSuccessMessageSchema = z.object({\n  ok: z.literal(true),\n  result: ScanWorkspaceResultSchema,\n})\n\nexport const ScannerWorkerErrorMessageSchema = z.object({\n  ok: z.literal(false),\n  error: z.string().optional(),\n})\n\nexport const ScannerWorkerMessageSchema = z.union([\n  ScannerWorkerSuccessMessageSchema,\n  ScannerWorkerErrorMessageSchema,\n])\n\nexport type ScannerWorkerMessage = z.infer<typeof ScannerWorkerMessageSchema>\n\nexport const parseScanWorkspaceOptions = (options: unknown) =>\n  parseWithSchema(ScanWorkspaceOptionsSchema, options ?? {}, \"scanner options are invalid\")\n\nexport const parseScanFileResult = (result: unknown) =>\n  parseWithSchema(ScanFileResultSchema, result, \"scanner file result is invalid\")\n\nexport const parseScanWorkspaceResult = (result: unknown) =>\n  parseWithSchema(ScanWorkspaceResultSchema, result, \"scanner workspace result is invalid\")\n\nexport const parseScannerWorkerRequest = (request: unknown) =>\n  parseWithSchema(ScannerWorkerRequestSchema, request, \"scanner worker request is invalid\")\n\nexport const parseScannerWorkerMessage = (message: unknown) =>\n  parseWithSchema(ScannerWorkerMessageSchema, message, \"scanner worker message is invalid\")\n"],"mappings":"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","names":["path","fileURLToPath","path","fileURLToPath","getDirname","scannerGetBinding","fs","createRequire","path","fileURLToPath","Worker","fs","path","fs","path","path","fileURLToPath","fileURLToPath","path","formatIssuePath","path","log","path","fileURLToPath","createRequire","fs","path","fileURLToPath","fs","Worker","isScannableFile","scanFileNative","scanWorkspaceNative","log"]}