@paparats/cli 0.3.2 → 0.5.1

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 (46) hide show
  1. package/dist/commands/edit.d.ts +30 -0
  2. package/dist/commands/edit.d.ts.map +1 -0
  3. package/dist/commands/edit.js +131 -0
  4. package/dist/commands/edit.js.map +1 -0
  5. package/dist/commands/groups.d.ts.map +1 -1
  6. package/dist/commands/groups.js +1 -1
  7. package/dist/commands/groups.js.map +1 -1
  8. package/dist/commands/install.d.ts +64 -21
  9. package/dist/commands/install.d.ts.map +1 -1
  10. package/dist/commands/install.js +337 -294
  11. package/dist/commands/install.js.map +1 -1
  12. package/dist/commands/lifecycle.d.ts +17 -0
  13. package/dist/commands/lifecycle.d.ts.map +1 -0
  14. package/dist/commands/lifecycle.js +86 -0
  15. package/dist/commands/lifecycle.js.map +1 -0
  16. package/dist/commands/projects.d.ts +81 -0
  17. package/dist/commands/projects.d.ts.map +1 -0
  18. package/dist/commands/projects.js +341 -0
  19. package/dist/commands/projects.js.map +1 -0
  20. package/dist/docker-compose-generator.d.ts +30 -24
  21. package/dist/docker-compose-generator.d.ts.map +1 -1
  22. package/dist/docker-compose-generator.js +58 -81
  23. package/dist/docker-compose-generator.js.map +1 -1
  24. package/dist/index.js +10 -6
  25. package/dist/index.js.map +1 -1
  26. package/dist/projects-yml.d.ts +130 -0
  27. package/dist/projects-yml.d.ts.map +1 -0
  28. package/dist/projects-yml.js +261 -0
  29. package/dist/projects-yml.js.map +1 -0
  30. package/package.json +2 -2
  31. package/dist/commands/index-cmd.d.ts +0 -75
  32. package/dist/commands/index-cmd.d.ts.map +0 -1
  33. package/dist/commands/index-cmd.js +0 -240
  34. package/dist/commands/index-cmd.js.map +0 -1
  35. package/dist/commands/init.d.ts +0 -28
  36. package/dist/commands/init.d.ts.map +0 -1
  37. package/dist/commands/init.js +0 -316
  38. package/dist/commands/init.js.map +0 -1
  39. package/dist/commands/watch.d.ts +0 -33
  40. package/dist/commands/watch.d.ts.map +0 -1
  41. package/dist/commands/watch.js +0 -358
  42. package/dist/commands/watch.js.map +0 -1
  43. package/dist/lsp-installers.d.ts +0 -28
  44. package/dist/lsp-installers.d.ts.map +0 -1
  45. package/dist/lsp-installers.js +0 -125
  46. package/dist/lsp-installers.js.map +0 -1
