apollo-conn-gen 0.14.0 → 0.15.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/oas.js +2 -0
- package/dist/cli/oas.js.map +1 -1
- package/dist/oas/io/operationWriter.js +18 -6
- package/dist/oas/io/operationWriter.js.map +1 -1
- package/dist/oas/io/security.d.ts +10 -2
- package/dist/oas/io/security.js +42 -9
- package/dist/oas/io/security.js.map +1 -1
- package/dist/oas/io/writer.js +1 -1
- package/dist/oas/io/writer.js.map +1 -1
- package/dist/oas/nodes/factory.js +0 -1
- package/dist/oas/nodes/factory.js.map +1 -1
- package/dist/oas/nodes/propArray.js.map +1 -1
- package/dist/oas/nodes/union.js +11 -1
- package/dist/oas/nodes/union.js.map +1 -1
- package/dist/oas/oasContext.d.ts +1 -0
- package/dist/oas/oasContext.js.map +1 -1
- package/dist/oas/oasGen.d.ts +1 -0
- package/dist/oas/oasGen.js.map +1 -1
- package/dist/tests/runners.d.ts +1 -0
- package/dist/tests/runners.js +1 -0
- package/dist/tests/runners.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/oas.js
CHANGED
|
@@ -61,6 +61,7 @@ async function main(sourceFile, opts) {
|
|
|
61
61
|
mapper: mapper,
|
|
62
62
|
skipOptionalArgs: opts.skipOptionalArgs,
|
|
63
63
|
inferEntityResolvers: opts.inferEntityResolvers,
|
|
64
|
+
skipAuth: opts.skipAuth,
|
|
64
65
|
});
|
|
65
66
|
await gen.visit();
|
|
66
67
|
let pathSet = Array.from(gen.paths.values());
|
|
@@ -113,6 +114,7 @@ program
|
|
|
113
114
|
.option('--batch <file>', 'Load batch endpoints (op id -> { maxSize? }) from a JSON file')
|
|
114
115
|
.option('--skip-optional-args', 'Skip optional arguments in queries', false)
|
|
115
116
|
.option('--infer-entity-resolvers', 'Infer entity resolvers and emit @key / entity: true', false)
|
|
117
|
+
.option('--skip-auth', 'Omit all auth (no headers on @source, no auth on @connect)', false)
|
|
116
118
|
.parse(process.argv);
|
|
117
119
|
const source = program.args[0];
|
|
118
120
|
main(source, program.opts()).then(() => console.log('done'));
|
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,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;
|
|
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;QAC/C,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,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,MAAM,CAAC,aAAa,EAAE,4DAA4D,EAAE,KAAK,CAAC;KAC1F,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 skipAuth: opts.skipAuth,\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 .option('--skip-auth', 'Omit all auth (no headers on @source, no auth on @connect)', false)\n .parse(process.argv);\n\nconst source = program.args[0];\nmain(source, program.opts()).then(() => console.log('done'));\n"]}
|
|
@@ -3,6 +3,8 @@ import { T } from '../nodes/internal.js';
|
|
|
3
3
|
import { Naming } from '../utils/naming.js';
|
|
4
4
|
import { Params } from '../utils/params.js';
|
|
5
5
|
import { ErrorsWriter } from './errorsWriter.js';
|
|
6
|
+
import { DEFAULT_VERSIONS, meetsMinimum } from '../../versions.js';
|
|
7
|
+
import { warn } from '../log/trace.js';
|
|
6
8
|
export class OperationWriter {
|
|
7
9
|
gen;
|
|
8
10
|
security;
|
|
@@ -69,7 +71,15 @@ export class OperationWriter {
|
|
|
69
71
|
// body is emitted last; its presence is cheap to compute up front. the body block streams
|
|
70
72
|
// through the node tree (Body.select), so unlike query/headers it writes to `writer` directly
|
|
71
73
|
// instead of returning a string. `null` drops the body; a string overrides it; see ROADMAP R9.
|
|
72
|
-
|
|
74
|
+
// C2: `body:` is a connect v0.2+ feature — gate it like errors (R4) and batch (R6). Below the
|
|
75
|
+
// floor, drop the body and warn once per op (do not emit invalid output for an ancient target).
|
|
76
|
+
const wouldEmitBody = typeof override?.body === 'string' || (override?.body === undefined && !!op.body);
|
|
77
|
+
const version = this.gen.options.connectorSpecVersion || DEFAULT_VERSIONS.connectorSpecVersion;
|
|
78
|
+
const bodyAllowed = meetsMinimum(version, 'v0.2');
|
|
79
|
+
if (!bodyAllowed && wouldEmitBody) {
|
|
80
|
+
warn(context, '[body]', `@connect(http.body) requires connect v0.2, but target is ${version} — body not emitted for ${op.verb} ${op.operation.path}`);
|
|
81
|
+
}
|
|
82
|
+
const hasBody = bodyAllowed && wouldEmitBody;
|
|
73
83
|
// query & header blocks are pure string-building — they return the block, or null when empty
|
|
74
84
|
const queryBlock = this.queryParamsBlock(context, op, override, queryAuth);
|
|
75
85
|
const headerBlock = this.headersBlock(op, override, headerAuth);
|
|
@@ -86,11 +96,13 @@ export class OperationWriter {
|
|
|
86
96
|
writer.write(queryBlock);
|
|
87
97
|
if (headerBlock)
|
|
88
98
|
writer.write(headerBlock);
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
if (hasBody) {
|
|
100
|
+
if (typeof override?.body === 'string') {
|
|
101
|
+
this.writeBodyOverride(writer, override.body);
|
|
102
|
+
}
|
|
103
|
+
else if (op.body) {
|
|
104
|
+
this.writeBodySelection(context, writer, op.body, selection);
|
|
105
|
+
}
|
|
94
106
|
}
|
|
95
107
|
writer.write(' '.repeat(6) + '}');
|
|
96
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operationWriter.js","sourceRoot":"","sources":["../../../src/oas/io/operationWriter.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { ParameterObject } from 'oas/types';\nimport { OasContext, RequestOverride } from '../oasContext.js';\nimport { OasGen } from '../oasGen.js';\nimport { Body, IType, Op, Param, T } from '../nodes/internal.js';\nimport { Naming } from '../utils/naming.js';\nimport { Params } from '../utils/params.js';\nimport { ErrorsWriter } from './errorsWriter.js';\nimport { Writer } from './writer.js';\nimport { NameValue, SecurityPlan } from './security.js';\n\nexport class OperationWriter {\n private errorsWriter: ErrorsWriter;\n\n constructor(\n private gen: OasGen,\n private security: SecurityPlan,\n ) {\n this.errorsWriter = new ErrorsWriter(gen);\n }\n\n public writeQuery(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void {\n const selectionSet = new Set<string>(selection.map((s) => s.split('>')[0]));\n\n const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));\n if (_.isEmpty(paths)) return;\n\n writer.write('type Query {\\n');\n\n for (const path of paths) {\n path.generate(context, writer, []);\n this.writeConnector(context, writer, path, selection);\n context.generatedSet.add(path.id);\n }\n\n writer.write('}\\n\\n');\n }\n\n public writeMutations(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void {\n const selectionSet = new Set<string>(selection.map((s) => s.split('>')[0]));\n\n const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));\n if (_.isEmpty(paths)) return;\n\n writer.write('type Mutation {\\n');\n\n for (const path of paths) {\n path.generate(context, writer, []);\n this.writeConnector(context, writer, path, selection);\n context.generatedSet.add(path.id);\n }\n\n writer.write('}\\n\\n');\n }\n\n public writeConnector(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n if (!T.isOp(type)) {\n throw new Error(`expected an operation node, got ${type.id}`);\n }\n\n const op = type;\n const indent = 0;\n let spacing = ' '.repeat(indent + 4);\n writer.write(spacing).write('@connect(\\n');\n\n spacing = ' '.repeat(indent + 6);\n writer.write(spacing).write('source: \"api\"\\n').write(spacing).write('http: ');\n\n this.requestMethod(context, writer, op, selection, indent);\n\n writer.write('\\n').write(spacing).write('selection: \"\"\"\\n');\n\n // truthiness, not _.has — the declared-but-unset field is still an own property. #33\n if (op.resultType) {\n this.writeSelection(context, writer, op.resultType, selection);\n }\n\n writer.write(spacing).write('\"\"\"\\n');\n\n this.errorsWriter.write(context, writer, op, indent);\n\n spacing = ' '.repeat(indent + 4);\n writer.write(spacing).write(')\\n');\n }\n\n private requestMethod(context: OasContext, writer: Writer, op: Op, selection: string[], _indent: number): void {\n const override = context.generateOptions.overrides?.[op.id];\n\n // R5: this op's resolved auth, split by placement. A header lives on @connect only in per-op\n // mode (uniform mode puts it on @source); query auth always lives here (@source has no\n // queryParams). Warnings are owned by the plan — see security.ts.\n const { header: headerAuth, query: queryAuth } = this.security.forOp(op);\n\n const path = this.templatedPath(op, override);\n\n // body is emitted last; its presence is cheap to compute up front. the body block streams\n // through the node tree (Body.select), so unlike query/headers it writes to `writer` directly\n // instead of returning a string. `null` drops the body; a string overrides it; see ROADMAP R9.\n const hasBody = typeof override?.body === 'string' || (override?.body === undefined && !!op.body);\n\n // query & header blocks are pure string-building — they return the block, or null when empty\n const queryBlock = this.queryParamsBlock(context, op, override, queryAuth);\n const headerBlock = this.headersBlock(op, override, headerAuth);\n\n if (!queryBlock && !headerBlock && !hasBody) {\n // nothing but the path: keep the compact single-line form `{ GET: \"/x\"}`\n writer.write(`{ ${op.verb}: \"${path}\"}`);\n return;\n }\n\n // expanded: `http: {` on its own line, the verb and each member at indent 8, the closing `}`\n // aligned under `http:` (indent 6). members are comma-less (GraphQL multiline object style).\n writer.write('{\\n');\n writer.write(' '.repeat(8) + `${op.verb}: \"${path}\"\\n`);\n if (queryBlock) writer.write(queryBlock);\n if (headerBlock) writer.write(headerBlock);\n if (typeof override?.body === 'string') {\n this.writeBodyOverride(writer, override.body);\n } else if (override?.body === undefined && op.body) {\n this.writeBodySelection(context, writer, op.body, selection);\n }\n writer.write(' '.repeat(6) + '}');\n }\n\n // template each {elem} as {$args.<sanitised>} (the arg name), not the raw OAS key. see docs/issues.md #2\n // an override path may already template (`{$args.id}`, `{$config.v}`) — leave `$` segments alone\n private templatedPath(op: Op, override?: RequestOverride): string {\n return (override?.path ?? op.operation.path).replace(/\\{([^}]+)\\}/g, (m, name) =>\n name.startsWith('$') ? m : `{$args.${Naming.genParamName(name)}}`,\n );\n }\n\n // the op's queryParams block (a self-contained string ending in a newline), or null when the op\n // has no query params and no apiKey-in-query auth. `auth` is the op's resolved apiKey-in-query\n // entry (or null) — see requestMethod / security.forOp.\n private queryParamsBlock(\n context: OasContext,\n op: Op,\n override: RequestOverride | undefined,\n auth: NameValue | null,\n ): string | null {\n // we now include all query params, not just required ones. if they are not set,\n // then the connectors will not include them in the request.\n let queryParams = op.params.filter((p: Param) => {\n return p.parameter.in && p.parameter.in.toLowerCase() === 'query';\n });\n\n // Skip optional params if skipOptionalArgs is true\n if (context.generateOptions?.skipOptionalArgs) {\n queryParams = queryParams.filter((p: Param) => p.required);\n }\n\n // e.g. `\"api-version\": $('2024-01')` appended, `\"ids\": ids->joinNotNull(\";\")` replaced\n const entries = this.mergeOverrides(\n queryParams,\n override?.queryParams ?? {},\n (p) => `${Naming.genParamName(p.name)}${this.arrayJoin(p)}`,\n );\n\n // R5 slice 3: apiKey-in-query auth merges into the same query-param object as a JSONSelection\n // sibling outside the `$args { … }` block, so an auth-only op still emits a queryParams block.\n if (entries.length === 0 && !auth) {\n return null;\n }\n\n const lines: string[] = [' queryParams: \"\"\"'];\n // the `$args { … }` block only when there are arg-derived params (skipped for auth-only ops)\n if (entries.length > 0) {\n lines.push(' $args {');\n for (const { name, value } of entries) {\n lines.push(` \"${name}\": ${value}`);\n }\n lines.push(' }');\n }\n // e.g. `\"api_key\": $config.apiKey` — key quoted so non-identifier names like `api-key` are safe\n if (auth) {\n lines.push(` \"${auth.name}\": ${auth.value}`);\n }\n lines.push(' \"\"\"');\n return lines.join('\\n') + '\\n';\n }\n\n // the op's headers block (a self-contained string ending in a newline), or null when there are\n // no headers to send. `auth` is the op's resolved auth header (or null) — see requestMethod.\n private headersBlock(op: Op, override: RequestOverride | undefined, auth: NameValue | null): string | null {\n // OAS `header` params, with user overrides merged in (string replaces, null drops)\n const headers = op.operation.getParameters().filter((p) => p.in && p.in.toLowerCase() === 'header');\n let entries = this.mergeOverrides(headers, override?.headers ?? {}, (p) => this.headerExample(p));\n\n // HTTP header names are case-insensitive: an explicit user override of the same name wins;\n // otherwise the resolved auth replaces any inferred OAS header of that name (so we never emit\n // a real credential alongside a placeholder that differs only in case).\n if (auth) {\n const sameName = (name: string) => name.toLowerCase() === auth.name.toLowerCase();\n const overridden = Object.keys(override?.headers ?? {}).some(sameName);\n if (!overridden) {\n entries = [auth, ...entries.filter((entry) => !sameName(entry.name))];\n }\n }\n\n if (entries.length === 0) {\n return null;\n }\n\n const lines: string[] = [' headers: ['];\n for (const { name, value } of entries) {\n lines.push(` { name: \"${name}\", value: \"${value}\" }`);\n }\n lines.push(' ]');\n return lines.join('\\n') + '\\n';\n }\n\n // merge user overrides over the inferred params: a string replaces the inferred value,\n // null drops the entry, an unknown key is appended. see ROADMAP R8\n private mergeOverrides<T extends { name: string }>(\n inferred: T[],\n overrides: Record<string, string | null>,\n inferredValue: (item: T) => string,\n ): NameValue[] {\n const kept = inferred\n .filter((item) => overrides[item.name] !== null)\n .map((item): NameValue => ({ name: item.name, value: overrides[item.name] ?? inferredValue(item) }));\n\n // overrides whose key isn't an inferred param are appended (null already excluded above)\n const known = new Set(inferred.map((item) => item.name));\n const appended: NameValue[] = [];\n for (const [name, value] of Object.entries(overrides)) {\n if (!known.has(name) && value != null) {\n appended.push({ name, value });\n }\n }\n\n return [...kept, ...appended];\n }\n\n // inferred header value: the example, the example keys, or a placeholder for the user to fill\n private headerExample(p: ParameterObject): string {\n if (p.example != null) {\n return p.example.toString();\n }\n if (p.examples && Object.keys(p.examples).length > 0) {\n return Object.keys(p.examples).join(',');\n }\n return '<placeholder>';\n }\n\n // see Params.arrayJoin (shared with the R6 batch path)\n private arrayJoin(p: Param): string {\n return Params.arrayJoin(p.parameter);\n }\n\n private writeSelection(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n context.indent = 6;\n type.select(context, writer, selection);\n }\n\n // mirrors Body.select formatting, but the user's raw JSONSelection replaces the whole mapping.\n // emits the block at indent 8 (an http-object member), ending with a newline; the caller places\n // the http object's closing brace.\n private writeBodyOverride(writer: Writer, body: string): void {\n const spacing = ' '.repeat(8);\n writer.write(spacing + 'body: \"\"\"\\n');\n for (const line of body.split('\\n')) {\n writer.write(spacing + ' ' + line + '\\n');\n }\n writer.write(spacing + '\"\"\"\\n');\n }\n\n private writeBodySelection(context: OasContext, writer: Writer, body: Body, selection: string[]): void {\n context.indent = 8;\n body.select(context, writer, selection);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"operationWriter.js","sourceRoot":"","sources":["../../../src/oas/io/operationWriter.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { ParameterObject } from 'oas/types';\nimport { OasContext, RequestOverride } from '../oasContext.js';\nimport { OasGen } from '../oasGen.js';\nimport { Body, IType, Op, Param, T } from '../nodes/internal.js';\nimport { Naming } from '../utils/naming.js';\nimport { Params } from '../utils/params.js';\nimport { ErrorsWriter } from './errorsWriter.js';\nimport { Writer } from './writer.js';\nimport { NameValue, SecurityPlan } from './security.js';\nimport { DEFAULT_VERSIONS, meetsMinimum } from '../../versions.js';\nimport { warn } from '../log/trace.js';\n\nexport class OperationWriter {\n private errorsWriter: ErrorsWriter;\n\n constructor(\n private gen: OasGen,\n private security: SecurityPlan,\n ) {\n this.errorsWriter = new ErrorsWriter(gen);\n }\n\n public writeQuery(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void {\n const selectionSet = new Set<string>(selection.map((s) => s.split('>')[0]));\n\n const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));\n if (_.isEmpty(paths)) return;\n\n writer.write('type Query {\\n');\n\n for (const path of paths) {\n path.generate(context, writer, []);\n this.writeConnector(context, writer, path, selection);\n context.generatedSet.add(path.id);\n }\n\n writer.write('}\\n\\n');\n }\n\n public writeMutations(context: OasContext, writer: Writer, collected: Map<string, IType>, selection: string[]): void {\n const selectionSet = new Set<string>(selection.map((s) => s.split('>')[0]));\n\n const paths = Array.from(collected.values()).filter((path) => selectionSet.has(path.id));\n if (_.isEmpty(paths)) return;\n\n writer.write('type Mutation {\\n');\n\n for (const path of paths) {\n path.generate(context, writer, []);\n this.writeConnector(context, writer, path, selection);\n context.generatedSet.add(path.id);\n }\n\n writer.write('}\\n\\n');\n }\n\n public writeConnector(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n if (!T.isOp(type)) {\n throw new Error(`expected an operation node, got ${type.id}`);\n }\n\n const op = type;\n const indent = 0;\n let spacing = ' '.repeat(indent + 4);\n writer.write(spacing).write('@connect(\\n');\n\n spacing = ' '.repeat(indent + 6);\n writer.write(spacing).write('source: \"api\"\\n').write(spacing).write('http: ');\n\n this.requestMethod(context, writer, op, selection, indent);\n\n writer.write('\\n').write(spacing).write('selection: \"\"\"\\n');\n\n // truthiness, not _.has — the declared-but-unset field is still an own property. #33\n if (op.resultType) {\n this.writeSelection(context, writer, op.resultType, selection);\n }\n\n writer.write(spacing).write('\"\"\"\\n');\n\n this.errorsWriter.write(context, writer, op, indent);\n\n spacing = ' '.repeat(indent + 4);\n writer.write(spacing).write(')\\n');\n }\n\n private requestMethod(context: OasContext, writer: Writer, op: Op, selection: string[], _indent: number): void {\n const override = context.generateOptions.overrides?.[op.id];\n\n // R5: this op's resolved auth, split by placement. A header lives on @connect only in per-op\n // mode (uniform mode puts it on @source); query auth always lives here (@source has no\n // queryParams). Warnings are owned by the plan — see security.ts.\n const { header: headerAuth, query: queryAuth } = this.security.forOp(op);\n\n const path = this.templatedPath(op, override);\n\n // body is emitted last; its presence is cheap to compute up front. the body block streams\n // through the node tree (Body.select), so unlike query/headers it writes to `writer` directly\n // instead of returning a string. `null` drops the body; a string overrides it; see ROADMAP R9.\n // C2: `body:` is a connect v0.2+ feature — gate it like errors (R4) and batch (R6). Below the\n // floor, drop the body and warn once per op (do not emit invalid output for an ancient target).\n const wouldEmitBody = typeof override?.body === 'string' || (override?.body === undefined && !!op.body);\n const version = this.gen.options.connectorSpecVersion || DEFAULT_VERSIONS.connectorSpecVersion;\n const bodyAllowed = meetsMinimum(version, 'v0.2');\n if (!bodyAllowed && wouldEmitBody) {\n warn(\n context,\n '[body]',\n `@connect(http.body) requires connect v0.2, but target is ${version} — body not emitted for ${op.verb} ${op.operation.path}`,\n );\n }\n const hasBody = bodyAllowed && wouldEmitBody;\n\n // query & header blocks are pure string-building — they return the block, or null when empty\n const queryBlock = this.queryParamsBlock(context, op, override, queryAuth);\n const headerBlock = this.headersBlock(op, override, headerAuth);\n\n if (!queryBlock && !headerBlock && !hasBody) {\n // nothing but the path: keep the compact single-line form `{ GET: \"/x\"}`\n writer.write(`{ ${op.verb}: \"${path}\"}`);\n return;\n }\n\n // expanded: `http: {` on its own line, the verb and each member at indent 8, the closing `}`\n // aligned under `http:` (indent 6). members are comma-less (GraphQL multiline object style).\n writer.write('{\\n');\n writer.write(' '.repeat(8) + `${op.verb}: \"${path}\"\\n`);\n if (queryBlock) writer.write(queryBlock);\n if (headerBlock) writer.write(headerBlock);\n if (hasBody) {\n if (typeof override?.body === 'string') {\n this.writeBodyOverride(writer, override.body);\n } else if (op.body) {\n this.writeBodySelection(context, writer, op.body, selection);\n }\n }\n writer.write(' '.repeat(6) + '}');\n }\n\n // template each {elem} as {$args.<sanitised>} (the arg name), not the raw OAS key. see docs/issues.md #2\n // an override path may already template (`{$args.id}`, `{$config.v}`) — leave `$` segments alone\n private templatedPath(op: Op, override?: RequestOverride): string {\n return (override?.path ?? op.operation.path).replace(/\\{([^}]+)\\}/g, (m, name) =>\n name.startsWith('$') ? m : `{$args.${Naming.genParamName(name)}}`,\n );\n }\n\n // the op's queryParams block (a self-contained string ending in a newline), or null when the op\n // has no query params and no apiKey-in-query auth. `auth` is the op's resolved apiKey-in-query\n // entry (or null) — see requestMethod / security.forOp.\n private queryParamsBlock(\n context: OasContext,\n op: Op,\n override: RequestOverride | undefined,\n auth: NameValue | null,\n ): string | null {\n // we now include all query params, not just required ones. if they are not set,\n // then the connectors will not include them in the request.\n let queryParams = op.params.filter((p: Param) => {\n return p.parameter.in && p.parameter.in.toLowerCase() === 'query';\n });\n\n // Skip optional params if skipOptionalArgs is true\n if (context.generateOptions?.skipOptionalArgs) {\n queryParams = queryParams.filter((p: Param) => p.required);\n }\n\n // e.g. `\"api-version\": $('2024-01')` appended, `\"ids\": ids->joinNotNull(\";\")` replaced\n const entries = this.mergeOverrides(\n queryParams,\n override?.queryParams ?? {},\n (p) => `${Naming.genParamName(p.name)}${this.arrayJoin(p)}`,\n );\n\n // R5 slice 3: apiKey-in-query auth merges into the same query-param object as a JSONSelection\n // sibling outside the `$args { … }` block, so an auth-only op still emits a queryParams block.\n if (entries.length === 0 && !auth) {\n return null;\n }\n\n const lines: string[] = [' queryParams: \"\"\"'];\n // the `$args { … }` block only when there are arg-derived params (skipped for auth-only ops)\n if (entries.length > 0) {\n lines.push(' $args {');\n for (const { name, value } of entries) {\n lines.push(` \"${name}\": ${value}`);\n }\n lines.push(' }');\n }\n // e.g. `\"api_key\": $config.apiKey` — key quoted so non-identifier names like `api-key` are safe\n if (auth) {\n lines.push(` \"${auth.name}\": ${auth.value}`);\n }\n lines.push(' \"\"\"');\n return lines.join('\\n') + '\\n';\n }\n\n // the op's headers block (a self-contained string ending in a newline), or null when there are\n // no headers to send. `auth` is the op's resolved auth header (or null) — see requestMethod.\n private headersBlock(op: Op, override: RequestOverride | undefined, auth: NameValue | null): string | null {\n // OAS `header` params, with user overrides merged in (string replaces, null drops)\n const headers = op.operation.getParameters().filter((p) => p.in && p.in.toLowerCase() === 'header');\n let entries = this.mergeOverrides(headers, override?.headers ?? {}, (p) => this.headerExample(p));\n\n // HTTP header names are case-insensitive: an explicit user override of the same name wins;\n // otherwise the resolved auth replaces any inferred OAS header of that name (so we never emit\n // a real credential alongside a placeholder that differs only in case).\n if (auth) {\n const sameName = (name: string) => name.toLowerCase() === auth.name.toLowerCase();\n const overridden = Object.keys(override?.headers ?? {}).some(sameName);\n if (!overridden) {\n entries = [auth, ...entries.filter((entry) => !sameName(entry.name))];\n }\n }\n\n if (entries.length === 0) {\n return null;\n }\n\n const lines: string[] = [' headers: ['];\n for (const { name, value } of entries) {\n lines.push(` { name: \"${name}\", value: \"${value}\" }`);\n }\n lines.push(' ]');\n return lines.join('\\n') + '\\n';\n }\n\n // merge user overrides over the inferred params: a string replaces the inferred value,\n // null drops the entry, an unknown key is appended. see ROADMAP R8\n private mergeOverrides<T extends { name: string }>(\n inferred: T[],\n overrides: Record<string, string | null>,\n inferredValue: (item: T) => string,\n ): NameValue[] {\n const kept = inferred\n .filter((item) => overrides[item.name] !== null)\n .map((item): NameValue => ({ name: item.name, value: overrides[item.name] ?? inferredValue(item) }));\n\n // overrides whose key isn't an inferred param are appended (null already excluded above)\n const known = new Set(inferred.map((item) => item.name));\n const appended: NameValue[] = [];\n for (const [name, value] of Object.entries(overrides)) {\n if (!known.has(name) && value != null) {\n appended.push({ name, value });\n }\n }\n\n return [...kept, ...appended];\n }\n\n // inferred header value: the example, the example keys, or a placeholder for the user to fill\n private headerExample(p: ParameterObject): string {\n if (p.example != null) {\n return p.example.toString();\n }\n if (p.examples && Object.keys(p.examples).length > 0) {\n return Object.keys(p.examples).join(',');\n }\n return '<placeholder>';\n }\n\n // see Params.arrayJoin (shared with the R6 batch path)\n private arrayJoin(p: Param): string {\n return Params.arrayJoin(p.parameter);\n }\n\n private writeSelection(context: OasContext, writer: Writer, type: IType, selection: string[]): void {\n context.indent = 6;\n type.select(context, writer, selection);\n }\n\n // mirrors Body.select formatting, but the user's raw JSONSelection replaces the whole mapping.\n // emits the block at indent 8 (an http-object member), ending with a newline; the caller places\n // the http object's closing brace.\n private writeBodyOverride(writer: Writer, body: string): void {\n const spacing = ' '.repeat(8);\n writer.write(spacing + 'body: \"\"\"\\n');\n for (const line of body.split('\\n')) {\n writer.write(spacing + ' ' + line + '\\n');\n }\n writer.write(spacing + '\"\"\"\\n');\n }\n\n private writeBodySelection(context: OasContext, writer: Writer, body: Body, selection: string[]): void {\n context.indent = 8;\n body.select(context, writer, selection);\n }\n}\n"]}
|
|
@@ -14,11 +14,17 @@ export interface NameValue {
|
|
|
14
14
|
* each `@connect`. Query auth always lives per-`@connect` — `SourceHTTP` has no `queryParams`.
|
|
15
15
|
*/
|
|
16
16
|
export declare class SecurityPlan {
|
|
17
|
+
private readonly skipAuth;
|
|
17
18
|
private readonly schemes;
|
|
18
19
|
private readonly globalReq;
|
|
19
20
|
private readonly perOpMode;
|
|
21
|
+
private readonly globalWarningBodies;
|
|
22
|
+
private globalWarningsEmitted;
|
|
20
23
|
private constructor();
|
|
21
|
-
static from(api: Oas
|
|
24
|
+
static from(api: Oas, opts?: {
|
|
25
|
+
skipAuth?: boolean;
|
|
26
|
+
}): SecurityPlan;
|
|
27
|
+
private emitGlobalWarningsOnce;
|
|
22
28
|
/** The `@source`-level auth header literal (uniform mode + header kind), or null. */
|
|
23
29
|
sourceHeader(): string | null;
|
|
24
30
|
/**
|
|
@@ -27,7 +33,9 @@ export declare class SecurityPlan {
|
|
|
27
33
|
* - `query`: the query entry, always (SourceHTTP has no queryParams), else null
|
|
28
34
|
*
|
|
29
35
|
* Per-op warnings are emitted here with op context; in uniform mode the global warnings were
|
|
30
|
-
* already emitted once by sourceHeader.
|
|
36
|
+
* already emitted once by sourceHeader. C3: in per-op mode, the global's dropped-scheme
|
|
37
|
+
* warnings are emitted exactly once (via emitGlobalWarningsOnce) — only genuinely op-specific
|
|
38
|
+
* warnings carry the `(operation …)` suffix.
|
|
31
39
|
*/
|
|
32
40
|
forOp(op: Op): {
|
|
33
41
|
header: NameValue | null;
|
package/dist/oas/io/security.js
CHANGED
|
@@ -99,24 +99,45 @@ function hasPerOperationSecurity(def) {
|
|
|
99
99
|
* each `@connect`. Query auth always lives per-`@connect` — `SourceHTTP` has no `queryParams`.
|
|
100
100
|
*/
|
|
101
101
|
export class SecurityPlan {
|
|
102
|
+
skipAuth;
|
|
102
103
|
schemes;
|
|
103
104
|
globalReq;
|
|
104
105
|
perOpMode;
|
|
105
|
-
|
|
106
|
+
// C3: the global requirement's dropped-scheme warnings, pre-resolved once. In per-op mode every
|
|
107
|
+
// inheriting op would re-fire them otherwise; this set identifies them so forOp can skip what's
|
|
108
|
+
// already been emitted (once) and only surface genuinely op-specific warnings with op context.
|
|
109
|
+
globalWarningBodies;
|
|
110
|
+
globalWarningsEmitted = false;
|
|
111
|
+
constructor(schemes, globalReq, perOpMode, skipAuth = false) {
|
|
112
|
+
this.skipAuth = skipAuth;
|
|
106
113
|
this.schemes = schemes;
|
|
107
114
|
this.globalReq = globalReq;
|
|
108
115
|
this.perOpMode = perOpMode;
|
|
116
|
+
this.globalWarningBodies = new Set(globalReq ? resolveAuth(globalReq, schemes).warnings : []);
|
|
109
117
|
}
|
|
110
|
-
static from(api) {
|
|
118
|
+
static from(api, opts) {
|
|
111
119
|
const def = api.getDefinition();
|
|
112
120
|
// oas-normalize usually up-converts Swagger 2.0 → components.securitySchemes; the
|
|
113
121
|
// securityDefinitions fallback (same shape) is a safety net. refs are dereferenced by oas,
|
|
114
122
|
// so the shape is a plain SecuritySchemesObject.
|
|
115
123
|
const schemes = (def.components?.securitySchemes ?? def.securityDefinitions ?? {});
|
|
116
|
-
return new SecurityPlan(schemes, def.security, hasPerOperationSecurity(def));
|
|
124
|
+
return new SecurityPlan(schemes, def.security, hasPerOperationSecurity(def), opts?.skipAuth ?? false);
|
|
125
|
+
}
|
|
126
|
+
// C3: emit the global's dropped-scheme warnings exactly once per generation. Called from
|
|
127
|
+
// sourceHeader (uniform mode) and the first forOp (per-op mode) — both run before the warnings
|
|
128
|
+
// would otherwise leak per-op. Idempotent via `globalWarningsEmitted`.
|
|
129
|
+
emitGlobalWarningsOnce() {
|
|
130
|
+
if (this.globalWarningsEmitted)
|
|
131
|
+
return;
|
|
132
|
+
this.globalWarningsEmitted = true;
|
|
133
|
+
for (const body of this.globalWarningBodies)
|
|
134
|
+
console.warn(body);
|
|
117
135
|
}
|
|
118
136
|
/** The `@source`-level auth header literal (uniform mode + header kind), or null. */
|
|
119
137
|
sourceHeader() {
|
|
138
|
+
// --skip-auth: emit no auth anywhere — no header on @source (and forOp returns nothing too)
|
|
139
|
+
if (this.skipAuth)
|
|
140
|
+
return null;
|
|
120
141
|
// per-op mode: each @connect carries its own auth — nothing on @source
|
|
121
142
|
if (this.perOpMode)
|
|
122
143
|
return null;
|
|
@@ -124,9 +145,10 @@ export class SecurityPlan {
|
|
|
124
145
|
if (!this.globalReq || this.globalReq.length === 0)
|
|
125
146
|
return null;
|
|
126
147
|
const { auth, warnings } = resolveAuth(this.globalReq, this.schemes);
|
|
127
|
-
// surface
|
|
128
|
-
|
|
129
|
-
|
|
148
|
+
// C3: surface the global's dropped-scheme warnings exactly once (uniform mode; per-op mode
|
|
149
|
+
// emits them from the first forOp).
|
|
150
|
+
this.emitGlobalWarningsOnce();
|
|
151
|
+
void warnings; // already accounted for via globalWarningBodies
|
|
130
152
|
// @source carries only header auth; query auth lives on each @connect (SourceHTTP has no
|
|
131
153
|
// queryParams) and is returned by forOp — emit nothing here.
|
|
132
154
|
if (auth?.kind !== 'header') {
|
|
@@ -144,16 +166,27 @@ export class SecurityPlan {
|
|
|
144
166
|
* - `query`: the query entry, always (SourceHTTP has no queryParams), else null
|
|
145
167
|
*
|
|
146
168
|
* Per-op warnings are emitted here with op context; in uniform mode the global warnings were
|
|
147
|
-
* already emitted once by sourceHeader.
|
|
169
|
+
* already emitted once by sourceHeader. C3: in per-op mode, the global's dropped-scheme
|
|
170
|
+
* warnings are emitted exactly once (via emitGlobalWarningsOnce) — only genuinely op-specific
|
|
171
|
+
* warnings carry the `(operation …)` suffix.
|
|
148
172
|
*/
|
|
149
173
|
forOp(op) {
|
|
174
|
+
// --skip-auth: no per-@connect auth either (companion to sourceHeader's skip)
|
|
175
|
+
if (this.skipAuth)
|
|
176
|
+
return { header: null, query: null };
|
|
150
177
|
// `??` not `||`: an explicit `security: []` (public) must NOT fall back to the global.
|
|
151
178
|
const effective = op.operation.schema.security ?? this.globalReq;
|
|
152
179
|
const { auth, warnings } = resolveAuth(effective, this.schemes);
|
|
153
180
|
if (this.perOpMode) {
|
|
181
|
+
// surface the global's dropped-scheme warnings exactly once (idempotent), then warn only
|
|
182
|
+
// about op-specific drops with the op's location attached.
|
|
183
|
+
this.emitGlobalWarningsOnce();
|
|
154
184
|
const where = `${op.verb} ${op.operation.path}`;
|
|
155
|
-
for (const w of warnings)
|
|
156
|
-
|
|
185
|
+
for (const w of warnings) {
|
|
186
|
+
if (!this.globalWarningBodies.has(w)) {
|
|
187
|
+
console.warn(`${w} (operation ${where})`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
157
190
|
}
|
|
158
191
|
return {
|
|
159
192
|
header: this.perOpMode && auth?.kind === 'header' ? auth : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/oas/io/security.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport type Oas from 'oas';\nimport { SecurityRequirementObject, SecuritySchemeObject, SecuritySchemesObject } from 'oas/types';\nimport type { Op } from '../nodes/internal.js';\n\n// A connector name/value entry: a header (`{ name, value }`) or a query param (`\"name\": value`).\n// Also the shape mergeOverrides produces for inferred/overridden header & query params.\nexport interface NameValue {\n name: string;\n value: string;\n}\n\n// One resolved auth credential: a NameValue plus where it goes. Header values carry `{}`\n// interpolation (`Bearer {$config.token}`); a query value is a raw JSONSelection (`$config.apiKey`).\ninterface AuthEntry extends NameValue {\n kind: 'header' | 'query';\n}\n\n// The HTTP methods the generator actually emits (see OasGen.isSupported). Scanning only these for\n// the per-op-mode switch keeps the decision consistent with what gets written — a `security` on an\n// un-emitted HEAD/OPTIONS op no longer flips the whole spec into per-op mode.\nconst SUPPORTED_METHODS: readonly string[] = ['get', 'post', 'put', 'patch', 'delete'];\n\n/**\n * Map one OAS security scheme to its connector auth entry, or null when it makes none.\n * Header values carry `{}` interpolation; a query value is a raw JSONSelection (no braces) because\n * it lands in a `queryParams: \"\"\"…\"\"\"` block, which is already a JSONSelection context.\n */\nfunction mapSchemeToAuth(scheme: SecuritySchemeObject): AuthEntry | null {\n switch (scheme.type) {\n case 'apiKey':\n // apiKey in a header, e.g. `{ type: apiKey, in: header, name: X-API-Key }`\n if (scheme.in === 'header' && scheme.name) {\n return { kind: 'header', name: scheme.name, value: '{$config.apiKey}' };\n }\n // apiKey in the query string, e.g. `{ type: apiKey, in: query, name: api_key }`\n if (scheme.in === 'query' && scheme.name) {\n return { kind: 'query', name: scheme.name, value: '$config.apiKey' };\n }\n return null; // cookie is deferred and warned about, not emitted\n case 'http':\n if (scheme.scheme === 'bearer') {\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n }\n if (scheme.scheme === 'basic') {\n return { kind: 'header', name: 'Authorization', value: 'Basic {$config.token}' };\n }\n return null;\n case 'oauth2':\n case 'openIdConnect':\n // both flows ultimately send a bearer token\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n default:\n return null;\n }\n}\n\n/** The warning text for a referenced scheme we did not emit (undefined, deferred, or not the winner). */\nfunction droppedSchemeWarning(name: string, scheme: SecuritySchemeObject | undefined): string {\n if (!scheme) {\n return `[security] scheme \"${name}\" is referenced but not defined; skipped.`;\n }\n if (scheme.type === 'apiKey' && scheme.in === 'cookie') {\n return `[security] scheme \"${name}\" is apiKey in cookie — not emitted (cookie auth deferred).`;\n }\n return `[security] scheme \"${name}\" (${scheme.type}) has no supported connector mapping; skipped.`;\n}\n\n/**\n * Resolve a security requirement to the single auth entry the connector should send.\n *\n * A requirement is an OR of scheme-name sets (`[{ a: [] }, { b: [] }]` = \"a OR b\"). We flatten to\n * names in order and pick the FIRST that maps to an entry. A later viable alternative is a\n * legitimate OR choice, not a failure, so it stays silent; only genuinely unresolvable names —\n * undefined, deferred (cookie), or an unmappable scheme — are reported in `warnings`. An absent or\n * empty (`[]`, public) requirement yields no entry and no warnings.\n */\nfunction resolveAuth(\n securityRequirements: SecurityRequirementObject[] | undefined,\n schemes: SecuritySchemesObject,\n): { auth: AuthEntry | null; warnings: string[] } {\n let auth: AuthEntry | null = null;\n const warnings: string[] = [];\n\n for (const name of securityRequirements?.flatMap((requirement) => Object.keys(requirement)) ?? []) {\n const scheme = schemes[name];\n const entry = scheme ? mapSchemeToAuth(scheme) : null;\n\n if (entry) {\n // first scheme that maps wins; a later viable alternative is a silent OR choice\n if (!auth) auth = entry;\n } else {\n // genuinely unresolvable: undefined scheme, cookie, or no supported mapping\n warnings.push(droppedSchemeWarning(name, scheme));\n }\n }\n\n return { auth, warnings };\n}\n\n/** True when ANY emitted operation declares its own `security` (empty `[]` or non-empty). */\nfunction hasPerOperationSecurity(def: ReturnType<Oas['getDefinition']>): boolean {\n const paths = def.paths ?? {};\n for (const pathName of Object.keys(paths)) {\n const path = paths[pathName];\n if (!path) continue;\n for (const method of SUPPORTED_METHODS) {\n // own property (not inherited) — an explicit `security: []` is still a declaration\n if (_.has(path, [method, 'security'])) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Resolved security for one generation pass: computed once from the parsed spec, then queried for\n * `@source` (sourceHeader) and per-`@connect` (forOp). Owning all auth warnings here removes the old\n * uniform-vs-per-op \"who warns when\" coordination between SchemaWriter and OperationWriter.\n *\n * Mode switch: when any emitted op declares its own `security`, a shared `@source` header is unsafe\n * (a public op would leak it; a differently-named override would send both), so header auth moves to\n * each `@connect`. Query auth always lives per-`@connect` — `SourceHTTP` has no `queryParams`.\n */\nexport class SecurityPlan {\n private readonly schemes: SecuritySchemesObject;\n private readonly globalReq: SecurityRequirementObject[] | undefined;\n private readonly perOpMode: boolean;\n\n private constructor(\n schemes: SecuritySchemesObject,\n globalReq: SecurityRequirementObject[] | undefined,\n perOpMode: boolean,\n ) {\n this.schemes = schemes;\n this.globalReq = globalReq;\n this.perOpMode = perOpMode;\n }\n\n static from(api: Oas): SecurityPlan {\n const def = api.getDefinition();\n // oas-normalize usually up-converts Swagger 2.0 → components.securitySchemes; the\n // securityDefinitions fallback (same shape) is a safety net. refs are dereferenced by oas,\n // so the shape is a plain SecuritySchemesObject.\n const schemes = (def.components?.securitySchemes ?? def.securityDefinitions ?? {}) as SecuritySchemesObject;\n return new SecurityPlan(schemes, def.security, hasPerOperationSecurity(def));\n }\n\n /** The `@source`-level auth header literal (uniform mode + header kind), or null. */\n sourceHeader(): string | null {\n // per-op mode: each @connect carries its own auth — nothing on @source\n if (this.perOpMode) return null;\n // no global requirement -> keep the headerless @source byte-for-byte\n if (!this.globalReq || this.globalReq.length === 0) return null;\n\n const { auth, warnings } = resolveAuth(this.globalReq, this.schemes);\n // surface every dropped scheme loudly, exactly once\n for (const w of warnings) console.warn(w);\n\n // @source carries only header auth; query auth lives on each @connect (SourceHTTP has no\n // queryParams) and is returned by forOp — emit nothing here.\n if (auth?.kind !== 'header') {\n if (!auth) {\n const names = this.globalReq.flatMap((req) => Object.keys(req));\n console.warn(\n `[security] global security requirement (${names.join(', ')}) maps to no header-producing scheme; no auth header emitted on @source.`,\n );\n }\n return null;\n }\n\n return `{ name: \"${auth.name}\", value: \"${auth.value}\" }`;\n }\n\n /**\n * This op's resolved auth, split by placement.\n * - `header`: the header entry in per-op mode (uniform mode puts it on `@source`), else null\n * - `query`: the query entry, always (SourceHTTP has no queryParams), else null\n *\n * Per-op warnings are emitted here with op context; in uniform mode the global warnings were\n * already emitted once by sourceHeader.\n */\n forOp(op: Op): { header: NameValue | null; query: NameValue | null } {\n // `??` not `||`: an explicit `security: []` (public) must NOT fall back to the global.\n const effective = op.operation.schema.security ?? this.globalReq;\n const { auth, warnings } = resolveAuth(effective, this.schemes);\n\n if (this.perOpMode) {\n const where = `${op.verb} ${op.operation.path}`;\n for (const w of warnings) console.warn(`${w} (operation ${where})`);\n }\n\n return {\n header: this.perOpMode && auth?.kind === 'header' ? auth : null,\n query: auth?.kind === 'query' ? auth : null,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/oas/io/security.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport type Oas from 'oas';\nimport { SecurityRequirementObject, SecuritySchemeObject, SecuritySchemesObject } from 'oas/types';\nimport type { Op } from '../nodes/internal.js';\n\n// A connector name/value entry: a header (`{ name, value }`) or a query param (`\"name\": value`).\n// Also the shape mergeOverrides produces for inferred/overridden header & query params.\nexport interface NameValue {\n name: string;\n value: string;\n}\n\n// One resolved auth credential: a NameValue plus where it goes. Header values carry `{}`\n// interpolation (`Bearer {$config.token}`); a query value is a raw JSONSelection (`$config.apiKey`).\ninterface AuthEntry extends NameValue {\n kind: 'header' | 'query';\n}\n\n// The HTTP methods the generator actually emits (see OasGen.isSupported). Scanning only these for\n// the per-op-mode switch keeps the decision consistent with what gets written — a `security` on an\n// un-emitted HEAD/OPTIONS op no longer flips the whole spec into per-op mode.\nconst SUPPORTED_METHODS: readonly string[] = ['get', 'post', 'put', 'patch', 'delete'];\n\n/**\n * Map one OAS security scheme to its connector auth entry, or null when it makes none.\n * Header values carry `{}` interpolation; a query value is a raw JSONSelection (no braces) because\n * it lands in a `queryParams: \"\"\"…\"\"\"` block, which is already a JSONSelection context.\n */\nfunction mapSchemeToAuth(scheme: SecuritySchemeObject): AuthEntry | null {\n switch (scheme.type) {\n case 'apiKey':\n // apiKey in a header, e.g. `{ type: apiKey, in: header, name: X-API-Key }`\n if (scheme.in === 'header' && scheme.name) {\n return { kind: 'header', name: scheme.name, value: '{$config.apiKey}' };\n }\n // apiKey in the query string, e.g. `{ type: apiKey, in: query, name: api_key }`\n if (scheme.in === 'query' && scheme.name) {\n return { kind: 'query', name: scheme.name, value: '$config.apiKey' };\n }\n return null; // cookie is deferred and warned about, not emitted\n case 'http':\n if (scheme.scheme === 'bearer') {\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n }\n if (scheme.scheme === 'basic') {\n return { kind: 'header', name: 'Authorization', value: 'Basic {$config.token}' };\n }\n return null;\n case 'oauth2':\n case 'openIdConnect':\n // both flows ultimately send a bearer token\n return { kind: 'header', name: 'Authorization', value: 'Bearer {$config.token}' };\n default:\n return null;\n }\n}\n\n/** The warning text for a referenced scheme we did not emit (undefined, deferred, or not the winner). */\nfunction droppedSchemeWarning(name: string, scheme: SecuritySchemeObject | undefined): string {\n if (!scheme) {\n return `[security] scheme \"${name}\" is referenced but not defined; skipped.`;\n }\n if (scheme.type === 'apiKey' && scheme.in === 'cookie') {\n return `[security] scheme \"${name}\" is apiKey in cookie — not emitted (cookie auth deferred).`;\n }\n return `[security] scheme \"${name}\" (${scheme.type}) has no supported connector mapping; skipped.`;\n}\n\n/**\n * Resolve a security requirement to the single auth entry the connector should send.\n *\n * A requirement is an OR of scheme-name sets (`[{ a: [] }, { b: [] }]` = \"a OR b\"). We flatten to\n * names in order and pick the FIRST that maps to an entry. A later viable alternative is a\n * legitimate OR choice, not a failure, so it stays silent; only genuinely unresolvable names —\n * undefined, deferred (cookie), or an unmappable scheme — are reported in `warnings`. An absent or\n * empty (`[]`, public) requirement yields no entry and no warnings.\n */\nfunction resolveAuth(\n securityRequirements: SecurityRequirementObject[] | undefined,\n schemes: SecuritySchemesObject,\n): { auth: AuthEntry | null; warnings: string[] } {\n let auth: AuthEntry | null = null;\n const warnings: string[] = [];\n\n for (const name of securityRequirements?.flatMap((requirement) => Object.keys(requirement)) ?? []) {\n const scheme = schemes[name];\n const entry = scheme ? mapSchemeToAuth(scheme) : null;\n\n if (entry) {\n // first scheme that maps wins; a later viable alternative is a silent OR choice\n if (!auth) auth = entry;\n } else {\n // genuinely unresolvable: undefined scheme, cookie, or no supported mapping\n warnings.push(droppedSchemeWarning(name, scheme));\n }\n }\n\n return { auth, warnings };\n}\n\n/** True when ANY emitted operation declares its own `security` (empty `[]` or non-empty). */\nfunction hasPerOperationSecurity(def: ReturnType<Oas['getDefinition']>): boolean {\n const paths = def.paths ?? {};\n for (const pathName of Object.keys(paths)) {\n const path = paths[pathName];\n if (!path) continue;\n for (const method of SUPPORTED_METHODS) {\n // own property (not inherited) — an explicit `security: []` is still a declaration\n if (_.has(path, [method, 'security'])) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Resolved security for one generation pass: computed once from the parsed spec, then queried for\n * `@source` (sourceHeader) and per-`@connect` (forOp). Owning all auth warnings here removes the old\n * uniform-vs-per-op \"who warns when\" coordination between SchemaWriter and OperationWriter.\n *\n * Mode switch: when any emitted op declares its own `security`, a shared `@source` header is unsafe\n * (a public op would leak it; a differently-named override would send both), so header auth moves to\n * each `@connect`. Query auth always lives per-`@connect` — `SourceHTTP` has no `queryParams`.\n */\nexport class SecurityPlan {\n private readonly schemes: SecuritySchemesObject;\n private readonly globalReq: SecurityRequirementObject[] | undefined;\n private readonly perOpMode: boolean;\n // C3: the global requirement's dropped-scheme warnings, pre-resolved once. In per-op mode every\n // inheriting op would re-fire them otherwise; this set identifies them so forOp can skip what's\n // already been emitted (once) and only surface genuinely op-specific warnings with op context.\n private readonly globalWarningBodies: Set<string>;\n private globalWarningsEmitted = false;\n\n private constructor(\n schemes: SecuritySchemesObject,\n globalReq: SecurityRequirementObject[] | undefined,\n perOpMode: boolean,\n private readonly skipAuth: boolean = false,\n ) {\n this.schemes = schemes;\n this.globalReq = globalReq;\n this.perOpMode = perOpMode;\n this.globalWarningBodies = new Set(\n globalReq ? resolveAuth(globalReq, schemes).warnings : [],\n );\n }\n\n static from(api: Oas, opts?: { skipAuth?: boolean }): SecurityPlan {\n const def = api.getDefinition();\n // oas-normalize usually up-converts Swagger 2.0 → components.securitySchemes; the\n // securityDefinitions fallback (same shape) is a safety net. refs are dereferenced by oas,\n // so the shape is a plain SecuritySchemesObject.\n const schemes = (def.components?.securitySchemes ?? def.securityDefinitions ?? {}) as SecuritySchemesObject;\n return new SecurityPlan(schemes, def.security, hasPerOperationSecurity(def), opts?.skipAuth ?? false);\n }\n\n // C3: emit the global's dropped-scheme warnings exactly once per generation. Called from\n // sourceHeader (uniform mode) and the first forOp (per-op mode) — both run before the warnings\n // would otherwise leak per-op. Idempotent via `globalWarningsEmitted`.\n private emitGlobalWarningsOnce(): void {\n if (this.globalWarningsEmitted) return;\n this.globalWarningsEmitted = true;\n for (const body of this.globalWarningBodies) console.warn(body);\n }\n\n /** The `@source`-level auth header literal (uniform mode + header kind), or null. */\n sourceHeader(): string | null {\n // --skip-auth: emit no auth anywhere — no header on @source (and forOp returns nothing too)\n if (this.skipAuth) return null;\n // per-op mode: each @connect carries its own auth — nothing on @source\n if (this.perOpMode) return null;\n // no global requirement -> keep the headerless @source byte-for-byte\n if (!this.globalReq || this.globalReq.length === 0) return null;\n\n const { auth, warnings } = resolveAuth(this.globalReq, this.schemes);\n // C3: surface the global's dropped-scheme warnings exactly once (uniform mode; per-op mode\n // emits them from the first forOp).\n this.emitGlobalWarningsOnce();\n void warnings; // already accounted for via globalWarningBodies\n\n // @source carries only header auth; query auth lives on each @connect (SourceHTTP has no\n // queryParams) and is returned by forOp — emit nothing here.\n if (auth?.kind !== 'header') {\n if (!auth) {\n const names = this.globalReq.flatMap((req) => Object.keys(req));\n console.warn(\n `[security] global security requirement (${names.join(', ')}) maps to no header-producing scheme; no auth header emitted on @source.`,\n );\n }\n return null;\n }\n\n return `{ name: \"${auth.name}\", value: \"${auth.value}\" }`;\n }\n\n /**\n * This op's resolved auth, split by placement.\n * - `header`: the header entry in per-op mode (uniform mode puts it on `@source`), else null\n * - `query`: the query entry, always (SourceHTTP has no queryParams), else null\n *\n * Per-op warnings are emitted here with op context; in uniform mode the global warnings were\n * already emitted once by sourceHeader. C3: in per-op mode, the global's dropped-scheme\n * warnings are emitted exactly once (via emitGlobalWarningsOnce) — only genuinely op-specific\n * warnings carry the `(operation …)` suffix.\n */\n forOp(op: Op): { header: NameValue | null; query: NameValue | null } {\n // --skip-auth: no per-@connect auth either (companion to sourceHeader's skip)\n if (this.skipAuth) return { header: null, query: null };\n // `??` not `||`: an explicit `security: []` (public) must NOT fall back to the global.\n const effective = op.operation.schema.security ?? this.globalReq;\n const { auth, warnings } = resolveAuth(effective, this.schemes);\n\n if (this.perOpMode) {\n // surface the global's dropped-scheme warnings exactly once (idempotent), then warn only\n // about op-specific drops with the op's location attached.\n this.emitGlobalWarningsOnce();\n const where = `${op.verb} ${op.operation.path}`;\n for (const w of warnings) {\n if (!this.globalWarningBodies.has(w)) {\n console.warn(`${w} (operation ${where})`);\n }\n }\n }\n\n return {\n header: this.perOpMode && auth?.kind === 'header' ? auth : null,\n query: auth?.kind === 'query' ? auth : null,\n };\n }\n}\n"]}
|
package/dist/oas/io/writer.js
CHANGED
|
@@ -19,7 +19,7 @@ export class Writer {
|
|
|
19
19
|
// resolve the spec's security once (schemes, global requirement, per-op mode) and share it —
|
|
20
20
|
// schemaWriter (@source) and operationWriter (per-@connect) both query it instead of re-walking
|
|
21
21
|
// the whole spec per operation.
|
|
22
|
-
const security = SecurityPlan.from(gen.parser);
|
|
22
|
+
const security = SecurityPlan.from(gen.parser, { skipAuth: gen.options.skipAuth });
|
|
23
23
|
this.schemaWriter = new SchemaWriter(gen, security);
|
|
24
24
|
this.operationWriter = new OperationWriter(gen, security);
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/oas/io/writer.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,MAAM,OAAO,MAAM;IAKE;IAJX,YAAY,CAAe;IAC3B,eAAe,CAAkB;IAClC,MAAM,CAAW;IAExB,YAAmB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;QAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,6FAA6F;QAC7F,gGAAgG;QAChG,gCAAgC;QAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/oas/io/writer.ts"],"names":[],"mappings":"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","sourcesContent":["import { OasGen } from '../oasGen.js';\nimport { IType, T } from '../nodes/internal.js';\nimport { inferEntityResolvers } from '../nodes/entity.js';\nimport { applyBatchResolvers } from '../nodes/batch.js';\nimport { promoteInterfaces } from '../nodes/interfacePromotion.js';\nimport { OperationWriter } from './operationWriter.js';\nimport { SchemaWriter } from './schemaWriter.js';\nimport { SecurityPlan } from './security.js';\nimport { TypesCollector } from '../generator/typesCollector.js';\nimport { Naming } from '../utils/naming.js';\nimport _ from 'lodash';\n\nexport class Writer {\n private schemaWriter: SchemaWriter;\n private operationWriter: OperationWriter;\n public buffer: string[];\n\n constructor(public gen: OasGen) {\n this.buffer = [];\n // resolve the spec's security once (schemes, global requirement, per-op mode) and share it —\n // schemaWriter (@source) and operationWriter (per-@connect) both query it instead of re-walking\n // the whole spec per operation.\n const security = SecurityPlan.from(gen.parser, { skipAuth: gen.options.skipAuth });\n this.schemaWriter = new SchemaWriter(gen, security);\n this.operationWriter = new OperationWriter(gen, security);\n }\n\n public write(input: string): Writer {\n this.buffer.push(input);\n return this;\n }\n\n public flush(): string {\n return this.buffer.join('');\n }\n\n public generate(paths: string[]): string[] {\n const collector = new TypesCollector(this.gen);\n collector.collect(paths);\n\n return this.generateWith(collector.types, collector.expanded);\n }\n\n public generateWith(types: Map<string, IType>, selection: string[]) {\n this.writeSchema(this, types, selection);\n return selection;\n }\n\n public writeSchema(writer: Writer, types: Map<string, IType>, selection: string[]): void {\n const context = this.gen.context!;\n const generatedSet = context.generatedSet;\n\n // make our own copy of the refCount, so it doesn't get modified by the writing process\n const refCount = _.cloneDeep(context.refCount);\n\n // Attach entity resolvers onto the (single, canonical) collected type instances the\n // loop below generates, so each entity type can emit @key + its type-level\n // @connect/$this resolver. Resets first, so it's a no-op when the flag is off.\n inferEntityResolvers(context, this.gen, types, selection);\n\n // R6: add batch resolvers (needs the R1 @key above) when a --batch file was given.\n applyBatchResolvers(context, this.gen, types);\n\n // R2: promote discriminated oneOf-with-shared-allOf-base to a GraphQL interface (id-neutral;\n // no-op unless consolidateUnions is off and a qualifying union exists). Same `types` map.\n promoteInterfaces(context, this.gen, types, selection);\n\n this.schemaWriter.writeDirectives(writer);\n this.schemaWriter.writeJSONScalar(writer);\n\n types.forEach((type: IType) => {\n const count = refCount.get(type.name) !== undefined ? refCount.get(type.name)! : Infinity;\n\n // a `$ref` is one shared type but can reach here under two ids — `obj:type:X` (an array item)\n // and `comp:type:X` (a single-member `allOf`). e.g. `AgencyMini`, splitting at `ProgramNormal`:\n // …>prop:array:#program>obj:type:#/c/s/ProgramNormal>prop:array:#agencies>obj:type:#/c/s/AgencyMini\n // …>prop:array:#program>obj:type:#/c/s/ProgramNormal>prop:array:#mission_patches>obj:type:#/c/s/MissionPatch>prop:comp:agency>comp:type:#/c/s/AgencyMini\n // the two ids differ, so the check above doesn't catch the repeat — also check the name it\n // will print. use the printed name (`Pet`), not the `$ref`: an output `Pet` and its request\n // `PetInput` come from the same `$ref` but are different types, so keying on the `$ref` would\n // drop one. see #26\n const nameKey = T.isRef(type.name)\n ? 'name:' + Naming.genTypeName(type.name) + (type.kind === 'input' ? 'Input' : '')\n : null;\n if (!generatedSet.has(type.id) && !(nameKey && generatedSet.has(nameKey)) && count > 0) {\n type.generate(context, this, selection);\n generatedSet.add(type.id);\n if (nameKey) generatedSet.add(nameKey);\n refCount.set(type.name, count - 1);\n }\n });\n\n const expanded = [...this.gen.paths];\n\n const queries = new Map(expanded.filter(([_k, type]) => type.id.startsWith('get:')));\n const mutations = new Map(expanded.filter(([_k, type]) => T.isMutationType(type)));\n\n this.operationWriter.writeQuery(context, writer, queries, selection);\n this.operationWriter.writeMutations(context, writer, mutations, selection);\n\n writer.flush();\n }\n}\n"]}
|
|
@@ -248,7 +248,6 @@ export class Factory {
|
|
|
248
248
|
prop = propComp;
|
|
249
249
|
}
|
|
250
250
|
else if (this.isMapSchema(schemaObj)) {
|
|
251
|
-
console.log('isMapSchema', schemaObj);
|
|
252
251
|
// Map property: object with only additionalProperties
|
|
253
252
|
const mapType = new Map(parent, ref || propName, schemaObj);
|
|
254
253
|
prop = new PropMap(parent, propName, schemaObj, mapType);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/oas/nodes/factory.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Arr,\n Body,\n CircularRef,\n Composed,\n Delete,\n En,\n Get,\n IType,\n Map,\n Obj,\n Param,\n Patch,\n Post,\n Prop,\n PropArray,\n PropCircRef,\n PropComp,\n PropMap,\n PropObj,\n PropScalar,\n Put,\n ReferenceObject,\n RefCircRef,\n Res,\n Scalar,\n T,\n Union,\n PropEn,\n} from './internal.js';\nimport { Operation } from 'oas/operation';\nimport { ParameterObject, SchemaObject } from 'oas/types';\nimport { OpenAPIV3 } from 'openapi-types';\nimport _ from 'lodash';\nimport { warn } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { GqlUtils } from '../utils/gql.js';\nimport { Naming } from '../utils/naming.js';\nimport ArraySchemaObject = OpenAPIV3.ArraySchemaObject;\n\nexport class Factory {\n public static createGet(name: string, op: Operation): Get {\n return new Get(name, op);\n }\n\n public static fromSchema(context: OasContext, parent: IType, inputSchema: SchemaObject | ReferenceObject): IType {\n let result: IType | null = null;\n let schema: SchemaObject | ReferenceObject | undefined = inputSchema;\n let ref: string | undefined;\n\n // resolve first if reference\n if ('$ref' in schema) {\n // result = new Ref(parent, schema.$ref as string, schema as ReferenceObject);\n ref = schema?.$ref;\n if (ref) schema = context.lookupRef(ref) as SchemaObject;\n }\n\n if (!schema) throw new Error('Unknown or undefined schema');\n const schemaObj: SchemaObject = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n\n // Cycle cut (see docs/issues.md #10): a recursive schema can only close through a component `$ref`,\n // and `lookupRef` returns the same `SchemaObject` instance for a given ref. So if this resolved ref's\n // schema is already on the expansion path (an ancestor was built from it), re-entering would recurse\n // forever / emit a circular connector selection. Stop with a `RefCircRef` sentinel (commented in both\n // SDL and selection, traversal-terminating) instead of building + lazily expanding the recursion.\n const cyclic = ref ? this.cyclicAncestor(parent, schemaObj) : undefined;\n if (cyclic) {\n return this.fromRefCircRef(parent, cyclic, ref!);\n }\n\n // github's \"maybe empty\" anyOf (`anyOf: [member, {}]`): the fieldless member renders\n // nothing, so a single real member collapses to it. see docs/issues.md #20\n if (schemaObj.anyOf && !schemaObj.oneOf && !schemaObj.allOf) {\n const real = schemaObj.anyOf.filter((m) => !this.isShapelessObject(m as SchemaObject));\n if (real.length === 1) {\n return this.fromSchema(context, parent, real[0] as SchemaObject | ReferenceObject);\n }\n }\n\n // implied array: `items` present even without an explicit `type: array`. see docs/issues.md #4\n if (_.get(schemaObj, 'items') && (schemaObj.type === 'array' || schemaObj.type == null)) {\n result = this.createArrayType(parent, schemaObj, context);\n }\n // array case\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n schemaObj?.anyOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n result = this.createContainerType(parent, schemaObj, ref);\n }\n // a shapeless object (nothing but a boolean `additionalProperties`, or `{}`) declares no fields:\n // fall back to the JSON scalar — NOT an empty Obj, which generate() would skip, dangling the\n // reference. see docs/issues.md #19\n else if (this.isShapelessObject(schemaObj)) {\n result = new Scalar(parent, 'JSON', schemaObj);\n }\n // scalar\n else {\n result = this.createScalarType(schemaObj, parent);\n }\n\n // we could not infer a proper type\n if (result == null) {\n throw new Error(`Not yet implemented for ${JSON.stringify(schemaObj)}`);\n }\n\n return result;\n }\n\n /**\n * OAS 3.1 type arrays (`type: [\"string\",\"null\"]`) collapse to their first non-null entry:\n * GraphQL fields are nullable by default, so the \"null\" disjunct adds nothing. Normalized\n * in place (idempotent; `lookupRef` shares schema instances, so every reader sees it).\n * see docs/issues.md #23\n */\n private static normalizeTypeArray(schema: SchemaObject): void {\n const s = schema as Record<string, unknown>;\n if (Array.isArray(s.type)) {\n const real = (s.type as unknown[]).filter((t) => t && t !== 'null');\n s.type = real[0];\n }\n }\n\n // every member is a legal GraphQL enum value once trimmed (TMF637 ships `'aborted '`): a bare\n // identifier that isn't a boolean/null literal. Anything else (numbers, \"+1\", \"fast-forward\",\n // true) has no enum form. see #24\n private static isGqlEnum(schema: SchemaObject): boolean {\n const VALID_ENUM_VALUE = /^[_A-Za-z][_0-9A-Za-z]*$/;\n const RESERVED = new Set(['true', 'false', 'null']);\n return _.every(schema.enum, (value) => {\n if (typeof value !== 'string') return false;\n const trimmed = value.trim();\n return VALID_ENUM_VALUE.test(trimmed) && !RESERVED.has(trimmed);\n });\n }\n\n // Keywords that give a schema a renderable GraphQL shape; a schema with none is metadata-only. #5\n private static readonly SHAPE_KEYWORDS = [\n '$ref',\n 'type',\n 'enum',\n 'items',\n 'allOf',\n 'oneOf',\n 'anyOf',\n 'additionalProperties',\n ];\n\n /** True when a schema carries no renderable content (metadata only). see docs/issues.md #5 */\n public static isEmptySchema(schema: SchemaObject | ReferenceObject): boolean {\n const s = schema as Record<string, unknown>;\n return Factory.SHAPE_KEYWORDS.every((k) => s[k] == null) && _.isEmpty(s.properties);\n }\n\n /**\n * True for an object with no declared fields: no shape keyword except (at most) an explicit\n * object `type` and a boolean `additionalProperties` (`{}`, `{ additionalProperties: false }`,\n * `{ type: object, properties: {} }` — googlebooks `Empty`). A real map\n * (`additionalProperties: <schema>`) is NOT shapeless. see docs/issues.md #19, #31\n */\n public static isShapelessObject(schema: SchemaObject): boolean {\n const s = schema as Record<string, unknown>;\n const noShape = ['$ref', 'enum', 'items', 'allOf', 'oneOf', 'anyOf'].every((k) => s[k] == null);\n const objectOrUntyped = s.type == null || s.type === 'object';\n return noShape && objectOrUntyped && _.isEmpty(s.properties) && typeof s.additionalProperties !== 'object';\n }\n\n private static createScalarType(schema: SchemaObject | null, parent: IType) {\n const typeStr = schema?.type;\n if (typeStr != null) {\n if (typeStr === 'array') {\n throw new Error(`Should have been handled already? ${typeStr}, schema: ${JSON.stringify(schema)}`);\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, schema.enum! as string[]);\n }\n // scalar case\n else if (GqlUtils.gqlScalar(typeStr as string)) {\n const scalarType = GqlUtils.getGQLScalarType(schema!);\n return new Scalar(parent, scalarType, schema!);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle property type ${typeStr}, schema: ${JSON.stringify(schema)}`);\n }\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, _.get(schema, 'enum') as string[]);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle schema ${parent.pathToRoot()}, schema: ${JSON.stringify(schema)}`);\n }\n }\n\n private static createContainerType(parent: IType, schema: SchemaObject, ref?: string) {\n let result: IType | null;\n\n // composed object\n if (schema.allOf) {\n result = new Composed(parent, ref || _.get(schema, 'name'), schema);\n }\n // union\n else if (schema.oneOf || schema.anyOf) {\n const oneOfs = schema.oneOf || [];\n result = new Union(\n parent,\n ref || _.get(schema, 'name'),\n oneOfs as SchemaObject[],\n false,\n _.get(schema, 'discriminator'),\n );\n }\n // map (object with only additionalProperties)\n else if (this.isMapSchema(schema)) {\n result = new Map(parent, ref || _.get(schema, 'name') || null, schema);\n }\n // or a plain obj\n else {\n if (!schema.properties) {\n warn(\n null,\n '[factory]',\n 'Object has no properties: ' + JSON.stringify(schema, null, 2) + ' in: ' + parent.pathToRoot(),\n );\n }\n\n result = new Obj(parent, ref || _.get(schema, 'name') || null, schema);\n }\n\n return result;\n }\n\n private static isMapSchema(schema: SchemaObject): boolean {\n // A schema is considered a map if:\n // 1. It has additionalProperties defined as an object\n // 2. It has no explicit properties OR has empty properties\n return Boolean(\n schema.additionalProperties &&\n typeof schema.additionalProperties === 'object' &&\n (!schema.properties || _.isEmpty(schema.properties)),\n );\n }\n\n private static createArrayType(parent: IType | Res, schema: SchemaObject | null, context: OasContext) {\n // Array schema case.\n let parentName = parent.name;\n if (parent instanceof Res) {\n const get = parent.parent as Get; // Assume parent.parent is a GetOp.\n parentName = _.upperFirst(get.getGqlOpName());\n }\n\n const arr = new Arr(parent, parentName);\n const items = _.get(schema, 'items') as ArraySchemaObject;\n arr.items = items;\n\n // TODO: check this\n arr.itemsType = Factory.fromSchema(context, arr, items);\n arr.add(arr.itemsType); // add it to the children\n\n return arr;\n }\n\n public static fromProp(\n context: OasContext,\n parent: IType,\n propName: string,\n inputSchema: SchemaObject | ReferenceObject,\n ): Prop {\n if (!inputSchema) {\n throw new Error(`Should have a schema defined for property '${propName}' (parent: '${parent.name}')`);\n }\n\n let schema: SchemaObject | ReferenceObject | null = inputSchema;\n\n let prop: Prop;\n let ref: string | undefined;\n\n if (!_.get(schema, 'type') && '$ref' in schema) {\n ref = (schema as ReferenceObject).$ref;\n schema = context.lookupRef(ref);\n // this was a prop ref, but now needs to be returned as the ref directly?\n // prop = new PropRef(parent, propName, schema, ref);\n // return prop;\n }\n\n // uses the type of the schema to find out what kind of property it is\n const schemaObj = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n const type = schemaObj.type;\n\n if (type) {\n // 1st case is if the type is an array\n if (type === 'array') {\n const array = new PropArray(parent, propName, schema!);\n // const itemsName = Naming.genArrayItems(propName);\n\n const itemsSchema = _.get(schemaObj, 'items') as ArraySchemaObject;\n // const itemsType = Factory.fromProp(context, array, itemsName, itemsSchema); // TODO: re-test\n const itemsType = Factory.fromSchema(context, array, itemsSchema);\n\n array.setItems(itemsType);\n prop = array;\n\n // Array items resolve eagerly here, so if the item ref re-entered a schema on the path\n // (fromSchema returned the circular sentinel), bubble the cut up to the whole list field:\n // render `# children: [Node] — circular reference omitted`. see docs/issues.md #10\n if (itemsType instanceof CircularRef) {\n return new PropCircRef(parent, array);\n }\n }\n // 2nd checks for obj property\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(\n inner,\n ref || _.get(schemaObj, 'name'),\n schemaObj.oneOf as SchemaObject[],\n false,\n _.get(schemaObj, 'discriminator'),\n );\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n console.log('isMapSchema', schemaObj);\n // Map property: object with only additionalProperties\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n } else {\n // the type of the property will be an object, which needs to be added as a child\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n } else if (ref && schemaObj?.enum) {\n if (this.isGqlEnum(schemaObj)) {\n const en: En = new En(\n parent,\n ref,\n schemaObj,\n (schemaObj.enum as string[]).map((v) => v.trim()),\n );\n prop = new PropEn(parent, propName, ref, schemaObj);\n prop.add(en);\n } else {\n // No GraphQL enum form for this one — degrade to the base scalar instead of emitting\n // an invalid definition: boolean/number enums (slack `ok: { enum: [true] }` ->\n // `ok: Boolean`) and string enums with non-identifier values (github reactions\n // `enum: [\"+1\", \"-1\", …]` -> String). see docs/issues.md #24\n prop = new PropScalar(parent, propName, GqlUtils.getGQLScalarType(schemaObj), schemaObj);\n }\n }\n // 3rd tries for scalar\n else if (GqlUtils.gqlScalar(type as string)) {\n const scalar = GqlUtils.gqlScalar(type as string);\n prop = new PropScalar(parent, propName, scalar as string, schemaObj);\n }\n // or we don't know how to handle this\n else {\n throw new Error('Cannot handle property type ' + type);\n }\n }\n // otherwise let's use the properties instead and assume an Obj\n // TODO: repeated code\n else if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(inner, ref || _.get(schemaObj, 'name'), schemaObj.oneOf as SchemaObject[]);\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n // Map property: object with only additionalProperties (no explicit type)\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n // default case, we don't know what to do so we'll create a scalar of type JSON\n else {\n prop = new PropScalar(parent, propName, 'JSON', schemaObj);\n }\n\n // Cut a recursive direct-`$ref` property: the legacy id/name check, plus a schema-identity check\n // (the resolved component schema already on the path) that catches cycles the name check misses\n // because the recursion mints distinct per-depth names. see docs/issues.md #10\n const cyclic = ref ? this.cyclicAncestor(parent, schema as SchemaObject) : undefined;\n if (cyclic || parent.ancestors().find((a) => a.id === prop.id)) {\n prop = new PropCircRef(parent, prop);\n }\n\n return prop;\n }\n\n /**\n * The nearest ancestor built from the same resolved component `$ref` (compared by `SchemaObject`\n * identity — `lookupRef` returns the same instance per ref), or undefined. Scoped to the current\n * expansion path (`ancestors()`), so a shared non-recursive component used by sibling fields is NOT\n * cut — only a schema that is its own ancestor. `schema` is undefined for inline (non-`$ref`) nodes,\n * which can never match an ancestor. see docs/issues.md #10\n */\n private static cyclicAncestor(parent: IType, schema?: SchemaObject): IType | undefined {\n if (!schema) return undefined;\n return parent.ancestors().find((a) => a.schema === schema);\n }\n\n /** Build the `fromSchema` circular sentinel (commented in both SDL + selection). see docs/issues.md #10 */\n public static fromRefCircRef(parent: IType, ancestor: IType, ref: string): IType {\n const node = new RefCircRef(parent, Naming.getRefName(ref) ?? ancestor.name);\n node.ref = ancestor;\n return node;\n }\n\n public static fromResponse(_context: OasContext, parent: IType, mediaSchema: SchemaObject): IType {\n return new Res(parent, 'r', mediaSchema);\n }\n\n public static fromParam(context: OasContext, parent: IType, p: ParameterObject | ReferenceObject): Param {\n let param: ParameterObject;\n\n if ('$ref' in p) {\n const ref: ReferenceObject = p as ReferenceObject;\n const schema = context.lookupParam(ref.$ref);\n\n if (!schema) {\n throw new Error('Schema not found for ref: ' + ref.$ref);\n }\n param = schema as ParameterObject;\n } else {\n param = p as ParameterObject;\n }\n\n const schema = param.schema as SchemaObject;\n const required = param.required === true;\n\n return new Param(parent, param.name, schema, required, schema.default, param);\n }\n\n public static fromCircularRef(parent: IType, child: IType): IType {\n const _tree = T.print(parent);\n\n const circularRef = new CircularRef(parent, child.name);\n circularRef.ref = child;\n return circularRef;\n }\n\n public static fromUnion(_context: OasContext, parent: IType, oneOfs: SchemaObject[]): IType {\n const union = new Union(parent, parent.name, oneOfs);\n parent.add(union);\n return union;\n }\n\n public static fromPost(name: string, op: Operation): Post {\n return new Post(name, op);\n }\n\n public static fromPut(name: string, op: Operation): Post {\n return new Put(name, op);\n }\n\n public static fromPatch(name: string, op: Operation): Post {\n return new Patch(name, op);\n }\n\n public static fromDelete(name: string, op: Operation): Post {\n return new Delete(name, op);\n }\n\n public static fromBody(_context: OasContext, parent: IType, schema: SchemaObject): IType {\n const body = new Body(parent, 'b', schema);\n parent.add(body);\n return body;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/oas/nodes/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,MAAM,EACN,EAAE,EACF,GAAG,EAEH,GAAG,EACH,GAAG,EACH,KAAK,EACL,KAAK,EACL,IAAI,EAEJ,SAAS,EACT,WAAW,EACX,QAAQ,EACR,OAAO,EACP,OAAO,EACP,UAAU,EACV,GAAG,EAEH,UAAU,EACV,GAAG,EACH,MAAM,EACN,CAAC,EACD,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AAIvB,OAAO,CAAC,MAAM,QAAQ,CAAC;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,OAAO,OAAO;IACX,MAAM,CAAC,SAAS,CAAC,IAAY,EAAE,EAAa;QACjD,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,OAAmB,EAAE,MAAa,EAAE,WAA2C;QACtG,IAAI,MAAM,GAAiB,IAAI,CAAC;QAChC,IAAI,MAAM,GAA+C,WAAW,CAAC;QACrE,IAAI,GAAuB,CAAC;QAE5B,6BAA6B;QAC7B,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YACrB,8EAA8E;YAC9E,GAAG,GAAG,MAAM,EAAE,IAAI,CAAC;YACnB,IAAI,GAAG;gBAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAiB,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAiB,MAAsB,CAAC;QACvD,2GAA2G;QAC3G,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEnC,oGAAoG;QACpG,sGAAsG;QACtG,qGAAqG;QACrG,sGAAsG;QACtG,kGAAkG;QAClG,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAI,CAAC,CAAC;QACnD,CAAC;QAED,qFAAqF;QACrF,2EAA2E;QAC3E,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAiB,CAAC,CAAC,CAAC;YACvF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAmC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAED,+FAA+F;QAC/F,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACxF,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,aAAa;aACR,IACH,SAAS,EAAE,IAAI,KAAK,QAAQ;YAC5B,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,KAAK;YAChB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAChC,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC5D,CAAC;QACD,iGAAiG;QACjG,6FAA6F;QAC7F,oCAAoC;aAC/B,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;QACD,SAAS;aACJ,CAAC;YACJ,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,mCAAmC;QACnC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,kBAAkB,CAAC,MAAoB;QACpD,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAI,CAAC,CAAC,IAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;YACpE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,8FAA8F;IAC9F,8FAA8F;IAC9F,kCAAkC;IAC1B,MAAM,CAAC,SAAS,CAAC,MAAoB;QAC3C,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kGAAkG;IAC1F,MAAM,CAAU,cAAc,GAAG;QACvC,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,OAAO;QACP,sBAAsB;KACvB,CAAC;IAEF,8FAA8F;IACvF,MAAM,CAAC,aAAa,CAAC,MAAsC;QAChE,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtF,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAAC,MAAoB;QAClD,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAChG,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC9D,OAAO,OAAO,IAAI,eAAe,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,oBAAoB,KAAK,QAAQ,CAAC;IAC7G,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,MAA2B,EAAE,MAAa;QACxE,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,CAAC;QAC7B,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC;iBAAM,IAAI,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;gBAChC,OAAO,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAiB,CAAC,CAAC;YAClE,CAAC;YACD,cAAc;iBACT,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAiB,CAAC,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,MAAO,CAAC,CAAC;gBACtD,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAO,CAAC,CAAC;YACjD,CAAC;YACD,wCAAwC;iBACnC,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;YAChC,OAAO,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa,CAAC,CAAC;QAC3E,CAAC;QACD,wCAAwC;aACnC,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,UAAU,EAAE,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAAC,MAAa,EAAE,MAAoB,EAAE,GAAY;QAClF,IAAI,MAAoB,CAAC;QAEzB,kBAAkB;QAClB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;QACD,QAAQ;aACH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,GAAG,IAAI,KAAK,CAChB,MAAM,EACN,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,MAAwB,EACxB,KAAK,EACL,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAC/B,CAAC;QACJ,CAAC;QACD,8CAA8C;aACzC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;QACD,iBAAiB;aACZ,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,IAAI,CACF,IAAI,EACJ,WAAW,EACX,4BAA4B,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAC/F,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,MAAoB;QAC7C,mCAAmC;QACnC,sDAAsD;QACtD,2DAA2D;QAC3D,OAAO,OAAO,CACZ,MAAM,CAAC,oBAAoB;YACzB,OAAO,MAAM,CAAC,oBAAoB,KAAK,QAAQ;YAC/C,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CACvD,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,MAAmB,EAAE,MAA2B,EAAE,OAAmB;QAClG,qBAAqB;QACrB,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAa,CAAC,CAAC,mCAAmC;YACrE,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAsB,CAAC;QAC1D,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;QAElB,mBAAmB;QACnB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB;QAEjD,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,QAAQ,CACpB,OAAmB,EACnB,MAAa,EACb,QAAgB,EAChB,WAA2C;QAE3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,QAAQ,eAAe,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACxG,CAAC;QAED,IAAI,MAAM,GAA0C,WAAW,CAAC;QAEhE,IAAI,IAAU,CAAC;QACf,IAAI,GAAuB,CAAC;QAE5B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YAC/C,GAAG,GAAI,MAA0B,CAAC,IAAI,CAAC;YACvC,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAChC,yEAAyE;YACzE,qDAAqD;YACrD,eAAe;QACjB,CAAC;QAED,sEAAsE;QACtE,MAAM,SAAS,GAAG,MAAsB,CAAC;QACzC,2GAA2G;QAC3G,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAE5B,IAAI,IAAI,EAAE,CAAC;YACT,sCAAsC;YACtC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAO,CAAC,CAAC;gBACvD,oDAAoD;gBAEpD,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAsB,CAAC;gBACnE,+FAA+F;gBAC/F,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;gBAElE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC1B,IAAI,GAAG,KAAK,CAAC;gBAEb,uFAAuF;gBACvF,0FAA0F;gBAC1F,mFAAmF;gBACnF,IAAI,SAAS,YAAY,WAAW,EAAE,CAAC;oBACrC,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YACD,8BAA8B;iBACzB,IACH,SAAS,EAAE,IAAI,KAAK,QAAQ;gBAC5B,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,KAAK;gBAChB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAChC,CAAC;gBACD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBACpB,MAAM,KAAK,GAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAClE,KAAK,CAAC,IAAI,GAAG,IAAI,KAAK,CACpB,KAAK,EACL,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,EAC/B,SAAS,CAAC,KAAuB,EACjC,KAAK,EACL,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAClC,CAAC;oBACF,IAAI,GAAG,KAAK,CAAC;gBACf,CAAC;qBAAM,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACrE,QAAQ,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;oBACnF,IAAI,GAAG,QAAQ,CAAC;gBAClB,CAAC;qBAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;oBACvC,sDAAsD;oBACtD,MAAM,OAAO,GAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACjE,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC3D,CAAC;qBAAM,IAAI,SAAS,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;oBACxC,MAAM,QAAQ,GAAU,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACpE,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,iFAAiF;oBACjF,MAAM,QAAQ,GAAU,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACpE,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9B,MAAM,EAAE,GAAO,IAAI,EAAE,CACnB,MAAM,EACN,GAAG,EACH,SAAS,EACR,SAAS,CAAC,IAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAClD,CAAC;oBACF,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBACpD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,qFAAqF;oBACrF,+EAA+E;oBAC/E,+EAA+E;oBAC/E,6DAA6D;oBAC7D,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC3F,CAAC;YACH,CAAC;YACD,uBAAuB;iBAClB,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAc,CAAC,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAc,CAAC,CAAC;gBAClD,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAgB,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;YACD,sCAAsC;iBACjC,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,IAAI,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,+DAA+D;QAC/D,sBAAsB;aACjB,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,KAAuB,CAAC,CAAC;YAClG,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;aAAM,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrE,QAAQ,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;YACnF,IAAI,GAAG,QAAQ,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,yEAAyE;YACzE,MAAM,OAAO,GAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,SAAS,CAAC,CAAC;YACjE,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,SAAS,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAU,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,SAAS,CAAC,CAAC;YACpE,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC;QACD,+EAA+E;aAC1E,CAAC;YACJ,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7D,CAAC;QAED,iGAAiG;QACjG,gGAAgG;QAChG,+EAA+E;QAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAsB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,cAAc,CAAC,MAAa,EAAE,MAAqB;QAChE,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,2GAA2G;IACpG,MAAM,CAAC,cAAc,CAAC,MAAa,EAAE,QAAe,EAAE,GAAW;QACtE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,QAAoB,EAAE,MAAa,EAAE,WAAyB;QACvF,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAC3C,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,OAAmB,EAAE,MAAa,EAAE,CAAoC;QAC9F,IAAI,KAAsB,CAAC;QAE3B,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAChB,MAAM,GAAG,GAAoB,CAAoB,CAAC;YAClD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC;YACD,KAAK,GAAG,MAAyB,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,CAAoB,CAAC;QAC/B,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAsB,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC;QAEzC,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,MAAa,EAAE,KAAY;QACvD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC;QACxB,OAAO,WAAW,CAAC;IACrB,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,QAAoB,EAAE,MAAa,EAAE,MAAsB;QACjF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,IAAY,EAAE,EAAa;QAChD,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,IAAY,EAAE,EAAa;QAC/C,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,IAAY,EAAE,EAAa;QACjD,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,IAAY,EAAE,EAAa;QAClD,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,QAAoB,EAAE,MAAa,EAAE,MAAoB;QAC9E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC","sourcesContent":["import {\n Arr,\n Body,\n CircularRef,\n Composed,\n Delete,\n En,\n Get,\n IType,\n Map,\n Obj,\n Param,\n Patch,\n Post,\n Prop,\n PropArray,\n PropCircRef,\n PropComp,\n PropMap,\n PropObj,\n PropScalar,\n Put,\n ReferenceObject,\n RefCircRef,\n Res,\n Scalar,\n T,\n Union,\n PropEn,\n} from './internal.js';\nimport { Operation } from 'oas/operation';\nimport { ParameterObject, SchemaObject } from 'oas/types';\nimport { OpenAPIV3 } from 'openapi-types';\nimport _ from 'lodash';\nimport { warn } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { GqlUtils } from '../utils/gql.js';\nimport { Naming } from '../utils/naming.js';\nimport ArraySchemaObject = OpenAPIV3.ArraySchemaObject;\n\nexport class Factory {\n public static createGet(name: string, op: Operation): Get {\n return new Get(name, op);\n }\n\n public static fromSchema(context: OasContext, parent: IType, inputSchema: SchemaObject | ReferenceObject): IType {\n let result: IType | null = null;\n let schema: SchemaObject | ReferenceObject | undefined = inputSchema;\n let ref: string | undefined;\n\n // resolve first if reference\n if ('$ref' in schema) {\n // result = new Ref(parent, schema.$ref as string, schema as ReferenceObject);\n ref = schema?.$ref;\n if (ref) schema = context.lookupRef(ref) as SchemaObject;\n }\n\n if (!schema) throw new Error('Unknown or undefined schema');\n const schemaObj: SchemaObject = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n\n // Cycle cut (see docs/issues.md #10): a recursive schema can only close through a component `$ref`,\n // and `lookupRef` returns the same `SchemaObject` instance for a given ref. So if this resolved ref's\n // schema is already on the expansion path (an ancestor was built from it), re-entering would recurse\n // forever / emit a circular connector selection. Stop with a `RefCircRef` sentinel (commented in both\n // SDL and selection, traversal-terminating) instead of building + lazily expanding the recursion.\n const cyclic = ref ? this.cyclicAncestor(parent, schemaObj) : undefined;\n if (cyclic) {\n return this.fromRefCircRef(parent, cyclic, ref!);\n }\n\n // github's \"maybe empty\" anyOf (`anyOf: [member, {}]`): the fieldless member renders\n // nothing, so a single real member collapses to it. see docs/issues.md #20\n if (schemaObj.anyOf && !schemaObj.oneOf && !schemaObj.allOf) {\n const real = schemaObj.anyOf.filter((m) => !this.isShapelessObject(m as SchemaObject));\n if (real.length === 1) {\n return this.fromSchema(context, parent, real[0] as SchemaObject | ReferenceObject);\n }\n }\n\n // implied array: `items` present even without an explicit `type: array`. see docs/issues.md #4\n if (_.get(schemaObj, 'items') && (schemaObj.type === 'array' || schemaObj.type == null)) {\n result = this.createArrayType(parent, schemaObj, context);\n }\n // array case\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n schemaObj?.anyOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n result = this.createContainerType(parent, schemaObj, ref);\n }\n // a shapeless object (nothing but a boolean `additionalProperties`, or `{}`) declares no fields:\n // fall back to the JSON scalar — NOT an empty Obj, which generate() would skip, dangling the\n // reference. see docs/issues.md #19\n else if (this.isShapelessObject(schemaObj)) {\n result = new Scalar(parent, 'JSON', schemaObj);\n }\n // scalar\n else {\n result = this.createScalarType(schemaObj, parent);\n }\n\n // we could not infer a proper type\n if (result == null) {\n throw new Error(`Not yet implemented for ${JSON.stringify(schemaObj)}`);\n }\n\n return result;\n }\n\n /**\n * OAS 3.1 type arrays (`type: [\"string\",\"null\"]`) collapse to their first non-null entry:\n * GraphQL fields are nullable by default, so the \"null\" disjunct adds nothing. Normalized\n * in place (idempotent; `lookupRef` shares schema instances, so every reader sees it).\n * see docs/issues.md #23\n */\n private static normalizeTypeArray(schema: SchemaObject): void {\n const s = schema as Record<string, unknown>;\n if (Array.isArray(s.type)) {\n const real = (s.type as unknown[]).filter((t) => t && t !== 'null');\n s.type = real[0];\n }\n }\n\n // every member is a legal GraphQL enum value once trimmed (TMF637 ships `'aborted '`): a bare\n // identifier that isn't a boolean/null literal. Anything else (numbers, \"+1\", \"fast-forward\",\n // true) has no enum form. see #24\n private static isGqlEnum(schema: SchemaObject): boolean {\n const VALID_ENUM_VALUE = /^[_A-Za-z][_0-9A-Za-z]*$/;\n const RESERVED = new Set(['true', 'false', 'null']);\n return _.every(schema.enum, (value) => {\n if (typeof value !== 'string') return false;\n const trimmed = value.trim();\n return VALID_ENUM_VALUE.test(trimmed) && !RESERVED.has(trimmed);\n });\n }\n\n // Keywords that give a schema a renderable GraphQL shape; a schema with none is metadata-only. #5\n private static readonly SHAPE_KEYWORDS = [\n '$ref',\n 'type',\n 'enum',\n 'items',\n 'allOf',\n 'oneOf',\n 'anyOf',\n 'additionalProperties',\n ];\n\n /** True when a schema carries no renderable content (metadata only). see docs/issues.md #5 */\n public static isEmptySchema(schema: SchemaObject | ReferenceObject): boolean {\n const s = schema as Record<string, unknown>;\n return Factory.SHAPE_KEYWORDS.every((k) => s[k] == null) && _.isEmpty(s.properties);\n }\n\n /**\n * True for an object with no declared fields: no shape keyword except (at most) an explicit\n * object `type` and a boolean `additionalProperties` (`{}`, `{ additionalProperties: false }`,\n * `{ type: object, properties: {} }` — googlebooks `Empty`). A real map\n * (`additionalProperties: <schema>`) is NOT shapeless. see docs/issues.md #19, #31\n */\n public static isShapelessObject(schema: SchemaObject): boolean {\n const s = schema as Record<string, unknown>;\n const noShape = ['$ref', 'enum', 'items', 'allOf', 'oneOf', 'anyOf'].every((k) => s[k] == null);\n const objectOrUntyped = s.type == null || s.type === 'object';\n return noShape && objectOrUntyped && _.isEmpty(s.properties) && typeof s.additionalProperties !== 'object';\n }\n\n private static createScalarType(schema: SchemaObject | null, parent: IType) {\n const typeStr = schema?.type;\n if (typeStr != null) {\n if (typeStr === 'array') {\n throw new Error(`Should have been handled already? ${typeStr}, schema: ${JSON.stringify(schema)}`);\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, schema.enum! as string[]);\n }\n // scalar case\n else if (GqlUtils.gqlScalar(typeStr as string)) {\n const scalarType = GqlUtils.getGQLScalarType(schema!);\n return new Scalar(parent, scalarType, schema!);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle property type ${typeStr}, schema: ${JSON.stringify(schema)}`);\n }\n } else if (schema?.enum != null) {\n return new En(parent, 'enum', schema, _.get(schema, 'enum') as string[]);\n }\n // or we have no idea how to handle this\n else {\n throw new Error(`Cannot handle schema ${parent.pathToRoot()}, schema: ${JSON.stringify(schema)}`);\n }\n }\n\n private static createContainerType(parent: IType, schema: SchemaObject, ref?: string) {\n let result: IType | null;\n\n // composed object\n if (schema.allOf) {\n result = new Composed(parent, ref || _.get(schema, 'name'), schema);\n }\n // union\n else if (schema.oneOf || schema.anyOf) {\n const oneOfs = schema.oneOf || [];\n result = new Union(\n parent,\n ref || _.get(schema, 'name'),\n oneOfs as SchemaObject[],\n false,\n _.get(schema, 'discriminator'),\n );\n }\n // map (object with only additionalProperties)\n else if (this.isMapSchema(schema)) {\n result = new Map(parent, ref || _.get(schema, 'name') || null, schema);\n }\n // or a plain obj\n else {\n if (!schema.properties) {\n warn(\n null,\n '[factory]',\n 'Object has no properties: ' + JSON.stringify(schema, null, 2) + ' in: ' + parent.pathToRoot(),\n );\n }\n\n result = new Obj(parent, ref || _.get(schema, 'name') || null, schema);\n }\n\n return result;\n }\n\n private static isMapSchema(schema: SchemaObject): boolean {\n // A schema is considered a map if:\n // 1. It has additionalProperties defined as an object\n // 2. It has no explicit properties OR has empty properties\n return Boolean(\n schema.additionalProperties &&\n typeof schema.additionalProperties === 'object' &&\n (!schema.properties || _.isEmpty(schema.properties)),\n );\n }\n\n private static createArrayType(parent: IType | Res, schema: SchemaObject | null, context: OasContext) {\n // Array schema case.\n let parentName = parent.name;\n if (parent instanceof Res) {\n const get = parent.parent as Get; // Assume parent.parent is a GetOp.\n parentName = _.upperFirst(get.getGqlOpName());\n }\n\n const arr = new Arr(parent, parentName);\n const items = _.get(schema, 'items') as ArraySchemaObject;\n arr.items = items;\n\n // TODO: check this\n arr.itemsType = Factory.fromSchema(context, arr, items);\n arr.add(arr.itemsType); // add it to the children\n\n return arr;\n }\n\n public static fromProp(\n context: OasContext,\n parent: IType,\n propName: string,\n inputSchema: SchemaObject | ReferenceObject,\n ): Prop {\n if (!inputSchema) {\n throw new Error(`Should have a schema defined for property '${propName}' (parent: '${parent.name}')`);\n }\n\n let schema: SchemaObject | ReferenceObject | null = inputSchema;\n\n let prop: Prop;\n let ref: string | undefined;\n\n if (!_.get(schema, 'type') && '$ref' in schema) {\n ref = (schema as ReferenceObject).$ref;\n schema = context.lookupRef(ref);\n // this was a prop ref, but now needs to be returned as the ref directly?\n // prop = new PropRef(parent, propName, schema, ref);\n // return prop;\n }\n\n // uses the type of the schema to find out what kind of property it is\n const schemaObj = schema as SchemaObject;\n // OAS 3.1 nullable syntax (`type: [string, 'null']`) would crash every plain-string `type` read below. #23\n this.normalizeTypeArray(schemaObj);\n const type = schemaObj.type;\n\n if (type) {\n // 1st case is if the type is an array\n if (type === 'array') {\n const array = new PropArray(parent, propName, schema!);\n // const itemsName = Naming.genArrayItems(propName);\n\n const itemsSchema = _.get(schemaObj, 'items') as ArraySchemaObject;\n // const itemsType = Factory.fromProp(context, array, itemsName, itemsSchema); // TODO: re-test\n const itemsType = Factory.fromSchema(context, array, itemsSchema);\n\n array.setItems(itemsType);\n prop = array;\n\n // Array items resolve eagerly here, so if the item ref re-entered a schema on the path\n // (fromSchema returned the circular sentinel), bubble the cut up to the whole list field:\n // render `# children: [Node] — circular reference omitted`. see docs/issues.md #10\n if (itemsType instanceof CircularRef) {\n return new PropCircRef(parent, array);\n }\n }\n // 2nd checks for obj property\n else if (\n schemaObj?.type === 'object' ||\n schemaObj?.oneOf ||\n schemaObj?.allOf ||\n !_.isEmpty(schemaObj.properties)\n ) {\n if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(\n inner,\n ref || _.get(schemaObj, 'name'),\n schemaObj.oneOf as SchemaObject[],\n false,\n _.get(schemaObj, 'discriminator'),\n );\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n // Map property: object with only additionalProperties\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n } else {\n // the type of the property will be an object, which needs to be added as a child\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n } else if (ref && schemaObj?.enum) {\n if (this.isGqlEnum(schemaObj)) {\n const en: En = new En(\n parent,\n ref,\n schemaObj,\n (schemaObj.enum as string[]).map((v) => v.trim()),\n );\n prop = new PropEn(parent, propName, ref, schemaObj);\n prop.add(en);\n } else {\n // No GraphQL enum form for this one — degrade to the base scalar instead of emitting\n // an invalid definition: boolean/number enums (slack `ok: { enum: [true] }` ->\n // `ok: Boolean`) and string enums with non-identifier values (github reactions\n // `enum: [\"+1\", \"-1\", …]` -> String). see docs/issues.md #24\n prop = new PropScalar(parent, propName, GqlUtils.getGQLScalarType(schemaObj), schemaObj);\n }\n }\n // 3rd tries for scalar\n else if (GqlUtils.gqlScalar(type as string)) {\n const scalar = GqlUtils.gqlScalar(type as string);\n prop = new PropScalar(parent, propName, scalar as string, schemaObj);\n }\n // or we don't know how to handle this\n else {\n throw new Error('Cannot handle property type ' + type);\n }\n }\n // otherwise let's use the properties instead and assume an Obj\n // TODO: repeated code\n else if (schemaObj.oneOf) {\n const inner: PropComp = new PropComp(parent, propName, schemaObj);\n inner.comp = new Union(inner, ref || _.get(schemaObj, 'name'), schemaObj.oneOf as SchemaObject[]);\n prop = inner;\n } else if (schemaObj.allOf) {\n const propComp: PropComp = new PropComp(parent, propName, schemaObj);\n propComp.comp = new Composed(propComp, ref || _.get(schemaObj, 'name'), schemaObj);\n prop = propComp;\n } else if (this.isMapSchema(schemaObj)) {\n // Map property: object with only additionalProperties (no explicit type)\n const mapType: Map = new Map(parent, ref || propName, schemaObj);\n prop = new PropMap(parent, propName, schemaObj, mapType);\n } else if (schemaObj.properties != null) {\n const propType: IType = new Obj(parent, ref || propName, schemaObj);\n prop = new PropObj(parent, propName, schemaObj, propType);\n }\n // default case, we don't know what to do so we'll create a scalar of type JSON\n else {\n prop = new PropScalar(parent, propName, 'JSON', schemaObj);\n }\n\n // Cut a recursive direct-`$ref` property: the legacy id/name check, plus a schema-identity check\n // (the resolved component schema already on the path) that catches cycles the name check misses\n // because the recursion mints distinct per-depth names. see docs/issues.md #10\n const cyclic = ref ? this.cyclicAncestor(parent, schema as SchemaObject) : undefined;\n if (cyclic || parent.ancestors().find((a) => a.id === prop.id)) {\n prop = new PropCircRef(parent, prop);\n }\n\n return prop;\n }\n\n /**\n * The nearest ancestor built from the same resolved component `$ref` (compared by `SchemaObject`\n * identity — `lookupRef` returns the same instance per ref), or undefined. Scoped to the current\n * expansion path (`ancestors()`), so a shared non-recursive component used by sibling fields is NOT\n * cut — only a schema that is its own ancestor. `schema` is undefined for inline (non-`$ref`) nodes,\n * which can never match an ancestor. see docs/issues.md #10\n */\n private static cyclicAncestor(parent: IType, schema?: SchemaObject): IType | undefined {\n if (!schema) return undefined;\n return parent.ancestors().find((a) => a.schema === schema);\n }\n\n /** Build the `fromSchema` circular sentinel (commented in both SDL + selection). see docs/issues.md #10 */\n public static fromRefCircRef(parent: IType, ancestor: IType, ref: string): IType {\n const node = new RefCircRef(parent, Naming.getRefName(ref) ?? ancestor.name);\n node.ref = ancestor;\n return node;\n }\n\n public static fromResponse(_context: OasContext, parent: IType, mediaSchema: SchemaObject): IType {\n return new Res(parent, 'r', mediaSchema);\n }\n\n public static fromParam(context: OasContext, parent: IType, p: ParameterObject | ReferenceObject): Param {\n let param: ParameterObject;\n\n if ('$ref' in p) {\n const ref: ReferenceObject = p as ReferenceObject;\n const schema = context.lookupParam(ref.$ref);\n\n if (!schema) {\n throw new Error('Schema not found for ref: ' + ref.$ref);\n }\n param = schema as ParameterObject;\n } else {\n param = p as ParameterObject;\n }\n\n const schema = param.schema as SchemaObject;\n const required = param.required === true;\n\n return new Param(parent, param.name, schema, required, schema.default, param);\n }\n\n public static fromCircularRef(parent: IType, child: IType): IType {\n const _tree = T.print(parent);\n\n const circularRef = new CircularRef(parent, child.name);\n circularRef.ref = child;\n return circularRef;\n }\n\n public static fromUnion(_context: OasContext, parent: IType, oneOfs: SchemaObject[]): IType {\n const union = new Union(parent, parent.name, oneOfs);\n parent.add(union);\n return union;\n }\n\n public static fromPost(name: string, op: Operation): Post {\n return new Post(name, op);\n }\n\n public static fromPut(name: string, op: Operation): Post {\n return new Put(name, op);\n }\n\n public static fromPatch(name: string, op: Operation): Post {\n return new Patch(name, op);\n }\n\n public static fromDelete(name: string, op: Operation): Post {\n return new Delete(name, op);\n }\n\n public static fromBody(_context: OasContext, parent: IType, schema: SchemaObject): IType {\n const body = new Body(parent, 'b', schema);\n parent.add(body);\n return body;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propArray.js","sourceRoot":"","sources":["../../../src/oas/nodes/propArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,IAAI,EAAE,CAAC,EAAQ,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"propArray.js","sourceRoot":"","sources":["../../../src/oas/nodes/propArray.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arr, IType, Prop, T, Type } from './internal.js';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\n\nexport class PropArray extends Prop {\n public items?: IType;\n\n get id(): string {\n return `prop:array:#${this.name}`;\n }\n\n public override visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n context.enter(this);\n trace(context, '-> [prop-array:visit]', 'in');\n\n trace(context, ' [prop-array:visit]', 'type: ' + this.items);\n this.items?.visit(context);\n this.visited = true;\n\n trace(context, '<- [prop:array:visit]', 'out');\n context.leave(this);\n }\n\n public setItems(items: IType): void {\n this.items = items;\n if (!this.children.includes(items)) {\n this.add(items);\n }\n }\n\n generateValue(context: OasContext, writer: Writer) {\n if (T.isScalarArray(this.items!)) {\n const arr: Arr = this.items as Arr;\n\n writer.write('[');\n arr.generate(context, writer, []);\n writer.write(']\\n');\n\n // because it's a scalar array, we can assume that's all we need to generate\n context.generatedSet.add(this.items!.id);\n } else {\n super.generateValue(context, writer);\n }\n }\n\n public override getValue(context: OasContext): string {\n if (this.items && T.isContainer(this.items)) {\n const type = Naming.genTypeName(this.items.name) + (this.items as Type).nameSuffix();\n return `[${type}]`;\n }\n\n return `[${this.items!.name}]`;\n }\n\n public forPrompt(_context: OasContext): string {\n if (this.items && T.isContainer(this.items)) {\n return `[prop] ${this.name}: [${Naming.genTypeName(this.items?.name)}] (Array)`;\n }\n\n return `[prop] ${this.name}: [${this.items!.name}] (Array)`;\n }\n\n dependencies(): IType[] {\n return this.items ? [this.items] : [];\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]) {\n trace(context, '-> [prop-array:select]', 'in: ' + this.name);\n\n const fieldName = this.name;\n const sanitised = Naming.sanitiseFieldForSelect(fieldName, this.parent?.kind === 'input');\n writer.write(' '.repeat(context.indent + context.stack.length)).write(sanitised);\n\n if (this.needsBrackets(this.items!)) {\n writer.write(' {');\n writer.write('\\n');\n context.enter(this);\n }\n\n // now allow the items type to select its properties\n this.items!.select(context, writer, selection);\n\n if (this.needsBrackets(this.items!)) {\n context.leave(this);\n writer.write(' '.repeat(context.indent + context.stack.length)).write('}');\n }\n // writer.append('\\n');\n if (context.generateOptions.showParentInSelections) {\n writer.write(' # ').write(Naming.getRefName(this.parent!.name));\n }\n\n writer.write('\\n');\n\n trace(context, '<- [prop:array:select]', 'out');\n }\n\n public needsBrackets(child?: IType): boolean {\n if (!child) return false;\n return T.isContainer(child);\n }\n}\n"]}
|
package/dist/oas/nodes/union.js
CHANGED
|
@@ -127,6 +127,13 @@ export class Union extends Type {
|
|
|
127
127
|
const childrenTypes = this.children.map((child) => Naming.getRefName(child.name));
|
|
128
128
|
writer.write(headline).write(name).write(' = ').write(childrenTypes.join(' | ')).write('\n\n');
|
|
129
129
|
trace(context, ' [union::generate]', `[union] -> object: ${this.name}`);
|
|
130
|
+
// The merged object's keyword follows the node's `kind`, which is inherited from the parent
|
|
131
|
+
// context: a response-rooted Union is `kind='type'`; a request-body-rooted Union is
|
|
132
|
+
// `kind='input'` (Body sets it on construction — see body.ts). Both are correct: the merged
|
|
133
|
+
// object is referenced exactly as its context dictates (response -> output field, body ->
|
|
134
|
+
// Mutation argument), and `nameSuffix()` (`'Input'` when kind=input) keeps the names
|
|
135
|
+
// distinct when the same schema is reached both ways. Do NOT hard-code `'type '` here —
|
|
136
|
+
// it would emit an input-position merge as an output type and break the body case. See C6.
|
|
130
137
|
writer
|
|
131
138
|
.write(this.kind + ' ')
|
|
132
139
|
.write(name)
|
|
@@ -254,7 +261,10 @@ export class Union extends Type {
|
|
|
254
261
|
writer.write(pad(base)).write(`... ${field}->match(\n`);
|
|
255
262
|
members.forEach((child, idx) => {
|
|
256
263
|
const typeName = Naming.getRefName(child.name);
|
|
257
|
-
|
|
264
|
+
// OAS 3.x: when no explicit discriminator `mapping` is present, the implicit tag value
|
|
265
|
+
// is the bare (un-prefixed) ref name — e.g. "Book", NOT "book". Lowercasing it produced a
|
|
266
|
+
// `->match` branch that never fired against spec-compliant payloads. See C1.
|
|
267
|
+
const value = this.discriminatorValue(child) ?? typeName;
|
|
258
268
|
writer.write(pad(base + 2)).write(`["${value}", $ {\n`);
|
|
259
269
|
writer.write(pad(base + 4)).write(`__typename: $("${typeName}")\n`);
|
|
260
270
|
// Member fields via the child's own select (scoped by selection). `select` writes at
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/oas/nodes/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { Composed, Factory, Get, IType, Prop, Res, T, Type } from './internal.js';\nimport { SchemaObject } from 'oas/types';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\n\nexport class Union extends Type {\n public schemas: SchemaObject[];\n // OAS discriminator: `propertyName` is the source JSON field carrying the type tag,\n // `discriminatorMapping` maps each tag value to a schema ref (value -> \"#/.../Type\").\n public discriminator?: string;\n public discriminatorMapping?: Record<string, string>;\n // R2: when this discriminated union's members all share one allOf base, it is promoted to a\n // GraphQL interface. `interfaceBaseRef` is the base schema ref (\"#/.../Product\"); when set,\n // generate() returns the interface name (not the union name) and emits no `union` line. Set by\n // promoteInterfaces (a post-collect pass) — never in visit().\n public interfaceBaseRef?: string;\n\n constructor(\n parent: IType,\n name: string,\n schemas: SchemaObject[],\n public consolidated: boolean = false,\n disc?: { propertyName?: string; mapping?: Record<string, string> },\n ) {\n super(parent, name);\n this.schemas = schemas;\n this.discriminator = disc?.propertyName;\n this.discriminatorMapping = disc?.mapping;\n this.updateName();\n }\n\n get id(): string {\n return `union:${this.name}`;\n }\n\n public forPrompt(_context: OasContext): string {\n return `[union] ${Naming.getRefName(this.name)}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n const schemas = this.schemas.map((s) => s.type);\n\n context.enter(this);\n trace(context, '-> [union:visit]', 'in: ' + schemas);\n\n if (!context.inContextOf('Composed', this)) {\n trace(context, '[union]', 'In union: ' + this.parent?.name);\n }\n\n for (const refSchema of this.schemas) {\n // OAS 3.1 writes nullability as a `{ type: \"null\" }` member — GraphQL fields are\n // nullable by default, so it adds nothing (the member form of #23's type arrays). #33\n if (refSchema && refSchema.type === 'null') {\n continue;\n }\n const type = Factory.fromSchema(context, this, refSchema);\n this.add(type);\n\n type.visit(context);\n trace(context, ' [union:visit]', 'of type: ' + type);\n }\n\n if (!context.inContextOf('Param', this)) {\n this.visitProperties(context);\n }\n\n if (this.name != null) {\n context.store(this.name, this);\n // members are absorbed into the merged object whenever we downgrade — in consolidate\n // mode, and in v0.4 mode when there is no discriminator (no tag field for ->match, so\n // generate() emits the merged object there too). see docs/issues.md #25\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n this.children.forEach((child) => context.decRefCount(child.name));\n }\n }\n\n this.visited = true;\n trace(context, '<- [union:visit]', 'out: ' + schemas);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n context.enter(this);\n const schemas = this.schemas.map((s) => s.type);\n trace(context, '-> [union::generate]', 'in: ' + schemas);\n\n /* params with Unions are weird, but here's an example:\n * id: oneOf [string, Enum {me}] */\n if (context.inContextOf('Param', this)) {\n for (const child of this.children) {\n child.generate(context, writer, selection);\n }\n } else if (context.inContextOf('Res', this)) {\n // R2: when promoted to an interface, the field returns the base interface, not the union name.\n writer.write(Naming.genTypeName(this.interfaceBaseRef ?? this.name));\n return;\n }\n // generate traditional union\n else {\n // Definition/reference agreement, like comp.ts: references emit genTypeName(name), so the\n // union line (and its consolidate-downgrade type) must too. see docs/issues.md #15, #6\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n const name = sanitised === refName ? refName : sanitised;\n\n if (context.generateOptions.consolidateUnions) {\n this.generateMergedObject(context, writer, selection, name, '#### NOT SUPPORTED YET BY CONNECTORS!!! union ');\n } else if (!this.discriminator) {\n // No tag field for `->match` to dispatch on, so a real union cannot be selected — the\n // selection already falls back to the flat merged form (see select); emit the matching\n // merged object here, or SDL says `union` while the selection selects a group on it\n // (GROUP_SELECTION_IS_NOT_OBJECT). see docs/issues.md #25\n this.generateMergedObject(\n context,\n writer,\n selection,\n name,\n '#### no discriminator — union degraded to a merged object: ',\n );\n } else if (this.interfaceBaseRef) {\n // R2: promoted to an interface — the base (emitted as `interface`) and the members\n // (each `... implements Base`) carry the type system; emit no `union X = A | B` line.\n trace(context, ' [union::generate]', `[interface] suppressing union line for ${this.name}`);\n } else {\n // list the members with selected fields. Filtering by prop-parent identity broke for\n // allOf members (their folded props keep the inner part as parent -> `union X = `). #34\n const filtered = this.selectedMembers(selection);\n\n writer\n .write('union ')\n .write(name)\n .write(this.nameSuffix())\n .write(' = ')\n .write(filtered.map((child) => Naming.getRefName(child.name)).join(' | '))\n .write('\\n\\n');\n }\n }\n\n trace(context, '<- [union::generate]', 'out: ' + schemas);\n context.leave(this);\n }\n\n // The downgrade shape both passes share: an info comment naming the original union, then one\n // object type carrying every member's selected fields (the selection selects the same flat set).\n private generateMergedObject(\n context: OasContext,\n writer: Writer,\n selection: string[],\n name: string,\n headline: string,\n ): void {\n if (!this.consolidated) {\n this.consolidate(selection).forEach((type) => context.decRefCount(type.name));\n }\n\n const childrenTypes = this.children.map((child) => Naming.getRefName(child.name));\n writer.write(headline).write(name).write(' = ').write(childrenTypes.join(' | ')).write('\\n\\n');\n\n trace(context, ' [union::generate]', `[union] -> object: ${this.name}`);\n\n writer\n .write(this.kind + ' ')\n .write(name)\n .write(this.nameSuffix())\n .write(' { #### replacement for Union ')\n .write(name)\n .write('\\n');\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n trace(context, ' [union::generate]', `-> property: ${prop.name} (parent: ${prop.parent!.name})`);\n if (!generated.has(prop.id)) prop.generate(context, writer, selection);\n generated.add(prop.id);\n }\n\n writer.write('} \\n### End replacement for ').write(this.name).write('\\n\\n');\n }\n\n // two inline members easily share a name (`[inline:Input]` twice) — same suffixing as Composed\n add(child: IType): IType {\n return super.add(this.withUniqueName(child));\n }\n\n // the members that carry at least one selected field — what the `union X = …` line lists and\n // what `->match` branches over. Composed members fold their allOf parts in first. see #34\n private selectedMembers(selection: string[]): IType[] {\n return this.children.filter((child) => {\n if (child instanceof Composed && child.schema.allOf != null && !child.consolidated) {\n child.consolidate(selection);\n }\n return Array.from(child.props.values()).some((p) => selection.find((s) => s.startsWith(p.path())));\n });\n }\n\n // a real `union X = Book | Movie` needs its members (and a member's shared $ref base, which\n // the writer may promote to an interface — R2); a merged one needs its flat fields instead\n dependencies(context: OasContext, selection: string[]): IType[] {\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n return this.selectedProps(selection);\n }\n return this.children.flatMap((member) => [\n member,\n ...(member instanceof Composed ? T.containers(member).filter((c) => T.isRef(c.name)) : []),\n ]);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]): void {\n trace(context, '-> [union::select]', `-> in: ${this.name}`);\n\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n // R2: when we emit a *real* `union X = A | B` (not the consolidate downgrade) and the\n // spec gives us a discriminator, produce the composable abstract-type selection\n // (connect v0.4): a spread `->match` whose branches set a string-literal __typename per\n // concrete member. Without a discriminator, or when consolidating, fall back to the flat\n // merged selection (the consolidate-downgrade shape).\n if (!context.generateOptions.consolidateUnions && this.discriminator) {\n this.selectAbstract(context, writer, selection);\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n return;\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id)) prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n\n /*if (context.generateOptions.consolidateUnions) {\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id))\n prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n } else {\n // add the prop parent paths to a set so we can only include those parents that have been selected\n const propParentsPathSet = new Set(this.selectedProps(selection).map(p => p.parent!.path()));\n\n // we should only include the names of those properties that have been selected\n this.children\n .filter(c => propParentsPathSet.has(c.path()))\n .forEach((child) => {\n child.select(context, writer, selection);\n });\n }*/\n\n /* TODO: better selection for Unions\n dataPoints: dataFormat->match(\n [\"raw\", $.dataPoints],\n [\"normal\", $.dataPoints {\n priceDateTime\n # all other fields\n }],\n [@, $ { # optimized\n priceDateTime\n # all other fields\n }\n ])\n */\n\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n }\n\n /**\n * R2: emit the connect-v0.4 abstract-type selection for a real union. Shape (verified to\n * compose under fed v2.13 / connect v0.4):\n *\n * ... <discriminator>->match(\n * [\"<value>\", $ { __typename: $(\"Book\") <Book fields> }],\n * [\"<value>\", $ { __typename: $(\"Movie\") <Movie fields> }]\n * )\n *\n * `__typename` is a string literal (required by the composer); per-member fields come from\n * each member's own `select`, scoped by the current selection.\n */\n private selectAbstract(context: OasContext, writer: Writer, selection: string[]): void {\n const base = context.indent;\n const pad = (n: number) => ' '.repeat(Math.max(n, 0));\n\n // The match operates on the *source* JSON field; quote it if not a bare identifier\n // (e.g. OAS discriminators like `@type`).\n const field = /^[_A-Za-z][_0-9A-Za-z]*$/.test(this.discriminator!)\n ? this.discriminator!\n : `\"${this.discriminator!}\"`;\n\n // Only members with at least one selected prop participate.\n const members = this.selectedMembers(selection);\n\n writer.write(pad(base)).write(`... ${field}->match(\\n`);\n\n members.forEach((child, idx) => {\n const typeName = Naming.getRefName(child.name)!;\n const value = this.discriminatorValue(child) ?? typeName.toLowerCase();\n\n writer.write(pad(base + 2)).write(`[\"${value}\", $ {\\n`);\n writer.write(pad(base + 4)).write(`__typename: $(\"${typeName}\")\\n`);\n\n // Member fields via the child's own select (scoped by selection). `select` writes at\n // `context.indent + stack.length`, so offset indent to land fields at base + 4.\n const savedIndent = context.indent;\n context.indent = base + 4 - context.stack.length;\n child.select(context, writer, selection);\n context.indent = savedIndent;\n\n writer\n .write(pad(base + 2))\n .write(idx < members.length - 1 ? '}],' : '}]')\n .write('\\n');\n });\n\n writer.write(pad(base)).write(')\\n');\n }\n\n /** Reverse-lookup an OAS discriminator value (e.g. \"book\") for a concrete member type. */\n private discriminatorValue(child: IType): string | null {\n const mapping = this.discriminatorMapping;\n if (!mapping) return null;\n const childRef = Naming.getRefName(child.name);\n for (const [value, ref] of Object.entries(mapping)) {\n if (Naming.getRefName(ref) === childRef) return value;\n }\n return null;\n }\n\n public consolidate(selection: string[]): Set<IType> {\n T.composables(this).forEach((child) => {\n (child as Composed).consolidate(selection);\n });\n\n const ids: Set<IType> = new Set();\n const props: Prop[] = [];\n const discriminator = this.discriminator;\n\n this.children?.forEach((child) => {\n // .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n ids.add(child);\n\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => props.push(prop));\n\n // props.push(...child.props.values());\n });\n\n // add the discriminator, if we have one\n if (discriminator) {\n const prop = (this.children || [])\n .map((child) => child.props.get(discriminator))\n .find((prop) => prop !== undefined);\n\n if (prop) props.push(prop);\n }\n\n // and finally sort the props and copy them to our original\n props.sort((a, b) => a.name.localeCompare(b.name)).forEach((prop) => this.props.set(prop.name, prop));\n\n // and return the types.ts we've used\n this.consolidated = true;\n\n // now remove every added ID\n const queue: IType[] = Array.from(this.children.values());\n while (queue.length > 0) {\n const node = queue.shift()!;\n const containers = T.containers(node);\n containers.forEach((c) => ids.add(c));\n // queue.push(...node.children);\n }\n\n return ids;\n }\n\n private visitProperties(_context: OasContext): void {\n // TODO: pending\n }\n\n public selectedProps(selection: string[]) {\n const collected: Prop[] = [];\n\n this.children.forEach((child) => {\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => collected.push(prop));\n });\n\n return collected;\n }\n\n private updateName(): void {\n let name = this.name;\n if (!name) {\n if (this.parent instanceof Res) {\n const op = this.parent!.parent as Get;\n name = op.getGqlOpName() + 'Response';\n } else {\n name = this.parent!.name + `Union`;\n }\n }\n\n this.name = name;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"union.js","sourceRoot":"","sources":["../../../src/oas/nodes/union.ts"],"names":[],"mappings":"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","sourcesContent":["import { Composed, Factory, Get, IType, Prop, Res, T, Type } from './internal.js';\nimport { SchemaObject } from 'oas/types';\nimport { trace } from '../log/trace.js';\nimport { OasContext } from '../oasContext.js';\nimport { Writer } from '../io/writer.js';\nimport { Naming } from '../utils/naming.js';\n\nexport class Union extends Type {\n public schemas: SchemaObject[];\n // OAS discriminator: `propertyName` is the source JSON field carrying the type tag,\n // `discriminatorMapping` maps each tag value to a schema ref (value -> \"#/.../Type\").\n public discriminator?: string;\n public discriminatorMapping?: Record<string, string>;\n // R2: when this discriminated union's members all share one allOf base, it is promoted to a\n // GraphQL interface. `interfaceBaseRef` is the base schema ref (\"#/.../Product\"); when set,\n // generate() returns the interface name (not the union name) and emits no `union` line. Set by\n // promoteInterfaces (a post-collect pass) — never in visit().\n public interfaceBaseRef?: string;\n\n constructor(\n parent: IType,\n name: string,\n schemas: SchemaObject[],\n public consolidated: boolean = false,\n disc?: { propertyName?: string; mapping?: Record<string, string> },\n ) {\n super(parent, name);\n this.schemas = schemas;\n this.discriminator = disc?.propertyName;\n this.discriminatorMapping = disc?.mapping;\n this.updateName();\n }\n\n get id(): string {\n return `union:${this.name}`;\n }\n\n public forPrompt(_context: OasContext): string {\n return `[union] ${Naming.getRefName(this.name)}`;\n }\n\n public visit(context: OasContext): void {\n if (this.visited) {\n return;\n }\n\n const schemas = this.schemas.map((s) => s.type);\n\n context.enter(this);\n trace(context, '-> [union:visit]', 'in: ' + schemas);\n\n if (!context.inContextOf('Composed', this)) {\n trace(context, '[union]', 'In union: ' + this.parent?.name);\n }\n\n for (const refSchema of this.schemas) {\n // OAS 3.1 writes nullability as a `{ type: \"null\" }` member — GraphQL fields are\n // nullable by default, so it adds nothing (the member form of #23's type arrays). #33\n if (refSchema && refSchema.type === 'null') {\n continue;\n }\n const type = Factory.fromSchema(context, this, refSchema);\n this.add(type);\n\n type.visit(context);\n trace(context, ' [union:visit]', 'of type: ' + type);\n }\n\n if (!context.inContextOf('Param', this)) {\n this.visitProperties(context);\n }\n\n if (this.name != null) {\n context.store(this.name, this);\n // members are absorbed into the merged object whenever we downgrade — in consolidate\n // mode, and in v0.4 mode when there is no discriminator (no tag field for ->match, so\n // generate() emits the merged object there too). see docs/issues.md #25\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n this.children.forEach((child) => context.decRefCount(child.name));\n }\n }\n\n this.visited = true;\n trace(context, '<- [union:visit]', 'out: ' + schemas);\n context.leave(this);\n }\n\n public generate(context: OasContext, writer: Writer, selection: string[]): void {\n context.enter(this);\n const schemas = this.schemas.map((s) => s.type);\n trace(context, '-> [union::generate]', 'in: ' + schemas);\n\n /* params with Unions are weird, but here's an example:\n * id: oneOf [string, Enum {me}] */\n if (context.inContextOf('Param', this)) {\n for (const child of this.children) {\n child.generate(context, writer, selection);\n }\n } else if (context.inContextOf('Res', this)) {\n // R2: when promoted to an interface, the field returns the base interface, not the union name.\n writer.write(Naming.genTypeName(this.interfaceBaseRef ?? this.name));\n return;\n }\n // generate traditional union\n else {\n // Definition/reference agreement, like comp.ts: references emit genTypeName(name), so the\n // union line (and its consolidate-downgrade type) must too. see docs/issues.md #15, #6\n const sanitised = Naming.genTypeName(this.name);\n const refName = Naming.getRefName(this.name);\n const name = sanitised === refName ? refName : sanitised;\n\n if (context.generateOptions.consolidateUnions) {\n this.generateMergedObject(context, writer, selection, name, '#### NOT SUPPORTED YET BY CONNECTORS!!! union ');\n } else if (!this.discriminator) {\n // No tag field for `->match` to dispatch on, so a real union cannot be selected — the\n // selection already falls back to the flat merged form (see select); emit the matching\n // merged object here, or SDL says `union` while the selection selects a group on it\n // (GROUP_SELECTION_IS_NOT_OBJECT). see docs/issues.md #25\n this.generateMergedObject(\n context,\n writer,\n selection,\n name,\n '#### no discriminator — union degraded to a merged object: ',\n );\n } else if (this.interfaceBaseRef) {\n // R2: promoted to an interface — the base (emitted as `interface`) and the members\n // (each `... implements Base`) carry the type system; emit no `union X = A | B` line.\n trace(context, ' [union::generate]', `[interface] suppressing union line for ${this.name}`);\n } else {\n // list the members with selected fields. Filtering by prop-parent identity broke for\n // allOf members (their folded props keep the inner part as parent -> `union X = `). #34\n const filtered = this.selectedMembers(selection);\n\n writer\n .write('union ')\n .write(name)\n .write(this.nameSuffix())\n .write(' = ')\n .write(filtered.map((child) => Naming.getRefName(child.name)).join(' | '))\n .write('\\n\\n');\n }\n }\n\n trace(context, '<- [union::generate]', 'out: ' + schemas);\n context.leave(this);\n }\n\n // The downgrade shape both passes share: an info comment naming the original union, then one\n // object type carrying every member's selected fields (the selection selects the same flat set).\n private generateMergedObject(\n context: OasContext,\n writer: Writer,\n selection: string[],\n name: string,\n headline: string,\n ): void {\n if (!this.consolidated) {\n this.consolidate(selection).forEach((type) => context.decRefCount(type.name));\n }\n\n const childrenTypes = this.children.map((child) => Naming.getRefName(child.name));\n writer.write(headline).write(name).write(' = ').write(childrenTypes.join(' | ')).write('\\n\\n');\n\n trace(context, ' [union::generate]', `[union] -> object: ${this.name}`);\n\n // The merged object's keyword follows the node's `kind`, which is inherited from the parent\n // context: a response-rooted Union is `kind='type'`; a request-body-rooted Union is\n // `kind='input'` (Body sets it on construction — see body.ts). Both are correct: the merged\n // object is referenced exactly as its context dictates (response -> output field, body ->\n // Mutation argument), and `nameSuffix()` (`'Input'` when kind=input) keeps the names\n // distinct when the same schema is reached both ways. Do NOT hard-code `'type '` here —\n // it would emit an input-position merge as an output type and break the body case. See C6.\n writer\n .write(this.kind + ' ')\n .write(name)\n .write(this.nameSuffix())\n .write(' { #### replacement for Union ')\n .write(name)\n .write('\\n');\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n trace(context, ' [union::generate]', `-> property: ${prop.name} (parent: ${prop.parent!.name})`);\n if (!generated.has(prop.id)) prop.generate(context, writer, selection);\n generated.add(prop.id);\n }\n\n writer.write('} \\n### End replacement for ').write(this.name).write('\\n\\n');\n }\n\n // two inline members easily share a name (`[inline:Input]` twice) — same suffixing as Composed\n add(child: IType): IType {\n return super.add(this.withUniqueName(child));\n }\n\n // the members that carry at least one selected field — what the `union X = …` line lists and\n // what `->match` branches over. Composed members fold their allOf parts in first. see #34\n private selectedMembers(selection: string[]): IType[] {\n return this.children.filter((child) => {\n if (child instanceof Composed && child.schema.allOf != null && !child.consolidated) {\n child.consolidate(selection);\n }\n return Array.from(child.props.values()).some((p) => selection.find((s) => s.startsWith(p.path())));\n });\n }\n\n // a real `union X = Book | Movie` needs its members (and a member's shared $ref base, which\n // the writer may promote to an interface — R2); a merged one needs its flat fields instead\n dependencies(context: OasContext, selection: string[]): IType[] {\n if (context.generateOptions.consolidateUnions || !this.discriminator) {\n return this.selectedProps(selection);\n }\n return this.children.flatMap((member) => [\n member,\n ...(member instanceof Composed ? T.containers(member).filter((c) => T.isRef(c.name)) : []),\n ]);\n }\n\n public select(context: OasContext, writer: Writer, selection: string[]): void {\n trace(context, '-> [union::select]', `-> in: ${this.name}`);\n\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n // R2: when we emit a *real* `union X = A | B` (not the consolidate downgrade) and the\n // spec gives us a discriminator, produce the composable abstract-type selection\n // (connect v0.4): a spread `->match` whose branches set a string-literal __typename per\n // concrete member. Without a discriminator, or when consolidating, fall back to the flat\n // merged selection (the consolidate-downgrade shape).\n if (!context.generateOptions.consolidateUnions && this.discriminator) {\n this.selectAbstract(context, writer, selection);\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n return;\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id)) prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n\n /*if (context.generateOptions.consolidateUnions) {\n if (!this.consolidated) {\n this.consolidate(selection);\n }\n\n const selected = this.selectedProps(selection);\n const generated = new Set<string>();\n for (const prop of selected) {\n if (!generated.has(prop.id))\n prop.select(context, writer, selection);\n generated.add(prop.id);\n }\n } else {\n // add the prop parent paths to a set so we can only include those parents that have been selected\n const propParentsPathSet = new Set(this.selectedProps(selection).map(p => p.parent!.path()));\n\n // we should only include the names of those properties that have been selected\n this.children\n .filter(c => propParentsPathSet.has(c.path()))\n .forEach((child) => {\n child.select(context, writer, selection);\n });\n }*/\n\n /* TODO: better selection for Unions\n dataPoints: dataFormat->match(\n [\"raw\", $.dataPoints],\n [\"normal\", $.dataPoints {\n priceDateTime\n # all other fields\n }],\n [@, $ { # optimized\n priceDateTime\n # all other fields\n }\n ])\n */\n\n trace(context, '<- [union::select]', `-> out: ${this.name}`);\n }\n\n /**\n * R2: emit the connect-v0.4 abstract-type selection for a real union. Shape (verified to\n * compose under fed v2.13 / connect v0.4):\n *\n * ... <discriminator>->match(\n * [\"<value>\", $ { __typename: $(\"Book\") <Book fields> }],\n * [\"<value>\", $ { __typename: $(\"Movie\") <Movie fields> }]\n * )\n *\n * `__typename` is a string literal (required by the composer); per-member fields come from\n * each member's own `select`, scoped by the current selection.\n */\n private selectAbstract(context: OasContext, writer: Writer, selection: string[]): void {\n const base = context.indent;\n const pad = (n: number) => ' '.repeat(Math.max(n, 0));\n\n // The match operates on the *source* JSON field; quote it if not a bare identifier\n // (e.g. OAS discriminators like `@type`).\n const field = /^[_A-Za-z][_0-9A-Za-z]*$/.test(this.discriminator!)\n ? this.discriminator!\n : `\"${this.discriminator!}\"`;\n\n // Only members with at least one selected prop participate.\n const members = this.selectedMembers(selection);\n\n writer.write(pad(base)).write(`... ${field}->match(\\n`);\n\n members.forEach((child, idx) => {\n const typeName = Naming.getRefName(child.name)!;\n // OAS 3.x: when no explicit discriminator `mapping` is present, the implicit tag value\n // is the bare (un-prefixed) ref name — e.g. \"Book\", NOT \"book\". Lowercasing it produced a\n // `->match` branch that never fired against spec-compliant payloads. See C1.\n const value = this.discriminatorValue(child) ?? typeName;\n\n writer.write(pad(base + 2)).write(`[\"${value}\", $ {\\n`);\n writer.write(pad(base + 4)).write(`__typename: $(\"${typeName}\")\\n`);\n\n // Member fields via the child's own select (scoped by selection). `select` writes at\n // `context.indent + stack.length`, so offset indent to land fields at base + 4.\n const savedIndent = context.indent;\n context.indent = base + 4 - context.stack.length;\n child.select(context, writer, selection);\n context.indent = savedIndent;\n\n writer\n .write(pad(base + 2))\n .write(idx < members.length - 1 ? '}],' : '}]')\n .write('\\n');\n });\n\n writer.write(pad(base)).write(')\\n');\n }\n\n /** Reverse-lookup an OAS discriminator value (e.g. \"book\") for a concrete member type. */\n private discriminatorValue(child: IType): string | null {\n const mapping = this.discriminatorMapping;\n if (!mapping) return null;\n const childRef = Naming.getRefName(child.name);\n for (const [value, ref] of Object.entries(mapping)) {\n if (Naming.getRefName(ref) === childRef) return value;\n }\n return null;\n }\n\n public consolidate(selection: string[]): Set<IType> {\n T.composables(this).forEach((child) => {\n (child as Composed).consolidate(selection);\n });\n\n const ids: Set<IType> = new Set();\n const props: Prop[] = [];\n const discriminator = this.discriminator;\n\n this.children?.forEach((child) => {\n // .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n ids.add(child);\n\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => props.push(prop));\n\n // props.push(...child.props.values());\n });\n\n // add the discriminator, if we have one\n if (discriminator) {\n const prop = (this.children || [])\n .map((child) => child.props.get(discriminator))\n .find((prop) => prop !== undefined);\n\n if (prop) props.push(prop);\n }\n\n // and finally sort the props and copy them to our original\n props.sort((a, b) => a.name.localeCompare(b.name)).forEach((prop) => this.props.set(prop.name, prop));\n\n // and return the types.ts we've used\n this.consolidated = true;\n\n // now remove every added ID\n const queue: IType[] = Array.from(this.children.values());\n while (queue.length > 0) {\n const node = queue.shift()!;\n const containers = T.containers(node);\n containers.forEach((c) => ids.add(c));\n // queue.push(...node.children);\n }\n\n return ids;\n }\n\n private visitProperties(_context: OasContext): void {\n // TODO: pending\n }\n\n public selectedProps(selection: string[]) {\n const collected: Prop[] = [];\n\n this.children.forEach((child) => {\n Array.from(child.props.values())\n .filter((prop) => selection.find((s) => s.startsWith(prop.path())))\n .forEach((prop) => collected.push(prop));\n });\n\n return collected;\n }\n\n private updateName(): void {\n let name = this.name;\n if (!name) {\n if (this.parent instanceof Res) {\n const op = this.parent!.parent as Get;\n name = op.getGqlOpName() + 'Response';\n } else {\n name = this.parent!.name + `Union`;\n }\n }\n\n this.name = name;\n }\n}\n"]}
|
package/dist/oas/oasContext.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oasContext.js","sourceRoot":"","sources":["../../src/oas/oasContext.ts"],"names":[],"mappings":"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","sourcesContent":["import { trace, warn } from './log/trace.js';\nimport Oas from 'oas';\nimport { ParameterObject, ResponseObject, SchemaObject } from 'oas/types';\nimport { DEFAULT_VERSIONS } from '../versions.js';\nimport { ReferenceObject } from './nodes/internal.js';\nimport { Naming } from './utils/naming.js';\nimport { IType } from './nodes/internal.js';\n\nimport { Mapper } from './mapper/index.js';\n\n// per-operation request rewiring, keyed by op id (`get:/pets/{id}`): replace the HTTP path,\n// query params (raw JSONSelection values, e.g. `$('2024-01')`), headers (string templates,\n// e.g. `{$config.key}`) and/or the whole body mapping; null drops one, unknown keys append\nexport type RequestOverride = {\n path?: string;\n queryParams?: Record<string, string | null>;\n headers?: Record<string, string | null>;\n body?: string | null;\n};\n\n// R6: per-batch-endpoint settings. The only knob is the size cap; everything else\n// (entity, key, request, selection) is inferred. `{}`/`null` = defaults.\nexport type BatchEntry = { maxSize?: number };\n\n// R6: batch endpoints, keyed by op id. e.g. { \"post:/products/batch\": { maxSize: 50 } }\nexport type BatchConfig = Record<string, BatchEntry | null>;\n\nexport type GenerateOptions = {\n baseURL?: string;\n overrides?: Record<string, RequestOverride>;\n batch?: BatchConfig;\n consolidateUnions?: boolean;\n showParentInSelections: boolean;\n federationVersion?: string;\n connectorSpecVersion?: string;\n mapper?: Mapper;\n skipOptionalArgs?: boolean;\n inferEntityResolvers?: boolean;\n emitConnectorErrors?: boolean;\n};\n\n// Max nested $ref hops resolvePointer will follow before giving up (guards against ref cycles).\nconst MAX_REF_DEPTH = 5;\n\n// Split a JSON pointer (`#/a/b~1c`) into decoded segments: RFC-6901 unescape (`~1`->`/`, `~0`->`~`),\n// then percent-decode, since pointers encode path keys (e.g. `#/paths/~1v2~1apps~1%7Bid%7D`).\nfunction decodePointer(ref: string): string[] {\n return ref\n .slice(2)\n .split('/')\n .map((segment) => {\n const unescaped = segment.replace(/~1/g, '/').replace(/~0/g, '~');\n try {\n return decodeURIComponent(unescaped);\n } catch {\n return unescaped;\n }\n });\n}\n\nexport class OasContext {\n public static readonly COMPONENTS_SCHEMAS: string = '#/components/schemas/';\n public static readonly COMPONENTS_RESPONSES: string = '#/components/responses/';\n public static readonly PARAMETER_SCHEMAS: string = '#/components/parameters/';\n\n public generatedSet: Set<string> = new Set();\n public indent: number;\n\n // #13: SDL-only prop replacements, keyed by the emitted instance. When same-id instances\n // diverge on cycle cuts, generate() emits the donor's un-cut field while every path's\n // *selection* keeps its own cut comment (mutating props leaked the field into the cut\n // position's selection -> rover CIRCULAR_REFERENCE). Set by TypesCollector.collect.\n // e.g. (confluence): two `Space` instances in one op —\n // under Content: Space { # history — cut } <- collected first, wins emission\n // under Result: Space { history: SpaceHistory }\n // entry: keptSpace -> { \"history\" -> donor prop } => SDL emits `history: SpaceHistory`,\n // the Content path's selection still reads `# history: circular reference omitted`\n public sdlPropOverrides: Map<IType, Map<string, IType>> = new Map();\n\n public stack: IType[] = new Array<IType>();\n public types: Map<string, IType | undefined> = new Map();\n public generateOptions: GenerateOptions;\n public refCount: Map<string, number> = new Map();\n\n private parser: Oas;\n\n constructor(parser: Oas, options?: GenerateOptions) {\n this.parser = parser;\n this.indent = 0;\n this.generateOptions = options || {\n consolidateUnions: true, // by default, we consolidate fields until unions are supported\n showParentInSelections: true, // by default, we don't show where the fields are coming from\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n };\n }\n\n public reset(): void {\n this.generatedSet?.clear();\n this.sdlPropOverrides.clear();\n }\n\n public enter(type: IType): void {\n this.stack.push(type);\n trace(this, '-> [context::enter]', type.id);\n }\n\n public leave(type: IType): void {\n this.stack.pop();\n trace(this, '<- [context::leave]', type.id);\n }\n\n public size() {\n return this.stack.length;\n }\n\n public store(name: string, type: IType): void {\n trace(this, '[context::store]', 'store ' + type.id);\n this.types.set(name, type);\n\n // Also reserve the *emitted* GraphQL name: an inline object named by its property key must not\n // collide with a component's emitted name ('user' vs '#/c/s/User' both emit `User`). see issues.md #12\n const emitted = Naming.genTypeName(name);\n if (emitted !== name) {\n this.types.set(emitted, type);\n }\n }\n\n public lookupResponse(ref: string): ResponseObject | ReferenceObject | null {\n if (ref && ref.startsWith(OasContext.COMPONENTS_RESPONSES)) {\n const definition = this.parser.getDefinition();\n const responses = definition.components?.responses ?? {};\n\n // get the response schema\n return responses[Naming.getRefName(ref)!] ?? null;\n }\n\n // generic JSON-pointer response ref (e.g. #/paths/…/responses/<code>). see docs/issues.md #3\n if (ref && ref.startsWith('#/')) {\n return (this.resolvePointer(ref) as ResponseObject) ?? null;\n }\n\n return null;\n }\n\n public lookupRef(ref: string | null): SchemaObject | null {\n if (ref && ref.startsWith(OasContext.COMPONENTS_SCHEMAS)) {\n const definition = this.parser.getDefinition();\n const schemas = definition.components?.schemas ?? {};\n // the named component, when the ref points AT one (`#/components/schemas/User` -> `User`)\n const direct = schemas[Naming.getRefName(ref)!];\n\n if (direct) {\n // count the reference only when it actually resolves to a named component\n const currentCount = this.refCount.get(ref) || 0;\n this.refCount.set(ref, currentCount + 1);\n return direct;\n }\n // not a named component but a pointer INTO one (openai:\n // `#/components/schemas/CreateCompletionRequest/properties/logit_bias`) — walk it below. #33\n }\n\n // generic JSON-pointer schema ref (e.g. #/paths/…); not a named component, so it skips\n // refCount/consolidation. see docs/issues.md #3\n if (ref && ref.startsWith('#/')) {\n return (this.resolvePointer(ref) as SchemaObject) ?? null;\n }\n\n return null;\n }\n\n public decRefCount(ref: string): void {\n if (ref && ref.startsWith(OasContext.COMPONENTS_SCHEMAS)) {\n const currentCount = this.refCount.get(ref) || 0;\n if (currentCount > 0) {\n this.refCount.set(ref, currentCount - 1);\n }\n }\n }\n\n public lookupParam(ref: string): ParameterObject | boolean {\n if (ref && ref.startsWith(OasContext.PARAMETER_SCHEMAS)) {\n const definition = this.parser.getDefinition();\n const parameters = definition.components?.parameters ?? {};\n\n // get the parameter schema\n const name = Naming.getRefName(ref)!;\n return (parameters[name] as ParameterObject) ?? false;\n }\n\n // generic JSON-pointer param ref (e.g. shared params via #/paths/…/parameters/N). see docs/issues.md #3\n if (ref && ref.startsWith('#/')) {\n return (this.resolvePointer(ref) as ParameterObject) ?? false;\n }\n\n return false;\n }\n\n // Resolve an internal JSON pointer (`#/a/b/0`) against the parsed OAS document, following nested\n // $ref chains (a pointer may land on another `{ $ref }`). `depth` bounds ref-chasing.\n public resolvePointer(ref: string | null, depth = 0): unknown {\n if (!ref || !ref.startsWith('#/') || depth > MAX_REF_DEPTH) return undefined;\n\n let cur: unknown = this.parser.getDefinition();\n for (const segment of decodePointer(ref)) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[segment];\n }\n\n if (cur != null && typeof cur === 'object' && '$ref' in cur) {\n return this.resolvePointer((cur as ReferenceObject).$ref, depth + 1);\n }\n return cur;\n }\n\n public inContextOf(type: string, node: IType): boolean {\n // console\n for (let i = this.stack.length - 1; i >= 0; i--) {\n if (this.stack[i] === node) {\n continue;\n }\n\n if (this.stack[i].constructor.name === type) {\n return true;\n }\n }\n\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oasContext.js","sourceRoot":"","sources":["../../src/oas/oasContext.ts"],"names":[],"mappings":"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","sourcesContent":["import { trace, warn } from './log/trace.js';\nimport Oas from 'oas';\nimport { ParameterObject, ResponseObject, SchemaObject } from 'oas/types';\nimport { DEFAULT_VERSIONS } from '../versions.js';\nimport { ReferenceObject } from './nodes/internal.js';\nimport { Naming } from './utils/naming.js';\nimport { IType } from './nodes/internal.js';\n\nimport { Mapper } from './mapper/index.js';\n\n// per-operation request rewiring, keyed by op id (`get:/pets/{id}`): replace the HTTP path,\n// query params (raw JSONSelection values, e.g. `$('2024-01')`), headers (string templates,\n// e.g. `{$config.key}`) and/or the whole body mapping; null drops one, unknown keys append\nexport type RequestOverride = {\n path?: string;\n queryParams?: Record<string, string | null>;\n headers?: Record<string, string | null>;\n body?: string | null;\n};\n\n// R6: per-batch-endpoint settings. The only knob is the size cap; everything else\n// (entity, key, request, selection) is inferred. `{}`/`null` = defaults.\nexport type BatchEntry = { maxSize?: number };\n\n// R6: batch endpoints, keyed by op id. e.g. { \"post:/products/batch\": { maxSize: 50 } }\nexport type BatchConfig = Record<string, BatchEntry | null>;\n\nexport type GenerateOptions = {\n baseURL?: string;\n overrides?: Record<string, RequestOverride>;\n batch?: BatchConfig;\n consolidateUnions?: boolean;\n showParentInSelections: boolean;\n federationVersion?: string;\n connectorSpecVersion?: string;\n mapper?: Mapper;\n skipOptionalArgs?: boolean;\n inferEntityResolvers?: boolean;\n emitConnectorErrors?: boolean;\n skipAuth?: boolean;\n};\n\n// Max nested $ref hops resolvePointer will follow before giving up (guards against ref cycles).\nconst MAX_REF_DEPTH = 5;\n\n// Split a JSON pointer (`#/a/b~1c`) into decoded segments: RFC-6901 unescape (`~1`->`/`, `~0`->`~`),\n// then percent-decode, since pointers encode path keys (e.g. `#/paths/~1v2~1apps~1%7Bid%7D`).\nfunction decodePointer(ref: string): string[] {\n return ref\n .slice(2)\n .split('/')\n .map((segment) => {\n const unescaped = segment.replace(/~1/g, '/').replace(/~0/g, '~');\n try {\n return decodeURIComponent(unescaped);\n } catch {\n return unescaped;\n }\n });\n}\n\nexport class OasContext {\n public static readonly COMPONENTS_SCHEMAS: string = '#/components/schemas/';\n public static readonly COMPONENTS_RESPONSES: string = '#/components/responses/';\n public static readonly PARAMETER_SCHEMAS: string = '#/components/parameters/';\n\n public generatedSet: Set<string> = new Set();\n public indent: number;\n\n // #13: SDL-only prop replacements, keyed by the emitted instance. When same-id instances\n // diverge on cycle cuts, generate() emits the donor's un-cut field while every path's\n // *selection* keeps its own cut comment (mutating props leaked the field into the cut\n // position's selection -> rover CIRCULAR_REFERENCE). Set by TypesCollector.collect.\n // e.g. (confluence): two `Space` instances in one op —\n // under Content: Space { # history — cut } <- collected first, wins emission\n // under Result: Space { history: SpaceHistory }\n // entry: keptSpace -> { \"history\" -> donor prop } => SDL emits `history: SpaceHistory`,\n // the Content path's selection still reads `# history: circular reference omitted`\n public sdlPropOverrides: Map<IType, Map<string, IType>> = new Map();\n\n public stack: IType[] = new Array<IType>();\n public types: Map<string, IType | undefined> = new Map();\n public generateOptions: GenerateOptions;\n public refCount: Map<string, number> = new Map();\n\n private parser: Oas;\n\n constructor(parser: Oas, options?: GenerateOptions) {\n this.parser = parser;\n this.indent = 0;\n this.generateOptions = options || {\n consolidateUnions: true, // by default, we consolidate fields until unions are supported\n showParentInSelections: true, // by default, we don't show where the fields are coming from\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n };\n }\n\n public reset(): void {\n this.generatedSet?.clear();\n this.sdlPropOverrides.clear();\n }\n\n public enter(type: IType): void {\n this.stack.push(type);\n trace(this, '-> [context::enter]', type.id);\n }\n\n public leave(type: IType): void {\n this.stack.pop();\n trace(this, '<- [context::leave]', type.id);\n }\n\n public size() {\n return this.stack.length;\n }\n\n public store(name: string, type: IType): void {\n trace(this, '[context::store]', 'store ' + type.id);\n this.types.set(name, type);\n\n // Also reserve the *emitted* GraphQL name: an inline object named by its property key must not\n // collide with a component's emitted name ('user' vs '#/c/s/User' both emit `User`). see issues.md #12\n const emitted = Naming.genTypeName(name);\n if (emitted !== name) {\n this.types.set(emitted, type);\n }\n }\n\n public lookupResponse(ref: string): ResponseObject | ReferenceObject | null {\n if (ref && ref.startsWith(OasContext.COMPONENTS_RESPONSES)) {\n const definition = this.parser.getDefinition();\n const responses = definition.components?.responses ?? {};\n\n // get the response schema\n return responses[Naming.getRefName(ref)!] ?? null;\n }\n\n // generic JSON-pointer response ref (e.g. #/paths/…/responses/<code>). see docs/issues.md #3\n if (ref && ref.startsWith('#/')) {\n return (this.resolvePointer(ref) as ResponseObject) ?? null;\n }\n\n return null;\n }\n\n public lookupRef(ref: string | null): SchemaObject | null {\n if (ref && ref.startsWith(OasContext.COMPONENTS_SCHEMAS)) {\n const definition = this.parser.getDefinition();\n const schemas = definition.components?.schemas ?? {};\n // the named component, when the ref points AT one (`#/components/schemas/User` -> `User`)\n const direct = schemas[Naming.getRefName(ref)!];\n\n if (direct) {\n // count the reference only when it actually resolves to a named component\n const currentCount = this.refCount.get(ref) || 0;\n this.refCount.set(ref, currentCount + 1);\n return direct;\n }\n // not a named component but a pointer INTO one (openai:\n // `#/components/schemas/CreateCompletionRequest/properties/logit_bias`) — walk it below. #33\n }\n\n // generic JSON-pointer schema ref (e.g. #/paths/…); not a named component, so it skips\n // refCount/consolidation. see docs/issues.md #3\n if (ref && ref.startsWith('#/')) {\n return (this.resolvePointer(ref) as SchemaObject) ?? null;\n }\n\n return null;\n }\n\n public decRefCount(ref: string): void {\n if (ref && ref.startsWith(OasContext.COMPONENTS_SCHEMAS)) {\n const currentCount = this.refCount.get(ref) || 0;\n if (currentCount > 0) {\n this.refCount.set(ref, currentCount - 1);\n }\n }\n }\n\n public lookupParam(ref: string): ParameterObject | boolean {\n if (ref && ref.startsWith(OasContext.PARAMETER_SCHEMAS)) {\n const definition = this.parser.getDefinition();\n const parameters = definition.components?.parameters ?? {};\n\n // get the parameter schema\n const name = Naming.getRefName(ref)!;\n return (parameters[name] as ParameterObject) ?? false;\n }\n\n // generic JSON-pointer param ref (e.g. shared params via #/paths/…/parameters/N). see docs/issues.md #3\n if (ref && ref.startsWith('#/')) {\n return (this.resolvePointer(ref) as ParameterObject) ?? false;\n }\n\n return false;\n }\n\n // Resolve an internal JSON pointer (`#/a/b/0`) against the parsed OAS document, following nested\n // $ref chains (a pointer may land on another `{ $ref }`). `depth` bounds ref-chasing.\n public resolvePointer(ref: string | null, depth = 0): unknown {\n if (!ref || !ref.startsWith('#/') || depth > MAX_REF_DEPTH) return undefined;\n\n let cur: unknown = this.parser.getDefinition();\n for (const segment of decodePointer(ref)) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[segment];\n }\n\n if (cur != null && typeof cur === 'object' && '$ref' in cur) {\n return this.resolvePointer((cur as ReferenceObject).$ref, depth + 1);\n }\n return cur;\n }\n\n public inContextOf(type: string, node: IType): boolean {\n // console\n for (let i = this.stack.length - 1; i >= 0; i--) {\n if (this.stack[i] === node) {\n continue;\n }\n\n if (this.stack[i].constructor.name === type) {\n return true;\n }\n }\n\n return false;\n }\n}\n"]}
|
package/dist/oas/oasGen.d.ts
CHANGED
package/dist/oas/oasGen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oasGen.js","sourceRoot":"","sources":["../../src/oas/oasGen.ts"],"names":[],"mappings":"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","sourcesContent":["import Oas from 'oas';\nimport OASNormalize from 'oas-normalize';\nimport { Operation, Webhook } from 'oas/operation';\nimport { HttpMethods, OASDocument } from 'oas/types';\nimport { OpenAPI } from 'openapi-types';\n\nimport fs from 'fs';\nimport { DEFAULT_VERSIONS, resolveConsolidateUnions, validateVersionOptions } from '../versions.js';\nimport { BatchConfig, GenerateOptions, OasContext, RequestOverride } from './oasContext.js';\nimport { Factory, IType } from './nodes/internal.js';\nimport { Writer } from './io/writer.js';\nimport { trace } from './log/trace.js';\nimport { TypesCollector } from './generator/typesCollector.js';\nimport { Mapper } from './mapper/types.js';\nimport { Naming } from './utils/naming.js';\n\ninterface IGenOptions {\n skipValidation?: boolean;\n baseURL?: string;\n overrides?: Record<string, RequestOverride>;\n batch?: BatchConfig;\n consolidateUnions?: boolean;\n showParentInSelections: boolean;\n federationVersion?: string;\n connectorSpecVersion?: string;\n mapper?: Mapper;\n skipOptionalArgs?: boolean;\n inferEntityResolvers?: boolean;\n emitConnectorErrors?: boolean;\n}\n\nexport class OasGen {\n public selections: string[] = [];\n private visited: boolean = false;\n\n public static async fromData(\n data: ArrayBuffer,\n options: IGenOptions = {\n skipValidation: false,\n consolidateUnions: true,\n showParentInSelections: false,\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n mapper: undefined,\n skipOptionalArgs: false,\n },\n ): Promise<OasGen> {\n validateVersionOptions(options);\n\n const normalizer: OASNormalize = new OASNormalize(data, {\n enablePaths: true,\n });\n\n const _loaded: Record<string, unknown> = await normalizer.load();\n console.log('loaded file');\n\n const _normalised: OpenAPI.Document = await normalizer.bundle();\n console.log('loaded bundle');\n\n if (!options.skipValidation) {\n const validated: boolean = await normalizer.validate();\n if (!validated) {\n console.log('validated', validated);\n throw new Error('Could not validate source file');\n }\n }\n\n const json = await normalizer.convert();\n console.log('converted');\n\n const parser: Oas = new Oas(json as OASDocument);\n return new OasGen(parser, options);\n }\n\n public static async fromFile(\n sourceFile: string,\n options: IGenOptions = {\n skipValidation: false,\n consolidateUnions: true,\n showParentInSelections: false,\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n mapper: undefined,\n skipOptionalArgs: false,\n },\n // prompt: Prompt\n ): Promise<OasGen> {\n validateVersionOptions(options);\n\n if (!fs.existsSync(sourceFile)) {\n throw new Error('Source not found: ' + sourceFile);\n }\n\n const normalizer: OASNormalize = new OASNormalize(sourceFile, {\n enablePaths: true,\n });\n\n const _loaded: Record<string, unknown> = await normalizer.load();\n console.log('loaded file');\n\n const _normalised: OpenAPI.Document = await normalizer.bundle();\n console.log('loaded bundle');\n\n if (!options.skipValidation) {\n const validated: boolean = await normalizer.validate();\n if (!validated) {\n console.log('validated', validated);\n throw new Error('Could not validate source file');\n }\n }\n\n const json = await normalizer.convert();\n console.log('converted');\n\n const parser: Oas = new Oas(json as OASDocument);\n return new OasGen(parser, options);\n }\n\n public parser: Oas;\n // public prompt: Prompt;\n public context?: OasContext;\n public paths: Map<string, IType> = new Map();\n public options: GenerateOptions;\n private collector: TypesCollector;\n\n constructor(parser: Oas, options: GenerateOptions) {\n this.parser = parser;\n // real unions/interfaces only exist from connect v0.4 — derive the union form from the\n // version unless explicitly chosen (an invalid explicit choice downgrades loudly). R2\n this.options = {\n ...options,\n consolidateUnions: resolveConsolidateUnions(\n options.connectorSpecVersion ?? DEFAULT_VERSIONS.connectorSpecVersion,\n options.consolidateUnions,\n ),\n };\n this.collector = new TypesCollector(this);\n }\n\n public title(): string {\n return this.parser.getDefinition().info.title;\n }\n\n public version(): string {\n return this.parser.getDefinition().info.version;\n }\n\n public expanded(paths: string[]): string[] {\n this.collector.collect(paths);\n return this.collector.expanded;\n }\n\n public getTypes(paths: string[]): Map<string, IType> {\n // make sure we pass the latest options to our context for the generation\n const context = this.getContext();\n context.generateOptions = this.options;\n\n this.collector.collect(paths);\n\n return this.collector.types;\n }\n\n public generateSchema(paths: string[]): string {\n // typo guard: an override key that matches no operation would silently do nothing\n for (const key of Object.keys(this.options.overrides ?? {})) {\n if (!this.paths.has(key)) {\n console.warn(`[overrides] no operation matches \"${key}\" — override ignored.`);\n }\n }\n\n // make sure we pass the latest options to our context for the generation\n const context = this.getContext();\n context.reset();\n context.generateOptions = this.options;\n\n this.collector.collect(paths);\n\n const writer: Writer = new Writer(this);\n this.selections = writer.generateWith(this.collector.types, this.collector.expanded);\n\n return writer.flush();\n }\n\n public async visit(): Promise<void> {\n const parser = this.parser;\n const context = this.getContext();\n\n const paths = parser.getPaths();\n const filtered = Object.entries(paths)\n .filter(([_key, pathItem]) => this.isSupported(pathItem))\n .sort((a, b) => a[0].localeCompare(b[0], undefined, { sensitivity: 'base' }));\n\n const collected = new Map<string, IType>();\n for (const [key, pathItem] of filtered) {\n this.visitPath(context, key, pathItem).forEach((type) => collected.set(type.id, type));\n }\n\n this.paths = collected;\n }\n\n public visitSync(): void {\n if (this.visited) return;\n\n const parser = this.parser;\n const context = this.getContext();\n\n const paths = parser.getPaths();\n const filtered = Object.entries(paths)\n .filter(([_key, pathItem]) => this.isSupported(pathItem))\n .sort((a, b) => a[0].localeCompare(b[0], undefined, { sensitivity: 'base' }));\n\n const collected = new Map<string, IType>();\n for (const [key, pathItem] of filtered) {\n this.visitPath(context, key, pathItem).forEach((type) => collected.set(type.id, type));\n }\n\n this.paths = collected;\n }\n\n private isSupported(pathItem: Record<HttpMethods, Webhook | Operation>) {\n return pathItem.get || pathItem.post || pathItem.put || pathItem.delete || pathItem.patch;\n }\n\n public getContext(): OasContext {\n if (!this.context) {\n this.context = new OasContext(this.parser, this.options);\n }\n return this.context;\n }\n\n public expand(type: IType): IType[] {\n const ctx = this.getContext();\n const path = type.path();\n\n trace(ctx, '-> [expand]', `in: path: ${path}`);\n type.visit(ctx);\n trace(ctx, '<- [expand]', `out: path: ${path}`);\n\n return type.children;\n }\n\n public find(path: string): IType | boolean {\n for (const [_name, type] of this.paths) {\n if (type.path() === path) {\n return type;\n }\n\n type.visit(this.getContext());\n\n const result = type.find(path, type.children);\n if (result) {\n return result;\n }\n }\n\n return false;\n }\n\n /** this seems a bit buggy at the moment, needs more testing **/\n public findPath(path: string): IType | boolean {\n let collection = Array.from(this.paths.values());\n let current: IType | undefined;\n let last: IType | undefined;\n\n let i = 0;\n const parts = path.split('>');\n do {\n const part = Naming.expandRef(parts[i]);\n current = collection.find((t) => t.id === part);\n if (!current) {\n throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());\n }\n\n // make sure we expand it before we move on to the next part\n this.expand(current);\n last = current;\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n\n i++;\n } while (i < parts.length);\n\n return current;\n }\n\n public writer(): Writer {\n return new Writer(this);\n }\n\n // private methods\n private visitGet(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitGet]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.createGet(name, op);\n trace(context, '<- [visitGet]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPost(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitPost]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromPost(name, op);\n trace(context, '<- [visitPost]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPut(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitPut]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromPut(name, op);\n trace(context, '<- [visitPut]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPatch(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitPatch]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromPatch(name, op);\n trace(context, '<- [visitPatch]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitDelete(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitDelete]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromDelete(name, op);\n trace(context, '<- [visitDelete]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPath(context: OasContext, name: string, pathItem: Record<string, Webhook | Operation>): IType[] {\n const paths: IType[] = [];\n if (pathItem.get !== undefined) {\n if ((pathItem.get as Webhook | Operation)?.constructor.name === 'Webhook') {\n throw new Error('Webhook not supported');\n }\n paths.push(this.visitGet(context, name, pathItem.get as Webhook | Operation));\n }\n\n if (pathItem.post !== undefined) {\n paths.push(this.visitPost(context, name, pathItem.post));\n }\n\n if (pathItem.put !== undefined) {\n paths.push(this.visitPut(context, name, pathItem.put));\n }\n\n if (pathItem.patch !== undefined) {\n paths.push(this.visitPatch(context, name, pathItem.patch));\n }\n\n if (pathItem.delete !== undefined) {\n paths.push(this.visitDelete(context, name, pathItem.delete));\n }\n\n return paths;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oasGen.js","sourceRoot":"","sources":["../../src/oas/oasGen.ts"],"names":[],"mappings":"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","sourcesContent":["import Oas from 'oas';\nimport OASNormalize from 'oas-normalize';\nimport { Operation, Webhook } from 'oas/operation';\nimport { HttpMethods, OASDocument } from 'oas/types';\nimport { OpenAPI } from 'openapi-types';\n\nimport fs from 'fs';\nimport { DEFAULT_VERSIONS, resolveConsolidateUnions, validateVersionOptions } from '../versions.js';\nimport { BatchConfig, GenerateOptions, OasContext, RequestOverride } from './oasContext.js';\nimport { Factory, IType } from './nodes/internal.js';\nimport { Writer } from './io/writer.js';\nimport { trace } from './log/trace.js';\nimport { TypesCollector } from './generator/typesCollector.js';\nimport { Mapper } from './mapper/types.js';\nimport { Naming } from './utils/naming.js';\n\ninterface IGenOptions {\n skipValidation?: boolean;\n baseURL?: string;\n overrides?: Record<string, RequestOverride>;\n batch?: BatchConfig;\n consolidateUnions?: boolean;\n showParentInSelections: boolean;\n federationVersion?: string;\n connectorSpecVersion?: string;\n mapper?: Mapper;\n skipOptionalArgs?: boolean;\n inferEntityResolvers?: boolean;\n emitConnectorErrors?: boolean;\n skipAuth?: boolean;\n}\n\nexport class OasGen {\n public selections: string[] = [];\n private visited: boolean = false;\n\n public static async fromData(\n data: ArrayBuffer,\n options: IGenOptions = {\n skipValidation: false,\n consolidateUnions: true,\n showParentInSelections: false,\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n mapper: undefined,\n skipOptionalArgs: false,\n },\n ): Promise<OasGen> {\n validateVersionOptions(options);\n\n const normalizer: OASNormalize = new OASNormalize(data, {\n enablePaths: true,\n });\n\n const _loaded: Record<string, unknown> = await normalizer.load();\n console.log('loaded file');\n\n const _normalised: OpenAPI.Document = await normalizer.bundle();\n console.log('loaded bundle');\n\n if (!options.skipValidation) {\n const validated: boolean = await normalizer.validate();\n if (!validated) {\n console.log('validated', validated);\n throw new Error('Could not validate source file');\n }\n }\n\n const json = await normalizer.convert();\n console.log('converted');\n\n const parser: Oas = new Oas(json as OASDocument);\n return new OasGen(parser, options);\n }\n\n public static async fromFile(\n sourceFile: string,\n options: IGenOptions = {\n skipValidation: false,\n consolidateUnions: true,\n showParentInSelections: false,\n federationVersion: DEFAULT_VERSIONS.federationVersion,\n connectorSpecVersion: DEFAULT_VERSIONS.connectorSpecVersion,\n mapper: undefined,\n skipOptionalArgs: false,\n },\n // prompt: Prompt\n ): Promise<OasGen> {\n validateVersionOptions(options);\n\n if (!fs.existsSync(sourceFile)) {\n throw new Error('Source not found: ' + sourceFile);\n }\n\n const normalizer: OASNormalize = new OASNormalize(sourceFile, {\n enablePaths: true,\n });\n\n const _loaded: Record<string, unknown> = await normalizer.load();\n console.log('loaded file');\n\n const _normalised: OpenAPI.Document = await normalizer.bundle();\n console.log('loaded bundle');\n\n if (!options.skipValidation) {\n const validated: boolean = await normalizer.validate();\n if (!validated) {\n console.log('validated', validated);\n throw new Error('Could not validate source file');\n }\n }\n\n const json = await normalizer.convert();\n console.log('converted');\n\n const parser: Oas = new Oas(json as OASDocument);\n return new OasGen(parser, options);\n }\n\n public parser: Oas;\n // public prompt: Prompt;\n public context?: OasContext;\n public paths: Map<string, IType> = new Map();\n public options: GenerateOptions;\n private collector: TypesCollector;\n\n constructor(parser: Oas, options: GenerateOptions) {\n this.parser = parser;\n // real unions/interfaces only exist from connect v0.4 — derive the union form from the\n // version unless explicitly chosen (an invalid explicit choice downgrades loudly). R2\n this.options = {\n ...options,\n consolidateUnions: resolveConsolidateUnions(\n options.connectorSpecVersion ?? DEFAULT_VERSIONS.connectorSpecVersion,\n options.consolidateUnions,\n ),\n };\n this.collector = new TypesCollector(this);\n }\n\n public title(): string {\n return this.parser.getDefinition().info.title;\n }\n\n public version(): string {\n return this.parser.getDefinition().info.version;\n }\n\n public expanded(paths: string[]): string[] {\n this.collector.collect(paths);\n return this.collector.expanded;\n }\n\n public getTypes(paths: string[]): Map<string, IType> {\n // make sure we pass the latest options to our context for the generation\n const context = this.getContext();\n context.generateOptions = this.options;\n\n this.collector.collect(paths);\n\n return this.collector.types;\n }\n\n public generateSchema(paths: string[]): string {\n // typo guard: an override key that matches no operation would silently do nothing\n for (const key of Object.keys(this.options.overrides ?? {})) {\n if (!this.paths.has(key)) {\n console.warn(`[overrides] no operation matches \"${key}\" — override ignored.`);\n }\n }\n\n // make sure we pass the latest options to our context for the generation\n const context = this.getContext();\n context.reset();\n context.generateOptions = this.options;\n\n this.collector.collect(paths);\n\n const writer: Writer = new Writer(this);\n this.selections = writer.generateWith(this.collector.types, this.collector.expanded);\n\n return writer.flush();\n }\n\n public async visit(): Promise<void> {\n const parser = this.parser;\n const context = this.getContext();\n\n const paths = parser.getPaths();\n const filtered = Object.entries(paths)\n .filter(([_key, pathItem]) => this.isSupported(pathItem))\n .sort((a, b) => a[0].localeCompare(b[0], undefined, { sensitivity: 'base' }));\n\n const collected = new Map<string, IType>();\n for (const [key, pathItem] of filtered) {\n this.visitPath(context, key, pathItem).forEach((type) => collected.set(type.id, type));\n }\n\n this.paths = collected;\n }\n\n public visitSync(): void {\n if (this.visited) return;\n\n const parser = this.parser;\n const context = this.getContext();\n\n const paths = parser.getPaths();\n const filtered = Object.entries(paths)\n .filter(([_key, pathItem]) => this.isSupported(pathItem))\n .sort((a, b) => a[0].localeCompare(b[0], undefined, { sensitivity: 'base' }));\n\n const collected = new Map<string, IType>();\n for (const [key, pathItem] of filtered) {\n this.visitPath(context, key, pathItem).forEach((type) => collected.set(type.id, type));\n }\n\n this.paths = collected;\n }\n\n private isSupported(pathItem: Record<HttpMethods, Webhook | Operation>) {\n return pathItem.get || pathItem.post || pathItem.put || pathItem.delete || pathItem.patch;\n }\n\n public getContext(): OasContext {\n if (!this.context) {\n this.context = new OasContext(this.parser, this.options);\n }\n return this.context;\n }\n\n public expand(type: IType): IType[] {\n const ctx = this.getContext();\n const path = type.path();\n\n trace(ctx, '-> [expand]', `in: path: ${path}`);\n type.visit(ctx);\n trace(ctx, '<- [expand]', `out: path: ${path}`);\n\n return type.children;\n }\n\n public find(path: string): IType | boolean {\n for (const [_name, type] of this.paths) {\n if (type.path() === path) {\n return type;\n }\n\n type.visit(this.getContext());\n\n const result = type.find(path, type.children);\n if (result) {\n return result;\n }\n }\n\n return false;\n }\n\n /** this seems a bit buggy at the moment, needs more testing **/\n public findPath(path: string): IType | boolean {\n let collection = Array.from(this.paths.values());\n let current: IType | undefined;\n let last: IType | undefined;\n\n let i = 0;\n const parts = path.split('>');\n do {\n const part = Naming.expandRef(parts[i]);\n current = collection.find((t) => t.id === part);\n if (!current) {\n throw new Error('Could not find type: ' + part + ' from ' + path + ', last: ' + last?.pathToRoot());\n }\n\n // make sure we expand it before we move on to the next part\n this.expand(current);\n last = current;\n\n collection = Array.from(current!.children.values()) || Array.from(current!.props.values()) || [];\n\n i++;\n } while (i < parts.length);\n\n return current;\n }\n\n public writer(): Writer {\n return new Writer(this);\n }\n\n // private methods\n private visitGet(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitGet]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.createGet(name, op);\n trace(context, '<- [visitGet]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPost(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitPost]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromPost(name, op);\n trace(context, '<- [visitPost]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPut(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitPut]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromPut(name, op);\n trace(context, '<- [visitPut]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPatch(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitPatch]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromPatch(name, op);\n trace(context, '<- [visitPatch]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitDelete(context: OasContext, name: string, op: Operation): IType {\n trace(context, '-> [visitDelete]', `in: [${name}] id: ${op.getOperationId()}`);\n const result = Factory.fromDelete(name, op);\n trace(context, '<- [visitDelete]', `out: [${name}] id: ${op.getOperationId()}`);\n return result;\n }\n\n private visitPath(context: OasContext, name: string, pathItem: Record<string, Webhook | Operation>): IType[] {\n const paths: IType[] = [];\n if (pathItem.get !== undefined) {\n if ((pathItem.get as Webhook | Operation)?.constructor.name === 'Webhook') {\n throw new Error('Webhook not supported');\n }\n paths.push(this.visitGet(context, name, pathItem.get as Webhook | Operation));\n }\n\n if (pathItem.post !== undefined) {\n paths.push(this.visitPost(context, name, pathItem.post));\n }\n\n if (pathItem.put !== undefined) {\n paths.push(this.visitPut(context, name, pathItem.put));\n }\n\n if (pathItem.patch !== undefined) {\n paths.push(this.visitPatch(context, name, pathItem.patch));\n }\n\n if (pathItem.delete !== undefined) {\n paths.push(this.visitDelete(context, name, pathItem.delete));\n }\n\n return paths;\n }\n}\n"]}
|
package/dist/tests/runners.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare function runOasTest(file: string, paths: string[], pathsSize: num
|
|
|
10
10
|
federationVersion?: string;
|
|
11
11
|
composeFederationVersion?: string;
|
|
12
12
|
emitConnectorErrors?: boolean;
|
|
13
|
+
skipAuth?: boolean;
|
|
13
14
|
}): Promise<string | undefined>;
|
|
14
15
|
interface IJsonTestOptions {
|
|
15
16
|
shouldFail: boolean;
|
package/dist/tests/runners.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runners.js","sourceRoot":"","sources":["../../src/tests/runners.ts"],"names":[],"mappings":"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","sourcesContent":["import { BatchConfig, JsonGen, OasGen, RequestOverride } from '../index.js';\nimport { JsonContext, JsonType } from '../json/index.js';\nimport assert from 'node:assert';\nimport path from 'path';\nimport os from 'os';\nimport fs from 'fs';\nimport { execSync, spawnSync } from 'child_process';\nimport { Mapper } from '../oas/mapper/types.js';\nimport _ from 'lodash';\n\nexport const oasBasePath = './tests/resources/oas';\nconst jsonBasePath = './tests/resources/json';\n\n// runOasTest test\nexport async function runOasTest(\n file: string,\n paths: string[],\n pathsSize: number,\n typesSize: number,\n shouldFail: boolean = false,\n skipValidation: boolean = false,\n mapper?: Mapper,\n skipOptionalArgs: boolean = false,\n inferEntityResolvers: boolean = false,\n // R2: optional version/union overrides. Defaults reproduce the historic behaviour\n // (consolidate unions, compose at fed 2.12) so existing callers are unaffected. Real\n // unions/interfaces (`consolidateUnions: false`) need connect v0.4 + fed 2.13.\n opts: {\n baseURL?: string;\n overrides?: Record<string, RequestOverride>;\n batch?: BatchConfig;\n consolidateUnions?: boolean;\n connectorSpecVersion?: string;\n federationVersion?: string;\n composeFederationVersion?: string;\n emitConnectorErrors?: boolean;\n } = {},\n): Promise<string | undefined> {\n const gen = await OasGen.fromFile(`${oasBasePath}/${file}`, {\n skipValidation,\n baseURL: opts.baseURL,\n overrides: opts.overrides,\n batch: opts.batch,\n consolidateUnions: opts.consolidateUnions ?? true,\n showParentInSelections: false,\n mapper,\n skipOptionalArgs,\n inferEntityResolvers,\n emitConnectorErrors: opts.emitConnectorErrors,\n connectorSpecVersion: opts.connectorSpecVersion,\n federationVersion: opts.federationVersion,\n });\n await gen.visit();\n\n assert.ok(gen.paths !== undefined);\n assert.ok(gen.paths.size === pathsSize, `${gen.paths.size} is not equal to ${pathsSize}`);\n\n const types = gen.getTypes(paths);\n assert.ok(\n types.size === typesSize,\n `${types.size} is not equal to ${typesSize}: ${Array.from(types.keys()).join(',\\n')}`,\n );\n\n const schema = gen.generateSchema(paths);\n assert.ok(schema !== undefined);\n\n // Create a dedicated folder inside tmp for OAS test files\n const oasTestDir = path.join(os.tmpdir(), 'oas-test');\n if (!fs.existsSync(oasTestDir)) {\n fs.mkdirSync(oasTestDir, { recursive: true });\n }\n\n const schemaFile = path.join(oasTestDir, file.replace(/yaml|json|yml/, 'graphql'));\n fs.writeFileSync(schemaFile, schema, { encoding: 'utf-8', flag: 'w' });\n\n // need to write another graphql file but this only with a sample query otherwise composition\n // will fail for mutations\n const sampleFile = path.join(oasTestDir, 'simple-query.graphql');\n if (!fs.existsSync(sampleFile)) {\n fs.writeFileSync(sampleFile, 'type Query { hello: String }', { encoding: 'utf-8', flag: 'w' });\n }\n\n const [result, output] = compose(schemaFile, sampleFile, opts.composeFederationVersion);\n if (shouldFail) {\n assert.ok(!result);\n assert.ok(output !== undefined);\n return output;\n } else {\n assert.ok(output === undefined, 'should have been undefined, but it is: ' + output);\n assert.ok(result);\n console.error(schema);\n // Return the generated schema so callers can make substring assertions (e.g. on\n // @key / entity: true emitted by the inferEntityResolvers path).\n return schema;\n }\n}\n\ninterface IJsonTestOptions {\n shouldFail: boolean;\n outputContains?: string;\n connectorSpecVersion?: string;\n federationVersion?: string;\n composeFederationVersion?: string;\n}\n\nexport async function runJsonTest(\n fileOrFolder: string,\n options: IJsonTestOptions = { shouldFail: false, outputContains: undefined },\n): Promise<string | undefined> {\n const fileOrFolderPath: string = `${jsonBasePath}/${fileOrFolder}`;\n\n assert.ok(fs.existsSync(fileOrFolderPath));\n\n let walker: JsonGen;\n\n const stats = fs.statSync(fileOrFolderPath);\n if (stats.isDirectory()) {\n walker = JsonGen.new({\n connectorSpecVersion: options.connectorSpecVersion,\n federationVersion: options.federationVersion,\n });\n\n const sources = fs.readdirSync(fileOrFolderPath).filter((name: string) => name.toLowerCase().endsWith('.json'));\n\n for (const source of sources) {\n const fullPath = path.join(fileOrFolderPath, source);\n const json = fs.readFileSync(fullPath, 'utf-8');\n assert.ok(json !== undefined);\n\n walker.walkJson(json);\n }\n } else {\n const json = fs.readFileSync(fileOrFolderPath, 'utf-8');\n assert.ok(json !== undefined);\n\n walker = JsonGen.fromReader(json, {\n connectorSpecVersion: options.connectorSpecVersion,\n federationVersion: options.federationVersion,\n });\n }\n\n const context: JsonContext = walker.getContext();\n\n const types: JsonType[] = context.getTypes();\n assert.ok(types.length > 0);\n\n const schema = walker.generateSchema();\n assert.ok(schema !== undefined);\n\n const schemaFile = path.join(os.tmpdir() + '/walker', fileOrFolder.replace(/\\.yaml|\\.json|\\.yml/, '') + '.graphql');\n\n // Ensure the directory exists\n // fs.mkdirSync(path.dirname(schemaFile), { recursive: true });\n const parentFolder = path.dirname(schemaFile);\n if (!fs.existsSync(parentFolder)) {\n fs.mkdirSync(parentFolder, { recursive: true });\n }\n\n if (fs.existsSync(schemaFile)) {\n fs.unlinkSync(schemaFile);\n }\n\n fs.writeFileSync(schemaFile, schema, { encoding: 'utf-8', flag: 'w' });\n\n const [result, output] = compose(schemaFile, undefined, options.composeFederationVersion);\n\n if (options.shouldFail) {\n assert.ok(result === false);\n assert.ok(output !== undefined);\n return output;\n } else {\n assert.ok(output === undefined);\n assert.ok(result === true);\n }\n\n // writer.clear();\n}\n\n/// rover checks\nfunction isRoverAvailable(command: string): [boolean, string?] {\n const cmd = os.platform() === 'win32' ? 'where' : 'which';\n const result = spawnSync(cmd, [command], { encoding: 'utf8' });\n\n return [result.status === 0, result.stdout.toString().trim()];\n}\n\nfunction compose(schemaPath: string, samplePath?: string, federationVersion: string = '2.14.1'): [boolean, string?] {\n console.info('schemaPath', schemaPath);\n\n const rover: [boolean, (string | undefined)?] = isRoverAvailable('rover');\n if (!rover[0]) {\n throw new Error('Rover is not available');\n }\n\n const supergraphFile = path.join(os.tmpdir(), 'oas-test', 'supergraph.yaml');\n let content: string = `\nfederation_version: =${federationVersion}\nsubgraphs:\n test_spec:\n routing_url: http://localhost # this value is ignored\n schema:\n file: ${schemaPath} # path to the schema file`;\n\n if (samplePath) {\n content += `\n sample_spec:\n routing_url: http://localhost # this value is ignored\n schema:\n file: ${samplePath} # path to the sample file\\`;\n `;\n }\n\n fs.writeFileSync(supergraphFile, content, { encoding: 'utf-8', flag: 'w' });\n\n const cmd = `${rover[1]} supergraph compose --config ${supergraphFile} --elv2-license accept`;\n\n // Write the rover command to a bash script for easy re-execution\n const scriptFile = path.join(os.tmpdir(), 'oas-test', 'run-rover.sh');\n\n // Generate script with environment variables and dev command\n const devCmd = `APOLLO_KEY=\\${APOLLO_KEY} APOLLO_GRAPH_REF=\\${APOLLO_GRAPH_REF} ${rover[1]} dev --supergraph-config ${supergraphFile}`;\n const scriptContent = `#!/bin/bash\n\n# Generated rover compose command (original)\n# ${cmd}\n\n# Alternative rover dev command with environment variables\n# Check if required environment variables are set\nif [ -z \"\\${APOLLO_KEY}\" ]; then\n echo \"Error: APOLLO_KEY environment variable is not set\"\n echo \"Please set it with: export APOLLO_KEY=your_apollo_key\"\n exit 1\nfi\n\nif [ -z \"\\${APOLLO_GRAPH_REF}\" ]; then\n echo \"Error: APOLLO_GRAPH_REF environment variable is not set\"\n echo \"Please set it with: export APOLLO_GRAPH_REF=your_graph_ref\"\n exit 1\nfi\n\necho \"Running rover dev with Apollo Studio integration...\"\n${devCmd}\n`;\n fs.writeFileSync(scriptFile, scriptContent, { encoding: 'utf-8', flag: 'w' });\n\n let output;\n try {\n output = execSync(cmd, { stdio: 'pipe' });\n return [true, undefined];\n } catch (error) {\n return [false, _.get(error, 'message')];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runners.js","sourceRoot":"","sources":["../../src/tests/runners.ts"],"names":[],"mappings":"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","sourcesContent":["import { BatchConfig, JsonGen, OasGen, RequestOverride } from '../index.js';\nimport { JsonContext, JsonType } from '../json/index.js';\nimport assert from 'node:assert';\nimport path from 'path';\nimport os from 'os';\nimport fs from 'fs';\nimport { execSync, spawnSync } from 'child_process';\nimport { Mapper } from '../oas/mapper/types.js';\nimport _ from 'lodash';\n\nexport const oasBasePath = './tests/resources/oas';\nconst jsonBasePath = './tests/resources/json';\n\n// runOasTest test\nexport async function runOasTest(\n file: string,\n paths: string[],\n pathsSize: number,\n typesSize: number,\n shouldFail: boolean = false,\n skipValidation: boolean = false,\n mapper?: Mapper,\n skipOptionalArgs: boolean = false,\n inferEntityResolvers: boolean = false,\n // R2: optional version/union overrides. Defaults reproduce the historic behaviour\n // (consolidate unions, compose at fed 2.12) so existing callers are unaffected. Real\n // unions/interfaces (`consolidateUnions: false`) need connect v0.4 + fed 2.13.\n opts: {\n baseURL?: string;\n overrides?: Record<string, RequestOverride>;\n batch?: BatchConfig;\n consolidateUnions?: boolean;\n connectorSpecVersion?: string;\n federationVersion?: string;\n composeFederationVersion?: string;\n emitConnectorErrors?: boolean;\n skipAuth?: boolean;\n } = {},\n): Promise<string | undefined> {\n const gen = await OasGen.fromFile(`${oasBasePath}/${file}`, {\n skipValidation,\n baseURL: opts.baseURL,\n overrides: opts.overrides,\n batch: opts.batch,\n consolidateUnions: opts.consolidateUnions ?? true,\n showParentInSelections: false,\n mapper,\n skipOptionalArgs,\n inferEntityResolvers,\n emitConnectorErrors: opts.emitConnectorErrors,\n skipAuth: opts.skipAuth,\n connectorSpecVersion: opts.connectorSpecVersion,\n federationVersion: opts.federationVersion,\n });\n await gen.visit();\n\n assert.ok(gen.paths !== undefined);\n assert.ok(gen.paths.size === pathsSize, `${gen.paths.size} is not equal to ${pathsSize}`);\n\n const types = gen.getTypes(paths);\n assert.ok(\n types.size === typesSize,\n `${types.size} is not equal to ${typesSize}: ${Array.from(types.keys()).join(',\\n')}`,\n );\n\n const schema = gen.generateSchema(paths);\n assert.ok(schema !== undefined);\n\n // Create a dedicated folder inside tmp for OAS test files\n const oasTestDir = path.join(os.tmpdir(), 'oas-test');\n if (!fs.existsSync(oasTestDir)) {\n fs.mkdirSync(oasTestDir, { recursive: true });\n }\n\n const schemaFile = path.join(oasTestDir, file.replace(/yaml|json|yml/, 'graphql'));\n fs.writeFileSync(schemaFile, schema, { encoding: 'utf-8', flag: 'w' });\n\n // need to write another graphql file but this only with a sample query otherwise composition\n // will fail for mutations\n const sampleFile = path.join(oasTestDir, 'simple-query.graphql');\n if (!fs.existsSync(sampleFile)) {\n fs.writeFileSync(sampleFile, 'type Query { hello: String }', { encoding: 'utf-8', flag: 'w' });\n }\n\n const [result, output] = compose(schemaFile, sampleFile, opts.composeFederationVersion);\n if (shouldFail) {\n assert.ok(!result);\n assert.ok(output !== undefined);\n return output;\n } else {\n assert.ok(output === undefined, 'should have been undefined, but it is: ' + output);\n assert.ok(result);\n console.error(schema);\n // Return the generated schema so callers can make substring assertions (e.g. on\n // @key / entity: true emitted by the inferEntityResolvers path).\n return schema;\n }\n}\n\ninterface IJsonTestOptions {\n shouldFail: boolean;\n outputContains?: string;\n connectorSpecVersion?: string;\n federationVersion?: string;\n composeFederationVersion?: string;\n}\n\nexport async function runJsonTest(\n fileOrFolder: string,\n options: IJsonTestOptions = { shouldFail: false, outputContains: undefined },\n): Promise<string | undefined> {\n const fileOrFolderPath: string = `${jsonBasePath}/${fileOrFolder}`;\n\n assert.ok(fs.existsSync(fileOrFolderPath));\n\n let walker: JsonGen;\n\n const stats = fs.statSync(fileOrFolderPath);\n if (stats.isDirectory()) {\n walker = JsonGen.new({\n connectorSpecVersion: options.connectorSpecVersion,\n federationVersion: options.federationVersion,\n });\n\n const sources = fs.readdirSync(fileOrFolderPath).filter((name: string) => name.toLowerCase().endsWith('.json'));\n\n for (const source of sources) {\n const fullPath = path.join(fileOrFolderPath, source);\n const json = fs.readFileSync(fullPath, 'utf-8');\n assert.ok(json !== undefined);\n\n walker.walkJson(json);\n }\n } else {\n const json = fs.readFileSync(fileOrFolderPath, 'utf-8');\n assert.ok(json !== undefined);\n\n walker = JsonGen.fromReader(json, {\n connectorSpecVersion: options.connectorSpecVersion,\n federationVersion: options.federationVersion,\n });\n }\n\n const context: JsonContext = walker.getContext();\n\n const types: JsonType[] = context.getTypes();\n assert.ok(types.length > 0);\n\n const schema = walker.generateSchema();\n assert.ok(schema !== undefined);\n\n const schemaFile = path.join(os.tmpdir() + '/walker', fileOrFolder.replace(/\\.yaml|\\.json|\\.yml/, '') + '.graphql');\n\n // Ensure the directory exists\n // fs.mkdirSync(path.dirname(schemaFile), { recursive: true });\n const parentFolder = path.dirname(schemaFile);\n if (!fs.existsSync(parentFolder)) {\n fs.mkdirSync(parentFolder, { recursive: true });\n }\n\n if (fs.existsSync(schemaFile)) {\n fs.unlinkSync(schemaFile);\n }\n\n fs.writeFileSync(schemaFile, schema, { encoding: 'utf-8', flag: 'w' });\n\n const [result, output] = compose(schemaFile, undefined, options.composeFederationVersion);\n\n if (options.shouldFail) {\n assert.ok(result === false);\n assert.ok(output !== undefined);\n return output;\n } else {\n assert.ok(output === undefined);\n assert.ok(result === true);\n }\n\n // writer.clear();\n}\n\n/// rover checks\nfunction isRoverAvailable(command: string): [boolean, string?] {\n const cmd = os.platform() === 'win32' ? 'where' : 'which';\n const result = spawnSync(cmd, [command], { encoding: 'utf8' });\n\n return [result.status === 0, result.stdout.toString().trim()];\n}\n\nfunction compose(schemaPath: string, samplePath?: string, federationVersion: string = '2.14.1'): [boolean, string?] {\n console.info('schemaPath', schemaPath);\n\n const rover: [boolean, (string | undefined)?] = isRoverAvailable('rover');\n if (!rover[0]) {\n throw new Error('Rover is not available');\n }\n\n const supergraphFile = path.join(os.tmpdir(), 'oas-test', 'supergraph.yaml');\n let content: string = `\nfederation_version: =${federationVersion}\nsubgraphs:\n test_spec:\n routing_url: http://localhost # this value is ignored\n schema:\n file: ${schemaPath} # path to the schema file`;\n\n if (samplePath) {\n content += `\n sample_spec:\n routing_url: http://localhost # this value is ignored\n schema:\n file: ${samplePath} # path to the sample file\\`;\n `;\n }\n\n fs.writeFileSync(supergraphFile, content, { encoding: 'utf-8', flag: 'w' });\n\n const cmd = `${rover[1]} supergraph compose --config ${supergraphFile} --elv2-license accept`;\n\n // Write the rover command to a bash script for easy re-execution\n const scriptFile = path.join(os.tmpdir(), 'oas-test', 'run-rover.sh');\n\n // Generate script with environment variables and dev command\n const devCmd = `APOLLO_KEY=\\${APOLLO_KEY} APOLLO_GRAPH_REF=\\${APOLLO_GRAPH_REF} ${rover[1]} dev --supergraph-config ${supergraphFile}`;\n const scriptContent = `#!/bin/bash\n\n# Generated rover compose command (original)\n# ${cmd}\n\n# Alternative rover dev command with environment variables\n# Check if required environment variables are set\nif [ -z \"\\${APOLLO_KEY}\" ]; then\n echo \"Error: APOLLO_KEY environment variable is not set\"\n echo \"Please set it with: export APOLLO_KEY=your_apollo_key\"\n exit 1\nfi\n\nif [ -z \"\\${APOLLO_GRAPH_REF}\" ]; then\n echo \"Error: APOLLO_GRAPH_REF environment variable is not set\"\n echo \"Please set it with: export APOLLO_GRAPH_REF=your_graph_ref\"\n exit 1\nfi\n\necho \"Running rover dev with Apollo Studio integration...\"\n${devCmd}\n`;\n fs.writeFileSync(scriptFile, scriptContent, { encoding: 'utf-8', flag: 'w' });\n\n let output;\n try {\n output = execSync(cmd, { stdio: 'pipe' });\n return [true, undefined];\n } catch (error) {\n return [false, _.get(error, 'message')];\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apollo-conn-gen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Library to generate Apollo connector schemas from OpenAPI specs or JSON payloads. Also includes a CLI to generate connectors from the command line.",
|
|
5
5
|
"author": "Fernando @ Apollo",
|
|
6
6
|
"license": "MIT",
|