diff --git a/vite-plugin-mock-dev-server/src/compiler/compile.ts b/vite-plugin-mock-dev-server/src/compiler/compile.ts index a5b7a92..fd45fba 100644 --- a/vite-plugin-mock-dev-server/src/compiler/compile.ts +++ b/vite-plugin-mock-dev-server/src/compiler/compile.ts @@ -1,17 +1,14 @@ import type { CompilerOptions, CompilerResult, MockRawData, TransformResult } from './types' import process from 'node:process' -import { isPackageExists } from 'local-pkg' +import { isPackageExists } from '../utils' import { transformWithEsbuild } from './esbuild' import { loadFromCode } from './loadFromCode' import { transformWithRolldown } from './rolldown' -const hasRolldown = isPackageExists('rolldown') -const hasEsbuild = isPackageExists('esbuild') - export async function transform(entryPoint: string, options: CompilerOptions): Promise { - if (hasRolldown) + if (await isPackageExists('rolldown')) return transformWithRolldown(entryPoint, options) - if (hasEsbuild) + if (await isPackageExists('esbuild')) return transformWithEsbuild(entryPoint, options) throw new Error('rolldown or esbuild not found') } diff --git a/vite-plugin-mock-dev-server/src/utils/is.ts b/vite-plugin-mock-dev-server/src/utils/is.ts index dd2cf21..fe3bd19 100644 --- a/vite-plugin-mock-dev-server/src/utils/is.ts +++ b/vite-plugin-mock-dev-server/src/utils/is.ts @@ -1,4 +1,5 @@ import type { Readable, Stream } from 'node:stream' +import { hasOwn } from '@pengzhanbo/utils' export function isStream(stream: unknown): stream is Stream { return stream !== null @@ -12,3 +13,25 @@ export function isReadableStream(stream: unknown): stream is Readable { && typeof (stream as any)._read === 'function' && typeof (stream as any)._readableState === 'object' } + +const PACKAGE_CACHE: Record = {} + +export async function isPackageExists(mod: string): Promise { + if (hasOwn(PACKAGE_CACHE, mod)) { + return PACKAGE_CACHE[mod] + } + try { + // @ts-expect-error fallback for node + if (import.meta.resolve) { + PACKAGE_CACHE[mod] = !!import.meta.resolve(mod) + } + else { + await import(mod) + PACKAGE_CACHE[mod] = true + } + return PACKAGE_CACHE[mod] + } + catch {} + PACKAGE_CACHE[mod] = false + return false +}