@@ -16,15 +16,23 @@ async function buildContentrainAssets(
1616 buildDir : string ,
1717 options : ContentrainOptions ,
1818) {
19+ if ( ! contentDir ) {
20+ console . warn ( '[Contentrain Module] Content directory is not configured; skipping asset build' ) ;
21+ return [ ] ;
22+ }
23+
1924 await fs . mkdir ( buildDir , { recursive : true } ) ;
2025
2126 try {
2227 const metadataPath = join ( contentDir , 'models' , 'metadata.json' ) ;
23- const metadata = JSON . parse ( await fs . readFile ( metadataPath , 'utf-8' ) ) ;
24- await fs . copyFile (
25- metadataPath ,
26- join ( buildDir , 'metadata.json' ) ,
27- ) ;
28+ const metadataExists = await fs . stat ( metadataPath ) . then ( ( ) => true ) . catch ( ( ) => false ) ;
29+
30+ if ( ! metadataExists ) {
31+ console . warn ( '[Contentrain Module] Metadata file not found; skipping asset build' ) ;
32+ return [ ] ;
33+ }
34+
35+ const metadata : ModelMetadata [ ] = JSON . parse ( await fs . readFile ( metadataPath , 'utf-8' ) ) ;
2836 await Promise . all ( metadata . map ( async ( model : ModelMetadata ) => {
2937 const modelDir = join ( buildDir , model . modelId ) ;
3038 await fs . mkdir ( modelDir , { recursive : true } ) ;
@@ -48,6 +56,9 @@ async function buildContentrainAssets(
4856 langFiles = [ options . defaultLocale || 'en' ] ;
4957 }
5058
59+ // locales alanını doldur
60+ model . locales = langFiles . length ? langFiles : [ options . defaultLocale || 'en' ] ;
61+
5162 await Promise . all ( langFiles . map ( async ( lang ) => {
5263 const sourcePath = join ( contentDir , model . modelId , `${ lang } .json` ) ;
5364 const targetPath = join ( modelDir , `${ lang } .json` ) ;
@@ -75,6 +86,9 @@ async function buildContentrainAssets(
7586 }
7687 } ) ) ;
7788
89+ // Yazılmış (mutated) metadata'yı build dizinine kaydet
90+ await fs . writeFile ( join ( buildDir , 'metadata.json' ) , JSON . stringify ( metadata , null , 2 ) , 'utf-8' ) ;
91+
7892 const assetsPath = join ( contentDir , 'assets.json' ) ;
7993 if ( await fs . stat ( assetsPath ) . catch ( ( ) => false ) ) {
8094 await fs . copyFile ( assetsPath , join ( buildDir , 'assets.json' ) ) ;
@@ -124,7 +138,7 @@ export default defineNuxtModule<ContentrainOptions>({
124138 name : '@contentrain/nuxt-json' ,
125139 configKey : 'contentrain' ,
126140 compatibility : {
127- nuxt : '^3.0.0' ,
141+ nuxt : '^3.0.0 || ^4.0.0 ' ,
128142 } ,
129143 } ,
130144
@@ -140,6 +154,7 @@ export default defineNuxtModule<ContentrainOptions>({
140154 setup ( options , nuxt ) {
141155 const resolver = createResolver ( import . meta. url ) ;
142156 const resolve = resolver . resolve . bind ( resolver ) ;
157+ const hasContentDir = Boolean ( options . path && options . path . trim ( ) . length > 0 ) ;
143158
144159 console . info ( '[Contentrain Module] Initializing module' , {
145160 path : options . path ,
@@ -175,22 +190,29 @@ export default defineNuxtModule<ContentrainOptions>({
175190 nuxt . hooks . hook ( 'nitro:config' , async ( nitroConfig ) => {
176191 console . info ( '[Contentrain Module] Configuring Nitro' ) ;
177192
178- const buildDir = join ( options . path , '.contentrain-build' ) ;
179- await buildContentrainAssets ( options . path , buildDir , options ) ;
193+ let metadata : ModelMetadata [ ] = [ ] ;
194+ let buildDir : string | undefined ;
195+
196+ if ( hasContentDir ) {
197+ buildDir = join ( options . path , '.contentrain-build' ) ;
198+ metadata = await buildContentrainAssets ( options . path , buildDir , options ) ;
199+ }
180200
181201 nitroConfig . storage = nitroConfig . storage || { } ;
182202 nitroConfig . storage . data = {
183203 driver : options . storage ?. driver || 'memory' ,
184204 base : options . storage ?. base || '.contentrain' ,
185205 } ;
186206
187- nitroConfig . serverAssets = nitroConfig . serverAssets || [ ] ;
188- nitroConfig . serverAssets . push ( {
189- baseName : 'contentrain' ,
190- dir : buildDir ,
191- } ) ;
207+ if ( buildDir ) {
208+ nitroConfig . serverAssets = nitroConfig . serverAssets || [ ] ;
209+ nitroConfig . serverAssets . push ( {
210+ baseName : 'contentrain' ,
211+ dir : buildDir ,
212+ } ) ;
213+ }
192214
193- if ( options . path ) {
215+ if ( hasContentDir ) {
194216 const publicAssetsDir = join ( options . path , 'public' ) ;
195217 nitroConfig . publicAssets = nitroConfig . publicAssets || [ ] ;
196218 nitroConfig . publicAssets . push ( {
@@ -202,21 +224,21 @@ export default defineNuxtModule<ContentrainOptions>({
202224 nitroConfig . prerender = nitroConfig . prerender || { } ;
203225 nitroConfig . prerender . routes = nitroConfig . prerender . routes || [ ] ;
204226
205- try {
206- const metadataPath = join ( options . path , 'models' , 'metadata.json' ) ;
207- const metadata = JSON . parse ( await fs . readFile ( metadataPath , 'utf-8' ) ) ;
227+ if ( hasContentDir && metadata . length ) {
208228 for ( const model of metadata ) {
209229 const route = `/_contentrain/api/query?modelId=${ model . modelId } ` ;
210230 nitroConfig . prerender . routes . push ( route ) ;
211231 }
212232 }
213- catch ( error ) {
214- console . warn ( '[Contentrain Module] Error during prerender configuration:' , error ) ;
233+ else if ( ! hasContentDir ) {
234+ console . warn ( '[Contentrain Module] Skipping prerender configuration because content path is missing' ) ;
215235 }
216236
217237 nitroConfig . externals = nitroConfig . externals || { } ;
218238 nitroConfig . externals . inline = nitroConfig . externals . inline || [ ] ;
219- nitroConfig . externals . inline . push ( options . path ) ;
239+ if ( hasContentDir ) {
240+ nitroConfig . externals . inline . push ( options . path ) ;
241+ }
220242
221243 nitroConfig . imports = {
222244 ...nitroConfig . imports ,
@@ -255,6 +277,12 @@ export default defineNuxtModule<ContentrainOptions>({
255277 addTypeTemplate ( {
256278 filename : 'types/contentrain.d.ts' ,
257279 getContents : async ( ) => {
280+ if ( ! hasContentDir ) {
281+ return `// Contentrain types are unavailable because the content directory is not configured.
282+ export {};
283+ ` ;
284+ }
285+
258286 try {
259287 const typeDefinitions = await typeGenerator . generateTypes ( ) ;
260288 console . info ( '[Contentrain Module] Type definitions generated successfully' ) ;
0 commit comments