{"version":3,"file":"main.js","names":[],"sources":["../../../src/checkers/stylelint/main.ts"],"sourcesContent":["import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { parentPort } from 'node:worker_threads'\nimport chokidar from 'chokidar'\nimport stylelint from 'stylelint'\nimport { Checker } from '../../Checker.js'\nimport { FileDiagnosticManager } from '../../FileDiagnosticManager.js'\nimport { createIgnore } from '../../glob.js'\nimport {\n composeCheckerSummary,\n consoleLog,\n diagnosticToConsoleLevel,\n diagnosticToRuntimeError,\n diagnosticToTerminalLog,\n filterLogLevel,\n normalizeStylelintDiagnostic,\n toClientPayload,\n} from '../../logger.js'\nimport { ACTION_TYPES, DiagnosticLevel } from '../../types.js'\nimport { applyBatchedDiagnostics } from '../_shared/applyBatchedDiagnostics.js'\nimport {\n createLintScheduler,\n DEFAULT_DEBOUNCE_MS,\n} from '../_shared/lintScheduler.js'\nimport { translateOptions } from './options.js'\n\nconst manager = new FileDiagnosticManager()\nlet createServeAndBuild: any\n\nimport type { CreateDiagnostic } from '../../types.js'\n\nconst __filename = fileURLToPath(import.meta.url)\n\nconst createDiagnostic: CreateDiagnostic<'stylelint'> = (pluginConfig) => {\n let overlay = true\n let terminal = true\n\n return {\n config: async ({ enableOverlay, enableTerminal }) => {\n overlay = enableOverlay\n terminal = enableTerminal\n },\n async configureServer({ root }) {\n if (!pluginConfig.stylelint) return\n\n const translatedOptions = await translateOptions(\n pluginConfig.stylelint.lintCommand,\n )\n const baseConfig = {\n cwd: root,\n ...translatedOptions,\n } as const\n\n const logLevel = (() => {\n if (typeof pluginConfig.stylelint !== 'object') return undefined\n const userLogLevel = pluginConfig.stylelint.dev?.logLevel\n if (!userLogLevel) return undefined\n const map = {\n error: DiagnosticLevel.Error,\n warning: DiagnosticLevel.Warning,\n } as const\n\n return userLogLevel.map((l) => map[l])\n })()\n\n const dispatchDiagnostics = () => {\n const diagnostics = filterLogLevel(manager.getDiagnostics(), logLevel)\n\n if (terminal) {\n for (const d of diagnostics) {\n consoleLog(\n diagnosticToTerminalLog(d, 'Stylelint'),\n diagnosticToConsoleLevel(d),\n )\n }\n\n const errorCount = diagnostics.filter(\n (d) => d.level === DiagnosticLevel.Error,\n ).length\n const warningCount = diagnostics.filter(\n (d) => d.level === DiagnosticLevel.Warning,\n ).length\n consoleLog(\n composeCheckerSummary('Stylelint', errorCount, warningCount),\n errorCount ? 'error' : warningCount ? 'warn' : 'info',\n )\n }\n\n if (overlay) {\n parentPort?.postMessage({\n type: ACTION_TYPES.overlayError,\n payload: toClientPayload(\n 'stylelint',\n diagnostics.map((d) => diagnosticToRuntimeError(d)),\n ),\n })\n }\n }\n\n const scheduler = createLintScheduler({\n debounceMs:\n pluginConfig.stylelint.dev?.debounceMs ?? DEFAULT_DEBOUNCE_MS,\n onBatch: async (files) => {\n const { results } = await stylelint.lint({\n ...baseConfig,\n files,\n })\n const newDiagnostics = results.flatMap((d) =>\n normalizeStylelintDiagnostic(d),\n )\n applyBatchedDiagnostics(manager, files, newDiagnostics, root)\n dispatchDiagnostics()\n },\n })\n\n // initial lint\n const { results: diagnostics } = await stylelint.lint({\n ...baseConfig,\n ...pluginConfig.stylelint.dev?.overrideConfig,\n })\n\n manager.initWith(\n diagnostics.flatMap((p) => normalizeStylelintDiagnostic(p)),\n )\n dispatchDiagnostics()\n\n // watch lint\n let watchTarget: string | string[] = root\n if (pluginConfig.stylelint.watchPath) {\n if (Array.isArray(pluginConfig.stylelint.watchPath)) {\n watchTarget = pluginConfig.stylelint.watchPath.map((p) =>\n path.resolve(root, p),\n )\n } else {\n watchTarget = path.resolve(root, pluginConfig.stylelint.watchPath)\n }\n }\n\n const watcher = chokidar.watch(watchTarget, {\n cwd: root,\n ignored: createIgnore(root, translatedOptions.files),\n })\n\n watcher.on('change', (filePath) => {\n scheduler.schedule(path.resolve(root, filePath))\n })\n watcher.on('unlink', (filePath) => {\n const absPath = path.resolve(root, filePath)\n manager.updateByFileId(absPath, [])\n dispatchDiagnostics()\n })\n },\n }\n}\n\nexport class StylelintChecker extends Checker<'stylelint'> {\n public constructor() {\n super({\n name: 'stylelint',\n absFilePath: __filename,\n build: {\n buildBin: (pluginConfig) => {\n if (pluginConfig.stylelint) {\n const { lintCommand } = pluginConfig.stylelint\n return ['stylelint', lintCommand.split(' ').slice(1)]\n }\n return ['stylelint', ['']]\n },\n },\n createDiagnostic,\n })\n }\n\n public init() {\n const _createServeAndBuild = super.initMainThread()\n createServeAndBuild = _createServeAndBuild\n super.initWorkerThread()\n }\n}\n\nexport { createServeAndBuild }\n\nconst stylelintChecker = new StylelintChecker()\nstylelintChecker.prepare()\nstylelintChecker.init()\n"],"mappings":"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"}