@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,224 @@
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _array_with_holes(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+ function _iterable_to_array_limit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _non_iterable_rest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _sliced_to_array(arr, i) {
37
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
38
+ }
39
+ function _unsupported_iterable_to_array(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
46
+ }
47
+ import React, { useState, useEffect } from 'react';
48
+ import { Box, Text, useInput, useApp, useStdin } from 'ink';
49
+ // Separate component for interactive selection that uses useInput
50
+ var InteractiveProjectSelect = function(param) {
51
+ var projects = param.projects, currentProject = param.currentProject, projectConfig = param.projectConfig;
52
+ var _useState = _sliced_to_array(useState(function() {
53
+ var currentIndex = projects.findIndex(function(p) {
54
+ return p.name === currentProject;
55
+ });
56
+ return currentIndex >= 0 ? currentIndex : 0;
57
+ }), 2), selectedIndex = _useState[0], setSelectedIndex = _useState[1];
58
+ var _useState1 = _sliced_to_array(useState(null), 2), result = _useState1[0], setResult = _useState1[1];
59
+ var exit = useApp().exit;
60
+ useInput(function(input, key) {
61
+ if (key.upArrow) {
62
+ setSelectedIndex(function(prev) {
63
+ return (prev - 1 + projects.length) % projects.length;
64
+ });
65
+ } else if (key.downArrow) {
66
+ setSelectedIndex(function(prev) {
67
+ return (prev + 1) % projects.length;
68
+ });
69
+ } else if (key.return) {
70
+ var selectedProject = projects[selectedIndex];
71
+ var selectResult = projectConfig.selectProject(selectedProject.name);
72
+ setResult(selectResult);
73
+ } else if (input === 'q' || key.escape) {
74
+ exit();
75
+ }
76
+ });
77
+ // If selection was made, show success
78
+ if (result && result.success) {
79
+ var selectedProject = projects[selectedIndex];
80
+ return /*#__PURE__*/ React.createElement(Box, {
81
+ flexDirection: "column"
82
+ }, /*#__PURE__*/ React.createElement(Text, {
83
+ color: "green"
84
+ }, "✅ Project switched successfully!"), /*#__PURE__*/ React.createElement(Box, {
85
+ marginTop: 1,
86
+ paddingLeft: 2,
87
+ flexDirection: "column"
88
+ }, /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
89
+ bold: true
90
+ }, "Current project:"), " ", selectedProject.name), /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
91
+ bold: true
92
+ }, "URL:"), " ", selectedProject.url)));
93
+ }
94
+ // Show interactive selection UI
95
+ return /*#__PURE__*/ React.createElement(Box, {
96
+ flexDirection: "column"
97
+ }, /*#__PURE__*/ React.createElement(Text, {
98
+ bold: true
99
+ }, "Select a project:"), /*#__PURE__*/ React.createElement(Box, {
100
+ marginTop: 1,
101
+ flexDirection: "column"
102
+ }, projects.map(function(project, index) {
103
+ var isSelected = index === selectedIndex;
104
+ var isCurrent = project.name === currentProject;
105
+ return /*#__PURE__*/ React.createElement(Box, {
106
+ key: project.name
107
+ }, /*#__PURE__*/ React.createElement(Text, {
108
+ color: isSelected ? 'cyan' : undefined
109
+ }, isSelected ? '▶ ' : ' ', project.name, isCurrent && /*#__PURE__*/ React.createElement(Text, {
110
+ color: "green"
111
+ }, " (current)")));
112
+ })), /*#__PURE__*/ React.createElement(Box, {
113
+ marginTop: 1
114
+ }, /*#__PURE__*/ React.createElement(Text, {
115
+ dimColor: true
116
+ }, "Use arrow keys to navigate, Enter to select, q to quit")));
117
+ };
118
+ export var ProjectSelect = function(param) {
119
+ var name = param.name, projectConfig = param.projectConfig;
120
+ var _useState = _sliced_to_array(useState([]), 2), projects = _useState[0], setProjects = _useState[1];
121
+ var _useState1 = _sliced_to_array(useState(null), 2), currentProject = _useState1[0], setCurrentProject = _useState1[1];
122
+ var _useState2 = _sliced_to_array(useState(null), 2), result = _useState2[0], setResult = _useState2[1];
123
+ var _useState3 = _sliced_to_array(useState(!name), 1), isInteractive = _useState3[0];
124
+ var isRawModeSupported = useStdin().isRawModeSupported;
125
+ useEffect(function() {
126
+ var _projectConfig_listProjects = projectConfig.listProjects(), projectList = _projectConfig_listProjects.projects, current = _projectConfig_listProjects.current;
127
+ setProjects(projectList);
128
+ setCurrentProject(current);
129
+ // If name is provided, select it directly
130
+ if (name) {
131
+ var selectResult = projectConfig.selectProject(name);
132
+ setResult(selectResult);
133
+ }
134
+ }, [
135
+ name,
136
+ projectConfig
137
+ ]);
138
+ // Handle no projects case
139
+ if (projects.length === 0) {
140
+ return /*#__PURE__*/ React.createElement(Box, {
141
+ flexDirection: "column"
142
+ }, /*#__PURE__*/ React.createElement(Text, {
143
+ color: "red"
144
+ }, "❌ No projects configured"), /*#__PURE__*/ React.createElement(Box, {
145
+ marginTop: 1
146
+ }, /*#__PURE__*/ React.createElement(Text, {
147
+ dimColor: true
148
+ }, 'Add a project first with "px project add <name> --url <url>"')));
149
+ }
150
+ // Direct selection mode - show result
151
+ if (!isInteractive && result) {
152
+ if (result.success) {
153
+ var selectedProject = projects.find(function(p) {
154
+ return p.name === name;
155
+ });
156
+ return /*#__PURE__*/ React.createElement(Box, {
157
+ flexDirection: "column"
158
+ }, /*#__PURE__*/ React.createElement(Text, {
159
+ color: "green"
160
+ }, "✅ Project switched successfully!"), /*#__PURE__*/ React.createElement(Box, {
161
+ marginTop: 1,
162
+ paddingLeft: 2,
163
+ flexDirection: "column"
164
+ }, /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
165
+ bold: true
166
+ }, "Current project:"), " ", name), selectedProject && /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
167
+ bold: true
168
+ }, "URL:"), " ", selectedProject.url)));
169
+ } else {
170
+ return /*#__PURE__*/ React.createElement(Box, {
171
+ flexDirection: "column"
172
+ }, /*#__PURE__*/ React.createElement(Text, {
173
+ color: "red"
174
+ }, "❌ Failed to select project"), /*#__PURE__*/ React.createElement(Box, {
175
+ paddingLeft: 2
176
+ }, /*#__PURE__*/ React.createElement(Text, {
177
+ color: "red"
178
+ }, result.error)), projects.length > 0 && /*#__PURE__*/ React.createElement(Box, {
179
+ marginTop: 1,
180
+ flexDirection: "column"
181
+ }, /*#__PURE__*/ React.createElement(Text, null, "Available projects:"), projects.map(function(p) {
182
+ return /*#__PURE__*/ React.createElement(Box, {
183
+ key: p.name,
184
+ paddingLeft: 2
185
+ }, /*#__PURE__*/ React.createElement(Text, {
186
+ dimColor: true
187
+ }, "• ", p.name));
188
+ })));
189
+ }
190
+ }
191
+ // Interactive selection mode
192
+ if (isInteractive) {
193
+ // If raw mode is not supported (e.g., in tests), show a non-interactive list
194
+ if (!isRawModeSupported) {
195
+ return /*#__PURE__*/ React.createElement(Box, {
196
+ flexDirection: "column"
197
+ }, /*#__PURE__*/ React.createElement(Text, {
198
+ bold: true
199
+ }, "Available projects:"), /*#__PURE__*/ React.createElement(Box, {
200
+ marginTop: 1,
201
+ flexDirection: "column"
202
+ }, projects.map(function(project) {
203
+ var isCurrent = project.name === currentProject;
204
+ return /*#__PURE__*/ React.createElement(Box, {
205
+ key: project.name,
206
+ paddingLeft: 2
207
+ }, /*#__PURE__*/ React.createElement(Text, null, "• ", project.name, isCurrent && /*#__PURE__*/ React.createElement(Text, {
208
+ color: "green"
209
+ }, " (current)")));
210
+ })), /*#__PURE__*/ React.createElement(Box, {
211
+ marginTop: 1
212
+ }, /*#__PURE__*/ React.createElement(Text, {
213
+ dimColor: true
214
+ }, 'Interactive mode not available. Use "px project select <name>" to select a project.')));
215
+ }
216
+ // Use the interactive component that has useInput
217
+ return /*#__PURE__*/ React.createElement(InteractiveProjectSelect, {
218
+ projects: projects,
219
+ currentProject: currentProject,
220
+ projectConfig: projectConfig
221
+ });
222
+ }
223
+ return /*#__PURE__*/ React.createElement(Text, null, "Processing...");
224
+ };
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ export var ProjectShow = function(param) {
4
+ var projectConfig = param.projectConfig;
5
+ var currentProject = projectConfig.getCurrentProject();
6
+ var projects = projectConfig.listProjects().projects;
7
+ if (!currentProject) {
8
+ return /*#__PURE__*/ React.createElement(Box, {
9
+ flexDirection: "column"
10
+ }, /*#__PURE__*/ React.createElement(Text, null, "No project currently selected."), projects.length > 0 ? /*#__PURE__*/ React.createElement(Box, {
11
+ marginTop: 1
12
+ }, /*#__PURE__*/ React.createElement(Text, {
13
+ dimColor: true
14
+ }, 'Use "px project select" to choose from ', projects.length, " available project", projects.length === 1 ? '' : 's', ".")) : /*#__PURE__*/ React.createElement(Box, {
15
+ marginTop: 1
16
+ }, /*#__PURE__*/ React.createElement(Text, {
17
+ dimColor: true
18
+ }, 'Add a project with "px project add <name> --url <url>"')));
19
+ }
20
+ return /*#__PURE__*/ React.createElement(Box, {
21
+ flexDirection: "column",
22
+ paddingTop: 1,
23
+ paddingBottom: 1
24
+ }, /*#__PURE__*/ React.createElement(Text, {
25
+ bold: true
26
+ }, "Current Project"), /*#__PURE__*/ React.createElement(Box, {
27
+ marginTop: 1,
28
+ paddingLeft: 2,
29
+ flexDirection: "column"
30
+ }, /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
31
+ bold: true
32
+ }, "Name:"), " ", currentProject.name), /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
33
+ bold: true
34
+ }, "URL:"), " ", currentProject.url), /*#__PURE__*/ React.createElement(Text, null, /*#__PURE__*/ React.createElement(Text, {
35
+ bold: true
36
+ }, "Added:"), " ", new Date(currentProject.addedAt).toLocaleString())), projects.length > 1 && /*#__PURE__*/ React.createElement(Box, {
37
+ marginTop: 1
38
+ }, /*#__PURE__*/ React.createElement(Text, {
39
+ dimColor: true
40
+ }, projects.length - 1, " other project", projects.length - 1 === 1 ? '' : 's', ' available. Use "px project list" to see all.')));
41
+ };
@@ -0,0 +1,152 @@
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _array_with_holes(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+ function _iterable_to_array_limit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _non_iterable_rest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _sliced_to_array(arr, i) {
37
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
38
+ }
39
+ function _unsupported_iterable_to_array(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
46
+ }
47
+ import React, { useState, useEffect } from 'react';
48
+ import { Box, Text, useApp, useInput } from 'ink';
49
+ import { ErrorComponent } from './error.js';
50
+ import { useApiGet, useApiDelete } from '../hooks/useApi.js';
51
+ export var ResourceClear = function() {
52
+ var _useState = _sliced_to_array(useState(false), 2), confirmed = _useState[0], setConfirmed = _useState[1];
53
+ var _useState1 = _sliced_to_array(useState(false), 2), deleted = _useState1[0], setDeleted = _useState1[1];
54
+ var _useState2 = _sliced_to_array(useState('cancel'), 2), selectedOption = _useState2[0], setSelectedOption = _useState2[1];
55
+ var exit = useApp().exit;
56
+ var _useApiGet = useApiGet('/resources'), resourcesData = _useApiGet.data, listLoading = _useApiGet.loading, listError = _useApiGet.error;
57
+ var _useApiDelete = useApiDelete('resources'), deleteResources = _useApiDelete.execute, deleteLoading = _useApiDelete.loading, deleteError = _useApiDelete.error;
58
+ useInput(function(input, key) {
59
+ if (!confirmed && !deleted && resourcesData && resourcesData.count > 0) {
60
+ if (key.upArrow || key.downArrow) {
61
+ setSelectedOption(function(prev) {
62
+ return prev === 'cancel' ? 'delete' : 'cancel';
63
+ });
64
+ } else if (key.return) {
65
+ if (selectedOption === 'delete') {
66
+ setConfirmed(true);
67
+ } else {
68
+ exit();
69
+ }
70
+ } else if (key.escape || key.ctrl && input === 'c') {
71
+ exit();
72
+ }
73
+ }
74
+ });
75
+ useEffect(function() {
76
+ if (confirmed && !deleteLoading && !deleteError && !deleted) {
77
+ deleteResources('/resources').then(function() {
78
+ setDeleted(true);
79
+ });
80
+ }
81
+ }, [
82
+ confirmed,
83
+ deleteLoading,
84
+ deleteError,
85
+ deleted,
86
+ deleteResources
87
+ ]);
88
+ useEffect(function() {
89
+ if (deleted) {
90
+ // Exit after showing success message for a moment
91
+ var timer = setTimeout(function() {
92
+ exit();
93
+ }, 1500);
94
+ return function() {
95
+ return clearTimeout(timer);
96
+ };
97
+ }
98
+ }, [
99
+ deleted,
100
+ exit
101
+ ]);
102
+ if (listError) {
103
+ return /*#__PURE__*/ React.createElement(ErrorComponent, {
104
+ error: listError
105
+ });
106
+ }
107
+ if (deleteError) {
108
+ return /*#__PURE__*/ React.createElement(ErrorComponent, {
109
+ error: deleteError
110
+ });
111
+ }
112
+ if (listLoading) {
113
+ return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, "\uD83D\uDCCB Loading resources..."));
114
+ }
115
+ if (resourcesData && resourcesData.count === 0) {
116
+ return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, "No resources to delete."));
117
+ }
118
+ if (!confirmed) {
119
+ return /*#__PURE__*/ React.createElement(Box, {
120
+ flexDirection: "column"
121
+ }, /*#__PURE__*/ React.createElement(Text, {
122
+ bold: true,
123
+ color: "red"
124
+ }, "\uD83D\uDEA8 DANGER: This will permanently delete ALL resources!"), /*#__PURE__*/ React.createElement(Box, {
125
+ marginTop: 1,
126
+ marginBottom: 1,
127
+ paddingLeft: 2,
128
+ flexDirection: "column"
129
+ }, /*#__PURE__*/ React.createElement(Text, null, "This action will delete ", (resourcesData === null || resourcesData === void 0 ? void 0 : resourcesData.count) || 0, " resource(s)."), /*#__PURE__*/ React.createElement(Text, {
130
+ dimColor: true
131
+ }, "This cannot be undone.")), /*#__PURE__*/ React.createElement(Box, {
132
+ marginTop: 1,
133
+ flexDirection: "column"
134
+ }, /*#__PURE__*/ React.createElement(Text, null, "Use arrow keys to select, Enter to confirm:"), /*#__PURE__*/ React.createElement(Box, {
135
+ marginTop: 1,
136
+ flexDirection: "column"
137
+ }, /*#__PURE__*/ React.createElement(Text, {
138
+ color: selectedOption === 'cancel' ? 'green' : undefined
139
+ }, selectedOption === 'cancel' ? '▶ ' : ' ', "Cancel (keep resources)"), /*#__PURE__*/ React.createElement(Text, {
140
+ color: selectedOption === 'delete' ? 'red' : undefined
141
+ }, selectedOption === 'delete' ? '▶ ' : ' ', "Delete all resources"))));
142
+ }
143
+ if (deleteLoading) {
144
+ return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, "\uD83D\uDDD1️ Deleting all resources..."));
145
+ }
146
+ if (deleted) {
147
+ return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
148
+ color: "green"
149
+ }, "✅ Successfully deleted all resources"));
150
+ }
151
+ return null;
152
+ };
@@ -0,0 +1,189 @@
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _array_with_holes(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+ function _iterable_to_array_limit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _non_iterable_rest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _sliced_to_array(arr, i) {
37
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
38
+ }
39
+ function _unsupported_iterable_to_array(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
46
+ }
47
+ import React, { useState, useEffect } from 'react';
48
+ import { Box, Text, useStdin, useApp } from 'ink';
49
+ import { ErrorComponent } from './error.js';
50
+ import { useApiDelete, useApiGet } from '../hooks/useApi.js';
51
+ import { generateTypes } from '../commands/helpers.js';
52
+ export var ResourceDelete = function(param) {
53
+ var resourceKey = param.resourceKey, resourcePath = param.resourcePath, projectRootPath = param.projectRootPath, _param_force = param.force, force = _param_force === void 0 ? false : _param_force;
54
+ var _useState = _sliced_to_array(useState(force), 2), confirmed = _useState[0], setConfirmed = _useState[1]; // Auto-confirm if force is true
55
+ var _useState1 = _sliced_to_array(useState(false), 2), deleted = _useState1[0], setDeleted = _useState1[1];
56
+ var _useState2 = _sliced_to_array(useState(''), 2), input = _useState2[0], setInput = _useState2[1];
57
+ var _useState3 = _sliced_to_array(useState(null), 2), isLocalResource = _useState3[0], setIsLocalResource = _useState3[1];
58
+ var _useStdin = useStdin(), stdin = _useStdin.stdin, setRawMode = _useStdin.setRawMode;
59
+ var exit = useApp().exit;
60
+ var _useApiGet = useApiGet('/resources'), resourcesData = _useApiGet.data, listLoading = _useApiGet.loading, listError = _useApiGet.error;
61
+ var _useApiDelete = useApiDelete('resource'), deleteResource = _useApiDelete.execute, loading = _useApiDelete.loading, error = _useApiDelete.error;
62
+ // Check if the resource is local
63
+ useEffect(function() {
64
+ if (resourcesData) {
65
+ var resource = resourcesData.resources.find(function(r) {
66
+ return r.key === resourceKey;
67
+ });
68
+ if (resource) {
69
+ setIsLocalResource(resource.local);
70
+ } else {
71
+ setIsLocalResource(false); // Resource doesn't exist
72
+ }
73
+ }
74
+ }, [
75
+ resourcesData,
76
+ resourceKey
77
+ ]);
78
+ useEffect(function() {
79
+ if (stdin && !confirmed && !deleted && !force) {
80
+ setRawMode(true);
81
+ var handleData = function(data) {
82
+ var char = data.toString();
83
+ if (char === '\r' || char === '\n') {
84
+ if (input.toLowerCase() === 'yes') {
85
+ setConfirmed(true);
86
+ } else {
87
+ exit();
88
+ }
89
+ } else if (char === '\u0003') {
90
+ exit();
91
+ } else if (char === '\u007F' || char === '\b') {
92
+ setInput(function(prev) {
93
+ return prev.slice(0, -1);
94
+ });
95
+ } else {
96
+ setInput(function(prev) {
97
+ return prev + char;
98
+ });
99
+ }
100
+ };
101
+ stdin.on('data', handleData);
102
+ return function() {
103
+ stdin.off('data', handleData);
104
+ setRawMode(false);
105
+ };
106
+ }
107
+ }, [
108
+ stdin,
109
+ setRawMode,
110
+ confirmed,
111
+ deleted,
112
+ input,
113
+ exit,
114
+ force
115
+ ]);
116
+ useEffect(function() {
117
+ if (confirmed && !loading && !error && !deleted) {
118
+ // URL encode the key for the API endpoint
119
+ var encodedKey = encodeURIComponent(resourceKey);
120
+ deleteResource("/resources/".concat(encodedKey)).then(function() {
121
+ setDeleted(true);
122
+ // Generate types after successful deletion if in local dev mode
123
+ if (projectRootPath) {
124
+ generateTypes(projectRootPath).catch(function(typeError) {
125
+ console.error('Failed to generate types:', typeError);
126
+ });
127
+ }
128
+ });
129
+ }
130
+ }, [
131
+ confirmed,
132
+ loading,
133
+ error,
134
+ deleted,
135
+ deleteResource,
136
+ resourceKey,
137
+ projectRootPath
138
+ ]);
139
+ if (listError) {
140
+ return /*#__PURE__*/ React.createElement(ErrorComponent, {
141
+ error: listError
142
+ });
143
+ }
144
+ if (error) {
145
+ return /*#__PURE__*/ React.createElement(ErrorComponent, {
146
+ error: error
147
+ });
148
+ }
149
+ if (listLoading || isLocalResource === null) {
150
+ return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, "Checking resource..."));
151
+ }
152
+ if (isLocalResource) {
153
+ return /*#__PURE__*/ React.createElement(Box, {
154
+ flexDirection: "column"
155
+ }, /*#__PURE__*/ React.createElement(Text, {
156
+ color: "red",
157
+ bold: true
158
+ }, "❌ Cannot Delete Local Resource"), /*#__PURE__*/ React.createElement(Box, {
159
+ marginTop: 1,
160
+ paddingLeft: 2,
161
+ flexDirection: "column"
162
+ }, /*#__PURE__*/ React.createElement(Text, null, "This resource was synced from your local filesystem."), /*#__PURE__*/ React.createElement(Text, {
163
+ dimColor: true
164
+ }, "To remove it, delete the file locally and run 'px resources sync'.")));
165
+ }
166
+ if (!confirmed && !force) {
167
+ return /*#__PURE__*/ React.createElement(Box, {
168
+ flexDirection: "column"
169
+ }, /*#__PURE__*/ React.createElement(Text, {
170
+ bold: true,
171
+ color: "yellow"
172
+ }, "⚠️ Warning: This will permanently delete the following resource:"), /*#__PURE__*/ React.createElement(Box, {
173
+ marginTop: 1,
174
+ marginBottom: 1,
175
+ paddingLeft: 2
176
+ }, /*#__PURE__*/ React.createElement(Text, null, resourcePath)), /*#__PURE__*/ React.createElement(Text, null, 'Type "yes" to confirm deletion: ', input));
177
+ }
178
+ if (loading) {
179
+ return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, null, "\uD83D\uDDD1️ Deleting ", resourcePath, "..."));
180
+ }
181
+ if (deleted) {
182
+ return /*#__PURE__*/ React.createElement(Box, {
183
+ flexDirection: "column"
184
+ }, /*#__PURE__*/ React.createElement(Text, {
185
+ color: "green"
186
+ }, "✅ Successfully deleted: ", resourcePath));
187
+ }
188
+ return null;
189
+ };