@t1mmen/srtd 0.2.2 → 0.4.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 (52) hide show
  1. package/README.md +170 -146
  2. package/dist/__tests__/vitest.setup.js +41 -25
  3. package/dist/__tests__/vitest.setup.js.map +1 -1
  4. package/dist/__tests__/watch.test.js +0 -1
  5. package/dist/__tests__/watch.test.js.map +1 -1
  6. package/dist/cli.js +3 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/_app.js +31 -3
  9. package/dist/commands/_app.js.map +1 -1
  10. package/dist/commands/apply.d.ts +13 -1
  11. package/dist/commands/apply.js +19 -6
  12. package/dist/commands/apply.js.map +1 -1
  13. package/dist/commands/build.d.ts +13 -1
  14. package/dist/commands/build.js +14 -4
  15. package/dist/commands/build.js.map +1 -1
  16. package/dist/commands/clear.d.ts +2 -0
  17. package/dist/commands/clear.js +45 -0
  18. package/dist/commands/clear.js.map +1 -0
  19. package/dist/commands/index.js +25 -10
  20. package/dist/commands/index.js.map +1 -1
  21. package/dist/commands/register.js +9 -6
  22. package/dist/commands/register.js.map +1 -1
  23. package/dist/commands/watch.js +121 -117
  24. package/dist/commands/watch.js.map +1 -1
  25. package/dist/components/Branding.js +5 -4
  26. package/dist/components/Branding.js.map +1 -1
  27. package/dist/components/Quittable.d.ts +6 -0
  28. package/dist/components/Quittable.js +36 -0
  29. package/dist/components/Quittable.js.map +1 -0
  30. package/dist/hooks/useDatabaseConnection.d.ts +7 -0
  31. package/dist/hooks/useDatabaseConnection.js +68 -0
  32. package/dist/hooks/useDatabaseConnection.js.map +1 -0
  33. package/dist/hooks/useTemplateManager.d.ts +22 -0
  34. package/dist/hooks/useTemplateManager.js +124 -0
  35. package/dist/hooks/useTemplateManager.js.map +1 -0
  36. package/dist/lib/templateManager.d.ts +12 -5
  37. package/dist/lib/templateManager.js +166 -60
  38. package/dist/lib/templateManager.js.map +1 -1
  39. package/dist/lib/templateManager.test.js +452 -15
  40. package/dist/lib/templateManager.test.js.map +1 -1
  41. package/dist/types.d.ts +2 -1
  42. package/dist/utils/config.d.ts +2 -0
  43. package/dist/utils/config.js +27 -40
  44. package/dist/utils/config.js.map +1 -1
  45. package/dist/utils/databaseConnection.d.ts +5 -1
  46. package/dist/utils/databaseConnection.js +40 -9
  47. package/dist/utils/databaseConnection.js.map +1 -1
  48. package/dist/utils/logger.d.ts +1 -0
  49. package/package.json +12 -7
  50. package/dist/commands/help.d.ts +0 -1
  51. package/dist/commands/help.js +0 -2
  52. package/dist/commands/help.js.map +0 -1
