From fa6751a3974548b53b104932fc76ad00359f7965 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 20 Jun 2022 16:46:21 +0100 Subject: [PATCH 1/5] fix(kit): add nuxt 3 implementation for addLayout and add as separate util --- packages/kit/src/layout.ts | 32 ++++++++++++++++++++++++++++ packages/kit/src/module/container.ts | 18 ++++------------ 2 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 packages/kit/src/layout.ts diff --git a/packages/kit/src/layout.ts b/packages/kit/src/layout.ts new file mode 100644 index 00000000000..2b195848fe0 --- /dev/null +++ b/packages/kit/src/layout.ts @@ -0,0 +1,32 @@ +import { NuxtTemplate } from '@nuxt/schema' +import { join, parse } from 'pathe' +import { isNuxt2 } from './compatibility' +import { useNuxt } from './context' +import { logger } from './logger' +import { addTemplate } from './template' + +export function addLayout (tmpl: NuxtTemplate, name?: string) { + const nuxt = useNuxt() + const { filename, src } = addTemplate(tmpl) + const layoutName = name || parse(src || filename).name + + if (isNuxt2(nuxt)) { + // Nuxt 2 adds layouts in options + const layout = nuxt.options.layouts[layoutName] + if (layout) { + logger.warn(`Duplicate layout registration, "${layoutName}" has been registered as "${layout}"`) + } + nuxt.options.layouts[layoutName] = `./${filename}` + if (name === 'error') { + this.addErrorLayout(filename) + } + } else { + // Nuxt 3 adds layouts on app + nuxt.hook('app:templates', (app) => { + app.layouts[layoutName] = { + file: join('#build', filename), + name: layoutName + } + }) + } +} diff --git a/packages/kit/src/module/container.ts b/packages/kit/src/module/container.ts index 8a75b40c6f3..4f5cf20fac7 100644 --- a/packages/kit/src/module/container.ts +++ b/packages/kit/src/module/container.ts @@ -1,8 +1,8 @@ -import { parse, relative } from 'pathe' +import { relative } from 'pathe' import type { Nuxt, NuxtPluginTemplate, NuxtTemplate, ModuleContainer } from '@nuxt/schema' -import { logger } from '../logger' import { chainFn } from '../internal/task' import { addTemplate } from '../template' +import { addLayout } from '../layout' import { addServerMiddleware } from '../server' import { isNuxt2 } from '../compatibility' import { addPluginTemplate } from '../plugin' @@ -61,18 +61,8 @@ export function useModuleContainer (nuxt: Nuxt = useNuxt()): ModuleContainer { return addPluginTemplate(pluginTemplate) }, - addLayout (tmpl: NuxtTemplate, name: string) { - const { filename, src } = addTemplate(tmpl) - const layoutName = name || parse(src).name - const layout = nuxt.options.layouts[layoutName] - - if (layout) { - logger.warn(`Duplicate layout registration, "${layoutName}" has been registered as "${layout}"`) - } - nuxt.options.layouts[layoutName] = `./${filename}` - if (name === 'error') { - this.addErrorLayout(filename) - } + addLayout (tmpl: NuxtTemplate, name?: string) { + return addLayout(nuxt, name) }, addErrorLayout (dst: string) { From 2c093d70ca7e4ce8b4f8e45e0fe592828395ef67 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 20 Jun 2022 16:47:42 +0100 Subject: [PATCH 2/5] fix: typo --- packages/kit/src/module/container.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/module/container.ts b/packages/kit/src/module/container.ts index 4f5cf20fac7..4cdd89e0fdc 100644 --- a/packages/kit/src/module/container.ts +++ b/packages/kit/src/module/container.ts @@ -62,7 +62,7 @@ export function useModuleContainer (nuxt: Nuxt = useNuxt()): ModuleContainer { }, addLayout (tmpl: NuxtTemplate, name?: string) { - return addLayout(nuxt, name) + return addLayout(tmpl, name) }, addErrorLayout (dst: string) { From b5856aaeaac655fbdafbbd9dcfeeb306055f43fb Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 21 Jun 2022 14:33:09 +0100 Subject: [PATCH 3/5] fix!: expose util, early return & don't override layouts --- packages/kit/src/index.ts | 1 + packages/kit/src/layout.ts | 29 +++++++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/kit/src/index.ts b/packages/kit/src/index.ts index b283f63f3c4..931396243bd 100644 --- a/packages/kit/src/index.ts +++ b/packages/kit/src/index.ts @@ -14,6 +14,7 @@ export * from './compatibility' export * from './components' export * from './context' export * from './ignore' +export * from './layout' export * from './pages' export * from './plugin' export * from './resolve' diff --git a/packages/kit/src/layout.ts b/packages/kit/src/layout.ts index 2b195848fe0..6548711f114 100644 --- a/packages/kit/src/layout.ts +++ b/packages/kit/src/layout.ts @@ -1,5 +1,5 @@ import { NuxtTemplate } from '@nuxt/schema' -import { join, parse } from 'pathe' +import { join, parse, relative } from 'pathe' import { isNuxt2 } from './compatibility' import { useNuxt } from './context' import { logger } from './logger' @@ -14,19 +14,28 @@ export function addLayout (tmpl: NuxtTemplate, name?: string) { // Nuxt 2 adds layouts in options const layout = nuxt.options.layouts[layoutName] if (layout) { - logger.warn(`Duplicate layout registration, "${layoutName}" has been registered as "${layout}"`) + return logger.warn( + `Not overriding \`${layoutName}\` (provided by \`${layout}\`) with \`${src || filename}\`.` + ) } nuxt.options.layouts[layoutName] = `./${filename}` if (name === 'error') { this.addErrorLayout(filename) } - } else { - // Nuxt 3 adds layouts on app - nuxt.hook('app:templates', (app) => { - app.layouts[layoutName] = { - file: join('#build', filename), - name: layoutName - } - }) + return } + + // Nuxt 3 adds layouts on app + nuxt.hook('app:templates', (app) => { + if (layoutName in app.layouts) { + const relativePath = relative(nuxt.options.srcDir, app.layouts[layoutName].file) + return logger.warn( + `Not overriding \`${layoutName}\` (provided by \`~/${relativePath}\`) with \`${src || filename}\`.` + ) + } + app.layouts[layoutName] = { + file: join('#build', filename), + name: layoutName + } + }) } From 36198a6ad7d33265221fb8abb75f2536064aa454 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 22 Jun 2022 18:38:33 +0100 Subject: [PATCH 4/5] style: use type import Co-authored-by: pooya parsa --- packages/kit/src/layout.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/layout.ts b/packages/kit/src/layout.ts index 6548711f114..cb98cd62b71 100644 --- a/packages/kit/src/layout.ts +++ b/packages/kit/src/layout.ts @@ -1,4 +1,4 @@ -import { NuxtTemplate } from '@nuxt/schema' +import type { NuxtTemplate } from '@nuxt/schema' import { join, parse, relative } from 'pathe' import { isNuxt2 } from './compatibility' import { useNuxt } from './context' From 7fc4a4ac104cc28ac9a20c8194ee5d03f37d0685 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 22 Jun 2022 18:43:36 +0100 Subject: [PATCH 5/5] fix: normalize layout name to kebab case --- packages/kit/src/layout.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kit/src/layout.ts b/packages/kit/src/layout.ts index cb98cd62b71..5bd2f986da1 100644 --- a/packages/kit/src/layout.ts +++ b/packages/kit/src/layout.ts @@ -1,5 +1,6 @@ import type { NuxtTemplate } from '@nuxt/schema' import { join, parse, relative } from 'pathe' +import { kebabCase } from 'scule' import { isNuxt2 } from './compatibility' import { useNuxt } from './context' import { logger } from './logger' @@ -8,7 +9,7 @@ import { addTemplate } from './template' export function addLayout (tmpl: NuxtTemplate, name?: string) { const nuxt = useNuxt() const { filename, src } = addTemplate(tmpl) - const layoutName = name || parse(src || filename).name + const layoutName = kebabCase(name || parse(tmpl.filename).name).replace(/["']/g, '') if (isNuxt2(nuxt)) { // Nuxt 2 adds layouts in options