apollo-conn-gen 0.15.2 → 0.15.3
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/schemaWriter.d.ts +0 -1
- package/dist/oas/io/schemaWriter.js +3 -14
- package/dist/oas/io/schemaWriter.js.map +1 -1
- package/dist/oas/nodes/param.d.ts +2 -0
- package/dist/oas/nodes/param.js +26 -1
- package/dist/oas/nodes/param.js.map +1 -1
- package/dist/oas/nodes/propMap.js +7 -7
- package/dist/oas/nodes/propMap.js.map +1 -1
- package/dist/oas/nodes/union.d.ts +1 -0
- package/dist/oas/nodes/union.js +19 -13
- package/dist/oas/nodes/union.js.map +1 -1
- package/dist/oas/utils/serverUrl.d.ts +5 -0
- package/dist/oas/utils/serverUrl.js +25 -0
- package/dist/oas/utils/serverUrl.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DEFAULT_VERSIONS } from '../../versions.js';
|
|
2
|
+
import { ServerUrl } from '../utils/serverUrl.js';
|
|
2
3
|
export class SchemaWriter {
|
|
3
4
|
gen;
|
|
4
5
|
security;
|
|
@@ -11,8 +12,8 @@ export class SchemaWriter {
|
|
|
11
12
|
}
|
|
12
13
|
writeDirectives(writer) {
|
|
13
14
|
const api = this.gen.parser;
|
|
14
|
-
//
|
|
15
|
-
const host = this.gen.options.baseURL ??
|
|
15
|
+
// an explicit baseURL wins; otherwise pick a usable server. see docs/issues.md #41
|
|
16
|
+
const host = this.gen.options.baseURL ?? ServerUrl.resolve(api.getDefinition().servers);
|
|
16
17
|
const federationVersion = this.gen.options.federationVersion || DEFAULT_VERSIONS.federationVersion;
|
|
17
18
|
const connectorSpecVersion = this.gen.options.connectorSpecVersion || DEFAULT_VERSIONS.connectorSpecVersion;
|
|
18
19
|
const authHeader = this.security.sourceHeader();
|
|
@@ -30,17 +31,5 @@ export class SchemaWriter {
|
|
|
30
31
|
writer.write(' @source(name: "api", http: { baseURL: "').write(host).write('" })\n\n');
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
|
-
getServerUrl(server) {
|
|
34
|
-
if (!server) {
|
|
35
|
-
return 'http://localhost:4010';
|
|
36
|
-
}
|
|
37
|
-
let url = server.url;
|
|
38
|
-
if (server.variables) {
|
|
39
|
-
for (const key in server.variables) {
|
|
40
|
-
url = url.replace('{' + key + '}', server.variables[key].default);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return url;
|
|
44
|
-
}
|
|
45
34
|
}
|
|
46
35
|
//# sourceMappingURL=schemaWriter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaWriter.js","sourceRoot":"","sources":["../../../src/oas/io/schemaWriter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schemaWriter.js","sourceRoot":"","sources":["../../../src/oas/io/schemaWriter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,OAAO,YAAY;IAEb;IACA;IAFV,YACU,GAAW,EACX,QAAsB;QADtB,QAAG,GAAH,GAAG,CAAQ;QACX,aAAQ,GAAR,QAAQ,CAAc;IAC7B,CAAC;IAEG,eAAe,CAAC,MAAc;QACnC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACpC,CAAC;IAEM,eAAe,CAAC,MAAc;QACnC,MAAM,GAAG,GAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QACjC,mFAAmF;QACnF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;QACxF,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,gBAAgB,CAAC,iBAAiB,CAAC;QACnG,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,IAAI,gBAAgB,CAAC,oBAAoB,CAAC;QAC5G,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAChD,MAAM;aACH,KAAK,CAAC,iBAAiB,CAAC;aACxB,KAAK,CAAC,qDAAqD,iBAAiB,wBAAwB,CAAC;aACrG,KAAK,CAAC,YAAY,CAAC;aACnB,KAAK,CAAC,8CAA8C,oBAAoB,KAAK,CAAC;aAC9E,KAAK,CAAC,uCAAuC,CAAC;aAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QAElB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,4CAA4C,IAAI,gBAAgB,UAAU,UAAU,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;CACF","sourcesContent":["import Oas from 'oas';\nimport { DEFAULT_VERSIONS } from '../../versions.js';\nimport { OasGen } from '../oasGen.js';\nimport { Writer } from './writer.js';\nimport { SecurityPlan } from './security.js';\nimport { ServerUrl } from '../utils/serverUrl.js';\n\nexport class SchemaWriter {\n constructor(\n private gen: OasGen,\n private security: SecurityPlan,\n ) {}\n\n public writeJSONScalar(writer: Writer): void {\n writer.write('\\nscalar JSON\\n\\n');\n }\n\n public writeDirectives(writer: Writer): void {\n const api: Oas = this.gen.parser;\n // an explicit baseURL wins; otherwise pick a usable server. see docs/issues.md #41\n const host = this.gen.options.baseURL ?? ServerUrl.resolve(api.getDefinition().servers);\n const federationVersion = this.gen.options.federationVersion || DEFAULT_VERSIONS.federationVersion;\n const connectorSpecVersion = this.gen.options.connectorSpecVersion || DEFAULT_VERSIONS.connectorSpecVersion;\n const authHeader = this.security.sourceHeader();\n writer\n .write('extend schema\\n')\n .write(` @link(url: \"https://specs.apollo.dev/federation/${federationVersion}\", import: [\"@key\"])\\n`)\n .write(' @link(\\n')\n .write(` url: \"https://specs.apollo.dev/connect/${connectorSpecVersion}\"\\n`)\n .write(' import: [\"@connect\", \"@source\"]\\n')\n .write(' )\\n');\n\n if (authHeader) {\n writer.write(` @source(name: \"api\", http: { baseURL: \"${host}\", headers: [${authHeader}] })\\n\\n`);\n } else {\n writer.write(' @source(name: \"api\", http: { baseURL: \"').write(host).write('\" })\\n\\n');\n }\n }\n}\n"]}
|
|
@@ -13,5 +13,7 @@ export declare class Param extends Type {
|
|
|
13
13
|
generate(context: OasContext, writer: Writer, selection: string[]): void;
|
|
14
14
|
forPrompt(context: OasContext): string;
|
|
15
15
|
select(context: OasContext, writer: Writer, selection: string[]): void;
|
|
16
|
+
private static degradeObjectLikeSchema;
|
|
17
|
+
private static isObjectLike;
|
|
16
18
|
private writeDefaultValue;
|
|
17
19
|
}
|
package/dist/oas/nodes/param.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Factory, Type } from './internal.js';
|
|
2
|
+
import _ from 'lodash';
|
|
2
3
|
import { trace } from '../log/trace.js';
|
|
3
4
|
import { Naming } from '../utils/naming.js';
|
|
4
5
|
export class Param extends Type {
|
|
@@ -23,7 +24,9 @@ export class Param extends Type {
|
|
|
23
24
|
// A GraphQL argument must be a single scalar; a param schema that is anyOf/oneOf (e.g.
|
|
24
25
|
// DigitalOcean's `id | fingerprint` path param) has no single arg type — coerce to String.
|
|
25
26
|
// see docs/issues.md #11
|
|
26
|
-
const argSchema = this.schema && (this.schema.anyOf || this.schema.oneOf)
|
|
27
|
+
const argSchema = this.schema && (this.schema.anyOf || this.schema.oneOf)
|
|
28
|
+
? { type: 'string' }
|
|
29
|
+
: Param.degradeObjectLikeSchema(context, this.schema);
|
|
27
30
|
const type = Factory.fromSchema(context, this, argSchema);
|
|
28
31
|
this.add(type);
|
|
29
32
|
this.resultType = type;
|
|
@@ -53,6 +56,28 @@ export class Param extends Type {
|
|
|
53
56
|
select(context, writer, selection) {
|
|
54
57
|
// do nothing
|
|
55
58
|
}
|
|
59
|
+
// A GraphQL argument can't carry an inline object/allOf body either (same problem as the
|
|
60
|
+
// anyOf/oneOf coercion above) — degrade it, or just an array's items, to the existing
|
|
61
|
+
// shapeless-object -> JSON scalar fallback (#19), so array cardinality survives ([JSON], not
|
|
62
|
+
// JSON). see docs/issues.md #40
|
|
63
|
+
static degradeObjectLikeSchema(context, schema) {
|
|
64
|
+
if (Param.isObjectLike(context, schema)) {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
if (schema?.type === 'array' && schema.items && Param.isObjectLike(context, schema.items)) {
|
|
68
|
+
return { ...schema, items: {} };
|
|
69
|
+
}
|
|
70
|
+
return schema;
|
|
71
|
+
}
|
|
72
|
+
// resolves a bare $ref (read-only — resolvePointer, not lookupRef, so this sniff doesn't bump
|
|
73
|
+
// refCount for a schema we're about to discard) and checks whether it's the kind of object
|
|
74
|
+
// Factory routes to Obj/Composed (oneOf/anyOf go through Union instead, already handled there).
|
|
75
|
+
static isObjectLike(context, schema) {
|
|
76
|
+
if (!schema)
|
|
77
|
+
return false;
|
|
78
|
+
const resolved = ('$ref' in schema ? context.resolvePointer(schema.$ref ?? null) : schema);
|
|
79
|
+
return !!resolved && (resolved.type === 'object' || resolved.allOf != null || !_.isEmpty(resolved.properties));
|
|
80
|
+
}
|
|
56
81
|
// Emit ` = <value>` only for types we can render as a GraphQL literal; otherwise skip the whole
|
|
57
82
|
// default (a dangling ` = ` is a compose syntax error, an omitted default is always valid). #17
|
|
58
83
|
writeDefaultValue(writer) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param.js","sourceRoot":"","sources":["../../../src/oas/nodes/param.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"param.js","sourceRoot":"","sources":["../../../src/oas/nodes/param.ts"],"names":[],"mappings":"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","sourcesContent":["import { Factory, IType, ReferenceObject, Type } from './internal.js';\nimport { ParameterObject, SchemaObject } from 'oas/types';\nimport _ from 'lodash';\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 Param extends Type {\n public resultType!: IType;\n\n constructor(\n parent: IType,\n name: string,\n public schema: SchemaObject,\n public required: boolean,\n public defaultValue: unknown,\n public parameter: ParameterObject,\n ) {\n super(parent, name);\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n context.enter(this);\n trace(context, '-> [param:visit]', 'in: ' + this.name);\n\n // A GraphQL argument must be a single scalar; a param schema that is anyOf/oneOf (e.g.\n // DigitalOcean's `id | fingerprint` path param) has no single arg type — coerce to String.\n // see docs/issues.md #11\n const argSchema =\n this.schema && (this.schema.anyOf || this.schema.oneOf)\n ? ({ type: 'string' } as SchemaObject)\n : Param.degradeObjectLikeSchema(context, this.schema);\n const type = Factory.fromSchema(context, this, argSchema);\n this.add(type);\n\n this.resultType = type;\n trace(context, ' [param:visit]', 'type: ' + this.resultType);\n this.resultType.visit(context);\n\n trace(context, '<- [param: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, '-> [param::generate]', `-> in: ${this.name}`);\n\n writer.write(Naming.genParamName(this.name));\n writer.write(': ');\n\n this.resultType.generate(context, writer, selection);\n\n if (this.required) {\n writer.write('!');\n }\n\n if (this.defaultValue !== null && this.defaultValue !== undefined) {\n this.writeDefaultValue(writer);\n }\n\n trace(context, '<- [param::generate]', `-> out: ${this.name}`);\n context.leave(this);\n }\n\n public forPrompt(context: OasContext): string {\n return `Param{ name=${this.name}, required=${this.required}, defaultValue=${this.defaultValue}, props=${this.props}, resultType=${this.resultType} }`;\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n // do nothing\n }\n\n // A GraphQL argument can't carry an inline object/allOf body either (same problem as the\n // anyOf/oneOf coercion above) — degrade it, or just an array's items, to the existing\n // shapeless-object -> JSON scalar fallback (#19), so array cardinality survives ([JSON], not\n // JSON). see docs/issues.md #40\n private static degradeObjectLikeSchema(context: OasContext, schema: SchemaObject): SchemaObject {\n if (Param.isObjectLike(context, schema)) {\n return {} as SchemaObject;\n }\n if (schema?.type === 'array' && schema.items && Param.isObjectLike(context, schema.items as SchemaObject)) {\n return { ...schema, items: {} } as SchemaObject;\n }\n return schema;\n }\n\n // resolves a bare $ref (read-only — resolvePointer, not lookupRef, so this sniff doesn't bump\n // refCount for a schema we're about to discard) and checks whether it's the kind of object\n // Factory routes to Obj/Composed (oneOf/anyOf go through Union instead, already handled there).\n private static isObjectLike(context: OasContext, schema: SchemaObject | ReferenceObject | undefined): boolean {\n if (!schema) return false;\n const resolved = ('$ref' in schema ? context.resolvePointer(schema.$ref ?? null) : schema) as\n | SchemaObject\n | undefined;\n return !!resolved && (resolved.type === 'object' || resolved.allOf != null || !_.isEmpty(resolved.properties));\n }\n\n // Emit ` = <value>` only for types we can render as a GraphQL literal; otherwise skip the whole\n // default (a dangling ` = ` is a compose syntax error, an omitted default is always valid). #17\n private writeDefaultValue(writer: Writer): void {\n const value = this.defaultValue;\n\n if (typeof value === 'number') {\n writer.write(' = ').write(value.toString());\n } else if (typeof value === 'boolean') {\n writer.write(' = ').write(value ? 'true' : 'false');\n } else if (typeof value === 'string') {\n writer.write(' = \"').write(String(value)).write('\"');\n }\n }\n}\n"]}
|
|
@@ -45,13 +45,13 @@ export class PropMap extends Prop {
|
|
|
45
45
|
trace(context, '-> [prop-map:select]', 'in ' + this.name + ', map: ' + this.map.name);
|
|
46
46
|
const fieldName = this.name;
|
|
47
47
|
const sanitised = Naming.sanitiseFieldForSelect(fieldName, this.parent?.kind === 'input');
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
.write(sanitised);
|
|
54
|
-
|
|
48
|
+
// sanitised is already "alias: \"original\"" when the JSON key needs one — write it once. When
|
|
49
|
+
// it doesn't (sanitised === fieldName), keep a self-alias (name: name); some composers need it
|
|
50
|
+
// to credit fields through ->entries, and it's harmless either way.
|
|
51
|
+
writer.write(' '.repeat(context.indent + context.stack.length)).write(sanitised);
|
|
52
|
+
if (sanitised === fieldName) {
|
|
53
|
+
writer.write(': ').write(sanitised);
|
|
54
|
+
}
|
|
55
55
|
writer.write('->entries {').write('\n');
|
|
56
56
|
context.enter(this);
|
|
57
57
|
// Generate the key-value selection structure
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propMap.js","sourceRoot":"","sources":["../../../src/oas/nodes/propMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,IAAI,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,OAAQ,SAAQ,IAAI;IAItB;IACA;IAJT,YACE,MAAa,EACb,IAAY,EACL,MAAoB,EACpB,GAAQ;QAEf,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAHrB,WAAM,GAAN,MAAM,CAAc;QACpB,QAAG,GAAH,GAAG,CAAK;QAGf,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,+CAA+C;QAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,QAAoB;QACnC,OAAO,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;IAClG,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,OAAmB;QAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAErF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtF,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAEM,QAAQ,CAAC,OAAmB;QACjC,iGAAiG;QACjG,OAAO,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC;IAC/E,CAAC;IAEM,MAAM,CAAC,OAAmB,EAAE,MAAc,EAAE,SAAmB;QACpE,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEtF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC;QAE1F,oEAAoE;QACpE,MAAM
|
|
1
|
+
{"version":3,"file":"propMap.js","sourceRoot":"","sources":["../../../src/oas/nodes/propMap.ts"],"names":[],"mappings":"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","sourcesContent":["import { IType, Map, Prop } from './internal.js';\nimport _ from 'lodash';\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 PropMap extends Prop {\n constructor(\n parent: IType,\n name: string,\n public schema: SchemaObject,\n public map: Map,\n ) {\n super(parent, name, schema);\n if (!map) {\n throw new Error('map parameter is required');\n }\n\n // Re-parent the map to this property if needed\n if (map.parent !== this) {\n map.parent = this;\n }\n }\n\n public forPrompt(_context: OasContext): string {\n return '[prop] ' + _.lowerFirst(this.name) + ': ' + Naming.getRefName(this.map.name) + ' (Map)';\n }\n\n get id(): string {\n return 'prop:map:' + 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, '-> [prop-map:visit]', 'in ' + this.name + ', map: ' + this.map.name);\n\n this.map.visit(context);\n if (!this.children.includes(this.map)) {\n this.add(this.map);\n }\n this.visited = true;\n\n trace(context, '<- [prop-map:visit]', 'out ' + this.name + ', map: ' + this.map.name);\n context.leave(this);\n }\n\n public getValue(context: OasContext): string {\n // For maps, we return the generated map type name as an array without hardcoded required markers\n return '[' + Naming.genTypeName(this.map.name) + this.map.nameSuffix() + ']';\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n trace(context, '-> [prop-map:select]', 'in ' + this.name + ', map: ' + this.map.name);\n\n const fieldName = this.name;\n const sanitised = Naming.sanitiseFieldForSelect(fieldName, this.parent?.kind === 'input');\n\n // sanitised is already \"alias: \\\"original\\\"\" when the JSON key needs one — write it once. When\n // it doesn't (sanitised === fieldName), keep a self-alias (name: name); some composers need it\n // to credit fields through ->entries, and it's harmless either way.\n writer.write(' '.repeat(context.indent + context.stack.length)).write(sanitised);\n if (sanitised === fieldName) {\n writer.write(': ').write(sanitised);\n }\n writer.write('->entries {').write('\\n');\n context.enter(this);\n\n // Generate the key-value selection structure\n writer.write(' '.repeat(context.indent + context.stack.length)).write('key\\n');\n writer.write(' '.repeat(context.indent + context.stack.length)).write('value');\n\n // If the value type has complex structure, we need to expand it\n if (this.map.valueType && this.needsValueSelection()) {\n writer.write(' {').write('\\n');\n context.enter(this);\n this.map.valueType.select(context, writer, selection);\n context.leave(this);\n writer.write(' '.repeat(context.indent + context.stack.length)).write('}');\n }\n writer.write('\\n');\n\n context.leave(this);\n writer.write(' '.repeat(context.indent + context.stack.length)).write('}');\n\n if (context.generateOptions.showParentInSelections) {\n writer.write(' # ').write(Naming.getRefName(this.parent!.name));\n }\n\n writer.write('\\n');\n\n trace(context, '<- [prop-map:select]', 'out ' + this.name + ', map: ' + this.map.name);\n }\n\n private needsValueSelection(): boolean {\n return Boolean(this.map.valueType && !this.map.valueType.name?.match(/^(String|Int|Float|Boolean|JSON)$/));\n }\n\n dependencies(): IType[] {\n return [this.map];\n }\n\n private needsBrackets(): boolean {\n return Boolean(this.map && this.map.valueType && !_.isEmpty(this.map.props));\n }\n}\n"]}
|
|
@@ -19,6 +19,7 @@ export declare class Union extends Type {
|
|
|
19
19
|
isFlat(): boolean;
|
|
20
20
|
generate(context: OasContext, writer: Writer, selection: string[]): void;
|
|
21
21
|
private generateMergedObject;
|
|
22
|
+
private dedupedSelectedProps;
|
|
22
23
|
add(child: IType): IType;
|
|
23
24
|
private selectedMembers;
|
|
24
25
|
dependencies(context: OasContext, selection: string[]): IType[];
|
package/dist/oas/nodes/union.js
CHANGED
|
@@ -150,16 +150,26 @@ export class Union extends Type {
|
|
|
150
150
|
.write(' { #### replacement for Union ')
|
|
151
151
|
.write(name)
|
|
152
152
|
.write('\n');
|
|
153
|
-
const
|
|
154
|
-
const generated = new Set();
|
|
155
|
-
for (const prop of selected) {
|
|
153
|
+
for (const prop of this.dedupedSelectedProps(selection)) {
|
|
156
154
|
trace(context, ' [union::generate]', `-> property: ${prop.name} (parent: ${prop.parent.name})`);
|
|
157
|
-
|
|
158
|
-
prop.generate(context, writer, selection);
|
|
159
|
-
generated.add(prop.id);
|
|
155
|
+
prop.generate(context, writer, selection);
|
|
160
156
|
}
|
|
161
157
|
writer.write('} \n### End replacement for ').write(this.name).write('\n\n');
|
|
162
158
|
}
|
|
159
|
+
// Two members can name a field the same but give it different types, e.g. in the OAS:
|
|
160
|
+
// LaunchNormal: { rocket: { $ref: '#/…/RocketNormal' } }
|
|
161
|
+
// LaunchDetailed: { rocket: { $ref: '#/…/RocketDetailed' } }
|
|
162
|
+
// Only the first is ever written to the merged type, so the other's type must not be emitted
|
|
163
|
+
// either. see docs/issues.md #39
|
|
164
|
+
dedupedSelectedProps(selection) {
|
|
165
|
+
const seen = new Set();
|
|
166
|
+
return this.selectedProps(selection).filter((prop) => {
|
|
167
|
+
if (seen.has(prop.id))
|
|
168
|
+
return false;
|
|
169
|
+
seen.add(prop.id);
|
|
170
|
+
return true;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
163
173
|
// two inline members easily share a name (`[inline:Input]` twice) — same suffixing as Composed
|
|
164
174
|
add(child) {
|
|
165
175
|
return super.add(this.withUniqueName(child));
|
|
@@ -178,7 +188,7 @@ export class Union extends Type {
|
|
|
178
188
|
// the writer may promote to an interface — R2); a merged one needs its flat fields instead
|
|
179
189
|
dependencies(context, selection) {
|
|
180
190
|
if (this.isFlat()) {
|
|
181
|
-
return this.
|
|
191
|
+
return this.dedupedSelectedProps(selection);
|
|
182
192
|
}
|
|
183
193
|
// only members with a selected field are reachable (#26, #36); an allOf member also pulls in the
|
|
184
194
|
// $ref base it extends — `Book: allOf [$ref Product, …]` -> Product (r2-interface-shared-base.yaml).
|
|
@@ -202,12 +212,8 @@ export class Union extends Type {
|
|
|
202
212
|
trace(context, '<- [union::select]', `-> out: ${this.name}`);
|
|
203
213
|
return;
|
|
204
214
|
}
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
for (const prop of selected) {
|
|
208
|
-
if (!generated.has(prop.id))
|
|
209
|
-
prop.select(context, writer, selection);
|
|
210
|
-
generated.add(prop.id);
|
|
215
|
+
for (const prop of this.dedupedSelectedProps(selection)) {
|
|
216
|
+
prop.select(context, writer, selection);
|
|
211
217
|
}
|
|
212
218
|
/* TODO: better selection for Unions
|
|
213
219
|
dataPoints: dataFormat->match(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/oas/nodes/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arr, 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\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 // promoteAllOfBase (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 }\n\n this.visited = true;\n trace(context, '<- [union:visit]', 'out: ' + schemas);\n context.leave(this);\n }\n\n // True when this union IS the op's response (optionally under a bare array), not nested inside a\n // field. This composes fine:\n // get:/item -> oneOf [Book, Movie]\n // This doesn't — launch library's real shape, rover won't resolve anything inside the match:\n // PaginatedAgencyList.results: [ oneOf [AgencyMini, AgencyNormal, AgencyDetailed] ]\n // see docs/issues.md #38\n public isTopLevelResponse(): boolean {\n let node: IType | undefined = this.parent;\n while (node instanceof Arr) {\n node = node.parent;\n }\n return node instanceof Res;\n }\n\n // A union becomes one flat merged type, not a real `union`/interface, when: it's a request body\n // (GraphQL has no input unions), it has no tag field to pick a branch (#25), or it's nested\n // inside a field rather than being the op's own response (#38). see docs/issues.md #25, #38\n public isFlat(): boolean {\n return this.kind === 'input' || !this.discriminator || !this.isTopLevelResponse();\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 (this.isFlat()) {\n // No real union here: an input-position oneOf (GraphQL has no input unions) or no\n // discriminator (no tag for `->match`). Emit the merged object — the selection falls back to\n // the same flat form (see select), so SDL and selection agree. see docs/issues.md #25, #36\n this.generateMergedObject(context, writer, selection, name, '#### union degraded to a merged object: ');\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 // output + discriminator: a real `union X = A | B`. Filtering by prop-parent identity broke\n // for 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 (this.isFlat()) {\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: for a real output `union X = A | B` (output position + discriminator) produce the\n // composable abstract-type selection (connect v0.4): a spread `->match` whose branches set a\n // string-literal __typename per member. Merged-object unions (input position or no discriminator)\n // fall back to the flat selection below. see docs/issues.md #25, #36\n if (!this.isFlat()) {\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 /* 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"]}
|
|
1
|
+
{"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/oas/nodes/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arr, 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\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 // promoteAllOfBase (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 }\n\n this.visited = true;\n trace(context, '<- [union:visit]', 'out: ' + schemas);\n context.leave(this);\n }\n\n // True when this union IS the op's response (optionally under a bare array), not nested inside a\n // field. This composes fine:\n // get:/item -> oneOf [Book, Movie]\n // This doesn't — launch library's real shape, rover won't resolve anything inside the match:\n // PaginatedAgencyList.results: [ oneOf [AgencyMini, AgencyNormal, AgencyDetailed] ]\n // see docs/issues.md #38\n public isTopLevelResponse(): boolean {\n let node: IType | undefined = this.parent;\n while (node instanceof Arr) {\n node = node.parent;\n }\n return node instanceof Res;\n }\n\n // A union becomes one flat merged type, not a real `union`/interface, when: it's a request body\n // (GraphQL has no input unions), it has no tag field to pick a branch (#25), or it's nested\n // inside a field rather than being the op's own response (#38). see docs/issues.md #25, #38\n public isFlat(): boolean {\n return this.kind === 'input' || !this.discriminator || !this.isTopLevelResponse();\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 (this.isFlat()) {\n // No real union here: an input-position oneOf (GraphQL has no input unions) or no\n // discriminator (no tag for `->match`). Emit the merged object — the selection falls back to\n // the same flat form (see select), so SDL and selection agree. see docs/issues.md #25, #36\n this.generateMergedObject(context, writer, selection, name, '#### union degraded to a merged object: ');\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 // output + discriminator: a real `union X = A | B`. Filtering by prop-parent identity broke\n // for 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 for (const prop of this.dedupedSelectedProps(selection)) {\n trace(context, ' [union::generate]', `-> property: ${prop.name} (parent: ${prop.parent!.name})`);\n prop.generate(context, writer, selection);\n }\n\n writer.write('} \\n### End replacement for ').write(this.name).write('\\n\\n');\n }\n\n // Two members can name a field the same but give it different types, e.g. in the OAS:\n // LaunchNormal: { rocket: { $ref: '#/…/RocketNormal' } }\n // LaunchDetailed: { rocket: { $ref: '#/…/RocketDetailed' } }\n // Only the first is ever written to the merged type, so the other's type must not be emitted\n // either. see docs/issues.md #39\n private dedupedSelectedProps(selection: string[]): Prop[] {\n const seen = new Set<string>();\n return this.selectedProps(selection).filter((prop) => {\n if (seen.has(prop.id)) return false;\n seen.add(prop.id);\n return true;\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 (this.isFlat()) {\n return this.dedupedSelectedProps(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: for a real output `union X = A | B` (output position + discriminator) produce the\n // composable abstract-type selection (connect v0.4): a spread `->match` whose branches set a\n // string-literal __typename per member. Merged-object unions (input position or no discriminator)\n // fall back to the flat selection below. see docs/issues.md #25, #36\n if (!this.isFlat()) {\n this.selectAbstract(context, writer, selection);\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n return;\n }\n\n for (const prop of this.dedupedSelectedProps(selection)) {\n prop.select(context, writer, selection);\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"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Picks the OAS server to use as the connector's baseURL, e.g.
|
|
2
|
+
// servers: [{ url: '/v1.33' }, { url: 'https://docker.com/1.33' }]
|
|
3
|
+
// skips the first one (no host) and uses the second. see docs/issues.md #41
|
|
4
|
+
export class ServerUrl {
|
|
5
|
+
static resolve(servers) {
|
|
6
|
+
for (const server of servers ?? []) {
|
|
7
|
+
const url = ServerUrl.substituteVariables(server);
|
|
8
|
+
// "//host" (no http/https) just needs a scheme added, not a new host
|
|
9
|
+
const normalized = url.startsWith('//') ? `https:${url}` : url;
|
|
10
|
+
if (/^https?:\/\//i.test(normalized))
|
|
11
|
+
return normalized;
|
|
12
|
+
}
|
|
13
|
+
return 'http://localhost:4010';
|
|
14
|
+
}
|
|
15
|
+
static substituteVariables(server) {
|
|
16
|
+
let url = server.url;
|
|
17
|
+
if (server.variables) {
|
|
18
|
+
for (const key in server.variables) {
|
|
19
|
+
url = url.replace('{' + key + '}', server.variables[key].default);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return url;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=serverUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverUrl.js","sourceRoot":"","sources":["../../../src/oas/utils/serverUrl.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,qEAAqE;AACrE,4EAA4E;AAC5E,MAAM,OAAO,SAAS;IACb,MAAM,CAAC,OAAO,CAAC,OAAmC;QACvD,KAAK,MAAM,MAAM,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAClD,qEAAqE;YACrE,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,IAAI,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,OAAO,UAAU,CAAC;QAC1D,CAAC;QACD,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAAC,MAAoB;QACrD,IAAI,GAAG,GAAW,MAAM,CAAC,GAAG,CAAC;QAC7B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF","sourcesContent":["import { ServerObject } from 'oas/types';\n\n// Picks the OAS server to use as the connector's baseURL, e.g.\n// servers: [{ url: '/v1.33' }, { url: 'https://docker.com/1.33' }]\n// skips the first one (no host) and uses the second. see docs/issues.md #41\nexport class ServerUrl {\n public static resolve(servers: ServerObject[] | undefined): string {\n for (const server of servers ?? []) {\n const url = ServerUrl.substituteVariables(server);\n // \"//host\" (no http/https) just needs a scheme added, not a new host\n const normalized = url.startsWith('//') ? `https:${url}` : url;\n if (/^https?:\\/\\//i.test(normalized)) return normalized;\n }\n return 'http://localhost:4010';\n }\n\n private static substituteVariables(server: ServerObject): string {\n let url: string = server.url;\n if (server.variables) {\n for (const key in server.variables) {\n url = url.replace('{' + key + '}', server.variables[key].default);\n }\n }\n return url;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/index.ts","../src/versions.ts","../src/cli/json.ts","../src/cli/oas.ts","../src/cli/oas-helpers/index.ts","../src/json/index.ts","../src/json/io/index.ts","../src/json/io/writer.ts","../src/json/walker/index.ts","../src/json/walker/jsoncontext.ts","../src/json/walker/jsongen.ts","../src/json/walker/naming.ts","../src/json/walker/log/trace.ts","../src/json/walker/types/index.ts","../src/json/walker/types/jsonarray.ts","../src/json/walker/types/jsonobj.ts","../src/json/walker/types/jsonscalar.ts","../src/json/walker/types/jsontype.ts","../src/oas/index.ts","../src/oas/oascontext.ts","../src/oas/oasgen.ts","../src/oas/generator/typescollector.ts","../src/oas/io/errorswriter.ts","../src/oas/io/operationwriter.ts","../src/oas/io/schemawriter.ts","../src/oas/io/security.ts","../src/oas/io/writer.ts","../src/oas/log/trace.ts","../src/oas/mapper/index.ts","../src/oas/mapper/loader.ts","../src/oas/mapper/namemapper.ts","../src/oas/mapper/types.ts","../src/oas/nodes/allofbase.ts","../src/oas/nodes/arr.ts","../src/oas/nodes/batch.ts","../src/oas/nodes/body.ts","../src/oas/nodes/circularref.ts","../src/oas/nodes/comp.ts","../src/oas/nodes/delete.ts","../src/oas/nodes/en.ts","../src/oas/nodes/entity.ts","../src/oas/nodes/factory.ts","../src/oas/nodes/get.ts","../src/oas/nodes/itype.ts","../src/oas/nodes/internal.ts","../src/oas/nodes/map.ts","../src/oas/nodes/obj.ts","../src/oas/nodes/op.ts","../src/oas/nodes/param.ts","../src/oas/nodes/patch.ts","../src/oas/nodes/post.ts","../src/oas/nodes/prop.ts","../src/oas/nodes/proparray.ts","../src/oas/nodes/propcircref.ts","../src/oas/nodes/propcomp.ts","../src/oas/nodes/propen.ts","../src/oas/nodes/propmap.ts","../src/oas/nodes/propobj.ts","../src/oas/nodes/propref.ts","../src/oas/nodes/propscalar.ts","../src/oas/nodes/put.ts","../src/oas/nodes/ref.ts","../src/oas/nodes/refcircref.ts","../src/oas/nodes/referenceobject.ts","../src/oas/nodes/res.ts","../src/oas/nodes/scalar.ts","../src/oas/nodes/type.ts","../src/oas/nodes/typeutils.ts","../src/oas/nodes/union.ts","../src/oas/prompts/prompt.ts","../src/oas/prompts/theme.ts","../src/oas/prompts/base/theme.ts","../src/oas/prompts/base/utils.ts","../src/oas/schemas/index.ts","../src/oas/utils/gql.ts","../src/oas/utils/naming.ts","../src/oas/utils/params.ts","../src/oas/visitor/generatorvisitor.ts","../src/oas/visitor/nodevisitor.ts","../src/oas/visitor/example.ts","../src/oas/visitor/index.ts","../src/tests/runners.ts"],"version":"5.8.2"}
|
|
1
|
+
{"root":["../src/index.ts","../src/versions.ts","../src/cli/json.ts","../src/cli/oas.ts","../src/cli/oas-helpers/index.ts","../src/json/index.ts","../src/json/io/index.ts","../src/json/io/writer.ts","../src/json/walker/index.ts","../src/json/walker/jsoncontext.ts","../src/json/walker/jsongen.ts","../src/json/walker/naming.ts","../src/json/walker/log/trace.ts","../src/json/walker/types/index.ts","../src/json/walker/types/jsonarray.ts","../src/json/walker/types/jsonobj.ts","../src/json/walker/types/jsonscalar.ts","../src/json/walker/types/jsontype.ts","../src/oas/index.ts","../src/oas/oascontext.ts","../src/oas/oasgen.ts","../src/oas/generator/typescollector.ts","../src/oas/io/errorswriter.ts","../src/oas/io/operationwriter.ts","../src/oas/io/schemawriter.ts","../src/oas/io/security.ts","../src/oas/io/writer.ts","../src/oas/log/trace.ts","../src/oas/mapper/index.ts","../src/oas/mapper/loader.ts","../src/oas/mapper/namemapper.ts","../src/oas/mapper/types.ts","../src/oas/nodes/allofbase.ts","../src/oas/nodes/arr.ts","../src/oas/nodes/batch.ts","../src/oas/nodes/body.ts","../src/oas/nodes/circularref.ts","../src/oas/nodes/comp.ts","../src/oas/nodes/delete.ts","../src/oas/nodes/en.ts","../src/oas/nodes/entity.ts","../src/oas/nodes/factory.ts","../src/oas/nodes/get.ts","../src/oas/nodes/itype.ts","../src/oas/nodes/internal.ts","../src/oas/nodes/map.ts","../src/oas/nodes/obj.ts","../src/oas/nodes/op.ts","../src/oas/nodes/param.ts","../src/oas/nodes/patch.ts","../src/oas/nodes/post.ts","../src/oas/nodes/prop.ts","../src/oas/nodes/proparray.ts","../src/oas/nodes/propcircref.ts","../src/oas/nodes/propcomp.ts","../src/oas/nodes/propen.ts","../src/oas/nodes/propmap.ts","../src/oas/nodes/propobj.ts","../src/oas/nodes/propref.ts","../src/oas/nodes/propscalar.ts","../src/oas/nodes/put.ts","../src/oas/nodes/ref.ts","../src/oas/nodes/refcircref.ts","../src/oas/nodes/referenceobject.ts","../src/oas/nodes/res.ts","../src/oas/nodes/scalar.ts","../src/oas/nodes/type.ts","../src/oas/nodes/typeutils.ts","../src/oas/nodes/union.ts","../src/oas/prompts/prompt.ts","../src/oas/prompts/theme.ts","../src/oas/prompts/base/theme.ts","../src/oas/prompts/base/utils.ts","../src/oas/schemas/index.ts","../src/oas/utils/gql.ts","../src/oas/utils/naming.ts","../src/oas/utils/params.ts","../src/oas/utils/serverurl.ts","../src/oas/visitor/generatorvisitor.ts","../src/oas/visitor/nodevisitor.ts","../src/oas/visitor/example.ts","../src/oas/visitor/index.ts","../src/tests/runners.ts"],"version":"5.8.2"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apollo-conn-gen",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.3",
|
|
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",
|