diff --git a/packages/nuxt/src/app/composables/router.ts b/packages/nuxt/src/app/composables/router.ts index 2e070fa77..0814873ff 100644 --- a/packages/nuxt/src/app/composables/router.ts +++ b/packages/nuxt/src/app/composables/router.ts @@ -114,7 +114,7 @@ export interface NavigateToOptions { open?: OpenOptions } -const QUOTE_RE = /"/g +const URL_QUOTE_RE = /"/g /** @since 3.0.0 */ export const navigateTo = (to: RouteLocationRaw | undefined | null, options?: NavigateToOptions): Promise | false | void | RouteLocationRaw => { if (!to) { @@ -167,7 +167,7 @@ export const navigateTo = (to: RouteLocationRaw | undefined | null, options?: Na const redirect = async function (response: any) { // TODO: consider deprecating in favour of `app:rendered` and removing await nuxtApp.callHook('app:redirected') - const encodedLoc = location.replace(QUOTE_RE, '%22') + const encodedLoc = location.replace(URL_QUOTE_RE, '%22') const encodedHeader = encodeURL(location, isExternalHost) nuxtApp.ssrContext!._renderResponse = { diff --git a/packages/nuxt/src/components/plugins/loader.ts b/packages/nuxt/src/components/plugins/loader.ts index fc45bef7b..5bccd604d 100644 --- a/packages/nuxt/src/components/plugins/loader.ts +++ b/packages/nuxt/src/components/plugins/loader.ts @@ -6,7 +6,7 @@ import { relative } from 'pathe' import type { Component, ComponentsOptions } from 'nuxt/schema' import { logger, tryUseNuxt } from '@nuxt/kit' -import { isVue } from '../../core/utils' +import { isVue, QUOTE_RE } from '../../core/utils' interface LoaderOptions { getComponents (): Component[] @@ -112,7 +112,6 @@ export const LoaderPlugin = (options: LoaderOptions) => createUnplugin(() => { } }) -const QUOTE_RE = /["']/g function findComponent (components: Component[], name: string, mode: LoaderOptions['mode']) { const id = pascalCase(name).replace(QUOTE_RE, '') // Prefer exact match diff --git a/packages/nuxt/src/components/scan.ts b/packages/nuxt/src/components/scan.ts index 8e2168533..30adc35a2 100644 --- a/packages/nuxt/src/components/scan.ts +++ b/packages/nuxt/src/components/scan.ts @@ -6,13 +6,12 @@ import { isIgnored, logger, useNuxt } from '@nuxt/kit' import { withTrailingSlash } from 'ufo' import type { Component, ComponentsDir } from 'nuxt/schema' -import { resolveComponentNameSegments } from '../core/utils' +import { QUOTE_RE, resolveComponentNameSegments } from '../core/utils' const ISLAND_RE = /\.island(?:\.global)?$/ const GLOBAL_RE = /\.global(?:\.island)?$/ const COMPONENT_MODE_RE = /(?<=\.)(client|server)(\.global|\.island)*$/ const MODE_REPLACEMENT_RE = /(\.(client|server))?(\.global|\.island)*$/ -const QUOTE_RE = /["']/g /** * Scan the components inside different components folders * and return a unique list of components diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index 751f3e13a..d00d4639e 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -18,6 +18,7 @@ import { distDir } from '../dirs' import { toArray } from '../utils' import { template as defaultSpaLoadingTemplate } from '../../../ui-templates/dist/templates/spa-loading-icon' import { nuxtImportProtections } from './plugins/import-protection' +import { EXTENSION_RE } from './utils' const logLevelMapReverse = { silent: 0, @@ -374,7 +375,6 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { // TODO: extract to shared utility? const excludedAlias = [/^@vue\/.*$/, '#imports', 'vue-demi', /^#app/] - const EXTENSION_RE = /\b\.\w+$/g const basePath = nitroConfig.typescript!.tsConfig!.compilerOptions?.baseUrl ? resolve(nuxt.options.buildDir, nitroConfig.typescript!.tsConfig!.compilerOptions?.baseUrl) : nuxt.options.buildDir const aliases = nitroConfig.alias! const tsConfig = nitroConfig.typescript!.tsConfig! diff --git a/packages/nuxt/src/core/templates.ts b/packages/nuxt/src/core/templates.ts index a5e4225e0..a21352deb 100644 --- a/packages/nuxt/src/core/templates.ts +++ b/packages/nuxt/src/core/templates.ts @@ -11,6 +11,7 @@ import type { NuxtTemplate } from 'nuxt/schema' import type { Nitro } from 'nitro/types' import { annotatePlugins, checkForCircularDependencies } from './app' +import { EXTENSION_RE } from './utils' export const vueShim: NuxtTemplate = { filename: 'types/vue-shim.d.ts', @@ -378,12 +379,11 @@ export const clientConfigTemplate: NuxtTemplate = { }, } -const FILENAME_EXTENSION_RE = /\b\.\w+$/g export const appConfigDeclarationTemplate: NuxtTemplate = { filename: 'types/app.config.d.ts', getContents ({ app, nuxt }) { const typesDir = join(nuxt.options.buildDir, 'types') - const configPaths = app.configs.map(path => relative(typesDir, path).replace(FILENAME_EXTENSION_RE, '')) + const configPaths = app.configs.map(path => relative(typesDir, path).replace(EXTENSION_RE, '')) return ` import type { CustomAppConfig } from 'nuxt/schema' diff --git a/packages/nuxt/src/core/utils/index.ts b/packages/nuxt/src/core/utils/index.ts index 2653f9a99..47100a25f 100644 --- a/packages/nuxt/src/core/utils/index.ts +++ b/packages/nuxt/src/core/utils/index.ts @@ -14,3 +14,6 @@ export function uniqueBy (arr: T[], key: K) { } return res } + +export const QUOTE_RE = /["']/g +export const EXTENSION_RE = /\b\.\w+$/g diff --git a/packages/nuxt/src/core/utils/names.ts b/packages/nuxt/src/core/utils/names.ts index 38fd9a9d5..88535cab3 100644 --- a/packages/nuxt/src/core/utils/names.ts +++ b/packages/nuxt/src/core/utils/names.ts @@ -1,8 +1,8 @@ import { basename, dirname, extname, normalize } from 'pathe' import { kebabCase, splitByCase } from 'scule' import { withTrailingSlash } from 'ufo' +import { QUOTE_RE } from '.' -const QUOTE_RE = /["']/g export function getNameFromPath (path: string, relativeTo?: string) { const relativePath = relativeTo ? normalize(path).replace(withTrailingSlash(normalize(relativeTo)), '') diff --git a/packages/nuxt/src/pages/plugins/page-meta.ts b/packages/nuxt/src/pages/plugins/page-meta.ts index 24681ff8f..76ae4dc59 100644 --- a/packages/nuxt/src/pages/plugins/page-meta.ts +++ b/packages/nuxt/src/pages/plugins/page-meta.ts @@ -177,8 +177,9 @@ export const PageMetaPlugin = (options: PageMetaPluginOptions) => createUnplugin // https://github.com/vuejs/vue-loader/pull/1911 // https://github.com/vitejs/vite/issues/8473 const QUERY_START_RE = /^\?/ +const MACRO_RE = /¯o=true/ function rewriteQuery (id: string) { - return id.replace(/\?.+$/, r => '?macro=true&' + r.replace(QUERY_START_RE, '').replace(/¯o=true/, '')) + return id.replace(/\?.+$/, r => '?macro=true&' + r.replace(QUERY_START_RE, '').replace(MACRO_RE, '')) } function parseMacroQuery (id: string) {