mcp-code-context 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.io/RULES.md +12 -0
- package/CHANGELOG.md +114 -1
- package/README.md +28 -1
- package/dist/src/ast/writers/safeRename.d.ts +14 -0
- package/dist/src/ast/writers/safeRename.js +258 -0
- package/dist/src/ast/writers/safeRename.js.map +1 -0
- package/dist/src/ast/writers/symbolWriter.d.ts +2 -0
- package/dist/src/ast/writers/symbolWriter.js +9 -14
- package/dist/src/ast/writers/symbolWriter.js.map +1 -1
- package/dist/src/cache/astCache.d.ts +33 -0
- package/dist/src/cache/astCache.js +113 -0
- package/dist/src/cache/astCache.js.map +1 -0
- package/dist/src/handlers/readHandlers.d.ts +70 -0
- package/dist/src/handlers/readHandlers.js +431 -0
- package/dist/src/handlers/readHandlers.js.map +1 -0
- package/dist/src/handlers/utilHandlers.d.ts +31 -0
- package/dist/src/handlers/utilHandlers.js +69 -0
- package/dist/src/handlers/utilHandlers.js.map +1 -0
- package/dist/src/handlers/writeHandlers.d.ts +57 -0
- package/dist/src/handlers/writeHandlers.js +475 -0
- package/dist/src/handlers/writeHandlers.js.map +1 -0
- package/dist/src/index.d.ts +6 -143
- package/dist/src/index.js +77 -1091
- package/dist/src/index.js.map +1 -1
- package/dist/src/tools/searchCodePattern.d.ts +7 -2
- package/dist/src/tools/searchCodePattern.js +68 -4
- package/dist/src/tools/searchCodePattern.js.map +1 -1
- package/dist/src/utils/arrayUtils.d.ts +12 -0
- package/dist/src/utils/arrayUtils.js +27 -0
- package/dist/src/utils/arrayUtils.js.map +1 -0
- package/dist/src/utils/constants.d.ts +46 -0
- package/dist/src/utils/constants.js +112 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/ignoreManager.d.ts +8 -0
- package/dist/src/utils/ignoreManager.js +49 -0
- package/dist/src/utils/ignoreManager.js.map +1 -1
- package/dist/src/utils/normalization.d.ts +49 -0
- package/dist/src/utils/normalization.js +173 -0
- package/dist/src/utils/normalization.js.map +1 -0
- package/dist/src/utils/projectRoot.d.ts +12 -5
- package/dist/src/utils/projectRoot.js +22 -20
- package/dist/src/utils/projectRoot.js.map +1 -1
- package/dist/src/utils/secureValidation.d.ts +15 -0
- package/dist/src/utils/secureValidation.js +41 -0
- package/dist/src/utils/secureValidation.js.map +1 -0
- package/dist/src/utils/transactionManager.d.ts +45 -0
- package/dist/src/utils/transactionManager.js +102 -0
- package/dist/src/utils/transactionManager.js.map +1 -0
- package/dist/src/utils/validation.d.ts +87 -0
- package/dist/src/utils/validation.js +231 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/docs/ARCHITECTURE.md +300 -0
- package/docs/architecture/ADR-001-modular-handlers.md +119 -0
- package/llms.txt +10 -1
- package/package.json +5 -5
- package/AGENT_INSTRUCTIONS.md +0 -135
- package/DEPLOYMENT_INSTRUCTIONS.md +0 -110
- package/MEJORAS_PROPUESTAS.md +0 -324
- package/RELEASE_NOTES_v2.1.3.md +0 -78
- package/RELEASE_NOTES_v2.2.0.md +0 -286
- package/dist/src/tests/test-confirmation-flow.d.ts +0 -1
- package/dist/src/tests/test-confirmation-flow.js +0 -43
- package/dist/src/tests/test-confirmation-flow.js.map +0 -1
- package/dist/tests/debug-replace.d.ts +0 -1
- package/dist/tests/debug-replace.js +0 -17
- package/dist/tests/debug-replace.js.map +0 -1
- package/dist/tests/test-backup-system.d.ts +0 -7
- package/dist/tests/test-backup-system.js +0 -152
- package/dist/tests/test-backup-system.js.map +0 -1
- package/dist/tests/test-confirmation-flow.d.ts +0 -1
- package/dist/tests/test-confirmation-flow.js +0 -43
- package/dist/tests/test-confirmation-flow.js.map +0 -1
- package/dist/tests/test-dart.d.ts +0 -1
- package/dist/tests/test-dart.js +0 -242
- package/dist/tests/test-dart.js.map +0 -1
- package/dist/tests/test-new-tools.d.ts +0 -4
- package/dist/tests/test-new-tools.js +0 -147
- package/dist/tests/test-new-tools.js.map +0 -1
- package/dist/tests/test-php-ast.d.ts +0 -1
- package/dist/tests/test-php-ast.js +0 -152
- package/dist/tests/test-php-ast.js.map +0 -1
- package/dist/tests/test-php.d.ts +0 -1
- package/dist/tests/test-php.js +0 -234
- package/dist/tests/test-php.js.map +0 -1
- package/dist/tests/test-smoke.d.ts +0 -5
- package/dist/tests/test-smoke.js +0 -83
- package/dist/tests/test-smoke.js.map +0 -1
- package/dist/tests/writers/test-crlf-handling.d.ts +0 -4
- package/dist/tests/writers/test-crlf-handling.js +0 -73
- package/dist/tests/writers/test-crlf-handling.js.map +0 -1
- package/dist/tests/writers/test-write-smoke.d.ts +0 -9
- package/dist/tests/writers/test-write-smoke.js +0 -346
- package/dist/tests/writers/test-write-smoke.js.map +0 -1
- package/src/ast/dartCompressor.ts +0 -1013
- package/src/ast/phpCompressor.ts +0 -814
- package/src/ast/semanticCompressor.ts +0 -808
- package/src/ast/writers/dartWriter.ts +0 -648
- package/src/ast/writers/phpWriter.ts +0 -508
- package/src/ast/writers/pyWriter.ts +0 -446
- package/src/ast/writers/symbolWriter.ts +0 -277
- package/src/ast/writers/tsWriter.ts +0 -418
- package/src/index.ts +0 -1784
- package/src/tools/readFileLines.ts +0 -104
- package/src/tools/searchCodePattern.ts +0 -129
- package/src/utils/backupManager.ts +0 -141
- package/src/utils/confirmationCache.ts +0 -61
- package/src/utils/diffEngine.ts +0 -223
- package/src/utils/fuzzyMatch.ts +0 -86
- package/src/utils/ignoreManager.ts +0 -144
- package/src/utils/projectRoot.ts +0 -44
- package/tests/test-backup-system.ts +0 -174
- package/tests/test-confirmation-flow.ts +0 -49
- package/tests/test-dart.d.ts +0 -1
- package/tests/test-dart.js +0 -209
- package/tests/test-dart.js.map +0 -1
- package/tests/test-dart.ts +0 -265
- package/tests/test-new-tools.ts +0 -165
- package/tests/test-php-ast.d.ts +0 -1
- package/tests/test-php-ast.js +0 -152
- package/tests/test-php-ast.js.map +0 -1
- package/tests/test-php-ast.ts +0 -155
- package/tests/test-php.d.ts +0 -1
- package/tests/test-php.js +0 -234
- package/tests/test-php.js.map +0 -1
- package/tests/test-php.ts +0 -261
- package/tests/test-smoke.d.ts +0 -5
- package/tests/test-smoke.js +0 -83
- package/tests/test-smoke.js.map +0 -1
- package/tests/test-smoke.ts +0 -93
- package/tests/writers/test-crlf-handling.ts +0 -100
- package/tests/writers/test-write-smoke.ts +0 -568
- package/tsconfig.json +0 -19
package/RELEASE_NOTES_v2.2.0.md
DELETED
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
# 🚀 Release v2.2.0 - Centralized Backup System + New Read Tools
|
|
2
|
-
|
|
3
|
-
**Release Date:** April 22, 2026
|
|
4
|
-
**Type:** Minor Release (New Features + Improvements)
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 🎯 What's New
|
|
9
|
-
|
|
10
|
-
### 1. 📖 **New Read Tools** (Token Efficiency Champions)
|
|
11
|
-
|
|
12
|
-
#### `read_file_lines` - Surgical Line Reading
|
|
13
|
-
Read specific line ranges or search around patterns without loading entire files.
|
|
14
|
-
|
|
15
|
-
**Use Cases:**
|
|
16
|
-
- Debug specific code blocks
|
|
17
|
-
- View error context from stack traces
|
|
18
|
-
- Inspect method implementations without full file overhead
|
|
19
|
-
|
|
20
|
-
**Token Savings:** ~90% compared to reading full files
|
|
21
|
-
|
|
22
|
-
**Examples:**
|
|
23
|
-
```typescript
|
|
24
|
-
// Read exact range
|
|
25
|
-
read_file_lines({
|
|
26
|
-
filePath: "/project/src/utils.ts",
|
|
27
|
-
startLine: 120,
|
|
28
|
-
endLine: 135
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
// Search around pattern
|
|
32
|
-
read_file_lines({
|
|
33
|
-
filePath: "/project/src/service.ts",
|
|
34
|
-
aroundPattern: "calculateTotal",
|
|
35
|
-
contextLines: 5
|
|
36
|
-
})
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
#### `search_code_pattern` - Repository-Wide Pattern Search
|
|
40
|
-
Find patterns across your codebase with context, respecting `.gitignore`.
|
|
41
|
-
|
|
42
|
-
**Use Cases:**
|
|
43
|
-
- Find all usages of a function
|
|
44
|
-
- Locate TODO comments
|
|
45
|
-
- Search for specific patterns with context
|
|
46
|
-
|
|
47
|
-
**Token Savings:** ~85% compared to manual grep workflows
|
|
48
|
-
|
|
49
|
-
**Examples:**
|
|
50
|
-
```typescript
|
|
51
|
-
search_code_pattern({
|
|
52
|
-
rootDir: "/project",
|
|
53
|
-
pattern: "widget\\.height",
|
|
54
|
-
fileExtensions: [".dart"],
|
|
55
|
-
showContext: true,
|
|
56
|
-
maxResults: 20
|
|
57
|
-
})
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
### 2. 🧹 **Centralized Backup System** (Major Improvement)
|
|
63
|
-
|
|
64
|
-
**Problem Solved:** Backups were scattered throughout projects, polluting git status and creating multiple `.mcp-backups/` folders.
|
|
65
|
-
|
|
66
|
-
**Solution:** ONE centralized backup directory at project root.
|
|
67
|
-
|
|
68
|
-
#### Before (v2.1.x):
|
|
69
|
-
```
|
|
70
|
-
project/
|
|
71
|
-
├── lib/
|
|
72
|
-
│ ├── screens/
|
|
73
|
-
│ │ └── .mcp-backups/ ❌
|
|
74
|
-
│ └── services/
|
|
75
|
-
│ └── .mcp-backups/ ❌
|
|
76
|
-
└── src/
|
|
77
|
-
└── .mcp-backups/ ❌
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
#### After (v2.2.0):
|
|
81
|
-
```
|
|
82
|
-
project/
|
|
83
|
-
├── .mcp-backups/ ✅ ONE directory
|
|
84
|
-
│ ├── lib/
|
|
85
|
-
│ │ ├── screens/
|
|
86
|
-
│ │ └── services/
|
|
87
|
-
│ └── src/
|
|
88
|
-
├── lib/
|
|
89
|
-
├── services/
|
|
90
|
-
└── src/
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**Benefits:**
|
|
94
|
-
- ✅ Clean git status
|
|
95
|
-
- ✅ Easy to clean all backups at once
|
|
96
|
-
- ✅ Preserves internal folder structure
|
|
97
|
-
- ✅ Backward compatible
|
|
98
|
-
|
|
99
|
-
#### `clean_backups` - New Cleanup Tool
|
|
100
|
-
Remove all backups with a single command.
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
clean_backups({
|
|
104
|
-
projectRoot: "/path/to/project"
|
|
105
|
-
})
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## 📊 Technical Improvements
|
|
111
|
-
|
|
112
|
-
### Test Coverage
|
|
113
|
-
- **148 tests passing** (100% success rate)
|
|
114
|
-
- 35 Dart compression tests
|
|
115
|
-
- 33 PHP compression tests
|
|
116
|
-
- 59 Surgical writing tests
|
|
117
|
-
- 7 New tools tests
|
|
118
|
-
- 7 Backup system tests
|
|
119
|
-
- 7 Integration tests
|
|
120
|
-
|
|
121
|
-
### Performance
|
|
122
|
-
- `read_file_lines`: 90% token reduction vs full file reads
|
|
123
|
-
- `search_code_pattern`: 85% more efficient than manual grep
|
|
124
|
-
- Centralized backups: 0 scattered directories
|
|
125
|
-
|
|
126
|
-
### Reliability
|
|
127
|
-
- Comprehensive error handling
|
|
128
|
-
- Edge case coverage (deep nesting, non-existent paths)
|
|
129
|
-
- Backward compatible with legacy backup locations
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## 🛠️ All Tools (11 Total)
|
|
134
|
-
|
|
135
|
-
### Read Tools (5)
|
|
136
|
-
1. `get_semantic_repo_map` - Repository structure overview
|
|
137
|
-
2. `read_file_surgical` - Extract specific symbols
|
|
138
|
-
3. `analyze_impact` - Find dependencies
|
|
139
|
-
4. **`read_file_lines`** - Read line ranges ⭐ NEW
|
|
140
|
-
5. **`search_code_pattern`** - Search with context ⭐ NEW
|
|
141
|
-
|
|
142
|
-
### Cleanup Tools (1)
|
|
143
|
-
6. **`clean_backups`** - Remove all backups ⭐ NEW
|
|
144
|
-
|
|
145
|
-
### Write Tools (5)
|
|
146
|
-
7. `write_file_surgical` - Replace symbols
|
|
147
|
-
8. `insert_symbol` - Insert code precisely
|
|
148
|
-
9. `rename_symbol` - Rename across repository
|
|
149
|
-
10. `remove_symbol` - Safe symbol removal
|
|
150
|
-
11. `rollback_file` - Undo changes
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## 📦 Installation
|
|
155
|
-
|
|
156
|
-
### NPM (Recommended)
|
|
157
|
-
```bash
|
|
158
|
-
npm install -g mcp-code-context@2.2.0
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### From Source
|
|
162
|
-
```bash
|
|
163
|
-
git clone https://github.com/achatainga/mcp-code-context.git
|
|
164
|
-
cd mcp-code-context
|
|
165
|
-
git checkout v2.2.0
|
|
166
|
-
npm install
|
|
167
|
-
npm run build
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## ⚙️ Configuration
|
|
173
|
-
|
|
174
|
-
### Amazon Q / VS Code / Cursor
|
|
175
|
-
Add to your MCP config:
|
|
176
|
-
|
|
177
|
-
```json
|
|
178
|
-
{
|
|
179
|
-
"mcpServers": {
|
|
180
|
-
"code-context": {
|
|
181
|
-
"command": "npx",
|
|
182
|
-
"args": ["-y", "mcp-code-context@2.2.0"]
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Claude Desktop
|
|
189
|
-
Add to `claude_desktop_config.json`:
|
|
190
|
-
|
|
191
|
-
```json
|
|
192
|
-
{
|
|
193
|
-
"mcpServers": {
|
|
194
|
-
"code-context": {
|
|
195
|
-
"command": "npx",
|
|
196
|
-
"args": ["-y", "mcp-code-context@2.2.0"]
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## 🔄 Migration from v2.1.x
|
|
205
|
-
|
|
206
|
-
### Automatic Migration
|
|
207
|
-
No action needed! The new backup system:
|
|
208
|
-
- ✅ Automatically uses centralized location for new backups
|
|
209
|
-
- ✅ Still reads legacy backup locations
|
|
210
|
-
- ✅ No breaking changes
|
|
211
|
-
|
|
212
|
-
### Optional Cleanup
|
|
213
|
-
Clean old scattered backups:
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
# Find old backup directories
|
|
217
|
-
find . -type d -name ".mcp-backups" -not -path "./.mcp-backups"
|
|
218
|
-
|
|
219
|
-
# Remove them (after verifying)
|
|
220
|
-
find . -type d -name ".mcp-backups" -not -path "./.mcp-backups" -exec rm -rf {} +
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
## 🐛 Bug Fixes
|
|
226
|
-
|
|
227
|
-
- Fixed backup directory pollution in git status
|
|
228
|
-
- Improved error messages for non-existent paths
|
|
229
|
-
- Better handling of deeply nested file structures
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
## 📚 Documentation
|
|
234
|
-
|
|
235
|
-
- [README.md](README.md) - Complete tool documentation
|
|
236
|
-
- [CHANGELOG.md](CHANGELOG.md) - Detailed change history
|
|
237
|
-
- [CONTRIBUTING.md](CONTRIBUTING.md) - Contribution guidelines
|
|
238
|
-
- [llms.txt](llms.txt) - AI-optimized documentation
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## 🙏 Acknowledgments
|
|
243
|
-
|
|
244
|
-
This release was built based on real-world debugging experience with:
|
|
245
|
-
- Flutter/Dart projects (DeTodo24 mobile app)
|
|
246
|
-
- WordPress/PHP backends (dt24-home-engine)
|
|
247
|
-
- Complex multi-repository architectures
|
|
248
|
-
|
|
249
|
-
Special thanks to the community for feedback and testing.
|
|
250
|
-
|
|
251
|
-
---
|
|
252
|
-
|
|
253
|
-
## 📈 What's Next (v2.3.0)
|
|
254
|
-
|
|
255
|
-
Planned features:
|
|
256
|
-
- `extract_json_value` - Parse JSON responses efficiently
|
|
257
|
-
- Enhanced `get_semantic_repo_map` with file limits
|
|
258
|
-
- Support for more languages (Go, Rust, Java)
|
|
259
|
-
- Performance optimizations for large repositories
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
## 🔗 Links
|
|
264
|
-
|
|
265
|
-
- **GitHub:** https://github.com/achatainga/mcp-code-context
|
|
266
|
-
- **NPM:** https://www.npmjs.com/package/mcp-code-context
|
|
267
|
-
- **Issues:** https://github.com/achatainga/mcp-code-context/issues
|
|
268
|
-
- **Discussions:** https://github.com/achatainga/mcp-code-context/discussions
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
## 📄 License
|
|
273
|
-
|
|
274
|
-
MIT License - See [LICENSE](LICENSE) for details
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
**Full Changelog:** https://github.com/achatainga/mcp-code-context/compare/v2.1.3...v2.2.0
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
*Built with ❤️ for the AI-assisted development community*
|
|
283
|
-
|
|
284
|
-
**Version:** 2.2.0
|
|
285
|
-
**Released:** April 22, 2026
|
|
286
|
-
**Tested:** 148/148 tests passing ✅
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import { handleWriteFileSurgical, handleRollbackFile } from '../dist/index.js';
|
|
4
|
-
async function testWorkflow() {
|
|
5
|
-
const testFile = path.resolve('test-artifact.ts');
|
|
6
|
-
const initialContent = 'export class Old { build() { return 1; } }';
|
|
7
|
-
fs.writeFileSync(testFile, initialContent, 'utf-8');
|
|
8
|
-
console.log('--- Step 1: Preview (Dry-Run) ---');
|
|
9
|
-
const previewArgs = {
|
|
10
|
-
filePath: testFile,
|
|
11
|
-
symbolName: 'build',
|
|
12
|
-
newContent: ' build() { return "new value"; }',
|
|
13
|
-
className: 'Old'
|
|
14
|
-
};
|
|
15
|
-
const p1 = await handleWriteFileSurgical(previewArgs);
|
|
16
|
-
const p1Text = p1.content[0].text;
|
|
17
|
-
console.log('Preview Result:', p1Text.split('\n')[0]);
|
|
18
|
-
const tokenMatch = p1Text.match(/confirmationToken: "([^"]+)"/);
|
|
19
|
-
if (!tokenMatch)
|
|
20
|
-
throw new Error('No token found');
|
|
21
|
-
const token = tokenMatch[1];
|
|
22
|
-
console.log('Token found:', token);
|
|
23
|
-
console.log('\n--- Step 2: Confirm ---');
|
|
24
|
-
const confirmArgs = {
|
|
25
|
-
...previewArgs,
|
|
26
|
-
confirmationToken: token,
|
|
27
|
-
confirm: true
|
|
28
|
-
};
|
|
29
|
-
const p2 = await handleWriteFileSurgical(confirmArgs);
|
|
30
|
-
console.log('Confirm Result:', p2.content[0].text.split('\n')[0]);
|
|
31
|
-
console.log('File Content:', fs.readFileSync(testFile, 'utf-8'));
|
|
32
|
-
console.log('\n--- Step 3: Rollback ---');
|
|
33
|
-
await handleRollbackFile({ filePath: testFile, steps: 1 });
|
|
34
|
-
console.log('After Rollback:', fs.readFileSync(testFile, 'utf-8'));
|
|
35
|
-
// Clean up
|
|
36
|
-
fs.unlinkSync(testFile);
|
|
37
|
-
const backupDir = path.join(path.dirname(testFile), '.mcp-backups');
|
|
38
|
-
if (fs.existsSync(backupDir)) {
|
|
39
|
-
fs.rmSync(backupDir, { recursive: true, force: true });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
testWorkflow().catch(console.error);
|
|
43
|
-
//# sourceMappingURL=test-confirmation-flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-confirmation-flow.js","sourceRoot":"","sources":["../../../src/tests/test-confirmation-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,4CAA4C,CAAC;IACpE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,mCAAmC;QAC/C,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG;QAClB,GAAG,WAAW;QACd,iBAAiB,EAAE,KAAK;QACxB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,WAAW;IACX,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { replaceDartSymbol } from "../src/ast/writers/dartWriter.js";
|
|
2
|
-
const dartCRLF = "class BadgeService {\r\n static void update({int? cart}) {\r\n if (cart != null) {\r\n print(cart);\r\n }\r\n }\r\n}\r\n";
|
|
3
|
-
const newMethod = " static void update({int? cart}) {\r\n if (cart != null) {\r\n print('Updated: $cart');\r\n }\r\n }";
|
|
4
|
-
console.log("=== ORIGINAL ===");
|
|
5
|
-
console.log(dartCRLF);
|
|
6
|
-
console.log("\n=== NEW CONTENT ===");
|
|
7
|
-
console.log(newMethod);
|
|
8
|
-
const result = replaceDartSymbol(dartCRLF, "update", newMethod);
|
|
9
|
-
console.log("\n=== RESULT ===");
|
|
10
|
-
console.log(JSON.stringify(result, null, 2));
|
|
11
|
-
console.log("\n=== NEW FILE CONTENT ===");
|
|
12
|
-
console.log(result.newContent);
|
|
13
|
-
console.log("\n=== BRACE COUNT ===");
|
|
14
|
-
const openBraces = (result.newContent.match(/{/g) || []).length;
|
|
15
|
-
const closeBraces = (result.newContent.match(/}/g) || []).length;
|
|
16
|
-
console.log(`Open: ${openBraces}, Close: ${closeBraces}`);
|
|
17
|
-
//# sourceMappingURL=debug-replace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-replace.js","sourceRoot":"","sources":["../../tests/debug-replace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,QAAQ,GAAG,uIAAuI,CAAC;AAEzJ,MAAM,SAAS,GAAG,kHAAkH,CAAC;AAErI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEhE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACrC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAChE,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AACjE,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,YAAY,WAAW,EAAE,CAAC,CAAC"}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Centralized Backup System
|
|
3
|
-
* - Backup creation in project root
|
|
4
|
-
* - Folder structure preservation
|
|
5
|
-
* - clean_backups functionality
|
|
6
|
-
*/
|
|
7
|
-
import * as fs from 'fs';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
import { createBackup, cleanAllBackups } from '../src/utils/backupManager.js';
|
|
10
|
-
import { findProjectRoot } from '../src/utils/projectRoot.js';
|
|
11
|
-
const TEST_DIR = path.join(process.cwd(), 'tests', 'fixtures', 'backup-test-project');
|
|
12
|
-
const TEST_FILE = path.join(TEST_DIR, 'src', 'components', 'Button.tsx');
|
|
13
|
-
function setupTestProject() {
|
|
14
|
-
// Create test project structure
|
|
15
|
-
if (fs.existsSync(TEST_DIR)) {
|
|
16
|
-
fs.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
17
|
-
}
|
|
18
|
-
fs.mkdirSync(path.join(TEST_DIR, 'src', 'components'), { recursive: true });
|
|
19
|
-
fs.writeFileSync(TEST_FILE, 'export const Button = () => <button>Click</button>;');
|
|
20
|
-
// Create package.json to mark as project root
|
|
21
|
-
fs.writeFileSync(path.join(TEST_DIR, 'package.json'), JSON.stringify({ name: 'backup-test-project' }));
|
|
22
|
-
}
|
|
23
|
-
function cleanupTestProject() {
|
|
24
|
-
if (fs.existsSync(TEST_DIR)) {
|
|
25
|
-
fs.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
function runTests() {
|
|
29
|
-
console.log('\n🧪 Testing Centralized Backup System...\n');
|
|
30
|
-
let passed = 0;
|
|
31
|
-
let failed = 0;
|
|
32
|
-
// Setup
|
|
33
|
-
setupTestProject();
|
|
34
|
-
try {
|
|
35
|
-
// Test 1: Find project root
|
|
36
|
-
console.log('Test 1: Find project root');
|
|
37
|
-
const projectRoot = findProjectRoot(TEST_FILE);
|
|
38
|
-
if (projectRoot === TEST_DIR) {
|
|
39
|
-
console.log('✅ PASS: Project root found correctly');
|
|
40
|
-
passed++;
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
console.log(`❌ FAIL: Expected ${TEST_DIR}, got ${projectRoot}`);
|
|
44
|
-
failed++;
|
|
45
|
-
}
|
|
46
|
-
// Test 2: Create backup in centralized location
|
|
47
|
-
console.log('\nTest 2: Create backup in centralized location');
|
|
48
|
-
const backupPath = createBackup(TEST_FILE);
|
|
49
|
-
const expectedBackupDir = path.join(TEST_DIR, '.mcp-backups', 'src', 'components');
|
|
50
|
-
const backupExists = fs.existsSync(backupPath);
|
|
51
|
-
const inCorrectLocation = backupPath.startsWith(expectedBackupDir);
|
|
52
|
-
if (backupExists && inCorrectLocation) {
|
|
53
|
-
console.log('✅ PASS: Backup created in centralized location');
|
|
54
|
-
console.log(` Location: ${backupPath}`);
|
|
55
|
-
passed++;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
console.log('❌ FAIL: Backup not in correct location');
|
|
59
|
-
console.log(` Expected dir: ${expectedBackupDir}`);
|
|
60
|
-
console.log(` Actual path: ${backupPath}`);
|
|
61
|
-
failed++;
|
|
62
|
-
}
|
|
63
|
-
// Test 3: Backup preserves folder structure
|
|
64
|
-
console.log('\nTest 3: Backup preserves folder structure');
|
|
65
|
-
const relativePath = path.relative(TEST_DIR, TEST_FILE);
|
|
66
|
-
const expectedStructure = path.join('.mcp-backups', relativePath);
|
|
67
|
-
const actualStructure = path.relative(TEST_DIR, backupPath.replace(/\.\d+\.backup$/, ''));
|
|
68
|
-
if (actualStructure.startsWith(expectedStructure)) {
|
|
69
|
-
console.log('✅ PASS: Folder structure preserved');
|
|
70
|
-
console.log(` Structure: ${expectedStructure}`);
|
|
71
|
-
passed++;
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
console.log('❌ FAIL: Folder structure not preserved');
|
|
75
|
-
console.log(` Expected: ${expectedStructure}`);
|
|
76
|
-
console.log(` Actual: ${actualStructure}`);
|
|
77
|
-
failed++;
|
|
78
|
-
}
|
|
79
|
-
// Test 4: Multiple backups in same location
|
|
80
|
-
console.log('\nTest 4: Multiple backups (rolling system)');
|
|
81
|
-
const backup2 = createBackup(TEST_FILE);
|
|
82
|
-
const backup3 = createBackup(TEST_FILE);
|
|
83
|
-
const allBackups = fs.readdirSync(expectedBackupDir)
|
|
84
|
-
.filter(f => f.startsWith('Button.tsx.') && f.endsWith('.backup'));
|
|
85
|
-
if (allBackups.length === 3) {
|
|
86
|
-
console.log('✅ PASS: Multiple backups created');
|
|
87
|
-
console.log(` Backups: ${allBackups.join(', ')}`);
|
|
88
|
-
passed++;
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
console.log(`❌ FAIL: Expected 3 backups, found ${allBackups.length}`);
|
|
92
|
-
failed++;
|
|
93
|
-
}
|
|
94
|
-
// Test 5: clean_backups removes all backups
|
|
95
|
-
console.log('\nTest 5: clean_backups removes all backups');
|
|
96
|
-
const result = cleanAllBackups(TEST_DIR);
|
|
97
|
-
const backupDirExists = fs.existsSync(path.join(TEST_DIR, '.mcp-backups'));
|
|
98
|
-
if (result && !backupDirExists) {
|
|
99
|
-
console.log('✅ PASS: All backups cleaned');
|
|
100
|
-
console.log(` Backup directory removed successfully`);
|
|
101
|
-
passed++;
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
console.log('❌ FAIL: Backups not cleaned properly');
|
|
105
|
-
console.log(` Result: ${result}, Dir exists: ${backupDirExists}`);
|
|
106
|
-
failed++;
|
|
107
|
-
}
|
|
108
|
-
// Test 6: clean_backups on non-existent directory
|
|
109
|
-
console.log('\nTest 6: clean_backups on non-existent directory');
|
|
110
|
-
const result2 = cleanAllBackups(TEST_DIR);
|
|
111
|
-
if (!result2) {
|
|
112
|
-
console.log('✅ PASS: Returns false when backup directory not found');
|
|
113
|
-
passed++;
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
console.log('❌ FAIL: Should return false when directory not found');
|
|
117
|
-
failed++;
|
|
118
|
-
}
|
|
119
|
-
// Test 7: Backup in nested project structure
|
|
120
|
-
console.log('\nTest 7: Backup in deeply nested file');
|
|
121
|
-
const deepFile = path.join(TEST_DIR, 'src', 'features', 'auth', 'components', 'LoginForm.tsx');
|
|
122
|
-
fs.mkdirSync(path.dirname(deepFile), { recursive: true });
|
|
123
|
-
fs.writeFileSync(deepFile, 'export const LoginForm = () => <form />;');
|
|
124
|
-
const deepBackup = createBackup(deepFile);
|
|
125
|
-
const expectedDeepDir = path.join(TEST_DIR, '.mcp-backups', 'src', 'features', 'auth', 'components');
|
|
126
|
-
if (deepBackup.startsWith(expectedDeepDir)) {
|
|
127
|
-
console.log('✅ PASS: Deep nesting preserved');
|
|
128
|
-
console.log(` Path: ${path.relative(TEST_DIR, deepBackup)}`);
|
|
129
|
-
passed++;
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
console.log('❌ FAIL: Deep nesting not preserved');
|
|
133
|
-
failed++;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
console.log(`❌ FAIL: Unexpected error: ${error}`);
|
|
138
|
-
failed++;
|
|
139
|
-
}
|
|
140
|
-
finally {
|
|
141
|
-
// Cleanup
|
|
142
|
-
cleanupTestProject();
|
|
143
|
-
}
|
|
144
|
-
console.log('\n══════════════════════════════════════════════════');
|
|
145
|
-
console.log(`📊 Results: ${passed} passed, ${failed} failed (${passed + failed} total)`);
|
|
146
|
-
console.log('══════════════════════════════════════════════════\n');
|
|
147
|
-
if (failed > 0) {
|
|
148
|
-
process.exit(1);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
runTests();
|
|
152
|
-
//# sourceMappingURL=test-backup-system.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-backup-system.js","sourceRoot":"","sources":["../../tests/test-backup-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import { handleWriteFileSurgical, handleRollbackFile } from '../src/index.js';
|
|
4
|
-
async function testWorkflow() {
|
|
5
|
-
const testFile = path.resolve('test-artifact.ts');
|
|
6
|
-
const initialContent = 'export class Old { build() { return 1; } }';
|
|
7
|
-
fs.writeFileSync(testFile, initialContent, 'utf-8');
|
|
8
|
-
console.log('--- Step 1: Preview (Dry-Run) ---');
|
|
9
|
-
const previewArgs = {
|
|
10
|
-
filePath: testFile,
|
|
11
|
-
symbolName: 'build',
|
|
12
|
-
newContent: ' build() { return "new value"; }',
|
|
13
|
-
className: 'Old'
|
|
14
|
-
};
|
|
15
|
-
const p1 = await handleWriteFileSurgical(previewArgs);
|
|
16
|
-
const p1Text = p1.content[0].text;
|
|
17
|
-
console.log('Preview Result:', p1Text.split('\n')[0]);
|
|
18
|
-
const tokenMatch = p1Text.match(/confirmationToken: "([^"]+)"/);
|
|
19
|
-
if (!tokenMatch)
|
|
20
|
-
throw new Error('No token found');
|
|
21
|
-
const token = tokenMatch[1];
|
|
22
|
-
console.log('Token found:', token);
|
|
23
|
-
console.log('\n--- Step 2: Confirm ---');
|
|
24
|
-
const confirmArgs = {
|
|
25
|
-
...previewArgs,
|
|
26
|
-
confirmationToken: token,
|
|
27
|
-
confirm: true
|
|
28
|
-
};
|
|
29
|
-
const p2 = await handleWriteFileSurgical(confirmArgs);
|
|
30
|
-
console.log('Confirm Result:', p2.content[0].text.split('\n')[0]);
|
|
31
|
-
console.log('File Content:', fs.readFileSync(testFile, 'utf-8'));
|
|
32
|
-
console.log('\n--- Step 3: Rollback ---');
|
|
33
|
-
await handleRollbackFile({ filePath: testFile, steps: 1 });
|
|
34
|
-
console.log('After Rollback:', fs.readFileSync(testFile, 'utf-8'));
|
|
35
|
-
// Clean up
|
|
36
|
-
fs.unlinkSync(testFile);
|
|
37
|
-
const backupDir = path.join(path.dirname(testFile), '.mcp-backups');
|
|
38
|
-
if (fs.existsSync(backupDir)) {
|
|
39
|
-
fs.rmSync(backupDir, { recursive: true, force: true });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
testWorkflow().catch(console.error);
|
|
43
|
-
//# sourceMappingURL=test-confirmation-flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-confirmation-flow.js","sourceRoot":"","sources":["../../tests/test-confirmation-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,4CAA4C,CAAC;IACpE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,mCAAmC;QAC/C,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG;QAClB,GAAG,WAAW;QACd,iBAAiB,EAAE,KAAK;QACxB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,WAAW;IACX,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|