Skip to content

Commit 41071f1

Browse files
committed
feat: components level
1 parent 3d13c4f commit 41071f1

File tree

12 files changed

+59
-23
lines changed

12 files changed

+59
-23
lines changed

src/index.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import type { NuxtConfig } from '@nuxt/types'
55

66
declare module '@nuxt/types' {
77
interface NuxtConfig {
8-
_level?: Number
8+
_level?: number
99
hooks?: configHooksT
1010
name?: string
1111
extends?: string
1212
alias?: { [key: string]: string }
1313
}
1414
}
1515

16-
export function resolveConfig (config: string | NuxtConfig, from: string = process.cwd()): NuxtConfig {
16+
export function resolveConfig (config: string | NuxtConfig, from: string = process.cwd(), level = 0): NuxtConfig {
1717
if (typeof config === 'string') {
1818
const jiti = require('jiti')(from)
1919
const name = config
@@ -33,8 +33,10 @@ export function resolveConfig (config: string | NuxtConfig, from: string = proce
3333
config.rootDir = from
3434
}
3535

36+
config._level = level
37+
3638
if (config.extends) {
37-
const _resolvedExtends = resolveConfig(config.extends, config.rootDir)
39+
const _resolvedExtends = resolveConfig(config.extends, config.rootDir, level + 1)
3840
config = extendConfig(config, _resolvedExtends)
3941
}
4042

@@ -53,10 +55,6 @@ export function extendConfig (target: NuxtConfig, base: NuxtConfig): NuxtConfig
5355
base.srcDir = base.rootDir
5456
}
5557

56-
// Set _level
57-
target._level = target._level || 0
58-
base._level = target.level + 1
59-
6058
// Ensure there is no name conflict
6159
if (target.alias && target.alias['~' + base.name]) {
6260
throw new Error('Theme name conflict: ' + base.name)
@@ -78,28 +76,28 @@ export function extendConfig (target: NuxtConfig, base: NuxtConfig): NuxtConfig
7876
// Merge components prop
7977
if (base.components || target.components) {
8078
override.components = [
81-
...normalizeComponents(base.components, { level: base._level }),
82-
...normalizeComponents(target.components, { level: target._level })
79+
...normalizeComponents(target.components, { level: target._level }),
80+
...normalizeComponents(base.components, { level: base._level })
8381
]
8482
}
8583

8684
// Merge with defu
87-
return defu.arrayFn(override, target, base)
85+
return { ...defu.arrayFn(target, base), ...override }
8886
}
8987

90-
function normalizeComponents (components: NuxtConfig['components'], dirOverride = {}) {
91-
if (typeof components === 'boolean') {
88+
function normalizeComponents (components: NuxtConfig['components'], defaults = {}) {
89+
if (typeof components === 'boolean' || !components) {
9290
components = []
9391
}
9492

9593
if (!Array.isArray(components)) {
9694
// TODO: Deprecate components: { dirs } support from @nuxt/components
97-
throw new TypeError('`components` should be an array')
95+
throw new TypeError('`components` should be an array: ' + typeof components)
9896
}
9997

10098
components = components.map(dir => ({
101-
...(typeof dir === 'string' ? { dir } : dir),
102-
...dirOverride
99+
...defaults,
100+
...(typeof dir === 'string' ? { path: dir } : dir)
103101
}))
104102

105103
return components

test/__snapshots__/index.test.ts.snap

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
exports[`matches snapshot 1`] = `
44
Object {
5-
"_level": Object {},
5+
"_level": 0,
66
"alias": Object {
77
"@@baseTheme": "{test}/fixture/themes/base",
88
"@@baseThemeEx": "{test}/fixture/themes/red",
@@ -13,6 +13,21 @@ Object {
1313
"~~baseTheme": "{test}/fixture/themes/base",
1414
"~~baseThemeEx": "{test}/fixture/themes/red",
1515
},
16+
"components": Array [
17+
Object {
18+
"level": 0,
19+
"path": "{test}/fixture/app/components",
20+
},
21+
Object {
22+
"level": 1,
23+
"path": "{test}/fixture/themes/red/components",
24+
},
25+
Object {
26+
"global": true,
27+
"level": 2,
28+
"path": "{test}/fixture/themes/base/components",
29+
},
30+
],
1631
"extends": "../themes/red/nuxt.config",
1732
"hooks": Object {},
1833
"name": "myApp",

test/fixture/app/components/.gitkeep

Whitespace-only changes.

test/fixture/app/logconfig.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log(require('jiti')(__dirname)('./nuxt.config.ts'))

test/fixture/app/nuxt.config.cjs.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export default require('jiti')(__dirname)('./nuxt.config.ts')
2+
3+
console.log(require('jiti')(__dirname)('./nuxt.config.ts').default.components)

test/fixture/app/nuxt.config.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
import { resolve } from 'path'
12
import type { NuxtConfig } from '@nuxt/types'
23
import { resolveConfig } from '../../../src/index'
34

45
export default <NuxtConfig>resolveConfig({
56
name: 'myApp',
67
rootDir: __dirname,
7-
extends: '../themes/red/nuxt.config'
8+
extends: '../themes/red/nuxt.config',
9+
10+
components: [
11+
resolve(__dirname, 'components')
12+
]
813
})

test/fixture/themes/base/components/.gitkeep

Whitespace-only changes.

test/fixture/themes/base/nuxt.config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { resolve } from 'path'
12
import type { NuxtConfig } from '@nuxt/types'
23
import { resolveConfig } from '../../../../src/index'
34

@@ -6,6 +7,10 @@ export default <NuxtConfig>resolveConfig({
67
rootDir: __dirname,
78
srcDir: __dirname,
89

10+
components: [
11+
{ path: resolve(__dirname, 'components'), global: true }
12+
],
13+
914
publicRuntimeConfig: {
1015
color: 'blue'
1116
}

test/fixture/themes/red/components/.gitkeep

Whitespace-only changes.

test/fixture/themes/red/nuxt.config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
import { resolve } from 'path'
2+
13
export default {
24
name: 'baseThemeEx',
35
rootDir: __dirname,
46
extends: '../base/nuxt.config',
57

8+
components: [
9+
resolve(__dirname, 'components')
10+
],
11+
612
publicRuntimeConfig: {
713
color: 'red'
814
}

0 commit comments

Comments
 (0)