codify-plugin-lib 1.0.172 → 1.0.174

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.
@@ -18,23 +18,29 @@ class CodifyCliSenderImpl {
18
18
  });
19
19
  }
20
20
  async sendAndWaitForResponse(message) {
21
- return new Promise((resolve, reject) => {
21
+ return new Promise((resolve) => {
22
22
  const requestId = nanoid(8);
23
23
  const listener = (data) => {
24
24
  if (data.requestId === requestId) {
25
25
  process.removeListener('message', listener);
26
- if (!this.validateIpcMessageV2(data.data)) {
27
- throw new Error(`Invalid response for request:
28
-
29
- ${message}
30
-
26
+ if (!this.validateIpcMessageV2(data)) {
27
+ throw new Error(`Invalid response for request.
28
+ Request:
29
+ ${JSON.stringify(message, null, 2)}
30
+ Response:
31
+ ${JSON.stringify(data, null, 2)}
32
+ Error:
31
33
  ${JSON.stringify(this.validateIpcMessageV2.errors, null, 2)}`);
32
34
  }
33
35
  resolve(data);
34
36
  }
35
37
  };
36
38
  process.on('message', listener);
37
- process.send(message);
39
+ const ipcMessage = {
40
+ ...message,
41
+ requestId,
42
+ };
43
+ process.send(ipcMessage);
38
44
  });
39
45
  }
40
46
  }
@@ -29,6 +29,7 @@ export declare class ChangeSet<T extends StringIndexedObject> {
29
29
  get currentParameters(): T;
30
30
  static empty<T extends StringIndexedObject>(): ChangeSet<T>;
31
31
  static create<T extends StringIndexedObject>(desired: Partial<T>): ChangeSet<T>;
32
+ static noop<T extends StringIndexedObject>(parameters: Partial<T>): ChangeSet<T>;
32
33
  static destroy<T extends StringIndexedObject>(current: Partial<T>): ChangeSet<T>;
33
34
  static calculateModification<T extends StringIndexedObject>(desired: Partial<T>, current: Partial<T>, parameterSettings?: Partial<Record<keyof T, ParsedParameterSetting>>): ChangeSet<T>;
34
35
  /**
@@ -34,6 +34,16 @@ export class ChangeSet {
34
34
  }));
35
35
  return new ChangeSet(ResourceOperation.CREATE, parameterChanges);
36
36
  }
37
+ static noop(parameters) {
38
+ const parameterChanges = Object.entries(parameters)
39
+ .map(([k, v]) => ({
40
+ name: k,
41
+ operation: ParameterOperation.NOOP,
42
+ previousValue: v ?? null,
43
+ newValue: v ?? null,
44
+ }));
45
+ return new ChangeSet(ResourceOperation.NOOP, parameterChanges);
46
+ }
37
47
  static destroy(current) {
38
48
  const parameterChanges = Object.entries(current)
39
49
  .map(([k, v]) => ({
package/dist/plan/plan.js CHANGED
@@ -72,6 +72,10 @@ export class Plan {
72
72
  }
73
73
  // DESTROY
74
74
  if (filteredCurrentParameters && !desired) {
75
+ // We can manually override destroys. If a resource cannot be destroyed (for instance the npm resource relies on NodeJS being created and destroyed)
76
+ if (!settings.canDestroy) {
77
+ return new Plan(uuidV4(), ChangeSet.noop(filteredCurrentParameters), core, isStateful);
78
+ }
75
79
  return new Plan(uuidV4(), ChangeSet.destroy(filteredCurrentParameters), core, isStateful);
76
80
  }
77
81
  // NO-OP, MODIFY or RE-CREATE
@@ -29,6 +29,7 @@ export declare class ParsedResourceSettings<T extends StringIndexedObject> imple
29
29
  private settings;
30
30
  constructor(settings: ResourceSettings<T>);
31
31
  get typeId(): string;
32
+ get canDestroy(): boolean;
32
33
  get statefulParameters(): Map<keyof T, StatefulParameterController<T, T[keyof T]>>;
33
34
  get parameterSettings(): Record<keyof T, ParsedParameterSetting>;
34
35
  get defaultValues(): Partial<Record<keyof T, unknown>>;
@@ -22,6 +22,9 @@ export class ParsedResourceSettings {
22
22
  get typeId() {
23
23
  return this.id;
24
24
  }
25
+ get canDestroy() {
26
+ return !this.settings.importAndDestroy?.preventDestroy;
27
+ }
25
28
  get statefulParameters() {
26
29
  return this.getFromCacheOrCreate('statefulParameters', () => {
27
30
  const statefulParameters = Object.entries(this.settings.parameterSettings ?? {})
@@ -96,11 +96,16 @@ export interface ResourceSettings<T extends StringIndexedObject> {
96
96
  importAndDestroy?: {
97
97
  /**
98
98
  * Can this resources be imported? If set to false then the codifyCLI will skip over/not consider this
99
- * resource valid for imports. Defaults to true.
99
+ * resource valid for imports. Defaults to false.
100
100
  *
101
101
  * Resources that can't be imported in the core library for example are: action resources
102
102
  */
103
103
  preventImport?: boolean;
104
+ /**
105
+ * Can this resources be destroyed? If set to false then the codifyCLI will skip over/not consider this
106
+ * resource valid for destroys. Defaults to false.
107
+ */
108
+ preventDestroy?: boolean;
104
109
  /**
105
110
  * Customize the required parameters needed to import this resource. By default, the `requiredParameters` are taken
106
111
  * from the identifyingParameters for allowMultiple. The `requiredParameters` parameter must be declared if a complex required is declared in
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codify-plugin-lib",
3
- "version": "1.0.172",
3
+ "version": "1.0.174",
4
4
  "description": "Library plugin library",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -1,9 +1,5 @@
1
1
  import { Ajv } from 'ajv';
2
- import {
3
- IpcMessageV2,
4
- IpcMessageV2Schema,
5
- MessageCmd, PressKeyToContinueRequestData
6
- } from 'codify-schemas';
2
+ import { IpcMessageV2, IpcMessageV2Schema, MessageCmd, PressKeyToContinueRequestData } from 'codify-schemas';
7
3
  import { nanoid } from 'nanoid';
8
4
 
9
5
  const ajv = new Ajv({
@@ -26,18 +22,19 @@ class CodifyCliSenderImpl {
26
22
  }
27
23
 
28
24
  private async sendAndWaitForResponse(message: IpcMessageV2): Promise<IpcMessageV2> {
29
- return new Promise((resolve, reject) => {
25
+ return new Promise((resolve) => {
30
26
  const requestId = nanoid(8);
31
- const listener = (data: IpcMessageV2)=> {
27
+ const listener = (data: IpcMessageV2) => {
32
28
  if (data.requestId === requestId) {
33
29
  process.removeListener('message', listener);
34
30
 
35
- if (!this.validateIpcMessageV2(data.data)) {
36
- throw new Error(
37
- `Invalid response for request:
38
-
39
- ${message}
40
-
31
+ if (!this.validateIpcMessageV2(data)) {
32
+ throw new Error(`Invalid response for request.
33
+ Request:
34
+ ${JSON.stringify(message, null, 2)}
35
+ Response:
36
+ ${JSON.stringify(data, null, 2)}
37
+ Error:
41
38
  ${JSON.stringify(this.validateIpcMessageV2.errors, null, 2)}`);
42
39
  }
43
40
 
@@ -46,7 +43,12 @@ ${JSON.stringify(this.validateIpcMessageV2.errors, null, 2)}`);
46
43
  }
47
44
 
48
45
  process.on('message', listener);
49
- process.send!(message)
46
+
47
+ const ipcMessage = {
48
+ ...message,
49
+ requestId,
50
+ }
51
+ process.send!(ipcMessage)
50
52
  })
51
53
  }
52
54
  }
@@ -72,6 +72,18 @@ export class ChangeSet<T extends StringIndexedObject> {
72
72
  return new ChangeSet(ResourceOperation.CREATE, parameterChanges);
73
73
  }
74
74
 
75
+ static noop<T extends StringIndexedObject>(parameters: Partial<T>): ChangeSet<T> {
76
+ const parameterChanges = Object.entries(parameters)
77
+ .map(([k, v]) => ({
78
+ name: k,
79
+ operation: ParameterOperation.NOOP,
80
+ previousValue: v ?? null,
81
+ newValue: v ?? null,
82
+ }))
83
+
84
+ return new ChangeSet(ResourceOperation.NOOP, parameterChanges);
85
+ }
86
+
75
87
  static destroy<T extends StringIndexedObject>(current: Partial<T>): ChangeSet<T> {
76
88
  const parameterChanges = Object.entries(current)
77
89
  .map(([k, v]) => ({
package/src/plan/plan.ts CHANGED
@@ -126,6 +126,16 @@ export class Plan<T extends StringIndexedObject> {
126
126
 
127
127
  // DESTROY
128
128
  if (filteredCurrentParameters && !desired) {
129
+ // We can manually override destroys. If a resource cannot be destroyed (for instance the npm resource relies on NodeJS being created and destroyed)
130
+ if (!settings.canDestroy) {
131
+ return new Plan(
132
+ uuidV4(),
133
+ ChangeSet.noop(filteredCurrentParameters),
134
+ core,
135
+ isStateful,
136
+ )
137
+ }
138
+
129
139
  return new Plan(
130
140
  uuidV4(),
131
141
  ChangeSet.destroy(filteredCurrentParameters),
@@ -64,6 +64,10 @@ export class ParsedResourceSettings<T extends StringIndexedObject> implements Re
64
64
  return this.id;
65
65
  }
66
66
 
67
+ get canDestroy(): boolean {
68
+ return !this.settings.importAndDestroy?.preventDestroy;
69
+ }
70
+
67
71
  get statefulParameters(): Map<keyof T, StatefulParameterController<T, T[keyof T]>> {
68
72
  return this.getFromCacheOrCreate('statefulParameters', () => {
69
73
 
@@ -113,12 +113,18 @@ export interface ResourceSettings<T extends StringIndexedObject> {
113
113
  importAndDestroy?: {
114
114
  /**
115
115
  * Can this resources be imported? If set to false then the codifyCLI will skip over/not consider this
116
- * resource valid for imports. Defaults to true.
116
+ * resource valid for imports. Defaults to false.
117
117
  *
118
118
  * Resources that can't be imported in the core library for example are: action resources
119
119
  */
120
120
  preventImport?: boolean;
121
121
 
122
+ /**
123
+ * Can this resources be destroyed? If set to false then the codifyCLI will skip over/not consider this
124
+ * resource valid for destroys. Defaults to false.
125
+ */
126
+ preventDestroy?: boolean;
127
+
122
128
  /**
123
129
  * Customize the required parameters needed to import this resource. By default, the `requiredParameters` are taken
124
130
  * from the identifyingParameters for allowMultiple. The `requiredParameters` parameter must be declared if a complex required is declared in