graphql-retain-transformer
Version:
Prevent losing production data by enabling the retain deletion policy for your AWS Amplify API!
38 lines • 1.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RetainTransformer = void 0;
const graphql_transformer_core_1 = require("@aws-amplify/graphql-transformer-core");
const graphql_transformer_common_1 = require("graphql-transformer-common");
const core_1 = require("@aws-cdk/core");
class RetainTransformer extends graphql_transformer_core_1.TransformerPluginBase {
constructor() {
super("RetainTransformer", "directive @retain on OBJECT");
this.retainObjects = new Map();
this.object = (definition, directive, acc) => {
this.validateObject(definition);
const tableName = graphql_transformer_common_1.ModelResourceIDs.ModelTableResourceID(definition.name.value);
this.retainObjects.set(definition, tableName);
};
this.generateResolvers = (context) => {
this.retainObjects.forEach((fieldName, directive) => {
const ddbTable = this.getTable(context, directive);
ddbTable["table"].cfnOptions.deletionPolicy =
core_1.CfnDeletionPolicy.RETAIN;
});
};
this.validateObject = (definition) => {
const modelDirective = (definition.directives || []).find((directive) => directive.name.value === "model");
if (!modelDirective) {
throw new graphql_transformer_core_1.InvalidDirectiveError("Types annotated with @retain must also be annotated with @model.");
}
};
this.getTable = (context, definition) => {
const ddbDataSource = context.dataSources.get(definition);
const tableName = graphql_transformer_common_1.ModelResourceIDs.ModelTableResourceID(definition.name.value);
const table = ddbDataSource.ds.stack.node.findChild(tableName);
return table;
};
}
}
exports.RetainTransformer = RetainTransformer;
//# sourceMappingURL=retain-transformer.js.map