diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index 40bb02a93c6114..ee8cd5c855d544 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -560,7 +560,7 @@ export function createHotContext(ownerPath: string): ViteHotContext { */ export function injectQuery(url: string, queryToInject: string): string { // skip urls that won't be handled by vite - if (!url.startsWith('.') && !url.startsWith('/')) { + if (url[0] !== '.' && url[0] !== '/') { return url } diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 527f0e9fbac204..dfc9ae6e55daa2 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -747,7 +747,7 @@ function getPkgJson(root: string): PackageData['data'] { } function getPkgName(name: string) { - return name?.startsWith('@') ? name.split('/')[1] : name + return name?.[0] === '@' ? name.split('/')[1] : name } type JsExt = 'js' | 'cjs' | 'mjs' diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 4b9ac11f904fb4..c78eb4f2346b05 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -828,7 +828,7 @@ export function resolveBaseUrl( isBuild: boolean, logger: Logger, ): string { - if (base.startsWith('.')) { + if (base[0] === '.') { logger.warn( colors.yellow( colors.bold( @@ -843,7 +843,7 @@ export function resolveBaseUrl( // external URL flag const isExternal = isExternalUrl(base) // no leading slash warn - if (!isExternal && !base.startsWith('/')) { + if (!isExternal && base[0] !== '/') { logger.warn( colors.yellow( colors.bold(`(!) "base" option should start with a slash.`), @@ -855,7 +855,7 @@ export function resolveBaseUrl( if (!isBuild || !isExternal) { base = new URL(base, 'http://vitejs.dev').pathname // ensure leading slash - if (!base.startsWith('/')) { + if (base[0] !== '/') { base = '/' + base } } diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index c0fe474ddb3f15..6dcf8be3a9c1a0 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -157,7 +157,7 @@ export function assetPlugin(config: ResolvedConfig): Plugin { }, async load(id) { - if (id.startsWith('\0')) { + if (id[0] === '\0') { // Rollup convention, this id should be handled by the // plugin that marked it with \0 return @@ -221,7 +221,7 @@ export function checkPublicFile( ): string | undefined { // note if the file is in /public, the resolver would have returned it // as-is so it's not going to be a fully resolved path. - if (!publicDir || !url.startsWith('/')) { + if (!publicDir || url[0] !== '/') { return } const publicFile = path.join(publicDir, cleanUrl(url)) @@ -378,9 +378,10 @@ export async function urlToBuiltUrl( if (checkPublicFile(url, config)) { return publicFileToBuiltUrl(url, config) } - const file = url.startsWith('/') - ? path.join(config.root, url) - : path.join(path.dirname(importer), url) + const file = + url[0] === '/' + ? path.join(config.root, url) + : path.join(path.dirname(importer), url) return fileToBuiltUrl( file, config, diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts index 215605fa747181..3f61d2ddbd0b46 100644 --- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts @@ -72,7 +72,7 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin { const url = rawUrl.slice(1, -1) let file: string | undefined - if (url.startsWith('.')) { + if (url[0] === '.') { file = slash(path.resolve(path.dirname(id), url)) } else { assetResolver ??= config.createResolver({ diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 94d7f48e2c6180..d5fa61ed6eef28 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -505,9 +505,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { const toRelative = (filename: string, importer: string) => { // relative base + extracted CSS const relativePath = path.posix.relative(cssAssetDirname!, filename) - return relativePath.startsWith('.') - ? relativePath - : './' + relativePath + return relativePath[0] === '.' ? relativePath : './' + relativePath } // replace asset url references with resolved url. @@ -1314,7 +1312,7 @@ async function doUrlReplace( if ( isExternalUrl(rawUrl) || isDataUrl(rawUrl) || - rawUrl.startsWith('#') || + rawUrl[0] === '#' || varRE.test(rawUrl) ) { return matched @@ -1339,7 +1337,7 @@ async function doImportCSSReplace( wrap = first rawUrl = rawUrl.slice(1, -1) } - if (isExternalUrl(rawUrl) || isDataUrl(rawUrl) || rawUrl.startsWith('#')) { + if (isExternalUrl(rawUrl) || isDataUrl(rawUrl) || rawUrl[0] === '#') { return matched } @@ -1690,7 +1688,7 @@ async function rebaseUrls( let rebased const rebaseFn = (url: string) => { - if (url.startsWith('/')) return url + if (url[0] === '/') return url // ignore url's starting with variable if (url.startsWith(variablePrefix)) return url // match alias, no need to rewrite diff --git a/packages/vite/src/node/plugins/html.ts b/packages/vite/src/node/plugins/html.ts index 18dc2405ba988f..76608e17c72d2f 100644 --- a/packages/vite/src/node/plugins/html.ts +++ b/packages/vite/src/node/plugins/html.ts @@ -291,7 +291,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { postHooks.push(postImportMapHook()) const processedHtml = new Map() const isExcludedUrl = (url: string) => - url.startsWith('#') || + url[0] === '#' || isExternalUrl(url) || isDataUrl(url) || checkPublicFile(url, config) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index ec377083a2d688..ff1ff1b0d801bb 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -338,7 +338,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { ) } - const isRelative = url.startsWith('.') + const isRelative = url[0] === '.' const isSelfImport = !isRelative && cleanUrl(url) === cleanUrl(importer) // normalize all imports into resolved URLs @@ -364,7 +364,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { // if the resolved id is not a valid browser import specifier, // prefix it to make it valid. We will strip this before feeding it // back into the transform pipeline - if (!url.startsWith('.') && !url.startsWith('/')) { + if (url[0] !== '.' && url[0] !== '/') { url = wrapId(resolved.id) } @@ -496,7 +496,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { // warn imports to non-asset /public files if ( - specifier.startsWith('/') && + specifier[0] === '/' && !config.assetsInclude(cleanUrl(specifier)) && !specifier.endsWith('.json') && checkPublicFile(specifier, config) diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index ea79c21b13ca71..6dba547213926e 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -44,7 +44,7 @@ const optimizedDepDynamicRE = /-[A-Z\d]{8}\.js/ function toRelativePath(filename: string, importer: string) { const relPath = path.relative(path.dirname(importer), filename) - return relPath.startsWith('.') ? relPath : `./${relPath}` + return relPath[0] === '.' ? relPath : `./${relPath}` } /** diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts index 11d495f76baecf..10fe5f9120bbd5 100644 --- a/packages/vite/src/node/plugins/importMetaGlob.ts +++ b/packages/vite/src/node/plugins/importMetaGlob.ts @@ -412,7 +412,7 @@ export async function transformGlobImport( ? options.query : stringifyQuery(options.query as any) - if (query && !query.startsWith('?')) query = `?${query}` + if (query && query[0] !== '?') query = `?${query}` const resolvePaths = (file: string) => { if (!dir) { @@ -425,14 +425,14 @@ export async function transformGlobImport( } let importPath = relative(dir, file) - if (!importPath.startsWith('.')) importPath = `./${importPath}` + if (importPath[0] !== '.') importPath = `./${importPath}` let filePath: string if (isRelative) { filePath = importPath } else { filePath = relative(root, file) - if (!filePath.startsWith('.')) filePath = `/${filePath}` + if (filePath[0] !== '.') filePath = `/${filePath}` } return { filePath, importPath } @@ -583,13 +583,13 @@ export async function toAbsoluteGlob( resolveId: IdResolver, ): Promise { let pre = '' - if (glob.startsWith('!')) { + if (glob[0] === '!') { pre = '!' glob = glob.slice(1) } root = globSafePath(root) const dir = importer ? globSafePath(dirname(importer)) : root - if (glob.startsWith('/')) return pre + posix.join(root, glob.slice(1)) + if (glob[0] === '/') return pre + posix.join(root, glob.slice(1)) if (glob.startsWith('./')) return pre + posix.join(dir, glob.slice(2)) if (glob.startsWith('../')) return pre + posix.join(dir, glob) if (glob.startsWith('**')) return pre + glob @@ -606,7 +606,7 @@ export async function toAbsoluteGlob( export function getCommonBase(globsResolved: string[]): null | string { const bases = globsResolved - .filter((g) => !g.startsWith('!')) + .filter((g) => g[0] !== '!') .map((glob) => { let { base } = scan(glob) // `scan('a/foo.js')` returns `base: 'a/foo.js'` @@ -632,5 +632,5 @@ export function getCommonBase(globsResolved: string[]): null | 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('/') + return id.startsWith('virtual:') || id[0] === '\0' || !id.includes('/') } diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 2ba737063df691..5522ec0656d19d 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -184,13 +184,13 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { 'imports', ) - if (importsPath?.startsWith('.')) { + if (importsPath?.[0] === '.') { importsPath = path.relative( basedir, path.join(pkgData.dir, importsPath), ) - if (!importsPath.startsWith('.')) { + if (importsPath[0] !== '.') { importsPath = `./${importsPath}` } } @@ -270,7 +270,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { // URL // /foo -> /fs-root/foo - if (asSrc && id.startsWith('/') && (rootInRoot || !id.startsWith(root))) { + if (asSrc && id[0] === '/' && (rootInRoot || !id.startsWith(root))) { const fsPath = path.resolve(root, id.slice(1)) if ((res = tryFsResolve(fsPath, options))) { isDebug && debug(`[url] ${colors.cyan(id)} -> ${colors.dim(res)}`) @@ -280,7 +280,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { // relative if ( - id.startsWith('.') || + id[0] === '.' || ((preferRelative || importer?.endsWith('.html')) && startsWithWordCharRE.test(id)) ) { @@ -330,7 +330,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { } // drive relative fs paths (only windows) - if (isWindows && id.startsWith('/')) { + if (isWindows && id[0] === '/') { const basedir = importer ? path.dirname(importer) : process.cwd() const fsPath = path.resolve(basedir, id) if ((res = tryFsResolve(fsPath, options))) { diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts index a01e8d6e066003..2bda9ab737e273 100644 --- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts @@ -141,7 +141,7 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { ) const url = rawUrl.slice(1, -1) let file: string | undefined - if (url.startsWith('.')) { + if (url[0] === '.') { file = path.resolve(path.dirname(id), url) } else { workerResolver ??= config.createResolver({ @@ -150,9 +150,10 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { preferRelative: true, }) file = await workerResolver(url, id) - file ??= url.startsWith('/') - ? slash(path.join(config.publicDir, url)) - : slash(path.resolve(path.dirname(id), url)) + file ??= + url[0] === '/' + ? slash(path.join(config.publicDir, url)) + : slash(path.resolve(path.dirname(id), url)) } let builtUrl: string diff --git a/packages/vite/src/node/server/hmr.ts b/packages/vite/src/node/server/hmr.ts index fd956a8477b8d1..454bccd0f83474 100644 --- a/packages/vite/src/node/server/hmr.ts +++ b/packages/vite/src/node/server/hmr.ts @@ -475,7 +475,7 @@ export function lexAcceptedHmrExports( } export function normalizeHmrUrl(url: string): string { - if (!url.startsWith('.') && !url.startsWith('/')) { + if (url[0] !== '.' && url[0] !== '/') { url = wrapId(url) } return url diff --git a/packages/vite/src/node/server/middlewares/indexHtml.ts b/packages/vite/src/node/server/middlewares/indexHtml.ts index 6623b590e15ce8..764f48d4ad9169 100644 --- a/packages/vite/src/node/server/middlewares/indexHtml.ts +++ b/packages/vite/src/node/server/middlewares/indexHtml.ts @@ -102,7 +102,7 @@ const processNodeUrl = ( const fullUrl = path.posix.join(devBase, url) overwriteAttrValue(s, sourceCodeLocation, fullUrl) } else if ( - url.startsWith('.') && + url[0] === '.' && originalUrl && originalUrl !== '/' && htmlPath === '/index.html' @@ -166,7 +166,7 @@ const devHtmlHook: IndexHtmlTransformHook = async ( const code = contentNode.value let map: SourceMapInput | undefined - if (!proxyModulePath.startsWith('\0')) { + if (proxyModulePath[0] !== '\0') { map = new MagicString(html) .snip( contentNode.sourceCodeLocation!.startOffset, diff --git a/packages/vite/src/node/server/middlewares/proxy.ts b/packages/vite/src/node/server/middlewares/proxy.ts index c668d66b83edfa..2212c7e2d7f248 100644 --- a/packages/vite/src/node/server/middlewares/proxy.ts +++ b/packages/vite/src/node/server/middlewares/proxy.ts @@ -141,7 +141,7 @@ export function proxyMiddleware( function doesProxyContextMatchUrl(context: string, url: string): boolean { return ( - (context.startsWith('^') && new RegExp(context).test(url)) || + (context[0] === '^' && new RegExp(context).test(url)) || url.startsWith(context) ) } diff --git a/packages/vite/src/node/ssr/ssrExternal.ts b/packages/vite/src/node/ssr/ssrExternal.ts index f7448c6e1a5a4f..6644fdd8e2e0b4 100644 --- a/packages/vite/src/node/ssr/ssrExternal.ts +++ b/packages/vite/src/node/ssr/ssrExternal.ts @@ -199,7 +199,7 @@ function createIsSsrExternal( return processedIds.get(id) } let external = false - if (!id.startsWith('.') && !path.isAbsolute(id)) { + if (id[0] !== '.' && !path.isAbsolute(id)) { external = isBuiltin(id) || isConfiguredAsExternal(id) } processedIds.set(id, external) @@ -339,7 +339,7 @@ export function cjsShouldExternalizeForSSR( function getNpmPackageName(importPath: string): string | null { const parts = importPath.split('/') - if (parts[0].startsWith('@')) { + if (parts[0][0] === '@') { if (!parts[1]) return null return `${parts[0]}/${parts[1]}` } else { diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 1b385c19bb6736..530f0d014a3d30 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -211,9 +211,7 @@ export function fsPathFromId(id: string): string { const fsPath = normalizePath( id.startsWith(FS_PREFIX) ? id.slice(FS_PREFIX.length) : id, ) - return fsPath.startsWith('/') || fsPath.match(VOLUME_RE) - ? fsPath - : `/${fsPath}` + return fsPath[0] === '/' || fsPath.match(VOLUME_RE) ? fsPath : `/${fsPath}` } export function fsPathFromUrl(url: string): string { @@ -1190,7 +1188,7 @@ const windowsDrivePathPrefixRE = /^[A-Za-z]:[/\\]/ * this function returns false for them but true for absolute paths (e.g. C:/something) */ export const isNonDriveRelativeAbsolutePath = (p: string): boolean => { - if (!isWindows) return p.startsWith('/') + if (!isWindows) return p[0] === '/' return windowsDrivePathPrefixRE.test(p) } @@ -1228,7 +1226,7 @@ export function joinUrlSegments(a: string, b: string): string { if (a.endsWith('/')) { a = a.substring(0, a.length - 1) } - if (!b.startsWith('/')) { + if (b[0] !== '/') { b = '/' + b } return a + b