UNPKG

@aws-amplify/appsync-modelgen-plugin

Version:
149 lines 8.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processConnectionsV2 = exports.getConnectedFieldForReferences = exports.getConnectedFieldV2 = void 0; const process_connections_1 = require("./process-connections"); const process_has_one_1 = require("./process-has-one"); const process_belongs_to_1 = require("./process-belongs-to"); const process_has_many_1 = require("./process-has-many"); const fieldUtils_1 = require("./fieldUtils"); const constants_1 = require("./constants"); function getConnectedFieldV2(field, model, connectedModel, directiveName, shouldUseModelNameFieldInHasManyAndBelongsTo = false) { const connectionInfo = (0, fieldUtils_1.getDirective)(field)(directiveName); if (!connectionInfo) { throw new Error(`The ${field.name} on model ${model.name} is not connected`); } if (connectionInfo.name === 'belongsTo') { let connectedFieldsBelongsTo = (0, process_belongs_to_1.getBelongsToConnectedFields)(model, connectedModel); if (connectedFieldsBelongsTo.length === 1) { return connectedFieldsBelongsTo[0]; } } const indexName = connectionInfo.arguments.indexName; const connectionFields = connectionInfo.arguments.fields; if (connectionFields || directiveName === 'hasOne') { let connectionDirective; if (indexName) { connectionDirective = (0, process_connections_1.flattenFieldDirectives)(connectedModel).find(dir => { return dir.name === 'index' && dir.arguments.name === indexName; }); if (!connectionDirective) { throw new Error(`Error processing @${connectionInfo.name} directive on ${model.name}.${field.name}, @index directive with name ${indexName} was not found in connected model ${connectedModel.name}`); } } else { connectionDirective = (0, process_connections_1.flattenFieldDirectives)(connectedModel).find(dir => { return dir.name === 'primaryKey'; }); } const getOtherSideBelongsToField = (type, otherSideModel) => { var _a; return (_a = otherSideModel.fields .filter(f => f.type === type) .find(f => f.directives.find(d => d.name === 'belongsTo'))) === null || _a === void 0 ? void 0 : _a.name; }; let connectedFieldName = constants_1.DEFAULT_HASH_KEY_FIELD; if (connectionDirective) { connectedFieldName = ((fieldDir) => { return fieldDir.fieldName; })(connectionDirective); } else { const otherSideBelongsToField = getOtherSideBelongsToField(model.name, connectedModel); if (otherSideBelongsToField) { connectedFieldName = otherSideBelongsToField; } } const otherSideConnectedField = connectedModel.fields .filter(f => f.type === model.name) .find(f => f.directives.find(d => (d.name === 'belongsTo' || d.name === 'hasOne' || d.name === 'hasMany') && d.arguments.fields && d.arguments.fields[0] === connectedFieldName)); if (otherSideConnectedField) { return otherSideConnectedField; } const connectedField = connectedModel.fields.find(f => f.name === connectedFieldName); if (!connectedField) { throw new Error(`Can not find key field ${connectedFieldName} in ${connectedModel.name}`); } return connectedField; } if (shouldUseModelNameFieldInHasManyAndBelongsTo) { const otherSideConnectedField = connectedModel.fields .filter(f => f.type === model.name) .find(f => f.directives.find(d => (d.name === 'belongsTo' || d.name === 'hasOne' || d.name === 'hasMany'))); if (otherSideConnectedField) { return otherSideConnectedField; } } const connectedFieldName = (0, process_connections_1.makeConnectionAttributeName)(model.name, field.name); const connectedField = connectedModel.fields.find(f => f.name === connectedFieldName); return connectedField ? connectedField : { name: connectedFieldName, directives: [], type: 'ID', isList: false, isNullable: true, }; } exports.getConnectedFieldV2 = getConnectedFieldV2; function getConnectedFieldForReferences(field, model, connectedModel, directiveName) { var _a, _b; const connectionInfo = (0, fieldUtils_1.getDirective)(field)(directiveName); if (!connectionInfo) { throw new Error(`The ${field.name} on model ${model.name} is not connected`); } const references = connectionInfo.arguments.references; if (!references) { throw new Error(`The ${field.name} on model ${model.name} does not have references.`); } const connectionFields = connectionInfo.arguments.fields; if (connectionFields && references) { throw new Error(`'fields' and 'references' cannot be used together.`); } if (connectionInfo.name === 'belongsTo') { let connectedFieldsBelongsTo = (0, process_belongs_to_1.getBelongsToConnectedFields)(model, connectedModel); const connectedField = connectedFieldsBelongsTo.find((field) => { return field.directives.some((dir) => { return (dir.name === 'hasOne' || dir.name === 'hasMany') && dir.arguments.references && JSON.stringify(dir.arguments.references) === JSON.stringify(connectionInfo.arguments.references); }); }); if (!connectedField) { throw new Error(`Error processing @belongsTo directive on ${model.name}.${field.name}. @hasOne or @hasMany directive with references ${JSON.stringify((_a = connectionInfo.arguments) === null || _a === void 0 ? void 0 : _a.references)} was not found in connected model ${connectedModel.name}`); } return connectedField; } const connectionDirective = (0, process_connections_1.flattenFieldDirectives)(connectedModel).find((dir) => { return dir.arguments.references && JSON.stringify(dir.arguments.references) === JSON.stringify(connectionInfo.arguments.references); }); if (!connectionDirective) { throw new Error(`Error processing @${connectionInfo.name} directive on ${model.name}.${field.name}. @belongsTo directive with references ${JSON.stringify((_b = connectionInfo.arguments) === null || _b === void 0 ? void 0 : _b.references)} was not found in connected model ${connectedModel.name}`); } const connectedFieldName = ((fieldDir) => { return fieldDir.fieldName; })(connectionDirective); const connectedField = connectedModel.fields.find(f => f.name === connectedFieldName); return connectedField; } exports.getConnectedFieldForReferences = getConnectedFieldForReferences; function processConnectionsV2(field, model, modelMap, shouldUseModelNameFieldInHasManyAndBelongsTo = false, isCustomPKEnabled = false, shouldUseFieldsInAssociatedWithInHasOne = false) { const connectionDirective = field.directives.find(d => d.name === 'hasOne' || d.name === 'hasMany' || d.name === 'belongsTo'); if (connectionDirective) { switch (connectionDirective.name) { case 'hasOne': return (0, process_has_one_1.processHasOneConnection)(field, model, modelMap, connectionDirective, isCustomPKEnabled, shouldUseFieldsInAssociatedWithInHasOne); case 'belongsTo': return (0, process_belongs_to_1.processBelongsToConnection)(field, model, modelMap, connectionDirective, isCustomPKEnabled); case 'hasMany': return (0, process_has_many_1.processHasManyConnection)(field, model, modelMap, connectionDirective, shouldUseModelNameFieldInHasManyAndBelongsTo, isCustomPKEnabled); default: break; } } } exports.processConnectionsV2 = processConnectionsV2; //# sourceMappingURL=process-connections-v2.js.map