Skip to content

Commit 6a9eb83

Browse files
committed
feat: load content config of each Nuxt layer
1 parent 0e02c09 commit 6a9eb83

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

src/module.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { collectionsTemplate, componentsManifestTemplate, contentTypesTemplate,
2222
import type { ResolvedCollection } from './types/collection'
2323
import type { ModuleOptions, SqliteDatabaseConfig } from './types/module'
2424
import { getContentChecksum, localDatabase, logger, watchContents, chunks, watchComponents, watchConfig } from './utils/dev'
25-
import { loadContentConfig } from './utils/config'
25+
import { loadLayersConfig } from './utils/config'
2626
import { parseContent } from './utils/content'
2727
import { installMDCModule } from './utils/mdc'
2828
import { findPreset } from './presets'
@@ -91,7 +91,7 @@ export default defineNuxtModule<ModuleOptions>({
9191
await mkdir(dirname((options.database as SqliteDatabaseConfig).filename), { recursive: true }).catch(() => {})
9292
}
9393

94-
const { collections } = await loadContentConfig(nuxt.options.rootDir, { defaultFallback: true })
94+
const { collections } = await loadLayersConfig(nuxt)
9595
manifest.collections = collections
9696

9797
nuxt.options.runtimeConfig.public.content = {
@@ -127,11 +127,11 @@ export default defineNuxtModule<ModuleOptions>({
127127

128128
// Add Templates & aliases
129129
nuxt.options.nitro.alias = nuxt.options.nitro.alias || {}
130-
addTypeTemplate(contentTypesTemplate(collections))
130+
addTypeTemplate(contentTypesTemplate(manifest.collections))
131131
addTemplate(fullDatabaseRawDumpTemplate(manifest))
132-
nuxt.options.nitro.alias['#content/collections'] = addTemplate(collectionsTemplate(collections)).dst
132+
nuxt.options.nitro.alias['#content/collections'] = addTemplate(collectionsTemplate(manifest.collections)).dst
133133
nuxt.options.alias['#content/components'] = addTemplate(componentsManifestTemplate(manifest)).dst
134-
nuxt.options.alias['#content/manifest'] = addTemplate(manifestTemplate(collections, manifest)).dst
134+
nuxt.options.alias['#content/manifest'] = addTemplate(manifestTemplate(manifest)).dst
135135

136136
// Load preset
137137
nuxt.hook('nitro:config', async (config) => {
@@ -150,7 +150,7 @@ export default defineNuxtModule<ModuleOptions>({
150150
})
151151

152152
nuxt.options.routeRules ||= {}
153-
collections.forEach((collection) => {
153+
manifest.collections.forEach((collection) => {
154154
if (!collection.private) {
155155
nuxt.options.routeRules![`/api/content/${collection.name}/database.sql`] = { prerender: true }
156156
}
@@ -162,7 +162,7 @@ export default defineNuxtModule<ModuleOptions>({
162162
return
163163
}
164164

165-
const dumpGeneratePromise = processCollectionItems(nuxt, collections, options)
165+
const dumpGeneratePromise = processCollectionItems(nuxt, manifest.collections, options)
166166
.then((fest) => {
167167
manifest.checksum = fest.checksum
168168
manifest.dump = fest.dump
@@ -184,7 +184,7 @@ export default defineNuxtModule<ModuleOptions>({
184184

185185
if (nuxt.options.dev) {
186186
addPlugin({ src: resolver.resolve('./runtime/plugins/websocket.dev'), mode: 'client' })
187-
await watchContents(nuxt, collections, options, manifest)
187+
await watchContents(nuxt, options, manifest)
188188
await watchComponents(nuxt)
189189
await watchConfig(nuxt)
190190
}

src/utils/config.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import { stat } from 'node:fs/promises'
12
import { loadConfig } from 'c12'
3+
import type { Nuxt } from '@nuxt/schema'
4+
import { join } from 'pathe'
5+
import type { ResolvedCollection } from '../types'
26
import { defineCollection, resolveCollections } from './collection'
37
import { logger } from './dev'
48

@@ -25,3 +29,22 @@ export async function loadContentConfig(rootDir: string, opts: { defaultFallback
2529
collections: resolveCollections(config.collections || {}),
2630
}
2731
}
32+
33+
export async function loadLayersConfig(nuxt: Nuxt) {
34+
const collectionMap = {} as Record<string, ResolvedCollection>
35+
const _layers = [...nuxt.options._layers].reverse()
36+
for (const layer of _layers) {
37+
const rootDir = layer.config.rootDir
38+
const configStat = await stat(join(rootDir, 'content.config.ts')).catch(() => null)
39+
if (configStat && configStat.isFile()) {
40+
const { collections } = await loadContentConfig(rootDir, { defaultFallback: false })
41+
for (const collection of collections) {
42+
collectionMap[collection.name] = collection
43+
}
44+
}
45+
}
46+
47+
return {
48+
collections: Object.values(collectionMap),
49+
}
50+
}

src/utils/dev.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,17 @@ import { resolve } from 'pathe'
1212
import type { WebSocket } from 'ws'
1313
import { WebSocketServer } from 'ws'
1414
import { listen, type Listener } from 'listhen'
15-
import type { ResolvedCollection, ModuleOptions } from '../types'
15+
import type { ModuleOptions } from '../types'
1616
import type { Manifest } from '../types/manifest'
1717
import { generateCollectionInsert, parseSourceBase } from './collection'
1818
import { parseContent } from './content'
1919
import { moduleTemplates } from './templates'
2020

2121
export const logger: ConsolaInstance = useLogger('@nuxt/content')
2222

23-
export async function watchContents(nuxt: Nuxt, collections: ResolvedCollection[], options: ModuleOptions, manifest: Manifest) {
23+
export async function watchContents(nuxt: Nuxt, options: ModuleOptions, manifest: Manifest) {
2424
const db = localDatabase(options._localDatabase!.filename)
25+
const collections = manifest.collections
2526

2627
const localCollections = collections.filter(c => c.source && !c.source.repository)
2728

src/utils/templates.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,10 @@ export const componentsManifestTemplate = (manifest: Manifest) => {
159159
} satisfies NuxtTemplate
160160
}
161161

162-
export const manifestTemplate = (collections: ResolvedCollection[], manifest: Manifest) => ({
162+
export const manifestTemplate = (manifest: Manifest) => ({
163163
filename: moduleTemplates.manifest,
164-
getContents: ({ options }: { options: { collections: ResolvedCollection[], manifest: Manifest } }) => {
165-
const collectionsMeta = options.collections.reduce((acc, collection) => {
164+
getContents: ({ options }: { options: { manifest: Manifest } }) => {
165+
const collectionsMeta = options.manifest.collections.reduce((acc, collection) => {
166166
acc[collection.name] = {
167167
jsonFields: collection.jsonFields,
168168
}
@@ -173,7 +173,7 @@ export const manifestTemplate = (collections: ResolvedCollection[], manifest: Ma
173173
`export const checksums = ${JSON.stringify(manifest.checksum, null, 2)}`,
174174
'',
175175
`export const tables = ${JSON.stringify(
176-
Object.fromEntries(collections.map(c => [c.name, c.tableName])),
176+
Object.fromEntries(manifest.collections.map(c => [c.name, c.tableName])),
177177
null,
178178
2,
179179
)}`,
@@ -182,7 +182,6 @@ export const manifestTemplate = (collections: ResolvedCollection[], manifest: Ma
182182
].join('\n')
183183
},
184184
options: {
185-
collections,
186185
manifest,
187186
},
188187
write: true,

0 commit comments

Comments
 (0)