apollo-conn-gen 0.12.0 → 0.14.0

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 (48) hide show
  1. package/dist/cli/json.js +0 -1
  2. package/dist/cli/json.js.map +1 -1
  3. package/dist/cli/oas-helpers/index.d.ts +2 -1
  4. package/dist/cli/oas-helpers/index.js +0 -1
  5. package/dist/cli/oas-helpers/index.js.map +1 -1
  6. package/dist/cli/oas.js +15 -8
  7. package/dist/cli/oas.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/json/walker/jsonGen.js +3 -2
  11. package/dist/json/walker/jsonGen.js.map +1 -1
  12. package/dist/oas/io/errorsWriter.js +17 -8
  13. package/dist/oas/io/errorsWriter.js.map +1 -1
  14. package/dist/oas/io/operationWriter.d.ts +5 -3
  15. package/dist/oas/io/operationWriter.js +92 -54
  16. package/dist/oas/io/operationWriter.js.map +1 -1
  17. package/dist/oas/io/schemaWriter.d.ts +3 -14
  18. package/dist/oas/io/schemaWriter.js +4 -115
  19. package/dist/oas/io/schemaWriter.js.map +1 -1
  20. package/dist/oas/io/security.d.ts +36 -0
  21. package/dist/oas/io/security.js +164 -0
  22. package/dist/oas/io/security.js.map +1 -0
  23. package/dist/oas/io/writer.js +25 -3
  24. package/dist/oas/io/writer.js.map +1 -1
  25. package/dist/oas/nodes/batch.d.ts +13 -0
  26. package/dist/oas/nodes/batch.js +115 -0
  27. package/dist/oas/nodes/batch.js.map +1 -0
  28. package/dist/oas/nodes/body.js +2 -2
  29. package/dist/oas/nodes/body.js.map +1 -1
  30. package/dist/oas/nodes/entity.d.ts +13 -0
  31. package/dist/oas/nodes/entity.js.map +1 -1
  32. package/dist/oas/nodes/get.js +1 -1
  33. package/dist/oas/nodes/get.js.map +1 -1
  34. package/dist/oas/nodes/obj.d.ts +1 -0
  35. package/dist/oas/nodes/obj.js +46 -1
  36. package/dist/oas/nodes/obj.js.map +1 -1
  37. package/dist/oas/oasContext.d.ts +5 -0
  38. package/dist/oas/oasContext.js.map +1 -1
  39. package/dist/oas/oasGen.d.ts +3 -2
  40. package/dist/oas/oasGen.js.map +1 -1
  41. package/dist/oas/utils/params.d.ts +4 -0
  42. package/dist/oas/utils/params.js +14 -0
  43. package/dist/oas/utils/params.js.map +1 -0
  44. package/dist/tests/runners.d.ts +2 -1
  45. package/dist/tests/runners.js +1 -0
  46. package/dist/tests/runners.js.map +1 -1
  47. package/dist/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +1 -1
package/dist/cli/json.js CHANGED
@@ -2,7 +2,6 @@ import fs from 'fs';
2
2
  import { DEFAULT_VERSIONS } from '../versions.js';
3
3
  import { JsonGen } from '../json/index.js';
4
4
  import { Command } from 'commander';
