@sasjs/cli 6.6.0 → 6.8.0
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/README.md +2 -1
- package/build/commands/flow/flowCommand.js +11 -1
- package/build/commands/flow/internal/executeFlow.js +44 -19
- package/build/commands/flow/internal/saveLog.d.ts +12 -1
- package/build/commands/flow/internal/saveLog.js +2 -2
- package/build/commands/flow/internal/spec/executeFlow.spec.js +44 -1
- package/build/commands/flow/spec/flowCommand.spec.js +44 -0
- package/build/commands/help/help.js +10 -0
- package/build/commands/index.d.ts +1 -0
- package/build/commands/index.js +3 -1
- package/build/commands/job/internal/execute/sas9.js +16 -13
- package/build/commands/job/internal/execute/sasjs.js +12 -9
- package/build/commands/job/internal/execute/viya.js +41 -36
- package/build/commands/job/jobCommand.js +13 -0
- package/build/commands/job/spec/executeLogOrder.spec.d.ts +1 -0
- package/build/commands/job/spec/executeLogOrder.spec.js +119 -0
- package/build/commands/job/spec/jobCommand.spec.js +32 -0
- package/build/commands/logcheck/collectLogs.d.ts +60 -0
- package/build/commands/logcheck/collectLogs.js +386 -0
- package/build/commands/logcheck/logCheckConfig.d.ts +83 -0
- package/build/commands/logcheck/logCheckConfig.js +343 -0
- package/build/commands/logcheck/logcheckCommand.d.ts +6 -0
- package/build/commands/logcheck/logcheckCommand.js +200 -0
- package/build/commands/logcheck/processLogCheck.d.ts +44 -0
- package/build/commands/logcheck/processLogCheck.js +242 -0
- package/build/commands/logcheck/renderLogCheck.d.ts +129 -0
- package/build/commands/logcheck/renderLogCheck.js +424 -0
- package/build/commands/logcheck/spec/collectLogs.spec.d.ts +1 -0
- package/build/commands/logcheck/spec/collectLogs.spec.js +477 -0
- package/build/commands/logcheck/spec/logCheckConfig.spec.d.ts +1 -0
- package/build/commands/logcheck/spec/logCheckConfig.spec.js +384 -0
- package/build/commands/logcheck/spec/logcheckCommand.spec.d.ts +1 -0
- package/build/commands/logcheck/spec/logcheckCommand.spec.js +360 -0
- package/build/commands/logcheck/spec/processLogCheck.spec.d.ts +1 -0
- package/build/commands/logcheck/spec/processLogCheck.spec.js +354 -0
- package/build/commands/logcheck/spec/renderLogCheck.spec.d.ts +1 -0
- package/build/commands/logcheck/spec/renderLogCheck.spec.js +426 -0
- package/build/commands/logcheck/types.d.ts +106 -0
- package/build/commands/logcheck/types.js +14 -0
- package/build/commands/request/request.js +66 -27
- package/build/commands/request/requestCommand.js +11 -1
- package/build/commands/request/spec/requestCommand.spec.js +40 -0
- package/build/commands/run/run.d.ts +1 -3
- package/build/commands/run/run.js +20 -5
- package/build/commands/run/runCommand.js +9 -0
- package/build/commands/run/spec/runCommand.spec.js +50 -0
- package/build/types/command/commandAliases.js +1 -0
- package/build/types/command/commandFactory.js +2 -0
- package/build/types/command/returnCode.d.ts +2 -1
- package/build/types/command/returnCode.js +4 -0
- package/build/utils/index.d.ts +1 -0
- package/build/utils/index.js +1 -0
- package/build/utils/logcheck.d.ts +44 -0
- package/build/utils/logcheck.js +224 -0
- package/build/utils/spec/logcheck.spec.d.ts +1 -0
- package/build/utils/spec/logcheck.spec.js +297 -0
- package/package.json +3 -3
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
var os_1 = __importDefault(require("os"));
|
|
43
|
+
var path_1 = __importDefault(require("path"));
|
|
44
|
+
var fs_1 = require("fs");
|
|
45
|
+
var utils_1 = require("@sasjs/utils");
|
|
46
|
+
var logcheck_1 = require("../logcheck");
|
|
47
|
+
var sasLog = function (extra) {
|
|
48
|
+
if (extra === void 0) { extra = ''; }
|
|
49
|
+
return "NOTE: Copyright (c) 2016 by SAS Institute Inc., Cary, NC, USA.\n\n1 data work.x;\n2 set work.y;\n3 run;\n".concat(extra);
|
|
50
|
+
};
|
|
51
|
+
var logWithError = sasLog('ERROR 22-322: Syntax error.\n');
|
|
52
|
+
var logWithNote = sasLog('NOTE: Variable flag is uninitialized.\n');
|
|
53
|
+
var cleanLog = sasLog();
|
|
54
|
+
var tempFolder = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
55
|
+
switch (_a.label) {
|
|
56
|
+
case 0: return [4 /*yield*/, fs_1.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'sasjs-logcheck-inline-'))];
|
|
57
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
58
|
+
}
|
|
59
|
+
}); }); };
|
|
60
|
+
describe('logCheckModeOf', function () {
|
|
61
|
+
it('reads the tri-state a yargs boolean gives', function () {
|
|
62
|
+
expect((0, logcheck_1.logCheckModeOf)(true)).toEqual('on');
|
|
63
|
+
expect((0, logcheck_1.logCheckModeOf)(false)).toEqual('off');
|
|
64
|
+
expect((0, logcheck_1.logCheckModeOf)(undefined)).toEqual('auto');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('checkLog', function () {
|
|
68
|
+
var originalProjectDir = process.projectDir;
|
|
69
|
+
var logged;
|
|
70
|
+
var withProject = function (logCheck) { return __awaiter(void 0, void 0, void 0, function () {
|
|
71
|
+
var folder;
|
|
72
|
+
return __generator(this, function (_a) {
|
|
73
|
+
switch (_a.label) {
|
|
74
|
+
case 0: return [4 /*yield*/, tempFolder()];
|
|
75
|
+
case 1:
|
|
76
|
+
folder = _a.sent();
|
|
77
|
+
process.projectDir = folder;
|
|
78
|
+
if (!(logCheck !== undefined)) return [3 /*break*/, 3];
|
|
79
|
+
return [4 /*yield*/, fs_1.promises.writeFile(path_1.default.join(folder, 'sasjsconfig.json'), JSON.stringify({ logCheck: logCheck }))];
|
|
80
|
+
case 2:
|
|
81
|
+
_a.sent();
|
|
82
|
+
_a.label = 3;
|
|
83
|
+
case 3: return [2 /*return*/, folder];
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}); };
|
|
87
|
+
beforeEach(function () {
|
|
88
|
+
logged = [];
|
|
89
|
+
process.logger = {
|
|
90
|
+
log: function (message) { return logged.push(message); }
|
|
91
|
+
};
|
|
92
|
+
process.logger.logLevel = utils_1.LogLevel.Off;
|
|
93
|
+
});
|
|
94
|
+
afterEach(function () {
|
|
95
|
+
process.projectDir = originalProjectDir;
|
|
96
|
+
process.logger = undefined;
|
|
97
|
+
(0, logcheck_1.setLogCheckMode)('auto');
|
|
98
|
+
});
|
|
99
|
+
it('says nothing for a clean log', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
100
|
+
return __generator(this, function (_a) {
|
|
101
|
+
switch (_a.label) {
|
|
102
|
+
case 0: return [4 /*yield*/, withProject()];
|
|
103
|
+
case 1:
|
|
104
|
+
_a.sent();
|
|
105
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(cleanLog, 'run-job.sas')];
|
|
106
|
+
case 2:
|
|
107
|
+
_a.sent();
|
|
108
|
+
expect(logged).toEqual([]);
|
|
109
|
+
return [2 /*return*/];
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}); });
|
|
113
|
+
it('says nothing when it is given no log at all', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
114
|
+
return __generator(this, function (_a) {
|
|
115
|
+
switch (_a.label) {
|
|
116
|
+
case 0: return [4 /*yield*/, withProject()];
|
|
117
|
+
case 1:
|
|
118
|
+
_a.sent();
|
|
119
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(undefined, 'run-job.sas')];
|
|
120
|
+
case 2:
|
|
121
|
+
_a.sent();
|
|
122
|
+
expect(logged).toEqual([]);
|
|
123
|
+
return [2 /*return*/];
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}); });
|
|
127
|
+
it('reports the issues without failing by default', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
128
|
+
var output;
|
|
129
|
+
return __generator(this, function (_a) {
|
|
130
|
+
switch (_a.label) {
|
|
131
|
+
case 0: return [4 /*yield*/, withProject()];
|
|
132
|
+
case 1:
|
|
133
|
+
_a.sent();
|
|
134
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(logWithError, 'run-job.sas')];
|
|
135
|
+
case 2:
|
|
136
|
+
_a.sent();
|
|
137
|
+
output = logged.join('\n');
|
|
138
|
+
expect(output).toContain('SAS log check run-job.sas');
|
|
139
|
+
expect(output).toContain('1 error');
|
|
140
|
+
expect(output).toContain('Syntax error.');
|
|
141
|
+
expect(output).not.toContain('Logcheck failed');
|
|
142
|
+
return [2 /*return*/];
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}); });
|
|
146
|
+
it('skips the check, with a warning, when the config cannot be read', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
147
|
+
var folder, warn;
|
|
148
|
+
return __generator(this, function (_a) {
|
|
149
|
+
switch (_a.label) {
|
|
150
|
+
case 0: return [4 /*yield*/, tempFolder()];
|
|
151
|
+
case 1:
|
|
152
|
+
folder = _a.sent();
|
|
153
|
+
process.projectDir = folder;
|
|
154
|
+
return [4 /*yield*/, fs_1.promises.writeFile(path_1.default.join(folder, 'sasjsconfig.json'), '{ "logCheck": ')];
|
|
155
|
+
case 2:
|
|
156
|
+
_a.sent();
|
|
157
|
+
warn = jest.fn();
|
|
158
|
+
process.logger.warn = warn;
|
|
159
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(logWithError, 'run-job.sas')];
|
|
160
|
+
case 3:
|
|
161
|
+
_a.sent();
|
|
162
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Skipping the SAS log check'));
|
|
163
|
+
expect(logged).toEqual([]);
|
|
164
|
+
return [2 /*return*/];
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}); });
|
|
168
|
+
it('says nothing at all under --no-logcheck', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
169
|
+
return __generator(this, function (_a) {
|
|
170
|
+
switch (_a.label) {
|
|
171
|
+
case 0: return [4 /*yield*/, withProject({ autoCheck: true })];
|
|
172
|
+
case 1:
|
|
173
|
+
_a.sent();
|
|
174
|
+
(0, logcheck_1.setLogCheckMode)('off');
|
|
175
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(logWithError, 'run-job.sas')];
|
|
176
|
+
case 2:
|
|
177
|
+
_a.sent();
|
|
178
|
+
expect(logged).toEqual([]);
|
|
179
|
+
return [2 /*return*/];
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}); });
|
|
183
|
+
it('fails the run when the project asked for it', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
184
|
+
return __generator(this, function (_a) {
|
|
185
|
+
switch (_a.label) {
|
|
186
|
+
case 0: return [4 /*yield*/, withProject({ autoCheck: true })];
|
|
187
|
+
case 1:
|
|
188
|
+
_a.sent();
|
|
189
|
+
return [4 /*yield*/, expect((0, logcheck_1.checkLog)(logWithError, 'run-job.sas')).rejects.toThrow('SAS log check failed for run-job.sas: 1 error')];
|
|
190
|
+
case 2:
|
|
191
|
+
_a.sent();
|
|
192
|
+
expect(logged.join('\n')).toContain('Logcheck failed: 1 error');
|
|
193
|
+
return [2 /*return*/];
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}); });
|
|
197
|
+
it('fails the run when the flag asked for it, without the config', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
198
|
+
return __generator(this, function (_a) {
|
|
199
|
+
switch (_a.label) {
|
|
200
|
+
case 0: return [4 /*yield*/, withProject()];
|
|
201
|
+
case 1:
|
|
202
|
+
_a.sent();
|
|
203
|
+
(0, logcheck_1.setLogCheckMode)('on');
|
|
204
|
+
return [4 /*yield*/, expect((0, logcheck_1.checkLog)(logWithError, 'run-job.sas')).rejects.toBeInstanceOf(logcheck_1.LogCheckFailure)];
|
|
205
|
+
case 2:
|
|
206
|
+
_a.sent();
|
|
207
|
+
return [2 /*return*/];
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}); });
|
|
211
|
+
it('does not fail on a note under the default policy', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
212
|
+
return __generator(this, function (_a) {
|
|
213
|
+
switch (_a.label) {
|
|
214
|
+
case 0: return [4 /*yield*/, withProject({ autoCheck: true })];
|
|
215
|
+
case 1:
|
|
216
|
+
_a.sent();
|
|
217
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(logWithNote, 'run-job.sas')];
|
|
218
|
+
case 2:
|
|
219
|
+
_a.sent();
|
|
220
|
+
expect(logged.join('\n')).toContain('1 note');
|
|
221
|
+
expect(logged.join('\n')).not.toContain('Logcheck failed');
|
|
222
|
+
return [2 /*return*/];
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}); });
|
|
226
|
+
it('fails on a note when the policy says note', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
227
|
+
return __generator(this, function (_a) {
|
|
228
|
+
switch (_a.label) {
|
|
229
|
+
case 0: return [4 /*yield*/, withProject({ autoCheck: true, failOn: 'note' })];
|
|
230
|
+
case 1:
|
|
231
|
+
_a.sent();
|
|
232
|
+
return [4 /*yield*/, expect((0, logcheck_1.checkLog)(logWithNote, 'run-job.sas')).rejects.toThrow('1 note')];
|
|
233
|
+
case 2:
|
|
234
|
+
_a.sent();
|
|
235
|
+
return [2 /*return*/];
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}); });
|
|
239
|
+
it('suppresses an issue by message code', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
240
|
+
return __generator(this, function (_a) {
|
|
241
|
+
switch (_a.label) {
|
|
242
|
+
case 0: return [4 /*yield*/, withProject({ ignoreCodes: ['22-322'] })];
|
|
243
|
+
case 1:
|
|
244
|
+
_a.sent();
|
|
245
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(logWithError, 'run-job.sas')];
|
|
246
|
+
case 2:
|
|
247
|
+
_a.sent();
|
|
248
|
+
expect(logged).toEqual([]);
|
|
249
|
+
return [2 /*return*/];
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}); });
|
|
253
|
+
it('reports a suppressed issue alongside the ones that remain', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
254
|
+
var output;
|
|
255
|
+
return __generator(this, function (_a) {
|
|
256
|
+
switch (_a.label) {
|
|
257
|
+
case 0: return [4 /*yield*/, withProject({ ignoreCodes: ['22-322'], autoCheck: true })];
|
|
258
|
+
case 1:
|
|
259
|
+
_a.sent();
|
|
260
|
+
return [4 /*yield*/, (0, logcheck_1.checkLog)(sasLog('ERROR 22-322: Syntax error.\nNOTE: Variable flag is uninitialized.\n'), 'run-job.sas').catch(function () { return undefined; })];
|
|
261
|
+
case 2:
|
|
262
|
+
_a.sent();
|
|
263
|
+
output = logged.join('\n');
|
|
264
|
+
expect(output).toContain('1 note');
|
|
265
|
+
expect(output).toContain('1 issue suppressed by message code (22-322)');
|
|
266
|
+
expect(output).not.toContain('Logcheck failed');
|
|
267
|
+
return [2 /*return*/];
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}); });
|
|
271
|
+
});
|
|
272
|
+
describe('isLogCheckFailure', function () {
|
|
273
|
+
it('recognises only its own error', function () {
|
|
274
|
+
expect((0, logcheck_1.isLogCheckFailure)(new logcheck_1.LogCheckFailure('x'))).toBe(true);
|
|
275
|
+
expect((0, logcheck_1.isLogCheckFailure)(new Error('x'))).toBe(false);
|
|
276
|
+
expect((0, logcheck_1.isLogCheckFailure)('x')).toBe(false);
|
|
277
|
+
expect((0, logcheck_1.isLogCheckFailure)(undefined)).toBe(false);
|
|
278
|
+
});
|
|
279
|
+
it('is not fooled by an error that only borrows the name', function () {
|
|
280
|
+
// The marker is what the built CLI relies on: the compiled target loses the
|
|
281
|
+
// prototype chain of an Error subclass, so `instanceof` is not available
|
|
282
|
+
// there and the name alone would be a weak claim.
|
|
283
|
+
var impostor = new Error('x');
|
|
284
|
+
impostor.name = 'LogCheckFailure';
|
|
285
|
+
expect((0, logcheck_1.isLogCheckFailure)(impostor)).toBe(false);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
describe('getLogCheckMode', function () {
|
|
289
|
+
afterEach(function () { return (0, logcheck_1.setLogCheckMode)('auto'); });
|
|
290
|
+
it('starts on auto and follows what it is set to', function () {
|
|
291
|
+
expect((0, logcheck_1.getLogCheckMode)()).toEqual('auto');
|
|
292
|
+
(0, logcheck_1.setLogCheckMode)('on');
|
|
293
|
+
expect((0, logcheck_1.getLogCheckMode)()).toEqual('on');
|
|
294
|
+
(0, logcheck_1.setLogCheckMode)('off');
|
|
295
|
+
expect((0, logcheck_1.getLogCheckMode)()).toEqual('off');
|
|
296
|
+
});
|
|
297
|
+
});
|
package/package.json
CHANGED
|
@@ -70,10 +70,10 @@
|
|
|
70
70
|
"registry": "https://registry.npmjs.org"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@sasjs/adapter": "^5.1.
|
|
73
|
+
"@sasjs/adapter": "^5.1.3",
|
|
74
74
|
"@sasjs/core": "^6.1.1",
|
|
75
75
|
"@sasjs/lint": "4.9.0",
|
|
76
|
-
"@sasjs/utils": "^4.
|
|
76
|
+
"@sasjs/utils": "^4.3.2",
|
|
77
77
|
"axios": "1.20.0",
|
|
78
78
|
"chalk": "4.1.2",
|
|
79
79
|
"dotenv": "18.0.8",
|
|
@@ -123,5 +123,5 @@
|
|
|
123
123
|
"ws": "8.21.0",
|
|
124
124
|
"nanoid": "3.3.18"
|
|
125
125
|
},
|
|
126
|
-
"version": "6.
|
|
126
|
+
"version": "6.8.0"
|
|
127
127
|
}
|