@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 8.72 kB
Source Map (JSON)
{"version":3,"file":"process-config.mjs","names":[],"sources":["../../../src/libs/config/process-config.ts"],"sourcesContent":["import { castDraft, produce } from \"immer\";\nimport defaultConfig from \"../../constants/default-config.js\";\nimport type { Config, LucidConfig } from \"../../types/config.js\";\nimport LucidError from \"../../utils/errors/lucid-error.js\";\nimport BrickConfigSchema from \"../collection/builders/brick-builder/schema.js\";\nimport CollectionConfigSchema from \"../collection/builders/collection-builder/schema.js\";\nimport CustomFieldSchema from \"../collection/custom-fields/schema.js\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport { translate } from \"../i18n/index.js\";\nimport { initializeLogger } from \"../logger/index.js\";\nimport type { LucidConfigRecipe } from \"../runtime/types.js\";\nimport checkCollectionEnvironmentVersionMap from \"./checks/check-collection-environment-version-map.js\";\nimport checkDuplicateBuilderKeys from \"./checks/check-duplicate-builder-keys.js\";\nimport checkDuplicateFieldKeys from \"./checks/check-duplicate-field-keys.js\";\nimport checkField from \"./checks/check-field.js\";\nimport checkFieldConditions from \"./checks/check-field-conditions.js\";\nimport checkLocales from \"./checks/check-locales.js\";\nimport checkOpenRepeaters from \"./checks/check-open-repeaters.js\";\nimport checkRepeaterDepth from \"./checks/check-repeater-depth.js\";\nimport checkTenants from \"./checks/check-tenants.js\";\nimport ConfigSchema from \"./config-schema.js\";\nimport mergeConfig from \"./merge-config.js\";\nimport normalizeConfigSecrets from \"./utils/normalize-config-secrets.js\";\n\n/**\n * Responsible for:\n * - merging the default config with the config\n * - initializing the plugins\n * - validation & checks\n */\nconst processConfig = async (\n\tconfig: LucidConfig,\n\toptions?: {\n\t\tskipValidation?: boolean;\n\t\tmode?: \"runtime\" | \"build\";\n\t\tresolvedDb?: DatabaseAdapter;\n\t\trecipe?: LucidConfigRecipe;\n\t},\n): Promise<Config> => {\n\tif (Object.hasOwn(config, \"db\")) {\n\t\tthrow new LucidError({\n\t\t\tmessage:\n\t\t\t\t\"Lucid config must not define `config.db`. Move your database adapter to the top-level `db` property passed to configureLucid().\",\n\t\t});\n\t}\n\n\tif (!options?.resolvedDb) {\n\t\tthrow new LucidError({\n\t\t\tmessage:\n\t\t\t\t\"Lucid could not resolve the configured database adapter. Define it via `configureLucid({ db, config })`.\",\n\t\t});\n\t}\n\n\tlet configRes = mergeConfig(config, defaultConfig);\n\n\tObject.assign(configRes, {\n\t\tdb: options.resolvedDb,\n\t});\n\n\tconfigRes = normalizeConfigSecrets(configRes, options?.mode);\n\n\tif (options?.recipe) {\n\t\tconfigRes = produce(configRes, options.recipe);\n\t\tconfigRes = normalizeConfigSecrets(configRes, options?.mode);\n\t}\n\n\tconst userTranslationSources = [...(configRes.i18n.sources ?? [])];\n\n\tconfigRes = produce(configRes, (draft) => {\n\t\tdraft.i18n.sources = [];\n\t});\n\n\t// merge plugin config\n\tif (Array.isArray(configRes.plugins)) {\n\t\tfor (const pluginDef of configRes.plugins) {\n\t\t\tif (!options?.skipValidation) {\n\t\t\t\tconst { default: checkPluginVersion } = await import(\n\t\t\t\t\t\"./checks/check-plugin-version.js\"\n\t\t\t\t);\n\n\t\t\t\tcheckPluginVersion({\n\t\t\t\t\tkey: pluginDef.key,\n\t\t\t\t\trequiredVersions: pluginDef.lucid,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (pluginDef.hooks?.init) {\n\t\t\t\tconst res = await pluginDef.hooks.init();\n\t\t\t\tif (res.error) {\n\t\t\t\t\t//* will get caught by the CLI\n\t\t\t\t\tthrow new LucidError({\n\t\t\t\t\t\tscope: pluginDef.key,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\ttranslate(res.error.message) ??\n\t\t\t\t\t\t\ttranslate(\"server:core.plugins.init.failed\", {\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\tkey: pluginDef.key,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconfigRes = produce(configRes, pluginDef.recipe);\n\t\t}\n\t}\n\n\tconst pluginTranslationSources = [...(configRes.i18n.sources ?? [])];\n\n\tconfigRes = produce(configRes, (draft) => {\n\t\tdraft.i18n.sources = castDraft([\n\t\t\t...pluginTranslationSources,\n\t\t\t...userTranslationSources,\n\t\t]);\n\t\tdraft.localization.locales = draft.localization.locales.map((locale) => ({\n\t\t\t...locale,\n\t\t\tdirection: locale.direction ?? \"ltr\",\n\t\t}));\n\t\tdraft.i18n.locales = draft.i18n.locales.map((locale) => ({\n\t\t\t...locale,\n\t\t\tdirection: locale.direction ?? \"ltr\",\n\t\t}));\n\t});\n\n\tif (!options?.skipValidation) {\n\t\t// validate config\n\t\tconfigRes = ConfigSchema.parse(configRes) as Config;\n\n\t\t// i18n checks\n\t\tcheckLocales(configRes.localization);\n\t\tcheckLocales(configRes.i18n);\n\n\t\t// tenant checks\n\t\tcheckTenants(configRes);\n\n\t\t// collection checks\n\t\tcheckDuplicateBuilderKeys(\n\t\t\t\"collections\",\n\t\t\tconfigRes.collections.map((c) => c.getData.key),\n\t\t);\n\n\t\tfor (const collection of configRes.collections) {\n\t\t\tCollectionConfigSchema.parse(collection.config);\n\n\t\t\tfor (const field of collection.flatFields) {\n\t\t\t\tCustomFieldSchema.parse(field);\n\t\t\t\tcheckField(field, configRes);\n\t\t\t}\n\n\t\t\tcheckDuplicateBuilderKeys(\n\t\t\t\t\"bricks\",\n\t\t\t\tcollection.builderBricks.map((b) => b.key),\n\t\t\t);\n\n\t\t\tcheckDuplicateFieldKeys(\n\t\t\t\t\"collection\",\n\t\t\t\tcollection.key,\n\t\t\t\tcollection.meta.fieldKeys,\n\t\t\t);\n\n\t\t\tcheckFieldConditions(\"collection\", collection.key, collection);\n\n\t\t\tcheckRepeaterDepth(\n\t\t\t\t\"collection\",\n\t\t\t\tcollection.key,\n\t\t\t\tcollection.meta.repeaterDepth,\n\t\t\t);\n\t\t\tcheckOpenRepeaters(\n\t\t\t\t\"collection\",\n\t\t\t\tcollection.key,\n\t\t\t\tcollection.repeaterStack,\n\t\t\t);\n\n\t\t\tfor (const brick of collection.brickInstances) {\n\t\t\t\tBrickConfigSchema.parse(brick.config);\n\t\t\t\tfor (const field of brick.flatFields) {\n\t\t\t\t\tCustomFieldSchema.parse(field);\n\t\t\t\t\tcheckField(field, configRes);\n\t\t\t\t}\n\n\t\t\t\tcheckDuplicateFieldKeys(\"brick\", brick.key, brick.meta.fieldKeys);\n\t\t\t\tcheckFieldConditions(\"brick\", brick.key, brick);\n\t\t\t\tcheckRepeaterDepth(\"brick\", brick.key, brick.meta.repeaterDepth);\n\t\t\t\tcheckOpenRepeaters(\"brick\", brick.key, brick.repeaterStack);\n\t\t\t}\n\t\t}\n\n\t\tcheckCollectionEnvironmentVersionMap(configRes);\n\t}\n\n\tawait initializeLogger({\n\t\ttransport: configRes.logger.transport,\n\t\tlevel: configRes.logger.level,\n\t});\n\n\treturn configRes;\n};\n\nexport default processConfig;\n"],"mappings":"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"}