179 lines
5.4 KiB
TypeScript
179 lines
5.4 KiB
TypeScript
|
import type { DepOptimizationOptions, SSROptions, UserConfig } from 'vite'
|
||
|
|
||
|
export interface CrawlFrameworkPkgsOptions {
|
||
|
/**
|
||
|
* Path to the root of the project that contains the `package.json`
|
||
|
*/
|
||
|
root: string
|
||
|
/**
|
||
|
* Whether we're currently in a Vite build
|
||
|
*/
|
||
|
isBuild: boolean
|
||
|
/**
|
||
|
* Optional. If a Vite user config is passed, the output Vite config will respect the
|
||
|
* set `optimizeDeps` and `ssr` options so it doesn't override it
|
||
|
*/
|
||
|
viteUserConfig?: UserConfig
|
||
|
/**
|
||
|
* Whether this is a framework package by checking it's `package.json`.
|
||
|
* A framework package is one that exports special files that can't be processed
|
||
|
* by esbuild natively. For example, exporting `.framework` files.
|
||
|
*
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* return pkgJson.keywords?.includes('my-framework')
|
||
|
* ```
|
||
|
*/
|
||
|
isFrameworkPkgByJson?: (pkgJson: Record<string, any>) => boolean
|
||
|
/**
|
||
|
* Whether this is a framework package by checking it's name. This is
|
||
|
* usually used as a fast path. Return `true` or `false` if you know 100%
|
||
|
* if it's a framework package or not. Return `undefined` to fallback to
|
||
|
* `isFrameworkPkgByJson`.
|
||
|
*
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* return SPECIAL_PACKAGES.includes(pkgName) || undefined
|
||
|
* ```
|
||
|
*/
|
||
|
isFrameworkPkgByName?: (pkgName: string) => boolean | undefined
|
||
|
/**
|
||
|
* Whether this is a semi-framework package by checking it's `package.json`.
|
||
|
* A semi-framework package is one that **doesn't** export special files but
|
||
|
* consumes other APIs of the framework. For example, it only does
|
||
|
* `import { debounce } from 'my-framework/utils'`.
|
||
|
*
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* return Object.keys(pkgJson.dependencies || {}).includes('my-framework')
|
||
|
* ```
|
||
|
*/
|
||
|
isSemiFrameworkPkgByJson?: (pkgJson: Record<string, any>) => boolean
|
||
|
/**
|
||
|
* Whether this is a semi-framework package by checking it's name. This is
|
||
|
* usually used as a fast path. Return `true` or `false` if you know 100%
|
||
|
* if it's a semi-framework package or not. Return `undefined` to fallback to
|
||
|
* `isSemiFrameworkPkgByJson`.
|
||
|
*
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* return SPECIAL_SEMI_PACKAGES.includes(pkgName) || undefined
|
||
|
* ```
|
||
|
*/
|
||
|
isSemiFrameworkPkgByName?: (pkgName: string) => boolean | undefined
|
||
|
}
|
||
|
|
||
|
export interface CrawlFrameworkPkgsResult {
|
||
|
optimizeDeps: {
|
||
|
include: string[]
|
||
|
exclude: string[]
|
||
|
}
|
||
|
ssr: {
|
||
|
noExternal: string[]
|
||
|
external: string[]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Crawls for framework packages starting from `<root>/package.json` to build
|
||
|
* out a partial Vite config. See the source code for details of how this is built.
|
||
|
*/
|
||
|
export declare function crawlFrameworkPkgs(
|
||
|
options: CrawlFrameworkPkgsOptions
|
||
|
): Promise<CrawlFrameworkPkgsResult>
|
||
|
|
||
|
/**
|
||
|
* Find the `package.json` of a dep, starting from the parent, e.g. `process.cwd()`.
|
||
|
* A simplified implementation of https://nodejs.org/api/esm.html#resolver-algorithm-specification
|
||
|
* (PACKAGE_RESOLVE) for `package.json` specifically.
|
||
|
*/
|
||
|
export declare function findDepPkgJsonPath(
|
||
|
dep: string,
|
||
|
parent: string
|
||
|
): Promise<string | undefined>
|
||
|
|
||
|
/**
|
||
|
* Find the closest `package.json` path by walking `dir` upwards.
|
||
|
*
|
||
|
* Pass a function to `predicate` to check if the current `package.json` is the
|
||
|
* one you're looking for. For example, finding `package.json` that has the
|
||
|
* `name` field only. Throwing inside the `predicate` is safe and acts the same
|
||
|
* as returning false.
|
||
|
*/
|
||
|
export declare function findClosestPkgJsonPath(
|
||
|
dir: string,
|
||
|
predicate?: (pkgJsonPath: string) => boolean | Promise<boolean>
|
||
|
): Promise<string | undefined>
|
||
|
|
||
|
/**
|
||
|
* Check if a package needs to be optimized by Vite, aka if it's CJS-only
|
||
|
*/
|
||
|
export declare function pkgNeedsOptimization(
|
||
|
pkgJson: Record<string, any>,
|
||
|
pkgJsonPath: string
|
||
|
): Promise<boolean>
|
||
|
|
||
|
/**
|
||
|
* Check if a dependency is part of an existing `optimizeDeps.exclude` config
|
||
|
* @param dep Dependency to be included
|
||
|
* @param optimizeDepsExclude Existing `optimizeDeps.exclude` config
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* optimizeDeps: {
|
||
|
* include: includesToAdd.filter((dep) => !isDepExcluded(dep, existingExclude))
|
||
|
* }
|
||
|
* ```
|
||
|
*/
|
||
|
export declare function isDepExcluded(
|
||
|
dep: string,
|
||
|
optimizeDepsExclude: NonNullable<DepOptimizationOptions['exclude']>
|
||
|
): boolean
|
||
|
|
||
|
/**
|
||
|
* Check if a dependency is part of an existing `optimizeDeps.include` config
|
||
|
* @param dep Dependency to be excluded
|
||
|
* @param optimizeDepsInclude Existing `optimizeDeps.include` config
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* optimizeDeps: {
|
||
|
* exclude: excludesToAdd.filter((dep) => !isDepIncluded(dep, existingInclude))
|
||
|
* }
|
||
|
* ```
|
||
|
*/
|
||
|
export declare function isDepIncluded(
|
||
|
dep: string,
|
||
|
optimizeDepsInclude: NonNullable<DepOptimizationOptions['include']>
|
||
|
): boolean
|
||
|
|
||
|
/**
|
||
|
* Check if a dependency is part of an existing `ssr.noExternal` config
|
||
|
* @param dep Dependency to be excluded
|
||
|
* @param ssrNoExternal Existing `ssr.noExternal` config
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* ssr: {
|
||
|
* external: externalsToAdd.filter((dep) => !isDepNoExternal(dep, existingNoExternal))
|
||
|
* }
|
||
|
* ```
|
||
|
*/
|
||
|
export declare function isDepNoExternaled(
|
||
|
dep: string,
|
||
|
ssrNoExternal: NonNullable<SSROptions['noExternal']>
|
||
|
): boolean
|
||
|
|
||
|
/**
|
||
|
* Check if a dependency is part of an existing `ssr.external` config
|
||
|
* @param dep Dependency to be noExternaled
|
||
|
* @param ssrExternal Existing `ssr.external` config
|
||
|
* @example
|
||
|
* ```ts
|
||
|
* ssr: {
|
||
|
* noExternal: noExternalsToAdd.filter((dep) => !isDepExternal(dep, existingExternal))
|
||
|
* }
|
||
|
* ```
|
||
|
*/
|
||
|
export declare function isDepExternaled(
|
||
|
dep: string,
|
||
|
ssrExternal: NonNullable<SSROptions['external']>
|
||
|
): boolean
|