UNPKG

next

Version:

The React Framework

549 lines (548 loc) • 22.8 kB
import { VALID_LOADERS } from '../shared/lib/image-config'; import { z } from 'next/dist/compiled/zod'; import { SUPPORTED_TEST_RUNNERS_LIST } from '../cli/next-test'; // A custom zod schema for the SizeLimit type const zSizeLimit = z.custom((val)=>{ if (typeof val === 'number' || typeof val === 'string') { return true; } return false; }); const zExportMap = z.record(z.string(), z.object({ page: z.string(), query: z.any(), // private optional properties _fallbackRouteParams: z.array(z.string()).optional(), _isAppDir: z.boolean().optional(), _isDynamicError: z.boolean().optional(), _isRoutePPREnabled: z.boolean().optional(), _isProspectiveRender: z.boolean().optional() })); const zRouteHas = z.union([ z.object({ type: z.enum([ 'header', 'query', 'cookie' ]), key: z.string(), value: z.string().optional() }), z.object({ type: z.literal('host'), key: z.undefined().optional(), value: z.string() }) ]); const zRewrite = z.object({ source: z.string(), destination: z.string(), basePath: z.literal(false).optional(), locale: z.literal(false).optional(), has: z.array(zRouteHas).optional(), missing: z.array(zRouteHas).optional(), internal: z.boolean().optional() }); const zRedirect = z.object({ source: z.string(), destination: z.string(), basePath: z.literal(false).optional(), locale: z.literal(false).optional(), has: z.array(zRouteHas).optional(), missing: z.array(zRouteHas).optional(), internal: z.boolean().optional() }).and(z.union([ z.object({ statusCode: z.never().optional(), permanent: z.boolean() }), z.object({ statusCode: z.number(), permanent: z.never().optional() }) ])); const zHeader = z.object({ source: z.string(), basePath: z.literal(false).optional(), locale: z.literal(false).optional(), headers: z.array(z.object({ key: z.string(), value: z.string() })), has: z.array(zRouteHas).optional(), missing: z.array(zRouteHas).optional(), internal: z.boolean().optional() }); const zTurboLoaderItem = z.union([ z.string(), z.object({ loader: z.string(), // Any JSON value can be used as turbo loader options, so use z.any() here options: z.record(z.string(), z.any()) }) ]); const zTurboRuleConfigItemOptions = z.object({ loaders: z.array(zTurboLoaderItem), as: z.string().optional() }); const zTurboRuleConfigItem = z.union([ z.literal(false), z.record(z.string(), z.lazy(()=>zTurboRuleConfigItem)), zTurboRuleConfigItemOptions ]); const zTurboRuleConfigItemOrShortcut = z.union([ z.array(zTurboLoaderItem), zTurboRuleConfigItem ]); export const configSchema = z.lazy(()=>z.strictObject({ allowedDevOrigins: z.array(z.string()).optional(), amp: z.object({ canonicalBase: z.string().optional() }).optional(), assetPrefix: z.string().optional(), basePath: z.string().optional(), bundlePagesRouterDependencies: z.boolean().optional(), cacheHandler: z.string().min(1).optional(), cacheMaxMemorySize: z.number().optional(), cleanDistDir: z.boolean().optional(), compiler: z.strictObject({ emotion: z.union([ z.boolean(), z.object({ sourceMap: z.boolean().optional(), autoLabel: z.union([ z.literal('always'), z.literal('dev-only'), z.literal('never') ]).optional(), labelFormat: z.string().min(1).optional(), importMap: z.record(z.string(), z.record(z.string(), z.object({ canonicalImport: z.tuple([ z.string(), z.string() ]).optional(), styledBaseImport: z.tuple([ z.string(), z.string() ]).optional() }))).optional() }) ]).optional(), reactRemoveProperties: z.union([ z.boolean().optional(), z.object({ properties: z.array(z.string()).optional() }) ]).optional(), relay: z.object({ src: z.string(), artifactDirectory: z.string().optional(), language: z.enum([ 'javascript', 'typescript', 'flow' ]).optional(), eagerEsModules: z.boolean().optional() }).optional(), removeConsole: z.union([ z.boolean().optional(), z.object({ exclude: z.array(z.string()).min(1).optional() }) ]).optional(), styledComponents: z.union([ z.boolean().optional(), z.object({ displayName: z.boolean().optional(), topLevelImportPaths: z.array(z.string()).optional(), ssr: z.boolean().optional(), fileName: z.boolean().optional(), meaninglessFileNames: z.array(z.string()).optional(), minify: z.boolean().optional(), transpileTemplateLiterals: z.boolean().optional(), namespace: z.string().min(1).optional(), pure: z.boolean().optional(), cssProp: z.boolean().optional() }) ]), styledJsx: z.union([ z.boolean().optional(), z.object({ useLightningcss: z.boolean().optional() }) ]), define: z.record(z.string(), z.string()).optional() }).optional(), compress: z.boolean().optional(), configOrigin: z.string().optional(), crossOrigin: z.union([ z.literal('anonymous'), z.literal('use-credentials') ]).optional(), deploymentId: z.string().optional(), devIndicators: z.union([ z.object({ buildActivityPosition: z.union([ z.literal('bottom-left'), z.literal('bottom-right'), z.literal('top-left'), z.literal('top-right') ]).optional(), position: z.union([ z.literal('bottom-left'), z.literal('bottom-right'), z.literal('top-left'), z.literal('top-right') ]).optional() }), z.literal(false) ]).optional(), distDir: z.string().min(1).optional(), env: z.record(z.string(), z.union([ z.string(), z.undefined() ])).optional(), eslint: z.strictObject({ dirs: z.array(z.string().min(1)).optional(), ignoreDuringBuilds: z.boolean().optional() }).optional(), excludeDefaultMomentLocales: z.boolean().optional(), experimental: z.strictObject({ allowedDevOrigins: z.array(z.string()).optional(), nodeMiddleware: z.boolean().optional(), after: z.boolean().optional(), appDocumentPreloading: z.boolean().optional(), appNavFailHandling: z.boolean().optional(), preloadEntriesOnStart: z.boolean().optional(), allowedRevalidateHeaderKeys: z.array(z.string()).optional(), amp: z.object({ // AMP optimizer option is unknown, use z.any() here optimizer: z.any().optional(), skipValidation: z.boolean().optional(), validator: z.string().optional() }).optional(), staleTimes: z.object({ dynamic: z.number().optional(), static: z.number().optional() }).optional(), cacheLife: z.record(z.object({ stale: z.number().optional(), revalidate: z.number().optional(), expire: z.number().optional() })).optional(), cacheHandlers: z.record(z.string(), z.string().optional()).optional(), clientRouterFilter: z.boolean().optional(), clientRouterFilterRedirects: z.boolean().optional(), clientRouterFilterAllowedRate: z.number().optional(), cpus: z.number().optional(), memoryBasedWorkersCount: z.boolean().optional(), craCompat: z.boolean().optional(), caseSensitiveRoutes: z.boolean().optional(), clientSegmentCache: z.boolean().optional(), disableOptimizedLoading: z.boolean().optional(), disablePostcssPresetEnv: z.boolean().optional(), dynamicIO: z.boolean().optional(), inlineCss: z.boolean().optional(), esmExternals: z.union([ z.boolean(), z.literal('loose') ]).optional(), serverActions: z.object({ bodySizeLimit: zSizeLimit.optional(), allowedOrigins: z.array(z.string()).optional() }).optional(), // The original type was Record<string, any> extensionAlias: z.record(z.string(), z.any()).optional(), externalDir: z.boolean().optional(), externalMiddlewareRewritesResolve: z.boolean().optional(), fallbackNodePolyfills: z.literal(false).optional(), fetchCacheKeyPrefix: z.string().optional(), forceSwcTransforms: z.boolean().optional(), fullySpecified: z.boolean().optional(), gzipSize: z.boolean().optional(), imgOptConcurrency: z.number().int().optional().nullable(), imgOptTimeoutInSeconds: z.number().int().optional(), imgOptMaxInputPixels: z.number().int().optional(), imgOptSequentialRead: z.boolean().optional().nullable(), isrFlushToDisk: z.boolean().optional(), largePageDataBytes: z.number().optional(), linkNoTouchStart: z.boolean().optional(), manualClientBasePath: z.boolean().optional(), middlewarePrefetch: z.enum([ 'strict', 'flexible' ]).optional(), multiZoneDraftMode: z.boolean().optional(), cssChunking: z.union([ z.boolean(), z.literal('strict') ]).optional(), nextScriptWorkers: z.boolean().optional(), // The critter option is unknown, use z.any() here optimizeCss: z.union([ z.boolean(), z.any() ]).optional(), optimisticClientCache: z.boolean().optional(), parallelServerCompiles: z.boolean().optional(), parallelServerBuildTraces: z.boolean().optional(), ppr: z.union([ z.boolean(), z.literal('incremental') ]).readonly().optional(), taint: z.boolean().optional(), prerenderEarlyExit: z.boolean().optional(), proxyTimeout: z.number().gte(0).optional(), scrollRestoration: z.boolean().optional(), sri: z.object({ algorithm: z.enum([ 'sha256', 'sha384', 'sha512' ]).optional() }).optional(), strictNextHead: z.boolean().optional(), swcPlugins: z// The specific swc plugin's option is unknown, use z.any() here .array(z.tuple([ z.string(), z.record(z.string(), z.any()) ])).optional(), swcTraceProfiling: z.boolean().optional(), // NonNullable<webpack.Configuration['experiments']>['buildHttp'] urlImports: z.any().optional(), viewTransition: z.boolean().optional(), workerThreads: z.boolean().optional(), webVitalsAttribution: z.array(z.union([ z.literal('CLS'), z.literal('FCP'), z.literal('FID'), z.literal('INP'), z.literal('LCP'), z.literal('TTFB') ])).optional(), // This is partial set of mdx-rs transform options we support, aligned // with next_core::next_config::MdxRsOptions. Ensure both types are kept in sync. mdxRs: z.union([ z.boolean(), z.object({ development: z.boolean().optional(), jsxRuntime: z.string().optional(), jsxImportSource: z.string().optional(), providerImportSource: z.string().optional(), mdxType: z.enum([ 'gfm', 'commonmark' ]).optional() }) ]).optional(), typedRoutes: z.boolean().optional(), webpackBuildWorker: z.boolean().optional(), webpackMemoryOptimizations: z.boolean().optional(), turbo: z.object({ loaders: z.record(z.string(), z.array(zTurboLoaderItem)).optional(), rules: z.record(z.string(), zTurboRuleConfigItemOrShortcut).optional(), resolveAlias: z.record(z.string(), z.union([ z.string(), z.array(z.string()), z.record(z.string(), z.union([ z.string(), z.array(z.string()) ])) ])).optional(), resolveExtensions: z.array(z.string()).optional(), treeShaking: z.boolean().optional(), persistentCaching: z.union([ z.number(), z.literal(false) ]).optional(), memoryLimit: z.number().optional(), moduleIdStrategy: z.enum([ 'named', 'deterministic' ]).optional(), minify: z.boolean().optional(), sourceMaps: z.boolean().optional() }).optional(), optimizePackageImports: z.array(z.string()).optional(), optimizeServerReact: z.boolean().optional(), clientTraceMetadata: z.array(z.string()).optional(), serverMinification: z.boolean().optional(), serverSourceMaps: z.boolean().optional(), useWasmBinary: z.boolean().optional(), useLightningcss: z.boolean().optional(), useEarlyImport: z.boolean().optional(), testProxy: z.boolean().optional(), defaultTestRunner: z.enum(SUPPORTED_TEST_RUNNERS_LIST).optional(), allowDevelopmentBuild: z.literal(true).optional(), reactCompiler: z.union([ z.boolean(), z.object({ compilationMode: z.enum([ 'infer', 'annotation', 'all' ]).optional(), panicThreshold: z.enum([ 'ALL_ERRORS', 'CRITICAL_ERRORS', 'NONE' ]).optional() }).optional() ]), staticGenerationRetryCount: z.number().int().optional(), staticGenerationMaxConcurrency: z.number().int().optional(), staticGenerationMinPagesPerWorker: z.number().int().optional(), typedEnv: z.boolean().optional(), serverComponentsHmrCache: z.boolean().optional(), authInterrupts: z.boolean().optional(), useCache: z.boolean().optional(), slowModuleDetection: z.object({ buildTimeThresholdMs: z.number().int() }).optional() }).optional(), exportPathMap: z.function().args(zExportMap, z.object({ dev: z.boolean(), dir: z.string(), outDir: z.string().nullable(), distDir: z.string(), buildId: z.string() })).returns(z.union([ zExportMap, z.promise(zExportMap) ])).optional(), generateBuildId: z.function().args().returns(z.union([ z.string(), z.null(), z.promise(z.union([ z.string(), z.null() ])) ])).optional(), generateEtags: z.boolean().optional(), headers: z.function().args().returns(z.promise(z.array(zHeader))).optional(), htmlLimitedBots: z.instanceof(RegExp).optional(), httpAgentOptions: z.strictObject({ keepAlive: z.boolean().optional() }).optional(), i18n: z.strictObject({ defaultLocale: z.string().min(1), domains: z.array(z.strictObject({ defaultLocale: z.string().min(1), domain: z.string().min(1), http: z.literal(true).optional(), locales: z.array(z.string().min(1)).optional() })).optional(), localeDetection: z.literal(false).optional(), locales: z.array(z.string().min(1)) }).nullable().optional(), images: z.strictObject({ localPatterns: z.array(z.strictObject({ pathname: z.string().optional(), search: z.string().optional() })).max(25).optional(), remotePatterns: z.array(z.strictObject({ hostname: z.string(), pathname: z.string().optional(), port: z.string().max(5).optional(), protocol: z.enum([ 'http', 'https' ]).optional(), search: z.string().optional() })).max(50).optional(), unoptimized: z.boolean().optional(), contentSecurityPolicy: z.string().optional(), contentDispositionType: z.enum([ 'inline', 'attachment' ]).optional(), dangerouslyAllowSVG: z.boolean().optional(), deviceSizes: z.array(z.number().int().gte(1).lte(10000)).max(25).optional(), disableStaticImages: z.boolean().optional(), domains: z.array(z.string()).max(50).optional(), formats: z.array(z.enum([ 'image/avif', 'image/webp' ])).max(4).optional(), imageSizes: z.array(z.number().int().gte(1).lte(10000)).min(0).max(25).optional(), loader: z.enum(VALID_LOADERS).optional(), loaderFile: z.string().optional(), minimumCacheTTL: z.number().int().gte(0).optional(), path: z.string().optional(), qualities: z.array(z.number().int().gte(1).lte(100)).min(1).max(20).optional() }).optional(), logging: z.union([ z.object({ fetches: z.object({ fullUrl: z.boolean().optional(), hmrRefreshes: z.boolean().optional() }).optional(), incomingRequests: z.union([ z.boolean(), z.object({ ignore: z.array(z.instanceof(RegExp)) }) ]).optional() }), z.literal(false) ]).optional(), modularizeImports: z.record(z.string(), z.object({ transform: z.union([ z.string(), z.record(z.string(), z.string()) ]), preventFullImport: z.boolean().optional(), skipDefaultConversion: z.boolean().optional() })).optional(), onDemandEntries: z.strictObject({ maxInactiveAge: z.number().optional(), pagesBufferLength: z.number().optional() }).optional(), output: z.enum([ 'standalone', 'export' ]).optional(), outputFileTracingRoot: z.string().optional(), outputFileTracingExcludes: z.record(z.string(), z.array(z.string())).optional(), outputFileTracingIncludes: z.record(z.string(), z.array(z.string())).optional(), pageExtensions: z.array(z.string()).min(1).optional(), poweredByHeader: z.boolean().optional(), productionBrowserSourceMaps: z.boolean().optional(), publicRuntimeConfig: z.record(z.string(), z.any()).optional(), reactProductionProfiling: z.boolean().optional(), reactStrictMode: z.boolean().nullable().optional(), reactMaxHeadersLength: z.number().nonnegative().int().optional(), redirects: z.function().args().returns(z.promise(z.array(zRedirect))).optional(), rewrites: z.function().args().returns(z.promise(z.union([ z.array(zRewrite), z.object({ beforeFiles: z.array(zRewrite), afterFiles: z.array(zRewrite), fallback: z.array(zRewrite) }) ]))).optional(), // sassOptions properties are unknown besides implementation, use z.any() here sassOptions: z.object({ implementation: z.string().optional() }).catchall(z.any()).optional(), serverExternalPackages: z.array(z.string()).optional(), serverRuntimeConfig: z.record(z.string(), z.any()).optional(), skipMiddlewareUrlNormalize: z.boolean().optional(), skipTrailingSlashRedirect: z.boolean().optional(), staticPageGenerationTimeout: z.number().optional(), expireTime: z.number().optional(), target: z.string().optional(), trailingSlash: z.boolean().optional(), transpilePackages: z.array(z.string()).optional(), typescript: z.strictObject({ ignoreBuildErrors: z.boolean().optional(), tsconfigPath: z.string().min(1).optional() }).optional(), useFileSystemPublicRoutes: z.boolean().optional(), // The webpack config type is unknown, use z.any() here webpack: z.any().nullable().optional(), watchOptions: z.strictObject({ pollIntervalMs: z.number().positive().finite().optional() }).optional() })); //# sourceMappingURL=config-schema.js.map