@positronic/cli 0.0.2

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.
Files changed (193) hide show
  1. package/dist/src/cli.js +739 -0
  2. package/dist/src/commands/backend.js +199 -0
  3. package/dist/src/commands/brain.js +446 -0
  4. package/dist/src/commands/brain.test.js +2936 -0
  5. package/dist/src/commands/helpers.js +1315 -0
  6. package/dist/src/commands/helpers.test.js +832 -0
  7. package/dist/src/commands/project-config-manager.js +197 -0
  8. package/dist/src/commands/project.js +130 -0
  9. package/dist/src/commands/project.test.js +1201 -0
  10. package/dist/src/commands/resources.js +272 -0
  11. package/dist/src/commands/resources.test.js +2511 -0
  12. package/dist/src/commands/schedule.js +73 -0
  13. package/dist/src/commands/schedule.test.js +1235 -0
  14. package/dist/src/commands/secret.js +87 -0
  15. package/dist/src/commands/secret.test.d.js +1 -0
  16. package/dist/src/commands/secret.test.js +761 -0
  17. package/dist/src/commands/server.js +816 -0
  18. package/dist/src/commands/server.test.js +1237 -0
  19. package/dist/src/commands/test-utils.js +737 -0
  20. package/dist/src/components/brain-history.js +169 -0
  21. package/dist/src/components/brain-list.js +108 -0
  22. package/dist/src/components/brain-rerun.js +313 -0
  23. package/dist/src/components/brain-show.js +65 -0
  24. package/dist/src/components/error.js +19 -0
  25. package/dist/src/components/project-add.js +95 -0
  26. package/dist/src/components/project-create.js +276 -0
  27. package/dist/src/components/project-list.js +88 -0
  28. package/dist/src/components/project-remove.js +91 -0
  29. package/dist/src/components/project-select.js +224 -0
  30. package/dist/src/components/project-show.js +41 -0
  31. package/dist/src/components/resource-clear.js +152 -0
  32. package/dist/src/components/resource-delete.js +189 -0
  33. package/dist/src/components/resource-list.js +174 -0
  34. package/dist/src/components/resource-sync.js +386 -0
  35. package/dist/src/components/resource-types.js +243 -0
  36. package/dist/src/components/resource-upload.js +366 -0
  37. package/dist/src/components/schedule-create.js +259 -0
  38. package/dist/src/components/schedule-delete.js +161 -0
  39. package/dist/src/components/schedule-list.js +176 -0
  40. package/dist/src/components/schedule-runs.js +103 -0
  41. package/dist/src/components/secret-bulk.js +262 -0
  42. package/dist/src/components/secret-create.js +199 -0
  43. package/dist/src/components/secret-delete.js +190 -0
  44. package/dist/src/components/secret-list.js +190 -0
  45. package/dist/src/components/secret-sync.js +303 -0
  46. package/dist/src/components/watch.js +184 -0
  47. package/dist/src/hooks/useApi.js +512 -0
  48. package/dist/src/positronic.js +33 -0
  49. package/dist/src/test/mock-api-client.js +371 -0
  50. package/dist/src/test/test-dev-server.js +1376 -0
  51. package/dist/types/cli.d.ts +9 -0
  52. package/dist/types/cli.d.ts.map +1 -0
  53. package/dist/types/commands/backend.d.ts +6 -0
  54. package/dist/types/commands/backend.d.ts.map +1 -0
  55. package/dist/types/commands/brain.d.ts +35 -0
  56. package/dist/types/commands/brain.d.ts.map +1 -0
  57. package/dist/types/commands/helpers.d.ts +55 -0
  58. package/dist/types/commands/helpers.d.ts.map +1 -0
  59. package/dist/types/commands/project-config-manager.d.ts +37 -0
  60. package/dist/types/commands/project-config-manager.d.ts.map +1 -0
  61. package/dist/types/commands/project.d.ts +55 -0
  62. package/dist/types/commands/project.d.ts.map +1 -0
  63. package/dist/types/commands/resources.d.ts +13 -0
  64. package/dist/types/commands/resources.d.ts.map +1 -0
  65. package/dist/types/commands/schedule.d.ts +27 -0
  66. package/dist/types/commands/schedule.d.ts.map +1 -0
  67. package/dist/types/commands/secret.d.ts +23 -0
  68. package/dist/types/commands/secret.d.ts.map +1 -0
  69. package/dist/types/commands/server.d.ts +12 -0
  70. package/dist/types/commands/server.d.ts.map +1 -0
  71. package/dist/types/commands/test-utils.d.ts +45 -0
  72. package/dist/types/commands/test-utils.d.ts.map +1 -0
  73. package/dist/types/components/brain-history.d.ts +7 -0
  74. package/dist/types/components/brain-history.d.ts.map +1 -0
  75. package/dist/types/components/brain-list.d.ts +2 -0
  76. package/dist/types/components/brain-list.d.ts.map +1 -0
  77. package/dist/types/components/brain-rerun.d.ts +9 -0
  78. package/dist/types/components/brain-rerun.d.ts.map +1 -0
  79. package/dist/types/components/brain-show.d.ts +6 -0
  80. package/dist/types/components/brain-show.d.ts.map +1 -0
  81. package/dist/types/components/error.d.ts +10 -0
  82. package/dist/types/components/error.d.ts.map +1 -0
  83. package/dist/types/components/project-add.d.ts +9 -0
  84. package/dist/types/components/project-add.d.ts.map +1 -0
  85. package/dist/types/components/project-create.d.ts +6 -0
  86. package/dist/types/components/project-create.d.ts.map +1 -0
  87. package/dist/types/components/project-list.d.ts +7 -0
  88. package/dist/types/components/project-list.d.ts.map +1 -0
  89. package/dist/types/components/project-remove.d.ts +8 -0
  90. package/dist/types/components/project-remove.d.ts.map +1 -0
  91. package/dist/types/components/project-select.d.ts +8 -0
  92. package/dist/types/components/project-select.d.ts.map +1 -0
  93. package/dist/types/components/project-show.d.ts +7 -0
  94. package/dist/types/components/project-show.d.ts.map +1 -0
  95. package/dist/types/components/resource-clear.d.ts +2 -0
  96. package/dist/types/components/resource-clear.d.ts.map +1 -0
  97. package/dist/types/components/resource-delete.d.ts +9 -0
  98. package/dist/types/components/resource-delete.d.ts.map +1 -0
  99. package/dist/types/components/resource-list.d.ts +2 -0
  100. package/dist/types/components/resource-list.d.ts.map +1 -0
  101. package/dist/types/components/resource-sync.d.ts +8 -0
  102. package/dist/types/components/resource-sync.d.ts.map +1 -0
  103. package/dist/types/components/resource-types.d.ts +7 -0
  104. package/dist/types/components/resource-types.d.ts.map +1 -0
  105. package/dist/types/components/resource-upload.d.ts +8 -0
  106. package/dist/types/components/resource-upload.d.ts.map +1 -0
  107. package/dist/types/components/schedule-create.d.ts +7 -0
  108. package/dist/types/components/schedule-create.d.ts.map +1 -0
  109. package/dist/types/components/schedule-delete.d.ts +7 -0
  110. package/dist/types/components/schedule-delete.d.ts.map +1 -0
  111. package/dist/types/components/schedule-list.d.ts +6 -0
  112. package/dist/types/components/schedule-list.d.ts.map +1 -0
  113. package/dist/types/components/schedule-runs.d.ts +8 -0
  114. package/dist/types/components/schedule-runs.d.ts.map +1 -0
  115. package/dist/types/components/secret-bulk.d.ts +8 -0
  116. package/dist/types/components/secret-bulk.d.ts.map +1 -0
  117. package/dist/types/components/secret-create.d.ts +9 -0
  118. package/dist/types/components/secret-create.d.ts.map +1 -0
  119. package/dist/types/components/secret-delete.d.ts +8 -0
  120. package/dist/types/components/secret-delete.d.ts.map +1 -0
  121. package/dist/types/components/secret-list.d.ts +7 -0
  122. package/dist/types/components/secret-list.d.ts.map +1 -0
  123. package/dist/types/components/secret-sync.d.ts +9 -0
  124. package/dist/types/components/secret-sync.d.ts.map +1 -0
  125. package/dist/types/components/watch.d.ts +7 -0
  126. package/dist/types/components/watch.d.ts.map +1 -0
  127. package/dist/types/hooks/useApi.d.ts +29 -0
  128. package/dist/types/hooks/useApi.d.ts.map +1 -0
  129. package/dist/types/positronic.d.ts +3 -0
  130. package/dist/types/positronic.d.ts.map +1 -0
  131. package/dist/types/test/mock-api-client.d.ts +25 -0
  132. package/dist/types/test/mock-api-client.d.ts.map +1 -0
  133. package/dist/types/test/test-dev-server.d.ts +129 -0
  134. package/dist/types/test/test-dev-server.d.ts.map +1 -0
  135. package/package.json +37 -0
  136. package/src/cli.ts +981 -0
  137. package/src/commands/backend.ts +63 -0
  138. package/src/commands/brain.test.ts +1004 -0
  139. package/src/commands/brain.ts +215 -0
  140. package/src/commands/helpers.test.ts +487 -0
  141. package/src/commands/helpers.ts +870 -0
  142. package/src/commands/project-config-manager.ts +152 -0
  143. package/src/commands/project.test.ts +502 -0
  144. package/src/commands/project.ts +109 -0
  145. package/src/commands/resources.test.ts +1052 -0
  146. package/src/commands/resources.ts +97 -0
  147. package/src/commands/schedule.test.ts +481 -0
  148. package/src/commands/schedule.ts +65 -0
  149. package/src/commands/secret.test.ts +210 -0
  150. package/src/commands/secret.ts +50 -0
  151. package/src/commands/server.test.ts +493 -0
  152. package/src/commands/server.ts +353 -0
  153. package/src/commands/test-utils.ts +324 -0
  154. package/src/components/brain-history.tsx +198 -0
  155. package/src/components/brain-list.tsx +105 -0
  156. package/src/components/brain-rerun.tsx +111 -0
  157. package/src/components/brain-show.tsx +92 -0
  158. package/src/components/error.tsx +24 -0
  159. package/src/components/project-add.tsx +59 -0
  160. package/src/components/project-create.tsx +83 -0
  161. package/src/components/project-list.tsx +83 -0
  162. package/src/components/project-remove.tsx +55 -0
  163. package/src/components/project-select.tsx +200 -0
  164. package/src/components/project-show.tsx +58 -0
  165. package/src/components/resource-clear.tsx +127 -0
  166. package/src/components/resource-delete.tsx +160 -0
  167. package/src/components/resource-list.tsx +177 -0
  168. package/src/components/resource-sync.tsx +170 -0
  169. package/src/components/resource-types.tsx +55 -0
  170. package/src/components/resource-upload.tsx +182 -0
  171. package/src/components/schedule-create.tsx +90 -0
  172. package/src/components/schedule-delete.tsx +116 -0
  173. package/src/components/schedule-list.tsx +186 -0
  174. package/src/components/schedule-runs.tsx +151 -0
  175. package/src/components/secret-bulk.tsx +79 -0
  176. package/src/components/secret-create.tsx +49 -0
  177. package/src/components/secret-delete.tsx +41 -0
  178. package/src/components/secret-list.tsx +41 -0
  179. package/src/components/watch.tsx +155 -0
  180. package/src/hooks/useApi.ts +183 -0
  181. package/src/positronic.ts +40 -0
  182. package/src/test/data/resources/config.json +1 -0
  183. package/src/test/data/resources/data/config.json +1 -0
  184. package/src/test/data/resources/data/logo.png +2 -0
  185. package/src/test/data/resources/docs/api.md +3 -0
  186. package/src/test/data/resources/docs/readme.md +3 -0
  187. package/src/test/data/resources/example.md +3 -0
  188. package/src/test/data/resources/file with spaces.txt +1 -0
  189. package/src/test/data/resources/readme.md +3 -0
  190. package/src/test/data/resources/test.txt +1 -0
  191. package/src/test/mock-api-client.ts +145 -0
  192. package/src/test/test-dev-server.ts +1003 -0
  193. package/tsconfig.json +11 -0
