UNPKG

edgespec

Version:

Write Winter-CG compatible routes with filesystem routing and tons of features

1 lines 7.37 kB
{"version":3,"sources":["../../src/config/utils.ts","../../src/config/config.ts"],"names":["path","fs","bundleRequire","z"],"mappings":"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","file":"index.cjs","sourcesContent":["import path from \"node:path\"\nimport fs from \"node:fs/promises\"\nimport { bundleRequire } from \"bundle-require\"\nimport { EdgeSpecConfig } from \"src/config/config.js\"\nimport { SetRequired } from \"type-fest\"\n\nconst cloneObjectAndDeleteUndefinedKeys = <T extends Record<string, any>>(\n obj: T\n) => {\n const clone = { ...obj }\n Object.keys(clone).forEach((key) => {\n if (clone[key] === undefined) {\n delete clone[key]\n }\n })\n return clone\n}\n\nconst resolvePossibleRelativePath = (\n possibleRelativePath: string,\n configDirectory: string\n) => {\n if (path.isAbsolute(possibleRelativePath)) {\n return possibleRelativePath\n }\n\n return path.resolve(configDirectory, possibleRelativePath)\n}\n\nexport interface ResolvedEdgeSpecConfig extends EdgeSpecConfig {\n rootDirectory: string\n tsconfigPath: string\n routesDirectory: string\n}\n\n/**\n * Resolves relative paths and sets defaults for any missing values.\n */\nexport const resolveConfig = (\n config: SetRequired<EdgeSpecConfig, \"rootDirectory\">\n): ResolvedEdgeSpecConfig => {\n const { rootDirectory, tsconfigPath, routesDirectory, ...rest } =\n cloneObjectAndDeleteUndefinedKeys(config)\n\n const resolvedRootDirectory = path.resolve(config.rootDirectory)\n\n return {\n rootDirectory: resolvedRootDirectory,\n tsconfigPath: resolvePossibleRelativePath(\n tsconfigPath ?? \"tsconfig.json\",\n resolvedRootDirectory\n ),\n routesDirectory: resolvePossibleRelativePath(\n routesDirectory ?? \"api\",\n resolvedRootDirectory\n ),\n platform: \"wintercg-minimal\",\n ...rest,\n }\n}\n\nconst validateConfig = async (config: ResolvedEdgeSpecConfig) => {\n try {\n await fs.stat(config.routesDirectory)\n } catch (error) {\n throw new Error(`Could not find routes directory ${config.routesDirectory}`)\n }\n\n try {\n await fs.stat(config.tsconfigPath)\n } catch (error) {\n throw new Error(`Could not find tsconfig.json at ${config.tsconfigPath}`)\n }\n\n return config\n}\n\nexport const loadConfig = async (\n rootDirectory: string,\n overrides?: Partial<EdgeSpecConfig>\n) => {\n let loadedConfig: EdgeSpecConfig = {}\n\n let configInRootExists = false\n const potentialConfigPath = path.join(rootDirectory, \"edgespec.config.ts\")\n try {\n await fs.stat(potentialConfigPath)\n configInRootExists = true\n } catch {}\n\n if (configInRootExists) {\n const {\n mod: { default: config },\n } = await bundleRequire({\n filepath: potentialConfigPath,\n })\n\n if (!config) {\n throw new Error(\n `Could not find a default export in ${potentialConfigPath}`\n )\n }\n\n loadedConfig = config\n }\n\n return await validateConfig(\n resolveConfig({\n rootDirectory,\n ...loadedConfig,\n ...cloneObjectAndDeleteUndefinedKeys(overrides ?? {}),\n })\n )\n}\n","import { z } from \"zod\"\n\nconst edgeSpecConfigSchema = z\n .object({\n /**\n * Defaults to the current working directory.\n */\n rootDirectory: z.string().optional(),\n /**\n * If this path is relative, it's resolved relative to the `rootDirectory` option.\n */\n tsconfigPath: z.string().optional(),\n /**\n * If this path is relative, it's resolved relative to the `rootDirectory` option.\n */\n routesDirectory: z.string().optional(),\n /**\n * The platform you're targeting.\n *\n * Defaults to `wintercg-minimal`, and you should use this whenever possible for maximal compatibility.\n *\n * Check [the docs](https://github.com/seamapi/edgespec/blob/main/docs/edgespec-config.md) for more information.\n */\n platform: z\n .enum([\"node\", \"wintercg-minimal\"])\n .default(\"wintercg-minimal\")\n .optional(),\n })\n .strict()\n\nexport type EdgeSpecConfig = z.infer<typeof edgeSpecConfigSchema>\n\nexport const defineConfig = (config: EdgeSpecConfig): EdgeSpecConfig => {\n const parsedConfig = edgeSpecConfigSchema.safeParse(config)\n\n if (parsedConfig.success) {\n return parsedConfig.data\n }\n\n throw new Error(`Invalid config: ${parsedConfig.error}`)\n}\n"]}