apollo-conn-gen 0.15.0 → 0.15.1
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/dist/oas/io/security.js.map +1 -1
- package/dist/oas/io/writer.js +11 -8
- package/dist/oas/io/writer.js.map +1 -1
- package/dist/oas/nodes/comp.js +23 -18
- package/dist/oas/nodes/comp.js.map +1 -1
- package/dist/oas/nodes/factory.js +4 -5
- package/dist/oas/nodes/factory.js.map +1 -1
- package/dist/oas/nodes/obj.js +3 -2
- package/dist/oas/nodes/obj.js.map +1 -1
- package/dist/oas/nodes/type.js +8 -6
- package/dist/oas/nodes/type.js.map +1 -1
- package/dist/oas/nodes/typeUtils.d.ts +3 -1
- package/dist/oas/nodes/typeUtils.js +47 -3
- package/dist/oas/nodes/typeUtils.js.map +1 -1
- package/dist/oas/nodes/union.d.ts +3 -1
- package/dist/oas/nodes/union.js +8 -3
- package/dist/oas/nodes/union.js.map +1 -1
- package/dist/oas/utils/naming.js +4 -1
- package/dist/oas/utils/naming.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/oas/io/security.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport type Oas from 'oas';\nimport { SecurityRequirementObject, SecuritySchemeObject, SecuritySchemesObject } from 'oas/types';\nimport type { Op } from '../nodes/internal.js';\n\n// A connector name/value entry: a header (`{ name, value }`) or a query param (`\"name\": value`).\n// Also the shape mergeOverrides produces for inferred/overridden header & query params.\nexport interface NameValue {\n name: string;\n value: string;\n}\n\n// One resolved auth credential: a NameValue plus where it goes. Header values carry `{}`\n// interpolation (`Bearer {$config.token}`); a query value is a raw JSONSelection (`$config.apiKey`).\ninterface AuthEntry extends NameValue {\n kind: 'header' | 'query';\n}\n\n// The HTTP methods the generator actually emits (see OasGen.isSupported). Scanning only these for\n// the per-op-mode switch keeps the decision consistent with what gets written — a `security` on an\n// un-emitted HEAD/OPTIONS op no longer flips the whole spec into per-op mode.\nconst SUPPORTED_METHODS: readonly string[] = ['get', 'post', 'put', 'patch', 'delete'];\n\n/**\n * Map one OAS security scheme to its connector auth entry, or null when it makes none.\n * Header values carry `{}` interpolation; a query value is a raw JSONSelection (no braces) because\n * it lands in a `queryParams: \"\"\"…\"\"\"` block, which is already a JSONSelection context.\n */\nfunction mapSchemeToAuth(scheme: SecuritySchemeObject): AuthEntry | null {\n switch (scheme.type) {\n case 'apiKey':\n // apiKey in a header, e.g. `{ type: apiKey, in: header, name: X-API-Key }`\n if (scheme.in === 'header' && scheme.name) {\n return { kind: 'header', name: scheme.name, value: '{$config.apiKey}' };\n }\n // apiKey in the query string, e.g. `{ type: apiKey, in: query, name: api_key }`\n if (scheme.in === 'query' && scheme.name) {\n return { kind: 'query', name: scheme.name, value: '$config.apiKey' };\n }\n return null; // cookie is deferred and warned about, not emitted\n case 'http':\n if (scheme.scheme === 'bearer') {\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n }\n if (scheme.scheme === 'basic') {\n return { kind: 'header', name: 'Authorization', value: 'Basic {$config.token}' };\n }\n return null;\n case 'oauth2':\n case 'openIdConnect':\n // both flows ultimately send a bearer token\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n default:\n return null;\n }\n}\n\n/** The warning text for a referenced scheme we did not emit (undefined, deferred, or not the winner). */\nfunction droppedSchemeWarning(name: string, scheme: SecuritySchemeObject | undefined): string {\n if (!scheme) {\n return `[security] scheme \"${name}\" is referenced but not defined; skipped.`;\n }\n if (scheme.type === 'apiKey' && scheme.in === 'cookie') {\n return `[security] scheme \"${name}\" is apiKey in cookie — not emitted (cookie auth deferred).`;\n }\n return `[security] scheme \"${name}\" (${scheme.type}) has no supported connector mapping; skipped.`;\n}\n\n/**\n * Resolve a security requirement to the single auth entry the connector should send.\n *\n * A requirement is an OR of scheme-name sets (`[{ a: [] }, { b: [] }]` = \"a OR b\"). We flatten to\n * names in order and pick the FIRST that maps to an entry. A later viable alternative is a\n * legitimate OR choice, not a failure, so it stays silent; only genuinely unresolvable names —\n * undefined, deferred (cookie), or an unmappable scheme — are reported in `warnings`. An absent or\n * empty (`[]`, public) requirement yields no entry and no warnings.\n */\nfunction resolveAuth(\n securityRequirements: SecurityRequirementObject[] | undefined,\n schemes: SecuritySchemesObject,\n): { auth: AuthEntry | null; warnings: string[] } {\n let auth: AuthEntry | null = null;\n const warnings: string[] = [];\n\n for (const name of securityRequirements?.flatMap((requirement) => Object.keys(requirement)) ?? []) {\n const scheme = schemes[name];\n const entry = scheme ? mapSchemeToAuth(scheme) : null;\n\n if (entry) {\n // first scheme that maps wins; a later viable alternative is a silent OR choice\n if (!auth) auth = entry;\n } else {\n // genuinely unresolvable: undefined scheme, cookie, or no supported mapping\n warnings.push(droppedSchemeWarning(name, scheme));\n }\n }\n\n return { auth, warnings };\n}\n\n/** True when ANY emitted operation declares its own `security` (empty `[]` or non-empty). */\nfunction hasPerOperationSecurity(def: ReturnType<Oas['getDefinition']>): boolean {\n const paths = def.paths ?? {};\n for (const pathName of Object.keys(paths)) {\n const path = paths[pathName];\n if (!path) continue;\n for (const method of SUPPORTED_METHODS) {\n // own property (not inherited) — an explicit `security: []` is still a declaration\n if (_.has(path, [method, 'security'])) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Resolved security for one generation pass: computed once from the parsed spec, then queried for\n * `@source` (sourceHeader) and per-`@connect` (forOp). Owning all auth warnings here removes the old\n * uniform-vs-per-op \"who warns when\" coordination between SchemaWriter and OperationWriter.\n *\n * Mode switch: when any emitted op declares its own `security`, a shared `@source` header is unsafe\n * (a public op would leak it; a differently-named override would send both), so header auth moves to\n * each `@connect`. Query auth always lives per-`@connect` — `SourceHTTP` has no `queryParams`.\n */\nexport class SecurityPlan {\n private readonly schemes: SecuritySchemesObject;\n private readonly globalReq: SecurityRequirementObject[] | undefined;\n private readonly perOpMode: boolean;\n // C3: the global requirement's dropped-scheme warnings, pre-resolved once. In per-op mode every\n // inheriting op would re-fire them otherwise; this set identifies them so forOp can skip what's\n // already been emitted (once) and only surface genuinely op-specific warnings with op context.\n private readonly globalWarningBodies: Set<string>;\n private globalWarningsEmitted = false;\n\n private constructor(\n schemes: SecuritySchemesObject,\n globalReq: SecurityRequirementObject[] | undefined,\n perOpMode: boolean,\n private readonly skipAuth: boolean = false,\n ) {\n this.schemes = schemes;\n this.globalReq = globalReq;\n this.perOpMode = perOpMode;\n this.globalWarningBodies = new Set(\n globalReq ? resolveAuth(globalReq, schemes).warnings : [],\n );\n }\n\n static from(api: Oas, opts?: { skipAuth?: boolean }): SecurityPlan {\n const def = api.getDefinition();\n // oas-normalize usually up-converts Swagger 2.0 → components.securitySchemes; the\n // securityDefinitions fallback (same shape) is a safety net. refs are dereferenced by oas,\n // so the shape is a plain SecuritySchemesObject.\n const schemes = (def.components?.securitySchemes ?? def.securityDefinitions ?? {}) as SecuritySchemesObject;\n return new SecurityPlan(schemes, def.security, hasPerOperationSecurity(def), opts?.skipAuth ?? false);\n }\n\n // C3: emit the global's dropped-scheme warnings exactly once per generation. Called from\n // sourceHeader (uniform mode) and the first forOp (per-op mode) — both run before the warnings\n // would otherwise leak per-op. Idempotent via `globalWarningsEmitted`.\n private emitGlobalWarningsOnce(): void {\n if (this.globalWarningsEmitted) return;\n this.globalWarningsEmitted = true;\n for (const body of this.globalWarningBodies) console.warn(body);\n }\n\n /** The `@source`-level auth header literal (uniform mode + header kind), or null. */\n sourceHeader(): string | null {\n // --skip-auth: emit no auth anywhere — no header on @source (and forOp returns nothing too)\n if (this.skipAuth) return null;\n // per-op mode: each @connect carries its own auth — nothing on @source\n if (this.perOpMode) return null;\n // no global requirement -> keep the headerless @source byte-for-byte\n if (!this.globalReq || this.globalReq.length === 0) return null;\n\n const { auth, warnings } = resolveAuth(this.globalReq, this.schemes);\n // C3: surface the global's dropped-scheme warnings exactly once (uniform mode; per-op mode\n // emits them from the first forOp).\n this.emitGlobalWarningsOnce();\n void warnings; // already accounted for via globalWarningBodies\n\n // @source carries only header auth; query auth lives on each @connect (SourceHTTP has no\n // queryParams) and is returned by forOp — emit nothing here.\n if (auth?.kind !== 'header') {\n if (!auth) {\n const names = this.globalReq.flatMap((req) => Object.keys(req));\n console.warn(\n `[security] global security requirement (${names.join(', ')}) maps to no header-producing scheme; no auth header emitted on @source.`,\n );\n }\n return null;\n }\n\n return `{ name: \"${auth.name}\", value: \"${auth.value}\" }`;\n }\n\n /**\n * This op's resolved auth, split by placement.\n * - `header`: the header entry in per-op mode (uniform mode puts it on `@source`), else null\n * - `query`: the query entry, always (SourceHTTP has no queryParams), else null\n *\n * Per-op warnings are emitted here with op context; in uniform mode the global warnings were\n * already emitted once by sourceHeader. C3: in per-op mode, the global's dropped-scheme\n * warnings are emitted exactly once (via emitGlobalWarningsOnce) — only genuinely op-specific\n * warnings carry the `(operation …)` suffix.\n */\n forOp(op: Op): { header: NameValue | null; query: NameValue | null } {\n // --skip-auth: no per-@connect auth either (companion to sourceHeader's skip)\n if (this.skipAuth) return { header: null, query: null };\n // `??` not `||`: an explicit `security: []` (public) must NOT fall back to the global.\n const effective = op.operation.schema.security ?? this.globalReq;\n const { auth, warnings } = resolveAuth(effective, this.schemes);\n\n if (this.perOpMode) {\n // surface the global's dropped-scheme warnings exactly once (idempotent), then warn only\n // about op-specific drops with the op's location attached.\n this.emitGlobalWarningsOnce();\n const where = `${op.verb} ${op.operation.path}`;\n for (const w of warnings) {\n if (!this.globalWarningBodies.has(w)) {\n console.warn(`${w} (operation ${where})`);\n }\n }\n }\n\n return {\n header: this.perOpMode && auth?.kind === 'header' ? auth : null,\n query: auth?.kind === 'query' ? auth : null,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/oas/io/security.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAkBvB,kGAAkG;AAClG,mGAAmG;AACnG,8EAA8E;AAC9E,MAAM,iBAAiB,GAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEvF;;;;GAIG;AACH,SAAS,eAAe,CAAC,MAA4B;IACnD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,2EAA2E;YAC3E,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;YAC1E,CAAC;YACD,gFAAgF;YAChF,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;YACvE,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,mDAAmD;QAClE,KAAK,MAAM;YACT,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;YACpF,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;YACnF,CAAC;YACD,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,eAAe;YAClB,4CAA4C;YAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QACpF;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,SAAS,oBAAoB,CAAC,IAAY,EAAE,MAAwC;IAClF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,sBAAsB,IAAI,2CAA2C,CAAC;IAC/E,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QACvD,OAAO,sBAAsB,IAAI,6DAA6D,CAAC;IACjG,CAAC;IACD,OAAO,sBAAsB,IAAI,MAAM,MAAM,CAAC,IAAI,gDAAgD,CAAC;AACrG,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAClB,oBAA6D,EAC7D,OAA8B;IAE9B,IAAI,IAAI,GAAqB,IAAI,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClG,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEtD,IAAI,KAAK,EAAE,CAAC;YACV,gFAAgF;YAChF,IAAI,CAAC,IAAI;gBAAE,IAAI,GAAG,KAAK,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,4EAA4E;YAC5E,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,6FAA6F;AAC7F,SAAS,uBAAuB,CAAC,GAAqC;IACpE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACvC,mFAAmF;YACnF,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IAcJ;IAbF,OAAO,CAAwB;IAC/B,SAAS,CAA0C;IACnD,SAAS,CAAU;IACpC,gGAAgG;IAChG,gGAAgG;IAChG,+FAA+F;IAC9E,mBAAmB,CAAc;IAC1C,qBAAqB,GAAG,KAAK,CAAC;IAEtC,YACE,OAA8B,EAC9B,SAAkD,EAClD,SAAkB,EACD,WAAoB,KAAK;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;QAE1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAQ,EAAE,IAA6B;QACjD,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;QAChC,kFAAkF;QAClF,2FAA2F;QAC3F,iDAAiD;QACjD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,IAAI,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAA0B,CAAC;QAC5G,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,uBAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC,CAAC;IACxG,CAAC;IAED,yFAAyF;IACzF,+FAA+F;IAC/F,uEAAuE;IAC/D,sBAAsB;QAC5B,IAAI,IAAI,CAAC,qBAAqB;YAAE,OAAO;QACvC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,qFAAqF;IACrF,YAAY;QACV,4FAA4F;QAC5F,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/B,uEAAuE;QACvE,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAChC,qEAAqE;QACrE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACrE,2FAA2F;QAC3F,oCAAoC;QACpC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,KAAK,QAAQ,CAAC,CAAC,gDAAgD;QAE/D,yFAAyF;QACzF,6DAA6D;QAC7D,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CACV,2CAA2C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0EAA0E,CACtI,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,YAAY,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,KAAK,KAAK,CAAC;IAC5D,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAM;QACV,8EAA8E;QAC9E,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACxD,uFAAuF;QACvF,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC;QACjE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,yFAAyF;YACzF,2DAA2D;YAC3D,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAC/D,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;SAC5C,CAAC;IACJ,CAAC;CACF","sourcesContent":["import _ from 'lodash';\nimport type Oas from 'oas';\nimport { SecurityRequirementObject, SecuritySchemeObject, SecuritySchemesObject } from 'oas/types';\nimport type { Op } from '../nodes/internal.js';\n\n// A connector name/value entry: a header (`{ name, value }`) or a query param (`\"name\": value`).\n// Also the shape mergeOverrides produces for inferred/overridden header & query params.\nexport interface NameValue {\n name: string;\n value: string;\n}\n\n// One resolved auth credential: a NameValue plus where it goes. Header values carry `{}`\n// interpolation (`Bearer {$config.token}`); a query value is a raw JSONSelection (`$config.apiKey`).\ninterface AuthEntry extends NameValue {\n kind: 'header' | 'query';\n}\n\n// The HTTP methods the generator actually emits (see OasGen.isSupported). Scanning only these for\n// the per-op-mode switch keeps the decision consistent with what gets written — a `security` on an\n// un-emitted HEAD/OPTIONS op no longer flips the whole spec into per-op mode.\nconst SUPPORTED_METHODS: readonly string[] = ['get', 'post', 'put', 'patch', 'delete'];\n\n/**\n * Map one OAS security scheme to its connector auth entry, or null when it makes none.\n * Header values carry `{}` interpolation; a query value is a raw JSONSelection (no braces) because\n * it lands in a `queryParams: \"\"\"…\"\"\"` block, which is already a JSONSelection context.\n */\nfunction mapSchemeToAuth(scheme: SecuritySchemeObject): AuthEntry | null {\n switch (scheme.type) {\n case 'apiKey':\n // apiKey in a header, e.g. `{ type: apiKey, in: header, name: X-API-Key }`\n if (scheme.in === 'header' && scheme.name) {\n return { kind: 'header', name: scheme.name, value: '{$config.apiKey}' };\n }\n // apiKey in the query string, e.g. `{ type: apiKey, in: query, name: api_key }`\n if (scheme.in === 'query' && scheme.name) {\n return { kind: 'query', name: scheme.name, value: '$config.apiKey' };\n }\n return null; // cookie is deferred and warned about, not emitted\n case 'http':\n if (scheme.scheme === 'bearer') {\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n }\n if (scheme.scheme === 'basic') {\n return { kind: 'header', name: 'Authorization', value: 'Basic {$config.token}' };\n }\n return null;\n case 'oauth2':\n case 'openIdConnect':\n // both flows ultimately send a bearer token\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n default:\n return null;\n }\n}\n\n/** The warning text for a referenced scheme we did not emit (undefined, deferred, or not the winner). */\nfunction droppedSchemeWarning(name: string, scheme: SecuritySchemeObject | undefined): string {\n if (!scheme) {\n return `[security] scheme \"${name}\" is referenced but not defined; skipped.`;\n }\n if (scheme.type === 'apiKey' && scheme.in === 'cookie') {\n return `[security] scheme \"${name}\" is apiKey in cookie — not emitted (cookie auth deferred).`;\n }\n return `[security] scheme \"${name}\" (${scheme.type}) has no supported connector mapping; skipped.`;\n}\n\n/**\n * Resolve a security requirement to the single auth entry the connector should send.\n *\n * A requirement is an OR of scheme-name sets (`[{ a: [] }, { b: [] }]` = \"a OR b\"). We flatten to\n * names in order and pick the FIRST that maps to an entry. A later viable alternative is a\n * legitimate OR choice, not a failure, so it stays silent; only genuinely unresolvable names —\n * undefined, deferred (cookie), or an unmappable scheme — are reported in `warnings`. An absent or\n * empty (`[]`, public) requirement yields no entry and no warnings.\n */\nfunction resolveAuth(\n securityRequirements: SecurityRequirementObject[] | undefined,\n schemes: SecuritySchemesObject,\n): { auth: AuthEntry | null; warnings: string[] } {\n let auth: AuthEntry | null = null;\n const warnings: string[] = [];\n\n for (const name of securityRequirements?.flatMap((requirement) => Object.keys(requirement)) ?? []) {\n const scheme = schemes[name];\n const entry = scheme ? mapSchemeToAuth(scheme) : null;\n\n if (entry) {\n // first scheme that maps wins; a later viable alternative is a silent OR choice\n if (!auth) auth = entry;\n } else {\n // genuinely unresolvable: undefined scheme, cookie, or no supported mapping\n warnings.push(droppedSchemeWarning(name, scheme));\n }\n }\n\n return { auth, warnings };\n}\n\n/** True when ANY emitted operation declares its own `security` (empty `[]` or non-empty). */\nfunction hasPerOperationSecurity(def: ReturnType<Oas['getDefinition']>): boolean {\n const paths = def.paths ?? {};\n for (const pathName of Object.keys(paths)) {\n const path = paths[pathName];\n if (!path) continue;\n for (const method of SUPPORTED_METHODS) {\n // own property (not inherited) — an explicit `security: []` is still a declaration\n if (_.has(path, [method, 'security'])) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Resolved security for one generation pass: computed once from the parsed spec, then queried for\n * `@source` (sourceHeader) and per-`@connect` (forOp). Owning all auth warnings here removes the old\n * uniform-vs-per-op \"who warns when\" coordination between SchemaWriter and OperationWriter.\n *\n * Mode switch: when any emitted op declares its own `security`, a shared `@source` header is unsafe\n * (a public op would leak it; a differently-named override would send both), so header auth moves to\n * each `@connect`. Query auth always lives per-`@connect` — `SourceHTTP` has no `queryParams`.\n */\nexport class SecurityPlan {\n private readonly schemes: SecuritySchemesObject;\n private readonly globalReq: SecurityRequirementObject[] | undefined;\n private readonly perOpMode: boolean;\n // C3: the global requirement's dropped-scheme warnings, pre-resolved once. In per-op mode every\n // inheriting op would re-fire them otherwise; this set identifies them so forOp can skip what's\n // already been emitted (once) and only surface genuinely op-specific warnings with op context.\n private readonly globalWarningBodies: Set<string>;\n private globalWarningsEmitted = false;\n\n private constructor(\n schemes: SecuritySchemesObject,\n globalReq: SecurityRequirementObject[] | undefined,\n perOpMode: boolean,\n private readonly skipAuth: boolean = false,\n ) {\n this.schemes = schemes;\n this.globalReq = globalReq;\n this.perOpMode = perOpMode;\n this.globalWarningBodies = new Set(globalReq ? resolveAuth(globalReq, schemes).warnings : []);\n }\n\n static from(api: Oas, opts?: { skipAuth?: boolean }): SecurityPlan {\n const def = api.getDefinition();\n // oas-normalize usually up-converts Swagger 2.0 → components.securitySchemes; the\n // securityDefinitions fallback (same shape) is a safety net. refs are dereferenced by oas,\n // so the shape is a plain SecuritySchemesObject.\n const schemes = (def.components?.securitySchemes ?? def.securityDefinitions ?? {}) as SecuritySchemesObject;\n return new SecurityPlan(schemes, def.security, hasPerOperationSecurity(def), opts?.skipAuth ?? false);\n }\n\n // C3: emit the global's dropped-scheme warnings exactly once per generation. Called from\n // sourceHeader (uniform mode) and the first forOp (per-op mode) — both run before the warnings\n // would otherwise leak per-op. Idempotent via `globalWarningsEmitted`.\n private emitGlobalWarningsOnce(): void {\n if (this.globalWarningsEmitted) return;\n this.globalWarningsEmitted = true;\n for (const body of this.globalWarningBodies) console.warn(body);\n }\n\n /** The `@source`-level auth header literal (uniform mode + header kind), or null. */\n sourceHeader(): string | null {\n // --skip-auth: emit no auth anywhere — no header on @source (and forOp returns nothing too)\n if (this.skipAuth) return null;\n // per-op mode: each @connect carries its own auth — nothing on @source\n if (this.perOpMode) return null;\n // no global requirement -> keep the headerless @source byte-for-byte\n if (!this.globalReq || this.globalReq.length === 0) return null;\n\n const { auth, warnings } = resolveAuth(this.globalReq, this.schemes);\n // C3: surface the global's dropped-scheme warnings exactly once (uniform mode; per-op mode\n // emits them from the first forOp).\n this.emitGlobalWarningsOnce();\n void warnings; // already accounted for via globalWarningBodies\n\n // @source carries only header auth; query auth lives on each @connect (SourceHTTP has no\n // queryParams) and is returned by forOp — emit nothing here.\n if (auth?.kind !== 'header') {\n if (!auth) {\n const names = this.globalReq.flatMap((req) => Object.keys(req));\n console.warn(\n `[security] global security requirement (${names.join(', ')}) maps to no header-producing scheme; no auth header emitted on @source.`,\n );\n }\n return null;\n }\n\n return `{ name: \"${auth.name}\", value: \"${auth.value}\" }`;\n }\n\n /**\n * This op's resolved auth, split by placement.\n * - `header`: the header entry in per-op mode (uniform mode puts it on `@source`), else null\n * - `query`: the query entry, always (SourceHTTP has no queryParams), else null\n *\n * Per-op warnings are emitted here with op context; in uniform mode the global warnings were\n * already emitted once by sourceHeader. C3: in per-op mode, the global's dropped-scheme\n * warnings are emitted exactly once (via emitGlobalWarningsOnce) — only genuinely op-specific\n * warnings carry the `(operation …)` suffix.\n */\n forOp(op: Op): { header: NameValue | null; query: NameValue | null } {\n // --skip-auth: no per-@connect auth either (companion to sourceHeader's skip)\n if (this.skipAuth) return { header: null, query: null };\n // `??` not `||`: an explicit `security: []` (public) must NOT fall back to the global.\n const effective = op.operation.schema.security ?? this.globalReq;\n const { auth, warnings } = resolveAuth(effective, this.schemes);\n\n if (this.perOpMode) {\n // surface the global's dropped-scheme warnings exactly once (idempotent), then warn only\n // about op-specific drops with the op's location attached.\n this.emitGlobalWarningsOnce();\n const where = `${op.verb} ${op.operation.path}`;\n for (const w of warnings) {\n if (!this.globalWarningBodies.has(w)) {\n console.warn(`${w} (operation ${where})`);\n }\n }\n }\n\n return {\n header: this.perOpMode && auth?.kind === 'header' ? auth : null,\n query: auth?.kind === 'query' ? auth : null,\n };\n }\n}\n"]}
|
package/dist/oas/io/writer.js
CHANGED
|
@@ -56,15 +56,18 @@ export class Writer {
|
|
|
56
56
|
this.schemaWriter.writeDirectives(writer);
|
|
57
57
|
this.schemaWriter.writeJSONScalar(writer);
|
|
58
58
|
types.forEach((type) => {
|
|
59
|
+
if (!type.name) {
|
|
60
|
+
// Box `metadata_query_indices` has `MetadataQueryIndex.fields.items` as an inline allOf.
|
|
61
|
+
// That node must be named `Fields` before the writer can emit `type Fields { ... }`.
|
|
62
|
+
throw new Error(`[writer] cannot emit a GraphQL definition without a name: id=${type.id}. ` +
|
|
63
|
+
`Name the type where it is created.`);
|
|
64
|
+
}
|
|
59
65
|
const count = refCount.get(type.name) !== undefined ? refCount.get(type.name) : Infinity;
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
// will print. use the printed name (`Pet`), not the `$ref`: an output `Pet` and its request
|
|
66
|
-
// `PetInput` come from the same `$ref` but are different types, so keying on the `$ref` would
|
|
67
|
-
// drop one. see #26
|
|
66
|
+
// `generatedSet` is keyed by internal id, but two ids can print the same GraphQL type.
|
|
67
|
+
// Launch Library reaches `AgencyMini` as both `obj:type:...AgencyMini` (`program.agencies`)
|
|
68
|
+
// and `comp:type:...AgencyMini` (`mission_patches.agency`). Track the printed name too, so
|
|
69
|
+
// `type AgencyMini` is emitted once. Keep the kind suffix because output `Pet` and input
|
|
70
|
+
// `PetInput` can both come from the same $ref.
|
|
68
71
|
const nameKey = T.isRef(type.name)
|
|
69
72
|
? 'name:' + Naming.genTypeName(type.name) + (type.kind === 'input' ? 'Input' : '')
|
|
70
73
|
: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/oas/io/writer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/oas/io/writer.ts"],"names":[],"mappings":"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","sourcesContent":["import { OasGen } from '../oasGen.js';\nimport { IType, T } from '../nodes/internal.js';\nimport { inferEntityResolvers } from '../nodes/entity.js';\nimport { applyBatchResolvers } from '../nodes/batch.js';\nimport { promoteInterfaces } from '../nodes/interfacePromotion.js';\nimport { OperationWriter } from './operationWriter.js';\nimport { SchemaWriter } from './schemaWriter.js';\nimport { SecurityPlan } from './security.js';\nimport { TypesCollector } from '../generator/typesCollector.js';\nimport { Naming } from '../utils/naming.js';\nimport _ from 'lodash';\n\nexport class Writer {\n private schemaWriter: SchemaWriter;\n private operationWriter: OperationWriter;\n public buffer: string[];\n\n constructor(public gen: OasGen) {\n this.buffer = [];\n // resolve the spec's security once (schemes, global requirement, per-op mode) and share it —\n // schemaWriter (@source) and operationWriter (per-@connect) both query it instead of re-walking\n // the whole spec per operation.\n const security = SecurityPlan.from(gen.parser, { skipAuth: gen.options.skipAuth });\n this.schemaWriter = new SchemaWriter(gen, security);\n this.operationWriter = new OperationWriter(gen, security);\n }\n\n public write(input: string): Writer {\n this.buffer.push(input);\n return this;\n }\n\n public flush(): string {\n return this.buffer.join('');\n }\n\n public generate(paths: string[]): string[] {\n const collector = new TypesCollector(this.gen);\n collector.collect(paths);\n\n return this.generateWith(collector.types, collector.expanded);\n }\n\n public generateWith(types: Map<string, IType>, selection: string[]) {\n this.writeSchema(this, types, selection);\n return selection;\n }\n\n public writeSchema(writer: Writer, types: Map<string, IType>, selection: string[]): void {\n const context = this.gen.context!;\n const generatedSet = context.generatedSet;\n\n // make our own copy of the refCount, so it doesn't get modified by the writing process\n const refCount = _.cloneDeep(context.refCount);\n\n // Attach entity resolvers onto the (single, canonical) collected type instances the\n // loop below generates, so each entity type can emit @key + its type-level\n // @connect/$this resolver. Resets first, so it's a no-op when the flag is off.\n inferEntityResolvers(context, this.gen, types, selection);\n\n // R6: add batch resolvers (needs the R1 @key above) when a --batch file was given.\n applyBatchResolvers(context, this.gen, types);\n\n // R2: promote discriminated oneOf-with-shared-allOf-base to a GraphQL interface (id-neutral;\n // no-op unless consolidateUnions is off and a qualifying union exists). Same `types` map.\n promoteInterfaces(context, this.gen, types, selection);\n\n this.schemaWriter.writeDirectives(writer);\n this.schemaWriter.writeJSONScalar(writer);\n\n types.forEach((type: IType) => {\n if (!type.name) {\n // Box `metadata_query_indices` has `MetadataQueryIndex.fields.items` as an inline allOf.\n // That node must be named `Fields` before the writer can emit `type Fields { ... }`.\n throw new Error(\n `[writer] cannot emit a GraphQL definition without a name: id=${type.id}. ` +\n `Name the type where it is created.`,\n );\n }\n\n const count = refCount.get(type.name) !== undefined ? refCount.get(type.name)! : Infinity;\n\n // `generatedSet` is keyed by internal id, but two ids can print the same GraphQL type.\n // Launch Library reaches `AgencyMini` as both `obj:type:...AgencyMini` (`program.agencies`)\n // and `comp:type:...AgencyMini` (`mission_patches.agency`). Track the printed name too, so\n // `type AgencyMini` is emitted once. Keep the kind suffix because output `Pet` and input\n // `PetInput` can both come from the same $ref.\n const nameKey = T.isRef(type.name)\n ? 'name:' + Naming.genTypeName(type.name) + (type.kind === 'input' ? 'Input' : '')\n : null;\n\n if (!generatedSet.has(type.id) && !(nameKey && generatedSet.has(nameKey)) && count > 0) {\n type.generate(context, this, selection);\n generatedSet.add(type.id);\n if (nameKey) generatedSet.add(nameKey);\n refCount.set(type.name, count - 1);\n }\n });\n\n const expanded = [...this.gen.paths];\n\n const queries = new Map(expanded.filter(([_k, type]) => type.id.startsWith('get:')));\n const mutations = new Map(expanded.filter(([_k, type]) => T.isMutationType(type)));\n\n this.operationWriter.writeQuery(context, writer, queries, selection);\n this.operationWriter.writeMutations(context, writer, mutations, selection);\n\n writer.flush();\n }\n}\n"]}
|
package/dist/oas/nodes/comp.js
CHANGED
|
@@ -171,26 +171,31 @@ export class Composed extends Type {
|
|
|
171
171
|
return super.add(this.withUniqueName(child));
|
|
172
172
|
}
|
|
173
173
|
updateName() {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
174
|
+
if (this.name) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (this.parent instanceof Res) {
|
|
178
|
+
const op = this.parent.parent;
|
|
179
|
+
this.name = op.getGqlOpName() + 'Response';
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (this.schema?.allOf?.length === 1) {
|
|
183
|
+
// A single-member allOf with a $ref is just a wrapper around that component:
|
|
184
|
+
// `allOf: [{ $ref: "#/components/schemas/Field" }]` emits `Field`.
|
|
185
|
+
// A single inline member has no component name, so `fields.items.allOf: [{ type: object }]`
|
|
186
|
+
// falls through and is named from the parent field as `Fields`.
|
|
187
|
+
const ref = _.get(this.schema.allOf[0], '$ref');
|
|
188
|
+
if (ref) {
|
|
189
|
+
this.name = ref;
|
|
190
|
+
return;
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
|
-
this.
|
|
193
|
+
if (this.parent instanceof Prop) {
|
|
194
|
+
this.name = Naming.genTypeName(Naming.getRefName(this.parent.name));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Consolidated allOf members keep the internal id that selection paths reference.
|
|
198
|
+
this.name = `[inline:${this.parent.name}]`;
|
|
194
199
|
}
|
|
195
200
|
}
|
|
196
201
|
//# sourceMappingURL=comp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comp.js","sourceRoot":"","sources":["../../../src/oas/nodes/comp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Factory, Get, IType, Prop, ReferenceObject, Res, T, Type } from './internal.js';\nimport { SchemaObject } from 'oas/types';\n\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\nimport _ from 'lodash';\n\nexport class Composed extends Type {\n // R2: GraphQL interface this member implements (a shared allOf base of a discriminated\n // oneOf). When set, generate() appends `implements <Base>`. Set by promoteInterfaces.\n public implementsInterface?: string;\n\n constructor(\n parent: IType | undefined,\n public name: string,\n public schema: SchemaObject,\n public consolidated: boolean = false,\n ) {\n super(parent, name);\n this.updateName();\n }\n\n get id(): string {\n return `comp:${this.kind}:${this.name}`;\n }\n\n public forPrompt(_context: OasContext): string {\n return `[comp] ${Naming.getRefName(this.name)}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n context.enter(this);\n trace(context, '-> [composed:visit]', 'in: ' + (this.name == null ? '[object]' : this.name));\n\n // If not in the context of a Composed or Param, log the composed schema.\n if (!context.inContextOf('Composed', this) && !context.inContextOf('Param', this)) {\n trace(context, '[comp]', ' in composed schema: ' + this.name);\n }\n\n // a PropComp-named inline allOf (#7) that clashes with a stored type of a different class\n // must rename — otherwise the same type name is defined twice. see docs/issues.md #22\n if (this.parent instanceof Prop && T.collidesAcrossNodeClasses(this, context)) {\n T.resolveNameConflict(this, context);\n }\n\n const composedSchema = this.schema;\n\n // this will be a type declaration\n if (composedSchema.allOf != null) {\n this.visitAllOfNode(context, composedSchema);\n }\n // represents a Union type and should be handled elsewhere\n else if (composedSchema.oneOf != null) {\n throw new Error('Unions should be constructed by its own object');\n }\n // can't hand this yet\n else {\n throw new Error('Composed.visit: unsupported composed schema: ' + this.schema);\n }\n\n this.visited = true;\n trace(context, '<- [composed:visit]', 'out: ' + this.name);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n context.enter(this);\n trace(context, '-> [comp::generate]', `-> in: ${this.name}`);\n\n if (context.inContextOf('Res', this)) {\n writer.write(Naming.genTypeName(this.name));\n return;\n }\n\n if (this.schema.allOf != null) {\n const selected = this.selectedProps(selection);\n\n if (selected.length > 0) {\n // Definition and reference must agree: references emit genTypeName(name), so the definition\n // does too (upperFirst(getRefName) kept separators: `Billing_historyResponse` vs the\n // reference's `BillingHistoryResponse`). Mirrors obj.ts. see docs/issues.md #15, #6\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n writer.write(this.kind + ' ');\n writer.write(sanitised === refName ? refName : sanitised);\n writer.write(this.nameSuffix());\n // R2: a promoted member implements the shared base interface.\n if (this.implementsInterface) {\n writer.write(` implements ${this.implementsInterface}`);\n }\n writer.write(' {\\n');\n\n for (const prop of selected) {\n trace(context, ' [comp::generate]', `-> property: ${prop.name} (parent: ${prop.parent!.name})`);\n prop.generate(context, writer, selection);\n }\n\n writer.write('}\\n\\n');\n }\n }\n\n trace(context, '<- [comp::generate]', `-> out: ${this.name}`);\n context.leave(this);\n }\n\n // the selected props, once the allOf members are folded in (same shape select writes)\n dependencies(_context: OasContext, selection: string[]): IType[] {\n if (this.schema.allOf != null && !this.consolidated) {\n this.consolidate(selection);\n }\n return this.selectedProps(selection);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n trace(context, '-> [comp::select]', `-> in: ${this.name}`);\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n const composedSchema = this.schema;\n if (composedSchema.allOf != null) {\n const selected = this.selectedProps(selection);\n\n for (const prop of selected) {\n prop.select(context, writer, selection);\n }\n } else if (composedSchema.oneOf != null) {\n if (this.children.length === 1) {\n this.children[0].select(context, writer, selection);\n } else {\n throw new Error('Expected exactly one child for a oneOf schema');\n }\n }\n\n trace(context, '<- [comp::select]', `-> out: ${this.name}`);\n }\n\n public consolidate(selection: string[]): Set<string> {\n const ids: Set<string> = new Set();\n let props: Map<string, Prop> = new Map();\n\n const tree = T.print(this);\n const queue: IType[] = Array.from(this.children.values()).filter((child) => !(child instanceof Prop));\n\n while (queue.length > 0) {\n const node = queue.shift()!;\n ids.add(node.id);\n\n if (selection.length > 0) {\n node.props.forEach((prop) => {\n if (selection.find((s) => s.startsWith(prop.path()))) {\n props.set(prop.name, prop);\n }\n });\n } else {\n node.props.forEach((prop) => props.set(prop.name, prop));\n }\n\n // sort props\n props = new Map([...props.entries()].sort());\n\n const children = Array.from(node.children.values()).filter((child) => !(child instanceof Prop));\n queue.push(...children);\n }\n\n // copy all collected props from children into this node\n props.forEach((prop, name) => this.props.set(name, prop));\n\n this.consolidated = true;\n\n // and return the types we've used\n return ids;\n }\n\n private visitAllOfNode(context: OasContext, schema: SchemaObject): void {\n const allOfs = schema.allOf || [];\n const refs = allOfs.map((s) => (s as ReferenceObject).$ref);\n\n trace(context, '-> [composed::all-of]', `in: '${this.name}' of: ${allOfs.length} - refs: ${refs}`);\n\n for (let i = 0; i < allOfs.length; i++) {\n const allOfItemSchema = allOfs[i];\n\n // skip metadata-only allOf members (they contribute no fields). see docs/issues.md #5\n if (Factory.isEmptySchema(allOfItemSchema as SchemaObject)) {\n trace(context, ' [composed::all-of]', `skipping empty allOf member #${i}`);\n continue;\n }\n\n const type = Factory.fromSchema(context, this, allOfItemSchema as SchemaObject);\n this.add(type);\n\n trace(context, ' [composed::all-of]', 'allOf type: ' + type);\n\n if (type) {\n type.visit(context);\n }\n }\n\n const tree = T.print(this);\n context.store(this.name, this);\n trace(context, '<- [composed::all-of]', `out: '${this.name}' of: ${allOfs.length} - refs: ${refs}`);\n }\n\n add(child: IType): IType {\n return super.add(this.withUniqueName(child));\n }\n\n private updateName(): void {\n let name = this.name;\n\n if (!name) {\n if (this.parent instanceof Res) {\n const op = this.parent!.parent as Get;\n name = op.getGqlOpName() + 'Response';\n } else if (this.schema?.allOf?.length === 1) {\n // single member: adopt its ref name (avoids an unusable '[inline:…]' name). see docs/issues.md #7\n name = _.get(this.schema?.allOf[0], '$ref') as string;\n } else if (this.parent instanceof Prop) {\n // emitted inline allOf-property type needs a real name, not '[inline:…]'. see docs/issues.md #7\n name = Naming.genTypeName(Naming.getRefName(this.parent.name));\n } else {\n // consolidated allOf member: keep the '[inline:…]' id that selection paths reference. issue #7\n name = `[inline:${this.parent!.name}]`;\n }\n }\n\n this.name = name;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"comp.js","sourceRoot":"","sources":["../../../src/oas/nodes/comp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Factory, Get, IType, Prop, ReferenceObject, Res, T, Type } from './internal.js';\nimport { SchemaObject } from 'oas/types';\n\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\nimport _ from 'lodash';\n\nexport class Composed extends Type {\n // R2: GraphQL interface this member implements (a shared allOf base of a discriminated\n // oneOf). When set, generate() appends `implements <Base>`. Set by promoteInterfaces.\n public implementsInterface?: string;\n\n constructor(\n parent: IType | undefined,\n public name: string,\n public schema: SchemaObject,\n public consolidated: boolean = false,\n ) {\n super(parent, name);\n this.updateName();\n }\n\n get id(): string {\n return `comp:${this.kind}:${this.name}`;\n }\n\n public forPrompt(_context: OasContext): string {\n return `[comp] ${Naming.getRefName(this.name)}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n context.enter(this);\n trace(context, '-> [composed:visit]', 'in: ' + (this.name == null ? '[object]' : this.name));\n\n // If not in the context of a Composed or Param, log the composed schema.\n if (!context.inContextOf('Composed', this) && !context.inContextOf('Param', this)) {\n trace(context, '[comp]', ' in composed schema: ' + this.name);\n }\n\n // a PropComp-named inline allOf (#7) that clashes with a stored type of a different class\n // must rename — otherwise the same type name is defined twice. see docs/issues.md #22\n if (this.parent instanceof Prop && T.collidesAcrossNodeClasses(this, context)) {\n T.resolveNameConflict(this, context);\n }\n\n const composedSchema = this.schema;\n\n // this will be a type declaration\n if (composedSchema.allOf != null) {\n this.visitAllOfNode(context, composedSchema);\n }\n // represents a Union type and should be handled elsewhere\n else if (composedSchema.oneOf != null) {\n throw new Error('Unions should be constructed by its own object');\n }\n // can't hand this yet\n else {\n throw new Error('Composed.visit: unsupported composed schema: ' + this.schema);\n }\n\n this.visited = true;\n trace(context, '<- [composed:visit]', 'out: ' + this.name);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n context.enter(this);\n trace(context, '-> [comp::generate]', `-> in: ${this.name}`);\n\n if (context.inContextOf('Res', this)) {\n writer.write(Naming.genTypeName(this.name));\n return;\n }\n\n if (this.schema.allOf != null) {\n const selected = this.selectedProps(selection);\n\n if (selected.length > 0) {\n // Definition and reference must agree: references emit genTypeName(name), so the definition\n // does too (upperFirst(getRefName) kept separators: `Billing_historyResponse` vs the\n // reference's `BillingHistoryResponse`). Mirrors obj.ts. see docs/issues.md #15, #6\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n writer.write(this.kind + ' ');\n writer.write(sanitised === refName ? refName : sanitised);\n writer.write(this.nameSuffix());\n // R2: a promoted member implements the shared base interface.\n if (this.implementsInterface) {\n writer.write(` implements ${this.implementsInterface}`);\n }\n writer.write(' {\\n');\n\n for (const prop of selected) {\n trace(context, ' [comp::generate]', `-> property: ${prop.name} (parent: ${prop.parent!.name})`);\n prop.generate(context, writer, selection);\n }\n\n writer.write('}\\n\\n');\n }\n }\n\n trace(context, '<- [comp::generate]', `-> out: ${this.name}`);\n context.leave(this);\n }\n\n // the selected props, once the allOf members are folded in (same shape select writes)\n dependencies(_context: OasContext, selection: string[]): IType[] {\n if (this.schema.allOf != null && !this.consolidated) {\n this.consolidate(selection);\n }\n return this.selectedProps(selection);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n trace(context, '-> [comp::select]', `-> in: ${this.name}`);\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n const composedSchema = this.schema;\n if (composedSchema.allOf != null) {\n const selected = this.selectedProps(selection);\n\n for (const prop of selected) {\n prop.select(context, writer, selection);\n }\n } else if (composedSchema.oneOf != null) {\n if (this.children.length === 1) {\n this.children[0].select(context, writer, selection);\n } else {\n throw new Error('Expected exactly one child for a oneOf schema');\n }\n }\n\n trace(context, '<- [comp::select]', `-> out: ${this.name}`);\n }\n\n public consolidate(selection: string[]): Set<string> {\n const ids: Set<string> = new Set();\n let props: Map<string, Prop> = new Map();\n\n const tree = T.print(this);\n const queue: IType[] = Array.from(this.children.values()).filter((child) => !(child instanceof Prop));\n\n while (queue.length > 0) {\n const node = queue.shift()!;\n ids.add(node.id);\n\n if (selection.length > 0) {\n node.props.forEach((prop) => {\n if (selection.find((s) => s.startsWith(prop.path()))) {\n props.set(prop.name, prop);\n }\n });\n } else {\n node.props.forEach((prop) => props.set(prop.name, prop));\n }\n\n // sort props\n props = new Map([...props.entries()].sort());\n\n const children = Array.from(node.children.values()).filter((child) => !(child instanceof Prop));\n queue.push(...children);\n }\n\n // copy all collected props from children into this node\n props.forEach((prop, name) => this.props.set(name, prop));\n\n this.consolidated = true;\n\n // and return the types we've used\n return ids;\n }\n\n private visitAllOfNode(context: OasContext, schema: SchemaObject): void {\n const allOfs = schema.allOf || [];\n const refs = allOfs.map((s) => (s as ReferenceObject).$ref);\n\n trace(context, '-> [composed::all-of]', `in: '${this.name}' of: ${allOfs.length} - refs: ${refs}`);\n\n for (let i = 0; i < allOfs.length; i++) {\n const allOfItemSchema = allOfs[i];\n\n // skip metadata-only allOf members (they contribute no fields). see docs/issues.md #5\n if (Factory.isEmptySchema(allOfItemSchema as SchemaObject)) {\n trace(context, ' [composed::all-of]', `skipping empty allOf member #${i}`);\n continue;\n }\n\n const type = Factory.fromSchema(context, this, allOfItemSchema as SchemaObject);\n this.add(type);\n\n trace(context, ' [composed::all-of]', 'allOf type: ' + type);\n\n if (type) {\n type.visit(context);\n }\n }\n\n const tree = T.print(this);\n context.store(this.name, this);\n trace(context, '<- [composed::all-of]', `out: '${this.name}' of: ${allOfs.length} - refs: ${refs}`);\n }\n\n add(child: IType): IType {\n return super.add(this.withUniqueName(child));\n }\n\n private updateName(): void {\n if (this.name) {\n return;\n }\n\n if (this.parent instanceof Res) {\n const op = this.parent.parent as Get;\n this.name = op.getGqlOpName() + 'Response';\n return;\n }\n\n if (this.schema?.allOf?.length === 1) {\n // A single-member allOf with a $ref is just a wrapper around that component:\n // `allOf: [{ $ref: \"#/components/schemas/Field\" }]` emits `Field`.\n // A single inline member has no component name, so `fields.items.allOf: [{ type: object }]`\n // falls through and is named from the parent field as `Fields`.\n const ref = _.get(this.schema.allOf[0], '$ref') as string | undefined;\n if (ref) {\n this.name = ref;\n return;\n }\n }\n\n if (this.parent instanceof Prop) {\n this.name = Naming.genTypeName(Naming.getRefName(this.parent.name));\n return;\n }\n\n // Consolidated allOf members keep the internal id that selection paths reference.\n this.name = `[inline:${this.parent!.name}]`;\n }\n}\n"]}
|
|
@@ -311,11 +311,10 @@ export class Factory {
|
|
|
311
311
|
else {
|
|
312
312
|
prop = new PropScalar(parent, propName, 'JSON', schemaObj);
|
|
313
313
|
}
|
|
314
|
-
// Cut a
|
|
315
|
-
//
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
if (cyclic || parent.ancestors().find((a) => a.id === prop.id)) {
|
|
314
|
+
// Cut only a real loop: a field pointing back to a type we already passed through. Compare the schema,
|
|
315
|
+
// not the field name — different types reuse field names (e.g. Adobe `extension_attributes`). docs/issues.md #36
|
|
316
|
+
const cyclic = this.cyclicAncestor(parent, schemaObj);
|
|
317
|
+
if (cyclic) {
|
|
319
318
|
prop = new PropCircRef(parent, prop);
|
|
320
319
|
}
|
|
321
320
|
return prop;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/oas/nodes/factory.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Arr,\n Body,\n CircularRef,\n Composed,\n Delete,\n En,\n Get,\n IType,\n Map,\n Obj,\n Param,\n Patch,\n Post,\n Prop,\n PropArray,\n PropCircRef,\n PropComp,\n PropMap,\n PropObj,\n PropScalar,\n Put,\n ReferenceObject,\n RefCircRef,\n Res,\n Scalar,\n T,\n Union,\n PropEn,\n} from './internal.js';\nimport { Operation } from 'oas/operation';\nimport { ParameterObject, SchemaObject } from 'oas/types';\nimport { OpenAPIV3 } from 'openapi-types';\nimport _ from 'lodash';\nimport { warn } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { GqlUtils } from '../utils/gql.js';\nimport { Naming } from '../utils/naming.js';\nimport ArraySchemaObject = OpenAPIV3.ArraySchemaObject;\n\nexport class Factory {\n public static createGet(name: string, op: Operation): Get {\n return new Get(name, op);\n }\n\n public static fromSchema(context: OasContext, parent: IType, inputSchema: SchemaObject | ReferenceObject): IType {\n let result: IType | null = null;\n let schema: SchemaObject | ReferenceObject | undefined = inputSchema;\n let ref: string | undefined;\n\n // resolve first if reference\n if ('$ref' in schema) {\n // result = new Ref(parent, schema.$ref as string, schema as ReferenceObject);\n ref = schema?.$ref;\n if (ref) schema = context.lookupRef(ref) as SchemaObject;\n }\n\n if (!schema) throw new Error('Unknown or undefined schema');\n const schemaObj: SchemaObject = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n\n // Cycle cut (see docs/issues.md #10): a recursive schema can only close through a component `$ref`,\n // and `lookupRef` returns the same `SchemaObject` instance for a given ref. So if this resolved ref's\n // schema is already on the expansion path (an ancestor was built from it), re-entering would recurse\n // forever / emit a circular connector selection. Stop with a `RefCircRef` sentinel (commented in both\n // SDL and selection, traversal-terminating) instead of building + lazily expanding the recursion.\n const cyclic = ref ? this.cyclicAncestor(parent, schemaObj) : undefined;\n if (cyclic) {\n return this.fromRefCircRef(parent, cyclic, ref!);\n }\n\n // github's \"maybe empty\" anyOf (`anyOf: [member, {}]`): the fieldless member renders\n // nothing, so a single real member collapses to it. see docs/issues.md #20\n if (schemaObj.anyOf && !schemaObj.oneOf && !schemaObj.allOf) {\n const real = schemaObj.anyOf.filter((m) => !this.isShapelessObject(m as SchemaObject));\n if (real.length === 1) {\n return this.fromSchema(context, parent, real[0] as SchemaObject | ReferenceObject);\n }\n }\n\n // implied array: `items` present even without an explicit `type: array`. see docs/issues.md #4\n if (_.get(schemaObj, 'items') && (schemaObj.type === 'array' || schemaObj.type == null)) {\n result = this.createArrayType(parent, schemaObj, context);\n }\n // array case\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n schemaObj?.anyOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n result = this.createContainerType(parent, schemaObj, ref);\n }\n // a shapeless object (nothing but a boolean `additionalProperties`, or `{}`) declares no fields:\n // fall back to the JSON scalar — NOT an empty Obj, which generate() would skip, dangling the\n // reference. see docs/issues.md #19\n else if (this.isShapelessObject(schemaObj)) {\n result = new Scalar(parent, 'JSON', schemaObj);\n }\n // scalar\n else {\n result = this.createScalarType(schemaObj, parent);\n }\n\n // we could not infer a proper type\n if (result == null) {\n throw new Error(`Not yet implemented for ${JSON.stringify(schemaObj)}`);\n }\n\n return result;\n }\n\n /**\n * OAS 3.1 type arrays (`type: [\"string\",\"null\"]`) collapse to their first non-null entry:\n * GraphQL fields are nullable by default, so the \"null\" disjunct adds nothing. Normalized\n * in place (idempotent; `lookupRef` shares schema instances, so every reader sees it).\n * see docs/issues.md #23\n */\n private static normalizeTypeArray(schema: SchemaObject): void {\n const s = schema as Record<string, unknown>;\n if (Array.isArray(s.type)) {\n const real = (s.type as unknown[]).filter((t) => t && t !== 'null');\n s.type = real[0];\n }\n }\n\n // every member is a legal GraphQL enum value once trimmed (TMF637 ships `'aborted '`): a bare\n // identifier that isn't a boolean/null literal. Anything else (numbers, \"+1\", \"fast-forward\",\n // true) has no enum form. see #24\n private static isGqlEnum(schema: SchemaObject): boolean {\n const VALID_ENUM_VALUE = /^[_A-Za-z][_0-9A-Za-z]*$/;\n const RESERVED = new Set(['true', 'false', 'null']);\n return _.every(schema.enum, (value) => {\n if (typeof value !== 'string') return false;\n const trimmed = value.trim();\n return VALID_ENUM_VALUE.test(trimmed) && !RESERVED.has(trimmed);\n });\n }\n\n // Keywords that give a schema a renderable GraphQL shape; a schema with none is metadata-only. #5\n private static readonly SHAPE_KEYWORDS = [\n '$ref',\n 'type',\n 'enum',\n 'items',\n 'allOf',\n 'oneOf',\n 'anyOf',\n 'additionalProperties',\n ];\n\n /** True when a schema carries no renderable content (metadata only). see docs/issues.md #5 */\n public static isEmptySchema(schema: SchemaObject | ReferenceObject): boolean {\n const s = schema as Record<string, unknown>;\n return Factory.SHAPE_KEYWORDS.every((k) => s[k] == null) && _.isEmpty(s.properties);\n }\n\n /**\n * True for an object with no declared fields: no shape keyword except (at most) an explicit\n * object `type` and a boolean `additionalProperties` (`{}`, `{ additionalProperties: false }`,\n * `{ type: object, properties: {} }` — googlebooks `Empty`). A real map\n * (`additionalProperties: <schema>`) is NOT shapeless. see docs/issues.md #19, #31\n */\n public static isShapelessObject(schema: SchemaObject): boolean {\n const s = schema as Record<string, unknown>;\n const noShape = ['$ref', 'enum', 'items', 'allOf', 'oneOf', 'anyOf'].every((k) => s[k] == null);\n const objectOrUntyped = s.type == null || s.type === 'object';\n return noShape && objectOrUntyped && _.isEmpty(s.properties) && typeof s.additionalProperties !== 'object';\n }\n\n private static createScalarType(schema: SchemaObject | null, parent: IType) {\n const typeStr = schema?.type;\n if (typeStr != null) {\n if (typeStr === 'array') {\n throw new Error(`Should have been handled already? ${typeStr}, schema: ${JSON.stringify(schema)}`);\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, schema.enum! as string[]);\n }\n // scalar case\n else if (GqlUtils.gqlScalar(typeStr as string)) {\n const scalarType = GqlUtils.getGQLScalarType(schema!);\n return new Scalar(parent, scalarType, schema!);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle property type ${typeStr}, schema: ${JSON.stringify(schema)}`);\n }\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, _.get(schema, 'enum') as string[]);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle schema ${parent.pathToRoot()}, schema: ${JSON.stringify(schema)}`);\n }\n }\n\n private static createContainerType(parent: IType, schema: SchemaObject, ref?: string) {\n let result: IType | null;\n\n // composed object\n if (schema.allOf) {\n result = new Composed(parent, ref || _.get(schema, 'name'), schema);\n }\n // union\n else if (schema.oneOf || schema.anyOf) {\n const oneOfs = schema.oneOf || [];\n result = new Union(\n parent,\n ref || _.get(schema, 'name'),\n oneOfs as SchemaObject[],\n false,\n _.get(schema, 'discriminator'),\n );\n }\n // map (object with only additionalProperties)\n else if (this.isMapSchema(schema)) {\n result = new Map(parent, ref || _.get(schema, 'name') || null, schema);\n }\n // or a plain obj\n else {\n if (!schema.properties) {\n warn(\n null,\n '[factory]',\n 'Object has no properties: ' + JSON.stringify(schema, null, 2) + ' in: ' + parent.pathToRoot(),\n );\n }\n\n result = new Obj(parent, ref || _.get(schema, 'name') || null, schema);\n }\n\n return result;\n }\n\n private static isMapSchema(schema: SchemaObject): boolean {\n // A schema is considered a map if:\n // 1. It has additionalProperties defined as an object\n // 2. It has no explicit properties OR has empty properties\n return Boolean(\n schema.additionalProperties &&\n typeof schema.additionalProperties === 'object' &&\n (!schema.properties || _.isEmpty(schema.properties)),\n );\n }\n\n private static createArrayType(parent: IType | Res, schema: SchemaObject | null, context: OasContext) {\n // Array schema case.\n let parentName = parent.name;\n if (parent instanceof Res) {\n const get = parent.parent as Get; // Assume parent.parent is a GetOp.\n parentName = _.upperFirst(get.getGqlOpName());\n }\n\n const arr = new Arr(parent, parentName);\n const items = _.get(schema, 'items') as ArraySchemaObject;\n arr.items = items;\n\n // TODO: check this\n arr.itemsType = Factory.fromSchema(context, arr, items);\n arr.add(arr.itemsType); // add it to the children\n\n return arr;\n }\n\n public static fromProp(\n context: OasContext,\n parent: IType,\n propName: string,\n inputSchema: SchemaObject | ReferenceObject,\n ): Prop {\n if (!inputSchema) {\n throw new Error(`Should have a schema defined for property '${propName}' (parent: '${parent.name}')`);\n }\n\n let schema: SchemaObject | ReferenceObject | null = inputSchema;\n\n let prop: Prop;\n let ref: string | undefined;\n\n if (!_.get(schema, 'type') && '$ref' in schema) {\n ref = (schema as ReferenceObject).$ref;\n schema = context.lookupRef(ref);\n // this was a prop ref, but now needs to be returned as the ref directly?\n // prop = new PropRef(parent, propName, schema, ref);\n // return prop;\n }\n\n // uses the type of the schema to find out what kind of property it is\n const schemaObj = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n const type = schemaObj.type;\n\n if (type) {\n // 1st case is if the type is an array\n if (type === 'array') {\n const array = new PropArray(parent, propName, schema!);\n // const itemsName = Naming.genArrayItems(propName);\n\n const itemsSchema = _.get(schemaObj, 'items') as ArraySchemaObject;\n // const itemsType = Factory.fromProp(context, array, itemsName, itemsSchema); // TODO: re-test\n const itemsType = Factory.fromSchema(context, array, itemsSchema);\n\n array.setItems(itemsType);\n prop = array;\n\n // Array items resolve eagerly here, so if the item ref re-entered a schema on the path\n // (fromSchema returned the circular sentinel), bubble the cut up to the whole list field:\n // render `# children: [Node] — circular reference omitted`. see docs/issues.md #10\n if (itemsType instanceof CircularRef) {\n return new PropCircRef(parent, array);\n }\n }\n // 2nd checks for obj property\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(\n inner,\n ref || _.get(schemaObj, 'name'),\n schemaObj.oneOf as SchemaObject[],\n false,\n _.get(schemaObj, 'discriminator'),\n );\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n // Map property: object with only additionalProperties\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n } else {\n // the type of the property will be an object, which needs to be added as a child\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n } else if (ref && schemaObj?.enum) {\n if (this.isGqlEnum(schemaObj)) {\n const en: En = new En(\n parent,\n ref,\n schemaObj,\n (schemaObj.enum as string[]).map((v) => v.trim()),\n );\n prop = new PropEn(parent, propName, ref, schemaObj);\n prop.add(en);\n } else {\n // No GraphQL enum form for this one — degrade to the base scalar instead of emitting\n // an invalid definition: boolean/number enums (slack `ok: { enum: [true] }` ->\n // `ok: Boolean`) and string enums with non-identifier values (github reactions\n // `enum: [\"+1\", \"-1\", …]` -> String). see docs/issues.md #24\n prop = new PropScalar(parent, propName, GqlUtils.getGQLScalarType(schemaObj), schemaObj);\n }\n }\n // 3rd tries for scalar\n else if (GqlUtils.gqlScalar(type as string)) {\n const scalar = GqlUtils.gqlScalar(type as string);\n prop = new PropScalar(parent, propName, scalar as string, schemaObj);\n }\n // or we don't know how to handle this\n else {\n throw new Error('Cannot handle property type ' + type);\n }\n }\n // otherwise let's use the properties instead and assume an Obj\n // TODO: repeated code\n else if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(inner, ref || _.get(schemaObj, 'name'), schemaObj.oneOf as SchemaObject[]);\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n // Map property: object with only additionalProperties (no explicit type)\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n // default case, we don't know what to do so we'll create a scalar of type JSON\n else {\n prop = new PropScalar(parent, propName, 'JSON', schemaObj);\n }\n\n // Cut a recursive direct-`$ref` property: the legacy id/name check, plus a schema-identity check\n // (the resolved component schema already on the path) that catches cycles the name check misses\n // because the recursion mints distinct per-depth names. see docs/issues.md #10\n const cyclic = ref ? this.cyclicAncestor(parent, schema as SchemaObject) : undefined;\n if (cyclic || parent.ancestors().find((a) => a.id === prop.id)) {\n prop = new PropCircRef(parent, prop);\n }\n\n return prop;\n }\n\n /**\n * The nearest ancestor built from the same resolved component `$ref` (compared by `SchemaObject`\n * identity — `lookupRef` returns the same instance per ref), or undefined. Scoped to the current\n * expansion path (`ancestors()`), so a shared non-recursive component used by sibling fields is NOT\n * cut — only a schema that is its own ancestor. `schema` is undefined for inline (non-`$ref`) nodes,\n * which can never match an ancestor. see docs/issues.md #10\n */\n private static cyclicAncestor(parent: IType, schema?: SchemaObject): IType | undefined {\n if (!schema) return undefined;\n return parent.ancestors().find((a) => a.schema === schema);\n }\n\n /** Build the `fromSchema` circular sentinel (commented in both SDL + selection). see docs/issues.md #10 */\n public static fromRefCircRef(parent: IType, ancestor: IType, ref: string): IType {\n const node = new RefCircRef(parent, Naming.getRefName(ref) ?? ancestor.name);\n node.ref = ancestor;\n return node;\n }\n\n public static fromResponse(_context: OasContext, parent: IType, mediaSchema: SchemaObject): IType {\n return new Res(parent, 'r', mediaSchema);\n }\n\n public static fromParam(context: OasContext, parent: IType, p: ParameterObject | ReferenceObject): Param {\n let param: ParameterObject;\n\n if ('$ref' in p) {\n const ref: ReferenceObject = p as ReferenceObject;\n const schema = context.lookupParam(ref.$ref);\n\n if (!schema) {\n throw new Error('Schema not found for ref: ' + ref.$ref);\n }\n param = schema as ParameterObject;\n } else {\n param = p as ParameterObject;\n }\n\n const schema = param.schema as SchemaObject;\n const required = param.required === true;\n\n return new Param(parent, param.name, schema, required, schema.default, param);\n }\n\n public static fromCircularRef(parent: IType, child: IType): IType {\n const _tree = T.print(parent);\n\n const circularRef = new CircularRef(parent, child.name);\n circularRef.ref = child;\n return circularRef;\n }\n\n public static fromUnion(_context: OasContext, parent: IType, oneOfs: SchemaObject[]): IType {\n const union = new Union(parent, parent.name, oneOfs);\n parent.add(union);\n return union;\n }\n\n public static fromPost(name: string, op: Operation): Post {\n return new Post(name, op);\n }\n\n public static fromPut(name: string, op: Operation): Post {\n return new Put(name, op);\n }\n\n public static fromPatch(name: string, op: Operation): Post {\n return new Patch(name, op);\n }\n\n public static fromDelete(name: string, op: Operation): Post {\n return new Delete(name, op);\n }\n\n public static fromBody(_context: OasContext, parent: IType, schema: SchemaObject): IType {\n const body = new Body(parent, 'b', schema);\n parent.add(body);\n return body;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/oas/nodes/factory.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Arr,\n Body,\n CircularRef,\n Composed,\n Delete,\n En,\n Get,\n IType,\n Map,\n Obj,\n Param,\n Patch,\n Post,\n Prop,\n PropArray,\n PropCircRef,\n PropComp,\n PropMap,\n PropObj,\n PropScalar,\n Put,\n ReferenceObject,\n RefCircRef,\n Res,\n Scalar,\n T,\n Union,\n PropEn,\n} from './internal.js';\nimport { Operation } from 'oas/operation';\nimport { ParameterObject, SchemaObject } from 'oas/types';\nimport { OpenAPIV3 } from 'openapi-types';\nimport _ from 'lodash';\nimport { warn } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { GqlUtils } from '../utils/gql.js';\nimport { Naming } from '../utils/naming.js';\nimport ArraySchemaObject = OpenAPIV3.ArraySchemaObject;\n\nexport class Factory {\n public static createGet(name: string, op: Operation): Get {\n return new Get(name, op);\n }\n\n public static fromSchema(context: OasContext, parent: IType, inputSchema: SchemaObject | ReferenceObject): IType {\n let result: IType | null = null;\n let schema: SchemaObject | ReferenceObject | undefined = inputSchema;\n let ref: string | undefined;\n\n // resolve first if reference\n if ('$ref' in schema) {\n // result = new Ref(parent, schema.$ref as string, schema as ReferenceObject);\n ref = schema?.$ref;\n if (ref) schema = context.lookupRef(ref) as SchemaObject;\n }\n\n if (!schema) throw new Error('Unknown or undefined schema');\n const schemaObj: SchemaObject = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n\n // Cycle cut (see docs/issues.md #10): a recursive schema can only close through a component `$ref`,\n // and `lookupRef` returns the same `SchemaObject` instance for a given ref. So if this resolved ref's\n // schema is already on the expansion path (an ancestor was built from it), re-entering would recurse\n // forever / emit a circular connector selection. Stop with a `RefCircRef` sentinel (commented in both\n // SDL and selection, traversal-terminating) instead of building + lazily expanding the recursion.\n const cyclic = ref ? this.cyclicAncestor(parent, schemaObj) : undefined;\n if (cyclic) {\n return this.fromRefCircRef(parent, cyclic, ref!);\n }\n\n // github's \"maybe empty\" anyOf (`anyOf: [member, {}]`): the fieldless member renders\n // nothing, so a single real member collapses to it. see docs/issues.md #20\n if (schemaObj.anyOf && !schemaObj.oneOf && !schemaObj.allOf) {\n const real = schemaObj.anyOf.filter((m) => !this.isShapelessObject(m as SchemaObject));\n if (real.length === 1) {\n return this.fromSchema(context, parent, real[0] as SchemaObject | ReferenceObject);\n }\n }\n\n // implied array: `items` present even without an explicit `type: array`. see docs/issues.md #4\n if (_.get(schemaObj, 'items') && (schemaObj.type === 'array' || schemaObj.type == null)) {\n result = this.createArrayType(parent, schemaObj, context);\n }\n // array case\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n schemaObj?.anyOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n result = this.createContainerType(parent, schemaObj, ref);\n }\n // a shapeless object (nothing but a boolean `additionalProperties`, or `{}`) declares no fields:\n // fall back to the JSON scalar — NOT an empty Obj, which generate() would skip, dangling the\n // reference. see docs/issues.md #19\n else if (this.isShapelessObject(schemaObj)) {\n result = new Scalar(parent, 'JSON', schemaObj);\n }\n // scalar\n else {\n result = this.createScalarType(schemaObj, parent);\n }\n\n // we could not infer a proper type\n if (result == null) {\n throw new Error(`Not yet implemented for ${JSON.stringify(schemaObj)}`);\n }\n\n return result;\n }\n\n /**\n * OAS 3.1 type arrays (`type: [\"string\",\"null\"]`) collapse to their first non-null entry:\n * GraphQL fields are nullable by default, so the \"null\" disjunct adds nothing. Normalized\n * in place (idempotent; `lookupRef` shares schema instances, so every reader sees it).\n * see docs/issues.md #23\n */\n private static normalizeTypeArray(schema: SchemaObject): void {\n const s = schema as Record<string, unknown>;\n if (Array.isArray(s.type)) {\n const real = (s.type as unknown[]).filter((t) => t && t !== 'null');\n s.type = real[0];\n }\n }\n\n // every member is a legal GraphQL enum value once trimmed (TMF637 ships `'aborted '`): a bare\n // identifier that isn't a boolean/null literal. Anything else (numbers, \"+1\", \"fast-forward\",\n // true) has no enum form. see #24\n private static isGqlEnum(schema: SchemaObject): boolean {\n const VALID_ENUM_VALUE = /^[_A-Za-z][_0-9A-Za-z]*$/;\n const RESERVED = new Set(['true', 'false', 'null']);\n return _.every(schema.enum, (value) => {\n if (typeof value !== 'string') return false;\n const trimmed = value.trim();\n return VALID_ENUM_VALUE.test(trimmed) && !RESERVED.has(trimmed);\n });\n }\n\n // Keywords that give a schema a renderable GraphQL shape; a schema with none is metadata-only. #5\n private static readonly SHAPE_KEYWORDS = [\n '$ref',\n 'type',\n 'enum',\n 'items',\n 'allOf',\n 'oneOf',\n 'anyOf',\n 'additionalProperties',\n ];\n\n /** True when a schema carries no renderable content (metadata only). see docs/issues.md #5 */\n public static isEmptySchema(schema: SchemaObject | ReferenceObject): boolean {\n const s = schema as Record<string, unknown>;\n return Factory.SHAPE_KEYWORDS.every((k) => s[k] == null) && _.isEmpty(s.properties);\n }\n\n /**\n * True for an object with no declared fields: no shape keyword except (at most) an explicit\n * object `type` and a boolean `additionalProperties` (`{}`, `{ additionalProperties: false }`,\n * `{ type: object, properties: {} }` — googlebooks `Empty`). A real map\n * (`additionalProperties: <schema>`) is NOT shapeless. see docs/issues.md #19, #31\n */\n public static isShapelessObject(schema: SchemaObject): boolean {\n const s = schema as Record<string, unknown>;\n const noShape = ['$ref', 'enum', 'items', 'allOf', 'oneOf', 'anyOf'].every((k) => s[k] == null);\n const objectOrUntyped = s.type == null || s.type === 'object';\n return noShape && objectOrUntyped && _.isEmpty(s.properties) && typeof s.additionalProperties !== 'object';\n }\n\n private static createScalarType(schema: SchemaObject | null, parent: IType) {\n const typeStr = schema?.type;\n if (typeStr != null) {\n if (typeStr === 'array') {\n throw new Error(`Should have been handled already? ${typeStr}, schema: ${JSON.stringify(schema)}`);\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, schema.enum! as string[]);\n }\n // scalar case\n else if (GqlUtils.gqlScalar(typeStr as string)) {\n const scalarType = GqlUtils.getGQLScalarType(schema!);\n return new Scalar(parent, scalarType, schema!);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle property type ${typeStr}, schema: ${JSON.stringify(schema)}`);\n }\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, _.get(schema, 'enum') as string[]);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle schema ${parent.pathToRoot()}, schema: ${JSON.stringify(schema)}`);\n }\n }\n\n private static createContainerType(parent: IType, schema: SchemaObject, ref?: string) {\n let result: IType | null;\n\n // composed object\n if (schema.allOf) {\n result = new Composed(parent, ref || _.get(schema, 'name'), schema);\n }\n // union\n else if (schema.oneOf || schema.anyOf) {\n const oneOfs = schema.oneOf || [];\n result = new Union(\n parent,\n ref || _.get(schema, 'name'),\n oneOfs as SchemaObject[],\n false,\n _.get(schema, 'discriminator'),\n );\n }\n // map (object with only additionalProperties)\n else if (this.isMapSchema(schema)) {\n result = new Map(parent, ref || _.get(schema, 'name') || null, schema);\n }\n // or a plain obj\n else {\n if (!schema.properties) {\n warn(\n null,\n '[factory]',\n 'Object has no properties: ' + JSON.stringify(schema, null, 2) + ' in: ' + parent.pathToRoot(),\n );\n }\n\n result = new Obj(parent, ref || _.get(schema, 'name') || null, schema);\n }\n\n return result;\n }\n\n private static isMapSchema(schema: SchemaObject): boolean {\n // A schema is considered a map if:\n // 1. It has additionalProperties defined as an object\n // 2. It has no explicit properties OR has empty properties\n return Boolean(\n schema.additionalProperties &&\n typeof schema.additionalProperties === 'object' &&\n (!schema.properties || _.isEmpty(schema.properties)),\n );\n }\n\n private static createArrayType(parent: IType | Res, schema: SchemaObject | null, context: OasContext) {\n // Array schema case.\n let parentName = parent.name;\n if (parent instanceof Res) {\n const get = parent.parent as Get; // Assume parent.parent is a GetOp.\n parentName = _.upperFirst(get.getGqlOpName());\n }\n\n const arr = new Arr(parent, parentName);\n const items = _.get(schema, 'items') as ArraySchemaObject;\n arr.items = items;\n\n // TODO: check this\n arr.itemsType = Factory.fromSchema(context, arr, items);\n arr.add(arr.itemsType); // add it to the children\n\n return arr;\n }\n\n public static fromProp(\n context: OasContext,\n parent: IType,\n propName: string,\n inputSchema: SchemaObject | ReferenceObject,\n ): Prop {\n if (!inputSchema) {\n throw new Error(`Should have a schema defined for property '${propName}' (parent: '${parent.name}')`);\n }\n\n let schema: SchemaObject | ReferenceObject | null = inputSchema;\n\n let prop: Prop;\n let ref: string | undefined;\n\n if (!_.get(schema, 'type') && '$ref' in schema) {\n ref = (schema as ReferenceObject).$ref;\n schema = context.lookupRef(ref);\n // this was a prop ref, but now needs to be returned as the ref directly?\n // prop = new PropRef(parent, propName, schema, ref);\n // return prop;\n }\n\n // uses the type of the schema to find out what kind of property it is\n const schemaObj = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n const type = schemaObj.type;\n\n if (type) {\n // 1st case is if the type is an array\n if (type === 'array') {\n const array = new PropArray(parent, propName, schema!);\n // const itemsName = Naming.genArrayItems(propName);\n\n const itemsSchema = _.get(schemaObj, 'items') as ArraySchemaObject;\n // const itemsType = Factory.fromProp(context, array, itemsName, itemsSchema); // TODO: re-test\n const itemsType = Factory.fromSchema(context, array, itemsSchema);\n\n array.setItems(itemsType);\n prop = array;\n\n // Array items resolve eagerly here, so if the item ref re-entered a schema on the path\n // (fromSchema returned the circular sentinel), bubble the cut up to the whole list field:\n // render `# children: [Node] — circular reference omitted`. see docs/issues.md #10\n if (itemsType instanceof CircularRef) {\n return new PropCircRef(parent, array);\n }\n }\n // 2nd checks for obj property\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(\n inner,\n ref || _.get(schemaObj, 'name'),\n schemaObj.oneOf as SchemaObject[],\n false,\n _.get(schemaObj, 'discriminator'),\n );\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n // Map property: object with only additionalProperties\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n } else {\n // the type of the property will be an object, which needs to be added as a child\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n } else if (ref && schemaObj?.enum) {\n if (this.isGqlEnum(schemaObj)) {\n const en: En = new En(\n parent,\n ref,\n schemaObj,\n (schemaObj.enum as string[]).map((v) => v.trim()),\n );\n prop = new PropEn(parent, propName, ref, schemaObj);\n prop.add(en);\n } else {\n // No GraphQL enum form for this one — degrade to the base scalar instead of emitting\n // an invalid definition: boolean/number enums (slack `ok: { enum: [true] }` ->\n // `ok: Boolean`) and string enums with non-identifier values (github reactions\n // `enum: [\"+1\", \"-1\", …]` -> String). see docs/issues.md #24\n prop = new PropScalar(parent, propName, GqlUtils.getGQLScalarType(schemaObj), schemaObj);\n }\n }\n // 3rd tries for scalar\n else if (GqlUtils.gqlScalar(type as string)) {\n const scalar = GqlUtils.gqlScalar(type as string);\n prop = new PropScalar(parent, propName, scalar as string, schemaObj);\n }\n // or we don't know how to handle this\n else {\n throw new Error('Cannot handle property type ' + type);\n }\n }\n // otherwise let's use the properties instead and assume an Obj\n // TODO: repeated code\n else if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(inner, ref || _.get(schemaObj, 'name'), schemaObj.oneOf as SchemaObject[]);\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n // Map property: object with only additionalProperties (no explicit type)\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n // default case, we don't know what to do so we'll create a scalar of type JSON\n else {\n prop = new PropScalar(parent, propName, 'JSON', schemaObj);\n }\n\n // Cut only a real loop: a field pointing back to a type we already passed through. Compare the schema,\n // not the field name — different types reuse field names (e.g. Adobe `extension_attributes`). docs/issues.md #36\n const cyclic = this.cyclicAncestor(parent, schemaObj);\n if (cyclic) {\n prop = new PropCircRef(parent, prop);\n }\n\n return prop;\n }\n\n /**\n * The nearest ancestor built from the same resolved component `$ref` (compared by `SchemaObject`\n * identity — `lookupRef` returns the same instance per ref), or undefined. Scoped to the current\n * expansion path (`ancestors()`), so a shared non-recursive component used by sibling fields is NOT\n * cut — only a schema that is its own ancestor. `schema` is undefined for inline (non-`$ref`) nodes,\n * which can never match an ancestor. see docs/issues.md #10\n */\n private static cyclicAncestor(parent: IType, schema?: SchemaObject): IType | undefined {\n if (!schema) return undefined;\n return parent.ancestors().find((a) => a.schema === schema);\n }\n\n /** Build the `fromSchema` circular sentinel (commented in both SDL + selection). see docs/issues.md #10 */\n public static fromRefCircRef(parent: IType, ancestor: IType, ref: string): IType {\n const node = new RefCircRef(parent, Naming.getRefName(ref) ?? ancestor.name);\n node.ref = ancestor;\n return node;\n }\n\n public static fromResponse(_context: OasContext, parent: IType, mediaSchema: SchemaObject): IType {\n return new Res(parent, 'r', mediaSchema);\n }\n\n public static fromParam(context: OasContext, parent: IType, p: ParameterObject | ReferenceObject): Param {\n let param: ParameterObject;\n\n if ('$ref' in p) {\n const ref: ReferenceObject = p as ReferenceObject;\n const schema = context.lookupParam(ref.$ref);\n\n if (!schema) {\n throw new Error('Schema not found for ref: ' + ref.$ref);\n }\n param = schema as ParameterObject;\n } else {\n param = p as ParameterObject;\n }\n\n const schema = param.schema as SchemaObject;\n const required = param.required === true;\n\n return new Param(parent, param.name, schema, required, schema.default, param);\n }\n\n public static fromCircularRef(parent: IType, child: IType): IType {\n const _tree = T.print(parent);\n\n const circularRef = new CircularRef(parent, child.name);\n circularRef.ref = child;\n return circularRef;\n }\n\n public static fromUnion(_context: OasContext, parent: IType, oneOfs: SchemaObject[]): IType {\n const union = new Union(parent, parent.name, oneOfs);\n parent.add(union);\n return union;\n }\n\n public static fromPost(name: string, op: Operation): Post {\n return new Post(name, op);\n }\n\n public static fromPut(name: string, op: Operation): Post {\n return new Put(name, op);\n }\n\n public static fromPatch(name: string, op: Operation): Post {\n return new Patch(name, op);\n }\n\n public static fromDelete(name: string, op: Operation): Post {\n return new Delete(name, op);\n }\n\n public static fromBody(_context: OasContext, parent: IType, schema: SchemaObject): IType {\n const body = new Body(parent, 'b', schema);\n parent.add(body);\n return body;\n }\n}\n"]}
|
package/dist/oas/nodes/obj.js
CHANGED
|
@@ -31,8 +31,9 @@ export class Obj extends Type {
|
|
|
31
31
|
if (!context.inContextOf('Composed', this)) {
|
|
32
32
|
trace(context, '[obj]', 'In object: ' + (this.name ? this.name : this.parent?.name));
|
|
33
33
|
}
|
|
34
|
-
//
|
|
35
|
-
|
|
34
|
+
// rename this inline if another shape already owns its name (#9), or it is a wrapper named after the
|
|
35
|
+
// component it lists (`group` over [Group]) — otherwise the two emit one clashing type. see #12, #37
|
|
36
|
+
if (T.collidesWithStoredType(this, context) || T.collidesWithContainedComponent(this)) {
|
|
36
37
|
T.resolveNameConflict(this, context);
|
|
37
38
|
}
|
|
38
39
|
this.visitProperties(context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obj.js","sourceRoot":"","sources":["../../../src/oas/nodes/obj.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arr, Body, Factory, Get, IType, PropArray, Type, Res, T } from './internal.js';\nimport { SchemaObject } from 'oas/types';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport type { EntityResolver } from './entity.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\n\nimport _ from 'lodash';\n\nexport class Obj extends Type {\n // R1: type-level entity resolvers discovered for this type (empty unless inferred).\n // Set by `inferEntityResolvers`; drives @key + type-level @connect/$this in generate().\n entityResolvers: EntityResolver[] = [];\n // R2: when promoted to a GraphQL interface (a shared allOf base of a discriminated oneOf),\n // emit `interface` instead of `type`. Id-neutral on purpose — `id` embeds `kind`, so we must\n // NOT mutate `kind` (it would desync generatedSet/dedup/deletion keys). Set by promoteInterfaces.\n emitAsInterface: boolean = false;\n\n constructor(\n parent: IType | undefined,\n name: string,\n public schema: SchemaObject,\n ) {\n super(parent, name);\n this.updateName();\n }\n\n public forPrompt(_context: OasContext): string {\n return `[object] ${Naming.getRefName(this.name)}`;\n }\n\n get id(): string {\n return `obj:${this.kind}:${this.name}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n context.enter(this);\n trace(context, '-> [obj:visit]', 'in ' + this.name);\n\n if (!context.inContextOf('Composed', this)) {\n trace(context, '[obj]', 'In object: ' + (this.name ? this.name : this.parent?.name));\n }\n\n // a different shape already owns this name — rename, or the two would merge into one type. see #9\n if (T.collidesWithStoredType(this, context)) {\n T.resolveNameConflict(this, context);\n }\n\n this.visitProperties(context);\n this.visited = true;\n\n // register as the occupant that later same-named types check against. see #9/#12\n if (this.name && !this.nameOwnedByAnother(context)) {\n context.store(this.name, this);\n }\n\n trace(context, '<- [obj:visit]', 'out ' + this.name);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n if (_.isEmpty(this.props)) {\n return;\n }\n\n if (context.inContextOf('Res', this)) {\n writer.write(Naming.genTypeName(this.name));\n return;\n }\n\n context.enter(this);\n trace(context, '-> [obj::generate]', `-> in: ${this.name}`);\n\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n\n writer\n .write(this.emitAsInterface ? 'interface ' : this.kind + ' ')\n .write(sanitised === refName ? refName : sanitised)\n .write(this.nameSuffix());\n\n // Entity resolution (R1): when this type was identified as an entity, emit one\n // repeatable @key per distinct key (sorted, deterministic) plus a type-level\n // @connect resolver per discovered GET-by-key endpoint. This is the modern\n // Connectors form — the resolver lives on the type via $this, keeping federation\n // plumbing off the public Query type.\n const resolvers = this.entityResolvers;\n if (resolvers.length > 0) {\n for (const key of Array.from(new Set(resolvers.map((r) => r.keyFields))).sort()) {\n writer.write(` @key(fields: \"${key}\")`);\n }\n for (const resolver of resolvers) {\n if (resolver.batch) {\n this.writeBatchConnector(context, writer, resolver, selection);\n } else {\n this.writeEntityConnector(context, writer, resolver, selection);\n }\n }\n writer.write('\\n{\\n');\n } else {\n writer.write(' {\\n');\n }\n\n const selected = this.selectedProps(selection);\n // #13: another node of this same schema may still have a field that cycle detection\n // removed from this one — emit that version of the field in the type definition. The\n // selections are not affected. see TypesCollector.collect / context.sdlPropOverrides\n const overrides = context.sdlPropOverrides.get(this);\n\n for (const prop of selected) {\n const emitted = (overrides?.get(prop.name) as typeof prop) ?? prop;\n trace(context, '-> [obj::generate]', `-> property: ${emitted.name} (parent: ${emitted.parent!.name})`);\n emitted.generate(context, writer, selection);\n }\n\n writer.write('}\\n\\n');\n\n trace(context, '<- [obj::generate]', `-> out: ${this.name}`);\n context.leave(this);\n }\n\n // the selected props (a cycle-cut one swapped for its #13 replacement, like generate does)\n dependencies(context: OasContext, selection: string[]): IType[] {\n const overrides = context.sdlPropOverrides.get(this);\n return this.selectedProps(selection).map((prop) => overrides?.get(prop.name) ?? prop);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n trace(context, '-> [obj::select]', `-> in: ${this.name}`);\n\n const selected = this.selectedProps(selection);\n for (const prop of selected) {\n prop.select(context, writer, selection);\n }\n\n trace(context, '<- [obj::select]', `-> out: ${this.name}`);\n }\n\n /**\n * Emit a type-level `@connect` entity resolver (R1). The resolver fetches this entity by\n * its key via the discovered GET-by-key endpoint, using `$this.<key>` (the entity's own\n * key fields) instead of the `$args.<name>` a Query-field connector would use. The\n * selection re-uses this object's own field selection, exactly like the response mapping\n * of the equivalent Query connector.\n */\n private writeEntityConnector(\n context: OasContext,\n writer: Writer,\n resolver: EntityResolver,\n selection: string[],\n ): void {\n const i4 = ' '.repeat(4);\n const i6 = ' '.repeat(6);\n\n // Rewrite each {param} to {$this.param} (vs {$args.param} for Query-field connectors).\n const path = resolver.path.replace(/\\{([a-zA-Z0-9]+)\\}/g, '{$this.$1}');\n\n writer\n .write('\\n')\n .write(i4)\n .write('@connect(\\n')\n .write(i6)\n .write(`source: \"${resolver.source}\"\\n`)\n .write(i6)\n .write(`http: { ${resolver.verb}: \"${path}\" }\\n`)\n .write(i6)\n .write('selection: \"\"\"\\n');\n\n // Base the selection at 6 spaces like a Query connector. `select` adds\n // `context.stack.length` (this object is mid-generation on the stack), so subtract it.\n context.indent = 6 - context.stack.length;\n this.select(context, writer, selection);\n\n writer.write(i6).write('\"\"\"\\n').write(i4).write(')');\n }\n\n // R6: a batch @connect — like writeEntityConnector, but $batch replaces $this, the keys ride in\n // the request (queryParams or body), and a `batch: { maxSize }` cap is added.\n private writeBatchConnector(\n context: OasContext,\n writer: Writer,\n resolver: EntityResolver,\n selection: string[],\n ): void {\n const i4 = ' '.repeat(4);\n const i6 = ' '.repeat(6);\n const i8 = ' '.repeat(8);\n const batchSpec = resolver.batch!;\n\n writer\n .write('\\n')\n .write(i4)\n .write('@connect(\\n')\n .write(i6)\n .write(`source: \"${resolver.source}\"\\n`)\n .write(i6)\n .write(`http: { ${resolver.verb}: \"${resolver.path}\"\\n`);\n\n // the keys: a query param (`id: $batch.id`) or a request body (`ids: $batch.id`)\n const label = batchSpec.queryParams ? 'queryParams' : 'body';\n const value = batchSpec.queryParams ?? batchSpec.body!;\n writer\n .write(i8)\n .write(`${label}: \"\"\"\\n`)\n .write(i8)\n .write(value + '\\n')\n .write(i8)\n .write('\"\"\"\\n')\n .write(i6)\n .write('}\\n');\n\n // selection reuses the entity's own fields; wrap as `$.results { … }` for a wrapped response\n writer.write(i6).write('selection: \"\"\"\\n');\n if (batchSpec.wrapperKey) {\n writer.write(i6).write(`$.${batchSpec.wrapperKey} {\\n`);\n }\n context.indent = (batchSpec.wrapperKey ? 8 : 6) - context.stack.length;\n this.select(context, writer, selection);\n if (batchSpec.wrapperKey) {\n writer.write(i6).write('}\\n');\n }\n writer.write(i6).write('\"\"\"\\n');\n\n writer.write(i6).write(`batch: { maxSize: ${batchSpec.maxSize} }\\n`).write(i4).write(')');\n }\n\n private visitProperties(context: OasContext): void {\n const hasProperties = this.schema.properties && Object.keys(this.schema.properties).length > 0;\n const hasAdditionalProperties =\n this.schema.additionalProperties && typeof this.schema.additionalProperties === 'object';\n\n if (!hasProperties && !hasAdditionalProperties) {\n return;\n }\n\n trace(\n context,\n '-> [obj::props]',\n `processing ${hasProperties ? 'properties' : ''}${hasProperties && hasAdditionalProperties ? ' and ' : ''}${hasAdditionalProperties ? 'additionalProperties' : ''}`,\n );\n\n if (hasProperties) {\n const properties = this.schema.properties as Record<string, SchemaObject>;\n const sorted = Object.entries(properties).sort((a, b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase()));\n\n for (const [key, schemaValue] of sorted) {\n const prop = Factory.fromProp(context, this, key, schemaValue);\n this.props.set(prop.name, prop);\n\n if (!this.children.includes(prop)) {\n this.add(prop);\n }\n }\n }\n\n if (hasAdditionalProperties) {\n const additionalProp = Factory.fromProp(\n context,\n this,\n '[key: string]',\n this.schema.additionalProperties as SchemaObject,\n );\n this.props.set(additionalProp.name, additionalProp);\n\n if (!this.children.includes(additionalProp)) {\n this.add(additionalProp);\n }\n }\n\n if (_.isArray(this.schema.required)) {\n this.schema.required.forEach((name) => {\n const prop = this.props.get(name);\n if (prop) prop!.required = true;\n });\n }\n\n trace(context, '<- [obj::props]', 'out props ' + this.props.size);\n }\n\n private updateName(): void {\n let name = this.name;\n // If we are an inline object named \"items\", try to create a better name.\n if (!name || name === 'items') {\n const parent = this.parent;\n const parentName = parent!.name;\n\n // is our parent an array?\n if (parent instanceof Arr || parent instanceof PropArray) {\n // if so, synthesize a name based on the parent name\n name = Naming.genTypeName(Naming.getRefName(parentName) + 'Item');\n }\n // if the parent is a response, we can use the operation name and append \"Response\"\n else if (parent instanceof Res) {\n const op = parent.parent as Get;\n name = op.getGqlOpName() + 'Response';\n }\n // for posts\n else if (parent instanceof Body) {\n // const op = parent.parent as Post;\n name = this.name + 'Input';\n }\n // if the parent is an object then we can use the parent name\n else if (parent instanceof Obj) {\n name = parentName + 'Obj';\n }\n // extreme case -- we synthesize an anonymous name\n else {\n name = `[inline:${this.parent!.name}]`;\n }\n }\n\n this.name = name;\n }\n\n // another non-ref type still owns this name (we were exempt from renaming) — don't replace it. see #9\n private nameOwnedByAnother(context: OasContext): boolean {\n return !T.isRef(this.name) && context.types.has(this.name);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"obj.js","sourceRoot":"","sources":["../../../src/oas/nodes/obj.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arr, Body, Factory, Get, IType, PropArray, Type, Res, T } from './internal.js';\nimport { SchemaObject } from 'oas/types';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport type { EntityResolver } from './entity.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\n\nimport _ from 'lodash';\n\nexport class Obj extends Type {\n // R1: type-level entity resolvers discovered for this type (empty unless inferred).\n // Set by `inferEntityResolvers`; drives @key + type-level @connect/$this in generate().\n entityResolvers: EntityResolver[] = [];\n // R2: when promoted to a GraphQL interface (a shared allOf base of a discriminated oneOf),\n // emit `interface` instead of `type`. Id-neutral on purpose — `id` embeds `kind`, so we must\n // NOT mutate `kind` (it would desync generatedSet/dedup/deletion keys). Set by promoteInterfaces.\n emitAsInterface: boolean = false;\n\n constructor(\n parent: IType | undefined,\n name: string,\n public schema: SchemaObject,\n ) {\n super(parent, name);\n this.updateName();\n }\n\n public forPrompt(_context: OasContext): string {\n return `[object] ${Naming.getRefName(this.name)}`;\n }\n\n get id(): string {\n return `obj:${this.kind}:${this.name}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n context.enter(this);\n trace(context, '-> [obj:visit]', 'in ' + this.name);\n\n if (!context.inContextOf('Composed', this)) {\n trace(context, '[obj]', 'In object: ' + (this.name ? this.name : this.parent?.name));\n }\n\n // rename this inline if another shape already owns its name (#9), or it is a wrapper named after the\n // component it lists (`group` over [Group]) — otherwise the two emit one clashing type. see #12, #37\n if (T.collidesWithStoredType(this, context) || T.collidesWithContainedComponent(this)) {\n T.resolveNameConflict(this, context);\n }\n\n this.visitProperties(context);\n this.visited = true;\n\n // register as the occupant that later same-named types check against. see #9/#12\n if (this.name && !this.nameOwnedByAnother(context)) {\n context.store(this.name, this);\n }\n\n trace(context, '<- [obj:visit]', 'out ' + this.name);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n if (_.isEmpty(this.props)) {\n return;\n }\n\n if (context.inContextOf('Res', this)) {\n writer.write(Naming.genTypeName(this.name));\n return;\n }\n\n context.enter(this);\n trace(context, '-> [obj::generate]', `-> in: ${this.name}`);\n\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n\n writer\n .write(this.emitAsInterface ? 'interface ' : this.kind + ' ')\n .write(sanitised === refName ? refName : sanitised)\n .write(this.nameSuffix());\n\n // Entity resolution (R1): when this type was identified as an entity, emit one\n // repeatable @key per distinct key (sorted, deterministic) plus a type-level\n // @connect resolver per discovered GET-by-key endpoint. This is the modern\n // Connectors form — the resolver lives on the type via $this, keeping federation\n // plumbing off the public Query type.\n const resolvers = this.entityResolvers;\n if (resolvers.length > 0) {\n for (const key of Array.from(new Set(resolvers.map((r) => r.keyFields))).sort()) {\n writer.write(` @key(fields: \"${key}\")`);\n }\n for (const resolver of resolvers) {\n if (resolver.batch) {\n this.writeBatchConnector(context, writer, resolver, selection);\n } else {\n this.writeEntityConnector(context, writer, resolver, selection);\n }\n }\n writer.write('\\n{\\n');\n } else {\n writer.write(' {\\n');\n }\n\n const selected = this.selectedProps(selection);\n // #13: another node of this same schema may still have a field that cycle detection\n // removed from this one — emit that version of the field in the type definition. The\n // selections are not affected. see TypesCollector.collect / context.sdlPropOverrides\n const overrides = context.sdlPropOverrides.get(this);\n\n for (const prop of selected) {\n const emitted = (overrides?.get(prop.name) as typeof prop) ?? prop;\n trace(context, '-> [obj::generate]', `-> property: ${emitted.name} (parent: ${emitted.parent!.name})`);\n emitted.generate(context, writer, selection);\n }\n\n writer.write('}\\n\\n');\n\n trace(context, '<- [obj::generate]', `-> out: ${this.name}`);\n context.leave(this);\n }\n\n // the selected props (a cycle-cut one swapped for its #13 replacement, like generate does)\n dependencies(context: OasContext, selection: string[]): IType[] {\n const overrides = context.sdlPropOverrides.get(this);\n return this.selectedProps(selection).map((prop) => overrides?.get(prop.name) ?? prop);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n trace(context, '-> [obj::select]', `-> in: ${this.name}`);\n\n const selected = this.selectedProps(selection);\n for (const prop of selected) {\n prop.select(context, writer, selection);\n }\n\n trace(context, '<- [obj::select]', `-> out: ${this.name}`);\n }\n\n /**\n * Emit a type-level `@connect` entity resolver (R1). The resolver fetches this entity by\n * its key via the discovered GET-by-key endpoint, using `$this.<key>` (the entity's own\n * key fields) instead of the `$args.<name>` a Query-field connector would use. The\n * selection re-uses this object's own field selection, exactly like the response mapping\n * of the equivalent Query connector.\n */\n private writeEntityConnector(\n context: OasContext,\n writer: Writer,\n resolver: EntityResolver,\n selection: string[],\n ): void {\n const i4 = ' '.repeat(4);\n const i6 = ' '.repeat(6);\n\n // Rewrite each {param} to {$this.param} (vs {$args.param} for Query-field connectors).\n const path = resolver.path.replace(/\\{([a-zA-Z0-9]+)\\}/g, '{$this.$1}');\n\n writer\n .write('\\n')\n .write(i4)\n .write('@connect(\\n')\n .write(i6)\n .write(`source: \"${resolver.source}\"\\n`)\n .write(i6)\n .write(`http: { ${resolver.verb}: \"${path}\" }\\n`)\n .write(i6)\n .write('selection: \"\"\"\\n');\n\n // Base the selection at 6 spaces like a Query connector. `select` adds\n // `context.stack.length` (this object is mid-generation on the stack), so subtract it.\n context.indent = 6 - context.stack.length;\n this.select(context, writer, selection);\n\n writer.write(i6).write('\"\"\"\\n').write(i4).write(')');\n }\n\n // R6: a batch @connect — like writeEntityConnector, but $batch replaces $this, the keys ride in\n // the request (queryParams or body), and a `batch: { maxSize }` cap is added.\n private writeBatchConnector(\n context: OasContext,\n writer: Writer,\n resolver: EntityResolver,\n selection: string[],\n ): void {\n const i4 = ' '.repeat(4);\n const i6 = ' '.repeat(6);\n const i8 = ' '.repeat(8);\n const batchSpec = resolver.batch!;\n\n writer\n .write('\\n')\n .write(i4)\n .write('@connect(\\n')\n .write(i6)\n .write(`source: \"${resolver.source}\"\\n`)\n .write(i6)\n .write(`http: { ${resolver.verb}: \"${resolver.path}\"\\n`);\n\n // the keys: a query param (`id: $batch.id`) or a request body (`ids: $batch.id`)\n const label = batchSpec.queryParams ? 'queryParams' : 'body';\n const value = batchSpec.queryParams ?? batchSpec.body!;\n writer\n .write(i8)\n .write(`${label}: \"\"\"\\n`)\n .write(i8)\n .write(value + '\\n')\n .write(i8)\n .write('\"\"\"\\n')\n .write(i6)\n .write('}\\n');\n\n // selection reuses the entity's own fields; wrap as `$.results { … }` for a wrapped response\n writer.write(i6).write('selection: \"\"\"\\n');\n if (batchSpec.wrapperKey) {\n writer.write(i6).write(`$.${batchSpec.wrapperKey} {\\n`);\n }\n context.indent = (batchSpec.wrapperKey ? 8 : 6) - context.stack.length;\n this.select(context, writer, selection);\n if (batchSpec.wrapperKey) {\n writer.write(i6).write('}\\n');\n }\n writer.write(i6).write('\"\"\"\\n');\n\n writer.write(i6).write(`batch: { maxSize: ${batchSpec.maxSize} }\\n`).write(i4).write(')');\n }\n\n private visitProperties(context: OasContext): void {\n const hasProperties = this.schema.properties && Object.keys(this.schema.properties).length > 0;\n const hasAdditionalProperties =\n this.schema.additionalProperties && typeof this.schema.additionalProperties === 'object';\n\n if (!hasProperties && !hasAdditionalProperties) {\n return;\n }\n\n trace(\n context,\n '-> [obj::props]',\n `processing ${hasProperties ? 'properties' : ''}${hasProperties && hasAdditionalProperties ? ' and ' : ''}${hasAdditionalProperties ? 'additionalProperties' : ''}`,\n );\n\n if (hasProperties) {\n const properties = this.schema.properties as Record<string, SchemaObject>;\n const sorted = Object.entries(properties).sort((a, b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase()));\n\n for (const [key, schemaValue] of sorted) {\n const prop = Factory.fromProp(context, this, key, schemaValue);\n this.props.set(prop.name, prop);\n\n if (!this.children.includes(prop)) {\n this.add(prop);\n }\n }\n }\n\n if (hasAdditionalProperties) {\n const additionalProp = Factory.fromProp(\n context,\n this,\n '[key: string]',\n this.schema.additionalProperties as SchemaObject,\n );\n this.props.set(additionalProp.name, additionalProp);\n\n if (!this.children.includes(additionalProp)) {\n this.add(additionalProp);\n }\n }\n\n if (_.isArray(this.schema.required)) {\n this.schema.required.forEach((name) => {\n const prop = this.props.get(name);\n if (prop) prop!.required = true;\n });\n }\n\n trace(context, '<- [obj::props]', 'out props ' + this.props.size);\n }\n\n private updateName(): void {\n let name = this.name;\n // If we are an inline object named \"items\", try to create a better name.\n if (!name || name === 'items') {\n const parent = this.parent;\n const parentName = parent!.name;\n\n // is our parent an array?\n if (parent instanceof Arr || parent instanceof PropArray) {\n // if so, synthesize a name based on the parent name\n name = Naming.genTypeName(Naming.getRefName(parentName) + 'Item');\n }\n // if the parent is a response, we can use the operation name and append \"Response\"\n else if (parent instanceof Res) {\n const op = parent.parent as Get;\n name = op.getGqlOpName() + 'Response';\n }\n // for posts\n else if (parent instanceof Body) {\n // const op = parent.parent as Post;\n name = this.name + 'Input';\n }\n // if the parent is an object then we can use the parent name\n else if (parent instanceof Obj) {\n name = parentName + 'Obj';\n }\n // extreme case -- we synthesize an anonymous name\n else {\n name = `[inline:${this.parent!.name}]`;\n }\n }\n\n this.name = name;\n }\n\n // another non-ref type still owns this name (we were exempt from renaming) — don't replace it. see #9\n private nameOwnedByAnother(context: OasContext): boolean {\n return !T.isRef(this.name) && context.types.has(this.name);\n }\n}\n"]}
|
package/dist/oas/nodes/type.js
CHANGED
|
@@ -105,13 +105,15 @@ export class Type {
|
|
|
105
105
|
return builder;
|
|
106
106
|
}
|
|
107
107
|
add(child) {
|
|
108
|
-
const
|
|
109
|
-
const
|
|
108
|
+
const ancestors = this.ancestors();
|
|
109
|
+
const sameId = ancestors.find((p) => p.id === child.id);
|
|
110
|
+
// Same fix as factory.ts (fromProp), here when attaching a field to its parent: a shared field name is
|
|
111
|
+
// not a loop — compare the schema. docs/issues.md #36
|
|
112
|
+
const isCycle = sameId !== undefined && sameId.schema === child.schema;
|
|
110
113
|
let pushed = child;
|
|
111
|
-
if (
|
|
112
|
-
trace(null, '-> [type:add]', '
|
|
113
|
-
const
|
|
114
|
-
const wrapper = Factory.fromCircularRef(this, ancestor);
|
|
114
|
+
if (isCycle) {
|
|
115
|
+
trace(null, '-> [type:add]', 'cycle (same schema instance): ' + child.id);
|
|
116
|
+
const wrapper = Factory.fromCircularRef(this, sameId);
|
|
115
117
|
this.children.push(wrapper);
|
|
116
118
|
pushed = wrapper;
|
|
117
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/oas/nodes/type.ts"],"names":[],"mappings":"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","sourcesContent":["import { IType, Kind, Prop } from './internal.js';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Factory } from './factory.js';\nimport { Naming } from '../utils/naming.js';\n\n// Build (once per selection array, cached by identity) the set of all `>`-boundary prefixes of every\n// selection entry. `someEntry.startsWith(path)` for a `>`-joined `path` is then exactly\n// `prefixes.has(path)`, turning per-prop membership from O(selection) into O(1). The same expanded\n// selection array is threaded through generation, so the WeakMap is built once and reused. see #10\nconst selectionPrefixCache = new WeakMap<string[], Set<string>>();\nexport function selectionPrefixes(selection: string[]): Set<string> {\n let prefixes = selectionPrefixCache.get(selection);\n if (prefixes) return prefixes;\n prefixes = new Set<string>();\n for (const entry of selection) {\n prefixes.add(entry);\n for (let i = entry.indexOf('>'); i !== -1; i = entry.indexOf('>', i + 1)) {\n prefixes.add(entry.slice(0, i));\n }\n }\n selectionPrefixCache.set(selection, prefixes);\n return prefixes;\n}\n\nexport abstract class Type implements IType {\n public parent?: IType;\n public name: string;\n public children: IType[];\n public circularRef?: IType;\n public kind: Kind;\n public visited: boolean;\n\n private readonly _props: Map<string, Prop>;\n\n protected constructor(parent: IType | undefined, name: string) {\n this.parent = parent;\n this.name = name;\n this.children = [];\n this.visited = false;\n this._props = new Map<string, Prop>();\n this.kind = parent?.kind || 'type';\n }\n\n public abstract visit(context: OasContext): void;\n\n public abstract forPrompt(context: OasContext): string;\n\n public abstract select(context: OasContext, writer: Writer, selection: string[]): void;\n\n // The nodes this node's written output needs (a field's target type, a wrapper's payload, a\n // map's value …). Leaves return nothing. Overridden per class, next to the code it mirrors.\n public dependencies(_context: OasContext, _selection: string[]): IType[] {\n return [];\n }\n\n // children are addressed by id (name-derived): two same-named siblings would collapse into\n // one path — suffix the duplicate (`[inline:Input]`, `[inline:Input]:1`). see #34\n protected withUniqueName(child: IType): IType {\n let name = child.name;\n let idx = 0;\n while (this.children.some((c) => c.name === name)) {\n name = `${child.name}:${++idx}`;\n }\n child.name = name;\n return child;\n }\n\n public find(path: string, collection: IType[]): IType | boolean {\n const parts = path.split('>');\n let current: IType | undefined;\n\n let i = 0;\n do {\n const part = parts[i];\n\n current = collection.find((t) => t.id === part);\n if (!current) {\n return false;\n }\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n // console.log(\"found\", current);\n\n i++;\n } while (i < parts.length);\n\n return current || false;\n }\n\n public expand(context: OasContext): IType[] {\n trace(context, '-> [expand]', `in: path: ${this.path()}`);\n if (!this.visited) {\n this.visit(context);\n }\n\n trace(context, '<- [expand]', `out: path: ${this.path()}`);\n\n // TODO:\n // if ((type instanceof Composed || type instanceof Union) && !type.getProps().isEmpty()) {\n // return type.props?.values() || [];\n // }\n // else {\n return this.children;\n // }\n }\n\n public abstract generate(context: OasContext, writer: Writer, selection: string[]): void;\n\n get id() {\n return this.name;\n }\n\n get props() {\n return this._props;\n }\n\n public ancestors(): IType[] {\n return this.parent ? [...this.parent.ancestors(), this] : [this];\n }\n\n public path(): string {\n const ancestors = this.ancestors();\n return Naming.abbreviateRef(ancestors.map((t) => t.id).join('>'));\n }\n\n public pathToRoot(): string {\n let builder = '';\n let indent = 0;\n\n const ancestors = this.ancestors();\n for (let i = 0; i < ancestors.length; i++) {\n builder += ' <- ' + ' '.repeat(indent++) + ancestors[i].id + ' (' + ancestors[i].constructor.name + ')\\n';\n }\n\n return builder;\n }\n\n public add(child: IType): IType {\n const paths: IType[] = this.ancestors();\n const contains: boolean = paths.map((p) => p.id).includes(child.id);\n let pushed = child;\n\n if (contains) {\n trace(null, '-> [type:add]', 'already contains child: ' + child.id);\n const ancestor: IType = paths[paths.map((p) => p.id).indexOf(child.id)];\n const wrapper = Factory.fromCircularRef(this, ancestor);\n this.children.push(wrapper);\n pushed = wrapper;\n } else {\n this.children.push(child);\n }\n\n return pushed;\n }\n\n public selectedProps(selection: string[]) {\n // A prop is selected when some selection entry starts with its path. Done naively\n // (`selection.find(s => s.startsWith(prop.path()))`) this is O(props x selection) with a\n // path() rebuild per entry, which blows up on large recursive type sets (2700+ types x 20k\n // selection entries -> billions of ops; see docs/issues.md #10). Index the selection once into\n // its set of `>`-boundary prefixes, then membership is O(1) per prop.\n const prefixes = selectionPrefixes(selection);\n return Array.from(this.props.values()).filter((prop) => prefixes.has(prop.path()));\n }\n\n nameSuffix(): string {\n return this.kind === 'input' ? 'Input' : '';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/oas/nodes/type.ts"],"names":[],"mappings":"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","sourcesContent":["import { IType, Kind, Prop } from './internal.js';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Factory } from './factory.js';\nimport { Naming } from '../utils/naming.js';\n\n// Build (once per selection array, cached by identity) the set of all `>`-boundary prefixes of every\n// selection entry. `someEntry.startsWith(path)` for a `>`-joined `path` is then exactly\n// `prefixes.has(path)`, turning per-prop membership from O(selection) into O(1). The same expanded\n// selection array is threaded through generation, so the WeakMap is built once and reused. see #10\nconst selectionPrefixCache = new WeakMap<string[], Set<string>>();\nexport function selectionPrefixes(selection: string[]): Set<string> {\n let prefixes = selectionPrefixCache.get(selection);\n if (prefixes) return prefixes;\n prefixes = new Set<string>();\n for (const entry of selection) {\n prefixes.add(entry);\n for (let i = entry.indexOf('>'); i !== -1; i = entry.indexOf('>', i + 1)) {\n prefixes.add(entry.slice(0, i));\n }\n }\n selectionPrefixCache.set(selection, prefixes);\n return prefixes;\n}\n\nexport abstract class Type implements IType {\n public parent?: IType;\n public name: string;\n public children: IType[];\n public circularRef?: IType;\n public kind: Kind;\n public visited: boolean;\n\n private readonly _props: Map<string, Prop>;\n\n protected constructor(parent: IType | undefined, name: string) {\n this.parent = parent;\n this.name = name;\n this.children = [];\n this.visited = false;\n this._props = new Map<string, Prop>();\n this.kind = parent?.kind || 'type';\n }\n\n public abstract visit(context: OasContext): void;\n\n public abstract forPrompt(context: OasContext): string;\n\n public abstract select(context: OasContext, writer: Writer, selection: string[]): void;\n\n // The nodes this node's written output needs (a field's target type, a wrapper's payload, a\n // map's value …). Leaves return nothing. Overridden per class, next to the code it mirrors.\n public dependencies(_context: OasContext, _selection: string[]): IType[] {\n return [];\n }\n\n // children are addressed by id (name-derived): two same-named siblings would collapse into\n // one path — suffix the duplicate (`[inline:Input]`, `[inline:Input]:1`). see #34\n protected withUniqueName(child: IType): IType {\n let name = child.name;\n let idx = 0;\n while (this.children.some((c) => c.name === name)) {\n name = `${child.name}:${++idx}`;\n }\n child.name = name;\n return child;\n }\n\n public find(path: string, collection: IType[]): IType | boolean {\n const parts = path.split('>');\n let current: IType | undefined;\n\n let i = 0;\n do {\n const part = parts[i];\n\n current = collection.find((t) => t.id === part);\n if (!current) {\n return false;\n }\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n // console.log(\"found\", current);\n\n i++;\n } while (i < parts.length);\n\n return current || false;\n }\n\n public expand(context: OasContext): IType[] {\n trace(context, '-> [expand]', `in: path: ${this.path()}`);\n if (!this.visited) {\n this.visit(context);\n }\n\n trace(context, '<- [expand]', `out: path: ${this.path()}`);\n\n // TODO:\n // if ((type instanceof Composed || type instanceof Union) && !type.getProps().isEmpty()) {\n // return type.props?.values() || [];\n // }\n // else {\n return this.children;\n // }\n }\n\n public abstract generate(context: OasContext, writer: Writer, selection: string[]): void;\n\n get id() {\n return this.name;\n }\n\n get props() {\n return this._props;\n }\n\n public ancestors(): IType[] {\n return this.parent ? [...this.parent.ancestors(), this] : [this];\n }\n\n public path(): string {\n const ancestors = this.ancestors();\n return Naming.abbreviateRef(ancestors.map((t) => t.id).join('>'));\n }\n\n public pathToRoot(): string {\n let builder = '';\n let indent = 0;\n\n const ancestors = this.ancestors();\n for (let i = 0; i < ancestors.length; i++) {\n builder += ' <- ' + ' '.repeat(indent++) + ancestors[i].id + ' (' + ancestors[i].constructor.name + ')\\n';\n }\n\n return builder;\n }\n\n public add(child: IType): IType {\n const ancestors: IType[] = this.ancestors();\n const sameId = ancestors.find((p) => p.id === child.id);\n // Same fix as factory.ts (fromProp), here when attaching a field to its parent: a shared field name is\n // not a loop — compare the schema. docs/issues.md #36\n const isCycle = sameId !== undefined && sameId.schema === child.schema;\n let pushed = child;\n\n if (isCycle) {\n trace(null, '-> [type:add]', 'cycle (same schema instance): ' + child.id);\n const wrapper = Factory.fromCircularRef(this, sameId!);\n this.children.push(wrapper);\n pushed = wrapper;\n } else {\n this.children.push(child);\n }\n\n return pushed;\n }\n\n public selectedProps(selection: string[]) {\n // A prop is selected when some selection entry starts with its path. Done naively\n // (`selection.find(s => s.startsWith(prop.path()))`) this is O(props x selection) with a\n // path() rebuild per entry, which blows up on large recursive type sets (2700+ types x 20k\n // selection entries -> billions of ops; see docs/issues.md #10). Index the selection once into\n // its set of `>`-boundary prefixes, then membership is O(1) per prop.\n const prefixes = selectionPrefixes(selection);\n return Array.from(this.props.values()).filter((prop) => prefixes.has(prop.path()));\n }\n\n nameSuffix(): string {\n return this.kind === 'input' ? 'Input' : '';\n }\n}\n"]}
|
|
@@ -12,10 +12,12 @@ export declare class T {
|
|
|
12
12
|
static isContainer(node: IType): boolean;
|
|
13
13
|
static composables(node: IType): IType[];
|
|
14
14
|
static print(node: IType, prefix?: string, isLast?: boolean): string;
|
|
15
|
-
static isRef(name: string): boolean;
|
|
15
|
+
static isRef(name: string | undefined): boolean;
|
|
16
16
|
static findNonPropParent(type: IType): IType;
|
|
17
17
|
static isScalarArray(type: IType): boolean;
|
|
18
18
|
static collidesWithStoredType(node: IType, context: OasContext): boolean;
|
|
19
|
+
static collidesWithContainedComponent(node: IType): boolean;
|
|
20
|
+
private static componentSchemaRef;
|
|
19
21
|
static collidesAcrossNodeClasses(node: IType, context: OasContext): boolean;
|
|
20
22
|
static resolveNameConflict(node: IType, context: OasContext): void;
|
|
21
23
|
private static isExemptFromRename;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Arr, CircularRef, En, Get, Obj, Prop, PropArray, PropEn, PropScalar, Scalar } from './internal.js';
|
|
1
|
+
import { Arr, CircularRef, En, Get, Obj, Prop, PropArray, PropEn, PropScalar, Scalar, } from './internal.js';
|
|
2
2
|
import _ from 'lodash';
|
|
3
3
|
import { Naming } from '../utils/naming.js';
|
|
4
4
|
export class T {
|
|
@@ -68,8 +68,9 @@ export class T {
|
|
|
68
68
|
});
|
|
69
69
|
return result;
|
|
70
70
|
}
|
|
71
|
+
// A missing name is not a component reference.
|
|
71
72
|
static isRef(name) {
|
|
72
|
-
return name.startsWith('#/components/');
|
|
73
|
+
return !!name && name.startsWith('#/components/');
|
|
73
74
|
}
|
|
74
75
|
static findNonPropParent(type) {
|
|
75
76
|
let parent = type;
|
|
@@ -83,7 +84,7 @@ export class T {
|
|
|
83
84
|
}
|
|
84
85
|
// The occupant is the type already stored under our name: a different shape collides (rename,
|
|
85
86
|
// see #9/#12); a same-schema occupant dedups instead — renaming it would orphan it (see #18).
|
|
86
|
-
//
|
|
87
|
+
// e.g. (googlebooks):
|
|
87
88
|
// saleInfo: { listPrice: { amount } } <- visited first, stored as `listPrice`
|
|
88
89
|
// offersItem: { listPrice: { amountInMicros } } <- same name, different shape -> collides
|
|
89
90
|
static collidesWithStoredType(node, context) {
|
|
@@ -96,6 +97,49 @@ export class T {
|
|
|
96
97
|
}
|
|
97
98
|
return !T.isSameInlineDefinition(node, occupant);
|
|
98
99
|
}
|
|
100
|
+
// Detects an inline object that shares its name with a component it holds — the wrapper `group`
|
|
101
|
+
// holding `results: [#/components/schemas/Group]`. Renaming it avoids a duplicate `type Group`. We
|
|
102
|
+
// read the object's own schema (rather than the built tree) because the `Group` component is reached
|
|
103
|
+
// through `results`, which the parser expands only after this object is built. see #12, #37.
|
|
104
|
+
// group:
|
|
105
|
+
// type: object
|
|
106
|
+
// properties:
|
|
107
|
+
// results: { type: array, items: { $ref: '#/components/schemas/Group' } }
|
|
108
|
+
// size: { type: integer }
|
|
109
|
+
static collidesWithContainedComponent(node) {
|
|
110
|
+
if (!(node instanceof Obj) || T.isExemptFromRename(node)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
const ownName = Naming.genTypeName(node.name);
|
|
114
|
+
return Object.values(node.schema?.properties ?? {}).some((prop) => {
|
|
115
|
+
const ref = T.componentSchemaRef(prop);
|
|
116
|
+
return ref != null && Naming.genTypeName(Naming.getRefName(ref)) === ownName;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// The schema component ref a property targets — directly, or as the items of an array — or null.
|
|
120
|
+
// An "array" includes the implied form (`items` with no `type`, per factory.ts:83). Schema refs are
|
|
121
|
+
// the ones that become a `type X`.
|
|
122
|
+
// group: { $ref: '#/components/schemas/Group' } -> #/components/schemas/Group
|
|
123
|
+
// results: { type: array, items: { $ref: '#/components/schemas/Group' } } -> #/components/schemas/Group
|
|
124
|
+
// results: { items: { $ref: '#/components/schemas/Group' } } -> #/components/schemas/Group
|
|
125
|
+
static componentSchemaRef(schema) {
|
|
126
|
+
if (schema == null)
|
|
127
|
+
return null;
|
|
128
|
+
let ref;
|
|
129
|
+
if ('$ref' in schema) {
|
|
130
|
+
ref = schema.$ref;
|
|
131
|
+
}
|
|
132
|
+
// array (explicit, or implied via `items`) — take the items' ref
|
|
133
|
+
else if (schema.type === 'array' || schema.type == null) {
|
|
134
|
+
const itemsRef = _.get(schema, 'items.$ref');
|
|
135
|
+
ref = typeof itemsRef === 'string' ? itemsRef : undefined;
|
|
136
|
+
}
|
|
137
|
+
// keep only schema-component refs (the ones that emit a clashing type)
|
|
138
|
+
if (ref == null || !ref.startsWith('#/components/schemas/')) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return ref;
|
|
142
|
+
}
|
|
99
143
|
// an occupant of a DIFFERENT class always emits a second definition of the name — ids start
|
|
100
144
|
// with the class (`obj:`/`comp:`), so the collector can never dedup the two. A same-class
|
|
101
145
|
// occupant keeps the old dedup-by-id behaviour: renaming those orphans twins that differ only
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeUtils.js","sourceRoot":"","sources":["../../../src/oas/nodes/typeUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arr, CircularRef, En, Get, IType, Obj, Op, Prop, PropArray, PropEn, PropScalar, Scalar } from './internal.js';\nimport _ from 'lodash';\nimport { Naming } from '../utils/naming.js';\nimport type { OasContext } from '../oasContext.js';\n\nexport class T {\n public static isLeaf(type: IType): boolean {\n return (\n type instanceof Scalar ||\n type instanceof PropScalar ||\n type instanceof En ||\n type instanceof PropEn ||\n type instanceof CircularRef ||\n (type instanceof PropArray && type.items instanceof Scalar) ||\n (type instanceof Obj && _.isEmpty(type.props)) ||\n T.isScalarArray(type)\n );\n }\n\n public static isPropScalar(type: IType): boolean {\n return type instanceof PropScalar;\n }\n\n // every operation node (Get, Post, Put, Patch, Delete) derives from Get\n public static isOp(type: IType): type is IType & Op {\n return type instanceof Get;\n }\n\n public static traverse(node: IType, callback: (node: IType) => void): void {\n const traverseNode = (n: IType): void => {\n callback(n);\n\n for (const c of n.children) {\n traverseNode(c);\n }\n };\n\n traverseNode(node);\n }\n\n static isMutationType(type: IType): boolean {\n return (\n type.id.startsWith('post:') ||\n type.id.startsWith('put:') ||\n type.id.startsWith('patch:') ||\n type.id.startsWith('del:')\n );\n }\n\n static isScalar(type: IType): boolean {\n return type.id.startsWith('scalar:');\n }\n\n public static containers(node: IType) {\n return Array.from(node.children.values())\n .filter((child) => !(child instanceof Prop) && T.isContainer(child))\n .map((child) => child);\n }\n\n // emitted as its own definition in the schema (`type X` / `enum X`), unlike props, wrappers,\n // scalars and cycle cuts which only appear inside other definitions\n public static isEmittable(node: IType): boolean {\n return T.isContainer(node) || node.id.startsWith('enum:');\n }\n\n public static isContainer(node: IType): boolean {\n return (\n node.id.startsWith('obj:') ||\n node.id.startsWith('comp:') ||\n node.id.startsWith('union:') ||\n node.id.startsWith('map:')\n );\n }\n\n static composables(node: IType): IType[] {\n return _.filter(T.containers(node), (e: IType) => e.id.startsWith('comp:')); // || e.id.startsWith('union:'));\n }\n\n public static print(node: IType, prefix: string = '', isLast: boolean = true): string {\n // Build the current line with the appropriate connector.\n const connector = prefix === '' ? '' : isLast ? '└─ ' : '├─ ';\n let result = prefix + connector + node.id + '\\n';\n\n // Prepare the prefix for the children.\n const childPrefix = prefix + (isLast ? ' ' : '│ ');\n\n node.children.forEach((child, index) => {\n const last = index === node.children.length - 1;\n result += T.print(child, childPrefix, last);\n });\n\n return result;\n }\n\n public static isRef(name: string) {\n return name.startsWith('#/components/');\n }\n\n public static findNonPropParent(type: IType) {\n let parent = type;\n while (parent instanceof Prop) {\n parent = parent.parent!;\n }\n return parent;\n }\n\n public static isScalarArray(type: IType) {\n return type instanceof Arr && type.itemsType instanceof Scalar;\n }\n\n // The occupant is the type already stored under our name: a different shape collides (rename,\n // see #9/#12); a same-schema occupant dedups instead — renaming it would orphan it (see #18).\n // Shared by Obj and by PropComp-named Composed (see docs/issues.md #22). e.g. (googlebooks):\n // saleInfo: { listPrice: { amount } } <- visited first, stored as `listPrice`\n // offersItem: { listPrice: { amountInMicros } } <- same name, different shape -> collides\n public static collidesWithStoredType(node: IType, context: OasContext): boolean {\n if (T.isExemptFromRename(node)) {\n return false;\n }\n const occupant = T.storedOccupant(node, context);\n if (!occupant) {\n return false;\n }\n return !T.isSameInlineDefinition(node, occupant);\n }\n\n // an occupant of a DIFFERENT class always emits a second definition of the name — ids start\n // with the class (`obj:`/`comp:`), so the collector can never dedup the two. A same-class\n // occupant keeps the old dedup-by-id behaviour: renaming those orphans twins that differ only\n // in description (File/Folder `created_by`). see #22. e.g. (box):\n // SharedLink: { permissions: { type: object, … } } <- Obj, stored as `permissions`\n // File--Full: { permissions: { allOf: […] } } <- Composed `Permissions` -> must rename\n public static collidesAcrossNodeClasses(node: IType, context: OasContext): boolean {\n if (T.isExemptFromRename(node)) {\n return false;\n }\n const occupant = T.storedOccupant(node, context);\n return !!occupant && occupant.constructor !== node.constructor;\n }\n\n // Qualify a colliding inline name with its container (nearest non-prop ancestor), e.g. `listPrice`\n // under `offersItem` -> `OffersItemListPrice`, bumping `2`, `3`… until free. Both parts go through\n // genTypeName so the result is always a valid identifier (the container name may itself be an\n // `[inline:…]` placeholder) and is idempotent under emission. see docs/issues.md #9\n public static resolveNameConflict(node: IType, context: OasContext): void {\n const base = Naming.genTypeName(T.findNonPropParent(node.parent!).name) + Naming.genTypeName(node.name);\n let candidate = base;\n for (let n = 2; context.types.has(candidate); n++) {\n if (T.canConvergeOn(node, context.types.get(candidate), candidate)) {\n break;\n }\n candidate = `${base}${n}`;\n }\n node.name = candidate;\n }\n\n // only inline types named after a property key get renamed (#9 Obj, #7/#22 Composed). The rest\n // must keep their name: a `$ref` name is one shared definition, and an `[inline:…]` member is\n // never emitted on its own — both are found by that id, renaming would break it. see #9 e.g.:\n // `listPrice` <- from a property key: can rename\n // `#/components/schemas/User` <- $ref name: keep\n // `[inline:Permissions]` <- consolidated allOf member: keep\n private static isExemptFromRename(node: IType): boolean {\n return !node.name || T.isRef(node.name) || node.name.startsWith('[inline:');\n }\n\n // the type already stored under our name, raw or emitted. see #12 e.g.:\n // user: { type: object, … } <- stored under `user` AND its emitted name `User`; found by either\n private static storedOccupant(node: IType, context: OasContext): IType | undefined {\n return context.types.get(node.name) ?? context.types.get(Naming.genTypeName(node.name));\n }\n\n // the same definition duplicated inline: same name-derived id AND a deeply-equal raw schema —\n // an id mismatch (pointer-named #8, component #12) would emit two definitions of one name.\n // see #18 e.g. (box):\n // File: { shared_link: { url: {type: string} } } <- stored\n // Folder: { shared_link: { url: {type: string} } } <- identical copy -> dedup, keep the name\n private static isSameInlineDefinition(node: IType, occupant: IType): boolean {\n if (occupant.id !== node.id) {\n return false;\n }\n return T.sameSchemaAs(node, occupant);\n }\n\n // deeply-equal raw schemas: the same inline definition duplicated, not a different shape that\n // happens to share the name. see #18 e.g.:\n // { url: {type: string} } vs { url: {type: string} } -> same\n // { url: {type: string} } vs { url: {type: string}, vanity: {…} } -> different\n private static sameSchemaAs(node: IType, occupant: IType): boolean {\n if (!node.schema || !occupant.schema) {\n return false;\n }\n return _.isEqual(node.schema, occupant.schema);\n }\n\n // a twin with the same schema was already renamed to `candidate` — take the same name (and so\n // the same id) instead of adding `2`, `3`, …, which would orphan on fold. see #18\n // Same node class only: ids start with the class, so the ids would differ anyway. see #22 e.g.:\n // Folder A: { created_by: {…X…} } <- collided earlier, renamed to `FolderCreatedBy`\n // Folder B: { created_by: {…X…} } <- same schema -> reuse `FolderCreatedBy`, not `…2`\n private static canConvergeOn(node: IType, occupant: IType | undefined, candidate: string): boolean {\n if (!occupant || occupant.constructor !== node.constructor || occupant.name !== candidate) {\n return false;\n }\n return T.sameSchemaAs(node, occupant);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"typeUtils.js","sourceRoot":"","sources":["../../../src/oas/nodes/typeUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Arr,\n CircularRef,\n En,\n Get,\n IType,\n Obj,\n Op,\n Prop,\n PropArray,\n PropEn,\n PropScalar,\n ReferenceObject,\n Scalar,\n} from './internal.js';\nimport _ from 'lodash';\nimport { Naming } from '../utils/naming.js';\nimport type { OasContext } from '../oasContext.js';\nimport type { SchemaObject } from 'oas/types';\n\nexport class T {\n public static isLeaf(type: IType): boolean {\n return (\n type instanceof Scalar ||\n type instanceof PropScalar ||\n type instanceof En ||\n type instanceof PropEn ||\n type instanceof CircularRef ||\n (type instanceof PropArray && type.items instanceof Scalar) ||\n (type instanceof Obj && _.isEmpty(type.props)) ||\n T.isScalarArray(type)\n );\n }\n\n public static isPropScalar(type: IType): boolean {\n return type instanceof PropScalar;\n }\n\n // every operation node (Get, Post, Put, Patch, Delete) derives from Get\n public static isOp(type: IType): type is IType & Op {\n return type instanceof Get;\n }\n\n public static traverse(node: IType, callback: (node: IType) => void): void {\n const traverseNode = (n: IType): void => {\n callback(n);\n\n for (const c of n.children) {\n traverseNode(c);\n }\n };\n\n traverseNode(node);\n }\n\n static isMutationType(type: IType): boolean {\n return (\n type.id.startsWith('post:') ||\n type.id.startsWith('put:') ||\n type.id.startsWith('patch:') ||\n type.id.startsWith('del:')\n );\n }\n\n static isScalar(type: IType): boolean {\n return type.id.startsWith('scalar:');\n }\n\n public static containers(node: IType) {\n return Array.from(node.children.values())\n .filter((child) => !(child instanceof Prop) && T.isContainer(child))\n .map((child) => child);\n }\n\n // emitted as its own definition in the schema (`type X` / `enum X`), unlike props, wrappers,\n // scalars and cycle cuts which only appear inside other definitions\n public static isEmittable(node: IType): boolean {\n return T.isContainer(node) || node.id.startsWith('enum:');\n }\n\n public static isContainer(node: IType): boolean {\n return (\n node.id.startsWith('obj:') ||\n node.id.startsWith('comp:') ||\n node.id.startsWith('union:') ||\n node.id.startsWith('map:')\n );\n }\n\n static composables(node: IType): IType[] {\n return _.filter(T.containers(node), (e: IType) => e.id.startsWith('comp:')); // || e.id.startsWith('union:'));\n }\n\n public static print(node: IType, prefix: string = '', isLast: boolean = true): string {\n // Build the current line with the appropriate connector.\n const connector = prefix === '' ? '' : isLast ? '└─ ' : '├─ ';\n let result = prefix + connector + node.id + '\\n';\n\n // Prepare the prefix for the children.\n const childPrefix = prefix + (isLast ? ' ' : '│ ');\n\n node.children.forEach((child, index) => {\n const last = index === node.children.length - 1;\n result += T.print(child, childPrefix, last);\n });\n\n return result;\n }\n\n // A missing name is not a component reference.\n public static isRef(name: string | undefined) {\n return !!name && name.startsWith('#/components/');\n }\n\n public static findNonPropParent(type: IType) {\n let parent = type;\n while (parent instanceof Prop) {\n parent = parent.parent!;\n }\n return parent;\n }\n\n public static isScalarArray(type: IType) {\n return type instanceof Arr && type.itemsType instanceof Scalar;\n }\n\n // The occupant is the type already stored under our name: a different shape collides (rename,\n // see #9/#12); a same-schema occupant dedups instead — renaming it would orphan it (see #18).\n // e.g. (googlebooks):\n // saleInfo: { listPrice: { amount } } <- visited first, stored as `listPrice`\n // offersItem: { listPrice: { amountInMicros } } <- same name, different shape -> collides\n public static collidesWithStoredType(node: IType, context: OasContext): boolean {\n if (T.isExemptFromRename(node)) {\n return false;\n }\n const occupant = T.storedOccupant(node, context);\n if (!occupant) {\n return false;\n }\n return !T.isSameInlineDefinition(node, occupant);\n }\n\n // Detects an inline object that shares its name with a component it holds — the wrapper `group`\n // holding `results: [#/components/schemas/Group]`. Renaming it avoids a duplicate `type Group`. We\n // read the object's own schema (rather than the built tree) because the `Group` component is reached\n // through `results`, which the parser expands only after this object is built. see #12, #37.\n // group:\n // type: object\n // properties:\n // results: { type: array, items: { $ref: '#/components/schemas/Group' } }\n // size: { type: integer }\n public static collidesWithContainedComponent(node: IType): boolean {\n if (!(node instanceof Obj) || T.isExemptFromRename(node)) {\n return false;\n }\n const ownName = Naming.genTypeName(node.name);\n return Object.values(node.schema?.properties ?? {}).some((prop) => {\n const ref = T.componentSchemaRef(prop);\n return ref != null && Naming.genTypeName(Naming.getRefName(ref)) === ownName;\n });\n }\n\n // The schema component ref a property targets — directly, or as the items of an array — or null.\n // An \"array\" includes the implied form (`items` with no `type`, per factory.ts:83). Schema refs are\n // the ones that become a `type X`.\n // group: { $ref: '#/components/schemas/Group' } -> #/components/schemas/Group\n // results: { type: array, items: { $ref: '#/components/schemas/Group' } } -> #/components/schemas/Group\n // results: { items: { $ref: '#/components/schemas/Group' } } -> #/components/schemas/Group\n private static componentSchemaRef(schema: SchemaObject | ReferenceObject | undefined): string | null {\n if (schema == null) return null;\n\n let ref: string | undefined;\n if ('$ref' in schema) {\n ref = schema.$ref;\n }\n // array (explicit, or implied via `items`) — take the items' ref\n else if (schema.type === 'array' || schema.type == null) {\n const itemsRef = _.get(schema, 'items.$ref');\n ref = typeof itemsRef === 'string' ? itemsRef : undefined;\n }\n\n // keep only schema-component refs (the ones that emit a clashing type)\n if (ref == null || !ref.startsWith('#/components/schemas/')) {\n return null;\n }\n\n return ref;\n }\n\n // an occupant of a DIFFERENT class always emits a second definition of the name — ids start\n // with the class (`obj:`/`comp:`), so the collector can never dedup the two. A same-class\n // occupant keeps the old dedup-by-id behaviour: renaming those orphans twins that differ only\n // in description (File/Folder `created_by`). see #22. e.g. (box):\n // SharedLink: { permissions: { type: object, … } } <- Obj, stored as `permissions`\n // File--Full: { permissions: { allOf: […] } } <- Composed `Permissions` -> must rename\n public static collidesAcrossNodeClasses(node: IType, context: OasContext): boolean {\n if (T.isExemptFromRename(node)) {\n return false;\n }\n const occupant = T.storedOccupant(node, context);\n return !!occupant && occupant.constructor !== node.constructor;\n }\n\n // Qualify a colliding inline name with its container (nearest non-prop ancestor), e.g. `listPrice`\n // under `offersItem` -> `OffersItemListPrice`, bumping `2`, `3`… until free. Both parts go through\n // genTypeName so the result is always a valid identifier (the container name may itself be an\n // `[inline:…]` placeholder) and is idempotent under emission. see docs/issues.md #9\n public static resolveNameConflict(node: IType, context: OasContext): void {\n const base = Naming.genTypeName(T.findNonPropParent(node.parent!).name) + Naming.genTypeName(node.name);\n let candidate = base;\n for (let n = 2; context.types.has(candidate); n++) {\n if (T.canConvergeOn(node, context.types.get(candidate), candidate)) {\n break;\n }\n candidate = `${base}${n}`;\n }\n node.name = candidate;\n }\n\n // only inline types named after a property key get renamed (#9 Obj, #7/#22 Composed). The rest\n // must keep their name: a `$ref` name is one shared definition, and an `[inline:…]` member is\n // never emitted on its own — both are found by that id, renaming would break it. see #9 e.g.:\n // `listPrice` <- from a property key: can rename\n // `#/components/schemas/User` <- $ref name: keep\n // `[inline:Permissions]` <- consolidated allOf member: keep\n private static isExemptFromRename(node: IType): boolean {\n return !node.name || T.isRef(node.name) || node.name.startsWith('[inline:');\n }\n\n // the type already stored under our name, raw or emitted. see #12 e.g.:\n // user: { type: object, … } <- stored under `user` AND its emitted name `User`; found by either\n private static storedOccupant(node: IType, context: OasContext): IType | undefined {\n return context.types.get(node.name) ?? context.types.get(Naming.genTypeName(node.name));\n }\n\n // the same definition duplicated inline: same name-derived id AND a deeply-equal raw schema —\n // an id mismatch (pointer-named #8, component #12) would emit two definitions of one name.\n // see #18 e.g. (box):\n // File: { shared_link: { url: {type: string} } } <- stored\n // Folder: { shared_link: { url: {type: string} } } <- identical copy -> dedup, keep the name\n private static isSameInlineDefinition(node: IType, occupant: IType): boolean {\n if (occupant.id !== node.id) {\n return false;\n }\n return T.sameSchemaAs(node, occupant);\n }\n\n // deeply-equal raw schemas: the same inline definition duplicated, not a different shape that\n // happens to share the name. see #18 e.g.:\n // { url: {type: string} } vs { url: {type: string} } -> same\n // { url: {type: string} } vs { url: {type: string}, vanity: {…} } -> different\n private static sameSchemaAs(node: IType, occupant: IType): boolean {\n if (!node.schema || !occupant.schema) {\n return false;\n }\n return _.isEqual(node.schema, occupant.schema);\n }\n\n // a twin with the same schema was already renamed to `candidate` — take the same name (and so\n // the same id) instead of adding `2`, `3`, …, which would orphan on fold. see #18\n // Same node class only: ids start with the class, so the ids would differ anyway. see #22 e.g.:\n // Folder A: { created_by: {…X…} } <- collided earlier, renamed to `FolderCreatedBy`\n // Folder B: { created_by: {…X…} } <- same schema -> reuse `FolderCreatedBy`, not `…2`\n private static canConvergeOn(node: IType, occupant: IType | undefined, candidate: string): boolean {\n if (!occupant || occupant.constructor !== node.constructor || occupant.name !== candidate) {\n return false;\n }\n return T.sameSchemaAs(node, occupant);\n }\n}\n"]}
|
|
@@ -34,7 +34,9 @@ export declare class Union extends Type {
|
|
|
34
34
|
* each member's own `select`, scoped by the current selection.
|
|
35
35
|
*/
|
|
36
36
|
private selectAbstract;
|
|
37
|
-
/** Reverse-lookup
|
|
37
|
+
/** Reverse-lookup the explicit discriminator `mapping` value for a member — e.g. given
|
|
38
|
+
* `mapping: { book: '#/components/schemas/Book' }`, returns "book" for the Book member.
|
|
39
|
+
* Null when there's no explicit mapping (the caller then uses the bare ref name). */
|
|
38
40
|
private discriminatorValue;
|
|
39
41
|
consolidate(selection: string[]): Set<IType>;
|
|
40
42
|
private visitProperties;
|
package/dist/oas/nodes/union.js
CHANGED
|
@@ -171,8 +171,11 @@ export class Union extends Type {
|
|
|
171
171
|
if (context.generateOptions.consolidateUnions || !this.discriminator) {
|
|
172
172
|
return this.selectedProps(selection);
|
|
173
173
|
}
|
|
174
|
-
|
|
174
|
+
// only members with a selected field are reachable (#26, #36); an allOf member also pulls in the
|
|
175
|
+
// $ref base it extends — `Book: allOf [$ref Product, …]` -> Product (r2-interface-shared-base.yaml).
|
|
176
|
+
return this.selectedMembers(selection).flatMap((member) => [
|
|
175
177
|
member,
|
|
178
|
+
// expand the list with all those that are referenced by this type, so we can filter them too
|
|
176
179
|
...(member instanceof Composed ? T.containers(member).filter((c) => T.isRef(c.name)) : []),
|
|
177
180
|
]);
|
|
178
181
|
}
|
|
@@ -280,7 +283,9 @@ export class Union extends Type {
|
|
|
280
283
|
});
|
|
281
284
|
writer.write(pad(base)).write(')\n');
|
|
282
285
|
}
|
|
283
|
-
/** Reverse-lookup
|
|
286
|
+
/** Reverse-lookup the explicit discriminator `mapping` value for a member — e.g. given
|
|
287
|
+
* `mapping: { book: '#/components/schemas/Book' }`, returns "book" for the Book member.
|
|
288
|
+
* Null when there's no explicit mapping (the caller then uses the bare ref name). */
|
|
284
289
|
discriminatorValue(child) {
|
|
285
290
|
const mapping = this.discriminatorMapping;
|
|
286
291
|
if (!mapping)
|
|
@@ -317,7 +322,7 @@ export class Union extends Type {
|
|
|
317
322
|
}
|
|
318
323
|
// and finally sort the props and copy them to our original
|
|
319
324
|
props.sort((a, b) => a.name.localeCompare(b.name)).forEach((prop) => this.props.set(prop.name, prop));
|
|
320
|
-
// and return the types
|
|
325
|
+
// and return the set of types we've used
|
|
321
326
|
this.consolidated = true;
|
|
322
327
|
// now remove every added ID
|
|
323
328
|
const queue = Array.from(this.children.values());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/oas/nodes/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { Composed, Factory, Get, IType, Prop, Res, T, Type } from './internal.js';\nimport { SchemaObject } from 'oas/types';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\n\nexport class Union extends Type {\n public schemas: SchemaObject[];\n // OAS discriminator: `propertyName` is the source JSON field carrying the type tag,\n // `discriminatorMapping` maps each tag value to a schema ref (value -> \"#/.../Type\").\n public discriminator?: string;\n public discriminatorMapping?: Record<string, string>;\n // R2: when this discriminated union's members all share one allOf base, it is promoted to a\n // GraphQL interface. `interfaceBaseRef` is the base schema ref (\"#/.../Product\"); when set,\n // generate() returns the interface name (not the union name) and emits no `union` line. Set by\n // promoteInterfaces (a post-collect pass) — never in visit().\n public interfaceBaseRef?: string;\n\n constructor(\n parent: IType,\n name: string,\n schemas: SchemaObject[],\n public consolidated: boolean = false,\n disc?: { propertyName?: string; mapping?: Record<string, string> },\n ) {\n super(parent, name);\n this.schemas = schemas;\n this.discriminator = disc?.propertyName;\n this.discriminatorMapping = disc?.mapping;\n this.updateName();\n }\n\n get id(): string {\n return `union:${this.name}`;\n }\n\n public forPrompt(_context: OasContext): string {\n return `[union] ${Naming.getRefName(this.name)}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n const schemas = this.schemas.map((s) => s.type);\n\n context.enter(this);\n trace(context, '-> [union:visit]', 'in: ' + schemas);\n\n if (!context.inContextOf('Composed', this)) {\n trace(context, '[union]', 'In union: ' + this.parent?.name);\n }\n\n for (const refSchema of this.schemas) {\n // OAS 3.1 writes nullability as a `{ type: \"null\" }` member — GraphQL fields are\n // nullable by default, so it adds nothing (the member form of #23's type arrays). #33\n if (refSchema && refSchema.type === 'null') {\n continue;\n }\n const type = Factory.fromSchema(context, this, refSchema);\n this.add(type);\n\n type.visit(context);\n trace(context, ' [union:visit]', 'of type: ' + type);\n }\n\n if (!context.inContextOf('Param', this)) {\n this.visitProperties(context);\n }\n\n if (this.name != null) {\n context.store(this.name, this);\n // members are absorbed into the merged object whenever we downgrade — in consolidate\n // mode, and in v0.4 mode when there is no discriminator (no tag field for ->match, so\n // generate() emits the merged object there too). see docs/issues.md #25\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n this.children.forEach((child) => context.decRefCount(child.name));\n }\n }\n\n this.visited = true;\n trace(context, '<- [union:visit]', 'out: ' + schemas);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n context.enter(this);\n const schemas = this.schemas.map((s) => s.type);\n trace(context, '-> [union::generate]', 'in: ' + schemas);\n\n /* params with Unions are weird, but here's an example:\n * id: oneOf [string, Enum {me}] */\n if (context.inContextOf('Param', this)) {\n for (const child of this.children) {\n child.generate(context, writer, selection);\n }\n } else if (context.inContextOf('Res', this)) {\n // R2: when promoted to an interface, the field returns the base interface, not the union name.\n writer.write(Naming.genTypeName(this.interfaceBaseRef ?? this.name));\n return;\n }\n // generate traditional union\n else {\n // Definition/reference agreement, like comp.ts: references emit genTypeName(name), so the\n // union line (and its consolidate-downgrade type) must too. see docs/issues.md #15, #6\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n const name = sanitised === refName ? refName : sanitised;\n\n if (context.generateOptions.consolidateUnions) {\n this.generateMergedObject(context, writer, selection, name, '#### NOT SUPPORTED YET BY CONNECTORS!!! union ');\n } else if (!this.discriminator) {\n // No tag field for `->match` to dispatch on, so a real union cannot be selected — the\n // selection already falls back to the flat merged form (see select); emit the matching\n // merged object here, or SDL says `union` while the selection selects a group on it\n // (GROUP_SELECTION_IS_NOT_OBJECT). see docs/issues.md #25\n this.generateMergedObject(\n context,\n writer,\n selection,\n name,\n '#### no discriminator — union degraded to a merged object: ',\n );\n } else if (this.interfaceBaseRef) {\n // R2: promoted to an interface — the base (emitted as `interface`) and the members\n // (each `... implements Base`) carry the type system; emit no `union X = A | B` line.\n trace(context, ' [union::generate]', `[interface] suppressing union line for ${this.name}`);\n } else {\n // list the members with selected fields. Filtering by prop-parent identity broke for\n // allOf members (their folded props keep the inner part as parent -> `union X = `). #34\n const filtered = this.selectedMembers(selection);\n\n writer\n .write('union ')\n .write(name)\n .write(this.nameSuffix())\n .write(' = ')\n .write(filtered.map((child) => Naming.getRefName(child.name)).join(' | '))\n .write('\\n\\n');\n }\n }\n\n trace(context, '<- [union::generate]', 'out: ' + schemas);\n context.leave(this);\n }\n\n // The downgrade shape both passes share: an info comment naming the original union, then one\n // object type carrying every member's selected fields (the selection selects the same flat set).\n private generateMergedObject(\n context: OasContext,\n writer: Writer,\n selection: string[],\n name: string,\n headline: string,\n ): void {\n if (!this.consolidated) {\n this.consolidate(selection).forEach((type) => context.decRefCount(type.name));\n }\n\n const childrenTypes = this.children.map((child) => Naming.getRefName(child.name));\n writer.write(headline).write(name).write(' = ').write(childrenTypes.join(' | ')).write('\\n\\n');\n\n trace(context, ' [union::generate]', `[union] -> object: ${this.name}`);\n\n // The merged object's keyword follows the node's `kind`, which is inherited from the parent\n // context: a response-rooted Union is `kind='type'`; a request-body-rooted Union is\n // `kind='input'` (Body sets it on construction — see body.ts). Both are correct: the merged\n // object is referenced exactly as its context dictates (response -> output field, body ->\n // Mutation argument), and `nameSuffix()` (`'Input'` when kind=input) keeps the names\n // distinct when the same schema is reached both ways. Do NOT hard-code `'type '` here —\n // it would emit an input-position merge as an output type and break the body case. See C6.\n writer\n .write(this.kind + ' ')\n .write(name)\n .write(this.nameSuffix())\n .write(' { #### replacement for Union ')\n .write(name)\n .write('\\n');\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n trace(context, ' [union::generate]', `-> property: ${prop.name} (parent: ${prop.parent!.name})`);\n if (!generated.has(prop.id)) prop.generate(context, writer, selection);\n generated.add(prop.id);\n }\n\n writer.write('} \\n### End replacement for ').write(this.name).write('\\n\\n');\n }\n\n // two inline members easily share a name (`[inline:Input]` twice) — same suffixing as Composed\n add(child: IType): IType {\n return super.add(this.withUniqueName(child));\n }\n\n // the members that carry at least one selected field — what the `union X = …` line lists and\n // what `->match` branches over. Composed members fold their allOf parts in first. see #34\n private selectedMembers(selection: string[]): IType[] {\n return this.children.filter((child) => {\n if (child instanceof Composed && child.schema.allOf != null && !child.consolidated) {\n child.consolidate(selection);\n }\n return Array.from(child.props.values()).some((p) => selection.find((s) => s.startsWith(p.path())));\n });\n }\n\n // a real `union X = Book | Movie` needs its members (and a member's shared $ref base, which\n // the writer may promote to an interface — R2); a merged one needs its flat fields instead\n dependencies(context: OasContext, selection: string[]): IType[] {\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n return this.selectedProps(selection);\n }\n return this.children.flatMap((member) => [\n member,\n ...(member instanceof Composed ? T.containers(member).filter((c) => T.isRef(c.name)) : []),\n ]);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]): void {\n trace(context, '-> [union::select]', `-> in: ${this.name}`);\n\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n // R2: when we emit a *real* `union X = A | B` (not the consolidate downgrade) and the\n // spec gives us a discriminator, produce the composable abstract-type selection\n // (connect v0.4): a spread `->match` whose branches set a string-literal __typename per\n // concrete member. Without a discriminator, or when consolidating, fall back to the flat\n // merged selection (the consolidate-downgrade shape).\n if (!context.generateOptions.consolidateUnions && this.discriminator) {\n this.selectAbstract(context, writer, selection);\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n return;\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id)) prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n\n /*if (context.generateOptions.consolidateUnions) {\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id))\n prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n } else {\n // add the prop parent paths to a set so we can only include those parents that have been selected\n const propParentsPathSet = new Set(this.selectedProps(selection).map(p => p.parent!.path()));\n\n // we should only include the names of those properties that have been selected\n this.children\n .filter(c => propParentsPathSet.has(c.path()))\n .forEach((child) => {\n child.select(context, writer, selection);\n });\n }*/\n\n /* TODO: better selection for Unions\n dataPoints: dataFormat->match(\n [\"raw\", $.dataPoints],\n [\"normal\", $.dataPoints {\n priceDateTime\n # all other fields\n }],\n [@, $ { # optimized\n priceDateTime\n # all other fields\n }\n ])\n */\n\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n }\n\n /**\n * R2: emit the connect-v0.4 abstract-type selection for a real union. Shape (verified to\n * compose under fed v2.13 / connect v0.4):\n *\n * ... <discriminator>->match(\n * [\"<value>\", $ { __typename: $(\"Book\") <Book fields> }],\n * [\"<value>\", $ { __typename: $(\"Movie\") <Movie fields> }]\n * )\n *\n * `__typename` is a string literal (required by the composer); per-member fields come from\n * each member's own `select`, scoped by the current selection.\n */\n private selectAbstract(context: OasContext, writer: Writer, selection: string[]): void {\n const base = context.indent;\n const pad = (n: number) => ' '.repeat(Math.max(n, 0));\n\n // The match operates on the *source* JSON field; quote it if not a bare identifier\n // (e.g. OAS discriminators like `@type`).\n const field = /^[_A-Za-z][_0-9A-Za-z]*$/.test(this.discriminator!)\n ? this.discriminator!\n : `\"${this.discriminator!}\"`;\n\n // Only members with at least one selected prop participate.\n const members = this.selectedMembers(selection);\n\n writer.write(pad(base)).write(`... ${field}->match(\\n`);\n\n members.forEach((child, idx) => {\n const typeName = Naming.getRefName(child.name)!;\n // OAS 3.x: when no explicit discriminator `mapping` is present, the implicit tag value\n // is the bare (un-prefixed) ref name — e.g. \"Book\", NOT \"book\". Lowercasing it produced a\n // `->match` branch that never fired against spec-compliant payloads. See C1.\n const value = this.discriminatorValue(child) ?? typeName;\n\n writer.write(pad(base + 2)).write(`[\"${value}\", $ {\\n`);\n writer.write(pad(base + 4)).write(`__typename: $(\"${typeName}\")\\n`);\n\n // Member fields via the child's own select (scoped by selection). `select` writes at\n // `context.indent + stack.length`, so offset indent to land fields at base + 4.\n const savedIndent = context.indent;\n context.indent = base + 4 - context.stack.length;\n child.select(context, writer, selection);\n context.indent = savedIndent;\n\n writer\n .write(pad(base + 2))\n .write(idx < members.length - 1 ? '}],' : '}]')\n .write('\\n');\n });\n\n writer.write(pad(base)).write(')\\n');\n }\n\n /** Reverse-lookup an OAS discriminator value (e.g. \"book\") for a concrete member type. */\n private discriminatorValue(child: IType): string | null {\n const mapping = this.discriminatorMapping;\n if (!mapping) return null;\n const childRef = Naming.getRefName(child.name);\n for (const [value, ref] of Object.entries(mapping)) {\n if (Naming.getRefName(ref) === childRef) return value;\n }\n return null;\n }\n\n public consolidate(selection: string[]): Set<IType> {\n T.composables(this).forEach((child) => {\n (child as Composed).consolidate(selection);\n });\n\n const ids: Set<IType> = new Set();\n const props: Prop[] = [];\n const discriminator = this.discriminator;\n\n this.children?.forEach((child) => {\n // .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n ids.add(child);\n\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => props.push(prop));\n\n // props.push(...child.props.values());\n });\n\n // add the discriminator, if we have one\n if (discriminator) {\n const prop = (this.children || [])\n .map((child) => child.props.get(discriminator))\n .find((prop) => prop !== undefined);\n\n if (prop) props.push(prop);\n }\n\n // and finally sort the props and copy them to our original\n props.sort((a, b) => a.name.localeCompare(b.name)).forEach((prop) => this.props.set(prop.name, prop));\n\n // and return the types.ts we've used\n this.consolidated = true;\n\n // now remove every added ID\n const queue: IType[] = Array.from(this.children.values());\n while (queue.length > 0) {\n const node = queue.shift()!;\n const containers = T.containers(node);\n containers.forEach((c) => ids.add(c));\n // queue.push(...node.children);\n }\n\n return ids;\n }\n\n private visitProperties(_context: OasContext): void {\n // TODO: pending\n }\n\n public selectedProps(selection: string[]) {\n const collected: Prop[] = [];\n\n this.children.forEach((child) => {\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => collected.push(prop));\n });\n\n return collected;\n }\n\n private updateName(): void {\n let name = this.name;\n if (!name) {\n if (this.parent instanceof Res) {\n const op = this.parent!.parent as Get;\n name = op.getGqlOpName() + 'Response';\n } else {\n name = this.parent!.name + `Union`;\n }\n }\n\n this.name = name;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/oas/nodes/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { Composed, Factory, Get, IType, Prop, Res, T, Type } from './internal.js';\nimport { SchemaObject } from 'oas/types';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\n\nexport class Union extends Type {\n public schemas: SchemaObject[];\n // OAS discriminator: `propertyName` is the source JSON field carrying the type tag,\n // `discriminatorMapping` maps each tag value to a schema ref (value -> \"#/.../Type\").\n public discriminator?: string;\n public discriminatorMapping?: Record<string, string>;\n // R2: when this discriminated union's members all share one allOf base, it is promoted to a\n // GraphQL interface. `interfaceBaseRef` is the base schema ref (\"#/.../Product\"); when set,\n // generate() returns the interface name (not the union name) and emits no `union` line. Set by\n // promoteInterfaces (a post-collect pass) — never in visit().\n public interfaceBaseRef?: string;\n\n constructor(\n parent: IType,\n name: string,\n schemas: SchemaObject[],\n public consolidated: boolean = false,\n disc?: { propertyName?: string; mapping?: Record<string, string> },\n ) {\n super(parent, name);\n this.schemas = schemas;\n this.discriminator = disc?.propertyName;\n this.discriminatorMapping = disc?.mapping;\n this.updateName();\n }\n\n get id(): string {\n return `union:${this.name}`;\n }\n\n public forPrompt(_context: OasContext): string {\n return `[union] ${Naming.getRefName(this.name)}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n const schemas = this.schemas.map((s) => s.type);\n\n context.enter(this);\n trace(context, '-> [union:visit]', 'in: ' + schemas);\n\n if (!context.inContextOf('Composed', this)) {\n trace(context, '[union]', 'In union: ' + this.parent?.name);\n }\n\n for (const refSchema of this.schemas) {\n // OAS 3.1 writes nullability as a `{ type: \"null\" }` member — GraphQL fields are\n // nullable by default, so it adds nothing (the member form of #23's type arrays). #33\n if (refSchema && refSchema.type === 'null') {\n continue;\n }\n const type = Factory.fromSchema(context, this, refSchema);\n this.add(type);\n\n type.visit(context);\n trace(context, ' [union:visit]', 'of type: ' + type);\n }\n\n if (!context.inContextOf('Param', this)) {\n this.visitProperties(context);\n }\n\n if (this.name != null) {\n context.store(this.name, this);\n // members are absorbed into the merged object whenever we downgrade — in consolidate\n // mode, and in v0.4 mode when there is no discriminator (no tag field for ->match, so\n // generate() emits the merged object there too). see docs/issues.md #25\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n this.children.forEach((child) => context.decRefCount(child.name));\n }\n }\n\n this.visited = true;\n trace(context, '<- [union:visit]', 'out: ' + schemas);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n context.enter(this);\n const schemas = this.schemas.map((s) => s.type);\n trace(context, '-> [union::generate]', 'in: ' + schemas);\n\n /* params with Unions are weird, but here's an example:\n * id: oneOf [string, Enum {me}] */\n if (context.inContextOf('Param', this)) {\n for (const child of this.children) {\n child.generate(context, writer, selection);\n }\n } else if (context.inContextOf('Res', this)) {\n // R2: when promoted to an interface, the field returns the base interface, not the union name.\n writer.write(Naming.genTypeName(this.interfaceBaseRef ?? this.name));\n return;\n }\n // generate traditional union\n else {\n // Definition/reference agreement, like comp.ts: references emit genTypeName(name), so the\n // union line (and its consolidate-downgrade type) must too. see docs/issues.md #15, #6\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n const name = sanitised === refName ? refName : sanitised;\n\n if (context.generateOptions.consolidateUnions) {\n this.generateMergedObject(context, writer, selection, name, '#### NOT SUPPORTED YET BY CONNECTORS!!! union ');\n } else if (!this.discriminator) {\n // No tag field for `->match` to dispatch on, so a real union cannot be selected — the\n // selection already falls back to the flat merged form (see select); emit the matching\n // merged object here, or SDL says `union` while the selection selects a group on it\n // (GROUP_SELECTION_IS_NOT_OBJECT). see docs/issues.md #25\n this.generateMergedObject(\n context,\n writer,\n selection,\n name,\n '#### no discriminator — union degraded to a merged object: ',\n );\n } else if (this.interfaceBaseRef) {\n // R2: promoted to an interface — the base (emitted as `interface`) and the members\n // (each `... implements Base`) carry the type system; emit no `union X = A | B` line.\n trace(context, ' [union::generate]', `[interface] suppressing union line for ${this.name}`);\n } else {\n // list the members with selected fields. Filtering by prop-parent identity broke for\n // allOf members (their folded props keep the inner part as parent -> `union X = `). #34\n const filtered = this.selectedMembers(selection);\n\n writer\n .write('union ')\n .write(name)\n .write(this.nameSuffix())\n .write(' = ')\n .write(filtered.map((child) => Naming.getRefName(child.name)).join(' | '))\n .write('\\n\\n');\n }\n }\n\n trace(context, '<- [union::generate]', 'out: ' + schemas);\n context.leave(this);\n }\n\n // The downgrade shape both passes share: an info comment naming the original union, then one\n // object type carrying every member's selected fields (the selection selects the same flat set).\n private generateMergedObject(\n context: OasContext,\n writer: Writer,\n selection: string[],\n name: string,\n headline: string,\n ): void {\n if (!this.consolidated) {\n this.consolidate(selection).forEach((type) => context.decRefCount(type.name));\n }\n\n const childrenTypes = this.children.map((child) => Naming.getRefName(child.name));\n writer.write(headline).write(name).write(' = ').write(childrenTypes.join(' | ')).write('\\n\\n');\n\n trace(context, ' [union::generate]', `[union] -> object: ${this.name}`);\n\n // The merged object's keyword follows the node's `kind`, which is inherited from the parent\n // context: a response-rooted Union is `kind='type'`; a request-body-rooted Union is\n // `kind='input'` (Body sets it on construction — see body.ts). Both are correct: the merged\n // object is referenced exactly as its context dictates (response -> output field, body ->\n // Mutation argument), and `nameSuffix()` (`'Input'` when kind=input) keeps the names\n // distinct when the same schema is reached both ways. Do NOT hard-code `'type '` here —\n // it would emit an input-position merge as an output type and break the body case. See C6.\n writer\n .write(this.kind + ' ')\n .write(name)\n .write(this.nameSuffix())\n .write(' { #### replacement for Union ')\n .write(name)\n .write('\\n');\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n trace(context, ' [union::generate]', `-> property: ${prop.name} (parent: ${prop.parent!.name})`);\n if (!generated.has(prop.id)) prop.generate(context, writer, selection);\n generated.add(prop.id);\n }\n\n writer.write('} \\n### End replacement for ').write(this.name).write('\\n\\n');\n }\n\n // two inline members easily share a name (`[inline:Input]` twice) — same suffixing as Composed\n add(child: IType): IType {\n return super.add(this.withUniqueName(child));\n }\n\n // the members that carry at least one selected field — what the `union X = …` line lists and\n // what `->match` branches over. Composed members fold their allOf parts in first. see #34\n private selectedMembers(selection: string[]): IType[] {\n return this.children.filter((child) => {\n if (child instanceof Composed && child.schema.allOf != null && !child.consolidated) {\n child.consolidate(selection);\n }\n return Array.from(child.props.values()).some((p) => selection.find((s) => s.startsWith(p.path())));\n });\n }\n\n // a real `union X = Book | Movie` needs its members (and a member's shared $ref base, which\n // the writer may promote to an interface — R2); a merged one needs its flat fields instead\n dependencies(context: OasContext, selection: string[]): IType[] {\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n return this.selectedProps(selection);\n }\n // only members with a selected field are reachable (#26, #36); an allOf member also pulls in the\n // $ref base it extends — `Book: allOf [$ref Product, …]` -> Product (r2-interface-shared-base.yaml).\n return this.selectedMembers(selection).flatMap((member) => [\n member,\n // expand the list with all those that are referenced by this type, so we can filter them too\n ...(member instanceof Composed ? T.containers(member).filter((c) => T.isRef(c.name)) : []),\n ]);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]): void {\n trace(context, '-> [union::select]', `-> in: ${this.name}`);\n\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n // R2: when we emit a *real* `union X = A | B` (not the consolidate downgrade) and the\n // spec gives us a discriminator, produce the composable abstract-type selection\n // (connect v0.4): a spread `->match` whose branches set a string-literal __typename per\n // concrete member. Without a discriminator, or when consolidating, fall back to the flat\n // merged selection (the consolidate-downgrade shape).\n if (!context.generateOptions.consolidateUnions && this.discriminator) {\n this.selectAbstract(context, writer, selection);\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n return;\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id)) prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n\n /*if (context.generateOptions.consolidateUnions) {\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id))\n prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n } else {\n // add the prop parent paths to a set so we can only include those parents that have been selected\n const propParentsPathSet = new Set(this.selectedProps(selection).map(p => p.parent!.path()));\n\n // we should only include the names of those properties that have been selected\n this.children\n .filter(c => propParentsPathSet.has(c.path()))\n .forEach((child) => {\n child.select(context, writer, selection);\n });\n }*/\n\n /* TODO: better selection for Unions\n dataPoints: dataFormat->match(\n [\"raw\", $.dataPoints],\n [\"normal\", $.dataPoints {\n priceDateTime\n # all other fields\n }],\n [@, $ { # optimized\n priceDateTime\n # all other fields\n }\n ])\n */\n\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n }\n\n /**\n * R2: emit the connect-v0.4 abstract-type selection for a real union. Shape (verified to\n * compose under fed v2.13 / connect v0.4):\n *\n * ... <discriminator>->match(\n * [\"<value>\", $ { __typename: $(\"Book\") <Book fields> }],\n * [\"<value>\", $ { __typename: $(\"Movie\") <Movie fields> }]\n * )\n *\n * `__typename` is a string literal (required by the composer); per-member fields come from\n * each member's own `select`, scoped by the current selection.\n */\n private selectAbstract(context: OasContext, writer: Writer, selection: string[]): void {\n const base = context.indent;\n const pad = (n: number) => ' '.repeat(Math.max(n, 0));\n\n // The match operates on the *source* JSON field; quote it if not a bare identifier\n // (e.g. OAS discriminators like `@type`).\n const field = /^[_A-Za-z][_0-9A-Za-z]*$/.test(this.discriminator!)\n ? this.discriminator!\n : `\"${this.discriminator!}\"`;\n\n // Only members with at least one selected prop participate.\n const members = this.selectedMembers(selection);\n\n writer.write(pad(base)).write(`... ${field}->match(\\n`);\n\n members.forEach((child, idx) => {\n const typeName = Naming.getRefName(child.name)!;\n // OAS 3.x: when no explicit discriminator `mapping` is present, the implicit tag value\n // is the bare (un-prefixed) ref name — e.g. \"Book\", NOT \"book\". Lowercasing it produced a\n // `->match` branch that never fired against spec-compliant payloads. See C1.\n const value = this.discriminatorValue(child) ?? typeName;\n\n writer.write(pad(base + 2)).write(`[\"${value}\", $ {\\n`);\n writer.write(pad(base + 4)).write(`__typename: $(\"${typeName}\")\\n`);\n\n // Member fields via the child's own select (scoped by selection). `select` writes at\n // `context.indent + stack.length`, so offset indent to land fields at base + 4.\n const savedIndent = context.indent;\n context.indent = base + 4 - context.stack.length;\n child.select(context, writer, selection);\n context.indent = savedIndent;\n\n writer\n .write(pad(base + 2))\n .write(idx < members.length - 1 ? '}],' : '}]')\n .write('\\n');\n });\n\n writer.write(pad(base)).write(')\\n');\n }\n\n /** Reverse-lookup the explicit discriminator `mapping` value for a member — e.g. given\n * `mapping: { book: '#/components/schemas/Book' }`, returns \"book\" for the Book member.\n * Null when there's no explicit mapping (the caller then uses the bare ref name). */\n private discriminatorValue(child: IType): string | null {\n const mapping = this.discriminatorMapping;\n if (!mapping) return null;\n const childRef = Naming.getRefName(child.name);\n for (const [value, ref] of Object.entries(mapping)) {\n if (Naming.getRefName(ref) === childRef) return value;\n }\n return null;\n }\n\n public consolidate(selection: string[]): Set<IType> {\n T.composables(this).forEach((child) => {\n (child as Composed).consolidate(selection);\n });\n\n const ids: Set<IType> = new Set();\n const props: Prop[] = [];\n const discriminator = this.discriminator;\n\n this.children?.forEach((child) => {\n // .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n ids.add(child);\n\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => props.push(prop));\n\n // props.push(...child.props.values());\n });\n\n // add the discriminator, if we have one\n if (discriminator) {\n const prop = (this.children || [])\n .map((child) => child.props.get(discriminator))\n .find((prop) => prop !== undefined);\n\n if (prop) props.push(prop);\n }\n\n // and finally sort the props and copy them to our original\n props.sort((a, b) => a.name.localeCompare(b.name)).forEach((prop) => this.props.set(prop.name, prop));\n\n // and return the set of types we've used\n this.consolidated = true;\n\n // now remove every added ID\n const queue: IType[] = Array.from(this.children.values());\n while (queue.length > 0) {\n const node = queue.shift()!;\n const containers = T.containers(node);\n containers.forEach((c) => ids.add(c));\n // queue.push(...node.children);\n }\n\n return ids;\n }\n\n private visitProperties(_context: OasContext): void {\n // TODO: pending\n }\n\n public selectedProps(selection: string[]) {\n const collected: Prop[] = [];\n\n this.children.forEach((child) => {\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => collected.push(prop));\n });\n\n return collected;\n }\n\n private updateName(): void {\n let name = this.name;\n if (!name) {\n if (this.parent instanceof Res) {\n const op = this.parent!.parent as Get;\n name = op.getGqlOpName() + 'Response';\n } else {\n name = this.parent!.name + `Union`;\n }\n }\n\n this.name = name;\n }\n}\n"]}
|
package/dist/oas/utils/naming.js
CHANGED
|
@@ -193,7 +193,10 @@ export class Naming {
|
|
|
193
193
|
// Step 1: Remove parameters enclosed in {}.
|
|
194
194
|
const paramsJoined = parameters.join('');
|
|
195
195
|
let cleanedPath = path.replace(/\{[^}]*\}/g, paramsJoined);
|
|
196
|
-
|
|
196
|
+
// Split `#` for GraphQL field names because SDL treats `#` as a comment marker. Box's
|
|
197
|
+
// `/shared_items#web_links` becomes `shared_itemsWeb_links`; the connector HTTP path still
|
|
198
|
+
// comes from operation.path as `GET: "/shared_items#web_links"`.
|
|
199
|
+
cleanedPath = Naming.capitaliseParts(cleanedPath, /[:\-.+#]+/);
|
|
197
200
|
// Step 2: Split the path by "/" and capitalize each part.
|
|
198
201
|
const capitalisedParts = Naming.capitaliseParts(cleanedPath, '/');
|
|
199
202
|
// Step 3: Check if the path starts with a number and remove it if so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../src/oas/utils/naming.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { Operation } from 'oas/operation';\n\ninterface Converter {\n convert(input: string): string;\n}\n\nabstract class AbstractConverter implements Converter {\n private next?: Converter;\n\n constructor(next?: Converter) {\n this.next = next;\n }\n\n public convert(input: string): string {\n const result = this.process(input);\n return this.next ? this.next.convert(result) : result;\n }\n\n protected abstract process(input: string): string;\n}\n\nclass CapitalisePartsConverter extends AbstractConverter {\n constructor(next: Converter) {\n super(next);\n }\n\n public process(input: string): string {\n return Naming.capitaliseParts(input, /[-_.]/);\n }\n}\n\nclass RemoveRefConverter extends AbstractConverter {\n constructor(converter: Converter) {\n super(converter);\n }\n\n public process(input: string): string {\n let result = input || '';\n // A schema $ref'd via a JSON-pointer into #/paths (DigitalOcean shares schemas this way) carries\n // the whole pointer as its name; derive a clean tail name instead. see docs/issues.md #8\n if (result.includes('#/paths/')) {\n return nameFromPathsPointer(result);\n }\n if (result.includes('#/components/schemas/')) {\n result = result.replace(/#\\/components\\/schemas\\//g, '');\n }\n if (result.includes('#/components/responses/')) {\n result = result.replace(/#\\/components\\/responses\\//g, '');\n }\n if (result.includes('#/components/parameters/')) {\n result = result.replace(/#\\/components\\/parameters\\//g, '');\n }\n return result;\n }\n}\n\n// Structural JSON-pointer segments that don't make good type-name material.\nconst POINTER_NOISE = new Set([\n '#',\n 'paths',\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'responses',\n 'requestBody',\n 'content',\n 'schema',\n 'allOf',\n 'oneOf',\n 'anyOf',\n 'items',\n 'properties',\n 'parameters',\n]);\n\n/**\n * Derive a readable type name from a JSON pointer into `#/paths/...` (how DigitalOcean shares inline\n * schemas). See docs/issues.md #8.\n *\n * Input (a raw pointer, RFC-6901 encoded):\n * `#/paths/~1v2~1account~1keys/get/responses/200/content/application~1json/schema/.../properties/sshKeys/items`\n * Output (a bare name; the caller's `genTypeName` then capitalises it):\n * `sshKeysItem` -> `SshKeysItem`\n *\n * Rules: decode `~1`/`~0`, then take the segment right after the last `properties` (`sshKeys`); if the\n * pointer targets array `items`, append `Item`. If there's no `properties`, use the last meaningful\n * segment (skipping structural keywords, array indices, and decoded path keys that contain `/`); if\n * nothing qualifies, fall back to `inline`.\n */\nfunction nameFromPathsPointer(ref: string): string {\n const segments = ref.split('/').map((s) => s.replace(/~1/g, '/').replace(/~0/g, '~'));\n const propIdx = segments.lastIndexOf('properties');\n\n let base = propIdx >= 0 ? segments[propIdx + 1] : undefined;\n if (!base) {\n base = [...segments].reverse().find((s) => !POINTER_NOISE.has(s) && !/^\\d+$/.test(s) && !s.includes('/'));\n }\n if (!base) base = 'inline';\n\n return segments[segments.length - 1] === 'items' ? base + 'Item' : base;\n}\n\nclass FinalFirstUpperCaseConverter extends AbstractConverter {\n constructor() {\n super();\n }\n public process(input: string): string {\n return _.upperFirst(input);\n }\n}\n\nclass FinalConverter extends AbstractConverter {\n protected process(input: string): string {\n return input; // do nothing\n }\n}\n\nclass EncodeLeadingSignConverter extends AbstractConverter {\n // a leading sign would be dropped by the generic sanitiser, colliding `+1` and `-1` (github's\n // ReactionRollup) into one `_1` field — encode it into the name instead. see docs/issues.md #24\n public process(input: string): string {\n if (input.startsWith('+')) return 'plus' + input.substring(1);\n if (input.startsWith('-')) return 'minus' + input.substring(1);\n return input;\n }\n}\n\nclass ParamNameConverter extends AbstractConverter {\n public process(input: string): string {\n return Naming.genParamName(input);\n }\n}\n\nexport class Naming {\n public static genParamName(param: string): string {\n // Split on any run of non-alphanumeric characters, camelCase the parts, then\n // guarantee a valid GraphQL identifier: non-empty and not starting with a digit.\n // (Plain `[-_.]` splitting let spaces, `$`, `%`, … and leading digits through.)\n const camel = _.lowerFirst(Naming.capitaliseParts(param || '', /[^A-Za-z0-9]+/));\n if (camel.length === 0) {\n return Naming.NUMBER_PREFIX;\n }\n return /^[0-9]/.test(camel) ? Naming.NUMBER_PREFIX + camel : camel;\n }\n\n // Selection paths abbreviate component refs to stay readable (`#/components/schemas/Space`\n // -> `#/c/s/Space`); expandRef is the inverse, used when matching a path segment back\n // against node ids.\n public static abbreviateRef(path: string): string {\n return path.replace(/#\\/components\\/schemas/g, '#/c/s');\n }\n\n public static expandRef(path: string): string {\n return path.replace(/#\\/c\\/s/g, '#/components/schemas');\n }\n\n public static genTypeName(name: string): string {\n // guarantee a valid type identifier: drop any leftover non-identifier chars (e.g. the\n // `[`/`]`/`:` of an `[inline:Foo]` placeholder used as a name prefix), then non-empty +\n // no leading digit. Idempotent for valid names. see docs/issues.md #6, #9\n const cleaned = Naming.TYPE_CONVERTER.convert(name).replace(/[^_0-9A-Za-z]/g, '');\n if (cleaned.length === 0) {\n return Naming.NUMBER_PREFIX;\n }\n return /^[0-9]/.test(cleaned) ? Naming.NUMBER_PREFIX + cleaned : cleaned;\n }\n\n public static sanitiseField(name: string): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n return Naming.FIELD_CONVERTER.convert(fieldName);\n }\n\n public static sanitiseFieldForSelect(name: string, isInput: boolean = false): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n const sanitised = Naming.FIELD_CONVERTER.convert(fieldName);\n\n // The JSON key is already a valid identifier identical to the field — no alias needed.\n if (sanitised === name) {\n return sanitised;\n }\n\n if (isInput) {\n // Request-body direction: original JSON key <- GraphQL input field. The KEY is quoted\n // when it isn't a bare identifier (omni's `urn:omni:params:1.0:UserAttribute` broke the\n // parser unquoted); the field reference is always a bare identifier. see #32\n const key = /^[_A-Za-z][_0-9A-Za-z]*$/.test(name) ? name : `\"${name}\"`;\n return key + ': ' + sanitised;\n }\n\n // Response direction: safe GraphQL field <- original JSON key, always quoted (the key\n // is not a bare identifier — covers spaces, `$`, `%`, leading digits, etc.).\n const original = name.startsWith('@') ? name : fieldName;\n return `${sanitised}: \"${original}\"`;\n }\n\n public static genOperationName(path: string, operation: Operation): string {\n const parameters = operation.hasParameters()\n ? operation\n .getParameters()\n .filter((p) => p.required && p.in.toLowerCase() !== 'header')\n .map((p) => {\n const paramName = Naming.genParamName(p.name);\n return `By${_.upperFirst(paramName)}`;\n })\n : [];\n\n const result = Naming.formatPath(path, parameters);\n return _.lowerFirst(result);\n }\n\n public static genArrayItems(name: string): string {\n return _.upperFirst(Naming.genParamName(name)) + 'Item';\n }\n\n public static getRefName(ref: string): string {\n return ref ? Naming.REF_CONVERTER.convert(ref) : '';\n }\n\n public static formatPath(path: string, parameters: string[]): string {\n if (!path) {\n return path;\n }\n\n // Step 1: Remove parameters enclosed in {}.\n const paramsJoined = parameters.join('');\n let cleanedPath = path.replace(/\\{[^}]*\\}/g, paramsJoined);\n cleanedPath = Naming.capitaliseParts(cleanedPath, /[:\\-.+]+/); // using regex similar to \"[:\\-\\.]+\"\n\n // Step 2: Split the path by \"/\" and capitalize each part.\n const capitalisedParts = Naming.capitaliseParts(cleanedPath, '/');\n\n // Step 3: Check if the path starts with a number and remove it if so\n // the pattern we are looking for is like so: /2.3.0/entrypoint\n if (/^\\d/.test(capitalisedParts)) {\n return capitalisedParts.replace(/^\\d+(?=[a-zA-Z])/g, '');\n }\n\n return capitalisedParts;\n }\n\n public static capitaliseParts(input: string, splitPattern: RegExp | string): string {\n // If splitPattern is a string, convert it to a RegExp.\n const regex = typeof splitPattern === 'string' ? new RegExp(splitPattern, 'g') : splitPattern;\n\n // Split the input, capitalize each non-empty part, and join them back together.\n return input\n .split(regex)\n .map((part) => (part ? _.upperFirst(part) : ''))\n .join('');\n }\n private static readonly TYPE_CONVERTER: Converter = new RemoveRefConverter(\n new CapitalisePartsConverter(new FinalFirstUpperCaseConverter()),\n );\n\n private static readonly REF_CONVERTER: Converter = new RemoveRefConverter(new FinalConverter());\n\n private static readonly FIELD_CONVERTER: Converter = new EncodeLeadingSignConverter(\n new ParamNameConverter(new FinalConverter()),\n );\n\n // internal stuff\n private static readonly NUMBER_PREFIX = '_';\n\n public formatPath(path: string, parameters: string[]): string {\n // Replace with your actual formatting logic.\n // This example simply concatenates the parameters to the path.\n return path + parameters.join('');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../src/oas/utils/naming.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { Operation } from 'oas/operation';\n\ninterface Converter {\n convert(input: string): string;\n}\n\nabstract class AbstractConverter implements Converter {\n private next?: Converter;\n\n constructor(next?: Converter) {\n this.next = next;\n }\n\n public convert(input: string): string {\n const result = this.process(input);\n return this.next ? this.next.convert(result) : result;\n }\n\n protected abstract process(input: string): string;\n}\n\nclass CapitalisePartsConverter extends AbstractConverter {\n constructor(next: Converter) {\n super(next);\n }\n\n public process(input: string): string {\n return Naming.capitaliseParts(input, /[-_.]/);\n }\n}\n\nclass RemoveRefConverter extends AbstractConverter {\n constructor(converter: Converter) {\n super(converter);\n }\n\n public process(input: string): string {\n let result = input || '';\n // A schema $ref'd via a JSON-pointer into #/paths (DigitalOcean shares schemas this way) carries\n // the whole pointer as its name; derive a clean tail name instead. see docs/issues.md #8\n if (result.includes('#/paths/')) {\n return nameFromPathsPointer(result);\n }\n if (result.includes('#/components/schemas/')) {\n result = result.replace(/#\\/components\\/schemas\\//g, '');\n }\n if (result.includes('#/components/responses/')) {\n result = result.replace(/#\\/components\\/responses\\//g, '');\n }\n if (result.includes('#/components/parameters/')) {\n result = result.replace(/#\\/components\\/parameters\\//g, '');\n }\n return result;\n }\n}\n\n// Structural JSON-pointer segments that don't make good type-name material.\nconst POINTER_NOISE = new Set([\n '#',\n 'paths',\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'responses',\n 'requestBody',\n 'content',\n 'schema',\n 'allOf',\n 'oneOf',\n 'anyOf',\n 'items',\n 'properties',\n 'parameters',\n]);\n\n/**\n * Derive a readable type name from a JSON pointer into `#/paths/...` (how DigitalOcean shares inline\n * schemas). See docs/issues.md #8.\n *\n * Input (a raw pointer, RFC-6901 encoded):\n * `#/paths/~1v2~1account~1keys/get/responses/200/content/application~1json/schema/.../properties/sshKeys/items`\n * Output (a bare name; the caller's `genTypeName` then capitalises it):\n * `sshKeysItem` -> `SshKeysItem`\n *\n * Rules: decode `~1`/`~0`, then take the segment right after the last `properties` (`sshKeys`); if the\n * pointer targets array `items`, append `Item`. If there's no `properties`, use the last meaningful\n * segment (skipping structural keywords, array indices, and decoded path keys that contain `/`); if\n * nothing qualifies, fall back to `inline`.\n */\nfunction nameFromPathsPointer(ref: string): string {\n const segments = ref.split('/').map((s) => s.replace(/~1/g, '/').replace(/~0/g, '~'));\n const propIdx = segments.lastIndexOf('properties');\n\n let base = propIdx >= 0 ? segments[propIdx + 1] : undefined;\n if (!base) {\n base = [...segments].reverse().find((s) => !POINTER_NOISE.has(s) && !/^\\d+$/.test(s) && !s.includes('/'));\n }\n if (!base) base = 'inline';\n\n return segments[segments.length - 1] === 'items' ? base + 'Item' : base;\n}\n\nclass FinalFirstUpperCaseConverter extends AbstractConverter {\n constructor() {\n super();\n }\n public process(input: string): string {\n return _.upperFirst(input);\n }\n}\n\nclass FinalConverter extends AbstractConverter {\n protected process(input: string): string {\n return input; // do nothing\n }\n}\n\nclass EncodeLeadingSignConverter extends AbstractConverter {\n // a leading sign would be dropped by the generic sanitiser, colliding `+1` and `-1` (github's\n // ReactionRollup) into one `_1` field — encode it into the name instead. see docs/issues.md #24\n public process(input: string): string {\n if (input.startsWith('+')) return 'plus' + input.substring(1);\n if (input.startsWith('-')) return 'minus' + input.substring(1);\n return input;\n }\n}\n\nclass ParamNameConverter extends AbstractConverter {\n public process(input: string): string {\n return Naming.genParamName(input);\n }\n}\n\nexport class Naming {\n public static genParamName(param: string): string {\n // Split on any run of non-alphanumeric characters, camelCase the parts, then\n // guarantee a valid GraphQL identifier: non-empty and not starting with a digit.\n // (Plain `[-_.]` splitting let spaces, `$`, `%`, … and leading digits through.)\n const camel = _.lowerFirst(Naming.capitaliseParts(param || '', /[^A-Za-z0-9]+/));\n if (camel.length === 0) {\n return Naming.NUMBER_PREFIX;\n }\n return /^[0-9]/.test(camel) ? Naming.NUMBER_PREFIX + camel : camel;\n }\n\n // Selection paths abbreviate component refs to stay readable (`#/components/schemas/Space`\n // -> `#/c/s/Space`); expandRef is the inverse, used when matching a path segment back\n // against node ids.\n public static abbreviateRef(path: string): string {\n return path.replace(/#\\/components\\/schemas/g, '#/c/s');\n }\n\n public static expandRef(path: string): string {\n return path.replace(/#\\/c\\/s/g, '#/components/schemas');\n }\n\n public static genTypeName(name: string): string {\n // guarantee a valid type identifier: drop any leftover non-identifier chars (e.g. the\n // `[`/`]`/`:` of an `[inline:Foo]` placeholder used as a name prefix), then non-empty +\n // no leading digit. Idempotent for valid names. see docs/issues.md #6, #9\n const cleaned = Naming.TYPE_CONVERTER.convert(name).replace(/[^_0-9A-Za-z]/g, '');\n if (cleaned.length === 0) {\n return Naming.NUMBER_PREFIX;\n }\n return /^[0-9]/.test(cleaned) ? Naming.NUMBER_PREFIX + cleaned : cleaned;\n }\n\n public static sanitiseField(name: string): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n return Naming.FIELD_CONVERTER.convert(fieldName);\n }\n\n public static sanitiseFieldForSelect(name: string, isInput: boolean = false): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n const sanitised = Naming.FIELD_CONVERTER.convert(fieldName);\n\n // The JSON key is already a valid identifier identical to the field — no alias needed.\n if (sanitised === name) {\n return sanitised;\n }\n\n if (isInput) {\n // Request-body direction: original JSON key <- GraphQL input field. The KEY is quoted\n // when it isn't a bare identifier (omni's `urn:omni:params:1.0:UserAttribute` broke the\n // parser unquoted); the field reference is always a bare identifier. see #32\n const key = /^[_A-Za-z][_0-9A-Za-z]*$/.test(name) ? name : `\"${name}\"`;\n return key + ': ' + sanitised;\n }\n\n // Response direction: safe GraphQL field <- original JSON key, always quoted (the key\n // is not a bare identifier — covers spaces, `$`, `%`, leading digits, etc.).\n const original = name.startsWith('@') ? name : fieldName;\n return `${sanitised}: \"${original}\"`;\n }\n\n public static genOperationName(path: string, operation: Operation): string {\n const parameters = operation.hasParameters()\n ? operation\n .getParameters()\n .filter((p) => p.required && p.in.toLowerCase() !== 'header')\n .map((p) => {\n const paramName = Naming.genParamName(p.name);\n return `By${_.upperFirst(paramName)}`;\n })\n : [];\n\n const result = Naming.formatPath(path, parameters);\n return _.lowerFirst(result);\n }\n\n public static genArrayItems(name: string): string {\n return _.upperFirst(Naming.genParamName(name)) + 'Item';\n }\n\n public static getRefName(ref: string): string {\n return ref ? Naming.REF_CONVERTER.convert(ref) : '';\n }\n\n public static formatPath(path: string, parameters: string[]): string {\n if (!path) {\n return path;\n }\n\n // Step 1: Remove parameters enclosed in {}.\n const paramsJoined = parameters.join('');\n let cleanedPath = path.replace(/\\{[^}]*\\}/g, paramsJoined);\n\n // Split `#` for GraphQL field names because SDL treats `#` as a comment marker. Box's\n // `/shared_items#web_links` becomes `shared_itemsWeb_links`; the connector HTTP path still\n // comes from operation.path as `GET: \"/shared_items#web_links\"`.\n cleanedPath = Naming.capitaliseParts(cleanedPath, /[:\\-.+#]+/);\n\n // Step 2: Split the path by \"/\" and capitalize each part.\n const capitalisedParts = Naming.capitaliseParts(cleanedPath, '/');\n\n // Step 3: Check if the path starts with a number and remove it if so\n // the pattern we are looking for is like so: /2.3.0/entrypoint\n if (/^\\d/.test(capitalisedParts)) {\n return capitalisedParts.replace(/^\\d+(?=[a-zA-Z])/g, '');\n }\n\n return capitalisedParts;\n }\n\n public static capitaliseParts(input: string, splitPattern: RegExp | string): string {\n // If splitPattern is a string, convert it to a RegExp.\n const regex = typeof splitPattern === 'string' ? new RegExp(splitPattern, 'g') : splitPattern;\n\n // Split the input, capitalize each non-empty part, and join them back together.\n return input\n .split(regex)\n .map((part) => (part ? _.upperFirst(part) : ''))\n .join('');\n }\n private static readonly TYPE_CONVERTER: Converter = new RemoveRefConverter(\n new CapitalisePartsConverter(new FinalFirstUpperCaseConverter()),\n );\n\n private static readonly REF_CONVERTER: Converter = new RemoveRefConverter(new FinalConverter());\n\n private static readonly FIELD_CONVERTER: Converter = new EncodeLeadingSignConverter(\n new ParamNameConverter(new FinalConverter()),\n );\n\n // internal stuff\n private static readonly NUMBER_PREFIX = '_';\n\n public formatPath(path: string, parameters: string[]): string {\n // Replace with your actual formatting logic.\n // This example simply concatenates the parameters to the path.\n return path + parameters.join('');\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apollo-conn-gen",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "Library to generate Apollo connector schemas from OpenAPI specs or JSON payloads. Also includes a CLI to generate connectors from the command line.",
|
|
5
5
|
"author": "Fernando @ Apollo",
|
|
6
6
|
"license": "MIT",
|