@@ -0,0 +1,761 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _async_to_generator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ function _ts_generator(thisArg, body) {
31
+ var f, y, t, _ = {
32
+ label: 0,
33
+ sent: function() {
34
+ if (t[0] & 1) throw t[1];
35
+ return t[1];
36
+ },
37
+ trys: [],
38
+ ops: []
39
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
40
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
41
+ return this;
42
+ }), g;
43
+ function verb(n) {
44
+ return function(v) {
45
+ return step([
46
+ n,
47
+ v
48
+ ]);
49
+ };
50
+ }
51
+ function step(op) {
52
+ if (f) throw new TypeError("Generator is already executing.");
53
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
54
+ 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;
55
+ if (y = 0, t) op = [
56
+ op[0] & 2,
57
+ t.value
58
+ ];
59
+ switch(op[0]){
60
+ case 0:
61
+ case 1:
62
+ t = op;
63
+ break;
64
+ case 4:
65
+ _.label++;
66
+ return {
67
+ value: op[1],
68
+ done: false
69
+ };
70
+ case 5:
71
+ _.label++;
72
+ y = op[1];
73
+ op = [
74
+ 0
75
+ ];
76
+ continue;
77
+ case 7:
78
+ op = _.ops.pop();
79
+ _.trys.pop();
80
+ continue;
81
+ default:
82
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
83
+ _ = 0;
84
+ continue;
85
+ }
86
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
87
+ _.label = op[1];
88
+ break;
89
+ }
90
+ if (op[0] === 6 && _.label < t[1]) {
91
+ _.label = t[1];
92
+ t = op;
93
+ break;
94
+ }
95
+ if (t && _.label < t[2]) {
96
+ _.label = t[2];
97
+ _.ops.push(op);
98
+ break;
99
+ }
100
+ if (t[2]) _.ops.pop();
101
+ _.trys.pop();
102
+ continue;
103
+ }
104
+ op = body.call(thisArg, _);
105
+ } catch (e) {
106
+ op = [
107
+ 6,
108
+ e
109
+ ];
110
+ y = 0;
111
+ } finally{
112
+ f = t = 0;
113
+ }
114
+ if (op[0] & 5) throw op[1];
115
+ return {
116
+ value: op[0] ? op[1] : void 0,
117
+ done: true
118
+ };
119
+ }
120
+ }
121
+ import { describe, it, expect } from '@jest/globals';
122
+ import { createTestEnv } from './test-utils.js';
123
+ import * as fs from 'fs';
124
+ import * as path from 'path';
125
+ describe('secret commands', function() {
126
+ describe('secret create', function() {
127
+ it('should pass through to backend', function() {
128
+ return _async_to_generator(function() {
129
+ var env, px;
130
+ return _ts_generator(this, function(_state) {
131
+ switch(_state.label){
132
+ case 0:
133
+ return [
134
+ 4,
135
+ createTestEnv()
136
+ ];
137
+ case 1:
138
+ env = _state.sent();
139
+ return [
140
+ 4,
141
+ env.start()
142
+ ];
143
+ case 2:
144
+ px = _state.sent();
145
+ _state.label = 3;
146
+ case 3:
147
+ _state.trys.push([
148
+ 3,
149
+ ,
150
+ 5,
151
+ 7
152
+ ]);
153
+ // Just verify it runs without error
154
+ return [
155
+ 4,
156
+ px([
157
+ 'secret',
158
+ 'create',
159
+ 'TEST_SECRET',
160
+ '--value=test-value'
161
+ ])
162
+ ];
163
+ case 4:
164
+ _state.sent();
165
+ return [
166
+ 3,
167
+ 7
168
+ ];
169
+ case 5:
170
+ return [
171
+ 4,
172
+ env.stopAndCleanup()
173
+ ];
174
+ case 6:
175
+ _state.sent();
176
+ return [
177
+ 7
178
+ ];
179
+ case 7:
180
+ return [
181
+ 2
182
+ ];
183
+ }
184
+ });
185
+ })();
186
+ });
187
+ });
188
+ describe('secret list', function() {
189
+ it('should pass through to backend', function() {
190
+ return _async_to_generator(function() {
191
+ var env, px;
192
+ return _ts_generator(this, function(_state) {
193
+ switch(_state.label){
194
+ case 0:
195
+ return [
196
+ 4,
197
+ createTestEnv()
198
+ ];
199
+ case 1:
200
+ env = _state.sent();
201
+ return [
202
+ 4,
203
+ env.start()
204
+ ];
205
+ case 2:
206
+ px = _state.sent();
207
+ _state.label = 3;
208
+ case 3:
209
+ _state.trys.push([
210
+ 3,
211
+ ,
212
+ 5,
213
+ 7
214
+ ]);
215
+ // Just verify it runs without error
216
+ return [
217
+ 4,
218
+ px([
219
+ 'secret',
220
+ 'list'
221
+ ])
222
+ ];
223
+ case 4:
224
+ _state.sent();
225
+ return [
226
+ 3,
227
+ 7
228
+ ];
229
+ case 5:
230
+ return [
231
+ 4,
232
+ env.stopAndCleanup()
233
+ ];
234
+ case 6:
235
+ _state.sent();
236
+ return [
237
+ 7
238
+ ];
239
+ case 7:
240
+ return [
241
+ 2
242
+ ];
243
+ }
244
+ });
245
+ })();
246
+ });
247
+ });
248
+ describe('secret delete', function() {
249
+ it('should pass through to backend', function() {
250
+ return _async_to_generator(function() {
251
+ var env, px;
252
+ return _ts_generator(this, function(_state) {
253
+ switch(_state.label){
254
+ case 0:
255
+ return [
256
+ 4,
257
+ createTestEnv()
258
+ ];
259
+ case 1:
260
+ env = _state.sent();
261
+ return [
262
+ 4,
263
+ env.start()
264
+ ];
265
+ case 2:
266
+ px = _state.sent();
267
+ _state.label = 3;
268
+ case 3:
269
+ _state.trys.push([
270
+ 3,
271
+ ,
272
+ 5,
273
+ 7
274
+ ]);
275
+ // Just verify it runs without error
276
+ return [
277
+ 4,
278
+ px([
279
+ 'secret',
280
+ 'delete',
281
+ 'TEST_SECRET'
282
+ ])
283
+ ];
284
+ case 4:
285
+ _state.sent();
286
+ return [
287
+ 3,
288
+ 7
289
+ ];
290
+ case 5:
291
+ return [
292
+ 4,
293
+ env.stopAndCleanup()
294
+ ];
295
+ case 6:
296
+ _state.sent();
297
+ return [
298
+ 7
299
+ ];
300
+ case 7:
301
+ return [
302
+ 2
303
+ ];
304
+ }
305
+ });
306
+ })();
307
+ });
308
+ });
309
+ describe('secret bulk', function() {
310
+ it('should bulk upload secrets from .env file', function() {
311
+ return _async_to_generator(function() {
312
+ var env, px, _ref, waitForOutput, instance, calls, bulkCall, secrets, secretNames;
313
+ return _ts_generator(this, function(_state) {
314
+ switch(_state.label){
315
+ case 0:
316
+ return [
317
+ 4,
318
+ createTestEnv()
319
+ ];
320
+ case 1:
321
+ env = _state.sent();
322
+ // Create a test .env file
323
+ env.setup(function(dir) {
324
+ var envContent = "TEST_API_KEY=sk-test123\nTEST_DATABASE_URL=postgres://user:pass@localhost:5432/db\nTEST_REDIS_URL=redis://localhost:6379";
325
+ fs.writeFileSync(path.join(dir, '.env'), envContent);
326
+ });
327
+ return [
328
+ 4,
329
+ env.start()
330
+ ];
331
+ case 2:
332
+ px = _state.sent();
333
+ _state.label = 3;
334
+ case 3:
335
+ _state.trys.push([
336
+ 3,
337
+ ,
338
+ 6,
339
+ 8
340
+ ]);
341
+ return [
342
+ 4,
343
+ px([
344
+ 'secret',
345
+ 'bulk'
346
+ ])
347
+ ];
348
+ case 4:
349
+ _ref = _state.sent(), waitForOutput = _ref.waitForOutput, instance = _ref.instance;
350
+ // Since bulk command passes through to backend,
351
+ // we can't check for output. Just wait a bit for completion.
352
+ return [
353
+ 4,
354
+ new Promise(function(resolve) {
355
+ return setTimeout(resolve, 100);
356
+ })
357
+ ];
358
+ case 5:
359
+ _state.sent();
360
+ // Verify server method was called
361
+ calls = env.server.getLogs();
362
+ bulkCall = calls.find(function(c) {
363
+ return c.method === 'bulkSecrets';
364
+ });
365
+ expect(bulkCall).toBeDefined();
366
+ // Verify the server received the correct secret names
367
+ secrets = env.server.getSecrets();
368
+ expect(secrets.length).toBe(3);
369
+ secretNames = secrets.map(function(s) {
370
+ return s.name;
371
+ });
372
+ expect(secretNames).toContain('TEST_API_KEY');
373
+ expect(secretNames).toContain('TEST_DATABASE_URL');
374
+ expect(secretNames).toContain('TEST_REDIS_URL');
375
+ return [
376
+ 3,
377
+ 8
378
+ ];
379
+ case 6:
380
+ return [
381
+ 4,
382
+ env.stopAndCleanup()
383
+ ];
384
+ case 7:
385
+ _state.sent();
386
+ return [
387
+ 7
388
+ ];
389
+ case 8:
390
+ return [
391
+ 2
392
+ ];
393
+ }
394
+ });
395
+ })();
396
+ });
397
+ it('should handle custom .env file path', function() {
398
+ return _async_to_generator(function() {
399
+ var env, px, secrets, secretNames;
400
+ return _ts_generator(this, function(_state) {
401
+ switch(_state.label){
402
+ case 0:
403
+ return [
404
+ 4,
405
+ createTestEnv()
406
+ ];
407
+ case 1:
408
+ env = _state.sent();
409
+ env.setup(function(dir) {
410
+ var envContent = "SECRET_KEY=my-secret-key\nAPI_TOKEN=token123";
411
+ fs.writeFileSync(path.join(dir, '.env.production'), envContent);
412
+ });
413
+ return [
414
+ 4,
415
+ env.start()
416
+ ];
417
+ case 2:
418
+ px = _state.sent();
419
+ _state.label = 3;
420
+ case 3:
421
+ _state.trys.push([
422
+ 3,
423
+ ,
424
+ 6,
425
+ 8
426
+ ]);
427
+ return [
428
+ 4,
429
+ px([
430
+ 'secret',
431
+ 'bulk',
432
+ '.env.production'
433
+ ])
434
+ ];
435
+ case 4:
436
+ _state.sent();
437
+ // Since bulk command passes through to backend,
438
+ // we can't check for output. Just wait a bit for completion.
439
+ return [
440
+ 4,
441
+ new Promise(function(resolve) {
442
+ return setTimeout(resolve, 100);
443
+ })
444
+ ];
445
+ case 5:
446
+ _state.sent();
447
+ // Verify the server received the correct secret names
448
+ secrets = env.server.getSecrets();
449
+ expect(secrets.length).toBe(2);
450
+ secretNames = secrets.map(function(s) {
451
+ return s.name;
452
+ });
453
+ expect(secretNames).toContain('SECRET_KEY');
454
+ expect(secretNames).toContain('API_TOKEN');
455
+ return [
456
+ 3,
457
+ 8
458
+ ];
459
+ case 6:
460
+ return [
461
+ 4,
462
+ env.stopAndCleanup()
463
+ ];
464
+ case 7:
465
+ _state.sent();
466
+ return [
467
+ 7
468
+ ];
469
+ case 8:
470
+ return [
471
+ 2
472
+ ];
473
+ }
474
+ });
475
+ })();
476
+ });
477
+ it('should handle successful bulk upload', function() {
478
+ return _async_to_generator(function() {
479
+ var env, px, calls, bulkCall;
480
+ return _ts_generator(this, function(_state) {
481
+ switch(_state.label){
482
+ case 0:
483
+ return [
484
+ 4,
485
+ createTestEnv()
486
+ ];
487
+ case 1:
488
+ env = _state.sent();
489
+ env.setup(function(dir) {
490
+ var envContent = "KEY1=value1\nKEY2=value2\nKEY3=value3";
491
+ fs.writeFileSync(path.join(dir, '.env'), envContent);
492
+ });
493
+ return [
494
+ 4,
495
+ env.start()
496
+ ];
497
+ case 2:
498
+ px = _state.sent();
499
+ _state.label = 3;
500
+ case 3:
501
+ _state.trys.push([
502
+ 3,
503
+ ,
504
+ 6,
505
+ 8
506
+ ]);
507
+ return [
508
+ 4,
509
+ px([
510
+ 'secret',
511
+ 'bulk'
512
+ ])
513
+ ];
514
+ case 4:
515
+ _state.sent();
516
+ // Since bulk command passes through to backend,
517
+ // we can't check for output. Just wait a bit for completion.
518
+ return [
519
+ 4,
520
+ new Promise(function(resolve) {
521
+ return setTimeout(resolve, 100);
522
+ })
523
+ ];
524
+ case 5:
525
+ _state.sent();
526
+ // Verify bulkSecrets was called
527
+ calls = env.server.getLogs();
528
+ bulkCall = calls.find(function(c) {
529
+ return c.method === 'bulkSecrets';
530
+ });
531
+ expect(bulkCall).toBeDefined();
532
+ return [
533
+ 3,
534
+ 8
535
+ ];
536
+ case 6:
537
+ return [
538
+ 4,
539
+ env.stopAndCleanup()
540
+ ];
541
+ case 7:
542
+ _state.sent();
543
+ return [
544
+ 7
545
+ ];
546
+ case 8:
547
+ return [
548
+ 2
549
+ ];
550
+ }
551
+ });
552
+ })();
553
+ });
554
+ it('should handle file not found error', function() {
555
+ return _async_to_generator(function() {
556
+ var env, px, waitForOutput, foundError;
557
+ return _ts_generator(this, function(_state) {
558
+ switch(_state.label){
559
+ case 0:
560
+ return [
561
+ 4,
562
+ createTestEnv()
563
+ ];
564
+ case 1:
565
+ env = _state.sent();
566
+ return [
567
+ 4,
568
+ env.start()
569
+ ];
570
+ case 2:
571
+ px = _state.sent();
572
+ _state.label = 3;
573
+ case 3:
574
+ _state.trys.push([
575
+ 3,
576
+ ,
577
+ 6,
578
+ 8
579
+ ]);
580
+ return [
581
+ 4,
582
+ px([
583
+ 'secret',
584
+ 'bulk',
585
+ 'nonexistent.env'
586
+ ])
587
+ ];
588
+ case 4:
589
+ waitForOutput = _state.sent().waitForOutput;
590
+ return [
591
+ 4,
592
+ waitForOutput(/No .env file found/i, 30)
593
+ ];
594
+ case 5:
595
+ foundError = _state.sent();
596
+ expect(foundError).toBe(true);
597
+ return [
598
+ 3,
599
+ 8
600
+ ];
601
+ case 6:
602
+ return [
603
+ 4,
604
+ env.stopAndCleanup()
605
+ ];
606
+ case 7:
607
+ _state.sent();
608
+ return [
609
+ 7
610
+ ];
611
+ case 8:
612
+ return [
613
+ 2
614
+ ];
615
+ }
616
+ });
617
+ })();
618
+ });
619
+ it('should handle empty .env file', function() {
620
+ return _async_to_generator(function() {
621
+ var env, px, waitForOutput, foundError;
622
+ return _ts_generator(this, function(_state) {
623
+ switch(_state.label){
624
+ case 0:
625
+ return [
626
+ 4,
627
+ createTestEnv()
628
+ ];
629
+ case 1:
630
+ env = _state.sent();
631
+ env.setup(function(dir) {
632
+ // Create empty .env file
633
+ fs.writeFileSync(path.join(dir, '.env'), '');
634
+ });
635
+ return [
636
+ 4,
637
+ env.start()
638
+ ];
639
+ case 2:
640
+ px = _state.sent();
641
+ _state.label = 3;
642
+ case 3:
643
+ _state.trys.push([
644
+ 3,
645
+ ,
646
+ 6,
647
+ 8
648
+ ]);
649
+ return [
650
+ 4,
651
+ px([
652
+ 'secret',
653
+ 'bulk'
654
+ ])
655
+ ];
656
+ case 4:
657
+ waitForOutput = _state.sent().waitForOutput;
658
+ return [
659
+ 4,
660
+ waitForOutput(/No secrets found in the .env file/i, 30)
661
+ ];
662
+ case 5:
663
+ foundError = _state.sent();
664
+ expect(foundError).toBe(true);
665
+ return [
666
+ 3,
667
+ 8
668
+ ];
669
+ case 6:
670
+ return [
671
+ 4,
672
+ env.stopAndCleanup()
673
+ ];
674
+ case 7:
675
+ _state.sent();
676
+ return [
677
+ 7
678
+ ];
679
+ case 8:
680
+ return [
681
+ 2
682
+ ];
683
+ }
684
+ });
685
+ })();
686
+ });
687
+ it('should handle mixed create/update results', function() {
688
+ return _async_to_generator(function() {
689
+ var env, px, waitForOutput;
690
+ return _ts_generator(this, function(_state) {
691
+ switch(_state.label){
692
+ case 0:
693
+ return [
694
+ 4,
695
+ createTestEnv()
696
+ ];
697
+ case 1:
698
+ env = _state.sent();
699
+ // Pre-create a secret so we can test update behavior
700
+ env.server.addSecret('EXISTING_KEY', 'old-value');
701
+ env.setup(function(dir) {
702
+ var envContent = "NEW_KEY=new-value\nEXISTING_KEY=updated-value";
703
+ fs.writeFileSync(path.join(dir, '.env'), envContent);
704
+ });
705
+ return [
706
+ 4,
707
+ env.start()
708
+ ];
709
+ case 2:
710
+ px = _state.sent();
711
+ _state.label = 3;
712
+ case 3:
713
+ _state.trys.push([
714
+ 3,
715
+ ,
716
+ 6,
717
+ 8
718
+ ]);
719
+ return [
720
+ 4,
721
+ px([
722
+ 'secret',
723
+ 'bulk'
724
+ ])
725
+ ];
726
+ case 4:
727
+ waitForOutput = _state.sent().waitForOutput;
728
+ // Since bulk command passes through to backend,
729
+ // we can't check for output. Just wait a bit for completion.
730
+ return [
731
+ 4,
732
+ new Promise(function(resolve) {
733
+ return setTimeout(resolve, 100);
734
+ })
735
+ ];
736
+ case 5:
737
+ _state.sent();
738
+ return [
739
+ 3,
740
+ 8
741
+ ];
742
+ case 6:
743
+ return [
744
+ 4,
745
+ env.stopAndCleanup()
746
+ ];
747
+ case 7:
748
+ _state.sent();
749
+ return [
750
+ 7
751
+ ];
752
+ case 8:
753
+ return [
754
+ 2
755
+ ];
756
+ }
757
+ });
758
+ })();
759
+ });
760
+ });
761
+ });