{"version":3,"file":"config-loader.mjs","sources":["../../src/configuration/config-loader.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport { loadConfigFile } from '../utils/load-config-file';\n\nconst VALID_EXTENSIONS = ['.js', '.json'];\n\n// These filenames are restricted, but will also emit a warning that the filename is probably a mistake\nconst MISTAKEN_FILENAMES = {\n  middleware: 'middlewares',\n  plugin: 'plugins',\n};\n\n// the following are restricted to prevent conflicts with existing STRAPI_* env vars or root level config options\n// must all be lowercase to match validator\nconst RESTRICTED_FILENAMES = [\n  // existing env vars\n  'uuid',\n  'hosting',\n  'license',\n  'enforce',\n  'disable',\n  'enable',\n  'telemetry',\n\n  // reserved for future internal use\n  'strapi',\n  'internal',\n\n  // root level config options\n  // TODO: it would be better to move these out of the root config and allow them to be loaded\n  'launchedAt',\n  'serveAdminPanel',\n  'autoReload',\n  'environment',\n  'packageJsonStrapi',\n  'info',\n  'autoReload',\n  'dirs',\n\n  // probably mistaken/typo filenames\n  ...Object.keys(MISTAKEN_FILENAMES),\n];\n\n// Existing Strapi configuration files\nconst STRAPI_CONFIG_FILENAMES = [\n  'admin',\n  'server',\n  'api',\n  'database',\n  'middlewares',\n  'plugins',\n  'features',\n];\n\n// Note: we don't have access to strapi logger at this point so we can't use it\nconst logWarning = (message: string) => {\n  console.warn(message);\n};\n\nexport default (dir: string) => {\n  if (!fs.existsSync(dir)) return {};\n\n  const allFiles = fs.readdirSync(dir, { withFileTypes: true });\n  const seenFilenames = new Set<string>();\n  const configFiles = allFiles.reduce((acc, file) => {\n    const baseName = path.basename(file.name, path.extname(file.name));\n    const baseNameLower = baseName.toLowerCase();\n    const extension = path.extname(file.name);\n    const extensionLower = extension.toLowerCase();\n\n    if (!file.isFile()) {\n      return acc;\n    }\n\n    if (!VALID_EXTENSIONS.includes(extensionLower)) {\n      logWarning(\n        `Config file not loaded, extension must be one of ${VALID_EXTENSIONS.join(',')}): ${\n          file.name\n        }`\n      );\n      return acc;\n    }\n\n    if (RESTRICTED_FILENAMES.includes(baseNameLower)) {\n      logWarning(`Config file not loaded, restricted filename: ${file.name}`);\n\n      // suggest the filename they probably meant\n      if (baseNameLower in MISTAKEN_FILENAMES) {\n        console.log(\n          `Did you mean ${MISTAKEN_FILENAMES[baseNameLower as keyof typeof MISTAKEN_FILENAMES]}]} ?`\n        );\n      }\n\n      return acc;\n    }\n\n    // restricted names and Strapi configs are also restricted from being prefixes\n    const restrictedPrefix = [...RESTRICTED_FILENAMES, ...STRAPI_CONFIG_FILENAMES].find(\n      (restrictedName) =>\n        restrictedName.startsWith(baseNameLower) && restrictedName !== baseNameLower\n    );\n    if (restrictedPrefix) {\n      logWarning(\n        `Config file not loaded, filename cannot start with ${restrictedPrefix}: ${file.name}`\n      );\n    }\n\n    /**\n     *  Note: If user config files contain non-alpha-numeric characters, we won't be able to auto-load env\n     * into them.\n     *\n     * For the initial feature, we will only load our internal configs, but later when we provide a method\n     * to define the shape of custom configs, we will need to warn that those filenames can't be loaded\n     * for technical limitations on env variable names\n     *  */\n    // if (!/^[A-Za-z0-9]+$/.test(baseName)) {\n    //   logWarning(\"Using a non-alphanumeric config file name prevents Strapi from auto-loading it from environment variables.\")\n    // }\n\n    // filter filenames without case-insensitive uniqueness\n    if (seenFilenames.has(baseNameLower)) {\n      logWarning(\n        `Config file not loaded, case-insensitive name matches other config file: ${file.name}`\n      );\n      return acc;\n    }\n    seenFilenames.add(baseNameLower);\n\n    // If file passes all filters, add it to the accumulator\n    acc.push(file);\n    return acc;\n  }, [] as fs.Dirent[]);\n\n  return configFiles.reduce(\n    (acc, file) => {\n      const key = path.basename(file.name, path.extname(file.name));\n\n      acc[key] = loadConfigFile(path.resolve(dir, file.name));\n\n      return acc;\n    },\n    {} as Record<string, unknown>\n  );\n};\n"],"names":["VALID_EXTENSIONS","MISTAKEN_FILENAMES","middleware","plugin","RESTRICTED_FILENAMES","Object","keys","STRAPI_CONFIG_FILENAMES","logWarning","message","console","warn","dir","fs","existsSync","allFiles","readdirSync","withFileTypes","seenFilenames","Set","configFiles","reduce","acc","file","baseName","path","basename","name","extname","baseNameLower","toLowerCase","extension","extensionLower","isFile","includes","join","log","restrictedPrefix","find","restrictedName","startsWith","has","add","push","key","loadConfigFile","resolve"],"mappings":";;;;AAIA,MAAMA,gBAAAA,GAAmB;AAAC,IAAA,KAAA;AAAO,IAAA;AAAQ,CAAA;AAEzC;AACA,MAAMC,kBAAAA,GAAqB;IACzBC,UAAAA,EAAY,aAAA;IACZC,MAAAA,EAAQ;AACV,CAAA;AAEA;AACA;AACA,MAAMC,oBAAAA,GAAuB;;AAE3B,IAAA,MAAA;AACA,IAAA,SAAA;AACA,IAAA,SAAA;AACA,IAAA,SAAA;AACA,IAAA,SAAA;AACA,IAAA,QAAA;AACA,IAAA,WAAA;;AAGA,IAAA,QAAA;AACA,IAAA,UAAA;;;AAIA,IAAA,YAAA;AACA,IAAA,iBAAA;AACA,IAAA,YAAA;AACA,IAAA,aAAA;AACA,IAAA,mBAAA;AACA,IAAA,MAAA;AACA,IAAA,YAAA;AACA,IAAA,MAAA;;AAGGC,IAAAA,GAAAA,MAAAA,CAAOC,IAAI,CAACL,kBAAAA;AAChB,CAAA;AAED;AACA,MAAMM,uBAAAA,GAA0B;AAC9B,IAAA,OAAA;AACA,IAAA,QAAA;AACA,IAAA,KAAA;AACA,IAAA,UAAA;AACA,IAAA,aAAA;AACA,IAAA,SAAA;AACA,IAAA;AACD,CAAA;AAED;AACA,MAAMC,aAAa,CAACC,OAAAA,GAAAA;AAClBC,IAAAA,OAAAA,CAAQC,IAAI,CAACF,OAAAA,CAAAA;AACf,CAAA;AAEA,oBAAe,CAAA,CAACG,GAAAA,GAAAA;AACd,IAAA,IAAI,CAACC,EAAAA,CAAGC,UAAU,CAACF,GAAAA,CAAAA,EAAM,OAAO,EAAC;AAEjC,IAAA,MAAMG,QAAAA,GAAWF,EAAAA,CAAGG,WAAW,CAACJ,GAAAA,EAAK;QAAEK,aAAAA,EAAe;AAAK,KAAA,CAAA;AAC3D,IAAA,MAAMC,gBAAgB,IAAIC,GAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcL,QAAAA,CAASM,MAAM,CAAC,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;QACxC,MAAMC,QAAAA,GAAWC,IAAAA,CAAKC,QAAQ,CAACH,IAAAA,CAAKI,IAAI,EAAEF,IAAAA,CAAKG,OAAO,CAACL,IAAAA,CAAKI,IAAI,CAAA,CAAA;QAChE,MAAME,aAAAA,GAAgBL,SAASM,WAAW,EAAA;AAC1C,QAAA,MAAMC,SAAAA,GAAYN,IAAAA,CAAKG,OAAO,CAACL,KAAKI,IAAI,CAAA;QACxC,MAAMK,cAAAA,GAAiBD,UAAUD,WAAW,EAAA;QAE5C,IAAI,CAACP,IAAAA,CAAKU,MAAM,EAAA,EAAI;YAClB,OAAOX,GAAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAACtB,gBAAAA,CAAiBkC,QAAQ,CAACF,cAAAA,CAAAA,EAAiB;YAC9CxB,UAAAA,CACE,CAAC,iDAAiD,EAAER,gBAAAA,CAAiBmC,IAAI,CAAC,GAAA,CAAA,CAAK,GAAG,EAChFZ,IAAAA,CAAKI,IAAI,CAAA,CACT,CAAA;YAEJ,OAAOL,GAAAA;AACT,QAAA;QAEA,IAAIlB,oBAAAA,CAAqB8B,QAAQ,CAACL,aAAAA,CAAAA,EAAgB;AAChDrB,YAAAA,UAAAA,CAAW,CAAC,6CAA6C,EAAEe,IAAAA,CAAKI,IAAI,CAAA,CAAE,CAAA;;AAGtE,YAAA,IAAIE,iBAAiB5B,kBAAAA,EAAoB;gBACvCS,OAAAA,CAAQ0B,GAAG,CACT,CAAC,aAAa,EAAEnC,kBAAkB,CAAC4B,aAAAA,CAAiD,CAAC,IAAI,CAAC,CAAA;AAE9F,YAAA;YAEA,OAAOP,GAAAA;AACT,QAAA;;AAGA,QAAA,MAAMe,gBAAAA,GAAmB;AAAIjC,YAAAA,GAAAA,oBAAAA;AAAyBG,YAAAA,GAAAA;SAAwB,CAAC+B,IAAI,CACjF,CAACC,cAAAA,GACCA,eAAeC,UAAU,CAACX,kBAAkBU,cAAAA,KAAmBV,aAAAA,CAAAA;AAEnE,QAAA,IAAIQ,gBAAAA,EAAkB;YACpB7B,UAAAA,CACE,CAAC,mDAAmD,EAAE6B,gBAAAA,CAAiB,EAAE,EAAEd,IAAAA,CAAKI,IAAI,CAAA,CAAE,CAAA;AAE1F,QAAA;AAEA;;;;;;;AAOI;;;;QAMJ,IAAIT,aAAAA,CAAcuB,GAAG,CAACZ,aAAAA,CAAAA,EAAgB;AACpCrB,YAAAA,UAAAA,CACE,CAAC,yEAAyE,EAAEe,IAAAA,CAAKI,IAAI,CAAA,CAAE,CAAA;YAEzF,OAAOL,GAAAA;AACT,QAAA;AACAJ,QAAAA,aAAAA,CAAcwB,GAAG,CAACb,aAAAA,CAAAA;;AAGlBP,QAAAA,GAAAA,CAAIqB,IAAI,CAACpB,IAAAA,CAAAA;QACT,OAAOD,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,OAAOF,WAAAA,CAAYC,MAAM,CACvB,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;QACJ,MAAMqB,GAAAA,GAAMnB,IAAAA,CAAKC,QAAQ,CAACH,IAAAA,CAAKI,IAAI,EAAEF,IAAAA,CAAKG,OAAO,CAACL,IAAAA,CAAKI,IAAI,CAAA,CAAA;QAE3DL,GAAG,CAACsB,IAAI,GAAGC,cAAAA,CAAepB,KAAKqB,OAAO,CAAClC,GAAAA,EAAKW,IAAAA,CAAKI,IAAI,CAAA,CAAA;QAErD,OAAOL,GAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;AAEL,CAAA;;;;"}