Skip to content

Commit

Permalink
refactor: simplify build typescript-eslint parser
Browse files Browse the repository at this point in the history
  • Loading branch information
sxzz committed Aug 13, 2024
1 parent d0bfed2 commit ed8b30c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 9 deletions.
7 changes: 5 additions & 2 deletions composables/parser/javascript/eslint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ export const espree: Parser<any, any> = {
gui: () => import('./EslintEspreeGui.vue'),
}

export const tsEslint: Parser<typeof TsEslint, TsEslint.ParserOptions> = {
export const tsEslint: Parser<
Pick<typeof TsEslint, 'parse' | 'version'>,
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',
Expand All @@ -47,7 +50,7 @@ export const tsEslint: Parser<typeof TsEslint, TsEslint.ParserOptions> = {
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
},
Expand Down
22 changes: 15 additions & 7 deletions modules/build-parser.ts
Original file line number Diff line number Diff line change
@@ -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'

Expand All @@ -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',
Expand All @@ -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
}

0 comments on commit ed8b30c

Please sign in to comment.