{"version":3,"file":"worker.js","names":[],"sources":["../src/worker.ts"],"sourcesContent":["import { parentPort, Worker, workerData } from 'node:worker_threads'\nimport type { ConfigEnv } from 'vite'\nimport type {\n BuildCheckBin,\n BuildInCheckers,\n CheckerDiagnostic,\n ConfigAction,\n ConfigureServeChecker,\n ConfigureServerAction,\n ServeAndBuildChecker,\n ServeChecker,\n SharedConfig,\n UnrefAction,\n} from './types.js'\nimport { ACTION_TYPES } from './types.js'\n\ninterface WorkerScriptOptions {\n absFilename: string\n buildBin: BuildCheckBin\n serverChecker: ServeChecker\n}\n\nexport interface Script {\n mainScript: () => (\n config: T & SharedConfig,\n env: ConfigEnv,\n ) => ServeAndBuildChecker\n workerScript: () => void\n}\n\nexport function createScript>({\n absFilename,\n buildBin,\n serverChecker,\n}: WorkerScriptOptions): Script {\n type CheckerConfig = T & SharedConfig\n\n return {\n mainScript: () => {\n // initialized in main thread\n const createWorker = (\n checkerConfig: CheckerConfig,\n env: ConfigEnv,\n ): ConfigureServeChecker => {\n const isBuild = env.command === 'build'\n const worker = new Worker(absFilename, {\n workerData: { env, checkerConfig },\n })\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n worker,\n config: (config) => {\n if (isBuild) return // just run the command\n\n const configAction: ConfigAction = {\n type: ACTION_TYPES.config,\n payload: config,\n }\n worker.postMessage(configAction)\n },\n configureServer: (serverConfig) => {\n const configureServerAction: ConfigureServerAction = {\n type: ACTION_TYPES.configureServer,\n payload: serverConfig,\n }\n\n worker.postMessage(configureServerAction)\n },\n }\n }\n\n return (config, env) => {\n return {\n serve: createWorker(config, env),\n build: { buildBin },\n }\n }\n },\n workerScript: () => {\n // runs in worker thread\n let diagnostic: CheckerDiagnostic | null = null\n if (!parentPort)\n throw Error('should have parentPort as file runs in worker thread')\n const isBuild = workerData.env.command === 'build'\n // only run bin command and do not listen message in build mode\n\n const port = parentPort.on(\n 'message',\n (action: ConfigAction | ConfigureServerAction | UnrefAction) => {\n switch (action.type) {\n case ACTION_TYPES.config: {\n const checkerConfig: T & SharedConfig = workerData.checkerConfig\n diagnostic = serverChecker.createDiagnostic(checkerConfig)\n diagnostic.config(action.payload)\n break\n }\n case ACTION_TYPES.configureServer:\n if (!diagnostic)\n throw Error(\n 'diagnostic should be initialized in `config` hook of Vite',\n )\n diagnostic.configureServer(action.payload)\n break\n case ACTION_TYPES.unref:\n port.unref()\n break\n }\n },\n )\n\n if (isBuild) {\n port.unref()\n }\n },\n }\n}\n"],"mappings":";;;AA8BA,SAAgB,aAAiD,EAC/D,aACA,UACA,iBACiC;CAGjC,OAAO;EACL,kBAAkB;GAEhB,MAAM,gBACJ,eACA,QAC0B;IAC1B,MAAM,UAAU,IAAI,YAAY;IAChC,MAAM,SAAS,IAAI,OAAO,aAAa,EACrC,YAAY;KAAE;KAAK;IAAc,EACnC,CAAC;IAGD,OAAO;KACL;KACA,SAAS,WAAW;MAClB,IAAI,SAAS;MAEb,MAAM,eAA6B;OACjC,MAAA;OACA,SAAS;MACX;MACA,OAAO,YAAY,YAAY;KACjC;KACA,kBAAkB,iBAAiB;MACjC,MAAM,wBAA+C;OACnD,MAAA;OACA,SAAS;MACX;MAEA,OAAO,YAAY,qBAAqB;KAC1C;IACF;GACF;GAEA,QAAQ,QAAQ,QAAQ;IACtB,OAAO;KACL,OAAO,aAAa,QAAQ,GAAG;KAC/B,OAAO,EAAE,SAAS;IACpB;GACF;EACF;EACA,oBAAoB;GAElB,IAAI,aAAuC;GAC3C,IAAI,CAAC,YACH,MAAM,MAAM,sDAAsD;GACpE,MAAM,UAAU,WAAW,IAAI,YAAY;GAG3C,MAAM,OAAO,WAAW,GACtB,YACC,WAA+D;IAC9D,QAAQ,OAAO,MAAf;KACE,KAAA,UAA0B;MACxB,MAAM,gBAAkC,WAAW;MACnD,aAAa,cAAc,iBAAiB,aAAa;MACzD,WAAW,OAAO,OAAO,OAAO;MAChC;KACF;KACA,KAAA;MACE,IAAI,CAAC,YACH,MAAM,MACJ,2DACF;MACF,WAAW,gBAAgB,OAAO,OAAO;MACzC;KACF,KAAA;MACE,KAAK,MAAM;MACX;IACJ;GACF,CACF;GAEA,IAAI,SACF,KAAK,MAAM;EAEf;CACF;AACF"}