@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,737 @@
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 _class_call_check(instance, Constructor) {
31
+ if (!(instance instanceof Constructor)) {
32
+ throw new TypeError("Cannot call a class as a function");
33
+ }
34
+ }
35
+ function _defineProperties(target, props) {
36
+ for(var i = 0; i < props.length; i++){
37
+ var descriptor = props[i];
38
+ descriptor.enumerable = descriptor.enumerable || false;
39
+ descriptor.configurable = true;
40
+ if ("value" in descriptor) descriptor.writable = true;
41
+ Object.defineProperty(target, descriptor.key, descriptor);
42
+ }
43
+ }
44
+ function _create_class(Constructor, protoProps, staticProps) {
45
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
46
+ if (staticProps) _defineProperties(Constructor, staticProps);
47
+ return Constructor;
48
+ }
49
+ function _define_property(obj, key, value) {
50
+ if (key in obj) {
51
+ Object.defineProperty(obj, key, {
52
+ value: value,
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true
56
+ });
57
+ } else {
58
+ obj[key] = value;
59
+ }
60
+ return obj;
61
+ }
62
+ function _type_of(obj) {
63
+ "@swc/helpers - typeof";
64
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
65
+ }
66
+ function _ts_generator(thisArg, body) {
67
+ var f, y, t, _ = {
68
+ label: 0,
69
+ sent: function() {
70
+ if (t[0] & 1) throw t[1];
71
+ return t[1];
72
+ },
73
+ trys: [],
74
+ ops: []
75
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
76
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
77
+ return this;
78
+ }), g;
79
+ function verb(n) {
80
+ return function(v) {
81
+ return step([
82
+ n,
83
+ v
84
+ ]);
85
+ };
86
+ }
87
+ function step(op) {
88
+ if (f) throw new TypeError("Generator is already executing.");
89
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
90
+ 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;
91
+ if (y = 0, t) op = [
92
+ op[0] & 2,
93
+ t.value
94
+ ];
95
+ switch(op[0]){
96
+ case 0:
97
+ case 1:
98
+ t = op;
99
+ break;
100
+ case 4:
101
+ _.label++;
102
+ return {
103
+ value: op[1],
104
+ done: false
105
+ };
106
+ case 5:
107
+ _.label++;
108
+ y = op[1];
109
+ op = [
110
+ 0
111
+ ];
112
+ continue;
113
+ case 7:
114
+ op = _.ops.pop();
115
+ _.trys.pop();
116
+ continue;
117
+ default:
118
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
119
+ _ = 0;
120
+ continue;
121
+ }
122
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
123
+ _.label = op[1];
124
+ break;
125
+ }
126
+ if (op[0] === 6 && _.label < t[1]) {
127
+ _.label = t[1];
128
+ t = op;
129
+ break;
130
+ }
131
+ if (t && _.label < t[2]) {
132
+ _.label = t[2];
133
+ _.ops.push(op);
134
+ break;
135
+ }
136
+ if (t[2]) _.ops.pop();
137
+ _.trys.pop();
138
+ continue;
139
+ }
140
+ op = body.call(thisArg, _);
141
+ } catch (e) {
142
+ op = [
143
+ 6,
144
+ e
145
+ ];
146
+ y = 0;
147
+ } finally{
148
+ f = t = 0;
149
+ }
150
+ if (op[0] & 5) throw op[1];
151
+ return {
152
+ value: op[0] ? op[1] : void 0,
153
+ done: true
154
+ };
155
+ }
156
+ }
157
+ function _ts_values(o) {
158
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
159
+ if (m) return m.call(o);
160
+ if (o && typeof o.length === "number") return {
161
+ next: function() {
162
+ if (o && i >= o.length) o = void 0;
163
+ return {
164
+ value: o && o[i++],
165
+ done: !o
166
+ };
167
+ }
168
+ };
169
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
170
+ }
171
+ import React from 'react';
172
+ import { render } from 'ink-testing-library';
173
+ import * as fs from 'fs';
174
+ import * as path from 'path';
175
+ import * as os from 'os';
176
+ import { fileURLToPath } from 'url';
177
+ import process from 'process';
178
+ import { TestDevServer } from '../test/test-dev-server.js';
179
+ import { buildCli } from '../cli.js';
180
+ import caz from 'caz';
181
+ var __filename = fileURLToPath(import.meta.url);
182
+ var __dirname = path.dirname(__filename);
183
+ // Singleton cache for the template to avoid repeated npm installs
184
+ // This is shared across all tests in a test run and should NOT be deleted
185
+ // by individual test cleanup. It's cleaned up automatically when the process exits.
186
+ var cachedTemplatePath = null;
187
+ function getCachedTemplate() {
188
+ return _async_to_generator(function() {
189
+ var devPath, originalTemplate, tempCopyDir, cazOptions, originalStdoutWrite, originalStderrWrite, originalConsoleLog, originalConsoleError;
190
+ return _ts_generator(this, function(_state) {
191
+ switch(_state.label){
192
+ case 0:
193
+ // Check if cached template exists and is valid
194
+ if (cachedTemplatePath && fs.existsSync(cachedTemplatePath)) {
195
+ return [
196
+ 2,
197
+ cachedTemplatePath
198
+ ];
199
+ }
200
+ // Create cache only once per test run
201
+ devPath = path.resolve(__dirname, '../../../');
202
+ originalTemplate = path.resolve(devPath, 'template-new-project');
203
+ // First, copy template to temp location so caz can mess with that copy
204
+ tempCopyDir = fs.mkdtempSync(path.join(os.tmpdir(), 'positronic-template-copy-'));
205
+ fs.cpSync(originalTemplate, tempCopyDir, {
206
+ recursive: true
207
+ });
208
+ // Now generate the actual cached template in another temp directory
209
+ cachedTemplatePath = fs.mkdtempSync(path.join(os.tmpdir(), 'positronic-cached-template-'));
210
+ // Run caz once to generate a clean template
211
+ cazOptions = {
212
+ name: 'test-project',
213
+ backend: 'none',
214
+ install: false,
215
+ claudemd: false,
216
+ force: true
217
+ };
218
+ // Temporarily hijack all output streams to suppress caz output
219
+ originalStdoutWrite = process.stdout.write;
220
+ originalStderrWrite = process.stderr.write;
221
+ originalConsoleLog = console.log;
222
+ originalConsoleError = console.error;
223
+ process.stdout.write = function() {
224
+ return true;
225
+ };
226
+ process.stderr.write = function() {
227
+ return true;
228
+ };
229
+ console.log = function() {};
230
+ console.error = function() {};
231
+ _state.label = 1;
232
+ case 1:
233
+ _state.trys.push([
234
+ 1,
235
+ ,
236
+ 3,
237
+ 4
238
+ ]);
239
+ return [
240
+ 4,
241
+ caz.default(tempCopyDir, cachedTemplatePath, cazOptions)
242
+ ];
243
+ case 2:
244
+ _state.sent();
245
+ return [
246
+ 3,
247
+ 4
248
+ ];
249
+ case 3:
250
+ // Restore original output streams
251
+ process.stdout.write = originalStdoutWrite;
252
+ process.stderr.write = originalStderrWrite;
253
+ console.log = originalConsoleLog;
254
+ console.error = originalConsoleError;
255
+ return [
256
+ 7
257
+ ];
258
+ case 4:
259
+ // Clean up the temp copy directory
260
+ fs.rmSync(tempCopyDir, {
261
+ recursive: true,
262
+ force: true
263
+ });
264
+ return [
265
+ 2,
266
+ cachedTemplatePath
267
+ ];
268
+ }
269
+ });
270
+ })();
271
+ }
272
+ // Helper function to copy test resources from test data directory
273
+ function copyTestResources(targetDir) {
274
+ var testDataPath = path.join(__dirname, '../test/data/resources');
275
+ var targetResourcesPath = path.join(targetDir, 'resources');
276
+ // Remove existing resources directory if it exists
277
+ if (fs.existsSync(targetResourcesPath)) {
278
+ fs.rmSync(targetResourcesPath, {
279
+ recursive: true,
280
+ force: true
281
+ });
282
+ }
283
+ // Copy the test data resources
284
+ fs.cpSync(testDataPath, targetResourcesPath, {
285
+ recursive: true
286
+ });
287
+ }
288
+ // Helper function to create a minimal Positronic project structure
289
+ export function createMinimalProject(dir) {
290
+ return _async_to_generator(function() {
291
+ var cachedTemplate, configPath, config;
292
+ return _ts_generator(this, function(_state) {
293
+ switch(_state.label){
294
+ case 0:
295
+ return [
296
+ 4,
297
+ getCachedTemplate()
298
+ ];
299
+ case 1:
300
+ cachedTemplate = _state.sent();
301
+ // Copy the cached template to the target directory
302
+ fs.cpSync(cachedTemplate, dir, {
303
+ recursive: true
304
+ });
305
+ copyTestResources(dir);
306
+ // Update positronic.config.json with the correct project name if it exists
307
+ configPath = path.join(dir, 'positronic.config.json');
308
+ if (fs.existsSync(configPath)) {
309
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
310
+ config.name = 'test-project';
311
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
312
+ }
313
+ return [
314
+ 2
315
+ ];
316
+ }
317
+ });
318
+ })();
319
+ }
320
+ export var TestEnv = /*#__PURE__*/ function() {
321
+ "use strict";
322
+ function TestEnv(server) {
323
+ _class_call_check(this, TestEnv);
324
+ _define_property(this, "server", void 0);
325
+ _define_property(this, "serverHandle", void 0);
326
+ this.server = server;
327
+ this.serverHandle = null;
328
+ }
329
+ _create_class(TestEnv, [
330
+ {
331
+ key: "projectRootDir",
332
+ get: function get() {
333
+ return this.server.projectRootDir;
334
+ }
335
+ },
336
+ {
337
+ key: "setup",
338
+ value: function setup(setup) {
339
+ setup(this.projectRootDir);
340
+ return this;
341
+ }
342
+ },
343
+ {
344
+ key: "start",
345
+ value: function start() {
346
+ return _async_to_generator(function() {
347
+ var _this, _;
348
+ return _ts_generator(this, function(_state) {
349
+ switch(_state.label){
350
+ case 0:
351
+ _this = this;
352
+ if (this.serverHandle) {
353
+ throw new Error('Server already started');
354
+ }
355
+ _ = this;
356
+ return [
357
+ 4,
358
+ this.server.start()
359
+ ];
360
+ case 1:
361
+ _.serverHandle = _state.sent();
362
+ return [
363
+ 2,
364
+ function(argv) {
365
+ return _async_to_generator(function() {
366
+ return _ts_generator(this, function(_state) {
367
+ if (!this.serverHandle) {
368
+ throw new Error('Server not started');
369
+ }
370
+ return [
371
+ 2,
372
+ px(argv, {
373
+ server: this.server,
374
+ projectRootDir: this.projectRootDir
375
+ })
376
+ ];
377
+ });
378
+ }).call(_this);
379
+ }
380
+ ];
381
+ }
382
+ });
383
+ }).call(this);
384
+ }
385
+ },
386
+ {
387
+ key: "cleanup",
388
+ value: function cleanup() {
389
+ fs.rmSync(this.projectRootDir, {
390
+ recursive: true,
391
+ force: true
392
+ });
393
+ }
394
+ },
395
+ {
396
+ key: "stop",
397
+ value: function stop() {
398
+ return _async_to_generator(function() {
399
+ return _ts_generator(this, function(_state) {
400
+ switch(_state.label){
401
+ case 0:
402
+ if (!this.serverHandle) {
403
+ throw new Error('Server not started');
404
+ }
405
+ this.serverHandle.kill();
406
+ this.serverHandle = null;
407
+ return [
408
+ 4,
409
+ this.server.stop()
410
+ ];
411
+ case 1:
412
+ _state.sent();
413
+ return [
414
+ 2
415
+ ];
416
+ }
417
+ });
418
+ }).call(this);
419
+ }
420
+ },
421
+ {
422
+ key: "stopAndCleanup",
423
+ value: function stopAndCleanup() {
424
+ return _async_to_generator(function() {
425
+ return _ts_generator(this, function(_state) {
426
+ switch(_state.label){
427
+ case 0:
428
+ return [
429
+ 4,
430
+ this.stop()
431
+ ];
432
+ case 1:
433
+ _state.sent();
434
+ this.cleanup();
435
+ return [
436
+ 2
437
+ ];
438
+ }
439
+ });
440
+ }).call(this);
441
+ }
442
+ }
443
+ ]);
444
+ return TestEnv;
445
+ }();
446
+ export function createTestEnv() {
447
+ return _async_to_generator(function() {
448
+ var tempDir, devServer;
449
+ return _ts_generator(this, function(_state) {
450
+ switch(_state.label){
451
+ case 0:
452
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'positronic-server-test-'));
453
+ return [
454
+ 4,
455
+ createMinimalProject(tempDir)
456
+ ];
457
+ case 1:
458
+ _state.sent();
459
+ // Create test dev server instance
460
+ devServer = new TestDevServer(tempDir);
461
+ return [
462
+ 2,
463
+ new TestEnv(devServer)
464
+ ];
465
+ }
466
+ });
467
+ })();
468
+ }
469
+ // Helper function to wait for types file to contain specific content
470
+ export function waitForTypesFile(typesPath, expectedContent) {
471
+ var maxWaitMs = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 5000;
472
+ return _async_to_generator(function() {
473
+ var _loop, startTime, contentToCheck, _ret;
474
+ return _ts_generator(this, function(_state) {
475
+ switch(_state.label){
476
+ case 0:
477
+ _loop = function() {
478
+ var content;
479
+ return _ts_generator(this, function(_state) {
480
+ switch(_state.label){
481
+ case 0:
482
+ if (fs.existsSync(typesPath)) {
483
+ content = fs.readFileSync(typesPath, 'utf-8');
484
+ // Check if all expected content is present
485
+ if (contentToCheck.every(function(expected) {
486
+ return content.includes(expected);
487
+ })) {
488
+ return [
489
+ 2,
490
+ {
491
+ v: content
492
+ }
493
+ ];
494
+ }
495
+ }
496
+ return [
497
+ 4,
498
+ new Promise(function(resolve) {
499
+ return setTimeout(resolve, 100);
500
+ })
501
+ ];
502
+ case 1:
503
+ _state.sent();
504
+ return [
505
+ 2
506
+ ];
507
+ }
508
+ });
509
+ };
510
+ startTime = Date.now();
511
+ contentToCheck = Array.isArray(expectedContent) ? expectedContent : [
512
+ expectedContent
513
+ ];
514
+ _state.label = 1;
515
+ case 1:
516
+ if (!(Date.now() - startTime < maxWaitMs)) return [
517
+ 3,
518
+ 3
519
+ ];
520
+ return [
521
+ 5,
522
+ _ts_values(_loop())
523
+ ];
524
+ case 2:
525
+ _ret = _state.sent();
526
+ if (_type_of(_ret) === "object") return [
527
+ 2,
528
+ _ret.v
529
+ ];
530
+ return [
531
+ 3,
532
+ 1
533
+ ];
534
+ case 3:
535
+ return [
536
+ 2,
537
+ ''
538
+ ];
539
+ }
540
+ });
541
+ })();
542
+ }
543
+ export function px(_0) {
544
+ return _async_to_generator(function(argv) {
545
+ var options, server, projectRootDir, configDir, instance;
546
+ var _arguments = arguments;
547
+ return _ts_generator(this, function(_state) {
548
+ switch(_state.label){
549
+ case 0:
550
+ options = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
551
+ server = options.server, projectRootDir = options.projectRootDir, configDir = options.configDir;
552
+ instance = null;
553
+ return [
554
+ 4,
555
+ runCli(argv, {
556
+ server: server,
557
+ configDir: configDir
558
+ })
559
+ ];
560
+ case 1:
561
+ instance = _state.sent();
562
+ // const { lastFrame, rerender, unmount, frames, stdin, stdout, stderr } = instance!;
563
+ return [
564
+ 2,
565
+ {
566
+ waitForOutput: function(regex) {
567
+ var maxTries = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 10;
568
+ return _async_to_generator(function() {
569
+ var tries, _instance_lastFrame, lastFrame;
570
+ return _ts_generator(this, function(_state) {
571
+ switch(_state.label){
572
+ case 0:
573
+ if (!instance && !regex) {
574
+ return [
575
+ 2,
576
+ true
577
+ ];
578
+ }
579
+ if (!instance && regex) {
580
+ console.error('waitForOutput failed, instance is null');
581
+ return [
582
+ 2,
583
+ false
584
+ ];
585
+ }
586
+ tries = 0;
587
+ _state.label = 1;
588
+ case 1:
589
+ if (!(tries < maxTries)) return [
590
+ 3,
591
+ 3
592
+ ];
593
+ lastFrame = (_instance_lastFrame = instance.lastFrame()) !== null && _instance_lastFrame !== void 0 ? _instance_lastFrame : '';
594
+ if (regex.test(lastFrame)) {
595
+ return [
596
+ 2,
597
+ true
598
+ ];
599
+ }
600
+ return [
601
+ 4,
602
+ new Promise(function(resolve) {
603
+ return setTimeout(resolve, 10);
604
+ })
605
+ ];
606
+ case 2:
607
+ _state.sent();
608
+ tries++;
609
+ return [
610
+ 3,
611
+ 1
612
+ ];
613
+ case 3:
614
+ console.error('waitForOutput failed, last frame:', instance.lastFrame());
615
+ return [
616
+ 2,
617
+ false
618
+ ];
619
+ }
620
+ });
621
+ })();
622
+ },
623
+ waitForTypesFile: function(types) {
624
+ return _async_to_generator(function() {
625
+ var typesPath;
626
+ return _ts_generator(this, function(_state) {
627
+ if (projectRootDir) {
628
+ typesPath = path.join(projectRootDir, 'resources.d.ts');
629
+ return [
630
+ 2,
631
+ waitForTypesFile(typesPath, types, 1000)
632
+ ];
633
+ }
634
+ console.warn("waitForTypesFile didn't wait for anything, projectRootDir is not set");
635
+ return [
636
+ 2,
637
+ ''
638
+ ];
639
+ });
640
+ })();
641
+ },
642
+ instance: instance ? {
643
+ lastFrame: instance.lastFrame,
644
+ rerender: instance.rerender,
645
+ unmount: instance.unmount,
646
+ frames: instance.frames,
647
+ stdin: instance.stdin,
648
+ stdout: instance.stdout,
649
+ stderr: instance.stderr
650
+ } : {
651
+ lastFrame: function() {
652
+ return undefined;
653
+ },
654
+ rerender: function() {},
655
+ unmount: function() {},
656
+ frames: [],
657
+ stdin: {
658
+ write: function() {}
659
+ },
660
+ stdout: {
661
+ lastFrame: function() {
662
+ return undefined;
663
+ },
664
+ frames: []
665
+ },
666
+ stderr: {
667
+ lastFrame: function() {
668
+ return undefined;
669
+ },
670
+ frames: []
671
+ }
672
+ }
673
+ }
674
+ ];
675
+ }
676
+ });
677
+ }).apply(this, arguments);
678
+ }
679
+ // Helper function to test CLI commands with ink-testing-library
680
+ function runCli(_0) {
681
+ return _async_to_generator(function(argv) {
682
+ var options, capturedElement, configDir, server, mockRenderFn, testCli;
683
+ var _arguments = arguments;
684
+ return _ts_generator(this, function(_state) {
685
+ switch(_state.label){
686
+ case 0:
687
+ options = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
688
+ capturedElement = null;
689
+ configDir = options.configDir, server = options.server;
690
+ mockRenderFn = function(element) {
691
+ capturedElement = render(element);
692
+ return capturedElement;
693
+ };
694
+ // Setup project-specific environment if configDir is provided
695
+ if (configDir) {
696
+ process.env.POSITRONIC_CONFIG_DIR = configDir;
697
+ }
698
+ _state.label = 1;
699
+ case 1:
700
+ _state.trys.push([
701
+ 1,
702
+ ,
703
+ 3,
704
+ 4
705
+ ]);
706
+ testCli = buildCli({
707
+ argv: argv,
708
+ server: server,
709
+ exitProcess: false,
710
+ render: mockRenderFn
711
+ });
712
+ return [
713
+ 4,
714
+ testCli.parse()
715
+ ];
716
+ case 2:
717
+ _state.sent();
718
+ return [
719
+ 2,
720
+ capturedElement
721
+ ];
722
+ case 3:
723
+ // Cleanup project-specific environment if configDir was provided
724
+ if (configDir) {
725
+ delete process.env.POSITRONIC_CONFIG_DIR;
726
+ }
727
+ return [
728
+ 7
729
+ ];
730
+ case 4:
731
+ return [
732
+ 2
733
+ ];
734
+ }
735
+ });
736
+ }).apply(this, arguments);
737
+ }