@@ -5,6 +5,7 @@ import { StatefulParameter } from './stateful-parameter.js';
55import { ResourceConfiguration , ValidationResult } from './resource-types.js' ;
66import { setsEqual , splitUserConfig } from '../utils/utils.js' ;
77import { ParameterConfiguration , PlanConfiguration } from './plan-types.js' ;
8+ import { TransformParameter } from './transform-parameter.js' ;
89
910/**
1011 * Description of resource here
@@ -17,6 +18,7 @@ export abstract class Resource<T extends StringIndexedObject> {
1718
1819 readonly typeId : string ;
1920 readonly statefulParameters : Map < keyof T , StatefulParameter < T , T [ keyof T ] > > ;
21+ readonly transformParameters : Map < keyof T , TransformParameter < T > >
2022 readonly dependencies : string [ ] ; // TODO: Change this to a string
2123 readonly parameterConfigurations : Record < keyof T , ParameterConfiguration >
2224 readonly configuration : ResourceConfiguration < T > ;
@@ -27,6 +29,7 @@ export abstract class Resource<T extends StringIndexedObject> {
2729
2830 this . typeId = configuration . type ;
2931 this . statefulParameters = new Map ( configuration . statefulParameters ?. map ( ( sp ) => [ sp . name , sp ] ) ) ;
32+ this . transformParameters = new Map ( Object . entries ( configuration . transformParameters ?? { } ) ) as Map < keyof T , TransformParameter < T > > ;
3033 this . parameterConfigurations = this . initializeParameterConfigurations ( configuration ) ;
3134 this . defaultValues = this . initializeDefaultValues ( configuration ) ;
3235
@@ -50,6 +53,7 @@ export abstract class Resource<T extends StringIndexedObject> {
5053 const { resourceMetadata, parameters : desiredParameters } = splitUserConfig ( desiredConfig ) ;
5154
5255 this . addDefaultValues ( desiredParameters ) ;
56+ await this . applyTransformParameters ( desiredParameters ) ;
5357
5458 const resourceParameters = Object . fromEntries ( [
5559 ...Object . entries ( desiredParameters ) . filter ( ( [ key ] ) => ! this . statefulParameters . has ( key ) ) ,
@@ -210,7 +214,6 @@ export abstract class Resource<T extends StringIndexedObject> {
210214 ...resourceParameters ,
211215 ...statefulParameters ,
212216 }
213-
214217 }
215218
216219 private initializeDefaultValues (
@@ -258,6 +261,25 @@ Additional: ${[...refreshKeys].filter(k => !desiredKeys.has(k))};`
258261 }
259262 }
260263
264+ private async applyTransformParameters ( desired : Partial < T > ) : Promise < void > {
265+ for ( const [ key , tp ] of this . transformParameters . entries ( ) ) {
266+ if ( desired [ key ] !== null ) {
267+ const transformedValue = await tp . transform ( desired [ key ] ) ;
268+
269+ if ( Object . keys ( transformedValue ) . some ( ( k ) => desired [ k ] !== undefined ) ) {
270+ throw new Error ( `Transform parameter ${ key as string } is attempting to override existing value ${ desired [ key ] } ` ) ;
271+ }
272+
273+ Object . entries ( transformedValue ) . forEach ( ( [ tvKey , tvValue ] ) => {
274+ // @ts -ignore
275+ desired [ tvKey ] = tvValue ;
276+ } )
277+
278+ delete desired [ key ] ;
279+ }
280+ }
281+ }
282+
261283 private addDefaultValues ( desired : Partial < T > ) : void {
262284 Object . entries ( this . defaultValues )
263285 . forEach ( ( [ key , defaultValue ] ) => {
0 commit comments