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/tests/test-dart.js
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test script for Dart compression.
|
|
3
|
-
*/
|
|
4
|
-
import { compressDart, extractDartSymbol } from "../src/ast/dartCompressor.js";
|
|
5
|
-
import * as fs from "node:fs";
|
|
6
|
-
function log(label, value) {
|
|
7
|
-
console.log(`\n${"โ".repeat(60)}`);
|
|
8
|
-
console.log(`โ
${label}`);
|
|
9
|
-
console.log(`${"โ".repeat(60)}`);
|
|
10
|
-
console.log(typeof value === "number" ? String(value) : value);
|
|
11
|
-
}
|
|
12
|
-
function fail(label, reason) {
|
|
13
|
-
console.log(`\n${"โ".repeat(60)}`);
|
|
14
|
-
console.log(`โ FAIL: ${label}`);
|
|
15
|
-
console.log(`${"โ".repeat(60)}`);
|
|
16
|
-
console.log(reason);
|
|
17
|
-
process.exitCode = 1;
|
|
18
|
-
}
|
|
19
|
-
async function main() {
|
|
20
|
-
let passed = 0;
|
|
21
|
-
let failed = 0;
|
|
22
|
-
// โโโ Test 1: Real class (HomeRepository) โโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
23
|
-
console.log("\n\n๐งช TEST 1: Compress HomeRepository.dart (Classes, getters, Future methods, docstrings)");
|
|
24
|
-
const repoPath = "c:/code/detodo24_mobile/lib/features/home/data/repositories/home_repository.dart";
|
|
25
|
-
if (fs.existsSync(repoPath)) {
|
|
26
|
-
const content = fs.readFileSync(repoPath, "utf-8");
|
|
27
|
-
const compressed = compressDart(content);
|
|
28
|
-
const originalLines = content.split("\n").length;
|
|
29
|
-
const compressedLines = compressed.split("\n").length;
|
|
30
|
-
const ratio = ((1 - compressedLines / originalLines) * 100).toFixed(1);
|
|
31
|
-
log(`HomeRepository: ${originalLines} โ ${compressedLines} lines (${ratio}% reduction)`, compressed);
|
|
32
|
-
const checks = [
|
|
33
|
-
["import block", /import 'dart:convert';/],
|
|
34
|
-
["class declaration", /class HomeRepository/],
|
|
35
|
-
["final field", /final http\.Client _httpClient;/],
|
|
36
|
-
["static const field", /static const String _authHomeApiUrl/],
|
|
37
|
-
["constructor", /HomeRepository\(/],
|
|
38
|
-
["async method", /Future<List<Map<String, dynamic>>> fetchSections/],
|
|
39
|
-
["private async method", /Future<List<Map<String, dynamic>>> _fetchSectionsAuth/],
|
|
40
|
-
["doc comment", /Obtiene recomendaciones por misiรณn Amazon-style/],
|
|
41
|
-
["body stripped", /\{ \/\* \.\.\. \*\/ \}/]
|
|
42
|
-
];
|
|
43
|
-
for (const [name, pattern] of checks) {
|
|
44
|
-
if (pattern.test(compressed)) {
|
|
45
|
-
console.log(` โ Found: ${name}`);
|
|
46
|
-
passed++;
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
50
|
-
failed++;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// โโโ Test 2: Real Widget (DT24Loading) โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
55
|
-
console.log("\n\n๐งช TEST 2: Compress dt24_loading.dart (StatefulWidget, CustomPainter, @override)");
|
|
56
|
-
const widgetPath = "c:/code/detodo24_mobile/lib/widgets/dt24_loading.dart";
|
|
57
|
-
if (fs.existsSync(widgetPath)) {
|
|
58
|
-
const content = fs.readFileSync(widgetPath, "utf-8");
|
|
59
|
-
const compressed = compressDart(content);
|
|
60
|
-
log("DT24Loading compressed:", compressed);
|
|
61
|
-
const checks = [
|
|
62
|
-
["StatefulWidget", /class DT24Loading extends StatefulWidget/],
|
|
63
|
-
["doc comment", /Widget de carga personalizado/],
|
|
64
|
-
["const constructor", /const DT24Loading/],
|
|
65
|
-
["@override", /@override/],
|
|
66
|
-
["State class", /class _DT24LoadingState extends State<DT24Loading>/],
|
|
67
|
-
["mixin", /with SingleTickerProviderStateMixin/],
|
|
68
|
-
["CustomPainter", /class _DT24LoadingPainter extends CustomPainter/],
|
|
69
|
-
["method with complex generic", /State<DT24Loading> createState\(\) => \/\* \.\.\. \*\/;/]
|
|
70
|
-
];
|
|
71
|
-
for (const [name, pattern] of checks) {
|
|
72
|
-
if (pattern.test(compressed)) {
|
|
73
|
-
console.log(` โ Found: ${name}`);
|
|
74
|
-
passed++;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
78
|
-
failed++;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// โโโ Test 3: Symbol Extraction โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
83
|
-
console.log("\n\n๐งช TEST 3: Surgical Symbol Extraction (Dart)");
|
|
84
|
-
if (fs.existsSync(repoPath)) {
|
|
85
|
-
const content = fs.readFileSync(repoPath, "utf-8");
|
|
86
|
-
// Extract class
|
|
87
|
-
const repoClass = extractDartSymbol(content, "HomeRepository");
|
|
88
|
-
if (repoClass && repoClass.includes("class HomeRepository")) {
|
|
89
|
-
console.log(` โ Successfully extracted class HomeRepository (${repoClass.split("\n").length} lines)`);
|
|
90
|
-
passed++;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
fail("Extract class", "Failed to extract HomeRepository");
|
|
94
|
-
failed++;
|
|
95
|
-
}
|
|
96
|
-
// Extract method
|
|
97
|
-
const fetchMethod = extractDartSymbol(content, "fetchSections");
|
|
98
|
-
if (fetchMethod && fetchMethod.includes("Future<List<Map<String, dynamic>>> fetchSections")) {
|
|
99
|
-
console.log(` โ Successfully extracted method fetchSections (${fetchMethod.split("\n").length} lines)`);
|
|
100
|
-
passed++;
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
fail("Extract method", "Failed to extract fetchSections");
|
|
104
|
-
failed++;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// โโโ Test 4: Synthetic Dart with all patterns โโโโโโโโโโโโโโโโโโโโโ
|
|
108
|
-
console.log("\n\n๐งช TEST 4: Synthetic Dart with mixins, enums, extensions, types");
|
|
109
|
-
const syntheticDart = `
|
|
110
|
-
import 'dart:async';
|
|
111
|
-
import 'package:flutter/material.dart';
|
|
112
|
-
|
|
113
|
-
part 'model.g.dart';
|
|
114
|
-
|
|
115
|
-
/// Top level typedef
|
|
116
|
-
typedef JsonMap = Map<String, dynamic>;
|
|
117
|
-
|
|
118
|
-
/// User State enum
|
|
119
|
-
enum UserState {
|
|
120
|
-
loggedOut,
|
|
121
|
-
loggedIn,
|
|
122
|
-
loading;
|
|
123
|
-
|
|
124
|
-
bool get isActive => this == UserState.loggedIn;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/// Logger mixin
|
|
128
|
-
mixin Logger on Object {
|
|
129
|
-
void log(String message) {
|
|
130
|
-
print('[\${runtimeType}] \$message');
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/// Extension on String
|
|
135
|
-
extension StringUtils on String {
|
|
136
|
-
bool get isBlank => trim().isEmpty;
|
|
137
|
-
|
|
138
|
-
String capitalize() {
|
|
139
|
-
if (isBlank) return this;
|
|
140
|
-
return '\${this[0].toUpperCase()}\${substring(1)}';
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/// Base user model
|
|
145
|
-
sealed class UserModel with Logger {
|
|
146
|
-
final String id;
|
|
147
|
-
|
|
148
|
-
const UserModel({required this.id});
|
|
149
|
-
|
|
150
|
-
factory UserModel.fromJson(JsonMap json) {
|
|
151
|
-
return NormalUser(id: json['id']);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
class NormalUser extends UserModel {
|
|
156
|
-
final String name;
|
|
157
|
-
late final String uppercaseName;
|
|
158
|
-
|
|
159
|
-
NormalUser({
|
|
160
|
-
required String id,
|
|
161
|
-
this.name = '',
|
|
162
|
-
}) : super(id: id) {
|
|
163
|
-
uppercaseName = name.toUpperCase();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
@override
|
|
167
|
-
String toString() => 'User(\$id, \$name)';
|
|
168
|
-
|
|
169
|
-
Future<void> save() async {
|
|
170
|
-
await Future.delayed(const Duration(seconds: 1));
|
|
171
|
-
log('Saved \$name');
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
`;
|
|
175
|
-
const compressedSyntax = compressDart(syntheticDart);
|
|
176
|
-
log("Synthetic compressed", compressedSyntax);
|
|
177
|
-
const synthChecks = [
|
|
178
|
-
["part statement", /part 'model.g.dart';/],
|
|
179
|
-
["typedef", /typedef JsonMap = Map<String, dynamic>;/],
|
|
180
|
-
["enum", /enum UserState {/],
|
|
181
|
-
["enum cases", /loggedOut,\s+loggedIn,\s+loading;/],
|
|
182
|
-
["enum method", /bool get isActive => \/\* \.\.\. \*\/;/],
|
|
183
|
-
["mixin", /mixin Logger on Object {/],
|
|
184
|
-
["extension", /extension StringUtils on String {/],
|
|
185
|
-
["extension getter", /bool get isBlank => \/\* \.\.\. \*\/;/],
|
|
186
|
-
["sealed class", /sealed class UserModel with Logger {/],
|
|
187
|
-
["const constructor", /const UserModel\({required this.id}\);/],
|
|
188
|
-
["factory constructor", /factory UserModel.fromJson\(JsonMap json\) { \/\* \.\.\. \*\/ }/],
|
|
189
|
-
["late final field", /late final String uppercaseName;/],
|
|
190
|
-
["initializer list constructor", /NormalUser\([\s\S]*?\) : super\(id: id\) { \/\* \.\.\. \*\/ }/],
|
|
191
|
-
["arrow function override", /@override\s+String toString\(\) => \/\* \.\.\. \*\/;/]
|
|
192
|
-
];
|
|
193
|
-
for (const [name, pattern] of synthChecks) {
|
|
194
|
-
if (pattern.test(compressedSyntax)) {
|
|
195
|
-
console.log(` โ Found: ${name}`);
|
|
196
|
-
passed++;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found in compressed output`);
|
|
200
|
-
failed++;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// โโโ Summary โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
204
|
-
console.log(`\n\n${"โ".repeat(60)}`);
|
|
205
|
-
console.log(`๐ RESULTS: ${passed} passed, ${failed} failed`);
|
|
206
|
-
console.log(`${"โ".repeat(60)}\n`);
|
|
207
|
-
}
|
|
208
|
-
main().catch(console.error);
|
|
209
|
-
//# sourceMappingURL=test-dart.js.map
|
package/tests/test-dart.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-dart.js","sourceRoot":"","sources":["test-dart.ts"],"names":[],"mappings":"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"}
|
package/tests/test-dart.ts
DELETED
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test script for Dart compression.
|
|
3
|
-
*/
|
|
4
|
-
import { compressDart, extractDartSymbol } from "../src/ast/dartCompressor.js";
|
|
5
|
-
import * as fs from "node:fs";
|
|
6
|
-
|
|
7
|
-
function log(label: string, value: string | number) {
|
|
8
|
-
console.log(`\n${"โ".repeat(60)}`);
|
|
9
|
-
console.log(`โ
${label}`);
|
|
10
|
-
console.log(`${"โ".repeat(60)}`);
|
|
11
|
-
console.log(typeof value === "number" ? String(value) : value);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function fail(label: string, reason: string) {
|
|
15
|
-
console.log(`\n${"โ".repeat(60)}`);
|
|
16
|
-
console.log(`โ FAIL: ${label}`);
|
|
17
|
-
console.log(`${"โ".repeat(60)}`);
|
|
18
|
-
console.log(reason);
|
|
19
|
-
process.exitCode = 1;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async function main() {
|
|
23
|
-
let passed = 0;
|
|
24
|
-
let failed = 0;
|
|
25
|
-
|
|
26
|
-
// โโโ Test 1: Real class (HomeRepository) โโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
27
|
-
console.log("\n\n๐งช TEST 1: Compress HomeRepository.dart (Classes, getters, Future methods, docstrings)");
|
|
28
|
-
|
|
29
|
-
const repoPath = "c:/code/detodo24_mobile/lib/features/home/data/repositories/home_repository.dart";
|
|
30
|
-
if (fs.existsSync(repoPath)) {
|
|
31
|
-
const content = fs.readFileSync(repoPath, "utf-8");
|
|
32
|
-
const compressed = compressDart(content);
|
|
33
|
-
const originalLines = content.split("\n").length;
|
|
34
|
-
const compressedLines = compressed.split("\n").length;
|
|
35
|
-
const ratio = ((1 - compressedLines / originalLines) * 100).toFixed(1);
|
|
36
|
-
|
|
37
|
-
log(
|
|
38
|
-
`HomeRepository: ${originalLines} โ ${compressedLines} lines (${ratio}% reduction)`,
|
|
39
|
-
compressed,
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
const checks = [
|
|
43
|
-
["import block", /import 'dart:convert';/],
|
|
44
|
-
["class declaration", /class HomeRepository/],
|
|
45
|
-
["final field", /final http\.Client _httpClient;/],
|
|
46
|
-
["static const field", /static const String _authHomeApiUrl/],
|
|
47
|
-
["constructor", /HomeRepository\(/],
|
|
48
|
-
["async method", /Future<List<Map<String, dynamic>>> fetchSections/],
|
|
49
|
-
["private async method", /Future<List<Map<String, dynamic>>> _fetchSectionsAuth/],
|
|
50
|
-
["doc comment", /Obtiene recomendaciones por misiรณn Amazon-style/],
|
|
51
|
-
["body stripped", /\{ \/\* \.\.\. \*\/ \}/]
|
|
52
|
-
] as const;
|
|
53
|
-
|
|
54
|
-
for (const [name, pattern] of checks) {
|
|
55
|
-
if (pattern.test(compressed)) {
|
|
56
|
-
console.log(` โ Found: ${name}`);
|
|
57
|
-
passed++;
|
|
58
|
-
} else {
|
|
59
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
60
|
-
failed++;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// โโโ Test 2: Real Widget (DT24Loading) โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
66
|
-
console.log("\n\n๐งช TEST 2: Compress dt24_loading.dart (StatefulWidget, CustomPainter, @override)");
|
|
67
|
-
|
|
68
|
-
const widgetPath = "c:/code/detodo24_mobile/lib/widgets/dt24_loading.dart";
|
|
69
|
-
if (fs.existsSync(widgetPath)) {
|
|
70
|
-
const content = fs.readFileSync(widgetPath, "utf-8");
|
|
71
|
-
const compressed = compressDart(content);
|
|
72
|
-
|
|
73
|
-
log("DT24Loading compressed:", compressed);
|
|
74
|
-
|
|
75
|
-
const checks = [
|
|
76
|
-
["StatefulWidget", /class DT24Loading extends StatefulWidget/],
|
|
77
|
-
["doc comment", /Widget de carga personalizado/],
|
|
78
|
-
["const constructor", /const DT24Loading/],
|
|
79
|
-
["@override", /@override/],
|
|
80
|
-
["State class", /class _DT24LoadingState extends State<DT24Loading>/],
|
|
81
|
-
["mixin", /with SingleTickerProviderStateMixin/],
|
|
82
|
-
["CustomPainter", /class _DT24LoadingPainter extends CustomPainter/],
|
|
83
|
-
["method with complex generic", /State<DT24Loading> createState\(\) => \/\* \.\.\. \*\/;/]
|
|
84
|
-
] as const;
|
|
85
|
-
|
|
86
|
-
for (const [name, pattern] of checks) {
|
|
87
|
-
if (pattern.test(compressed)) {
|
|
88
|
-
console.log(` โ Found: ${name}`);
|
|
89
|
-
passed++;
|
|
90
|
-
} else {
|
|
91
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
92
|
-
failed++;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// โโโ Test 3: Symbol Extraction โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
98
|
-
console.log("\n\n๐งช TEST 3: Surgical Symbol Extraction (Dart)");
|
|
99
|
-
|
|
100
|
-
if (fs.existsSync(repoPath)) {
|
|
101
|
-
const content = fs.readFileSync(repoPath, "utf-8");
|
|
102
|
-
|
|
103
|
-
// Extract class
|
|
104
|
-
const repoClass = extractDartSymbol(content, "HomeRepository");
|
|
105
|
-
if (repoClass && repoClass.includes("class HomeRepository")) {
|
|
106
|
-
console.log(` โ Successfully extracted class HomeRepository (${repoClass.split("\n").length} lines)`);
|
|
107
|
-
passed++;
|
|
108
|
-
} else {
|
|
109
|
-
fail("Extract class", "Failed to extract HomeRepository");
|
|
110
|
-
failed++;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Extract method
|
|
114
|
-
const fetchMethod = extractDartSymbol(content, "fetchSections");
|
|
115
|
-
if (fetchMethod && fetchMethod.includes("Future<List<Map<String, dynamic>>> fetchSections")) {
|
|
116
|
-
console.log(` โ Successfully extracted method fetchSections (${fetchMethod.split("\n").length} lines)`);
|
|
117
|
-
passed++;
|
|
118
|
-
} else {
|
|
119
|
-
fail("Extract method", "Failed to extract fetchSections");
|
|
120
|
-
failed++;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// โโโ Test 4: Synthetic Dart with all patterns โโโโโโโโโโโโโโโโโโโโโ
|
|
125
|
-
console.log("\n\n๐งช TEST 4: Synthetic Dart with mixins, enums, extensions, types");
|
|
126
|
-
|
|
127
|
-
const syntheticDart = `
|
|
128
|
-
import 'dart:async';
|
|
129
|
-
import 'package:flutter/material.dart';
|
|
130
|
-
|
|
131
|
-
part 'model.g.dart';
|
|
132
|
-
|
|
133
|
-
/// Top level typedef
|
|
134
|
-
typedef JsonMap = Map<String, dynamic>;
|
|
135
|
-
|
|
136
|
-
/// User State enum
|
|
137
|
-
enum UserState {
|
|
138
|
-
loggedOut,
|
|
139
|
-
loggedIn,
|
|
140
|
-
loading;
|
|
141
|
-
|
|
142
|
-
bool get isActive => this == UserState.loggedIn;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/// Logger mixin
|
|
146
|
-
mixin Logger on Object {
|
|
147
|
-
void log(String message) {
|
|
148
|
-
print('[\${runtimeType}] \$message');
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/// Extension on String
|
|
153
|
-
extension StringUtils on String {
|
|
154
|
-
bool get isBlank => trim().isEmpty;
|
|
155
|
-
|
|
156
|
-
String capitalize() {
|
|
157
|
-
if (isBlank) return this;
|
|
158
|
-
return '\${this[0].toUpperCase()}\${substring(1)}';
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/// Base user model
|
|
163
|
-
sealed class UserModel with Logger {
|
|
164
|
-
final String id;
|
|
165
|
-
|
|
166
|
-
const UserModel({required this.id});
|
|
167
|
-
|
|
168
|
-
factory UserModel.fromJson(JsonMap json) {
|
|
169
|
-
return NormalUser(id: json['id']);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
class NormalUser extends UserModel {
|
|
174
|
-
final String name;
|
|
175
|
-
late final String uppercaseName;
|
|
176
|
-
|
|
177
|
-
NormalUser({
|
|
178
|
-
required String id,
|
|
179
|
-
this.name = '',
|
|
180
|
-
}) : super(id: id) {
|
|
181
|
-
uppercaseName = name.toUpperCase();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
@override
|
|
185
|
-
String toString() => 'User(\$id, \$name)';
|
|
186
|
-
|
|
187
|
-
Future<void> save() async {
|
|
188
|
-
await Future.delayed(const Duration(seconds: 1));
|
|
189
|
-
log('Saved \$name');
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
`;
|
|
193
|
-
|
|
194
|
-
const compressedSyntax = compressDart(syntheticDart);
|
|
195
|
-
log("Synthetic compressed", compressedSyntax);
|
|
196
|
-
|
|
197
|
-
const synthChecks = [
|
|
198
|
-
["part statement", /part 'model.g.dart';/],
|
|
199
|
-
["typedef", /typedef JsonMap = Map<String, dynamic>;/],
|
|
200
|
-
["enum", /enum UserState {/],
|
|
201
|
-
["enum cases", /loggedOut,\s+loggedIn,\s+loading;/],
|
|
202
|
-
["enum method", /bool get isActive => \/\* \.\.\. \*\/;/],
|
|
203
|
-
["mixin", /mixin Logger on Object {/],
|
|
204
|
-
["extension", /extension StringUtils on String {/],
|
|
205
|
-
["extension getter", /bool get isBlank => \/\* \.\.\. \*\/;/],
|
|
206
|
-
["sealed class", /sealed class UserModel with Logger {/],
|
|
207
|
-
["const constructor", /const UserModel\({required this.id}\);/],
|
|
208
|
-
["factory constructor", /factory UserModel.fromJson\(JsonMap json\) { \/\* \.\.\. \*\/ }/],
|
|
209
|
-
["late final field", /late final String uppercaseName;/],
|
|
210
|
-
["initializer list constructor", /NormalUser\([\s\S]*?\) : super\(id: id\) { \/\* \.\.\. \*\/ }/],
|
|
211
|
-
["arrow function override", /@override\s+String toString\(\) => \/\* \.\.\. \*\/;/]
|
|
212
|
-
] as const;
|
|
213
|
-
|
|
214
|
-
for (const [name, pattern] of synthChecks) {
|
|
215
|
-
if (pattern.test(compressedSyntax)) {
|
|
216
|
-
console.log(` โ Found: ${name}`);
|
|
217
|
-
passed++;
|
|
218
|
-
} else {
|
|
219
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found in compressed output`);
|
|
220
|
-
failed++;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// โโโ Test 5: ClassName Extraction Disambiguation โโโโโโโโโโโโโ
|
|
225
|
-
console.log("\n\n๐งช TEST 5: ClassName Extraction Disambiguation");
|
|
226
|
-
|
|
227
|
-
const multiClassDart = `
|
|
228
|
-
class ClassA {
|
|
229
|
-
void build() {
|
|
230
|
-
print('A');
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
class ClassB {
|
|
235
|
-
void build() {
|
|
236
|
-
print('B');
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
`;
|
|
240
|
-
|
|
241
|
-
const extractedBuildA = extractDartSymbol(multiClassDart, "build", "ClassA");
|
|
242
|
-
if (extractedBuildA && extractedBuildA.includes("print('A');")) {
|
|
243
|
-
console.log(` โ Successfully extracted build from ClassA`);
|
|
244
|
-
passed++;
|
|
245
|
-
} else {
|
|
246
|
-
fail("Extract ClassA build", "Failed to properly extract build from ClassA");
|
|
247
|
-
failed++;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
const extractedBuildB = extractDartSymbol(multiClassDart, "build", "ClassB");
|
|
251
|
-
if (extractedBuildB && extractedBuildB.includes("print('B');")) {
|
|
252
|
-
console.log(` โ Successfully extracted build from ClassB`);
|
|
253
|
-
passed++;
|
|
254
|
-
} else {
|
|
255
|
-
fail("Extract ClassB build", "Failed to properly extract build from ClassB");
|
|
256
|
-
failed++;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// โโโ Summary โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
260
|
-
console.log(`\n\n${"โ".repeat(60)}`);
|
|
261
|
-
console.log(`๐ RESULTS: ${passed} passed, ${failed} failed`);
|
|
262
|
-
console.log(`${"โ".repeat(60)}\n`);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
main().catch(console.error);
|
package/tests/test-new-tools.ts
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test suite for new tools: read_file_lines and search_code_pattern
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { readFileLines } from "../src/tools/readFileLines.js";
|
|
6
|
-
import { searchCodePattern } from "../src/tools/searchCodePattern.js";
|
|
7
|
-
import * as fs from "node:fs";
|
|
8
|
-
import * as path from "node:path";
|
|
9
|
-
import { fileURLToPath } from "node:url";
|
|
10
|
-
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = path.dirname(__filename);
|
|
13
|
-
|
|
14
|
-
// Create test file
|
|
15
|
-
const testDir = path.join(__dirname, "test-data");
|
|
16
|
-
const testFile = path.join(testDir, "sample.ts");
|
|
17
|
-
|
|
18
|
-
if (!fs.existsSync(testDir)) {
|
|
19
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const testContent = `// Sample TypeScript file
|
|
23
|
-
export class Calculator {
|
|
24
|
-
add(a: number, b: number): number {
|
|
25
|
-
return a + b;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
subtract(a: number, b: number): number {
|
|
29
|
-
return a - b;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
multiply(a: number, b: number): number {
|
|
33
|
-
return a * b;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
divide(a: number, b: number): number {
|
|
37
|
-
if (b === 0) throw new Error("Division by zero");
|
|
38
|
-
return a / b;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function greet(name: string): string {
|
|
43
|
-
return \`Hello, \${name}!\`;
|
|
44
|
-
}
|
|
45
|
-
`;
|
|
46
|
-
|
|
47
|
-
fs.writeFileSync(testFile, testContent, "utf-8");
|
|
48
|
-
|
|
49
|
-
console.log("๐งช Testing read_file_lines...\n");
|
|
50
|
-
|
|
51
|
-
// Test 1: Read exact line range
|
|
52
|
-
console.log("Test 1: Read lines 3-7");
|
|
53
|
-
const result1 = readFileLines({
|
|
54
|
-
filePath: testFile,
|
|
55
|
-
startLine: 3,
|
|
56
|
-
endLine: 7,
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
if (result1.success && result1.content?.includes("add")) {
|
|
60
|
-
console.log("โ
PASS: Exact line range");
|
|
61
|
-
} else {
|
|
62
|
-
console.error("โ FAIL: Exact line range");
|
|
63
|
-
console.error(result1);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Test 2: Read around pattern
|
|
67
|
-
console.log("\nTest 2: Read around pattern 'multiply'");
|
|
68
|
-
const result2 = readFileLines({
|
|
69
|
-
filePath: testFile,
|
|
70
|
-
aroundPattern: "multiply",
|
|
71
|
-
contextLines: 2,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
if (result2.success && result2.content?.includes("multiply")) {
|
|
75
|
-
console.log("โ
PASS: Pattern search");
|
|
76
|
-
} else {
|
|
77
|
-
console.error("โ FAIL: Pattern search");
|
|
78
|
-
console.error(result2);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Test 3: Invalid line range
|
|
82
|
-
console.log("\nTest 3: Invalid line range (should fail)");
|
|
83
|
-
const result3 = readFileLines({
|
|
84
|
-
filePath: testFile,
|
|
85
|
-
startLine: 100,
|
|
86
|
-
endLine: 200,
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
if (!result3.success && result3.error?.includes("Invalid line range")) {
|
|
90
|
-
console.log("โ
PASS: Error handling for invalid range");
|
|
91
|
-
} else {
|
|
92
|
-
console.error("โ FAIL: Should have failed with invalid range");
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Test 4: Pattern not found
|
|
96
|
-
console.log("\nTest 4: Pattern not found (should fail)");
|
|
97
|
-
const result4 = readFileLines({
|
|
98
|
-
filePath: testFile,
|
|
99
|
-
aroundPattern: "nonexistent_pattern_xyz",
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
if (!result4.success && result4.error?.includes("not found")) {
|
|
103
|
-
console.log("โ
PASS: Error handling for pattern not found");
|
|
104
|
-
} else {
|
|
105
|
-
console.error("โ FAIL: Should have failed with pattern not found");
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
console.log("\n๐งช Testing search_code_pattern...\n");
|
|
109
|
-
|
|
110
|
-
// Test 5: Search for pattern
|
|
111
|
-
console.log("Test 5: Search for 'Calculator'");
|
|
112
|
-
const result5 = searchCodePattern({
|
|
113
|
-
rootDir: testDir,
|
|
114
|
-
pattern: "Calculator",
|
|
115
|
-
fileExtensions: [".ts"],
|
|
116
|
-
maxResults: 10,
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
if (result5.success && result5.matches && result5.matches.length > 0) {
|
|
120
|
-
console.log(`โ
PASS: Found ${result5.totalMatches} matches`);
|
|
121
|
-
} else {
|
|
122
|
-
console.error("โ FAIL: Should have found matches");
|
|
123
|
-
console.error(result5);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Test 6: Search with no matches
|
|
127
|
-
console.log("\nTest 6: Search for non-existent pattern");
|
|
128
|
-
const result6 = searchCodePattern({
|
|
129
|
-
rootDir: testDir,
|
|
130
|
-
pattern: "NonExistentClass123",
|
|
131
|
-
fileExtensions: [".ts"],
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
if (result6.success && result6.totalMatches === 0) {
|
|
135
|
-
console.log("โ
PASS: No matches found (as expected)");
|
|
136
|
-
} else {
|
|
137
|
-
console.error("โ FAIL: Should have found no matches");
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Test 7: Search with context
|
|
141
|
-
console.log("\nTest 7: Search with context lines");
|
|
142
|
-
const result7 = searchCodePattern({
|
|
143
|
-
rootDir: testDir,
|
|
144
|
-
pattern: "divide",
|
|
145
|
-
fileExtensions: [".ts"],
|
|
146
|
-
showContext: true,
|
|
147
|
-
contextLines: 2,
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
if (
|
|
151
|
-
result7.success &&
|
|
152
|
-
result7.matches &&
|
|
153
|
-
result7.matches[0]?.context &&
|
|
154
|
-
result7.matches[0].context.length > 0
|
|
155
|
-
) {
|
|
156
|
-
console.log("โ
PASS: Context lines included");
|
|
157
|
-
} else {
|
|
158
|
-
console.error("โ FAIL: Context lines not included");
|
|
159
|
-
console.error(result7);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Cleanup
|
|
163
|
-
fs.rmSync(testDir, { recursive: true, force: true });
|
|
164
|
-
|
|
165
|
-
console.log("\nโจ All tests completed!");
|
package/tests/test-php-ast.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|