@octalmesh/seagull 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -25
- package/dist/cli.mjs +5 -48
- package/dist/cli.mjs.map +1 -1
- package/dist/dist-Ou2inxGj.mjs +16783 -0
- package/dist/dist-Ou2inxGj.mjs.map +1 -0
- package/dist/index.d.mts +1207 -42
- package/dist/index.mjs +2 -4
- package/package.json +13 -9
- package/dist/serve-docs-BZaITOD0.mjs +0 -1567
- package/dist/serve-docs-BZaITOD0.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serve-docs-BZaITOD0.mjs","names":["parseYaml","parseYaml","stringifyYaml"],"sources":["../src/config/schema.ts","../src/config/template.ts","../src/config/loader.ts","../src/config/resolve-config-file.ts","../src/core/process/exec.ts","../src/core/process/resolve-bin.ts","../src/core/redocly/redocly-sync.ts","../src/commands/bundle.ts","../src/commands/clean.ts","../src/commands/generate-docs.ts","../src/core/generator/registry.ts","../src/core/readme/default-templates.ts","../src/core/readme/readme-renderer.ts","../src/core/version/version.ts","../src/core/generator/generator.ts","../src/generators/openapi-generator-cli/patchers/go-module.patcher.ts","../src/generators/openapi-generator-cli/patchers/maven.patcher.ts","../src/generators/openapi-generator-cli/patchers/npm.patcher.ts","../src/generators/openapi-generator-cli/openapi-generator-cli.generator.ts","../src/generators/openapi-typescript/openapi-typescript.generator.ts","../src/commands/generate-sdk.ts","../src/commands/lint.ts","../src/commands/publish-registries.ts","../src/core/git/git.ts","../src/commands/publish-sdk.ts","../src/commands/serve-docs.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * A free-form tree of leaf values, used for the `vars:` block in the CLI config.\n * Nest however deep is useful - every leaf becomes addressable as\n * `{vars.<dot.path>}` in templated fields.\n */\nexport type VarsTree = { [key: string]: string | number | boolean | VarsTree };\n\nexport const varsTreeSchema: z.ZodType<VarsTree> = z.lazy(() =>\n z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), varsTreeSchema]),\n ),\n);\n\nexport const githubSchema = z.object({\n owner: z.string().min(1),\n repo: z.string().min(1),\n});\n\nexport const pathsSchema = z.object({\n dist: z.string().min(1).default(\"dist\"),\n specs: z.string().min(1).optional(),\n docs: z.string().min(1).optional(),\n sdk: z.string().min(1).optional(),\n});\n\nexport const docsSchema = z.object({\n server: z.object({\n host: z.string().min(1),\n port: z.number().int().positive(),\n }),\n metadata: z.object({\n title: z.string().min(1),\n description: z.string().min(1),\n favicon: z.string().min(1),\n baseServerUrl: z.string().min(1),\n }),\n});\n\nexport const sdkToolSchema = z.enum([\n \"openapi-generator\",\n \"openapi-typescript\",\n]);\nexport const sdkLangSchema = z.enum([\"typescript\", \"go\", \"java\"]);\nexport const sdkKindSchema = z.enum([\"client\", \"server\"]);\n\n/**\n * `-g`/`--additional-properties` values: openapi-generator accepts strings,\n * numbers and booleans, all rendered as `key=value` on the CLI.\n */\nexport const additionalPropertiesSchema = z\n .record(z.string(), z.union([z.string(), z.number(), z.boolean()]))\n .default({});\n\nexport const mavenCoordsSchema = z.object({\n groupId: z.string().min(1),\n artifactId: z.string().min(1),\n});\n\n/**\n * The shape of a generator \"recipe\", without the cross-field checks below -\n * kept separate so {@link artifactRefSchema}'s `overrides:` can `.partial()`\n * it (zod rejects `.partial()` on a schema with `.check()` refinements\n * attached).\n */\nconst generatorDefBaseSchema = z.object({\n tool: sdkToolSchema,\n lang: sdkLangSchema,\n kind: sdkKindSchema,\n /**\n * `openapi-generator -g <generator>` value. Required when `tool` is\n * `openapi-generator`.\n */\n generator: z.string().min(1).optional(),\n /** npm package name template, e.g. `\"@{vars.org}/{service}-client\"`. */\n package: z.string().min(1).optional(),\n goModule: z.string().min(1).optional(),\n goPackageName: z.string().min(1).optional(),\n maven: mavenCoordsSchema.optional(),\n additionalProperties: additionalPropertiesSchema,\n /**\n * Optional path (relative to the config file's directory) to a custom README\n * template for this artifact - supports the same `{...}` placeholders as\n * naming templates, plus `{version}`, `{title}`, and `{artifact.*}`. If\n * omitted, a built-in default template for the artifact's language/kind is\n * used instead.\n */\n readme: z.string().min(1).optional(),\n});\n\n/**\n * A single generator \"recipe\": which tool to invoke and how. Referenced by id\n * from one or more contracts' `artifacts:` list.\n */\nexport const generatorDefSchema = generatorDefBaseSchema.check((ctx) => {\n const value = ctx.value;\n\n if (value.tool === \"openapi-generator\" && !value.generator) {\n ctx.issues.push({\n code: \"custom\",\n message: '\"generator\" is required when tool is \"openapi-generator\"',\n input: value,\n });\n }\n\n if (value.lang === \"go\" && !value.goModule) {\n ctx.issues.push({\n code: \"custom\",\n message: '\"goModule\" is required for lang \"go\"',\n input: value,\n });\n }\n\n if (value.lang === \"java\" && !value.maven) {\n ctx.issues.push({\n code: \"custom\",\n message: '\"maven\" ({ groupId, artifactId }) is required for lang \"java\"',\n input: value,\n });\n }\n\n if (value.lang === \"typescript\" && !value.package) {\n ctx.issues.push({\n code: \"custom\",\n message: '\"package\" is required for lang \"typescript\"',\n input: value,\n });\n }\n});\n\nexport type GeneratorDefInput = z.infer<typeof generatorDefSchema>;\n\nexport const generatorsSchema = z.record(z.string(), generatorDefSchema);\n\n/**\n * A contract's reference to a generator by id. The plain-string form just runs\n * that generator as-is; the object form lets one contract tweak a shared\n * generator (extra/overridden `additionalProperties`, a different\n * `maven`/`package`/`readme`/... value) without duplicating the whole recipe\n * under a new id, and `as` renames the artifact's own id (output\n * folder / branch / tag segment) if a contract needs two variants of the same\n * base generator.\n */\nexport const artifactRefSchema = z.union([\n z.string().min(1),\n z.object({\n generator: z.string().min(1),\n as: z.string().min(1).optional(),\n overrides: generatorDefBaseSchema.partial().optional(),\n }),\n]);\n\nexport const contractSchema = z.object({\n name: z.string().min(1),\n title: z.string().min(1),\n entrypoint: z.string().min(1),\n artifacts: z.array(artifactRefSchema).min(1),\n});\n\nexport const rootConfigSchema = z.object({\n github: githubSchema,\n vars: varsTreeSchema.default({}),\n paths: pathsSchema.default({ dist: \"dist\" }),\n docs: docsSchema,\n generators: generatorsSchema,\n contracts: z.array(contractSchema).min(1),\n});\n\nexport type RootConfigInput = z.infer<typeof rootConfigSchema>;\nexport type ArtifactRefInput = z.infer<typeof artifactRefSchema>;\nexport type ContractInput = z.infer<typeof contractSchema>;\n","const PLACEHOLDER = /\\{([a-zA-Z0-9_.]+)}/g;\n\nexport type TemplateScope = Record<string, unknown>;\nexport type TemplateContext = Readonly<Record<string, string>>;\n\n/**\n * Replaces every `{dot.path}` placeholder in `template` with its value from\n * `context`, throwing a descriptive error if a placeholder has no match -\n * a typo'd `{vars.org}` should fail loudly at config-load time, not silently\n * produce a package named literally `@{vars.org}/...`.\n *\n * @param template - The template string, e.g. `\"@{vars.org}/{service}-client\"`.\n * @param context - The flattened context to resolve placeholders against.\n * @returns The interpolated string.\n */\nexport function interpolate(\n template: string,\n context: TemplateContext,\n): string {\n return template.replace(PLACEHOLDER, (_match, key: string) => {\n const value = context[key];\n\n if (value === undefined) {\n const available = Object.keys(context).sort().join(\", \");\n\n throw new Error(\n `Unknown template placeholder \"{${key}}\" in \"${template}\" (available: ${available})`,\n );\n }\n\n return value;\n });\n}\n\n/**\n * Recursively interpolates every string value in `value` (walking through plain\n * objects), leaving non-string leaves untouched. Used to resolve\n * `additionalProperties` maps, which may mix templated strings with plain\n * booleans/numbers.\n *\n * @param value - The value (string, object, or primitive) to interpolate.\n * @param context - The flattened context to resolve placeholders against.\n * @returns A deep copy of `value` with every string interpolated.\n */\nexport function interpolateDeep<T>(value: T, context: TemplateContext): T {\n if (typeof value === \"string\") {\n return interpolate(value, context) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => interpolateDeep(item, context)) as T;\n }\n\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, child]) => [\n key,\n interpolateDeep(child, context),\n ]),\n ) as T;\n }\n\n return value;\n}\n\n/**\n * Flattens a nested scope object (e.g. `{ service: \"auth\", vars: { org: \"x\" } }`)\n * into dot-path lookup keys (`{ service: \"auth\", \"vars.org\": \"x\" }`) for use\n * with {@link interpolate}.\n *\n * @param scope - The nested scope to flatten.\n * @returns A flat dot-path -> string map.\n */\nexport function buildTemplateContext(scope: TemplateScope): TemplateContext {\n const out: Record<string, string> = {};\n\n flatten(scope, \"\", out);\n\n return out;\n}\n\nfunction flatten(\n value: unknown,\n prefix: string,\n out: Record<string, string>,\n): void {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n for (const [key, child] of Object.entries(\n value as Record<string, unknown>,\n )) {\n flatten(child, prefix ? `${prefix}.${key}` : key, out);\n }\n\n return;\n }\n\n if (value === undefined) {\n return;\n }\n\n out[prefix] = String(value);\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { parse as parseYaml } from \"yaml\";\nimport { z } from \"zod\";\n\nimport {\n type ArtifactRefInput,\n type ContractInput,\n type GeneratorDefInput,\n type RootConfigInput,\n rootConfigSchema,\n} from \"./schema\";\nimport { buildTemplateContext, interpolateDeep } from \"./template\";\nimport type {\n ResolvedArtifact,\n ResolvedConfig,\n ResolvedContract,\n} from \"./types\";\n\n/**\n * Reads and validates a CLI config file, throwing a readable, multi-issue error\n * message if it doesn't match the schema.\n *\n * @param configPath - Absolute path to the YAML config file.\n * @returns The validated (but not yet resolved) raw config.\n */\nfunction readRawConfig(configPath: string): RootConfigInput {\n const raw = parseYaml(readFileSync(configPath, \"utf8\"));\n const result = rootConfigSchema.safeParse(raw);\n\n if (!result.success) {\n const issues = z.prettifyError(result.error);\n\n throw new Error(`Invalid ${path.basename(configPath)}:\\n${issues}`);\n }\n\n return result.data;\n}\n\n/**\n * Deep-merges a generator override (from an artifact's `overrides:` block)\n * onto its base generator def. `additionalProperties` and `maven` are merged\n * key-by-key; every other field is a plain override.\n *\n * @param base - The base generator def, looked up by id from `generators:`.\n * @param overrides - The partial override from the artifact reference, if any.\n * @returns The merged generator def.\n */\nfunction mergeGeneratorOverride(\n base: GeneratorDefInput,\n overrides: Partial<GeneratorDefInput> | undefined,\n): GeneratorDefInput {\n if (!overrides) {\n return base;\n }\n\n return {\n ...base,\n ...overrides,\n maven: overrides.maven ? { ...base.maven, ...overrides.maven } : base.maven,\n additionalProperties: {\n ...base.additionalProperties,\n ...overrides.additionalProperties,\n },\n };\n}\n\n/**\n * Resolves a single artifact reference (string id, or `{ generator, overrides,\n * as }`) into its `{ id, def }` pair, looking up the base generator by id and\n * applying any overrides.\n *\n * @param ref - The artifact reference from a contract's `artifacts:`\n * list.\n * @param generators - The full `generators:` map from the raw config.\n * @param contractName - The owning contract's name.\n * @returns The artifact's resolved id and generator def (templates not yet\n * interpolated).\n */\nfunction resolveArtifactRef(\n ref: ArtifactRefInput,\n generators: RootConfigInput[\"generators\"],\n contractName: string,\n): { id: string; def: GeneratorDefInput } {\n const generatorId = typeof ref === \"string\" ? ref : ref.generator;\n const base = generators[generatorId];\n\n if (!base) {\n const available = Object.keys(generators).sort().join(\", \");\n\n throw new Error(\n `Contract \"${contractName}\" references unknown generator \"${generatorId}\" ` +\n `(available: ${available})`,\n );\n }\n\n const id = typeof ref === \"string\" ? ref : (ref.as ?? ref.generator);\n const overrides = typeof ref === \"string\" ? undefined : ref.overrides;\n\n return { id, def: mergeGeneratorOverride(base, overrides) };\n}\n\n/**\n * Interpolates templates and resolves absolute paths for a single artifact.\n *\n * @param id - The artifact's resolved id (output folder / branch /\n * tag segment).\n * @param def - The (override-merged, not-yet-interpolated) generator\n * def.\n * @param rootDir - Absolute repo root, `readme` template paths are\n * resolved relative to this.\n * @param sdkDir - Absolute path to the SDK output root (`<dist>/sdk`).\n * @param contractName - The owning contract's name.\n * @param context - The flattened template context for this contract.\n * @returns The fully resolved artifact.\n */\nfunction resolveArtifact(\n id: string,\n def: GeneratorDefInput,\n rootDir: string,\n sdkDir: string,\n contractName: string,\n context: Record<string, string>,\n): ResolvedArtifact {\n const resolved = interpolateDeep(def, context);\n\n return {\n id,\n tool: resolved.tool,\n lang: resolved.lang,\n kind: resolved.kind,\n generator: resolved.generator,\n outputDir: path.join(sdkDir, contractName, id),\n branch: `sdk/svc-${contractName}/${id}`,\n tagPrefix: `svc-${contractName}-${id}`,\n additionalProperties: resolved.additionalProperties,\n package: resolved.package,\n goModule: resolved.goModule,\n goPackageName: resolved.goPackageName,\n maven: resolved.maven,\n readmeTemplate: resolved.readme\n ? path.resolve(rootDir, resolved.readme)\n : undefined,\n };\n}\n\n/**\n * Resolves a single contract: its entrypoint path and every artifact in its\n * `artifacts:` list.\n *\n * @param input - The raw contract config.\n * @param rootDir - Absolute repo root, entrypoints/`readme` paths are\n * resolved relative to this.\n * @param sdkDir - Absolute path to the SDK output root (`<dist>/sdk`).\n * @param generators - The full `generators:` map from the raw config.\n * @param githubCtx - `{ owner, repo }`, exposed to templates as\n * `{github.owner}`/`{github.repo}`.\n * @param vars - The `vars:` tree from the raw config, exposed as\n * `{vars.*}`.\n * @returns The fully resolved contract.\n */\nfunction resolveContract(\n input: ContractInput,\n rootDir: string,\n sdkDir: string,\n generators: RootConfigInput[\"generators\"],\n githubCtx: { owner: string; repo: string },\n vars: RootConfigInput[\"vars\"],\n): ResolvedContract {\n const context = buildTemplateContext({\n service: input.name,\n github: githubCtx,\n vars,\n });\n\n const artifacts = input.artifacts.map((ref): ResolvedArtifact => {\n const { id, def } = resolveArtifactRef(ref, generators, input.name);\n\n return resolveArtifact(id, def, rootDir, sdkDir, input.name, context);\n });\n\n const entrypoint = path.join(rootDir, input.entrypoint);\n\n return {\n name: input.name,\n title: input.title,\n entrypoint,\n entrypointRelative: path.relative(rootDir, entrypoint),\n artifacts,\n };\n}\n\n/**\n * Loads, validates, and fully resolves a CLI config file - the single entry\n * point every command uses to get its configuration.\n *\n * Unlike a build tool bundled into the consumer's own repo, seagull is\n * installed as a dependency, so it has no way to guess where the\n * consumer's config lives on its own - `configPath` must be supplied by the\n * caller (the CLI resolves it via `resolveConfigPath()` in\n * `config/resolve-config-file.ts`, or `--config`).\n *\n * @param configPath - Absolute path to the CLI config file.\n * @returns The fully resolved config.\n */\nexport function loadConfig(configPath: string): ResolvedConfig {\n const rootDir = path.dirname(configPath);\n const raw = readRawConfig(configPath);\n\n const distDir = path.resolve(rootDir, raw.paths.dist);\n const specsDir = raw.paths.specs\n ? path.resolve(rootDir, raw.paths.specs)\n : path.join(distDir, \"specs\");\n const docsDir = raw.paths.docs\n ? path.resolve(rootDir, raw.paths.docs)\n : path.join(distDir, \"docs\");\n const sdkDir = raw.paths.sdk\n ? path.resolve(rootDir, raw.paths.sdk)\n : path.join(distDir, \"sdk\");\n\n const contracts = raw.contracts.map((contract) =>\n resolveContract(\n contract,\n rootDir,\n sdkDir,\n raw.generators,\n raw.github,\n raw.vars,\n ),\n );\n\n return {\n rootDir,\n paths: { dist: distDir, specs: specsDir, docs: docsDir, sdk: sdkDir },\n github: raw.github,\n vars: raw.vars,\n docs: raw.docs,\n contracts,\n allArtifacts: contracts.flatMap((contract) =>\n contract.artifacts.map((artifact) => ({ contract, artifact })),\n ),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Config filenames CLI recognizes, checked in this order.\n */\nexport const CONFIG_FILENAMES = [\n \".seagull\",\n \".seagull.yaml\",\n \".seagull.yml\",\n \"seagull.yaml\",\n \"seagull.yml\",\n] as const;\n\n/**\n * Finds the CLI config file in a directory, trying each of\n * {@link CONFIG_FILENAMES} in order.\n *\n * @param cwd - The directory to look in (typically `process.cwd()`).\n * @returns The absolute path to the first matching config file.\n * @throws Error if none of the candidate filenames exist in `cwd`.\n *\n * @see {@link CONFIG_FILENAMES} - the list of filenames checked, in order.\n */\nexport function resolveConfigPath(cwd: string): string {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = path.join(cwd, filename);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n `No CLI config found in ${cwd} - looked for: ${CONFIG_FILENAMES.join(\", \")}. ` +\n `Create one of these, or pass --config <path>.`,\n );\n}\n","import { spawn, spawnSync } from \"node:child_process\";\n\n/**\n * Runs a command to completion, streaming its stdio straight through\n * (`inherit`), and rejects if it exits non-zero.\n *\n * This is the async counterpart used for the \"one long-running tool\" commands\n * (`redocly`, `openapi-generator-cli`, `openapi-typescript`); for short\n * synchronous calls (git plumbing, `npm publish`/`mvn deploy`), see\n * {@link runSync}.\n *\n * @param command - The executable to run.\n * @param args - Arguments to pass to it.\n * @param cwd - The working directory to run it in.\n * @returns A promise that resolves on exit code 0, and rejects otherwise.\n */\nexport function run(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise<void>((resolvePromise, reject) => {\n const child = spawn(command, args, { cwd, stdio: \"inherit\", shell: true });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolvePromise();\n return;\n }\n\n reject(new Error(`${command} ${args.join(\" \")} exited with ${code}`));\n });\n });\n}\n\n/**\n * Runs a command to completion synchronously, streaming its stdio straight\n * through (`inherit`).\n *\n * @param command - The executable to run.\n * @param args - Arguments to pass to it.\n * @param cwd - The working directory to run it in.\n * @returns The exit status (0 on success).\n */\nexport function runSync(command: string, args: string[], cwd: string): number {\n const result = spawnSync(command, args, {\n cwd,\n stdio: \"inherit\",\n shell: true,\n });\n\n return result.status ?? 1;\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Resolves the absolute path to an installed npm package's own CLI entrypoint\n * script, using Node's standard module resolution algorithm - so it works the\n * same way regardless of which package manager (npm/pnpm/yarn) installed CLI\n * and its dependencies, or how deeply they get hoisted. Shelling out to\n * `pnpm exec`/`npx` instead would assume a specific package manager and a\n * particular install layout, which doesn't hold once CLI is just another\n * dependency in someone else's project.\n *\n * @param pkgName - The npm package name, e.g. `\"@org/cli\"`.\n * @param binName - Which entry to resolve from that package's `bin` field.\n * Defaults to the package's own unscoped name.\n * @returns The absolute path to the resolved bin script.\n * @throws Error if the package or the requested bin entry can't be found.\n */\nexport function resolveBinPath(pkgName: string, binName?: string): string {\n const pkgJsonPath = require.resolve(`${pkgName}/package.json`);\n const pkgDir = path.dirname(pkgJsonPath);\n const pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\")) as {\n name: string;\n bin?: string | Record<string, string>;\n };\n\n const key = binName ?? pkg.name.split(\"/\").pop()!;\n const bin = typeof pkg.bin === \"string\" ? pkg.bin : pkg.bin?.[key];\n\n if (!bin) {\n throw new Error(\n `Could not resolve a \"${key}\" bin entry for package \"${pkgName}\" - ` +\n `is it installed, and does it expose that bin?`,\n );\n }\n\n return path.join(pkgDir, bin);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\nconst GENERATED_HEADER =\n \"# AUTO-GENERATED by Seagull from its config and 'redocly.base.yaml'.\\n\" +\n \"# Do not edit directly, edit those two files instead (this file is\\n\" +\n \"# regenerated on every lint/bundle/generate run).\\n\\n\";\n\ninterface RedoclyBase {\n extends?: string[];\n rules?: Record<string, string>;\n}\n\n/**\n * Regenerates `redocly.yaml`'s `apis:` section from the resolved CLI config,\n * merging it with the hand-authored `extends`/`rules` in `redocly.base.yaml`.\n *\n * The CLI config stays the single source of truth for which APIs exist and\n * where their TypeScript server types land, instead of that being duplicated\n * by hand into `redocly.yaml`.\n *\n * Called at the start of every command that shells out to `redocly` or\n * `openapi-typescript` (both read `redocly.yaml` directly), so it's always\n * up to date before those tools run.\n *\n * @param config - The resolved CLI config.\n */\nexport async function syncRedoclyConfig(config: ResolvedConfig): Promise<void> {\n const basePath = path.join(config.rootDir, \"redocly.base.yaml\");\n const base = parseYaml(await readFile(basePath, \"utf8\")) as RedoclyBase;\n\n const apis = Object.fromEntries(\n config.contracts.map((contract) => {\n const typesArtifact = contract.artifacts.find(\n (artifact) => artifact.tool === \"openapi-typescript\",\n );\n\n return [\n `${contract.name}@v1`,\n {\n root: contract.entrypointRelative,\n ...(typesArtifact\n ? {\n \"x-openapi-ts\": {\n output: path.join(\n path.relative(config.rootDir, typesArtifact.outputDir),\n \"index.d.ts\",\n ),\n },\n }\n : {}),\n },\n ];\n }),\n );\n\n const final = { extends: base.extends, apis, rules: base.rules };\n\n await writeFile(\n path.join(config.rootDir, \"redocly.yaml\"),\n GENERATED_HEADER + stringifyYaml(final),\n );\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { run } from \"@core/process/exec\";\nimport { resolveBinPath } from \"@core/process/resolve-bin\";\nimport { syncRedoclyConfig } from \"@core/redocly/redocly-sync\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\n/**\n * Bundles every contract's OpenAPI spec into `dist/specs/<contract>.json`.\n *\n * @param config - The resolved CLI config.\n */\nexport async function bundleCommand(config: ResolvedConfig): Promise<void> {\n await syncRedoclyConfig(config);\n\n await rm(config.paths.specs, { recursive: true, force: true });\n await mkdir(config.paths.specs, { recursive: true });\n\n const redoclyBin = resolveBinPath(\"@redocly/cli\", \"redocly\");\n\n for (const contract of config.contracts) {\n const output = path.join(config.paths.specs, `${contract.name}.json`);\n\n await run(\n \"node\",\n [redoclyBin, \"bundle\", contract.entrypoint, \"-o\", output],\n config.rootDir,\n );\n }\n\n console.log(\n `Bundled ${config.contracts.length} specifications into ${config.paths.specs}`,\n );\n}\n","import { rm } from \"node:fs/promises\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\n/**\n * Removes the entire `dist` output directory.\n *\n * @param config - The resolved CLI config.\n */\nexport async function cleanCommand(config: ResolvedConfig): Promise<void> {\n await rm(config.paths.dist, { recursive: true, force: true });\n\n console.log(`Cleaned ${config.paths.dist}`);\n}\n","import { copyFile, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\n/**\n * Generates the documentation website for every contract into `dist/docs`.\n *\n * @param config - The resolved CLI config.\n */\nexport async function generateDocsCommand(\n config: ResolvedConfig,\n): Promise<void> {\n const output = config.paths.docs;\n const specsOutput = join(output, \"specs\");\n\n await rm(output, { recursive: true, force: true });\n await mkdir(specsOutput, { recursive: true });\n\n for (const contract of config.contracts) {\n const source = join(config.paths.specs, `${contract.name}.json`);\n const target = join(specsOutput, `${contract.name}.json`);\n const contents = await readFile(source, \"utf8\");\n\n await writeFile(target, contents);\n }\n\n const require = createRequire(import.meta.url);\n const mainEntryPoint = require.resolve(\"@scalar/api-reference\");\n\n let packageDir = dirname(mainEntryPoint);\n\n while (\n !packageDir.endsWith(\"@scalar/api-reference\") &&\n !packageDir.endsWith(\"@scalar\\\\api-reference\")\n ) {\n const parent = dirname(packageDir);\n\n if (parent === packageDir) {\n break;\n }\n\n packageDir = parent;\n }\n\n const scalarScriptPath = join(packageDir, \"dist\", \"browser\", \"standalone.js\");\n const scalarTarget = join(output, \"scalar.js\");\n\n await copyFile(scalarScriptPath, scalarTarget);\n console.log(`Copied Scalar script to ${scalarTarget}`);\n\n const sources = config.contracts\n .map(\n (contract, index) => `{\n title: ${JSON.stringify(contract.title)},\n slug: ${JSON.stringify(contract.name)},\n url: \"./specs/${contract.name}.json\"${\n index === 0 ? \",\\n default: true\" : \"\"\n }\n }`,\n )\n .join(\",\\n\");\n\n const { metadata } = config.docs;\n const html =\n //<editor-fold desc=\"HTML Template\" defaultstate=\"collapsed\">\n `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n </head>\n <body>\n <div id=\"app\"></div>\n\n <!-- Load the Script -->\n <script src=\"./scalar.js\"></script>\n\n <!-- Initialize the API Reference -->\n <script>\n Scalar.createApiReference(\"#app\", {\n baseServerURL: \"${metadata.baseServerUrl}\",\n favicon: \"${metadata.favicon}\",\n metaData: {\n title: \"${metadata.title}\",\n description: \"${metadata.description}\",\n ogTitle: \"${metadata.title}\",\n ogDescription: \"${metadata.description}\",\n },\n layout: \"classic\",\n darkMode: true,\n telemetry: false,\n showDeveloperTools: \"never\",\n showOperationId: true,\n hideTestRequestButton: false,\n sources: [\n ${sources}\n ]\n });\n </script>\n </body>\n</html>\n`;\n //</editor-fold>\n\n await writeFile(join(output, \"index.html\"), html);\n\n console.log(`Generated documentation website at ${output}`);\n}\n","import type { SdkTool } from \"@config/types\";\n\nimport type { Generator } from \"./generator\";\n\n/**\n * Looks up the concrete {@link Generator} implementation for a given tool name.\n */\nexport class GeneratorRegistry {\n private readonly generators = new Map<SdkTool, Generator>();\n\n /**\n * Registers a generator implementation under its own {@link Generator.tool}.\n *\n * @param generator - The generator instance to register.\n * @returns `this`, for chaining.\n */\n register(generator: Generator): this {\n this.generators.set(generator.tool, generator);\n\n return this;\n }\n\n /**\n * Resolves the generator implementation for a given tool name.\n *\n * @param tool - The tool name, e.g. `\"openapi-generator\"`.\n * @returns The registered generator.\n * @throws Error if no generator is registered for that tool.\n */\n resolve(tool: SdkTool): Generator {\n const generator = this.generators.get(tool);\n\n if (!generator) {\n const available = [...this.generators.keys()].join(\", \");\n\n throw new Error(\n `No generator implementation registered for tool \"${tool}\" (available: ${available})`,\n );\n }\n\n return generator;\n }\n\n /**\n * All distinct tools currently registered.\n *\n * @returns The registered tool names.\n */\n tools(): SdkTool[] {\n return [...this.generators.keys()];\n }\n}\n","import type { ResolvedArtifact, ResolvedContract } from \"@config/types\";\n\nexport interface DefaultReadmeArgs {\n contract: ResolvedContract;\n artifact: ResolvedArtifact;\n version: string;\n github: { owner: string; repo: string };\n}\n\n/**\n * Renders a sensible default `README.md` for a generated SDK package, used\n * whenever the artifact has no custom `readme:` template configured. Covers\n * every built-in `lang`/`kind` combination; anything more specific (an internal\n * registry URL, a real base API URL, house install instructions) belongs in a\n * custom template instead - see `readme-renderer.ts`.\n *\n * @param args - The contract, artifact, version, and github coordinates to\n * render for.\n * @returns The rendered README content.\n */\nexport function renderDefaultReadme({\n contract,\n artifact,\n version,\n github,\n}: DefaultReadmeArgs): string {\n const header = `# ${contract.title} - ${label(artifact)}\n\n> Generated from \\`${contract.entrypointRelative}\\` in [${github.owner}/${github.repo}](https://github.com/${github.owner}/${github.repo}).\n> Do not edit by hand - this package is regenerated and republished on every release.\n\nVersion: \\`${version}\\`\nSource branch: \\`${artifact.branch}\\`\n`;\n\n return `${header}\\n${body(contract, artifact, version, github)}\\n`;\n}\n\n//<editor-fold desc=\"README Template Helpers\" defaultstate=\"collapsed\">\n\nfunction label(artifact: ResolvedArtifact): string {\n const lang = { typescript: \"TypeScript\", go: \"Go\", java: \"Java\" }[\n artifact.lang\n ];\n const kind =\n artifact.kind === \"client\"\n ? \"Client SDK\"\n : artifact.lang === \"typescript\"\n ? \"Server Types\"\n : \"Server Stubs\";\n\n return `${lang} ${kind}`;\n}\n\nfunction body(\n contract: ResolvedContract,\n artifact: ResolvedArtifact,\n version: string,\n github: { owner: string; repo: string },\n): string {\n switch (`${artifact.lang}-${artifact.kind}`) {\n case \"typescript-client\":\n return tsClient(artifact, version);\n case \"typescript-server\":\n return tsServer(artifact, version);\n case \"go-client\":\n return goClient(contract, artifact);\n case \"go-server\":\n return goServer(contract, artifact);\n case \"java-client\":\n return javaClient(artifact, version, github);\n case \"java-server\":\n return javaServer(artifact, version, github);\n default:\n return \"\";\n }\n}\n\n//</editor-fold>\n\n//<editor-fold desc=\"README Body Templates\" defaultstate=\"collapsed\">\n\nfunction tsClient(artifact: ResolvedArtifact, version: string): string {\n return `## Install\n\n\\`\\`\\`bash\nnpm config set <scope>:registry https://npm.pkg.github.com\nnpm install ${artifact.package}@${version}\n\\`\\`\\`\n\n(GitHub Packages requires an authenticated \\`.npmrc\\` with a token that has\n\\`read:packages\\`.)\n\n## Usage\n\n\\`\\`\\`ts\nimport { Configuration, DefaultApi } from \"${artifact.package}\";\n\nconst api = new DefaultApi(\n new Configuration({ basePath: \"https://api.your-domain.com\" }),\n);\n\nconst result = await api.someOperation();\n\\`\\`\\`\n`;\n}\n\nfunction tsServer(artifact: ResolvedArtifact, version: string): string {\n return `## Install\n\n\\`\\`\\`bash\nnpm config set <scope>:registry https://npm.pkg.github.com\nnpm install --save-dev ${artifact.package}@${version}\n\\`\\`\\`\n\n(GitHub Packages requires an authenticated \\`.npmrc\\` with a token that has\n\\`read:packages\\`.)\n\n## Usage\n\n\\`\\`\\`ts\nimport type { components, operations } from \"${artifact.package}\";\n\ntype LoginResponses = operations[\"login\"][\"responses\"];\n\n// Example: an Express handler typed against the contract\napp.post(\"/login\", (req, res) => {\n const body = req.body as components[\"schemas\"][\"LoginRequest\"];\n const response: LoginResponses[200][\"content\"][\"application/json\"] = {\n // ...\n };\n res.json(response);\n});\n\\`\\`\\`\n`;\n}\n\nfunction goClient(\n contract: ResolvedContract,\n artifact: ResolvedArtifact,\n): string {\n return `## Install\n\nGo has no package registry, so this module is pulled directly from its\npublishing branch:\n\n\\`\\`\\`bash\ngo get ${artifact.goModule}@sdk/svc-${contract.name}/${artifact.id}\n\\`\\`\\`\n\nTo pin an exact release instead of the branch head, use the matching tag:\n\n\\`\\`\\`bash\ngo get ${artifact.goModule}@${artifact.tagPrefix}-v<version>\n\\`\\`\\`\n\n## Usage\n\n\\`\\`\\`go\nimport (\n \"context\"\n\n ${artifact.goPackageName} \"${artifact.goModule}\"\n)\n\nfunc main() {\n cfg := ${artifact.goPackageName}.NewConfiguration()\n client := ${artifact.goPackageName}.NewAPIClient(cfg)\n\n resp, _, err := client.DefaultAPI.SomeOperation(context.Background()).Execute()\n _ = resp\n _ = err\n}\n\\`\\`\\`\n`;\n}\n\nfunction goServer(\n contract: ResolvedContract,\n artifact: ResolvedArtifact,\n): string {\n return `## Install\n\n\\`\\`\\`bash\ngo get ${artifact.goModule}@sdk/svc-${contract.name}/${artifact.id}\n\\`\\`\\`\n\n## Usage\n\nImplement the generated \\`${artifact.goPackageName}.*ApiServicer\\` interfaces and\nwire them into the generated router:\n\n\\`\\`\\`go\nrouter := ${artifact.goPackageName}.NewRouter(\n ${artifact.goPackageName}.NewSomeApiController(yourServiceImpl),\n)\n\\`\\`\\`\n`;\n}\n\nfunction javaClient(\n artifact: ResolvedArtifact,\n version: string,\n github: { owner: string; repo: string },\n): string {\n return `## Install (Maven, GitHub Packages)\n\n\\`\\`\\`xml\n<dependency>\n <groupId>${artifact.maven?.groupId}</groupId>\n <artifactId>${artifact.maven?.artifactId}</artifactId>\n <version>${version}</version>\n</dependency>\n\\`\\`\\`\n\nAdd the repository to your \\`settings.xml\\` (or \\`pom.xml\\`) with a token that\nhas \\`read:packages\\`:\n\n\\`\\`\\`xml\n<repository>\n <id>github</id>\n <url>https://maven.pkg.github.com/${github.owner}/${github.repo}</url>\n</repository>\n\\`\\`\\`\n\n## Usage\n\nGenerated with \\`library=restclient\\` - Spring's \\`RestClient\\`, the current\nrecommended synchronous HTTP client for Spring apps:\n\n\\`\\`\\`java\n@Configuration\npublic class SomeServiceClientConfig {\n\n @Bean\n public ApiClient someServiceApiClient(RestClient.Builder builder) {\n ApiClient client = new ApiClient(builder.build());\n client.setBasePath(\"https://api.your-domain.com\");\n return client;\n }\n\n @Bean\n public DefaultApi someServiceApi(ApiClient someServiceApiClient) {\n return new DefaultApi(someServiceApiClient);\n }\n}\n\\`\\`\\`\n`;\n}\n\nfunction javaServer(\n artifact: ResolvedArtifact,\n version: string,\n github: { owner: string; repo: string },\n): string {\n return `## Install (Maven, GitHub Packages)\n\n\\`\\`\\`xml\n<dependency>\n <groupId>${artifact.maven?.groupId}</groupId>\n <artifactId>${artifact.maven?.artifactId}</artifactId>\n <version>${version}</version>\n</dependency>\n\\`\\`\\`\n\nAdd the repository to your \\`settings.xml\\` (or \\`pom.xml\\`) with a token that\nhas \\`read:packages\\`:\n\n\\`\\`\\`xml\n<repository>\n <id>github</id>\n <url>https://maven.pkg.github.com/${github.owner}/${github.repo}</url>\n</repository>\n\\`\\`\\`\n\n## Usage\n\nThis artifact only contains the generated Spring \\`@RestController\\` interfaces\n(\\`interfaceOnly=true\\`) - implement them in your service:\n\n\\`\\`\\`java\n@RestController\npublic class SomeController implements SomeApi {\n // interface methods generated from the OpenAPI contract\n}\n\\`\\`\\`\n`;\n}\n\n//</editor-fold>\n","import { readFile } from \"node:fs/promises\";\n\nimport { buildTemplateContext, interpolate } from \"@config/template\";\nimport type {\n ResolvedArtifact,\n ResolvedContract,\n VarsTree,\n} from \"@config/types\";\n\nimport { renderDefaultReadme } from \"./default-templates\";\n\nexport interface RenderReadmeArgs {\n contract: ResolvedContract;\n artifact: ResolvedArtifact;\n version: string;\n github: { owner: string; repo: string };\n vars: VarsTree;\n}\n\n/**\n * Renders the root-level `README.md` for a generated SDK package.\n *\n * If the artifact has a `readme:` path configured (resolved at config-load time\n * to `artifact.readmeTemplate`), that file is read and interpolated with the\n * same `{...}` placeholder engine naming templates use - `{service}`,\n * `{title}`, `{version}`, `{vars.*}`, `{github.owner}`, `{github.repo}`, plus\n * `{artifact.*}` (id/lang/kind/package/goModule/goPackageName/maven.groupId/\n * maven.artifactId/branch/tagPrefix). Otherwise, falls back to a built-in\n * default template for the artifact's language/kind.\n *\n * @param args - The contract, artifact, version, and github/vars context to\n * render for.\n * @returns The rendered README content.\n */\nexport async function renderReadme(args: RenderReadmeArgs): Promise<string> {\n if (!args.artifact.readmeTemplate) {\n return renderDefaultReadme(args);\n }\n\n const raw = await readFile(args.artifact.readmeTemplate, \"utf8\");\n const context = buildTemplateContext({\n service: args.contract.name,\n title: args.contract.title,\n version: args.version,\n github: args.github,\n vars: args.vars,\n artifact: {\n id: args.artifact.id,\n lang: args.artifact.lang,\n kind: args.artifact.kind,\n package: args.artifact.package,\n goModule: args.artifact.goModule,\n goPackageName: args.artifact.goPackageName,\n maven: args.artifact.maven,\n branch: args.artifact.branch,\n tagPrefix: args.artifact.tagPrefix,\n },\n });\n\n return interpolate(raw, context);\n}\n","import { createHash } from \"node:crypto\";\n\n/**\n * Shape of a bundled OpenAPI document, narrowed to the one field this module\n * cares about.\n */\nexport interface BundledSpec {\n info?: {\n version?: string;\n };\n}\n\n/**\n * Resolves the version to stamp onto a single contract's generated SDK\n * artifacts (npm/Maven packages, Go module tags, git branches, etc.).\n *\n * The single source of truth is that contract's own `info.version` field in its\n * `openapi.yaml` - bump it there and every artifact, package, and git tag for\n * that contract picks up the new version on the next release. Versions are\n * resolved independently per contract: two services can be at different\n * versions at the same time.\n *\n * `SDK_VERSION_OVERRIDE` (wired up from the release workflow's manual `version`\n * input) bypasses the spec entirely and stamps every contract with the same\n * given value. It exists for one-off emergency republishes, not routine\n * releases. Routine releases should always go through `info.version`.\n *\n * @param spec - The parsed, bundled OpenAPI document for the contract.\n * @param contractName - The contract name, used only for the error message.\n * @returns The resolved version string (no leading `v`).\n * @throws Error if no override is set and the spec has no `info.version`.\n */\nexport function resolveVersion(\n spec: BundledSpec,\n contractName: string,\n): string {\n const override = process.env.SDK_VERSION_OVERRIDE?.trim();\n\n if (override) {\n return override.replace(/^v/, \"\");\n }\n\n const specVersion = spec.info?.version?.trim();\n\n if (!specVersion) {\n throw new Error(\n `specs/${contractName}/openapi.yaml is missing \"info.version\" - set it ` +\n `to a semver value. This field is the single source of truth for ` +\n `the ${contractName} contract's SDK version.`,\n );\n }\n\n return specVersion.replace(/^v/, \"\");\n}\n\n/**\n * Computes a stable content hash of a bundled OpenAPI document's raw JSON text.\n * Stamped alongside `VERSION` into every generated SDK package so\n * `publish-sdk.ts` can tell a genuine no-op republish (same spec, same version)\n * apart from a spec that changed without its `info.version` being bumped.\n *\n * @param raw - The raw bundled spec file contents (JSON text).\n * @returns A `sha256` hex digest of the raw contents.\n */\nexport function hashSpec(raw: string): string {\n return createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n","import type { SdkTool } from \"@config/types\";\n\nimport type { GenerateContext, PrepareContext } from \"./types\";\n\n/**\n * The root primitive every concrete SDK generator implements.\n *\n * One instance per underlying tool (`openapi-generator-cli`,\n * `openapi-typescript`, ...) - not one per language, since a single tool\n * invocation (e.g. `openapi-generator-cli -g java`/`-g go`) already covers\n * every language it supports. Language-specific behaviour (patching `go.mod`,\n * `package.json`, `pom.xml`, ...) is composed in via patchers rather than\n * living in per-language subclasses.\n */\nexport abstract class Generator {\n abstract readonly tool: SdkTool;\n\n /**\n * Optional one-time setup step, run once per tool before any of that tool's\n * {@link generate} calls - for tools like `openapi-typescript` that generate\n * every contract's output in a single global invocation instead of one call\n * per artifact.\n *\n * @param ctx - Every (contract, artifact) pair using this generator's tool.\n */\n prepare?(ctx: PrepareContext): Promise<void>;\n\n /**\n * Generates a single artifact.\n *\n * @param ctx - The contract, artifact, and resolved version to generate for.\n */\n abstract generate(ctx: GenerateContext): Promise<void>;\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { GenerateContext } from \"@core/generator/types\";\n\nimport type { Patcher } from \"./patcher\";\n\n/**\n * Patches the `go.mod` file in a generated Go SDK package to set the correct\n * module path (`openapi-generator-cli` has no way to be told this up front for\n * every template).\n */\nexport class GoModulePatcher implements Patcher {\n async patch({ artifact }: GenerateContext): Promise<void> {\n if (!artifact.goModule) {\n return;\n }\n\n const moduleFile = path.join(artifact.outputDir, \"go.mod\");\n\n try {\n const contents = await readFile(moduleFile, \"utf8\");\n\n await writeFile(\n moduleFile,\n contents.replace(/^module .*$/m, `module ${artifact.goModule}`),\n );\n } catch {\n // go-server templates don't always emit go.mod\n }\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { GenerateContext } from \"@core/generator/types\";\n\nimport type { Patcher } from \"./patcher\";\n\n/**\n * Patches the `pom.xml` file in a generated Java SDK package to set the correct\n * version and distribution management information for publishing.\n */\nexport class MavenPomPatcher implements Patcher {\n async patch({ artifact, version, github }: GenerateContext): Promise<void> {\n const pomFile = path.join(artifact.outputDir, \"pom.xml\");\n\n try {\n let pom = await readFile(pomFile, \"utf8\");\n\n pom = pom.replace(\n /<version>[^<]*<\\/version>/,\n `<version>${version}</version>`,\n );\n\n if (!pom.includes(\"<distributionManagement>\")) {\n pom = pom.replace(\n \"</project>\",\n [\n \" <distributionManagement>\",\n \" <repository>\",\n \" <id>github</id>\",\n ` <n>${github.owner} ${github.repo} Packages</n>`,\n ` <url>https://maven.pkg.github.com/${github.owner}/${github.repo}</url>`,\n \" </repository>\",\n \" </distributionManagement>\",\n \"</project>\",\n ].join(\"\\n\"),\n );\n }\n\n await writeFile(pomFile, pom);\n } catch {\n // pom.xml absent (e.g. Gradle build selected)\n }\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { GenerateContext } from \"@core/generator/types\";\n\nimport type { Patcher } from \"./patcher\";\n\n/**\n * Patches the `package.json` file in a generated TypeScript SDK package (the\n * client target - `openapi-generator-cli` produces its own `package.json`, this\n * just fills in the version and publishing metadata) to set the correct version\n * and repository information.\n */\nexport class NpmPackagePatcher implements Patcher {\n async patch({\n contract,\n artifact,\n version,\n github,\n }: GenerateContext): Promise<void> {\n const pkgFile = path.join(artifact.outputDir, \"package.json\");\n const pkgData = await readFile(pkgFile, \"utf8\");\n const pkg = JSON.parse(pkgData) as Record<string, unknown>;\n\n pkg.version = version;\n pkg.repository = {\n type: \"git\",\n url: `git+https://github.com/${github.owner}/${github.repo}.git`,\n directory: `sdk/svc-${contract.name}/${artifact.id}`,\n };\n pkg.publishConfig = {\n registry: \"https://npm.pkg.github.com\",\n access: \"restricted\",\n };\n\n await writeFile(pkgFile, JSON.stringify(pkg, null, 2));\n }\n}\n","import { mkdir } from \"node:fs/promises\";\n\nimport { Generator } from \"@core/generator/generator\";\nimport type { GenerateContext } from \"@core/generator/types\";\nimport { run } from \"@core/process/exec\";\nimport { resolveBinPath } from \"@core/process/resolve-bin\";\n\nimport type { ResolvedArtifact, SdkTool } from \"@config/types\";\n\nimport { GoModulePatcher } from \"./patchers/go-module.patcher\";\nimport { MavenPomPatcher } from \"./patchers/maven.patcher\";\nimport { NpmPackagePatcher } from \"./patchers/npm.patcher\";\nimport type { Patcher } from \"./patchers/patcher\";\n\n/**\n * Additional-properties that are fully derivable from an artifact's own\n * `package`/`goPackageName`/`maven` fields - conventional openapi-generator\n * knobs (`npmName`, `groupId`, ...) that would otherwise have to be duplicated\n * by hand in every generator's `additionalProperties:` block, in lockstep with\n * those same fields. Tool-specific tuning that isn't derivable this way\n * (`library=restclient`, `withGoMod`, ...) still lives in\n * `additionalProperties:` and is layered on top of these.\n *\n * @param artifact - The resolved artifact to derive properties for.\n * @returns The derived additional-properties, before the artifact's own\n * `additionalProperties` are layered on top.\n */\nfunction deriveAdditionalProperties(\n artifact: ResolvedArtifact,\n): Record<string, string> {\n if (artifact.lang === \"typescript\" && artifact.package) {\n return { npmName: artifact.package };\n }\n\n if (artifact.lang === \"go\" && artifact.goPackageName) {\n return { packageName: artifact.goPackageName };\n }\n\n if (artifact.lang === \"java\" && artifact.maven) {\n const invokerPackage = `${artifact.maven.groupId}.${artifact.kind}`;\n\n return {\n groupId: artifact.maven.groupId,\n artifactId: artifact.maven.artifactId,\n invokerPackage,\n apiPackage: `${invokerPackage}.api`,\n modelPackage: `${invokerPackage}.model`,\n };\n }\n\n return {};\n}\n\n/**\n * Renders an artifact's additional-properties (derived + explicit, explicit\n * wins on conflicts) as the `key=value,key=value` string\n * `openapi-generator-cli --additional-properties` expects.\n *\n * @param artifact - The resolved artifact.\n * @returns The rendered `--additional-properties` value.\n */\nfunction buildAdditionalPropertiesArg(artifact: ResolvedArtifact): string {\n const merged = {\n ...deriveAdditionalProperties(artifact),\n ...artifact.additionalProperties,\n };\n\n return Object.entries(merged)\n .map(([key, value]) => `${key}=${String(value)}`)\n .join(\",\");\n}\n\n/**\n * Wraps `openapi-generator-cli` - the single tool implementation behind every\n * `-g` template (`typescript-fetch`, `go`, `go-server`, `java`, `spring`, ...),\n * regardless of language. Language-specific output patching is delegated to a\n * {@link Patcher}, selected by `artifact.lang`.\n */\nexport class OpenApiGeneratorCli extends Generator {\n readonly tool: SdkTool = \"openapi-generator\";\n\n private readonly patchers: Partial<\n Record<ResolvedArtifact[\"lang\"], Patcher>\n > = {\n go: new GoModulePatcher(),\n typescript: new NpmPackagePatcher(),\n java: new MavenPomPatcher(),\n };\n\n async generate(ctx: GenerateContext): Promise<void> {\n const { artifact, rootDir, specInputPath } = ctx;\n\n if (!artifact.generator) {\n throw new Error(\n `Artifact \"${artifact.id}\" uses tool \"openapi-generator\" but has no \"generator\" value`,\n );\n }\n\n await mkdir(artifact.outputDir, { recursive: true });\n\n const bin = resolveBinPath(\n \"@openapitools/openapi-generator-cli\",\n \"openapi-generator-cli\",\n );\n\n await run(\n \"node\",\n [\n bin,\n \"generate\",\n \"-i\",\n specInputPath,\n \"-g\",\n artifact.generator,\n \"-o\",\n artifact.outputDir,\n `--additional-properties=${buildAdditionalPropertiesArg(artifact)}`,\n ],\n rootDir,\n );\n\n await this.patchers[artifact.lang]?.patch(ctx);\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { Generator } from \"@core/generator/generator\";\nimport type { GenerateContext, PrepareContext } from \"@core/generator/types\";\nimport { run } from \"@core/process/exec\";\nimport { resolveBinPath } from \"@core/process/resolve-bin\";\n\nimport type { SdkTool } from \"@config/types\";\n\n/**\n * Wraps `openapi-typescript`. Unlike `openapi-generator-cli`, it isn't invoked\n * once per artifact - it reads `redocly.yaml`'s `apis:` map (kept in sync with\n * the CLI config by `core/redocly/redocly-sync.ts`) and writes every contract's\n * `index.d.ts` to its configured `x-openapi-ts.output` path in a single run,\n * so that single global invocation happens once in {@link prepare}.\n * {@link generate} then only has to write each artifact's package.json` -\n * `openapi-typescript` emits `index.d.ts` alone, with no package manifest of\n * its own to patch.\n */\nexport class OpenApiTypescriptGenerator extends Generator {\n readonly tool: SdkTool = \"openapi-typescript\";\n\n override async prepare({ rootDir, entries }: PrepareContext): Promise<void> {\n await Promise.all(\n entries.map((entry) =>\n mkdir(entry.artifact.outputDir, { recursive: true }),\n ),\n );\n\n const bin = resolveBinPath(\"openapi-typescript\", \"openapi-typescript\");\n\n await run(\"node\", [bin], rootDir);\n }\n\n async generate({\n contract,\n artifact,\n version,\n github,\n }: GenerateContext): Promise<void> {\n const pkg = {\n name: artifact.package,\n version,\n description: `Types-only OpenAPI contract for the ${contract.name} service.`,\n types: \"./index.d.ts\",\n files: [\"index.d.ts\"],\n license: \"MIT\",\n repository: {\n type: \"git\",\n url: `git+https://github.com/${github.owner}/${github.repo}.git`,\n directory: `sdk/svc-${contract.name}/${artifact.id}`,\n },\n publishConfig: {\n registry: \"https://npm.pkg.github.com\",\n access: \"restricted\",\n },\n };\n\n await writeFile(\n path.join(artifact.outputDir, \"package.json\"),\n JSON.stringify(pkg, null, 2),\n );\n }\n}\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { GeneratorRegistry } from \"@core/generator/registry\";\nimport { renderReadme } from \"@core/readme/readme-renderer\";\nimport { syncRedoclyConfig } from \"@core/redocly/redocly-sync\";\nimport {\n type BundledSpec,\n hashSpec,\n resolveVersion,\n} from \"@core/version/version\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\nimport { OpenApiGeneratorCli } from \"@generators/openapi-generator-cli\";\nimport { OpenApiTypescriptGenerator } from \"@generators/openapi-typescript\";\n\ninterface VersionInfo {\n version: string;\n hash: string;\n}\n\n/**\n * Generates SDK packages for every artifact of every contract in the config.\n *\n * @param config - The resolved config.\n */\nexport async function generateSdkCommand(\n config: ResolvedConfig,\n): Promise<void> {\n // openapi-typescript reads 'redocly.yaml' directly, so it needs to be in sync\n // with the CLI config before that generator's 'prepare()' runs\n await syncRedoclyConfig(config);\n\n const registry = new GeneratorRegistry()\n .register(new OpenApiGeneratorCli())\n .register(new OpenApiTypescriptGenerator());\n\n await rm(config.paths.sdk, { recursive: true, force: true });\n await mkdir(config.paths.sdk, { recursive: true });\n\n for (const tool of registry.tools()) {\n const entries = config.allArtifacts.filter(\n (entry) => entry.artifact.tool === tool,\n );\n\n await registry\n .resolve(tool)\n .prepare?.({ rootDir: config.rootDir, entries });\n }\n\n const versionCache = new Map<string, VersionInfo>();\n\n async function getVersionInfo(contractName: string): Promise<VersionInfo> {\n const cached = versionCache.get(contractName);\n\n if (cached) {\n return cached;\n }\n\n const specPath = path.join(config.paths.specs, `${contractName}.json`);\n const raw = await readFile(specPath, \"utf8\");\n const spec = JSON.parse(raw) as BundledSpec;\n\n const info: VersionInfo = {\n version: resolveVersion(spec, contractName),\n hash: hashSpec(raw),\n };\n\n versionCache.set(contractName, info);\n\n return info;\n }\n\n for (const { contract, artifact } of config.allArtifacts) {\n const { version, hash } = await getVersionInfo(contract.name);\n const generator = registry.resolve(artifact.tool);\n\n await generator.generate({\n rootDir: config.rootDir,\n contract,\n artifact,\n version,\n github: config.github,\n specInputPath: path.join(config.paths.specs, `${contract.name}.json`),\n });\n\n await writeFile(path.join(artifact.outputDir, \"VERSION\"), `${version}\\n`);\n await writeFile(path.join(artifact.outputDir, \"SPEC_HASH\"), `${hash}\\n`);\n await writeFile(\n path.join(artifact.outputDir, \"README.md\"),\n await renderReadme({\n contract,\n artifact,\n version,\n github: config.github,\n vars: config.vars,\n }),\n );\n }\n\n const versionSummary = [...versionCache.entries()]\n .map(([name, { version }]) => `${name}@${version}`)\n .join(\", \");\n\n console.log(\n `Generated ${config.allArtifacts.length} SDK packages into ${config.paths.sdk} (${versionSummary})`,\n );\n}\n","import { runSync } from \"@core/process/exec\";\nimport { resolveBinPath } from \"@core/process/resolve-bin\";\nimport { syncRedoclyConfig } from \"@core/redocly/redocly-sync\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\n/**\n * Lints every contract's OpenAPI spec.\n * Sets `process.exitCode = 1` if any contract fails.\n *\n * @param config - The resolved CLI config.\n */\nexport async function lintCommand(config: ResolvedConfig): Promise<void> {\n // redocly reads 'redocly.yaml' directly, so it needs to be in sync with the\n // CLI config before linting\n await syncRedoclyConfig(config);\n\n console.log(\"Linting OpenAPI contracts...\");\n\n const redoclyBin = resolveBinPath(\"@redocly/cli\", \"redocly\");\n let hasErrors = false;\n\n for (const contract of config.contracts) {\n console.log(`Checking [${contract.name}]...`);\n\n const status = runSync(\n \"node\",\n [redoclyBin, \"lint\", contract.entrypoint],\n config.rootDir,\n );\n\n if (status !== 0) {\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n process.exitCode = 1;\n }\n}\n","import { spawnSync } from \"node:child_process\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\nexport interface PublishRegistriesOptions {\n dryRun?: boolean;\n}\n\n/**\n * Publishes registry-backed packages:\n * - TypeScript (client and server-types) -> npm (needs a configured registry\n * or auth token on the machine running this).\n * - Java (client and server) -> Maven (needs `~/.m2/settings.xml` credentials\n * for whichever repository `mvn deploy` resolves to).\n *\n * Go packages are intentionally skipped - they're consumed straight from\n * their git branch/tag (see `publish-sdk.ts`), Go has no registry step.\n *\n * @param config - The resolved CLI config.\n * @param options - `{ dryRun }` - print what would run without running it.\n */\nexport async function publishRegistriesCommand(\n config: ResolvedConfig,\n options: PublishRegistriesOptions = {},\n): Promise<void> {\n const dryRun = options.dryRun ?? false;\n\n function run(cmd: string, args: string[], cwd: string): void {\n console.log(`$ ${cmd} ${args.join(\" \")} (in ${cwd})`);\n\n if (dryRun) {\n return;\n }\n\n const result = spawnSync(cmd, args, { cwd, stdio: \"inherit\", shell: true });\n\n if (result.status !== 0) {\n throw new Error(`${cmd} ${args.join(\" \")} exited with ${result.status}`);\n }\n }\n\n let publishedCount = 0;\n\n for (const { contract, artifact } of config.allArtifacts) {\n if (artifact.lang === \"typescript\") {\n console.log(\n `\\n=== npm publish: ${artifact.package} (contract: ${contract.name}, ${artifact.kind}) ===`,\n );\n run(\"npm\", [\"publish\"], artifact.outputDir);\n\n publishedCount += 1;\n }\n\n if (artifact.lang === \"java\") {\n console.log(\n `\\n=== maven deploy: ${artifact.maven?.groupId}:${artifact.maven?.artifactId} (contract: ${contract.name}, ${artifact.kind}) ===`,\n );\n run(\"mvn\", [\"-B\", \"deploy\", \"-DskipTests\"], artifact.outputDir);\n\n publishedCount += 1;\n }\n }\n\n console.log(`\\nDone - published ${publishedCount} registry package(s).`);\n}\n","import { spawnSync } from \"node:child_process\";\n\n/**\n * The result of executing a git command.\n *\n * @see {@link git} - The function that executes the git command.\n */\nexport interface GitResult {\n status: number;\n stdout: string;\n stderr: string;\n}\n\n/**\n * Execute a git command in a given working directory and return the result.\n *\n * @param args - The command-line arguments to pass to the git command.\n * @param cwd - The working directory in which to execute the git command.\n * @returns The result of the git command.\n *\n * @see {@link GitResult} - The result of executing the git command.\n */\nexport function git(args: string[], cwd: string): GitResult {\n const result = spawnSync(\"git\", args, { cwd, encoding: \"utf8\" });\n\n return {\n status: result.status ?? 1,\n stdout: (result.stdout ?? \"\").trim(),\n stderr: (result.stderr ?? \"\").trim(),\n };\n}\n\n/**\n * Check if a remote branch exists in the given repository.\n *\n * @param repoRoot - The root directory of the repository.\n * @param branch - The name of the branch to check.\n * @returns Whether the remote branch exists (true) or not (false).\n */\nexport function remoteBranchExists(repoRoot: string, branch: string): boolean {\n return (\n git([\"ls-remote\", \"--exit-code\", \"--heads\", \"origin\", branch], repoRoot)\n .status === 0\n );\n}\n\n/**\n * Check if a remote tag exists in the given repository.\n *\n * @param repoRoot - The root directory of the repository.\n * @param tag - The name of the tag to check.\n * @returns Whether the remote tag exists (true) or not (false).\n */\nexport function tagExists(repoRoot: string, tag: string): boolean {\n return (\n git([\"ls-remote\", \"--exit-code\", \"--tags\", \"origin\", tag], repoRoot)\n .status === 0\n );\n}\n\n/**\n * Fetch a single tag's object from origin into the local repo, without\n * fetching the rest of history/tags.\n *\n * @param repoRoot - The root directory of the repository.\n * @param tag - The name of the tag to fetch.\n * @returns The result of the underlying `git fetch` command.\n */\nfunction fetchTag(repoRoot: string, tag: string): GitResult {\n return git(\n [\"fetch\", \"origin\", `refs/tags/${tag}:refs/tags/${tag}`, \"--force\"],\n repoRoot,\n );\n}\n\n/**\n * Read a single file's content as it existed at a given git tag, without\n * checking out a worktree.\n *\n * Returns `null` (rather than throwing) both when the tag can't be fetched and\n * when the tag exists but doesn't contain the requested file - the latter is\n * expected for tags published before that file was introduced, and callers\n * should treat \"unknown\" the same as \"no mismatch to report\".\n *\n * @param repoRoot - The root directory of the repository.\n * @param tag - The tag to read the file from.\n * @param filePath - The path of the file within that tag's tree.\n * @returns The file's content, or `null` if it couldn't be read.\n */\nexport function readFileAtTag(\n repoRoot: string,\n tag: string,\n filePath: string,\n): string | null {\n const fetch = fetchTag(repoRoot, tag);\n\n if (fetch.status !== 0) {\n return null;\n }\n\n const show = git([\"show\", `${tag}:${filePath}`], repoRoot);\n\n return show.status === 0 ? show.stdout.trim() : null;\n}\n\n/**\n * Require that a git command succeeded, throwing an error with the given\n * message if it did not.\n *\n * @param result - The result of the git command to check.\n * @param message - The error message to throw if the command failed.\n * @throws Error if the git command failed (non-zero exit code).\n */\nexport function requireOk(result: GitResult, message: string): void {\n if (result.status !== 0) {\n throw new Error(`${message}: ${result.stderr || result.stdout}`);\n }\n}\n","import { cp, mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\nimport {\n git,\n readFileAtTag,\n remoteBranchExists,\n requireOk,\n tagExists,\n} from \"@core/git/git\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\nexport interface PublishSdkOptions {\n dryRun?: boolean;\n}\n\n/**\n * Redistributes each generated artifact's `dist/sdk/<contract>/<artifact-id>`\n * into its own orphan branch (`sdk/svc-<contract>/<artifact-id>`) and tags the\n * publish.\n *\n * @param config - The resolved CLI config.\n * @param options - `{ dryRun }` - skip pushing, just report what would happen.\n */\nexport async function publishSdkCommand(\n config: ResolvedConfig,\n options: PublishSdkOptions = {},\n): Promise<void> {\n const dryRun = options.dryRun ?? false;\n\n for (const { contract, artifact } of config.allArtifacts) {\n const version = (\n await readFile(path.join(artifact.outputDir, \"VERSION\"), \"utf8\")\n ).trim();\n const localHash = (\n await readFile(path.join(artifact.outputDir, \"SPEC_HASH\"), \"utf8\")\n ).trim();\n const tag = `${artifact.tagPrefix}-v${version}`;\n\n console.log(\n `\\n=== ${contract.name} / ${artifact.id} -> ${artifact.branch} (v${version}) ===`,\n );\n\n if (tagExists(config.rootDir, tag)) {\n const remoteHash = readFileAtTag(config.rootDir, tag, \"SPEC_HASH\");\n\n if (remoteHash !== null && remoteHash !== localHash) {\n throw new Error(\n `Tag ${tag} already exists, but the ${contract.name} spec content ` +\n `has changed since it was published under that version. Bump ` +\n `\"info.version\" in ${contract.entrypointRelative} before ` +\n `releasing again.`,\n );\n }\n\n console.log(\n `Tag ${tag} already exists on origin with matching content, skipping (already published).`,\n );\n continue;\n }\n\n const worktreeDir = await mkdtemp(path.join(tmpdir(), \"sdk-publish-\"));\n await rm(worktreeDir, { recursive: true, force: true });\n\n git([\"fetch\", \"origin\", artifact.branch], config.rootDir);\n const hasRemoteBranch = remoteBranchExists(config.rootDir, artifact.branch);\n\n const setup = hasRemoteBranch\n ? git(\n [\"worktree\", \"add\", worktreeDir, `origin/${artifact.branch}`],\n config.rootDir,\n )\n : git([\"worktree\", \"add\", \"--detach\", worktreeDir], config.rootDir);\n requireOk(setup, `Failed to create worktree for ${artifact.branch}`);\n\n if (hasRemoteBranch) {\n requireOk(\n git(\n [\"checkout\", \"-B\", artifact.branch, `origin/${artifact.branch}`],\n worktreeDir,\n ),\n `Failed to check out ${artifact.branch}`,\n );\n } else {\n requireOk(\n git([\"checkout\", \"--orphan\", artifact.branch], worktreeDir),\n `Failed to create orphan branch ${artifact.branch}`,\n );\n }\n\n git([\"rm\", \"-rf\", \"--quiet\", \".\"], worktreeDir);\n await cp(artifact.outputDir, worktreeDir, { recursive: true });\n\n git([\"add\", \"-A\"], worktreeDir);\n const hasChanges =\n git([\"diff\", \"--cached\", \"--quiet\"], worktreeDir).status !== 0;\n\n if (!hasChanges) {\n console.log(\n \"No content changes since last publish - committing tag only.\",\n );\n } else {\n requireOk(\n git(\n [\n \"commit\",\n \"-m\",\n `chore(sdk): publish ${contract.name} ${artifact.id} v${version}`,\n ],\n worktreeDir,\n ),\n `Commit failed for ${artifact.branch}`,\n );\n }\n\n requireOk(git([\"tag\", tag], worktreeDir), `Tagging failed for ${tag}`);\n\n if (dryRun) {\n console.log(`[dry-run] would push ${artifact.branch} and tag ${tag}`);\n } else {\n requireOk(\n git(\n [\"push\", \"origin\", `HEAD:refs/heads/${artifact.branch}`],\n worktreeDir,\n ),\n `Push failed for ${artifact.branch}`,\n );\n requireOk(\n git([\"push\", \"origin\", tag], worktreeDir),\n `Tag push failed for ${tag}`,\n );\n console.log(`Published ${artifact.branch} @ ${tag}`);\n }\n\n git([\"worktree\", \"remove\", \"--force\", worktreeDir], config.rootDir);\n }\n\n console.log(`\\nDone - processed ${config.allArtifacts.length} SDK packages.`);\n}\n","import { createReadStream, statSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport { extname, join, normalize } from \"node:path\";\n\nimport type { ResolvedConfig } from \"@config/types\";\n\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".ico\": \"image/x-icon\",\n};\n\n/**\n * Serves the generated documentation site (`dist/docs`) over plain HTTP for\n * local previewing.\n *\n * @param config - The resolved CLI config.\n */\nexport async function serveDocsCommand(config: ResolvedConfig): Promise<void> {\n const { host, port } = config.docs.server;\n\n const server = createServer((request, response) => {\n if (!request.url) {\n response.writeHead(400);\n response.end();\n\n return;\n }\n\n // noinspection HttpUrlsUsage\n const url = new URL(request.url, `http://${host}:${port}`);\n const pathname = decodeURIComponent(url.pathname);\n\n const relativePath = normalize(pathname).replace(/^(\\.\\.[/\\\\])+/, \"\");\n let file = join(config.paths.docs, relativePath);\n\n try {\n if (statSync(file).isDirectory()) {\n file = join(file, \"index.html\");\n }\n } catch {\n response.writeHead(404);\n response.end(\"Not Found\");\n\n return;\n }\n\n try {\n const stat = statSync(file);\n\n if (!stat.isFile()) {\n response.writeHead(404);\n response.end(\"Not Found\");\n\n return;\n }\n\n response.writeHead(200, {\n \"Content-Type\": MIME_TYPES[extname(file)] ?? \"application/octet-stream\",\n });\n\n createReadStream(file).pipe(response);\n } catch {\n response.writeHead(404);\n response.end(\"Not Found\");\n }\n });\n\n await new Promise<void>((resolvePromise) => {\n server.listen(port, host, () => {\n // noinspection HttpUrlsUsage\n console.log(`Scalar documentation: http://${host}:${port}`);\n resolvePromise();\n });\n });\n}\n"],"mappings":"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"}
|