@t1mmen/srtd 0.2.1 → 0.3.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 (44) hide show
  1. package/README.md +148 -87
  2. package/dist/__tests__/watch.test.js +0 -1
  3. package/dist/__tests__/watch.test.js.map +1 -1
  4. package/dist/cli.js +3 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/_app.js +22 -2
  7. package/dist/commands/_app.js.map +1 -1
  8. package/dist/commands/apply.d.ts +13 -1
  9. package/dist/commands/apply.js +18 -6
  10. package/dist/commands/apply.js.map +1 -1
  11. package/dist/commands/build.d.ts +13 -1
  12. package/dist/commands/build.js +14 -4
  13. package/dist/commands/build.js.map +1 -1
  14. package/dist/commands/index.js +20 -10
  15. package/dist/commands/index.js.map +1 -1
  16. package/dist/commands/register.js +9 -6
  17. package/dist/commands/register.js.map +1 -1
  18. package/dist/commands/watch.js +105 -117
  19. package/dist/commands/watch.js.map +1 -1
  20. package/dist/components/Branding.js +5 -4
  21. package/dist/components/Branding.js.map +1 -1
  22. package/dist/components/Quittable.d.ts +6 -0
  23. package/dist/components/Quittable.js +36 -0
  24. package/dist/components/Quittable.js.map +1 -0
  25. package/dist/hooks/useDatabaseConnection.d.ts +7 -0
  26. package/dist/hooks/useDatabaseConnection.js +68 -0
  27. package/dist/hooks/useDatabaseConnection.js.map +1 -0
  28. package/dist/hooks/useTemplateManager.d.ts +24 -0
  29. package/dist/hooks/useTemplateManager.js +141 -0
  30. package/dist/hooks/useTemplateManager.js.map +1 -0
  31. package/dist/lib/templateManager.d.ts +3 -3
  32. package/dist/lib/templateManager.js +24 -17
  33. package/dist/lib/templateManager.js.map +1 -1
  34. package/dist/types.d.ts +2 -1
  35. package/dist/utils/config.js +1 -0
  36. package/dist/utils/config.js.map +1 -1
  37. package/dist/utils/databaseConnection.d.ts +5 -1
  38. package/dist/utils/databaseConnection.js +27 -8
  39. package/dist/utils/databaseConnection.js.map +1 -1
  40. package/dist/utils/logger.d.ts +1 -0
  41. package/package.json +13 -8
  42. package/dist/commands/help.d.ts +0 -1
  43. package/dist/commands/help.js +0 -2
  44. package/dist/commands/help.js.map +0 -1
@@ -4,6 +4,7 @@ import { argument } from 'pastel';
4
4
  import React from 'react';
5
5
  import zod from 'zod';
6
6
  import Branding from '../components/Branding.js';
7
+ import Quittable from '../components/Quittable.js';
7
8
  import { useTemplateState } from '../hooks/useTemplateState.js';
8
9
  import { registerTemplate } from '../utils/registerTemplate.js';
9
10
  // Support both array of filenames as arguments and interactive selection
@@ -63,20 +64,22 @@ export default function Register({ args: templateArgs }) {
63
64
  });
64
65
  return (React.createElement(Box, { flexDirection: "column" },
65
66
  React.createElement(Branding, { subtitle: "Register templates" }),
66
- React.createElement(Text, null, "Use arrow/space to select, then press Enter to register."),
67
- React.createElement(Box, { marginTop: 1 },
68
- React.createElement(Text, { color: "white" },
67
+ React.createElement(Box, { gap: 2 },
68
+ React.createElement(Text, null,
69
69
  selectedValues.length,
70
70
  " / ",
71
71
  options.length,
72
- " selected")),
72
+ " selected"),
73
+ React.createElement(Text, { dimColor: true }, "Use arrow/space to select, then press Enter to register.")),
73
74
  React.createElement(Box, { marginTop: 1, marginBottom: 1 },
74
75
  React.createElement(MultiSelect, { options: options, onChange: vals => setSelectedValues(vals), onSubmit: vals => void handleTemplateRegistration(vals) })),
75
76
  !!errorMessage && React.createElement(Text, { color: "red" }, errorMessage),
76
- !!successMessage && React.createElement(Text, { color: "green" }, successMessage)));
77
+ !!successMessage && React.createElement(Text, { color: "#3ecf8e" }, successMessage),
78
+ React.createElement(Quittable, null)));
77
79
  }
