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.
Files changed (54) hide show
  1. package/dist/cli/oas-helpers/index.js +10 -0
  2. package/dist/cli/oas-helpers/index.js.map +1 -1
  3. package/dist/oas/io/writer.d.ts +4 -2
  4. package/dist/oas/io/writer.js +111 -56
  5. package/dist/oas/io/writer.js.map +1 -1
  6. package/dist/oas/nodes/body.d.ts +16 -0
  7. package/dist/oas/nodes/body.js +73 -0
  8. package/dist/oas/nodes/body.js.map +1 -0
  9. package/dist/oas/nodes/comp.js +5 -2
  10. package/dist/oas/nodes/comp.js.map +1 -1
  11. package/dist/oas/nodes/factory.d.ts +4 -2
  12. package/dist/oas/nodes/factory.js +15 -3
  13. package/dist/oas/nodes/factory.js.map +1 -1
  14. package/dist/oas/nodes/get.d.ts +5 -3
  15. package/dist/oas/nodes/get.js +16 -4
  16. package/dist/oas/nodes/get.js.map +1 -1
  17. package/dist/oas/nodes/iType.d.ts +3 -0
  18. package/dist/oas/nodes/iType.js.map +1 -1
  19. package/dist/oas/nodes/internal.d.ts +2 -0
  20. package/dist/oas/nodes/internal.js +2 -0
  21. package/dist/oas/nodes/internal.js.map +1 -1
  22. package/dist/oas/nodes/obj.d.ts +1 -0
  23. package/dist/oas/nodes/obj.js +18 -54
  24. package/dist/oas/nodes/obj.js.map +1 -1
  25. package/dist/oas/nodes/post.d.ts +16 -0
  26. package/dist/oas/nodes/post.js +101 -0
  27. package/dist/oas/nodes/post.js.map +1 -0
  28. package/dist/oas/nodes/propObj.js +0 -1
  29. package/dist/oas/nodes/propObj.js.map +1 -1
  30. package/dist/oas/nodes/propRef.js +1 -1
  31. package/dist/oas/nodes/propRef.js.map +1 -1
  32. package/dist/oas/nodes/propScalar.js +2 -4
  33. package/dist/oas/nodes/propScalar.js.map +1 -1
  34. package/dist/oas/nodes/response.js +7 -7
  35. package/dist/oas/nodes/response.js.map +1 -1
  36. package/dist/oas/nodes/scalar.js +7 -1
  37. package/dist/oas/nodes/scalar.js.map +1 -1
  38. package/dist/oas/nodes/type.d.ts +3 -1
  39. package/dist/oas/nodes/type.js +5 -0
  40. package/dist/oas/nodes/type.js.map +1 -1
  41. package/dist/oas/nodes/union.js +2 -1
  42. package/dist/oas/nodes/union.js.map +1 -1
  43. package/dist/oas/oasGen.d.ts +2 -0
  44. package/dist/oas/oasGen.js +25 -12
  45. package/dist/oas/oasGen.js.map +1 -1
  46. package/dist/oas/schemas/index.d.ts +3 -0
  47. package/dist/oas/schemas/index.js +21 -0
  48. package/dist/oas/schemas/index.js.map +1 -0
  49. package/dist/tests/runners.d.ts +8 -0
  50. package/dist/tests/runners.js +125 -0
  51. package/dist/tests/runners.js.map +1 -0
  52. package/dist/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +2 -1
  54. 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,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,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,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 } 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';\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 // 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"]}
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"]}
@@ -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, pending: Map<string, IType>, selection: string[]): void;
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 buildRequestMethodAndArgs;
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
  }
@@ -41,34 +41,34 @@ export class Writer {
41
41
  flush() {
42
42
  return this.buffer.join('');
43
43
  }
44
- writeSchema(writer, pending, selection) {
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
- pending.forEach((type) => {
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
- // 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);
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 pending = new Map();
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 (!pending.has(parentType.id)) {
110
- pending.set(parentType.id, parentType);
108
+ if (!pendingTypes.has(parentType.id)) {
109
+ pendingTypes.set(parentType.id, parentType);
111
110
  }
112
111
  parentType
113
112
  .ancestors()
114
- .filter((t) => !pending.has(t.id) && this.isContainer(t))
113
+ .filter((t) => !pendingTypes.has(t.id) && this.isContainer(t))
115
114
  .forEach((dep) => {
116
115
  // TODO: potential merge needed?
117
- pending.set(dep.id, dep);
116
+ pendingTypes.set(dep.id, dep);
118
117
  });
119
118
  }
120
119
  }
121
- if (!_.isEmpty(pending)) {
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(pending.values())
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) => pending.delete(id));
152
+ comp.consolidate(selection).forEach((id) => pendingTypes.delete(id));
128
153
  }
129
- this.writeSchema(this, pending, selection);
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 get = type; // assume type is GetOp
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
- .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);
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
- 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) => {
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
- builder += '?' + params.map((p) => `${p.name}={$args.${Naming.genParamName(p.name)}}`).join('&');
219
+ writer.append('?' + params.map((p) => `${p.name}={$args.${Naming.genParamName(p.name)}}`).join('&'));
197
220
  }
198
- const headers = get.operation.getParameters().filter((p) => p.in && p.in.toLowerCase() === 'header');
199
- builder += '"\n';
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
- builder += spacing + 'headers: [\n';
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
- builder += spacing + `{ name: "${p.name}", value: "${value}" }\n`;
238
+ writer.append(spacing + `{ name: "${p.name}", value: "${value}" }\n`);
216
239
  }
217
240
  spacing = ' '.repeat(6);
218
- builder += spacing + ']';
241
+ writer.append(spacing + ']');
219
242
  }
220
243
  }
221
244
  else {
222
- builder += '"';
245
+ writer.append('"');
246
+ }
247
+ if (_.has(op, 'body')) {
248
+ const body = op.body;
249
+ this.writeBodySelection(context, writer, body, selection);
223
250
  }
224
- return `{ GET: ${builder} }`;
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"]}
@@ -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})`);