Skip to content

Commit 0d487ca

Browse files
committed
fix: support template literals in require
fixes #20
1 parent c7a71cd commit 0d487ca

File tree

3 files changed

+61
-9
lines changed

3 files changed

+61
-9
lines changed

src/__snapshots__/parsing.test.ts.snap

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,3 +593,39 @@ exports[`extract > extracts ts import mangled 1`] = `
593593
},
594594
]
595595
`;
596+
597+
exports[`extract > works with string literals 1`] = `
598+
[
599+
{
600+
"children": [
601+
{
602+
"children": [],
603+
"fn": "it",
604+
"location": SourceLocation {
605+
"end": Position {
606+
"column": 35,
607+
"line": 5,
608+
},
609+
"start": Position {
610+
"column": 8,
611+
"line": 5,
612+
},
613+
},
614+
"name": "addition",
615+
},
616+
],
617+
"fn": "describe",
618+
"location": SourceLocation {
619+
"end": Position {
620+
"column": 8,
621+
"line": 6,
622+
},
623+
"start": Position {
624+
"column": 6,
625+
"line": 4,
626+
},
627+
},
628+
"name": "math",
629+
},
630+
]
631+
`;

src/parsing.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,16 @@ const node_test_1 = require("node:test");
101101

102102
expect(parseSource(src)).toMatchSnapshot();
103103
});
104+
105+
it("works with string literals", () => {
106+
const src = `
107+
const nt = require(\`node:test\`);
108+
109+
nt.describe(\`math\`, () => {
110+
nt.it(\`addition\`, () => {});
111+
});
112+
`;
113+
114+
expect(parseSource(src)).toMatchSnapshot();
115+
});
104116
});

src/parsing.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ const matchNamespaced =
5656
: undefined;
5757
};
5858

59+
const getStringish = (nameArg: Node | undefined): string | undefined => {
60+
if (nameArg?.type === C.Literal && typeof nameArg.value === "string") {
61+
return nameArg.value;
62+
}
63+
if (nameArg?.type === C.TemplateLiteral && nameArg.quasis.length === 1) {
64+
return nameArg.quasis[0].value.cooked || nameArg.quasis[0].value.raw;
65+
}
66+
};
67+
5968
export interface IParsedNode {
6069
fn: string;
6170
name: string;
@@ -91,8 +100,8 @@ export const parseSource = (text: string) => {
91100
node.init.callee.type === C.Identifier &&
92101
node.init.callee.name === "require"
93102
) {
94-
const firstArg = node.init.arguments[0];
95-
if (firstArg?.type === C.Literal && firstArg.value === C.NodeTest) {
103+
const firstArg = getStringish(node.init.arguments[0]);
104+
if (firstArg === C.NodeTest) {
96105
if (node.id.type === C.ObjectPattern) {
97106
for (const prop of node.id.properties) {
98107
if (
@@ -108,13 +117,8 @@ export const parseSource = (text: string) => {
108117
}
109118
}
110119
} else if (node.type === C.CallExpression) {
111-
const nameArg = node.arguments[0];
112-
let name: string;
113-
if (nameArg?.type === C.Literal && typeof nameArg.value === "string") {
114-
name = nameArg.value;
115-
} else if (nameArg?.type === C.TemplateLiteral && nameArg.quasis.length === 1) {
116-
name = nameArg.quasis[0].value.cooked || nameArg.quasis[0].value.raw;
117-
} else {
120+
const name = getStringish(node.arguments[0]);
121+
if (name === undefined) {
118122
return;
119123
}
120124

0 commit comments

Comments
 (0)