Skip to content

Commit e00bedd

Browse files
authored
fix(nuxt): add aliases and augmentations for nitro context (nuxt#21680)
1 parent 829a8f4 commit e00bedd

File tree

4 files changed

+48
-7
lines changed

4 files changed

+48
-7
lines changed

packages/nuxi/src/utils/prepare.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,15 @@ export const writeTypes = async (nuxt: Nuxt) => {
4848

4949
const basePath = tsConfig.compilerOptions!.baseUrl ? resolve(nuxt.options.buildDir, tsConfig.compilerOptions!.baseUrl) : nuxt.options.buildDir
5050

51+
tsConfig.compilerOptions = tsConfig.compilerOptions || {}
52+
5153
for (const alias in aliases) {
5254
if (excludedAlias.some(re => re.test(alias))) {
5355
continue
5456
}
5557
const absolutePath = resolve(basePath, aliases[alias])
5658

5759
const stats = await fsp.stat(absolutePath).catch(() => null /* file does not exist */)
58-
tsConfig.compilerOptions = tsConfig.compilerOptions || {}
5960
if (stats?.isDirectory()) {
6061
tsConfig.compilerOptions.paths[alias] = [absolutePath]
6162
tsConfig.compilerOptions.paths[`${alias}/*`] = [`${absolutePath}/*`]

packages/nuxt/src/core/nitro.ts

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
3838
}
3939
}
4040

41-
const nitroConfig: NitroConfig = defu(_nitroConfig, <NitroConfig>{
41+
const nitroConfig: NitroConfig = defu(_nitroConfig, {
4242
static: nuxt.options._generate,
4343
debug: nuxt.options.debug,
4444
rootDir: nuxt.options.rootDir,
@@ -47,7 +47,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
4747
dev: nuxt.options.dev,
4848
buildDir: nuxt.options.buildDir,
4949
imports: {
50-
autoImport: nuxt.options.imports.autoImport,
50+
autoImport: nuxt.options.imports.autoImport as boolean,
5151
imports: [
5252
{
5353
as: '__buildAssetsURL',
@@ -112,7 +112,12 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
112112
typescript: {
113113
strict: true,
114114
generateTsConfig: true,
115-
tsconfigPath: 'tsconfig.server.json'
115+
tsconfigPath: 'tsconfig.server.json',
116+
tsConfig: {
117+
include: [
118+
join(nuxt.options.buildDir, 'types/nitro-nuxt.d.ts')
119+
]
120+
}
116121
},
117122
publicAssets: [
118123
nuxt.options.dev
@@ -143,7 +148,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
143148
'@nuxt/',
144149
nuxt.options.buildDir
145150
]),
146-
...nuxt.options.build.transpile.filter(i => typeof i === 'string'),
151+
...nuxt.options.build.transpile.filter((i): i is string => typeof i === 'string'),
147152
'nuxt/dist',
148153
'nuxt3/dist',
149154
distDir
@@ -202,7 +207,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
202207
output: {},
203208
plugins: []
204209
}
205-
})
210+
} satisfies NitroConfig)
206211

207212
// Resolve user-provided paths
208213
nitroConfig.srcDir = resolve(nuxt.options.rootDir, nuxt.options.srcDir, nitroConfig.srcDir!)
@@ -256,6 +261,30 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
256261
// Extend nitro config with hook
257262
await nuxt.callHook('nitro:config', nitroConfig)
258263

264+
// TODO: extract to shared utility?
265+
const excludedAlias = [/^@vue\/.*$/, '#imports', '#vue-router', 'vue-demi', /^#app/]
266+
const basePath = nitroConfig.typescript!.tsConfig!.compilerOptions?.baseUrl ? resolve(nuxt.options.buildDir, nitroConfig.typescript!.tsConfig!.compilerOptions?.baseUrl) : nuxt.options.buildDir
267+
const aliases = nitroConfig.alias!
268+
const tsConfig = nitroConfig.typescript!.tsConfig!
269+
tsConfig.compilerOptions = tsConfig.compilerOptions || {}
270+
tsConfig.compilerOptions.paths = tsConfig.compilerOptions.paths || {}
271+
for (const _alias in aliases) {
272+
const alias = _alias as keyof typeof aliases
273+
if (excludedAlias.some(pattern => typeof pattern === 'string' ? alias === pattern : pattern.test(alias))) {
274+
continue
275+
}
276+
if (alias in tsConfig.compilerOptions.paths) { continue }
277+
278+
const absolutePath = resolve(basePath, aliases[alias]!)
279+
const stats = await fsp.stat(absolutePath).catch(() => null /* file does not exist */)
280+
if (stats?.isDirectory()) {
281+
tsConfig.compilerOptions.paths[alias] = [absolutePath]
282+
tsConfig.compilerOptions.paths[`${alias}/*`] = [`${absolutePath}/*`]
283+
} else {
284+
tsConfig.compilerOptions.paths[alias] = [absolutePath.replace(/(?<=\w)\.\w+$/g, '')] /* remove extension */
285+
}
286+
}
287+
259288
// Init nitro
260289
const nitro = await createNitro(nitroConfig)
261290

packages/nuxt/src/core/nuxt.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { join, normalize, relative, resolve } from 'pathe'
22
import { createDebugger, createHooks } from 'hookable'
33
import type { LoadNuxtOptions } from '@nuxt/kit'
4-
import { addBuildPlugin, addComponent, addPlugin, addVitePlugin, addWebpackPlugin, installModule, loadNuxtConfig, logger, nuxtCtx, resolveAlias, resolveFiles, resolvePath, tryResolveModule } from '@nuxt/kit'
4+
import { addBuildPlugin, addComponent, addPlugin, addTemplate, addVitePlugin, addWebpackPlugin, installModule, loadNuxtConfig, logger, nuxtCtx, resolveAlias, resolveFiles, resolvePath, tryResolveModule } from '@nuxt/kit'
55
import type { Nuxt, NuxtHooks, NuxtOptions } from 'nuxt/schema'
66

77
import escapeRE from 'escape-string-regexp'
@@ -154,6 +154,14 @@ async function initNuxt (nuxt: Nuxt) {
154154
// Transpile #app if it is imported directly from subpath export
155155
nuxt.options.build.transpile.push('nuxt/app')
156156

157+
// This is currently a placeholder for future augmentations that need to be applied in Nitro context
158+
addTemplate({
159+
filename: 'types/nitro-nuxt.d.ts',
160+
getContents: () => {
161+
return 'export {}'
162+
}
163+
})
164+
157165
// Transpile layers within node_modules
158166
nuxt.options.build.transpile.push(
159167
...nuxt.options._layers.filter(i => i.cwd.includes('node_modules')).map(i => i.cwd as string)

playground/server/tsconfig.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"extends": "../.nuxt/tsconfig.server.json"
3+
}

0 commit comments

Comments
 (0)