From ed8b30cf2464a505ab28f3f1b6f7e8ec81a81c28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Tue, 13 Aug 2024 23:50:33 +0800 Subject: [PATCH] refactor: simplify build typescript-eslint parser --- composables/parser/javascript/eslint.ts | 7 +++++-- modules/build-parser.ts | 22 +++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/composables/parser/javascript/eslint.ts b/composables/parser/javascript/eslint.ts index 6b879e0..13d343e 100644 --- a/composables/parser/javascript/eslint.ts +++ b/composables/parser/javascript/eslint.ts @@ -29,7 +29,10 @@ export const espree: Parser = { gui: () => import('./EslintEspreeGui.vue'), } -export const tsEslint: Parser = { +export const tsEslint: Parser< + Pick, + TsEslint.ParserOptions +> = { id: 'typescript-eslint', label: '@typescript-eslint/parser', icon: 'https://cdn.jsdelivr.net/gh/typescript-eslint/typescript-eslint@main/packages/website/static/img/logo.svg', @@ -47,7 +50,7 @@ export const tsEslint: Parser = { pkgName: '@typescript-eslint/parser', init: () => // @ts-expect-error - import('/virtual/typescript-eslint/parser').then((mod) => mod.default), + import('/virtual/typescript-eslint/parser'), async version() { return (await this).version }, diff --git a/modules/build-parser.ts b/modules/build-parser.ts index 28bc533..033f985 100644 --- a/modules/build-parser.ts +++ b/modules/build-parser.ts @@ -1,9 +1,11 @@ import { mkdir, readFile, writeFile } from 'node:fs/promises' import path from 'node:path' +import process from 'node:process' import { addVitePlugin, defineNuxtModule, useLogger } from '@nuxt/kit' import { version } from '@typescript-eslint/parser' import { build } from 'esbuild' import Replace from 'unplugin-replace/esbuild' +import type { ConsolaInstance } from 'consola' const VIRTUAL_ID = '/virtual/typescript-eslint/parser' @@ -19,23 +21,29 @@ export default defineNuxtModule(() => { async load(id) { if (id !== VIRTUAL_ID) return - logger.start('Building @typescript-eslint/parser') - const result = await buildTsEslint() - logger.success('Built @typescript-eslint/parser') + const result = await buildTsEslint(logger) return result }, }) }) -export async function buildTsEslint() { +export async function buildTsEslint(logger: ConsolaInstance) { const cacheDir = path.resolve(__dirname, `../.nuxt/cache`) await mkdir(cacheDir, { recursive: true }).catch(() => null) const cachePath = path.resolve(cacheDir, `ts-eslint-parser@${version}.js`) const cache = await readFile(cachePath, 'utf8').catch(() => null) - if (cache) return cache + if (cache) { + logger.info(`Using cached @typescript-eslint/parser from ${cachePath}`) + return cache + } + logger.start('Building @typescript-eslint/parser') const result = await build({ - entryPoints: ['@typescript-eslint/parser'], + stdin: { + contents: `export { version, parse } from '@typescript-eslint/parser'`, + resolveDir: process.cwd(), + }, + format: 'esm', write: false, bundle: true, platform: 'browser', @@ -60,9 +68,9 @@ export async function buildTsEslint() { values: [{ find: /process\.cwd\(\)/g, replacement: '"/"' }], }), ], - format: 'esm', }) const text = result.outputFiles[0].text await writeFile(cachePath, text, 'utf8') + logger.success('Built @typescript-eslint/parser') return text }