apollo-conn-gen 0.0.12 → 0.0.15
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/cli/oas-helpers/index.js +10 -0
- package/dist/cli/oas-helpers/index.js.map +1 -1
- package/dist/oas/io/writer.d.ts +4 -2
- package/dist/oas/io/writer.js +111 -56
- package/dist/oas/io/writer.js.map +1 -1
- package/dist/oas/nodes/body.d.ts +16 -0
- package/dist/oas/nodes/body.js +73 -0
- package/dist/oas/nodes/body.js.map +1 -0
- package/dist/oas/nodes/comp.js +5 -2
- package/dist/oas/nodes/comp.js.map +1 -1
- package/dist/oas/nodes/factory.d.ts +4 -2
- package/dist/oas/nodes/factory.js +15 -3
- package/dist/oas/nodes/factory.js.map +1 -1
- package/dist/oas/nodes/get.d.ts +5 -3
- package/dist/oas/nodes/get.js +16 -4
- package/dist/oas/nodes/get.js.map +1 -1
- package/dist/oas/nodes/iType.d.ts +3 -0
- package/dist/oas/nodes/iType.js.map +1 -1
- package/dist/oas/nodes/internal.d.ts +2 -0
- package/dist/oas/nodes/internal.js +2 -0
- package/dist/oas/nodes/internal.js.map +1 -1
- package/dist/oas/nodes/obj.d.ts +1 -0
- package/dist/oas/nodes/obj.js +18 -54
- package/dist/oas/nodes/obj.js.map +1 -1
- package/dist/oas/nodes/post.d.ts +16 -0
- package/dist/oas/nodes/post.js +101 -0
- package/dist/oas/nodes/post.js.map +1 -0
- package/dist/oas/nodes/propObj.js +0 -1
- package/dist/oas/nodes/propObj.js.map +1 -1
- package/dist/oas/nodes/propRef.js +1 -1
- package/dist/oas/nodes/propRef.js.map +1 -1
- package/dist/oas/nodes/propScalar.js +2 -4
- package/dist/oas/nodes/propScalar.js.map +1 -1
- package/dist/oas/nodes/response.js +7 -7
- package/dist/oas/nodes/response.js.map +1 -1
- package/dist/oas/nodes/scalar.js +7 -1
- package/dist/oas/nodes/scalar.js.map +1 -1
- package/dist/oas/nodes/type.d.ts +3 -1
- package/dist/oas/nodes/type.js +5 -0
- package/dist/oas/nodes/type.js.map +1 -1
- package/dist/oas/nodes/union.js +2 -1
- package/dist/oas/nodes/union.js.map +1 -1
- package/dist/oas/oasGen.d.ts +2 -0
- package/dist/oas/oasGen.js +25 -12
- package/dist/oas/oasGen.js.map +1 -1
- package/dist/oas/schemas/index.d.ts +3 -0
- package/dist/oas/schemas/index.js +21 -0
- package/dist/oas/schemas/index.js.map +1 -0
- package/dist/tests/runners.d.ts +8 -0
- package/dist/tests/runners.js +125 -0
- package/dist/tests/runners.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/readme.md +110 -1
|
@@ -28,6 +28,16 @@ export async function promptForSelection(gen, opts, types) {
|
|
|
28
28
|
result = Array.from(type.props.values());
|
|
29
29
|
}
|
|
30
30
|
else {
|
|
31
|
+
/*
|
|
32
|
+
// TODO: re-think this
|
|
33
|
+
else if (type instanceof Post) {
|
|
34
|
+
if (!type.visited) type.visit(gen.context!)
|
|
35
|
+
result = gen.expand(type);
|
|
36
|
+
|
|
37
|
+
// we need to exclude the body from the selection - not sure we need to generalise this..
|
|
38
|
+
result = _.filter(result, (r) => r !== type.body);
|
|
39
|
+
console.log(result)
|
|
40
|
+
}*/
|
|
31
41
|
// top level paths
|
|
32
42
|
result = gen.expand(type);
|
|
33
43
|
if (result.length === 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/oas-helpers/index.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/oas-helpers/index.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAQ,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI1D,8DAA8D;AAC9D,MAAM,UAAU,qBAAqB,CAAC,IAAS,EAAE,GAAW;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC1E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,OAAO;AACT,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,IAAS,EAAE,KAAc;IAC7E,SAAS,UAAU,CAAC,IAAY;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAe,CAAC;QAEpB,IAAI,IAAI,YAAY,QAAQ,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;YACtD,oCAAoC;YACnC,IAAyB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE3C,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN;;;;;;;;;aASC;YACD,kBAAkB;YAClB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,wEAAwE;gBACxE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAExB,IAAI,CAAE,KAAc,CAAC,OAAO,EAAE,CAAC;oBAC7B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAQ,CAAC,CAAC;gBAC5B,CAAC;gBAED,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;oBACzB,MAAM,GAAG,CAAC,KAAK,CAAC,OAAQ,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,WAAW,CAAC;QACjB,OAAO,EAAE,GAAG,CAAC,OAAQ;QACrB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,6DAA6D;QACtE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC","sourcesContent":["/// internal functions\nimport fs from 'fs';\nimport { Composed, Post } from '../../oas/nodes/internal.js';\nimport { Ref } from '../../oas/nodes/internal.js';\nimport { Type } from '../../oas/nodes/internal.js';\nimport { Union } from '../../oas/nodes/internal.js';\nimport { OasGen } from '../../oas/oasGen.js';\nimport { typesPrompt } from '../../oas/prompts/prompt.js';\nimport { IType } from '../../oas/nodes/internal.js';\nimport _ from 'lodash';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generateFromSelection(opts: any, gen: OasGen) {\n const selections = JSON.parse(fs.readFileSync(opts.loadSelections, { encoding: 'utf-8' }));\n if (!Array.isArray(selections)) {\n console.error('Invalid selections file');\n return;\n }\n\n console.info('--------------- Apollo Connector schema -----------------');\n console.info(gen.generateSchema(selections));\n return;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function promptForSelection(gen: OasGen, opts: any, types: IType[]) {\n function expandType(type?: IType) {\n if (!type) {\n return types;\n }\n\n let result: IType[];\n\n if (type instanceof Composed || type instanceof Union) {\n // make sure we gather all the props\n (type as Composed | Union).consolidate([]);\n\n result = Array.from(type.props.values());\n } else {\n /*\n // TODO: re-think this\n else if (type instanceof Post) {\n if (!type.visited) type.visit(gen.context!)\n result = gen.expand(type);\n\n // we need to exclude the body from the selection - not sure we need to generalise this..\n result = _.filter(result, (r) => r !== type.body);\n console.log(result)\n }*/\n // top level paths\n result = gen.expand(type);\n\n if (result.length === 1) {\n // we are checking for a ref so we can go straight to where its pointing\n const child = result[0];\n\n if (!(child as Type).visited) {\n child.visit(gen.context!);\n }\n\n if (child instanceof Ref) {\n result = [child.refType!];\n }\n }\n }\n\n return result;\n }\n\n return typesPrompt({\n context: gen.context!,\n expandFn: expandType,\n message: 'Navigate spec and select the fields to use in the connector',\n pageSize: parseInt(opts.pageSize, 10),\n types: types,\n });\n}\n"]}
|
package/dist/oas/io/writer.d.ts
CHANGED
|
@@ -9,17 +9,19 @@ export declare class Writer {
|
|
|
9
9
|
write(input: string): Writer;
|
|
10
10
|
append(input: string): Writer;
|
|
11
11
|
flush(): string;
|
|
12
|
-
writeSchema(writer: Writer,
|
|
12
|
+
writeSchema(writer: Writer, types: Map<string, IType>, inputs: Map<string, IType>, selection: string[]): void;
|
|
13
13
|
generate(selection: string[]): void;
|
|
14
14
|
collectPaths(path: string, collection: IType[]): IType[];
|
|
15
15
|
private writeJSONScalar;
|
|
16
16
|
private writeQuery;
|
|
17
17
|
private writeConnector;
|
|
18
|
-
private
|
|
18
|
+
private requestMethod;
|
|
19
19
|
private writeSelection;
|
|
20
20
|
private writeDirectives;
|
|
21
21
|
private getServerUrl;
|
|
22
22
|
private traverseTree;
|
|
23
23
|
private isContainer;
|
|
24
24
|
private collectExpandedPaths;
|
|
25
|
+
private writeMutations;
|
|
26
|
+
private writeBodySelection;
|
|
25
27
|
}
|
package/dist/oas/io/writer.js
CHANGED
|
@@ -41,34 +41,34 @@ export class Writer {
|
|
|
41
41
|
flush() {
|
|
42
42
|
return this.buffer.join('');
|
|
43
43
|
}
|
|
44
|
-
writeSchema(writer,
|
|
44
|
+
writeSchema(writer, types, inputs, selection) {
|
|
45
45
|
const context = this.generator.context;
|
|
46
46
|
const generatedSet = context.generatedSet;
|
|
47
47
|
// generatedSet.clear();
|
|
48
48
|
this.writeDirectives(writer);
|
|
49
49
|
this.writeJSONScalar(writer);
|
|
50
|
-
|
|
51
|
-
if (!generatedSet.has(type.id)) {
|
|
50
|
+
types.forEach((type) => {
|
|
51
|
+
if (!generatedSet.has('type:' + type.id)) {
|
|
52
52
|
type.generate(context, this, selection);
|
|
53
|
-
generatedSet.add(type.id);
|
|
53
|
+
generatedSet.add('type:' + type.id);
|
|
54
54
|
}
|
|
55
55
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.writeQuery(context, writer, this.generator.paths, selection);
|
|
56
|
+
inputs.forEach((type) => {
|
|
57
|
+
if (!generatedSet.has('input:' + type.id)) {
|
|
58
|
+
type.generate(context, this, selection);
|
|
59
|
+
generatedSet.add('input:' + type.id);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
const expanded = [...this.generator.paths];
|
|
63
|
+
const gets = new Map(expanded.filter(([_k, type]) => type.id.startsWith('get:')));
|
|
64
|
+
const posts = new Map(expanded.filter(([_k, type]) => type.id.startsWith('post:')));
|
|
65
|
+
this.writeQuery(context, writer, gets, selection);
|
|
66
|
+
this.writeMutations(context, writer, posts, selection);
|
|
68
67
|
writer.flush();
|
|
69
68
|
}
|
|
70
69
|
generate(selection) {
|
|
71
|
-
const
|
|
70
|
+
const pendingTypes = new Map();
|
|
71
|
+
const pendingInputs = new Map();
|
|
72
72
|
selection = this.collectExpandedPaths(selection);
|
|
73
73
|
for (const path of selection) {
|
|
74
74
|
let collection = Array.from(this.generator.paths.values());
|
|
@@ -81,7 +81,7 @@ export class Writer {
|
|
|
81
81
|
if (part === '*') {
|
|
82
82
|
// remove the current path from the selection array
|
|
83
83
|
selection = selection.filter((s) => s !== path);
|
|
84
|
-
if (current instanceof Composed) {
|
|
84
|
+
if (current && current instanceof Composed) {
|
|
85
85
|
current.consolidate(selection);
|
|
86
86
|
}
|
|
87
87
|
// add all the props from the current node and exit loop
|
|
@@ -103,30 +103,55 @@ export class Writer {
|
|
|
103
103
|
i++;
|
|
104
104
|
} while (i < parts.length);
|
|
105
105
|
if (current) {
|
|
106
|
-
// TODO: this seems redundant, we've already walked the parent AND can be also
|
|
107
|
-
// contained in the context stack
|
|
106
|
+
// TODO: this seems redundant, we've already walked the parent AND can be also contained in the context stack
|
|
108
107
|
const parentType = Writer.findNonPropParent(current);
|
|
109
|
-
if (!
|
|
110
|
-
|
|
108
|
+
if (!pendingTypes.has(parentType.id)) {
|
|
109
|
+
pendingTypes.set(parentType.id, parentType);
|
|
111
110
|
}
|
|
112
111
|
parentType
|
|
113
112
|
.ancestors()
|
|
114
|
-
.filter((t) => !
|
|
113
|
+
.filter((t) => !pendingTypes.has(t.id) && this.isContainer(t))
|
|
115
114
|
.forEach((dep) => {
|
|
116
115
|
// TODO: potential merge needed?
|
|
117
|
-
|
|
116
|
+
pendingTypes.set(dep.id, dep);
|
|
118
117
|
});
|
|
119
118
|
}
|
|
120
119
|
}
|
|
121
|
-
|
|
120
|
+
// process any POST paths, as we need to add the Body as a pendingInputs item
|
|
121
|
+
/*Array.from(this.generator.paths.values())
|
|
122
|
+
.filter((t) => t instanceof Post)
|
|
123
|
+
.forEach((path) => {
|
|
124
|
+
if (path.body && !pendingInputs.has(path.body.id))
|
|
125
|
+
pendingInputs.set(path.body.id, path.body);
|
|
126
|
+
|
|
127
|
+
if (path.body) {
|
|
128
|
+
this.generator.expand(path.body!);
|
|
129
|
+
|
|
130
|
+
const queue: IType[] = Array.from(path.body!.children.values());
|
|
131
|
+
|
|
132
|
+
while (queue.length > 0) {
|
|
133
|
+
const node = queue.shift()!;
|
|
134
|
+
const isContainer = this.isContainer(node);
|
|
135
|
+
|
|
136
|
+
if (isContainer && !pendingInputs.has(node.id)) {
|
|
137
|
+
pendingInputs.set(node.id, node);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
this.generator.expand(node);
|
|
141
|
+
queue.push(...node.children);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});*/
|
|
145
|
+
// TODO: do we need to do the same for the pending inputs?
|
|
146
|
+
if (!_.isEmpty(pendingTypes)) {
|
|
122
147
|
// first pass is to consolidate all Composed & Union nodes
|
|
123
|
-
const composed = Array.from(
|
|
148
|
+
const composed = Array.from(pendingTypes.values())
|
|
124
149
|
.filter((t) => t instanceof Composed || t instanceof Union)
|
|
125
150
|
.map((t) => t);
|
|
126
151
|
for (const comp of composed) {
|
|
127
|
-
comp.consolidate(selection).forEach((id) =>
|
|
152
|
+
comp.consolidate(selection).forEach((id) => pendingTypes.delete(id));
|
|
128
153
|
}
|
|
129
|
-
this.writeSchema(this,
|
|
154
|
+
this.writeSchema(this, pendingTypes, pendingInputs, selection);
|
|
130
155
|
}
|
|
131
156
|
}
|
|
132
157
|
collectPaths(path, collection) {
|
|
@@ -154,9 +179,11 @@ export class Writer {
|
|
|
154
179
|
writer.write('\nscalar JSON\n\n');
|
|
155
180
|
}
|
|
156
181
|
writeQuery(context, writer, collected, selection) {
|
|
157
|
-
writer.write('type Query {\n');
|
|
158
182
|
const selectionSet = new Set(selection.map((s) => s.split('>')[0]));
|
|
159
183
|
const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));
|
|
184
|
+
if (_.isEmpty(paths))
|
|
185
|
+
return;
|
|
186
|
+
writer.write('type Query {\n');
|
|
160
187
|
for (const path of paths) {
|
|
161
188
|
path.generate(context, writer, []);
|
|
162
189
|
this.writeConnector(context, writer, path, selection);
|
|
@@ -166,40 +193,36 @@ export class Writer {
|
|
|
166
193
|
}
|
|
167
194
|
writeConnector(context, writer, type, selection) {
|
|
168
195
|
const indent = 0;
|
|
169
|
-
const
|
|
196
|
+
const op = type; // assume type is GetOp
|
|
170
197
|
let spacing = ' '.repeat(indent + 4);
|
|
171
198
|
writer.append(spacing).append('@connect(\n');
|
|
172
|
-
const request = this.buildRequestMethodAndArgs(get);
|
|
173
199
|
spacing = ' '.repeat(indent + 6);
|
|
174
|
-
writer
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
.
|
|
179
|
-
.append(spacing)
|
|
180
|
-
.append('selection: """\n');
|
|
181
|
-
if (get.resultType) {
|
|
182
|
-
this.writeSelection(context, writer, get.resultType, selection);
|
|
200
|
+
writer.append(spacing).append('source: "api"\n').append(spacing).append('http: ');
|
|
201
|
+
this.requestMethod(context, writer, op, selection);
|
|
202
|
+
writer.append('\n').append(spacing).append('selection: """\n');
|
|
203
|
+
if (op.resultType) {
|
|
204
|
+
this.writeSelection(context, writer, op.resultType, selection);
|
|
183
205
|
}
|
|
184
206
|
writer.append(spacing).append('"""\n');
|
|
185
207
|
spacing = ' '.repeat(indent + 4);
|
|
186
208
|
writer.append(spacing).append(')\n');
|
|
187
209
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
210
|
+
requestMethod(context, writer, op, selection) {
|
|
211
|
+
// replace every {elem} in the path for {$args.elem}
|
|
212
|
+
const verb = op.id.startsWith('get:') ? 'GET' : 'POST';
|
|
213
|
+
writer.append(`{ ${verb}:`).append('"' + op.operation.path.replace(/\{([a-zA-Z0-9]+)\}/g, '{$args.$1}'));
|
|
214
|
+
if (op.params.length > 0) {
|
|
215
|
+
const params = op.params.filter((p) => {
|
|
193
216
|
return p.required && p.parameter.in && p.parameter.in.toLowerCase() === 'query';
|
|
194
217
|
});
|
|
195
218
|
if (params.length > 0) {
|
|
196
|
-
|
|
219
|
+
writer.append('?' + params.map((p) => `${p.name}={$args.${Naming.genParamName(p.name)}}`).join('&'));
|
|
197
220
|
}
|
|
198
|
-
const headers =
|
|
199
|
-
|
|
221
|
+
const headers = op.operation.getParameters().filter((p) => p.in && p.in.toLowerCase() === 'header');
|
|
222
|
+
writer.append('"\n');
|
|
200
223
|
if (headers.length > 0) {
|
|
201
224
|
let spacing = ' '.repeat(6);
|
|
202
|
-
|
|
225
|
+
writer.append(spacing + 'headers: [\n');
|
|
203
226
|
spacing = ' '.repeat(8);
|
|
204
227
|
for (const p of headers) {
|
|
205
228
|
let value = null;
|
|
@@ -212,16 +235,22 @@ export class Writer {
|
|
|
212
235
|
if (value == null) {
|
|
213
236
|
value = '<placeholder>';
|
|
214
237
|
}
|
|
215
|
-
|
|
238
|
+
writer.append(spacing + `{ name: "${p.name}", value: "${value}" }\n`);
|
|
216
239
|
}
|
|
217
240
|
spacing = ' '.repeat(6);
|
|
218
|
-
|
|
241
|
+
writer.append(spacing + ']');
|
|
219
242
|
}
|
|
220
243
|
}
|
|
221
244
|
else {
|
|
222
|
-
|
|
245
|
+
writer.append('"');
|
|
246
|
+
}
|
|
247
|
+
if (_.has(op, 'body')) {
|
|
248
|
+
const body = op.body;
|
|
249
|
+
this.writeBodySelection(context, writer, body, selection);
|
|
223
250
|
}
|
|
224
|
-
|
|
251
|
+
writer.append('}');
|
|
252
|
+
// const verb = op.id.startsWith('get:') ? 'GET' : 'POST';
|
|
253
|
+
// return `{ ${verb}: ${builder} }`;
|
|
225
254
|
}
|
|
226
255
|
writeSelection(context, writer, type, selection) {
|
|
227
256
|
context.indent = 6;
|
|
@@ -292,9 +321,6 @@ export class Writer {
|
|
|
292
321
|
const filtered = expands.map((p) => p.replace('>**', ''));
|
|
293
322
|
const paths = Array.from(this.generator.paths.values());
|
|
294
323
|
const nodes = filtered.map((p) => this.collectPaths(p, paths));
|
|
295
|
-
/*.map(stack => _.last(stack)!.id)
|
|
296
|
-
.filter(id => selection.includes(id))
|
|
297
|
-
.forEach(id => newSelection.add(id));*/
|
|
298
324
|
nodes.forEach((stack) => {
|
|
299
325
|
const root = _.last(stack);
|
|
300
326
|
T.traverse(root, (child) => {
|
|
@@ -309,5 +335,34 @@ export class Writer {
|
|
|
309
335
|
// finally remove the expanded paths from the selection
|
|
310
336
|
return [...newSelection, ...selection.filter((p) => !expands.includes(p))];
|
|
311
337
|
}
|
|
338
|
+
writeMutations(context, writer, collected, selection) {
|
|
339
|
+
const selectionSet = new Set(selection.map((s) => s.split('>')[0]));
|
|
340
|
+
const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));
|
|
341
|
+
if (_.isEmpty(paths))
|
|
342
|
+
return;
|
|
343
|
+
writer.write('type Mutation {\n');
|
|
344
|
+
for (const path of paths) {
|
|
345
|
+
path.generate(context, writer, []);
|
|
346
|
+
this.writeConnector(context, writer, path, selection);
|
|
347
|
+
context.generatedSet.add(path.id);
|
|
348
|
+
}
|
|
349
|
+
writer.write('}\n\n');
|
|
350
|
+
}
|
|
351
|
+
writeBodySelection(context, writer, body, selection) {
|
|
352
|
+
writer.append(',\n');
|
|
353
|
+
context.indent = 6;
|
|
354
|
+
// let spacing = ' '.repeat(6);
|
|
355
|
+
if (body) {
|
|
356
|
+
body.select(context, writer, selection);
|
|
357
|
+
}
|
|
358
|
+
/*writer.append(spacing + 'body: """\n');
|
|
359
|
+
|
|
360
|
+
// TODO: writer.append(spacing + '$args.input' + '\n');
|
|
361
|
+
// we should check if we have no selection for body? or else just send everything?
|
|
362
|
+
context.indent = 6;
|
|
363
|
+
body.select(context, writer, selection);
|
|
364
|
+
|
|
365
|
+
writer.append(spacing + '"""\n' + ' '.repeat(5));*/
|
|
366
|
+
}
|
|
312
367
|
}
|
|
313
368
|
//# sourceMappingURL=writer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/oas/io/writer.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport Oas from 'oas';\nimport { ServerObject } from 'oas/types';\nimport { OasContext } from '../oasContext.js';\nimport { OasGen } from '../oasGen.js';\nimport { CircularRef } from '../nodes/internal.js';\nimport { Composed } from '../nodes/internal.js';\nimport { Get } from '../nodes/internal.js';\nimport { Obj } from '../nodes/internal.js';\nimport { Param } from '../nodes/internal.js';\nimport { Prop } from '../nodes/internal.js';\nimport { PropArray } from '../nodes/internal.js';\nimport { PropScalar } from '../nodes/internal.js';\nimport { Type } from '../nodes/internal.js';\nimport { Union } from '../nodes/internal.js';\nimport { Naming } from '../utils/naming.js';\nimport { T } from '../utils/typeUtils.js';\nimport { IType } from '../nodes/internal.js';\n\nexport class Writer {\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 progressiveSplits(input: string): string[] {\n const parts = input.split('>');\n const results: string[] = [];\n for (let i = 1; i <= parts.length; i++) {\n results.push(parts.slice(0, i).join('>'));\n }\n return results;\n }\n public buffer: string[];\n\n constructor(public generator: OasGen) {\n this.buffer = [];\n }\n\n public write(input: string): Writer {\n this.buffer.push(input);\n return this;\n }\n\n public append(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 writeSchema(writer: Writer, pending: Map<string, IType>, selection: string[]): void {\n const context = this.generator.context!;\n const generatedSet = context.generatedSet;\n // generatedSet.clear();\n\n this.writeDirectives(writer);\n this.writeJSONScalar(writer);\n\n pending.forEach((type: IType) => {\n if (!generatedSet.has(type.id)) {\n type.generate(context, this, selection);\n generatedSet.add(type.id);\n }\n });\n\n // TODO: Pending\n // const counter = new RefCounter(this.context);\n // counter.addAll(this.collected);\n\n // const refs = counter.getCount();\n // this.printRefs(refs);\n\n // for (const type of this.context.types.ts.values()) {\n // if (counter.getCount().has(type.name)) {\n // await type.generate(this.context, writer);\n // generatedSet.add(type.name);\n // }\n // }\n\n this.writeQuery(context, writer, this.generator.paths, selection);\n writer.flush();\n }\n\n public generate(selection: string[]) {\n const pending: Map<string, IType> = new Map();\n\n selection = this.collectExpandedPaths(selection);\n\n for (const path of selection) {\n let collection = Array.from(this.generator.paths.values());\n let current: IType | undefined;\n let last: IType | undefined;\n\n let i = 0;\n const parts = path.split('>');\n do {\n const part = parts[i].replace(/#\\/c\\/s/g, '#/components/schemas');\n if (part === '*') {\n // remove the current path from the selection array\n selection = selection.filter((s) => s !== path);\n\n if (current instanceof Composed) {\n current.consolidate(selection);\n }\n\n // add all the props from the current node and exit loop\n current?.props.forEach((child) => {\n if (T.isLeaf(child)) {\n selection.push(child.path());\n }\n });\n break;\n }\n\n current = collection.find((t) => t.id === part);\n if (!current) {\n throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());\n }\n\n // make sure we expand it before we move on to the next part\n this.generator.expand(current);\n last = current;\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n\n i++;\n } while (i < parts.length);\n\n if (current) {\n // TODO: this seems redundant, we've already walked the parent AND can be also\n // contained in the context stack\n const parentType = Writer.findNonPropParent(current as IType);\n\n if (!pending.has(parentType.id)) {\n pending.set(parentType.id, parentType);\n }\n\n parentType\n .ancestors()\n .filter((t) => !pending.has(t.id) && this.isContainer(t))\n .forEach((dep) => {\n // TODO: potential merge needed?\n pending.set(dep.id, dep);\n });\n }\n }\n\n if (!_.isEmpty(pending)) {\n // first pass is to consolidate all Composed & Union nodes\n const composed: Array<Composed | Union> = Array.from(pending.values())\n .filter((t) => t instanceof Composed || t instanceof Union)\n .map((t) => t as Composed);\n\n for (const comp of composed) {\n comp.consolidate(selection).forEach((id) => pending.delete(id));\n }\n\n this.writeSchema(this, pending, selection);\n }\n }\n\n public collectPaths(path: string, collection: IType[]): IType[] {\n const stack: IType[] = [];\n let current: IType | undefined;\n let last: IType | undefined;\n\n let i = 0;\n const parts = path.split('>');\n do {\n const part = parts[i].replace(/#\\/c\\/s/g, '#/components/schemas');\n\n current = collection.find((t) => t.id === part);\n if (!current) {\n throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());\n }\n\n // make sure we expand it before we move on to the next part\n this.generator.expand(current);\n last = current;\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n\n stack.push(current);\n i++;\n } while (i < parts.length);\n\n return stack;\n }\n\n private writeJSONScalar(writer: Writer): void {\n writer.write('\\nscalar JSON\\n\\n');\n }\n\n private writeQuery(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void {\n writer.write('type Query {\\n');\n\n const selectionSet = new Set<string>(selection.map((s) => s.split('>')[0]));\n\n const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));\n\n for (const path of paths) {\n path.generate(context, writer, []);\n this.writeConnector(context, writer, path, selection);\n context.generatedSet.add(path.id);\n }\n\n writer.write('}\\n\\n');\n }\n\n private writeConnector(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n const indent = 0;\n const get = type as unknown as Get; // assume type is GetOp\n let spacing = ' '.repeat(indent + 4);\n writer.append(spacing).append('@connect(\\n');\n\n const request = this.buildRequestMethodAndArgs(get);\n spacing = ' '.repeat(indent + 6);\n writer\n .append(spacing)\n .append('source: \"api\"\\n')\n .append(spacing)\n .append('http: ' + request + '\\n')\n .append(spacing)\n .append('selection: \"\"\"\\n');\n\n if (get.resultType) {\n this.writeSelection(context, writer, get.resultType, selection);\n }\n\n writer.append(spacing).append('\"\"\"\\n');\n spacing = ' '.repeat(indent + 4);\n writer.append(spacing).append(')\\n');\n }\n\n private buildRequestMethodAndArgs(get: Get): string {\n let builder = '';\n\n builder += '\"' + get.operation.path.replace(/\\{([a-zA-Z0-9]+)\\}/g, '{$args.$1}');\n\n if (get.params.length > 0) {\n const params = get.params.filter((p: Param) => {\n return p.required && p.parameter.in && p.parameter.in.toLowerCase() === 'query';\n });\n\n if (params.length > 0) {\n builder += '?' + params.map((p: Param) => `${p.name}={$args.${Naming.genParamName(p.name)}}`).join('&');\n }\n const headers = get.operation.getParameters().filter((p) => p.in && p.in.toLowerCase() === 'header');\n\n builder += '\"\\n';\n\n if (headers.length > 0) {\n let spacing = ' '.repeat(6);\n builder += spacing + 'headers: [\\n';\n spacing = ' '.repeat(8);\n\n for (const p of headers) {\n let value: string | null = null;\n\n if (p.example != null) {\n value = p.example.toString();\n }\n\n if (p.examples && Object.keys(p.examples).length > 0) {\n value = Object.keys(p.examples).join(',');\n }\n\n if (value == null) {\n value = '<placeholder>';\n }\n\n builder += spacing + `{ name: \"${p.name}\", value: \"${value}\" }\\n`;\n }\n\n spacing = ' '.repeat(6);\n builder += spacing + ']';\n }\n } else {\n builder += '\"';\n }\n\n return `{ GET: ${builder} }`;\n }\n\n private writeSelection(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n context.indent = 6;\n type.select(context, writer, selection);\n }\n\n private writeDirectives(writer: Writer): void {\n const api: Oas = this.generator.parser;\n const host = this.getServerUrl(api.getDefinition().servers?.[0]);\n writer\n .append('extend schema\\n')\n .append(' @link(url: \"https://specs.apollo.dev/federation/v2.10\", import: [\"@key\"])\\n')\n .append(' @link(\\n')\n .append(' url: \"https://specs.apollo.dev/connect/v0.1\"\\n')\n .append(' import: [\"@connect\", \"@source\"]\\n')\n .append(' )\\n')\n .append(' @source(name: \"api\", http: { baseURL: \"')\n .append(host)\n .append('\" })\\n\\n');\n }\n\n private getServerUrl(server: ServerObject | undefined): string {\n if (!server) {\n return 'http://localhost:4010';\n }\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 private traverseTree(current: IType, selection: string[], pending: Map<string, IType>) {\n // we might be in a node far from the root, so we need to traverse upwards\n // as well and add the props that we can find on the way\n const source = current as Type;\n\n source\n .ancestors()\n .filter((t) => t instanceof Prop)\n .map((p) => Writer.findNonPropParent(p))\n .forEach((parent) => pending.set(parent.id, parent));\n\n T.traverse(source, (child) => {\n if (T.isLeaf(child)) {\n // this is a weird take but if the child is an array of scalars\n // then we want to avoid adding it twice\n if (T.isLeaf(child.parent!)) {\n return;\n }\n selection.push(child.path());\n\n const parentType = Writer.findNonPropParent(child);\n if (!pending.has(parentType.id)) {\n pending.set(parentType.id, parentType);\n }\n } else {\n this.generator.expand(child);\n\n if (child instanceof Composed) {\n child.consolidate(selection);\n }\n }\n });\n }\n\n private isContainer(type: IType) {\n return type instanceof Obj || type instanceof Union || type instanceof Composed || type instanceof CircularRef;\n }\n\n private collectExpandedPaths(selection: string[]) {\n const newSelection = new Set<string>();\n const expands = selection.filter((p) => p.endsWith('>**'));\n const filtered = expands.map((p) => p.replace('>**', ''));\n\n const paths = Array.from(this.generator.paths.values());\n const nodes = filtered.map((p) => this.collectPaths(p, paths));\n /*.map(stack => _.last(stack)!.id)\n .filter(id => selection.includes(id))\n .forEach(id => newSelection.add(id));*/\n\n nodes.forEach((stack) => {\n const root = _.last(stack)!;\n T.traverse(root, (child) => {\n if (T.isPropScalar(child) || (child instanceof PropArray && child.items instanceof PropScalar)) {\n newSelection.add(child.path());\n } else {\n this.generator.expand(child);\n }\n });\n });\n\n // finally remove the expanded paths from the selection\n return [...newSelection, ...selection.filter((p) => !expands.includes(p))];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/oas/io/writer.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport Oas from 'oas';\nimport { ServerObject } from 'oas/types';\nimport { OasContext } from '../oasContext.js';\nimport { OasGen } from '../oasGen.js';\nimport { Body, CircularRef, Post } from '../nodes/internal.js';\nimport { Composed } from '../nodes/internal.js';\nimport { Get } from '../nodes/internal.js';\nimport { Obj } from '../nodes/internal.js';\nimport { Param } from '../nodes/internal.js';\nimport { Prop } from '../nodes/internal.js';\nimport { PropArray } from '../nodes/internal.js';\nimport { PropScalar } from '../nodes/internal.js';\nimport { Type } from '../nodes/internal.js';\nimport { Union } from '../nodes/internal.js';\nimport { Naming } from '../utils/naming.js';\nimport { T } from '../utils/typeUtils.js';\nimport { IType } from '../nodes/internal.js';\n\nexport class Writer {\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 progressiveSplits(input: string): string[] {\n const parts = input.split('>');\n const results: string[] = [];\n for (let i = 1; i <= parts.length; i++) {\n results.push(parts.slice(0, i).join('>'));\n }\n return results;\n }\n\n public buffer: string[];\n\n constructor(public generator: OasGen) {\n this.buffer = [];\n }\n\n public write(input: string): Writer {\n this.buffer.push(input);\n return this;\n }\n\n public append(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 writeSchema(writer: Writer, types: Map<string, IType>, inputs: Map<string, IType>, selection: string[]): void {\n const context = this.generator.context!;\n const generatedSet = context.generatedSet;\n // generatedSet.clear();\n\n this.writeDirectives(writer);\n this.writeJSONScalar(writer);\n\n types.forEach((type: IType) => {\n if (!generatedSet.has('type:' + type.id)) {\n type.generate(context, this, selection);\n generatedSet.add('type:' + type.id);\n }\n });\n\n inputs.forEach((type: IType) => {\n if (!generatedSet.has('input:' + type.id)) {\n type.generate(context, this, selection);\n generatedSet.add('input:' + type.id);\n }\n });\n\n const expanded = [...this.generator.paths];\n\n const gets = new Map(expanded.filter(([_k, type]) => type.id.startsWith('get:')));\n const posts = new Map(expanded.filter(([_k, type]) => type.id.startsWith('post:')));\n\n this.writeQuery(context, writer, gets, selection);\n this.writeMutations(context, writer, posts, selection);\n writer.flush();\n }\n\n public generate(selection: string[]) {\n const pendingTypes: Map<string, IType> = new Map();\n const pendingInputs: Map<string, IType> = new Map();\n\n selection = this.collectExpandedPaths(selection);\n\n for (const path of selection) {\n let collection = Array.from(this.generator.paths.values());\n let current: IType | undefined;\n let last: IType | undefined;\n\n let i = 0;\n const parts = path.split('>');\n do {\n const part = parts[i].replace(/#\\/c\\/s/g, '#/components/schemas');\n if (part === '*') {\n // remove the current path from the selection array\n selection = selection.filter((s) => s !== path);\n\n if (current && current instanceof Composed) {\n current!.consolidate(selection);\n }\n\n // add all the props from the current node and exit loop\n current?.props.forEach((child) => {\n if (T.isLeaf(child)) {\n selection.push(child.path());\n }\n });\n break;\n }\n\n current = collection.find((t) => t.id === part);\n if (!current) {\n throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());\n }\n\n // make sure we expand it before we move on to the next part\n this.generator.expand(current);\n last = current;\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n\n i++;\n } while (i < parts.length);\n\n if (current) {\n // TODO: this seems redundant, we've already walked the parent AND can be also contained in the context stack\n const parentType = Writer.findNonPropParent(current as IType);\n\n if (!pendingTypes.has(parentType.id)) {\n pendingTypes.set(parentType.id, parentType);\n }\n\n parentType\n .ancestors()\n .filter((t) => !pendingTypes.has(t.id) && this.isContainer(t))\n .forEach((dep) => {\n // TODO: potential merge needed?\n pendingTypes.set(dep.id, dep);\n });\n }\n }\n\n // process any POST paths, as we need to add the Body as a pendingInputs item\n /*Array.from(this.generator.paths.values())\n .filter((t) => t instanceof Post)\n .forEach((path) => {\n if (path.body && !pendingInputs.has(path.body.id))\n pendingInputs.set(path.body.id, path.body);\n\n if (path.body) {\n this.generator.expand(path.body!);\n\n const queue: IType[] = Array.from(path.body!.children.values());\n\n while (queue.length > 0) {\n const node = queue.shift()!;\n const isContainer = this.isContainer(node);\n\n if (isContainer && !pendingInputs.has(node.id)) {\n pendingInputs.set(node.id, node);\n }\n\n this.generator.expand(node);\n queue.push(...node.children);\n }\n }\n });*/\n\n // TODO: do we need to do the same for the pending inputs?\n if (!_.isEmpty(pendingTypes)) {\n // first pass is to consolidate all Composed & Union nodes\n const composed: Array<Composed | Union> = Array.from(pendingTypes.values())\n .filter((t) => t instanceof Composed || t instanceof Union)\n .map((t) => t as Composed);\n\n for (const comp of composed) {\n comp.consolidate(selection).forEach((id) => pendingTypes.delete(id));\n }\n\n this.writeSchema(this, pendingTypes, pendingInputs, selection);\n }\n }\n\n public collectPaths(path: string, collection: IType[]): IType[] {\n const stack: IType[] = [];\n let current: IType | undefined;\n let last: IType | undefined;\n\n let i = 0;\n const parts = path.split('>');\n do {\n const part = parts[i].replace(/#\\/c\\/s/g, '#/components/schemas');\n\n current = collection.find((t) => t.id === part);\n if (!current) {\n throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());\n }\n\n // make sure we expand it before we move on to the next part\n this.generator.expand(current);\n last = current;\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n\n stack.push(current);\n i++;\n } while (i < parts.length);\n\n return stack;\n }\n\n private writeJSONScalar(writer: Writer): void {\n writer.write('\\nscalar JSON\\n\\n');\n }\n\n private writeQuery(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void {\n const selectionSet = new Set<string>(selection.map((s) => s.split('>')[0]));\n\n const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));\n if (_.isEmpty(paths)) return;\n\n writer.write('type Query {\\n');\n\n for (const path of paths) {\n path.generate(context, writer, []);\n this.writeConnector(context, writer, path, selection);\n context.generatedSet.add(path.id);\n }\n\n writer.write('}\\n\\n');\n }\n\n private writeConnector(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n const indent = 0;\n const op = type as unknown as Get | Post; // assume type is GetOp\n let spacing = ' '.repeat(indent + 4);\n writer.append(spacing).append('@connect(\\n');\n\n spacing = ' '.repeat(indent + 6);\n writer.append(spacing).append('source: \"api\"\\n').append(spacing).append('http: ');\n\n this.requestMethod(context, writer, op, selection);\n\n writer.append('\\n').append(spacing).append('selection: \"\"\"\\n');\n\n if (op.resultType) {\n this.writeSelection(context, writer, op.resultType, selection);\n }\n\n writer.append(spacing).append('\"\"\"\\n');\n spacing = ' '.repeat(indent + 4);\n writer.append(spacing).append(')\\n');\n }\n\n private requestMethod(context: OasContext, writer: Writer, op: Get | Post, selection: string[]): void {\n // replace every {elem} in the path for {$args.elem}\n const verb = op.id.startsWith('get:') ? 'GET' : 'POST';\n writer.append(`{ ${verb}:`).append('\"' + op.operation.path.replace(/\\{([a-zA-Z0-9]+)\\}/g, '{$args.$1}'));\n\n if (op.params.length > 0) {\n const params = op.params.filter((p: Param) => {\n return p.required && p.parameter.in && p.parameter.in.toLowerCase() === 'query';\n });\n\n if (params.length > 0) {\n writer.append('?' + params.map((p: Param) => `${p.name}={$args.${Naming.genParamName(p.name)}}`).join('&'));\n }\n const headers = op.operation.getParameters().filter((p) => p.in && p.in.toLowerCase() === 'header');\n\n writer.append('\"\\n');\n\n if (headers.length > 0) {\n let spacing = ' '.repeat(6);\n writer.append(spacing + 'headers: [\\n');\n spacing = ' '.repeat(8);\n\n for (const p of headers) {\n let value: string | null = null;\n\n if (p.example != null) {\n value = p.example.toString();\n }\n\n if (p.examples && Object.keys(p.examples).length > 0) {\n value = Object.keys(p.examples).join(',');\n }\n\n if (value == null) {\n value = '<placeholder>';\n }\n\n writer.append(spacing + `{ name: \"${p.name}\", value: \"${value}\" }\\n`);\n }\n\n spacing = ' '.repeat(6);\n writer.append(spacing + ']');\n }\n } else {\n writer.append('\"');\n }\n\n if (_.has(op, 'body')) {\n const body = op.body as Body;\n this.writeBodySelection(context, writer, body, selection);\n }\n\n writer.append('}');\n // const verb = op.id.startsWith('get:') ? 'GET' : 'POST';\n // return `{ ${verb}: ${builder} }`;\n }\n\n private writeSelection(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n context.indent = 6;\n type.select(context, writer, selection);\n }\n\n private writeDirectives(writer: Writer): void {\n const api: Oas = this.generator.parser;\n const host = this.getServerUrl(api.getDefinition().servers?.[0]);\n writer\n .append('extend schema\\n')\n .append(' @link(url: \"https://specs.apollo.dev/federation/v2.10\", import: [\"@key\"])\\n')\n .append(' @link(\\n')\n .append(' url: \"https://specs.apollo.dev/connect/v0.1\"\\n')\n .append(' import: [\"@connect\", \"@source\"]\\n')\n .append(' )\\n')\n .append(' @source(name: \"api\", http: { baseURL: \"')\n .append(host)\n .append('\" })\\n\\n');\n }\n\n private getServerUrl(server: ServerObject | undefined): string {\n if (!server) {\n return 'http://localhost:4010';\n }\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 private traverseTree(current: IType, selection: string[], pending: Map<string, IType>) {\n // we might be in a node far from the root, so we need to traverse upwards\n // as well and add the props that we can find on the way\n const source = current as Type;\n\n source\n .ancestors()\n .filter((t) => t instanceof Prop)\n .map((p) => Writer.findNonPropParent(p))\n .forEach((parent) => pending.set(parent.id, parent));\n\n T.traverse(source, (child) => {\n if (T.isLeaf(child)) {\n // this is a weird take but if the child is an array of scalars\n // then we want to avoid adding it twice\n if (T.isLeaf(child.parent!)) {\n return;\n }\n selection.push(child.path());\n\n const parentType = Writer.findNonPropParent(child);\n if (!pending.has(parentType.id)) {\n pending.set(parentType.id, parentType);\n }\n } else {\n this.generator.expand(child);\n\n if (child instanceof Composed) {\n child.consolidate(selection);\n }\n }\n });\n }\n\n private isContainer(type: IType) {\n return type instanceof Obj || type instanceof Union || type instanceof Composed || type instanceof CircularRef;\n }\n\n private collectExpandedPaths(selection: string[]) {\n const newSelection = new Set<string>();\n const expands = selection.filter((p) => p.endsWith('>**'));\n const filtered = expands.map((p) => p.replace('>**', ''));\n\n const paths = Array.from(this.generator.paths.values());\n const nodes = filtered.map((p) => this.collectPaths(p, paths));\n\n nodes.forEach((stack) => {\n const root = _.last(stack)!;\n T.traverse(root, (child) => {\n if (T.isPropScalar(child) || (child instanceof PropArray && child.items instanceof PropScalar)) {\n newSelection.add(child.path());\n } else {\n this.generator.expand(child);\n }\n });\n });\n\n // finally remove the expanded paths from the selection\n return [...newSelection, ...selection.filter((p) => !expands.includes(p))];\n }\n\n private writeMutations(\n context: OasContext,\n writer: Writer,\n collected: Map<string, IType>,\n selection: string[],\n ): void {\n const selectionSet = new Set<string>(selection.map((s) => s.split('>')[0]));\n\n const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));\n if (_.isEmpty(paths)) return;\n\n writer.write('type Mutation {\\n');\n\n for (const path of paths) {\n path.generate(context, writer, []);\n this.writeConnector(context, writer, path, selection);\n context.generatedSet.add(path.id);\n }\n\n writer.write('}\\n\\n');\n }\n\n private writeBodySelection(context: OasContext, writer: Writer, body: Body, selection: string[]): void {\n writer.append(',\\n');\n context.indent = 6;\n // let spacing = ' '.repeat(6);\n\n if (body) {\n body.select(context, writer, selection);\n }\n /*writer.append(spacing + 'body: \"\"\"\\n');\n\n // TODO: writer.append(spacing + '$args.input' + '\\n');\n // we should check if we have no selection for body? or else just send everything?\n context.indent = 6;\n body.select(context, writer, selection);\n\n writer.append(spacing + '\"\"\"\\n' + ' '.repeat(5));*/\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IType, Type } from './internal.js';
|
|
2
|
+
import { SchemaObject } from 'oas/types';
|
|
3
|
+
import { OasContext } from '../oasContext.js';
|
|
4
|
+
import { Writer } from '../io/writer.js';
|
|
5
|
+
export declare class Body extends Type {
|
|
6
|
+
schema: SchemaObject;
|
|
7
|
+
payload?: IType;
|
|
8
|
+
constructor(parent: IType, name: string, schema: SchemaObject);
|
|
9
|
+
get id(): string;
|
|
10
|
+
visit(context: OasContext): void;
|
|
11
|
+
forPrompt(context: OasContext): string;
|
|
12
|
+
generate(_context: OasContext, _writer: Writer, _selection: string[]): void;
|
|
13
|
+
select(context: OasContext, writer: Writer, selection: string[]): void;
|
|
14
|
+
private visitBody;
|
|
15
|
+
private visitBodyRef;
|
|
16
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Factory, Type } from './internal.js';
|
|
2
|
+
import { trace } from '../log/trace.js';
|
|
3
|
+
export class Body extends Type {
|
|
4
|
+
schema;
|
|
5
|
+
payload;
|
|
6
|
+
constructor(parent, name, schema) {
|
|
7
|
+
super(parent, name);
|
|
8
|
+
this.schema = schema;
|
|
9
|
+
this.kind = 'input'; // all children will have the same type
|
|
10
|
+
}
|
|
11
|
+
get id() {
|
|
12
|
+
return 'body:' + this.name;
|
|
13
|
+
}
|
|
14
|
+
visit(context) {
|
|
15
|
+
if (this.visited) {
|
|
16
|
+
trace(context, '-> [body:visit]', this.name + ' already visited.');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
context.enter(this);
|
|
20
|
+
trace(context, '-> [body:visit]', 'in ' + this.name);
|
|
21
|
+
this.visitBody(context, 'Input', this.schema);
|
|
22
|
+
this.visited = true;
|
|
23
|
+
trace(context, '<- [body:visit]', 'out ' + this.name);
|
|
24
|
+
context.leave(this);
|
|
25
|
+
}
|
|
26
|
+
forPrompt(context) {
|
|
27
|
+
return 'Body';
|
|
28
|
+
}
|
|
29
|
+
generate(_context, _writer, _selection) {
|
|
30
|
+
// do nothing for body, it will be added automatically
|
|
31
|
+
}
|
|
32
|
+
select(context, writer, selection) {
|
|
33
|
+
trace(context, '-> [body:select]', `-> in: ${this.parent.name}`);
|
|
34
|
+
if (this.payload) {
|
|
35
|
+
const spacing = ' '.repeat(6);
|
|
36
|
+
writer.append(spacing + 'body: """\n').append(spacing + '$args.input {\n');
|
|
37
|
+
context.indent += 2;
|
|
38
|
+
this.payload.select(context, writer, selection);
|
|
39
|
+
context.indent -= 2;
|
|
40
|
+
writer.append(spacing + '} \n').append(spacing + '"""\n' + ' '.repeat(5));
|
|
41
|
+
}
|
|
42
|
+
trace(context, '<- [body:select]', `-> out: ${this.parent.name}`);
|
|
43
|
+
}
|
|
44
|
+
visitBody(context, name, schema) {
|
|
45
|
+
trace(context, '-> [post::body::content]', 'in ' + this.name);
|
|
46
|
+
if ('$ref' in schema) {
|
|
47
|
+
this.visitBodyRef(context, schema);
|
|
48
|
+
}
|
|
49
|
+
// If the response has a content property, we need to find the JSON content.
|
|
50
|
+
else if (schema) {
|
|
51
|
+
this.payload = Factory.fromSchema(this, schema);
|
|
52
|
+
this.payload.name = name;
|
|
53
|
+
}
|
|
54
|
+
// don't know how to handle this yet
|
|
55
|
+
else {
|
|
56
|
+
throw new Error('Not yet implemented for: ' + JSON.stringify(schema));
|
|
57
|
+
}
|
|
58
|
+
trace(context, '<- [post::body::content]', 'out ' + this.name);
|
|
59
|
+
}
|
|
60
|
+
visitBodyRef(context, ref) {
|
|
61
|
+
trace(context, '-> [post::body::ref]', `in: ${this.name}, ref: ${ref.$ref}`);
|
|
62
|
+
const lookup = context.lookupRef(ref.$ref);
|
|
63
|
+
if (!lookup) {
|
|
64
|
+
throw new Error('Could not find a response with ref: ' + ref.$ref);
|
|
65
|
+
}
|
|
66
|
+
if ('$ref' in lookup) {
|
|
67
|
+
throw new Error('Not yet implemented for nested refs');
|
|
68
|
+
}
|
|
69
|
+
this.visitBody(context, ref.$ref, lookup);
|
|
70
|
+
trace(context, '<- [post::body::ref]', `out: ${this.name}, ref: ${ref.$ref}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../../src/oas/nodes/body.ts"],"names":[],"mappings":"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","sourcesContent":["import { Factory, IType, ReferenceObject, 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';\n\nexport class Body extends Type {\n public schema: SchemaObject;\n public payload?: IType;\n\n constructor(parent: IType, name: string, schema: SchemaObject) {\n super(parent, name);\n this.schema = schema;\n this.kind = 'input'; // all children will have the same type\n }\n\n get id(): string {\n return 'body:' + this.name;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n trace(context, '-> [body:visit]', this.name + ' already visited.');\n return;\n }\n\n context.enter(this);\n trace(context, '-> [body:visit]', 'in ' + this.name);\n\n this.visitBody(context, 'Input', this.schema);\n this.visited = true;\n\n trace(context, '<- [body:visit]', 'out ' + this.name);\n context.leave(this);\n }\n public forPrompt(context: OasContext): string {\n return 'Body';\n }\n\n public generate(_context: OasContext, _writer: Writer, _selection: string[]): void {\n // do nothing for body, it will be added automatically\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]): void {\n trace(context, '-> [body:select]', `-> in: ${this.parent!.name}`);\n\n if (this.payload) {\n const spacing = ' '.repeat(6);\n writer.append(spacing + 'body: \"\"\"\\n').append(spacing + '$args.input {\\n');\n\n context.indent += 2;\n this.payload.select(context, writer, selection);\n context.indent -= 2;\n\n writer.append(spacing + '} \\n').append(spacing + '\"\"\"\\n' + ' '.repeat(5));\n }\n\n trace(context, '<- [body:select]', `-> out: ${this.parent!.name}`);\n }\n\n private visitBody(context: OasContext, name: string, schema: SchemaObject | ReferenceObject): void {\n trace(context, '-> [post::body::content]', 'in ' + this.name);\n\n if ('$ref' in schema) {\n this.visitBodyRef(context, schema as ReferenceObject);\n }\n // If the response has a content property, we need to find the JSON content.\n else if (schema) {\n this.payload = Factory.fromSchema(this, schema as SchemaObject);\n this.payload!.name = name;\n }\n // don't know how to handle this yet\n else {\n throw new Error('Not yet implemented for: ' + JSON.stringify(schema));\n }\n\n trace(context, '<- [post::body::content]', 'out ' + this.name);\n }\n\n private visitBodyRef(context: OasContext, ref: ReferenceObject): void {\n trace(context, '-> [post::body::ref]', `in: ${this.name}, ref: ${ref.$ref}`);\n\n const lookup = context.lookupRef(ref.$ref!);\n if (!lookup) {\n throw new Error('Could not find a response with ref: ' + ref.$ref);\n }\n\n if ('$ref' in lookup) {\n throw new Error('Not yet implemented for nested refs');\n }\n\n this.visitBody(context, ref.$ref, lookup as SchemaObject);\n trace(context, '<- [post::body::ref]', `out: ${this.name}, ref: ${ref.$ref}`);\n }\n}\n"]}
|
package/dist/oas/nodes/comp.js
CHANGED
|
@@ -6,7 +6,8 @@ export class Composed extends Type {
|
|
|
6
6
|
schema;
|
|
7
7
|
consolidated;
|
|
8
8
|
get id() {
|
|
9
|
-
return `comp:${this.name}`;
|
|
9
|
+
// return `comp:${this.name}`;
|
|
10
|
+
return `comp:${this.kind}:${this.name}`;
|
|
10
11
|
}
|
|
11
12
|
constructor(parent, name, schema, consolidated = false) {
|
|
12
13
|
super(parent, name);
|
|
@@ -56,8 +57,10 @@ export class Composed extends Type {
|
|
|
56
57
|
else if (composedSchema.allOf != null) {
|
|
57
58
|
const selected = this.selectedProps(selection);
|
|
58
59
|
if (selected.length > 0) {
|
|
59
|
-
writer.write('type ');
|
|
60
|
+
// writer.write('type ');
|
|
61
|
+
writer.write(this.kind + ' ');
|
|
60
62
|
writer.write(Naming.getRefName(this.name));
|
|
63
|
+
writer.append(this.nameSuffix());
|
|
61
64
|
writer.write(' {\n');
|
|
62
65
|
for (const prop of selected) {
|
|
63
66
|
trace(context, ' [comp::generate]', `-> property: ${prop.name} (parent: ${prop.parent.name})`);
|