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.
- package/dist/messages/sender.js +13 -7
- package/dist/plan/change-set.d.ts +1 -0
- package/dist/plan/change-set.js +10 -0
- package/dist/plan/plan.js +4 -0
- package/dist/resource/parsed-resource-settings.d.ts +1 -0
- package/dist/resource/parsed-resource-settings.js +3 -0
- package/dist/resource/resource-settings.d.ts +6 -1
- package/package.json +1 -1
- package/src/messages/sender.ts +16 -14
- package/src/plan/change-set.ts +12 -0
- package/src/plan/plan.ts +10 -0
- package/src/resource/parsed-resource-settings.ts +4 -0
- package/src/resource/resource-settings.ts +7 -1
package/dist/messages/sender.js
CHANGED
|
@@ -18,23 +18,29 @@ class CodifyCliSenderImpl {
|
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
20
|
async sendAndWaitForResponse(message) {
|
|
21
|
-
return new Promise((resolve
|
|
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
|
|
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
|
-
|
|
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
|
/**
|
package/dist/plan/change-set.js
CHANGED
|
@@ -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
|
|
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
package/src/messages/sender.ts
CHANGED
|
@@ -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
|
|
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
|
|
36
|
-
throw new Error(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
46
|
+
|
|
47
|
+
const ipcMessage = {
|
|
48
|
+
...message,
|
|
49
|
+
requestId,
|
|
50
|
+
}
|
|
51
|
+
process.send!(ipcMessage)
|
|
50
52
|
})
|
|
51
53
|
}
|
|
52
54
|
}
|
package/src/plan/change-set.ts
CHANGED
|
@@ -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
|
|
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
|