apollo-conn-gen 0.3.3 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/cli/json.js +0 -16
  2. package/dist/cli/json.js.map +1 -1
  3. package/dist/cli/oas-helpers/index.js +0 -13
  4. package/dist/cli/oas-helpers/index.js.map +1 -1
  5. package/dist/index.js +0 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/json/io/writer.js +3 -3
  8. package/dist/json/io/writer.js.map +1 -1
  9. package/dist/json/walker/jsonContext.d.ts +4 -0
  10. package/dist/json/walker/jsonContext.js +10 -0
  11. package/dist/json/walker/jsonContext.js.map +1 -1
  12. package/dist/json/walker/jsonGen.js +1 -31
  13. package/dist/json/walker/jsonGen.js.map +1 -1
  14. package/dist/json/walker/naming.d.ts +2 -4
  15. package/dist/json/walker/naming.js +14 -9
  16. package/dist/json/walker/naming.js.map +1 -1
  17. package/dist/json/walker/types/jsonArray.js +4 -9
  18. package/dist/json/walker/types/jsonArray.js.map +1 -1
  19. package/dist/json/walker/types/jsonObj.d.ts +3 -4
  20. package/dist/json/walker/types/jsonObj.js +7 -12
  21. package/dist/json/walker/types/jsonObj.js.map +1 -1
  22. package/dist/json/walker/types/jsonScalar.d.ts +3 -4
  23. package/dist/json/walker/types/jsonScalar.js +19 -9
  24. package/dist/json/walker/types/jsonScalar.js.map +1 -1
  25. package/dist/json/walker/types/jsonType.d.ts +3 -5
  26. package/dist/json/walker/types/jsonType.js +4 -6
  27. package/dist/json/walker/types/jsonType.js.map +1 -1
  28. package/dist/oas/io/operationWriter.d.ts +14 -0
  29. package/dist/oas/io/operationWriter.js +106 -0
  30. package/dist/oas/io/operationWriter.js.map +1 -0
  31. package/dist/oas/io/pathCollector.d.ts +11 -0
  32. package/dist/oas/io/pathCollector.js +95 -0
  33. package/dist/oas/io/pathCollector.js.map +1 -0
  34. package/dist/oas/io/schemaWriter.d.ts +9 -0
  35. package/dist/oas/io/schemaWriter.js +36 -0
  36. package/dist/oas/io/schemaWriter.js.map +1 -0
  37. package/dist/oas/io/writer.d.ts +5 -17
  38. package/dist/oas/io/writer.js +24 -243
  39. package/dist/oas/io/writer.js.map +1 -1
  40. package/dist/oas/nodes/arr.js +2 -2
  41. package/dist/oas/nodes/arr.js.map +1 -1
  42. package/dist/oas/nodes/body.js +2 -2
  43. package/dist/oas/nodes/body.js.map +1 -1
  44. package/dist/oas/nodes/circularRef.js +2 -2
  45. package/dist/oas/nodes/circularRef.js.map +1 -1
  46. package/dist/oas/nodes/comp.js +4 -16
  47. package/dist/oas/nodes/comp.js.map +1 -1
  48. package/dist/oas/nodes/get.js +11 -11
  49. package/dist/oas/nodes/get.js.map +1 -1
  50. package/dist/oas/nodes/obj.js +6 -6
  51. package/dist/oas/nodes/obj.js.map +1 -1
  52. package/dist/oas/nodes/post.js +10 -14
  53. package/dist/oas/nodes/post.js.map +1 -1
  54. package/dist/oas/nodes/prop.js +6 -6
  55. package/dist/oas/nodes/prop.js.map +1 -1
  56. package/dist/oas/nodes/propArray.js +6 -6
  57. package/dist/oas/nodes/propArray.js.map +1 -1
  58. package/dist/oas/nodes/propCircRef.js +3 -3
  59. package/dist/oas/nodes/propCircRef.js.map +1 -1
  60. package/dist/oas/nodes/propComp.js +5 -5
  61. package/dist/oas/nodes/propComp.js.map +1 -1
  62. package/dist/oas/nodes/propEn.js +3 -3
  63. package/dist/oas/nodes/propEn.js.map +1 -1
  64. package/dist/oas/nodes/propObj.js +5 -5
  65. package/dist/oas/nodes/propObj.js.map +1 -1
  66. package/dist/oas/nodes/propRef.js +8 -8
  67. package/dist/oas/nodes/propRef.js.map +1 -1
  68. package/dist/oas/nodes/propScalar.js +3 -3
  69. package/dist/oas/nodes/propScalar.js.map +1 -1
  70. package/dist/oas/nodes/ref.js +1 -1
  71. package/dist/oas/nodes/ref.js.map +1 -1
  72. package/dist/oas/nodes/res.js +1 -1
  73. package/dist/oas/nodes/res.js.map +1 -1
  74. package/dist/oas/nodes/scalar.js +4 -4
  75. package/dist/oas/nodes/scalar.js.map +1 -1
  76. package/dist/oas/nodes/union.js +16 -16
  77. package/dist/oas/nodes/union.js.map +1 -1
  78. package/dist/oas/oasGen.d.ts +0 -1
  79. package/dist/oas/oasGen.js +0 -8
  80. package/dist/oas/oasGen.js.map +1 -1
  81. package/dist/oas/utils/naming.js.map +1 -1
  82. package/dist/tests/runners.js +2 -2
  83. package/dist/tests/runners.js.map +1 -1
  84. package/dist/tsconfig.tsbuildinfo +1 -1
  85. package/package.json +1 -1
package/dist/cli/json.js CHANGED
@@ -1,22 +1,6 @@
1
1
  import fs from 'fs';
2
2
  import { JsonGen } from '../json/index.js';
3
- // // mute console.log
4
- // console.log = () => {};
5
- // function walkSourceFile(source: string): void {
6
- // const fileContent = fs.readFileSync(source, 'utf-8');
7
- // const walker = JsonGen.fromReader(fileContent);
8
- // console.info(walker.generateSchema());
9
- // }
10
- // async function main() {
11
- // walkSourceFile(
12
- // '/Users/fernando/Development/Apollo/connectors/projects/JsonToConnector/src/test/resources/preferences/user/50.json',
13
- // );
14
- // }
15
- // main().then(() => console.log('done'));
16
3
  import { Command } from 'commander';
