70bf21e064
Deploy (to testing) and Test Playground Preview Worker / Deploy Playground Preview Worker (testing) (push) Has been skipped
Deploy Workers Shared Staging / Deploy Workers Shared Staging (push) Failing after 0s
Prerelease / build (push) Has been skipped
Handle Changesets / Handle Changesets (push) Has been cancelled
Semgrep OSS scan / semgrep-oss (push) Has been cancelled
130 lines
4.5 KiB
JavaScript
130 lines
4.5 KiB
JavaScript
import { RuleTester } from "eslint";
|
|
import rule from "../no-direct-recursive-rm.mjs";
|
|
|
|
const ruleTester = new RuleTester({
|
|
languageOptions: { ecmaVersion: 2022, sourceType: "module" },
|
|
});
|
|
|
|
ruleTester.run("no-direct-recursive-rm", rule, {
|
|
valid: [
|
|
// Single file removal (no recursive option) — should be allowed
|
|
{
|
|
code: 'import fs from "node:fs"; fs.rmSync("file.txt");',
|
|
},
|
|
{
|
|
code: 'import fs from "node:fs"; fs.rmSync("file.txt", { force: true });',
|
|
},
|
|
{
|
|
code: 'import fs from "node:fs/promises"; await fs.rm("file.txt");',
|
|
},
|
|
{
|
|
code: 'import fs from "node:fs/promises"; await fs.rm("file.txt", { force: true });',
|
|
},
|
|
// Named import without recursive
|
|
{
|
|
code: 'import { rmSync } from "node:fs"; rmSync("file.txt");',
|
|
},
|
|
{
|
|
code: 'import { rm } from "node:fs/promises"; await rm("file.txt", { force: true });',
|
|
},
|
|
// Named import rm from "node:fs" (callback-based) without recursive
|
|
{
|
|
code: 'import { rm } from "node:fs"; rm("file.txt", (err) => {});',
|
|
},
|
|
// Using the correct helpers
|
|
{
|
|
code: 'import { removeDir } from "@cloudflare/workers-utils"; await removeDir("dir");',
|
|
},
|
|
{
|
|
code: 'import { removeDirSync } from "@cloudflare/workers-utils"; removeDirSync("dir");',
|
|
},
|
|
// recursive: false is fine
|
|
{
|
|
code: 'import fs from "node:fs"; fs.rmSync("dir", { recursive: false });',
|
|
},
|
|
// Unrelated function called rm
|
|
{
|
|
code: 'function rm(path, opts) {} rm("dir", { recursive: true });',
|
|
},
|
|
// CommonJS single file removal
|
|
{
|
|
code: 'const fs = require("node:fs"); fs.rmSync("file.txt");',
|
|
},
|
|
{
|
|
code: 'const fs = require("node:fs/promises"); fs.rm("file.txt", { force: true });',
|
|
},
|
|
],
|
|
|
|
invalid: [
|
|
// Default import from "node:fs" — fs.rmSync with recursive
|
|
{
|
|
code: 'import fs from "node:fs"; fs.rmSync("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Namespace import from "node:fs" — fs.rmSync with recursive
|
|
{
|
|
code: 'import * as fs from "node:fs"; fs.rmSync("dir", { recursive: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Named import from "node:fs" — rmSync with recursive
|
|
{
|
|
code: 'import { rmSync } from "node:fs"; rmSync("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Default import from "node:fs/promises" — fs.rm with recursive
|
|
{
|
|
code: 'import fs from "node:fs/promises"; await fs.rm("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Named import from "node:fs/promises" — rm with recursive
|
|
{
|
|
code: 'import { rm } from "node:fs/promises"; await rm("dir", { recursive: true, maxRetries: 10 });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// fs.promises.rm pattern
|
|
{
|
|
code: 'import fs from "node:fs"; fs.promises.rm("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Without "node:" prefix
|
|
{
|
|
code: 'import fs from "fs"; fs.rmSync("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
{
|
|
code: 'import fs from "fs/promises"; await fs.rm("dir", { force: true, recursive: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// CommonJS require — default
|
|
{
|
|
code: 'const fs = require("node:fs"); fs.rmSync("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// CommonJS require — promises
|
|
{
|
|
code: 'const fs = require("node:fs/promises"); fs.rm("dir", { recursive: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// CommonJS require — fs.promises.rm
|
|
{
|
|
code: 'const fs = require("node:fs"); fs.promises.rm("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Callback-based fs.rm from "node:fs" with recursive in second arg
|
|
{
|
|
code: 'import fs from "node:fs"; fs.rm("dir", { recursive: true, force: true }, (err) => {});',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Named import rm from "node:fs" (callback-based) with recursive
|
|
{
|
|
code: 'import { rm } from "node:fs"; rm("dir", { recursive: true, force: true }, (err) => {});',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
// Named import rm from "node:fs" with recursive (no callback)
|
|
{
|
|
code: 'import { rm } from "node:fs"; rm("dir", { recursive: true, force: true });',
|
|
errors: [{ messageId: "noDirectRecursiveRm" }],
|
|
},
|
|
],
|
|
});
|