@workos/oagen 0.22.7 → 0.24.0
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 +1 -1
- package/dist/cli/index.mjs +207 -33
- package/dist/cli/index.mjs.map +1 -1
- package/dist/compat/index.d.mts +2 -2
- package/dist/compat/index.mjs +7 -7
- package/dist/compat/index.mjs.map +1 -1
- package/dist/{diff-D4XaiPeA.mjs → diff-B7dMUCoJ.mjs} +128 -19
- package/dist/diff-B7dMUCoJ.mjs.map +1 -0
- package/dist/{differ-Q13KY9Rd.d.mts → differ-DMmw0tbA.d.mts} +5 -5
- package/dist/{differ-Q13KY9Rd.d.mts.map → differ-DMmw0tbA.d.mts.map} +1 -1
- package/dist/index.d.mts +50 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +74 -11
- package/dist/index.mjs.map +1 -1
- package/dist/{overlay-cb32jDBS.mjs → overlay-sQHQoN0I.mjs} +4 -4
- package/dist/overlay-sQHQoN0I.mjs.map +1 -0
- package/dist/scripts/smoke/baseline.mjs +73 -10
- package/dist/scripts/smoke/baseline.mjs.map +1 -1
- package/dist/scripts/smoke/sdk-test.mjs +3 -3
- package/dist/scripts/smoke/sdk-test.mjs.map +1 -1
- package/dist/smoke.d.mts +3 -4
- package/dist/smoke.d.mts.map +1 -1
- package/dist/smoke.mjs +73 -10
- package/dist/smoke.mjs.map +1 -1
- package/dist/{types-DZrKFHis.d.mts → types-nM5Kp7UP.d.mts} +7 -9
- package/dist/types-nM5Kp7UP.d.mts.map +1 -0
- package/dist/verify/index.d.mts +2 -2
- package/dist/verify/index.mjs +2 -2
- package/docs/architecture/extractor-contract.md +2 -2
- package/docs/architecture/pipeline.md +2 -2
- package/docs/cli.md +19 -19
- package/docs/core/compatibility-policy.md +1 -1
- package/docs/core/manifest-schema.md +2 -2
- package/package.json +1 -1
- package/skills/generate-emitter/SKILL.md +2 -2
- package/skills/generate-emitter/references/common-pitfalls.md +1 -1
- package/skills/generate-emitter/references/project-scaffold.md +3 -3
- package/skills/generate-extractor/SKILL.md +2 -2
- package/skills/generate-smoke-test/SKILL.md +1 -1
- package/skills/verify-smoke-test/SKILL.md +1 -1
- package/dist/diff-D4XaiPeA.mjs.map +0 -1
- package/dist/overlay-cb32jDBS.mjs.map +0 -1
- package/dist/types-DZrKFHis.d.mts.map +0 -1
|
@@ -7,9 +7,9 @@ import { execFileSync } from "node:child_process";
|
|
|
7
7
|
* Runs an SDK smoke test + diff against an existing raw baseline.
|
|
8
8
|
*
|
|
9
9
|
* Usage:
|
|
10
|
-
* npm run smoke -- --lang node --sdk-path path/to/
|
|
11
|
-
* npm run smoke -- --lang ruby --sdk-path path/to/
|
|
12
|
-
* npm run smoke -- --lang node --sdk-path path/to/
|
|
10
|
+
* npm run smoke -- --lang node --sdk-path path/to/acme-node
|
|
11
|
+
* npm run smoke -- --lang ruby --sdk-path path/to/acme-ruby
|
|
12
|
+
* npm run smoke -- --lang node --sdk-path path/to/acme-node --raw-results custom-baseline.json
|
|
13
13
|
*
|
|
14
14
|
* Requires OPENAPI_SPEC_PATH env var (or --spec <path>) pointing to the OpenAPI spec.
|
|
15
15
|
* The --lang flag is required and selects which SDK runner to use
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-test.mjs","names":[],"sources":["../../../scripts/smoke/sdk-test.ts"],"sourcesContent":["/**\n * Runs an SDK smoke test + diff against an existing raw baseline.\n *\n * Usage:\n * npm run smoke -- --lang node --sdk-path path/to/
|
|
1
|
+
{"version":3,"file":"sdk-test.mjs","names":[],"sources":["../../../scripts/smoke/sdk-test.ts"],"sourcesContent":["/**\n * Runs an SDK smoke test + diff against an existing raw baseline.\n *\n * Usage:\n * npm run smoke -- --lang node --sdk-path path/to/acme-node\n * npm run smoke -- --lang ruby --sdk-path path/to/acme-ruby\n * npm run smoke -- --lang node --sdk-path path/to/acme-node --raw-results custom-baseline.json\n *\n * Requires OPENAPI_SPEC_PATH env var (or --spec <path>) pointing to the OpenAPI spec.\n * The --lang flag is required and selects which SDK runner to use\n * (e.g. \"node\" → scripts/smoke/sdk-node.ts).\n */\n\nimport { existsSync, writeFileSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst args = process.argv.slice(2);\n\n// Extract --lang <name> (required)\nconst langIdx = args.indexOf('--lang');\nconst forwardedArgs = [...args];\n\nif (langIdx === -1 || !args[langIdx + 1]) {\n console.error('--lang is required (e.g. --lang node, --lang ruby)');\n process.exit(1);\n}\n\nconst lang = args[langIdx + 1];\nforwardedArgs.splice(langIdx, 2);\n\n// Extract --raw-results <path>\nconst rawResultsIdx = forwardedArgs.indexOf('--raw-results');\nlet rawResultsPath = 'smoke-results-raw.json';\n\nif (rawResultsIdx !== -1 && forwardedArgs[rawResultsIdx + 1]) {\n rawResultsPath = forwardedArgs[rawResultsIdx + 1];\n forwardedArgs.splice(rawResultsIdx, 2);\n}\n\n// Resolve the SDK runner script relative to this file's directory\nconst sdkScript = resolve(__dirname, `sdk-${lang}.ts`);\nif (!existsSync(sdkScript)) {\n console.error(`No smoke runner found for language \"${lang}\" (expected ${sdkScript})`);\n console.error(`Available runners:`);\n const { readdirSync } = await import('node:fs');\n for (const f of readdirSync(__dirname)) {\n const match = f.match(/^sdk-(.+)\\.ts$/);\n if (match && match[1] !== 'test') {\n console.error(` --lang ${match[1]}`);\n }\n }\n process.exit(1);\n}\n\nconst sdkResultsPath = `smoke-results-sdk-${lang}.json`;\n\nconst diffArgs = ['--raw', rawResultsPath, '--sdk', sdkResultsPath];\n\n// Pre-flight: tsc compile check on SDK if tsconfig.json exists\nconst sdkPathIdx = forwardedArgs.indexOf('--sdk-path');\nconst sdkPathValue = sdkPathIdx !== -1 && forwardedArgs[sdkPathIdx + 1] ? forwardedArgs[sdkPathIdx + 1] : undefined;\n\nif (sdkPathValue) {\n const tsconfigPath = resolve(sdkPathValue, 'tsconfig.json');\n if (existsSync(tsconfigPath)) {\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Type-checking SDK at ${sdkPathValue}`);\n console.log('='.repeat(60));\n\n try {\n execFileSync('npx', ['tsc', '--noEmit', '--project', sdkPathValue], {\n stdio: 'pipe',\n env: process.env,\n });\n console.log(' Type check passed');\n } catch (err) {\n const output = (err as { stdout?: Buffer; stderr?: Buffer }).stdout?.toString() ?? '';\n const findings = parseTscOutput(output);\n writeFileSync('smoke-compile-errors.json', JSON.stringify(findings, null, 2));\n console.error(` Type check failed (${findings.length} errors). See smoke-compile-errors.json`);\n process.exit(2);\n }\n }\n}\n\nconst steps: [string, string[]][] = [\n [sdkScript, forwardedArgs],\n [resolve(__dirname, 'diff.ts'), diffArgs],\n];\n\nfor (const [script, scriptArgs] of steps) {\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Running ${script}`);\n console.log('='.repeat(60));\n\n try {\n execFileSync('npx', ['tsx', script, ...scriptArgs], {\n stdio: 'inherit',\n env: process.env,\n });\n } catch {\n process.exit(1);\n }\n}\n\nfunction parseTscOutput(output: string): Array<{ file: string; line: number; code: string; message: string }> {\n const errors: Array<{ file: string; line: number; code: string; message: string }> = [];\n const re = /^(.+)\\((\\d+),\\d+\\): error (TS\\d+): (.+)$/gm;\n let match;\n while ((match = re.exec(output)) !== null) {\n errors.push({\n file: match[1],\n line: Number(match[2]),\n code: match[3],\n message: match[4],\n });\n }\n return errors;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,MAAM,YAAY,QADC,cAAc,OAAO,KAAK,IAAI,CACZ;AAErC,MAAM,OAAO,QAAQ,KAAK,MAAM,EAAE;AAGlC,MAAM,UAAU,KAAK,QAAQ,SAAS;AACtC,MAAM,gBAAgB,CAAC,GAAG,KAAK;AAE/B,IAAI,YAAY,MAAM,CAAC,KAAK,UAAU,IAAI;AACxC,SAAQ,MAAM,qDAAqD;AACnE,SAAQ,KAAK,EAAE;;AAGjB,MAAM,OAAO,KAAK,UAAU;AAC5B,cAAc,OAAO,SAAS,EAAE;AAGhC,MAAM,gBAAgB,cAAc,QAAQ,gBAAgB;AAC5D,IAAI,iBAAiB;AAErB,IAAI,kBAAkB,MAAM,cAAc,gBAAgB,IAAI;AAC5D,kBAAiB,cAAc,gBAAgB;AAC/C,eAAc,OAAO,eAAe,EAAE;;AAIxC,MAAM,YAAY,QAAQ,WAAW,OAAO,KAAK,KAAK;AACtD,IAAI,CAAC,WAAW,UAAU,EAAE;AAC1B,SAAQ,MAAM,uCAAuC,KAAK,cAAc,UAAU,GAAG;AACrF,SAAQ,MAAM,qBAAqB;CACnC,MAAM,EAAE,gBAAgB,MAAM,OAAO;AACrC,MAAK,MAAM,KAAK,YAAY,UAAU,EAAE;EACtC,MAAM,QAAQ,EAAE,MAAM,iBAAiB;AACvC,MAAI,SAAS,MAAM,OAAO,OACxB,SAAQ,MAAM,YAAY,MAAM,KAAK;;AAGzC,SAAQ,KAAK,EAAE;;AAGjB,MAAM,iBAAiB,qBAAqB,KAAK;AAEjD,MAAM,WAAW;CAAC;CAAS;CAAgB;CAAS;CAAe;AAGnE,MAAM,aAAa,cAAc,QAAQ,aAAa;AACtD,MAAM,eAAe,eAAe,MAAM,cAAc,aAAa,KAAK,cAAc,aAAa,KAAK,KAAA;AAE1G,IAAI;KAEE,WADiB,QAAQ,cAAc,gBAAgB,CAC/B,EAAE;AAC5B,UAAQ,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG;AAClC,UAAQ,IAAI,wBAAwB,eAAe;AACnD,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAE3B,MAAI;AACF,gBAAa,OAAO;IAAC;IAAO;IAAY;IAAa;IAAa,EAAE;IAClE,OAAO;IACP,KAAK,QAAQ;IACd,CAAC;AACF,WAAQ,IAAI,sBAAsB;WAC3B,KAAK;GAEZ,MAAM,WAAW,eADD,IAA6C,QAAQ,UAAU,IAAI,GAC5C;AACvC,iBAAc,6BAA6B,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;AAC7E,WAAQ,MAAM,wBAAwB,SAAS,OAAO,yCAAyC;AAC/F,WAAQ,KAAK,EAAE;;;;AAKrB,MAAM,QAA8B,CAClC,CAAC,WAAW,cAAc,EAC1B,CAAC,QAAQ,WAAW,UAAU,EAAE,SAAS,CAC1C;AAED,KAAK,MAAM,CAAC,QAAQ,eAAe,OAAO;AACxC,SAAQ,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG;AAClC,SAAQ,IAAI,WAAW,SAAS;AAChC,SAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAE3B,KAAI;AACF,eAAa,OAAO;GAAC;GAAO;GAAQ,GAAG;GAAW,EAAE;GAClD,OAAO;GACP,KAAK,QAAQ;GACd,CAAC;SACI;AACN,UAAQ,KAAK,EAAE;;;AAInB,SAAS,eAAe,QAAsF;CAC5G,MAAM,SAA+E,EAAE;CACvF,MAAM,KAAK;CACX,IAAI;AACJ,SAAQ,QAAQ,GAAG,KAAK,OAAO,MAAM,KACnC,QAAO,KAAK;EACV,MAAM,MAAM;EACZ,MAAM,OAAO,MAAM,GAAG;EACtB,MAAM,MAAM;EACZ,SAAS,MAAM;EAChB,CAAC;AAEJ,QAAO"}
|
package/dist/smoke.d.mts
CHANGED
|
@@ -44,8 +44,7 @@ interface ErrorPolicy {
|
|
|
44
44
|
serverErrorKind: string;
|
|
45
45
|
/** Catch-all error kind for unrecognized status codes. */
|
|
46
46
|
clientErrorKind: string;
|
|
47
|
-
/** URL template for error documentation. Use {code} as placeholder for the API error code.
|
|
48
|
-
* Example: 'https://workos.com/docs/errors/{code}' */
|
|
47
|
+
/** URL template for error documentation. Use {code} as placeholder for the API error code. */
|
|
49
48
|
errorDocUrlTemplate?: string;
|
|
50
49
|
}
|
|
51
50
|
/** Telemetry — what request metrics to track and send. */
|
|
@@ -83,7 +82,7 @@ interface UserAgentPolicy {
|
|
|
83
82
|
/** Template for the SDK identifier string.
|
|
84
83
|
* Placeholders: {name} = spec name, {lang} = emitter language, {version} = SDK version.
|
|
85
84
|
* Each emitter interpolates with its own language string and casing conventions.
|
|
86
|
-
* Example: '{name} {lang}/{version}' → '
|
|
85
|
+
* Example: '{name} {lang}/{version}' → 'Acme PHP/4.32.0' */
|
|
87
86
|
sdkIdentifierTemplate: string;
|
|
88
87
|
/** Whether to append the runtime/language version (e.g. PHP 8.2, Python 3.12). */
|
|
89
88
|
includeRuntimeVersion: boolean;
|
|
@@ -109,7 +108,7 @@ interface RequestGuardPolicy {
|
|
|
109
108
|
interface TimeoutPolicy {
|
|
110
109
|
/** Default HTTP request timeout in seconds. */
|
|
111
110
|
defaultTimeoutSeconds: number;
|
|
112
|
-
/** Environment variable name to override the timeout (e.g. '
|
|
111
|
+
/** Environment variable name to override the timeout (e.g. 'SDK_REQUEST_TIMEOUT'). */
|
|
113
112
|
timeoutEnvVar?: string;
|
|
114
113
|
}
|
|
115
114
|
/** Language-agnostic runtime policies for generated SDKs.
|
package/dist/smoke.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smoke.d.mts","names":[],"sources":["../src/ir/sdk-behavior.ts","../src/ir/types.ts","../src/parser/parse.ts","../src/utils/naming.ts","../scripts/smoke/shared.ts"],"mappings":";;;;AAYA;;;;;;UAAiB,WAAA;EAQf;EANA,oBAAA;EAQS;EANT,UAAA;EAMwB;EAJxB,sBAAA;EAY8B;EAV9B,cAAA;EAU8B;EAR9B,OAAA,EAAS,eAAA;AAAA;;;;;AAsBX;UAdiB,eAAA;;EAEf,YAAA;EAeA;EAbA,UAAA;EAeA;EAbA,QAAA;
|
|
1
|
+
{"version":3,"file":"smoke.d.mts","names":[],"sources":["../src/ir/sdk-behavior.ts","../src/ir/types.ts","../src/parser/parse.ts","../src/utils/naming.ts","../scripts/smoke/shared.ts"],"mappings":"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"}
|
package/dist/smoke.mjs
CHANGED
|
@@ -145,9 +145,8 @@ function cleanSchemaName(name) {
|
|
|
145
145
|
//#endregion
|
|
146
146
|
//#region src/ir/sdk-behavior.ts
|
|
147
147
|
/**
|
|
148
|
-
* Canonical SDK behavior defaults.
|
|
149
|
-
*
|
|
150
|
-
* via `mergeSdkBehavior()` in each SDK's `oagen.config.ts`.
|
|
148
|
+
* Canonical SDK behavior defaults. Per-language or per-project overrides can
|
|
149
|
+
* be applied via `mergeSdkBehavior()` in each SDK's `oagen.config.ts`.
|
|
151
150
|
*
|
|
152
151
|
* - Retry: exponential backoff with jitter, retries on 429/5xx
|
|
153
152
|
* - Errors: standard HTTP status → exception kind mapping
|
|
@@ -190,12 +189,11 @@ function defaultSdkBehavior() {
|
|
|
190
189
|
429: "RateLimitExceeded"
|
|
191
190
|
},
|
|
192
191
|
serverErrorKind: "Server",
|
|
193
|
-
clientErrorKind: "Api"
|
|
194
|
-
errorDocUrlTemplate: "https://workos.com/docs/errors/{code}"
|
|
192
|
+
clientErrorKind: "Api"
|
|
195
193
|
},
|
|
196
194
|
telemetry: {
|
|
197
195
|
enabledByDefault: true,
|
|
198
|
-
headerName: "X-
|
|
196
|
+
headerName: "X-Client-Telemetry",
|
|
199
197
|
requestIdHeader: "X-Request-ID"
|
|
200
198
|
},
|
|
201
199
|
pagination: { autoPageDelayMs: 0 },
|
|
@@ -1993,11 +1991,11 @@ function inferVerb(method, path) {
|
|
|
1993
1991
|
* Uses the last non-param segment (the resource being operated on).
|
|
1994
1992
|
*
|
|
1995
1993
|
* Examples:
|
|
1996
|
-
* /
|
|
1997
|
-
* /
|
|
1998
|
-
* /
|
|
1994
|
+
* /accounts/users → "Users"
|
|
1995
|
+
* /accounts/users/{id} → "User" (singular for item operations)
|
|
1996
|
+
* /accounts/users/{id}/auth_factors → "AuthFactors"
|
|
1999
1997
|
* /organizations/{id}/api_keys → "ApiKeys"
|
|
2000
|
-
* /
|
|
1998
|
+
* /auth/authorize → "Authorize" (action endpoint)
|
|
2001
1999
|
*/
|
|
2002
2000
|
function inferResourceFromPath(path) {
|
|
2003
2001
|
const segments = path.split("/").filter(Boolean);
|
|
@@ -2304,6 +2302,10 @@ function extractRequestBody(body, op, inlineModels) {
|
|
|
2304
2302
|
return {};
|
|
2305
2303
|
}
|
|
2306
2304
|
const contextName = cleanSchemaName(op?.operationId ? toPascalCase(normalizeOperationIdForNaming(op.operationId)) + "Request" : "RequestBody");
|
|
2305
|
+
if (schema.oneOf && schema.discriminator) {
|
|
2306
|
+
const merged = flattenDiscriminatedUnionBody(schema);
|
|
2307
|
+
if (merged) schema = merged;
|
|
2308
|
+
}
|
|
2307
2309
|
if (schema.properties && (schema.type === "object" || !schema.type)) {
|
|
2308
2310
|
const requiredSet = new Set(schema.required ?? []);
|
|
2309
2311
|
const fields = [];
|
|
@@ -2369,6 +2371,67 @@ function extractRequestBody(body, op, inlineModels) {
|
|
|
2369
2371
|
encoding
|
|
2370
2372
|
};
|
|
2371
2373
|
}
|
|
2374
|
+
/**
|
|
2375
|
+
* Fold a discriminated-union request body into the equivalent single object so
|
|
2376
|
+
* its fields can be spread into method arguments instead of forcing callers to
|
|
2377
|
+
* construct an opaque union.
|
|
2378
|
+
*
|
|
2379
|
+
* The result is the union of every variant's properties: the discriminator is
|
|
2380
|
+
* collapsed to an enum of the pinned const values, and any field that isn't
|
|
2381
|
+
* present-and-required in *every* variant becomes optional (it varies by
|
|
2382
|
+
* branch, so it can't be unconditionally required). The discriminator itself is
|
|
2383
|
+
* always required. This mirrors what a spec author would write by hand to model
|
|
2384
|
+
* the same shape as a flat object.
|
|
2385
|
+
*
|
|
2386
|
+
* Returns null — leaving the union intact — unless the body is a clean
|
|
2387
|
+
* inline-object discriminated union: a variant that is a `$ref`, a non-object,
|
|
2388
|
+
* or that doesn't pin the discriminator to a string const can't be safely
|
|
2389
|
+
* merged. Gating on an *explicit* `discriminator` keeps undiscriminated `oneOf`
|
|
2390
|
+
* bodies untouched.
|
|
2391
|
+
*/
|
|
2392
|
+
function flattenDiscriminatedUnionBody(schema) {
|
|
2393
|
+
const discProp = schema.discriminator?.propertyName;
|
|
2394
|
+
if (!discProp || !Array.isArray(schema.oneOf) || schema.oneOf.length === 0) return null;
|
|
2395
|
+
const variants = schema.oneOf;
|
|
2396
|
+
const discValues = [];
|
|
2397
|
+
let discPropSchema;
|
|
2398
|
+
for (const variant of variants) {
|
|
2399
|
+
if (variant.$ref || !variant.properties || !(variant.type === "object" || variant.type === void 0)) return null;
|
|
2400
|
+
const dp = variant.properties[discProp];
|
|
2401
|
+
const constVal = typeof dp?.const === "string" ? dp.const : Array.isArray(dp?.enum) && dp.enum.length === 1 && typeof dp.enum[0] === "string" ? dp.enum[0] : void 0;
|
|
2402
|
+
if (constVal === void 0) return null;
|
|
2403
|
+
if (!discValues.includes(constVal)) discValues.push(constVal);
|
|
2404
|
+
if (!discPropSchema) discPropSchema = dp;
|
|
2405
|
+
}
|
|
2406
|
+
const variantCount = variants.length;
|
|
2407
|
+
const mergedProps = {};
|
|
2408
|
+
const requiredCounts = {};
|
|
2409
|
+
const order = [discProp];
|
|
2410
|
+
for (const variant of variants) {
|
|
2411
|
+
const required = new Set(variant.required ?? []);
|
|
2412
|
+
for (const [name, propSchema] of Object.entries(variant.properties)) {
|
|
2413
|
+
if (name === discProp || !propSchema) continue;
|
|
2414
|
+
if (!(name in mergedProps)) {
|
|
2415
|
+
mergedProps[name] = propSchema;
|
|
2416
|
+
order.push(name);
|
|
2417
|
+
}
|
|
2418
|
+
if (required.has(name)) requiredCounts[name] = (requiredCounts[name] ?? 0) + 1;
|
|
2419
|
+
}
|
|
2420
|
+
}
|
|
2421
|
+
mergedProps[discProp] = {
|
|
2422
|
+
type: "string",
|
|
2423
|
+
enum: discValues,
|
|
2424
|
+
...discPropSchema?.description ? { description: discPropSchema.description } : {}
|
|
2425
|
+
};
|
|
2426
|
+
const properties = {};
|
|
2427
|
+
for (const name of order) properties[name] = mergedProps[name];
|
|
2428
|
+
return {
|
|
2429
|
+
type: "object",
|
|
2430
|
+
properties,
|
|
2431
|
+
required: order.filter((name) => name === discProp || requiredCounts[name] === variantCount),
|
|
2432
|
+
...schema.description ? { description: schema.description } : {}
|
|
2433
|
+
};
|
|
2434
|
+
}
|
|
2372
2435
|
/** Derive a unique variant name for a oneOf inline model. */
|
|
2373
2436
|
function deriveOneOfVariantName(variant, baseName, existingModels) {
|
|
2374
2437
|
if (variant.properties) {
|