Skip to content

Commit edb4e1d

Browse files
committed
rename to mxlint.io.*
1 parent cc11505 commit edb4e1d

2 files changed

Lines changed: 61 additions & 46 deletions

File tree

‎lint/lint_javascript.go‎

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ func resolvePath(pathArg string, workingDirectory string) (string, error) {
4545

4646
// setupJavascriptVM creates a new sobek VM with the mxlint object exposed.
4747
// The mxlint object provides utility functions for JavaScript rules:
48-
// - mxlint.readfile(path): Reads a file and returns its contents as a string.
48+
// - mxlint.io.readfile(path): Reads a file and returns its contents as a string.
4949
// The path is resolved relative to the workingDirectory.
50-
// - mxlint.listdir(path): Lists the contents of a directory and returns an array of filenames.
50+
// - mxlint.io.listdir(path): Lists the contents of a directory and returns an array of filenames.
5151
// The path is resolved relative to the workingDirectory.
52-
// - mxlint.isdir(path): Returns true if the path is a directory, false otherwise.
52+
// - mxlint.io.isdir(path): Returns true if the path is a directory, false otherwise.
5353
// The path is resolved relative to the workingDirectory.
5454
func setupJavascriptVM(workingDirectory string) *sobek.Runtime {
5555
vm := sobek.New()
@@ -58,16 +58,20 @@ func setupJavascriptVM(workingDirectory string) *sobek.Runtime {
5858
mxlint := vm.NewObject()
5959
vm.Set("mxlint", mxlint)
6060

61+
// Create the io sub-object
62+
io := vm.NewObject()
63+
mxlint.Set("io", io)
64+
6165
// Set the readfile function
62-
mxlint.Set("readfile", func(call sobek.FunctionCall) sobek.Value {
66+
io.Set("readfile", func(call sobek.FunctionCall) sobek.Value {
6367
if len(call.Arguments) == 0 {
64-
panic(vm.NewGoError(fmt.Errorf("mxlint.readfile requires a file path argument")))
68+
panic(vm.NewGoError(fmt.Errorf("mxlint.io.readfile requires a file path argument")))
6569
}
6670
filepathArg := call.Argument(0).String()
6771

6872
absPath, err := resolvePath(filepathArg, workingDirectory)
6973
if err != nil {
70-
panic(vm.NewGoError(fmt.Errorf("mxlint.readfile: %w", err)))
74+
panic(vm.NewGoError(fmt.Errorf("mxlint.io.readfile: %w", err)))
7175
}
7276

7377
content, err := os.ReadFile(absPath)
@@ -78,15 +82,15 @@ func setupJavascriptVM(workingDirectory string) *sobek.Runtime {
7882
})
7983

8084
// Set the listdir function
81-
mxlint.Set("listdir", func(call sobek.FunctionCall) sobek.Value {
85+
io.Set("listdir", func(call sobek.FunctionCall) sobek.Value {
8286
if len(call.Arguments) == 0 {
83-
panic(vm.NewGoError(fmt.Errorf("mxlint.listdir requires a directory path argument")))
87+
panic(vm.NewGoError(fmt.Errorf("mxlint.io.listdir requires a directory path argument")))
8488
}
8589
dirpathArg := call.Argument(0).String()
8690

8791
absPath, err := resolvePath(dirpathArg, workingDirectory)
8892
if err != nil {
89-
panic(vm.NewGoError(fmt.Errorf("mxlint.listdir: %w", err)))
93+
panic(vm.NewGoError(fmt.Errorf("mxlint.io.listdir: %w", err)))
9094
}
9195

9296
entries, err := os.ReadDir(absPath)
@@ -104,15 +108,15 @@ func setupJavascriptVM(workingDirectory string) *sobek.Runtime {
104108
})
105109

106110
// Set the isdir function
107-
mxlint.Set("isdir", func(call sobek.FunctionCall) sobek.Value {
111+
io.Set("isdir", func(call sobek.FunctionCall) sobek.Value {
108112
if len(call.Arguments) == 0 {
109-
panic(vm.NewGoError(fmt.Errorf("mxlint.isdir requires a path argument")))
113+
panic(vm.NewGoError(fmt.Errorf("mxlint.io.isdir requires a path argument")))
110114
}
111115
pathArg := call.Argument(0).String()
112116

113117
absPath, err := resolvePath(pathArg, workingDirectory)
114118
if err != nil {
115-
panic(vm.NewGoError(fmt.Errorf("mxlint.isdir: %w", err)))
119+
panic(vm.NewGoError(fmt.Errorf("mxlint.io.isdir: %w", err)))
116120
}
117121

118122
info, err := os.Stat(absPath)

‎lint/lint_javascript_test.go‎

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func TestSetupJavascriptVM_MxlintReadfile(t *testing.T) {
2121
t.Run("read file with relative path", func(t *testing.T) {
2222
vm := setupJavascriptVM(tempDir)
2323

24-
script := `mxlint.readfile("test.txt")`
24+
script := `mxlint.io.readfile("test.txt")`
2525
result, err := vm.RunString(script)
2626
if err != nil {
2727
t.Fatalf("Failed to run script: %v", err)
@@ -35,7 +35,7 @@ func TestSetupJavascriptVM_MxlintReadfile(t *testing.T) {
3535
t.Run("read file with absolute path", func(t *testing.T) {
3636
vm := setupJavascriptVM(tempDir)
3737

38-
script := `mxlint.readfile("` + testFilePath + `")`
38+
script := `mxlint.io.readfile("` + testFilePath + `")`
3939
result, err := vm.RunString(script)
4040
if err != nil {
4141
t.Fatalf("Failed to run script: %v", err)
@@ -51,7 +51,7 @@ func TestSetupJavascriptVM_MxlintReadfile(t *testing.T) {
5151

5252
script := `
5353
try {
54-
mxlint.readfile("nonexistent.txt");
54+
mxlint.io.readfile("nonexistent.txt");
5555
"no error";
5656
} catch (e) {
5757
"error: " + e.message;
@@ -72,7 +72,7 @@ func TestSetupJavascriptVM_MxlintReadfile(t *testing.T) {
7272

7373
script := `
7474
try {
75-
mxlint.readfile("../../../etc/passwd");
75+
mxlint.io.readfile("../../../etc/passwd");
7676
"no error";
7777
} catch (e) {
7878
e.message.includes("outside working directory") ? "blocked" : "other error: " + e.message;
@@ -93,7 +93,7 @@ func TestSetupJavascriptVM_MxlintReadfile(t *testing.T) {
9393

9494
script := `
9595
try {
96-
mxlint.readfile("/etc/passwd");
96+
mxlint.io.readfile("/etc/passwd");
9797
"no error";
9898
} catch (e) {
9999
e.message.includes("outside working directory") ? "blocked" : "other error: " + e.message;
@@ -114,7 +114,7 @@ func TestSetupJavascriptVM_MxlintReadfile(t *testing.T) {
114114

115115
script := `
116116
try {
117-
mxlint.readfile();
117+
mxlint.io.readfile();
118118
"no error";
119119
} catch (e) {
120120
"error: " + e.message;
@@ -147,7 +147,7 @@ func TestSetupJavascriptVM_MxlintReadfile(t *testing.T) {
147147

148148
vm := setupJavascriptVM(tempDir)
149149

150-
script := `mxlint.readfile("subdir/subfile.txt")`
150+
script := `mxlint.io.readfile("subdir/subfile.txt")`
151151
result, err := vm.RunString(script)
152152
if err != nil {
153153
t.Fatalf("Failed to run script: %v", err)
@@ -184,7 +184,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
184184
t.Run("list directory with relative path", func(t *testing.T) {
185185
vm := setupJavascriptVM(tempDir)
186186

187-
script := `JSON.stringify(mxlint.listdir(".").sort())`
187+
script := `JSON.stringify(mxlint.io.listdir(".").sort())`
188188
result, err := vm.RunString(script)
189189
if err != nil {
190190
t.Fatalf("Failed to run script: %v", err)
@@ -199,7 +199,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
199199
t.Run("list directory with absolute path", func(t *testing.T) {
200200
vm := setupJavascriptVM(tempDir)
201201

202-
script := `JSON.stringify(mxlint.listdir("` + tempDir + `").sort())`
202+
script := `JSON.stringify(mxlint.io.listdir("` + tempDir + `").sort())`
203203
result, err := vm.RunString(script)
204204
if err != nil {
205205
t.Fatalf("Failed to run script: %v", err)
@@ -214,7 +214,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
214214
t.Run("list subdirectory", func(t *testing.T) {
215215
vm := setupJavascriptVM(tempDir)
216216

217-
script := `JSON.stringify(mxlint.listdir("subdir"))`
217+
script := `JSON.stringify(mxlint.io.listdir("subdir"))`
218218
result, err := vm.RunString(script)
219219
if err != nil {
220220
t.Fatalf("Failed to run script: %v", err)
@@ -231,7 +231,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
231231

232232
script := `
233233
try {
234-
mxlint.listdir("nonexistent");
234+
mxlint.io.listdir("nonexistent");
235235
"no error";
236236
} catch (e) {
237237
"error: " + e.message;
@@ -252,7 +252,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
252252

253253
script := `
254254
try {
255-
mxlint.listdir("../../../etc");
255+
mxlint.io.listdir("../../../etc");
256256
"no error";
257257
} catch (e) {
258258
e.message.includes("outside working directory") ? "blocked" : "other error: " + e.message;
@@ -273,7 +273,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
273273

274274
script := `
275275
try {
276-
mxlint.listdir("/etc");
276+
mxlint.io.listdir("/etc");
277277
"no error";
278278
} catch (e) {
279279
e.message.includes("outside working directory") ? "blocked" : "other error: " + e.message;
@@ -294,7 +294,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
294294

295295
script := `
296296
try {
297-
mxlint.listdir();
297+
mxlint.io.listdir();
298298
"no error";
299299
} catch (e) {
300300
"error: " + e.message;
@@ -320,7 +320,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
320320

321321
vm := setupJavascriptVM(tempDir)
322322

323-
script := `JSON.stringify(mxlint.listdir("empty"))`
323+
script := `JSON.stringify(mxlint.io.listdir("empty"))`
324324
result, err := vm.RunString(script)
325325
if err != nil {
326326
t.Fatalf("Failed to run script: %v", err)
@@ -337,7 +337,7 @@ func TestSetupJavascriptVM_MxlintListdir(t *testing.T) {
337337

338338
script := `
339339
try {
340-
mxlint.listdir("file1.txt");
340+
mxlint.io.listdir("file1.txt");
341341
"no error";
342342
} catch (e) {
343343
e.message.includes("not a directory") ? "not a directory" : "error: " + e.message;
@@ -371,7 +371,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
371371
t.Run("isdir returns true for directory with relative path", func(t *testing.T) {
372372
vm := setupJavascriptVM(tempDir)
373373

374-
script := `mxlint.isdir("subdir")`
374+
script := `mxlint.io.isdir("subdir")`
375375
result, err := vm.RunString(script)
376376
if err != nil {
377377
t.Fatalf("Failed to run script: %v", err)
@@ -385,7 +385,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
385385
t.Run("isdir returns true for directory with absolute path", func(t *testing.T) {
386386
vm := setupJavascriptVM(tempDir)
387387

388-
script := `mxlint.isdir("` + filepath.Join(tempDir, "subdir") + `")`
388+
script := `mxlint.io.isdir("` + filepath.Join(tempDir, "subdir") + `")`
389389
result, err := vm.RunString(script)
390390
if err != nil {
391391
t.Fatalf("Failed to run script: %v", err)
@@ -399,7 +399,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
399399
t.Run("isdir returns false for file", func(t *testing.T) {
400400
vm := setupJavascriptVM(tempDir)
401401

402-
script := `mxlint.isdir("file.txt")`
402+
script := `mxlint.io.isdir("file.txt")`
403403
result, err := vm.RunString(script)
404404
if err != nil {
405405
t.Fatalf("Failed to run script: %v", err)
@@ -413,7 +413,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
413413
t.Run("isdir returns false for nonexistent path", func(t *testing.T) {
414414
vm := setupJavascriptVM(tempDir)
415415

416-
script := `mxlint.isdir("nonexistent")`
416+
script := `mxlint.io.isdir("nonexistent")`
417417
result, err := vm.RunString(script)
418418
if err != nil {
419419
t.Fatalf("Failed to run script: %v", err)
@@ -427,7 +427,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
427427
t.Run("isdir returns true for current directory", func(t *testing.T) {
428428
vm := setupJavascriptVM(tempDir)
429429

430-
script := `mxlint.isdir(".")`
430+
script := `mxlint.io.isdir(".")`
431431
result, err := vm.RunString(script)
432432
if err != nil {
433433
t.Fatalf("Failed to run script: %v", err)
@@ -443,7 +443,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
443443

444444
script := `
445445
try {
446-
mxlint.isdir("../../../etc");
446+
mxlint.io.isdir("../../../etc");
447447
"no error";
448448
} catch (e) {
449449
e.message.includes("outside working directory") ? "blocked" : "other error: " + e.message;
@@ -464,7 +464,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
464464

465465
script := `
466466
try {
467-
mxlint.isdir("/etc");
467+
mxlint.io.isdir("/etc");
468468
"no error";
469469
} catch (e) {
470470
e.message.includes("outside working directory") ? "blocked" : "other error: " + e.message;
@@ -485,7 +485,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
485485

486486
script := `
487487
try {
488-
mxlint.isdir();
488+
mxlint.io.isdir();
489489
"no error";
490490
} catch (e) {
491491
"error: " + e.message;
@@ -511,7 +511,7 @@ func TestSetupJavascriptVM_MxlintIsdir(t *testing.T) {
511511

512512
vm := setupJavascriptVM(tempDir)
513513

514-
script := `mxlint.isdir("subdir/nested")`
514+
script := `mxlint.io.isdir("subdir/nested")`
515515
result, err := vm.RunString(script)
516516
if err != nil {
517517
t.Fatalf("Failed to run script: %v", err)
@@ -537,36 +537,47 @@ func TestMxlintObjectAvailable(t *testing.T) {
537537
t.Errorf("Expected mxlint to be an object, got %q", result.String())
538538
}
539539

540-
// Check that mxlint.readfile is a function
541-
script = `typeof mxlint.readfile`
540+
// Check that mxlint.io is an object
541+
script = `typeof mxlint.io`
542+
result, err = vm.RunString(script)
543+
if err != nil {
544+
t.Fatalf("Failed to run script: %v", err)
545+
}
546+
547+
if result.String() != "object" {
548+
t.Errorf("Expected mxlint.io to be an object, got %q", result.String())
549+
}
550+
551+
// Check that mxlint.io.readfile is a function
552+
script = `typeof mxlint.io.readfile`
542553
result, err = vm.RunString(script)
543554
if err != nil {
544555
t.Fatalf("Failed to run script: %v", err)
545556
}
546557

547558
if result.String() != "function" {
548-
t.Errorf("Expected mxlint.readfile to be a function, got %q", result.String())
559+
t.Errorf("Expected mxlint.io.readfile to be a function, got %q", result.String())
549560
}
550561

551-
// Check that mxlint.listdir is a function
552-
script = `typeof mxlint.listdir`
562+
// Check that mxlint.io.listdir is a function
563+
script = `typeof mxlint.io.listdir`
553564
result, err = vm.RunString(script)
554565
if err != nil {
555566
t.Fatalf("Failed to run script: %v", err)
556567
}
557568

558569
if result.String() != "function" {
559-
t.Errorf("Expected mxlint.listdir to be a function, got %q", result.String())
570+
t.Errorf("Expected mxlint.io.listdir to be a function, got %q", result.String())
560571
}
561572

562-
// Check that mxlint.isdir is a function
563-
script = `typeof mxlint.isdir`
573+
// Check that mxlint.io.isdir is a function
574+
script = `typeof mxlint.io.isdir`
564575
result, err = vm.RunString(script)
565576
if err != nil {
566577
t.Fatalf("Failed to run script: %v", err)
567578
}
568579

569580
if result.String() != "function" {
570-
t.Errorf("Expected mxlint.isdir to be a function, got %q", result.String())
581+
t.Errorf("Expected mxlint.io.isdir to be a function, got %q", result.String())
571582
}
572583
}

0 commit comments

Comments
 (0)