@sasjs/cli 6.2.7 → 6.4.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 +1 -0
- package/build/commands/auth/authCommand.js +5 -3
- package/build/commands/auth/login.d.ts +9 -3
- package/build/commands/auth/login.js +40 -21
- package/build/commands/auth/spec/login.spec.js +103 -3
- package/build/commands/compile/internal/compileTestFile.d.ts +2 -0
- package/build/commands/compile/internal/compileTestFile.js +48 -60
- package/build/commands/compile/internal/spec/compileTestFile.spec.js +158 -0
- package/build/commands/help/help.js +1 -0
- package/build/types/index.d.ts +1 -1
- package/build/types/testing.d.ts +33 -0
- package/build/types/testing.js +1 -0
- package/build/utils/auth.d.ts +30 -0
- package/build/utils/auth.js +230 -0
- package/build/utils/config.js +2 -2
- package/build/utils/spec/sasjsLogin.spec.d.ts +1 -0
- package/build/utils/spec/sasjsLogin.spec.js +370 -0
- package/package.json +1 -1
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
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);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
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;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
50
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
51
|
+
if (!m) return o;
|
|
52
|
+
var i = m.call(o), r, ar = [], e;
|
|
53
|
+
try {
|
|
54
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
55
|
+
}
|
|
56
|
+
catch (error) { e = { error: error }; }
|
|
57
|
+
finally {
|
|
58
|
+
try {
|
|
59
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
60
|
+
}
|
|
61
|
+
finally { if (e) throw e.error; }
|
|
62
|
+
}
|
|
63
|
+
return ar;
|
|
64
|
+
};
|
|
65
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
66
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
67
|
+
if (ar || !(i in from)) {
|
|
68
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
69
|
+
ar[i] = from[i];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
73
|
+
};
|
|
74
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
75
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
76
|
+
};
|
|
77
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
78
|
+
var axios_1 = __importDefault(require("axios"));
|
|
79
|
+
var utils_1 = require("@sasjs/utils");
|
|
80
|
+
var auth_1 = require("../auth");
|
|
81
|
+
jest.mock('axios');
|
|
82
|
+
var request = jest.fn();
|
|
83
|
+
var target = function (client) {
|
|
84
|
+
return new utils_1.Target(__assign({ name: 'sasjs-test', serverType: utils_1.ServerType.Sasjs, serverUrl: 'https://sasjs.example.com/', appLoc: '/Public/app' }, (client ? { authConfig: { client: client } } : {})));
|
|
85
|
+
};
|
|
86
|
+
var ok = function (data, headers) {
|
|
87
|
+
if (headers === void 0) { headers = {}; }
|
|
88
|
+
return ({
|
|
89
|
+
status: 200,
|
|
90
|
+
headers: headers,
|
|
91
|
+
data: data
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
var xsrfCookie = {
|
|
95
|
+
'set-cookie': ['XSRF-TOKEN=abc%3D%3D; Path=/; HttpOnly']
|
|
96
|
+
};
|
|
97
|
+
var happyPath = function (overrides) {
|
|
98
|
+
if (overrides === void 0) { overrides = []; }
|
|
99
|
+
var responses = __spreadArray([
|
|
100
|
+
ok('', xsrfCookie),
|
|
101
|
+
ok({ loggedIn: true, user: { displayName: 'Test User' } }),
|
|
102
|
+
ok([{ clientId: 'client-1' }]),
|
|
103
|
+
ok({ code: 'the-code' }),
|
|
104
|
+
ok({ accessToken: 'access-token', refreshToken: 'refresh-token' })
|
|
105
|
+
], __read(overrides), false);
|
|
106
|
+
responses.forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
107
|
+
};
|
|
108
|
+
describe('getTokensWithSasjsLogin', function () {
|
|
109
|
+
beforeEach(function () {
|
|
110
|
+
jest.clearAllMocks();
|
|
111
|
+
axios_1.default.create.mockReturnValue({ request: request });
|
|
112
|
+
});
|
|
113
|
+
it('should mint a token pair from the four-step local login', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
114
|
+
var result, calls;
|
|
115
|
+
return __generator(this, function (_a) {
|
|
116
|
+
switch (_a.label) {
|
|
117
|
+
case 0:
|
|
118
|
+
happyPath();
|
|
119
|
+
return [4 /*yield*/, (0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')];
|
|
120
|
+
case 1:
|
|
121
|
+
result = _a.sent();
|
|
122
|
+
expect(result).toEqual({
|
|
123
|
+
access_token: 'access-token',
|
|
124
|
+
refresh_token: 'refresh-token',
|
|
125
|
+
client: 'client-1',
|
|
126
|
+
displayName: 'Test User'
|
|
127
|
+
});
|
|
128
|
+
calls = request.mock.calls.map(function (call) { return call[0]; });
|
|
129
|
+
expect(calls.map(function (c) { return c.url; })).toEqual([
|
|
130
|
+
'/',
|
|
131
|
+
'/SASLogon/login',
|
|
132
|
+
'/SASjsApi/client',
|
|
133
|
+
'/SASLogon/authorize',
|
|
134
|
+
'/SASjsApi/auth/token'
|
|
135
|
+
]);
|
|
136
|
+
expect(calls[1].data).toEqual({ username: 'user1', password: 'pass1' });
|
|
137
|
+
expect(calls[3].data).toEqual({ clientId: 'client-1' });
|
|
138
|
+
expect(calls[4].data).toEqual({ clientId: 'client-1', code: 'the-code' });
|
|
139
|
+
return [2 /*return*/];
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}); });
|
|
143
|
+
it('should send the session cookie and the decoded XSRF token', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
144
|
+
var loginCall;
|
|
145
|
+
return __generator(this, function (_a) {
|
|
146
|
+
switch (_a.label) {
|
|
147
|
+
case 0:
|
|
148
|
+
happyPath();
|
|
149
|
+
return [4 /*yield*/, (0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')];
|
|
150
|
+
case 1:
|
|
151
|
+
_a.sent();
|
|
152
|
+
loginCall = request.mock.calls[1][0];
|
|
153
|
+
expect(loginCall.headers.Cookie).toBe('XSRF-TOKEN=abc%3D%3D');
|
|
154
|
+
expect(loginCall.headers['X-XSRF-TOKEN']).toBe('abc==');
|
|
155
|
+
// The first call has nothing to send yet.
|
|
156
|
+
expect(request.mock.calls[0][0].headers.Cookie).toBeUndefined();
|
|
157
|
+
return [2 /*return*/];
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}); });
|
|
161
|
+
it('should not list clients when an id is supplied', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
162
|
+
var result;
|
|
163
|
+
return __generator(this, function (_a) {
|
|
164
|
+
switch (_a.label) {
|
|
165
|
+
case 0:
|
|
166
|
+
;
|
|
167
|
+
[
|
|
168
|
+
ok('', xsrfCookie),
|
|
169
|
+
ok({ loggedIn: true }),
|
|
170
|
+
ok({ code: 'the-code' }),
|
|
171
|
+
ok({ accessToken: 'access-token' })
|
|
172
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
173
|
+
return [4 /*yield*/, (0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1', 'pinned-client')];
|
|
174
|
+
case 1:
|
|
175
|
+
result = _a.sent();
|
|
176
|
+
expect(request).toHaveBeenCalledTimes(4);
|
|
177
|
+
expect(result.client).toBe('pinned-client');
|
|
178
|
+
expect(result.refresh_token).toBe('');
|
|
179
|
+
expect(result.displayName).toBeUndefined();
|
|
180
|
+
return [2 /*return*/];
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}); });
|
|
184
|
+
it('should prefer the target client over the admin client listing', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
185
|
+
var result;
|
|
186
|
+
return __generator(this, function (_a) {
|
|
187
|
+
switch (_a.label) {
|
|
188
|
+
case 0:
|
|
189
|
+
;
|
|
190
|
+
[
|
|
191
|
+
ok('', xsrfCookie),
|
|
192
|
+
ok({ loggedIn: true }),
|
|
193
|
+
ok({ code: 'the-code' }),
|
|
194
|
+
ok({ accessToken: 'access-token' })
|
|
195
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
196
|
+
return [4 /*yield*/, (0, auth_1.getTokensWithSasjsLogin)(target('from-config'), 'user1', 'pass1')];
|
|
197
|
+
case 1:
|
|
198
|
+
result = _a.sent();
|
|
199
|
+
expect(result.client).toBe('from-config');
|
|
200
|
+
expect(request).toHaveBeenCalledTimes(4);
|
|
201
|
+
return [2 /*return*/];
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}); });
|
|
205
|
+
it('should fail when the credentials are rejected', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
206
|
+
return __generator(this, function (_a) {
|
|
207
|
+
switch (_a.label) {
|
|
208
|
+
case 0:
|
|
209
|
+
;
|
|
210
|
+
[
|
|
211
|
+
ok('', xsrfCookie),
|
|
212
|
+
ok({ loggedIn: false, error: 'invalid credentials' })
|
|
213
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
214
|
+
return [4 /*yield*/, expect((0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'wrong')).rejects.toThrow("Login failed for user 'user1' on https://sasjs.example.com/")];
|
|
215
|
+
case 1:
|
|
216
|
+
_a.sent();
|
|
217
|
+
return [2 /*return*/];
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}); });
|
|
221
|
+
it('should fail, naming SASJS_CLIENT, when no client is available', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
222
|
+
return __generator(this, function (_a) {
|
|
223
|
+
switch (_a.label) {
|
|
224
|
+
case 0:
|
|
225
|
+
;
|
|
226
|
+
[
|
|
227
|
+
ok('', xsrfCookie),
|
|
228
|
+
ok({ loggedIn: true }),
|
|
229
|
+
{ status: 403, headers: {}, data: 'Forbidden' }
|
|
230
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
231
|
+
return [4 /*yield*/, expect((0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')).rejects.toThrow(/No client id is available to authorize/)];
|
|
232
|
+
case 1:
|
|
233
|
+
_a.sent();
|
|
234
|
+
return [2 /*return*/];
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}); });
|
|
238
|
+
it('should fail when the token endpoint returns nothing usable', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
239
|
+
return __generator(this, function (_a) {
|
|
240
|
+
switch (_a.label) {
|
|
241
|
+
case 0:
|
|
242
|
+
;
|
|
243
|
+
[
|
|
244
|
+
ok('', xsrfCookie),
|
|
245
|
+
ok({ loggedIn: true }),
|
|
246
|
+
ok([{ clientId: 'client-1' }]),
|
|
247
|
+
ok({ code: 'the-code' }),
|
|
248
|
+
ok({})
|
|
249
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
250
|
+
return [4 /*yield*/, expect((0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')).rejects.toThrow(/returned no access token/)];
|
|
251
|
+
case 1:
|
|
252
|
+
_a.sent();
|
|
253
|
+
return [2 /*return*/];
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}); });
|
|
257
|
+
it('should refuse to follow a redirect that would replay the password', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
258
|
+
return __generator(this, function (_a) {
|
|
259
|
+
switch (_a.label) {
|
|
260
|
+
case 0:
|
|
261
|
+
;
|
|
262
|
+
[
|
|
263
|
+
ok('', xsrfCookie),
|
|
264
|
+
{
|
|
265
|
+
status: 307,
|
|
266
|
+
headers: { location: 'https://elsewhere.example.com/login' },
|
|
267
|
+
data: {}
|
|
268
|
+
}
|
|
269
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
270
|
+
return [4 /*yield*/, expect((0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')).rejects.toThrow(/answered with a 307 redirect/)];
|
|
271
|
+
case 1:
|
|
272
|
+
_a.sent();
|
|
273
|
+
return [2 /*return*/];
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}); });
|
|
277
|
+
it('should fall back to the raw XSRF value when it is not valid encoding', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
278
|
+
return __generator(this, function (_a) {
|
|
279
|
+
switch (_a.label) {
|
|
280
|
+
case 0:
|
|
281
|
+
;
|
|
282
|
+
[
|
|
283
|
+
ok('', { 'set-cookie': ['XSRF-TOKEN=abc%ZZ; Path=/'] }),
|
|
284
|
+
ok({ loggedIn: true }),
|
|
285
|
+
ok([{ clientId: 'client-1' }]),
|
|
286
|
+
ok({ code: 'the-code' }),
|
|
287
|
+
ok({ accessToken: 'access-token' })
|
|
288
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
289
|
+
return [4 /*yield*/, (0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')];
|
|
290
|
+
case 1:
|
|
291
|
+
_a.sent();
|
|
292
|
+
expect(request.mock.calls[1][0].headers['X-XSRF-TOKEN']).toBe('abc%ZZ');
|
|
293
|
+
return [2 /*return*/];
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}); });
|
|
297
|
+
it('should hand the target TLS options to the http client', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
298
|
+
var options;
|
|
299
|
+
return __generator(this, function (_a) {
|
|
300
|
+
switch (_a.label) {
|
|
301
|
+
case 0:
|
|
302
|
+
happyPath();
|
|
303
|
+
return [4 /*yield*/, (0, auth_1.getTokensWithSasjsLogin)(new utils_1.Target({
|
|
304
|
+
name: 'sasjs-tls',
|
|
305
|
+
serverType: utils_1.ServerType.Sasjs,
|
|
306
|
+
serverUrl: 'https://sasjs.example.com',
|
|
307
|
+
appLoc: '/Public/app',
|
|
308
|
+
httpsAgentOptions: { rejectUnauthorized: false }
|
|
309
|
+
}), 'user1', 'pass1')];
|
|
310
|
+
case 1:
|
|
311
|
+
_a.sent();
|
|
312
|
+
options = axios_1.default.create.mock.calls[0][0];
|
|
313
|
+
expect(options.httpsAgent).toBeDefined();
|
|
314
|
+
expect(options.maxRedirects).toBe(0);
|
|
315
|
+
// Every status is inspected rather than thrown by axios, so the flow can
|
|
316
|
+
// report a 401 or a 307 in its own words.
|
|
317
|
+
expect(options.validateStatus(500)).toBe(true);
|
|
318
|
+
return [2 /*return*/];
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
}); });
|
|
322
|
+
it('should name an unnamed redirect target instead of printing undefined', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
323
|
+
return __generator(this, function (_a) {
|
|
324
|
+
switch (_a.label) {
|
|
325
|
+
case 0:
|
|
326
|
+
;
|
|
327
|
+
[ok('', xsrfCookie), { status: 302, headers: {}, data: {} }].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
328
|
+
return [4 /*yield*/, expect((0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')).rejects.toThrow(/redirect to 'unknown'/)];
|
|
329
|
+
case 1:
|
|
330
|
+
_a.sent();
|
|
331
|
+
return [2 /*return*/];
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}); });
|
|
335
|
+
it('should fail when the authorize step returns no code', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
336
|
+
return __generator(this, function (_a) {
|
|
337
|
+
switch (_a.label) {
|
|
338
|
+
case 0:
|
|
339
|
+
;
|
|
340
|
+
[
|
|
341
|
+
ok('', xsrfCookie),
|
|
342
|
+
ok({ loggedIn: true }),
|
|
343
|
+
ok([{ clientId: 'client-1' }]),
|
|
344
|
+
ok({})
|
|
345
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
346
|
+
return [4 /*yield*/, expect((0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')).rejects.toThrow(/Authorization failed for client 'client-1' \(HTTP 200\)/)];
|
|
347
|
+
case 1:
|
|
348
|
+
_a.sent();
|
|
349
|
+
return [2 /*return*/];
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}); });
|
|
353
|
+
it('should ignore a client listing that is not an array', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
354
|
+
return __generator(this, function (_a) {
|
|
355
|
+
switch (_a.label) {
|
|
356
|
+
case 0:
|
|
357
|
+
;
|
|
358
|
+
[
|
|
359
|
+
ok('', xsrfCookie),
|
|
360
|
+
ok({ loggedIn: true }),
|
|
361
|
+
ok({ message: 'not a list' })
|
|
362
|
+
].forEach(function (response) { return request.mockResolvedValueOnce(response); });
|
|
363
|
+
return [4 /*yield*/, expect((0, auth_1.getTokensWithSasjsLogin)(target(), 'user1', 'pass1')).rejects.toThrow(/No client id is available to authorize/)];
|
|
364
|
+
case 1:
|
|
365
|
+
_a.sent();
|
|
366
|
+
return [2 /*return*/];
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
}); });
|
|
370
|
+
});
|
package/package.json
CHANGED