UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 18.7 kB
{"version":3,"file":"config-schema.mjs","names":["constants"],"sources":["../../../src/libs/config/config-schema.ts"],"sourcesContent":["import z from \"zod\";\nimport constants from \"../../constants/constants.js\";\nimport { AuthProviderSchema } from \"../auth-providers/schema.js\";\nimport type { ExternalMigrationFn } from \"../db/types.js\";\nimport type { EmailAdapter, EmailAdapterInstance } from \"../email/types.js\";\nimport type {\n\tHttpExtension,\n\tHttpExtensionRegister,\n\tLucidRouteDefinition,\n} from \"../http/types.js\";\nimport { adminCopyInputSchema } from \"../i18n/index.js\";\nimport type {\n\tImageProcessor,\n\tImageProcessorInstance,\n} from \"../image-processor/types.js\";\nimport type { KVAdapter, KVAdapterInstance } from \"../kv/types.js\";\nimport { LogLevelSchema, LogTransportSchema } from \"../logger/schema.js\";\nimport type { MediaAdapter, MediaAdapterInstance } from \"../media/types.js\";\nimport type { QueueAdapter, QueueAdapterInstance } from \"../queue/types.js\";\n\nconst HttpExtensionRegisterSchema = z.custom<HttpExtensionRegister>(\n\t(data) => typeof data === \"function\",\n\t{\n\t\tmessage: \"Expected an HTTP extension register function\",\n\t},\n);\n\nconst HttpExtensionSchema = z.object({\n\tname: z.string().trim().min(1),\n\tpriority: z.union([z.literal(0), z.literal(1), z.literal(2)]),\n\tregister: HttpExtensionRegisterSchema,\n}) satisfies z.ZodType<HttpExtension>;\n\nconst LucidRouteDefinitionSchema = z.custom<LucidRouteDefinition>(\n\t(data) => typeof data === \"object\" && data !== null,\n\t{\n\t\tmessage: \"Expected a Lucid route definition\",\n\t},\n);\n\n// TODO: improve all function custom schemas bellow\n\nconst ImageProcessorSchema = z.custom<\n\tImageProcessor | ImageProcessorInstance | Promise<ImageProcessorInstance>\n>((data) => typeof data === \"function\" || typeof data === \"object\", {\n\tmessage: \"Expected an ImageProcessor function\",\n});\n\nconst QueueAdapterSchema = z.custom<\n\tQueueAdapter | QueueAdapterInstance | Promise<QueueAdapterInstance>\n>((data) => typeof data === \"function\" || typeof data === \"object\", {\n\tmessage: \"Expected a QueueAdapter function\",\n});\n\nconst KVAdapterSchema = z.custom<\n\tKVAdapter | KVAdapterInstance | Promise<KVAdapterInstance>\n>((data) => typeof data === \"function\" || typeof data === \"object\", {\n\tmessage: \"Expected a KVAdapter function\",\n});\n\nconst MediaAdapterSchema = z.custom<\n\tMediaAdapter | MediaAdapterInstance | Promise<MediaAdapterInstance>\n>((data) => typeof data === \"function\" || typeof data === \"object\", {\n\tmessage: \"Expected a MediaAdapter function\",\n});\n\nconst EmailAdapterSchema = z.custom<\n\tEmailAdapter | EmailAdapterInstance | Promise<EmailAdapterInstance>\n>((data) => typeof data === \"function\" || typeof data === \"object\", {\n\tmessage: \"Expected an EmailAdapter function\",\n});\n\nconst ContentSecurityPolicySchema = z\n\t.object({\n\t\tdefaultSrc: z.array(z.string()).optional(),\n\t\tbaseUri: z.array(z.string()).optional(),\n\t\tchildSrc: z.array(z.string()).optional(),\n\t\tconnectSrc: z.array(z.string()).optional(),\n\t\tfontSrc: z.array(z.string()).optional(),\n\t\tformAction: z.array(z.string()).optional(),\n\t\tframeAncestors: z.array(z.string()).optional(),\n\t\tframeSrc: z.array(z.string()).optional(),\n\t\timgSrc: z.array(z.string()).optional(),\n\t\tmanifestSrc: z.array(z.string()).optional(),\n\t\tmediaSrc: z.array(z.string()).optional(),\n\t\tobjectSrc: z.array(z.string()).optional(),\n\t\tsandbox: z.array(z.string()).optional(),\n\t\tscriptSrc: z.array(z.string()).optional(),\n\t\tscriptSrcAttr: z.array(z.string()).optional(),\n\t\tscriptSrcElem: z.array(z.string()).optional(),\n\t\tstyleSrc: z.array(z.string()).optional(),\n\t\tstyleSrcAttr: z.array(z.string()).optional(),\n\t\tstyleSrcElem: z.array(z.string()).optional(),\n\t\tupgradeInsecureRequests: z.array(z.string()).optional(),\n\t\tworkerSrc: z.array(z.string()).optional(),\n\t\trequireTrustedTypesFor: z.array(z.string()).optional(),\n\t\ttrustedTypes: z.array(z.string()).optional(),\n\t})\n\t.optional();\n\nconst OverridableHeaderSchema = z.union([z.boolean(), z.string()]);\n\n/**\n * Tenant keys share the media URL path, so they cannot use reserved media words.\n */\nconst isReservedTenantKey = (key: string) =>\n\t(constants.media.reservedTenantKeys as readonly string[]).includes(key);\n\n/**\n * Global media IDs are 32-char hex UUIDs; tenant keys matching that are ambiguous.\n */\nconst isGeneratedMediaIdTenantKey = (key: string) =>\n\t/^[a-f0-9]{32}$/i.test(key);\n\nconst ConfigSchema = z.object({\n\tdb: z.unknown(),\n\thost: z.string().trim().min(1).optional(),\n\thttp: z\n\t\t.object({\n\t\t\tsecurity: z\n\t\t\t\t.object({\n\t\t\t\t\ttrustProxyHeaders: z.boolean().optional(),\n\t\t\t\t\tcors: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\torigin: z.array(z.string()).optional(),\n\t\t\t\t\t\t\tallowHeaders: z.array(z.string()).optional(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\theaders: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\tcontentSecurityPolicy: ContentSecurityPolicySchema,\n\t\t\t\t\t\t\tstrictTransportSecurity: OverridableHeaderSchema.optional(),\n\t\t\t\t\t\t\txFrameOptions: OverridableHeaderSchema.optional(),\n\t\t\t\t\t\t\treferrerPolicy: OverridableHeaderSchema.optional(),\n\t\t\t\t\t\t\tcrossOriginResourcePolicy: OverridableHeaderSchema.optional(),\n\t\t\t\t\t\t\tcrossOriginOpenerPolicy: OverridableHeaderSchema.optional(),\n\t\t\t\t\t\t\tcrossOriginEmbedderPolicy: OverridableHeaderSchema.optional(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\topenAPI: z\n\t\t\t\t.object({\n\t\t\t\t\tenabled: z.boolean(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\troutes: z.array(LucidRouteDefinitionSchema).optional(),\n\t\t\textensions: z.array(HttpExtensionSchema).optional(),\n\t\t})\n\t\t.optional(),\n\tsecrets: z.object({\n\t\tencryption: z.string().length(64),\n\t\tcookie: z.string().length(64),\n\t\taccessToken: z.string().length(64),\n\t\trefreshToken: z.string().length(64),\n\t}),\n\tlogger: z.object({\n\t\tlevel: LogLevelSchema,\n\t\ttransport: LogTransportSchema.optional(),\n\t}),\n\tauth: z\n\t\t.object({\n\t\t\tpassword: z.object({\n\t\t\t\tenabled: z.boolean().optional(),\n\t\t\t}),\n\t\t\tproviders: z.array(AuthProviderSchema).optional(),\n\t\t})\n\t\t.optional(),\n\tai: z.object({\n\t\tenabled: z.boolean(),\n\t\tfeatures: z.object({\n\t\t\timageGeneration: z.boolean(),\n\t\t\taltGeneration: z.boolean(),\n\t\t\tcustomFieldGeneration: z.boolean(),\n\t\t}),\n\t}),\n\tlocalization: z\n\t\t.object({\n\t\t\tlocales: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tlabel: z.string(),\n\t\t\t\t\tcode: z.string(),\n\t\t\t\t\tdirection: z.enum([\"ltr\", \"rtl\"]).default(\"ltr\").optional(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tdefaultLocale: z.string(),\n\t\t})\n\t\t.optional(),\n\ttenants: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tkey: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.min(2)\n\t\t\t\t\t.refine((key) => !isReservedTenantKey(key), {\n\t\t\t\t\t\tmessage: `Tenant key cannot be one of: ${constants.media.reservedTenantKeys.join(\", \")}`,\n\t\t\t\t\t})\n\t\t\t\t\t.refine((key) => !isGeneratedMediaIdTenantKey(key), {\n\t\t\t\t\t\tmessage: \"Tenant key cannot match a generated media ID.\",\n\t\t\t\t\t}),\n\t\t\t\tname: adminCopyInputSchema,\n\t\t\t\tdefault: z.boolean().optional(),\n\t\t\t}),\n\t\t)\n\t\t.optional(),\n\ti18n: z\n\t\t.object({\n\t\t\tlocales: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tlabel: z.string(),\n\t\t\t\t\tcode: z.string(),\n\t\t\t\t\tdirection: z.enum([\"ltr\", \"rtl\"]).default(\"ltr\").optional(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tdefaultLocale: z.string(),\n\t\t\tsources: z.array(z.union([z.string(), z.instanceof(URL)])).optional(),\n\t\t})\n\t\t.optional(),\n\tmigrations: z\n\t\t.object({\n\t\t\tsources: z\n\t\t\t\t.array(\n\t\t\t\t\tz.union([\n\t\t\t\t\t\tz.string(),\n\t\t\t\t\t\tz.instanceof(URL),\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\tname: z.string(),\n\t\t\t\t\t\t\tmigration: z.custom<ExternalMigrationFn>(\n\t\t\t\t\t\t\t\t(data) => typeof data === \"function\",\n\t\t\t\t\t\t\t\t{ message: \"Expected a migration function\" },\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t\t.optional(),\n\t\t})\n\t\t.optional(),\n\temail: z\n\t\t.object({\n\t\t\tfrom: z\n\t\t\t\t.object({\n\t\t\t\t\temail: z.string(),\n\t\t\t\t\tname: z.string(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tsimulate: z.boolean().optional(),\n\t\t\tresendWindowDays: z.number().int().min(0).optional(),\n\t\t\tadapter: EmailAdapterSchema.optional(),\n\t\t\ttemplates: z\n\t\t\t\t.object({\n\t\t\t\t\tdirectory: z.string().optional(),\n\t\t\t\t\trendered: z.record(z.string(), z.string()).optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t})\n\t\t.optional(),\n\tmedia: z.object({\n\t\tadapter: MediaAdapterSchema.optional(),\n\t\tlimits: z.object({\n\t\t\tstorageBytes: z.union([z.number(), z.literal(false)]),\n\t\t\tuploadBytes: z.number(),\n\t\t\tprocessedImagesPerFile: z.number(),\n\t\t}),\n\t\timages: z.object({\n\t\t\tprocessor: ImageProcessorSchema.optional(),\n\t\t\tpresets: z.record(\n\t\t\t\tz.string(),\n\t\t\t\tz.object({\n\t\t\t\t\twidth: z.number().optional(),\n\t\t\t\t\theight: z.number().optional(),\n\t\t\t\t\tfit: z\n\t\t\t\t\t\t.enum([\"cover\", \"contain\", \"fill\", \"inside\", \"outside\"])\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tformat: z\n\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\tz.literal(\"webp\"),\n\t\t\t\t\t\t\tz.literal(\"avif\"),\n\t\t\t\t\t\t\tz.literal(\"jpeg\"),\n\t\t\t\t\t\t\tz.literal(\"png\"),\n\t\t\t\t\t\t])\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tquality: z.number().optional(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tstoreProcessed: z.boolean(),\n\t\t\tallowFormatQuery: z.boolean(),\n\t\t\tfallbackUrl: z.string().optional(),\n\t\t}),\n\t\tvideo: z.object({\n\t\t\tfallbackUrl: z.string().optional(),\n\t\t}),\n\t}),\n\thooks: z.array(\n\t\tz.object({\n\t\t\tservice: z.string(),\n\t\t\tevent: z.string(),\n\t\t\tpriority: z.number().optional(),\n\t\t\thandler: z.unknown(),\n\t\t}),\n\t),\n\tqueue: z\n\t\t.object({\n\t\t\tadapter: QueueAdapterSchema.optional(),\n\t\t})\n\t\t.optional(),\n\tkv: z\n\t\t.object({\n\t\t\tadapter: KVAdapterSchema.optional(),\n\t\t\tnamespace: z.union([z.string().min(1), z.literal(false)]).optional(),\n\t\t})\n\t\t.optional(),\n\tcollections: z.array(z.unknown()),\n\tplugins: z.array(z.unknown()),\n\tbuild: z\n\t\t.object({\n\t\t\tpaths: z\n\t\t\t\t.object({\n\t\t\t\t\toutDir: z.string().optional(),\n\t\t\t\t\tcopyPublic: z\n\t\t\t\t\t\t.array(\n\t\t\t\t\t\t\tz.union([\n\t\t\t\t\t\t\t\tz.string(),\n\t\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\t\tinput: z.string(),\n\t\t\t\t\t\t\t\t\toutput: z.string().optional(),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\twatch: z\n\t\t\t\t.object({\n\t\t\t\t\tignore: z.array(z.string()).optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t})\n\t\t.optional(),\n\tretention: z\n\t\t.object({\n\t\t\tdefaultPurgeAfterDays: z.number().int().positive().optional(),\n\t\t\tpurgeAfterDays: z\n\t\t\t\t.object({\n\t\t\t\t\tremovedLocales: z.number().int().positive().optional(),\n\t\t\t\t\tdeletedUsers: z.number().int().positive().optional(),\n\t\t\t\t\tdeletedMedia: z.number().int().positive().optional(),\n\t\t\t\t\tremovedCollections: z.number().int().positive().optional(),\n\t\t\t\t\tdeletedDocuments: z.number().int().positive().optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t})\n\t\t.optional(),\n\tbrand: z\n\t\t.object({\n\t\t\tname: z.string().optional(),\n\t\t})\n\t\t.optional(),\n});\n\nexport default ConfigSchema;\n"],"mappings":"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"}