apollo-conn-gen 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/json.d.ts +1 -0
- package/dist/cli/json.js +70 -0
- package/dist/cli/json.js.map +1 -0
- package/dist/cli/oas-helpers/index.d.ts +4 -0
- package/dist/cli/oas-helpers/index.js +54 -0
- package/dist/cli/oas-helpers/index.js.map +1 -0
- package/dist/cli/oas.d.ts +1 -0
- package/dist/cli/oas.js +49 -0
- package/dist/cli/oas.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/json/index.d.ts +4 -0
- package/dist/json/index.js +5 -0
- package/dist/json/index.js.map +1 -0
- package/dist/json/io/index.d.ts +1 -0
- package/dist/json/io/index.js +2 -0
- package/dist/json/io/index.js.map +1 -0
- package/dist/json/io/writer.d.ts +15 -0
- package/dist/json/io/writer.js +45 -0
- package/dist/json/io/writer.js.map +1 -0
- package/dist/json/walker/index.d.ts +2 -0
- package/dist/json/walker/index.js +3 -0
- package/dist/json/walker/index.js.map +1 -0
- package/dist/json/walker/jsonContext.d.ts +12 -0
- package/dist/json/walker/jsonContext.js +42 -0
- package/dist/json/walker/jsonContext.js.map +1 -0
- package/dist/json/walker/jsonGen.d.ts +19 -0
- package/dist/json/walker/jsonGen.js +209 -0
- package/dist/json/walker/jsonGen.js.map +1 -0
- package/dist/json/walker/log/trace.d.ts +3 -0
- package/dist/json/walker/log/trace.js +11 -0
- package/dist/json/walker/log/trace.js.map +1 -0
- package/dist/json/walker/naming.d.ts +8 -0
- package/dist/json/walker/naming.js +66 -0
- package/dist/json/walker/naming.js.map +1 -0
- package/dist/json/walker/types/index.d.ts +4 -0
- package/dist/json/walker/types/index.js +5 -0
- package/dist/json/walker/types/index.js.map +1 -0
- package/dist/json/walker/types/jsonArray.d.ts +13 -0
- package/dist/json/walker/types/jsonArray.js +70 -0
- package/dist/json/walker/types/jsonArray.js.map +1 -0
- package/dist/json/walker/types/jsonObj.d.ts +17 -0
- package/dist/json/walker/types/jsonObj.js +76 -0
- package/dist/json/walker/types/jsonObj.js.map +1 -0
- package/dist/json/walker/types/jsonScalar.d.ts +12 -0
- package/dist/json/walker/types/jsonScalar.js +39 -0
- package/dist/json/walker/types/jsonScalar.js.map +1 -0
- package/dist/json/walker/types/jsonType.d.ts +16 -0
- package/dist/json/walker/types/jsonType.js +30 -0
- package/dist/json/walker/types/jsonType.js.map +1 -0
- package/dist/oas/index.d.ts +14 -0
- package/dist/oas/index.js +15 -0
- package/dist/oas/index.js.map +1 -0
- package/dist/oas/io/writer.d.ts +25 -0
- package/dist/oas/io/writer.js +313 -0
- package/dist/oas/io/writer.js.map +1 -0
- package/dist/oas/log/trace.d.ts +3 -0
- package/dist/oas/log/trace.js +7 -0
- package/dist/oas/log/trace.js.map +1 -0
- package/dist/oas/nodes/arr.d.ts +15 -0
- package/dist/oas/nodes/arr.js +47 -0
- package/dist/oas/nodes/arr.js.map +1 -0
- package/dist/oas/nodes/circularRef.d.ts +13 -0
- package/dist/oas/nodes/circularRef.js +39 -0
- package/dist/oas/nodes/circularRef.js.map +1 -0
- package/dist/oas/nodes/comp.d.ts +18 -0
- package/dist/oas/nodes/comp.js +156 -0
- package/dist/oas/nodes/comp.js.map +1 -0
- package/dist/oas/nodes/en.d.ts +14 -0
- package/dist/oas/nodes/en.js +57 -0
- package/dist/oas/nodes/en.js.map +1 -0
- package/dist/oas/nodes/factory.d.ts +17 -0
- package/dist/oas/nodes/factory.js +174 -0
- package/dist/oas/nodes/factory.js.map +1 -0
- package/dist/oas/nodes/get.d.ts +24 -0
- package/dist/oas/nodes/get.js +167 -0
- package/dist/oas/nodes/get.js.map +1 -0
- package/dist/oas/nodes/obj.d.ts +15 -0
- package/dist/oas/nodes/obj.js +177 -0
- package/dist/oas/nodes/obj.js.map +1 -0
- package/dist/oas/nodes/param/param.d.ts +17 -0
- package/dist/oas/nodes/param/param.js +64 -0
- package/dist/oas/nodes/param/param.js.map +1 -0
- package/dist/oas/nodes/props/prop.d.ts +12 -0
- package/dist/oas/nodes/props/prop.js +33 -0
- package/dist/oas/nodes/props/prop.js.map +1 -0
- package/dist/oas/nodes/props/propArray.d.ts +15 -0
- package/dist/oas/nodes/props/propArray.js +75 -0
- package/dist/oas/nodes/props/propArray.js.map +1 -0
- package/dist/oas/nodes/props/propObj.d.ts +16 -0
- package/dist/oas/nodes/props/propObj.js +70 -0
- package/dist/oas/nodes/props/propObj.js.map +1 -0
- package/dist/oas/nodes/props/propRef.d.ts +19 -0
- package/dist/oas/nodes/props/propRef.js +108 -0
- package/dist/oas/nodes/props/propRef.js.map +1 -0
- package/dist/oas/nodes/props/propScalar.d.ts +16 -0
- package/dist/oas/nodes/props/propScalar.js +47 -0
- package/dist/oas/nodes/props/propScalar.js.map +1 -0
- package/dist/oas/nodes/props/referenceObject.d.ts +3 -0
- package/dist/oas/nodes/props/referenceObject.js +2 -0
- package/dist/oas/nodes/props/referenceObject.js.map +1 -0
- package/dist/oas/nodes/ref.d.ts +17 -0
- package/dist/oas/nodes/ref.js +70 -0
- package/dist/oas/nodes/ref.js.map +1 -0
- package/dist/oas/nodes/response.d.ts +14 -0
- package/dist/oas/nodes/response.js +48 -0
- package/dist/oas/nodes/response.js.map +1 -0
- package/dist/oas/nodes/scalar.d.ts +12 -0
- package/dist/oas/nodes/scalar.js +26 -0
- package/dist/oas/nodes/scalar.js.map +1 -0
- package/dist/oas/nodes/type.d.ts +43 -0
- package/dist/oas/nodes/type.js +107 -0
- package/dist/oas/nodes/type.js.map +1 -0
- package/dist/oas/nodes/union.d.ts +16 -0
- package/dist/oas/nodes/union.js +133 -0
- package/dist/oas/nodes/union.js.map +1 -0
- package/dist/oas/oasContext.d.ts +23 -0
- package/dist/oas/oasContext.js +73 -0
- package/dist/oas/oasContext.js.map +1 -0
- package/dist/oas/oasGen.d.ts +28 -0
- package/dist/oas/oasGen.js +166 -0
- package/dist/oas/oasGen.js.map +1 -0
- package/dist/oas/prompts/base/theme.d.ts +1 -0
- package/dist/oas/prompts/base/theme.js +50 -0
- package/dist/oas/prompts/base/theme.js.map +1 -0
- package/dist/oas/prompts/base/utils.d.ts +3 -0
- package/dist/oas/prompts/base/utils.js +8 -0
- package/dist/oas/prompts/base/utils.js.map +1 -0
- package/dist/oas/prompts/prompt.d.ts +19 -0
- package/dist/oas/prompts/prompt.js +176 -0
- package/dist/oas/prompts/prompt.js.map +1 -0
- package/dist/oas/prompts/theme.d.ts +126 -0
- package/dist/oas/prompts/theme.js +2 -0
- package/dist/oas/prompts/theme.js.map +1 -0
- package/dist/oas/utils/gql.d.ts +5 -0
- package/dist/oas/utils/gql.js +35 -0
- package/dist/oas/utils/gql.js.map +1 -0
- package/dist/oas/utils/naming.d.ts +16 -0
- package/dist/oas/utils/naming.js +143 -0
- package/dist/oas/utils/naming.js.map +1 -0
- package/dist/oas/utils/typeUtils.d.ts +6 -0
- package/dist/oas/utils/typeUtils.js +25 -0
- package/dist/oas/utils/typeUtils.js.map +1 -0
- package/package.json +77 -0
- package/readme.md +383 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { CircularRef } from '../nodes/circularRef.js';
|
|
3
|
+
import { Composed } from '../nodes/comp.js';
|
|
4
|
+
import { Obj } from '../nodes/obj.js';
|
|
5
|
+
import { Prop } from '../nodes/props/prop.js';
|
|
6
|
+
import { PropArray } from '../nodes/props/propArray.js';
|
|
7
|
+
import { PropScalar } from '../nodes/props/propScalar.js';
|
|
8
|
+
import { Union } from '../nodes/union.js';
|
|
9
|
+
import { Naming } from '../utils/naming.js';
|
|
10
|
+
import { T } from '../utils/typeUtils.js';
|
|
11
|
+
export class Writer {
|
|
12
|
+
generator;
|
|
13
|
+
static findNonPropParent(type) {
|
|
14
|
+
let parent = type;
|
|
15
|
+
while (parent instanceof Prop) {
|
|
16
|
+
parent = parent.parent;
|
|
17
|
+
}
|
|
18
|
+
return parent;
|
|
19
|
+
}
|
|
20
|
+
static progressiveSplits(input) {
|
|
21
|
+
const parts = input.split('>');
|
|
22
|
+
const results = [];
|
|
23
|
+
for (let i = 1; i <= parts.length; i++) {
|
|
24
|
+
results.push(parts.slice(0, i).join('>'));
|
|
25
|
+
}
|
|
26
|
+
return results;
|
|
27
|
+
}
|
|
28
|
+
buffer;
|
|
29
|
+
constructor(generator) {
|
|
30
|
+
this.generator = generator;
|
|
31
|
+
this.buffer = [];
|
|
32
|
+
}
|
|
33
|
+
write(input) {
|
|
34
|
+
this.buffer.push(input);
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
append(input) {
|
|
38
|
+
this.buffer.push(input);
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
flush() {
|
|
42
|
+
return this.buffer.join('');
|
|
43
|
+
}
|
|
44
|
+
writeSchema(writer, pending, selection) {
|
|
45
|
+
const context = this.generator.context;
|
|
46
|
+
const generatedSet = context.generatedSet;
|
|
47
|
+
// generatedSet.clear();
|
|
48
|
+
this.writeDirectives(writer);
|
|
49
|
+
this.writeJSONScalar(writer);
|
|
50
|
+
pending.forEach((type) => {
|
|
51
|
+
if (!generatedSet.has(type.id)) {
|
|
52
|
+
type.generate(context, this, selection);
|
|
53
|
+
generatedSet.add(type.id);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
// TODO: Pending
|
|
57
|
+
// const counter = new RefCounter(this.context);
|
|
58
|
+
// counter.addAll(this.collected);
|
|
59
|
+
// const refs = counter.getCount();
|
|
60
|
+
// this.printRefs(refs);
|
|
61
|
+
// for (const type of this.context.types.ts.values()) {
|
|
62
|
+
// if (counter.getCount().has(type.name)) {
|
|
63
|
+
// await type.generate(this.context, writer);
|
|
64
|
+
// generatedSet.add(type.name);
|
|
65
|
+
// }
|
|
66
|
+
// }
|
|
67
|
+
this.writeQuery(context, writer, this.generator.paths, selection);
|
|
68
|
+
writer.flush();
|
|
69
|
+
}
|
|
70
|
+
generate(selection) {
|
|
71
|
+
const pending = new Map();
|
|
72
|
+
selection = this.collectExpandedPaths(selection);
|
|
73
|
+
for (const path of selection) {
|
|
74
|
+
let collection = Array.from(this.generator.paths.values());
|
|
75
|
+
let current;
|
|
76
|
+
let last;
|
|
77
|
+
let i = 0;
|
|
78
|
+
const parts = path.split('>');
|
|
79
|
+
do {
|
|
80
|
+
const part = parts[i].replace(/#\/c\/s/g, '#/components/schemas');
|
|
81
|
+
if (part === '*') {
|
|
82
|
+
// remove the current path from the selection array
|
|
83
|
+
selection = selection.filter((s) => s !== path);
|
|
84
|
+
if (current instanceof Composed) {
|
|
85
|
+
current.consolidate(selection);
|
|
86
|
+
}
|
|
87
|
+
// add all the props from the current node and exit loop
|
|
88
|
+
current?.props.forEach((child) => {
|
|
89
|
+
if (T.isLeaf(child)) {
|
|
90
|
+
selection.push(child.path());
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
current = collection.find((t) => t.id === part);
|
|
96
|
+
if (!current) {
|
|
97
|
+
throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());
|
|
98
|
+
}
|
|
99
|
+
// make sure we expand it before we move on to the next part
|
|
100
|
+
this.generator.expand(current);
|
|
101
|
+
last = current;
|
|
102
|
+
collection = Array.from(current.children.values()) || Array.from(current.props.values()) || [];
|
|
103
|
+
i++;
|
|
104
|
+
} while (i < parts.length);
|
|
105
|
+
if (current) {
|
|
106
|
+
// TODO: this seems redundant, we've already walked the parent AND can be also
|
|
107
|
+
// contained in the context stack
|
|
108
|
+
const parentType = Writer.findNonPropParent(current);
|
|
109
|
+
if (!pending.has(parentType.id)) {
|
|
110
|
+
pending.set(parentType.id, parentType);
|
|
111
|
+
}
|
|
112
|
+
parentType
|
|
113
|
+
.ancestors()
|
|
114
|
+
.filter((t) => !pending.has(t.id) && this.isContainer(t))
|
|
115
|
+
.forEach((dep) => {
|
|
116
|
+
// TODO: potential merge needed?
|
|
117
|
+
pending.set(dep.id, dep);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (!_.isEmpty(pending)) {
|
|
122
|
+
// first pass is to consolidate all Composed & Union nodes
|
|
123
|
+
const composed = Array.from(pending.values())
|
|
124
|
+
.filter((t) => t instanceof Composed || t instanceof Union)
|
|
125
|
+
.map((t) => t);
|
|
126
|
+
for (const comp of composed) {
|
|
127
|
+
comp.consolidate(selection).forEach((id) => pending.delete(id));
|
|
128
|
+
}
|
|
129
|
+
this.writeSchema(this, pending, selection);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
collectPaths(path, collection) {
|
|
133
|
+
const stack = [];
|
|
134
|
+
let current;
|
|
135
|
+
let last;
|
|
136
|
+
let i = 0;
|
|
137
|
+
const parts = path.split('>');
|
|
138
|
+
do {
|
|
139
|
+
const part = parts[i].replace(/#\/c\/s/g, '#/components/schemas');
|
|
140
|
+
current = collection.find((t) => t.id === part);
|
|
141
|
+
if (!current) {
|
|
142
|
+
throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());
|
|
143
|
+
}
|
|
144
|
+
// make sure we expand it before we move on to the next part
|
|
145
|
+
this.generator.expand(current);
|
|
146
|
+
last = current;
|
|
147
|
+
collection = Array.from(current.children.values()) || Array.from(current.props.values()) || [];
|
|
148
|
+
stack.push(current);
|
|
149
|
+
i++;
|
|
150
|
+
} while (i < parts.length);
|
|
151
|
+
return stack;
|
|
152
|
+
}
|
|
153
|
+
writeJSONScalar(writer) {
|
|
154
|
+
writer.write('\nscalar JSON\n\n');
|
|
155
|
+
}
|
|
156
|
+
writeQuery(context, writer, collected, selection) {
|
|
157
|
+
writer.write('type Query {\n');
|
|
158
|
+
const selectionSet = new Set(selection.map((s) => s.split('>')[0]));
|
|
159
|
+
const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));
|
|
160
|
+
for (const path of paths) {
|
|
161
|
+
path.generate(context, writer, []);
|
|
162
|
+
this.writeConnector(context, writer, path, selection);
|
|
163
|
+
context.generatedSet.add(path.id);
|
|
164
|
+
}
|
|
165
|
+
writer.write('}\n\n');
|
|
166
|
+
}
|
|
167
|
+
writeConnector(context, writer, type, selection) {
|
|
168
|
+
const indent = 0;
|
|
169
|
+
const get = type; // assume type is GetOp
|
|
170
|
+
let spacing = ' '.repeat(indent + 4);
|
|
171
|
+
writer.append(spacing).append('@connect(\n');
|
|
172
|
+
const request = this.buildRequestMethodAndArgs(get);
|
|
173
|
+
spacing = ' '.repeat(indent + 6);
|
|
174
|
+
writer
|
|
175
|
+
.append(spacing)
|
|
176
|
+
.append('source: "api"\n')
|
|
177
|
+
.append(spacing)
|
|
178
|
+
.append('http: ' + request + '\n')
|
|
179
|
+
.append(spacing)
|
|
180
|
+
.append('selection: """\n');
|
|
181
|
+
if (get.resultType) {
|
|
182
|
+
this.writeSelection(context, writer, get.resultType, selection);
|
|
183
|
+
}
|
|
184
|
+
writer.append(spacing).append('"""\n');
|
|
185
|
+
spacing = ' '.repeat(indent + 4);
|
|
186
|
+
writer.append(spacing).append(')\n');
|
|
187
|
+
}
|
|
188
|
+
buildRequestMethodAndArgs(get) {
|
|
189
|
+
let builder = '';
|
|
190
|
+
builder += '"' + get.operation.path.replace(/\{([a-zA-Z0-9]+)\}/g, '{$args.$1}');
|
|
191
|
+
if (get.params.length > 0) {
|
|
192
|
+
const params = get.params.filter((p) => {
|
|
193
|
+
return p.required && p.parameter.in && p.parameter.in.toLowerCase() === 'query';
|
|
194
|
+
});
|
|
195
|
+
if (params.length > 0) {
|
|
196
|
+
builder += '?' + params.map((p) => `${p.name}={$args.${Naming.genParamName(p.name)}}`).join('&');
|
|
197
|
+
}
|
|
198
|
+
const headers = get.operation.getParameters().filter((p) => p.in && p.in.toLowerCase() === 'header');
|
|
199
|
+
builder += '"\n';
|
|
200
|
+
if (headers.length > 0) {
|
|
201
|
+
let spacing = ' '.repeat(6);
|
|
202
|
+
builder += spacing + 'headers: [\n';
|
|
203
|
+
spacing = ' '.repeat(8);
|
|
204
|
+
for (const p of headers) {
|
|
205
|
+
let value = null;
|
|
206
|
+
if (p.example != null) {
|
|
207
|
+
value = p.example.toString();
|
|
208
|
+
}
|
|
209
|
+
if (p.examples && Object.keys(p.examples).length > 0) {
|
|
210
|
+
value = Object.keys(p.examples).join(',');
|
|
211
|
+
}
|
|
212
|
+
if (value == null) {
|
|
213
|
+
value = '<placeholder>';
|
|
214
|
+
}
|
|
215
|
+
builder += spacing + `{ name: "${p.name}", value: "${value}" }\n`;
|
|
216
|
+
}
|
|
217
|
+
spacing = ' '.repeat(6);
|
|
218
|
+
builder += spacing + ']';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
builder += '"';
|
|
223
|
+
}
|
|
224
|
+
return `{ GET: ${builder} }`;
|
|
225
|
+
}
|
|
226
|
+
writeSelection(context, writer, type, selection) {
|
|
227
|
+
context.indent = 6;
|
|
228
|
+
type.select(context, writer, selection);
|
|
229
|
+
}
|
|
230
|
+
writeDirectives(writer) {
|
|
231
|
+
const api = this.generator.parser;
|
|
232
|
+
const host = this.getServerUrl(api.getDefinition().servers?.[0]);
|
|
233
|
+
writer
|
|
234
|
+
.append('extend schema\n')
|
|
235
|
+
.append(' @link(url: "https://specs.apollo.dev/federation/v2.10", import: ["@key"])\n')
|
|
236
|
+
.append(' @link(\n')
|
|
237
|
+
.append(' url: "https://specs.apollo.dev/connect/v0.1"\n')
|
|
238
|
+
.append(' import: ["@connect", "@source"]\n')
|
|
239
|
+
.append(' )\n')
|
|
240
|
+
.append(' @source(name: "api", http: { baseURL: "')
|
|
241
|
+
.append(host)
|
|
242
|
+
.append('" })\n\n');
|
|
243
|
+
}
|
|
244
|
+
getServerUrl(server) {
|
|
245
|
+
if (!server) {
|
|
246
|
+
return 'http://localhost:4010';
|
|
247
|
+
}
|
|
248
|
+
let url = server.url;
|
|
249
|
+
if (server.variables) {
|
|
250
|
+
for (const key in server.variables) {
|
|
251
|
+
url = url.replace('{' + key + '}', server.variables[key].default);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return url;
|
|
255
|
+
}
|
|
256
|
+
traverseTree(current, selection, pending) {
|
|
257
|
+
// we might be in a node far from the root, so we need to traverse upwards
|
|
258
|
+
// as well and add the props that we can find on the way
|
|
259
|
+
const source = current;
|
|
260
|
+
source
|
|
261
|
+
.ancestors()
|
|
262
|
+
.filter((t) => t instanceof Prop)
|
|
263
|
+
.map((p) => Writer.findNonPropParent(p))
|
|
264
|
+
.forEach((parent) => pending.set(parent.id, parent));
|
|
265
|
+
T.traverse(source, (child) => {
|
|
266
|
+
if (T.isLeaf(child)) {
|
|
267
|
+
// this is a weird take but if the child is an array of scalars
|
|
268
|
+
// then we want to avoid adding it twice
|
|
269
|
+
if (T.isLeaf(child.parent)) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
selection.push(child.path());
|
|
273
|
+
const parentType = Writer.findNonPropParent(child);
|
|
274
|
+
if (!pending.has(parentType.id)) {
|
|
275
|
+
pending.set(parentType.id, parentType);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
this.generator.expand(child);
|
|
280
|
+
if (child instanceof Composed) {
|
|
281
|
+
child.consolidate(selection);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
isContainer(type) {
|
|
287
|
+
return type instanceof Obj || type instanceof Union || type instanceof Composed || type instanceof CircularRef;
|
|
288
|
+
}
|
|
289
|
+
collectExpandedPaths(selection) {
|
|
290
|
+
const newSelection = new Set();
|
|
291
|
+
const expands = selection.filter((p) => p.endsWith('>**'));
|
|
292
|
+
const filtered = expands.map((p) => p.replace('>**', ''));
|
|
293
|
+
const paths = Array.from(this.generator.paths.values());
|
|
294
|
+
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
|
+
nodes.forEach((stack) => {
|
|
299
|
+
const root = _.last(stack);
|
|
300
|
+
T.traverse(root, (child) => {
|
|
301
|
+
if (T.isPropScalar(child) || (child instanceof PropArray && child.items instanceof PropScalar)) {
|
|
302
|
+
newSelection.add(child.path());
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
this.generator.expand(child);
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
// finally remove the expanded paths from the selection
|
|
310
|
+
return [...newSelection, ...selection.filter((p) => !expands.includes(p))];
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +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/circularRef.js';\nimport { Composed } from '../nodes/comp.js';\nimport { Get } from '../nodes/get.js';\nimport { Obj } from '../nodes/obj.js';\nimport { Param } from '../nodes/param/param.js';\nimport { Prop } from '../nodes/props/prop.js';\nimport { PropArray } from '../nodes/props/propArray.js';\nimport { PropScalar } from '../nodes/props/propScalar.js';\nimport { IType, Type } from '../nodes/type.js';\nimport { Union } from '../nodes/union.js';\nimport { Naming } from '../utils/naming.js';\nimport { T } from '../utils/typeUtils.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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../src/oas/log/trace.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,KAAK,CAAC,GAAsB,EAAE,GAAW,EAAE,GAAW;IACpE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAsB,EAAE,GAAW,EAAE,GAAW;IACnE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC","sourcesContent":["import { OasContext } from '../oasContext.js';\n\nexport function trace(ctx: OasContext | null, loc: string, log: string) {\n console.log(' '.repeat(ctx?.size() ?? 0), loc, log);\n}\n\nexport function warn(ctx: OasContext | null, loc: string, log: string) {\n console.error(' '.repeat(ctx?.size() ?? 0), loc, log);\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OpenAPIV3 } from 'openapi-types';
|
|
2
|
+
import ArraySchemaObject = OpenAPIV3.ArraySchemaObject;
|
|
3
|
+
import { OasContext } from '../oasContext.js';
|
|
4
|
+
import { Writer } from '../io/writer.js';
|
|
5
|
+
import { IType, Type } from './type.js';
|
|
6
|
+
export declare class Arr extends Type {
|
|
7
|
+
items: ArraySchemaObject;
|
|
8
|
+
itemsType?: IType;
|
|
9
|
+
constructor(parent: IType | undefined, name: string, items: ArraySchemaObject);
|
|
10
|
+
get id(): string;
|
|
11
|
+
visit(context: OasContext): void;
|
|
12
|
+
forPrompt(_context: OasContext): string;
|
|
13
|
+
generate(context: OasContext, writer: Writer, selection: string[]): void;
|
|
14
|
+
select(context: OasContext, writer: Writer, selection: string[]): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { trace } from '../log/trace.js';
|
|
2
|
+
import { Naming } from '../utils/naming.js';
|
|
3
|
+
import { Type } from './type.js';
|
|
4
|
+
export class Arr extends Type {
|
|
5
|
+
items;
|
|
6
|
+
itemsType;
|
|
7
|
+
constructor(parent, name, items) {
|
|
8
|
+
super(parent, name);
|
|
9
|
+
this.items = items;
|
|
10
|
+
}
|
|
11
|
+
get id() {
|
|
12
|
+
return 'array:' + (this.itemsType ? this.itemsType.name : 'unknown-yet');
|
|
13
|
+
}
|
|
14
|
+
visit(context) {
|
|
15
|
+
if (this.visited) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
context.enter(this);
|
|
19
|
+
trace(context, '-> [array:visit]', 'in');
|
|
20
|
+
this.itemsType?.visit(context);
|
|
21
|
+
this.visited = true;
|
|
22
|
+
trace(context, '-> [array:visit]', 'out');
|
|
23
|
+
context.leave(this);
|
|
24
|
+
}
|
|
25
|
+
forPrompt(_context) {
|
|
26
|
+
return `${Naming.getRefName(this.name)} (Array)`;
|
|
27
|
+
}
|
|
28
|
+
generate(context, writer, selection) {
|
|
29
|
+
context.enter(this);
|
|
30
|
+
trace(context, '-> [array::generate]', `-> in: ${this.name}`);
|
|
31
|
+
writer.append('[');
|
|
32
|
+
if (this.itemsType) {
|
|
33
|
+
this.itemsType.generate(context, writer, selection);
|
|
34
|
+
}
|
|
35
|
+
writer.append(']');
|
|
36
|
+
trace(context, '<- [array::generate]', `-> out: ${this.name}`);
|
|
37
|
+
context.leave(this);
|
|
38
|
+
}
|
|
39
|
+
select(context, writer, selection) {
|
|
40
|
+
trace(context, '-> [array::select]', `-> in: ${this.name}`);
|
|
41
|
+
if (this.itemsType) {
|
|
42
|
+
this.itemsType.select(context, writer, selection);
|
|
43
|
+
}
|
|
44
|
+
trace(context, '<- [array::select]', `-> out: ${this.name}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=arr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arr.js","sourceRoot":"","sources":["../../../src/oas/nodes/arr.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAS,IAAI,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,OAAO,GAAI,SAAQ,IAAI;IAKlB;IAJF,SAAS,CAAS;IACzB,YACE,MAAyB,EACzB,IAAY,EACL,KAAwB;QAE/B,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAFb,UAAK,GAAL,KAAK,CAAmB;IAGjC,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,QAAQ,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC3E,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,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAEzC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAEM,SAAS,CAAC,QAAoB;QACnC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IACnD,CAAC;IAEM,QAAQ,CAAC,OAAmB,EAAE,MAAc,EAAE,SAAmB;QACtE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9D,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEnB,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAEM,MAAM,CAAC,OAAmB,EAAE,MAAc,EAAE,SAAmB;QACpE,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;CACF","sourcesContent":["import { OpenAPIV3 } from 'openapi-types';\nimport ArraySchemaObject = OpenAPIV3.ArraySchemaObject;\n\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\nimport { Factory } from './factory.js';\nimport { IType, Type } from './type.js';\n\nexport class Arr extends Type {\n public itemsType?: IType;\n constructor(\n parent: IType | undefined,\n name: string,\n public items: ArraySchemaObject,\n ) {\n super(parent, name);\n }\n\n get id(): string {\n return 'array:' + (this.itemsType ? this.itemsType.name : 'unknown-yet');\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n context.enter(this);\n trace(context, '-> [array:visit]', 'in');\n\n this.itemsType?.visit(context);\n this.visited = true;\n\n trace(context, '-> [array:visit]', 'out');\n context.leave(this);\n }\n\n public forPrompt(_context: OasContext): string {\n return `${Naming.getRefName(this.name)} (Array)`;\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n context.enter(this);\n trace(context, '-> [array::generate]', `-> in: ${this.name}`);\n\n writer.append('[');\n if (this.itemsType) {\n this.itemsType.generate(context, writer, selection);\n }\n writer.append(']');\n\n trace(context, '<- [array::generate]', `-> out: ${this.name}`);\n context.leave(this);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n trace(context, '-> [array::select]', `-> in: ${this.name}`);\n\n if (this.itemsType) {\n this.itemsType.select(context, writer, selection);\n }\n\n trace(context, '<- [array::select]', `-> out: ${this.name}`);\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OasContext } from '../oasContext.js';
|
|
2
|
+
import { Writer } from '../io/writer.js';
|
|
3
|
+
import { IType, Type } from './type.js';
|
|
4
|
+
export declare class CircularRef extends Type {
|
|
5
|
+
ref: IType;
|
|
6
|
+
constructor(parent: IType, ref: IType);
|
|
7
|
+
get id(): string;
|
|
8
|
+
forPrompt(_: OasContext): string;
|
|
9
|
+
add(child: IType): void;
|
|
10
|
+
visit(context: OasContext): void;
|
|
11
|
+
generate(context: OasContext, writer: Writer): void;
|
|
12
|
+
select(context: OasContext, writer: Writer): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { trace } from '../log/trace.js';
|
|
2
|
+
import { Naming } from '../utils/naming.js';
|
|
3
|
+
import { Type } from './type.js';
|
|
4
|
+
export class CircularRef extends Type {
|
|
5
|
+
ref;
|
|
6
|
+
constructor(parent, ref) {
|
|
7
|
+
super(parent, ref.name);
|
|
8
|
+
this.ref = ref;
|
|
9
|
+
// this.children = parent.children;
|
|
10
|
+
}
|
|
11
|
+
get id() {
|
|
12
|
+
return `circular-ref:#${this.ref.id}`;
|
|
13
|
+
// return this.child.id;
|
|
14
|
+
}
|
|
15
|
+
forPrompt(_) {
|
|
16
|
+
return `${Naming.getRefName(this.ref.name)} (Circular Ref in: ${this.parent?.id})`;
|
|
17
|
+
}
|
|
18
|
+
add(child) {
|
|
19
|
+
throw new Error('Should not be adding a child to a circular ref');
|
|
20
|
+
}
|
|
21
|
+
visit(context) {
|
|
22
|
+
trace(context, '-> [circular-ref:visit]', `-> in: ${this.name}`);
|
|
23
|
+
// Do nothing, this type is always visited.
|
|
24
|
+
trace(context, '<- [circular-ref:visit]', `-> out: ${this.name}`);
|
|
25
|
+
}
|
|
26
|
+
generate(context, writer) {
|
|
27
|
+
trace(context, '-> [circular-ref:generate]', `-> in: ${this.name}`);
|
|
28
|
+
// Do nothing, we can't really generate a circular reference.
|
|
29
|
+
trace(context, '<- [circular-ref:generate]', `-> out: ${this.name}`);
|
|
30
|
+
}
|
|
31
|
+
select(context, writer) {
|
|
32
|
+
trace(context, '-> [circular-ref:select]', `-> in: ${this.name}`);
|
|
33
|
+
writer
|
|
34
|
+
.append(' '.repeat(context.indent + context.stack.length))
|
|
35
|
+
.append(`# Circular reference to '${this.name}' detected! Please re-visit the schema and remove the reference.\n`);
|
|
36
|
+
trace(context, '<- [circular-ref:select]', `-> out: ${this.name}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=circularRef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circularRef.js","sourceRoot":"","sources":["../../../src/oas/nodes/circularRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAS,IAAI,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,OAAO,WAAY,SAAQ,IAAI;IAG1B;IAFT,YACE,MAAa,EACN,GAAU;QAEjB,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAFjB,QAAG,GAAH,GAAG,CAAO;QAGjB,mCAAmC;IACrC,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,iBAAiB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACtC,wBAAwB;IAC1B,CAAC;IAEM,SAAS,CAAC,CAAa;QAC5B,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC;IACrF,CAAC;IAEM,GAAG,CAAC,KAAY;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,OAAmB;QAC9B,KAAK,CAAC,OAAO,EAAE,yBAAyB,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,2CAA2C;QAC3C,KAAK,CAAC,OAAO,EAAE,yBAAyB,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAEM,QAAQ,CAAC,OAAmB,EAAE,MAAc;QACjD,KAAK,CAAC,OAAO,EAAE,4BAA4B,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,6DAA6D;QAC7D,KAAK,CAAC,OAAO,EAAE,4BAA4B,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAEM,MAAM,CAAC,OAAmB,EAAE,MAAc;QAC/C,KAAK,CAAC,OAAO,EAAE,0BAA0B,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAElE,MAAM;aACH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;aACzD,MAAM,CACL,4BAA4B,IAAI,CAAC,IAAI,oEAAoE,CAC1G,CAAC;QAEJ,KAAK,CAAC,OAAO,EAAE,0BAA0B,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;CACF","sourcesContent":["import { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\nimport { IType, Type } from './type.js';\n\nexport class CircularRef extends Type {\n constructor(\n parent: IType,\n public ref: IType,\n ) {\n super(parent, ref.name);\n // this.children = parent.children;\n }\n\n get id(): string {\n return `circular-ref:#${this.ref.id}`;\n // return this.child.id;\n }\n\n public forPrompt(_: OasContext): string {\n return `${Naming.getRefName(this.ref.name)} (Circular Ref in: ${this.parent?.id})`;\n }\n\n public add(child: IType): void {\n throw new Error('Should not be adding a child to a circular ref');\n }\n\n public visit(context: OasContext): void {\n trace(context, '-> [circular-ref:visit]', `-> in: ${this.name}`);\n // Do nothing, this type is always visited.\n trace(context, '<- [circular-ref:visit]', `-> out: ${this.name}`);\n }\n\n public generate(context: OasContext, writer: Writer): void {\n trace(context, '-> [circular-ref:generate]', `-> in: ${this.name}`);\n // Do nothing, we can't really generate a circular reference.\n trace(context, '<- [circular-ref:generate]', `-> out: ${this.name}`);\n }\n\n public select(context: OasContext, writer: Writer): void {\n trace(context, '-> [circular-ref:select]', `-> in: ${this.name}`);\n\n writer\n .append(' '.repeat(context.indent + context.stack.length))\n .append(\n `# Circular reference to '${this.name}' detected! Please re-visit the schema and remove the reference.\\n`,\n );\n\n trace(context, '<- [circular-ref:select]', `-> out: ${this.name}`);\n }\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SchemaObject } from 'oas/types';
|
|
2
|
+
import { OasContext } from '../oasContext.js';
|
|
3
|
+
import { Writer } from '../io/writer.js';
|
|
4
|
+
import { IType, Type } from './type.js';
|
|
5
|
+
export declare class Composed extends Type {
|
|
6
|
+
name: string;
|
|
7
|
+
schema: SchemaObject;
|
|
8
|
+
consolidated: boolean;
|
|
9
|
+
get id(): string;
|
|
10
|
+
constructor(parent: IType | undefined, name: string, schema: SchemaObject, consolidated?: boolean);
|
|
11
|
+
forPrompt(_context: OasContext): string;
|
|
12
|
+
visit(context: OasContext): void;
|
|
13
|
+
generate(context: OasContext, writer: Writer, selection: string[]): void;
|
|
14
|
+
select(context: OasContext, writer: Writer, selection: string[]): void;
|
|
15
|
+
consolidate(selection: string[]): Set<string>;
|
|
16
|
+
private visitAllOfNode;
|
|
17
|
+
private visitOneOfNode;
|
|
18
|
+
}
|