@@ -1,358 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { Command } from 'commander';
4
- import chalk from 'chalk';
5
- import pLimit from 'p-limit';
6
- import { watch } from 'chokidar';
7
- import { minimatch } from 'minimatch';
8
- import { globSync } from 'glob';
9
- import { readConfig, CONFIG_FILE, DEFAULT_EXCLUDE, getLanguageFromPath, normalizeExcludePatterns, } from '../config.js';
10
- import { createGitignoreFilter } from '@paparats/shared';
11
- import { ApiClient } from '../api-client.js';
12
- const CONCURRENT_REINDEX_LIMIT = 5;
13
- const MAX_RETRIES = 3;
14
- function formatUptime(seconds) {
15
- const h = Math.floor(seconds / 3600);
16
- const m = Math.floor((seconds % 3600) / 60);
17
- if (h > 0)
18
- return `${h}h ${m}m`;
19
- if (m > 0)
20
- return `${m}m`;
21
- return `${Math.round(seconds)}s`;
22
- }
23
- /** Run watch command. Returns async cleanup function to stop watcher and drain pending. */
24
- export async function runWatch(opts, deps) {
25
- const readCfg = deps?.readConfigFn ?? readConfig;
26
- const createWatch = deps?.createWatcher ?? watch;
27
- let config;
28
- try {
29
- config = readCfg();
30
- }
31
- catch (err) {
32
- throw new Error(err.message, { cause: err });
33
- }
34
- const { config: cfg, projectDir } = config;
35
- const projectName = path.basename(projectDir);
36
- const group = cfg.group;
37
- const client = deps?.apiClient ?? new ApiClient(opts.server ?? 'http://localhost:9876');
38
- const exclude = normalizeExcludePatterns(cfg.indexing?.exclude ?? DEFAULT_EXCLUDE);
39
- const respectGitignore = cfg.indexing?.respectGitignore ?? true;
40
- const gitignoreFilter = respectGitignore ? createGitignoreFilter(projectDir) : null;
41
- const indexPaths = cfg.indexing?.paths ?? ['./'];
42
- const watchPaths = indexPaths.map((p) => path.resolve(projectDir, p));
43
- const debounceMs = cfg.watcher?.debounce ?? 1000;
44
- const pending = new Map();
45
- const limit = pLimit(CONCURRENT_REINDEX_LIMIT);
46
- const stats = {
47
- filesWatched: 0,
48
- changesProcessed: 0,
49
- errors: 0,
50
- startTime: Date.now(),
51
- };
52
- function shouldIgnore(filePath) {
53
- const rel = path.relative(projectDir, filePath);
54
- if (exclude.some((pattern) => minimatch(rel, pattern, { dot: true })))
55
- return true;
56
- if (gitignoreFilter?.(filePath))
57
- return true;
58
- return false;
59
- }
60
- if (opts.dryRun) {
61
- console.log(chalk.bold('\nDry run - showing what would be watched:\n'));
62
- console.log(chalk.dim(` Project: ${projectName}`));
63
- console.log(chalk.dim(` Group: ${group}`));
64
- console.log(chalk.dim(` Paths: ${watchPaths.join(', ')}`));
65
- console.log(chalk.dim(` Exclude patterns:`));
66
- exclude.forEach((pattern) => {
67
- console.log(chalk.dim(` - ${pattern}`));
68
- });
69
- let totalFiles = 0;
70
- for (const watchPath of watchPaths) {
71
- const files = globSync('**/*', {
72
- cwd: watchPath,
73
- ignore: exclude,
74
- nodir: true,
75
- });
76
- const filtered = gitignoreFilter
77
- ? files.filter((f) => !gitignoreFilter(path.join(watchPath, f)))
78
- : files;
79
- totalFiles += filtered.length;
80
- }
81
- console.log(chalk.dim(`\n Total files: ${totalFiles}`));
82
- return async () => { };
83
- }
84
- // Validate server before starting
85
- if (!opts.json) {
86
- console.log(chalk.dim('Checking server connection...'));
87
- }
88
- try {
89
- const res = await client.health({ timeout: 5000 });
90
- if (res.status !== 200) {
91
- throw new Error('Server not healthy');
92
- }
93
- if (!opts.json) {
94
- console.log(chalk.green('✓ Server connected'));
95
- }
96
- }
97
- catch (err) {
98
- throw new Error(`Cannot connect to server at ${opts.server ?? 'http://localhost:9876'}\n` +
99
- `Make sure the server is running: docker compose up -d`, { cause: err });
100
- }
101
- function emitEvent(type, file, extra) {
102
- if (opts.json) {
103
- console.log(JSON.stringify({
104
- type,
105
- file: path.relative(projectDir, file),
106
- timestamp: new Date().toISOString(),
107
- ...extra,
108
- }));
109
- }
110
- }
111
- async function reindexWithRetry(filePath) {
112
- const rel = path.relative(projectDir, filePath);
113
- const start = opts.verbose ? Date.now() : 0;
114
- let content;
115
- try {
116
- const buffer = await fs.promises.readFile(filePath);
117
- if (buffer.includes(0))
118
- return; // Skip binary
119
- content = buffer.toString('utf8');
120
- if (content.includes('\uFFFD'))
121
- return; // Invalid UTF-8
122
- if (!content.trim())
123
- return; // Skip empty/whitespace-only files
124
- }
125
- catch (err) {
126
- if (opts.json) {
127
- emitEvent('error', filePath, { error: err.message });
128
- }
129
- else {
130
- console.error(chalk.red(` failed to read ${rel}: ${err.message}`));
131
- }
132
- stats.errors++;
133
- return;
134
- }
135
- const projectLangs = Array.isArray(cfg.language) ? cfg.language : [cfg.language];
136
- const language = getLanguageFromPath(filePath, projectLangs);
137
- for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
138
- try {
139
- await client.fileChanged(group, projectName, rel, content, { language });
140
- stats.changesProcessed++;
141
- const elapsed = opts.verbose ? Date.now() - start : 0;
142
- if (opts.json) {
143
- emitEvent('reindexed', filePath, { elapsed, attempt });
144
- }
145
- else {
146
- console.log(chalk.dim(opts.verbose ? ` reindexed: ${rel} (${elapsed}ms)` : ` reindexed: ${rel}`));
147
- }
148
- return;
149
- }
150
- catch (err) {
151
- if (attempt === MAX_RETRIES) {
152
- stats.errors++;
153
- if (opts.json) {
154
- emitEvent('error', filePath, { error: err.message, attempt });
155
- }
156
- else {
157
- console.error(chalk.red(` failed after ${MAX_RETRIES} attempts: ${rel}`));
158
- }
159
- }
160
- else if (opts.verbose && !opts.json) {
161
- console.log(chalk.yellow(` retry ${attempt}/${MAX_RETRIES}: ${rel}`));
162
- }
163
- await new Promise((r) => setTimeout(r, 1000 * attempt));
164
- }
165
- }
166
- }
167
- async function onFileDeleted(filePath) {
168
- if (shouldIgnore(filePath))
169
- return;
170
- const rel = path.relative(projectDir, filePath);
171
- try {
172
- await client.fileDeleted(group, projectName, rel);
173
- stats.changesProcessed++;
174
- if (opts.json) {
175
- emitEvent('removed', filePath);
176
- }
177
- else {
178
- console.log(chalk.dim(` removed: ${rel}`));
179
- }
180
- }
181
- catch (err) {
182
- stats.errors++;
183
- if (opts.json) {
184
- emitEvent('error', filePath, { error: err.message, action: 'remove' });
185
- }
186
- else {
187
- console.error(chalk.red(` failed to remove: ${rel} — ${err.message}`));
188
- }
189
- }
190
- }
191
- function onFileChange(filePath) {
192
- if (shouldIgnore(filePath))
193
- return;
194
- const existing = pending.get(filePath);
195
- if (existing)
196
- clearTimeout(existing);
197
- pending.set(filePath, setTimeout(async () => {
198
- pending.delete(filePath);
199
- await limit(async () => reindexWithRetry(filePath));
200
- }, debounceMs));
201
- }
202
- if (!opts.json) {
203
- console.log(chalk.bold(`\nWatching ${projectName} (group: ${group})\n`));
204
- console.log(chalk.dim(` Paths: ${watchPaths.join(', ')}`));
205
- console.log(chalk.dim(` Debounce: ${debounceMs}ms`));
206
- console.log(chalk.dim(` Press Ctrl+C to stop\n`));
207
- }
208
- const watcher = createWatch(watchPaths, {
209
- ignoreInitial: true,
210
- usePolling: opts.polling ?? false,
211
- awaitWriteFinish: {
212
- stabilityThreshold: cfg.watcher?.stabilityThreshold ?? 1000,
213
- },
214
- ignored: (pathToIgnore) => {
215
- try {
216
- const rel = path.relative(projectDir, pathToIgnore);
217
- if (rel.startsWith('..'))
218
- return false;
219
- if (exclude.some((pattern) => minimatch(rel, pattern, { dot: true })))
220
- return true;
221
- if (gitignoreFilter?.(pathToIgnore))
222
- return true;
223
- }
224
- catch {
225
- return false;
226
- }
227
- return false;
228
- },
229
- });
230
- watcher.on('error', (err) => {
231
- stats.errors++;
232
- const e = err;
233
- if (opts.json) {
234
- console.log(JSON.stringify({
235
- type: 'watcher_error',
236
- error: e.message,
237
- timestamp: new Date().toISOString(),
238
- }));
239
- }
240
- else {
241
- console.error(chalk.red(`Watcher error: ${e.message}`));
242
- if (e.message.includes('EMFILE') || e.message.includes('too many open files')) {
243
- console.error(chalk.dim(' Try: paparats watch --polling (uses fewer file descriptors)'));
244
- }
245
- if (opts.verbose && e.stack) {
246
- console.error(chalk.dim(e.stack));
247
- }
248
- }
249
- });
250
- watcher.on('ready', () => {
251
- const watched = watcher.getWatched();
252
- stats.filesWatched = Object.values(watched).reduce((sum, files) => sum + files.length, 0);
253
- if (!opts.json) {
254
- console.log(chalk.green(`✓ Watcher ready (${stats.filesWatched} paths)`));
255
- }
256
- });
257
- const configPath = path.join(projectDir, CONFIG_FILE);
258
- watcher.on('change', (p) => {
259
- if (p === configPath) {
260
- if (opts.json) {
261
- emitEvent('config_changed', configPath, { message: 'Restart watcher to apply' });
262
- }
263
- else {
264
- console.log(chalk.yellow('\nConfig file changed. Please restart watcher.'));
265
- }
266
- return;
267
- }
268
- onFileChange(p);
269
- });
270
- watcher.on('add', (p) => onFileChange(p));
271
- watcher.on('unlink', (p) => void limit(() => onFileDeleted(p)));
272
- watcher.on('addDir', (dirPath) => {
273
- if (shouldIgnore(dirPath))
274
- return;
275
- const rel = path.relative(projectDir, dirPath);
276
- if (opts.json) {
277
- emitEvent('addDir', dirPath);
278
- }
279
- else if (opts.verbose) {
280
- console.log(chalk.dim(` directory added: ${rel}`));
281
- }
282
- });
283
- watcher.on('unlinkDir', (dirPath) => {
284
- if (shouldIgnore(dirPath))
285
- return;
286
- const rel = path.relative(projectDir, dirPath);
287
- if (opts.json) {
288
- emitEvent('unlinkDir', dirPath);
289
- }
290
- else if (opts.verbose) {
291
- console.log(chalk.dim(` directory removed: ${rel}`));
292
- }
293
- });
294
- return async () => {
295
- watcher.close();
296
- if (pending.size > 0 && !opts.json) {
297
- console.log(chalk.dim(`Waiting for ${pending.size} pending changes...`));
298
- }
299
- if (pending.size > 0) {
300
- await new Promise((resolve) => {
301
- const check = setInterval(() => {
302
- if (pending.size === 0) {
303
- clearInterval(check);
304
- resolve();
305
- }
306
- }, 100);
307
- setTimeout(() => {
308
- clearInterval(check);
309
- resolve();
310
- }, 10_000);
311
- });
312
- }
313
- for (const timeout of pending.values()) {
314
- clearTimeout(timeout);
315
- }
316
- pending.clear();
317
- if (opts.json) {
318
- const uptime = Math.floor((Date.now() - stats.startTime) / 1000);
319
- console.log(JSON.stringify({
320
- type: 'stopped',
321
- changesProcessed: stats.changesProcessed,
322
- errors: stats.errors,
323
- uptimeSeconds: uptime,
324
- timestamp: new Date().toISOString(),
325
- }));
326
- }
327
- else if (stats.changesProcessed > 0 || stats.errors > 0) {
328
- const uptime = Math.floor((Date.now() - stats.startTime) / 1000);
329
- console.log(chalk.dim('\nStats:'));
330
- console.log(chalk.dim(` Changes processed: ${stats.changesProcessed}`));
331
- console.log(chalk.dim(` Errors: ${stats.errors}`));
332
- console.log(chalk.dim(` Uptime: ${formatUptime(uptime)}`));
333
- }
334
- };
335
- }
336
- export const watchCommand = new Command('watch')
337
- .description('Watch for file changes and reindex automatically')
338
- .option('--server <url>', 'MCP server URL', 'http://localhost:9876')
339
- .option('-v, --verbose', 'Show detailed output')
340
- .option('--dry-run', 'Show what would be watched without actually watching')
341
- .option('--json', 'Output events as JSON lines for piping')
342
- .option('--polling', 'Use polling instead of native watchers (fewer file descriptors; use if EMFILE occurs)')
343
- .action(async (opts) => {
344
- try {
345
- const cleanup = await runWatch(opts);
346
- process.on('SIGINT', async () => {
347
- console.log(chalk.dim('\nStopping watcher...'));
348
- await cleanup();
349
- console.log(chalk.green('✓ Watcher stopped'));
350
- process.exit(0);
351
- });
352
- }
353
- catch (err) {
354
- console.error(chalk.red(err.message));
355
- process.exit(1);
356
- }
357
- });
358
- //# sourceMappingURL=watch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EACL,UAAU,EACV,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAW7C,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAqBnC,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IAChC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC1B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AACnC,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAkB,EAAE,IAAgB;IACjE,MAAM,OAAO,GAAG,IAAI,EAAE,YAAY,IAAI,UAAU,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,EAAE,aAAa,IAAI,KAAK,CAAC;IAEjD,IAAI,MAAwF,CAAC;IAC7F,IAAI,CAAC;QACH,MAAM,GAAG,OAAO,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAE,GAAa,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,EAAE,SAAS,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,uBAAuB,CAAC,CAAC;IAExF,MAAM,OAAO,GAAG,wBAAwB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,eAAe,CAAC,CAAC;IACnF,MAAM,gBAAgB,GAAG,GAAG,CAAC,QAAQ,EAAE,gBAAgB,IAAI,IAAI,CAAC;IAChE,MAAM,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG;QACZ,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IAEF,SAAS,YAAY,CAAC,QAAgB;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACnF,IAAI,eAAe,EAAE,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE;gBAC7B,GAAG,EAAE,SAAS;gBACd,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe;gBAC9B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC,KAAK,CAAC;YACV,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IACxB,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,MAAM,IAAI,uBAAuB,IAAI;YACvE,uDAAuD,EACzD,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,KAA+B;QAC5E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,GAAG,KAAK;aACT,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,UAAU,gBAAgB,CAAC,QAAgB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,cAAc;YAC9C,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,gBAAgB;YACxD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBAAE,OAAO,CAAC,mCAAmC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACzE,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,SAAS,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,GAAG,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,gBAAgB,GAAG,EAAE,CAAC,CACvF,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC5B,KAAK,CAAC,MAAM,EAAE,CAAC;oBACf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACd,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC3E,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,WAAW,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC7E,CAAC;gBACH,CAAC;qBAAM,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,OAAO,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzE,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,QAAgB;QAC3C,IAAI,YAAY,CAAC,QAAQ,CAAC;YAAE,OAAO;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YAClD,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,YAAY,CAAC,QAAgB;QACpC,IAAI,YAAY,CAAC,QAAQ,CAAC;YAAE,OAAO;QAEnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,QAAQ;YAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;QAErC,OAAO,CAAC,GAAG,CACT,QAAQ,EACR,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,MAAM,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,CAAC,EAAE,UAAU,CAAC,CACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,UAAU,IAAI,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE;QACtC,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;QACjC,gBAAgB,EAAE;YAChB,kBAAkB,EAAE,GAAG,CAAC,OAAO,EAAE,kBAAkB,IAAI,IAAI;SAC5D;QACD,OAAO,EAAE,CAAC,YAAoB,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACpD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACvC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACnF,IAAI,eAAe,EAAE,CAAC,YAAY,CAAC;oBAAE,OAAO,IAAI,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAY,EAAE,EAAE;QACnC,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,GAAY,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,CAAC,CAAC,OAAO;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC9E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;YAC5F,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACvB,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QACrC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,YAAY,SAAS,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,gBAAgB,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO;QACT,CAAC;QACD,YAAY,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;QAC/B,IAAI,YAAY,CAAC,OAAO,CAAC;YAAE,OAAO;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,YAAY,CAAC,OAAO,CAAC;YAAE,OAAO;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,IAAI,EAAE;QAChB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;oBAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBACvB,aAAa,CAAC,KAAK,CAAC,CAAC;wBACrB,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,EAAE,GAAG,CAAC,CAAC;gBACR,UAAU,CAAC,GAAG,EAAE;oBACd,aAAa,CAAC,KAAK,CAAC,CAAC;oBACrB,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,MAAM,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,SAAS;gBACf,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,aAAa,EAAE,MAAM;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,CAAC;KACnE,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;KAC/C,MAAM,CAAC,WAAW,EAAE,sDAAsD,CAAC;KAC3E,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC;KAC1D,MAAM,CACL,WAAW,EACX,uFAAuF,CACxF;KACA,MAAM,CAAC,KAAK,EAAE,IAAkB,EAAE,EAAE;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAErC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAChD,MAAM,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1,28 +0,0 @@
1
- export interface LspConfig {
2
- extensions: string[];
3
- command: string[];
4
- installCmd: string;
5
- installCheck: string;
6
- displayName: string;
7
- }
8
- export declare const LSP_CONFIGS: Record<string, LspConfig>;
9
- export interface LspInstallerDeps {
10
- commandExists?: (cmd: string) => boolean;
11
- execInstall?: (cmd: string) => void;
12
- }
13
- export declare function checkLspInstalled(language: string, deps?: LspInstallerDeps): boolean;
14
- export declare function installLspServer(language: string, deps?: LspInstallerDeps): void;
15
- /** Server config per cclsp spec: https://github.com/ktnyt/cclsp/blob/main/README.md */
16
- export interface CclspServerConfig {
17
- extensions: string[];
18
- command: string[];
19
- rootDir?: string;
20
- }
21
- export interface CclspConfig {
22
- servers: CclspServerConfig[];
23
- }
24
- export declare function buildCclspConfig(languages: string[]): CclspConfig;
25
- /** Relative path for CCLSP_CONFIG_PATH — portable, safe for git. */
26
- export declare const CCLSP_CONFIG_RELATIVE = "./cclsp.json";
27
- export declare function getCclspConfigPath(projectDir: string): string;
28
- //# sourceMappingURL=lsp-installers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lsp-installers.d.ts","sourceRoot":"","sources":["../src/lsp-installers.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAgEjD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAYD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAKpF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAQhF;AAED,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,WAAW,CA4BjE;AAED,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AAEpD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D"}
@@ -1,125 +0,0 @@
1
- import { execSync } from 'child_process';
2
- import path from 'path';
3
- export const LSP_CONFIGS = {
4
- typescript: {
5
- extensions: ['ts', 'tsx', 'js', 'jsx'],
6
- command: ['typescript-language-server', '--stdio'],
7
- installCmd: 'npm install -g typescript-language-server typescript',
8
- installCheck: 'typescript-language-server',
9
- displayName: 'TypeScript Language Server',
10
- },
11
- javascript: {
12
- extensions: ['js', 'jsx', 'mjs', 'cjs'],
13
- command: ['typescript-language-server', '--stdio'],
14
- installCmd: 'npm install -g typescript-language-server typescript',
15
- installCheck: 'typescript-language-server',
16
- displayName: 'TypeScript Language Server',
17
- },
18
- python: {
19
- extensions: ['py'],
20
- command: ['pylsp'],
21
- installCmd: 'pip install python-lsp-server',
22
- installCheck: 'pylsp',
23
- displayName: 'Python LSP Server (pylsp)',
24
- },
25
- go: {
26
- extensions: ['go'],
27
- command: ['gopls'],
28
- installCmd: 'go install golang.org/x/tools/gopls@latest',
29
- installCheck: 'gopls',
30
- displayName: 'gopls',
31
- },
32
- rust: {
33
- extensions: ['rs'],
34
- command: ['rust-analyzer'],
35
- installCmd: 'rustup component add rust-analyzer',
36
- installCheck: 'rust-analyzer',
37
- displayName: 'rust-analyzer',
38
- },
39
- java: {
40
- extensions: ['java'],
41
- command: ['jdtls'],
42
- installCmd: 'npm install -g java-language-server',
43
- installCheck: 'jdtls',
44
- displayName: 'Eclipse JDT Language Server',
45
- },
46
- ruby: {
47
- extensions: ['rb', 'rake', 'rbs'],
48
- command: ['solargraph', 'stdio'],
49
- installCmd: 'gem install solargraph',
50
- installCheck: 'solargraph',
51
- displayName: 'Solargraph',
52
- },
53
- csharp: {
54
- extensions: ['cs'],
55
- command: ['omnisharp'],
56
- installCmd: 'dotnet tool install -g omnisharp',
57
- installCheck: 'omnisharp',
58
- displayName: 'OmniSharp',
59
- },
60
- cclsp: {
61
- extensions: [],
62
- command: ['cclsp'],
63
- installCmd: 'npm install -g cclsp',
64
- installCheck: 'cclsp',
65
- displayName: 'cclsp',
66
- },
67
- };
68
- function defaultCommandExists(cmd) {
69
- try {
70
- const command = process.platform === 'win32' ? `where ${cmd}` : `command -v ${cmd}`;
71
- execSync(command, { stdio: 'ignore', timeout: 3000 });
72
- return true;
73
- }
74
- catch {
75
- return false;
76
- }
77
- }
78
- export function checkLspInstalled(language, deps) {
79
- const config = LSP_CONFIGS[language];
80
- if (!config)
81
- return false;
82
- const cmdExists = deps?.commandExists ?? defaultCommandExists;
83
- return cmdExists(config.installCheck);
84
- }
85
- export function installLspServer(language, deps) {
86
- const config = LSP_CONFIGS[language];
87
- if (!config) {
88
- throw new Error(`No LSP config for language: ${language}`);
89
- }
90
- const exec = deps?.execInstall ?? ((cmd) => execSync(cmd, { stdio: 'inherit', timeout: 120_000 }));
91
- exec(config.installCmd);
92
- }
93
- export function buildCclspConfig(languages) {
94
- const servers = [];
95
- const seenCommandKey = new Set();
96
- for (const lang of languages) {
97
- const config = LSP_CONFIGS[lang];
98
- if (!config)
99
- continue;
100
- const cmdKey = config.command.join(' ');
101
- if (seenCommandKey.has(cmdKey)) {
102
- const existing = servers.find((s) => s.command.join(' ') === cmdKey);
103
- if (existing) {
104
- for (const ext of config.extensions) {
105
- if (!existing.extensions.includes(ext))
106
- existing.extensions.push(ext);
107
- }
108
- }
109
- continue;
110
- }
111
- seenCommandKey.add(cmdKey);
112
- servers.push({
113
- extensions: [...config.extensions],
114
- command: config.command,
115
- rootDir: '.',
116
- });
117
- }
118
- return { servers };
119
- }
120
- /** Relative path for CCLSP_CONFIG_PATH — portable, safe for git. */
121
- export const CCLSP_CONFIG_RELATIVE = './cclsp.json';
122
- export function getCclspConfigPath(projectDir) {
123
- return path.join(projectDir, 'cclsp.json');
124
- }
125
- //# sourceMappingURL=lsp-installers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lsp-installers.js","sourceRoot":"","sources":["../src/lsp-installers.ts"],"names":[],"mappings":"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"}