codify-plugin-lib 1.0.79 → 1.0.81
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/plan/change-set.d.ts +1 -1
- package/dist/plan/change-set.js +5 -9
- package/dist/plan/plan.d.ts +1 -1
- package/dist/plan/plan.js +2 -2
- package/dist/resource/resource-settings.d.ts +2 -2
- package/package.json +1 -1
- package/src/plan/change-set.ts +8 -14
- package/src/plan/plan.ts +3 -3
- package/src/resource/parsed-resource-settings.ts +1 -1
- package/src/resource/resource-settings.ts +2 -2
- package/src/resource/stateful-parameter.test.ts +20 -2
|
@@ -30,7 +30,7 @@ export declare class ChangeSet<T extends StringIndexedObject> {
|
|
|
30
30
|
static empty<T extends StringIndexedObject>(): ChangeSet<T>;
|
|
31
31
|
static create<T extends StringIndexedObject>(desired: Partial<T>): ChangeSet<T>;
|
|
32
32
|
static destroy<T extends StringIndexedObject>(current: Partial<T>): ChangeSet<T>;
|
|
33
|
-
static calculateModification<T extends StringIndexedObject>(desired: Partial<T>, current: Partial<T>, parameterSettings?: Partial<Record<keyof T, ParameterSetting>>):
|
|
33
|
+
static calculateModification<T extends StringIndexedObject>(desired: Partial<T>, current: Partial<T>, parameterSettings?: Partial<Record<keyof T, ParameterSetting>>): ChangeSet<T>;
|
|
34
34
|
/**
|
|
35
35
|
* Calculates the differences between the desired and current parameters,
|
|
36
36
|
* and returns a list of parameter changes that describe what needs to be added,
|
package/dist/plan/change-set.js
CHANGED
|
@@ -45,8 +45,8 @@ export class ChangeSet {
|
|
|
45
45
|
}));
|
|
46
46
|
return new ChangeSet(ResourceOperation.DESTROY, parameterChanges);
|
|
47
47
|
}
|
|
48
|
-
static
|
|
49
|
-
const pc =
|
|
48
|
+
static calculateModification(desired, current, parameterSettings = {}) {
|
|
49
|
+
const pc = ChangeSet.calculateParameterChanges(desired, current, parameterSettings);
|
|
50
50
|
const statefulParameterKeys = new Set(Object.entries(parameterSettings)
|
|
51
51
|
.filter(([, v]) => v?.type === 'stateful')
|
|
52
52
|
.map(([k]) => k));
|
|
@@ -77,7 +77,7 @@ export class ChangeSet {
|
|
|
77
77
|
* @param {Partial<Record<keyof T, ParameterSetting>>} [parameterOptions] - Optional settings used when comparing parameters.
|
|
78
78
|
* @return {ParameterChange<T>[]} A list of changes required to transition from the current state to the desired state.
|
|
79
79
|
*/
|
|
80
|
-
static
|
|
80
|
+
static calculateParameterChanges(desiredParameters, currentParameters, parameterOptions) {
|
|
81
81
|
const parameterChangeSet = new Array();
|
|
82
82
|
// Filter out null and undefined values or else the diff below will not work
|
|
83
83
|
const desired = Object.fromEntries(Object.entries(desiredParameters).filter(([, v]) => v !== null && v !== undefined));
|
|
@@ -93,7 +93,7 @@ export class ChangeSet {
|
|
|
93
93
|
delete current[k];
|
|
94
94
|
continue;
|
|
95
95
|
}
|
|
96
|
-
if (!
|
|
96
|
+
if (!ChangeSet.isSame(desired[k], current[k], parameterOptions?.[k])) {
|
|
97
97
|
parameterChangeSet.push({
|
|
98
98
|
name: k,
|
|
99
99
|
previousValue: v ?? null,
|
|
@@ -138,12 +138,8 @@ export class ChangeSet {
|
|
|
138
138
|
const indexNext = orderOfOperations.indexOf(next);
|
|
139
139
|
return orderOfOperations[Math.max(indexPrev, indexNext)];
|
|
140
140
|
}
|
|
141
|
-
static
|
|
141
|
+
static isSame(desired, current, setting) {
|
|
142
142
|
switch (setting?.type) {
|
|
143
|
-
case 'stateful': {
|
|
144
|
-
const statefulSetting = setting.definition.getSettings();
|
|
145
|
-
return ChangeSet.isSame(desired, current, statefulSetting);
|
|
146
|
-
}
|
|
147
143
|
case 'array': {
|
|
148
144
|
const arrayParameter = setting;
|
|
149
145
|
return areArraysEqual(arrayParameter, desired, current);
|
package/dist/plan/plan.d.ts
CHANGED
|
@@ -41,7 +41,7 @@ export declare class Plan<T extends StringIndexedObject> {
|
|
|
41
41
|
coreParameters: ResourceConfig;
|
|
42
42
|
settings: ParsedResourceSettings<T>;
|
|
43
43
|
statefulMode: boolean;
|
|
44
|
-
}):
|
|
44
|
+
}): Plan<T>;
|
|
45
45
|
/**
|
|
46
46
|
* Only keep relevant params for the plan. We don't want to change settings that were not already
|
|
47
47
|
* defined.
|
package/dist/plan/plan.js
CHANGED
|
@@ -70,7 +70,7 @@ export class Plan {
|
|
|
70
70
|
getResourceType() {
|
|
71
71
|
return this.coreParameters.type;
|
|
72
72
|
}
|
|
73
|
-
static
|
|
73
|
+
static calculate(params) {
|
|
74
74
|
const { desiredParameters, currentParametersArray, stateParameters, coreParameters, settings, statefulMode } = params;
|
|
75
75
|
const currentParameters = Plan.matchCurrentParameters({
|
|
76
76
|
desiredParameters,
|
|
@@ -99,7 +99,7 @@ export class Plan {
|
|
|
99
99
|
return new Plan(uuidV4(), ChangeSet.destroy(filteredCurrentParameters), coreParameters);
|
|
100
100
|
}
|
|
101
101
|
// NO-OP, MODIFY or RE-CREATE
|
|
102
|
-
const changeSet =
|
|
102
|
+
const changeSet = ChangeSet.calculateModification(desiredParameters, filteredCurrentParameters, settings.parameterSettings);
|
|
103
103
|
return new Plan(uuidV4(), changeSet, coreParameters);
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
@@ -97,7 +97,7 @@ export interface DefaultParameterSetting {
|
|
|
97
97
|
*
|
|
98
98
|
* @return Return true if equal
|
|
99
99
|
*/
|
|
100
|
-
isEqual?: (desired: any, current: any) =>
|
|
100
|
+
isEqual?: (desired: any, current: any) => boolean;
|
|
101
101
|
/**
|
|
102
102
|
* Chose if the resource can be modified instead of re-created when there is a change to this parameter.
|
|
103
103
|
* Defaults to false (re-create).
|
|
@@ -123,7 +123,7 @@ export interface ArrayParameterSetting extends DefaultParameterSetting {
|
|
|
123
123
|
*
|
|
124
124
|
* @return Return true if desired is equivalent to current.
|
|
125
125
|
*/
|
|
126
|
-
isElementEqual?: (desired: any, current: any) =>
|
|
126
|
+
isElementEqual?: (desired: any, current: any) => boolean;
|
|
127
127
|
}
|
|
128
128
|
/**
|
|
129
129
|
* Stateful parameter type specific settings. A stateful parameter is a sub-resource that can hold its own
|
package/package.json
CHANGED
package/src/plan/change-set.ts
CHANGED
|
@@ -85,12 +85,12 @@ export class ChangeSet<T extends StringIndexedObject> {
|
|
|
85
85
|
return new ChangeSet(ResourceOperation.DESTROY, parameterChanges);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
static
|
|
88
|
+
static calculateModification<T extends StringIndexedObject>(
|
|
89
89
|
desired: Partial<T>,
|
|
90
90
|
current: Partial<T>,
|
|
91
91
|
parameterSettings: Partial<Record<keyof T, ParameterSetting>> = {},
|
|
92
|
-
):
|
|
93
|
-
const pc =
|
|
92
|
+
): ChangeSet<T> {
|
|
93
|
+
const pc = ChangeSet.calculateParameterChanges(desired, current, parameterSettings);
|
|
94
94
|
|
|
95
95
|
const statefulParameterKeys = new Set(
|
|
96
96
|
Object.entries(parameterSettings)
|
|
@@ -126,11 +126,11 @@ export class ChangeSet<T extends StringIndexedObject> {
|
|
|
126
126
|
* @param {Partial<Record<keyof T, ParameterSetting>>} [parameterOptions] - Optional settings used when comparing parameters.
|
|
127
127
|
* @return {ParameterChange<T>[]} A list of changes required to transition from the current state to the desired state.
|
|
128
128
|
*/
|
|
129
|
-
private static
|
|
129
|
+
private static calculateParameterChanges<T extends StringIndexedObject>(
|
|
130
130
|
desiredParameters: Partial<T>,
|
|
131
131
|
currentParameters: Partial<T>,
|
|
132
132
|
parameterOptions?: Partial<Record<keyof T, ParameterSetting>>,
|
|
133
|
-
):
|
|
133
|
+
): ParameterChange<T>[] {
|
|
134
134
|
const parameterChangeSet = new Array<ParameterChange<T>>();
|
|
135
135
|
|
|
136
136
|
// Filter out null and undefined values or else the diff below will not work
|
|
@@ -155,7 +155,7 @@ export class ChangeSet<T extends StringIndexedObject> {
|
|
|
155
155
|
continue;
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
if (!
|
|
158
|
+
if (!ChangeSet.isSame(desired[k], current[k], parameterOptions?.[k])) {
|
|
159
159
|
parameterChangeSet.push({
|
|
160
160
|
name: k,
|
|
161
161
|
previousValue: v ?? null,
|
|
@@ -210,18 +210,12 @@ export class ChangeSet<T extends StringIndexedObject> {
|
|
|
210
210
|
return orderOfOperations[Math.max(indexPrev, indexNext)];
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
private static
|
|
213
|
+
private static isSame(
|
|
214
214
|
desired: unknown,
|
|
215
215
|
current: unknown,
|
|
216
216
|
setting?: ParameterSetting,
|
|
217
|
-
):
|
|
217
|
+
): boolean {
|
|
218
218
|
switch (setting?.type) {
|
|
219
|
-
case 'stateful': {
|
|
220
|
-
const statefulSetting = (setting as StatefulParameterSetting).definition.getSettings()
|
|
221
|
-
|
|
222
|
-
return ChangeSet.isSame(desired, current, statefulSetting as ParameterSetting);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
219
|
case 'array': {
|
|
226
220
|
const arrayParameter = setting as ArrayParameterSetting;
|
|
227
221
|
return areArraysEqual(arrayParameter, desired, current)
|
package/src/plan/plan.ts
CHANGED
|
@@ -105,14 +105,14 @@ export class Plan<T extends StringIndexedObject> {
|
|
|
105
105
|
return this.coreParameters.type
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
static
|
|
108
|
+
static calculate<T extends StringIndexedObject>(params: {
|
|
109
109
|
desiredParameters: Partial<T> | null,
|
|
110
110
|
currentParametersArray: Partial<T>[] | null,
|
|
111
111
|
stateParameters: Partial<T> | null,
|
|
112
112
|
coreParameters: ResourceConfig,
|
|
113
113
|
settings: ParsedResourceSettings<T>,
|
|
114
114
|
statefulMode: boolean,
|
|
115
|
-
}):
|
|
115
|
+
}): Plan<T> {
|
|
116
116
|
const {
|
|
117
117
|
desiredParameters,
|
|
118
118
|
currentParametersArray,
|
|
@@ -166,7 +166,7 @@ export class Plan<T extends StringIndexedObject> {
|
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
// NO-OP, MODIFY or RE-CREATE
|
|
169
|
-
const changeSet =
|
|
169
|
+
const changeSet = ChangeSet.calculateModification(
|
|
170
170
|
desiredParameters!,
|
|
171
171
|
filteredCurrentParameters!,
|
|
172
172
|
settings.parameterSettings,
|
|
@@ -154,7 +154,7 @@ export class ParsedResourceSettings<T extends StringIndexedObject> implements Re
|
|
|
154
154
|
// The rest of the types have defaults set already
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
private resolveEqualsFn(parameter: ParameterSetting, key: string): (desired: unknown, current: unknown) =>
|
|
157
|
+
private resolveEqualsFn(parameter: ParameterSetting, key: string): (desired: unknown, current: unknown) => boolean {
|
|
158
158
|
if (parameter.type === 'array') {
|
|
159
159
|
return parameter.isEqual ?? areArraysEqual.bind(areArraysEqual, parameter as ArrayParameterSetting)
|
|
160
160
|
}
|
|
@@ -127,7 +127,7 @@ export interface DefaultParameterSetting {
|
|
|
127
127
|
*
|
|
128
128
|
* @return Return true if equal
|
|
129
129
|
*/
|
|
130
|
-
isEqual?: (desired: any, current: any) =>
|
|
130
|
+
isEqual?: (desired: any, current: any) => boolean;
|
|
131
131
|
|
|
132
132
|
/**
|
|
133
133
|
* Chose if the resource can be modified instead of re-created when there is a change to this parameter.
|
|
@@ -156,7 +156,7 @@ export interface ArrayParameterSetting extends DefaultParameterSetting {
|
|
|
156
156
|
*
|
|
157
157
|
* @return Return true if desired is equivalent to current.
|
|
158
158
|
*/
|
|
159
|
-
isElementEqual?: (desired: any, current: any) =>
|
|
159
|
+
isElementEqual?: (desired: any, current: any) => boolean
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import { spy } from 'sinon';
|
|
3
3
|
import { ParameterOperation, ResourceOperation } from 'codify-schemas';
|
|
4
|
-
import { TestArrayStatefulParameter, TestConfig, testPlan } from '../utils/test-utils.test.js';
|
|
5
|
-
import { ArrayParameterSetting } from './resource-settings.js';
|
|
4
|
+
import { TestArrayStatefulParameter, TestConfig, testPlan, TestStatefulParameter } from '../utils/test-utils.test.js';
|
|
5
|
+
import { ArrayParameterSetting, ParameterSetting } from './resource-settings.js';
|
|
6
6
|
|
|
7
7
|
describe('Stateful parameter tests', () => {
|
|
8
8
|
it('addItem is called the correct number of times', async () => {
|
|
@@ -90,4 +90,22 @@ describe('Stateful parameter tests', () => {
|
|
|
90
90
|
expect(testParameter.addItem.calledOnce).to.be.true;
|
|
91
91
|
expect(testParameter.removeItem.called).to.be.false;
|
|
92
92
|
})
|
|
93
|
+
|
|
94
|
+
it('isEqual works with type defaults', () => {
|
|
95
|
+
const testParameter = spy(new class extends TestStatefulParameter {
|
|
96
|
+
getSettings(): ParameterSetting {
|
|
97
|
+
return {
|
|
98
|
+
type: 'version',
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const plan = testPlan<TestConfig>({
|
|
104
|
+
desired: { propZ: '20' },
|
|
105
|
+
current: [{ propZ: '20.17.0' }],
|
|
106
|
+
settings: { id: 'type', parameterSettings: { propZ: { type: 'stateful', definition: testParameter } } }
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
expect(plan.changeSet.operation).to.eq(ResourceOperation.NOOP);
|
|
110
|
+
})
|
|
93
111
|
})
|