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.
- package/dist/entities/change-set.d.ts +1 -0
- package/dist/entities/change-set.js +12 -0
- package/dist/entities/plan-types.d.ts +1 -0
- package/dist/entities/resource.js +2 -2
- package/package.json +1 -1
- package/src/entities/change-set.ts +15 -0
- package/src/entities/plan-types.ts +2 -0
- package/src/entities/resource-parameters.test.ts +1 -1
- package/src/entities/resource.test.ts +48 -1
- package/src/entities/resource.ts +2 -2
|
@@ -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
|
|
157
|
+
for (const [key] of orderedEntries) {
|
|
158
158
|
if (desired[key] !== null) {
|
|
159
|
-
const transformedValue = await
|
|
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
|
@@ -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
|
}
|
|
@@ -27,7 +27,7 @@ class TestParameter extends StatefulParameter<TestConfig, string> {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
describe('Resource
|
|
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 () => {
|
package/src/entities/resource.ts
CHANGED
|
@@ -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
|
|
231
|
+
for (const [key] of orderedEntries) {
|
|
232
232
|
if (desired[key] !== null) {
|
|
233
|
-
const transformedValue = await
|
|
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]}`);
|