codify-plugin-lib 1.0.104 → 1.0.106

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.
@@ -77,6 +77,6 @@ export class StatefulParameterController {
77
77
  }
78
78
  }
79
79
  calculateIsArrayStatefulParameter() {
80
- return Object.hasOwn(this.sp, 'addItem') && Object.hasOwn(this.sp, 'removeItem');
80
+ return 'addItem' in this.sp && 'removeItem' in this.sp;
81
81
  }
82
82
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codify-plugin-lib",
3
- "version": "1.0.104",
3
+ "version": "1.0.106",
4
4
  "description": "Library plugin library",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -2,12 +2,14 @@ import { Resource } from './resource.js';
2
2
  import { ResourceOperation } from 'codify-schemas';
3
3
  import { spy } from 'sinon';
4
4
  import { describe, expect, it } from 'vitest'
5
- import { ResourceSettings } from './resource-settings.js';
5
+ import { ArrayParameterSetting, ParameterSetting, ResourceSettings } from './resource-settings.js';
6
6
  import { CreatePlan, DestroyPlan, ModifyPlan } from '../plan/plan-types.js';
7
7
  import { ParameterChange } from '../plan/change-set.js';
8
8
  import { ResourceController } from './resource-controller.js';
9
9
  import { TestConfig, testPlan, TestResource, TestStatefulParameter } from '../utils/test-utils.test.js';
10
10
  import { untildify } from '../utils/utils.js';
11
+ import { ArrayStatefulParameter, StatefulParameter } from '../stateful-parameter/stateful-parameter.js';
12
+ import { Plan } from '../plan/plan.js';
11
13
 
12
14
  describe('Resource tests', () => {
13
15
 
@@ -391,4 +393,116 @@ describe('Resource tests', () => {
391
393
  }
392
394
  }
393
395
  })
396
+
397
+ it('Can use multiple stateful parameters (create)', async () => {
398
+ const parameter1 = new class extends StatefulParameter<any, any> {
399
+ getSettings(): ParameterSetting {
400
+ return {
401
+ type: 'version'
402
+ }
403
+ }
404
+ override async refresh(desired: any, config: Partial<any>): Promise<any> {
405
+ return null;
406
+ }
407
+ override async add(valueToAdd: any, plan: Plan<any>): Promise<void> {}
408
+ override async modify(newValue: any, previousValue: any, plan: Plan<any>): Promise<void> {}
409
+ override async remove(valueToRemove: any, plan: Plan<any>): Promise<void> {}
410
+ }
411
+
412
+ const parameter2 = new class extends ArrayStatefulParameter<any, any> {
413
+ override getSettings(): ArrayParameterSetting {
414
+ return {
415
+ type: 'array',
416
+ isElementEqual: (desired, current) => current.includes(desired),
417
+ }
418
+ }
419
+
420
+ override async refresh(desired: any[] | null, config: Partial<any>): Promise<any[] | null> {
421
+ return null;
422
+ }
423
+ override async addItem(item: any, plan: Plan<any>): Promise<void> {}
424
+ override async removeItem(item: any, plan: Plan<any>): Promise<void> {}
425
+ }
426
+
427
+ const p1Spy = spy(parameter1);
428
+ const p2Spy = spy(parameter2);
429
+
430
+ const resource = new class extends TestResource {
431
+ getSettings(): ResourceSettings<TestConfig> {
432
+ return {
433
+ id: 'nvm',
434
+ parameterSettings: {
435
+ global: { type: 'stateful', definition: parameter1, order: 2 },
436
+ nodeVersions: { type: 'stateful', definition: parameter2, order: 1 },
437
+ },
438
+ }
439
+ }
440
+
441
+ async refresh(parameters: Partial<TestConfig>): Promise<Partial<TestConfig> | null> {
442
+ return null;
443
+ }
444
+ }
445
+
446
+ const controller = new ResourceController(resource);
447
+ const plan = await controller.plan({ type: 'nvm', global: '20.12', nodeVersions: ['18', '20'] })
448
+
449
+ expect(plan).toMatchObject({
450
+ changeSet: {
451
+ operation: ResourceOperation.CREATE,
452
+ }
453
+ })
454
+
455
+ console.log(JSON.stringify(plan, null, 2))
456
+
457
+ await controller.apply(plan)
458
+
459
+ expect(p1Spy.add.calledOnce).to.be.true;
460
+ expect(p2Spy.addItem.calledTwice).to.be.true;
461
+ });
462
+
463
+ it('Can use multiple stateful parameters (modify)', async () => {
464
+ const parameter1 = spy(new class extends TestStatefulParameter {
465
+ async refresh(desired: string | null): Promise<string | null> {
466
+ return '16';
467
+ }
468
+ })
469
+
470
+ const parameter2 = spy(new class extends ArrayStatefulParameter<any, any> {
471
+ async refresh(desired: any[] | null, config: Partial<any>): Promise<any[] | null> {
472
+ return ['20']
473
+ }
474
+ async addItem(item: any, plan: Plan<any>): Promise<void> {}
475
+ async removeItem(item: any, plan: Plan<any>): Promise<void> {}
476
+ })
477
+
478
+ const resource = new class extends TestResource {
479
+ getSettings(): ResourceSettings<TestConfig> {
480
+ return {
481
+ id: 'nvm',
482
+ parameterSettings: {
483
+ global: { type: 'stateful', definition: parameter1, order: 2 },
484
+ nodeVersions: { type: 'stateful', definition: parameter2, order: 1 },
485
+ },
486
+ }
487
+ }
488
+
489
+ async refresh(parameters: Partial<TestConfig>): Promise<Partial<TestConfig> | null> {
490
+ return {};
491
+ }
492
+ }
493
+
494
+ const controller = new ResourceController(resource);
495
+ const plan = await controller.plan({ type: 'nvm', global: '20.12', nodeVersions: ['18', '20'] })
496
+
497
+ expect(plan).toMatchObject({
498
+ changeSet: {
499
+ operation: ResourceOperation.MODIFY,
500
+ }
501
+ })
502
+
503
+ await controller.apply(plan)
504
+
505
+ expect(parameter1.modify.calledOnce).to.be.true;
506
+ expect(parameter2.addItem.calledOnce).to.be.true;
507
+ });
394
508
  });
@@ -107,6 +107,6 @@ export class StatefulParameterController<T extends StringIndexedObject, V extend
107
107
  }
108
108
 
109
109
  private calculateIsArrayStatefulParameter() {
110
- return Object.hasOwn(this.sp, 'addItem') && Object.hasOwn(this.sp, 'removeItem');
110
+ return 'addItem' in this.sp && 'removeItem' in this.sp;
111
111
  }
112
112
  }