@@ -3,6 +3,8 @@ import { describe, it } from "node:test";
3
3
import astGrep from "@ast-grep/napi" ;
4
4
import dedent from "dedent" ;
5
5
import { removeBinding } from "./remove-binding.ts" ;
6
+ import type Js from "@codemod.com/jssg-types/langs/javascript" ;
7
+ import type { SgNode } from "@codemod.com/jssg-types/main" ;
6
8
7
9
describe ( "remove-binding" , ( ) => {
8
10
it ( "should remove the entire require statement when the only imported binding is removed" , ( ) => {
@@ -11,7 +13,7 @@ describe("remove-binding", () => {
11
13
` ;
12
14
13
15
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
14
- const node = rootNode . root ( ) ;
16
+ const node = rootNode . root ( ) as SgNode < Js > ;
15
17
16
18
const requireStatement = node . find ( {
17
19
rule : {
@@ -35,7 +37,7 @@ describe("remove-binding", () => {
35
37
` ;
36
38
37
39
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
38
- const node = rootNode . root ( ) ;
40
+ const node = rootNode . root ( ) as SgNode < Js > ;
39
41
40
42
const requireStatement = node . find ( {
41
43
rule : {
@@ -55,7 +57,7 @@ describe("remove-binding", () => {
55
57
` ;
56
58
57
59
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
58
- const node = rootNode . root ( ) ;
60
+ const node = rootNode . root ( ) as SgNode < Js > ;
59
61
60
62
const importStatement = node . find ( {
61
63
rule : {
@@ -79,7 +81,7 @@ describe("remove-binding", () => {
79
81
` ;
80
82
81
83
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
82
- const node = rootNode . root ( ) ;
84
+ const node = rootNode . root ( ) as SgNode < Js > ;
83
85
84
86
const requireStatement = node . find ( {
85
87
rule : {
@@ -101,7 +103,7 @@ describe("remove-binding", () => {
101
103
` ;
102
104
103
105
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
104
- const node = rootNode . root ( ) ;
106
+ const node = rootNode . root ( ) as SgNode < Js > ;
105
107
106
108
const requireStatement = node . find ( {
107
109
rule : {
@@ -125,7 +127,7 @@ describe("remove-binding", () => {
125
127
` ;
126
128
127
129
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
128
- const node = rootNode . root ( ) ;
130
+ const node = rootNode . root ( ) as SgNode < Js > ;
129
131
130
132
const importStatement = node . find ( {
131
133
rule : {
@@ -149,7 +151,7 @@ describe("remove-binding", () => {
149
151
` ;
150
152
151
153
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
152
- const node = rootNode . root ( ) ;
154
+ const node = rootNode . root ( ) as SgNode < Js > ;
153
155
154
156
const importStatement = node . find ( {
155
157
rule : {
@@ -169,7 +171,7 @@ describe("remove-binding", () => {
169
171
` ;
170
172
171
173
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
172
- const node = rootNode . root ( ) ;
174
+ const node = rootNode . root ( ) as SgNode < Js > ;
173
175
174
176
const importStatement = node . find ( {
175
177
rule : {
@@ -193,7 +195,7 @@ describe("remove-binding", () => {
193
195
` ;
194
196
195
197
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
196
- const node = rootNode . root ( ) ;
198
+ const node = rootNode . root ( ) as SgNode < Js > ;
197
199
198
200
const importStatement = node . find ( {
199
201
rule : {
@@ -212,7 +214,7 @@ describe("remove-binding", () => {
212
214
` ;
213
215
214
216
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
215
- const node = rootNode . root ( ) ;
217
+ const node = rootNode . root ( ) as SgNode < Js > ;
216
218
217
219
const importStatement = node . find ( {
218
220
rule : {
@@ -236,7 +238,7 @@ describe("remove-binding", () => {
236
238
` ;
237
239
238
240
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
239
- const node = rootNode . root ( ) ;
241
+ const node = rootNode . root ( ) as SgNode < Js > ;
240
242
241
243
const importStatement = node . find ( {
242
244
rule : {
@@ -258,7 +260,7 @@ describe("remove-binding", () => {
258
260
` ;
259
261
260
262
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
261
- const node = rootNode . root ( ) ;
263
+ const node = rootNode . root ( ) as SgNode < Js > ;
262
264
263
265
const importStatement = node . find ( {
264
266
rule : {
@@ -277,7 +279,7 @@ describe("remove-binding", () => {
277
279
` ;
278
280
279
281
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
280
- const node = rootNode . root ( ) ;
282
+ const node = rootNode . root ( ) as SgNode < Js > ;
281
283
282
284
const importStatement = node . find ( {
283
285
rule : {
@@ -301,7 +303,7 @@ describe("remove-binding", () => {
301
303
` ;
302
304
303
305
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
304
- const node = rootNode . root ( ) ;
306
+ const node = rootNode . root ( ) as SgNode < Js > ;
305
307
306
308
const importStatement = node . find ( {
307
309
rule : {
@@ -323,7 +325,7 @@ describe("remove-binding", () => {
323
325
` ;
324
326
325
327
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
326
- const node = rootNode . root ( ) ;
328
+ const node = rootNode . root ( ) as SgNode < Js > ;
327
329
328
330
const importStatement = node . find ( {
329
331
rule : {
@@ -345,7 +347,7 @@ describe("remove-binding", () => {
345
347
` ;
346
348
347
349
const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
348
- const node = rootNode . root ( ) ;
350
+ const node = rootNode . root ( ) as SgNode < Js > ;
349
351
350
352
const importStatement = node . find ( {
351
353
rule : {
@@ -360,4 +362,68 @@ describe("remove-binding", () => {
360
362
assert . strictEqual ( change ?. lineToRemove , undefined ) ;
361
363
assert . strictEqual ( sourceCode , `const { types: { isMap } } = require("util");` ) ;
362
364
} ) ;
365
+
366
+ it ( "Should remove the line in member expression scenarios" , ( ) => {
367
+ const code = dedent `
368
+ const Buffer = require("buffer").Buffer;
369
+ ` ;
370
+
371
+ const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
372
+ const node = rootNode . root ( ) as SgNode < Js > ;
373
+
374
+ const importStatement = node . find ( {
375
+ rule : {
376
+ kind : "lexical_declaration" ,
377
+ } ,
378
+ } ) ;
379
+
380
+ const change = removeBinding ( importStatement ! , "Buffer" ) ;
381
+
382
+ assert . notEqual ( change , undefined ) ;
383
+ assert . strictEqual ( change ?. edit , undefined ) ;
384
+ assert . deepEqual ( change ?. lineToRemove , {
385
+ end : {
386
+ column : 40 ,
387
+ index : 40 ,
388
+ line : 0 ,
389
+ } ,
390
+ start : {
391
+ column : 0 ,
392
+ index : 0 ,
393
+ line : 0 ,
394
+ } ,
395
+ } ) ;
396
+ } ) ;
397
+
398
+ it ( "Should remove the line when the accessed property is different from the identifier" , ( ) => {
399
+ const code = dedent `
400
+ const Buffer = require("buffer").SlowBuffer
401
+ ` ;
402
+
403
+ const rootNode = astGrep . parse ( astGrep . Lang . JavaScript , code ) ;
404
+ const node = rootNode . root ( ) as SgNode < Js > ;
405
+
406
+ const importStatement = node . find ( {
407
+ rule : {
408
+ kind : "lexical_declaration" ,
409
+ } ,
410
+ } ) ;
411
+
412
+ const change = removeBinding ( importStatement ! , "Buffer" ) ;
413
+
414
+ assert . notEqual ( change , undefined ) ;
415
+ assert . strictEqual ( change ?. edit , undefined ) ;
416
+ assert . deepEqual ( change ?. lineToRemove , {
417
+ end : {
418
+ column : 43 ,
419
+ index : 43 ,
420
+ line : 0 ,
421
+ } ,
422
+ start : {
423
+ column : 0 ,
424
+ index : 0 ,
425
+ line : 0 ,
426
+ } ,
427
+ } ) ;
428
+ } ) ;
363
429
} ) ;
0 commit comments