@calltelemetry/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/dist/commands/config.d.ts +3 -0
  2. package/dist/commands/config.d.ts.map +1 -0
  3. package/dist/commands/config.js +201 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/db.d.ts +3 -0
  6. package/dist/commands/db.d.ts.map +1 -0
  7. package/dist/commands/db.js +143 -0
  8. package/dist/commands/db.js.map +1 -0
  9. package/dist/commands/diag.d.ts +3 -0
  10. package/dist/commands/diag.d.ts.map +1 -0
  11. package/dist/commands/diag.js +123 -0
  12. package/dist/commands/diag.js.map +1 -0
  13. package/dist/commands/docker.d.ts +3 -0
  14. package/dist/commands/docker.d.ts.map +1 -0
  15. package/dist/commands/docker.js +34 -0
  16. package/dist/commands/docker.js.map +1 -0
  17. package/dist/commands/jtapi.d.ts +3 -0
  18. package/dist/commands/jtapi.d.ts.map +1 -0
  19. package/dist/commands/jtapi.js +36 -0
  20. package/dist/commands/jtapi.js.map +1 -0
  21. package/dist/commands/migrate.d.ts +3 -0
  22. package/dist/commands/migrate.d.ts.map +1 -0
  23. package/dist/commands/migrate.js +49 -0
  24. package/dist/commands/migrate.js.map +1 -0
  25. package/dist/commands/offline.d.ts +3 -0
  26. package/dist/commands/offline.d.ts.map +1 -0
  27. package/dist/commands/offline.js +170 -0
  28. package/dist/commands/offline.js.map +1 -0
  29. package/dist/commands/secrets.d.ts +3 -0
  30. package/dist/commands/secrets.d.ts.map +1 -0
  31. package/dist/commands/secrets.js +55 -0
  32. package/dist/commands/secrets.js.map +1 -0
  33. package/dist/commands/status.d.ts +3 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +13 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/commands/update.d.ts +3 -0
  38. package/dist/commands/update.d.ts.map +1 -0
  39. package/dist/commands/update.js +202 -0
  40. package/dist/commands/update.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +65 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lib/bundle.d.ts +5 -0
  46. package/dist/lib/bundle.d.ts.map +1 -0
  47. package/dist/lib/bundle.js +134 -0
  48. package/dist/lib/bundle.js.map +1 -0
  49. package/dist/lib/certs.d.ts +3 -0
  50. package/dist/lib/certs.d.ts.map +1 -0
  51. package/dist/lib/certs.js +29 -0
  52. package/dist/lib/certs.js.map +1 -0
  53. package/dist/lib/compose.d.ts +36 -0
  54. package/dist/lib/compose.d.ts.map +1 -0
  55. package/dist/lib/compose.js +137 -0
  56. package/dist/lib/compose.js.map +1 -0
  57. package/dist/lib/db.d.ts +6 -0
  58. package/dist/lib/db.d.ts.map +1 -0
  59. package/dist/lib/db.js +6 -0
  60. package/dist/lib/db.js.map +1 -0
  61. package/dist/lib/fs.d.ts +20 -0
  62. package/dist/lib/fs.d.ts.map +1 -0
  63. package/dist/lib/fs.js +72 -0
  64. package/dist/lib/fs.js.map +1 -0
  65. package/dist/lib/jtapi.d.ts +6 -0
  66. package/dist/lib/jtapi.d.ts.map +1 -0
  67. package/dist/lib/jtapi.js +27 -0
  68. package/dist/lib/jtapi.js.map +1 -0
  69. package/dist/lib/network.d.ts +43 -0
  70. package/dist/lib/network.d.ts.map +1 -0
  71. package/dist/lib/network.js +172 -0
  72. package/dist/lib/network.js.map +1 -0
  73. package/dist/lib/paths.d.ts +19 -0
  74. package/dist/lib/paths.d.ts.map +1 -0
  75. package/dist/lib/paths.js +57 -0
  76. package/dist/lib/paths.js.map +1 -0
  77. package/dist/lib/postgres.d.ts +4 -0
  78. package/dist/lib/postgres.d.ts.map +1 -0
  79. package/dist/lib/postgres.js +49 -0
  80. package/dist/lib/postgres.js.map +1 -0
  81. package/dist/lib/rpc.d.ts +5 -0
  82. package/dist/lib/rpc.d.ts.map +1 -0
  83. package/dist/lib/rpc.js +28 -0
  84. package/dist/lib/rpc.js.map +1 -0
  85. package/dist/lib/secrets.d.ts +38 -0
  86. package/dist/lib/secrets.d.ts.map +1 -0
  87. package/dist/lib/secrets.js +132 -0
  88. package/dist/lib/secrets.js.map +1 -0
  89. package/dist/lib/system.d.ts +12 -0
  90. package/dist/lib/system.d.ts.map +1 -0
  91. package/dist/lib/system.js +61 -0
  92. package/dist/lib/system.js.map +1 -0
  93. package/dist/ui/components/AppShell.d.ts +9 -0
  94. package/dist/ui/components/AppShell.d.ts.map +1 -0
  95. package/dist/ui/components/AppShell.js +6 -0
  96. package/dist/ui/components/AppShell.js.map +1 -0
  97. package/dist/ui/components/Confirm.d.ts +7 -0
  98. package/dist/ui/components/Confirm.d.ts.map +1 -0
  99. package/dist/ui/components/Confirm.js +14 -0
  100. package/dist/ui/components/Confirm.js.map +1 -0
  101. package/dist/ui/components/DataTable.d.ts +12 -0
  102. package/dist/ui/components/DataTable.d.ts.map +1 -0
  103. package/dist/ui/components/DataTable.js +28 -0
  104. package/dist/ui/components/DataTable.js.map +1 -0
  105. package/dist/ui/components/Divider.d.ts +6 -0
  106. package/dist/ui/components/Divider.d.ts.map +1 -0
  107. package/dist/ui/components/Divider.js +6 -0
  108. package/dist/ui/components/Divider.js.map +1 -0
  109. package/dist/ui/components/KeyValue.d.ts +11 -0
  110. package/dist/ui/components/KeyValue.d.ts.map +1 -0
  111. package/dist/ui/components/KeyValue.js +7 -0
  112. package/dist/ui/components/KeyValue.js.map +1 -0
  113. package/dist/ui/components/Section.d.ts +8 -0
  114. package/dist/ui/components/Section.d.ts.map +1 -0
  115. package/dist/ui/components/Section.js +6 -0
  116. package/dist/ui/components/Section.js.map +1 -0
  117. package/dist/ui/components/SelectMenu.d.ts +14 -0
  118. package/dist/ui/components/SelectMenu.d.ts.map +1 -0
  119. package/dist/ui/components/SelectMenu.js +55 -0
  120. package/dist/ui/components/SelectMenu.js.map +1 -0
  121. package/dist/ui/components/ShellOutput.d.ts +7 -0
  122. package/dist/ui/components/ShellOutput.d.ts.map +1 -0
  123. package/dist/ui/components/ShellOutput.js +10 -0
  124. package/dist/ui/components/ShellOutput.js.map +1 -0
  125. package/dist/ui/components/Spinner.d.ts +6 -0
  126. package/dist/ui/components/Spinner.d.ts.map +1 -0
  127. package/dist/ui/components/Spinner.js +7 -0
  128. package/dist/ui/components/Spinner.js.map +1 -0
  129. package/dist/ui/components/StatusBox.d.ts +8 -0
  130. package/dist/ui/components/StatusBox.d.ts.map +1 -0
  131. package/dist/ui/components/StatusBox.js +12 -0
  132. package/dist/ui/components/StatusBox.js.map +1 -0
  133. package/dist/ui/components/StatusLine.d.ts +8 -0
  134. package/dist/ui/components/StatusLine.d.ts.map +1 -0
  135. package/dist/ui/components/StatusLine.js +13 -0
  136. package/dist/ui/components/StatusLine.js.map +1 -0
  137. package/dist/ui/components/StepList.d.ts +11 -0
  138. package/dist/ui/components/StepList.d.ts.map +1 -0
  139. package/dist/ui/components/StepList.js +19 -0
  140. package/dist/ui/components/StepList.js.map +1 -0
  141. package/dist/ui/components/SubSection.d.ts +8 -0
  142. package/dist/ui/components/SubSection.d.ts.map +1 -0
  143. package/dist/ui/components/SubSection.js +6 -0
  144. package/dist/ui/components/SubSection.js.map +1 -0
  145. package/dist/ui/components/TextInput.d.ts +11 -0
  146. package/dist/ui/components/TextInput.d.ts.map +1 -0
  147. package/dist/ui/components/TextInput.js +7 -0
  148. package/dist/ui/components/TextInput.js.map +1 -0
  149. package/dist/ui/components/index.d.ts +16 -0
  150. package/dist/ui/components/index.d.ts.map +1 -0
  151. package/dist/ui/components/index.js +15 -0
  152. package/dist/ui/components/index.js.map +1 -0
  153. package/dist/ui/hooks/index.d.ts +7 -0
  154. package/dist/ui/hooks/index.d.ts.map +1 -0
  155. package/dist/ui/hooks/index.js +5 -0
  156. package/dist/ui/hooks/index.js.map +1 -0
  157. package/dist/ui/hooks/useAsyncTask.d.ts +9 -0
  158. package/dist/ui/hooks/useAsyncTask.d.ts.map +1 -0
  159. package/dist/ui/hooks/useAsyncTask.js +22 -0
  160. package/dist/ui/hooks/useAsyncTask.js.map +1 -0
  161. package/dist/ui/hooks/usePolling.d.ts +8 -0
  162. package/dist/ui/hooks/usePolling.d.ts.map +1 -0
  163. package/dist/ui/hooks/usePolling.js +43 -0
  164. package/dist/ui/hooks/usePolling.js.map +1 -0
  165. package/dist/ui/hooks/useStepRunner.d.ts +16 -0
  166. package/dist/ui/hooks/useStepRunner.d.ts.map +1 -0
  167. package/dist/ui/hooks/useStepRunner.js +42 -0
  168. package/dist/ui/hooks/useStepRunner.js.map +1 -0
  169. package/dist/ui/hooks/useStreamingProcess.d.ts +8 -0
  170. package/dist/ui/hooks/useStreamingProcess.d.ts.map +1 -0
  171. package/dist/ui/hooks/useStreamingProcess.js +49 -0
  172. package/dist/ui/hooks/useStreamingProcess.js.map +1 -0
  173. package/dist/ui/types.d.ts +24 -0
  174. package/dist/ui/types.d.ts.map +1 -0
  175. package/dist/ui/types.js +2 -0
  176. package/dist/ui/types.js.map +1 -0
  177. package/dist/ui/views/CertsStatusView.d.ts +2 -0
  178. package/dist/ui/views/CertsStatusView.d.ts.map +1 -0
  179. package/dist/ui/views/CertsStatusView.js +95 -0
  180. package/dist/ui/views/CertsStatusView.js.map +1 -0
  181. package/dist/ui/views/DbBackupView.d.ts +2 -0
  182. package/dist/ui/views/DbBackupView.d.ts.map +1 -0
  183. package/dist/ui/views/DbBackupView.js +62 -0
  184. package/dist/ui/views/DbBackupView.js.map +1 -0
  185. package/dist/ui/views/DbCompactView.d.ts +2 -0
  186. package/dist/ui/views/DbCompactView.d.ts.map +1 -0
  187. package/dist/ui/views/DbCompactView.js +28 -0
  188. package/dist/ui/views/DbCompactView.js.map +1 -0
  189. package/dist/ui/views/DbListView.d.ts +2 -0
  190. package/dist/ui/views/DbListView.d.ts.map +1 -0
  191. package/dist/ui/views/DbListView.js +30 -0
  192. package/dist/ui/views/DbListView.js.map +1 -0
  193. package/dist/ui/views/DbSizeView.d.ts +2 -0
  194. package/dist/ui/views/DbSizeView.d.ts.map +1 -0
  195. package/dist/ui/views/DbSizeView.js +21 -0
  196. package/dist/ui/views/DbSizeView.js.map +1 -0
  197. package/dist/ui/views/DbStatusView.d.ts +2 -0
  198. package/dist/ui/views/DbStatusView.d.ts.map +1 -0
  199. package/dist/ui/views/DbStatusView.js +41 -0
  200. package/dist/ui/views/DbStatusView.js.map +1 -0
  201. package/dist/ui/views/DbTablesView.d.ts +6 -0
  202. package/dist/ui/views/DbTablesView.d.ts.map +1 -0
  203. package/dist/ui/views/DbTablesView.js +28 -0
  204. package/dist/ui/views/DbTablesView.js.map +1 -0
  205. package/dist/ui/views/DiagDatabaseView.d.ts +2 -0
  206. package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -0
  207. package/dist/ui/views/DiagDatabaseView.js +51 -0
  208. package/dist/ui/views/DiagDatabaseView.js.map +1 -0
  209. package/dist/ui/views/DiagNetworkView.d.ts +2 -0
  210. package/dist/ui/views/DiagNetworkView.d.ts.map +1 -0
  211. package/dist/ui/views/DiagNetworkView.js +169 -0
  212. package/dist/ui/views/DiagNetworkView.js.map +1 -0
  213. package/dist/ui/views/DiagServiceView.d.ts +2 -0
  214. package/dist/ui/views/DiagServiceView.d.ts.map +1 -0
  215. package/dist/ui/views/DiagServiceView.js +37 -0
  216. package/dist/ui/views/DiagServiceView.js.map +1 -0
  217. package/dist/ui/views/DockerNetworkView.d.ts +2 -0
  218. package/dist/ui/views/DockerNetworkView.d.ts.map +1 -0
  219. package/dist/ui/views/DockerNetworkView.js +29 -0
  220. package/dist/ui/views/DockerNetworkView.js.map +1 -0
  221. package/dist/ui/views/DockerPruneView.d.ts +2 -0
  222. package/dist/ui/views/DockerPruneView.d.ts.map +1 -0
  223. package/dist/ui/views/DockerPruneView.js +57 -0
  224. package/dist/ui/views/DockerPruneView.js.map +1 -0
  225. package/dist/ui/views/DockerStatusView.d.ts +2 -0
  226. package/dist/ui/views/DockerStatusView.d.ts.map +1 -0
  227. package/dist/ui/views/DockerStatusView.js +43 -0
  228. package/dist/ui/views/DockerStatusView.js.map +1 -0
  229. package/dist/ui/views/JtapiDisableView.d.ts +2 -0
  230. package/dist/ui/views/JtapiDisableView.d.ts.map +1 -0
  231. package/dist/ui/views/JtapiDisableView.js +55 -0
  232. package/dist/ui/views/JtapiDisableView.js.map +1 -0
  233. package/dist/ui/views/JtapiEnableView.d.ts +2 -0
  234. package/dist/ui/views/JtapiEnableView.d.ts.map +1 -0
  235. package/dist/ui/views/JtapiEnableView.js +47 -0
  236. package/dist/ui/views/JtapiEnableView.js.map +1 -0
  237. package/dist/ui/views/JtapiStatusView.d.ts +2 -0
  238. package/dist/ui/views/JtapiStatusView.d.ts.map +1 -0
  239. package/dist/ui/views/JtapiStatusView.js +18 -0
  240. package/dist/ui/views/JtapiStatusView.js.map +1 -0
  241. package/dist/ui/views/JtapiTroubleshootView.d.ts +2 -0
  242. package/dist/ui/views/JtapiTroubleshootView.d.ts.map +1 -0
  243. package/dist/ui/views/JtapiTroubleshootView.js +120 -0
  244. package/dist/ui/views/JtapiTroubleshootView.js.map +1 -0
  245. package/dist/ui/views/MainMenu.d.ts +8 -0
  246. package/dist/ui/views/MainMenu.d.ts.map +1 -0
  247. package/dist/ui/views/MainMenu.js +110 -0
  248. package/dist/ui/views/MainMenu.js.map +1 -0
  249. package/dist/ui/views/MigrateHistoryView.d.ts +2 -0
  250. package/dist/ui/views/MigrateHistoryView.d.ts.map +1 -0
  251. package/dist/ui/views/MigrateHistoryView.js +25 -0
  252. package/dist/ui/views/MigrateHistoryView.js.map +1 -0
  253. package/dist/ui/views/MigrateRollbackView.d.ts +6 -0
  254. package/dist/ui/views/MigrateRollbackView.d.ts.map +1 -0
  255. package/dist/ui/views/MigrateRollbackView.js +50 -0
  256. package/dist/ui/views/MigrateRollbackView.js.map +1 -0
  257. package/dist/ui/views/MigrateRunView.d.ts +2 -0
  258. package/dist/ui/views/MigrateRunView.d.ts.map +1 -0
  259. package/dist/ui/views/MigrateRunView.js +50 -0
  260. package/dist/ui/views/MigrateRunView.js.map +1 -0
  261. package/dist/ui/views/MigrateStatusView.d.ts +2 -0
  262. package/dist/ui/views/MigrateStatusView.d.ts.map +1 -0
  263. package/dist/ui/views/MigrateStatusView.js +88 -0
  264. package/dist/ui/views/MigrateStatusView.js.map +1 -0
  265. package/dist/ui/views/MigrateWatchView.d.ts +6 -0
  266. package/dist/ui/views/MigrateWatchView.d.ts.map +1 -0
  267. package/dist/ui/views/MigrateWatchView.js +83 -0
  268. package/dist/ui/views/MigrateWatchView.js.map +1 -0
  269. package/dist/ui/views/OfflineListView.d.ts +2 -0
  270. package/dist/ui/views/OfflineListView.d.ts.map +1 -0
  271. package/dist/ui/views/OfflineListView.js +47 -0
  272. package/dist/ui/views/OfflineListView.js.map +1 -0
  273. package/dist/ui/views/SecretsSetupView.d.ts +2 -0
  274. package/dist/ui/views/SecretsSetupView.d.ts.map +1 -0
  275. package/dist/ui/views/SecretsSetupView.js +94 -0
  276. package/dist/ui/views/SecretsSetupView.js.map +1 -0
  277. package/dist/ui/views/SecretsStatusView.d.ts +2 -0
  278. package/dist/ui/views/SecretsStatusView.d.ts.map +1 -0
  279. package/dist/ui/views/SecretsStatusView.js +36 -0
  280. package/dist/ui/views/SecretsStatusView.js.map +1 -0
  281. package/dist/ui/views/StatusView.d.ts +2 -0
  282. package/dist/ui/views/StatusView.d.ts.map +1 -0
  283. package/dist/ui/views/StatusView.js +80 -0
  284. package/dist/ui/views/StatusView.js.map +1 -0
  285. package/dist/utils/output.d.ts +11 -0
  286. package/dist/utils/output.d.ts.map +1 -0
  287. package/dist/utils/output.js +30 -0
  288. package/dist/utils/output.js.map +1 -0
  289. package/dist/utils/prompt.d.ts +6 -0
  290. package/dist/utils/prompt.d.ts.map +1 -0
  291. package/dist/utils/prompt.js +25 -0
  292. package/dist/utils/prompt.js.map +1 -0
  293. package/dist/utils/version.d.ts +8 -0
  294. package/dist/utils/version.d.ts.map +1 -0
  295. package/dist/utils/version.js +35 -0
  296. package/dist/utils/version.js.map +1 -0
  297. package/package.json +59 -0
