Skip to content
This repository was archived by the owner on Oct 18, 2023. It is now read-only.

Commit 8f30d09

Browse files
mshimaprivatenumber
andcommitted
fix: provide file path to dynamic import transform (#33)
BREAKING CHANGE: transformDynamicImport now requires file path Co-authored-by: Hiroki Osame <hiroki.osame@gmail.com>
1 parent e400bd8 commit 8f30d09

File tree

3 files changed

+34
-22
lines changed

3 files changed

+34
-22
lines changed

src/transform/apply-transformers.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ type TransformerResult = Transformed | undefined;
1818

1919
type Transformer<
2020
Result extends MaybePromise<TransformerResult>
21-
> = (code: string) => Result;
21+
> = (
22+
code: string,
23+
filename: string,
24+
) => Result;
2225

2326
type Results<
2427
Array_ extends Transformer<MaybePromise<TransformerResult>>[]
@@ -35,6 +38,7 @@ type AddSourceMap<T> = Omit<T, 'map'> & { map: string };
3538
export function applyTransformersSync<
3639
T extends Readonly<Transformer<TransformerResult>[]>,
3740
>(
41+
filename: string,
3842
code: string,
3943
transformers: T,
4044
) {
@@ -45,7 +49,7 @@ export function applyTransformersSync<
4549
};
4650

4751
for (const transformer of transformers) {
48-
const transformed = transformer(result.code);
52+
const transformed = transformer(filename, result.code);
4953

5054
if (transformed) {
5155
Object.assign(result, transformed);
@@ -65,6 +69,7 @@ export function applyTransformersSync<
6569
export async function applyTransformers<
6670
T extends Readonly<Transformer<MaybePromise<TransformerResult>>[]>,
6771
>(
72+
filename: string,
6873
code: string,
6974
transformers: T,
7075
) {
@@ -75,7 +80,7 @@ export async function applyTransformers<
7580
};
7681

7782
for (const transformer of transformers) {
78-
const transformed = await transformer(result.code);
83+
const transformed = await transformer(filename, result.code);
7984

8085
if (transformed) {
8186
Object.assign(result, transformed);

src/transform/index.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,11 @@ export function transformSync(
4545
}
4646

4747
const transformed = applyTransformersSync(
48+
filePath,
4849
code,
4950
[
5051
// eslint-disable-next-line @typescript-eslint/no-shadow
51-
(code) => {
52+
(filePath, code) => {
5253
// eslint-disable-next-line @typescript-eslint/no-shadow
5354
const transformed = esbuildTransformSync(code, esbuildOptions);
5455
if (esbuildOptions.sourcefile !== filePath) {
@@ -90,18 +91,22 @@ export async function transform(
9091
return cacheHit;
9192
}
9293

93-
const transformed = await applyTransformers(code, [
94-
// eslint-disable-next-line @typescript-eslint/no-shadow
95-
async (code) => {
94+
const transformed = await applyTransformers(
95+
filePath,
96+
code,
97+
[
9698
// eslint-disable-next-line @typescript-eslint/no-shadow
97-
const transformed = await esbuildTransform(code, esbuildOptions);
98-
if (esbuildOptions.sourcefile !== filePath) {
99-
transformed.map = transformed.map.replace(`"${esbuildOptions.sourcefile}"`, `"${filePath}"`);
100-
}
101-
return transformed;
102-
},
103-
transformDynamicImport,
104-
] as const);
99+
async (filePath, code) => {
100+
// eslint-disable-next-line @typescript-eslint/no-shadow
101+
const transformed = await esbuildTransform(code, esbuildOptions);
102+
if (esbuildOptions.sourcefile !== filePath) {
103+
transformed.map = transformed.map.replace(`"${esbuildOptions.sourcefile}"`, `"${filePath}"`);
104+
}
105+
return transformed;
106+
},
107+
transformDynamicImport,
108+
] as const,
109+
);
105110

106111
if (transformed.warnings.length > 0) {
107112
const { warnings } = transformed;

src/transform/transform-dynamic-import.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,31 @@ const checkEsModule = `.then((mod)=>{
1616
})`.replace(/[\n\t]+/g, '');
1717

1818
export function transformDynamicImport(
19+
filename: string,
1920
code: string,
2021
) {
2122
// Naive check
2223
if (!code.includes('import')) {
2324
return;
2425
}
2526

26-
const [imports] = parseEsm(code);
27+
const dynamicImports = parseEsm(code)[0].filter(maybeDynamic => maybeDynamic.d > -1);
2728

28-
if (imports.length === 0) {
29+
if (dynamicImports.length === 0) {
2930
return;
3031
}
3132

3233
const magicString = new MagicString(code);
3334

34-
for (const dynamicImport of imports) {
35-
if (dynamicImport.d > -1) {
36-
magicString.appendRight(dynamicImport.se, checkEsModule);
37-
}
35+
for (const dynamicImport of dynamicImports) {
36+
magicString.appendRight(dynamicImport.se, checkEsModule);
3837
}
3938

4039
return {
4140
code: magicString.toString(),
42-
map: magicString.generateMap({ hires: true }) as EncodedSourceMap,
41+
map: magicString.generateMap({
42+
source: filename,
43+
hires: true,
44+
}) as EncodedSourceMap,
4345
};
4446
}

0 commit comments

Comments
 (0)