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.
@@ -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>>): Promise<ChangeSet<T>>;
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,
@@ -45,8 +45,8 @@ export class ChangeSet {
45
45
  }));
46
46
  return new ChangeSet(ResourceOperation.DESTROY, parameterChanges);
47
47
  }
48
- static async calculateModification(desired, current, parameterSettings = {}) {
49
- const pc = await ChangeSet.calculateParameterChanges(desired, current, parameterSettings);
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 async calculateParameterChanges(desiredParameters, currentParameters, parameterOptions) {
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 (!await ChangeSet.isSame(desired[k], current[k], parameterOptions?.[k])) {
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 async isSame(desired, current, setting) {
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);
@@ -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
- }): Promise<Plan<T>>;
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 async calculate(params) {
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 = await ChangeSet.calculateModification(desiredParameters, filteredCurrentParameters, settings.parameterSettings);
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) => Promise<boolean> | boolean;
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) => Promise<boolean> | boolean;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codify-plugin-lib",
3
- "version": "1.0.79",
3
+ "version": "1.0.81",
4
4
  "description": "Library plugin library",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -85,12 +85,12 @@ export class ChangeSet<T extends StringIndexedObject> {
85
85
  return new ChangeSet(ResourceOperation.DESTROY, parameterChanges);
86
86
  }
87
87
 
88
- static async calculateModification<T extends StringIndexedObject>(
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
- ): Promise<ChangeSet<T>> {
93
- const pc = await ChangeSet.calculateParameterChanges(desired, current, parameterSettings);
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 async calculateParameterChanges<T extends StringIndexedObject>(
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
- ): Promise<ParameterChange<T>[]> {
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 (!await ChangeSet.isSame(desired[k], current[k], parameterOptions?.[k])) {
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 async isSame(
213
+ private static isSame(
214
214
  desired: unknown,
215
215
  current: unknown,
216
216
  setting?: ParameterSetting,
217
- ): Promise<boolean> {
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 async calculate<T extends StringIndexedObject>(params: {
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
- }): Promise<Plan<T>> {
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 = await ChangeSet.calculateModification(
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) => Promise<boolean> | boolean {
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) => Promise<boolean> | boolean;
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) => Promise<boolean> | boolean;
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
  })