@aws-amplify/graphql-model-transformer
Version:
Amplify graphql @model transformer
582 lines • 39.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModelTransformer = void 0;
const graphql_transformer_core_1 = require("@aws-amplify/graphql-transformer-core");
const graphql_transformer_interfaces_1 = require("@aws-amplify/graphql-transformer-interfaces");
const graphql_directives_1 = require("@aws-amplify/graphql-directives");
const graphql_transformer_common_1 = require("graphql-transformer-common");
const graphql_types_1 = require("./graphql-types");
const definitions_1 = require("./definitions");
const directive_1 = require("./directive");
const dynamo_model_resource_generator_1 = require("./resources/dynamo-model-resource-generator");
const rds_model_resource_generator_1 = require("./resources/rds-model-resource-generator");
const amplify_dynamo_model_resource_generator_1 = require("./resources/amplify-dynamodb-table/amplify-dynamo-model-resource-generator");
const graphql_transformer_core_2 = require("@aws-amplify/graphql-transformer-core");
const ITERATIVE_TABLE_GENERATOR = 'AmplifyDDB';
const SQL_LAMBDA_GENERATOR = 'SQL';
class ModelTransformer extends graphql_transformer_core_1.TransformerModelBase {
constructor(options = {}) {
super('amplify-model-transformer', graphql_directives_1.ModelDirective.definition);
this.ddbTableMap = {};
this.typesWithModelDirective = new Set();
this.resourceGeneratorMap = new Map();
this.dataSourceStrategiesProvider = { dataSourceStrategies: {} };
this.modelDirectiveConfig = new Map();
this.before = (ctx) => {
var _a, _b, _c, _d, _e, _f, _g;
const { dataSourceStrategies, sqlDirectiveDataSourceStrategies } = ctx;
this.dataSourceStrategiesProvider = { dataSourceStrategies, sqlDirectiveDataSourceStrategies };
const strategies = Object.values(dataSourceStrategies);
const customSqlDataSources = (_a = sqlDirectiveDataSourceStrategies === null || sqlDirectiveDataSourceStrategies === void 0 ? void 0 : sqlDirectiveDataSourceStrategies.map((dss) => dss.strategy)) !== null && _a !== void 0 ? _a : [];
if (strategies.some(graphql_transformer_core_1.isDefaultDynamoDbModelDataSourceStrategy)) {
(_b = this.resourceGeneratorMap.get(graphql_transformer_core_1.DDB_DB_TYPE)) === null || _b === void 0 ? void 0 : _b.enableGenerator();
(_c = this.resourceGeneratorMap.get(graphql_transformer_core_1.DDB_DB_TYPE)) === null || _c === void 0 ? void 0 : _c.enableProvisioned();
}
if (strategies.some(graphql_transformer_core_1.isSqlStrategy) || customSqlDataSources.length > 0) {
(_d = this.resourceGeneratorMap.get(SQL_LAMBDA_GENERATOR)) === null || _d === void 0 ? void 0 : _d.enableGenerator();
(_e = this.resourceGeneratorMap.get(SQL_LAMBDA_GENERATOR)) === null || _e === void 0 ? void 0 : _e.enableUnprovisioned();
}
if (strategies.some(graphql_transformer_core_1.isAmplifyDynamoDbModelDataSourceStrategy) || strategies.some(graphql_transformer_core_2.isImportedAmplifyDynamoDbModelDataSourceStrategy)) {
(_f = this.resourceGeneratorMap.get(ITERATIVE_TABLE_GENERATOR)) === null || _f === void 0 ? void 0 : _f.enableGenerator();
(_g = this.resourceGeneratorMap.get(ITERATIVE_TABLE_GENERATOR)) === null || _g === void 0 ? void 0 : _g.enableProvisioned();
}
};
this.object = (definition, directive, ctx) => {
var _a, _b, _c, _d, _e, _f, _g, _h;
const typeName = definition.name.value;
const isTypeNameReserved = typeName === ctx.output.getQueryTypeName() ||
typeName === ctx.output.getMutationTypeName() ||
typeName === ctx.output.getSubscriptionTypeName();
const isDynamoDB = (0, graphql_transformer_core_1.isDynamoDbModel)(ctx, typeName);
if (isTypeNameReserved) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`'${typeName}' is a reserved type name and currently in use within the default schema element.`);
}
if (!isDynamoDB) {
const containsPrimaryKey = (_a = definition.fields) === null || _a === void 0 ? void 0 : _a.some((field) => {
var _a;
return (_a = field === null || field === void 0 ? void 0 : field.directives) === null || _a === void 0 ? void 0 : _a.some((dir) => dir.name.value === 'primaryKey');
});
if (!containsPrimaryKey) {
throw new graphql_transformer_core_1.InvalidDirectiveError(`SQL model "${typeName}" must contain a primary key field`);
}
}
if (ctx.isProjectUsingDataStore()) {
graphql_transformer_core_1.SyncUtils.validateResolverConfigForType(ctx, typeName);
}
const directiveWrapped = new graphql_transformer_core_1.DirectiveWrapper(directive);
const options = directiveWrapped.getArguments({
queries: {
get: (0, graphql_transformer_core_1.getFieldNameFor)('get', typeName),
list: (0, graphql_transformer_core_1.getFieldNameFor)('list', typeName),
...(ctx.isProjectUsingDataStore() ? { sync: (0, graphql_transformer_core_1.getFieldNameFor)('sync', typeName) } : undefined),
},
mutations: {
create: (0, graphql_transformer_core_1.getFieldNameFor)('create', typeName),
update: (0, graphql_transformer_core_1.getFieldNameFor)('update', typeName),
delete: (0, graphql_transformer_core_1.getFieldNameFor)('delete', typeName),
},
subscriptions: {
level: directive_1.SubscriptionLevel.on,
onCreate: [(0, graphql_transformer_core_1.getFieldNameFor)('onCreate', typeName)],
onDelete: [(0, graphql_transformer_core_1.getFieldNameFor)('onDelete', typeName)],
onUpdate: [(0, graphql_transformer_core_1.getFieldNameFor)('onUpdate', typeName)],
},
timestamps: isDynamoDB
? {
createdAt: 'createdAt',
updatedAt: 'updatedAt',
}
: {
createdAt: undefined,
updatedAt: undefined,
},
}, (0, graphql_transformer_core_1.generateGetArgumentsInput)(ctx.transformParameters));
if (!ctx.transformParameters.shouldDeepMergeDirectiveConfigDefaults) {
const publicSubscriptionDefaults = {
onCreate: [(0, graphql_transformer_core_1.getFieldNameFor)('onCreate', typeName)],
onDelete: [(0, graphql_transformer_core_1.getFieldNameFor)('onDelete', typeName)],
onUpdate: [(0, graphql_transformer_core_1.getFieldNameFor)('onUpdate', typeName)],
};
const baseArgs = directiveWrapped.getArguments({
subscriptions: {
level: directive_1.SubscriptionLevel.on,
...publicSubscriptionDefaults,
},
}, (0, graphql_transformer_core_1.generateGetArgumentsInput)(ctx.transformParameters));
if (((_b = baseArgs === null || baseArgs === void 0 ? void 0 : baseArgs.subscriptions) === null || _b === void 0 ? void 0 : _b.level) === directive_1.SubscriptionLevel.public &&
!(((_c = baseArgs === null || baseArgs === void 0 ? void 0 : baseArgs.subscriptions) === null || _c === void 0 ? void 0 : _c.onCreate) || ((_d = baseArgs === null || baseArgs === void 0 ? void 0 : baseArgs.subscriptions) === null || _d === void 0 ? void 0 : _d.onDelete) || ((_e = baseArgs === null || baseArgs === void 0 ? void 0 : baseArgs.subscriptions) === null || _e === void 0 ? void 0 : _e.onUpdate))) {
options.subscriptions = { level: directive_1.SubscriptionLevel.public, ...publicSubscriptionDefaults };
}
}
if (((_f = options.subscriptions) === null || _f === void 0 ? void 0 : _f.onCreate) && !Array.isArray(options.subscriptions.onCreate)) {
options.subscriptions.onCreate = [options.subscriptions.onCreate];
}
if (((_g = options.subscriptions) === null || _g === void 0 ? void 0 : _g.onDelete) && !Array.isArray(options.subscriptions.onDelete)) {
options.subscriptions.onDelete = [options.subscriptions.onDelete];
}
if (((_h = options.subscriptions) === null || _h === void 0 ? void 0 : _h.onUpdate) && !Array.isArray(options.subscriptions.onUpdate)) {
options.subscriptions.onUpdate = [options.subscriptions.onUpdate];
}
this.modelDirectiveConfig.set(typeName, options);
this.typesWithModelDirective.add(typeName);
const resourceGenerator = this.getResourceGenerator(ctx, typeName);
if (resourceGenerator) {
resourceGenerator.addModelDefinition(definition, options);
}
else {
throw Error(`DB Type or Resource Generator not defined for ${typeName}`);
}
};
this.prepare = (context) => {
this.typesWithModelDirective.forEach((modelTypeName) => {
const type = context.output.getObject(modelTypeName);
context.providerRegistry.registerDataSourceProvider(type, this);
});
};
this.transformSchema = (ctx) => {
(0, graphql_types_1.addModelConditionInputs)(ctx);
this.ensureModelSortDirectionEnum(ctx);
this.typesWithModelDirective.forEach((type) => {
const defBeforeImplicitFields = ctx.output.getObject(type);
const typeName = defBeforeImplicitFields.name.value;
if ((0, graphql_transformer_core_1.isDynamoDbModel)(ctx, typeName)) {
this.addAutoGeneratableFields(ctx, type);
}
const def = ctx.output.getObject(type);
const hasAuth = def.directives.some((dir) => dir.name.value === 'auth');
this.createNonModelInputs(ctx, def);
const queryFields = this.createQueryFields(ctx, def);
ctx.output.addQueryFields(queryFields);
const mutationFields = this.createMutationFields(ctx, defBeforeImplicitFields);
ctx.output.addMutationFields(mutationFields);
const subscriptionsFields = this.createSubscriptionFields(ctx, def);
ctx.output.addSubscriptionFields(subscriptionsFields);
if ((0, graphql_transformer_core_1.isDynamoDbModel)(ctx, typeName)) {
if (ctx.isProjectUsingDataStore()) {
this.addModelSyncFields(ctx, type);
}
}
if (!hasAuth) {
const serviceDirectiveNames = new Set();
if (ctx.transformParameters.sandboxModeEnabled && ctx.synthParameters.enableIamAccess) {
serviceDirectiveNames.add(definitions_1.API_KEY_DIRECTIVE);
serviceDirectiveNames.add(definitions_1.AWS_IAM_DIRECTIVE);
}
else if (ctx.transformParameters.sandboxModeEnabled && ctx.authConfig.defaultAuthentication.authenticationType !== 'API_KEY') {
serviceDirectiveNames.add(definitions_1.API_KEY_DIRECTIVE);
}
else if (ctx.synthParameters.enableIamAccess && ctx.authConfig.defaultAuthentication.authenticationType !== 'AWS_IAM') {
serviceDirectiveNames.add(definitions_1.AWS_IAM_DIRECTIVE);
}
const serviceDirectives = [...serviceDirectiveNames].map((directiveName) => (0, graphql_transformer_common_1.makeDirective)(directiveName, []));
if (serviceDirectives.length > 0) {
(0, graphql_types_1.extendTypeWithDirectives)(ctx, def.name.value, serviceDirectives);
(0, graphql_types_1.propagateDirectivesToNestedTypes)(ctx, def, new Set(), serviceDirectives);
queryFields.forEach((operationField) => {
const operationName = operationField.name.value;
(0, graphql_types_1.addDirectivesToOperation)(ctx, ctx.output.getQueryTypeName(), operationName, serviceDirectives);
});
mutationFields.forEach((operationField) => {
const operationName = operationField.name.value;
(0, graphql_types_1.addDirectivesToOperation)(ctx, ctx.output.getMutationTypeName(), operationName, serviceDirectives);
});
subscriptionsFields.forEach((operationField) => {
const operationName = operationField.name.value;
(0, graphql_types_1.addDirectivesToOperation)(ctx, ctx.output.getSubscriptionTypeName(), operationName, serviceDirectives);
});
}
}
});
};
this.generateResolvers = (context) => {
this.resourceGeneratorMap.forEach((generator) => {
generator.generateResources(context);
});
};
this.generateGetResolver = (ctx, type, typeName, fieldName, resolverLogicalId) => {
const resourceGenerator = this.getResourceGenerator(ctx, type.name.value);
if (resourceGenerator) {
return resourceGenerator.generateGetResolver(ctx, type, typeName, fieldName, resolverLogicalId);
}
throw new Error(`DB Type undefined or resource generator not provided for ${type.name.value}`);
};
this.generateListResolver = (ctx, type, typeName, fieldName, resolverLogicalId) => {
const resourceGenerator = this.getResourceGenerator(ctx, type.name.value);
if (resourceGenerator) {
return resourceGenerator.generateListResolver(ctx, type, typeName, fieldName, resolverLogicalId);
}
throw new Error(`DB Type undefined or resource generator not provided for ${type.name.value}`);
};
this.generateCreateResolver = (ctx, type, typeName, fieldName, resolverLogicalId) => {
const resourceGenerator = this.getResourceGenerator(ctx, type.name.value);
if (resourceGenerator) {
return resourceGenerator.generateCreateResolver(ctx, type, typeName, fieldName, resolverLogicalId);
}
throw new Error(`DB Type undefined or resource generator not provided for ${type.name.value}`);
};
this.generateUpdateResolver = (ctx, type, typeName, fieldName, resolverLogicalId) => {
const modelDirectiveConfig = this.modelDirectiveConfig.get(type.name.value);
const resourceGenerator = this.getResourceGenerator(ctx, type.name.value);
if (resourceGenerator) {
return resourceGenerator.generateUpdateResolver(ctx, type, modelDirectiveConfig, typeName, fieldName, resolverLogicalId);
}
throw new Error(`DB Type undefined or resource generator not provided for ${type.name.value}`);
};
this.generateDeleteResolver = (ctx, type, typeName, fieldName, resolverLogicalId) => {
const resourceGenerator = this.getResourceGenerator(ctx, type.name.value);
if (resourceGenerator) {
return resourceGenerator.generateDeleteResolver(ctx, type, typeName, fieldName, resolverLogicalId);
}
throw new Error(`DB Type undefined or resource generator not provided for ${type.name.value}`);
};
this.generateOnCreateResolver = (ctx, typeName, fieldName, resolverLogicalId) => {
if (this.resourceGeneratorMap.has(graphql_transformer_core_1.DDB_DB_TYPE)) {
return this.resourceGeneratorMap.get(graphql_transformer_core_1.DDB_DB_TYPE).generateOnCreateResolver(ctx, typeName, fieldName, resolverLogicalId);
}
throw new Error('Resource generator not provided for DDB');
};
this.generateOnUpdateResolver = (ctx, typeName, fieldName, resolverLogicalId) => {
if (this.resourceGeneratorMap.has(graphql_transformer_core_1.DDB_DB_TYPE)) {
return this.resourceGeneratorMap.get(graphql_transformer_core_1.DDB_DB_TYPE).generateOnUpdateResolver(ctx, typeName, fieldName, resolverLogicalId);
}
throw new Error('Resource generator not provided for DDB');
};
this.generateOnDeleteResolver = (ctx, typeName, fieldName, resolverLogicalId) => {
if (this.resourceGeneratorMap.has(graphql_transformer_core_1.DDB_DB_TYPE)) {
return this.resourceGeneratorMap.get(graphql_transformer_core_1.DDB_DB_TYPE).generateOnDeleteResolver(ctx, typeName, fieldName, resolverLogicalId);
}
throw new Error('Resource generator not provided for DDB');
};
this.generateSyncResolver = (ctx, type, typeName, fieldName, resolverLogicalId) => {
const resourceGenerator = this.getResourceGenerator(ctx, type.name.value);
if (resourceGenerator) {
return resourceGenerator.generateSyncResolver(ctx, type, typeName, fieldName, resolverLogicalId);
}
throw new Error(`DB Type undefined or resource generator not provided for ${type.name.value}`);
};
this.getMutationName = (subscriptionType, mutationMap) => {
const mutationToSubscriptionTypeMap = {
[graphql_transformer_interfaces_1.SubscriptionFieldType.ON_CREATE]: graphql_transformer_interfaces_1.MutationFieldType.CREATE,
[graphql_transformer_interfaces_1.SubscriptionFieldType.ON_UPDATE]: graphql_transformer_interfaces_1.MutationFieldType.UPDATE,
[graphql_transformer_interfaces_1.SubscriptionFieldType.ON_DELETE]: graphql_transformer_interfaces_1.MutationFieldType.DELETE,
};
const mutation = Array.from(mutationMap).find((m) => m.type === mutationToSubscriptionTypeMap[subscriptionType]);
if (mutation) {
return mutation.fieldName;
}
throw new Error('Unknown Subscription type');
};
this.createQueryFields = (ctx, def) => {
const queryFields = [];
const queryFieldNames = this.getQueryFieldNames(def);
queryFieldNames.forEach((queryField) => {
const outputType = this.getOutputType(ctx, def, queryField);
const args = this.getInputs(ctx, def, {
fieldName: queryField.fieldName,
typeName: queryField.typeName,
type: queryField.type,
});
queryFields.push((0, graphql_transformer_common_1.makeField)(queryField.fieldName, args, (0, graphql_transformer_common_1.makeNamedType)(outputType.name.value)));
});
return queryFields;
};
this.createMutationFields = (ctx, def) => {
const mutationFields = [];
const mutationFieldNames = this.getMutationFieldNames(def);
mutationFieldNames.forEach((mutationField) => {
const args = this.getInputs(ctx, def, {
fieldName: mutationField.fieldName,
typeName: mutationField.typeName,
type: mutationField.type,
});
mutationFields.push((0, graphql_transformer_common_1.makeField)(mutationField.fieldName, args, (0, graphql_transformer_common_1.makeNamedType)(def.name.value)));
});
return mutationFields;
};
this.createSubscriptionFields = (ctx, def) => {
const subscriptionToMutationsMap = this.getSubscriptionToMutationsReverseMap(def);
const mutationFields = this.getMutationFieldNames(def);
const subscriptionFields = [];
Object.keys(subscriptionToMutationsMap).forEach((subscriptionFieldName) => {
const maps = subscriptionToMutationsMap[subscriptionFieldName];
const args = [];
maps.map((it) => args.push(...this.getInputs(ctx, def, {
fieldName: it.fieldName,
typeName: it.typeName,
type: it.type,
})));
const mutationNames = maps.map((it) => this.getMutationName(it.type, mutationFields));
const directive = (0, graphql_transformer_common_1.makeDirective)('aws_subscribe', [(0, graphql_transformer_common_1.makeArgument)('mutations', (0, graphql_transformer_common_1.makeValueNode)(mutationNames))]);
const field = (0, graphql_transformer_common_1.makeField)(subscriptionFieldName, args, (0, graphql_transformer_common_1.makeNamedType)(def.name.value), [directive]);
subscriptionFields.push(field);
});
return subscriptionFields;
};
this.getQueryFieldNames = (type) => {
const resourceGenerator = this.getResourceGenerator(this.dataSourceStrategiesProvider, type.name.value);
if (resourceGenerator) {
return resourceGenerator.getQueryFieldNames(type);
}
throw new Error(`Resource Generator or DB Type not defined for ${type.name.value}`);
};
this.getMutationFieldNames = (type) => {
const resourceGenerator = this.getResourceGenerator(this.dataSourceStrategiesProvider, type.name.value);
if (resourceGenerator) {
return resourceGenerator.getMutationFieldNames(type);
}
throw new Error(`Resource Generator or DB Type not defined for ${type.name.value}`);
};
this.getSubscriptionFieldNames = (type) => {
const resourceGenerator = this.getResourceGenerator(this.dataSourceStrategiesProvider, type.name.value);
if (resourceGenerator) {
return resourceGenerator.getSubscriptionFieldNames(type);
}
throw new Error(`Resource Generator or DB Type not defined for ${type.name.value}`);
};
this.getDataSourceResource = (type) => this.ddbTableMap[type.name.value];
this.getDataSourceType = () => graphql_transformer_interfaces_1.AppSyncDataSourceType.AMAZON_DYNAMODB;
this.getInputs = (ctx, type, operation) => {
const isSyncEnabled = ctx.isProjectUsingDataStore();
const knownModels = this.typesWithModelDirective;
let conditionInput;
if ([graphql_transformer_interfaces_1.MutationFieldType.CREATE, graphql_transformer_interfaces_1.MutationFieldType.DELETE, graphql_transformer_interfaces_1.MutationFieldType.UPDATE].includes(operation.type)) {
const conditionTypeName = (0, graphql_transformer_core_1.getConditionInputName)(type.name.value);
const filterInputs = (0, graphql_types_1.createEnumModelFilters)(ctx, type);
conditionInput = (0, graphql_types_1.makeMutationConditionInput)(ctx, conditionTypeName, type, this.modelDirectiveConfig.get(type.name.value));
filterInputs.push(conditionInput);
filterInputs.forEach((input) => {
const conditionInputName = input.name.value;
if (!ctx.output.getType(conditionInputName)) {
ctx.output.addInput(input);
}
});
}
switch (operation.type) {
case graphql_transformer_interfaces_1.QueryFieldType.GET:
return [(0, graphql_transformer_common_1.makeInputValueDefinition)('id', (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('ID')))];
case graphql_transformer_interfaces_1.QueryFieldType.LIST: {
const filterInputName = (0, graphql_transformer_core_1.getFilterInputName)(type.name.value);
const filterInputs = (0, graphql_types_1.createEnumModelFilters)(ctx, type);
filterInputs.push((0, graphql_types_1.makeListQueryFilterInput)(ctx, filterInputName, type));
filterInputs.forEach((input) => {
const conditionInputName = input.name.value;
if (!ctx.output.getType(conditionInputName)) {
ctx.output.addInput(input);
}
});
return [
(0, graphql_transformer_common_1.makeInputValueDefinition)('filter', (0, graphql_transformer_common_1.makeNamedType)(filterInputName)),
(0, graphql_transformer_common_1.makeInputValueDefinition)('limit', (0, graphql_transformer_common_1.makeNamedType)('Int')),
(0, graphql_transformer_common_1.makeInputValueDefinition)('nextToken', (0, graphql_transformer_common_1.makeNamedType)('String')),
];
}
case graphql_transformer_interfaces_1.QueryFieldType.SYNC: {
const syncFilterInputName = (0, graphql_transformer_core_1.getFilterInputName)(type.name.value);
const syncFilterInputs = (0, graphql_types_1.makeListQueryFilterInput)(ctx, syncFilterInputName, type);
const conditionInputName = syncFilterInputs.name.value;
if (!ctx.output.getType(conditionInputName)) {
ctx.output.addInput(syncFilterInputs);
}
return [
(0, graphql_transformer_common_1.makeInputValueDefinition)('filter', (0, graphql_transformer_common_1.makeNamedType)(syncFilterInputName)),
(0, graphql_transformer_common_1.makeInputValueDefinition)('limit', (0, graphql_transformer_common_1.makeNamedType)('Int')),
(0, graphql_transformer_common_1.makeInputValueDefinition)('nextToken', (0, graphql_transformer_common_1.makeNamedType)('String')),
(0, graphql_transformer_common_1.makeInputValueDefinition)('lastSync', (0, graphql_transformer_common_1.makeNamedType)('AWSTimestamp')),
];
}
case graphql_transformer_interfaces_1.MutationFieldType.CREATE: {
const createInputField = (0, graphql_types_1.makeCreateInputField)(type, this.modelDirectiveConfig.get(type.name.value), knownModels, ctx.inputDocument, isSyncEnabled);
const createInputTypeName = createInputField.name.value;
if (!ctx.output.getType(createInputField.name.value)) {
ctx.output.addInput(createInputField);
}
return [
(0, graphql_transformer_common_1.makeInputValueDefinition)('input', (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)(createInputTypeName))),
(0, graphql_transformer_common_1.makeInputValueDefinition)('condition', (0, graphql_transformer_common_1.makeNamedType)(conditionInput.name.value)),
];
}
case graphql_transformer_interfaces_1.MutationFieldType.DELETE: {
const deleteInputField = (0, graphql_types_1.makeDeleteInputField)(type, isSyncEnabled);
const deleteInputTypeName = deleteInputField.name.value;
if (!ctx.output.getType(deleteInputField.name.value)) {
ctx.output.addInput(deleteInputField);
}
return [
(0, graphql_transformer_common_1.makeInputValueDefinition)('input', (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)(deleteInputTypeName))),
(0, graphql_transformer_common_1.makeInputValueDefinition)('condition', (0, graphql_transformer_common_1.makeNamedType)(conditionInput.name.value)),
];
}
case graphql_transformer_interfaces_1.MutationFieldType.UPDATE: {
const updateInputField = (0, graphql_types_1.makeUpdateInputField)(type, this.modelDirectiveConfig.get(type.name.value), knownModels, ctx.inputDocument, isSyncEnabled);
const updateInputTypeName = updateInputField.name.value;
if (!ctx.output.getType(updateInputField.name.value)) {
ctx.output.addInput(updateInputField);
}
return [
(0, graphql_transformer_common_1.makeInputValueDefinition)('input', (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)(updateInputTypeName))),
(0, graphql_transformer_common_1.makeInputValueDefinition)('condition', (0, graphql_transformer_common_1.makeNamedType)(conditionInput.name.value)),
];
}
case graphql_transformer_interfaces_1.SubscriptionFieldType.ON_CREATE:
case graphql_transformer_interfaces_1.SubscriptionFieldType.ON_DELETE:
case graphql_transformer_interfaces_1.SubscriptionFieldType.ON_UPDATE: {
const filterInputName = (0, graphql_transformer_core_1.getSubscriptionFilterInputName)(type.name.value);
const filterInputs = (0, graphql_types_1.createEnumModelFilters)(ctx, type);
filterInputs.push((0, graphql_types_1.makeSubscriptionQueryFilterInput)(ctx, filterInputName, type));
filterInputs.forEach((input) => {
const conditionInputName = input.name.value;
if (!ctx.output.getType(conditionInputName)) {
ctx.output.addInput(input);
}
});
return [(0, graphql_transformer_common_1.makeInputValueDefinition)('filter', (0, graphql_transformer_common_1.makeNamedType)(filterInputName))];
}
default:
throw new Error('Unknown operation type');
}
};
this.getOutputType = (ctx, type, operation) => {
let outputType;
switch (operation.type) {
case graphql_transformer_interfaces_1.MutationFieldType.CREATE:
case graphql_transformer_interfaces_1.MutationFieldType.UPDATE:
case graphql_transformer_interfaces_1.MutationFieldType.DELETE:
case graphql_transformer_interfaces_1.QueryFieldType.GET:
case graphql_transformer_interfaces_1.SubscriptionFieldType.ON_CREATE:
case graphql_transformer_interfaces_1.SubscriptionFieldType.ON_DELETE:
case graphql_transformer_interfaces_1.SubscriptionFieldType.ON_UPDATE:
outputType = type;
break;
case graphql_transformer_interfaces_1.QueryFieldType.SYNC:
case graphql_transformer_interfaces_1.QueryFieldType.LIST: {
const isSyncEnabled = ctx.isProjectUsingDataStore();
const connectionFieldName = (0, graphql_transformer_core_1.getConnectionName)(type.name.value);
outputType = (0, graphql_types_1.makeListQueryModel)(type, connectionFieldName, isSyncEnabled);
break;
}
default:
throw new Error(`${operation.type} not supported for ${type.name.value}`);
}
if (!ctx.output.getObject(outputType.name.value)) {
ctx.output.addObject(outputType);
}
return outputType;
};
this.createIAMRole = (context, def, stack, tableName) => {
const ddbGenerator = this.resourceGeneratorMap.get(graphql_transformer_core_1.DDB_DB_TYPE);
return ddbGenerator.createIAMRole(context, def, stack, tableName);
};
this.createNonModelInputs = (ctx, obj) => {
var _a;
((_a = obj.fields) !== null && _a !== void 0 ? _a : []).forEach((field) => {
if (!(0, graphql_transformer_common_1.isScalar)(field.type)) {
const def = ctx.output.getType((0, graphql_transformer_common_1.getBaseType)(field.type));
if (def && def.kind === 'ObjectTypeDefinition' && !this.isModelField(def.name.value)) {
const name = this.getNonModelInputObjectName(def.name.value);
if (!ctx.output.getType(name)) {
const inputObj = graphql_transformer_core_1.InputObjectDefinitionWrapper.fromObject(name, def, ctx.inputDocument);
ctx.output.addInput(inputObj.serialize());
this.createNonModelInputs(ctx, def);
}
}
}
});
};
this.isModelField = (name) => !!this.typesWithModelDirective.has(name);
this.getNonModelInputObjectName = (name) => `${(0, graphql_transformer_common_1.toUpper)(name)}Input`;
this.addAutoGeneratableFields = (ctx, name) => {
var _a, _b;
const modelDirectiveConfig = this.modelDirectiveConfig.get(name);
const typeObj = ctx.output.getObject(name);
if (!typeObj) {
throw new Error(`Type ${name} is missing in outputs`);
}
const typeWrapper = new graphql_transformer_core_1.ObjectDefinitionWrapper(typeObj);
if (!typeWrapper.hasField('id')) {
const idField = graphql_transformer_core_1.FieldWrapper.create('id', 'ID');
typeWrapper.addField(idField);
}
const timestamps = [];
if (modelDirectiveConfig === null || modelDirectiveConfig === void 0 ? void 0 : modelDirectiveConfig.timestamps) {
if (modelDirectiveConfig.timestamps.createdAt !== null) {
timestamps.push((_a = modelDirectiveConfig.timestamps.createdAt) !== null && _a !== void 0 ? _a : 'createdAt');
}
if (modelDirectiveConfig.timestamps.updatedAt !== null) {
timestamps.push((_b = modelDirectiveConfig.timestamps.updatedAt) !== null && _b !== void 0 ? _b : 'updatedAt');
}
}
timestamps.forEach((fieldName) => {
if (typeWrapper.hasField(fieldName)) {
const field = typeWrapper.getField(fieldName);
if (!['String', 'AWSDateTime'].includes(field.getTypeName())) {
console.warn(`type ${name}.${fieldName} is not of String or AWSDateTime. Auto population is not supported`);
}
}
else {
const field = graphql_transformer_core_1.FieldWrapper.create(fieldName, 'AWSDateTime');
typeWrapper.addField(field);
}
});
ctx.output.updateObject(typeWrapper.serialize());
};
this.addModelSyncFields = (ctx, name) => {
const typeObj = ctx.output.getObject(name);
if (!typeObj) {
throw new Error(`Type ${name} is missing in outputs`);
}
const typeWrapper = new graphql_transformer_core_1.ObjectDefinitionWrapper(typeObj);
typeWrapper.addField(graphql_transformer_core_1.FieldWrapper.create('_version', 'Int'));
typeWrapper.addField(graphql_transformer_core_1.FieldWrapper.create('_deleted', 'Boolean', true));
typeWrapper.addField(graphql_transformer_core_1.FieldWrapper.create('_lastChangedAt', 'AWSTimestamp'));
ctx.output.updateObject(typeWrapper.serialize());
};
this.getSubscriptionToMutationsReverseMap = (def) => {
const subscriptionToMutationsMap = {};
const subscriptionFieldNames = this.getSubscriptionFieldNames(def);
subscriptionFieldNames.forEach((subscriptionFieldName) => {
if (!subscriptionToMutationsMap[subscriptionFieldName.fieldName]) {
subscriptionToMutationsMap[subscriptionFieldName.fieldName] = [];
}
subscriptionToMutationsMap[subscriptionFieldName.fieldName].push(subscriptionFieldName);
});
return subscriptionToMutationsMap;
};
this.ensureModelSortDirectionEnum = (ctx) => {
if (!ctx.output.hasType('ModelSortDirection')) {
const modelSortDirection = (0, graphql_types_1.makeModelSortDirectionEnumObject)();
ctx.output.addEnum(modelSortDirection);
}
};
this.getOptions = (options) => ({
EnableDeletionProtection: false,
...options,
});
this.getResourceGenerator = (ctx, typeName) => {
const strategy = (0, graphql_transformer_core_1.getModelDataSourceStrategy)(ctx, typeName);
let generator;
if ((0, graphql_transformer_core_1.isDefaultDynamoDbModelDataSourceStrategy)(strategy)) {
generator = this.resourceGeneratorMap.get(graphql_transformer_core_1.DDB_DB_TYPE);
}
else if ((0, graphql_transformer_core_1.isAmplifyDynamoDbModelDataSourceStrategy)(strategy)) {
generator = this.resourceGeneratorMap.get(ITERATIVE_TABLE_GENERATOR);
}
else if ((0, graphql_transformer_core_1.isSqlStrategy)(strategy)) {
generator = this.resourceGeneratorMap.get(SQL_LAMBDA_GENERATOR);
}
else if ((0, graphql_transformer_core_2.isImportedAmplifyDynamoDbModelDataSourceStrategy)(strategy)) {
generator = this.resourceGeneratorMap.get(ITERATIVE_TABLE_GENERATOR);
}
if (!generator) {
throw new Error(`No resource generator assigned for ${typeName} with dbType ${strategy.dbType}`);
}
return generator;
};
this.options = this.getOptions(options);
this.resourceGeneratorMap.set(graphql_transformer_core_1.DDB_DB_TYPE, new dynamo_model_resource_generator_1.DynamoModelResourceGenerator());
this.resourceGeneratorMap.set(SQL_LAMBDA_GENERATOR, new rds_model_resource_generator_1.RdsModelResourceGenerator());
const amplifyTableDynamoModelResourceGenerator = new amplify_dynamo_model_resource_generator_1.AmplifyDynamoModelResourceGenerator();
this.resourceGeneratorMap.set(ITERATIVE_TABLE_GENERATOR, amplifyTableDynamoModelResourceGenerator);
}
}
exports.ModelTransformer = ModelTransformer;
//# sourceMappingURL=graphql-model-transformer.js.map