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.
- package/dist/cli/json.js +0 -1
- package/dist/cli/json.js.map +1 -1
- package/dist/cli/oas-helpers/index.d.ts +2 -1
- package/dist/cli/oas-helpers/index.js +0 -1
- package/dist/cli/oas-helpers/index.js.map +1 -1
- package/dist/cli/oas.js +15 -8
- package/dist/cli/oas.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/json/walker/jsonGen.js +3 -2
- package/dist/json/walker/jsonGen.js.map +1 -1
- package/dist/oas/io/errorsWriter.js +17 -8
- package/dist/oas/io/errorsWriter.js.map +1 -1
- package/dist/oas/io/operationWriter.d.ts +5 -3
- package/dist/oas/io/operationWriter.js +92 -54
- package/dist/oas/io/operationWriter.js.map +1 -1
- package/dist/oas/io/schemaWriter.d.ts +3 -14
- package/dist/oas/io/schemaWriter.js +4 -115
- package/dist/oas/io/schemaWriter.js.map +1 -1
- package/dist/oas/io/security.d.ts +36 -0
- package/dist/oas/io/security.js +164 -0
- package/dist/oas/io/security.js.map +1 -0
- package/dist/oas/io/writer.js +25 -3
- package/dist/oas/io/writer.js.map +1 -1
- package/dist/oas/nodes/batch.d.ts +13 -0
- package/dist/oas/nodes/batch.js +115 -0
- package/dist/oas/nodes/batch.js.map +1 -0
- package/dist/oas/nodes/body.js +2 -2
- package/dist/oas/nodes/body.js.map +1 -1
- package/dist/oas/nodes/entity.d.ts +13 -0
- package/dist/oas/nodes/entity.js.map +1 -1
- package/dist/oas/nodes/get.js +1 -1
- package/dist/oas/nodes/get.js.map +1 -1
- package/dist/oas/nodes/obj.d.ts +1 -0
- package/dist/oas/nodes/obj.js +46 -1
- package/dist/oas/nodes/obj.js.map +1 -1
- package/dist/oas/oasContext.d.ts +5 -0
- package/dist/oas/oasContext.js.map +1 -1
- package/dist/oas/oasGen.d.ts +3 -2
- package/dist/oas/oasGen.js.map +1 -1
- package/dist/oas/utils/params.d.ts +4 -0
- package/dist/oas/utils/params.js +14 -0
- package/dist/oas/utils/params.js.map +1 -0
- package/dist/tests/runners.d.ts +2 -1
- package/dist/tests/runners.js +1 -0
- package/dist/tests/runners.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- 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)) {
|
package/dist/cli/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/cli/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,OAAO,
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
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);
|
package/dist/cli/oas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oas.js","sourceRoot":"","sources":["../../src/cli/oas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"oas.js","sourceRoot":"","sources":["../../src/cli/oas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAoB,MAAM,wBAAwB,CAAC;AAErF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CACnC;IACE,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,EACD,OAAO,CACR,CAAC;AAEF,SAAS,SAAS,CAAC,IAAkB;IACnC,IAAI,MAAM,CAAC;IACX,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxD,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,IAAkB;IACvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;QACnD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAkB;IACnC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,UAAkB,EAAE,IAAkB;IACxD,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC5C,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS;QACT,KAAK;QACL,sBAAsB,EAAE,KAAK;QAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;KAChD,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAElB,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,KAAe,CAAC;IACpB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,eAAe,CAAC;IAE5C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAExC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,UAAU,EAAE,4BAA4B,CAAC;KAClD,MAAM,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,KAAK,CAAC;KAC7D,MAAM,CAAC,qBAAqB,EAAE,iEAAiE,EAAE,KAAK,CAAC;KACvG,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,EAAE,KAAK,CAAC;KAC7E,MAAM,CAAC,mBAAmB,EAAE,qDAAqD,EAAE,GAAG,CAAC;KACvF,MAAM,CAAC,sBAAsB,EAAE,6CAA6C,EAAE,IAAI,CAAC;KACnF,MAAM,CAAC,6BAA6B,EAAE,oEAAoE,CAAC;KAC3G,MAAM,CAAC,cAAc,EAAE,iCAAiC,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,iCAAiC,CAAC;KAClE,MAAM,CAAC,6BAA6B,EAAE,8EAA8E,CAAC;KACrH,MAAM,CAAC,gCAAgC,EAAE,2BAA2B,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;KACzG,MAAM,CAAC,oCAAoC,EAAE,+BAA+B,EAAE,gBAAgB,CAAC,oBAAoB,CAAC;KACpH,MAAM,CAAC,kBAAkB,EAAE,mEAAmE,CAAC;KAC/F,MAAM,CAAC,oBAAoB,EAAE,gEAAgE,CAAC;KAC9F,MAAM,CAAC,gBAAgB,EAAE,+DAA+D,CAAC;KACzF,MAAM,CAAC,sBAAsB,EAAE,oCAAoC,EAAE,KAAK,CAAC;KAC3E,MAAM,CAAC,0BAA0B,EAAE,qDAAqD,EAAE,KAAK,CAAC;KAChG,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 { 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
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
|
|
15
|
-
//
|
|
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
|
-
|
|
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(
|
|
32
|
-
.write(
|
|
33
|
-
.write(
|
|
38
|
+
.write(innerSpacing)
|
|
39
|
+
.write('extensions: """\n')
|
|
40
|
+
.write(innerSpacing)
|
|
34
41
|
.write('statusCode: $status\n')
|
|
35
|
-
.write(
|
|
36
|
-
.write('"""
|
|
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":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAMvB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,8FAA8F;AAC9F,mCAAmC;AACnC,MAAM,OAAO,YAAY;IAKH;IAJpB,4FAA4F;IAC5F,8BAA8B;IACtB,MAAM,CAAU,cAAc,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExE,YAAoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAEnC
|
|
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
|
|
15
|
-
private
|
|
16
|
+
private queryParamsBlock;
|
|
17
|
+
private headersBlock;
|
|
16
18
|
private mergeOverrides;
|
|
17
19
|
private headerExample;
|
|
18
20
|
private arrayJoin;
|