codify-plugin-lib 1.0.53 → 1.0.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,4 +20,5 @@ export declare class ChangeSet<T extends StringIndexedObject> {
20
20
  static isSame(desired: unknown, current: unknown, options?: ParameterOptions): boolean;
21
21
  private static calculateStatefulModeChangeSet;
22
22
  private static calculateStatelessModeChangeSet;
23
+ private static addDefaultValues;
23
24
  }
@@ -61,6 +61,7 @@ export class ChangeSet {
61
61
  const parameterChangeSet = new Array();
62
62
  const _desired = { ...desired };
63
63
  const _current = { ...current };
64
+ this.addDefaultValues(_desired, parameterOptions);
64
65
  for (const [k, v] of Object.entries(_current)) {
65
66
  if (_desired[k] == null) {
66
67
  parameterChangeSet.push({
@@ -109,6 +110,7 @@ export class ChangeSet {
109
110
  const parameterChangeSet = new Array();
110
111
  const _desired = { ...desired };
111
112
  const _current = { ...current };
113
+ this.addDefaultValues(_desired, parameterOptions);
112
114
  for (const [k, v] of Object.entries(_desired)) {
113
115
  if (_current[k] == null) {
114
116
  parameterChangeSet.push({
@@ -137,4 +139,14 @@ export class ChangeSet {
137
139
  }
138
140
  return parameterChangeSet;
139
141
  }
142
+ static addDefaultValues(obj, options) {
143
+ Object.entries(options ?? {})
144
+ .filter(([, option]) => option.default !== undefined)
145
+ .map(([name, option]) => [name, option.default])
146
+ .forEach(([key, defaultValue]) => {
147
+ if (obj[key] === undefined) {
148
+ obj[key] = defaultValue;
149
+ }
150
+ });
151
+ }
140
152
  }
@@ -3,6 +3,7 @@ export interface ParameterOptions {
3
3
  planOperation?: ResourceOperation.MODIFY | ResourceOperation.RECREATE;
4
4
  isEqual?: (desired: any, current: any) => boolean;
5
5
  isElementEqual?: (desired: any, current: any) => boolean;
6
+ default?: unknown;
6
7
  isStatefulParameter?: boolean;
7
8
  }
8
9
  export interface PlanOptions<T> {
@@ -154,9 +154,9 @@ Additional: ${[...refreshKeys].filter(k => !desiredKeys.has(k))};`);
154
154
  async applyTransformParameters(transformParameters, desired) {
155
155
  const orderedEntries = [...Object.entries(transformParameters)]
156
156
  .sort(([keyA], [keyB]) => this.transformParameterOrder.get(keyA) - this.transformParameterOrder.get(keyB));
157
- for (const [key, tp] of orderedEntries) {
157
+ for (const [key] of orderedEntries) {
158
158
  if (desired[key] !== null) {
159
- const transformedValue = await tp.transform(desired[key]);
159
+ const transformedValue = await this.transformParameters.get(key).transform(desired[key]);
160
160
  if (Object.keys(transformedValue).some((k) => desired[k] !== undefined)) {
161
161
  throw new Error(`Transform parameter ${key} is attempting to override existing value ${desired[key]}`);
162
162
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codify-plugin-lib",
3
- "version": "1.0.53",
3
+ "version": "1.0.55",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -126,6 +126,8 @@ export class ChangeSet<T extends StringIndexedObject> {
126
126
  const _desired = { ...desired };
127
127
  const _current = { ...current };
128
128
 
129
+ this.addDefaultValues(_desired, parameterOptions);
130
+
129
131
  for (const [k, v] of Object.entries(_current)) {
130
132
  if (_desired[k] == null) {
131
133
  parameterChangeSet.push({
@@ -191,6 +193,8 @@ export class ChangeSet<T extends StringIndexedObject> {
191
193
  const _desired = { ...desired };
192
194
  const _current = { ...current };
193
195
 
196
+ this.addDefaultValues(_desired, parameterOptions);
197
+
194
198
  for (const [k, v] of Object.entries(_desired)) {
195
199
  if (_current[k] == null) {
196
200
  parameterChangeSet.push({
@@ -224,5 +228,16 @@ export class ChangeSet<T extends StringIndexedObject> {
224
228
 
225
229
  return parameterChangeSet;
226
230
  }
231
+
232
+ private static addDefaultValues<T extends StringIndexedObject>(obj: Record<string, unknown>, options?: Record<keyof T, ParameterOptions>) {
233
+ Object.entries(options ?? {})
234
+ .filter(([, option]) => option.default !== undefined)
235
+ .map(([name, option]) => [name, option.default] as const)
236
+ .forEach(([key, defaultValue]) => {
237
+ if (obj[key] === undefined) {
238
+ obj[key] = defaultValue;
239
+ }
240
+ })
241
+ }
227
242
 
228
243
  }
@@ -17,6 +17,8 @@ export interface ParameterOptions {
17
17
 
18
18
  isElementEqual?: (desired: any, current: any) => boolean;
19
19
 
20
+ default?: unknown,
21
+
20
22
  isStatefulParameter?: boolean;
21
23
  }
22
24
 
@@ -27,7 +27,7 @@ class TestParameter extends StatefulParameter<TestConfig, string> {
27
27
  }
28
28
  }
29
29
 
30
- describe('Resource parameters tests', () => {
30
+ describe('Resource parameter tests', () => {
31
31
  it('supports the creation of stateful parameters', async () => {
32
32
 
33
33
  const statefulParameter = new class extends TestParameter {
@@ -26,7 +26,7 @@ export class TestResource extends Resource<TestConfig> {
26
26
  return Promise.resolve(undefined);
27
27
  }
28
28
 
29
- async refresh(): Promise<Partial<TestConfig> | null> {
29
+ async refresh(keys: Map<string, unknown>): Promise<Partial<TestConfig> | null> {
30
30
  return {
31
31
  propA: 'a',
32
32
  propB: 10,
@@ -316,7 +316,54 @@ describe('Resource tests', () => {
316
316
  expect(plan.currentConfig.propA).to.eq('propAAfter');
317
317
  expect(plan.desiredConfig.propA).to.eq('propADefault');
318
318
  expect(plan.changeSet.operation).to.eq(ResourceOperation.RECREATE);
319
+ })
320
+
321
+ it('Allows default values to be added to both desired and current', async () => {
322
+ const resource = new class extends TestResource {
323
+ constructor() {
324
+ super({
325
+ type: 'type',
326
+ parameterOptions: {
327
+ propE: { default: 'propEDefault' }
328
+ }
329
+ });
330
+ }
331
+
332
+ async refresh(keys: Map<string, unknown>): Promise<Partial<TestConfig> | null> {
333
+ expect(keys.has('propE')).to.be.true;
334
+
335
+ return {
336
+ propE: keys.get('propE'),
337
+ };
338
+ }
339
+ }
340
+
341
+ const plan = await resource.plan({ type: 'resource'})
342
+ expect(plan.currentConfig.propE).to.eq('propEDefault');
343
+ expect(plan.desiredConfig.propE).to.eq('propEDefault');
344
+ expect(plan.changeSet.operation).to.eq(ResourceOperation.NOOP);
345
+ })
319
346
 
347
+ it('Allows default values to be added even when refresh returns null', async () => {
348
+ const resource = new class extends TestResource {
349
+ constructor() {
350
+ super({
351
+ type: 'type',
352
+ parameterOptions: {
353
+ propE: { default: 'propEDefault' }
354
+ }
355
+ });
356
+ }
357
+
358
+ async refresh(): Promise<Partial<TestConfig> | null> {
359
+ return null;
360
+ }
361
+ }
362
+
363
+ const plan = await resource.plan({ type: 'resource'})
364
+ expect(plan.currentConfig.propE).to.eq(null);
365
+ expect(plan.desiredConfig.propE).to.eq('propEDefault');
366
+ expect(plan.changeSet.operation).to.eq(ResourceOperation.CREATE);
320
367
  })
321
368
 
322
369
  it('Allows default values to be added (ignore default value if already present)', async () => {
@@ -228,9 +228,9 @@ Additional: ${[...refreshKeys].filter(k => !desiredKeys.has(k))};`
228
228
  const orderedEntries = [...Object.entries(transformParameters)]
229
229
  .sort(([keyA], [keyB]) => this.transformParameterOrder.get(keyA)! - this.transformParameterOrder.get(keyB)!)
230
230
 
231
- for (const [key, tp] of orderedEntries) {
231
+ for (const [key] of orderedEntries) {
232
232
  if (desired[key] !== null) {
233
- const transformedValue = await tp.transform(desired[key]);
233
+ const transformedValue = await this.transformParameters.get(key)!.transform(desired[key]);
234
234
 
235
235
  if (Object.keys(transformedValue).some((k) => desired[k] !== undefined)) {
236
236
  throw new Error(`Transform parameter ${key as string} is attempting to override existing value ${desired[key]}`);