UNPKG

rxdb

Version:

A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/

235 lines (223 loc) 8.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SPACING = void 0; exports.fillUpOptionals = fillUpOptionals; exports.graphQLSchemaFromRxSchema = graphQLSchemaFromRxSchema; var _getGraphqlFromJsonschema = require("get-graphql-from-jsonschema"); var _rxSchemaHelper = require("../../rx-schema-helper.js"); var _index = require("../../plugins/utils/index.js"); /** * just type some common types * to have better IDE autocomplete, * all strings are allowed */ // we use two spaces because get-graphql-from-jsonschema does also var SPACING = exports.SPACING = ' '; /** * Create a GraphQL schema from a given RxJsonSchema */ function graphQLSchemaFromRxSchema(input) { var ret = { asString: '', queries: [], mutations: [], subscriptions: [], inputs: [], types: [] }; Object.entries(input).forEach(([collectionName, collectionSettings]) => { collectionSettings = fillUpOptionals(collectionSettings); var schema = collectionSettings.schema; var prefixes = (0, _index.ensureNotFalsy)(collectionSettings.prefixes); var ucCollectionName = (0, _index.ucfirst)(collectionName); var collectionNameInput = (0, _index.ucfirst)(collectionName) + 'Input'; // input var inputSchema = stripKeysFromSchema(schema, (0, _index.ensureNotFalsy)(collectionSettings.ignoreInputKeys)); var inputGraphQL = (0, _getGraphqlFromJsonschema.getGraphqlSchemaFromJsonSchema)({ rootName: collectionNameInput, schema: inputSchema, direction: 'input' }); var pushRowGraphQL = (0, _getGraphqlFromJsonschema.getGraphqlSchemaFromJsonSchema)({ rootName: collectionNameInput + prefixes.pushRow, schema: { type: 'object', properties: { assumedMasterState: inputSchema, newDocumentState: inputSchema }, required: ['newDocumentState'], additionalProperties: false }, direction: 'input' }); var checkpointSchema = { type: 'object', properties: {}, required: [], additionalProperties: false }; collectionSettings.checkpointFields.forEach(key => { var subSchema = schema.properties[key]; checkpointSchema.properties[key] = subSchema; checkpointSchema.required.push(key); }); var checkpointInputGraphQL = (0, _getGraphqlFromJsonschema.getGraphqlSchemaFromJsonSchema)({ rootName: collectionNameInput + prefixes.checkpoint, schema: checkpointSchema, direction: 'input' }); ret.inputs = ret.inputs.concat(inputGraphQL.typeDefinitions.map(str => replaceTopLevelTypeName(str, collectionNameInput))).concat(pushRowGraphQL.typeDefinitions.map(str => replaceTopLevelTypeName(str, collectionNameInput + prefixes.pushRow))).concat(checkpointInputGraphQL.typeDefinitions.map(str => replaceTopLevelTypeName(str, collectionNameInput + prefixes.checkpoint))); var headersSchema = { type: 'object', additionalProperties: false, properties: {}, required: [] }; (0, _index.ensureNotFalsy)(collectionSettings.headerFields).forEach(headerField => { headersSchema.properties[headerField] = { type: 'string' }; headersSchema.required.push(headerField); }); var headersInputName = collectionNameInput + prefixes.headers; var headersInputGraphQL = (0, _getGraphqlFromJsonschema.getGraphqlSchemaFromJsonSchema)({ rootName: headersInputName, schema: headersSchema, direction: 'input' }); if ((0, _index.ensureNotFalsy)(collectionSettings.headerFields).length > 0) { ret.inputs = ret.inputs.concat(headersInputGraphQL.typeDefinitions.map(str => replaceTopLevelTypeName(str, headersInputName))); } // output var outputSchema = stripKeysFromSchema(schema, (0, _index.ensureNotFalsy)(collectionSettings.ignoreOutputKeys)); var outputGraphQL = (0, _getGraphqlFromJsonschema.getGraphqlSchemaFromJsonSchema)({ rootName: collectionName, schema: outputSchema, direction: 'output' }); var checkpointOutputGraphQL = (0, _getGraphqlFromJsonschema.getGraphqlSchemaFromJsonSchema)({ rootName: ucCollectionName + prefixes.checkpoint, schema: checkpointSchema, direction: 'output' }); var pullBulkOutputGraphQL = (0, _getGraphqlFromJsonschema.getGraphqlSchemaFromJsonSchema)({ rootName: ucCollectionName + prefixes.pullBulk, schema: { type: 'object', properties: { documents: { type: 'array', items: inputSchema }, checkpoint: checkpointSchema }, required: ['documents', 'checkpoint'], additionalProperties: false }, direction: 'output' }); ret.types = ret.types.concat(outputGraphQL.typeDefinitions.map(str => replaceTopLevelTypeName(str, ucCollectionName))).concat(checkpointOutputGraphQL.typeDefinitions.map(str => replaceTopLevelTypeName(str, ucCollectionName + prefixes.checkpoint))).concat(pullBulkOutputGraphQL.typeDefinitions.map(str => replaceTopLevelTypeName(str, ucCollectionName + prefixes.pullBulk))); // query var queryName = prefixes.pull + ucCollectionName; var queryKeys = ['checkpoint: ' + collectionNameInput + prefixes.checkpoint, 'limit: Int!']; var queryString = queryName + '(' + queryKeys.join(', ') + '): ' + ucCollectionName + prefixes.pullBulk + '!'; ret.queries.push(SPACING + queryString); // mutation var mutationName = prefixes.push + ucCollectionName; var mutationString = mutationName + '(' + collectionName + prefixes.pushRow + ': [' + collectionNameInput + prefixes.pushRow + ']): [' + ucCollectionName + '!]!'; ret.mutations.push(SPACING + mutationString); // subscription var subscriptionHeaderInputString = ''; if (collectionSettings.headerFields && collectionSettings.headerFields.length > 0) { subscriptionHeaderInputString = '(headers: ' + headersInputName + ')'; } var subscriptionName = prefixes.stream + ucCollectionName; var subscriptionString = subscriptionName + subscriptionHeaderInputString + ': ' + ucCollectionName + prefixes.pullBulk + '!'; ret.subscriptions.push(SPACING + subscriptionString); }); // build full string var fullQueryString = 'type Query {\n' + ret.queries.join('\n') + '\n}\n'; var fullMutationString = 'type Mutation {\n' + ret.mutations.join('\n') + '\n}\n'; var fullSubscriptionString = 'type Subscription {\n' + ret.subscriptions.join('\n') + '\n}\n'; var fullTypeString = ret.types.join('\n'); var fullInputString = ret.inputs.join('\n'); var fullSchemaString = '' + 'schema {\n' + SPACING + 'query: Query\n' + SPACING + 'mutation: Mutation\n' + SPACING + 'subscription: Subscription\n' + '}\n'; ret.asString = '' + fullQueryString + '\n' + fullMutationString + '\n' + fullSubscriptionString + '\n' + fullTypeString + '\n' + fullInputString + '\n' + fullSchemaString; return ret; } function fillUpOptionals(input) { input = (0, _index.flatClone)(input); var schema = (0, _rxSchemaHelper.fillWithDefaultSettings)(input.schema); // strip internal attributes Object.keys(schema.properties).forEach(key => { if (key.startsWith('_')) { delete schema.properties[key]; } }); input.schema = schema; // add deleted field to schema if (!input.deletedField) { input.deletedField = '_deleted'; } schema.properties[input.deletedField] = { type: 'boolean' }; schema.required.push(input.deletedField); // fill up prefixes if (!input.prefixes) { input.prefixes = {}; } var prefixes = input.prefixes; if (!prefixes.push) { prefixes.push = 'push'; } if (!prefixes.pushRow) { prefixes.pushRow = 'PushRow'; } if (!prefixes.checkpoint) { prefixes.checkpoint = 'Checkpoint'; } if (!prefixes.pull) { prefixes.pull = 'pull'; } if (!prefixes.pullBulk) { prefixes.pullBulk = 'PullBulk'; } if (!prefixes.stream) { prefixes.stream = 'stream'; } if (!prefixes.headers) { prefixes.headers = 'Headers'; } if (!input.headerFields) { input.headerFields = []; } if (!input.withRevisions) { input.withRevisions = false; } if (!input.ignoreInputKeys) { input.ignoreInputKeys = []; } if (!input.ignoreOutputKeys) { input.ignoreOutputKeys = []; } return input; } function stripKeysFromSchema(schema, strip) { var cloned = (0, _index.clone)(schema); strip.forEach(key => { delete cloned.properties[key]; }); return cloned; } /** * get-graphql-from-jsonschema add a T0-suffix * that we do not want for the top level type */ function replaceTopLevelTypeName(str, ucCollectionName) { return str.replace(' ' + ucCollectionName + 'T0 ', ' ' + ucCollectionName + ' '); } //# sourceMappingURL=graphql-schema-from-rx-schema.js.map