graphql-transformer-core
Version:
A framework to transform from GraphQL SDL to AWS cloudFormation.
162 lines • 8.37 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransformFormatter = void 0;
const cloudform_types_1 = require("cloudform-types");
const graphql_transformer_common_1 = require("graphql-transformer-common");
const graphql_1 = require("graphql");
const stripDirectives_1 = require("./stripDirectives");
const SchemaResourceUtil_1 = require("./util/SchemaResourceUtil");
const splitStack_1 = __importDefault(require("./util/splitStack"));
class TransformFormatter {
constructor() {
this.schemaResourceUtil = new SchemaResourceUtil_1.SchemaResourceUtil();
}
format(ctx) {
ctx.mergeConditions(this.schemaResourceUtil.makeEnvironmentConditions());
const resolversFunctionsAndSchema = this.collectResolversFunctionsAndSchema(ctx);
const defaultDependencies = [graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLSchemaLogicalID];
if (ctx.getResource(graphql_transformer_common_1.ResourceConstants.RESOURCES.NoneDataSource)) {
defaultDependencies.push(graphql_transformer_common_1.ResourceConstants.RESOURCES.NoneDataSource);
}
const nestedStacks = (0, splitStack_1.default)({
stack: ctx.template,
stackRules: ctx.getStackMapping(),
defaultParameterValues: {
[graphql_transformer_common_1.ResourceConstants.PARAMETERS.AppSyncApiId]: cloudform_types_1.Fn.GetAtt(graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLAPILogicalID, 'ApiId'),
},
defaultParameterDefinitions: {
[graphql_transformer_common_1.ResourceConstants.PARAMETERS.AppSyncApiId]: new cloudform_types_1.StringParameter({
Description: `The id of the AppSync API associated with this project.`,
}),
},
deployment: {
deploymentBucketParameterName: graphql_transformer_common_1.ResourceConstants.PARAMETERS.S3DeploymentBucket,
deploymentKeyParameterName: graphql_transformer_common_1.ResourceConstants.PARAMETERS.S3DeploymentRootKey,
},
importExportPrefix: cloudform_types_1.Fn.Ref(graphql_transformer_common_1.ResourceConstants.PARAMETERS.AppSyncApiId),
defaultDependencies,
});
return {
...nestedStacks,
...resolversFunctionsAndSchema,
};
}
buildSchema(ctx) {
const mutationNode = ctx.getMutation();
const queryNode = ctx.getQuery();
const subscriptionNode = ctx.getSubscription();
let includeMutation = true;
let includeQuery = true;
let includeSubscription = true;
if (!mutationNode || mutationNode.fields.length === 0) {
delete ctx.nodeMap.Mutation;
includeMutation = false;
}
if (!queryNode || queryNode.fields.length === 0) {
delete ctx.nodeMap.Query;
includeQuery = false;
}
if (!subscriptionNode || subscriptionNode.fields.length === 0) {
delete ctx.nodeMap.Subscription;
includeSubscription = false;
}
const ops = [];
if (includeQuery) {
ops.push((0, graphql_transformer_common_1.makeOperationType)('query', queryNode.name.value));
}
if (includeMutation) {
ops.push((0, graphql_transformer_common_1.makeOperationType)('mutation', mutationNode.name.value));
}
if (includeSubscription) {
ops.push((0, graphql_transformer_common_1.makeOperationType)('subscription', subscriptionNode.name.value));
}
const schema = (0, graphql_transformer_common_1.makeSchema)(ops);
ctx.putSchema(schema);
const astSansDirectives = (0, stripDirectives_1.stripDirectives)({
kind: 'Document',
definitions: Object.keys(ctx.nodeMap).map((k) => ctx.getType(k)),
}, ['aws_subscribe', 'aws_auth', 'aws_api_key', 'aws_iam', 'aws_oidc', 'aws_cognito_user_pools', 'aws_lambda', 'deprecated']);
const SDL = (0, graphql_1.print)(astSansDirectives);
return SDL;
}
buildAndSetSchema(ctx) {
const SDL = this.buildSchema(ctx);
const schemaResource = this.schemaResourceUtil.makeAppSyncSchema();
ctx.setResource(graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLSchemaLogicalID, schemaResource);
return SDL;
}
collectResolversFunctionsAndSchema(ctx) {
const resolverParams = this.schemaResourceUtil.makeResolverS3RootParams();
ctx.mergeParameters(resolverParams.Parameters);
const templateResources = ctx.template.Resources;
let resolverMap = {};
let pipelineFunctionMap = {};
let functionsMap = {};
for (const resourceName of Object.keys(templateResources)) {
const resource = templateResources[resourceName];
if (resource.Type === 'AWS::AppSync::Resolver') {
const resourceResolverMap = this.replaceResolverRecord(resourceName, ctx);
resolverMap = { ...resolverMap, ...resourceResolverMap };
}
else if (resource.Type === 'AWS::AppSync::FunctionConfiguration') {
const functionConfigMap = this.replaceFunctionConfigurationRecord(resourceName, ctx);
pipelineFunctionMap = { ...pipelineFunctionMap, ...functionConfigMap };
}
else if (resource.Type === 'AWS::Lambda::Function') {
functionsMap = {
...functionsMap,
[`${resourceName}.zip`]: ctx.metadata.get(resourceName),
};
}
}
const schema = this.buildAndSetSchema(ctx);
return {
resolvers: resolverMap,
functions: functionsMap,
pipelineFunctions: pipelineFunctionMap,
schema,
userOverriddenSlots: [],
};
}
replaceResolverRecord(resourceName, ctx) {
const resolverResource = ctx.template.Resources[resourceName];
const requestMappingTemplate = resolverResource.Properties.RequestMappingTemplate;
const responseMappingTemplate = resolverResource.Properties.ResponseMappingTemplate;
if (typeof requestMappingTemplate === 'string' && typeof responseMappingTemplate === 'string') {
const reqType = resolverResource.Properties.TypeName;
const reqFieldName = resolverResource.Properties.FieldName;
const reqFileName = `${reqType}.${reqFieldName}.req.vtl`;
const respType = resolverResource.Properties.TypeName;
const respFieldName = resolverResource.Properties.FieldName;
const respFileName = `${respType}.${respFieldName}.res.vtl`;
const updatedResolverResource = this.schemaResourceUtil.updateResolverResource(resolverResource);
ctx.setResource(resourceName, updatedResolverResource);
return {
[reqFileName]: requestMappingTemplate,
[respFileName]: responseMappingTemplate,
};
}
return {};
}
replaceFunctionConfigurationRecord(resourceName, ctx) {
const functionConfiguration = ctx.template.Resources[resourceName];
const requestMappingTemplate = functionConfiguration.Properties.RequestMappingTemplate;
const responseMappingTemplate = functionConfiguration.Properties.ResponseMappingTemplate;
if (typeof requestMappingTemplate === 'string' && typeof responseMappingTemplate === 'string') {
const reqFileName = `${functionConfiguration.Properties.Name}.req.vtl`;
const respFileName = `${functionConfiguration.Properties.Name}.res.vtl`;
const updatedResolverResource = this.schemaResourceUtil.updateFunctionConfigurationResource(functionConfiguration);
ctx.setResource(resourceName, updatedResolverResource);
return {
[reqFileName]: requestMappingTemplate,
[respFileName]: responseMappingTemplate,
};
}
return {};
}
}
exports.TransformFormatter = TransformFormatter;
//# sourceMappingURL=TransformFormatter.js.map