@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.
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +201 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/db.d.ts +3 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +143 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/diag.d.ts +3 -0
- package/dist/commands/diag.d.ts.map +1 -0
- package/dist/commands/diag.js +123 -0
- package/dist/commands/diag.js.map +1 -0
- package/dist/commands/docker.d.ts +3 -0
- package/dist/commands/docker.d.ts.map +1 -0
- package/dist/commands/docker.js +34 -0
- package/dist/commands/docker.js.map +1 -0
- package/dist/commands/jtapi.d.ts +3 -0
- package/dist/commands/jtapi.d.ts.map +1 -0
- package/dist/commands/jtapi.js +36 -0
- package/dist/commands/jtapi.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +49 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/offline.d.ts +3 -0
- package/dist/commands/offline.d.ts.map +1 -0
- package/dist/commands/offline.js +170 -0
- package/dist/commands/offline.js.map +1 -0
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +55 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +13 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +202 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bundle.d.ts +5 -0
- package/dist/lib/bundle.d.ts.map +1 -0
- package/dist/lib/bundle.js +134 -0
- package/dist/lib/bundle.js.map +1 -0
- package/dist/lib/certs.d.ts +3 -0
- package/dist/lib/certs.d.ts.map +1 -0
- package/dist/lib/certs.js +29 -0
- package/dist/lib/certs.js.map +1 -0
- package/dist/lib/compose.d.ts +36 -0
- package/dist/lib/compose.d.ts.map +1 -0
- package/dist/lib/compose.js +137 -0
- package/dist/lib/compose.js.map +1 -0
- package/dist/lib/db.d.ts +6 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +6 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/fs.d.ts +20 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +72 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/jtapi.d.ts +6 -0
- package/dist/lib/jtapi.d.ts.map +1 -0
- package/dist/lib/jtapi.js +27 -0
- package/dist/lib/jtapi.js.map +1 -0
- package/dist/lib/network.d.ts +43 -0
- package/dist/lib/network.d.ts.map +1 -0
- package/dist/lib/network.js +172 -0
- package/dist/lib/network.js.map +1 -0
- package/dist/lib/paths.d.ts +19 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +57 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/postgres.d.ts +4 -0
- package/dist/lib/postgres.d.ts.map +1 -0
- package/dist/lib/postgres.js +49 -0
- package/dist/lib/postgres.js.map +1 -0
- package/dist/lib/rpc.d.ts +5 -0
- package/dist/lib/rpc.d.ts.map +1 -0
- package/dist/lib/rpc.js +28 -0
- package/dist/lib/rpc.js.map +1 -0
- package/dist/lib/secrets.d.ts +38 -0
- package/dist/lib/secrets.d.ts.map +1 -0
- package/dist/lib/secrets.js +132 -0
- package/dist/lib/secrets.js.map +1 -0
- package/dist/lib/system.d.ts +12 -0
- package/dist/lib/system.d.ts.map +1 -0
- package/dist/lib/system.js +61 -0
- package/dist/lib/system.js.map +1 -0
- package/dist/ui/components/AppShell.d.ts +9 -0
- package/dist/ui/components/AppShell.d.ts.map +1 -0
- package/dist/ui/components/AppShell.js +6 -0
- package/dist/ui/components/AppShell.js.map +1 -0
- package/dist/ui/components/Confirm.d.ts +7 -0
- package/dist/ui/components/Confirm.d.ts.map +1 -0
- package/dist/ui/components/Confirm.js +14 -0
- package/dist/ui/components/Confirm.js.map +1 -0
- package/dist/ui/components/DataTable.d.ts +12 -0
- package/dist/ui/components/DataTable.d.ts.map +1 -0
- package/dist/ui/components/DataTable.js +28 -0
- package/dist/ui/components/DataTable.js.map +1 -0
- package/dist/ui/components/Divider.d.ts +6 -0
- package/dist/ui/components/Divider.d.ts.map +1 -0
- package/dist/ui/components/Divider.js +6 -0
- package/dist/ui/components/Divider.js.map +1 -0
- package/dist/ui/components/KeyValue.d.ts +11 -0
- package/dist/ui/components/KeyValue.d.ts.map +1 -0
- package/dist/ui/components/KeyValue.js +7 -0
- package/dist/ui/components/KeyValue.js.map +1 -0
- package/dist/ui/components/Section.d.ts +8 -0
- package/dist/ui/components/Section.d.ts.map +1 -0
- package/dist/ui/components/Section.js +6 -0
- package/dist/ui/components/Section.js.map +1 -0
- package/dist/ui/components/SelectMenu.d.ts +14 -0
- package/dist/ui/components/SelectMenu.d.ts.map +1 -0
- package/dist/ui/components/SelectMenu.js +55 -0
- package/dist/ui/components/SelectMenu.js.map +1 -0
- package/dist/ui/components/ShellOutput.d.ts +7 -0
- package/dist/ui/components/ShellOutput.d.ts.map +1 -0
- package/dist/ui/components/ShellOutput.js +10 -0
- package/dist/ui/components/ShellOutput.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +6 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +7 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/StatusBox.d.ts +8 -0
- package/dist/ui/components/StatusBox.d.ts.map +1 -0
- package/dist/ui/components/StatusBox.js +12 -0
- package/dist/ui/components/StatusBox.js.map +1 -0
- package/dist/ui/components/StatusLine.d.ts +8 -0
- package/dist/ui/components/StatusLine.d.ts.map +1 -0
- package/dist/ui/components/StatusLine.js +13 -0
- package/dist/ui/components/StatusLine.js.map +1 -0
- package/dist/ui/components/StepList.d.ts +11 -0
- package/dist/ui/components/StepList.d.ts.map +1 -0
- package/dist/ui/components/StepList.js +19 -0
- package/dist/ui/components/StepList.js.map +1 -0
- package/dist/ui/components/SubSection.d.ts +8 -0
- package/dist/ui/components/SubSection.d.ts.map +1 -0
- package/dist/ui/components/SubSection.js +6 -0
- package/dist/ui/components/SubSection.js.map +1 -0
- package/dist/ui/components/TextInput.d.ts +11 -0
- package/dist/ui/components/TextInput.d.ts.map +1 -0
- package/dist/ui/components/TextInput.js +7 -0
- package/dist/ui/components/TextInput.js.map +1 -0
- package/dist/ui/components/index.d.ts +16 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +15 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +7 -0
- package/dist/ui/hooks/index.d.ts.map +1 -0
- package/dist/ui/hooks/index.js +5 -0
- package/dist/ui/hooks/index.js.map +1 -0
- package/dist/ui/hooks/useAsyncTask.d.ts +9 -0
- package/dist/ui/hooks/useAsyncTask.d.ts.map +1 -0
- package/dist/ui/hooks/useAsyncTask.js +22 -0
- package/dist/ui/hooks/useAsyncTask.js.map +1 -0
- package/dist/ui/hooks/usePolling.d.ts +8 -0
- package/dist/ui/hooks/usePolling.d.ts.map +1 -0
- package/dist/ui/hooks/usePolling.js +43 -0
- package/dist/ui/hooks/usePolling.js.map +1 -0
- package/dist/ui/hooks/useStepRunner.d.ts +16 -0
- package/dist/ui/hooks/useStepRunner.d.ts.map +1 -0
- package/dist/ui/hooks/useStepRunner.js +42 -0
- package/dist/ui/hooks/useStepRunner.js.map +1 -0
- package/dist/ui/hooks/useStreamingProcess.d.ts +8 -0
- package/dist/ui/hooks/useStreamingProcess.d.ts.map +1 -0
- package/dist/ui/hooks/useStreamingProcess.js +49 -0
- package/dist/ui/hooks/useStreamingProcess.js.map +1 -0
- package/dist/ui/types.d.ts +24 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +2 -0
- package/dist/ui/types.js.map +1 -0
- package/dist/ui/views/CertsStatusView.d.ts +2 -0
- package/dist/ui/views/CertsStatusView.d.ts.map +1 -0
- package/dist/ui/views/CertsStatusView.js +95 -0
- package/dist/ui/views/CertsStatusView.js.map +1 -0
- package/dist/ui/views/DbBackupView.d.ts +2 -0
- package/dist/ui/views/DbBackupView.d.ts.map +1 -0
- package/dist/ui/views/DbBackupView.js +62 -0
- package/dist/ui/views/DbBackupView.js.map +1 -0
- package/dist/ui/views/DbCompactView.d.ts +2 -0
- package/dist/ui/views/DbCompactView.d.ts.map +1 -0
- package/dist/ui/views/DbCompactView.js +28 -0
- package/dist/ui/views/DbCompactView.js.map +1 -0
- package/dist/ui/views/DbListView.d.ts +2 -0
- package/dist/ui/views/DbListView.d.ts.map +1 -0
- package/dist/ui/views/DbListView.js +30 -0
- package/dist/ui/views/DbListView.js.map +1 -0
- package/dist/ui/views/DbSizeView.d.ts +2 -0
- package/dist/ui/views/DbSizeView.d.ts.map +1 -0
- package/dist/ui/views/DbSizeView.js +21 -0
- package/dist/ui/views/DbSizeView.js.map +1 -0
- package/dist/ui/views/DbStatusView.d.ts +2 -0
- package/dist/ui/views/DbStatusView.d.ts.map +1 -0
- package/dist/ui/views/DbStatusView.js +41 -0
- package/dist/ui/views/DbStatusView.js.map +1 -0
- package/dist/ui/views/DbTablesView.d.ts +6 -0
- package/dist/ui/views/DbTablesView.d.ts.map +1 -0
- package/dist/ui/views/DbTablesView.js +28 -0
- package/dist/ui/views/DbTablesView.js.map +1 -0
- package/dist/ui/views/DiagDatabaseView.d.ts +2 -0
- package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -0
- package/dist/ui/views/DiagDatabaseView.js +51 -0
- package/dist/ui/views/DiagDatabaseView.js.map +1 -0
- package/dist/ui/views/DiagNetworkView.d.ts +2 -0
- package/dist/ui/views/DiagNetworkView.d.ts.map +1 -0
- package/dist/ui/views/DiagNetworkView.js +169 -0
- package/dist/ui/views/DiagNetworkView.js.map +1 -0
- package/dist/ui/views/DiagServiceView.d.ts +2 -0
- package/dist/ui/views/DiagServiceView.d.ts.map +1 -0
- package/dist/ui/views/DiagServiceView.js +37 -0
- package/dist/ui/views/DiagServiceView.js.map +1 -0
- package/dist/ui/views/DockerNetworkView.d.ts +2 -0
- package/dist/ui/views/DockerNetworkView.d.ts.map +1 -0
- package/dist/ui/views/DockerNetworkView.js +29 -0
- package/dist/ui/views/DockerNetworkView.js.map +1 -0
- package/dist/ui/views/DockerPruneView.d.ts +2 -0
- package/dist/ui/views/DockerPruneView.d.ts.map +1 -0
- package/dist/ui/views/DockerPruneView.js +57 -0
- package/dist/ui/views/DockerPruneView.js.map +1 -0
- package/dist/ui/views/DockerStatusView.d.ts +2 -0
- package/dist/ui/views/DockerStatusView.d.ts.map +1 -0
- package/dist/ui/views/DockerStatusView.js +43 -0
- package/dist/ui/views/DockerStatusView.js.map +1 -0
- package/dist/ui/views/JtapiDisableView.d.ts +2 -0
- package/dist/ui/views/JtapiDisableView.d.ts.map +1 -0
- package/dist/ui/views/JtapiDisableView.js +55 -0
- package/dist/ui/views/JtapiDisableView.js.map +1 -0
- package/dist/ui/views/JtapiEnableView.d.ts +2 -0
- package/dist/ui/views/JtapiEnableView.d.ts.map +1 -0
- package/dist/ui/views/JtapiEnableView.js +47 -0
- package/dist/ui/views/JtapiEnableView.js.map +1 -0
- package/dist/ui/views/JtapiStatusView.d.ts +2 -0
- package/dist/ui/views/JtapiStatusView.d.ts.map +1 -0
- package/dist/ui/views/JtapiStatusView.js +18 -0
- package/dist/ui/views/JtapiStatusView.js.map +1 -0
- package/dist/ui/views/JtapiTroubleshootView.d.ts +2 -0
- package/dist/ui/views/JtapiTroubleshootView.d.ts.map +1 -0
- package/dist/ui/views/JtapiTroubleshootView.js +120 -0
- package/dist/ui/views/JtapiTroubleshootView.js.map +1 -0
- package/dist/ui/views/MainMenu.d.ts +8 -0
- package/dist/ui/views/MainMenu.d.ts.map +1 -0
- package/dist/ui/views/MainMenu.js +110 -0
- package/dist/ui/views/MainMenu.js.map +1 -0
- package/dist/ui/views/MigrateHistoryView.d.ts +2 -0
- package/dist/ui/views/MigrateHistoryView.d.ts.map +1 -0
- package/dist/ui/views/MigrateHistoryView.js +25 -0
- package/dist/ui/views/MigrateHistoryView.js.map +1 -0
- package/dist/ui/views/MigrateRollbackView.d.ts +6 -0
- package/dist/ui/views/MigrateRollbackView.d.ts.map +1 -0
- package/dist/ui/views/MigrateRollbackView.js +50 -0
- package/dist/ui/views/MigrateRollbackView.js.map +1 -0
- package/dist/ui/views/MigrateRunView.d.ts +2 -0
- package/dist/ui/views/MigrateRunView.d.ts.map +1 -0
- package/dist/ui/views/MigrateRunView.js +50 -0
- package/dist/ui/views/MigrateRunView.js.map +1 -0
- package/dist/ui/views/MigrateStatusView.d.ts +2 -0
- package/dist/ui/views/MigrateStatusView.d.ts.map +1 -0
- package/dist/ui/views/MigrateStatusView.js +88 -0
- package/dist/ui/views/MigrateStatusView.js.map +1 -0
- package/dist/ui/views/MigrateWatchView.d.ts +6 -0
- package/dist/ui/views/MigrateWatchView.d.ts.map +1 -0
- package/dist/ui/views/MigrateWatchView.js +83 -0
- package/dist/ui/views/MigrateWatchView.js.map +1 -0
- package/dist/ui/views/OfflineListView.d.ts +2 -0
- package/dist/ui/views/OfflineListView.d.ts.map +1 -0
- package/dist/ui/views/OfflineListView.js +47 -0
- package/dist/ui/views/OfflineListView.js.map +1 -0
- package/dist/ui/views/SecretsSetupView.d.ts +2 -0
- package/dist/ui/views/SecretsSetupView.d.ts.map +1 -0
- package/dist/ui/views/SecretsSetupView.js +94 -0
- package/dist/ui/views/SecretsSetupView.js.map +1 -0
- package/dist/ui/views/SecretsStatusView.d.ts +2 -0
- package/dist/ui/views/SecretsStatusView.d.ts.map +1 -0
- package/dist/ui/views/SecretsStatusView.js +36 -0
- package/dist/ui/views/SecretsStatusView.js.map +1 -0
- package/dist/ui/views/StatusView.d.ts +2 -0
- package/dist/ui/views/StatusView.d.ts.map +1 -0
- package/dist/ui/views/StatusView.js +80 -0
- package/dist/ui/views/StatusView.js.map +1 -0
- package/dist/utils/output.d.ts +11 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +30 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/prompt.d.ts +6 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +25 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/version.d.ts +8 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +35 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { useApp } from 'ink';
|
|
4
|
+
import { composePs } from '../../lib/compose.js';
|
|
5
|
+
import { rpc, rpcOk } from '../../lib/rpc.js';
|
|
6
|
+
import { AppShell, Section, ShellOutput, Spinner, StatusLine } from '../components/index.js';
|
|
7
|
+
import { useAsyncTask } from '../hooks/index.js';
|
|
8
|
+
export function MigrateRunView() {
|
|
9
|
+
const { exit } = useApp();
|
|
10
|
+
const readyTask = useAsyncTask(async () => {
|
|
11
|
+
const container = await composePs('web');
|
|
12
|
+
if (!container)
|
|
13
|
+
throw new Error('Web container not found or not running.');
|
|
14
|
+
if (!await rpcOk())
|
|
15
|
+
throw new Error('Cannot connect to application via RPC. It may still be starting up.');
|
|
16
|
+
return true;
|
|
17
|
+
});
|
|
18
|
+
const runTask = useAsyncTask(async () => {
|
|
19
|
+
const output = await rpc(`
|
|
20
|
+
IO.puts("=== Running Migrations ===")
|
|
21
|
+
try do
|
|
22
|
+
result = Ecto.Migrator.run(Cdrcisco.Repo, :up, all: true)
|
|
23
|
+
case result do
|
|
24
|
+
[] -> IO.puts("No pending migrations to run.")
|
|
25
|
+
migrations ->
|
|
26
|
+
IO.puts("Successfully ran \#{length(migrations)} migrations:")
|
|
27
|
+
for {status, version, name} <- migrations do
|
|
28
|
+
IO.puts(" \#{status} \#{version} \#{name}")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
IO.puts("")
|
|
32
|
+
IO.puts("Migration run completed successfully!")
|
|
33
|
+
rescue
|
|
34
|
+
e -> IO.puts("Error running migrations: \#{inspect(e)}")
|
|
35
|
+
end
|
|
36
|
+
`);
|
|
37
|
+
return output;
|
|
38
|
+
}, false);
|
|
39
|
+
// Chain: run migrations after ready check passes
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (readyTask.status === 'done')
|
|
42
|
+
runTask.run();
|
|
43
|
+
}, [readyTask.status]);
|
|
44
|
+
// Exit when done or on error
|
|
45
|
+
const allDone = readyTask.status === 'error' || runTask.status === 'done' || runTask.status === 'error';
|
|
46
|
+
useEffect(() => { if (allDone)
|
|
47
|
+
exit(); }, [allDone, exit]);
|
|
48
|
+
return (_jsx(AppShell, { command: "ct migrate run", children: _jsxs(Section, { title: "Run Migrations", children: [readyTask.status === 'pending' && _jsx(Spinner, { label: "Checking web container..." }), readyTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: readyTask.error?.message ?? 'Web container not ready' }), readyTask.status === 'done' && runTask.status === 'pending' && _jsx(Spinner, { label: "Running pending migrations..." }), runTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: runTask.error?.message ?? 'Migration run failed' }), runTask.status === 'done' && runTask.data && _jsx(ShellOutput, { content: runTask.data }), runTask.status === 'done' && _jsx(StatusLine, { status: "ok", label: "Migration run completed" })] }) }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=MigrateRunView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrateRunView.js","sourceRoot":"","sources":["../../../src/ui/views/MigrateRunView.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACxC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC3G,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC;;;;;;;;;;;;;;;;;KAiBxB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,iDAAiD;IACjD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvB,6BAA6B;IAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC;IACxG,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO;QAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3D,OAAO,CACL,KAAC,QAAQ,IAAC,OAAO,EAAC,gBAAgB,YAChC,MAAC,OAAO,IAAC,KAAK,EAAC,gBAAgB,aAC5B,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,2BAA2B,GAAG,EAC/E,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,yBAAyB,GAAI,EAC1H,SAAS,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,+BAA+B,GAAG,EAChH,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,sBAAsB,GAAI,EACnH,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,OAAO,CAAC,IAAI,GAAI,EACnF,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,yBAAyB,GAAG,IAChF,GACD,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrateStatusView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/MigrateStatusView.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,iBAAiB,4CAoChC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { useApp } from 'ink';
|
|
4
|
+
import { composePs } from '../../lib/compose.js';
|
|
5
|
+
import { rpc, rpcOk } from '../../lib/rpc.js';
|
|
6
|
+
import { AppShell, Section, StatusLine, ShellOutput, Spinner } from '../components/index.js';
|
|
7
|
+
import { useAsyncTask } from '../hooks/index.js';
|
|
8
|
+
const MIGRATION_STATUS_RPC = `
|
|
9
|
+
alias Cdrcisco.Repo
|
|
10
|
+
import Ecto.Query
|
|
11
|
+
|
|
12
|
+
try do
|
|
13
|
+
migrations = Ecto.Migrator.migrations(Repo)
|
|
14
|
+
ordered = Enum.sort_by(migrations, fn {_, version, _} -> version end)
|
|
15
|
+
{applied, pending} = Enum.split_with(ordered, fn {status, _, _} -> status == :up end)
|
|
16
|
+
total = length(ordered)
|
|
17
|
+
applied_count = length(applied)
|
|
18
|
+
pending_count = length(pending)
|
|
19
|
+
|
|
20
|
+
percent = if total == 0, do: 100.0, else: Float.round(applied_count / total * 100, 1)
|
|
21
|
+
|
|
22
|
+
latest = Repo.one(
|
|
23
|
+
from sm in "schema_migrations",
|
|
24
|
+
order_by: [desc: sm.version],
|
|
25
|
+
limit: 1,
|
|
26
|
+
select: %{version: sm.version, inserted_at: sm.inserted_at}
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
IO.puts("=== Migration Progress ===")
|
|
30
|
+
IO.puts("Applied migrations: \#{applied_count}/\#{total} (\#{percent}%)")
|
|
31
|
+
IO.puts("Pending migrations: \#{pending_count}")
|
|
32
|
+
|
|
33
|
+
case latest do
|
|
34
|
+
%{version: version, inserted_at: timestamp} ->
|
|
35
|
+
IO.puts("Latest applied: \#{version} @ \#{timestamp}")
|
|
36
|
+
_ ->
|
|
37
|
+
IO.puts("Latest applied: none recorded")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
IO.puts("")
|
|
41
|
+
|
|
42
|
+
if pending_count > 0 do
|
|
43
|
+
{_, next_version, next_name} = hd(pending)
|
|
44
|
+
IO.puts("Next pending: \#{next_version} - \#{next_name}")
|
|
45
|
+
IO.puts("")
|
|
46
|
+
IO.puts("=== Pending Queue ===")
|
|
47
|
+
Enum.with_index(pending, 1)
|
|
48
|
+
|> Enum.each(fn {{_, version, name}, idx} ->
|
|
49
|
+
IO.puts("[\#{idx}/\#{pending_count}] \#{version} - \#{name}")
|
|
50
|
+
end)
|
|
51
|
+
else
|
|
52
|
+
IO.puts("All migrations are up to date!")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
IO.puts("::pending_count=\#{pending_count}")
|
|
56
|
+
rescue
|
|
57
|
+
e ->
|
|
58
|
+
IO.puts("Error checking migrations: \#{inspect(e)}")
|
|
59
|
+
IO.puts("::pending_count=error")
|
|
60
|
+
end
|
|
61
|
+
`;
|
|
62
|
+
export function MigrateStatusView() {
|
|
63
|
+
const { exit } = useApp();
|
|
64
|
+
const readyTask = useAsyncTask(async () => {
|
|
65
|
+
const container = await composePs('web');
|
|
66
|
+
if (!container)
|
|
67
|
+
throw new Error('Web container not found');
|
|
68
|
+
if (!await rpcOk())
|
|
69
|
+
throw new Error('RPC not ready');
|
|
70
|
+
return true;
|
|
71
|
+
});
|
|
72
|
+
const statusTask = useAsyncTask(async () => {
|
|
73
|
+
const output = await rpc(MIGRATION_STATUS_RPC);
|
|
74
|
+
return output.split('\n').filter(l => !l.startsWith('::')).join('\n');
|
|
75
|
+
}, false);
|
|
76
|
+
// Run status after ready
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (readyTask.status === 'done')
|
|
79
|
+
statusTask.run();
|
|
80
|
+
}, [readyTask.status]);
|
|
81
|
+
// Exit when done
|
|
82
|
+
const allDone = (readyTask.status === 'error') ||
|
|
83
|
+
(statusTask.status === 'done' || statusTask.status === 'error');
|
|
84
|
+
useEffect(() => { if (allDone)
|
|
85
|
+
exit(); }, [allDone, exit]);
|
|
86
|
+
return (_jsx(AppShell, { command: "ct migrate status", children: _jsxs(Section, { title: "Migration Status", children: [readyTask.status === 'pending' && _jsx(Spinner, { label: "Checking web container..." }), readyTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: readyTask.error?.message ?? 'Web container not ready' }), statusTask.status === 'pending' && _jsx(Spinner, { label: "Querying migration status..." }), statusTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Failed to query migrations" }), statusTask.status === 'done' && statusTask.data && _jsx(ShellOutput, { content: statusTask.data })] }) }));
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=MigrateStatusView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrateStatusView.js","sourceRoot":"","sources":["../../../src/ui/views/MigrateStatusView.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD5B,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACxC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,yBAAyB;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM;YAAE,UAAU,CAAC,GAAG,EAAE,CAAC;IACpD,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvB,iBAAiB;IACjB,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC;QAC9B,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAChF,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO;QAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3D,OAAO,CACL,KAAC,QAAQ,IAAC,OAAO,EAAC,mBAAmB,YACnC,MAAC,OAAO,IAAC,KAAK,EAAC,kBAAkB,aAC9B,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,2BAA2B,GAAG,EAC/E,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,yBAAyB,GAAI,EAC1H,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,8BAA8B,GAAG,EACnF,UAAU,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B,GAAG,EAChG,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,IAAI,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,UAAU,CAAC,IAAI,GAAI,IACrF,GACD,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrateWatchView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/MigrateWatchView.tsx"],"names":[],"mappings":"AA6DA,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,2CAqCnE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { useApp, Text } from 'ink';
|
|
4
|
+
import { rpc } from '../../lib/rpc.js';
|
|
5
|
+
import { AppShell, Section, ShellOutput, Spinner, StatusLine } from '../components/index.js';
|
|
6
|
+
import { usePolling } from '../hooks/index.js';
|
|
7
|
+
const MIGRATION_STATUS_RPC = `
|
|
8
|
+
alias Cdrcisco.Repo
|
|
9
|
+
import Ecto.Query
|
|
10
|
+
|
|
11
|
+
try do
|
|
12
|
+
migrations = Ecto.Migrator.migrations(Repo)
|
|
13
|
+
ordered = Enum.sort_by(migrations, fn {_, version, _} -> version end)
|
|
14
|
+
{applied, pending} = Enum.split_with(ordered, fn {status, _, _} -> status == :up end)
|
|
15
|
+
total = length(ordered)
|
|
16
|
+
applied_count = length(applied)
|
|
17
|
+
pending_count = length(pending)
|
|
18
|
+
|
|
19
|
+
percent = if total == 0, do: 100.0, else: Float.round(applied_count / total * 100, 1)
|
|
20
|
+
|
|
21
|
+
latest = Repo.one(
|
|
22
|
+
from sm in "schema_migrations",
|
|
23
|
+
order_by: [desc: sm.version],
|
|
24
|
+
limit: 1,
|
|
25
|
+
select: %{version: sm.version, inserted_at: sm.inserted_at}
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
IO.puts("=== Migration Progress ===")
|
|
29
|
+
IO.puts("Applied migrations: \#{applied_count}/\#{total} (\#{percent}%)")
|
|
30
|
+
IO.puts("Pending migrations: \#{pending_count}")
|
|
31
|
+
|
|
32
|
+
case latest do
|
|
33
|
+
%{version: version, inserted_at: timestamp} ->
|
|
34
|
+
IO.puts("Latest applied: \#{version} @ \#{timestamp}")
|
|
35
|
+
_ ->
|
|
36
|
+
IO.puts("Latest applied: none recorded")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
IO.puts("")
|
|
40
|
+
|
|
41
|
+
if pending_count > 0 do
|
|
42
|
+
{_, next_version, next_name} = hd(pending)
|
|
43
|
+
IO.puts("Next pending: \#{next_version} - \#{next_name}")
|
|
44
|
+
IO.puts("")
|
|
45
|
+
IO.puts("=== Pending Queue ===")
|
|
46
|
+
Enum.with_index(pending, 1)
|
|
47
|
+
|> Enum.each(fn {{_, version, name}, idx} ->
|
|
48
|
+
IO.puts("[\#{idx}/\#{pending_count}] \#{version} - \#{name}")
|
|
49
|
+
end)
|
|
50
|
+
else
|
|
51
|
+
IO.puts("All migrations are up to date!")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
IO.puts("::pending_count=\#{pending_count}")
|
|
55
|
+
rescue
|
|
56
|
+
e ->
|
|
57
|
+
IO.puts("Error checking migrations: \#{inspect(e)}")
|
|
58
|
+
IO.puts("::pending_count=error")
|
|
59
|
+
end
|
|
60
|
+
`;
|
|
61
|
+
export function MigrateWatchView({ interval }) {
|
|
62
|
+
const { exit } = useApp();
|
|
63
|
+
const stoppedRef = useRef(false);
|
|
64
|
+
const { data, error, stop } = usePolling(async () => {
|
|
65
|
+
const output = await rpc(MIGRATION_STATUS_RPC);
|
|
66
|
+
return output;
|
|
67
|
+
}, interval);
|
|
68
|
+
// Filter display lines and extract pending count
|
|
69
|
+
const lines = data?.split('\n') ?? [];
|
|
70
|
+
const pendingLine = lines.find(l => l.startsWith('::pending_count='));
|
|
71
|
+
const pendingCount = pendingLine?.split('=')[1];
|
|
72
|
+
const displayContent = lines.filter(l => !l.startsWith('::')).join('\n');
|
|
73
|
+
// Auto-stop when no pending migrations remain
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (pendingCount === '0' && !stoppedRef.current) {
|
|
76
|
+
stoppedRef.current = true;
|
|
77
|
+
stop();
|
|
78
|
+
exit();
|
|
79
|
+
}
|
|
80
|
+
}, [pendingCount, stop, exit]);
|
|
81
|
+
return (_jsx(AppShell, { command: "ct migrate watch", children: _jsxs(Section, { title: `Watch Migrations (interval: ${interval / 1000}s)`, children: [!data && !error && _jsx(Spinner, { label: "Polling migration status..." }), error && _jsx(StatusLine, { status: "warn", label: `Error: ${error.message}` }), data && displayContent && _jsx(ShellOutput, { content: displayContent }), pendingCount === '0' && _jsx(StatusLine, { status: "ok", label: "All migrations are up to date. Exiting watch mode." }), data && pendingCount !== '0' && pendingCount !== 'error' && (_jsx(Text, { dimColor: true, children: ` Next refresh in ${interval / 1000}s... Press Ctrl+C to stop.` }))] }) }));
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=MigrateWatchView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrateWatchView.js","sourceRoot":"","sources":["../../../src/ui/views/MigrateWatchView.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD5B,CAAC;AAMF,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAyB;IAClE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEb,iDAAiD;IACjD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,8CAA8C;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAChD,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,OAAO,CACL,KAAC,QAAQ,IAAC,OAAO,EAAC,kBAAkB,YAClC,MAAC,OAAO,IAAC,KAAK,EAAE,+BAA+B,QAAQ,GAAG,IAAI,IAAI,aAC/D,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,6BAA6B,GAAG,EAClE,KAAK,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,GAAI,EACvE,IAAI,IAAI,cAAc,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,cAAc,GAAI,EAClE,YAAY,KAAK,GAAG,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,oDAAoD,GAAG,EAC7G,IAAI,IAAI,YAAY,KAAK,GAAG,IAAI,YAAY,KAAK,OAAO,IAAI,CAC3D,KAAC,IAAI,IAAC,QAAQ,kBAAE,qBAAqB,QAAQ,GAAG,IAAI,4BAA4B,GAAQ,CACzF,IACO,GACD,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfflineListView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/OfflineListView.tsx"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,4CAqD9B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { useApp } from 'ink';
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { execa } from 'execa';
|
|
6
|
+
import { getPaths } from '../../lib/paths.js';
|
|
7
|
+
import { AppShell, Section, StatusLine, Spinner, KeyValue } from '../components/index.js';
|
|
8
|
+
import { useAsyncTask } from '../hooks/index.js';
|
|
9
|
+
export function OfflineListView() {
|
|
10
|
+
const { exit } = useApp();
|
|
11
|
+
const { composeFile } = getPaths();
|
|
12
|
+
const listTask = useAsyncTask(async () => {
|
|
13
|
+
if (!existsSync(composeFile)) {
|
|
14
|
+
throw new Error('docker-compose.yml not found');
|
|
15
|
+
}
|
|
16
|
+
const content = readFileSync(composeFile, 'utf-8');
|
|
17
|
+
const images = [];
|
|
18
|
+
for (const line of content.split('\n')) {
|
|
19
|
+
const match = line.match(/image:\s*["']?([^\s"']+)/);
|
|
20
|
+
if (match)
|
|
21
|
+
images.push(match[1]);
|
|
22
|
+
}
|
|
23
|
+
const results = [];
|
|
24
|
+
for (const img of images) {
|
|
25
|
+
try {
|
|
26
|
+
const { stdout } = await execa('docker', ['image', 'inspect', img, '--format', '{{.Size}}'], {
|
|
27
|
+
stdout: 'pipe', stderr: 'pipe',
|
|
28
|
+
});
|
|
29
|
+
const sizeMb = (parseInt(stdout) / 1024 / 1024).toFixed(1);
|
|
30
|
+
results.push({ key: img, value: `${sizeMb} MB` });
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
results.push({ key: img, value: 'not downloaded' });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { images: results, total: images.length };
|
|
37
|
+
});
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (listTask.status === 'done' || listTask.status === 'error')
|
|
40
|
+
exit();
|
|
41
|
+
}, [listTask.status, exit]);
|
|
42
|
+
return (_jsx(AppShell, { command: "ct offline list", children: _jsxs(Section, { title: "Images in docker-compose.yml", children: [listTask.status === 'pending' && _jsx(Spinner, { label: "Inspecting images..." }), listTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: listTask.error?.message ?? 'Failed' }), listTask.status === 'done' && listTask.data && (_jsxs(_Fragment, { children: [_jsx(KeyValue, { items: listTask.data.images.map(item => ({
|
|
43
|
+
key: item.key,
|
|
44
|
+
value: item.value === 'not downloaded' ? `\u2718 ${item.value}` : `\u2714 ${item.value}`,
|
|
45
|
+
})) }), _jsx(StatusLine, { status: "info", label: `Total images: ${listTask.data.total}` })] }))] }) }));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=OfflineListView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfflineListView.js","sourceRoot":"","sources":["../../../src/ui/views/OfflineListView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecretsSetupView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/SecretsSetupView.tsx"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,4CA0K/B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Text, Box, useApp } from 'ink';
|
|
4
|
+
import { AppShell, Section, StatusLine, Divider, SelectMenu, Confirm, TextInput } from '../components/index.js';
|
|
5
|
+
import { SECRET_CATALOG, SECRET_GROUPS, getSecrets, writeEnvFile, writeSecretsOverlay } from '../../lib/secrets.js';
|
|
6
|
+
export function SecretsSetupView() {
|
|
7
|
+
const { exit } = useApp();
|
|
8
|
+
const [phase, setPhase] = useState('intro');
|
|
9
|
+
const [values, setValues] = useState(() => getSecrets());
|
|
10
|
+
const [currentGroup, setCurrentGroup] = useState(null);
|
|
11
|
+
const [fieldIndex, setFieldIndex] = useState(0);
|
|
12
|
+
const [inputValue, setInputValue] = useState('');
|
|
13
|
+
const [writeError, setWriteError] = useState(null);
|
|
14
|
+
// Auto-advance from intro
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (phase === 'intro') {
|
|
17
|
+
const timer = setTimeout(() => setPhase('group_select'), 50);
|
|
18
|
+
return () => clearTimeout(timer);
|
|
19
|
+
}
|
|
20
|
+
}, [phase]);
|
|
21
|
+
// Exit after done
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (phase === 'done' || phase === 'error') {
|
|
24
|
+
const timer = setTimeout(() => exit(), 200);
|
|
25
|
+
return () => clearTimeout(timer);
|
|
26
|
+
}
|
|
27
|
+
}, [phase, exit]);
|
|
28
|
+
const groupItems = [
|
|
29
|
+
...SECRET_GROUPS.map(g => ({
|
|
30
|
+
label: g,
|
|
31
|
+
description: SECRET_CATALOG.filter(d => d.group === g).map(d => d.label).join(', '),
|
|
32
|
+
value: g,
|
|
33
|
+
})),
|
|
34
|
+
{ label: '\u2190 Review & Save', description: 'Review changes and write files', value: '__review' },
|
|
35
|
+
];
|
|
36
|
+
const handleGroupSelect = (item) => {
|
|
37
|
+
if (item.value === '__review') {
|
|
38
|
+
setPhase('review');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
setCurrentGroup(item.value);
|
|
42
|
+
setFieldIndex(0);
|
|
43
|
+
const groupFields = SECRET_CATALOG.filter(d => d.group === item.value);
|
|
44
|
+
if (groupFields.length > 0) {
|
|
45
|
+
setInputValue('');
|
|
46
|
+
setPhase('field_edit');
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const groupFields = currentGroup ? SECRET_CATALOG.filter(d => d.group === currentGroup) : [];
|
|
50
|
+
const currentField = groupFields[fieldIndex];
|
|
51
|
+
const handleFieldSubmit = (submitted) => {
|
|
52
|
+
if (currentField) {
|
|
53
|
+
// If empty input, keep current value
|
|
54
|
+
if (submitted) {
|
|
55
|
+
setValues(prev => ({ ...prev, [currentField.key]: submitted }));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Next field or back to group select
|
|
59
|
+
if (fieldIndex + 1 < groupFields.length) {
|
|
60
|
+
setFieldIndex(fieldIndex + 1);
|
|
61
|
+
setInputValue('');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
setPhase('group_select');
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const handleConfirm = async (yes) => {
|
|
68
|
+
if (!yes) {
|
|
69
|
+
setPhase('group_select');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
setPhase('write');
|
|
73
|
+
try {
|
|
74
|
+
await writeEnvFile(values);
|
|
75
|
+
await writeSecretsOverlay();
|
|
76
|
+
setPhase('done');
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
setWriteError(err.message ?? String(err));
|
|
80
|
+
setPhase('error');
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
// Count changes
|
|
84
|
+
const originalSecrets = getSecrets();
|
|
85
|
+
const changedKeys = SECRET_CATALOG.filter(d => values[d.key] !== originalSecrets[d.key]);
|
|
86
|
+
return (_jsxs(AppShell, { command: "ct secrets setup", children: [phase === 'intro' && (_jsx(Section, { title: "Secrets Setup Wizard", children: _jsx(Text, { children: "Configuring deployment secrets..." }) })), phase === 'group_select' && (_jsx(Section, { title: "What would you like to configure?", children: _jsx(SelectMenu, { items: groupItems, onSelect: handleGroupSelect, onExit: () => setPhase('review') }) })), phase === 'field_edit' && currentField && (_jsxs(Section, { title: `${currentGroup} Configuration`, children: [_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsxs(Text, { bold: true, children: [currentField.label, " (", currentField.key, ")"] }), _jsxs(Text, { dimColor: true, children: [`Current: ${currentField.sensitive ? '********' : (values[currentField.key] || '(not set)')}`, values[currentField.key] === currentField.defaultValue ? ' (default)' : ''] }), _jsx(Text, { dimColor: true, children: "Press Enter to keep current, or type new value" }), _jsx(Box, { marginTop: 1, children: _jsx(TextInput, { label: "New value", value: inputValue, onChange: setInputValue, onSubmit: handleFieldSubmit, mask: currentField.sensitive, placeholder: values[currentField.key] || '(empty)' }) })] }), _jsx(Text, { dimColor: true, children: ` Field ${fieldIndex + 1} of ${groupFields.length}` })] })), phase === 'review' && (_jsxs(Section, { title: "Review Changes", children: [SECRET_CATALOG.map(def => {
|
|
87
|
+
const value = values[def.key] ?? '';
|
|
88
|
+
const isChanged = value !== originalSecrets[def.key];
|
|
89
|
+
const display = def.sensitive ? '********' : (value || '(not set)');
|
|
90
|
+
const tag = isChanged ? '(changed)' : (value === def.defaultValue ? '(default)' : '(not set)');
|
|
91
|
+
return (_jsx(StatusLine, { status: isChanged ? 'warn' : 'ok', label: `${def.key.padEnd(22)} ${display.padEnd(20)} ${tag}` }, def.key));
|
|
92
|
+
}), _jsx(Divider, {}), _jsx(Confirm, { message: `Write ${changedKeys.length} change${changedKeys.length !== 1 ? 's' : ''} to .env and docker-compose.secrets.yml?`, onConfirm: handleConfirm })] })), phase === 'write' && (_jsx(Section, { title: "Writing Files", children: _jsx(Text, { children: "Writing secrets..." }) })), phase === 'done' && (_jsxs(Section, { title: "Secrets Setup Complete", children: [_jsx(StatusLine, { status: "ok", label: ".env file written" }), _jsx(StatusLine, { status: "ok", label: "docker-compose.secrets.yml generated" }), _jsx(Divider, {}), _jsx(Text, { dimColor: true, children: " Run 'ct update' or restart services to apply changes." })] })), phase === 'error' && (_jsx(Section, { title: "Error", children: _jsx(StatusLine, { status: "fail", label: writeError ?? 'Unknown error writing files' }) }))] }));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=SecretsSetupView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecretsSetupView.js","sourceRoot":"","sources":["../../../src/ui/views/SecretsSetupView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecretsStatusView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/SecretsStatusView.tsx"],"names":[],"mappings":"AAMA,wBAAgB,iBAAiB,4CAmDhC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { Text, useApp } from 'ink';
|
|
4
|
+
import { AppShell, Section, SubSection, StatusLine, KeyValue } from '../components/index.js';
|
|
5
|
+
import { SECRET_CATALOG, SECRET_GROUPS, getSecrets, getEnvFilePath, isCustomized, countOverrides } from '../../lib/secrets.js';
|
|
6
|
+
export function SecretsStatusView() {
|
|
7
|
+
const { exit } = useApp();
|
|
8
|
+
const secrets = getSecrets();
|
|
9
|
+
const envPath = getEnvFilePath();
|
|
10
|
+
const customized = isCustomized();
|
|
11
|
+
const overrideCount = countOverrides();
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
// Exit after render
|
|
14
|
+
const timer = setTimeout(() => exit(), 100);
|
|
15
|
+
return () => clearTimeout(timer);
|
|
16
|
+
}, [exit]);
|
|
17
|
+
const getStatus = (key, defaultValue) => {
|
|
18
|
+
const value = secrets[key] ?? '';
|
|
19
|
+
if (!value && !defaultValue)
|
|
20
|
+
return 'warn';
|
|
21
|
+
return 'ok';
|
|
22
|
+
};
|
|
23
|
+
const getLabel = (key, defaultValue, sensitive) => {
|
|
24
|
+
const value = secrets[key] ?? '';
|
|
25
|
+
if (!value && !defaultValue)
|
|
26
|
+
return `${key} (not set)`;
|
|
27
|
+
const display = sensitive ? '********' : value;
|
|
28
|
+
const tag = value !== defaultValue ? '(customized)' : '(default)';
|
|
29
|
+
return `${key} ${display} ${tag}`;
|
|
30
|
+
};
|
|
31
|
+
return (_jsx(AppShell, { command: "ct secrets", children: _jsxs(Section, { title: "Secrets Configuration", children: [_jsx(KeyValue, { items: [
|
|
32
|
+
{ key: 'Source', value: envPath },
|
|
33
|
+
{ key: 'Status', value: customized ? `Customized (${overrideCount} override${overrideCount !== 1 ? 's' : ''})` : 'Using defaults' },
|
|
34
|
+
] }), SECRET_GROUPS.map((group) => (_jsx(SubSection, { title: group, children: SECRET_CATALOG.filter(d => d.group === group).map(def => (_jsx(StatusLine, { status: getStatus(def.key, def.defaultValue), label: getLabel(def.key, def.defaultValue, def.sensitive) }, def.key))) }, group))), _jsx(Text, { dimColor: true, children: "\n Run 'ct secrets setup' to configure" })] }) }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=SecretsStatusView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecretsStatusView.js","sourceRoot":"","sources":["../../../src/ui/views/SecretsStatusView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/StatusView.tsx"],"names":[],"mappings":"AASA,wBAAgB,UAAU,4CAgKzB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { Box, Text, useApp } from 'ink';
|
|
4
|
+
import { compose, composeExec } from '../../lib/compose.js';
|
|
5
|
+
import { DB_USER, DB_NAME, PG_ENV } from '../../lib/db.js';
|
|
6
|
+
import { rpc, rpcOk, healthCheck } from '../../lib/rpc.js';
|
|
7
|
+
import { getSystemStats } from '../../lib/system.js';
|
|
8
|
+
import { AppShell, Section, StatusLine, ShellOutput, Spinner } from '../components/index.js';
|
|
9
|
+
import { useAsyncTask } from '../hooks/index.js';
|
|
10
|
+
export function StatusView() {
|
|
11
|
+
const { exit } = useApp();
|
|
12
|
+
// Section 1: Container Status
|
|
13
|
+
const containerTask = useAsyncTask(async () => {
|
|
14
|
+
const result = await compose(['ps'], { pipe: true });
|
|
15
|
+
return result.stdout ?? '';
|
|
16
|
+
});
|
|
17
|
+
// Section 2: Database Status
|
|
18
|
+
const dbReadyTask = useAsyncTask(async () => {
|
|
19
|
+
try {
|
|
20
|
+
await composeExec('db', ['pg_isready', '-U', DB_USER, '-d', DB_NAME], { pipe: true });
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const dbCountTask = useAsyncTask(async () => {
|
|
28
|
+
const result = await composeExec('db', ['psql', '-U', DB_USER, '-d', DB_NAME, '-t', '-c',
|
|
29
|
+
'SELECT COUNT(*) FROM schema_migrations;'], { env: PG_ENV, pipe: true });
|
|
30
|
+
return (result.stdout ?? '').trim();
|
|
31
|
+
});
|
|
32
|
+
const dbLatestTask = useAsyncTask(async () => {
|
|
33
|
+
const result = await composeExec('db', ['psql', '-U', DB_USER, '-d', DB_NAME, '-t', '-c',
|
|
34
|
+
'SELECT version FROM schema_migrations ORDER BY version DESC LIMIT 1;'], { env: PG_ENV, pipe: true });
|
|
35
|
+
return (result.stdout ?? '').trim();
|
|
36
|
+
});
|
|
37
|
+
// Section 3: Application RPC
|
|
38
|
+
const rpcTask = useAsyncTask(async () => {
|
|
39
|
+
const ok = await rpcOk();
|
|
40
|
+
if (!ok)
|
|
41
|
+
return { ok: false, output: '' };
|
|
42
|
+
const output = await rpc(`
|
|
43
|
+
alias Cdrcisco.Repo
|
|
44
|
+
try do
|
|
45
|
+
migrations = Ecto.Migrator.migrations(Repo)
|
|
46
|
+
{applied, pending} = Enum.split_with(migrations, fn {status, _, _} -> status == :up end)
|
|
47
|
+
IO.puts("Applied: \#{length(applied)}")
|
|
48
|
+
IO.puts("Pending: \#{length(pending)}")
|
|
49
|
+
if length(pending) > 0 do
|
|
50
|
+
IO.puts("")
|
|
51
|
+
IO.puts("Pending migrations:")
|
|
52
|
+
Enum.each(pending, fn {_, version, name} -> IO.puts(" - \#{version}: \#{name}") end)
|
|
53
|
+
else
|
|
54
|
+
IO.puts("All migrations complete!")
|
|
55
|
+
end
|
|
56
|
+
rescue
|
|
57
|
+
e -> IO.puts("Error: \#{inspect(e)}")
|
|
58
|
+
end
|
|
59
|
+
`);
|
|
60
|
+
return { ok: true, output };
|
|
61
|
+
});
|
|
62
|
+
// Section 4: Health Check
|
|
63
|
+
const healthTask = useAsyncTask(async () => {
|
|
64
|
+
return await healthCheck();
|
|
65
|
+
});
|
|
66
|
+
// Section 5: System Stats
|
|
67
|
+
const statsTask = useAsyncTask(async () => {
|
|
68
|
+
return await getSystemStats();
|
|
69
|
+
});
|
|
70
|
+
// Exit when all tasks complete
|
|
71
|
+
const allDone = [containerTask, dbReadyTask, dbCountTask, dbLatestTask, rpcTask, healthTask, statsTask]
|
|
72
|
+
.every(t => t.status === 'done' || t.status === 'error');
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (allDone) {
|
|
75
|
+
exit();
|
|
76
|
+
}
|
|
77
|
+
}, [allDone, exit]);
|
|
78
|
+
return (_jsxs(AppShell, { command: "ct status", children: [_jsxs(Section, { title: "Container Status", children: [containerTask.status === 'pending' && _jsx(Spinner, { label: "Checking containers..." }), containerTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not check containers" }), containerTask.status === 'done' && containerTask.data && (_jsx(ShellOutput, { content: containerTask.data }))] }), _jsxs(Section, { title: "Database Status", children: [dbReadyTask.status === 'pending' && _jsx(Spinner, { label: "Checking database..." }), dbReadyTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Database check failed" }), dbReadyTask.status === 'done' && (_jsx(StatusLine, { status: dbReadyTask.data ? 'ok' : 'fail', label: dbReadyTask.data ? 'Database: accepting connections' : 'Database: not accepting connections' })), dbCountTask.status === 'pending' && _jsx(Spinner, { label: "Counting migrations..." }), dbCountTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not count migrations" }), dbCountTask.status === 'done' && (_jsx(StatusLine, { status: "ok", label: `Migrations in database: ${dbCountTask.data}` })), dbLatestTask.status === 'pending' && _jsx(Spinner, { label: "Finding latest migration..." }), dbLatestTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not find latest migration" }), dbLatestTask.status === 'done' && (_jsx(StatusLine, { status: "ok", label: `Latest migration: ${dbLatestTask.data}` }))] }), _jsxs(Section, { title: "Application RPC Status", children: [rpcTask.status === 'pending' && _jsx(Spinner, { label: "Checking RPC connection..." }), rpcTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "RPC check failed" }), rpcTask.status === 'done' && rpcTask.data && (_jsxs(_Fragment, { children: [_jsx(StatusLine, { status: rpcTask.data.ok ? 'ok' : 'fail', label: rpcTask.data.ok ? 'RPC connection: working' : 'RPC connection: failed' }), rpcTask.data.ok && rpcTask.data.output && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, children: " Migration Status (from application)" }), _jsx(ShellOutput, { content: rpcTask.data.output })] })), !rpcTask.data.ok && (_jsx(Text, { dimColor: true, children: " Application may still be starting up" }))] }))] }), _jsxs(Section, { title: "Health Check", children: [healthTask.status === 'pending' && _jsx(Spinner, { label: "Running health check..." }), healthTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Health check failed" }), healthTask.status === 'done' && (_jsx(StatusLine, { status: healthTask.data ? 'ok' : 'warn', label: healthTask.data ? 'Web application healthy' : 'Web health check pending' }))] }), _jsxs(Section, { title: "System Stats", children: [statsTask.status === 'pending' && _jsx(Spinner, { label: "Gathering system stats..." }), statsTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not gather system stats" }), statsTask.status === 'done' && statsTask.data && (_jsxs(Text, { children: [" ", statsTask.data] }))] })] }));
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=StatusView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusView.js","sourceRoot":"","sources":["../../../src/ui/views/StatusView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const ok: (msg: string) => void;
|
|
2
|
+
export declare const fail: (msg: string) => void;
|
|
3
|
+
export declare const warn: (msg: string) => void;
|
|
4
|
+
export declare const info: (msg: string) => void;
|
|
5
|
+
export declare const pending: (msg: string) => void;
|
|
6
|
+
export declare const header: (title: string) => void;
|
|
7
|
+
export declare const subheader: (title: string) => void;
|
|
8
|
+
export declare const divider: () => void;
|
|
9
|
+
export declare const errorBox: (title: string, details: string[]) => void;
|
|
10
|
+
export declare const successBox: (title: string) => void;
|
|
11
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,EAAE,GAAI,KAAK,MAAM,SAAyC,CAAC;AACxE,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAAuC,CAAC;AACxE,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAA0C,CAAC;AAC3E,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAAwC,CAAC;AACzE,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,SAAwC,CAAC;AAE5E,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,SAGnC,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,SAEtC,CAAC;AAEF,eAAO,MAAM,OAAO,YAEnB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,SAOxD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,SAIvC,CAAC"}
|