diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 961fe199582d87..629aedd122aae4 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -73,6 +73,10 @@ module.exports = defineConfig({ '@typescript-eslint/ban-ts-comment': 'off', // TODO: we should turn this on in a new PR '@typescript-eslint/ban-types': 'off', // TODO: we should turn this on in a new PR + '@typescript-eslint/explicit-module-boundary-types': [ + 'error', + { allowArgumentsExplicitlyTypedAsAny: true } + ], '@typescript-eslint/no-empty-function': [ 'error', { allow: ['arrowFunctions'] } diff --git a/packages/plugin-legacy/src/index.ts b/packages/plugin-legacy/src/index.ts index ed2c4a24820a61..3a9fb253d4658a 100644 --- a/packages/plugin-legacy/src/index.ts +++ b/packages/plugin-legacy/src/index.ts @@ -517,7 +517,7 @@ export async function detectPolyfills( code: string, targets: any, list: Set -) { +): Promise { const babel = await loadBabel() const { ast } = babel.transform(code, { ast: true, diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 55ac680d86fd0e..8df48214527946 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -861,7 +861,7 @@ async function loadConfigFromBundledFile( return config } -export function isDepsOptimizerEnabled(config: ResolvedConfig) { +export function isDepsOptimizerEnabled(config: ResolvedConfig): boolean { const { command, optimizeDeps } = config const { disabled } = optimizeDeps return !( diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 9ee3c6770afbb7..4f4231354e0a6a 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -595,19 +595,22 @@ export function newDepOptimizationProcessing(): DepOptimizationProcessing { // Convert to { id: src } export function depsFromOptimizedDepInfo( depsInfo: Record -) { +): Record { return Object.fromEntries( Object.entries(depsInfo).map((d) => [d[0], d[1].src!]) ) } -export function getOptimizedDepPath(id: string, config: ResolvedConfig) { +export function getOptimizedDepPath( + id: string, + config: ResolvedConfig +): string { return normalizePath( path.resolve(getDepsCacheDir(config), flattenId(id) + '.js') ) } -export function getDepsCacheDir(config: ResolvedConfig) { +export function getDepsCacheDir(config: ResolvedConfig): string { const dirName = config.command === 'build' ? 'depsBuild' : 'deps' return normalizePath(path.resolve(config.cacheDir, dirName)) } @@ -617,11 +620,16 @@ function getProcessingDepsCacheDir(config: ResolvedConfig) { return normalizePath(path.resolve(config.cacheDir, dirName)) } -export function isOptimizedDepFile(id: string, config: ResolvedConfig) { +export function isOptimizedDepFile( + id: string, + config: ResolvedConfig +): boolean { return id.startsWith(getDepsCacheDir(config)) } -export function createIsOptimizedDepUrl(config: ResolvedConfig) { +export function createIsOptimizedDepUrl( + config: ResolvedConfig +): (url: string) => boolean { const { root } = config const depsCacheDir = getDepsCacheDir(config) diff --git a/packages/vite/src/node/optimizer/optimizer.ts b/packages/vite/src/node/optimizer/optimizer.ts index 8ae4763af8a2fc..d1846903d95269 100644 --- a/packages/vite/src/node/optimizer/optimizer.ts +++ b/packages/vite/src/node/optimizer/optimizer.ts @@ -34,7 +34,9 @@ const debounceMs = 100 const depsOptimizerMap = new WeakMap() -export function getDepsOptimizer(config: ResolvedConfig) { +export function getDepsOptimizer( + config: ResolvedConfig +): DepsOptimizer | undefined { // Workers compilation shares the DepsOptimizer from the main build return depsOptimizerMap.get(config.mainConfig || config) } diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 45ff0525b1042d..a8112d48658091 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -1197,7 +1197,7 @@ async function minifyCSS(css: string, config: ResolvedConfig) { } } -export async function hoistAtRules(css: string) { +export async function hoistAtRules(css: string): Promise { const s = new MagicString(css) const cleanCss = emptyCssComments(css) let match: RegExpExecArray | null diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 55bd988459c9f3..8d16668b55d643 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -61,7 +61,7 @@ const debug = createDebugger('vite:import-analysis') const clientDir = normalizePath(CLIENT_DIR) const skipRE = /\.(map|json)$/ -export const canSkipImportAnalysis = (id: string) => +export const canSkipImportAnalysis = (id: string): boolean => skipRE.test(id) || isDirectCSSRequest(id) const optimizedDepChunkRE = /\/chunk-[A-Z0-9]{8}\.js/ diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts index b624d7e609bcb1..4a6c97e09150eb 100644 --- a/packages/vite/src/node/plugins/importMetaGlob.ts +++ b/packages/vite/src/node/plugins/importMetaGlob.ts @@ -33,7 +33,10 @@ export interface ParsedImportGlob { end: number } -export function getAffectedGlobModules(file: string, server: ViteDevServer) { +export function getAffectedGlobModules( + file: string, + server: ViteDevServer +): ModuleNode[] { const modules: ModuleNode[] = [] for (const [id, allGlobs] of server._importGlobMap!) { if (allGlobs.some((glob) => isMatch(file, glob))) @@ -501,7 +504,7 @@ export function getCommonBase(globsResolved: string[]): null | string { return commonAncestor } -export function isVirtualModule(id: string) { +export function isVirtualModule(id: string): boolean { // https://vitejs.dev/guide/api-plugin.html#virtual-modules-convention return id.startsWith('virtual:') || id.startsWith('\0') || !id.includes('/') } diff --git a/packages/vite/src/node/plugins/optimizedDeps.ts b/packages/vite/src/node/plugins/optimizedDeps.ts index b5efe35f2589fe..49bcc69bf6f25e 100644 --- a/packages/vite/src/node/plugins/optimizedDeps.ts +++ b/packages/vite/src/node/plugins/optimizedDeps.ts @@ -43,7 +43,10 @@ function getRunProcessingInfo(config: ResolvedConfig): RunProcessingInfo { ) } -export function registerWorkersSource(config: ResolvedConfig, id: string) { +export function registerWorkersSource( + config: ResolvedConfig, + id: string +): void { const info = getRunProcessingInfo(config) info.workersSources.add(id) if (info.waitingOn === id) { @@ -55,7 +58,7 @@ export function delayDepsOptimizerUntil( config: ResolvedConfig, id: string, done: () => Promise -) { +): void { const info = getRunProcessingInfo(config) if ( !getDepsOptimizer(config)?.isOptimizedDepFile(id) && diff --git a/packages/vite/src/node/plugins/splitVendorChunk.ts b/packages/vite/src/node/plugins/splitVendorChunk.ts index 1ce53eaeb5a259..bc319b01586dab 100644 --- a/packages/vite/src/node/plugins/splitVendorChunk.ts +++ b/packages/vite/src/node/plugins/splitVendorChunk.ts @@ -27,7 +27,7 @@ export class SplitVendorChunkCache { constructor() { this.cache = new Map() } - reset() { + reset(): void { this.cache = new Map() } } diff --git a/packages/vite/src/node/server/hmr.ts b/packages/vite/src/node/server/hmr.ts index 0206d5857c7fbe..4b3d4a4aeb0d6f 100644 --- a/packages/vite/src/node/server/hmr.ts +++ b/packages/vite/src/node/server/hmr.ts @@ -34,7 +34,7 @@ export interface HmrContext { server: ViteDevServer } -export function getShortName(file: string, root: string) { +export function getShortName(file: string, root: string): string { return file.startsWith(root + '/') ? path.posix.relative(root, file) : file } @@ -130,7 +130,7 @@ export function updateModules( modules: ModuleNode[], timestamp: number, { config, ws }: ViteDevServer -) { +): void { const updates: Update[] = [] const invalidatedModules = new Set() let needFullReload = false diff --git a/packages/vite/src/node/server/sourcemap.ts b/packages/vite/src/node/server/sourcemap.ts index 97ee26668d741c..d38c992f7155a2 100644 --- a/packages/vite/src/node/server/sourcemap.ts +++ b/packages/vite/src/node/server/sourcemap.ts @@ -59,7 +59,7 @@ export async function injectSourcesContent( } } -export function genSourceMapUrl(map: SourceMap | string | undefined) { +export function genSourceMapUrl(map: SourceMap | string | undefined): string { if (typeof map !== 'string') { map = JSON.stringify(map) } @@ -70,7 +70,7 @@ export function getCodeWithSourcemap( type: 'js' | 'css', code: string, map: SourceMap | null -) { +): string { if (isDebug) { code += `\n/*${JSON.stringify(map, null, 2).replace(/\*\//g, '*\\/')}*/\n` } diff --git a/packages/vite/src/node/ssr/ssrExternal.ts b/packages/vite/src/node/ssr/ssrExternal.ts index 52b7a47566ba2a..9b990b2fc0e4d3 100644 --- a/packages/vite/src/node/ssr/ssrExternal.ts +++ b/packages/vite/src/node/ssr/ssrExternal.ts @@ -18,7 +18,7 @@ const debug = createDebugger('vite:ssr-external') /** * Converts "parent > child" syntax to just "child" */ -export function stripNesting(packages: string[]) { +export function stripNesting(packages: string[]): string[] { return packages.map((s) => { const arr = s.split('>') return arr[arr.length - 1].trim() diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 258551b838f271..db331894bb78fb 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -234,10 +234,10 @@ export const isJSRequest = (url: string): boolean => { const knownTsRE = /\.(ts|mts|cts|tsx)$/ const knownTsOutputRE = /\.(js|mjs|cjs|jsx)$/ -export const isTsRequest = (url: string) => knownTsRE.test(url) -export const isPossibleTsOutput = (url: string) => +export const isTsRequest = (url: string): boolean => knownTsRE.test(url) +export const isPossibleTsOutput = (url: string): boolean => knownTsOutputRE.test(cleanUrl(url)) -export function getPotentialTsSrcPaths(filePath: string) { +export function getPotentialTsSrcPaths(filePath: string): string[] { const [name, type, query = ''] = filePath.split(/(\.(?:[cm]?js|jsx))(\?.*)?$/) const paths = [name + type.replace('js', 'ts') + query] if (!type.endsWith('x')) { @@ -781,7 +781,7 @@ export function parseRequest(id: string): Record | null { return Object.fromEntries(new URLSearchParams(search)) } -export const blankReplacer = (match: string) => ' '.repeat(match.length) +export const blankReplacer = (match: string): string => ' '.repeat(match.length) export function getHash(text: Buffer | string): string { return createHash('sha256').update(text).digest('hex').substring(0, 8) @@ -856,7 +856,7 @@ function gracefulRemoveDir( }) } -export function emptyCssComments(raw: string) { +export function emptyCssComments(raw: string): string { return raw.replace(multilineCommentsRE, (s) => ' '.repeat(s.length)) } diff --git a/playground/legacy/__tests__/ssr/serve.ts b/playground/legacy/__tests__/ssr/serve.ts index fc0fba377160ac..339b95e690b83a 100644 --- a/playground/legacy/__tests__/ssr/serve.ts +++ b/playground/legacy/__tests__/ssr/serve.ts @@ -5,7 +5,7 @@ import { ports, rootDir } from '~utils' export const port = ports['legacy/ssr'] -export async function serve() { +export async function serve(): Promise<{ close(): Promise }> { const { build } = await import('vite') await build({ root: rootDir, diff --git a/scripts/releaseUtils.ts b/scripts/releaseUtils.ts index 272ab799fbc732..ea6987e1fe5c27 100644 --- a/scripts/releaseUtils.ts +++ b/scripts/releaseUtils.ts @@ -4,7 +4,7 @@ import { existsSync, readdirSync, writeFileSync } from 'fs' import path from 'path' import colors from 'picocolors' -import type { Options as ExecaOptions } from 'execa' +import type { Options as ExecaOptions, ExecaReturnValue } from 'execa' import execa from 'execa' import type { ReleaseType } from 'semver' import semver from 'semver' @@ -39,7 +39,18 @@ export const versionIncrements: ReleaseType[] = [ // 'prerelease' ] -export function getPackageInfo(pkgName: string) { +interface Pkg { + name: string + version: string + private?: boolean +} +export function getPackageInfo(pkgName: string): { + pkg: Pkg + pkgName: string + pkgDir: string + pkgPath: string + currentVersion: string +} { const pkgDir = path.resolve(__dirname, '../packages/' + pkgName) if (!existsSync(pkgDir)) { @@ -47,11 +58,7 @@ export function getPackageInfo(pkgName: string) { } const pkgPath = path.resolve(pkgDir, 'package.json') - const pkg: { - name: string - version: string - private?: boolean - } = require(pkgPath) + const pkg: Pkg = require(pkgPath) const currentVersion = pkg.version if (pkg.private) { @@ -71,7 +78,7 @@ export async function run( bin: string, args: string[], opts: ExecaOptions = {} -) { +): Promise> { return execa(bin, args, { stdio: 'inherit', ...opts }) } @@ -79,7 +86,7 @@ export async function dryRun( bin: string, args: string[], opts?: ExecaOptions -) { +): Promise { return console.log( colors.blue(`[dryrun] ${bin} ${args.join(' ')}`), opts || '' @@ -88,11 +95,15 @@ export async function dryRun( export const runIfNotDry = isDryRun ? dryRun : run -export function step(msg: string) { +export function step(msg: string): void { return console.log(colors.cyan(msg)) } -export function getVersionChoices(currentVersion: string) { +interface VersionChoice { + title: string + value: string +} +export function getVersionChoices(currentVersion: string): VersionChoice[] { const currentBeta = currentVersion.includes('beta') const currentAlpha = currentVersion.includes('alpha') const isStable = !currentBeta && !currentAlpha @@ -101,7 +112,7 @@ export function getVersionChoices(currentVersion: string) { return semver.inc(currentVersion, i, tag)! } - let versionChoices = [ + let versionChoices: VersionChoice[] = [ { title: 'next', value: inc(isStable ? 'patch' : 'prerelease') @@ -175,7 +186,7 @@ export async function publishPackage( }) } -export async function getLatestTag(pkgName: string) { +export async function getLatestTag(pkgName: string): Promise { const tags = (await run('git', ['tag'], { stdio: 'pipe' })).stdout .split(/\n/) .filter(Boolean) @@ -186,7 +197,7 @@ export async function getLatestTag(pkgName: string) { .reverse()[0] } -export async function logRecentCommits(pkgName: string) { +export async function logRecentCommits(pkgName: string): Promise { const tag = await getLatestTag(pkgName) if (!tag) return const sha = await run('git', ['rev-list', '-n', '1', tag], { @@ -214,7 +225,7 @@ export async function logRecentCommits(pkgName: string) { console.log() } -export async function updateTemplateVersions() { +export async function updateTemplateVersions(): Promise { const viteVersion = (await fs.readJSON('../packages/vite/package.json')) .version if (/beta|alpha|rc/.test(viteVersion)) return