17
- // const originalConsole = {
18
- // log: console.log,
19
- // };
20
4
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- for options
21
5
  async function main(fileOrFolder, opts) {
22
6
  console.log = () => { };
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/cli/json.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { JsonGen } from '../json/index.js';\n\n// // mute console.log\n// console.log = () => {};\n\n// function walkSourceFile(source: string): void {\n// const fileContent = fs.readFileSync(source, 'utf-8');\n\n// const walker = JsonGen.fromReader(fileContent);\n// console.info(walker.generateSchema());\n// }\n\n// async function main() {\n// walkSourceFile(\n// '/Users/fernando/Development/Apollo/connectors/projects/JsonToConnector/src/test/resources/preferences/user/50.json',\n// );\n// }\n\n// main().then(() => console.log('done'));\n\nimport { Command } from 'commander';\n\n// const originalConsole = {\n// log: console.log,\n// };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- for options\nasync function main(fileOrFolder: string, opts: any): Promise<void> {\n console.log = () => {};\n\n if (!fs.existsSync(fileOrFolder)) {\n console.error(`File or folder not found: ${fileOrFolder}`);\n return;\n }\n\n // generator\n let gen: JsonGen;\n\n // if it is a file\n if (fs.lstatSync(fileOrFolder).isFile()) {\n // read contents\n const contents = fs.readFileSync(fileOrFolder, 'utf-8');\n gen = JsonGen.fromReader(contents);\n } else {\n // iterate through the files found in the target folder and load all the contents\n gen = JsonGen.new();\n fs.readdirSync(fileOrFolder).forEach((file) => {\n const contents = fs.readFileSync(fileOrFolder + '/' + file, 'utf-8');\n gen.walkJson(contents);\n });\n }\n\n let generated;\n if (opts.schemaTypes) {\n generated = gen.writeTypes();\n } else if (opts.selectionSet) {\n generated = gen.writeSelection();\n } else {\n generated = gen.generateSchema();\n }\n\n if (opts.outputFile !== 'stdout') {\n fs.writeFileSync(opts.outputFile, generated);\n } else {\n console.info(generated);\n }\n}\n\nconst program = new Command();\nprogram\n .version('0.0.1')\n .argument('<file|folder>', 'A single JSON file or a folder with a collection of JSON files')\n .option('-s --schema-types', 'Output the GraphQL schema types', false)\n .option('-e --selection-set', 'Output the Apollo Connector selection set', false)\n .option('-o --output-file <file>', 'Where to write the output', 'stdout')\n .parse(process.argv);\n\nconst source = program.args[0];\nmain(source, program.opts()).then(() => console.log('done'));\n"]}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/cli/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,6EAA6E;AAC7E,KAAK,UAAU,IAAI,CAAC,YAAoB,EAAE,IAAS;IACjD,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAEvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,YAAY;IACZ,IAAI,GAAY,CAAC;IAEjB,kBAAkB;IAClB,IAAI,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,gBAAgB;QAChB,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,iFAAiF;QACjF,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,GAAG,GAAG,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YACrE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,SAAS,CAAC;IACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;SAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,SAAS,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACjC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,eAAe,EAAE,gEAAgE,CAAC;KAC3F,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,EAAE,KAAK,CAAC;KACrE,MAAM,CAAC,oBAAoB,EAAE,2CAA2C,EAAE,KAAK,CAAC;KAChF,MAAM,CAAC,yBAAyB,EAAE,2BAA2B,EAAE,QAAQ,CAAC;KACxE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/B,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import fs from 'fs';\nimport { JsonGen } from '../json/index.js';\n\nimport { Command } from 'commander';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- for options\nasync function main(fileOrFolder: string, opts: any): Promise<void> {\n console.log = () => {};\n\n if (!fs.existsSync(fileOrFolder)) {\n console.error(`File or folder not found: ${fileOrFolder}`);\n return;\n }\n\n // generator\n let gen: JsonGen;\n\n // if it is a file\n if (fs.lstatSync(fileOrFolder).isFile()) {\n // read contents\n const contents = fs.readFileSync(fileOrFolder, 'utf-8');\n gen = JsonGen.fromReader(contents);\n } else {\n // iterate through the files found in the target folder and load all the contents\n gen = JsonGen.new();\n fs.readdirSync(fileOrFolder).forEach((file) => {\n const contents = fs.readFileSync(fileOrFolder + '/' + file, 'utf-8');\n gen.walkJson(contents);\n });\n }\n\n let generated;\n if (opts.schemaTypes) {\n generated = gen.writeTypes();\n } else if (opts.selectionSet) {\n generated = gen.writeSelection();\n } else {\n generated = gen.generateSchema();\n }\n\n if (opts.outputFile !== 'stdout') {\n fs.writeFileSync(opts.outputFile, generated);\n } else {\n console.info(generated);\n }\n}\n\nconst program = new Command();\nprogram\n .version('0.0.1')\n .argument('<file|folder>', 'A single JSON file or a folder with a collection of JSON files')\n .option('-s --schema-types', 'Output the GraphQL schema types', false)\n .option('-e --selection-set', 'Output the Apollo Connector selection set', false)\n .option('-o --output-file <file>', 'Where to write the output', 'stdout')\n .parse(process.argv);\n\nconst source = program.args[0];\nmain(source, program.opts()).then(() => console.log('done'));\n"]}
@@ -26,16 +26,6 @@ export async function promptForSelection(gen, opts, types) {
26
26
  result = Array.from(type.props.values());
27
27
  }
28
28
  else {
29
- /*
30
- // TODO: re-think this
31
- else if (type instanceof Post) {
32
- if (!type.visited) type.visit(gen.context!)
33
- result = gen.expand(type);
34
-
35
- // we need to exclude the body from the selection - not sure we need to generalise this..
36
- result = _.filter(result, (r) => r !== type.body);
37
- console.log(result)
38
- }*/
39
29
  // top level paths
40
30
  result = gen.expand(type);
41
31
  if (result.length === 1) {
@@ -44,9 +34,6 @@ export async function promptForSelection(gen, opts, types) {
44
34
  if (!child.visited) {
45
35
  child.visit(gen.context);
46
36
  }
47
- /*if (child instanceof Ref) {
48
- result = [child.refType!];
49
- }*/
50
37
  }
51
38
  }
52
39
  return result;
@@ -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;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,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,EAAE,CAAC;YAC7B,oCAAoC;YACnC,IAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACnC,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;;mBAEG;YACL,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 { Type, IType, Composed } from '../../oas/nodes/internal.js';\nimport { OasGen } from '../../oas/oasGen.js';\nimport { typesPrompt } from '../../oas/prompts/prompt.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) {\n // make sure we gather all the props\n (type as Composed).consolidate([]);\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"]}
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;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,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,EAAE,CAAC;YAC7B,oCAAoC;YACnC,IAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACnC,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;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 { Type, IType, Composed } from '../../oas/nodes/internal.js';\nimport { OasGen } from '../../oas/oasGen.js';\nimport { typesPrompt } from '../../oas/prompts/prompt.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) {\n // make sure we gather all the props\n (type as Composed).consolidate([]);\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 }\n\n return result;\n }\n\n return typesPrompt({\n context: gen.context!,\n expandFn: expandType,\n message: 'Navigate spec and select the fields to use in the connector',\n pageSize: parseInt(opts.pageSize, 10),\n types: types,\n });\n}\n"]}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- // export * from './oas';
2
1
  export { JsonGen } from './json/index.js';
3
2
  export { OasGen } from './oas/oasGen.js';
4
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["// export * from './oas';\nexport { JsonGen } from './json/index.js';\nexport { OasGen } from './oas/oasGen.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export { JsonGen } from './json/index.js';\nexport { OasGen } from './oas/oasGen.js';\n"]}
@@ -37,9 +37,9 @@ export class ConnectorWriter {
37
37
  selection: """` +
38
38
  '\n');
39
39
  writer.write(walker.writeSelection());
40
- writer.write(`"""
41
- )}
42
- `);
40
+ const ctx = walker.getContext();
41
+ writer.write(ctx.getIndent() + '"""\n');
42
+ writer.write(ctx.getIndentWith(2) + ')}');
43
43
  }
44
44
  }
45
45
  //# sourceMappingURL=writer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/json/io/writer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IACvB,OAAO,GAAa,EAAE,CAAC;IAEvB,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IACnB,MAAM,CAAC,KAAK,CAAC,MAAe,EAAE,MAAe;QAClD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,MAAe;QAC3C,MAAM,CAAC,KAAK,CAAC;;;;;;;;CAQhB,CAAC,CAAC;IACD,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,MAAe,EAAE,MAAe;QACxD,MAAM,CAAC,KAAK,CACV,IAAI;YACF;;;;;qBAKa;YACb,IAAI,CACP,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC;;CAEhB,CAAC,CAAC;IACD,CAAC;CACF","sourcesContent":["import { JsonGen } from '../walker/jsonGen.js';\n\nexport interface IWriter {\n write(text: string): void;\n}\n\nexport class StringWriter implements IWriter {\n builder: string[] = [];\n\n write(text: string): void {\n this.builder.push(text);\n }\n\n flush(): string {\n return this.builder.join('');\n }\n\n clear(): void {\n this.builder = [];\n }\n}\n\nexport class ConnectorWriter {\n public static write(walker: JsonGen, writer: IWriter): void {\n this.writeConnector(writer);\n writer.write(walker.writeTypes());\n this.writeQuery(walker, writer);\n }\n\n private static writeConnector(writer: IWriter): void {\n writer.write(`extend schema\n @link(url: \"https://specs.apollo.dev/federation/v2.10\", import: [\"@key\"])\n @link(\n url: \"https://specs.apollo.dev/connect/v0.1\"\n import: [\"@connect\", \"@source\"]\n )\n @source(name: \"api\", http: { baseURL: \"http://localhost:4010\" })\n \n`);\n }\n\n private static writeQuery(walker: JsonGen, writer: IWriter): void {\n writer.write(\n '\\n' +\n `type Query {\n root: Root\n @connect(\n source: \"api\"\n http: { GET: \"/test\" }\n selection: \"\"\"` +\n '\\n',\n );\n\n writer.write(walker.writeSelection());\n writer.write(`\"\"\"\n)}\n`);\n }\n}\n"]}
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/json/io/writer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IACvB,OAAO,GAAa,EAAE,CAAC;IAEvB,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IACnB,MAAM,CAAC,KAAK,CAAC,MAAe,EAAE,MAAe;QAClD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,MAAe;QAC3C,MAAM,CAAC,KAAK,CAAC;;;;;;;;CAQhB,CAAC,CAAC;IACD,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,MAAe,EAAE,MAAe;QACxD,MAAM,CAAC,KAAK,CACV,IAAI;YACF;;;;;qBAKa;YACb,IAAI,CACP,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF","sourcesContent":["import { JsonGen } from '../walker/jsonGen.js';\n\nexport interface IWriter {\n write(text: string): void;\n}\n\nexport class StringWriter implements IWriter {\n builder: string[] = [];\n\n write(text: string): void {\n this.builder.push(text);\n }\n\n flush(): string {\n return this.builder.join('');\n }\n\n clear(): void {\n this.builder = [];\n }\n}\n\nexport class ConnectorWriter {\n public static write(walker: JsonGen, writer: IWriter): void {\n this.writeConnector(writer);\n writer.write(walker.writeTypes());\n this.writeQuery(walker, writer);\n }\n\n private static writeConnector(writer: IWriter): void {\n writer.write(`extend schema\n @link(url: \"https://specs.apollo.dev/federation/v2.10\", import: [\"@key\"])\n @link(\n url: \"https://specs.apollo.dev/connect/v0.1\"\n import: [\"@connect\", \"@source\"]\n )\n @source(name: \"api\", http: { baseURL: \"http://localhost:4010\" })\n \n`);\n }\n\n private static writeQuery(walker: JsonGen, writer: IWriter): void {\n writer.write(\n '\\n' +\n `type Query {\n root: Root\n @connect(\n source: \"api\"\n http: { GET: \"/test\" }\n selection: \"\"\"` +\n '\\n',\n );\n\n writer.write(walker.writeSelection());\n\n const ctx = walker.getContext();\n\n writer.write(ctx.getIndent() + '\"\"\"\\n');\n writer.write(ctx.getIndentWith(2) + ')}');\n }\n}\n"]}
@@ -2,8 +2,12 @@ import { JsonType } from '../walker/types/jsonType.js';
2
2
  export declare class JsonContext {
3
3
  private stack;
4
4
  private types;
5
+ private indent;
5
6
  constructor();
6
7
  getStack(): JsonType[];
8
+ getIndent(): string;
9
+ getIndentWith(subtract: number): string;
10
+ setIndent(indent: number): void;
7
11
  enter(element: JsonType): void;
8
12
  leave(_element: JsonType): void;
9
13
  store(type: JsonType): void;
@@ -2,6 +2,7 @@ import { JsonObj } from '../walker/types/jsonObj.js';
2
2
  export class JsonContext {
3
3
  stack;
4
4
  types;
5
+ indent = 0;
5
6
  constructor() {
6
7
  this.stack = [];
7
8
  this.types = new Map();
@@ -9,6 +10,15 @@ export class JsonContext {
9
10
  getStack() {
10
11
  return this.stack;
11
12
  }
13
+ getIndent() {
14
+ return ' '.repeat(this.stack.length + this.indent);
15
+ }
16
+ getIndentWith(subtract) {
17
+ return ' '.repeat(this.stack.length - subtract + this.indent);
18
+ }
19
+ setIndent(indent) {
20
+ this.indent = indent;
21
+ }
12
22
  enter(element) {
13
23
  // trace(this, "[context]", "-> enter: (" + this.stack.length + ") " + element.getName());
14
24
  this.stack.push(element);
@@ -1 +1 @@
1
- {"version":3,"file":"jsonContext.js","sourceRoot":"","sources":["../../../src/json/walker/jsonContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGrD,MAAM,OAAO,WAAW;IACd,KAAK,CAAa;IAClB,KAAK,CAAwB;IAErC;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,KAAK,CAAC,OAAiB;QAC5B,0FAA0F;QAC1F,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,QAAkB;QAC7B,0FAA0F;QAC1F,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,IAAc;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAc;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,uCAAuC;QACvC,IAAI,MAAM,YAAY,OAAO,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YACzD,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAe,EAAE,GAAW,EAAE,EAAE;gBACxD,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;CACF","sourcesContent":["import { JsonObj } from '../walker/types/jsonObj.js';\nimport { JsonType } from '../walker/types/jsonType.js';\n\nexport class JsonContext {\n private stack: JsonType[];\n private types: Map<string, JsonType>;\n\n constructor() {\n this.stack = [];\n this.types = new Map<string, JsonType>();\n }\n\n public getStack(): JsonType[] {\n return this.stack;\n }\n\n public enter(element: JsonType): void {\n // trace(this, \"[context]\", \"-> enter: (\" + this.stack.length + \") \" + element.getName());\n this.stack.push(element);\n }\n\n public leave(_element: JsonType): void {\n // trace(this, \"[context]\", \"<- leave: (\" + this.stack.length + \") \" + element.getName());\n this.stack.pop();\n }\n\n public store(type: JsonType): void {\n if (this.types.has(type.id())) {\n this.merge(type);\n } else {\n this.types.set(type.id(), type);\n }\n }\n\n private merge(type: JsonType): void {\n const source = this.types.get(type.id());\n // Only merge if both are Obj instances\n if (source instanceof JsonObj && type instanceof JsonObj) {\n type.getFields().forEach((value: JsonType, key: string) => {\n source.getFields().set(key, value);\n });\n this.types.set(source.id(), source);\n }\n }\n\n public getTypes(): JsonType[] {\n return Array.from(this.types.values());\n }\n}\n"]}
1
+ {"version":3,"file":"jsonContext.js","sourceRoot":"","sources":["../../../src/json/walker/jsonContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGrD,MAAM,OAAO,WAAW;IACd,KAAK,CAAa;IAClB,KAAK,CAAwB;IAC7B,MAAM,GAAW,CAAC,CAAC;IAE3B;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,SAAS;QACd,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAEM,aAAa,CAAC,QAAgB;QACnC,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAEM,SAAS,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,OAAiB;QAC5B,0FAA0F;QAC1F,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,QAAkB;QAC7B,0FAA0F;QAC1F,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,IAAc;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAc;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,uCAAuC;QACvC,IAAI,MAAM,YAAY,OAAO,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YACzD,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAe,EAAE,GAAW,EAAE,EAAE;gBACxD,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;CACF","sourcesContent":["import { JsonObj } from '../walker/types/jsonObj.js';\nimport { JsonType } from '../walker/types/jsonType.js';\n\nexport class JsonContext {\n private stack: JsonType[];\n private types: Map<string, JsonType>;\n private indent: number = 0;\n\n constructor() {\n this.stack = [];\n this.types = new Map<string, JsonType>();\n }\n\n public getStack(): JsonType[] {\n return this.stack;\n }\n\n public getIndent(): string {\n return ' '.repeat(this.stack.length + this.indent);\n }\n\n public getIndentWith(subtract: number): string {\n return ' '.repeat(this.stack.length - subtract + this.indent);\n }\n\n public setIndent(indent: number): void {\n this.indent = indent;\n }\n\n public enter(element: JsonType): void {\n // trace(this, \"[context]\", \"-> enter: (\" + this.stack.length + \") \" + element.getName());\n this.stack.push(element);\n }\n\n public leave(_element: JsonType): void {\n // trace(this, \"[context]\", \"<- leave: (\" + this.stack.length + \") \" + element.getName());\n this.stack.pop();\n }\n\n public store(type: JsonType): void {\n if (this.types.has(type.id())) {\n this.merge(type);\n } else {\n this.types.set(type.id(), type);\n }\n }\n\n private merge(type: JsonType): void {\n const source = this.types.get(type.id());\n // Only merge if both are Obj instances\n if (source instanceof JsonObj && type instanceof JsonObj) {\n type.getFields().forEach((value: JsonType, key: string) => {\n source.getFields().set(key, value);\n });\n this.types.set(source.id(), source);\n }\n }\n\n public getTypes(): JsonType[] {\n return Array.from(this.types.values());\n }\n}\n"]}
@@ -12,30 +12,6 @@ export class JsonGen {
12
12
  getContext() {
13
13
  return this.context;
14
14
  }
15
- // // Walks the provided file or folder (synchronously)
16
- // public walk(fileOrFolder: string): void {
17
- // const stats = fs.statSync(fileOrFolder);
18
- // if (stats.isDirectory()) {
19
- // const sources = fs
20
- // .readdirSync(fileOrFolder)
21
- // .filter((name) => name.toLowerCase().endsWith('.json'));
22
- // for (const source of sources) {
23
- // const fullPath = path.join(fileOrFolder, source);
24
- // this.walkSourceFile(fullPath);
25
- // }
26
- // } else {
27
- // this.walkSourceFile(fileOrFolder);
28
- // }
29
- // }
30
- // Factory method from file or folder
31
- // public static fromFileOrFolder(fileOrFolder: string): Walker {
32
- // if (!fs.existsSync(fileOrFolder)) {
33
- // throw new Error('Argument does not exist');
34
- // }
35
- // const walker = new Walker();
36
- // walker.walk(fileOrFolder);
37
- // return walker;
38
- // }
39
15
  static new() {
40
16
  return new JsonGen();
41
17
  }
@@ -60,6 +36,7 @@ export class JsonGen {
60
36
  // Writes selection using a given Writer
61
37
  writeSelection() {
62
38
  const writer = new StringWriter();
39
+ this.context.setIndent(6);
63
40
  const types = this.context.getTypes();
64
41
  const root = types.find((t) => t.getParent() === null);
65
42
  if (root) {
@@ -111,13 +88,6 @@ export class JsonGen {
111
88
  }
112
89
  }
113
90
  }
114
- // // Walk a source file (given by path)
115
- // private walkSourceFile(source: string): void {
116
- // trace(this.context, '-> [walkSource]', 'in: ' + path.basename(source));
117
- // const fileContent = fs.readFileSync(source, 'utf-8');
118
- // this.walkReader(fileContent);
119
- // trace(this.context, '<- [walkSource]', 'out: ' + path.basename(source));
120
- // }
121
91
  // Walk the JSON provided as a string
122
92
  walkJson(json) {
123
93
  const rootElement = JSON.parse(json);
@@ -1 +1 @@
1
- {"version":3,"file":"jsonGen.js","sourceRoot":"","sources":["../../../src/json/walker/jsonGen.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport _ from 'lodash';\nimport { ConnectorWriter, JsonArray, JsonContext, JsonObj, JsonScalar, JsonType, StringWriter } from '../index.js';\nimport { trace, warn } from './log/trace.js';\nimport { sanitiseField } from './naming.js';\n\nexport class JsonGen {\n private readonly context: JsonContext;\n\n // Private constructor\n private constructor() {\n this.context = new JsonContext();\n }\n\n public getContext(): JsonContext {\n return this.context;\n }\n\n // // Walks the provided file or folder (synchronously)\n // public walk(fileOrFolder: string): void {\n // const stats = fs.statSync(fileOrFolder);\n // if (stats.isDirectory()) {\n // const sources = fs\n // .readdirSync(fileOrFolder)\n // .filter((name) => name.toLowerCase().endsWith('.json'));\n // for (const source of sources) {\n // const fullPath = path.join(fileOrFolder, source);\n // this.walkSourceFile(fullPath);\n // }\n // } else {\n // this.walkSourceFile(fileOrFolder);\n // }\n // }\n\n // Factory method from file or folder\n // public static fromFileOrFolder(fileOrFolder: string): Walker {\n // if (!fs.existsSync(fileOrFolder)) {\n // throw new Error('Argument does not exist');\n // }\n // const walker = new Walker();\n // walker.walk(fileOrFolder);\n // return walker;\n // }\n\n public static new(): JsonGen {\n return new JsonGen();\n }\n\n // Factory method from a JSON string\n public static fromReader(json: string): JsonGen {\n const walker = new JsonGen();\n walker.walkJson(json);\n return walker;\n }\n\n public static fromJsons(jsons: string[]): JsonGen {\n const walker = new JsonGen();\n for (const json of jsons) {\n walker.walkJson(json);\n }\n return walker;\n }\n\n public generateSchema(): string {\n const writer = new StringWriter();\n ConnectorWriter.write(this, writer);\n return writer.flush();\n }\n\n // Writes selection using a given Writer\n public writeSelection(): string {\n const writer = new StringWriter();\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n root.select(this.context, writer);\n }\n\n return writer.flush();\n }\n\n // Writes all types in order using the provided Writer\n public writeTypes(): string {\n const writer = new StringWriter();\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n const orderedSet = new Set<JsonType>();\n this.writeType(root, orderedSet);\n\n const generatedSet = new Map<string, JsonType>();\n orderedSet.forEach((t) => {\n // Assumes t is an Obj\n const obj = t as unknown as JsonObj;\n let typeName = obj.getType();\n if (generatedSet.has(typeName)) {\n // If same type, skip generation\n if (_.isEqual(obj, generatedSet.get(typeName))) {\n return;\n }\n obj.setType(JsonGen.generateNewObjType(generatedSet, t, typeName));\n typeName = obj.getType();\n }\n t.write(this.context, writer);\n generatedSet.set(typeName, t);\n });\n\n console.log('orderedSet =', Array.from(orderedSet));\n }\n\n return writer.flush();\n }\n\n // Recursive helper to order types\n private writeType(type: JsonType, orderedSet: Set<JsonType>): void {\n if (type instanceof JsonObj) {\n // Traverse children first\n for (const child of Array.from((type as JsonObj).getFields().values())) {\n this.writeType(child, orderedSet);\n }\n orderedSet.add(type);\n } else if (type instanceof JsonArray) {\n const arrayType = (type as JsonArray).getArrayType();\n if (arrayType) {\n this.writeType(arrayType, orderedSet);\n }\n }\n }\n\n // // Walk a source file (given by path)\n // private walkSourceFile(source: string): void {\n // trace(this.context, '-> [walkSource]', 'in: ' + path.basename(source));\n // const fileContent = fs.readFileSync(source, 'utf-8');\n // this.walkReader(fileContent);\n // trace(this.context, '<- [walkSource]', 'out: ' + path.basename(source));\n // }\n\n // Walk the JSON provided as a string\n public walkJson(json: string): void {\n const rootElement = JSON.parse(json);\n this.walkElement(this.context, null, 'root', rootElement);\n trace(this.context, ' [walkSource]', 'types found: ' + this.context.getTypes().length);\n }\n\n // Walk an element in the JSON tree\n private walkElement(context: JsonContext, parent: JsonType | null, name: string, element: any): JsonType {\n trace(context, '-> [walkElement]', 'in: ' + name);\n let result: JsonType;\n\n if (typeof element === 'object' && !Array.isArray(element) && element !== null) {\n // JSON object\n result = this.walkObject(context, parent, name, element);\n context.store(result);\n } else if (Array.isArray(element)) {\n result = this.walkArray(context, parent, name, element);\n } else if (typeof element === 'string' || typeof element === 'number' || typeof element === 'boolean') {\n result = this.walkPrimitive(context, parent, name, element);\n } else {\n throw new Error(\"Cannot yet handle '\" + name + \"' of type \" + typeof element);\n }\n\n trace(context, '<- [walkElement]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON object\n private walkObject(context: JsonContext, parent: JsonType | null, name: string, object: any): JsonObj {\n trace(context, '-> [walkObject]', 'in: ' + name);\n const result = new JsonObj(name, parent);\n const fieldSet = Object.keys(object);\n trace(context, ' [walkObject]', 'fieldSet: ' + fieldSet);\n\n for (const field of fieldSet) {\n trace(context, ' [walkObject]', 'field: ' + field);\n const childElement = object[field];\n const type = this.walkElement(context, result, field, childElement);\n result.add(field, type);\n }\n\n trace(context, '<- [walkObject]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON array\n private walkArray(context: JsonContext, parent: JsonType | null, name: string, array: any[]): JsonArray {\n trace(context, '-> [walkArray]', 'in: ' + name);\n const result = new JsonArray(name, parent);\n if (array.length > 0) {\n const firstElement = array[0];\n const arrayType = this.walkElement(context, parent, name, firstElement);\n result.setArrayType(arrayType);\n } else {\n warn(context, ' [walkArray]', \"Array is empty -- cannot derive type for field '\" + name + \"'\");\n }\n trace(context, '-> [walkArray]', 'in: ' + name);\n return result;\n }\n\n // Walk a primitive JSON value\n private walkPrimitive(_context: JsonContext, parent: JsonType | null, name: string, primitive: any): JsonScalar {\n let result: JsonScalar;\n if (typeof primitive === 'string') {\n result = new JsonScalar(name, parent, 'String');\n } else if (typeof primitive === 'boolean') {\n result = new JsonScalar(name, parent, 'Boolean');\n } else if (typeof primitive === 'number') {\n result = new JsonScalar(name, parent, 'Int');\n } else {\n throw new Error('Cannot yet handle primitive: ' + primitive);\n }\n return result;\n }\n\n // Utility method for naming conflict resolution\n private static generateNewObjType(generatedSet: Map<string, JsonType>, t: JsonType, typeName: string): string {\n let newName: string;\n let type: JsonType | null = t;\n do {\n const parent: JsonType | null = type.getParent();\n const parentName = parent === null ? '' : sanitiseField(parent.getName()).replace(/^\\w/, (c) => c.toUpperCase());\n const thisName = sanitiseField(typeName).replace(/^\\w/, (c) => c.toUpperCase());\n newName = parentName + thisName;\n type = parent;\n } while (type !== null && generatedSet.has(newName));\n return newName;\n }\n}\n"]}
1
+ {"version":3,"file":"jsonGen.js","sourceRoot":"","sources":["../../../src/json/walker/jsonGen.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport _ from 'lodash';\nimport { ConnectorWriter, JsonArray, JsonContext, JsonObj, JsonScalar, JsonType, StringWriter } from '../index.js';\nimport { trace, warn } from './log/trace.js';\nimport { sanitiseField } from './naming.js';\n\nexport class JsonGen {\n private readonly context: JsonContext;\n\n // Private constructor\n private constructor() {\n this.context = new JsonContext();\n }\n\n public getContext(): JsonContext {\n return this.context;\n }\n\n public static new(): JsonGen {\n return new JsonGen();\n }\n\n // Factory method from a JSON string\n public static fromReader(json: string): JsonGen {\n const walker = new JsonGen();\n walker.walkJson(json);\n return walker;\n }\n\n public static fromJsons(jsons: string[]): JsonGen {\n const walker = new JsonGen();\n for (const json of jsons) {\n walker.walkJson(json);\n }\n return walker;\n }\n\n public generateSchema(): string {\n const writer = new StringWriter();\n ConnectorWriter.write(this, writer);\n return writer.flush();\n }\n\n // Writes selection using a given Writer\n public writeSelection(): string {\n const writer = new StringWriter();\n this.context.setIndent(6);\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n root.select(this.context, writer);\n }\n\n return writer.flush();\n }\n\n // Writes all types in order using the provided Writer\n public writeTypes(): string {\n const writer = new StringWriter();\n\n const types = this.context.getTypes();\n const root = types.find((t: JsonType) => t.getParent() === null);\n if (root) {\n const orderedSet = new Set<JsonType>();\n this.writeType(root, orderedSet);\n\n const generatedSet = new Map<string, JsonType>();\n orderedSet.forEach((t) => {\n // Assumes t is an Obj\n const obj = t as unknown as JsonObj;\n let typeName = obj.getType();\n if (generatedSet.has(typeName)) {\n // If same type, skip generation\n if (_.isEqual(obj, generatedSet.get(typeName))) {\n return;\n }\n obj.setType(JsonGen.generateNewObjType(generatedSet, t, typeName));\n typeName = obj.getType();\n }\n t.write(this.context, writer);\n generatedSet.set(typeName, t);\n });\n\n console.log('orderedSet =', Array.from(orderedSet));\n }\n\n return writer.flush();\n }\n\n // Recursive helper to order types\n private writeType(type: JsonType, orderedSet: Set<JsonType>): void {\n if (type instanceof JsonObj) {\n // Traverse children first\n for (const child of Array.from((type as JsonObj).getFields().values())) {\n this.writeType(child, orderedSet);\n }\n orderedSet.add(type);\n } else if (type instanceof JsonArray) {\n const arrayType = (type as JsonArray).getArrayType();\n if (arrayType) {\n this.writeType(arrayType, orderedSet);\n }\n }\n }\n\n // Walk the JSON provided as a string\n public walkJson(json: string): void {\n const rootElement = JSON.parse(json);\n this.walkElement(this.context, null, 'root', rootElement);\n trace(this.context, ' [walkSource]', 'types found: ' + this.context.getTypes().length);\n }\n\n // Walk an element in the JSON tree\n private walkElement(context: JsonContext, parent: JsonType | null, name: string, element: any): JsonType {\n trace(context, '-> [walkElement]', 'in: ' + name);\n let result: JsonType;\n\n if (typeof element === 'object' && !Array.isArray(element) && element !== null) {\n // JSON object\n result = this.walkObject(context, parent, name, element);\n context.store(result);\n } else if (Array.isArray(element)) {\n result = this.walkArray(context, parent, name, element);\n } else if (typeof element === 'string' || typeof element === 'number' || typeof element === 'boolean') {\n result = this.walkPrimitive(context, parent, name, element);\n } else {\n throw new Error(\"Cannot yet handle '\" + name + \"' of type \" + typeof element);\n }\n\n trace(context, '<- [walkElement]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON object\n private walkObject(context: JsonContext, parent: JsonType | null, name: string, object: any): JsonObj {\n trace(context, '-> [walkObject]', 'in: ' + name);\n const result = new JsonObj(name, parent);\n const fieldSet = Object.keys(object);\n trace(context, ' [walkObject]', 'fieldSet: ' + fieldSet);\n\n for (const field of fieldSet) {\n trace(context, ' [walkObject]', 'field: ' + field);\n const childElement = object[field];\n const type = this.walkElement(context, result, field, childElement);\n result.add(field, type);\n }\n\n trace(context, '<- [walkObject]', 'out: ' + name);\n return result;\n }\n\n // Walk a JSON array\n private walkArray(context: JsonContext, parent: JsonType | null, name: string, array: any[]): JsonArray {\n trace(context, '-> [walkArray]', 'in: ' + name);\n const result = new JsonArray(name, parent);\n if (array.length > 0) {\n const firstElement = array[0];\n const arrayType = this.walkElement(context, parent, name, firstElement);\n result.setArrayType(arrayType);\n } else {\n warn(context, ' [walkArray]', \"Array is empty -- cannot derive type for field '\" + name + \"'\");\n }\n trace(context, '-> [walkArray]', 'in: ' + name);\n return result;\n }\n\n // Walk a primitive JSON value\n private walkPrimitive(_context: JsonContext, parent: JsonType | null, name: string, primitive: any): JsonScalar {\n let result: JsonScalar;\n if (typeof primitive === 'string') {\n result = new JsonScalar(name, parent, 'String');\n } else if (typeof primitive === 'boolean') {\n result = new JsonScalar(name, parent, 'Boolean');\n } else if (typeof primitive === 'number') {\n result = new JsonScalar(name, parent, 'Int');\n } else {\n throw new Error('Cannot yet handle primitive: ' + primitive);\n }\n return result;\n }\n\n // Utility method for naming conflict resolution\n private static generateNewObjType(generatedSet: Map<string, JsonType>, t: JsonType, typeName: string): string {\n let newName: string;\n let type: JsonType | null = t;\n do {\n const parent: JsonType | null = type.getParent();\n const parentName = parent === null ? '' : sanitiseField(parent.getName()).replace(/^\\w/, (c) => c.toUpperCase());\n const thisName = sanitiseField(typeName).replace(/^\\w/, (c) => c.toUpperCase());\n newName = parentName + thisName;\n type = parent;\n } while (type !== null && generatedSet.has(newName));\n return newName;\n }\n}\n"]}
@@ -1,8 +1,6 @@
1
- /**
2
- * Utility functions for name manipulation.
3
- */
4
1
  export declare function genParamName(param: string): string;
5
2
  export declare function sanitiseField(name: string): string;
6
3
  export declare function sanitiseFieldForSelect(name: string): string;
7
- export declare function capitalize(s: string): string;
4
+ export declare function upperFirst(s: string): string;
8
5
  export declare function genArrayItems(name: string): string;
6
+ export declare function isProtected(name: string): boolean;
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * Utility functions for name manipulation.
3
3
  */
4
+ import _ from 'lodash';
5
+ const PROTECTED_NAMES = ['$'];
4
6
  function capitaliseParts(cleanedPath, splitChar) {
5
7
  // Split the string using a regular expression based on splitChar.
6
8
  const parts = cleanedPath.split(new RegExp(splitChar));
@@ -8,18 +10,18 @@ function capitaliseParts(cleanedPath, splitChar) {
8
10
  for (const part of parts) {
9
11
  if (part) {
10
12
  // Capitalize the first letter of each part
11
- formattedPath += part.charAt(0).toUpperCase() + part.slice(1);
13
+ formattedPath += upperFirst(part);
12
14
  }
13
15
  }
14
16
  return formattedPath;
15
17
  }
16
- function uncapitalize(s) {
18
+ function lowerFirst(s) {
17
19
  if (!s)
18
20
  return s;
19
- return s.charAt(0).toLowerCase() + s.slice(1);
21
+ return _.lowerFirst(s);
20
22
  }
21
23
  export function genParamName(param) {
22
- return uncapitalize(capitaliseParts(param, '[\\-_\\.]'));
24
+ return lowerFirst(capitaliseParts(param, '[\\-_\\.:]'));
23
25
  }
24
26
  // Private helper; not exported.
25
27
  function formatPath(path, parameters) {
@@ -40,11 +42,11 @@ export function sanitiseField(name) {
40
42
  export function sanitiseFieldForSelect(name) {
41
43
  const fieldName = name.startsWith('@') ? name.substring(1) : name;
42
44
  const sanitised = genParamName(fieldName);
43
- if (sanitised === name) {
45
+ if (sanitised === name && !isProtected(name)) {
44
46
  return sanitised;
45
47
  }
46
48
  else {
47
- const needsQuotes = /.*[:_\-.].*/.test(fieldName) || name.startsWith('@');
49
+ const needsQuotes = /.*[:_\-.].*/.test(fieldName) || name.startsWith('@') || isProtected(name);
48
50
  let builder = sanitised + ': ';
49
51
  if (needsQuotes) {
50
52
  builder += '"' + (name.startsWith('@') ? name : fieldName) + '"';
@@ -55,12 +57,15 @@ export function sanitiseFieldForSelect(name) {
55
57
  return builder;
56
58
  }
57
59
  }
58
- export function capitalize(s) {
60
+ export function upperFirst(s) {
59
61
  if (!s)
60
62
  return s;
61
- return s.charAt(0).toUpperCase() + s.slice(1);
63
+ return _.upperFirst(s);
62
64
  }
63
65
  export function genArrayItems(name) {
64
- return capitalize(genParamName(name)) + 'Item';
66
+ return upperFirst(genParamName(name)) + 'Item';
67
+ }
68
+ export function isProtected(name) {
69
+ return PROTECTED_NAMES.includes(name);
65
70
  }
66
71
  //# sourceMappingURL=naming.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../src/json/walker/naming.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Utility functions for name manipulation.\n */\n\nfunction capitaliseParts(cleanedPath: string, splitChar: string): string {\n // Split the string using a regular expression based on splitChar.\n const parts = cleanedPath.split(new RegExp(splitChar));\n let formattedPath = '';\n for (const part of parts) {\n if (part) {\n // Capitalize the first letter of each part\n formattedPath += part.charAt(0).toUpperCase() + part.slice(1);\n }\n }\n return formattedPath;\n}\n\nfunction uncapitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toLowerCase() + s.slice(1);\n}\n\nexport function genParamName(param: string): string {\n return uncapitalize(capitaliseParts(param, '[\\\\-_\\\\.]'));\n}\n\n// Private helper; not exported.\nfunction formatPath(path: string, parameters: string[]): string {\n if (!path || path.length === 0) {\n return path;\n }\n // Remove parameters enclosed in `{}`.\n const cleanedPath = path.replace(/\\{[^}]*\\}/g, parameters.join(''));\n // First, capitalize parts split by \"[:\\-\\.]+\".\n const interim = capitaliseParts(cleanedPath, '[:\\\\-\\\\.]+');\n // Then, split by \"/\" and capitalize each part.\n return capitaliseParts(interim, '/');\n}\n\nexport function sanitiseField(name: string): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n return genParamName(fieldName);\n}\n\nexport function sanitiseFieldForSelect(name: string): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n const sanitised = genParamName(fieldName);\n if (sanitised === name) {\n return sanitised;\n } else {\n const needsQuotes = /.*[:_\\-.].*/.test(fieldName) || name.startsWith('@');\n let builder = sanitised + ': ';\n if (needsQuotes) {\n builder += '\"' + (name.startsWith('@') ? name : fieldName) + '\"';\n } else {\n builder += name.startsWith('@') ? name : fieldName;\n }\n return builder;\n }\n}\n\nexport function capitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function genArrayItems(name: string): string {\n return capitalize(genParamName(name)) + 'Item';\n}\n"]}
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../src/json/walker/naming.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Utility functions for name manipulation.\n */\nimport _ from 'lodash';\n\nconst PROTECTED_NAMES = ['$'];\n\nfunction capitaliseParts(cleanedPath: string, splitChar: string): string {\n // Split the string using a regular expression based on splitChar.\n const parts = cleanedPath.split(new RegExp(splitChar));\n let formattedPath = '';\n for (const part of parts) {\n if (part) {\n // Capitalize the first letter of each part\n formattedPath += upperFirst(part);\n }\n }\n return formattedPath;\n}\n\nfunction lowerFirst(s: string): string {\n if (!s) return s;\n return _.lowerFirst(s);\n}\n\nexport function genParamName(param: string): string {\n return lowerFirst(capitaliseParts(param, '[\\\\-_\\\\.:]'));\n}\n\n// Private helper; not exported.\nfunction formatPath(path: string, parameters: string[]): string {\n if (!path || path.length === 0) {\n return path;\n }\n // Remove parameters enclosed in `{}`.\n const cleanedPath = path.replace(/\\{[^}]*\\}/g, parameters.join(''));\n // First, capitalize parts split by \"[:\\-\\.]+\".\n const interim = capitaliseParts(cleanedPath, '[:\\\\-\\\\.]+');\n // Then, split by \"/\" and capitalize each part.\n return capitaliseParts(interim, '/');\n}\n\nexport function sanitiseField(name: string): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n return genParamName(fieldName);\n}\n\nexport function sanitiseFieldForSelect(name: string): string {\n const fieldName = name.startsWith('@') ? name.substring(1) : name;\n const sanitised = genParamName(fieldName);\n if (sanitised === name && !isProtected(name)) {\n return sanitised;\n } else {\n const needsQuotes = /.*[:_\\-.].*/.test(fieldName) || name.startsWith('@') || isProtected(name);\n let builder = sanitised + ': ';\n if (needsQuotes) {\n builder += '\"' + (name.startsWith('@') ? name : fieldName) + '\"';\n } else {\n builder += name.startsWith('@') ? name : fieldName;\n }\n return builder;\n }\n}\n\nexport function upperFirst(s: string): string {\n if (!s) return s;\n return _.upperFirst(s);\n}\n\nexport function genArrayItems(name: string): string {\n return upperFirst(genParamName(name)) + 'Item';\n}\n\nexport function isProtected(name: string): boolean {\n return PROTECTED_NAMES.includes(name);\n}\n"]}
@@ -2,12 +2,7 @@ import { trace } from '../log/trace.js';
2
2
  import { JsonType } from './jsonType.js';
3
3
  import { JsonScalar } from './jsonScalar.js';
4
4
  import { JsonObj } from './jsonObj.js';
5
- import { sanitiseField, sanitiseFieldForSelect } from '../naming.js';
6
- function capitalize(s) {
7
- if (!s)
8
- return s;
9
- return s.charAt(0).toUpperCase() + s.slice(1);
10
- }
5
+ import { sanitiseField, sanitiseFieldForSelect, upperFirst } from '../naming.js';
11
6
  export class JsonArray extends JsonType {
12
7
  arrayType = null;
13
8
  constructor(name, parent) {
@@ -27,7 +22,7 @@ export class JsonArray extends JsonType {
27
22
  writer.write('### NO TYPE FOUND -- FIX MANUALLY! field: ' + field + ': [String]\n');
28
23
  return;
29
24
  }
30
- writer.write(this.indent(context));
25
+ writer.write(context.getIndent());
31
26
  writer.write(field);
32
27
  writer.write(': [');
33
28
  if (itemsType instanceof JsonScalar) {
@@ -37,7 +32,7 @@ export class JsonArray extends JsonType {
37
32
  writer.write(itemsType.getType());
38
33
  }
39
34
  else {
40
- writer.write(capitalize(itemsType.getName()));
35
+ writer.write(upperFirst(itemsType.getName()));
41
36
  }
42
37
  writer.write(']');
43
38
  if (this.getName() !== field) {
@@ -54,7 +49,7 @@ export class JsonArray extends JsonType {
54
49
  }
55
50
  else {
56
51
  const fieldName = sanitiseFieldForSelect(this.getName());
57
- writer.write(this.indent(context));
52
+ writer.write(context.getIndent());
58
53
  writer.write(fieldName);
59
54
  writer.write('\n');
60
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsonArray.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonArray.ts"],"names":[],"mappings":"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","sourcesContent":["import { trace } from '../log/trace.js';\nimport { JsonType } from './jsonType.js';\nimport { JsonScalar } from './jsonScalar.js';\nimport { JsonObj } from './jsonObj.js';\nimport { JsonContext } from '../jsonContext.js';\nimport { sanitiseField, sanitiseFieldForSelect } from '../naming.js';\nimport { IWriter } from '../../io/writer.js';\n\nfunction capitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport class JsonArray extends JsonType {\n private arrayType: JsonType | null = null;\n\n constructor(name: string, parent: JsonType | null) {\n super(name, parent);\n }\n\n public setArrayType(type: JsonType): void {\n this.arrayType = type;\n }\n\n public getArrayType(): JsonType | null {\n return this.arrayType;\n }\n\n public write(context: JsonContext, writer: IWriter): void {\n trace(context, '[array:write]', '-> in: ' + this.getName());\n const field = sanitiseField(this.getName());\n const itemsType = this.getArrayType();\n\n if (itemsType === null) {\n writer.write('### NO TYPE FOUND -- FIX MANUALLY! field: ' + field + ': [String]\\n');\n return;\n }\n\n writer.write(this.indent(context));\n writer.write(field);\n writer.write(': [');\n\n if (itemsType instanceof JsonScalar) {\n writer.write(itemsType.getType());\n } else if (itemsType instanceof JsonObj) {\n writer.write(itemsType.getType());\n } else {\n writer.write(capitalize(itemsType.getName()));\n }\n\n writer.write(']');\n\n if (this.getName() !== field) {\n writer.write(' # ' + this.getName());\n }\n\n writer.write('\\n');\n trace(context, '[array:write]', '<- out: ' + this.getName());\n }\n\n public select(context: JsonContext, writer: IWriter): void {\n trace(context, '[array:select]', '-> in: ' + this.getName());\n const itemsType = this.getArrayType();\n\n if (itemsType instanceof JsonObj) {\n itemsType.select(context, writer);\n } else {\n const fieldName = sanitiseFieldForSelect(this.getName());\n writer.write(this.indent(context));\n writer.write(fieldName);\n writer.write('\\n');\n }\n\n trace(context, '[array:select]', '<- out: ' + this.getName());\n }\n\n public toString(): string {\n return this.id() + '[' + (this.getArrayType() ? this.getArrayType()!.getName() : 'undefined') + ']';\n }\n\n public id(): string {\n return 'array:#' + super.id();\n }\n\n // public equals(o: any): boolean {\n // if (this === o) return true;\n // if (!(o instanceof ArrayType)) return false;\n // const other = o as ArrayType;\n // if (this.arrayType === null && other.arrayType === null) return true;\n // if (this.arrayType === null || other.arrayType === null) return false;\n // return this.arrayType.equals(other.arrayType);\n // }\n\n // public hashCode(): number {\n // let hash = super.hashCode();\n // if (this.arrayType !== null) {\n // hash = (Math.imul(31, hash) + this.arrayType.hashCode()) | 0;\n // }\n // return hash;\n // }\n}\n"]}
1
+ {"version":3,"file":"jsonArray.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonArray.ts"],"names":[],"mappings":"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","sourcesContent":["import { trace } from '../log/trace.js';\nimport { JsonType } from './jsonType.js';\nimport { JsonScalar } from './jsonScalar.js';\nimport { JsonObj } from './jsonObj.js';\nimport { JsonContext } from '../jsonContext.js';\nimport { sanitiseField, sanitiseFieldForSelect, upperFirst } from '../naming.js';\nimport { IWriter } from '../../io/writer.js';\nimport _ from 'lodash';\n\nexport class JsonArray extends JsonType {\n private arrayType: JsonType | null = null;\n\n constructor(name: string, parent: JsonType | null) {\n super(name, parent);\n }\n\n public setArrayType(type: JsonType): void {\n this.arrayType = type;\n }\n\n public getArrayType(): JsonType | null {\n return this.arrayType;\n }\n\n public write(context: JsonContext, writer: IWriter): void {\n trace(context, '[array:write]', '-> in: ' + this.getName());\n const field = sanitiseField(this.getName());\n const itemsType = this.getArrayType();\n\n if (itemsType === null) {\n writer.write('### NO TYPE FOUND -- FIX MANUALLY! field: ' + field + ': [String]\\n');\n return;\n }\n\n writer.write(context.getIndent());\n writer.write(field);\n writer.write(': [');\n\n if (itemsType instanceof JsonScalar) {\n writer.write(itemsType.getType());\n } else if (itemsType instanceof JsonObj) {\n writer.write(itemsType.getType());\n } else {\n writer.write(upperFirst(itemsType.getName()));\n }\n\n writer.write(']');\n\n if (this.getName() !== field) {\n writer.write(' # ' + this.getName());\n }\n\n writer.write('\\n');\n trace(context, '[array:write]', '<- out: ' + this.getName());\n }\n\n public select(context: JsonContext, writer: IWriter): void {\n trace(context, '[array:select]', '-> in: ' + this.getName());\n const itemsType = this.getArrayType();\n\n if (itemsType instanceof JsonObj) {\n itemsType.select(context, writer);\n } else {\n const fieldName = sanitiseFieldForSelect(this.getName());\n writer.write(context.getIndent());\n writer.write(fieldName);\n writer.write('\\n');\n }\n\n trace(context, '[array:select]', '<- out: ' + this.getName());\n }\n\n public toString(): string {\n return this.id() + '[' + (this.getArrayType() ? this.getArrayType()!.getName() : 'undefined') + ']';\n }\n\n public id(): string {\n return 'array:#' + super.id();\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
- import { JsonContext } from '../jsonContext.js';
2
- import { JsonType } from './jsonType.js';
1
+ import { JsonType, Context } from './jsonType.js';
3
2
  import { IWriter } from '../../io/index.js';
4
3
  export declare class JsonObj extends JsonType {
5
4
  private type;
@@ -10,8 +9,8 @@ export declare class JsonObj extends JsonType {
10
9
  getFields(): Map<string, JsonType>;
11
10
  getType(): string;
12
11
  setType(type: string): void;
13
- write(context: JsonContext, writer: IWriter): void;
14
- select(context: JsonContext, writer: IWriter): void;
12
+ write(context: Context, writer: IWriter): void;
13
+ select(context: Context, writer: IWriter): void;
15
14
  toString(): string;
16
15
  id(): string;
17
16
  }
@@ -1,11 +1,6 @@
1
1
  import { trace } from '../log/trace.js';
2
- import { sanitiseField, sanitiseFieldForSelect } from '../naming.js';
2
+ import { sanitiseField, sanitiseFieldForSelect, upperFirst } from '../naming.js';
3
3
  import { JsonType } from './jsonType.js';
4
- function capitalize(s) {
5
- if (!s)
6
- return s;
7
- return s.charAt(0).toUpperCase() + s.slice(1);
8
- }
9
4
  export class JsonObj extends JsonType {
10
5
  type;
11
6
  fields;
@@ -15,8 +10,8 @@ export class JsonObj extends JsonType {
15
10
  this.fields = new Map();
16
11
  }
17
12
  static generateType(parent, name) {
18
- const parentName = parent === null ? '' : capitalize(sanitiseField(parent.getName()));
19
- return parentName + capitalize(sanitiseField(name));
13
+ const parentName = parent === null ? '' : upperFirst(sanitiseField(parent.getName()));
14
+ return parentName + upperFirst(sanitiseField(name));
20
15
  }
21
16
  add(field, type) {
22
17
  this.fields.set(field, type);
@@ -39,13 +34,13 @@ export class JsonObj extends JsonType {
39
34
  for (const field of this.fields.values()) {
40
35
  if (field instanceof JsonObj) {
41
36
  const name = sanitiseField(field.getName());
42
- writer.write(this.indent(context) + name + ': ' + field.getType() + '\n');
37
+ writer.write(context.getIndent() + name + ': ' + field.getType() + '\n');
43
38
  }
44
39
  else {
45
40
  field.write(context, writer);
46
41
  }
47
42
  }
48
- writer.write('}\n');
43
+ writer.write(context.getIndentWith(1) + '}\n\n');
49
44
  context.leave(this);
50
45
  trace(context, '[obj:write]', '<- out: ' + this.getType());
51
46
  }
@@ -55,13 +50,13 @@ export class JsonObj extends JsonType {
55
50
  trace(context, '[obj:select]', '-> in: ' + this.getName());
56
51
  context.enter(this);
57
52
  if (this.getParent() !== null) {
58
- writer.write(this.indentWithSubstract(context, 1) + sanitiseFieldForSelect(this.getName()) + ' {\n');
53
+ writer.write(context.getIndentWith(1) + sanitiseFieldForSelect(this.getName()) + ' {\n');
59
54
  }
60
55
  for (const field of this.fields.values()) {
61
56
  field.select(context, writer);
62
57
  }
63
58
  if (this.getParent() !== null) {
64
- writer.write(this.indentWithSubstract(context, 1) + '}\n');
59
+ writer.write(context.getIndentWith(1) + '}\n');
65
60
  }
66
61
  context.leave(this);
67
62
  trace(context, '[obj:select]', '<- out: ' + this.getName());
@@ -1 +1 @@
1
- {"version":3,"file":"jsonObj.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonObj.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonContext } from '../jsonContext.js';\nimport { trace } from '../log/trace.js';\nimport { sanitiseField, sanitiseFieldForSelect } from '../naming.js';\nimport { JsonType } from './jsonType.js';\nimport { IWriter } from '../../io/index.js';\n\nfunction capitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport class JsonObj extends JsonType {\n private type: string;\n private fields: Map<string, JsonType>;\n\n constructor(name: string, parent: JsonType | null) {\n super(name, parent);\n this.type = JsonObj.generateType(parent, name);\n this.fields = new Map<string, JsonType>();\n }\n\n private static generateType(parent: JsonType | null, name: string): string {\n const parentName = parent === null ? '' : capitalize(sanitiseField(parent.getName()));\n return parentName + capitalize(sanitiseField(name));\n }\n\n public add(field: string, type: JsonType): void {\n this.fields.set(field, type);\n }\n\n public getFields(): Map<string, JsonType> {\n return this.fields;\n }\n\n public getType(): string {\n return this.type;\n }\n\n public setType(type: string): void {\n this.type = type;\n }\n\n public write(context: JsonContext, writer: IWriter): void {\n if (this.fields.size === 0) return;\n trace(context, '[obj:write]', '-> in: ' + this.getType());\n context.enter(this);\n writer.write('type ' + this.getType() + ' {\\n');\n\n for (const field of this.fields.values()) {\n if (field instanceof JsonObj) {\n const name = sanitiseField(field.getName());\n writer.write(this.indent(context) + name + ': ' + field.getType() + '\\n');\n } else {\n field.write(context, writer);\n }\n }\n\n writer.write('}\\n');\n context.leave(this);\n trace(context, '[obj:write]', '<- out: ' + this.getType());\n }\n\n public select(context: JsonContext, writer: IWriter): void {\n if (this.fields.size === 0) return;\n trace(context, '[obj:select]', '-> in: ' + this.getName());\n context.enter(this);\n\n if (this.getParent() !== null) {\n writer.write(this.indentWithSubstract(context, 1) + sanitiseFieldForSelect(this.getName()) + ' {\\n');\n }\n\n for (const field of this.fields.values()) {\n field.select(context, writer);\n }\n\n if (this.getParent() !== null) {\n writer.write(this.indentWithSubstract(context, 1) + '}\\n');\n }\n\n context.leave(this);\n trace(context, '[obj:select]', '<- out: ' + this.getName());\n }\n\n public toString(): string {\n return 'obj:' + this.getName() + ':{' + Array.from(this.fields.keys()).join(',') + '}';\n }\n\n public id(): string {\n return 'obj:#' + super.id();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // public equals(o: any): boolean {\n // if (this === o) return true;\n // if (!(o instanceof Obj)) return false;\n // const other = o as Obj;\n // if (this.fields.size !== other.fields.size) return false;\n // for (const [key, value] of this.fields.entries()) {\n // const otherValue = other.fields.get(key);\n // if (!otherValue || !value.equals(otherValue)) {\n // return false;\n // }\n // }\n // return true;\n // }\n\n // public hashCode(): number {\n // let hash = 0;\n // const str = this.type;\n // for (let i = 0; i < str.length; i++) {\n // hash = (Math.imul(31, hash) + str.charCodeAt(i)) | 0;\n // }\n // for (const key of Array.from(this.fields.keys()).sort()) {\n // for (let i = 0; i < key.length; i++) {\n // hash = (Math.imul(31, hash) + key.charCodeAt(i)) | 0;\n // }\n // }\n // return hash;\n // }\n}\n"]}
1
+ {"version":3,"file":"jsonObj.js","sourceRoot":"","sources":["../../../../src/json/walker/types/jsonObj.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAW,MAAM,eAAe,CAAC;AAIlD,MAAM,OAAO,OAAQ,SAAQ,QAAQ;IAC3B,IAAI,CAAS;IACb,MAAM,CAAwB;IAEtC,YAAY,IAAY,EAAE,MAAuB;QAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,MAAuB,EAAE,IAAY;QAC/D,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtF,OAAO,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,GAAG,CAAC,KAAa,EAAE,IAAc;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,OAAO,CAAC,IAAY;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,OAAgB,EAAE,MAAe;QAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;QAEhD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IAEM,MAAM,CAAC,OAAgB,EAAE,MAAe;QAC7C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEpB,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;QAC3F,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAEM,QAAQ;QACb,OAAO,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACzF,CAAC;IAEM,EAAE;QACP,OAAO,OAAO,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;IAC9B,CAAC;CACF","sourcesContent":["import { trace } from '../log/trace.js';\nimport { sanitiseField, sanitiseFieldForSelect, upperFirst } from '../naming.js';\nimport { JsonType, Context } from './jsonType.js';\nimport { IWriter } from '../../io/index.js';\nimport _ from 'lodash';\n\nexport class JsonObj extends JsonType {\n private type: string;\n private fields: Map<string, JsonType>;\n\n constructor(name: string, parent: JsonType | null) {\n super(name, parent);\n this.type = JsonObj.generateType(parent, name);\n this.fields = new Map<string, JsonType>();\n }\n\n private static generateType(parent: JsonType | null, name: string): string {\n const parentName = parent === null ? '' : upperFirst(sanitiseField(parent.getName()));\n return parentName + upperFirst(sanitiseField(name));\n }\n\n public add(field: string, type: JsonType): void {\n this.fields.set(field, type);\n }\n\n public getFields(): Map<string, JsonType> {\n return this.fields;\n }\n\n public getType(): string {\n return this.type;\n }\n\n public setType(type: string): void {\n this.type = type;\n }\n\n public write(context: Context, writer: IWriter): void {\n if (this.fields.size === 0) return;\n trace(context, '[obj:write]', '-> in: ' + this.getType());\n context.enter(this);\n writer.write('type ' + this.getType() + ' {\\n');\n\n for (const field of this.fields.values()) {\n if (field instanceof JsonObj) {\n const name = sanitiseField(field.getName());\n writer.write(context.getIndent() + name + ': ' + field.getType() + '\\n');\n } else {\n field.write(context, writer);\n }\n }\n\n writer.write(context.getIndentWith(1) + '}\\n\\n');\n context.leave(this);\n trace(context, '[obj:write]', '<- out: ' + this.getType());\n }\n\n public select(context: Context, writer: IWriter): void {\n if (this.fields.size === 0) return;\n trace(context, '[obj:select]', '-> in: ' + this.getName());\n context.enter(this);\n\n if (this.getParent() !== null) {\n writer.write(context.getIndentWith(1) + sanitiseFieldForSelect(this.getName()) + ' {\\n');\n }\n\n for (const field of this.fields.values()) {\n field.select(context, writer);\n }\n\n if (this.getParent() !== null) {\n writer.write(context.getIndentWith(1) + '}\\n');\n }\n\n context.leave(this);\n trace(context, '[obj:select]', '<- out: ' + this.getName());\n }\n\n public toString(): string {\n return 'obj:' + this.getName() + ':{' + Array.from(this.fields.keys()).join(',') + '}';\n }\n\n public id(): string {\n return 'obj:#' + super.id();\n }\n}\n"]}