@eduardbar/drift 0.9.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/.github/actions/drift-scan/README.md +61 -0
  2. package/.github/actions/drift-scan/action.yml +65 -0
  3. package/.github/workflows/publish-vscode.yml +78 -0
  4. package/AGENTS.md +83 -23
  5. package/README.md +69 -2
  6. package/ROADMAP.md +130 -98
  7. package/dist/analyzer.d.ts +8 -38
  8. package/dist/analyzer.js +181 -1526
  9. package/dist/badge.js +40 -22
  10. package/dist/ci.js +32 -18
  11. package/dist/cli.js +125 -4
  12. package/dist/config.js +1 -1
  13. package/dist/diff.d.ts +0 -7
  14. package/dist/diff.js +26 -25
  15. package/dist/fix.d.ts +17 -0
  16. package/dist/fix.js +132 -0
  17. package/dist/git/blame.d.ts +22 -0
  18. package/dist/git/blame.js +227 -0
  19. package/dist/git/helpers.d.ts +36 -0
  20. package/dist/git/helpers.js +152 -0
  21. package/dist/git/trend.d.ts +21 -0
  22. package/dist/git/trend.js +81 -0
  23. package/dist/git.d.ts +0 -13
  24. package/dist/git.js +27 -21
  25. package/dist/index.d.ts +5 -1
  26. package/dist/index.js +3 -0
  27. package/dist/map.d.ts +3 -0
  28. package/dist/map.js +103 -0
  29. package/dist/metrics.d.ts +4 -0
  30. package/dist/metrics.js +176 -0
  31. package/dist/plugins.d.ts +6 -0
  32. package/dist/plugins.js +74 -0
  33. package/dist/printer.js +20 -0
  34. package/dist/report.js +654 -293
  35. package/dist/reporter.js +85 -2
  36. package/dist/review.d.ts +15 -0
  37. package/dist/review.js +80 -0
  38. package/dist/rules/comments.d.ts +4 -0
  39. package/dist/rules/comments.js +45 -0
  40. package/dist/rules/complexity.d.ts +4 -0
  41. package/dist/rules/complexity.js +51 -0
  42. package/dist/rules/coupling.d.ts +4 -0
  43. package/dist/rules/coupling.js +19 -0
  44. package/dist/rules/magic.d.ts +4 -0
  45. package/dist/rules/magic.js +33 -0
  46. package/dist/rules/nesting.d.ts +5 -0
  47. package/dist/rules/nesting.js +82 -0
  48. package/dist/rules/phase0-basic.d.ts +11 -0
  49. package/dist/rules/phase0-basic.js +183 -0
  50. package/dist/rules/phase1-complexity.d.ts +7 -0
  51. package/dist/rules/phase1-complexity.js +8 -0
  52. package/dist/rules/phase2-crossfile.d.ts +23 -0
  53. package/dist/rules/phase2-crossfile.js +135 -0
  54. package/dist/rules/phase3-arch.d.ts +23 -0
  55. package/dist/rules/phase3-arch.js +151 -0
  56. package/dist/rules/phase3-configurable.d.ts +6 -0
  57. package/dist/rules/phase3-configurable.js +97 -0
  58. package/dist/rules/phase5-ai.d.ts +8 -0
  59. package/dist/rules/phase5-ai.js +262 -0
  60. package/dist/rules/phase8-semantic.d.ts +17 -0
  61. package/dist/rules/phase8-semantic.js +110 -0
  62. package/dist/rules/promise.d.ts +4 -0
  63. package/dist/rules/promise.js +24 -0
  64. package/dist/rules/shared.d.ts +7 -0
  65. package/dist/rules/shared.js +27 -0
  66. package/dist/snapshot.d.ts +19 -0
  67. package/dist/snapshot.js +119 -0
  68. package/dist/types.d.ts +69 -0
  69. package/dist/utils.d.ts +2 -1
  70. package/dist/utils.js +1 -0
  71. package/docs/AGENTS.md +146 -0
  72. package/docs/PRD.md +208 -0
  73. package/package.json +8 -3
  74. package/packages/eslint-plugin-drift/src/index.ts +1 -1
  75. package/packages/vscode-drift/.vscodeignore +9 -0
  76. package/packages/vscode-drift/LICENSE +21 -0
  77. package/packages/vscode-drift/README.md +64 -0
  78. package/packages/vscode-drift/images/icon.png +0 -0
  79. package/packages/vscode-drift/images/icon.svg +30 -0
  80. package/packages/vscode-drift/package-lock.json +485 -0
  81. package/packages/vscode-drift/package.json +119 -0
  82. package/packages/vscode-drift/src/analyzer.ts +40 -0
  83. package/packages/vscode-drift/src/diagnostics.ts +55 -0
  84. package/packages/vscode-drift/src/extension.ts +135 -0
  85. package/packages/vscode-drift/src/statusbar.ts +55 -0
  86. package/packages/vscode-drift/src/treeview.ts +110 -0
  87. package/packages/vscode-drift/tsconfig.json +18 -0
  88. package/packages/vscode-drift/vscode-drift-0.1.0.vsix +0 -0
  89. package/packages/vscode-drift/vscode-drift-0.1.1.vsix +0 -0
  90. package/src/analyzer.ts +248 -1765
  91. package/src/badge.ts +38 -16
  92. package/src/ci.ts +38 -17
  93. package/src/cli.ts +143 -4
  94. package/src/config.ts +1 -1
  95. package/src/diff.ts +36 -30
  96. package/src/fix.ts +178 -0
  97. package/src/git/blame.ts +279 -0
  98. package/src/git/helpers.ts +198 -0
  99. package/src/git/trend.ts +117 -0
  100. package/src/git.ts +33 -24
  101. package/src/index.ts +16 -1
  102. package/src/map.ts +117 -0
  103. package/src/metrics.ts +200 -0
  104. package/src/plugins.ts +76 -0
  105. package/src/printer.ts +20 -0
  106. package/src/report.ts +666 -296
  107. package/src/reporter.ts +95 -2
  108. package/src/review.ts +98 -0
  109. package/src/rules/comments.ts +56 -0
  110. package/src/rules/complexity.ts +57 -0
  111. package/src/rules/coupling.ts +23 -0
  112. package/src/rules/magic.ts +38 -0
  113. package/src/rules/nesting.ts +88 -0
  114. package/src/rules/phase0-basic.ts +194 -0
  115. package/src/rules/phase1-complexity.ts +8 -0
  116. package/src/rules/phase2-crossfile.ts +177 -0
  117. package/src/rules/phase3-arch.ts +183 -0
  118. package/src/rules/phase3-configurable.ts +132 -0
  119. package/src/rules/phase5-ai.ts +292 -0
  120. package/src/rules/phase8-semantic.ts +136 -0
  121. package/src/rules/promise.ts +29 -0
  122. package/src/rules/shared.ts +39 -0
  123. package/src/snapshot.ts +175 -0
  124. package/src/types.ts +75 -1
  125. package/src/utils.ts +3 -1
  126. package/tests/helpers.ts +45 -0
  127. package/tests/new-features.test.ts +153 -0
  128. package/tests/rules.test.ts +1269 -0
  129. package/vitest.config.ts +15 -0
