{"version":3,"sources":["../../../../../../src/build/webpack/loaders/metadata/discover.ts"],"sourcesContent":["import type {\n  CollectingMetadata,\n  PossibleStaticMetadataFileNameConvention,\n} from './types'\nimport path from 'path'\nimport { stringify } from 'querystring'\nimport { STATIC_METADATA_IMAGES } from '../../../../lib/metadata/is-metadata-route'\nimport { WEBPACK_RESOURCE_QUERIES } from '../../../../lib/constants'\nimport type { MetadataResolver } from '../next-app-loader'\nimport type { PageExtensions } from '../../../page-extensions-type'\n\nconst METADATA_TYPE = 'metadata'\nconst NUMERIC_SUFFIX_ARRAY = Array(10).fill(0)\n\n// Produce all compositions with filename (icon, apple-icon, etc.) with extensions (png, jpg, etc.)\nasync function enumMetadataFiles(\n  dir: string,\n  filename: string,\n  extensions: readonly string[],\n  {\n    metadataResolver,\n    // When set to true, possible filename without extension could: icon, icon0, ..., icon9\n    numericSuffix,\n  }: {\n    metadataResolver: MetadataResolver\n    numericSuffix: boolean\n  }\n): Promise<string[]> {\n  const collectedFiles: string[] = []\n\n  // Collect <filename>.<ext>, <filename>[].<ext>\n  const possibleFileNames = [filename].concat(\n    numericSuffix\n      ? NUMERIC_SUFFIX_ARRAY.map((_, index) => filename + index)\n      : []\n  )\n  for (const name of possibleFileNames) {\n    const resolved = await metadataResolver(dir, name, extensions)\n    collectedFiles.push(...resolved)\n  }\n\n  return collectedFiles\n}\n\nexport async function createStaticMetadataFromRoute(\n  resolvedDir: string,\n  {\n    segment,\n    metadataResolver,\n    isRootLayoutOrRootPage,\n    pageExtensions,\n    basePath,\n  }: {\n    segment: string\n    metadataResolver: MetadataResolver\n    isRootLayoutOrRootPage: boolean\n    pageExtensions: PageExtensions\n    basePath: string\n  }\n) {\n  let hasStaticMetadataFiles = false\n  const staticImagesMetadata: CollectingMetadata = {\n    icon: [],\n    apple: [],\n    twitter: [],\n    openGraph: [],\n    manifest: undefined,\n  }\n\n  async function collectIconModuleIfExists(\n    type: PossibleStaticMetadataFileNameConvention\n  ) {\n    if (type === 'manifest') {\n      const staticManifestExtension = ['webmanifest', 'json']\n      const manifestFile = await enumMetadataFiles(\n        resolvedDir,\n        'manifest',\n        staticManifestExtension.concat(pageExtensions),\n        { metadataResolver, numericSuffix: false }\n      )\n      if (manifestFile.length > 0) {\n        hasStaticMetadataFiles = true\n        const { name, ext } = path.parse(manifestFile[0])\n        const extension = staticManifestExtension.includes(ext.slice(1))\n          ? ext.slice(1)\n          : 'webmanifest'\n        staticImagesMetadata.manifest = JSON.stringify(\n          `${basePath}/${name}.${extension}`\n        )\n      }\n      return\n    }\n\n    const isFavicon = type === 'favicon'\n    const resolvedMetadataFiles = await enumMetadataFiles(\n      resolvedDir,\n      STATIC_METADATA_IMAGES[type].filename,\n      [\n        ...STATIC_METADATA_IMAGES[type].extensions,\n        ...(isFavicon ? [] : pageExtensions),\n      ],\n      { metadataResolver, numericSuffix: !isFavicon }\n    )\n    resolvedMetadataFiles\n      .sort((a, b) => a.localeCompare(b))\n      .forEach((filepath) => {\n        const imageModuleImportSource = `next-metadata-image-loader?${stringify(\n          {\n            type,\n            segment,\n            basePath,\n            pageExtensions,\n          }\n          // WEBPACK_RESOURCE_QUERIES.metadata query here only for filtering out applying to image loader\n        )}!${filepath}?${WEBPACK_RESOURCE_QUERIES.metadata}`\n\n        const imageModule = `(async (props) => (await import(/* webpackMode: \"eager\" */ ${JSON.stringify(\n          imageModuleImportSource\n        )})).default(props))`\n        hasStaticMetadataFiles = true\n        if (type === 'favicon') {\n          staticImagesMetadata.icon.unshift(imageModule)\n        } else {\n          staticImagesMetadata[type].push(imageModule)\n        }\n      })\n  }\n\n  // Intentionally make these serial to reuse directory access cache.\n  await collectIconModuleIfExists('icon')\n  await collectIconModuleIfExists('apple')\n  await collectIconModuleIfExists('openGraph')\n  await collectIconModuleIfExists('twitter')\n  if (isRootLayoutOrRootPage) {\n    await collectIconModuleIfExists('favicon')\n    await collectIconModuleIfExists('manifest')\n  }\n\n  return hasStaticMetadataFiles ? staticImagesMetadata : null\n}\n\nexport function createMetadataExportsCode(\n  metadata: Awaited<ReturnType<typeof createStaticMetadataFromRoute>>\n) {\n  return metadata\n    ? `${METADATA_TYPE}: {\n    icon: [${metadata.icon.join(',')}],\n    apple: [${metadata.apple.join(',')}],\n    openGraph: [${metadata.openGraph.join(',')}],\n    twitter: [${metadata.twitter.join(',')}],\n    manifest: ${metadata.manifest ? metadata.manifest : 'undefined'}\n  }`\n    : ''\n}\n"],"names":["path","stringify","STATIC_METADATA_IMAGES","WEBPACK_RESOURCE_QUERIES","METADATA_TYPE","NUMERIC_SUFFIX_ARRAY","Array","fill","enumMetadataFiles","dir","filename","extensions","metadataResolver","numericSuffix","collectedFiles","possibleFileNames","concat","map","_","index","name","resolved","push","createStaticMetadataFromRoute","resolvedDir","segment","isRootLayoutOrRootPage","pageExtensions","basePath","hasStaticMetadataFiles","staticImagesMetadata","icon","apple","twitter","openGraph","manifest","undefined","collectIconModuleIfExists","type","staticManifestExtension","manifestFile","length","ext","parse","extension","includes","slice","JSON","isFavicon","resolvedMetadataFiles","sort","a","b","localeCompare","forEach","filepath","imageModuleImportSource","metadata","imageModule","unshift","createMetadataExportsCode","join"],"mappings":"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","ignoreList":[0]}