@t1mmen/srtd 0.0.0-next-20251227000343

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 (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +363 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +50 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/apply.d.ts +2 -0
  7. package/dist/commands/apply.js +105 -0
  8. package/dist/commands/apply.js.map +1 -0
  9. package/dist/commands/build.d.ts +2 -0
  10. package/dist/commands/build.js +134 -0
  11. package/dist/commands/build.js.map +1 -0
  12. package/dist/commands/clear.d.ts +2 -0
  13. package/dist/commands/clear.js +161 -0
  14. package/dist/commands/clear.js.map +1 -0
  15. package/dist/commands/init.d.ts +2 -0
  16. package/dist/commands/init.js +91 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/menu.d.ts +4 -0
  19. package/dist/commands/menu.js +76 -0
  20. package/dist/commands/menu.js.map +1 -0
  21. package/dist/commands/promote.d.ts +2 -0
  22. package/dist/commands/promote.js +181 -0
  23. package/dist/commands/promote.js.map +1 -0
  24. package/dist/commands/register.d.ts +2 -0
  25. package/dist/commands/register.js +192 -0
  26. package/dist/commands/register.js.map +1 -0
  27. package/dist/commands/watch.d.ts +14 -0
  28. package/dist/commands/watch.js +190 -0
  29. package/dist/commands/watch.js.map +1 -0
  30. package/dist/constants.d.ts +1 -0
  31. package/dist/constants.js +2 -0
  32. package/dist/constants.js.map +1 -0
  33. package/dist/services/DatabaseService.d.ts +113 -0
  34. package/dist/services/DatabaseService.js +343 -0
  35. package/dist/services/DatabaseService.js.map +1 -0
  36. package/dist/services/FileSystemService.d.ts +100 -0
  37. package/dist/services/FileSystemService.js +237 -0
  38. package/dist/services/FileSystemService.js.map +1 -0
  39. package/dist/services/MigrationBuilder.d.ts +106 -0
  40. package/dist/services/MigrationBuilder.js +193 -0
  41. package/dist/services/MigrationBuilder.js.map +1 -0
  42. package/dist/services/Orchestrator.d.ts +155 -0
  43. package/dist/services/Orchestrator.js +622 -0
  44. package/dist/services/Orchestrator.js.map +1 -0
  45. package/dist/services/StateService.d.ts +169 -0
  46. package/dist/services/StateService.js +463 -0
  47. package/dist/services/StateService.js.map +1 -0
  48. package/dist/types.d.ts +48 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/ui/badge.d.ts +14 -0
  52. package/dist/ui/badge.js +28 -0
  53. package/dist/ui/badge.js.map +1 -0
  54. package/dist/ui/branding.d.ts +9 -0
  55. package/dist/ui/branding.js +35 -0
  56. package/dist/ui/branding.js.map +1 -0
  57. package/dist/ui/index.d.ts +4 -0
  58. package/dist/ui/index.js +5 -0
  59. package/dist/ui/index.js.map +1 -0
  60. package/dist/ui/results.d.ts +10 -0
  61. package/dist/ui/results.js +62 -0
  62. package/dist/ui/results.js.map +1 -0
  63. package/dist/ui/spinner.d.ts +5 -0
  64. package/dist/ui/spinner.js +8 -0
  65. package/dist/ui/spinner.js.map +1 -0
  66. package/dist/utils/config.d.ts +12 -0
  67. package/dist/utils/config.js +67 -0
  68. package/dist/utils/config.js.map +1 -0
  69. package/dist/utils/createEmptyBuildLog.d.ts +1 -0
  70. package/dist/utils/createEmptyBuildLog.js +10 -0
  71. package/dist/utils/createEmptyBuildLog.js.map +1 -0
  72. package/dist/utils/ensureDirectories.d.ts +4 -0
  73. package/dist/utils/ensureDirectories.js +23 -0
  74. package/dist/utils/ensureDirectories.js.map +1 -0
  75. package/dist/utils/fileExists.d.ts +1 -0
  76. package/dist/utils/fileExists.js +11 -0
  77. package/dist/utils/fileExists.js.map +1 -0
  78. package/dist/utils/findProjectRoot.d.ts +1 -0
  79. package/dist/utils/findProjectRoot.js +25 -0
  80. package/dist/utils/findProjectRoot.js.map +1 -0
  81. package/dist/utils/getErrorMessage.d.ts +9 -0
  82. package/dist/utils/getErrorMessage.js +14 -0
  83. package/dist/utils/getErrorMessage.js.map +1 -0
  84. package/dist/utils/getNextTimestamp.d.ts +2 -0
  85. package/dist/utils/getNextTimestamp.js +12 -0
  86. package/dist/utils/getNextTimestamp.js.map +1 -0
  87. package/dist/utils/isWipTemplate.d.ts +1 -0
  88. package/dist/utils/isWipTemplate.js +6 -0
  89. package/dist/utils/isWipTemplate.js.map +1 -0
  90. package/dist/utils/logger.d.ts +9 -0
  91. package/dist/utils/logger.js +12 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/dist/utils/safeCreate.d.ts +1 -0
  94. package/dist/utils/safeCreate.js +16 -0
  95. package/dist/utils/safeCreate.js.map +1 -0
  96. package/package.json +106 -0
@@ -0,0 +1,181 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ // src/commands/promote.ts
54
+ import path from 'node:path';
55
+ import { select } from '@inquirer/prompts';
56
+ import chalk from 'chalk';
57
+ import { Command } from 'commander';
58
+ import figures from 'figures';
59
+ import { glob } from 'glob';
60
+ import { Orchestrator } from '../services/Orchestrator.js';
61
+ import { createSpinner, renderBranding } from '../ui/index.js';
62
+ import { getConfig } from '../utils/config.js';
63
+ import { findProjectRoot } from '../utils/findProjectRoot.js';
64
+ import { getErrorMessage, isPromptExit } from '../utils/getErrorMessage.js';
65
+ async function findWipTemplates(config, projectRoot) {
66
+ const templatePath = path.join(projectRoot, config.templateDir);
67
+ const pattern = `**/*${config.wipIndicator}*.sql`;
68
+ const matches = await glob(pattern, { cwd: templatePath });
69
+ return matches.map(m => path.join(templatePath, m));
70
+ }
71
+ async function promoteTemplateAction(templatePath, orchestrator) {
72
+ const spinner = createSpinner('Promoting template...').start();
73
+ try {
74
+ // Use Orchestrator for promotion (single source of truth)
75
+ const newPath = await orchestrator.promoteTemplate(templatePath);
76
+ const templateName = path.basename(newPath, '.sql');
77
+ spinner.succeed(`Successfully promoted ${templateName}`);
78
+ console.log(chalk.dim('Run `build` command to generate migrations'));
79
+ return 0;
80
+ }
81
+ catch (err) {
82
+ spinner.fail('Failed to promote template');
83
+ console.log(chalk.red(`${figures.cross} ${getErrorMessage(err)}`));
84
+ return 1;
85
+ }
86
+ }
87
+ async function handleTemplatePromotion(templateName, config, projectRoot, orchestrator) {
88
+ const templateDir = path.join(projectRoot, config.templateDir);
89
+ const pattern = `**/*${templateName}*`;
90
+ const matches = await glob(pattern, { cwd: templateDir });
91
+ const isWip = config.wipIndicator && templateName?.includes(config.wipIndicator);
92
+ if (matches.length === 0 || !isWip) {
93
+ console.log();
94
+ console.log(chalk.red(`${figures.cross} No WIP template found matching: ${templateName} in ${config.templateDir}`));
95
+ return 1;
96
+ }
97
+ if (!isWip) {
98
+ console.log();
99
+ console.log(chalk.red(`${figures.cross} Template is not a WIP template: ${templateName}`));
100
+ return 1;
101
+ }
102
+ const match = matches[0] ? path.join(templateDir, matches[0]) : '';
103
+ if (!match) {
104
+ console.log();
105
+ console.log(chalk.red(`${figures.cross} No valid match found for template: ${templateName} in ${config.templateDir}`));
106
+ return 1;
107
+ }
108
+ return promoteTemplateAction(match, orchestrator);
109
+ }
110
+ export const promoteCommand = new Command('promote')
111
+ .description('Promote a WIP template by removing the WIP indicator from its filename')
112
+ .argument('[template]', 'Template file to promote (optional)')
113
+ .action(async (templateArg) => {
114
+ let exitCode = 0;
115
+ try {
116
+ const env_1 = { stack: [], error: void 0, hasError: false };
117
+ try {
118
+ await renderBranding({ subtitle: 'Promote WIP template' });
119
+ // Get configuration and initialize Orchestrator
120
+ const projectRoot = await findProjectRoot();
121
+ const config = await getConfig(projectRoot);
122
+ const orchestrator = __addDisposableResource(env_1, await Orchestrator.create(projectRoot, config, { silent: true }), true);
123
+ // If template was provided as argument, promote it directly
124
+ if (templateArg) {
125
+ exitCode = await handleTemplatePromotion(templateArg, config, projectRoot, orchestrator);
126
+ }
127
+ else {
128
+ // Find WIP templates for interactive selection
129
+ const spinner = createSpinner('Finding WIP templates...').start();
130
+ const wipTemplates = await findWipTemplates(config, projectRoot);
131
+ spinner.stop();
132
+ if (wipTemplates.length === 0) {
133
+ console.log(chalk.yellow(`${figures.warning} No WIP templates found in ${config.templateDir} (${config.wipIndicator})`));
134
+ exitCode = 0;
135
+ }
136
+ else if (!process.stdin.isTTY) {
137
+ // Interactive mode requires TTY
138
+ console.log(chalk.red(`${figures.cross} Interactive mode requires a TTY.`));
139
+ console.log(chalk.dim('Provide a template name as argument: srtd promote <template>'));
140
+ exitCode = 1;
141
+ }
142
+ else {
143
+ // Show interactive selection
144
+ const choices = wipTemplates.map(templatePath => ({
145
+ name: path.basename(templatePath),
146
+ value: templatePath,
147
+ }));
148
+ const selectedTemplate = await select({
149
+ message: `Select a template to promote (removes ${config.wipIndicator} in filename):`,
150
+ choices,
151
+ });
152
+ exitCode = await promoteTemplateAction(selectedTemplate, orchestrator);
153
+ }
154
+ }
155
+ }
156
+ catch (e_1) {
157
+ env_1.error = e_1;
158
+ env_1.hasError = true;
159
+ }
160
+ finally {
161
+ const result_1 = __disposeResources(env_1);
162
+ if (result_1)
163
+ await result_1;
164
+ }
165
+ }
166
+ catch (error) {
167
+ // Handle Ctrl+C gracefully
168
+ if (isPromptExit(error)) {
169
+ exitCode = 0;
170
+ }
171
+ else {
172
+ console.log();
173
+ console.log(chalk.red(`${figures.cross} Error promoting template:`));
174
+ console.log(chalk.red(getErrorMessage(error)));
175
+ exitCode = 1;
176
+ }
177
+ }
178
+ // Exit AFTER the await using block has completed, ensuring dispose() runs
179
+ process.exit(exitCode);
180
+ });
181
+ //# sourceMappingURL=promote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const registerCommand: Command;
@@ -0,0 +1,192 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ // src/commands/register.ts
54
+ import path from 'node:path';
55
+ import { checkbox } from '@inquirer/prompts';
56
+ import chalk from 'chalk';
57
+ import { Command } from 'commander';
58
+ import figures from 'figures';
59
+ import { Orchestrator } from '../services/Orchestrator.js';
60
+ import { createSpinner, renderBranding } from '../ui/index.js';
61
+ import { getConfig } from '../utils/config.js';
62
+ import { findProjectRoot } from '../utils/findProjectRoot.js';
63
+ import { getErrorMessage, isPromptExit } from '../utils/getErrorMessage.js';
64
+ async function handleTemplateRegistration(templates, orchestrator, projectRoot) {
65
+ let successCount = 0;
66
+ let failCount = 0;
67
+ const spinner = createSpinner('Registering templates...').start();
68
+ for (const templatePath of templates) {
69
+ try {
70
+ // Use Orchestrator for registration (single source of truth)
71
+ await orchestrator.registerTemplate(templatePath);
72
+ successCount++;
73
+ const relativePath = path.relative(projectRoot, templatePath);
74
+ spinner.text = `Registered: ${relativePath}`;
75
+ console.log(chalk.green(`✓ Registered template:`), relativePath);
76
+ }
77
+ catch (err) {
78
+ failCount++;
79
+ spinner.warn(`Failed: ${templatePath} - ${getErrorMessage(err)}`);
80
+ }
81
+ }
82
+ spinner.stop();
83
+ console.log();
84
+ if (successCount > 0) {
85
+ console.log(chalk.green(`${figures.tick} Successfully registered ${successCount} template(s)`));
86
+ }
87
+ if (failCount > 0) {
88
+ console.log(chalk.red(`${figures.cross} Failed to register ${failCount} template(s)`));
89
+ }
90
+ return failCount > 0 ? 1 : 0;
91
+ }
92
+ export const registerCommand = new Command('register')
93
+ .description('Register templates to track them in the build log')
94
+ .argument('[templates...]', 'Template files to register (optional)')
95
+ .action(async (templateArgs) => {
96
+ let exitCode = 0;
97
+ try {
98
+ const env_1 = { stack: [], error: void 0, hasError: false };
99
+ try {
100
+ await renderBranding({ subtitle: 'Register templates' });
101
+ // Initialize Orchestrator and get templates
102
+ const projectRoot = await findProjectRoot();
103
+ const config = await getConfig(projectRoot);
104
+ const orchestrator = __addDisposableResource(env_1, await Orchestrator.create(projectRoot, config, { silent: true }), true);
105
+ // If templates were provided as arguments, register them directly
106
+ if (templateArgs?.length) {
107
+ // Resolve template paths (may be relative)
108
+ const resolvedPaths = templateArgs.map(t => path.resolve(projectRoot, t));
109
+ exitCode = await handleTemplateRegistration(resolvedPaths, orchestrator, projectRoot);
110
+ }
111
+ else {
112
+ // Load templates for interactive selection
113
+ const spinner = createSpinner('Loading templates...').start();
114
+ const templatePaths = await orchestrator.findTemplates();
115
+ const templates = [];
116
+ for (const templatePath of templatePaths) {
117
+ try {
118
+ const template = await orchestrator.getTemplateStatusExternal(templatePath);
119
+ templates.push(template);
120
+ }
121
+ catch {
122
+ // Skip templates that can't be loaded
123
+ }
124
+ }
125
+ spinner.stop();
126
+ // Filter to unregistered templates by default
127
+ const unregisteredTemplates = templates
128
+ .filter(t => !t.buildState.lastMigrationFile)
129
+ .sort((a, b) => a.name.localeCompare(b.name));
130
+ if (unregisteredTemplates.length === 0) {
131
+ if (templates.length === 0) {
132
+ console.log(chalk.yellow(`${figures.warning} No templates found`));
133
+ console.log(chalk.dim(`${figures.info} Start by creating a template in the templates directory.`));
134
+ }
135
+ else {
136
+ console.log(chalk.yellow(`${figures.warning} No unregistered templates found`));
137
+ console.log(chalk.dim(`${figures.info} All ${templates.length} template(s) are already registered.`));
138
+ }
139
+ exitCode = 0;
140
+ }
141
+ else if (!process.stdin.isTTY) {
142
+ // Interactive mode requires TTY
143
+ console.log(chalk.red(`${figures.cross} Interactive mode requires a TTY.`));
144
+ console.log(chalk.dim('Provide template paths as arguments: srtd register <template1> <template2>'));
145
+ exitCode = 1;
146
+ }
147
+ else {
148
+ // Show interactive multi-select
149
+ const choices = unregisteredTemplates.map(template => ({
150
+ name: `${template.name} (new)`,
151
+ value: template.path,
152
+ }));
153
+ const selectedTemplates = await checkbox({
154
+ message: 'Select templates to register:',
155
+ choices,
156
+ });
157
+ if (selectedTemplates.length === 0) {
158
+ console.log(chalk.yellow(`${figures.warning} No templates selected`));
159
+ exitCode = 0;
160
+ }
161
+ else {
162
+ exitCode = await handleTemplateRegistration(selectedTemplates, orchestrator, projectRoot);
163
+ }
164
+ }
165
+ }
166
+ }
167
+ catch (e_1) {
168
+ env_1.error = e_1;
169
+ env_1.hasError = true;
170
+ }
171
+ finally {
172
+ const result_1 = __disposeResources(env_1);
173
+ if (result_1)
174
+ await result_1;
175
+ }
176
+ }
177
+ catch (error) {
178
+ // Handle Ctrl+C gracefully
179
+ if (isPromptExit(error)) {
180
+ exitCode = 0;
181
+ }
182
+ else {
183
+ console.log();
184
+ console.log(chalk.red(`${figures.cross} Error loading templates:`));
185
+ console.log(chalk.red(getErrorMessage(error)));
186
+ exitCode = 1;
187
+ }
188
+ }
189
+ // Exit AFTER the await using block has completed, ensuring dispose() runs
190
+ process.exit(exitCode);
191
+ });
192
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Command } from 'commander';
2
+ import type { TemplateStatus } from '../types.js';
3
+ interface TemplateUpdate {
4
+ type: 'applied' | 'changed' | 'error';
5
+ template: TemplateStatus;
6
+ timestamp: string;
7
+ error?: string;
8
+ }
9
+ /** Formats an ISO date string as a relative time (e.g., "5m ago") */
10
+ export declare function formatRelativeTime(isoDate: string): string;
11
+ /** Renders the full watch mode screen with header, history, errors, and instructions */
12
+ export declare function renderScreen(templates: TemplateStatus[], recentUpdates: TemplateUpdate[], errors: Map<string, string>, templateDir: string, showHistory: boolean): void;
13
+ export declare const watchCommand: Command;
14
+ export {};
@@ -0,0 +1,190 @@
1
+ // src/commands/watch.ts
2
+ import path from 'node:path';
3
+ import readline from 'node:readline';
4
+ import chalk from 'chalk';
5
+ import { Command } from 'commander';
6
+ import figures from 'figures';
7
+ import { Orchestrator } from '../services/Orchestrator.js';
8
+ import { createSpinner, renderBranding } from '../ui/index.js';
9
+ import { getConfig } from '../utils/config.js';
10
+ import { findProjectRoot } from '../utils/findProjectRoot.js';
11
+ import { getErrorMessage } from '../utils/getErrorMessage.js';
12
+ const PATH_DISPLAY_LENGTH = 15;
13
+ const MAX_HISTORY = 10;
14
+ /** Formats an ISO date string as a relative time (e.g., "5m ago") */
15
+ export function formatRelativeTime(isoDate) {
16
+ const seconds = Math.floor((Date.now() - new Date(isoDate).getTime()) / 1000);
17
+ if (seconds < 5)
18
+ return 'just now';
19
+ if (seconds < 60)
20
+ return `${seconds}s ago`;
21
+ if (seconds < 3600)
22
+ return `${Math.floor(seconds / 60)}m ago`;
23
+ if (seconds < 86400)
24
+ return `${Math.floor(seconds / 3600)}h ago`;
25
+ return `${Math.floor(seconds / 86400)}d ago`;
26
+ }
27
+ /** Renders the full watch mode screen with header, history, errors, and instructions */
28
+ export function renderScreen(templates, recentUpdates, errors, templateDir, showHistory) {
29
+ console.clear();
30
+ // Header with stats
31
+ const needsBuild = templates.filter(t => !t.buildState.lastBuildDate || t.currentHash !== t.buildState.lastBuildHash).length;
32
+ console.log(`${chalk.bold('srtd')}${chalk.dim(' - Watch Mode')}`);
33
+ console.log();
34
+ const needsBuildStr = needsBuild > 0 ? chalk.yellow(`[Needs Build: ${needsBuild}]`) : '';
35
+ const errorsStr = errors.size > 0 ? chalk.red(`[Errors: ${errors.size}]`) : '';
36
+ console.log(`${chalk.green(`[Total: ${templates.length}]`)} ${needsBuildStr} ${errorsStr}`);
37
+ console.log();
38
+ // History section (if toggled on)
39
+ if (showHistory && recentUpdates.length > 0) {
40
+ console.log(chalk.bold('Recent activity:'));
41
+ for (const update of recentUpdates) {
42
+ const displayName = formatTemplateDisplay(update.template.path, templateDir);
43
+ const time = formatRelativeTime(update.timestamp);
44
+ const icon = update.type === 'applied'
45
+ ? figures.play
46
+ : update.type === 'error'
47
+ ? figures.cross
48
+ : figures.info;
49
+ const color = update.type === 'applied' ? chalk.green : update.type === 'error' ? chalk.red : chalk.cyan;
50
+ console.log(color(` ${icon} ${displayName}: ${update.type === 'error' ? update.error : update.type} (${time})`));
51
+ }
52
+ console.log();
53
+ }
54
+ // Errors section
55
+ if (errors.size > 0) {
56
+ console.log(chalk.red.bold('Errors:'));
57
+ for (const [templatePath, error] of errors) {
58
+ console.log(chalk.red(` ${formatTemplateDisplay(templatePath, templateDir)}: ${error}`));
59
+ }
60
+ console.log();
61
+ }
62
+ // Instructions
63
+ console.log(chalk.dim(`Watching for changes... Press ${showHistory ? 'u to hide' : 'u to show'} history, q to quit`));
64
+ }
65
+ function formatTemplateDisplay(templatePath, templateDir) {
66
+ const parts = templatePath.split(path.sep);
67
+ const filename = parts.pop() || '';
68
+ const dirPath = parts.join(path.sep);
69
+ if (dirPath && templateDir && dirPath.includes(templateDir)) {
70
+ const relativePath = dirPath.substring(dirPath.indexOf(templateDir) + templateDir.length + 1);
71
+ if (relativePath) {
72
+ const truncatedPath = relativePath.slice(-PATH_DISPLAY_LENGTH);
73
+ return `${truncatedPath}/${filename}`;
74
+ }
75
+ }
76
+ return filename;
77
+ }
78
+ export const watchCommand = new Command('watch')
79
+ .description('Watch templates for changes and auto-apply')
80
+ .action(async () => {
81
+ const exitCode = 0;
82
+ let orchestrator = null;
83
+ try {
84
+ await renderBranding({ subtitle: 'Watch Mode' });
85
+ const spinner = createSpinner('Starting watch mode...').start();
86
+ // Initialize Orchestrator
87
+ const projectRoot = await findProjectRoot();
88
+ const config = await getConfig(projectRoot);
89
+ orchestrator = await Orchestrator.create(projectRoot, config, { silent: true });
90
+ // Load initial templates
91
+ const templatePaths = await orchestrator.findTemplates();
92
+ const templates = [];
93
+ const errors = new Map();
94
+ for (const templatePath of templatePaths) {
95
+ try {
96
+ const template = await orchestrator.getTemplateStatusExternal(templatePath);
97
+ templates.push(template);
98
+ }
99
+ catch (error) {
100
+ errors.set(templatePath, getErrorMessage(error));
101
+ }
102
+ }
103
+ spinner.succeed(`Watching ${templates.length} template(s)`);
104
+ // State for history tracking
105
+ const recentUpdates = [];
106
+ let showHistory = true;
107
+ // Initial render
108
+ renderScreen(templates, recentUpdates, errors, config.templateDir, showHistory);
109
+ // Set up orchestrator event listeners
110
+ orchestrator.on('templateChanged', (template) => {
111
+ recentUpdates.unshift({ type: 'changed', template, timestamp: new Date().toISOString() });
112
+ if (recentUpdates.length > MAX_HISTORY)
113
+ recentUpdates.pop();
114
+ renderScreen(templates, recentUpdates, errors, config.templateDir, showHistory);
115
+ });
116
+ orchestrator.on('templateApplied', (template) => {
117
+ recentUpdates.unshift({ type: 'applied', template, timestamp: new Date().toISOString() });
118
+ if (recentUpdates.length > MAX_HISTORY)
119
+ recentUpdates.pop();
120
+ renderScreen(templates, recentUpdates, errors, config.templateDir, showHistory);
121
+ });
122
+ orchestrator.on('templateError', ({ template, error }) => {
123
+ recentUpdates.unshift({
124
+ type: 'error',
125
+ template,
126
+ timestamp: new Date().toISOString(),
127
+ error,
128
+ });
129
+ if (recentUpdates.length > MAX_HISTORY)
130
+ recentUpdates.pop();
131
+ errors.set(template.path, error);
132
+ renderScreen(templates, recentUpdates, errors, config.templateDir, showHistory);
133
+ });
134
+ // Start watching
135
+ const watcher = await orchestrator.watch({
136
+ silent: false,
137
+ initialProcess: true,
138
+ });
139
+ // Cleanup function to properly dispose
140
+ const cleanup = async () => {
141
+ console.log();
142
+ console.log(chalk.dim('Stopping watch mode...'));
143
+ await watcher.close();
144
+ if (orchestrator) {
145
+ await orchestrator.dispose();
146
+ }
147
+ process.exit(exitCode);
148
+ };
149
+ // Set up keyboard input handling for quit and toggle
150
+ if (process.stdin.isTTY) {
151
+ // Reset stdin state in case it was modified by previous prompts
152
+ process.stdin.setRawMode(false);
153
+ process.stdin.removeAllListeners('keypress');
154
+ process.stdin.pause();
155
+ // Now set up fresh keypress handling
156
+ readline.emitKeypressEvents(process.stdin);
157
+ process.stdin.setRawMode(true);
158
+ process.stdin.resume();
159
+ process.stdin.on('keypress', (_str, key) => {
160
+ if (key && (key.name === 'q' || (key.ctrl && key.name === 'c'))) {
161
+ process.stdin.setRawMode(false);
162
+ void cleanup();
163
+ }
164
+ if (key && key.name === 'u') {
165
+ showHistory = !showHistory;
166
+ renderScreen(templates, recentUpdates, errors, config.templateDir, showHistory);
167
+ }
168
+ });
169
+ }
170
+ // Handle SIGINT
171
+ process.on('SIGINT', () => {
172
+ void cleanup();
173
+ });
174
+ // Keep the process alive
175
+ await new Promise(() => {
176
+ // This promise never resolves, keeping the process alive
177
+ // The process will be terminated by the keyboard handler or SIGINT
178
+ });
179
+ }
180
+ catch (error) {
181
+ console.log();
182
+ console.log(chalk.red(`${figures.cross} Error starting watch mode:`));
183
+ console.log(chalk.red(getErrorMessage(error)));
184
+ if (orchestrator) {
185
+ await orchestrator.dispose();
186
+ }
187
+ process.exit(1);
188
+ }
189
+ });
190
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,WAAW,GAAG,EAAE,CAAC;AASvB,qEAAqE;AACrE,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9E,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,IAAI,OAAO,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;IAC9D,IAAI,OAAO,GAAG,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACjE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAC/C,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAC1B,SAA2B,EAC3B,aAA+B,EAC/B,MAA2B,EAC3B,WAAmB,EACnB,WAAoB;IAEpB,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,oBAAoB;IACpB,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,UAAU,CAAC,aAAa,CACjF,CAAC,MAAM,CAAC;IACT,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,aAAa,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,kCAAkC;IAClC,IAAI,WAAW,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,IAAI,GACR,MAAM,CAAC,IAAI,KAAK,SAAS;gBACvB,CAAC,CAAC,OAAO,CAAC,IAAI;gBACd,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;oBACvB,CAAC,CAAC,OAAO,CAAC,KAAK;oBACf,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YACrB,MAAM,KAAK,GACT,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC7F,OAAO,CAAC,GAAG,CACT,KAAK,CACH,KAAK,IAAI,IAAI,WAAW,KAAK,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,GAAG,CAC9F,CACF,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,qBAAqB,CAAC,YAAY,EAAE,WAAW,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,eAAe;IACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,iCAAiC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,qBAAqB,CAC9F,CACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAoB,EAAE,WAAmB;IACtE,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,OAAO,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9F,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC;YAC/D,OAAO,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAwB,IAAI,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEhE,0BAA0B;QAC1B,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5C,YAAY,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhF,yBAAyB;QACzB,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEzC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;gBAC5E,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,YAAY,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC;QAE5D,6BAA6B;QAC7B,MAAM,aAAa,GAAqB,EAAE,CAAC;QAC3C,IAAI,WAAW,GAAG,IAAI,CAAC;QAEvB,iBAAiB;QACjB,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEhF,sCAAsC;QACtC,YAAY,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,QAAwB,EAAE,EAAE;YAC9D,aAAa,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC1F,IAAI,aAAa,CAAC,MAAM,GAAG,WAAW;gBAAE,aAAa,CAAC,GAAG,EAAE,CAAC;YAC5D,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,QAAwB,EAAE,EAAE;YAC9D,aAAa,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC1F,IAAI,aAAa,CAAC,MAAM,GAAG,WAAW;gBAAE,aAAa,CAAC,GAAG,EAAE,CAAC;YAC5D,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CACb,eAAe,EACf,CAAC,EAAE,QAAQ,EAAE,KAAK,EAA+C,EAAE,EAAE;YACnE,aAAa,CAAC,OAAO,CAAC;gBACpB,IAAI,EAAE,OAAO;gBACb,QAAQ;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK;aACN,CAAC,CAAC;YACH,IAAI,aAAa,CAAC,MAAM,GAAG,WAAW;gBAAE,aAAa,CAAC,GAAG,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClF,CAAC,CACF,CAAC;QAEF,iBAAiB;QACjB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC;YACvC,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACjD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,qDAAqD;QACrD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,gEAAgE;YAChE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAEtB,qCAAqC;YACrC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAEvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBACzC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;oBAChE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAChC,KAAK,OAAO,EAAE,CAAC;gBACjB,CAAC;gBACD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;oBAC5B,WAAW,GAAG,CAAC,WAAW,CAAC;oBAC3B,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB;QAChB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,KAAK,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE;YACrB,yDAAyD;YACzD,mEAAmE;QACrE,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,6BAA6B,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const CONFIG_FILE = "srtd.config.json";
@@ -0,0 +1,2 @@
1
+ export const CONFIG_FILE = 'srtd.config.json';
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC"}