@@ -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,22 @@
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
+ };
8
+ export interface UseTemplateManager {
9
+ templates: TemplateStatus[];
10
+ updates: TemplateUpdate[];
11
+ stats: {
12
+ total: number;
13
+ needsBuild: number;
14
+ recentlyChanged: number;
15
+ errors: number;
16
+ };
17
+ isLoading: boolean;
18
+ errors: Map<string, string>;
19
+ latestPath?: string;
20
+ templateDir?: string;
21
+ }
22
+ export declare function useTemplateManager(cwd?: string): UseTemplateManager;
@@ -0,0 +1,124 @@
1
+ // src/hooks/useTemplateManager.ts
2
+ import { useEffect, useMemo, useRef, useState } from 'react';
3
+ import { TemplateManager } from '../lib/templateManager.js';
4
+ import { getConfig } from '../utils/config.js';
5
+ export function useTemplateManager(cwd = process.cwd()) {
6
+ const [templates, setTemplates] = useState([]);
7
+ const [updates, setUpdates] = useState([]);
8
+ const [errors, setErrors] = useState(new Map());
9
+ const [isLoading, setIsLoading] = useState(true);
10
+ const [templateDir, setTemplateDir] = useState();
11
+ const [latestPath, setLatestPath] = useState();
12
+ const managerRef = useRef();
13
+ const sortedTemplates = useMemo(() => [...templates].sort((a, b) => {
14
+ const dateA = a.buildState.lastAppliedDate || '';
15
+ const dateB = b.buildState.lastAppliedDate || '';
16
+ return dateA.localeCompare(dateB);
17
+ }), [templates]);
18
+ const stats = useMemo(() => ({
19
+ total: templates.length,
20
+ needsBuild: templates.filter(t => !t.buildState.lastBuildDate || t.currentHash !== t.buildState.lastBuildHash).length,
21
+ recentlyChanged: updates.filter(u => {
22
+ const timestamp = new Date(u.timestamp);
23
+ const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000);
24
+ return timestamp > fiveMinutesAgo;
25
+ }).length,
26
+ errors: errors.size,
27
+ }), [templates, updates, errors]);
28
+ useEffect(() => {
29
+ let mounted = true;
30
+ async function init() {
31
+ try {
32
+ const config = await getConfig(cwd);
33
+ setTemplateDir(config.templateDir);
34
+ managerRef.current = await TemplateManager.create(cwd, { silent: true });
35
+ // Setup event handlers
36
+ managerRef.current.on('templateChanged', template => {
37
+ if (!mounted)
38
+ return;
39
+ setLatestPath(template.path);
40
+ setUpdates(prev => [
41
+ {
42
+ type: 'changed',
43
+ template,
44
+ timestamp: new Date().toISOString(),
45
+ },
46
+ ...prev,
47
+ ].slice(0, 50));
48
+ });
49
+ managerRef.current.on('templateApplied', template => {
50
+ if (!mounted)
51
+ return;
52
+ setLatestPath(template.path);
53
+ setTemplates(prev => {
54
+ const rest = prev.filter(t => t.path !== template.path);
55
+ return [...rest, template];
56
+ });
57
+ setUpdates(prev => [
58
+ {
59
+ type: 'applied',
60
+ template,
61
+ timestamp: new Date().toISOString(),
62
+ },
63
+ ...prev,
64
+ ].slice(0, 50));
65
+ setErrors(prev => {
66
+ const next = new Map(prev);
67
+ next.delete(template.path);
68
+ return next;
69
+ });
70
+ });
71
+ managerRef.current.on('templateError', ({ template, error: err }) => {
72
+ if (!mounted)
73
+ return;
74
+ // Ensure error is properly stringified
75
+ const errorMsg = typeof err === 'object'
76
+ ? err instanceof Error
77
+ ? err.message
78
+ : JSON.stringify(err)
79
+ : String(err);
80
+ setErrors(prev => new Map(prev).set(template.path, errorMsg));
81
+ setUpdates(prev => [
82
+ {
83
+ type: 'error',
84
+ template,
85
+ timestamp: new Date().toISOString(),
86
+ error: errorMsg,
87
+ },
88
+ ...prev,
89
+ ].slice(0, 50));
90
+ });
91
+ // Initial load
92
+ const initialTemplates = await managerRef.current.findTemplates();
93
+ const statuses = await Promise.all(initialTemplates.map(t => managerRef.current?.getTemplateStatus(t)));
94
+ if (mounted) {
95
+ setTemplates(statuses.filter((s) => s !== null));
96
+ setIsLoading(false);
97
+ }
98
+ // Start watching
99
+ await managerRef.current.watch();
100
+ }
101
+ catch (err) {
102
+ if (mounted) {
103
+ setErrors(new Map().set('global', String(err)));
104
+ setIsLoading(false);
105
+ }
106
+ }
107
+ }
108
+ void init();
109
+ return () => {
110
+ mounted = false;
111
+ managerRef.current?.[Symbol.dispose]();
112
+ };
113
+ }, [cwd]);
114
+ return {
115
+ templates: sortedTemplates,
116
+ updates,
117
+ stats,
118
+ isLoading,
119
+ errors,
120
+ latestPath,
121
+ templateDir,
122
+ };
123
+ }
124
+ //# sourceMappingURL=useTemplateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTemplateManager.js","sourceRoot":"","sources":["../../src/hooks/useTemplateManager.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import EventEmitter from 'node:events';
2
- import type { CLIResult, TemplateStatus } from '../types.js';
3
- export declare class TemplateManager extends EventEmitter {
2
+ import type { ProcessedTemplateResult, TemplateStatus } from '../types.js';
3
+ export declare class TemplateManager extends EventEmitter implements Disposable {
4
+ private watcher;
4
5
  private baseDir;
5
6
  private buildLog;
6
7
  private localBuildLog;
@@ -8,7 +9,11 @@ export declare class TemplateManager extends EventEmitter {
8
9
  private templateCache;
9
10
  private cacheTimeout;
10
11
  private silent;
12
+ private processQueue;
13
+ private processingTemplate;
14
+ private processing;
11
15
  private constructor();
16
+ [Symbol.dispose](): void;
12
17
  static create(baseDir: string, options?: {
13
18
  silent?: boolean;
14
19
  }): Promise<TemplateManager>;
@@ -18,15 +23,17 @@ export declare class TemplateManager extends EventEmitter {
18
23
  getTemplateStatus(templatePath: string): Promise<TemplateStatus>;
19
24
  private saveBuildLogs;
20
25
  private handleTemplateChange;
26
+ private processTemplate;
27
+ private processNextTemplate;
21
28
  watch(): Promise<{
22
- close: () => void;
29
+ close: () => Promise<void>;
23
30
  }>;
24
- applyTemplate(templatePath: string): Promise<CLIResult>;
31
+ applyTemplate(templatePath: string): Promise<ProcessedTemplateResult>;
25
32
  buildTemplate(templatePath: string, force?: boolean): Promise<void>;
26
33
  private log;
27
34
  processTemplates(options: {
28
35
  apply?: boolean;
29
36
  generateFiles?: boolean;
30
37
  force?: boolean;
31
- }): Promise<CLIResult>;
38
+ }): Promise<ProcessedTemplateResult>;
32
39
  }