diff --git a/src/core/transpile.ts b/src/core/transpile.ts index 7ccba0f..3a55a00 100644 --- a/src/core/transpile.ts +++ b/src/core/transpile.ts @@ -1,8 +1,5 @@ import { transpile as tsTranspile } from "typescript"; - -function removeImports(code: string) { - return code.replace(/^import\s.+\sfrom\s.+;?$/gm, "").trim(); -} +import removeImports from "~/utils/removeImports"; function fixExports(code: string) { const validMethods = ["GET", "POST", "PUT", "PATCH", "DELETE"]; diff --git a/src/utils/removeImports.test.ts b/src/utils/removeImports.test.ts new file mode 100644 index 0000000..76ccddc --- /dev/null +++ b/src/utils/removeImports.test.ts @@ -0,0 +1,78 @@ +import { describe, expect, it } from "@jest/globals"; +import removeImports from "./removeImports"; + +describe("removeImports", () => { + it("removes a default import", () => { + const code = 'import defaultExport from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a namespace import", () => { + const code = 'import * as name from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a named import", () => { + const code = 'import { export1 } from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a named import with alias", () => { + const code = 'import { export1 as alias1 } from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a default import with alias", () => { + const code = 'import { default as alias } from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes multiple named imports", () => { + const code = 'import { export1, export2 } from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes multiple named imports with alias", () => { + const code = 'import { export1, export2 as alias2 } from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a named import with a string alias", () => { + const code = 'import { "string name" as alias } from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a combined default and named import", () => { + const code = 'import defaultExport, { export1 } from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a combined default and namespace import", () => { + const code = 'import defaultExport, * as name from "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a side-effect only import", () => { + const code = 'import "module-name";'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a default import with single quotes", () => { + const code = "import defaultExport from 'module-name';"; + expect(removeImports(code)).toBe(""); + }); + + it("removes a default import missing semicolon", () => { + const code = 'import defaultExport from "module-name"'; + expect(removeImports(code)).toBe(""); + }); + + it("removes a multiline named import", () => { + const code = [ + "import {", + " myAwesomeFunction", + '} from "my-awesome-module";', + ]; + expect(removeImports(code.join("\n"))).toBe(""); + }); +}); diff --git a/src/utils/removeImports.ts b/src/utils/removeImports.ts new file mode 100644 index 0000000..5c069e0 --- /dev/null +++ b/src/utils/removeImports.ts @@ -0,0 +1,6 @@ +export default function removeImports(code: string) { + return code + .replace(/(^import\s+[^;]+;?$|^import\s+[^;]*\sfrom\s.+;?$)/gm, "") // matches single-line imports and side-effect imports + .replace(/(^import\s+{[\s\S]+?}\s+from\s+["'][^"']+["'];?)/gm, "") // matches multiline named imports + .trim(); +}