package/dist/index.js ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerStatusCommand } from './commands/status.js';
4
+ import { registerUpdateCommand } from './commands/update.js';
5
+ import { registerDbCommand } from './commands/db.js';
6
+ import { registerMigrateCommand } from './commands/migrate.js';
7
+ import { registerConfigCommand } from './commands/config.js';
8
+ import { registerDockerCommand } from './commands/docker.js';
9
+ import { registerOfflineCommand } from './commands/offline.js';
10
+ import { registerDiagCommand } from './commands/diag.js';
11
+ import { registerJtapiCommand } from './commands/jtapi.js';
12
+ import { registerSecretsCommand } from './commands/secrets.js';
13
+ const LOGO = `
14
+ ______ ____ ______ __ __
15
+ / ____/___ _/ / / /_ __/__ / /__ ____ ___ ___ / /________ __
16
+ / / / __ \`/ / / / / / _ \\/ / _ \\/ __ \`__ \\/ _ \\/ __/ ___/ / / /
17
+ / /___/ /_/ / / / / / / __/ / __/ / / / / / __/ /_/ / / /_/ /
18
+ \\____/\\__,_/_/_/ /_/ \\___/_/\\___/_/ /_/ /_/\\___/\\__/_/ \\__, /
19
+ /____/
20
+
21
+ https://calltelemetry.com`;
22
+ const program = new Command();
23
+ program
24
+ .name('ct')
25
+ .description('CallTelemetry appliance management CLI')
26
+ .version('0.1.0')
27
+ .hook('preAction', () => {
28
+ console.log(LOGO);
29
+ console.log();
30
+ });
31
+ registerStatusCommand(program);
32
+ registerUpdateCommand(program);
33
+ registerDbCommand(program);
34
+ registerMigrateCommand(program);
35
+ registerConfigCommand(program);
36
+ registerDockerCommand(program);
37
+ registerOfflineCommand(program);
38
+ registerDiagCommand(program);
39
+ registerJtapiCommand(program);
40
+ registerSecretsCommand(program);
41
+ // Interactive menu when `ct` is run with no arguments on a TTY
42
+ const hasCommand = process.argv.length > 2;
43
+ if (!hasCommand && process.stdout.isTTY) {
44
+ // Dynamic import to avoid loading React/Ink for direct command invocations
45
+ import('ink').then(async ({ render }) => {
46
+ const React = await import('react');
47
+ const { MainMenu } = await import('./ui/views/MainMenu.js');
48
+ const { unmount, waitUntilExit } = render(React.createElement(MainMenu, {
49
+ version: '0.1.0',
50
+ onSelect: (command) => {
51
+ unmount();
52
+ // Re-invoke Commander with the selected command
53
+ program.parse(['node', 'ct', ...command.split(' ')]);
54
+ },
55
+ onExit: () => {
56
+ unmount();
57
+ },
58
+ }));
59
+ await waitUntilExit();
60
+ });
61
+ }
62
+ else {
63
+ program.parse();
64
+ }
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,IAAI,GAAG;;;;;;;;0BAQa,CAAC;AAE3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC;KAChB,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,+DAA+D;AAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAE3C,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxC,2EAA2E;IAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAE5D,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CACvC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC5B,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,CAAC,OAAe,EAAE,EAAE;gBAC5B,OAAO,EAAE,CAAC;gBACV,gDAAgD;gBAChD,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACX,OAAO,EAAE,CAAC;YACZ,CAAC;SACF,CAAC,CACH,CAAC;QAEF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function fetchLatestVersion(channel?: 'stable' | 'latest'): Promise<string>;
2
+ export declare function downloadBundle(version: string): Promise<void>;
3
+ export declare function extractImages(composeFile: string): Promise<string[]>;
4
+ export declare function checkImageAvailability(composeFile: string): Promise<boolean>;
5
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/lib/bundle.ts"],"names":[],"mappings":"AAOA,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,QAAQ,GAAG,QAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBjG;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FnE;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW1E;AAED,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBlF"}
@@ -0,0 +1,134 @@
1
+ import { execa } from 'execa';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, rename, rm, copyFile, chmod } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { getPaths } from './paths.js';
6
+ import * as out from '../utils/output.js';
7
+ export async function fetchLatestVersion(channel = 'stable') {
8
+ const { gcsBaseUrl } = getPaths();
9
+ const file = channel === 'stable' ? 'latest-stable.txt' : 'latest.txt';
10
+ const url = `${gcsBaseUrl}/${file}`;
11
+ try {
12
+ const { stdout } = await execa('curl', ['-sfL', url]);
13
+ const version = stdout.trim();
14
+ if (!version)
15
+ throw new Error('Empty response');
16
+ return version;
17
+ }
18
+ catch {
19
+ throw new Error(`Failed to fetch latest ${channel} version.\n` +
20
+ (channel === 'stable'
21
+ ? "No stable release available yet. Use 'ct update --latest' for pre-release."
22
+ : "Specify a version manually: ct update <version>"));
23
+ }
24
+ }
25
+ export async function downloadBundle(version) {
26
+ const { gcsBundleBaseUrl, installDir, composeFile } = getPaths();
27
+ const bundleName = `calltelemetry-bundle-${version}.tar.gz`;
28
+ const bundleUrl = `${gcsBundleBaseUrl}/${version}/${bundleName}`;
29
+ const extractDir = join(installDir, `bundle-extract-${process.pid}`);
30
+ console.log(`Downloading config bundle for version ${version}...`);
31
+ try {
32
+ await execa('curl', ['-fL', '--progress-bar', bundleUrl, '-o', bundleName], {
33
+ cwd: installDir,
34
+ stdout: 'inherit',
35
+ stderr: 'inherit',
36
+ });
37
+ }
38
+ catch {
39
+ throw new Error(`Failed to download bundle from GCS\n` +
40
+ `URL: ${bundleUrl}\n\n` +
41
+ `Check available releases at: https://github.com/calltelemetry/calltelemetry/releases`);
42
+ }
43
+ out.ok('Bundle downloaded');
44
+ // Extract
45
+ console.log('Extracting config files...');
46
+ await mkdir(extractDir, { recursive: true });
47
+ await execa('tar', ['-xzf', bundleName, '-C', extractDir, '--strip-components=1'], {
48
+ cwd: installDir,
49
+ });
50
+ const extractedCompose = join(extractDir, 'docker-compose.yml');
51
+ if (!existsSync(extractedCompose)) {
52
+ await rm(extractDir, { recursive: true, force: true });
53
+ throw new Error('Bundle missing docker-compose.yml');
54
+ }
55
+ // Move docker-compose.yml to temp
56
+ const tempFile = join(installDir, 'temp-docker-compose.yml');
57
+ await rename(extractedCompose, tempFile);
58
+ out.ok('docker-compose.yml');
59
+ // Update cli.sh if present
60
+ const extractedCli = join(extractDir, 'cli.sh');
61
+ if (existsSync(extractedCli)) {
62
+ const cliDest = join(installDir, 'cli.sh');
63
+ await copyFile(extractedCli, cliDest);
64
+ await chmod(cliDest, 0o755);
65
+ out.ok('cli.sh');
66
+ }
67
+ // Prometheus
68
+ const extractedProm = join(extractDir, 'prometheus', 'prometheus.yml');
69
+ if (existsSync(extractedProm)) {
70
+ const promDir = join(installDir, 'prometheus');
71
+ await mkdir(promDir, { recursive: true });
72
+ await rename(extractedProm, join(promDir, 'prometheus.yml'));
73
+ out.ok('prometheus/prometheus.yml');
74
+ }
75
+ // Grafana
76
+ const extractedGrafana = join(extractDir, 'grafana');
77
+ if (existsSync(extractedGrafana)) {
78
+ const grafanaDir = join(installDir, 'grafana');
79
+ await mkdir(join(grafanaDir, 'dashboards'), { recursive: true });
80
+ await mkdir(join(grafanaDir, 'provisioning', 'datasources'), { recursive: true });
81
+ await mkdir(join(grafanaDir, 'provisioning', 'dashboards'), { recursive: true });
82
+ // Copy dashboards and provisioning recursively
83
+ await execa('cp', ['-r', join(extractedGrafana, 'dashboards'), grafanaDir]).catch(() => { });
84
+ await execa('cp', ['-r', join(extractedGrafana, 'provisioning'), grafanaDir]).catch(() => { });
85
+ out.ok('grafana configs');
86
+ }
87
+ // Nats
88
+ const extractedNats = join(extractDir, 'nats.conf');
89
+ if (existsSync(extractedNats)) {
90
+ await copyFile(extractedNats, join(installDir, 'nats.conf'));
91
+ out.ok('nats.conf');
92
+ }
93
+ // Caddyfile
94
+ const extractedCaddy = join(extractDir, 'Caddyfile');
95
+ if (existsSync(extractedCaddy)) {
96
+ await copyFile(extractedCaddy, join(installDir, 'Caddyfile'));
97
+ out.ok('Caddyfile');
98
+ }
99
+ // Cleanup
100
+ await rm(join(installDir, bundleName), { force: true });
101
+ await rm(extractDir, { recursive: true, force: true });
102
+ out.ok('All config files extracted');
103
+ }
104
+ export async function extractImages(composeFile) {
105
+ const { readFileSync } = await import('node:fs');
106
+ const content = readFileSync(composeFile, 'utf-8');
107
+ const images = [];
108
+ for (const line of content.split('\n')) {
109
+ if (line.includes('image') && line.includes('calltelemetry')) {
110
+ const match = line.match(/image:\s*"?([^"\s]+)"?/);
111
+ if (match)
112
+ images.push(match[1]);
113
+ }
114
+ }
115
+ return images;
116
+ }
117
+ export async function checkImageAvailability(composeFile) {
118
+ const images = await extractImages(composeFile);
119
+ let allAvailable = true;
120
+ console.log('Checking image availability...');
121
+ for (const image of images) {
122
+ process.stdout.write(` Checking ${image}... `);
123
+ try {
124
+ await execa('docker', ['manifest', 'inspect', image]);
125
+ console.log('✓ Available');
126
+ }
127
+ catch {
128
+ console.log('✗ Not available');
129
+ allAvailable = false;
130
+ }
131
+ }
132
+ return allAvailable;
133
+ }
134
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/lib/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA+B,QAAQ;IAC9E,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC;IACvE,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,0BAA0B,OAAO,aAAa;YAC9C,CAAC,OAAO,KAAK,QAAQ;gBACnB,CAAC,CAAC,4EAA4E;gBAC9E,CAAC,CAAC,iDAAiD,CAAC,CACvD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjE,MAAM,UAAU,GAAG,wBAAwB,OAAO,SAAS,CAAC;IAC5D,MAAM,SAAS,GAAG,GAAG,gBAAgB,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;IACjE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,KAAK,CAAC,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE;YAC1E,GAAG,EAAE,UAAU;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sCAAsC;YACtC,QAAQ,SAAS,MAAM;YACvB,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAE5B,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,sBAAsB,CAAC,EAAE;QACjF,GAAG,EAAE,UAAU;KAChB,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;IAC7D,MAAM,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAE7B,2BAA2B;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACnB,CAAC;IAED,aAAa;IACb,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACvE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC7D,GAAG,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC;IACtC,CAAC;IAED,UAAU;IACV,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjF,+CAA+C;QAC/C,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9F,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO;IACP,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAC7D,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC;IAED,YAAY;IACZ,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAC9D,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC;IAED,UAAU;IACV,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvD,GAAG,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACnD,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAmB;IAC9D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,YAAY,GAAG,IAAI,CAAC;IAExB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function generateSelfSignedCerts(): Promise<void>;
2
+ export declare function resetCerts(): Promise<void>;
3
+ //# sourceMappingURL=certs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certs.d.ts","sourceRoot":"","sources":["../../src/lib/certs.ts"],"names":[],"mappings":"AAMA,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB7D;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAQhD"}
@@ -0,0 +1,29 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { execa } from 'execa';
4
+ import { getPaths } from './paths.js';
5
+ import { mkdirSafe } from './fs.js';
6
+ export async function generateSelfSignedCerts() {
7
+ const { certsDir } = getPaths();
8
+ const certFile = join(certsDir, 'appliance.crt');
9
+ const keyFile = join(certsDir, 'appliance_key.pem');
10
+ if (existsSync(certFile) && existsSync(keyFile)) {
11
+ return;
12
+ }
13
+ await mkdirSafe(certsDir);
14
+ await execa('openssl', [
15
+ 'req', '-x509', '-nodes', '-days', '365',
16
+ '-newkey', 'rsa:2048',
17
+ '-keyout', keyFile,
18
+ '-out', certFile,
19
+ '-subj', '/CN=appliance.calltelemetry.internal',
20
+ ]);
21
+ }
22
+ export async function resetCerts() {
23
+ const { certsDir } = getPaths();
24
+ if (existsSync(certsDir)) {
25
+ await execa('sudo', ['rm', '-rf', certsDir]);
26
+ }
27
+ await generateSelfSignedCerts();
28
+ }
29
+ //# sourceMappingURL=certs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/lib/certs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,KAAK,CAAC,SAAS,EAAE;QACrB,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK;QACxC,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,OAAO;QAClB,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,sCAAsC;KAChD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEhC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,uBAAuB,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,36 @@
1
+ export type ComposeCommand = 'docker compose' | 'docker-compose';
2
+ export declare function detectComposeCommand(): Promise<ComposeCommand>;
3
+ export declare function compose(args: string[], options?: {
4
+ stdin?: string;
5
+ pipe?: boolean;
6
+ }): Promise<import("execa").Result<{
7
+ cwd: string;
8
+ stdin: "pipe" | undefined;
9
+ stdout: "pipe" | "inherit";
10
+ stderr: "pipe" | "inherit";
11
+ }>>;
12
+ export declare function composeExec(service: string, command: string[], options?: {
13
+ env?: Record<string, string>;
14
+ pipe?: boolean;
15
+ }): Promise<import("execa").Result<{
16
+ cwd: string;
17
+ stdout: "pipe" | "inherit";
18
+ stderr: "pipe" | "inherit";
19
+ }>>;
20
+ export declare function composeWithFiles(files: string[], args: string[], options?: {
21
+ pipe?: boolean;
22
+ }): Promise<import("execa").Result<{
23
+ cwd: string;
24
+ stdout: "pipe" | "inherit";
25
+ stderr: "pipe" | "inherit";
26
+ }>>;
27
+ export declare function composePs(service?: string): Promise<string>;
28
+ export declare function getAllComposeFiles(): string[];
29
+ export declare function composeUp(args?: string[], options?: {
30
+ pipe?: boolean;
31
+ }): Promise<import("execa").Result<{
32
+ cwd: string;
33
+ stdout: "pipe" | "inherit";
34
+ stderr: "pipe" | "inherit";
35
+ }>>;
36
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/lib/compose.ts"],"names":[],"mappings":"AA4CA,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAIjE,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAoBpE;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;IAmBzF;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;;;;IAkBA;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;;;;IAkBnG;AAED,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYjE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAO7C;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;;;;IAEhF"}
@@ -0,0 +1,137 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { execa } from 'execa';
3
+ import { getPaths } from './paths.js';
4
+ const MIN_API_VERSION = '1.44';
5
+ function compareVersions(a, b) {
6
+ const pa = a.split('.').map(Number);
7
+ const pb = b.split('.').map(Number);
8
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
9
+ const na = pa[i] ?? 0;
10
+ const nb = pb[i] ?? 0;
11
+ if (na !== nb)
12
+ return na - nb;
13
+ }
14
+ return 0;
15
+ }
16
+ async function getDockerApiVersion() {
17
+ try {
18
+ const { stdout } = await execa('docker', ['version', '--format', '{{.Client.APIVersion}}']);
19
+ return stdout.trim();
20
+ }
21
+ catch {
22
+ return '0';
23
+ }
24
+ }
25
+ async function hasDockerComposePlugin() {
26
+ try {
27
+ await execa('docker', ['compose', 'version']);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ async function hasStandaloneCompose() {
35
+ try {
36
+ await execa('docker-compose', ['version']);
37
+ return true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ let cachedCmd = null;
44
+ export async function detectComposeCommand() {
45
+ if (cachedCmd)
46
+ return cachedCmd;
47
+ const apiVersion = await getDockerApiVersion();
48
+ const apiOk = compareVersions(apiVersion, MIN_API_VERSION) >= 0;
49
+ if (await hasDockerComposePlugin() && apiOk) {
50
+ cachedCmd = 'docker compose';
51
+ return cachedCmd;
52
+ }
53
+ if (await hasStandaloneCompose()) {
54
+ cachedCmd = 'docker-compose';
55
+ return cachedCmd;
56
+ }
57
+ throw new Error('Neither "docker compose" nor "docker-compose" is available.\n' +
58
+ 'Install Docker with the compose plugin: https://docs.docker.com/compose/install/');
59
+ }
60
+ export async function compose(args, options) {
61
+ const cmd = await detectComposeCommand();
62
+ const { installDir } = getPaths();
63
+ if (cmd === 'docker compose') {
64
+ return execa('docker', ['compose', ...args], {
65
+ cwd: installDir,
66
+ stdin: options?.stdin ? 'pipe' : undefined,
67
+ stdout: options?.pipe ? 'pipe' : 'inherit',
68
+ stderr: options?.pipe ? 'pipe' : 'inherit',
69
+ });
70
+ }
71
+ return execa('docker-compose', args, {
72
+ cwd: installDir,
73
+ stdin: options?.stdin ? 'pipe' : undefined,
74
+ stdout: options?.pipe ? 'pipe' : 'inherit',
75
+ stderr: options?.pipe ? 'pipe' : 'inherit',
76
+ });
77
+ }
78
+ export async function composeExec(service, command, options) {
79
+ const cmd = await detectComposeCommand();
80
+ const { installDir } = getPaths();
81
+ const envArgs = Object.entries(options?.env ?? {}).flatMap(([k, v]) => ['-e', `${k}=${v}`]);
82
+ if (cmd === 'docker compose') {
83
+ return execa('docker', ['compose', 'exec', '-T', ...envArgs, service, ...command], {
84
+ cwd: installDir,
85
+ stdout: options?.pipe ? 'pipe' : 'inherit',
86
+ stderr: options?.pipe ? 'pipe' : 'inherit',
87
+ });
88
+ }
89
+ return execa('docker-compose', ['exec', '-T', ...envArgs, service, ...command], {
90
+ cwd: installDir,
91
+ stdout: options?.pipe ? 'pipe' : 'inherit',
92
+ stderr: options?.pipe ? 'pipe' : 'inherit',
93
+ });
94
+ }
95
+ export async function composeWithFiles(files, args, options) {
96
+ const cmd = await detectComposeCommand();
97
+ const { installDir } = getPaths();
98
+ const fileArgs = files.flatMap(f => ['-f', f]);
99
+ if (cmd === 'docker compose') {
100
+ return execa('docker', ['compose', ...fileArgs, ...args], {
101
+ cwd: installDir,
102
+ stdout: options?.pipe ? 'pipe' : 'inherit',
103
+ stderr: options?.pipe ? 'pipe' : 'inherit',
104
+ });
105
+ }
106
+ return execa('docker-compose', [...fileArgs, ...args], {
107
+ cwd: installDir,
108
+ stdout: options?.pipe ? 'pipe' : 'inherit',
109
+ stderr: options?.pipe ? 'pipe' : 'inherit',
110
+ });
111
+ }
112
+ export async function composePs(service) {
113
+ const cmd = await detectComposeCommand();
114
+ const { installDir } = getPaths();
115
+ const args = service ? ['ps', '-q', service] : ['ps'];
116
+ if (cmd === 'docker compose') {
117
+ const { stdout } = await execa('docker', ['compose', ...args], { cwd: installDir });
118
+ return stdout.trim();
119
+ }
120
+ const { stdout } = await execa('docker-compose', args, { cwd: installDir });
121
+ return stdout.trim();
122
+ }
123
+ export function getAllComposeFiles() {
124
+ const { composeFile, overrideFile, jtapiOverlayFile, jtapiStateFile, secretsOverlayFile } = getPaths();
125
+ const files = [composeFile];
126
+ if (existsSync(overrideFile))
127
+ files.push(overrideFile);
128
+ if (existsSync(jtapiStateFile) && existsSync(jtapiOverlayFile))
129
+ files.push(jtapiOverlayFile);
130
+ if (existsSync(secretsOverlayFile))
131
+ files.push(secretsOverlayFile);
132
+ return files;
133
+ }
134
+ export async function composeUp(args = [], options) {
135
+ return composeWithFiles(getAllComposeFiles(), ['up', ...args], options);
136
+ }
137
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/lib/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const DB_USER: string;
2
+ export declare const DB_NAME: string;
3
+ export declare const PG_ENV: {
4
+ PGPASSWORD: string;
5
+ };
6
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,QAAwB,CAAC;AAC7C,eAAO,MAAM,OAAO,QAAsB,CAAC;AAC3C,eAAO,MAAM,MAAM;;CAA4C,CAAC"}
package/dist/lib/db.js ADDED
@@ -0,0 +1,6 @@
1
+ import { getSecrets } from './secrets.js';
2
+ const secrets = getSecrets();
3
+ export const DB_USER = secrets.POSTGRES_USER;
4
+ export const DB_NAME = secrets.POSTGRES_DB;
5
+ export const PG_ENV = { PGPASSWORD: secrets.POSTGRES_PASSWORD };
6
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;AAC7C,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Check if the current process can write to a path.
3
+ * Returns true if the file is writable or the parent directory is writable (for new files).
4
+ */
5
+ export declare function canWrite(path: string): boolean;
6
+ /**
7
+ * Write a file, falling back to sudo tee if permission denied.
8
+ */
9
+ export declare function writeFileSafe(path: string, content: string, options?: {
10
+ mode?: number;
11
+ }): Promise<void>;
12
+ /**
13
+ * Remove a file, falling back to sudo rm if permission denied.
14
+ */
15
+ export declare function removeSafe(path: string): Promise<void>;
16
+ /**
17
+ * Create a directory, falling back to sudo mkdir if permission denied.
18
+ */
19
+ export declare function mkdirSafe(path: string): Promise<void>;
20
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAa9C;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7G;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5D;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3D"}
package/dist/lib/fs.js ADDED
@@ -0,0 +1,72 @@
1
+ import { accessSync, constants } from 'node:fs';
2
+ import { writeFile as fsWriteFile, rm as fsRm, mkdir as fsMkdir } from 'node:fs/promises';
3
+ import { execa } from 'execa';
4
+ import { dirname } from 'node:path';
5
+ /**
6
+ * Check if the current process can write to a path.
7
+ * Returns true if the file is writable or the parent directory is writable (for new files).
8
+ */
9
+ export function canWrite(path) {
10
+ try {
11
+ accessSync(path, constants.W_OK);
12
+ return true;
13
+ }
14
+ catch {
15
+ // File doesn't exist — check parent dir
16
+ try {
17
+ accessSync(dirname(path), constants.W_OK);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ }
25
+ /**
26
+ * Write a file, falling back to sudo tee if permission denied.
27
+ */
28
+ export async function writeFileSafe(path, content, options) {
29
+ if (canWrite(path)) {
30
+ await fsWriteFile(path, content, options);
31
+ return;
32
+ }
33
+ // Fall back to sudo tee
34
+ const proc = execa('sudo', ['tee', path], { input: content, stdout: 'ignore', stderr: 'pipe' });
35
+ await proc;
36
+ if (options?.mode) {
37
+ await execa('sudo', ['chmod', options.mode.toString(8), path]);
38
+ }
39
+ }
40
+ /**
41
+ * Remove a file, falling back to sudo rm if permission denied.
42
+ */
43
+ export async function removeSafe(path) {
44
+ try {
45
+ await fsRm(path, { force: true });
46
+ }
47
+ catch (err) {
48
+ if (err.code === 'EACCES' || err.code === 'EPERM') {
49
+ await execa('sudo', ['rm', '-f', path]);
50
+ }
51
+ else {
52
+ throw err;
53
+ }
54
+ }
55
+ }
56
+ /**
57
+ * Create a directory, falling back to sudo mkdir if permission denied.
58
+ */
59
+ export async function mkdirSafe(path) {
60
+ try {
61
+ await fsMkdir(path, { recursive: true });
62
+ }
63
+ catch (err) {
64
+ if (err.code === 'EACCES' || err.code === 'EPERM') {
65
+ await execa('sudo', ['mkdir', '-p', path]);
66
+ }
67
+ else {
68
+ throw err;
69
+ }
70
+ }
71
+ }
72
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;QACxC,IAAI,CAAC;YACH,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe,EAAE,OAA2B;IAC5F,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,MAAM,IAAI,CAAC;IAEX,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClD,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClD,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function isJtapiEnabled(): boolean;
2
+ export declare function hasOverlayFile(): boolean;
3
+ export declare function enableJtapi(): Promise<void>;
4
+ export declare function disableJtapi(): Promise<void>;
5
+ export declare function getComposeFiles(): string[];
6
+ //# sourceMappingURL=jtapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jtapi.d.ts","sourceRoot":"","sources":["../../src/lib/jtapi.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAO1C"}
@@ -0,0 +1,27 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { getPaths } from './paths.js';
3
+ import { writeFileSafe, removeSafe } from './fs.js';
4
+ export function isJtapiEnabled() {
5
+ const { jtapiStateFile, jtapiOverlayFile } = getPaths();
6
+ return existsSync(jtapiStateFile) && existsSync(jtapiOverlayFile);
7
+ }
8
+ export function hasOverlayFile() {
9
+ return existsSync(getPaths().jtapiOverlayFile);
10
+ }
11
+ export async function enableJtapi() {
12
+ await writeFileSafe(getPaths().jtapiStateFile, '');
13
+ }
14
+ export async function disableJtapi() {
15
+ const { jtapiStateFile } = getPaths();
16
+ if (existsSync(jtapiStateFile))
17
+ await removeSafe(jtapiStateFile);
18
+ }
19
+ export function getComposeFiles() {
20
+ const { composeFile, jtapiOverlayFile, jtapiStateFile } = getPaths();
21
+ const files = [composeFile];
22
+ if (existsSync(jtapiStateFile) && existsSync(jtapiOverlayFile)) {
23
+ files.push(jtapiOverlayFile);
24
+ }
25
+ return files;
26
+ }
27
+ //# sourceMappingURL=jtapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jtapi.js","sourceRoot":"","sources":["../../src/lib/jtapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC;IACxD,OAAO,UAAU,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtC,IAAI,UAAU,CAAC,cAAc,CAAC;QAAE,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5B,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}