@@ -0,0 +1,485 @@
1
+ {
2
+ "name": "vscode-drift",
3
+ "version": "0.1.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "vscode-drift",
9
+ "version": "0.1.0",
10
+ "dependencies": {
11
+ "@eduardbar/drift": "*",
12
+ "ts-morph": "^23.0.0"
13
+ },
14
+ "devDependencies": {
15
+ "@types/node": "^20.0.0",
16
+ "@types/vscode": "^1.85.0",
17
+ "typescript": "^5.3.0"
18
+ },
19
+ "engines": {
20
+ "vscode": "^1.85.0"
21
+ }
22
+ },
23
+ "node_modules/@eduardbar/drift": {
24
+ "version": "0.9.1",
25
+ "resolved": "https://registry.npmjs.org/@eduardbar/drift/-/drift-0.9.1.tgz",
26
+ "integrity": "sha512-q7G95Ps/vTdCk2twnnglF5zR2YYqVd38teFLotEIxuAvVQcaTRMJ4cqaem+xZtmbVIgySPWgAnE8vQlPpGq1Eg==",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "commander": "^14.0.3",
30
+ "kleur": "^4.1.5",
31
+ "ts-morph": "^27.0.2"
32
+ },
33
+ "bin": {
34
+ "drift": "bin/drift.js"
35
+ }
36
+ },
37
+ "node_modules/@eduardbar/drift/node_modules/@ts-morph/common": {
38
+ "version": "0.28.1",
39
+ "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.28.1.tgz",
40
+ "integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==",
41
+ "license": "MIT",
42
+ "dependencies": {
43
+ "minimatch": "^10.0.1",
44
+ "path-browserify": "^1.0.1",
45
+ "tinyglobby": "^0.2.14"
46
+ }
47
+ },
48
+ "node_modules/@eduardbar/drift/node_modules/minimatch": {
49
+ "version": "10.2.3",
50
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz",
51
+ "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==",
52
+ "license": "BlueOak-1.0.0",
53
+ "dependencies": {
54
+ "brace-expansion": "^5.0.2"
55
+ },
56
+ "engines": {
57
+ "node": "18 || 20 || >=22"
58
+ },
59
+ "funding": {
60
+ "url": "https://github.com/sponsors/isaacs"
61
+ }
62
+ },
63
+ "node_modules/@eduardbar/drift/node_modules/ts-morph": {
64
+ "version": "27.0.2",
65
+ "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-27.0.2.tgz",
66
+ "integrity": "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==",
67
+ "license": "MIT",
68
+ "dependencies": {
69
+ "@ts-morph/common": "~0.28.1",
70
+ "code-block-writer": "^13.0.3"
71
+ }
72
+ },
73
+ "node_modules/@nodelib/fs.scandir": {
74
+ "version": "2.1.5",
75
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
76
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
77
+ "license": "MIT",
78
+ "dependencies": {
79
+ "@nodelib/fs.stat": "2.0.5",
80
+ "run-parallel": "^1.1.9"
81
+ },
82
+ "engines": {
83
+ "node": ">= 8"
84
+ }
85
+ },
86
+ "node_modules/@nodelib/fs.stat": {
87
+ "version": "2.0.5",
88
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
89
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
90
+ "license": "MIT",
91
+ "engines": {
92
+ "node": ">= 8"
93
+ }
94
+ },
95
+ "node_modules/@nodelib/fs.walk": {
96
+ "version": "1.2.8",
97
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
98
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
99
+ "license": "MIT",
100
+ "dependencies": {
101
+ "@nodelib/fs.scandir": "2.1.5",
102
+ "fastq": "^1.6.0"
103
+ },
104
+ "engines": {
105
+ "node": ">= 8"
106
+ }
107
+ },
108
+ "node_modules/@ts-morph/common": {
109
+ "version": "0.24.0",
110
+ "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.24.0.tgz",
111
+ "integrity": "sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==",
112
+ "license": "MIT",
113
+ "dependencies": {
114
+ "fast-glob": "^3.3.2",
115
+ "minimatch": "^9.0.4",
116
+ "mkdirp": "^3.0.1",
117
+ "path-browserify": "^1.0.1"
118
+ }
119
+ },
120
+ "node_modules/@types/node": {
121
+ "version": "20.19.33",
122
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz",
123
+ "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==",
124
+ "dev": true,
125
+ "license": "MIT",
126
+ "dependencies": {
127
+ "undici-types": "~6.21.0"
128
+ }
129
+ },
130
+ "node_modules/@types/vscode": {
131
+ "version": "1.109.0",
132
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.109.0.tgz",
133
+ "integrity": "sha512-0Pf95rnwEIwDbmXGC08r0B4TQhAbsHQ5UyTIgVgoieDe4cOnf92usuR5dEczb6bTKEp7ziZH4TV1TRGPPCExtw==",
134
+ "dev": true,
135
+ "license": "MIT"
136
+ },
137
+ "node_modules/balanced-match": {
138
+ "version": "4.0.4",
139
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
140
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
141
+ "license": "MIT",
142
+ "engines": {
143
+ "node": "18 || 20 || >=22"
144
+ }
145
+ },
146
+ "node_modules/brace-expansion": {
147
+ "version": "5.0.3",
148
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
149
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
150
+ "license": "MIT",
151
+ "dependencies": {
152
+ "balanced-match": "^4.0.2"
153
+ },
154
+ "engines": {
155
+ "node": "18 || 20 || >=22"
156
+ }
157
+ },
158
+ "node_modules/braces": {
159
+ "version": "3.0.3",
160
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
161
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
162
+ "license": "MIT",
163
+ "dependencies": {
164
+ "fill-range": "^7.1.1"
165
+ },
166
+ "engines": {
167
+ "node": ">=8"
168
+ }
169
+ },
170
+ "node_modules/code-block-writer": {
171
+ "version": "13.0.3",
172
+ "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz",
173
+ "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==",
174
+ "license": "MIT"
175
+ },
176
+ "node_modules/commander": {
177
+ "version": "14.0.3",
178
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
179
+ "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
180
+ "license": "MIT",
181
+ "engines": {
182
+ "node": ">=20"
183
+ }
184
+ },
185
+ "node_modules/fast-glob": {
186
+ "version": "3.3.3",
187
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
188
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
189
+ "license": "MIT",
190
+ "dependencies": {
191
+ "@nodelib/fs.stat": "^2.0.2",
192
+ "@nodelib/fs.walk": "^1.2.3",
193
+ "glob-parent": "^5.1.2",
194
+ "merge2": "^1.3.0",
195
+ "micromatch": "^4.0.8"
196
+ },
197
+ "engines": {
198
+ "node": ">=8.6.0"
199
+ }
200
+ },
201
+ "node_modules/fastq": {
202
+ "version": "1.20.1",
203
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
204
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
205
+ "license": "ISC",
206
+ "dependencies": {
207
+ "reusify": "^1.0.4"
208
+ }
209
+ },
210
+ "node_modules/fill-range": {
211
+ "version": "7.1.1",
212
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
213
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
214
+ "license": "MIT",
215
+ "dependencies": {
216
+ "to-regex-range": "^5.0.1"
217
+ },
218
+ "engines": {
219
+ "node": ">=8"
220
+ }
221
+ },
222
+ "node_modules/glob-parent": {
223
+ "version": "5.1.2",
224
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
225
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
226
+ "license": "ISC",
227
+ "dependencies": {
228
+ "is-glob": "^4.0.1"
229
+ },
230
+ "engines": {
231
+ "node": ">= 6"
232
+ }
233
+ },
234
+ "node_modules/is-extglob": {
235
+ "version": "2.1.1",
236
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
237
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
238
+ "license": "MIT",
239
+ "engines": {
240
+ "node": ">=0.10.0"
241
+ }
242
+ },
243
+ "node_modules/is-glob": {
244
+ "version": "4.0.3",
245
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
246
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
247
+ "license": "MIT",
248
+ "dependencies": {
249
+ "is-extglob": "^2.1.1"
250
+ },
251
+ "engines": {
252
+ "node": ">=0.10.0"
253
+ }
254
+ },
255
+ "node_modules/is-number": {
256
+ "version": "7.0.0",
257
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
258
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
259
+ "license": "MIT",
260
+ "engines": {
261
+ "node": ">=0.12.0"
262
+ }
263
+ },
264
+ "node_modules/kleur": {
265
+ "version": "4.1.5",
266
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
267
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
268
+ "license": "MIT",
269
+ "engines": {
270
+ "node": ">=6"
271
+ }
272
+ },
273
+ "node_modules/merge2": {
274
+ "version": "1.4.1",
275
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
276
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
277
+ "license": "MIT",
278
+ "engines": {
279
+ "node": ">= 8"
280
+ }
281
+ },
282
+ "node_modules/micromatch": {
283
+ "version": "4.0.8",
284
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
285
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
286
+ "license": "MIT",
287
+ "dependencies": {
288
+ "braces": "^3.0.3",
289
+ "picomatch": "^2.3.1"
290
+ },
291
+ "engines": {
292
+ "node": ">=8.6"
293
+ }
294
+ },
295
+ "node_modules/minimatch": {
296
+ "version": "9.0.7",
297
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz",
298
+ "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==",
299
+ "license": "ISC",
300
+ "dependencies": {
301
+ "brace-expansion": "^5.0.2"
302
+ },
303
+ "engines": {
304
+ "node": ">=16 || 14 >=14.17"
305
+ },
306
+ "funding": {
307
+ "url": "https://github.com/sponsors/isaacs"
308
+ }
309
+ },
310
+ "node_modules/mkdirp": {
311
+ "version": "3.0.1",
312
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
313
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
314
+ "license": "MIT",
315
+ "bin": {
316
+ "mkdirp": "dist/cjs/src/bin.js"
317
+ },
318
+ "engines": {
319
+ "node": ">=10"
320
+ },
321
+ "funding": {
322
+ "url": "https://github.com/sponsors/isaacs"
323
+ }
324
+ },
325
+ "node_modules/path-browserify": {
326
+ "version": "1.0.1",
327
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
328
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
329
+ "license": "MIT"
330
+ },
331
+ "node_modules/picomatch": {
332
+ "version": "2.3.1",
333
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
334
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
335
+ "license": "MIT",
336
+ "engines": {
337
+ "node": ">=8.6"
338
+ },
339
+ "funding": {
340
+ "url": "https://github.com/sponsors/jonschlinkert"
341
+ }
342
+ },
343
+ "node_modules/queue-microtask": {
344
+ "version": "1.2.3",
345
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
346
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
347
+ "funding": [
348
+ {
349
+ "type": "github",
350
+ "url": "https://github.com/sponsors/feross"
351
+ },
352
+ {
353
+ "type": "patreon",
354
+ "url": "https://www.patreon.com/feross"
355
+ },
356
+ {
357
+ "type": "consulting",
358
+ "url": "https://feross.org/support"
359
+ }
360
+ ],
361
+ "license": "MIT"
362
+ },
363
+ "node_modules/reusify": {
364
+ "version": "1.1.0",
365
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
366
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
367
+ "license": "MIT",
368
+ "engines": {
369
+ "iojs": ">=1.0.0",
370
+ "node": ">=0.10.0"
371
+ }
372
+ },
373
+ "node_modules/run-parallel": {
374
+ "version": "1.2.0",
375
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
376
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
377
+ "funding": [
378
+ {
379
+ "type": "github",
380
+ "url": "https://github.com/sponsors/feross"
381
+ },
382
+ {
383
+ "type": "patreon",
384
+ "url": "https://www.patreon.com/feross"
385
+ },
386
+ {
387
+ "type": "consulting",
388
+ "url": "https://feross.org/support"
389
+ }
390
+ ],
391
+ "license": "MIT",
392
+ "dependencies": {
393
+ "queue-microtask": "^1.2.2"
394
+ }
395
+ },
396
+ "node_modules/tinyglobby": {
397
+ "version": "0.2.15",
398
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
399
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
400
+ "license": "MIT",
401
+ "dependencies": {
402
+ "fdir": "^6.5.0",
403
+ "picomatch": "^4.0.3"
404
+ },
405
+ "engines": {
406
+ "node": ">=12.0.0"
407
+ },
408
+ "funding": {
409
+ "url": "https://github.com/sponsors/SuperchupuDev"
410
+ }
411
+ },
412
+ "node_modules/tinyglobby/node_modules/fdir": {
413
+ "version": "6.5.0",
414
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
415
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
416
+ "license": "MIT",
417
+ "engines": {
418
+ "node": ">=12.0.0"
419
+ },
420
+ "peerDependencies": {
421
+ "picomatch": "^3 || ^4"
422
+ },
423
+ "peerDependenciesMeta": {
424
+ "picomatch": {
425
+ "optional": true
426
+ }
427
+ }
428
+ },
429
+ "node_modules/tinyglobby/node_modules/picomatch": {
430
+ "version": "4.0.3",
431
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
432
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
433
+ "license": "MIT",
434
+ "engines": {
435
+ "node": ">=12"
436
+ },
437
+ "funding": {
438
+ "url": "https://github.com/sponsors/jonschlinkert"
439
+ }
440
+ },
441
+ "node_modules/to-regex-range": {
442
+ "version": "5.0.1",
443
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
444
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
445
+ "license": "MIT",
446
+ "dependencies": {
447
+ "is-number": "^7.0.0"
448
+ },
449
+ "engines": {
450
+ "node": ">=8.0"
451
+ }
452
+ },
453
+ "node_modules/ts-morph": {
454
+ "version": "23.0.0",
455
+ "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-23.0.0.tgz",
456
+ "integrity": "sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==",
457
+ "license": "MIT",
458
+ "dependencies": {
459
+ "@ts-morph/common": "~0.24.0",
460
+ "code-block-writer": "^13.0.1"
461
+ }
462
+ },
463
+ "node_modules/typescript": {
464
+ "version": "5.9.3",
465
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
466
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
467
+ "dev": true,
468
+ "license": "Apache-2.0",
469
+ "bin": {
470
+ "tsc": "bin/tsc",
471
+ "tsserver": "bin/tsserver"
472
+ },
473
+ "engines": {
474
+ "node": ">=14.17"
475
+ }
476
+ },
477
+ "node_modules/undici-types": {
478
+ "version": "6.21.0",
479
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
480
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
481
+ "dev": true,
482
+ "license": "MIT"
483
+ }
484
+ }
485
+ }
@@ -0,0 +1,119 @@
1
+ {
2
+ "name": "vscode-drift",
3
+ "displayName": "drift — Technical Debt Detector",
4
+ "description": "Detect technical debt in TypeScript & JavaScript. AST-based score 0–100: complexity, dead code, coupling, nesting and more.",
5
+ "version": "0.1.1",
6
+ "engines": {
7
+ "vscode": "^1.85.0"
8
+ },
9
+ "publisher": "eduardbar",
10
+ "license": "MIT",
11
+ "icon": "images/icon.png",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/eduardbar/drift"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/eduardbar/drift/issues"
18
+ },
19
+ "homepage": "https://github.com/eduardbar/drift#readme",
20
+ "qna": "https://github.com/eduardbar/drift/issues",
21
+ "categories": ["Linters", "Programming Languages"],
22
+ "keywords": [
23
+ "technical debt",
24
+ "debt",
25
+ "code quality",
26
+ "linter",
27
+ "typescript",
28
+ "javascript",
29
+ "complexity",
30
+ "dead code",
31
+ "coupling",
32
+ "nesting",
33
+ "score",
34
+ "refactor",
35
+ "analyzer",
36
+ "analysis",
37
+ "anti-patterns",
38
+ "ast",
39
+ "cyclomatic",
40
+ "any",
41
+ "console.log",
42
+ "catch",
43
+ "multi-root ready"
44
+ ],
45
+ "galleryBanner": {
46
+ "color": "#0a0a0f",
47
+ "theme": "dark"
48
+ },
49
+ "badges": [
50
+ {
51
+ "url": "https://img.shields.io/visual-studio-marketplace/v/eduardbar.vscode-drift?color=6366f1&label=version",
52
+ "href": "https://marketplace.visualstudio.com/items?itemName=eduardbar.vscode-drift",
53
+ "description": "Marketplace Version"
54
+ },
55
+ {
56
+ "url": "https://img.shields.io/visual-studio-marketplace/i/eduardbar.vscode-drift?color=8b5cf6&label=installs",
57
+ "href": "https://marketplace.visualstudio.com/items?itemName=eduardbar.vscode-drift",
58
+ "description": "Installs"
59
+ }
60
+ ],
61
+ "activationEvents": [
62
+ "onLanguage:typescript",
63
+ "onLanguage:typescriptreact",
64
+ "onLanguage:javascript",
65
+ "onLanguage:javascriptreact"
66
+ ],
67
+ "main": "./dist/extension.js",
68
+ "contributes": {
69
+ "views": {
70
+ "explorer": [
71
+ {
72
+ "id": "driftIssues",
73
+ "name": "Drift Issues",
74
+ "when": "workspaceFolderCount > 0"
75
+ }
76
+ ]
77
+ },
78
+ "commands": [
79
+ {
80
+ "command": "drift.scanWorkspace",
81
+ "title": "Drift: Scan Workspace"
82
+ },
83
+ {
84
+ "command": "drift.clearDiagnostics",
85
+ "title": "Drift: Clear Diagnostics"
86
+ }
87
+ ],
88
+ "configuration": {
89
+ "title": "Drift",
90
+ "properties": {
91
+ "drift.enable": {
92
+ "type": "boolean",
93
+ "default": true,
94
+ "description": "Enable drift analysis on save"
95
+ },
96
+ "drift.minSeverity": {
97
+ "type": "string",
98
+ "enum": ["error", "warning", "info"],
99
+ "default": "info",
100
+ "description": "Minimum severity level to show"
101
+ }
102
+ }
103
+ }
104
+ },
105
+ "scripts": {
106
+ "build": "tsc -p tsconfig.json",
107
+ "watch": "tsc -p tsconfig.json --watch",
108
+ "vscode:prepublish": "npm run build"
109
+ },
110
+ "devDependencies": {
111
+ "@types/vscode": "^1.85.0",
112
+ "@types/node": "^20.0.0",
113
+ "typescript": "^5.3.0"
114
+ },
115
+ "dependencies": {
116
+ "@eduardbar/drift": "1.0.0",
117
+ "ts-morph": "^23.0.0"
118
+ }
119
+ }
@@ -0,0 +1,40 @@
1
+ // drift-ignore-file
2
+
3
+ import { Project } from 'ts-morph'
4
+ import type { FileReport } from '@eduardbar/drift'
5
+
6
+ // Import dinámico para compatibilidad CommonJS -> ESM
7
+ // @eduardbar/drift es "type": "module" pero desde CommonJS
8
+ // se debe usar import() dinámico.
9
+ // _analyzeFile se tipea como `Function` para evitar el conflicto de
10
+ // instancias duplicadas de ts-morph (una en este paquete, otra en
11
+ // @eduardbar/drift/node_modules). En runtime son compatibles.
12
+ // eslint-disable-next-line @typescript-eslint/ban-types
13
+ let _analyzeFile: Function | null = null
14
+
15
+ async function getAnalyzeFile(): Promise<Function> {
16
+ if (!_analyzeFile) {
17
+ // drift es ES module, desde CommonJS usamos import() dinámico
18
+ const drift = await import('@eduardbar/drift')
19
+ _analyzeFile = drift.analyzeFile
20
+ }
21
+ return _analyzeFile!
22
+ }
23
+
24
+ export async function analyzeFilePath(filePath: string): Promise<FileReport | null> {
25
+ try {
26
+ const analyzeFile = await getAnalyzeFile()
27
+ const project = new Project({
28
+ compilerOptions: {
29
+ allowJs: true,
30
+ jsx: 1, // JsxEmit.Preserve
31
+ },
32
+ skipAddingFilesFromTsConfig: true,
33
+ })
34
+ const sourceFile = project.addSourceFileAtPath(filePath)
35
+ return analyzeFile(sourceFile) as FileReport
36
+ } catch (err) {
37
+ console.error('[drift] analyzeFilePath error:', err)
38
+ return null
39
+ }
40
+ }