@trayio/cdk-build 5.33.0 → 5.35.0-unstable.fd7158a
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/connector/ConnectorBuilder.d.ts +4 -4
- package/dist/connector/ConnectorBuilder.d.ts.map +1 -1
- package/dist/connector/ConnectorBuilder.js +67 -54
- package/dist/connector/operation/ConnectorOperationSchemaGenerator.d.ts +2 -2
- package/dist/connector/operation/ConnectorOperationSchemaGenerator.d.ts.map +1 -1
- package/dist/connector/operation/ConnectorOperationSchemaGenerator.js +32 -14
- package/dist/connector/test.js +3 -26
- package/package.json +4 -4
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
2
|
export declare class ConnectorBuilder {
|
|
3
3
|
private operationSchemaGenerator;
|
|
4
|
-
buildConnector(cdkProjectPath: string):
|
|
5
|
-
generateSchemas(cdkProjectPath: string):
|
|
6
|
-
getOperations(cdkProjectPath: string):
|
|
4
|
+
buildConnector(cdkProjectPath: string): Effect.Effect<undefined, Error>;
|
|
5
|
+
generateSchemas(cdkProjectPath: string): Effect.Effect<undefined, Error>;
|
|
6
|
+
getOperations(cdkProjectPath: string): Effect.Effect<string[], Error>;
|
|
7
7
|
private generatePackage;
|
|
8
8
|
private injectRawHttpOperation;
|
|
9
9
|
private injectGlobalConfigToCdkProjectPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectorBuilder.d.ts","sourceRoot":"","sources":["../../src/connector/ConnectorBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ConnectorBuilder.d.ts","sourceRoot":"","sources":["../../src/connector/ConnectorBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAW9C,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,wBAAwB,CAA2C;IAE3E,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;IAQvE,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;IAgBxE,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;IAwBrE,OAAO,CAAC,eAAe;IAqFvB,OAAO,CAAC,sBAAsB;IAuC9B,OAAO,CAAC,kCAAkC;IAkB1C,OAAO,CAAC,gBAAgB;IAexB;;;OAGG;IACH,OAAO,CAAC,+BAA+B;CAqDvC"}
|
|
@@ -15,24 +15,31 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
28
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
39
|
exports.ConnectorBuilder = void 0;
|
|
30
|
-
const
|
|
31
|
-
const function_1 = require("fp-ts/function");
|
|
32
|
-
const Array_1 = require("fp-ts/Array");
|
|
40
|
+
const effect_1 = require("effect");
|
|
33
41
|
const pathLib = __importStar(require("path"));
|
|
34
42
|
const fse = __importStar(require("fs-extra"));
|
|
35
|
-
const E = __importStar(require("fp-ts/Either"));
|
|
36
43
|
const adm_zip_1 = __importDefault(require("adm-zip"));
|
|
37
44
|
const lodash_1 = require("lodash");
|
|
38
45
|
const ZodSchemaParser_1 = require("@trayio/commons/zod/ZodSchemaParser");
|
|
@@ -42,17 +49,17 @@ const ConnectorJson_1 = require("./schemas/ConnectorJson");
|
|
|
42
49
|
class ConnectorBuilder {
|
|
43
50
|
operationSchemaGenerator = new ConnectorOperationSchemaGenerator_1.ConnectorOperationSchemaGenerator();
|
|
44
51
|
buildConnector(cdkProjectPath) {
|
|
45
|
-
return (0,
|
|
52
|
+
return (0, effect_1.pipe)(this.validateDynamicOutputOperations(cdkProjectPath), effect_1.Effect.flatMap(() => this.generateSchemas(cdkProjectPath)), effect_1.Effect.flatMap(() => this.generatePackage(cdkProjectPath)));
|
|
46
53
|
}
|
|
47
54
|
generateSchemas(cdkProjectPath) {
|
|
48
|
-
return (0,
|
|
55
|
+
return (0, effect_1.pipe)(this.getOperations(cdkProjectPath), effect_1.Effect.flatMap((operations) => effect_1.Effect.forEach((operation) => {
|
|
49
56
|
const operationPath = pathLib.join(cdkProjectPath, 'src', operation);
|
|
50
57
|
return this.operationSchemaGenerator.generateSchemasForOperation(operationPath, operation);
|
|
51
|
-
})(operations)),
|
|
58
|
+
})(operations)), effect_1.Effect.map(() => undefined));
|
|
52
59
|
}
|
|
53
60
|
getOperations(cdkProjectPath) {
|
|
54
61
|
const fileStorage = new NodeFsFileStorage_1.NodeFsFileStorage(cdkProjectPath);
|
|
55
|
-
return (0,
|
|
62
|
+
return (0, effect_1.pipe)(fileStorage.readDirectory('src'), effect_1.Effect.map((filePaths) => filePaths
|
|
56
63
|
.filter((filePath) => filePath.isDirectory() &&
|
|
57
64
|
fse.existsSync(pathLib.join(`${cdkProjectPath}/src`, filePath.name, 'operation.json')))
|
|
58
65
|
.map((srcEntry) => srcEntry.name)));
|
|
@@ -66,29 +73,32 @@ class ConnectorBuilder {
|
|
|
66
73
|
const connectorJsonWithRawHttpConfig = this.addRawHttpConfig(connectorJson);
|
|
67
74
|
fse.writeJsonSync(connectorJsonPath, connectorJsonWithRawHttpConfig);
|
|
68
75
|
const connectorJsonResult = connectorJsonParser.parse(connectorJsonWithRawHttpConfig);
|
|
69
|
-
return (0,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// exclude all the ctx.json files from the zip as it can contain sensitive information
|
|
81
|
-
for (const entry of entries) {
|
|
82
|
-
if (entry.entryName.endsWith('.ctx.json')) {
|
|
83
|
-
connectorPackage.deleteFile(entry.entryName);
|
|
76
|
+
return (0, effect_1.pipe)(connectorJsonResult, effect_1.Either.match({
|
|
77
|
+
onLeft: (error) => effect_1.Effect.fail(error),
|
|
78
|
+
onRight: (connectorJsonParsed) => {
|
|
79
|
+
const connectorPackage = new adm_zip_1.default();
|
|
80
|
+
connectorPackage.addLocalFolder(pathLib.join(cdkProjectPath, 'src'), pathLib.join(connectorJsonParsed.name, 'src'));
|
|
81
|
+
const rawHttpOperationPath = pathLib.join(cdkProjectPath, 'src', 'raw_http_request');
|
|
82
|
+
const rawHttpExists = fse.existsSync(rawHttpOperationPath);
|
|
83
|
+
if (connectorJsonParsed.rawHttp.enabled &&
|
|
84
|
+
!rawHttpExists &&
|
|
85
|
+
!connectorJsonParsed.isTrigger) {
|
|
86
|
+
this.injectRawHttpOperation(connectorPackage, connectorJsonParsed.name, cdkProjectPath);
|
|
84
87
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
const entries = connectorPackage.getEntries();
|
|
89
|
+
// exclude all the ctx.json files from the zip as it can contain sensitive information
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
if (entry.entryName.endsWith('.ctx.json')) {
|
|
92
|
+
connectorPackage.deleteFile(entry.entryName);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
connectorPackage.addLocalFile(pathLib.join(cdkProjectPath, 'package.json'), connectorJsonParsed.name);
|
|
96
|
+
connectorPackage.addLocalFile(pathLib.join(cdkProjectPath, 'tsconfig.json'), connectorJsonParsed.name);
|
|
97
|
+
connectorPackage.addLocalFile(pathLib.join(cdkProjectPath, 'jest.config.js'), connectorJsonParsed.name);
|
|
98
|
+
connectorPackage.addLocalFile(pathLib.join(cdkProjectPath, 'connector.json'), connectorJsonParsed.name);
|
|
99
|
+
connectorPackage.writeZip(connectorPackagePath);
|
|
100
|
+
return effect_1.Effect.succeed(undefined);
|
|
101
|
+
},
|
|
92
102
|
}));
|
|
93
103
|
}
|
|
94
104
|
injectRawHttpOperation(connectorPackage, connectorName, cdkProjectPath) {
|
|
@@ -125,29 +135,32 @@ class ConnectorBuilder {
|
|
|
125
135
|
* Users must create these using: tray-cdk connector add-dynamic-output-schema <operation-name>
|
|
126
136
|
*/
|
|
127
137
|
validateDynamicOutputOperations(cdkProjectPath) {
|
|
128
|
-
return (0,
|
|
138
|
+
return (0, effect_1.pipe)(this.getOperations(cdkProjectPath), effect_1.Effect.flatMap((operations) => effect_1.Effect.forEach((operation) => {
|
|
129
139
|
// Skip _output_schema operations themselves
|
|
130
140
|
if (operation.endsWith('_output_schema')) {
|
|
131
|
-
return
|
|
141
|
+
return effect_1.Effect.succeed(undefined);
|
|
132
142
|
}
|
|
133
143
|
const operationPath = pathLib.join(cdkProjectPath, 'src', operation);
|
|
134
144
|
const operationJsonPath = pathLib.join(operationPath, 'operation.json');
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
`
|
|
145
|
+
return effect_1.Effect.tryPromise({
|
|
146
|
+
try: async () => {
|
|
147
|
+
// Read operation.json to check for dynamic_output flag
|
|
148
|
+
const operationJson = await fse.readJson(operationJsonPath);
|
|
149
|
+
if (operationJson.dynamic_output === true) {
|
|
150
|
+
// Validate that _output_schema operation exists
|
|
151
|
+
const outputSchemaOpName = `${operation}_output_schema`;
|
|
152
|
+
const outputSchemaOpPath = pathLib.join(cdkProjectPath, 'src', outputSchemaOpName);
|
|
153
|
+
if (!fse.existsSync(outputSchemaOpPath)) {
|
|
154
|
+
throw new Error(`Operation '${operation}' has dynamic_output: true but missing '${outputSchemaOpName}' operation.\n` +
|
|
155
|
+
`Run: tray-cdk connector add-dynamic-output-schema ${operation}`);
|
|
156
|
+
}
|
|
157
|
+
console.log(`✓ Dynamic output schema operation found for: ${operation}`);
|
|
145
158
|
}
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
})(operations)),
|
|
159
|
+
return undefined;
|
|
160
|
+
},
|
|
161
|
+
catch: (reason) => new Error(String(reason)),
|
|
162
|
+
});
|
|
163
|
+
})(operations)), effect_1.Effect.map(() => undefined));
|
|
151
164
|
}
|
|
152
165
|
}
|
|
153
166
|
exports.ConnectorBuilder = ConnectorBuilder;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
2
|
export declare class ConnectorOperationSchemaGenerator {
|
|
3
|
-
generateSchemasForOperation(operationPath: string, operationName: string):
|
|
3
|
+
generateSchemasForOperation(operationPath: string, operationName: string): Effect.Effect<undefined, Error>;
|
|
4
4
|
private generateSchema;
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=ConnectorOperationSchemaGenerator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectorOperationSchemaGenerator.d.ts","sourceRoot":"","sources":["../../../src/connector/operation/ConnectorOperationSchemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ConnectorOperationSchemaGenerator.d.ts","sourceRoot":"","sources":["../../../src/connector/operation/ConnectorOperationSchemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAQtC,qBAAa,iCAAiC;IAC7C,2BAA2B,CAC1B,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;IAiElC,OAAO,CAAC,cAAc;CActB"}
|
|
@@ -15,17 +15,26 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
36
|
exports.ConnectorOperationSchemaGenerator = void 0;
|
|
27
|
-
const
|
|
28
|
-
const function_1 = require("fp-ts/function");
|
|
37
|
+
const effect_1 = require("effect");
|
|
29
38
|
const pathLib = __importStar(require("path"));
|
|
30
39
|
const StringExtensions_1 = require("@trayio/commons/string/StringExtensions");
|
|
31
40
|
const TJSTraySchemaGenerator_1 = require("@trayio/tray-schema/schema/TJSTraySchemaGenerator");
|
|
@@ -42,19 +51,28 @@ class ConnectorOperationSchemaGenerator {
|
|
|
42
51
|
const inputSchemaFilePath = pathLib.join(operationPath, 'input.json');
|
|
43
52
|
const outputSchemaFilePath = pathLib.join(operationPath, 'output.json');
|
|
44
53
|
const responseSchemaFilePath = pathLib.join(operationPath, 'response.json');
|
|
45
|
-
return (0,
|
|
54
|
+
return (0, effect_1.pipe)(effect_1.Effect.tryPromise({
|
|
55
|
+
try: () => fse.exists(inputFilePath),
|
|
56
|
+
catch: (reason) => new Error(String(reason)),
|
|
57
|
+
}), effect_1.Effect.flatMap(() => effect_1.Effect.tryPromise({
|
|
58
|
+
try: () => fse.exists(outputFilePath),
|
|
59
|
+
catch: (reason) => new Error(String(reason)),
|
|
60
|
+
})), effect_1.Effect.flatMap(() => {
|
|
46
61
|
console.log(`Generating types for operation: ${operationName}`); // TODO: Remove this and use a logger
|
|
47
62
|
return this.generateSchema(inputFilePath, inputTypeName, inputSchemaFilePath);
|
|
48
|
-
}),
|
|
63
|
+
}), effect_1.Effect.flatMap(() => this.generateSchema(outputFilePath, outputTypeName, outputSchemaFilePath)), effect_1.Effect.flatMap(() => (0, effect_1.pipe)(effect_1.Effect.tryPromise({
|
|
64
|
+
try: () => fse.exists(responseFilePath),
|
|
65
|
+
catch: (reason) => new Error(String(reason)),
|
|
66
|
+
}), effect_1.Effect.flatMap((exists) => {
|
|
49
67
|
if (exists) {
|
|
50
68
|
return this.generateSchema(responseFilePath, responseTypeName, responseSchemaFilePath);
|
|
51
69
|
}
|
|
52
|
-
return
|
|
53
|
-
}))),
|
|
70
|
+
return effect_1.Effect.succeed(undefined);
|
|
71
|
+
}))), effect_1.Effect.flatMap(() => effect_1.Effect.succeed(undefined)));
|
|
54
72
|
}
|
|
55
73
|
generateSchema(filePath, typeName, schemaFilePath) {
|
|
56
74
|
const schemaTransformer = new TJSTraySchemaGenerator_1.TJSTraySchemaGenerator();
|
|
57
|
-
return (0,
|
|
75
|
+
return (0, effect_1.pipe)(schemaTransformer.generateFromType(typeName, filePath), effect_1.Effect.flatMap((schema) => DynamicType_1.DynamicType.writeToFileAsync(schemaFilePath, schema)));
|
|
58
76
|
}
|
|
59
77
|
}
|
|
60
78
|
exports.ConnectorOperationSchemaGenerator = ConnectorOperationSchemaGenerator;
|
package/dist/connector/test.js
CHANGED
|
@@ -1,38 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
4
|
};
|
|
28
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
const
|
|
6
|
+
const effect_1 = require("effect");
|
|
30
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
31
8
|
const ConnectorBuilder_1 = require("./ConnectorBuilder");
|
|
32
9
|
const connectorBuilder = new ConnectorBuilder_1.ConnectorBuilder();
|
|
33
10
|
const result = connectorBuilder.buildConnector('/Users/gnyani/projects/CDK-examples-public/name-change-test');
|
|
34
11
|
(async () => {
|
|
35
|
-
|
|
12
|
+
await effect_1.Effect.runPromise(effect_1.Effect.catchAll(result, (error) => effect_1.Effect.sync(() => {
|
|
36
13
|
console.log(chalk_1.default.bold(chalk_1.default.bgRed(error.message)));
|
|
37
|
-
})
|
|
14
|
+
})));
|
|
38
15
|
})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trayio/cdk-build",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.35.0-unstable.fd7158a",
|
|
4
4
|
"description": "Build utilities for CDK projects",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./*": "./dist/*.js"
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
"access": "public"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@trayio/commons": "5.
|
|
18
|
-
"@trayio/tray-schema": "5.
|
|
17
|
+
"@trayio/commons": "5.35.0-unstable.fd7158a",
|
|
18
|
+
"@trayio/tray-schema": "5.35.0-unstable.fd7158a",
|
|
19
19
|
"adm-zip": "0.6.0",
|
|
20
20
|
"chalk": "4.1.2",
|
|
21
|
-
"
|
|
21
|
+
"effect": "3.22.2",
|
|
22
22
|
"fs-extra": "11.3.4",
|
|
23
23
|
"lodash": "4.18.1",
|
|
24
24
|
"zod": "3.23.5"
|