in packages/@aws-cdk/custom-resource-handlers/lib/custom-resources-framework/classes.ts [250:348]
public constructor() {
super(scope, {
name: props.name,
extends: CORE_MODULE.CustomResourceProviderBase,
export: true,
});
if (scope.isCoreInternal) {
scope.registerImport(CORE_MODULE, {
targets: [CORE_MODULE.Stack],
fromLocation: CORE_INTERNAL_STACK_IMPORT_PATH,
});
scope.registerImport(CORE_MODULE, {
targets: [
CORE_MODULE.CustomResourceProviderBase,
CORE_MODULE.CustomResourceProviderOptions,
],
fromLocation: CORE_INTERNAL_CUSTOM_RESOURCE_PROVIDER_IMPORT_PATH,
});
} else {
scope.registerImport(CORE_MODULE, {
targets: [
CORE_MODULE.Stack,
CORE_MODULE.CustomResourceProviderBase,
CORE_MODULE.CustomResourceProviderOptions,
],
});
}
const getOrCreateMethod = this.addMethod({
name: 'getOrCreate',
static: true,
returnType: Type.STRING,
docs: {
summary: 'Returns a stack-level singleton ARN (service token) for the custom resource provider.',
},
});
getOrCreateMethod.addParameter({
name: 'scope',
type: CONSTRUCTS_MODULE.Construct,
});
getOrCreateMethod.addParameter({
name: 'uniqueid',
type: Type.STRING,
});
getOrCreateMethod.addParameter({
name: 'props',
type: CORE_MODULE.CustomResourceProviderOptions,
optional: true,
});
getOrCreateMethod.addBody(
stmt.ret(expr.directCode('this.getOrCreateProvider(scope, uniqueid, props).serviceToken')),
);
const getOrCreateProviderMethod = this.addMethod({
name: 'getOrCreateProvider',
static: true,
returnType: this.type,
docs: {
summary: 'Returns a stack-level singleton for the custom resource provider.',
},
});
const _scope = getOrCreateProviderMethod.addParameter({
name: 'scope',
type: CONSTRUCTS_MODULE.Construct,
});
getOrCreateProviderMethod.addParameter({
name: 'uniqueid',
type: Type.STRING,
});
getOrCreateProviderMethod.addParameter({
name: 'props',
type: CORE_MODULE.CustomResourceProviderOptions,
optional: true,
});
getOrCreateProviderMethod.addBody(
stmt.constVar(expr.ident('id'), expr.directCode('`${uniqueid}CustomResourceProvider`')),
stmt.constVar(expr.ident('stack'), $T(CORE_MODULE.Stack).of(expr.directCode(_scope.spec.name))),
stmt.constVar(expr.ident('existing'), expr.directCode(`stack.node.tryFindChild(id) as ${this.type}`)),
stmt.ret(expr.directCode(`existing ?? new ${this.name}(stack, id, props)`)),
);
const superProps = new ObjectLiteral([
new Splat(expr.ident('props')),
['codeDirectory', PATH_MODULE.join.call(expr.directCode(`__dirname, '${props.codeDirectory}'`))],
['runtimeName', this.buildRuntimeProperty(scope, {
runtime: props.runtime,
isCustomResourceProvider: true,
})],
]);
const metadataStatements: Statement[] = [expr.directCode(`this.node.addMetadata('${CUSTOM_RESOURCE_PROVIDER}', true)`)];
this.buildConstructor({
constructorPropsType: CORE_MODULE.CustomResourceProviderOptions,
superProps,
constructorVisbility: MemberVisibility.Private,
optionalConstructorProps: true,
statements: metadataStatements,
});
}