@@ -153,13 +153,12 @@ export async function GET() {
153
153
`
154
154
}
155
155
156
- // <metadata-image>/[id]/route.js
157
156
async function getDynamicImageRouteCode (
158
157
resourcePath : string ,
159
158
loaderContext : webpack . LoaderContext < any >
160
159
) {
161
160
return `\
162
- /* dynamic image route */
161
+ /* dynamic image route with generateImageMetadata */
163
162
import { NextResponse } from 'next/server'
164
163
import * as userland from ${ JSON . stringify ( resourcePath ) }
165
164
@@ -175,31 +174,63 @@ export async function GET(_, ctx) {
175
174
const params = await ctx.params
176
175
const { __metadata_id__, ...rest } = params || {}
177
176
const restParams = params ? rest : undefined
178
- const targetId = __metadata_id__
179
- let id = undefined
180
-
181
- if (generateImageMetadata) {
182
- const imageMetadata = await generateImageMetadata({ params: restParams })
183
- id = imageMetadata.find((item) => {
184
- if (process.env.NODE_ENV !== 'production') {
185
- if (item?.id == null) {
186
- throw new Error('id property is required for every item returned from generateImageMetadata')
187
- }
177
+ const imageMetadata = await generateImageMetadata({ params: restParams })
178
+ const id = imageMetadata.find((item) => {
179
+ if (process.env.NODE_ENV !== 'production') {
180
+ if (item?.id == null) {
181
+ throw new Error('id property is required for every item returned from generateImageMetadata')
188
182
}
189
- return item.id.toString() === targetId
190
- })?.id
191
- if (id == null) {
192
- return new NextResponse('Not Found', {
193
- status: 404,
194
- })
195
183
}
184
+ return item.id.toString() === __metadata_id__
185
+ })?.id
186
+ if (id == null) {
187
+ return new NextResponse('Not Found', {
188
+ status: 404,
189
+ })
196
190
}
197
191
198
- return handler({ params: restParams, id })
192
+ return handler({ params: ctx.params })
199
193
}
200
194
`
201
195
}
202
196
197
+ async function getSingleImageRouteCode (
198
+ resourcePath : string ,
199
+ loaderContext : webpack . LoaderContext < any >
200
+ ) {
201
+ return `\
202
+ /* dynamic image route without generateImageMetadata */
203
+ import { NextResponse } from 'next/server'
204
+ import { default as handler } from ${ JSON . stringify ( resourcePath ) }
205
+
206
+ ${ errorOnBadHandler ( resourcePath ) }
207
+ ${ await createReExportsCode ( resourcePath , loaderContext ) }
208
+
209
+ export async function GET(_, ctx) {
210
+ return handler({ params: await ctx.params })
211
+ }
212
+ `
213
+ }
214
+
215
+ // <metadata-image>/[id]/route.js
216
+ async function getImageRouteCode (
217
+ resourcePath : string ,
218
+ loaderContext : webpack . LoaderContext < any >
219
+ ) {
220
+ const exportNames = await getLoaderModuleNamedExports (
221
+ resourcePath ,
222
+ loaderContext
223
+ )
224
+
225
+ const hasGenerateImageMetadata = exportNames . includes ( 'generateImageMetadata' )
226
+
227
+ if ( hasGenerateImageMetadata ) {
228
+ return getDynamicImageRouteCode ( resourcePath , loaderContext )
229
+ } else {
230
+ return getSingleImageRouteCode ( resourcePath , loaderContext )
231
+ }
232
+ }
233
+
203
234
async function getDynamicSitemapRouteCode (
204
235
resourcePath : string ,
205
236
loaderContext : webpack . LoaderContext < any >
@@ -242,16 +273,16 @@ ${errorOnBadHandler(resourcePath)}
242
273
${ await createReExportsCode ( resourcePath , loaderContext ) }
243
274
244
275
export async function GET(_, ctx) {
245
- const { __metadata_id__: id, ...params } = await ctx.params || {}
246
- const hasXmlExtension = id ? id.endsWith('.xml') : false
247
-
248
- if (id && !hasXmlExtension) {
249
- return new NextResponse('Not Found', {
250
- status: 404,
251
- })
252
- }
253
-
276
+ let targetId
254
277
if (process.env.NODE_ENV !== 'production' && sitemapModule.generateSitemaps) {
278
+ const { __metadata_id__: id, ...params } = await ctx.params || {}
279
+ const hasXmlExtension = id ? id.endsWith('.xml') : false
280
+ if (id && !hasXmlExtension) {
281
+ return new NextResponse('Not Found', {
282
+ status: 404,
283
+ })
284
+ }
285
+ targetId = id && hasXmlExtension ? id.slice(0, -4) : undefined
255
286
const sitemaps = await sitemapModule.generateSitemaps()
256
287
for (const item of sitemaps) {
257
288
if (item?.id == null) {
@@ -260,8 +291,6 @@ export async function GET(_, ctx) {
260
291
}
261
292
}
262
293
263
- const targetId = id && hasXmlExtension ? id.slice(0, -4) : undefined
264
-
265
294
const data = await handler({ id: targetId })
266
295
const content = resolveRouteData(data, fileType)
267
296
@@ -293,7 +322,7 @@ const nextMetadataRouterLoader: webpack.LoaderDefinitionFunction<MetadataRouteLo
293
322
} else if ( fileBaseName === 'sitemap' ) {
294
323
code = await getDynamicSitemapRouteCode ( filePath , this )
295
324
} else {
296
- code = await getDynamicImageRouteCode ( filePath , this )
325
+ code = await getImageRouteCode ( filePath , this )
297
326
}
298
327
} else {
299
328
code = await getStaticAssetRouteCode ( filePath , fileBaseName )
0 commit comments