aspectcode 0.2.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 (54) hide show
  1. package/bin/aspectcode.js +4 -0
  2. package/dist/cli.d.ts +102 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +46 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/deps.d.ts +3 -0
  7. package/dist/commands/deps.d.ts.map +1 -0
  8. package/dist/commands/deps.js +39 -0
  9. package/dist/commands/deps.js.map +1 -0
  10. package/dist/commands/generate.d.ts +8 -0
  11. package/dist/commands/generate.d.ts.map +1 -0
  12. package/dist/commands/generate.js +176 -0
  13. package/dist/commands/generate.js.map +1 -0
  14. package/dist/commands/impact.d.ts +9 -0
  15. package/dist/commands/impact.d.ts.map +1 -0
  16. package/dist/commands/impact.js +162 -0
  17. package/dist/commands/impact.js.map +1 -0
  18. package/dist/commands/init.d.ts +11 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +204 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/settings.d.ts +13 -0
  23. package/dist/commands/settings.d.ts.map +1 -0
  24. package/dist/commands/settings.js +196 -0
  25. package/dist/commands/settings.js.map +1 -0
  26. package/dist/commands/watch.d.ts +6 -0
  27. package/dist/commands/watch.d.ts.map +1 -0
  28. package/dist/commands/watch.js +181 -0
  29. package/dist/commands/watch.js.map +1 -0
  30. package/dist/config.d.ts +38 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +119 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/connections.d.ts +24 -0
  35. package/dist/connections.d.ts.map +1 -0
  36. package/dist/connections.js +89 -0
  37. package/dist/connections.js.map +1 -0
  38. package/dist/logger.d.ts +45 -0
  39. package/dist/logger.d.ts.map +1 -0
  40. package/dist/logger.js +116 -0
  41. package/dist/logger.js.map +1 -0
  42. package/dist/main.d.ts +12 -0
  43. package/dist/main.d.ts.map +1 -0
  44. package/dist/main.js +275 -0
  45. package/dist/main.js.map +1 -0
  46. package/dist/version.d.ts +8 -0
  47. package/dist/version.d.ts.map +1 -0
  48. package/dist/version.js +55 -0
  49. package/dist/version.js.map +1 -0
  50. package/dist/workspace.d.ts +34 -0
  51. package/dist/workspace.d.ts.map +1 -0
  52. package/dist/workspace.js +94 -0
  53. package/dist/workspace.js.map +1 -0
  54. package/package.json +53 -0
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ /**
3
+ * `aspectcode init` — create an `aspectcode.json` config file.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runInit = runInit;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const readline = __importStar(require("readline"));
43
+ const config_1 = require("../config");
44
+ const cli_1 = require("../cli");
45
+ const logger_1 = require("../logger");
46
+ const settings_1 = require("./settings");
47
+ const watch_1 = require("./watch");
48
+ async function runInit(ctx, deps = {}) {
49
+ const { root, flags, log } = ctx;
50
+ (0, settings_1.printAspectCodeBanner)(log);
51
+ const dest = (0, config_1.configPath)(root);
52
+ // Guard: config already exists
53
+ const existing = (0, config_1.loadConfig)(root);
54
+ if (existing && !flags.force) {
55
+ log.warn(`${config_1.CONFIG_FILE_NAME} already exists. Use ${logger_1.fmt.bold('--force')} to overwrite.`);
56
+ return { exitCode: cli_1.ExitCode.OK };
57
+ }
58
+ const config = await resolveInitConfig(flags);
59
+ const content = JSON.stringify(config, null, 2) + '\n';
60
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
61
+ fs.writeFileSync(dest, content, 'utf-8');
62
+ log.success(`Created ${logger_1.fmt.cyan(config_1.CONFIG_FILE_NAME)}`);
63
+ log.info('');
64
+ log.info(` Next step: run ${logger_1.fmt.bold('aspectcode generate')} to build the knowledge base.`);
65
+ log.info(` Edit ${logger_1.fmt.cyan(config_1.CONFIG_FILE_NAME)} to customise output and exclusions.`);
66
+ if (!flags.quiet && isInteractiveTty()) {
67
+ const startWatchNow = await askYesNo('Start watch now?', false);
68
+ if (startWatchNow) {
69
+ const watchRunner = deps.runWatchFn ?? watch_1.runWatch;
70
+ return await watchRunner({ root, flags, config, log, positionals: [] });
71
+ }
72
+ }
73
+ return { exitCode: cli_1.ExitCode.OK };
74
+ }
75
+ async function resolveInitConfig(flags) {
76
+ const defaults = (0, config_1.defaultConfig)();
77
+ if (flags.quiet || !isInteractiveTty()) {
78
+ return defaults;
79
+ }
80
+ const updateRate = await selectUpdateRate(defaults.updateRate ?? 'onChange');
81
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
82
+ try {
83
+ const outDirAnswer = (await ask(rl, 'Where should generated files be written? (leave blank for workspace root): ')).trim();
84
+ const outDir = outDirAnswer || undefined;
85
+ const excludeAnswer = await ask(rl, 'Any paths to exclude from analysis? (comma-separated, leave blank for none): ');
86
+ const exclude = parseExcludeList(excludeAnswer);
87
+ return {
88
+ ...defaults,
89
+ updateRate,
90
+ ...(outDir ? { outDir } : {}),
91
+ ...(exclude.length > 0 ? { exclude } : {}),
92
+ };
93
+ }
94
+ finally {
95
+ rl.close();
96
+ }
97
+ }
98
+ function ask(rl, question) {
99
+ return new Promise((resolve) => {
100
+ rl.question(question, (answer) => resolve(answer));
101
+ });
102
+ }
103
+ async function askYesNo(question, defaultValue) {
104
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
105
+ const defaultHint = defaultValue ? '[Y/n]' : '[y/N]';
106
+ try {
107
+ const answer = (await ask(rl, `${question} ${defaultHint} `)).trim().toLowerCase();
108
+ if (!answer) {
109
+ return defaultValue;
110
+ }
111
+ return answer === 'y' || answer === 'yes';
112
+ }
113
+ finally {
114
+ rl.close();
115
+ }
116
+ }
117
+ async function selectUpdateRate(defaultRate) {
118
+ const options = ['onChange', 'idle', 'manual'];
119
+ const fallback = defaultRate === 'manual' || defaultRate === 'idle' || defaultRate === 'onChange'
120
+ ? defaultRate
121
+ : 'onChange';
122
+ const selected = await selectWithArrowKeys('Update rate (arrow keys + Enter):', options, options.indexOf(fallback) >= 0 ? options.indexOf(fallback) : 0);
123
+ return selected;
124
+ }
125
+ async function selectWithArrowKeys(prompt, options, initialIndex) {
126
+ if (options.length === 0) {
127
+ throw new Error('selectWithArrowKeys requires at least one option');
128
+ }
129
+ if (!isInteractiveTty()) {
130
+ const boundedIndex = Math.min(Math.max(initialIndex, 0), options.length - 1);
131
+ return options[boundedIndex];
132
+ }
133
+ const input = process.stdin;
134
+ const output = process.stdout;
135
+ let index = Math.min(Math.max(initialIndex, 0), options.length - 1);
136
+ let renderedLines = 0;
137
+ const render = () => {
138
+ if (renderedLines > 0) {
139
+ readline.moveCursor(output, 0, -renderedLines);
140
+ readline.cursorTo(output, 0);
141
+ readline.clearScreenDown(output);
142
+ }
143
+ const lines = [
144
+ `${prompt} ${logger_1.fmt.dim('(↑/↓ then Enter)')}`,
145
+ ...options.map((option, optionIndex) => {
146
+ const marker = optionIndex === index ? logger_1.fmt.cyan('❯') : ' ';
147
+ return `${marker} ${option}`;
148
+ }),
149
+ ];
150
+ output.write(lines.join('\n') + '\n');
151
+ renderedLines = lines.length;
152
+ };
153
+ return await new Promise((resolve, reject) => {
154
+ const previousRawMode = input.isRaw === true;
155
+ const cleanup = () => {
156
+ input.off('keypress', onKeypress);
157
+ if (typeof input.setRawMode === 'function') {
158
+ input.setRawMode(previousRawMode);
159
+ }
160
+ input.pause();
161
+ readline.cursorTo(output, 0);
162
+ readline.clearScreenDown(output);
163
+ output.write(`${prompt} ${logger_1.fmt.cyan(options[index])}\n`);
164
+ };
165
+ const onKeypress = (_str, key) => {
166
+ if (key.name === 'up') {
167
+ index = index > 0 ? index - 1 : options.length - 1;
168
+ render();
169
+ return;
170
+ }
171
+ if (key.name === 'down') {
172
+ index = index < options.length - 1 ? index + 1 : 0;
173
+ render();
174
+ return;
175
+ }
176
+ if (key.name === 'return' || key.name === 'enter') {
177
+ cleanup();
178
+ resolve(options[index]);
179
+ return;
180
+ }
181
+ if (key.ctrl && key.name === 'c') {
182
+ cleanup();
183
+ reject(new Error('Cancelled by user'));
184
+ }
185
+ };
186
+ readline.emitKeypressEvents(input);
187
+ if (typeof input.setRawMode === 'function') {
188
+ input.setRawMode(true);
189
+ }
190
+ input.resume();
191
+ input.on('keypress', onKeypress);
192
+ render();
193
+ });
194
+ }
195
+ function isInteractiveTty() {
196
+ return process.stdin.isTTY === true && process.stdout.isTTY === true;
197
+ }
198
+ function parseExcludeList(input) {
199
+ return input
200
+ .split(',')
201
+ .map((part) => part.trim())
202
+ .filter((part) => part.length > 0);
203
+ }
204
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `aspectcode` settings commands.
3
+ */
4
+ import type { CommandContext, CommandResult } from '../cli';
5
+ import type { Logger } from '../logger';
6
+ export declare function printAspectCodeBanner(log: Logger): void;
7
+ export declare function runShowConfig(ctx: CommandContext): Promise<CommandResult>;
8
+ export declare function runSetUpdateRate(ctx: CommandContext, value: string): Promise<CommandResult>;
9
+ export declare function runSetOutDir(ctx: CommandContext, value: string): Promise<CommandResult>;
10
+ export declare function runClearOutDir(ctx: CommandContext): Promise<CommandResult>;
11
+ export declare function runAddExclude(ctx: CommandContext, value: string): Promise<CommandResult>;
12
+ export declare function runRemoveExclude(ctx: CommandContext, value: string): Promise<CommandResult>;
13
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAY,cAAc,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAGtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAkBxC,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAcvD;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,aAAa,CAAC,CAsBxB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC,CAexB;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC,CASxB;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,aAAa,CAAC,CAIxB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC,CAcxB"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * `aspectcode` settings commands.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.printAspectCodeBanner = printAspectCodeBanner;
7
+ exports.runShowConfig = runShowConfig;
8
+ exports.runSetUpdateRate = runSetUpdateRate;
9
+ exports.runSetOutDir = runSetOutDir;
10
+ exports.runClearOutDir = runClearOutDir;
11
+ exports.runAddExclude = runAddExclude;
12
+ exports.runRemoveExclude = runRemoveExclude;
13
+ const cli_1 = require("../cli");
14
+ const config_1 = require("../config");
15
+ const logger_1 = require("../logger");
16
+ function printAspectCodeBanner(log) {
17
+ const lines = [
18
+ ' ___ ____ ____ _____ ____ _____ ____ ___ ____ _____',
19
+ ' / _ \\ / ___|| _ \\| ____/ ___|_ _| / ___/ _ \\| _ \\| ____|',
20
+ '| | | |\\___ \\| |_) | _|| | | | | | | | | | | | | _|',
21
+ '| |_| | ___) | __/| |__| |___ | | | |__| |_| | |_| | |___',
22
+ ' \\___/ |____/|_| |_____\\____| |_| \\____\\___/|____/|_____|',
23
+ ' ASPECT CODE',
24
+ ];
25
+ for (const line of lines) {
26
+ log.info(logger_1.fmt.blue(line));
27
+ }
28
+ log.blank();
29
+ }
30
+ async function runShowConfig(ctx) {
31
+ const { root, flags, log } = ctx;
32
+ const command = 'show-config';
33
+ try {
34
+ const current = (0, config_1.loadRawConfig)(root) ?? {};
35
+ const displayConfig = withCanonicalUpdateRate(current);
36
+ if (flags.json) {
37
+ emitJson({
38
+ ok: true,
39
+ command,
40
+ config: displayConfig,
41
+ });
42
+ }
43
+ else {
44
+ log.info(JSON.stringify(displayConfig, null, 2));
45
+ }
46
+ return { exitCode: cli_1.ExitCode.OK };
47
+ }
48
+ catch (error) {
49
+ return outputError(command, flags, log, error);
50
+ }
51
+ }
52
+ async function runSetUpdateRate(ctx, value) {
53
+ const parsed = parseUpdateRate(value);
54
+ if (!parsed) {
55
+ return outputUsageError('set-update-rate', ctx.flags, ctx.log, `Invalid update rate: ${logger_1.fmt.bold(value)}. Expected manual|onChange|idle.`);
56
+ }
57
+ return runSettingsMutation(ctx, 'set-update-rate', ['updateRate', 'autoRegenerateKb'], (cfg) => {
58
+ cfg.updateRate = parsed;
59
+ delete cfg.autoRegenerateKb;
60
+ });
61
+ }
62
+ async function runSetOutDir(ctx, value) {
63
+ const outDir = value.trim();
64
+ if (!outDir) {
65
+ return outputUsageError('set-out-dir', ctx.flags, ctx.log, `${logger_1.fmt.bold('set-out-dir')} requires a non-empty path value.`);
66
+ }
67
+ return runSettingsMutation(ctx, 'set-out-dir', ['outDir'], (cfg) => {
68
+ cfg.outDir = outDir;
69
+ });
70
+ }
71
+ async function runClearOutDir(ctx) {
72
+ return runSettingsMutation(ctx, 'clear-out-dir', ['outDir'], (cfg) => {
73
+ delete cfg.outDir;
74
+ });
75
+ }
76
+ async function runAddExclude(ctx, value) {
77
+ const excludePath = value.trim();
78
+ if (!excludePath) {
79
+ return outputUsageError('add-exclude', ctx.flags, ctx.log, `${logger_1.fmt.bold('add-exclude')} requires a non-empty path value.`);
80
+ }
81
+ return runSettingsMutation(ctx, 'add-exclude', ['exclude'], (cfg) => {
82
+ const list = normalizeExcludeList(cfg.exclude);
83
+ if (!list.includes(excludePath)) {
84
+ list.push(excludePath);
85
+ }
86
+ cfg.exclude = list;
87
+ });
88
+ }
89
+ async function runRemoveExclude(ctx, value) {
90
+ const excludePath = value.trim();
91
+ if (!excludePath) {
92
+ return outputUsageError('remove-exclude', ctx.flags, ctx.log, `${logger_1.fmt.bold('remove-exclude')} requires a non-empty path value.`);
93
+ }
94
+ return runSettingsMutation(ctx, 'remove-exclude', ['exclude'], (cfg) => {
95
+ const list = normalizeExcludeList(cfg.exclude).filter((entry) => entry !== excludePath);
96
+ if (list.length > 0) {
97
+ cfg.exclude = list;
98
+ }
99
+ else {
100
+ delete cfg.exclude;
101
+ }
102
+ });
103
+ }
104
+ // ── Shared mutation runner ───────────────────────────────────
105
+ /**
106
+ * Generic helper for settings mutation commands.
107
+ *
108
+ * Encapsulates the try/catch + load → mutate → save → output pattern
109
+ * shared by all mutation commands.
110
+ */
111
+ function runSettingsMutation(ctx, command, changed, mutate) {
112
+ const { root, flags, log } = ctx;
113
+ try {
114
+ const nextConfig = updateRawConfig(root, mutate);
115
+ return outputSuccess(command, flags, log, nextConfig, changed);
116
+ }
117
+ catch (error) {
118
+ return outputError(command, flags, log, error);
119
+ }
120
+ }
121
+ function updateRawConfig(root, apply) {
122
+ const nextConfig = { ...((0, config_1.loadRawConfig)(root) ?? {}) };
123
+ apply(nextConfig);
124
+ (0, config_1.saveRawConfig)(root, nextConfig);
125
+ return nextConfig;
126
+ }
127
+ function withCanonicalUpdateRate(config) {
128
+ if (config.updateRate || !config.autoRegenerateKb) {
129
+ return { ...config };
130
+ }
131
+ let mapped;
132
+ if (config.autoRegenerateKb === 'off') {
133
+ mapped = 'manual';
134
+ }
135
+ else if (config.autoRegenerateKb === 'onSave') {
136
+ mapped = 'onChange';
137
+ }
138
+ else if (config.autoRegenerateKb === 'idle') {
139
+ mapped = 'idle';
140
+ }
141
+ if (!mapped) {
142
+ return { ...config };
143
+ }
144
+ return {
145
+ ...config,
146
+ updateRate: mapped,
147
+ };
148
+ }
149
+ function parseUpdateRate(value) {
150
+ const normalized = value.trim();
151
+ if (normalized === 'manual' || normalized === 'onChange' || normalized === 'idle') {
152
+ return normalized;
153
+ }
154
+ return undefined;
155
+ }
156
+ function normalizeExcludeList(value) {
157
+ if (!Array.isArray(value)) {
158
+ return [];
159
+ }
160
+ return value.filter((item) => typeof item === 'string');
161
+ }
162
+ function outputSuccess(command, flags, log, config, changed) {
163
+ if (flags.json) {
164
+ const payload = { ok: true, command, config, changed };
165
+ emitJson(payload);
166
+ }
167
+ else {
168
+ log.success(`Updated ${logger_1.fmt.cyan('aspectcode.json')} via ${logger_1.fmt.bold(command)}.`);
169
+ }
170
+ return { exitCode: cli_1.ExitCode.OK };
171
+ }
172
+ function outputUsageError(command, flags, log, message) {
173
+ if (flags.json) {
174
+ const payload = { ok: false, command, error: message };
175
+ emitJson(payload);
176
+ }
177
+ else {
178
+ log.error(message);
179
+ }
180
+ return { exitCode: cli_1.ExitCode.USAGE };
181
+ }
182
+ function outputError(command, flags, log, error) {
183
+ const message = error instanceof Error ? error.message : String(error);
184
+ if (flags.json) {
185
+ const payload = { ok: false, command, error: message };
186
+ emitJson(payload);
187
+ }
188
+ else {
189
+ log.error(message);
190
+ }
191
+ return { exitCode: cli_1.ExitCode.ERROR };
192
+ }
193
+ function emitJson(payload) {
194
+ console.log(JSON.stringify(payload, null, 2));
195
+ }
196
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CliFlags, CommandContext, CommandResult } from '../cli';
2
+ import type { AspectCodeConfig } from '../config';
3
+ export type WatchMode = 'manual' | 'onChange' | 'idle';
4
+ export declare function resolveWatchMode(flags: CliFlags, config: AspectCodeConfig | undefined): WatchMode;
5
+ export declare function runWatch(ctx: CommandContext): Promise<CommandResult>;
6
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIlD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAuBvD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,SAAS,CAEX;AAYD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA2H1E"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.resolveWatchMode = resolveWatchMode;
37
+ exports.runWatch = runWatch;
38
+ const path = __importStar(require("path"));
39
+ const core_1 = require("@aspectcode/core");
40
+ const cli_1 = require("../cli");
41
+ const logger_1 = require("../logger");
42
+ const generate_1 = require("./generate");
43
+ const ON_CHANGE_DEBOUNCE_MS = 2000;
44
+ const IDLE_DEBOUNCE_MS = 30000;
45
+ const IGNORED_SEGMENTS = [
46
+ '/node_modules/',
47
+ '/.git/',
48
+ '/.aspect/',
49
+ '/dist/',
50
+ '/build/',
51
+ '/target/',
52
+ '/coverage/',
53
+ '/.next/',
54
+ '/__pycache__/',
55
+ '/.venv/',
56
+ '/venv/',
57
+ '/.pytest_cache/',
58
+ '/.mypy_cache/',
59
+ '/.tox/',
60
+ '/htmlcov/',
61
+ ];
62
+ function resolveWatchMode(flags, config) {
63
+ return flags.mode ?? config?.updateRate ?? 'onChange';
64
+ }
65
+ function isSupportedSourceFile(filePath) {
66
+ const ext = path.extname(filePath).toLowerCase();
67
+ return core_1.SUPPORTED_EXTENSIONS.includes(ext);
68
+ }
69
+ function isIgnoredPath(filePath) {
70
+ const normalized = filePath.replace(/\\/g, '/').toLowerCase();
71
+ return IGNORED_SEGMENTS.some((seg) => normalized.includes(seg));
72
+ }
73
+ async function runWatch(ctx) {
74
+ const { root, flags, config, log } = ctx;
75
+ const chokidarModule = await Promise.resolve().then(() => __importStar(require('chokidar')));
76
+ // Handle both ESM default export and CJS module shapes
77
+ const chokidar = chokidarModule.default ?? chokidarModule;
78
+ const mode = resolveWatchMode(flags, config);
79
+ const exts = core_1.SUPPORTED_EXTENSIONS.map((ext) => ext.slice(1)).join(',');
80
+ log.info(`Workspace: ${logger_1.fmt.cyan(root)}`);
81
+ log.info(`Mode: ${logger_1.fmt.cyan(mode)}`);
82
+ log.info(`Watching: ${logger_1.fmt.dim(`**/*.{${exts}}`)}`);
83
+ log.info(logger_1.fmt.dim('No initial run. Waiting for file changes...'));
84
+ log.blank();
85
+ const watcher = chokidar.watch('.', {
86
+ cwd: root,
87
+ ignoreInitial: true,
88
+ awaitWriteFinish: {
89
+ stabilityThreshold: 200,
90
+ pollInterval: 100,
91
+ },
92
+ ignored: (watchedPath) => {
93
+ const abs = path.resolve(root, watchedPath);
94
+ return isIgnoredPath(abs);
95
+ },
96
+ });
97
+ let timer;
98
+ let running = false;
99
+ let pending = false;
100
+ let stopped = false;
101
+ const triggerGenerate = async (reason) => {
102
+ if (stopped)
103
+ return;
104
+ if (running) {
105
+ pending = true;
106
+ log.debug(`[watch] generation already in progress; queued (${reason})`);
107
+ return;
108
+ }
109
+ running = true;
110
+ try {
111
+ log.info(`${logger_1.fmt.bold('watch')} trigger: ${reason}`);
112
+ await (0, generate_1.runGenerate)({ root, flags: { ...flags, listConnections: false, json: false }, config, log, positionals: [] });
113
+ }
114
+ catch (error) {
115
+ const msg = error instanceof Error ? error.message : String(error);
116
+ log.error(`watch regeneration failed: ${msg}`);
117
+ }
118
+ finally {
119
+ running = false;
120
+ if (pending && !stopped) {
121
+ pending = false;
122
+ void triggerGenerate('queued changes');
123
+ }
124
+ }
125
+ };
126
+ const scheduleOnChange = (reason) => {
127
+ if (mode === 'manual') {
128
+ log.debug(`[watch] change detected (${reason}) but mode=manual`);
129
+ return;
130
+ }
131
+ if (timer) {
132
+ clearTimeout(timer);
133
+ }
134
+ const delay = mode === 'idle' ? IDLE_DEBOUNCE_MS : ON_CHANGE_DEBOUNCE_MS;
135
+ timer = setTimeout(() => {
136
+ timer = undefined;
137
+ void triggerGenerate(reason);
138
+ }, delay);
139
+ };
140
+ const onFsEvent = (eventType, eventPath) => {
141
+ const abs = path.resolve(root, eventPath);
142
+ if (!isSupportedSourceFile(abs) || isIgnoredPath(abs)) {
143
+ return;
144
+ }
145
+ scheduleOnChange(`${eventType}: ${eventPath.replace(/\\/g, '/')}`);
146
+ };
147
+ watcher.on('add', (p) => onFsEvent('add', p));
148
+ watcher.on('change', (p) => onFsEvent('change', p));
149
+ watcher.on('unlink', (p) => onFsEvent('unlink', p));
150
+ watcher.on('error', (e) => {
151
+ log.error(`watcher error: ${String(e)}`);
152
+ });
153
+ await new Promise((resolve) => {
154
+ watcher.once('ready', () => resolve());
155
+ });
156
+ log.info(logger_1.fmt.dim('Watcher ready.'));
157
+ return await new Promise((resolve) => {
158
+ const shutdown = async (signal) => {
159
+ if (stopped)
160
+ return;
161
+ stopped = true;
162
+ if (timer) {
163
+ clearTimeout(timer);
164
+ timer = undefined;
165
+ }
166
+ log.blank();
167
+ log.info(logger_1.fmt.dim(`Stopping watch (${signal})...`));
168
+ await watcher.close();
169
+ resolve({ exitCode: cli_1.ExitCode.OK });
170
+ };
171
+ const onSigInt = () => {
172
+ void shutdown('SIGINT');
173
+ };
174
+ const onSigTerm = () => {
175
+ void shutdown('SIGTERM');
176
+ };
177
+ process.once('SIGINT', onSigInt);
178
+ process.once('SIGTERM', onSigTerm);
179
+ });
180
+ }
181
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}