78
80
  return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
79
81
  !!errorMessage && React.createElement(Text, { color: "red" }, errorMessage),
80
- !!successMessage && React.createElement(Text, { color: "green" }, successMessage)));
82
+ !!successMessage && React.createElement(Text, { color: "#3ecf8e" }, successMessage),
83
+ React.createElement(Quittable, null)));
81
84
  }
82
85
  //# sourceMappingURL=register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.tsx"],"names":[],"mappings":"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"}
@@ -1,127 +1,115 @@
1
+ // src/components/watch.tsx
1
2
  import path from 'node:path';
2
- import { Box, Text, useApp, useInput } from 'ink';
3
- import React from 'react';
3
+ import { Badge } from '@inkjs/ui';
4
+ import { Box, Text, useInput } from 'ink';
5
+ import React, { useMemo } from 'react';
4
6
  import Branding from '../components/Branding.js';
7
+ import Quittable from '../components/Quittable.js';
5
8
  import { TimeSince } from '../components/TimeSince.js';
6
- import { TemplateManager } from '../lib/templateManager.js';
9
+ import { useDatabaseConnection } from '../hooks/useDatabaseConnection.js';
10
+ import { useTemplateManager } from '../hooks/useTemplateManager.js';
11
+ const MAX_FILES = 30;
12
+ const PATH_DISPLAY_LENGTH = 15;
13
+ function StatBadge({ label, value, color }) {
14
+ return (React.createElement(Box, { marginRight: 1 },
15
+ React.createElement(Badge, { color: color },
16
+ ' ',
17
+ label,
18
+ ": ",
19
+ value,
20
+ ' ')));
21
+ }
22
+ function formatTemplateDisplay(templatePath, templateDir) {
23
+ const parts = templatePath.split(path.sep);
24
+ const filename = parts.pop() || '';
25
+ const dirPath = parts.join(path.sep);
26
+ if (dirPath && templateDir && dirPath.includes(templateDir)) {
27
+ const relativePath = dirPath.substring(dirPath.indexOf(templateDir) + templateDir.length + 1);
28
+ if (relativePath) {
29
+ const truncatedPath = relativePath.slice(-PATH_DISPLAY_LENGTH);
30
+ return `${truncatedPath}/${filename}`;
31
+ }
32
+ }
33
+ return filename;
34
+ }
35
+ const TemplateRow = React.memo(({ template, isLatest, templateDir, }) => {
36
+ const displayName = formatTemplateDisplay(template.path, templateDir ?? '');
37
+ return (React.createElement(Box, { marginLeft: 2 },
38
+ React.createElement(Box, { width: 2 },
39
+ React.createElement(Text, null, template.buildState.lastAppliedError ? '❌' : isLatest ? '⚡️' : '✓')),
40
+ React.createElement(Box, { width: 35 },
41
+ React.createElement(Text, null, displayName)),
42
+ React.createElement(Box, null,
43
+ React.createElement(Text, { dimColor: true },
44
+ "applied ",
45
+ React.createElement(TimeSince, { date: template.buildState.lastAppliedDate }),
46
+ " ago",
47
+ !template.buildState.lastBuildDate ||
48
+ template.currentHash !== template.buildState.lastBuildHash ? (React.createElement(React.Fragment, null, " \u2022 needs build")) : (React.createElement(React.Fragment, null,
49
+ ' ',
50
+ "\u2022 built ",
51
+ React.createElement(TimeSince, { date: template.buildState.lastBuildDate }),
52
+ " ago"))))));
53
+ });
54
+ TemplateRow.displayName = 'TemplateRow';
55
+ const UpdateLog = React.memo(({ updates, templateDir, }) => {
56
+ const sortedUpdates = useMemo(() => [...updates].reverse().slice(0, 5), [updates]);
57
+ return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
58
+ React.createElement(Text, { bold: true }, "Recent Updates:"),
59
+ sortedUpdates.map(update => (React.createElement(Box, { key: `${update.template.path}-${update.timestamp}`, marginLeft: 2 },
60
+ React.createElement(Text, { color: update.type === 'error' ? 'red' : update.type === 'applied' ? 'green' : 'blue' },
61
+ update.type === 'error' ? '❌' : update.type === 'applied' ? '✨' : '📝',
62
+ ' ',
63
+ formatTemplateDisplay(update.template.path, templateDir ?? ''),
64
+ ":",
65
+ ' ',
66
+ update.type === 'error'
67
+ ? update.error
68
+ : update.type === 'applied'
69
+ ? 'applied successfully'
70
+ : 'changed and reapplied'))))));
71
+ });
72
+ UpdateLog.displayName = 'UpdateLog';
7
73
  export default function Watch() {
8
- const { exit } = useApp();
9
- const [templates, setTemplates] = React.useState([]);
10
- const [error, setError] = React.useState();
11
- const managerRef = React.useRef();
12
- const mounted = React.useRef(true);
13
- useInput((input, key) => {
14
- if (input.toLowerCase() === 'q' || (key.ctrl && input === 'c')) {
15
- mounted.current = false;
16
- setTimeout(() => exit(), 0);
74
+ const { isConnected } = useDatabaseConnection();
75
+ const { templates, updates, stats, isLoading, errors, latestPath, templateDir } = useTemplateManager();
76
+ const [showUpdates, setShowUpdates] = React.useState(true);
77
+ const activeTemplates = useMemo(() => templates.slice(-MAX_FILES), [templates]);
78
+ const hasErrors = errors.size > 0;
79
+ useInput(input => {
80
+ if (input === 'u') {
81
+ setShowUpdates(s => !s);
17
82
  }
18
83
  });
19
- React.useEffect(() => {
20
- let cleanup;
21
- console.clear();
22
- async function init() {
23
- try {
24
- managerRef.current = await TemplateManager.create(process.cwd(), { silent: true });
25
- // Initial template load
26
- const initialTemplates = await managerRef.current.findTemplates();
27
- for (const templatePath of initialTemplates) {
28
- const status = await managerRef.current.getTemplateStatus(templatePath);
29
- if (mounted.current) {
30
- setTemplates(prev => [...prev.filter(t => t.path !== status.path), status]);
31
- }
32
- }
33
- // Watch and handle changes
34
- const watcher = await managerRef.current.watch();
35
- // Update UI on template changes
36
- const updateTemplate = async (template) => {
37
- if (!mounted.current)
38
- return;
39
- const status = await managerRef.current?.getTemplateStatus(template.path);
40
- if (status) {
41
- setTemplates(prev => [...prev.filter(t => t.path !== status.path), status]);
42
- }
43
- };
44
- managerRef.current.on('templateChanged', updateTemplate);
45
- managerRef.current.on('templateApplied', updateTemplate);
46
- managerRef.current.on('templateError', ({ template }) => updateTemplate(template));
47
- // Initial apply for any out-of-date templates
48
- await managerRef.current.processTemplates({ apply: true });
49
- return () => {
50
- mounted.current = false;
51
- watcher.close();
52
- };
53
- }
54
- catch (err) {
55
- if (mounted.current) {
56
- setError(err instanceof Error ? err.message : String(err));
57
- }
58
- return () => {
59
- mounted.current = false;
60
- };
61
- }
62
- }
63
- init().then(c => {
64
- cleanup = c;
65
- });
66
- return () => cleanup?.();
67
- }, []);
68
- if (error) {
69
- return React.createElement(Text, { color: "red" },
70
- "Error: ",
71
- error);
84
+ if (!isConnected) {
85
+ return (React.createElement(Box, { flexDirection: "column" },
86
+ React.createElement(Text, { color: "red" }, "Unable to connect to database. Is Supabase running?"),
87
+ React.createElement(Quittable, null)));
72
88
  }
73
- const templatesByDir = templates.reduce((acc, template) => {
74
- const dir = path.dirname(path.relative(process.cwd(), template.path));
75
- if (!acc[dir]) {
76
- acc[dir] = [];
77
- }
78
- acc[dir].push(template);
79
- return acc;
80
- }, {});
81
- const hasErrors = templates.some(t => t.buildState.lastAppliedError);
82
- return (React.createElement(Box, { flexDirection: "column", marginBottom: 2, marginTop: 2 },
83
- React.createElement(Branding, { subtitle: "Watch Mode" }),
84
- Object.entries(templatesByDir).map(([dir, dirTemplates]) => (React.createElement(Box, { key: dir, flexDirection: "column", marginLeft: 1 },
85
- React.createElement(Text, { dimColor: true }, dir),
86
- dirTemplates.map(template => (React.createElement(Box, { key: template.path, marginLeft: 2 },
87
- React.createElement(Box, { width: 2 },
88
- React.createElement(Text, null, template.buildState.lastAppliedError
89
- ? '❌'
90
- : template === templates[templates.length - 1]
91
- ? '✓'
92
- : ' ')),
93
- React.createElement(Box, { width: 20 },
94
- React.createElement(Text, null, path.basename(template.path))),
95
- React.createElement(Box, null,
96
- React.createElement(Text, { dimColor: true },
97
- "applied ",
98
- React.createElement(TimeSince, { date: template.buildState.lastAppliedDate }),
99
- " ago",
100
- !template.buildState.lastBuildDate ||
101
- template.currentHash !== template.buildState.lastBuildHash ? (React.createElement(React.Fragment, null, " \u2022 needs build")) : (React.createElement(React.Fragment, null,
102
- ' ',
103
- "\u2022 built ",
104
- React.createElement(TimeSince, { date: template.buildState.lastBuildDate }),
105
- " ago")))))))))),
106
- hasErrors && (React.createElement(Box, { flexDirection: "column", marginY: 1 },
107
- React.createElement(Text, { bold: true, color: "red" }, "Errors"),
108
- templates
109
- .filter(t => t.buildState.lastAppliedError)
110
- .map(t => (React.createElement(Box, { key: t.name, marginLeft: 2 },
111
- React.createElement(Text, { color: "red" },
112
- "\u2022 ",
113
- t.name,
114
- ": ",
115
- t.buildState.lastAppliedError)))))),
89
+ return (React.createElement(Box, { flexDirection: "column" },
90
+ React.createElement(Branding, { subtitle: "\uD83D\uDC40 Watch Mode" }),
116
91
  React.createElement(Box, { marginY: 1 },
117
- React.createElement(Text, { bold: true, backgroundColor: hasErrors ? 'red' : 'green' }, hasErrors ? ' FAIL ' : ' OK '),
118
- React.createElement(Text, null, " "),
119
- React.createElement(Text, { dimColor: true }, "Watching for template changes...")),
120
- React.createElement(Box, null,
121
- React.createElement(Text, { dimColor: true }, "press "),
122
- React.createElement(Text, null, "q"),
123
- React.createElement(Text, { dimColor: true }, " or "),
124
- React.createElement(Text, null, "Ctrl+c"),
125
- React.createElement(Text, { dimColor: true }, " to quit"))));
92
+ React.createElement(StatBadge, { label: "Total", value: stats.total, color: "#3ecf8e" }),
93
+ stats.needsBuild > 0 && (React.createElement(StatBadge, { label: "Needs Build", value: stats.needsBuild, color: "yellow" })),
94
+ stats.recentlyChanged > 0 && (React.createElement(StatBadge, { label: "Recent Changes", value: stats.recentlyChanged, color: "blue" })),
95
+ hasErrors && React.createElement(StatBadge, { label: "Errors", value: stats.errors, color: "red" })),
96
+ isLoading ? (React.createElement(Text, null, "\uD83D\uDD0D Finding templates...")) : (React.createElement(Box, { flexDirection: "column" },
97
+ activeTemplates.map(template => (React.createElement(TemplateRow, { key: template.path, template: template, isLatest: template.path === latestPath, templateDir: templateDir }))),
98
+ showUpdates && updates.length > 0 && (React.createElement(UpdateLog, { updates: updates, templateDir: templateDir })),
99
+ !showUpdates && hasErrors && (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
100
+ React.createElement(Text, { bold: true, color: "red" }, "Errors:"),
101
+ Array.from(errors.entries()).map(([path, error]) => (React.createElement(Box, { key: path, marginLeft: 2, marginTop: 1 },
102
+ React.createElement(Text, { color: "red", wrap: "wrap" },
103
+ formatTemplateDisplay(path, templateDir ?? ''),
104
+ ": ",
105
+ error)))))))),
106
+ React.createElement(Box, { marginY: 1, flexDirection: "row", gap: 1 },
107
+ React.createElement(Box, { marginY: 1 },
108
+ React.createElement(Text, { dimColor: true }, "press "),
109
+ React.createElement(Text, { underline: showUpdates }, "u"),
110
+ React.createElement(Text, { dimColor: true }, " to toggle updates")),
111
+ React.createElement(Box, { marginY: 1 },
112
+ React.createElement(Text, { dimColor: true }, "\u2022")),
113
+ React.createElement(Quittable, null))));
126
114
  }
127
115
  //# sourceMappingURL=watch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.tsx"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
+ import { Badge } from '@inkjs/ui';
1
2
  import { Box, Text } from 'ink';
2
3
  import React from 'react';
3
4
  import packageJson from '../../package.json' assert { type: 'json' };
5
+ import { useDatabaseConnection } from '../hooks/useDatabaseConnection.js';
4
6
  export default function Branding({ subtitle }) {
7
+ const { error, isConnected } = useDatabaseConnection();
8
+ const badgeColor = error ? 'red' : isConnected ? '#3ecf8e' : 'yellow';
5
9
  return (React.createElement(Box, { marginBottom: 1, marginTop: 1, gap: 1, flexDirection: "column" },
6
10
  React.createElement(Box, { gap: 1 },
7
- React.createElement(Text, { bold: true, backgroundColor: "#3ecf8e" },
8
- ' ',
9
- "srtd",
10
- ' '),
11
+ React.createElement(Badge, { color: badgeColor }, " srtd "),
11
12
  subtitle ? (React.createElement(Text, null, subtitle)) : (React.createElement(Text, null,
12
13
  "(",
13
14
  React.createElement(Text, { bold: true, color: "#3ecf8e" }, "S"),
@@ -1 +1 @@
1
- {"version":3,"file":"Branding.js","sourceRoot":"","sources":["../../src/components/Branding.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,WAAW,MAAM,oBAAoB,CAAC,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC;AAMrE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAS;IAClD,OAAO,CACL,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;QAChE,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC;YACT,oBAAC,IAAI,IAAC,IAAI,QAAC,eAAe,EAAC,SAAS;gBACjC,GAAG;;gBACC,GAAG,CACH;YACN,QAAQ,CAAC,CAAC,CAAC,CACV,oBAAC,IAAI,QAAE,QAAQ,CAAQ,CACxB,CAAC,CAAC,CAAC,CACF,oBAAC,IAAI;;gBAEH,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;;gBACC,GAAG;gBACX,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;;gBACG,GAAG;gBACb,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;;gBACC,GAAG;gBACX,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;8BAEF,CACR;YACD,oBAAC,IAAI,IAAC,QAAQ;;gBAAG,WAAW,CAAC,OAAO,CAAQ,CACxC,CACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Branding.js","sourceRoot":"","sources":["../../src/components/Branding.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,WAAW,MAAM,oBAAoB,CAAC,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAM1E,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAS;IAClD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAEvD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtE,OAAO,CACL,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;QAChE,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC;YACT,oBAAC,KAAK,IAAC,KAAK,EAAE,UAAU,aAAgB;YACvC,QAAQ,CAAC,CAAC,CAAC,CACV,oBAAC,IAAI,QAAE,QAAQ,CAAQ,CACxB,CAAC,CAAC,CAAC,CACF,oBAAC,IAAI;;gBAEH,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;;gBACC,GAAG;gBACX,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;;gBACG,GAAG;gBACb,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;;gBACC,GAAG;gBACX,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,QAEnB;8BAEF,CACR;YACD,oBAAC,IAAI,IAAC,QAAQ;;gBAAG,WAAW,CAAC,OAAO,CAAQ,CACxC,CACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ interface QuittableProps {
3
+ onQuit?: () => void;
4
+ }
5
+ export default function Quittable(props: QuittableProps): React.JSX.Element;
6
+ export {};
@@ -0,0 +1,36 @@
1
+ import process from 'node:process';
2
+ import { Box, Text, useInput } from 'ink';
3
+ import React from 'react';
4
+ export default function Quittable(props) {
5
+ // Use ref to track if component is mounted
6
+ const mounted = React.useRef(true);
7
+ React.useEffect(() => {
8
+ return () => {
9
+ mounted.current = false;
10
+ };
11
+ }, []);
12
+ useInput((input, key) => {
13
+ if (!mounted.current)
14
+ return;
15
+ if (input.toLowerCase() === 'q' || (key.ctrl && input === 'c')) {
16
+ try {
17
+ if (props?.onQuit) {
18
+ props.onQuit();
19
+ }
20
+ // Exit synchronously
21
+ process.exit(0);
22
+ }
23
+ catch (error) {
24
+ console.error('Failed to exit cleanly:', error);
25
+ process.exit(1);
26
+ }
27
+ }
28
+ });
29
+ return (React.createElement(Box, { marginY: 1 },
30
+ React.createElement(Text, { dimColor: true }, "press "),
31
+ React.createElement(Text, null, "q"),
32
+ React.createElement(Text, { dimColor: true }, " or "),
33
+ React.createElement(Text, null, "Ctrl+c"),
34
+ React.createElement(Text, { dimColor: true }, " to quit")));
35
+ }
36
+ //# sourceMappingURL=Quittable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Quittable.js","sourceRoot":"","sources":["../../src/components/Quittable.tsx"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAqB;IACrD,2CAA2C;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QAE7B,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;oBAClB,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,CAAC;gBACD,qBAAqB;gBACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,oBAAC,GAAG,IAAC,OAAO,EAAE,CAAC;QACb,oBAAC,IAAI,IAAC,QAAQ,mBAAc;QAC5B,oBAAC,IAAI,YAAS;QACd,oBAAC,IAAI,IAAC,QAAQ,iBAAY;QAC1B,oBAAC,IAAI,iBAAc;QACnB,oBAAC,IAAI,IAAC,QAAQ,qBAAgB,CAC1B,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface DbConnectionState {
2
+ isConnected: boolean;
3
+ isChecking: boolean;
4
+ error?: string;
5
+ }
6
+ export declare function useDatabaseConnection(checkInterval?: number): DbConnectionState;
7
+ export {};
@@ -0,0 +1,68 @@
1
+ // hooks/useDatabaseConnection.ts
2
+ import { useEffect, useState } from 'react';
3
+ import { RETRY_DELAY, testConnection } from '../utils/databaseConnection.js';
4
+ function parseDbError(error) {
5
+ if (error instanceof Error) {
6
+ if (error.message.includes('Connection terminated unexpectedly')) {
7
+ return 'Database connection lost. Is Supabase running?';
8
+ }
9
+ if (error.message.includes('ECONNREFUSED')) {
10
+ return 'Unable to connect to database. Is Supabase running?';
11
+ }
12
+ return error.message.split('\n')[0] || error.message;
13
+ }
14
+ return String(error);
15
+ }
16
+ export function useDatabaseConnection(checkInterval = 5000) {
17
+ const [state, setState] = useState({
18
+ isConnected: false,
19
+ isChecking: true,
20
+ });
21
+ useEffect(() => {
22
+ let mounted = true;
23
+ let timeoutId;
24
+ let intervalId = undefined;
25
+ async function checkConnection() {
26
+ if (!mounted)
27
+ return;
28
+ setState(prev => ({ ...prev, isChecking: true }));
29
+ try {
30
+ const connectionPromise = testConnection();
31
+ const timeoutPromise = new Promise((_, reject) => {
32
+ timeoutId = setTimeout(() => {
33
+ reject(new Error('Connection attempt timed out'));
34
+ }, RETRY_DELAY);
35
+ });
36
+ const isConnected = await Promise.race([connectionPromise, timeoutPromise]);
37
+ if (mounted) {
38
+ setState({
39
+ isConnected,
40
+ error: undefined,
41
+ isChecking: false,
42
+ });
43
+ }
44
+ }
45
+ catch (err) {
46
+ if (mounted) {
47
+ setState({
48
+ isConnected: false,
49
+ error: parseDbError(err),
50
+ isChecking: false,
51
+ });
52
+ }
53
+ }
54
+ finally {
55
+ clearTimeout(timeoutId);
56
+ }
57
+ }
58
+ checkConnection();
59
+ intervalId = setInterval(checkConnection, checkInterval);
60
+ return () => {
61
+ mounted = false;
62
+ clearTimeout(timeoutId);
63
+ clearInterval(intervalId);
64
+ };
65
+ }, [checkInterval]);
66
+ return state;
67
+ }
68
+ //# sourceMappingURL=useDatabaseConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDatabaseConnection.js","sourceRoot":"","sources":["../../src/hooks/useDatabaseConnection.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAQ7E,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE,CAAC;YACjE,OAAO,gDAAgD,CAAC;QAC1D,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,OAAO,qDAAqD,CAAC;QAC/D,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAAa,GAAG,IAAI;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAoB;QACpD,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,SAAyB,CAAC;QAC9B,IAAI,UAAU,GAA+B,SAAS,CAAC;QAEvD,KAAK,UAAU,eAAe;YAC5B,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAElD,IAAI,CAAC;gBACH,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;gBAC3C,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;oBACtD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;oBACpD,CAAC,EAAE,WAAW,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;gBAE5E,IAAI,OAAO,EAAE,CAAC;oBACZ,QAAQ,CAAC;wBACP,WAAW;wBACX,KAAK,EAAE,SAAS;wBAChB,UAAU,EAAE,KAAK;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,EAAE,CAAC;oBACZ,QAAQ,CAAC;wBACP,WAAW,EAAE,KAAK;wBAClB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;wBACxB,UAAU,EAAE,KAAK;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,eAAe,EAAE,CAAC;QAClB,UAAU,GAAG,WAAW,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAEzD,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,aAAa,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { TemplateStatus } from '../types.js';
2
+ export type TemplateUpdate = {
3
+ type: 'applied' | 'changed' | 'error';
4
+ template: TemplateStatus;
5
+ timestamp: string;
6
+ error?: string;
7
+ path: string;
8
+ };
9
+ export interface TemplateStats {
10
+ total: number;
11
+ needsBuild: number;
12
+ recentlyChanged: number;
13
+ errors: number;
14
+ }
15
+ export interface UseTemplateManager {
16
+ templates: TemplateStatus[];
17
+ updates: TemplateUpdate[];
18
+ stats: TemplateStats;
19
+ isLoading: boolean;
20
+ errors: Map<string, string>;
21
+ latestPath?: string;
22
+ templateDir?: string;
23
+ }
24
+ export declare function useTemplateManager(cwd?: string): UseTemplateManager;