From d0870dd3bdf939d03d577355de8f56583c8be403 Mon Sep 17 00:00:00 2001 From: EGOIST <0x142857@gmail.com> Date: Mon, 29 Nov 2021 20:01:11 +0800 Subject: [PATCH] fix: shim `__dirname`, `__filename` in esm bundle --- assets/cjs_shims.js | 4 +++- assets/esm_shims.js | 8 ++++++++ src/esbuild/index.ts | 1 + test/index.test.ts | 15 +++++++++++++++ test/snapshots/index.test.ts.md | 21 ++++++++++++++++++++- test/snapshots/index.test.ts.snap | Bin 2398 -> 2493 bytes 6 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 assets/esm_shims.js diff --git a/assets/cjs_shims.js b/assets/cjs_shims.js index 425493c6..a2056370 100644 --- a/assets/cjs_shims.js +++ b/assets/cjs_shims.js @@ -1,5 +1,7 @@ +// Shim globals in cjs bundle + export const importMetaUrlShim = typeof document === 'undefined' - ? new (require('u' + 'rl').URL)('file:' + __filename).href + ? new URL('file:' + __filename).href : (document.currentScript && document.currentScript.src) || new URL('main.js', document.baseURI).href diff --git a/assets/esm_shims.js b/assets/esm_shims.js new file mode 100644 index 00000000..6749c80c --- /dev/null +++ b/assets/esm_shims.js @@ -0,0 +1,8 @@ +// Shim globals in esm bundle +import { fileURLToPath } from 'url' +import path from 'path' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +export { __dirname, __filename } diff --git a/src/esbuild/index.ts b/src/esbuild/index.ts index 5f327e84..5edddb9a 100644 --- a/src/esbuild/index.ts +++ b/src/esbuild/index.ts @@ -172,6 +172,7 @@ export async function runEsbuild( }, inject: [ format === 'cjs' ? path.join(__dirname, '../assets/cjs_shims.js') : '', + format === 'esm' ? path.join(__dirname, '../assets/esm_shims.js') : '', ...(options.inject || []), ].filter(Boolean), outdir: diff --git a/test/index.test.ts b/test/index.test.ts index f62f36f8..56dbc924 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -517,6 +517,21 @@ test(`transform import.meta.url in cjs format`, async (t) => { t.snapshot(await getFileContent('dist/input.js')) }) +test(`transform __dirname, __filename in esm format`, async (t) => { + const { getFileContent } = await run( + t.title, + { + 'input.ts': `export const a = __dirname + export const b = __filename + `, + }, + { + flags: ['--format', 'esm'], + } + ) + t.snapshot(await getFileContent('dist/input.mjs')) +}) + test('debounce promise', async (t) => { try { const equal = (a: T, b: T) => { diff --git a/test/snapshots/index.test.ts.md b/test/snapshots/index.test.ts.md index 0ce30859..50f38890 100644 --- a/test/snapshots/index.test.ts.md +++ b/test/snapshots/index.test.ts.md @@ -393,7 +393,7 @@ Generated by [AVA](https://avajs.dev). });␊ ␊ // ../../../assets/cjs_shims.js␊ - var importMetaUrlShim = typeof document === "undefined" ? new (require("url")).URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;␊ + var importMetaUrlShim = typeof document === "undefined" ? new URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;␊ ␊ // input.ts␊ var input_default = importMetaUrlShim;␊ @@ -401,6 +401,25 @@ Generated by [AVA](https://avajs.dev). 0 && (module.exports = {});␊ ` +## transform __dirname, __filename in esm format + +> Snapshot 1 + + `// ../../../assets/esm_shims.js␊ + import { fileURLToPath } from "url";␊ + import path from "path";␊ + var __filename = fileURLToPath(import.meta.url);␊ + var __dirname = path.dirname(__filename);␊ + ␊ + // input.ts␊ + var a = __dirname;␊ + var b = __filename;␊ + export {␊ + a,␊ + b␊ + };␊ + ` + ## code splitting in cjs format > Snapshot 1 diff --git a/test/snapshots/index.test.ts.snap b/test/snapshots/index.test.ts.snap index 58295ad3a54356001464f3fb791869e4fe2422fb..e592c402f92dc7c492c3567beac980f4d60504fc 100644 GIT binary patch literal 2493 zcmV;u2}1TkRzVfy+q*65(Z8MW4|o8?W%A65KQNN!#s zE_DD{=O2p*00000000B+TFr0V#ub-bHx2d{^xDISDJ-tK%a!cdK&7ry)p3eCQ7uST zVZ#VE6gkvVB4@Uop)6&yhxjjO4>|P|qo*4 z;h*L2FTHc?_N_BNBcoABqrHqz$dEiaI-!B|pdn@y+h`^)wmOGQ%Yi{*r1)XXo4iD0laJ?-3x5^q(>;rQ=0ilNmZ@cR;M!B~k@bd)3xk^_>Ju;0Q6oWD%&QStt36HiL=IX$!(-;S-YGQz{!nK9OJB)GZ zOG@OJl7~D^IeUCS41_o-p>TP0uuH)H*a*Nd9@5RuI=OR)xT(U?GgE;Prl_lNnsb*j z1cUVZp%nd$3Z9%%B~eUh5Jz!9w17FkdiML8TfJH`I<1i?<0)A^%jqi2S6)mg*#(R4 z)8FQCM#G;y?UDVDU@r4!6Wi?8x(tV9wd24HNiHyLkgC?I5;)U+ntUXXj&6X zX2qmVsJKtGBeX=rpK5CV;TuIml(Rs_oRwiQB^i}@#{T!zN@26hEk6qvGDll=rq^f*prh0BBFfDZOU#AkJ zlN6Fc47nWzroI&OUcLO6npgjMd6DCBTN9s!WO91! zsYDu!OVjcFss}8uHrE+54Vydlz~#8_&W-yrmSd98V?VecJeMG9;dXDT+eK;2;^<=D zss2;5??0AMvuxOIRqT^PKHSb+-m95ws*Sa>4nrap9Rfwv9d1vh%ez~ky~Z9DkGjat zdQ*fqdci*FRd7WKvn^VHH-!Yg>4KmfBo`?@ce_)avQ>hgt>3xRz+i}smHD6a`;?uL zDDjV5ocy0P5dOMw^6NP{AZ*8k0OGXJ9OQISIh418Lz+#cWBJ>n9*B#e*O6*Q zeE~g<=wER|?L$qsatqK{eCNqo*`|^qd2nl z%mTrdblWXdYRSCnL_uYy5vG|@B$Rcv2=C|am zx7KSpYvrv)&iZz8)_1WKSY*>hHhnX)X?q=eio=h!edW`8gG!} z8F6Hecq$1yQiox!$r^Ss-8wN0cL_1{C}Nz6%H?`~VgULKViwYKyHG#_R^IS)lO=Zv zj6tJz-f=&Sg>vEmt70)pVku*GOe9BxW0?#olr#m;Z&Ygw(6Upt;+$3+ckdMnq(?am zVR&&y6InS`d8Ic2&)@!IZDsrN?ZwKrSlJdU+hS#V6IZsK$;2uGk8|HPq0Q5Ivbqw* zOz#RVS&lTrz*4EDsW_?A5RanFKTau=ZXnOKqoaq5iO;r5Giv`2iZ44v5un}Idre(D z3Yi@Qc42%Va=Kd;7Ei)P<{<}ChB5r z@b^ydeP#!l_0&&V<}DVCc~+|3HbBe-*Qb88A6mw zKN!Q>TWX4_qiinnLE8j0na0Q}tiPYll(PWDSZj=Fl5n%wIy#2ItDr}LT6`34N13oo)9A|O+0$A@^x3GlAb-4c1-?+0@HHLC_*N5$2n0%Vm~-*W%~z zi>qBXc(u#(2Kq0oR8)!q7-l5KaVo%JDh1Il*baQ_0D1riQ`Cn%$Wv8sV2KS|PGykL zf%=cpm*jB&W7y@#pt(bS0#n9EoK@EwXEcI}&+>ago@MZRptgh;+)wM5u>qbCXWIBBLMV-j^wJ1fey0{8x0YKB3H+rY zjgkX`)Y zc0F)W=IYMoU|zX*(fi{w9)|=<#}-1PRh`c91~7R4aOd#x$G`mGImTL79m5$T2v6%4 z;UzK)>3$8;hu;-QeF*6>&HDe3&|2?a*DJBF_L&$F=0;O-&k0gsb}`{l*9-FQy^RNR zXMfKg)RuO)ZE4?VS=M!p%%N70=Dalo3}0WNT+oNQ>IAnc7n=*YLdk`uitPUa#un0z H3oZZv{5;T8 literal 2398 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