codify-plugin-lib 1.0.45 → 1.0.47

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.
@@ -1,4 +1,5 @@
1
1
  import { Plan } from './plan.js';
2
+ import { splitUserConfig } from '../utils/utils.js';
2
3
  export class Plugin {
3
4
  resources;
4
5
  planStorage;
@@ -24,7 +25,8 @@ export class Plugin {
24
25
  if (!this.resources.has(config.type)) {
25
26
  throw new Error(`Resource type not found: ${config.type}`);
26
27
  }
27
- const validateResult = await this.resources.get(config.type).validate(config);
28
+ const { parameters } = splitUserConfig(config);
29
+ const validateResult = await this.resources.get(config.type).validate(parameters);
28
30
  validationResults.push({
29
31
  ...validateResult,
30
32
  resourceType: config.type,
@@ -19,8 +19,8 @@ export declare abstract class Resource<T extends StringIndexedObject> {
19
19
  private generateParameterConfigurations;
20
20
  private validateResourceConfiguration;
21
21
  private validateRefreshResults;
22
- abstract validate(config: unknown): Promise<ValidationResult>;
23
- abstract refresh(keys: Set<keyof T>): Promise<Partial<T> | null>;
22
+ abstract validate(parameters: unknown): Promise<ValidationResult>;
23
+ abstract refresh(keys: Map<keyof T, T[keyof T]>): Promise<Partial<T> | null>;
24
24
  abstract applyCreate(plan: Plan<T>): Promise<void>;
25
25
  applyModify(parameterName: keyof T, newValue: unknown, previousValue: unknown, allowDeletes: boolean, plan: Plan<T>): Promise<void>;
26
26
  abstract applyDestroy(plan: Plan<T>): Promise<void>;
@@ -27,15 +27,15 @@ export class Resource {
27
27
  ]);
28
28
  const statefulParameters = [...this.statefulParameters.values()]
29
29
  .filter((sp) => desiredParameters[sp.name] !== undefined);
30
- const keysToRefresh = new Set(Object.keys(resourceParameters));
31
- const currentParameters = await this.refresh(keysToRefresh);
30
+ const entriesToRefresh = new Map(Object.entries(resourceParameters));
31
+ const currentParameters = await this.refresh(entriesToRefresh);
32
32
  if (currentParameters == null) {
33
33
  return Plan.create(desiredParameters, null, resourceMetadata, planConfiguration);
34
34
  }
35
- this.validateRefreshResults(currentParameters, keysToRefresh);
35
+ this.validateRefreshResults(currentParameters, entriesToRefresh);
36
36
  for (const statefulParameter of statefulParameters) {
37
37
  const desiredValue = desiredParameters[statefulParameter.name];
38
- let currentValue = await statefulParameter.refresh() ?? undefined;
38
+ let currentValue = await statefulParameter.refresh(desiredValue ?? null) ?? undefined;
39
39
  if (Array.isArray(currentValue)
40
40
  && Array.isArray(desiredValue)
41
41
  && !planConfiguration.statefulMode
@@ -150,10 +150,11 @@ export class Resource {
150
150
  }
151
151
  }
152
152
  }
153
- validateRefreshResults(refresh, desiredKeys) {
153
+ validateRefreshResults(refresh, desiredMap) {
154
154
  if (!refresh) {
155
155
  return;
156
156
  }
157
+ const desiredKeys = new Set(desiredMap.keys());
157
158
  const refreshKeys = new Set(Object.keys(refresh));
158
159
  if (!setsEqual(desiredKeys, refreshKeys)) {
159
160
  throw new Error(`Resource ${this.configuration.type}
@@ -13,7 +13,7 @@ export declare abstract class StatefulParameter<T extends StringIndexedObject, V
13
13
  readonly name: keyof T;
14
14
  readonly configuration: StatefulParameterConfiguration<T>;
15
15
  protected constructor(configuration: StatefulParameterConfiguration<T>);
16
- abstract refresh(): Promise<V | null>;
16
+ abstract refresh(desired: V | null): Promise<V | null>;
17
17
  abstract applyAdd(valueToAdd: V, plan: Plan<T>): Promise<void>;
18
18
  abstract applyModify(newValue: V, previousValue: V, allowDeletes: boolean, plan: Plan<T>): Promise<void>;
19
19
  abstract applyRemove(valueToRemove: V, plan: Plan<T>): Promise<void>;
@@ -24,7 +24,7 @@ export declare abstract class ArrayStatefulParameter<T extends StringIndexedObje
24
24
  applyAdd(valuesToAdd: V[], plan: Plan<T>): Promise<void>;
25
25
  applyModify(newValues: V[], previousValues: V[], allowDeletes: boolean, plan: Plan<T>): Promise<void>;
26
26
  applyRemove(valuesToRemove: V[], plan: Plan<T>): Promise<void>;
27
- abstract refresh(): Promise<V[] | null>;
27
+ abstract refresh(desired: V[] | null): Promise<V[] | null>;
28
28
  abstract applyAddItem(item: V, plan: Plan<T>): Promise<void>;
29
29
  abstract applyRemoveItem(item: V, plan: Plan<T>): Promise<void>;
30
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codify-plugin-lib",
3
- "version": "1.0.45",
3
+ "version": "1.0.47",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -14,7 +14,7 @@
14
14
  "dependencies": {
15
15
  "ajv": "^8.12.0",
16
16
  "ajv-formats": "^2.1.1",
17
- "codify-schemas": "1.0.32",
17
+ "codify-schemas": "1.0.33",
18
18
  "@npmcli/promise-spawn": "^7.0.1"
19
19
  },
20
20
  "devDependencies": {
@@ -9,6 +9,7 @@ import {
9
9
  ValidateResponseData
10
10
  } from 'codify-schemas';
11
11
  import { Plan } from './plan.js';
12
+ import { splitUserConfig } from '../utils/utils.js';
12
13
 
13
14
  export class Plugin {
14
15
  planStorage: Map<string, Plan<ResourceConfig>>;
@@ -40,7 +41,8 @@ export class Plugin {
40
41
  throw new Error(`Resource type not found: ${config.type}`);
41
42
  }
42
43
 
43
- const validateResult = await this.resources.get(config.type)!.validate(config);
44
+ const { parameters } = splitUserConfig(config);
45
+ const validateResult = await this.resources.get(config.type)!.validate(parameters);
44
46
 
45
47
  validationResults.push({
46
48
  ...validateResult,
@@ -56,22 +56,22 @@ export abstract class Resource<T extends StringIndexedObject> {
56
56
 
57
57
  // Refresh resource parameters
58
58
  // This refreshes the parameters that configure the resource itself
59
- const keysToRefresh = new Set(Object.keys(resourceParameters));
60
- const currentParameters = await this.refresh(keysToRefresh);
59
+ const entriesToRefresh = new Map(Object.entries(resourceParameters));
60
+ const currentParameters = await this.refresh(entriesToRefresh);
61
61
 
62
62
  // Short circuit here. If resource is non-existent, then there's no point checking stateful parameters
63
63
  if (currentParameters == null) {
64
64
  return Plan.create(desiredParameters, null, resourceMetadata, planConfiguration);
65
65
  }
66
66
 
67
- this.validateRefreshResults(currentParameters, keysToRefresh);
67
+ this.validateRefreshResults(currentParameters, entriesToRefresh);
68
68
 
69
69
  // Refresh stateful parameters
70
70
  // This refreshes parameters that are stateful (they can be added, deleted separately from the resource)
71
71
  for(const statefulParameter of statefulParameters) {
72
72
  const desiredValue = desiredParameters[statefulParameter.name];
73
73
 
74
- let currentValue = await statefulParameter.refresh() ?? undefined;
74
+ let currentValue = await statefulParameter.refresh(desiredValue ?? null) ?? undefined;
75
75
 
76
76
  // In stateless mode, filter the refreshed parameters by the desired to ensure that no deletes happen
77
77
  if (Array.isArray(currentValue)
@@ -224,11 +224,12 @@ export abstract class Resource<T extends StringIndexedObject> {
224
224
 
225
225
  }
226
226
 
227
- private validateRefreshResults(refresh: Partial<T> | null, desiredKeys: Set<keyof T>) {
227
+ private validateRefreshResults(refresh: Partial<T> | null, desiredMap: Map<keyof T, T[keyof T]>) {
228
228
  if (!refresh) {
229
229
  return;
230
230
  }
231
231
 
232
+ const desiredKeys = new Set<keyof T>(desiredMap.keys());
232
233
  const refreshKeys = new Set(Object.keys(refresh)) as Set<keyof T>;
233
234
 
234
235
  if (!setsEqual(desiredKeys, refreshKeys)) {
@@ -241,9 +242,9 @@ Additional: ${[...refreshKeys].filter(k => !desiredKeys.has(k))};`
241
242
  }
242
243
  }
243
244
 
244
- abstract validate(config: unknown): Promise<ValidationResult>;
245
+ abstract validate(parameters: unknown): Promise<ValidationResult>;
245
246
 
246
- abstract refresh(keys: Set<keyof T>): Promise<Partial<T> | null>;
247
+ abstract refresh(keys: Map<keyof T, T[keyof T]>): Promise<Partial<T> | null>;
247
248
 
248
249
  abstract applyCreate(plan: Plan<T>): Promise<void>;
249
250
 
@@ -32,7 +32,7 @@ export abstract class StatefulParameter<T extends StringIndexedObject, V extends
32
32
  this.configuration = configuration
33
33
  }
34
34
 
35
- abstract refresh(): Promise<V | null>;
35
+ abstract refresh(desired: V | null): Promise<V | null>;
36
36
 
37
37
  // TODO: Add an additional parameter here for what has actually changed.
38
38
  abstract applyAdd(valueToAdd: V, plan: Plan<T>): Promise<void>;
@@ -88,7 +88,7 @@ export abstract class ArrayStatefulParameter<T extends StringIndexedObject, V> e
88
88
  }
89
89
  }
90
90
 
91
- abstract refresh(): Promise<V[] | null>;
91
+ abstract refresh(desired: V[] | null): Promise<V[] | null>;
92
92
  abstract applyAddItem(item: V, plan: Plan<T>): Promise<void>;
93
93
  abstract applyRemoveItem(item: V, plan: Plan<T>): Promise<void>;
94
94
  }