5
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- for options
6
5
  async function main(fileOrFolder, opts) {
7
6
  console.log = () => { };
8
7
  if (!fs.existsSync(fileOrFolder)) {
@@ -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 { DEFAULT_VERSIONS } from '../versions.js';\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 const jsonOptions = {\n federationVersion: opts.federationVersion,\n connectorSpecVersion: opts.connectorSpecVersion,\n rootType: opts.rootType,\n baseURL: opts.baseUrl,\n relativePath: opts.relativePath,\n queryField: opts.queryField,\n verbose: opts.verbose,\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, jsonOptions);\n } else {\n // iterate through the files found in the target folder and load all the contents\n gen = JsonGen.new(jsonOptions);\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 .option('--federation-version <version>', 'Federation version to use', DEFAULT_VERSIONS.federationVersion)\n .option('--connector-spec-version <version>', 'Connector spec version to use', DEFAULT_VERSIONS.connectorSpecVersion)\n .option('--root-type <name>', 'Root type name, use [Name] for list (default: Root)')\n .option('--base-url <url>', 'Base URL for the @source directive (default: http://localhost:4010)')\n .option('--relative-path <path>', 'Relative path for the @connect directive (default: /test)')\n .option('--query-field <name>', 'Query field name (default: derived from root type)')\n .option('-v --verbose', 'Log all messages from generator', false)\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":"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","sourcesContent":["import fs from 'fs';\nimport { DEFAULT_VERSIONS } from '../versions.js';\nimport { JsonGen } from '../json/index.js';\n\nimport { Command, OptionValues } from 'commander';\n\nasync function main(fileOrFolder: string, opts: OptionValues): 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 const jsonOptions = {\n federationVersion: opts.federationVersion,\n connectorSpecVersion: opts.connectorSpecVersion,\n rootType: opts.rootType,\n baseURL: opts.baseUrl,\n relativePath: opts.relativePath,\n queryField: opts.queryField,\n verbose: opts.verbose,\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, jsonOptions);\n } else {\n // iterate through the files found in the target folder and load all the contents\n gen = JsonGen.new(jsonOptions);\n\n fs.readdirSync(fileOrFolder).forEach((file: string) => {\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 .option('--federation-version <version>', 'Federation version to use', DEFAULT_VERSIONS.federationVersion)\n .option('--connector-spec-version <version>', 'Connector spec version to use', DEFAULT_VERSIONS.connectorSpecVersion)\n .option('--root-type <name>', 'Root type name, use [Name] for list (default: Root)')\n .option('--base-url <url>', 'Base URL for the @source directive (default: http://localhost:4010)')\n .option('--relative-path <path>', 'Relative path for the @connect directive (default: /test)')\n .option('--query-field <name>', 'Query field name (default: derived from root type)')\n .option('-v --verbose', 'Log all messages from generator', false)\n .parse(process.argv);\n\nconst source = program.args[0];\nmain(source, program.opts()).then(() => console.log('done'));\n"]}
@@ -1,4 +1,5 @@
1
1
  import { IType } from '../../oas/nodes/internal.js';
2
2
  import { OasGen } from '../../oas/oasGen.js';
3
- export declare function generateFromSelection(opts: any, gen: OasGen): void;
3
+ import { OptionValues } from 'commander';
4
+ export declare function generateFromSelection(opts: OptionValues, gen: OasGen): void;
4
5
  export declare function promptForSelection(gen: OasGen, opts: any, types: IType[]): Promise<string[] | []>;
@@ -2,7 +2,6 @@
2
2
  import fs from 'fs';
3
3
  import { Composed } from '../../oas/nodes/internal.js';
4
4
  import { typesPrompt } from '../../oas/prompts/prompt.js';
5
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
5
  export function generateFromSelection(opts, gen) {
7
6
  const selections = JSON.parse(fs.readFileSync(opts.loadSelections, { encoding: 'utf-8' }));
8
7
  if (!Array.isArray(selections)) {
@@ -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,6DAA6D,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,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(`# Generated at: ${new Date().toISOString()}`);\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"]}
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;AAG1D,MAAM,UAAU,qBAAqB,CAAC,IAAkB,EAAE,GAAW;IACnE,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,6DAA6D,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,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';\nimport { OptionValues } from 'commander';\n\nexport function generateFromSelection(opts: OptionValues, 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(`# Generated at: ${new Date().toISOString()}`);\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/cli/oas.js CHANGED
@@ -7,7 +7,6 @@ import { RulesLoader, OpNameMapper } from '../oas/mapper/index.js';
7
7
  const originalConsole = Object.assign({
8
8
  log: console.log,
9
9
  }, console);
10
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
10
  function loadRules(opts) {
12
11
  let mapper;
13
12
  if (opts.transformRules) {
@@ -20,13 +19,8 @@ function loadRules(opts) {
20
19
  return undefined;
21
20
  }
22
21
  }
23
- else if (opts.postName) {
24
- // Backward compatibility with legacy --post-name
25
- mapper = OpNameMapper.fromPattern(opts.postName);
26
- }
27
22
  return mapper;
28
23
  }
29
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
24
  function loadOverrides(opts) {
31
25
  if (!opts.overrides) {
32
26
  return undefined;
@@ -39,19 +33,31 @@ function loadOverrides(opts) {
39
33
  return undefined;
40
34
  }
41
35
  }
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- for options
36
+ function loadBatch(opts) {
37
+ if (!opts.batch) {
38
+ return undefined;
39
+ }
40
+ try {
41
+ return JSON.parse(fs.readFileSync(opts.batch, 'utf-8'));
42
+ }
43
+ catch (error) {
44
+ console.error(`Error loading batch file: ${error}`);
45
+ return undefined;
46
+ }
47
+ }
43
48
  async function main(sourceFile, opts) {
44
49
  console.log = () => { };
45
50
  const mapper = loadRules(opts);
46
51
  const overrides = loadOverrides(opts);
52
+ const batch = loadBatch(opts);
47
53
  const gen = await OasGen.fromFile(sourceFile, {
48
54
  ...opts,
49
55
  baseURL: opts.baseUrl,
50
56
  overrides,
57
+ batch,
51
58
  showParentInSelections: false,
52
59
  federationVersion: opts.federationVersion,
53
60
  connectorSpecVersion: opts.connectorSpecVersion,
54
- postName: opts.postName,
55
61
  mapper: mapper,
56
62
  skipOptionalArgs: opts.skipOptionalArgs,
57
63
  inferEntityResolvers: opts.inferEntityResolvers,
@@ -104,6 +110,7 @@ program
104
110
  .option('--connector-spec-version <version>', 'Connector spec version to use', DEFAULT_VERSIONS.connectorSpecVersion)
105
111
  .option('--base-url <url>', 'Override the @source base URL (default: servers[0] from the spec)')
106
112
  .option('--overrides <file>', 'Load per-operation path/queryParams overrides from a JSON file')
113
+ .option('--batch <file>', 'Load batch endpoints (op id -> { maxSize? }) from a JSON file')
107
114
  .option('--skip-optional-args', 'Skip optional arguments in queries', false)
108
115
  .option('--infer-entity-resolvers', 'Infer entity resolvers and emit @key / entity: true', false)
109
116
  .parse(process.argv);
@@ -1 +1 @@
1
- {"version":3,"file":"oas.js","sourceRoot":"","sources":["../../src/cli/oas.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { Command } from 'commander';\nimport { DEFAULT_VERSIONS } from '../versions.js';\nimport { generateFromSelection, promptForSelection } from './oas-helpers/index.js';\nimport { OasGen } from '../oas/oasGen.js';\nimport { RequestOverride } from '../oas/oasContext.js';\nimport { RulesLoader, OpNameMapper, MapRules, Mapper } from '../oas/mapper/index.js';\n\nconst originalConsole = Object.assign(\n {\n log: console.log,\n },\n console,\n);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction loadRules(opts: any): Mapper | undefined {\n let mapper;\n if (opts.transformRules) {\n try {\n const rules = RulesLoader.fromFile(opts.transformRules);\n mapper = OpNameMapper.fromRules(rules);\n } catch (error) {\n console.error(`Error loading transform rules: ${error}`);\n return undefined;\n }\n } else if (opts.postName) {\n // Backward compatibility with legacy --post-name\n mapper = OpNameMapper.fromPattern(opts.postName);\n }\n\n return mapper;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction loadOverrides(opts: any): Record<string, RequestOverride> | undefined {\n if (!opts.overrides) {\n return undefined;\n }\n try {\n return JSON.parse(fs.readFileSync(opts.overrides, 'utf-8'));\n } catch (error) {\n console.error(`Error loading overrides: ${error}`);\n return undefined;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- for options\nasync function main(sourceFile: string, opts: any): Promise<void> {\n console.log = () => {};\n\n const mapper = loadRules(opts);\n const overrides = loadOverrides(opts);\n\n const gen = await OasGen.fromFile(sourceFile, {\n ...opts,\n baseURL: opts.baseUrl,\n overrides,\n showParentInSelections: false,\n federationVersion: opts.federationVersion,\n connectorSpecVersion: opts.connectorSpecVersion,\n postName: opts.postName,\n mapper: mapper,\n skipOptionalArgs: opts.skipOptionalArgs,\n inferEntityResolvers: opts.inferEntityResolvers,\n });\n\n await gen.visit();\n\n let pathSet = Array.from(gen.paths.values());\n if (opts.loadSelections) {\n generateFromSelection(opts, gen);\n return;\n }\n\n if (opts.grep !== '*') {\n const regex = new RegExp(opts.grep, 'ig');\n pathSet = pathSet.filter((p) => regex.test(p.path()));\n }\n\n if (opts.listPaths) {\n pathSet.forEach((path) => console.info(path.path()));\n return;\n }\n\n let paths: string[];\n if (opts.skipSelection) {\n paths = pathSet.map((p) => p.path() + '>**');\n } else {\n paths = await promptForSelection(gen, opts, pathSet);\n }\n\n if (opts.verbose) console = originalConsole;\n\n console.info(gen.generateSchema(paths));\n\n if (opts.printSelections) {\n console.info('# --------------- Selections -----------------');\n console.info(gen.selections);\n console.info('# --------------- Paths -----------------');\n console.info('paths =', JSON.stringify(paths, null, 2));\n }\n}\n\nconst program = new Command();\nprogram\n .version('0.0.1')\n .argument('<source>', 'source spec (yaml or json)')\n .option('-i --skip-validation', 'Skip validation step', false)\n .option('-n --skip-selection', 'Generate all [filtered] paths without prompting for a selection', false)\n .option('-l --list-paths', 'Only list the paths that can be generated', false)\n .option('-g --grep <regex>', 'Filter the list of paths with the passed expression', '*')\n .option('-p --page-size <num>', 'Number of rows to display in selection mode', '10')\n .option('-s --load-selections <file>', 'Load a JSON file with field selections (other options are ignored)')\n .option('-v --verbose', 'Log all messages from generator')\n .option('-m --print-selections', 'Print selections from generator')\n .option('-t --transform-rules <file>', 'Load transform rules from a JSON file to apply multiple name transformations')\n .option('--federation-version <version>', 'Federation version to use', DEFAULT_VERSIONS.federationVersion)\n .option('--connector-spec-version <version>', 'Connector spec version to use', DEFAULT_VERSIONS.connectorSpecVersion)\n .option('--base-url <url>', 'Override the @source base URL (default: servers[0] from the spec)')\n .option('--overrides <file>', 'Load per-operation path/queryParams overrides from a JSON file')\n .option('--skip-optional-args', 'Skip optional arguments in queries', false)\n .option('--infer-entity-resolvers', 'Infer entity resolvers and emit @key / entity: true', false)\n .parse(process.argv);\n\nconst source = program.args[0];\nmain(source, program.opts()).then(() => console.log('done'));\n"]}
1
+ {"version":3,"file":"oas.js","sourceRoot":"","sources":["../../src/cli/oas.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { Command, OptionValues } from 'commander';\nimport { DEFAULT_VERSIONS } from '../versions.js';\nimport { generateFromSelection, promptForSelection } from './oas-helpers/index.js';\nimport { OasGen } from '../oas/oasGen.js';\nimport { BatchConfig, RequestOverride } from '../oas/oasContext.js';\nimport { RulesLoader, OpNameMapper, MapRules, Mapper } from '../oas/mapper/index.js';\n\nconst originalConsole = Object.assign(\n {\n log: console.log,\n },\n console,\n);\n\nfunction loadRules(opts: OptionValues): Mapper | undefined {\n let mapper;\n if (opts.transformRules) {\n try {\n const rules = RulesLoader.fromFile(opts.transformRules);\n mapper = OpNameMapper.fromRules(rules);\n } catch (error) {\n console.error(`Error loading transform rules: ${error}`);\n return undefined;\n }\n }\n\n return mapper;\n}\n\nfunction loadOverrides(opts: OptionValues): Record<string, RequestOverride> | undefined {\n if (!opts.overrides) {\n return undefined;\n }\n try {\n return JSON.parse(fs.readFileSync(opts.overrides, 'utf-8'));\n } catch (error) {\n console.error(`Error loading overrides: ${error}`);\n return undefined;\n }\n}\n\nfunction loadBatch(opts: OptionValues): BatchConfig | undefined {\n if (!opts.batch) {\n return undefined;\n }\n try {\n return JSON.parse(fs.readFileSync(opts.batch, 'utf-8'));\n } catch (error) {\n console.error(`Error loading batch file: ${error}`);\n return undefined;\n }\n}\n\nasync function main(sourceFile: string, opts: OptionValues): Promise<void> {\n console.log = () => {};\n\n const mapper = loadRules(opts);\n const overrides = loadOverrides(opts);\n const batch = loadBatch(opts);\n\n const gen = await OasGen.fromFile(sourceFile, {\n ...opts,\n baseURL: opts.baseUrl,\n overrides,\n batch,\n showParentInSelections: false,\n federationVersion: opts.federationVersion,\n connectorSpecVersion: opts.connectorSpecVersion,\n mapper: mapper,\n skipOptionalArgs: opts.skipOptionalArgs,\n inferEntityResolvers: opts.inferEntityResolvers,\n });\n\n await gen.visit();\n\n let pathSet = Array.from(gen.paths.values());\n if (opts.loadSelections) {\n generateFromSelection(opts, gen);\n return;\n }\n\n if (opts.grep !== '*') {\n const regex = new RegExp(opts.grep, 'ig');\n pathSet = pathSet.filter((p) => regex.test(p.path()));\n }\n\n if (opts.listPaths) {\n pathSet.forEach((path) => console.info(path.path()));\n return;\n }\n\n let paths: string[];\n if (opts.skipSelection) {\n paths = pathSet.map((p) => p.path() + '>**');\n } else {\n paths = await promptForSelection(gen, opts, pathSet);\n }\n\n if (opts.verbose) console = originalConsole;\n\n console.info(gen.generateSchema(paths));\n\n if (opts.printSelections) {\n console.info('# --------------- Selections -----------------');\n console.info(gen.selections);\n console.info('# --------------- Paths -----------------');\n console.info('paths =', JSON.stringify(paths, null, 2));\n }\n}\n\nconst program = new Command();\nprogram\n .version('0.0.1')\n .argument('<source>', 'source spec (yaml or json)')\n .option('-i --skip-validation', 'Skip validation step', false)\n .option('-n --skip-selection', 'Generate all [filtered] paths without prompting for a selection', false)\n .option('-l --list-paths', 'Only list the paths that can be generated', false)\n .option('-g --grep <regex>', 'Filter the list of paths with the passed expression', '*')\n .option('-p --page-size <num>', 'Number of rows to display in selection mode', '10')\n .option('-s --load-selections <file>', 'Load a JSON file with field selections (other options are ignored)')\n .option('-v --verbose', 'Log all messages from generator')\n .option('-m --print-selections', 'Print selections from generator')\n .option('-t --transform-rules <file>', 'Load transform rules from a JSON file to apply multiple name transformations')\n .option('--federation-version <version>', 'Federation version to use', DEFAULT_VERSIONS.federationVersion)\n .option('--connector-spec-version <version>', 'Connector spec version to use', DEFAULT_VERSIONS.connectorSpecVersion)\n .option('--base-url <url>', 'Override the @source base URL (default: servers[0] from the spec)')\n .option('--overrides <file>', 'Load per-operation path/queryParams overrides from a JSON file')\n .option('--batch <file>', 'Load batch endpoints (op id -> { maxSize? }) from a JSON file')\n .option('--skip-optional-args', 'Skip optional arguments in queries', false)\n .option('--infer-entity-resolvers', 'Infer entity resolvers and emit @key / entity: true', false)\n .parse(process.argv);\n\nconst source = program.args[0];\nmain(source, program.opts()).then(() => console.log('done'));\n"]}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { JsonGen } from './json/index.js';
2
2
  export { OasGen } from './oas/oasGen.js';
3
- export type { GenerateOptions, RequestOverride } from './oas/oasContext.js';
3
+ export type { BatchConfig, GenerateOptions, RequestOverride } from './oas/oasContext.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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';\nexport type { GenerateOptions, RequestOverride } from './oas/oasContext.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';\nexport type { BatchConfig, GenerateOptions, RequestOverride } from './oas/oasContext.js';\n"]}
@@ -1,4 +1,3 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  import _ from 'lodash';
3
2
  import { DEFAULT_VERSIONS, validateVersionOptions } from '../../versions.js';
4
3
  import { ConnectorWriter, JsonArray, JsonContext, JsonObj, JsonScalar, StringWriter } from '../index.js';
@@ -137,10 +136,12 @@ export class JsonGen {
137
136
  walkObject(context, parent, name, object) {
138
137
  trace(context, '-> [walkObject]', 'in: ' + name);
139
138
  const result = new JsonObj(name, parent);
139
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
140
140
  const fieldSet = Object.keys(object);
141
141
  trace(context, ' [walkObject]', 'fieldSet: ' + fieldSet);
142
142
  for (const field of fieldSet) {
143
143
  trace(context, ' [walkObject]', 'field: ' + field);
144
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
144
145
  const childElement = object[field];
145
146
  const type = this.walkElement(context, result, field, childElement);
146
147
  result.add(field, type);
@@ -179,7 +180,7 @@ export class JsonGen {
179
180
  result = new JsonScalar(name, parent, 'Int');
180
181
  }
181
182
  else {
182
- throw new Error('Cannot yet handle primitive: ' + primitive);
183
+ throw new Error('Cannot yet handle primitive: ' + String(primitive));
183
184
  }
184
185
  return result;
185
186
  }
@@ -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 { DEFAULT_VERSIONS, validateVersionOptions } from '../../versions.js';\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 interface JsonGenOptions {\n federationVersion?: string;\n connectorSpecVersion?: string;\n rootType?: string;\n baseURL?: string;\n relativePath?: string;\n queryField?: string;\n verbose?: boolean;\n}\n\nexport class JsonGen {\n private readonly context: JsonContext;\n private readonly options: JsonGenOptions;\n\n // Private constructor\n private constructor(options: JsonGenOptions = {}) {\n this.context = new JsonContext();\n this.context.verbose = options.verbose ?? false;\n this.options = {\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n ...options,\n };\n validateVersionOptions(this.options);\n }\n\n public getContext(): JsonContext {\n return this.context;\n }\n\n public static new(options?: JsonGenOptions): JsonGen {\n return new JsonGen(options);\n }\n\n // Factory method from a JSON string\n public static fromReader(json: string, options?: JsonGenOptions): JsonGen {\n const walker = new JsonGen(options);\n walker.walkJson(json);\n return walker;\n }\n\n public static fromJsons(jsons: string[], options?: JsonGenOptions): JsonGen {\n const walker = new JsonGen(options);\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, this.options);\n return writer.flush();\n }\n\n // Writes selection using a given Writer\n public writeSelection(indent: number = 6): string {\n const writer = new StringWriter();\n this.context.setIndent(indent);\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 // only Obj nodes are collected — arrays recurse into their item type, scalars are skipped\n const orderedSet = new Set<JsonObj>();\n this.writeType(root, orderedSet);\n\n const generatedSet = new Map<string, JsonType>();\n orderedSet.forEach((obj) => {\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, obj, typeName));\n typeName = obj.getType();\n }\n obj.write(this.context, writer);\n generatedSet.set(typeName, obj);\n });\n }\n\n return writer.flush();\n }\n\n // Recursive helper to order types\n private writeType(type: JsonType, orderedSet: Set<JsonObj>): void {\n if (type instanceof JsonObj) {\n // Traverse children first\n for (const child of Array.from(type.getFields().values())) {\n this.writeType(child, orderedSet);\n }\n orderedSet.add(type);\n } else if (type instanceof JsonArray) {\n const arrayType = type.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 const rootName = (this.options.rootType ?? 'root').replace(/^\\[|]$/g, '');\n this.walkElement(this.context, null, rootName, 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 // an empty {} value declares no fields — a field-less type would be skipped at write\n // time, dangling its reference; use the JSON scalar instead (the #19 convention). #21\n if (Object.keys(element).length === 0) {\n result = new JsonScalar(name, parent, 'JSON');\n } else {\n result = this.walkObject(context, parent, name, element);\n context.store(result);\n }\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 if (element === null) {\n // we'll treat null as a string\n result = this.walkPrimitive(context, parent, name, 'string');\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 // an empty [] gives no item shape — a typeless array is dropped from the SDL but still\n // selected, breaking compose; `[JSON]` keeps both artifacts consistent (#19/#21 convention). #35\n warn(context, ' [walkArray]', \"Array is empty -- using JSON for field '\" + name + \"'\");\n result.setArrayType(new JsonScalar(name, result, 'JSON'));\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":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAY,YAAY,EAAE,MAAM,aAAa,CAAC;AACnH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY5C,MAAM,OAAO,OAAO;IACD,OAAO,CAAc;IACrB,OAAO,CAAiB;IAEzC,sBAAsB;IACtB,YAAoB,UAA0B,EAAE;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG;YACb,iBAAiB,EAAE,gBAAgB,CAAC,iBAAiB;YACrD,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB;YAC3D,GAAG,OAAO;SACX,CAAC;QACF,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAEM,UAAU;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,MAAM,CAAC,GAAG,CAAC,OAAwB;QACxC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,oCAAoC;IAC7B,MAAM,CAAC,UAAU,CAAC,IAAY,EAAE,OAAwB;QAC7D,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,KAAe,EAAE,OAAwB;QAC/D,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,cAAc;QACnB,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,wCAAwC;IACjC,cAAc,CAAC,SAAiB,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC;QACjE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,sDAAsD;IAC/C,UAAU;QACf,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC;QACjE,IAAI,IAAI,EAAE,CAAC;YACT,0FAA0F;YAC1F,MAAM,UAAU,GAAG,IAAI,GAAG,EAAW,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAEjC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;YACjD,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzB,IAAI,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC7B,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,gCAAgC;oBAChC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;wBAC/C,OAAO;oBACT,CAAC;oBACD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,YAAY,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;oBACrE,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;gBACD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAChC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,kCAAkC;IAC1B,SAAS,CAAC,IAAc,EAAE,UAAwB;QACxD,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YAC5B,0BAA0B;YAC1B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACpC,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,YAAY,SAAS,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,qCAAqC;IAC9B,QAAQ,CAAC,IAAY;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;IAED,mCAAmC;IAC3B,WAAW,CAAC,OAAoB,EAAE,MAAuB,EAAE,IAAY,EAAE,OAAgB;QAC/F,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QAClD,IAAI,MAAgB,CAAC;QAErB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC/E,qFAAqF;YACrF,sFAAsF;YACtF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;YACtG,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5B,+BAA+B;YAC/B,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,OAAO,CAAC,CAAC;QAChF,CAAC;QAED,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB;IACb,UAAU,CAAC,OAAoB,EAAE,MAAuB,EAAE,IAAY,EAAE,MAAe;QAC7F,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAa,CAAC,CAAC;QAC5C,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,GAAG,QAAQ,CAAC,CAAC;QAE1D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;YAEpD,8DAA8D;YAC9D,MAAM,YAAY,GAAI,MAAc,CAAC,KAAK,CAAC,CAAC;YAE5C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;YACpE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oBAAoB;IACZ,SAAS,CAAC,OAAoB,EAAE,MAAuB,EAAE,IAAY,EAAE,KAAgB;QAC7F,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACxE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,uFAAuF;YACvF,iGAAiG;YACjG,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,0CAA0C,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;YACzF,MAAM,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8BAA8B;IACtB,aAAa,CAAC,QAAqB,EAAE,MAAuB,EAAE,IAAY,EAAE,SAAkB;QACpG,IAAI,MAAkB,CAAC;QACvB,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gDAAgD;IACxC,MAAM,CAAC,kBAAkB,CAAC,YAAmC,EAAE,CAAW,EAAE,QAAgB;QAClG,IAAI,OAAe,CAAC;QACpB,IAAI,IAAI,GAAoB,CAAC,CAAC;QAC9B,GAAG,CAAC;YACF,MAAM,MAAM,GAAoB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACjH,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAChF,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;YAChC,IAAI,GAAG,MAAM,CAAC;QAChB,CAAC,QAAQ,IAAI,KAAK,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF","sourcesContent":["import _ from 'lodash';\nimport { DEFAULT_VERSIONS, validateVersionOptions } from '../../versions.js';\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 interface JsonGenOptions {\n federationVersion?: string;\n connectorSpecVersion?: string;\n rootType?: string;\n baseURL?: string;\n relativePath?: string;\n queryField?: string;\n verbose?: boolean;\n}\n\nexport class JsonGen {\n private readonly context: JsonContext;\n private readonly options: JsonGenOptions;\n\n // Private constructor\n private constructor(options: JsonGenOptions = {}) {\n this.context = new JsonContext();\n this.context.verbose = options.verbose ?? false;\n this.options = {\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n ...options,\n };\n validateVersionOptions(this.options);\n }\n\n public getContext(): JsonContext {\n return this.context;\n }\n\n public static new(options?: JsonGenOptions): JsonGen {\n return new JsonGen(options);\n }\n\n // Factory method from a JSON string\n public static fromReader(json: string, options?: JsonGenOptions): JsonGen {\n const walker = new JsonGen(options);\n walker.walkJson(json);\n return walker;\n }\n\n public static fromJsons(jsons: string[], options?: JsonGenOptions): JsonGen {\n const walker = new JsonGen(options);\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, this.options);\n return writer.flush();\n }\n\n // Writes selection using a given Writer\n public writeSelection(indent: number = 6): string {\n const writer = new StringWriter();\n this.context.setIndent(indent);\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 // only Obj nodes are collected — arrays recurse into their item type, scalars are skipped\n const orderedSet = new Set<JsonObj>();\n this.writeType(root, orderedSet);\n\n const generatedSet = new Map<string, JsonType>();\n orderedSet.forEach((obj) => {\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, obj, typeName));\n typeName = obj.getType();\n }\n obj.write(this.context, writer);\n generatedSet.set(typeName, obj);\n });\n }\n\n return writer.flush();\n }\n\n // Recursive helper to order types\n private writeType(type: JsonType, orderedSet: Set<JsonObj>): void {\n if (type instanceof JsonObj) {\n // Traverse children first\n for (const child of Array.from(type.getFields().values())) {\n this.writeType(child, orderedSet);\n }\n orderedSet.add(type);\n } else if (type instanceof JsonArray) {\n const arrayType = type.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 const rootName = (this.options.rootType ?? 'root').replace(/^\\[|]$/g, '');\n this.walkElement(this.context, null, rootName, 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: unknown): JsonType {\n trace(context, '-> [walkElement]', 'in: ' + name);\n let result: JsonType;\n\n if (typeof element === 'object' && !Array.isArray(element) && element !== null) {\n // an empty {} value declares no fields — a field-less type would be skipped at write\n // time, dangling its reference; use the JSON scalar instead (the #19 convention). #21\n if (Object.keys(element).length === 0) {\n result = new JsonScalar(name, parent, 'JSON');\n } else {\n result = this.walkObject(context, parent, name, element);\n context.store(result);\n }\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 if (element === null) {\n // we'll treat null as a string\n result = this.walkPrimitive(context, parent, name, 'string');\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: unknown): JsonObj {\n trace(context, '-> [walkObject]', 'in: ' + name);\n const result = new JsonObj(name, parent);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fieldSet = Object.keys(object as any);\n trace(context, ' [walkObject]', 'fieldSet: ' + fieldSet);\n\n for (const field of fieldSet) {\n trace(context, ' [walkObject]', 'field: ' + field);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const childElement = (object as any)[field];\n\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: unknown[]): 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 // an empty [] gives no item shape — a typeless array is dropped from the SDL but still\n // selected, breaking compose; `[JSON]` keeps both artifacts consistent (#19/#21 convention). #35\n warn(context, ' [walkArray]', \"Array is empty -- using JSON for field '\" + name + \"'\");\n result.setArrayType(new JsonScalar(name, result, 'JSON'));\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: unknown): 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: ' + String(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"]}
@@ -11,8 +11,8 @@ export class ErrorsWriter {
11
11
  constructor(gen) {
12
12
  this.gen = gen;
13
13
  }
14
- // emit `errors: { message: "$.message" extensions: """statusCode: $status""" }` for operations
15
- // that document HTTP error responses. errors is a connect v0.2+ feature; below that we skip
14
+ // emit an `errors { message extensions { statusCode: $status } }` block for operations that
15
+ // document HTTP error responses. errors is a connect v0.2+ feature; below that we skip
16
16
  // with a logged downgrade rather than emit invalid output.
17
17
  write(context, writer, op, indent) {
18
18
  if (!context.generateOptions?.emitConnectorErrors || !this.hasDocumentedErrors(op)) {
@@ -26,14 +26,23 @@ export class ErrorsWriter {
26
26
  // `message: "$.message"` — the path form yields the field's VALUE; a bare `message`
27
27
  // selection would build the object `{message: …}`, which errors.message rejects. R4
28
28
  const message = this.errorMessageField(context, op);
29
- const spacing = ' '.repeat(indent + 6);
29
+ // fully expanded: `errors {` and `}` at the @connect arg level, message/extensions/body/closing
30
+ // one level deeper (8 spaces) so the body and the closing `"""` line up.
31
+ const labelSpacing = ' '.repeat(indent + 6);
32
+ const innerSpacing = ' '.repeat(indent + 8);
33
+ writer.write(labelSpacing).write('errors: {\n');
34
+ if (message) {
35
+ writer.write(innerSpacing).write(`message: "$.${message}"\n`);
36
+ }
30
37
  writer
31
- .write(spacing)
32
- .write(message ? `errors: { message: "$.${message}" extensions: """\n` : 'errors: { extensions: """\n')
33
- .write(spacing)
38
+ .write(innerSpacing)
39
+ .write('extensions: """\n')
40
+ .write(innerSpacing)
34
41
  .write('statusCode: $status\n')
35
- .write(spacing)
36
- .write('""" }\n');
42
+ .write(innerSpacing)
43
+ .write('"""\n')
44
+ .write(labelSpacing)
45
+ .write('}\n');
37
46
  }
38
47
  // True when the operation documents an HTTP error response. Accepts both concrete numeric statuses
39
48
  // (4xx/5xx) and the OAS range keys `4XX`/`5XX` (case-insensitive). The `default` key is excluded —
@@ -1 +1 @@
1
- {"version":3,"file":"errorsWriter.js","sourceRoot":"","sources":["../../../src/oas/io/errorsWriter.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { ResponseObject, SchemaObject } from 'oas/types';\nimport { OasContext } from '../oasContext.js';\nimport { OasGen } from '../oasGen.js';\nimport { Op } from '../nodes/internal.js';\nimport { Writer } from './writer.js';\nimport { DEFAULT_VERSIONS, meetsMinimum } from '../../versions.js';\nimport { warn } from '../log/trace.js';\n\n// R4 (opt-in): the `errors:` block of a connector — `message` from the documented error body,\n// `extensions` carrying `$status`.\nexport class ErrorsWriter {\n // corpus-measured priority for the error-body message field: `message` (755 error schemas),\n // `error` (362), `detail` (7)\n private static readonly MESSAGE_FIELDS = ['message', 'error', 'detail'];\n\n constructor(private gen: OasGen) {}\n\n // emit `errors: { message: \"$.message\" extensions: \"\"\"statusCode: $status\"\"\" }` for operations\n // that document HTTP error responses. errors is a connect v0.2+ feature; below that we skip\n // with a logged downgrade rather than emit invalid output.\n public write(context: OasContext, writer: Writer, op: Op, indent: number): void {\n if (!context.generateOptions?.emitConnectorErrors || !this.hasDocumentedErrors(op)) {\n return;\n }\n\n const version = this.gen.options.connectorSpecVersion || DEFAULT_VERSIONS.connectorSpecVersion;\n if (!meetsMinimum(version, 'v0.2')) {\n warn(\n context,\n '[errors]',\n `@connect(errors:) requires connect v0.2, but target is ${version} — not emitted for ${op.verb} ${op.operation.path}`,\n );\n return;\n }\n\n // `message: \"$.message\"` — the path form yields the field's VALUE; a bare `message`\n // selection would build the object `{message: …}`, which errors.message rejects. R4\n const message = this.errorMessageField(context, op);\n\n const spacing = ' '.repeat(indent + 6);\n writer\n .write(spacing)\n .write(message ? `errors: { message: \"$.${message}\" extensions: \"\"\"\\n` : 'errors: { extensions: \"\"\"\\n')\n .write(spacing)\n .write('statusCode: $status\\n')\n .write(spacing)\n .write('\"\"\" }\\n');\n }\n\n // True when the operation documents an HTTP error response. Accepts both concrete numeric statuses\n // (4xx/5xx) and the OAS range keys `4XX`/`5XX` (case-insensitive). The `default` key is excluded —\n // it also covers 2xx/3xx, so it is not specifically an error indicator.\n private hasDocumentedErrors(op: Op): boolean {\n return op.operation.getResponseStatusCodes().some((code: string) => /^[45](\\d\\d|XX)$/i.test(code));\n }\n\n // the field must be a string on EVERY documented JSON error shape — a field missing on some\n // status would yield a null message there. Non-JSON / shapeless error responses don't veto.\n private errorMessageField(context: OasContext, op: Op): string | undefined {\n const responses = op.operation.schema.responses ?? {};\n const errorShapes: Array<Record<string, unknown>> = [];\n\n for (const [code, response] of Object.entries(responses)) {\n if (!/^[45](\\d\\d|XX)$/i.test(code)) {\n continue;\n }\n const resolved = this.deref(context, response) as ResponseObject | null;\n const mediaKey = Object.keys(resolved?.content ?? {}).find((k) => /^application\\/(?:.*\\+)?json/i.test(k));\n const schema = mediaKey\n ? (this.deref(context, resolved!.content![mediaKey].schema) as SchemaObject | null)\n : null;\n if (schema?.properties) {\n errorShapes.push(schema.properties);\n }\n }\n\n if (errorShapes.length === 0) {\n return undefined;\n }\n return ErrorsWriter.MESSAGE_FIELDS.find((field) =>\n errorShapes.every((props) => (this.deref(context, props[field]) as SchemaObject | null)?.type === 'string'),\n );\n }\n\n // read-only $ref hop — resolvePointer, NOT lookupRef: this sniff must not bump refCount\n private deref(context: OasContext, node: unknown): unknown {\n return _.has(node, '$ref') ? context.resolvePointer(_.get(node, '$ref') as string) : node;\n }\n}\n"]}
1
+ {"version":3,"file":"errorsWriter.js","sourceRoot":"","sources":["../../../src/oas/io/errorsWriter.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { ResponseObject, SchemaObject } from 'oas/types';\nimport { OasContext } from '../oasContext.js';\nimport { OasGen } from '../oasGen.js';\nimport { Op } from '../nodes/internal.js';\nimport { Writer } from './writer.js';\nimport { DEFAULT_VERSIONS, meetsMinimum } from '../../versions.js';\nimport { warn } from '../log/trace.js';\n\n// R4 (opt-in): the `errors:` block of a connector — `message` from the documented error body,\n// `extensions` carrying `$status`.\nexport class ErrorsWriter {\n // corpus-measured priority for the error-body message field: `message` (755 error schemas),\n // `error` (362), `detail` (7)\n private static readonly MESSAGE_FIELDS = ['message', 'error', 'detail'];\n\n constructor(private gen: OasGen) {}\n\n // emit an `errors { message extensions { statusCode: $status } }` block for operations that\n // document HTTP error responses. errors is a connect v0.2+ feature; below that we skip\n // with a logged downgrade rather than emit invalid output.\n public write(context: OasContext, writer: Writer, op: Op, indent: number): void {\n if (!context.generateOptions?.emitConnectorErrors || !this.hasDocumentedErrors(op)) {\n return;\n }\n\n const version = this.gen.options.connectorSpecVersion || DEFAULT_VERSIONS.connectorSpecVersion;\n if (!meetsMinimum(version, 'v0.2')) {\n warn(\n context,\n '[errors]',\n `@connect(errors:) requires connect v0.2, but target is ${version} — not emitted for ${op.verb} ${op.operation.path}`,\n );\n return;\n }\n\n // `message: \"$.message\"` — the path form yields the field's VALUE; a bare `message`\n // selection would build the object `{message: …}`, which errors.message rejects. R4\n const message = this.errorMessageField(context, op);\n\n // fully expanded: `errors {` and `}` at the @connect arg level, message/extensions/body/closing\n // one level deeper (8 spaces) so the body and the closing `\"\"\"` line up.\n const labelSpacing = ' '.repeat(indent + 6);\n const innerSpacing = ' '.repeat(indent + 8);\n writer.write(labelSpacing).write('errors: {\\n');\n if (message) {\n writer.write(innerSpacing).write(`message: \"$.${message}\"\\n`);\n }\n writer\n .write(innerSpacing)\n .write('extensions: \"\"\"\\n')\n .write(innerSpacing)\n .write('statusCode: $status\\n')\n .write(innerSpacing)\n .write('\"\"\"\\n')\n .write(labelSpacing)\n .write('}\\n');\n }\n\n // True when the operation documents an HTTP error response. Accepts both concrete numeric statuses\n // (4xx/5xx) and the OAS range keys `4XX`/`5XX` (case-insensitive). The `default` key is excluded —\n // it also covers 2xx/3xx, so it is not specifically an error indicator.\n private hasDocumentedErrors(op: Op): boolean {\n return op.operation.getResponseStatusCodes().some((code: string) => /^[45](\\d\\d|XX)$/i.test(code));\n }\n\n // the field must be a string on EVERY documented JSON error shape — a field missing on some\n // status would yield a null message there. Non-JSON / shapeless error responses don't veto.\n private errorMessageField(context: OasContext, op: Op): string | undefined {\n const responses = op.operation.schema.responses ?? {};\n const errorShapes: Array<Record<string, unknown>> = [];\n\n for (const [code, response] of Object.entries(responses)) {\n if (!/^[45](\\d\\d|XX)$/i.test(code)) {\n continue;\n }\n const resolved = this.deref(context, response) as ResponseObject | null;\n const mediaKey = Object.keys(resolved?.content ?? {}).find((k) => /^application\\/(?:.*\\+)?json/i.test(k));\n const schema = mediaKey\n ? (this.deref(context, resolved!.content![mediaKey].schema) as SchemaObject | null)\n : null;\n if (schema?.properties) {\n errorShapes.push(schema.properties);\n }\n }\n\n if (errorShapes.length === 0) {\n return undefined;\n }\n return ErrorsWriter.MESSAGE_FIELDS.find((field) =>\n errorShapes.every((props) => (this.deref(context, props[field]) as SchemaObject | null)?.type === 'string'),\n );\n }\n\n // read-only $ref hop — resolvePointer, NOT lookupRef: this sniff must not bump refCount\n private deref(context: OasContext, node: unknown): unknown {\n return _.has(node, '$ref') ? context.resolvePointer(_.get(node, '$ref') as string) : node;\n }\n}\n"]}
@@ -2,17 +2,19 @@ import { OasContext } from '../oasContext.js';
2
2
  import { OasGen } from '../oasGen.js';
3
3
  import { IType } from '../nodes/internal.js';
4
4
  import { Writer } from './writer.js';
5
+ import { SecurityPlan } from './security.js';
5
6
  export declare class OperationWriter {
6
7
  private gen;
8
+ private security;
7
9
  private errorsWriter;
8
- constructor(gen: OasGen);
10
+ constructor(gen: OasGen, security: SecurityPlan);
9
11
  writeQuery(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void;
10
12
  writeMutations(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void;
11
13
  writeConnector(context: OasContext, writer: Writer, type: IType, selection: string[]): void;
12
14
  private requestMethod;
13
15
  private templatedPath;
14
- private writeQueryParams;
15
- private writeHeaders;
16
+ private queryParamsBlock;
17
+ private headersBlock;
16
18
  private mergeOverrides;
17
19
  private headerExample;
18
20
  private arrayJoin;