@omnigraph/json-schema 1.0.0-alpha-3fc47d119.0 → 1.0.0-alpha-20230420181317-a95037648
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/README.md +5 -4
- package/cjs/addExecutionLogicToComposer.js +208 -0
- package/cjs/addRootFieldResolver.js +395 -0
- package/cjs/bundle.js +65 -0
- package/cjs/directives.js +580 -0
- package/cjs/getComposerFromJSONSchema.js +1297 -0
- package/cjs/getDereferencedJSONSchemaFromOperations.js +33 -0
- package/cjs/getGraphQLSchemaFromDereferencedJSONSchema.js +39 -0
- package/cjs/getJSONSchemaStringFormatScalarMap.js +61 -0
- package/cjs/getReferencedJSONSchemaFromOperations.js +260 -0
- package/cjs/getTypeResolverFromOutputTCs.js +69 -0
- package/cjs/getUnionTypeComposers.js +85 -0
- package/cjs/getValidTypeName.js +20 -0
- package/cjs/index.js +14 -0
- package/cjs/loadGraphQLSchemaFromJSONSchemas.js +59 -0
- package/cjs/package.json +1 -0
- package/cjs/resolveDataByUnionInputType.js +40 -0
- package/cjs/scalars.js +30 -0
- package/cjs/types.js +0 -0
- package/cjs/utils.js +65 -0
- package/esm/addExecutionLogicToComposer.js +204 -0
- package/esm/addRootFieldResolver.js +390 -0
- package/esm/bundle.js +60 -0
- package/esm/directives.js +565 -0
- package/esm/getComposerFromJSONSchema.js +1293 -0
- package/esm/getDereferencedJSONSchemaFromOperations.js +29 -0
- package/esm/getGraphQLSchemaFromDereferencedJSONSchema.js +35 -0
- package/esm/getJSONSchemaStringFormatScalarMap.js +56 -0
- package/esm/getReferencedJSONSchemaFromOperations.js +255 -0
- package/esm/getTypeResolverFromOutputTCs.js +65 -0
- package/esm/getUnionTypeComposers.js +80 -0
- package/esm/getValidTypeName.js +16 -0
- package/esm/index.js +9 -0
- package/esm/loadGraphQLSchemaFromJSONSchemas.js +54 -0
- package/esm/resolveDataByUnionInputType.js +36 -0
- package/esm/scalars.js +27 -0
- package/esm/types.js +0 -0
- package/esm/utils.js +57 -0
- package/package.json +34 -27
- package/typings/addExecutionLogicToComposer.d.cts +14 -0
- package/typings/addExecutionLogicToComposer.d.ts +14 -0
- package/typings/addRootFieldResolver.d.cts +26 -0
- package/typings/addRootFieldResolver.d.ts +26 -0
- package/typings/bundle.d.cts +34 -0
- package/typings/bundle.d.ts +34 -0
- package/typings/directives.d.cts +54 -0
- package/typings/directives.d.ts +54 -0
- package/typings/getComposerFromJSONSchema.d.cts +13 -0
- package/{getComposerFromJSONSchema.d.ts → typings/getComposerFromJSONSchema.d.ts} +7 -4
- package/typings/getDereferencedJSONSchemaFromOperations.d.cts +14 -0
- package/{getDereferencedJSONSchemaFromOperations.d.ts → typings/getDereferencedJSONSchemaFromOperations.d.ts} +5 -3
- package/typings/getGraphQLSchemaFromDereferencedJSONSchema.d.cts +5 -0
- package/typings/getGraphQLSchemaFromDereferencedJSONSchema.d.ts +5 -0
- package/typings/getJSONSchemaStringFormatScalarMap.d.cts +2 -0
- package/typings/getJSONSchemaStringFormatScalarMap.d.ts +2 -0
- package/typings/getReferencedJSONSchemaFromOperations.d.cts +16 -0
- package/{getReferencedJSONSchemaFromOperations.d.ts → typings/getReferencedJSONSchemaFromOperations.d.ts} +6 -4
- package/typings/getTypeResolverFromOutputTCs.d.cts +7 -0
- package/typings/getTypeResolverFromOutputTCs.d.ts +7 -0
- package/typings/getUnionTypeComposers.d.cts +24 -0
- package/typings/getUnionTypeComposers.d.ts +24 -0
- package/{getStringScalarWithMinMaxLength.d.ts → typings/getValidTypeName.d.cts} +4 -3
- package/typings/index.d.cts +9 -0
- package/typings/index.d.ts +9 -0
- package/typings/loadGraphQLSchemaFromJSONSchemas.d.cts +3 -0
- package/typings/loadGraphQLSchemaFromJSONSchemas.d.ts +3 -0
- package/typings/resolveDataByUnionInputType.d.cts +2 -0
- package/typings/resolveDataByUnionInputType.d.ts +2 -0
- package/typings/scalars.d.cts +4 -0
- package/typings/scalars.d.ts +4 -0
- package/typings/types.d.cts +76 -0
- package/typings/types.d.ts +76 -0
- package/typings/utils.d.cts +15 -0
- package/{utils.d.ts → typings/utils.d.ts} +1 -1
- package/addExecutionLogicToComposer.d.ts +0 -15
- package/bundle.d.ts +0 -39
- package/getGenericJSONScalar.d.ts +0 -8
- package/getGraphQLSchemaFromDereferencedJSONSchema.d.ts +0 -5
- package/getJSONSchemaStringFormatScalarMap.d.ts +0 -3
- package/getTypeResolverFromOutputTCs.d.ts +0 -4
- package/getUnionTypeComposers.d.ts +0 -21
- package/getValidateFnForSchemaPath.d.ts +0 -3
- package/index.d.ts +0 -9
- package/index.js +0 -1890
- package/index.mjs +0 -1877
- package/loadGraphQLSchemaFromJSONSchemas.d.ts +0 -2
- package/resolveDataByUnionInputType.d.ts +0 -3
- package/types.d.ts +0 -63
- package/{getValidTypeName.d.ts → typings/getValidTypeName.d.ts} +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDereferencedJSONSchemaFromOperations = void 0;
|
|
4
|
+
const json_machete_1 = require("json-machete");
|
|
5
|
+
const cross_helpers_1 = require("@graphql-mesh/cross-helpers");
|
|
6
|
+
const string_interpolation_1 = require("@graphql-mesh/string-interpolation");
|
|
7
|
+
const getReferencedJSONSchemaFromOperations_js_1 = require("./getReferencedJSONSchemaFromOperations.js");
|
|
8
|
+
async function getDereferencedJSONSchemaFromOperations({ operations, cwd = cross_helpers_1.process.cwd(), logger, fetchFn, schemaHeaders, ignoreErrorResponses, endpoint, operationHeaders, queryParams, }) {
|
|
9
|
+
const referencedJSONSchema = await (0, getReferencedJSONSchemaFromOperations_js_1.getReferencedJSONSchemaFromOperations)({
|
|
10
|
+
operations,
|
|
11
|
+
cwd,
|
|
12
|
+
schemaHeaders,
|
|
13
|
+
ignoreErrorResponses,
|
|
14
|
+
fetchFn,
|
|
15
|
+
endpoint,
|
|
16
|
+
operationHeaders,
|
|
17
|
+
queryParams,
|
|
18
|
+
});
|
|
19
|
+
logger.debug(`Dereferencing JSON Schema to resolve all $refs`);
|
|
20
|
+
const schemaHeadersFactory = (0, string_interpolation_1.getInterpolatedHeadersFactory)(schemaHeaders);
|
|
21
|
+
const fullyDeferencedSchema = await (0, json_machete_1.dereferenceObject)(referencedJSONSchema, {
|
|
22
|
+
cwd,
|
|
23
|
+
fetchFn,
|
|
24
|
+
logger: logger.child('dereferenceObject'),
|
|
25
|
+
headers: schemaHeadersFactory({ env: cross_helpers_1.process.env }),
|
|
26
|
+
});
|
|
27
|
+
logger.debug(`Healing JSON Schema`);
|
|
28
|
+
const healedSchema = await (0, json_machete_1.healJSONSchema)(fullyDeferencedSchema, {
|
|
29
|
+
logger: logger.child('healJSONSchema'),
|
|
30
|
+
});
|
|
31
|
+
return healedSchema;
|
|
32
|
+
}
|
|
33
|
+
exports.getDereferencedJSONSchemaFromOperations = getDereferencedJSONSchemaFromOperations;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGraphQLSchemaFromDereferencedJSONSchema = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const graphql_compose_1 = require("graphql-compose");
|
|
6
|
+
const addExecutionLogicToComposer_js_1 = require("./addExecutionLogicToComposer.js");
|
|
7
|
+
const getComposerFromJSONSchema_js_1 = require("./getComposerFromJSONSchema.js");
|
|
8
|
+
async function getGraphQLSchemaFromDereferencedJSONSchema(name, opts) {
|
|
9
|
+
const { fullyDeferencedSchema, logger, operations, operationHeaders, endpoint, queryParams, queryStringOptions, } = opts;
|
|
10
|
+
logger.debug(`Generating GraphQL Schema from the bundled JSON Schema`);
|
|
11
|
+
const visitorResult = await (0, getComposerFromJSONSchema_js_1.getComposerFromJSONSchema)(fullyDeferencedSchema, logger.child('getComposerFromJSONSchema'));
|
|
12
|
+
const schemaComposerWithoutExecutionLogic = visitorResult.output;
|
|
13
|
+
if (!(schemaComposerWithoutExecutionLogic instanceof graphql_compose_1.SchemaComposer)) {
|
|
14
|
+
throw new Error('The visitor result should be a SchemaComposer instance.');
|
|
15
|
+
}
|
|
16
|
+
// graphql-compose doesn't add @defer and @stream to the schema
|
|
17
|
+
for (const directive of graphql_1.specifiedDirectives) {
|
|
18
|
+
schemaComposerWithoutExecutionLogic.addDirective(directive);
|
|
19
|
+
}
|
|
20
|
+
const schemaComposerWithExecutionLogic = await (0, addExecutionLogicToComposer_js_1.addExecutionDirectivesToComposer)(name, {
|
|
21
|
+
schemaComposer: schemaComposerWithoutExecutionLogic,
|
|
22
|
+
logger,
|
|
23
|
+
operations,
|
|
24
|
+
operationHeaders,
|
|
25
|
+
endpoint,
|
|
26
|
+
queryParams,
|
|
27
|
+
queryStringOptions,
|
|
28
|
+
});
|
|
29
|
+
if (schemaComposerWithExecutionLogic.Query.getFieldNames().length === 0) {
|
|
30
|
+
schemaComposerWithExecutionLogic.Query.addFields({
|
|
31
|
+
dummy: {
|
|
32
|
+
type: 'String',
|
|
33
|
+
resolve: () => 'dummy',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return schemaComposerWithExecutionLogic.buildSchema();
|
|
38
|
+
}
|
|
39
|
+
exports.getGraphQLSchemaFromDereferencedJSONSchema = getGraphQLSchemaFromDereferencedJSONSchema;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getJSONSchemaStringFormatScalarMap = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ajv_1 = tslib_1.__importDefault(require("ajv"));
|
|
6
|
+
const ajv_formats_1 = tslib_1.__importDefault(require("ajv-formats"));
|
|
7
|
+
const graphql_1 = require("graphql");
|
|
8
|
+
const pascal_case_1 = require("pascal-case");
|
|
9
|
+
const JSONSchemaStringFormats = [
|
|
10
|
+
'date',
|
|
11
|
+
'hostname',
|
|
12
|
+
'regex',
|
|
13
|
+
'json-pointer',
|
|
14
|
+
'relative-json-pointer',
|
|
15
|
+
'uri-reference',
|
|
16
|
+
'uri-template',
|
|
17
|
+
];
|
|
18
|
+
function getJSONSchemaStringFormatScalarMap() {
|
|
19
|
+
const ajv = new ajv_1.default({
|
|
20
|
+
strict: false,
|
|
21
|
+
});
|
|
22
|
+
(0, ajv_formats_1.default)(ajv);
|
|
23
|
+
const map = new Map();
|
|
24
|
+
for (const format of JSONSchemaStringFormats) {
|
|
25
|
+
const schema = {
|
|
26
|
+
type: 'string',
|
|
27
|
+
format,
|
|
28
|
+
};
|
|
29
|
+
let validate;
|
|
30
|
+
try {
|
|
31
|
+
validate = ajv.compile(schema);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
validate = (value) => ajv.validate(schema, value);
|
|
35
|
+
}
|
|
36
|
+
const coerceString = (value) => {
|
|
37
|
+
if (validate(value)) {
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Expected ${format} but got: ${value}`);
|
|
41
|
+
};
|
|
42
|
+
const scalar = new graphql_1.GraphQLScalarType({
|
|
43
|
+
name: (0, pascal_case_1.pascalCase)(format),
|
|
44
|
+
description: `Represents ${format} values`,
|
|
45
|
+
serialize: coerceString,
|
|
46
|
+
parseValue: coerceString,
|
|
47
|
+
parseLiteral: ast => {
|
|
48
|
+
if (ast.kind === graphql_1.Kind.STRING) {
|
|
49
|
+
return coerceString(ast.value);
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`Expected string in ${format} format but got: ${ast.value}`);
|
|
52
|
+
},
|
|
53
|
+
extensions: {
|
|
54
|
+
codegenScalarType: 'string',
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
map.set(format, scalar);
|
|
58
|
+
}
|
|
59
|
+
return map;
|
|
60
|
+
}
|
|
61
|
+
exports.getJSONSchemaStringFormatScalarMap = getJSONSchemaStringFormatScalarMap;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getReferencedJSONSchemaFromOperations = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const json_machete_1 = require("json-machete");
|
|
6
|
+
const to_json_schema_1 = tslib_1.__importDefault(require("to-json-schema"));
|
|
7
|
+
const string_interpolation_1 = require("@graphql-mesh/string-interpolation");
|
|
8
|
+
const utils_1 = require("@graphql-mesh/utils");
|
|
9
|
+
const utils_js_1 = require("./utils.js");
|
|
10
|
+
async function handleOperationResponseConfig(operationResponseConfig, { schemaHeaders, cwd, fetchFn, logger = new utils_1.DefaultLogger('handleOperationResponseConfig'), }) {
|
|
11
|
+
if (operationResponseConfig.responseSchema) {
|
|
12
|
+
const schema = typeof operationResponseConfig.responseSchema === 'string'
|
|
13
|
+
? {
|
|
14
|
+
$ref: operationResponseConfig.responseSchema,
|
|
15
|
+
title: operationResponseConfig.responseTypeName,
|
|
16
|
+
}
|
|
17
|
+
: operationResponseConfig.responseSchema;
|
|
18
|
+
if (operationResponseConfig.responseSample) {
|
|
19
|
+
schema.examples = schema.examples || [operationResponseConfig.responseSample];
|
|
20
|
+
}
|
|
21
|
+
return schema;
|
|
22
|
+
}
|
|
23
|
+
else if (operationResponseConfig.responseSample) {
|
|
24
|
+
const sample = typeof operationResponseConfig.responseSample === 'object'
|
|
25
|
+
? operationResponseConfig.responseSample
|
|
26
|
+
: await (0, utils_1.readFileOrUrl)(operationResponseConfig.responseSample, {
|
|
27
|
+
cwd,
|
|
28
|
+
fetch: fetchFn,
|
|
29
|
+
logger,
|
|
30
|
+
importFn: utils_1.defaultImportFn,
|
|
31
|
+
headers: schemaHeaders,
|
|
32
|
+
}).catch((e) => {
|
|
33
|
+
throw new Error(`responseSample - ${e.message}`);
|
|
34
|
+
});
|
|
35
|
+
const generatedSchema = (0, to_json_schema_1.default)(sample, {
|
|
36
|
+
required: false,
|
|
37
|
+
objects: {
|
|
38
|
+
additionalProperties: false,
|
|
39
|
+
},
|
|
40
|
+
strings: {
|
|
41
|
+
detectFormat: true,
|
|
42
|
+
},
|
|
43
|
+
arrays: {
|
|
44
|
+
mode: 'first',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
generatedSchema.title = operationResponseConfig.responseTypeName;
|
|
48
|
+
generatedSchema.examples = [sample];
|
|
49
|
+
return generatedSchema;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return json_machete_1.AnySchema;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function getReferencedJSONSchemaFromOperations({ operations, cwd, schemaHeaders, ignoreErrorResponses, logger = new utils_1.DefaultLogger('getReferencedJSONSchemaFromOperations'), fetchFn, endpoint, operationHeaders, queryParams, }) {
|
|
56
|
+
const finalJsonSchema = {
|
|
57
|
+
type: 'object',
|
|
58
|
+
title: '_schema',
|
|
59
|
+
properties: {},
|
|
60
|
+
required: ['query'],
|
|
61
|
+
};
|
|
62
|
+
for (const operationConfig of operations) {
|
|
63
|
+
const { operationType, rootTypeName, fieldName } = (0, utils_js_1.getOperationMetadata)(operationConfig);
|
|
64
|
+
const rootTypeDefinition = (finalJsonSchema.properties[operationType] = finalJsonSchema
|
|
65
|
+
.properties[operationType] || {
|
|
66
|
+
type: 'object',
|
|
67
|
+
title: rootTypeName,
|
|
68
|
+
properties: {},
|
|
69
|
+
readOnly: true,
|
|
70
|
+
});
|
|
71
|
+
rootTypeDefinition.properties = rootTypeDefinition.properties || {};
|
|
72
|
+
const interpolationStrings = [
|
|
73
|
+
...Object.values(operationHeaders || {}),
|
|
74
|
+
...Object.values(queryParams || {}).map(val => val.toString()),
|
|
75
|
+
endpoint,
|
|
76
|
+
];
|
|
77
|
+
if ('pubsubTopic' in operationConfig) {
|
|
78
|
+
interpolationStrings.push(operationConfig.pubsubTopic);
|
|
79
|
+
}
|
|
80
|
+
if ('headers' in operationConfig) {
|
|
81
|
+
interpolationStrings.push(...Object.values(operationConfig.headers || {}));
|
|
82
|
+
}
|
|
83
|
+
if ('path' in operationConfig) {
|
|
84
|
+
interpolationStrings.push(operationConfig.path);
|
|
85
|
+
}
|
|
86
|
+
if ('responseByStatusCode' in operationConfig) {
|
|
87
|
+
rootTypeDefinition.properties[fieldName] = rootTypeDefinition.properties[fieldName] || {};
|
|
88
|
+
const statusCodeOneOfIndexMap = {};
|
|
89
|
+
const responseSchemas = [];
|
|
90
|
+
for (const statusCode in operationConfig.responseByStatusCode) {
|
|
91
|
+
if (ignoreErrorResponses && !statusCode.startsWith('2')) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const responseOperationConfig = operationConfig.responseByStatusCode[statusCode];
|
|
95
|
+
const responseOperationSchema = await handleOperationResponseConfig(responseOperationConfig, {
|
|
96
|
+
cwd,
|
|
97
|
+
schemaHeaders,
|
|
98
|
+
fetchFn,
|
|
99
|
+
logger,
|
|
100
|
+
});
|
|
101
|
+
statusCodeOneOfIndexMap[statusCode] = responseSchemas.length;
|
|
102
|
+
responseOperationSchema.title =
|
|
103
|
+
responseOperationSchema.title || `${fieldName}_${statusCode}_response`;
|
|
104
|
+
responseSchemas.push(responseOperationSchema);
|
|
105
|
+
}
|
|
106
|
+
if (responseSchemas.length === 1) {
|
|
107
|
+
rootTypeDefinition.properties[fieldName] = responseSchemas[0];
|
|
108
|
+
}
|
|
109
|
+
else if (responseSchemas.length === 0) {
|
|
110
|
+
rootTypeDefinition.properties[fieldName] = json_machete_1.AnySchema;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
rootTypeDefinition.properties[fieldName] = {
|
|
114
|
+
$comment: `statusCodeOneOfIndexMap:${JSON.stringify(statusCodeOneOfIndexMap)}`,
|
|
115
|
+
title: fieldName + '_response',
|
|
116
|
+
oneOf: responseSchemas,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
rootTypeDefinition.properties[fieldName] = await handleOperationResponseConfig(operationConfig, {
|
|
122
|
+
cwd,
|
|
123
|
+
schemaHeaders,
|
|
124
|
+
fetchFn,
|
|
125
|
+
logger,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
const rootTypeInputPropertyName = operationType + 'Input';
|
|
129
|
+
const rootInputTypeName = rootTypeName + 'Input';
|
|
130
|
+
const rootTypeInputTypeDefinition = (finalJsonSchema.properties[rootTypeInputPropertyName] =
|
|
131
|
+
finalJsonSchema.properties[rootTypeInputPropertyName] || {
|
|
132
|
+
type: 'object',
|
|
133
|
+
title: rootInputTypeName,
|
|
134
|
+
properties: {},
|
|
135
|
+
writeOnly: true,
|
|
136
|
+
});
|
|
137
|
+
if ('queryParamsSample' in operationConfig &&
|
|
138
|
+
operationConfig.queryParamsSample &&
|
|
139
|
+
typeof operationConfig.queryParamsSample === 'object') {
|
|
140
|
+
for (const queryParamName in operationConfig.queryParamsSample) {
|
|
141
|
+
const example = operationConfig.queryParamsSample[queryParamName];
|
|
142
|
+
const generatedSchema = (0, to_json_schema_1.default)(example, {
|
|
143
|
+
required: false,
|
|
144
|
+
objects: {
|
|
145
|
+
additionalProperties: false,
|
|
146
|
+
},
|
|
147
|
+
strings: {
|
|
148
|
+
detectFormat: true,
|
|
149
|
+
},
|
|
150
|
+
arrays: {
|
|
151
|
+
mode: 'first',
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
generatedSchema.examples = [example];
|
|
155
|
+
const argName = (0, utils_1.sanitizeNameForGraphQL)(queryParamName);
|
|
156
|
+
operationConfig.queryParamArgMap = operationConfig.queryParamArgMap || {};
|
|
157
|
+
operationConfig.queryParamArgMap[queryParamName] = argName;
|
|
158
|
+
operationConfig.argTypeMap = operationConfig.argTypeMap || {};
|
|
159
|
+
operationConfig.argTypeMap[argName] = generatedSchema;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const interpolationKeys = (0, string_interpolation_1.getInterpolationKeys)(...interpolationStrings);
|
|
163
|
+
if ('queryParamArgMap' in operationConfig) {
|
|
164
|
+
interpolationKeys.push(...Object.values(operationConfig.queryParamArgMap).map(key => `args.${key}`));
|
|
165
|
+
}
|
|
166
|
+
for (const interpolationKey of interpolationKeys) {
|
|
167
|
+
const [initialObjectName, varName] = interpolationKey.split('.');
|
|
168
|
+
if (initialObjectName === 'args') {
|
|
169
|
+
rootTypeInputTypeDefinition.properties[fieldName] = rootTypeInputTypeDefinition.properties[fieldName] || {
|
|
170
|
+
title: `${rootTypeInputPropertyName}_${fieldName}`,
|
|
171
|
+
type: 'object',
|
|
172
|
+
properties: {},
|
|
173
|
+
};
|
|
174
|
+
if (operationConfig.argTypeMap != null && varName in operationConfig.argTypeMap) {
|
|
175
|
+
const argTypeDef = operationConfig.argTypeMap[varName];
|
|
176
|
+
if (typeof argTypeDef === 'object') {
|
|
177
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties[varName] = argTypeDef;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties[varName] = {
|
|
181
|
+
$ref: argTypeDef,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else if (!rootTypeInputTypeDefinition.properties[fieldName].properties[varName]) {
|
|
186
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties[varName] = {
|
|
187
|
+
type: 'string',
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if ('binary' in operationConfig) {
|
|
193
|
+
const generatedSchema = {
|
|
194
|
+
type: 'string',
|
|
195
|
+
format: 'binary',
|
|
196
|
+
};
|
|
197
|
+
rootTypeInputTypeDefinition.properties[fieldName] = rootTypeInputTypeDefinition.properties[fieldName] || {
|
|
198
|
+
title: `${rootTypeInputPropertyName}_${fieldName}`,
|
|
199
|
+
type: 'object',
|
|
200
|
+
properties: {},
|
|
201
|
+
};
|
|
202
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties.input = generatedSchema;
|
|
203
|
+
}
|
|
204
|
+
else if ('requestSchema' in operationConfig && operationConfig.requestSchema) {
|
|
205
|
+
rootTypeInputTypeDefinition.properties[fieldName] = rootTypeInputTypeDefinition.properties[fieldName] || {
|
|
206
|
+
title: `${rootTypeInputPropertyName}_${fieldName}`,
|
|
207
|
+
type: 'object',
|
|
208
|
+
properties: {},
|
|
209
|
+
};
|
|
210
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties.input =
|
|
211
|
+
typeof operationConfig.requestSchema === 'string'
|
|
212
|
+
? {
|
|
213
|
+
$ref: operationConfig.requestSchema,
|
|
214
|
+
title: operationConfig.requestTypeName,
|
|
215
|
+
}
|
|
216
|
+
: operationConfig.requestSchema;
|
|
217
|
+
if (operationConfig.requestSample) {
|
|
218
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties.input.examples =
|
|
219
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties.input.examples || [
|
|
220
|
+
operationConfig.requestSample,
|
|
221
|
+
];
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else if ('requestSample' in operationConfig) {
|
|
225
|
+
const sample = typeof operationConfig.requestSample === 'object'
|
|
226
|
+
? operationConfig.requestSample
|
|
227
|
+
: await (0, utils_1.readFileOrUrl)(operationConfig.requestSample, {
|
|
228
|
+
cwd,
|
|
229
|
+
headers: schemaHeaders,
|
|
230
|
+
fetch: fetchFn,
|
|
231
|
+
logger,
|
|
232
|
+
importFn: utils_1.defaultImportFn,
|
|
233
|
+
}).catch((e) => {
|
|
234
|
+
throw new Error(`${operationConfig.field}.requestSample: ${operationConfig.requestSample}; ${e.message}`);
|
|
235
|
+
});
|
|
236
|
+
const generatedSchema = (0, to_json_schema_1.default)(sample, {
|
|
237
|
+
required: false,
|
|
238
|
+
objects: {
|
|
239
|
+
additionalProperties: false,
|
|
240
|
+
},
|
|
241
|
+
strings: {
|
|
242
|
+
detectFormat: true,
|
|
243
|
+
},
|
|
244
|
+
arrays: {
|
|
245
|
+
mode: 'first',
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
generatedSchema.title = operationConfig.requestTypeName;
|
|
249
|
+
generatedSchema.examples = [sample];
|
|
250
|
+
rootTypeInputTypeDefinition.properties[fieldName] = rootTypeInputTypeDefinition.properties[fieldName] || {
|
|
251
|
+
title: `${rootTypeInputPropertyName}_${fieldName}`,
|
|
252
|
+
type: 'object',
|
|
253
|
+
properties: {},
|
|
254
|
+
};
|
|
255
|
+
rootTypeInputTypeDefinition.properties[fieldName].properties.input = generatedSchema;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return finalJsonSchema;
|
|
259
|
+
}
|
|
260
|
+
exports.getReferencedJSONSchemaFromOperations = getReferencedJSONSchemaFromOperations;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTypeResolverFromOutputTCs = void 0;
|
|
4
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
5
|
+
function getTypeResolverFromOutputTCs({ possibleTypes, discriminatorField, discriminatorMapping, statusCodeTypeNameMap, }) {
|
|
6
|
+
return function resolveType(data) {
|
|
7
|
+
if (data.__typename) {
|
|
8
|
+
return data.__typename;
|
|
9
|
+
}
|
|
10
|
+
else if (discriminatorField != null && data[discriminatorField]) {
|
|
11
|
+
const discriminatorValue = data[discriminatorField];
|
|
12
|
+
return (discriminatorMapping === null || discriminatorMapping === void 0 ? void 0 : discriminatorMapping[discriminatorValue]) || discriminatorValue;
|
|
13
|
+
}
|
|
14
|
+
if (data.$statusCode && statusCodeTypeNameMap) {
|
|
15
|
+
const typeName = statusCodeTypeNameMap[data.$statusCode.toString()] || statusCodeTypeNameMap.default;
|
|
16
|
+
if (typeName) {
|
|
17
|
+
return typeName;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// const validationErrors: Record<string, ErrorObject[]> = {};
|
|
21
|
+
const dataKeys = typeof data === 'object'
|
|
22
|
+
? Object.keys(data)
|
|
23
|
+
// Remove metadata fields used to pass data
|
|
24
|
+
.filter(property => !property.toString().startsWith('$'))
|
|
25
|
+
: null;
|
|
26
|
+
for (const possibleType of possibleTypes) {
|
|
27
|
+
const typeName = possibleType.name;
|
|
28
|
+
if (dataKeys != null) {
|
|
29
|
+
const typeFields = Object.keys(possibleType.getFields());
|
|
30
|
+
if (dataKeys.length <= typeFields.length &&
|
|
31
|
+
dataKeys.every(property => typeFields.includes(property.toString()))) {
|
|
32
|
+
return typeName;
|
|
33
|
+
}
|
|
34
|
+
} /* else {
|
|
35
|
+
const validateFn = possibleType.extensions.validateWithJSONSchema as ValidateFunction;
|
|
36
|
+
if (validateFn) {
|
|
37
|
+
const isValid = validateFn(data);
|
|
38
|
+
if (isValid) {
|
|
39
|
+
return typeName;
|
|
40
|
+
}
|
|
41
|
+
validationErrors[typeName] = ajv.errors || validateFn.errors;
|
|
42
|
+
}
|
|
43
|
+
} */
|
|
44
|
+
}
|
|
45
|
+
if (data.$response) {
|
|
46
|
+
const error = (0, utils_1.createGraphQLError)(`HTTP Error: ${data.$statusCode}`, {
|
|
47
|
+
extensions: {
|
|
48
|
+
http: {
|
|
49
|
+
status: data.$statusCode,
|
|
50
|
+
headers: data.$response.header,
|
|
51
|
+
},
|
|
52
|
+
request: {
|
|
53
|
+
url: data.$url,
|
|
54
|
+
method: data.$method,
|
|
55
|
+
},
|
|
56
|
+
responseJson: data.$response,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
return error;
|
|
60
|
+
}
|
|
61
|
+
/*
|
|
62
|
+
const error = new GraphQLError(`Received data doesn't met the union`, null, null, null, null, null, {
|
|
63
|
+
validationErrors,
|
|
64
|
+
});
|
|
65
|
+
return error;
|
|
66
|
+
*/
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
exports.getTypeResolverFromOutputTCs = getTypeResolverFromOutputTCs;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUnionTypeComposers = exports.getContainerTC = void 0;
|
|
4
|
+
const graphql_compose_1 = require("graphql-compose");
|
|
5
|
+
const directives_js_1 = require("./directives.js");
|
|
6
|
+
function getContainerTC(schemaComposer, output) {
|
|
7
|
+
const containerTypeName = `${output.getTypeName()}_container`;
|
|
8
|
+
return schemaComposer.getOrCreateOTC(containerTypeName, otc => otc.addFields({
|
|
9
|
+
[output.getTypeName()]: {
|
|
10
|
+
type: output,
|
|
11
|
+
resolve: root => root,
|
|
12
|
+
},
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
exports.getContainerTC = getContainerTC;
|
|
16
|
+
function getUnionTypeComposers({ schemaComposer, typeComposersList, subSchemaAndTypeComposers, logger, }) {
|
|
17
|
+
var _a;
|
|
18
|
+
if (new Set(typeComposersList).size === 1) {
|
|
19
|
+
return typeComposersList[0];
|
|
20
|
+
}
|
|
21
|
+
const unionInputFields = {};
|
|
22
|
+
const outputTypeComposers = [];
|
|
23
|
+
typeComposersList.forEach(typeComposers => {
|
|
24
|
+
const { input, output } = typeComposers;
|
|
25
|
+
if ((0, graphql_compose_1.isSomeInputTypeComposer)(output)) {
|
|
26
|
+
outputTypeComposers.push(getContainerTC(schemaComposer, output));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
outputTypeComposers.push(output);
|
|
30
|
+
}
|
|
31
|
+
if (input) {
|
|
32
|
+
unionInputFields[input.getTypeName()] = {
|
|
33
|
+
type: input,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (!input) {
|
|
37
|
+
logger.debug(`No input type composer found for ${output.getTypeName()}, skipping...`);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
if (Object.keys(unionInputFields).length === 1) {
|
|
41
|
+
subSchemaAndTypeComposers.input = Object.values(unionInputFields)[0].type;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
subSchemaAndTypeComposers.input.addFields(unionInputFields);
|
|
45
|
+
}
|
|
46
|
+
if (new Set(outputTypeComposers).size === 1) {
|
|
47
|
+
subSchemaAndTypeComposers.output = outputTypeComposers[0];
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const directives = subSchemaAndTypeComposers.output.getDirectives() || [];
|
|
51
|
+
const statusCodeOneOfIndexMap = subSchemaAndTypeComposers.output.getExtension('statusCodeOneOfIndexMap');
|
|
52
|
+
const statusCodeOneOfIndexMapEntries = Object.entries(statusCodeOneOfIndexMap || {});
|
|
53
|
+
for (const outputTypeComposerIndex in outputTypeComposers) {
|
|
54
|
+
const outputTypeComposer = outputTypeComposers[outputTypeComposerIndex];
|
|
55
|
+
const statusCode = (_a = statusCodeOneOfIndexMapEntries.find(([statusCode, index]) => index.toString() === outputTypeComposerIndex.toString())) === null || _a === void 0 ? void 0 : _a[0];
|
|
56
|
+
if ('getFields' in outputTypeComposer) {
|
|
57
|
+
if (statusCode != null) {
|
|
58
|
+
schemaComposer.addDirective(directives_js_1.StatusCodeTypeNameDirective);
|
|
59
|
+
directives.push({
|
|
60
|
+
name: 'statusCodeTypeName',
|
|
61
|
+
args: {
|
|
62
|
+
statusCode,
|
|
63
|
+
typeName: outputTypeComposer.getTypeName(),
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
subSchemaAndTypeComposers.output.addType(outputTypeComposer);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
for (const possibleType of outputTypeComposer.getTypes()) {
|
|
71
|
+
subSchemaAndTypeComposers.output.addType(possibleType);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
subSchemaAndTypeComposers.output.setDirectives(directives);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
input: subSchemaAndTypeComposers.input,
|
|
79
|
+
output: subSchemaAndTypeComposers.output,
|
|
80
|
+
nullable: subSchemaAndTypeComposers.nullable,
|
|
81
|
+
readOnly: subSchemaAndTypeComposers.readOnly,
|
|
82
|
+
writeOnly: subSchemaAndTypeComposers.writeOnly,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
exports.getUnionTypeComposers = getUnionTypeComposers;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getValidTypeName = void 0;
|
|
4
|
+
const utils_1 = require("@graphql-mesh/utils");
|
|
5
|
+
const utils_2 = require("@graphql-tools/utils");
|
|
6
|
+
function getValidTypeName({ schemaComposer, isInput, subSchema, }) {
|
|
7
|
+
if (!subSchema.title) {
|
|
8
|
+
throw new Error('Missing title for schema; ' + (0, utils_2.inspect)(subSchema));
|
|
9
|
+
}
|
|
10
|
+
const sanitizedName = (0, utils_1.sanitizeNameForGraphQL)(isInput ? subSchema.title + '_Input' : subSchema.title);
|
|
11
|
+
if (schemaComposer.has(sanitizedName)) {
|
|
12
|
+
let i = 2;
|
|
13
|
+
while (schemaComposer.has(sanitizedName + i)) {
|
|
14
|
+
i++;
|
|
15
|
+
}
|
|
16
|
+
return sanitizedName + i;
|
|
17
|
+
}
|
|
18
|
+
return sanitizedName;
|
|
19
|
+
}
|
|
20
|
+
exports.getValidTypeName = getValidTypeName;
|
package/cjs/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processDirectives = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const loadGraphQLSchemaFromJSONSchemas_js_1 = require("./loadGraphQLSchemaFromJSONSchemas.js");
|
|
6
|
+
exports.default = loadGraphQLSchemaFromJSONSchemas_js_1.loadGraphQLSchemaFromJSONSchemas;
|
|
7
|
+
tslib_1.__exportStar(require("./loadGraphQLSchemaFromJSONSchemas.js"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./getComposerFromJSONSchema.js"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./getDereferencedJSONSchemaFromOperations.js"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./getGraphQLSchemaFromDereferencedJSONSchema.js"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./types.js"), exports);
|
|
12
|
+
var directives_js_1 = require("./directives.js");
|
|
13
|
+
Object.defineProperty(exports, "processDirectives", { enumerable: true, get: function () { return directives_js_1.processDirectives; } });
|
|
14
|
+
tslib_1.__exportStar(require("./bundle.js"), exports);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadGraphQLSchemaFromJSONSchemas = exports.loadNonExecutableGraphQLSchemaFromJSONSchemas = void 0;
|
|
4
|
+
const utils_1 = require("@graphql-mesh/utils");
|
|
5
|
+
const fetch_1 = require("@whatwg-node/fetch");
|
|
6
|
+
const bundle_js_1 = require("./bundle.js");
|
|
7
|
+
const directives_js_1 = require("./directives.js");
|
|
8
|
+
const getDereferencedJSONSchemaFromOperations_js_1 = require("./getDereferencedJSONSchemaFromOperations.js");
|
|
9
|
+
const getGraphQLSchemaFromDereferencedJSONSchema_js_1 = require("./getGraphQLSchemaFromDereferencedJSONSchema.js");
|
|
10
|
+
async function loadNonExecutableGraphQLSchemaFromJSONSchemas(name, options) {
|
|
11
|
+
options.logger = options.logger || new utils_1.DefaultLogger(name);
|
|
12
|
+
options.cwd = options.cwd || process.cwd();
|
|
13
|
+
const fullyDeferencedSchema = await (0, getDereferencedJSONSchemaFromOperations_js_1.getDereferencedJSONSchemaFromOperations)({
|
|
14
|
+
operations: options.operations,
|
|
15
|
+
operationHeaders: typeof options.operationHeaders === 'object' ? options.operationHeaders : {},
|
|
16
|
+
queryParams: options.queryParams,
|
|
17
|
+
endpoint: options.endpoint,
|
|
18
|
+
cwd: options.cwd,
|
|
19
|
+
logger: options.logger,
|
|
20
|
+
fetchFn: options.fetch,
|
|
21
|
+
schemaHeaders: options.schemaHeaders,
|
|
22
|
+
ignoreErrorResponses: options.ignoreErrorResponses,
|
|
23
|
+
});
|
|
24
|
+
const schema = await (0, getGraphQLSchemaFromDereferencedJSONSchema_js_1.getGraphQLSchemaFromDereferencedJSONSchema)(name, {
|
|
25
|
+
fullyDeferencedSchema,
|
|
26
|
+
logger: options.logger,
|
|
27
|
+
operations: options.operations,
|
|
28
|
+
operationHeaders: options.operationHeaders,
|
|
29
|
+
endpoint: options.endpoint,
|
|
30
|
+
queryParams: options.queryParams,
|
|
31
|
+
queryStringOptions: options.queryStringOptions,
|
|
32
|
+
});
|
|
33
|
+
if (options.bundle) {
|
|
34
|
+
schema.extensions = schema.extensions || {};
|
|
35
|
+
Object.defineProperty(schema.extensions, 'bundle', {
|
|
36
|
+
value: await (0, bundle_js_1.createBundleFromDereferencedSchema)(name, {
|
|
37
|
+
dereferencedSchema: fullyDeferencedSchema,
|
|
38
|
+
endpoint: options.endpoint,
|
|
39
|
+
operations: options.operations,
|
|
40
|
+
operationHeaders: typeof options.operationHeaders === 'object' ? options.operationHeaders : {},
|
|
41
|
+
logger: options.logger,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return schema;
|
|
46
|
+
}
|
|
47
|
+
exports.loadNonExecutableGraphQLSchemaFromJSONSchemas = loadNonExecutableGraphQLSchemaFromJSONSchemas;
|
|
48
|
+
async function loadGraphQLSchemaFromJSONSchemas(name, options) {
|
|
49
|
+
const graphqlSchema = await loadNonExecutableGraphQLSchemaFromJSONSchemas(name, options);
|
|
50
|
+
return (0, directives_js_1.processDirectives)({
|
|
51
|
+
...options,
|
|
52
|
+
operationHeaders: typeof options.operationHeaders === 'object' ? options.operationHeaders : {},
|
|
53
|
+
schema: graphqlSchema,
|
|
54
|
+
globalFetch: options.fetch || fetch_1.fetch,
|
|
55
|
+
pubsub: options.pubsub,
|
|
56
|
+
logger: options.logger,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
exports.loadGraphQLSchemaFromJSONSchemas = loadGraphQLSchemaFromJSONSchemas;
|
package/cjs/package.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|