From e7ae340c5b2983a9866162b9bb2bccc11dc8cc0c Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Fri, 10 Jan 2025 18:44:26 -0800 Subject: [PATCH 1/9] fix(toml): cursor pos for duplicate key errors From eea292b94f5814369899b89eb63c47bb2116f9df Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Fri, 10 Jan 2025 19:51:18 -0800 Subject: [PATCH 2/9] more test cases --- .../bunfig/fixtures/preload/mixed/bunfig.toml | 1 + .../preload/mixed/index.fixture-test.ts | 7 ++ .../bunfig/fixtures/preload/mixed/index.ts | 2 + .../fixtures/preload/mixed/preload-all.ts | 2 + .../fixtures/preload/mixed/preload-test.ts | 2 + .../bunfig/fixtures/preload/mixed/readme.md | 2 + .../fixtures/preload/multi/bunfig.empty.toml | 0 .../bunfig/fixtures/preload/multi/bunfig.toml | 1 + .../bunfig/fixtures/preload/multi/empty.ts | 3 + .../bunfig/fixtures/preload/multi/index.ts | 2 + .../bunfig/fixtures/preload/multi/preload1.ts | 1 + .../bunfig/fixtures/preload/multi/preload2.ts | 1 + .../bunfig/fixtures/preload/multi/readme.md | 6 ++ .../fixtures/preload/simple/bunfig.toml | 1 + .../preload/simple/index.fixture-test.ts | 3 + .../bunfig/fixtures/preload/simple/index.ts | 2 + .../bunfig/fixtures/preload/simple/preload.ts | 2 + test/config/bunfig/preload.test.ts | 81 +++++++++++++++++++ 18 files changed, 119 insertions(+) create mode 100644 test/config/bunfig/fixtures/preload/mixed/bunfig.toml create mode 100644 test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts create mode 100644 test/config/bunfig/fixtures/preload/mixed/index.ts create mode 100644 test/config/bunfig/fixtures/preload/mixed/preload-all.ts create mode 100644 test/config/bunfig/fixtures/preload/mixed/preload-test.ts create mode 100644 test/config/bunfig/fixtures/preload/mixed/readme.md create mode 100644 test/config/bunfig/fixtures/preload/multi/bunfig.empty.toml create mode 100644 test/config/bunfig/fixtures/preload/multi/bunfig.toml create mode 100644 test/config/bunfig/fixtures/preload/multi/empty.ts create mode 100644 test/config/bunfig/fixtures/preload/multi/index.ts create mode 100644 test/config/bunfig/fixtures/preload/multi/preload1.ts create mode 100644 test/config/bunfig/fixtures/preload/multi/preload2.ts create mode 100644 test/config/bunfig/fixtures/preload/multi/readme.md create mode 100644 test/config/bunfig/fixtures/preload/simple/bunfig.toml create mode 100644 test/config/bunfig/fixtures/preload/simple/index.fixture-test.ts create mode 100644 test/config/bunfig/fixtures/preload/simple/index.ts create mode 100644 test/config/bunfig/fixtures/preload/simple/preload.ts create mode 100644 test/config/bunfig/preload.test.ts diff --git a/test/config/bunfig/fixtures/preload/mixed/bunfig.toml b/test/config/bunfig/fixtures/preload/mixed/bunfig.toml new file mode 100644 index 00000000000000..c7ccc6d9f27a75 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/mixed/bunfig.toml @@ -0,0 +1 @@ +preload = "./preload.ts" diff --git a/test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts b/test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts new file mode 100644 index 00000000000000..a3be30ea4ea5ff --- /dev/null +++ b/test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts @@ -0,0 +1,7 @@ +it("the correct file was preloaded", () => { + expect(globalThis.preload).toBe([ + // order is important b/c it shows what was loaded first + "mixed/preload-all.ts", + "mixed/preload-test.ts", + ]); +}); diff --git a/test/config/bunfig/fixtures/preload/mixed/index.ts b/test/config/bunfig/fixtures/preload/mixed/index.ts new file mode 100644 index 00000000000000..10443d1f53d55a --- /dev/null +++ b/test/config/bunfig/fixtures/preload/mixed/index.ts @@ -0,0 +1,2 @@ +import assert from "node:assert"; +assert.strictEqual(globalThis.preload, ["mixed/preload-all.ts"]); diff --git a/test/config/bunfig/fixtures/preload/mixed/preload-all.ts b/test/config/bunfig/fixtures/preload/mixed/preload-all.ts new file mode 100644 index 00000000000000..d167ec4e88f41e --- /dev/null +++ b/test/config/bunfig/fixtures/preload/mixed/preload-all.ts @@ -0,0 +1,2 @@ +// this file's name so we know the right file was loaded +(globalThis.preload ??= []).push("mixed/preload-all.ts"); diff --git a/test/config/bunfig/fixtures/preload/mixed/preload-test.ts b/test/config/bunfig/fixtures/preload/mixed/preload-test.ts new file mode 100644 index 00000000000000..3e7f62dea13191 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/mixed/preload-test.ts @@ -0,0 +1,2 @@ +// this file's name so we know the right file was loaded +(globalThis.preload ??= []).push("mixed/preload-test.ts"); diff --git a/test/config/bunfig/fixtures/preload/mixed/readme.md b/test/config/bunfig/fixtures/preload/mixed/readme.md new file mode 100644 index 00000000000000..07a001f7289cc0 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/mixed/readme.md @@ -0,0 +1,2 @@ +preloads in `[test]` should not be loaded by `bun run`. `bun test` should use both +top-level and `[test]` preloads. diff --git a/test/config/bunfig/fixtures/preload/multi/bunfig.empty.toml b/test/config/bunfig/fixtures/preload/multi/bunfig.empty.toml new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/test/config/bunfig/fixtures/preload/multi/bunfig.toml b/test/config/bunfig/fixtures/preload/multi/bunfig.toml new file mode 100644 index 00000000000000..403e2e431fa54f --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/bunfig.toml @@ -0,0 +1 @@ +preload = ["./preload1.ts", "preload2.ts"] diff --git a/test/config/bunfig/fixtures/preload/multi/empty.ts b/test/config/bunfig/fixtures/preload/multi/empty.ts new file mode 100644 index 00000000000000..efe1d9b96d3ca3 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/empty.ts @@ -0,0 +1,3 @@ +// `bun --config=bunfig.empty.toml run index.ts` +import assert from "node:assert"; +assert.strictEqual(globalThis.preload, undefined); diff --git a/test/config/bunfig/fixtures/preload/multi/index.ts b/test/config/bunfig/fixtures/preload/multi/index.ts new file mode 100644 index 00000000000000..5e747895ee8501 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/index.ts @@ -0,0 +1,2 @@ +import assert from "node:assert"; +assert.strictEqual(globalThis.preload, ["multi/preload1.ts", "multi/preload2.ts"]); diff --git a/test/config/bunfig/fixtures/preload/multi/preload1.ts b/test/config/bunfig/fixtures/preload/multi/preload1.ts new file mode 100644 index 00000000000000..63141e2cd27037 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/preload1.ts @@ -0,0 +1 @@ +(globalThis.preload ??= []).push("multi/preload1.ts"); diff --git a/test/config/bunfig/fixtures/preload/multi/preload2.ts b/test/config/bunfig/fixtures/preload/multi/preload2.ts new file mode 100644 index 00000000000000..59d054a998ca36 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/preload2.ts @@ -0,0 +1 @@ +(globalThis.preload ??= []).push("multi/preload2.ts"); diff --git a/test/config/bunfig/fixtures/preload/multi/readme.md b/test/config/bunfig/fixtures/preload/multi/readme.md new file mode 100644 index 00000000000000..a2de8dfc083dbe --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/readme.md @@ -0,0 +1,6 @@ +Used to test 3 behaviors: + +1. `preload` can be an array +2. `preload`s without a leading `./` are still resolved relative to `bunfig.toml` +3. When a bunfig is specified via `--config=`, the "default" bunfig (i.e. + `bunfig.toml` in the same dir as cwd) is not loaded. diff --git a/test/config/bunfig/fixtures/preload/simple/bunfig.toml b/test/config/bunfig/fixtures/preload/simple/bunfig.toml new file mode 100644 index 00000000000000..c7ccc6d9f27a75 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/simple/bunfig.toml @@ -0,0 +1 @@ +preload = "./preload.ts" diff --git a/test/config/bunfig/fixtures/preload/simple/index.fixture-test.ts b/test/config/bunfig/fixtures/preload/simple/index.fixture-test.ts new file mode 100644 index 00000000000000..a4c5c8d77487c1 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/simple/index.fixture-test.ts @@ -0,0 +1,3 @@ +it("the correct file was preloaded", () => { + expect(globalThis.preload).toBe("simple/preload.ts"); +}); diff --git a/test/config/bunfig/fixtures/preload/simple/index.ts b/test/config/bunfig/fixtures/preload/simple/index.ts new file mode 100644 index 00000000000000..9b0f41c2b039ea --- /dev/null +++ b/test/config/bunfig/fixtures/preload/simple/index.ts @@ -0,0 +1,2 @@ +import assert from "node:assert"; +assert.strictEqual(globalThis.preload, "simple/preload.ts"); diff --git a/test/config/bunfig/fixtures/preload/simple/preload.ts b/test/config/bunfig/fixtures/preload/simple/preload.ts new file mode 100644 index 00000000000000..4a8e0dba28c299 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/simple/preload.ts @@ -0,0 +1,2 @@ +// this file's name so we know the right file was loaded +globalThis.preload = "simple/preload.ts"; diff --git a/test/config/bunfig/preload.test.ts b/test/config/bunfig/preload.test.ts new file mode 100644 index 00000000000000..87d039c8336787 --- /dev/null +++ b/test/config/bunfig/preload.test.ts @@ -0,0 +1,81 @@ +import { join, resolve } from "path"; +import { bunExe, bunEnv } from "harness"; +import type { SpawnOptions } from "bun"; + +const fixturePath = (...segs: string[]) => resolve(import.meta.dirname, "fixtures", "preload", ...segs); + +type Opts = { + subcommand?: "run" | "test"; + args?: string[]; + cwd?: string; +}; +type Out = [stdout: string, stderr: string, exitCode: number]; +const run = (file: string, { subcommand = "run", args = [], cwd }: Opts = {}): Promise => { + const res = Bun.spawn([bunExe(), subcommand, ...args, file], { + cwd, + stdio: ["ignore", "pipe", "pipe"], + env: bunEnv, + } satisfies SpawnOptions.OptionsObject<"ignore", "pipe", "pipe">); + + return Promise.all([ + new Response(res.stdout).text().then(s => s.trim()), + new Response(res.stderr).text().then(s => s.trim()), + res.exited, + ]); +}; + +describe("Given a single universal preload", () => { + const dir = fixturePath("simple"); + + // `bun run` looks for a `bunfig.toml` in the current directory by default + it("When `bun run` is run and `bunfig.toml` is implicitly loaded, preloads are run", async () => { + // `bun run index.ts` + const [out, err, code] = await run("index.ts", { cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); + + it("When `bun run` is run from a different directory but bunfig.toml is explicitly used, preloads are run", async () => { + // `bun run index.ts` + const [out, err, code] = await run(join(dir, "index.ts"), { args: ["--config=bunfig.toml"], cwd: process.cwd() }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); +}); // + +describe("Given a bunfig.toml with both universal and test-only preloads", () => { + const dir = fixturePath("mixed"); + + it("`bun run index.ts` only loads the universal preload", async () => { + const [out, err, code] = await run("index.ts", { cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); + + it("`bun test` loads both the universal and test-only preloads", async () => { + const [out, err, code] = await run("./index.fixture-test.ts", { subcommand: "test", cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); +}); // + +describe("given a `bunfig.toml` with a list of preloads", () => { + const dir = fixturePath("multi"); + + it("When `bun run` is run, preloads are run", async () => { + const [out, err, code] = await run("index.ts", { cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); + it("when passed `--config=bunfig.empty.toml`, preloads are not run", async () => { + const [out, err, code] = await run("empty.ts", { args: ["--config=bunfig.empty.toml"], cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); +}); From 1b505d5827e4076eba2150612b5781dbe9f32676 Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Mon, 13 Jan 2025 13:30:58 -0800 Subject: [PATCH 3/9] test: add plugin preload test case --- test/bun.lockb | Bin 445722 -> 446130 bytes .../bunfig/fixtures/preload/multi/bunfig.toml | 1 + .../fixtures/preload/plugin/bunfig.toml | 1 + .../bunfig/fixtures/preload/plugin/foo.yaml | 2 ++ .../bunfig/fixtures/preload/plugin/index.ts | 4 ++++ test/config/bunfig/preload.test.ts | 13 ++++++++++++- test/package.json | 1 + 7 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/config/bunfig/fixtures/preload/plugin/bunfig.toml create mode 100644 test/config/bunfig/fixtures/preload/plugin/foo.yaml create mode 100644 test/config/bunfig/fixtures/preload/plugin/index.ts diff --git a/test/bun.lockb b/test/bun.lockb index 2d9775c983b0865217e2377a2bc115f818a8a3d8..89b8fd942a672e9019e4eda91bdbc6799197000f 100755 GIT binary patch delta 70312 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 delta 70087 zcmeFacYIXUzWzTu$-rzNC?L|LtAH3fOd!b6A@tr9B|r#)G?IXz;sg;TC<<<6gNnUj zId%{mU=NClont$8P_Z8s75%=Sz1D=Bb2;8~?(5#)?;rMyC(rsktJl5Oo|(;k8=G8t zWs@}>+Rc5fW=8nNtDH>(3Xl8c;JG`}W2;`M7SdI+c5?Gm z+ssJ`j8LdFyQEakC0WHeCGcBGp-`<*sBB5+^aAMvti2^U6sm!K(DHR~1MDl{n((uP zs{=o@c6WpL?rT=1!pm@TxPS!e!W-~af;DP~ zLT%yQ=ndg{oJA>~&;GjmqX`m88wd%gR}WtyJQ$ z{5KF;_GP55c5VZ!-_mFsaT&JKI~_h6F3l>+nwgg!5B*H_l)z{_l<|DWa6fEi*bPTZ5i1%g@cvPMbY5^oecf zcPwWw$}T8nq@ClfO>WR`0DY+BG&Ypn{M>@sX@zq_-=eG7xg~`&=Vi|-&GU9AH^_SX zcr$o*!;1AJY+JAJOnSfmi6)gwwn4m@A{MmjV@_#N}hGH z3H>;}D(i#Z?vw`c#Hj0HOV|Qd{~ZNuvSt@7$}N~v82Xucs8RP3tWmcp*DMPoJDIZl z47=zhxj8}j3~Z(ITt`!u_Si>bckE(HVdwp@vf}KlS*2;YCHn}Ns6;lEY)S+*<=@d& z$q&04JFjqIk^FPI*~;4tj`i*hH^}{>yU8xEaCTP7+)$_*wz54)XcaHJWMOG;UPfppWv zNyJiFA19V+;@oN-<86BzwIHjYFn4w+lwC4&VQ${+(8fNdNiT#ok{4J$)$$~-@^9d6t=`7z=zUPV zL44{^lhtjRrVa86XU(6Jo0okVw%TIS2s8YK!|IQNutrBoX;$gNlI)VNu{An!3+84Q z=a!btΜ5L!sYEmzAn)AFMW8YV(Q08qRHC#zVcbFNT;dOJwxhXm3@dS-b9IO%o-S z%Q;ykrD+R`b8|EN3q+D$Xt`3C){mQkx1Z_e@x$ zF#}e-4zR{cD>$fKc0o{!W39b+f~kFWcG{fW;*!#Lt-TW_KkrPpXHV-ct6}3TEGWv= z1o@pXO7nXgX9nx7TJix{V{@Ii&ut!GewtAiumI{hfUQ`wr<)Q^hE>9((@nSo*sAF$ z%Y!V}Jj2wq4A$N90O2*1atckq1V3roP(3!TJ7E=jW;Yt2 z>jrG%cPX2R!^LAL_0up-TVN*9HL%+2xMDL&6ZN~tTT-ie{8EODV!ec~+Imc>iCt2Z zms{F}7DZR_nk+QgChjn^vzBOM7b?mvAYYclMP|y6f$I~#H>^f#534l4jW*S5hOMDk z7p5BVvg$ZguS7;J#aBTVF4QU;3f)f|s=l{cUU8PO&w*9&#%G%ZYr*QSq7oXMYdztQ z!d?MunB%SWaK0JIrN!NPs4DN+bmp%x`YqTh%~2Pa5{F^+(aa^>%|oGHp{ofXq2-09xMvm? z&(?U%&n@8oSW4G%_}eKEI@3E)JJv39m1&`wtoSN^;mpEdM7O%gr1}~D%0BL8 z9n~P-|6)^!DTG#@C5y82N(nz}wF#Bj5hOOiLtyo5V(Xb*LIJ64c1eD4zv+p; z`m-afber3Fi5+@@#-Aiyl0=ariy8>`hYMjPH2wKHtQJkg+mFBO*|~FAS{ZIOd`VV5|2Rm_%_>&U^te7~ zns`}D9Gc@t!)nu$ZZHX#mgMEmB;e22ncK%axCQ?2!Hwaea4UExthM1}SgrE_tb*2t zo59yu`A}|IjjQZ!42RnSR-^+VO}BYSLn*y%vk#r z)|g7)Wc*9AxV>}T=WVFlJpRQUCe@c<73)50Z-5(NpAD;cQ(;x37p&ZySUz~W@qZ7N z{sgRaZiSn`M<<#7DJm|^*Uhow9@Fmg^RgFG%6O=#IJYD}D->FOuW8Ss!jjS)wjg05 z)+B-X_nDN`zKB%a1}Aim0;I7zOcMeAXo z11sJ9B_#{;x`a*&^?Jc9OYLAa@rSVbsRgWn4J?;=3yy6bZ}*ZJ*GIvc*0Tx==jXEG z|N5fosJ*bV+48apcQafUy9`~8aVxAwdlOb}&sbjgiYb1M^Sg%H z?l*Jba^v5)tlS1X8&>BvC1F+mZEtO(2Jx3jUPGm*ASc+aK7p+%G_NQ-Ck^Fx>pwHU zC{1l~6vb7sCfeeD2CHdv^RsfY*-PHf`E%N!g^@au0) zz`bOsK6%P!aD(MbV0H1?u)@!QmGJ<$F5J=j*RcKvY&x551q$(8^}p>mqkjb}{LJF4S=ys!A2j+MuzKwvEdTuM;+$+svXSs~e>^xQ7|E?1Tcvp2>Sh1r-xgcxK3>-erqErmrrgz*@2VH%7cYwtP=l}J z7$=x>iKE8s>;((6XaSE18k8qe5N!a9vuE>=ITUJftSLYqtU;g1=)?NPPTZGX!B+b= zCBD+x-p~oQt+&99bsxDna8LkP8BDX>A65&TWVs&P0Q+DACuos9p`@+Y;P2tw?@5ecz=5ZYF%K`6zwY9woR)kfsx+2f&OunEdek&(fjS{nI zCAJFSw>I(5g;kNo$D1b4v3x45E}MtH3Z7q_pBraq8v5b{li(Y$mb<5D>!9zj)dCCK zn20-I>3Z%@nJ$Gq4C%A3=6$fv{TVTv)9?A6DZ`g_ZDE zB&-2_9~tQ`TFqO~vU$8~hKbd^dEWB1uyRX;OC_92^D8>stLzIK@Da-%tkG6HH#>{GLU&?okklJsn7u^7!u(KZ zm6zG7O`SIfnnuVNWcs?jx2#q3_@u$65QAVf5zP`*efAKuCNvpp24pI%f%O}@!tH@o z*eRK&GJG6Ssxmx-uF6dsX2Q>0IA@MNNG#1NPMcFg+QUt{GqZ}b(+W$x=B?fMHZ*R6 zWy6Uh9z4R7|Eld~5AiUz>RFIonx9oNKQv~f371{MNs@!)Ti9B6Ub38%9XtiEoOF#x z8~>|FM;*q&RL9Mdz9zqT*^)6PgC$uD&(gH})!N^|O1Q}0G!q|2eM%)&(DZR;0GARH9r?8&fO=YtKf+b&MqBq8m-v`lkT9@TCe4AzW>DI`yY3IQQ!5|ofV!tH0FHl zW%Bm~ubjUVy^5hRcSmw4)SHB=d3E-sN7xz52zzxhqmcnvld$|9UnX_(sgf)IJ}41? zci4%#Z(G-aIP)fpOfZuZ=fF{g!>$=~z5 za{i9-Dn`b_YiPNF-mZ}u&U;?ws95+IT4-=!=Xe#^H)79_9ZqI|O$l75;_BnAM%#>Q zLZEeFIL-@PSK}HM_~tYG#{{m&a19MyVP>*%jl?xB(5}UGx?D*IkM?$s?c<#0x#MEa zrCug~kN3*?yUeTL?;g(`A9L$7qE#`+TRSZ3jQ7gN$DB*N3jXf*+zBzKz{{Kv3-4gz zrWnIAoSI$*>O9Y#7<2CNGAG8|nk>>vA<3^ZipI7UJvcGyUWU~dzhrOh@Tl{RmpLis zbn?n4#oVh|F1iH`x^_e~{4!R$H*#c#8)4BJgC6pvPr*9PTRkzudBCff983D8p;u!{ zAE&REIVI-a#L6>}pb>BE&}d{YRyvlSRV%rZ*Y`I!!n&%wlT5eI@G_^y=(%$Ke(F_B zjk&!zq+}4l@y1g1gyS73EAWuWgK#8SQtdHhn@bo38mYf_B% z%Clnb3N+Q8+@?j{=dsiQ$w4`jz08?GIr)3BS1~gd`Q>~p0!IX}vOx~?dG`R(%(w&WEYPEY*)ZKv6 zn>At`raF;sC`gY~8fzy;BMsZyxWSMK;#wta;$DuaDy4V?cVECV!$F;$)XuCiNgjm? zcf%U(?V6t9F1I>8%>b!!QYbWv6wDxWr(miTnJXQcD_AONioaXS6qac}MXcN2l#Sk+ z6?Mm0tGc%~E9!2+((-27YG1-KWo~k^?UcZb6ksaH%JxaR=VY%&W*_%UJWQjidrwR= zbqi}52%meO1RYyrC{n*7DR@lc)?`oPT7(n59Sf>Pu+=?qhE-gky zF{is%UKDdnnHNE~1f|-HWs=vhZrhzFiX?A)a2cj%QFTvq>Om}3AQG{YDSF0Qo9AUa@Keii(=tDXh93R$FR6+n3B$fs5=;oA*VXC+Aj4f&WyQR z(UcR*&)Re+!yC4^Pq;g4PJeILs0?=nF0){*Es8o%dG3-}_yGz%+Dl!+9W)jSjSO64 zDqR~ZU7uIFqRg=2LAdj9Wd^S2D_zI*OK8(8UAI)azOHnoQ%w_hS*2?yt|38sbp|9{ zQz~88R=PgLH7E$zp1Xr_6$P%?+!73LL_bL?KAXtV*MV&W2cX^CT zWG;`n8N=uk}eQxsK#1)j}CGq0jN=H`q`+)%Y9KZ0c{wtIhiWW4D~?iB;LS76x| z@B_olGvh8f}_?4x4YcGhp$4xLjmg?0R7j>q1?!__3^D_Cn)GNO@ z<~~2sR5qCF8eFSm&U7zxb9u;p;o6j8lHsJ*GuJ|u?|UIkva>A@5;P_hl@V z+zhkYr-ni-BUo$4N1c&g#bvYu8jFWn#oQ0ElruA6QZ(F{$@o+~~Jpv8<>B%h`0Do+yvj-r-oi0zX+RDlJkE zZoW?!!P20w9KUYw8HweF5f{$G8sqI^JNhUtJGW;= zof=++A9Dw0nfyb+d_5P-_89B=177+1nEL~oVo_s8VyBs=vDprC3H^ zdrFl>jrn?$Fcg5UP^FZ`VC97&umEh&o(m(Yc=;QEcvm}(Kc^k z>E6rTja8sUwy^@g@La6H!It|kxU{%318J#utmXJ)dpqe~`PDJ^f;nb^42DDaL#$C= z>agCC9Mg&sZ}&CnGMF27g8hoc9KsrVK{PyOu2vPA(^>CjUK4X)!#2ZZZCTW$PFx}lyL1H+wG)4MgRhDPn365JGL8IqT0q;Rky%}-C+1eF& z!*1&1o>*vtaRQ4+o%vqHO)>XLG*z2LZ+d?LbhX~8h;T5Niia?>*9SSkj?a8lHLAImmBC$-jI#jUaMsU@_5 zw>m2$ydGDNU>ST7mzl1#XCzW;2H~OGXBLWXf5Ed3_YN$zBAX=!yKwp5Rd|9-% zr&q^N)eaTQS!}wRsB9SqV5tMmoL`QmW~S-!+ks^YxtsZY5Gxk=ahi5tSYn1q#H({l z)cp<1q@tCe_gTg=`^&Y~3UY9EdzpWUMcSNg%1~KhHy1^X9_$XncVTt#c8$#lzm02f za8hY`j#>9ia~5Ky2j#A_Grc;7M(?5I_MzB568UyP?N<@d$hi{qwOX=}#O>sZ|h zN)9tP8kQwSrEU*{v6KvH&x}US$I{pdw*2e5^56?W{ltLeSx4Pvruc^{GzrDjm+0Y3 zu=;zc<1^fsacNiuy9_twJabgyjy*2wo`R+OH`5|7>K0%rOIB<8_BO0BSZ3dlw7kkt z4Nt=2@dbDK%j6;yW986YGJ#X~WtiRW&Oxw#i4TB}ZZdUcF0BvUzRolm?90`<7iJkeqCxhEP~ zfTcF6Y$a!tSN<@M8qihh;F#%lT3I$I`yG~I zFvjE2$jKL(QdXAUor|J8@n_+=)~k3tc!;+x7Os79u>7paa7W?lOBlyIV8BvM+2k_( z-cTrGu{0N~HUo|k#r^wEuY5a)ZM1RTuK5{}zL)&-aa(KFTT7|)*?TNLxNz*MUSD1=3Cpef7!_qns+`$~sb=TuksA}HYi+Px}-ptD+ zb21!-DNn`?&$iZKrFpwnX1H(TQtJgt^84GV&q)HXALj&@bns^kP;Os$5P3X{jsNVK*Lf>w$8s`s?HRYsoTLT z-yI7NyPh`pR`1RTufsJeaD9x64-DSm0op4uckvCT_(}fS#;lK66BH`)J1+LZhZeSQ z){Vg)2EVPi*o0a?9)qXcWV4Cn;X1X_i|0t;XHob}foKhG4u#J62fsxq#_yT`;&;L= zi8L4B`iC?lFQ81Xno^|Qt)Wm>RVBO%#Z>q$Tzqb^JHtKcHq$Rm=&WdXE>;(B*U*gc zEx6ds`5EpHxCW9AcNVrt12&oP^c*Y7GB5M3m|KC?ix7-Y&L7FQo6%#=3mKIbYhkzq ztDC>N2Pe-v+4Pw>Ouv~}Q!1^8|H1E=yUeDF)CoBU>$J*{Phiciv`+jBpTSgG=O-+` z4kwEU)}eTP?yeg0YOF)K|9~|qkxF>jJ;4*GEj-u5)dQVvJ>%|GER9Qs77N2s_nILS ztkUjiEDby6v7YN;^{KR8#!AOxFUQll$bDu3<5>`GdoI?fz)$gBz)}v>o0f~*ubXq~ zoxQ8$(15R8ysKCK0eAz-*L6tqziDYU$V2W+F0^$Ccz5LY43BM4*gHmh`aJLaTdK|Xe~@t}=3yU+15Ka9CAqA4v} zisBr-rE*HrZUeE@8q981yvt0Vn!Y4jbsA75YMzhI4zlwzqMhmzWC6_Zrb&s)7!pY(ADJZ!dWJVxWw&DK)et1Fh-+BVvr=uX8Oi`6R#slk0G z)-Wt~6ImQ8w|h0d?Bn*?VQ%;4_;oH;Z-Oue$>=F-anIq2TIdN=Yl?e!dIUoOs|Q0W z4@)UiKF(m9v4$Eyn&)?{3@mmCl%eO7rbK3}lwhe|Ci6S6qF8lBXm*{ML^Tcxl1a6(%12hV?9#wxhwV-L1dV)RGRPb;n~33{qh-yT0`c zCWiYu)=>PIiKNo>c@r;K+T2sI4lR3|u*|4Y$d9m0%jtMD;svu`3Wh{@J=U<`)9d}X z)Ef*A;WW~EbKC4T4M+%{ALd~7_EN9S z2;Yc{EeM<1eYjK^R)=gpZulkUE`P;Th-y=z$E-yaXy!9sHGb8!f<`uA1;etk+uyYQ zK~p<*yv*NX?%3DN07RonmSd^g%x8_yVyT09*4Y&bxIJ2yF&QrH+8OAeOK>@9LUVc zo1)GIUd10V_ggeGcE(zzH_y;Th z9e(jaNbc7>3w|A|2bSF$uYWfbnu$qw@DQcud*;EuY5W|l@%Wj~habjLm1>&Z{7;x8 zg;cBm0cP}CrFYdq>cgEbh-9P}FgjV9HR(4B&-6FM7xw&p9bG%^pZJDaUy z$K%JCT?x=AxB+bbz|<^Q@FLAVG&?C1xi9x|1e2$3&6}}QV0$A<`p7J+)*N9?)?7}0 z>#!8_P&wW~>024wInFPy?!>}VKc-Fm)zuxg+c^7psmn9MuLZ8vGkNa(iD|Oh!QwI+ zOH~bWOpjQ<8o|S~N3pal*wXxnY1Zzw41*4znn`GGi8Hb6x;{VZT79bBx3_vtM)(D3aycn}W-aR1 z_48m$jn^_1XYL+08@TXXvz13G|gd2QKa|dM|i%TKwUT-<3X^U;RdUzwx%LxBH5!mVIXV#@v zW_?4QgPiWb6|_qDYh0YW)?`F7zBSbd#?HDL?1vE4U`Knq{b+a-R!~g0$9IW^mqpn* z&(A!Dj(i`n8-dM&Tkm@_q*?hlr>9`>QNikr@cp<(1g<}DnF0*>0hgb8G#w#VP`u}H z@yLrNssDEsdE~abfB|3a7E^S!CLC^giOHFFVVx-N_RqyvYAjVPn&P7p%`vfkHl%~Ps!GqEhR(RwA z28Tj9SNRoVQ89~&A@6W3w|pBjeW$HgaDIlUvl zCdMR3{Ky2XV18FV0=N=IRj`HLk2wjma-g{bels(aVNCA#VJSFU&sov%Px1?H)twKT z?lT*sLM(+c8@a7m1F^UXZ%L2*Zj!U(t}iCH>Jb@kDJ~6hvjw>it4ENJ?mgdODLro7 z+*LaKp?lBjhcnzVTwT#wYF9?X_hXr-RQqrZ3c{~_G#c*3FCT&rFx+xnsy^XK=OwJ* z9_G~cD_YXfgB-^`z|zNemtyht!+3`Cs$bp;?_-jjV4KF>@t$aS5SB@G1+JJ$^(OYW zSm{CD>=lxJOY(QNcKU?7COe@~{;t+6n9FdEFwR|voQ+Z{)$BvgdvOjkVSmNRf}<1$ zge#pF9df>U$l0V?Wq?_SoOc{@et*cBQJpriB|GGN_K-6*QW;=8&VeSZf5`dvA!l

c^V7tUW6c}#8a>E@%*NMm5~uT1DBR4YQ#*q980sZX7CZy zF03HG;QpL?lo=H0jm4{;DoC z-HH6#L#quFZCcdH_1&(t_Dl8rVO{Bw?tVF@djUTH8BG{&Q1`KQ!cwCUV@`U6-*BiE zf)a;EWAzF)H08K5(W|MJkuPni%5@}i^0B5cm5RFvMai0D+kIH$u*i~DO5q0`#!nyj z^~F+e2XXzfcHCP~`k|QdbbkYXXAfrCyZkKVbbnV5=14{(Cp5)4y+h6~a85F6zs8kL zALj(4esRbdYeIpHx)$dcYwVu%NDC);ifGbb^bgkSSko(`b!k~8$?$5diGFHtZdH{* zoMC>2giWoSP=9|{Zzm(^i&p-yQ)skSt!e5&iadxjSp5^{jBw54gPIdQT#l2w<%ZrV zIQn|4@5ylMonZRZoPow;Y1IuTnR^gRlOMc6+G_TlnJ<34D(imftFqUum_-;RkFH8EFko!m5#M(YqbFQ74frMNXbyoUr ze=7eB;)LMwQ@4|x;IW}ONB8BMD+nq(rQH$@zm7HDAK8#jZreUl04-y4u{3vr6TN#! zRV(}z*3jUy>K-SXINT^Wh%LhEPMm7~*i)RSdk3cO4`yBb$XX=GF(jI1`~oXdh^47t zIb*{2O9>9Pkq+io#T}9J<~Xc$Z`b4ucNH#W#>&8lq7_)Wrv{K)CT3Lbtq1N_V( zPTbk(S3u!U@$2XB8sePow&`SoQNXgOGs|}~X}XvB#m!7VHIs4BrHd1qW}Fw}oMN0G zW?WQR8Q~^EST%O8TOgUto#KU%6OCshyk zt(;j{Be1keQuW_>sgxnX~+BSY~%r=Z^HqfW&=RE8!w6vqW(A4Bw8$W|B|S zKE|cx-fTIK9cV&vHvbEs=wS`VFKoWKc7^XwrV;j{YF_f;XFM9t97LxCRl5L}DYTZ4 zXR#EDXMtDqH7q}K3L|^YVD>4RJI>X91wzt$gZ&y)xlgtpV&an$-A2RBy`OkIO&yP=Jr{j+9-pCATKY_4Cze?Y z^f^algt53=-;gdt#b>)t*FJ+a42v(DoXLj@L0<)&myy-V@;yLcn+V3)rlu?y(2ixE@teebQwy~ zHJ#CaT*6P!4KBq}3oxnqly?tSx|e!OhFfR6iNy0%sy`Yl81!0#BUf9iauephgJM=8 z8pLVim(O-G;tX94-%xeHZYQ{^ax%(9-~jH#!S$c8;kM)22gZQKQ*A-KTm;%eYxYl|I!X||)E%<@7nD~pxv8le0=pi3M9R{{BN1S#Np z5C*pZU1I6C1C{#@pi8Xm?*;OI5Gb83dPR&b9KltU6<{k6KN9%)H+!?nxm3r+^CZoV6=#{-Fv4U4O<(=mnsJb^%>gS^A5CYFGt-+1g^+uUK0w`!!R4 z9MM-=E_&2&%Tv$~`j6Q>@aoGhhcpD)%i{=u9o-{`?D;*J;-O zzp|Y{@=%!5`J<6B*GBlCu%gc6j|!L%s{#c!z5l{moi#HS*??!-fQMss)w%eqWzL5c z^a2}REdSNk7AxaRto^SzE)SJ-Ev&E}e-!a@%U4L`600vaSX-=kS6jO(EB;2SixuuV zSn+SNx|neB(9Kpj9Lwug{wU%dum;aPu=M+^y#-c=4@tBv=fl>n$_n?0)eZaa6*>Cp zWhnG0x|a86t^dEnj^A_vccu{woJhPbao@Ia#meg)SY`j4)x~mtXzl+At1&+zzP1iu z!OG|B#6-doWbm!cK&$}YSz9dod&@t-D&Wts68;s|Rh6axZo~g!{r@Z5iS%DRg7iYt z)q5$VrZlR-DoAx}yVkB@xu(@qVO>>OH9rOZkEKGEujV-={a z^{>iGubtKZJMLaJfD&wPBZ}qhz#k>p(duHyzoNux-VQa?)yiV6<$bL!RY1Tdr$AbW;5kO(i;ExiTVIv%l zwP4M${$e?EE$6|CpAReJLV5lRRzXXW8EFc*&;}H%gU_;dRaUrj&^1Dq!?IVvYJp2_ zc(Dqw#@ba`@qFvQ-ukcCNK=Lzt;aRiL#%|ZwS1k`tFj7k1G>C!w*G&{O79jMPONR^ z36EN#Dl6b)=;Fua@7G`C?}QcWdFwBh^F?cm<^Phk#TuaR zSo_~#vo`!20ZI1o39G>G*$k_)3iiI$t8#7h{Z`+v5u<=#SwXA>zp?zC)&GojXE;bW zrSrQDUzL?!Fp(^4jdC?!#l3MTVhva$N3WZdeY6emr|hRKX1k~n+r&mY&PEe!YPGU@ zYs<%5f3eDSqO}jlDn=XYFV=RitF^`Q@0MauvfUBn*VB6RlEEcbMyjW-s;v608pKked%V)qUNEWQC zDl7aSBd2fmQQGmX}!n!?6l*w)OvKj!V!!aXG9E&$qn7 zM)*%yI~Cu?UvGJXO{XfW0@oTn9ynCO>utcpvHWke{$ec?_rPj_`>lRBR=fxCSH(74 z-eSWW_UD|SzD~qzHE7SVv4+C z15{;2d<|XApciCm5#MjaiIvb-mcO>TSo$}x;(up#vGngP|6uhWQih{)9TH5$A8o*& zY(TLRJYe--EdOf#1NIM|!(Btcen)NsH)0;kZld{YS>-s++Tvg>g4K{GTV1SrcZ78} z?P2Ynu;TZEm2PiXmsob6uss^$2(H7iyaw<`84QM%;1C;LEPa@@#j;0QTdXRNwYFFl zm~8b^!*x$g_g@<)nGNOODz9Ot?t1}@N(-fRz|+H#fpEG)vtjSUhitt6;C*-vNE{d2B^x? zZ?w8t3EgCEv7DRuqi}avU950-TE5HjUyOe|WE}x3;N3RBJtja%tOW0~`u$cHOMlSn zo2_1zo8$kw)vK~vWDk0(#^0wnG-~(5y1yKN72qJOSzJ&3@_)tT|9_i-OaT=OwH{(cJk8o-+4}GKbX8@Inc3*7@f;g2 z$A&u`D_pMi7i)bfiCdxMf05PKiFE&4{%-@=f*mfLn)E{a)q<a$8ro-yYz!K6bD*;P<6Uj84k9>5SV|VQPv&}tKp`?ig=pUr^8C{ z3~SGTbsdhCewGb4)AB4>>CLIG?hPD=SP^n;fO)X4!?D86$6uYjz=jjcKGWJ_weZ>2 zuF7hu<=QW+CMzsoXd_$%D}#$+U1F8^Qme0lmB4z-*IEA?VWoF7tV^tTw^>`P0^JEK z{rFurz&$p=pRpo7U?V;VE2Awoo>&P!WNoqRt+2+@!d{nCYE$kuMP>X$C0%dQO{`SJyioYZiK z`_hFPO1c{G$d@n9uq{>fOBZS(*=nI9U%oi<<%?h{9r^NwHgR0~5{72RkuP5y`SOLn zgrWP)kuP8TuYMUrpU(ZSCipMXJM!fVeU^CWOBWb{P5bMpcI3+!hx>Acn&{7THR+Kr zU+7C2YKbFXzNq@8j3ZyZIP&F-|Np;y(dxhd^2LP*?r^poxFe}s)L-#Y(r|zAM@gyv zySSW-{B|EFP4?Sc)c z{?yMArhJa@n1pM6_X~u`7YO-ZAYAWnmGF>+re7l5=;wZkF!#%(TK)@PCXH}z_8aX- zXt% z{qk=RR(^x9U&6h9&u|5~lxv@QAK&zK?!gAnZF|p{T<=1 z-x2os2PFI~Vfr5kZ~L46K)CIXq|_@?lZQL+UNJR!@)c8(Q?Gao>wVvKlIeOUnXY#b zKJd3nct}FiB!rLr+$4m#NeH_neBw7sMrfFfurwLrGrvN@a}v^05cc^?QV1O z$!1(9{gLd~sFgg)kJL)8<()CJrT6lX7Jlmfq?(T7Z>>ephw$+8Y9)_wlKtFNgt@6C zwo5G=_8Zksp6pcf7l^9+6{3jW@+iplmxy>HlBlNN?r5l%zf6?s?-AAZJJ*4Z^2;HA zWgU{;Ux#Gt_&w_)q}N5*SQnw5zfZzm2_x$v)b}^kLs(xA;h=;DylEC;=rPH){l6TO zJj`k2ACU0#F@%_2pAb#_P4y9OtB;U+EJ9O%>ahq@jzxG(LUZ43fDmbbklz5IrN0%y zY30{x2(|WeMaTO)L?`%-8bK%e3q)=F3dn!15mD0`6SbYcq%p$c#t839Xz#acg3z`J z!s;dnY5pDwZ%H`iIE0RV`EdvVJB0P^5DrS1>}Q^YF!UsZyG}xw>K~BsvxMpG5l;0twMV$EJwocq z2-E$kCnHQb8R0PrXZUU!LL?0#KMf(v-zwoD2~9g7%<^+PAk6K6uuDR=->4%(!;T0` zJ0j%x6%wA4kk$zy*I&{JVR0vfcO}gC+jT~0+ZkbXXM}uzkA$}*oYDoM&@b63 zj`tT#OK!q{5tQQhjV4FJjrp2xjV<>sPCg@9B9r{yUdi>sqnh(e3jc$1l0OTAK9G@o zo3qTH-aC1D>NO|wW(!ik4?b#3oxzNMg>g5wH@V*GkL{EEwR67TFP5B9XF|tAWf|Ft z!@Cmw)n79$d3KQUH+?BYX?K3up`>m#Nj*p;eyLgZf`4!SWd5sJe}Dhv(e=;d6<>UY z5mYO?Wah%$yxF0xTgDDZe%?v?WuV_|Q1auc3#hYVo;ZXQ{jA=}4T7@e&!3%JT*Qk_ zwxkYDZjxj&^ji)}zBDMr_MsHw556~ATZMQjD8!cQh9$2|31{WQ0BId z`K$7mnW*EEKMrqOqTGo3{kqQlZ{H19xBch9L1mj>O{vr|Z(eYyCJS@&a_20WS8|en z{p94XH7>J3I&}0qjZU5yTS}SD#Y7wPnWC_PxMR!Mg~_KTJ3;qtvyE!nj2lqIFY2Bg-tz7_$;nQtSJw%8 zbP%td4F>9RQ;t|GCm8I(IO|xoy^Z_UF)NZCw}3ZK@{6Fd^S7j}NN(+lLIu7s^A zt)Fk|`l}722QvC>PuJW2y*VlM;`-Q7Poni;y1sO-cdf?pJJdK(4t-q6f)V@_M6y0A zR9v0WkC(vpH>;^QCj<)TcdOB#p_8okAsR)D2XE}?Y{idlKs{57TJ007sV=-FFt|Ro zn(C5awa=`k-#RgvgKMwVj>Z~fwS8!+SRF7p)Y_((S(?>;v|0nSPFDNLYWkXYH>>@Orv7RKI#}%&8%`b2 zPCs_g^{W;2gU;_%3$EX+b{y_+td{tpds8(1@GfyBeCu+>_lU0@?uv)b`!XIQPe)igwgS}lU6bWa3n zR;!7o!n9HSkF{c|jocQkvDIo@tsUCa3}(qk*~l7mThVmYvEjG{1wYM|R@Z7LD`*4^Q_hmL9NBBaYM_j z*51bLgI0v58GN$UVz?LBaA`JfU$hz0)czf9z<#*1Y`{)d>yI|nYMre%0Ij#xx>#)> z+D$4wS64I@a1glOYI;M0oP)tFR_lQl{FZtM;tf_zM^xHF!M#??unA_O-DEG!Hd(E|)kdoR*I99Z6-N>9W~(LM%P<;k9hw%r!GzP`83Q)j zaAR!Tv1m71Z7iBvflW>54y%o~+IY0qfkyjJw2>zuHnagJS#2U(9Wtr0 z>Pmb!LGM3R>u4FzvYF`DIQkWqu31()19zd-vTb@Z(Bk?%nJ(RrRj@433r*{Ij@48U z{oYJ#wq7)$aI?T?c9F`p+HCow9S}u*2^dqcMceD;>JUHh-#V~&<*iK zxWERSi@Uqk3ayrlruT7Zr7N=9Jly)#xK_0VR-2D|gVl=Blt&)83{6*Q5RUfG$H=zg zLL0dN?NqBRvRWb92;5rz&a_$)ZoQg8E8SwNEx>&}Ze2@YIg7yqIJEjLh1CirAovOi z96HyErMPF~*6ODpA}ZiQpsvtWX0=7QwV3Ey2CH@&Lv5|L+-i%_w3g`7va9sitB16f z=!#!p#j`M4TJb`wosHJQYAdaF4%&q*5LzY6t+o`m-eROxa+TH2#a)V~Rq`UMX|OLs zi@_Hgtxu>7Ltppn3$L~Tm*F0c)*rsaYUkk|gr@6Kt1b7}E?^IHKGIvXz(9Dd^;&_u zo(+DP)hvF5D#Qh+e*1#*QR*w4?^3b);YO8SbcDT6S+aJ8R zL?h-Ru#3oA7_TOv)~buaJ7`+lZn2S9meKW3fwc%w2nQD zrXAoqFda?n*vmGquWminM&513^=PjFU9VVe1MVF_>)oqXyAt;kK-X(ly9)Q6fx?>* ztadf_uU31*Y8$b&7{|3RzG=m4aBDS|_LkMI#jRTC+JmN+xeiPKT0q~n;jYJh4(psQ z?RgaL25_#`-m}_`Xk}LWTVfA$6XL^G{J-qv#E8GoYxV7x;x8d%=-B;n%|6f`0UffZMTwh!5KHMKG6|Qfrc0caht@bUN zoDTra2+g4HZMX+!D^f3Z?(Up1$&q+hYiI4p{AB zG-a%5m3ZyUBe<1`v|kCQD35|LGfXq>ppE;O>aUjtYO4Ki13r%XNubfKBPi(vFW`P2 z*64PuwjFm0o*LarR@;GFGem67DOlc8t|tMvLp6qw3fCi1b8g zH_+1;T@BF`=M|v&t{OGAkzd8FrdB}{UtQCprKXmqud%7?UI#vjr~plE9&h0OJK$;) zYGDJuiFJ$3xFwo0E<4jSL9L6oj9Z*C&WY=X^ZGIUT#yU&3w-?=zbnwGTc>QDsyhRn zq`Lr}p4)?yKu2&QXbX-9tw9^WX*zTQ&?^fXf-tBKl0g#qtr`PVZ!gh7&;cpnAmSfD z?_wj$$AFJ0<(Zl)q_AM&i(wtnQk|_hrJJU1J-Tjj3oc}b5fecb=Q9a zYzN!G4)8d56l?{L0c|TD0orn04z$@?1GHh(rfn@)1+*{Jrd0br?FY+&HgMXMo&%Nv zZL7}%=K^-lNufIa#-%AuPHcqT7*q!#;DBV10>Ypg_%7LhZ)wU&`fT*vlqOU4d`-{O zJ_la{{iZ+<6!ie{b+8+}4Bi57fLFn5K+hxJ2CslOfu33Ft&}f-U0{>H^xTx;?kzZP z1#A4>N(wA71gctjl>w2yVX#ESa1x`*;!}h z6F?b#rxV3;a6UK>ECjmsECt$^6oRwB3a|t$U||lbsfB8G!4U^BQ2+z#}evA=?Mz`Ni*@IGix&o%`*ifgZw z1M3A(*MSI`aUcs&MO1TF?6KqeRj3P3;59?Sx>fll6YfKJ=L=qRJj)^|X= zz1M(F00Y4w@G{s5t_L@OYrxgud@vKt0@+{=$N_1fE$9N;gN~pR=nOi5HsC~X9B2tz zuyBN$fhM2^s0nI;R8SkZKyPW)gLS>5)4hCI72N16y!JXiFunW8hUIx3tE8tb|I@kmL3UtK%8(sAg&@uLY@DR{Z zRiB0~0c{9#B4`Uv0LO#ih5xWVE-V72fdB3*9{i^jy-8p+7z4(FabN=I3;KcnU;r2d z_+%(JInIK026%sECx$t z=n(fPI0KAgT5JUmgGa!lU>n#D^p?O6VZHoM?^4rug--+BC_o=L26}>CAOrLUQJ`0r z_W?1`7xV)Ukj8x=zL7sV;pughQ7{i;iU3Ch75 zY@Mi9gQvmcAPGGgR0rQ-e+xbbUw|*c$KVt2DY&1`yASAuR1Q{wC-rgDHXJ*^TlB;Z zpm#hDp)i?XI2Z^9fx+NG{Pgn4Q-I$8sgqCh1K(4FAHZI)nZoMLQtN>ZHP?Vkz(qhW zgnEifJPGuYO8xf~W58Ijh{Bx#P6Y?B*Mo8$m33;-tEuh+H-ekMGbHdVcn(y6o6&TT zxfQ&Qy%W3uej@H}_+`)lzwhBPkO`WArzym@WcV>SoxE1S7lY4e9ep4ZU&mhpq8O{cr8bVXZZ~zzqdILSC?hEv2dL)_O3l4xE!5u)a z^=nK%&A?jR`?OEj!vj5|9tXyN$v}^tyMtDgxTji(TKoXs0YfSM3<{#h%X*yL9sGng z0_gn@6|hd%%fW1L5@-%yB-8caDsVMW8mslf@0A!Af)!vnI3MUisRHQX=t7|9p>x4- z&=0&pMtZ=Riu*Of=^>{6FPIO(`(QJ85b!WE^gOKRk1vALu=O8ye2H7nAK#AiM^8F_ z0(z`+5L8pbpa%E`TTeYAxLcFiA8<0f5H0|EZm9o`NQI4pDPShZ0@J|`TGxdq!IQx_ zFaexR7o7*6mk)>&X4m3=n?66*qMz#Rt~fJEd!>yi`-5(d?Qn*Tlus3&P>;w}S=fx5T^ zECWkGAvg<^g7f5gJ~$gJ2j_qyun;T-3&6Qx5hw;~i3`9RWbzDn66ncD3R`8mS!#G*_dZ#_Df46upwdJ zlxJuiLJ@>~w2Bv;>~iiy*p9FQVS4K1>AEkD^m3KXb^d&vUDs(y+=6CLMa(n#a)cy= zWe7a0vyaNYDqE>}2q9o>Ey653&qQEPUN9({+wi;vVX<0vBc3-PtVh^{ zz}R-kOF_J~h>4HMUOZ%hfjx+KBcvj%2Ve(cHi$bB??Nbvv@2SAv_@ARSHUgT>U_LT zBKaf2RfIPPuMv2VUqgHap(={-GxL9ytXJvW$!VU>iI%L@nQ10d-pO%7a6qs}utTs#utBg!XaFpiV?5{a zLe350TY9|G<5gcd1fBxQAns#8RMAQu6SpL z4a^!U=L*<+HemUg%LF35x=M#>h2UBF?OT2c#S0szdI)t9*c|inBOHOvb6HG_KVp~*@VE) zUWi#PUGU6)Gt=bI2hTkbdLTeF5z59wFTC_dU>`RXAr{ZY0p=wat2-O50eE%*(f){e z<-k*$VfB!(0WbJlGBmZ@MqM{8-QKJVz#VAY6kWJx6m?C}Icvt#XhiaKkTplwcCqpv z8ktt}vR308=&kqmN6RUN0V@Hp24Gc>=rJpr#eT2VRQImttq1iTj-$t<->UQ1=4z<#R-GR{XIQ!wsa7Oy(-Aa_a4Gad+zHK^x+=hR_Q3RFQjwp)Sa@38cZU-cuR&Q5Y^m;oe?gm9m zP)zBw;p$o2gAQ6vXFtK}Nt(F>@VXSeQ|Ca3cIezRH|Q3UWS*Idqs;Rj?OWffb+{hN z)IgbPn9s<1C(5MKJ(MX0zIbLV255WDl8gp_CdC1&2NXF9-M>S5=bYQtI{kUsQL$F- z0A-I`!k|6ZQX?i_)!{1!SoPx_4NR^1;OA3 zF;`A)wK=N5(Fi}2w#X@goJyTmoeJ*Qr4({N#@i1gio#RDQh!QJ1)(2kajLG0G#T)c zRQnXBs|TsNAWbH@?S?!bBAHvBH)-vh8|UNgLB-EIfZ55RNC33&&8Yuw@LdEbt}b@L z12RSUaML~hZKCi#|S>dKS50lk&fNAdqz!89V6L)p-4H=ND6b)i_ zFHtV@@RW-01+EBG$PKvQDJwGlJU(!<{Lo+Ebs){&2i!&Kgh+k?Tp8e2wx9QD`RWJD zF)qD*eZ2$0Ao(5ut|B$%D1?rHtmX=3F!lBjsRc?oRCA91Sij#Cg$qS!3&|2>^@Woy z1_@R~(PHNVGg^1HJY=j;aHLkDQQ3S%Df|DGO)cHw=9Hy#U{empz+~}MU-h`++RdMT zRjB)Mv!9X|6KV;748RXlmrZY(=f2MfP%9KI{JMITI%LZ<)V%*zbpO8%Qd;7#xlfvd z(Bn_m$Mo%zZLNR=0lEu+^@_LCVh06dauiKd4}9dzq}Ascxao));jSlauK?6tlrx% z&^y4yi)J2y5>~)iVJ!{qtlfX*h1nggrZUe~_$xf;GTlN^HXrYgU@j?1RgQue$5O&3 z_Y3)DQha*mN$>(uu=E`%8UVeAyWqutPWMqqmM+JLwnGY6?u8hlOvnoE+V!+wb8}UW z)q?`-&?XesG^dkCA)P&RFH&-F0LgDnmKDC>tZ+={p)cJ2yoWjD>7_=KGdX^XT}G(< z!Kl`yF~@Y_+FVaMdkpO{p)bdDG4ipp!ji4*J8bC4&mG(p+4{0MzeI`0!Bhq2Wp07Rj+dYnWR2vo) zQ@dgdl`eI0K|c3Q)Q|bU-#rsB5cwd?Lry3YE1Z{ z^l@X+D&%_xy%0=IISQwqXE1wz>#W)RHE_Cs5I5Ge>B*#xH(!i4=Jcg=pdb$cfLoi_ zx!CU4p51>n0>+Uh4OL7fnWIIdPs12~4>(3?f@$dFo^zy%mdu#q449mv@c_W&a@#dN zbcx}G`$l%;eipdzDd?;&+_i97zV)FMXE6{If^5BBpqOh6q|5?rvhDX^>CLW15FopB z5a62tDtk`nC+7pfjE>q;XF~H@$*mO;E4_@*X3yzj^bY7yp3|>7j&IY~{~dcgOakr8 zLJo_hyZOfkPVYuHQF44as}otA2h-Q6!g(}R=z$g-4m*z;KhzLzW|3&;*HE(BZ1legqLrTM*WAQ+Vmq1X_SDx`NTtZLg)e;Trv!~X&0Mh}Fbm$siXm&ODW3i3k z7~!cjxm^a-51TIB_P}OmcO}o+G0F(7N09*F1I~UN^`%_3;228cg0oQ24h2sYZ9xs5 z3^-~mxQc2w7Io~VY=)jyp&8?QHSnE(^N108mpsy8vfqSIt#q9eK3qPcmUN|9WXRP* zg>$=1uC_P*Y4`TVlJ&{5iKwIl9bjlYpjhlAY-rG@)1cZFmKdQwQ!W7b34-ERu(lYO zI{1oik47HeP-w-9rZ(%N=O*3NY6c*M2S@_V%m98eb-jjY4vj`6FHtkS?l`^5yr!8T z)*|RH!YT(+jkuf=pqCA4zXD(@+9iIhPe=AZfk&>y# z@$1_xODNeKON;X=HcQQ!7SYV9>dEETj5#0GoaJvk{aeWHlox43HNS2kd34I|Y?YR;J@n|2O2?HOpyX-8Q%(Efe^ zu$~0DoE@;WY9$k6BgT+*CfYw!1(a|oy7fcvX0WA(Rwg5d9pl?k6&epeywJ-?dxx6S zr&+~KDNjblYBlipc<7p3MGkA1-O?~CrjNTbEGd0jR58@r1^4 zUSrC=3zPG@6_vOL=lpXkF>K{7uV+u_;Lrk|D6Y<7{}b5?d93 zvMli=-*#B22l62Irs)h02AGw!_^_C9SMPkT!gC@N8VV*lAGK!y2R*Z{C)rC-D3iWq zdH*lA3=I&Rrw+RhA!n?N%XAQqj`t8jZ61@=g1_3TZGVy7@Rm zVGH)b!gHs6*mCR>Od;P#IuC;Y6>|RA6-s^thI42iBKbo{QOLsKefyWw?i$v^ScKN6 z7mRC8(N7VzC2Nj)PzbzIL!$6ewI4dsw8t?2T3Y=Wp2COD!qhk=jb1o?T`NCj_EfY- zr6r0PNEW9$Pe8Iib>OHV2pxR_PcngS0q`%>RTh=Vj%q*EN&f;?>VXr~Ma&|j-&_kC zw;?WyJ6tg+CK}p=2Fp2SVp75P%+xup>l>&K+c^IKlV^1ADU>vg?4QAJYuR1s{?6B1 zUjDMr;T0Oqt|m06D{`#RExn~rNr6v?ZcuFubSIw1JVOT+}wKnA+46SFa!2MZlD<~fu1oB1zc+^_A zZo6iUha*O30yK{eSgHvcj^smqXi z8lHWjy=YhAoxKdicn6^5s7;VoCMiP=!ZD+tq-`n*CHnA1{zyFjV0 z(8w+1{<^T9P=?V=svReJmsad;iy^{$u}ZJ#KA>z{8?=;HS>RWuWRTI=&_0feQlu?3 z`>(`oyt$SdCYA}ImG9d=U-yysF1fWRoEJf%Z(x0@&=+eIt3~l|K%@mtMI`q`F{nwx zgrs}rEf0;t_{Olr@)74vbck^_#N-W?)gp_xP_X*c;Vs(Qie|pW;;-vSA?KM38}@!B zulIqTF%4AR7dbp#EZ5K8wBtevY;a@pQMN)y&@HAgk*wdLk{qhS(E_Uf4vAu$rnE0B z!CFw@-v1%|`M~)_KV&NW!Mxy9mNxwb4#$?P&!1pr;wS;nyWT`wztwrM4XOyb#Av}v z?#ptAR`>^=Q{{PnIfPc;}=mJGk1#Ptokd6GHRM-!Zd>AKE?3D-HAG}@~_P!^(5{g|kIYUVw zP`z4s7G-m(!&LMm66;g&N4zOJ$__g0UF#?o=@IXL6x3$DTfKa*Tah2N+U|V^V;255 zoiE&LUP-xJOEW6|3B7)v+I>RRJ81eR*u#IeHk|f+!fd*bGJqae_!#@2ICh2m@BJo< z*|bruK@ol>8 zVyxCmFPVJ164q*N1IuRYG09&beou<{f<93G@eR=5BqW=%%82 z_;oCXe@|H)iF1Q_vgD?BpDw1|UTc0xy}17&?riWT8c$g;E8r z#0uPj-?~zMQ$!7ErdCSSe&|RxMWpkP>%AgKokyP#$>DRwGOblg(xs|acZFOP)0Rp; zIsgjT_2E54$SRq->!cXXGfD%F7gUdQQZq~s{*vS`Z|N(n(Z0)%x~&_$<7ZVkD0Yw% zCDflli#a+AZd9Wg^G zMKHFMVQ!*1h|= z3aIw*P)&*;s-5dDT`4ynetIoE(jou?^W_Gj^67^ z3yY(s{&cQ5;Nz3T(){TAs_#=yWv}2Z7=Oi9FCa|`@Rv$5M_2G`b%=vmwWU-|5|Izk*SImgjaKeC|cv?=!lY5KVLEe+EFwB`q2O|g-3PDnZ2!B@3;}L z5IGnM3AKwx_8K(lbPr?BHrm9rF95)*VtN0PZ`HiCJR=~B?peWnoZcd&v?6O%l_4Ep z3-h5^y7A-#Cr|%RZ&mRItK;6tHc`|u!h3t&_qTi@-~jJHcBmq04Eu+|I?@(vsky;r zbR}mS=z(x;<@TUp4eqwZ>`Lu6pvrnsP|vq*DA5KK`q5&JRR2_2JQxa-tF7c>$Wi@R z;g`y;gT(r3>q?LBQv;mY(}M@d=BO4W!3EX-bI(O_RRJj6iB-K<;q1bfRro7K!FJ$J zy~%>1j#(m{cDasYfH z4R?_IdCu7AAUSCkr2gh0VY{PYYQCdXM5FnIG|oUhBN>sr^nf6$4UO`w8SWISbcZrx z)>8xk`cwee37@z3K(k%0=FI_6C+gqSoP`xjrSEg!;jM^VQKNKP%2oV9sm@ZO#)X1h z5GBw)7bG^LIwPZ{-R~H(M@uZ7akWgN2@iXHkbOL;wqrjh0A@q=Z5~cKt82Ft?UVb zGn-tu=$(}-__#w|TlrA;QW%fkCq;G6Ha7iRm9e}60Q@D^-B8*J3fNXm0}kweVS1ea zFOD9WXw|WQ{|TBUfJ13mZxYDgU8+)MEdXrP3*RuDOo{HGJD(OK>Qfijet4CX-(RyO z&a>W45X7wxUOxq$7M#8RIJ)=Is9(?{o=D++48Fu!46&Q%y)uW*J@=ptU(kVwIs?H9 z)1%$7qsuIpOIl51q}U_n61kNI{|R_ygX>!?H>+|3JDpb3A1QF+66`1v0NgU_$GF0) zC`w5H=nJ@d6ofGkz6&p^oXsj%U(%_l2L@pR_G!#f_sipB;+9-Ln~sL4_m>H=6(iQiVV&viHMHNSEg5O3ro0A4yfSAw{Xu2l|73eX+Q^YlAIsyQE znheG*03kj(IX|)PbF0)7ML>vE4JKkOS(ZU#b^%}oK(sTZWLHyB$R|MA0`(!;_N3duB7FGGQFNyahD!o@l|@qor?>%!TAekkX*43a zaO$a)Vk{*mfD7)DU6phlJa10TQYull3}PssaYLzTInev_vS@AJ7WXfdz4BbIGJ~EG zfC#g6(RIxm{`AJNRLPb~a}-JbbBW~wEUQo%#4OxiKh1t7zde9GK7$DTX?r;g^x6RM zKwH&%)%t~L?QuAR?t#kU{v~PnCR;0#5fyZ9!k048-Nwsw1>BIsRy$(~zagjO@URd6 zUUDW~1x#JT$-M$9R&S;R-N3CkF!*tPqhRafYmR9(yoH2$-=rN408X9=Kve*uS`ImP zV$8*KoraYJ4KUeC$xP@L?PFZA-?8Zr+{Ep_{Th+@Jj95rK`$ym6vb}|b=lXt+T|+4 zOCDD`Kxv{og;d0ts09Ga%53<9Wk1E}zO!Saq_nRQ9jXXb?gjw+LGyEZ#T~z|``Jzt zg%s}m(TLp;=d_!#YsZrvi%}Hzv<8Otd9tVk?mhy*y1t_9(^>xha#K{!7aO38>bkf& zb*Kb`yO3rgl2h-9Q5Cy$)s;2P?!Q(0)gKJfEyn%Jo-vK6Ed8i)q))t?tgabLlTQ_J zaelmD*V_3va=KXK8jCDu|8 zXlZ=S?-$i9webMzP|GT9%xX#Orbz{}I4)Rf;YP%gh^&^Ug3LSt&c|N8Kl!h9qreX%FPie2s0e$w_0 zlVFMrwA_$m138rc?M9RFKODm%(~#ps(|y23T@_IB^pdu|y>~_!0j=o>0GeKu!MM?C z6&_=ET74=u6nA3`gs>}K4S*E@unuMp$hvgZYS4BgU^}Jwg3xj5#JHI5RHOS!?ux1T6Pk8VmT)TioZeA>+k*T&W8?nL zk+VD*IQEV9K8y`Dy?c{qTy+-vg)aG{*-4b;FNNzLsJN1mf6&_{DG7?cE3S7Aa%4~# zo>+fgrMbThF;Xz60Ra%zYDx|Op^CJRBlYbomJK5QO16gPtkO#X-?Xqq;5Uu_OR`@z zj*k8fC$!Db`CkdKz|#J7x4IPYkDD@(V<2WASU$A{Uw5JyHwNl2Xe&k$es(_%k!<%$ z%yv4Z`5QE#O%Q(17};sLE)8 z0#KC2AYFCP7o=wf(qG}#f$>#W(&1WC?*gUljDN{7JOs_`LmNUMl|l4d2;9j*?}c+a zWO>qxWy_a7gjC=jvAtC8W!X|#D7Ji+%USl+F;pt05%;^~un(f((h;M3MUDA^*I8=8 zDU=e5`EJTb;blZVh#XhXeD_BH*h@#(%|#ARm39M5`1vRE831}hnJR^mmm^@^*)4p& za#gjZ;d#8CQAfo!@~sW#$52y5^7K5>rH866z8T!wiSKhUAxv~jXi5^lzH(imnhp&u@QnYzxUrBQg+~5|8wpJq+)!t|ZXLdeX(OlMGh|)H@dr^sqh_$X}Jhl*RWkXh#DSF6gF$_H!$` z(h!>o>irFI{h+YBZ5Wlx-8L*|Lc|Prg zNUM-*b114@n{#l*(^8b?CGn+XE4SknpGN#unhv#*^mMz4w4}fu)E9o&Bn%&H@=8MX zERqztJb#ksfQKI7VJGmN3S)D)522_HRq0=KlA zc|zFpt&NqDr);T=qjAmPX3qtHedf64yS&f$>+o2qN!jJ>Lz-}CrFur_uZIm-8V(!K zkS>Lzf;N=Jk@zA=2NNNdCOk~V0;IIEi?pPKMzKu~{KAUYyw-58$^e!r>gPe??)+C* zo%kcA7tKLjx!2_EdK;g4DeLU%Ka_OTUL7H>(xM_0>~V!gU<^#8_z2)d^pE>#*jMA_ z6S~Tb4n;^+G!B#nxVZy<#DJZ>ie%9O+a`wBT1aN=HrgrpW1pW}^|I0!auTRR3sf_i zhPHqeysF}!teawa?V2fk=D9w?eom%i3^4p-fUsg;T8t{6enF9~azx@o){!8jObPZB z7Afg)xf858XM)|eQ62Z>hB=BrGJTiLsJ@EJfk#E>GZGGnfj-W8nH7FG%v2D z^D7(_@Da6t4SW!W90ycU;c42r@wVYpj5)Tn7)w;SGJcQB34mprZukG#rS)nf;5)hi zfWAEdya;r2NqV|rU+Gdtz+g3}b&01Fd$t?Z(3mrg+*+aN8UT2gY{%k5*E1ijTx0|s zMvfbD>Ri5aY)OYTBaJ!zsUM2UQ}8t{7qzo=ifysAQZ*f}hKQ4aRg?rk;1K|L_kP-n zoi*dPPINH>?jVQH3@UY-)3?HrA`Of=pIs@Z6}r#O4gdH7h|16V*x4>Hi#H;|$fGq> zq$33*l1Bnp8o1ter?=bPUUSokTS&10X!p3$l-5#$W(^f@1NlfsKerA}`nP5gGM_WM6ERX=J6=d&|u z+C!#|Nk$|WE`q)k!ML&H))f)aiw=mQXlZ*`#2~uFc^&9N7tkntuP%nNQCJ>PR*daU z$^F`)NSDnYR;BTBg@{}{q84Y z&cSlDzXO!$8W3zHT3zova^!(pyf@9xIn1u8!}Y=-VX8c}o;7D})8P{%gG-oIj>>j~ z({{YP7`E-!Wu2^-e0I262~5yXith-6aijvR0Z<=NQJ8qE*W;}m%f}k_(y-~+0XfXY zpG8j(>#}nrUk?Hgyq^?D7M&DvT6f0YKlJ4$plk|a7fyJxs?_0oMyR+bNkckG0os=p zsY_?co(pI@iZ}rT z!etoT#B`8AQ;>Jk7cTk2<*Eq9nNDNfDUdP0vLQE!zzp_neH z@Nbt(Y<${eJs>vRCD00`bS(d)s>ICv5UfKXS1%103^ zCGLMkcE!|II9a8Xzx>ZhG&BTDO(?kn2*>IvxEn5>9jYdJDLZ(^u?kk*a~0>wJ5Z0` zV5mlM-LP5n4hXh~gGSMi^XFYWjRqk>2y{((AY9k2k zMh*}2CpEect~BSBnXzbEAa(8m31k4lUDRyRl$v2(-iD@_hg4cH?X2A$NFRHk4W{JP6YBrBrv1~@e z1@3eSY~YMBi=)OQ^~SIgyt$^Sbia5`ja%6AIqu28s41l~LTO-cI8@)9Z93y0_kkSl z* zZaUgm`td*YiJgaXAXs44)%gIx(0D)E)DJyvOO5+OX6k;rh~(?_#2`3yxAXn**syNK z&sM8YTK~To!fDnQ6qf5Z5by)j-ZZd#G4g~F-iE>lfO-!~8~|-O(U6u5fVTXO-#TPP z{ryFFhllx9u`Pj%JZwfy9yO$kKVnF->c=ga zrVHR5VX|e9Tc)Ie#!9rmH>8#WF+CPeN+}TI8ik+E<8f^jl|IVe-Ud@J$SGDmuOWHH zV#I|}>sYj+DNW|64IPNZdP}*|8;)z?)8mk6MMn_HR!zl{WX=qiI`y_Hx8+n_-c6SA z;O;%`As2gAX*5Kak$u_Cz< zPKySkapH?)dNdeQY!JyqARiZs7=q@*XX!fx_u~#yDyNR5ETpQ+r+w9eN)H8@Pc5kC zP%LbI*eiCg7PYwas{Q%-#T3J!OvF_wc_^e^qotTA8=NxQ5o)5XS;iiR1AW$+*EEGIipLbGOkGlu}$~fh(06#}MgNy2=e=Lda?Wj`<{#?0 z#ltl1kC*M${0Dct&e#*$Yin=3^W6X7daL~{dQIy;ghmdRYFp2kCXy%A(4Wv zP7jydeT!z|7k7X@rAb-jHfP2Bs(9zo^tk1jlYKMHhX>)k65h+cv$O9W_(x7RavmYM zkGmHxOwOq(+wzXJh+LD4cXm=94EeE-RgcCQpYYDZV0FI^Q+qY6<65t|$RBwwCGW=( zkM+&*&e9t_;99-AF@D8w0MD!M-8tn>&CNCI6ODYH0xY8=9V;$qaCyOSA*2s!xa);o zhtv_$G|kT~M@gwIN0}y=r8&}^$vzhhy#% }); }); // -describe("given a `bunfig.toml` with a list of preloads", () => { +describe("Given a `bunfig.toml` with a list of preloads", () => { const dir = fixturePath("multi"); it("When `bun run` is run, preloads are run", async () => { @@ -79,3 +79,14 @@ describe("given a `bunfig.toml` with a list of preloads", () => { expect(code).toBe(0); }); }); + +describe("Given a `bunfig.toml` with a plugin preload", () => { + const dir = fixturePath("plugin"); + + it("When `bun run` is run, preloads are run", async () => { + const [out, err, code] = await run("index.ts", { cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); +}); diff --git a/test/package.json b/test/package.json index edc248dadfa608..7594fa6d2e4fd6 100644 --- a/test/package.json +++ b/test/package.json @@ -25,6 +25,7 @@ "aws-cdk-lib": "2.148.0", "axios": "1.6.8", "body-parser": "1.20.2", + "bun-plugin-yaml": "^0.0.1", "comlink": "4.4.1", "devalue": "5.1.1", "es-module-lexer": "1.3.0", From ade532d509d0eb49a0143a36dd6ab69244922a27 Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Mon, 13 Jan 2025 15:16:06 -0800 Subject: [PATCH 4/9] add parent dir test --- .../bunfig/fixtures/preload/parent/foo/bunfig.toml | 1 + .../bunfig/fixtures/preload/parent/foo/index.ts | 2 ++ test/config/bunfig/fixtures/preload/parent/preload.ts | 1 + test/config/bunfig/preload.test.ts | 11 +++++++++++ test/package.json | 2 +- 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 test/config/bunfig/fixtures/preload/parent/foo/bunfig.toml create mode 100644 test/config/bunfig/fixtures/preload/parent/foo/index.ts create mode 100644 test/config/bunfig/fixtures/preload/parent/preload.ts diff --git a/test/config/bunfig/fixtures/preload/parent/foo/bunfig.toml b/test/config/bunfig/fixtures/preload/parent/foo/bunfig.toml new file mode 100644 index 00000000000000..dc6530df6cc183 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/parent/foo/bunfig.toml @@ -0,0 +1 @@ +preload = "../preload.ts" diff --git a/test/config/bunfig/fixtures/preload/parent/foo/index.ts b/test/config/bunfig/fixtures/preload/parent/foo/index.ts new file mode 100644 index 00000000000000..4c25bfd856a6e2 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/parent/foo/index.ts @@ -0,0 +1,2 @@ +import assert from "node:assert"; +assert.equal(globalThis.preload, "parent/preload.ts"); diff --git a/test/config/bunfig/fixtures/preload/parent/preload.ts b/test/config/bunfig/fixtures/preload/parent/preload.ts new file mode 100644 index 00000000000000..314c0bc98fe54c --- /dev/null +++ b/test/config/bunfig/fixtures/preload/parent/preload.ts @@ -0,0 +1 @@ +globalThis.preload = "parent/preload.ts"; diff --git a/test/config/bunfig/preload.test.ts b/test/config/bunfig/preload.test.ts index 5e5fb508192372..f03f524d1a1733 100644 --- a/test/config/bunfig/preload.test.ts +++ b/test/config/bunfig/preload.test.ts @@ -90,3 +90,14 @@ describe("Given a `bunfig.toml` with a plugin preload", () => { expect(code).toBe(0); }); }); + +describe("Given a `bunfit.toml` file with a relative path to a preload in a parent directory", () => { + const dir = fixturePath("parent", "foo"); + + it("When `bun run` is run, preloads are run", async () => { + const [out, err, code] = await run("index.ts", { cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); +}); diff --git a/test/package.json b/test/package.json index 7594fa6d2e4fd6..f9a1aec0c72f0a 100644 --- a/test/package.json +++ b/test/package.json @@ -25,7 +25,7 @@ "aws-cdk-lib": "2.148.0", "axios": "1.6.8", "body-parser": "1.20.2", - "bun-plugin-yaml": "^0.0.1", + "bun-plugin-yaml": "0.0.1", "comlink": "4.4.1", "devalue": "5.1.1", "es-module-lexer": "1.3.0", From 563602e5c511986b4d26293ce7d7a56f317854bd Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Mon, 13 Jan 2025 15:58:23 -0800 Subject: [PATCH 5/9] test fixes --- .../bunfig/fixtures/preload/mixed/bunfig.toml | 5 ++++- .../preload/mixed/index.fixture-test.ts | 8 +++----- .../bunfig/fixtures/preload/mixed/index.ts | 2 +- .../fixtures/preload/mixed/preload-all.ts | 2 -- .../fixtures/preload/mixed/preload-run.ts | 2 ++ test/config/bunfig/preload.test.ts | 17 ++++++++++------- 6 files changed, 20 insertions(+), 16 deletions(-) delete mode 100644 test/config/bunfig/fixtures/preload/mixed/preload-all.ts create mode 100644 test/config/bunfig/fixtures/preload/mixed/preload-run.ts diff --git a/test/config/bunfig/fixtures/preload/mixed/bunfig.toml b/test/config/bunfig/fixtures/preload/mixed/bunfig.toml index c7ccc6d9f27a75..1e62e86cb17adb 100644 --- a/test/config/bunfig/fixtures/preload/mixed/bunfig.toml +++ b/test/config/bunfig/fixtures/preload/mixed/bunfig.toml @@ -1 +1,4 @@ -preload = "./preload.ts" +preload = "./preload-run.ts" + +[test] +preload = "./preload-test.ts" diff --git a/test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts b/test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts index a3be30ea4ea5ff..9b13cff65c1912 100644 --- a/test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts +++ b/test/config/bunfig/fixtures/preload/mixed/index.fixture-test.ts @@ -1,7 +1,5 @@ it("the correct file was preloaded", () => { - expect(globalThis.preload).toBe([ - // order is important b/c it shows what was loaded first - "mixed/preload-all.ts", - "mixed/preload-test.ts", - ]); + expect(globalThis.preload).toBeDefined(); + expect(globalThis.preload).toBeArrayOfSize(1); + expect(globalThis.preload[0]).toEqual("mixed/preload-test.ts"); }); diff --git a/test/config/bunfig/fixtures/preload/mixed/index.ts b/test/config/bunfig/fixtures/preload/mixed/index.ts index 10443d1f53d55a..0cfbbe190a9429 100644 --- a/test/config/bunfig/fixtures/preload/mixed/index.ts +++ b/test/config/bunfig/fixtures/preload/mixed/index.ts @@ -1,2 +1,2 @@ import assert from "node:assert"; -assert.strictEqual(globalThis.preload, ["mixed/preload-all.ts"]); +assert.deepStrictEqual(globalThis.preload, ["mixed/preload-run.ts"]); diff --git a/test/config/bunfig/fixtures/preload/mixed/preload-all.ts b/test/config/bunfig/fixtures/preload/mixed/preload-all.ts deleted file mode 100644 index d167ec4e88f41e..00000000000000 --- a/test/config/bunfig/fixtures/preload/mixed/preload-all.ts +++ /dev/null @@ -1,2 +0,0 @@ -// this file's name so we know the right file was loaded -(globalThis.preload ??= []).push("mixed/preload-all.ts"); diff --git a/test/config/bunfig/fixtures/preload/mixed/preload-run.ts b/test/config/bunfig/fixtures/preload/mixed/preload-run.ts new file mode 100644 index 00000000000000..6e7541bf98ca13 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/mixed/preload-run.ts @@ -0,0 +1,2 @@ +// this file's name so we know the right file was loaded +(globalThis.preload ??= []).push("mixed/preload-run.ts"); diff --git a/test/config/bunfig/preload.test.ts b/test/config/bunfig/preload.test.ts index f03f524d1a1733..2f04b8908d15e4 100644 --- a/test/config/bunfig/preload.test.ts +++ b/test/config/bunfig/preload.test.ts @@ -38,7 +38,10 @@ describe("Given a single universal preload", () => { it("When `bun run` is run from a different directory but bunfig.toml is explicitly used, preloads are run", async () => { // `bun run index.ts` - const [out, err, code] = await run(join(dir, "index.ts"), { args: ["--config=bunfig.toml"], cwd: process.cwd() }); + const [out, err, code] = await run(join(dir, "index.ts"), { + args: [`--config=${join(dir, "bunfig.toml")}`], + cwd: process.cwd(), + }); expect(err).toEqual(""); expect(out).toEqual(""); expect(code).toBe(0); @@ -55,10 +58,10 @@ describe("Given a bunfig.toml with both universal and test-only preloads", () => expect(code).toBe(0); }); - it("`bun test` loads both the universal and test-only preloads", async () => { + it("`bun test` only loads test-only preloads, clobbering the universal ones", async () => { const [out, err, code] = await run("./index.fixture-test.ts", { subcommand: "test", cwd: dir }); - expect(err).toEqual(""); - expect(out).toEqual(""); + // note: err has test report, out has "bun test " + expect(code).toBe(0); }); }); // @@ -78,7 +81,7 @@ describe("Given a `bunfig.toml` with a list of preloads", () => { expect(out).toEqual(""); expect(code).toBe(0); }); -}); +}); // describe("Given a `bunfig.toml` with a plugin preload", () => { const dir = fixturePath("plugin"); @@ -89,7 +92,7 @@ describe("Given a `bunfig.toml` with a plugin preload", () => { expect(out).toEqual(""); expect(code).toBe(0); }); -}); +}); // describe("Given a `bunfit.toml` file with a relative path to a preload in a parent directory", () => { const dir = fixturePath("parent", "foo"); @@ -100,4 +103,4 @@ describe("Given a `bunfit.toml` file with a relative path to a preload in a pare expect(out).toEqual(""); expect(code).toBe(0); }); -}); +}); // From 9b4e3360638d3243c9427cc690324e17642126ba Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Mon, 13 Jan 2025 16:23:42 -0800 Subject: [PATCH 6/9] test: add cli arg merging case --- test/config/bunfig/fixtures/preload/multi/cli-merge.ts | 2 ++ test/config/bunfig/fixtures/preload/multi/preload3.ts | 1 + test/config/bunfig/fixtures/preload/multi/readme.md | 2 ++ test/config/bunfig/preload.test.ts | 8 ++++++++ 4 files changed, 13 insertions(+) create mode 100644 test/config/bunfig/fixtures/preload/multi/cli-merge.ts create mode 100644 test/config/bunfig/fixtures/preload/multi/preload3.ts diff --git a/test/config/bunfig/fixtures/preload/multi/cli-merge.ts b/test/config/bunfig/fixtures/preload/multi/cli-merge.ts new file mode 100644 index 00000000000000..9349e85765539f --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/cli-merge.ts @@ -0,0 +1,2 @@ +import assert from "node:assert"; +assert.strictEqual(globalThis.preload, ["multi/preload1.ts", "multi/preload2.ts", "multi/preload3.ts"]); diff --git a/test/config/bunfig/fixtures/preload/multi/preload3.ts b/test/config/bunfig/fixtures/preload/multi/preload3.ts new file mode 100644 index 00000000000000..c5da4a33666318 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/multi/preload3.ts @@ -0,0 +1 @@ +(globalThis.preload ??= []).push("multi/preload3.ts"); diff --git a/test/config/bunfig/fixtures/preload/multi/readme.md b/test/config/bunfig/fixtures/preload/multi/readme.md index a2de8dfc083dbe..d0647ee5c19ccb 100644 --- a/test/config/bunfig/fixtures/preload/multi/readme.md +++ b/test/config/bunfig/fixtures/preload/multi/readme.md @@ -4,3 +4,5 @@ Used to test 3 behaviors: 2. `preload`s without a leading `./` are still resolved relative to `bunfig.toml` 3. When a bunfig is specified via `--config=`, the "default" bunfig (i.e. `bunfig.toml` in the same dir as cwd) is not loaded. +4. Using `--preload ` adds `` to the preload list without clobbering + existing preloads. diff --git a/test/config/bunfig/preload.test.ts b/test/config/bunfig/preload.test.ts index 2f04b8908d15e4..ffca3f60f7045e 100644 --- a/test/config/bunfig/preload.test.ts +++ b/test/config/bunfig/preload.test.ts @@ -75,12 +75,20 @@ describe("Given a `bunfig.toml` with a list of preloads", () => { expect(out).toEqual(""); expect(code).toBe(0); }); + it("when passed `--config=bunfig.empty.toml`, preloads are not run", async () => { const [out, err, code] = await run("empty.ts", { args: ["--config=bunfig.empty.toml"], cwd: dir }); expect(err).toEqual(""); expect(out).toEqual(""); expect(code).toBe(0); }); + + it("When `--preload=preload3.ts` is passed via CLI args, its added to the list of preloads", async () => { + const [out, err, code] = await run("cli-merge.ts", { args: ["--preload=preload3.ts"], cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); }); // describe("Given a `bunfig.toml` with a plugin preload", () => { From aed592086eae9e46ca65b46f46c814e623b4aac0 Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Mon, 13 Jan 2025 16:37:10 -0800 Subject: [PATCH 7/9] test: `--preload ` merging --- .../bunfig/fixtures/preload/multi/bunfig.toml | 3 +-- .../bunfig/fixtures/preload/multi/index.ts | 2 +- .../bunfig/fixtures/preload/multi/readme.md | 5 ++--- .../fixtures/preload/relative/bunfig.toml | 2 ++ .../preload/relative/index.fixture-test.ts | 3 +++ .../bunfig/fixtures/preload/relative/index.ts | 2 ++ .../fixtures/preload/relative/preload.ts | 2 ++ test/config/bunfig/preload.test.ts | 18 ++++++++++++++++-- 8 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 test/config/bunfig/fixtures/preload/relative/bunfig.toml create mode 100644 test/config/bunfig/fixtures/preload/relative/index.fixture-test.ts create mode 100644 test/config/bunfig/fixtures/preload/relative/index.ts create mode 100644 test/config/bunfig/fixtures/preload/relative/preload.ts diff --git a/test/config/bunfig/fixtures/preload/multi/bunfig.toml b/test/config/bunfig/fixtures/preload/multi/bunfig.toml index 8996cf2bea7889..b82a834a3ddacd 100644 --- a/test/config/bunfig/fixtures/preload/multi/bunfig.toml +++ b/test/config/bunfig/fixtures/preload/multi/bunfig.toml @@ -1,2 +1 @@ -# second one is testing for "implicit" relative path -preload = ["./preload1.ts", "preload2.ts"] +preload = ["./preload1.ts", "./preload2.ts"] diff --git a/test/config/bunfig/fixtures/preload/multi/index.ts b/test/config/bunfig/fixtures/preload/multi/index.ts index 5e747895ee8501..f30ee8f1902361 100644 --- a/test/config/bunfig/fixtures/preload/multi/index.ts +++ b/test/config/bunfig/fixtures/preload/multi/index.ts @@ -1,2 +1,2 @@ import assert from "node:assert"; -assert.strictEqual(globalThis.preload, ["multi/preload1.ts", "multi/preload2.ts"]); +assert.deepStrictEqual(globalThis.preload, ["multi/preload1.ts", "multi/preload2.ts"]); diff --git a/test/config/bunfig/fixtures/preload/multi/readme.md b/test/config/bunfig/fixtures/preload/multi/readme.md index d0647ee5c19ccb..9225887e195446 100644 --- a/test/config/bunfig/fixtures/preload/multi/readme.md +++ b/test/config/bunfig/fixtures/preload/multi/readme.md @@ -1,8 +1,7 @@ Used to test 3 behaviors: 1. `preload` can be an array -2. `preload`s without a leading `./` are still resolved relative to `bunfig.toml` -3. When a bunfig is specified via `--config=`, the "default" bunfig (i.e. +2. When a bunfig is specified via `--config=`, the "default" bunfig (i.e. `bunfig.toml` in the same dir as cwd) is not loaded. -4. Using `--preload ` adds `` to the preload list without clobbering +3. Using `--preload ` adds `` to the preload list without clobbering existing preloads. diff --git a/test/config/bunfig/fixtures/preload/relative/bunfig.toml b/test/config/bunfig/fixtures/preload/relative/bunfig.toml new file mode 100644 index 00000000000000..344ba93ef21c82 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/relative/bunfig.toml @@ -0,0 +1,2 @@ +# no "./", should be treated as a relative path +preload = "preload.ts" diff --git a/test/config/bunfig/fixtures/preload/relative/index.fixture-test.ts b/test/config/bunfig/fixtures/preload/relative/index.fixture-test.ts new file mode 100644 index 00000000000000..a4c5c8d77487c1 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/relative/index.fixture-test.ts @@ -0,0 +1,3 @@ +it("the correct file was preloaded", () => { + expect(globalThis.preload).toBe("simple/preload.ts"); +}); diff --git a/test/config/bunfig/fixtures/preload/relative/index.ts b/test/config/bunfig/fixtures/preload/relative/index.ts new file mode 100644 index 00000000000000..9b0f41c2b039ea --- /dev/null +++ b/test/config/bunfig/fixtures/preload/relative/index.ts @@ -0,0 +1,2 @@ +import assert from "node:assert"; +assert.strictEqual(globalThis.preload, "simple/preload.ts"); diff --git a/test/config/bunfig/fixtures/preload/relative/preload.ts b/test/config/bunfig/fixtures/preload/relative/preload.ts new file mode 100644 index 00000000000000..4a8e0dba28c299 --- /dev/null +++ b/test/config/bunfig/fixtures/preload/relative/preload.ts @@ -0,0 +1,2 @@ +// this file's name so we know the right file was loaded +globalThis.preload = "simple/preload.ts"; diff --git a/test/config/bunfig/preload.test.ts b/test/config/bunfig/preload.test.ts index ffca3f60f7045e..778bffed90e028 100644 --- a/test/config/bunfig/preload.test.ts +++ b/test/config/bunfig/preload.test.ts @@ -84,7 +84,8 @@ describe("Given a `bunfig.toml` with a list of preloads", () => { }); it("When `--preload=preload3.ts` is passed via CLI args, its added to the list of preloads", async () => { - const [out, err, code] = await run("cli-merge.ts", { args: ["--preload=preload3.ts"], cwd: dir }); + // const [out, err, code] = await run("cli-merge.ts", { args: ["--preload=preload3.ts"], cwd: dir }); + const [out, err, code] = await run("cli-merge.ts", { args: ["--preload", "./preload3.ts"], cwd: dir }); expect(err).toEqual(""); expect(out).toEqual(""); expect(code).toBe(0); @@ -102,7 +103,7 @@ describe("Given a `bunfig.toml` with a plugin preload", () => { }); }); // -describe("Given a `bunfit.toml` file with a relative path to a preload in a parent directory", () => { +describe("Given a `bunfig.toml` file with a relative path to a preload in a parent directory", () => { const dir = fixturePath("parent", "foo"); it("When `bun run` is run, preloads are run", async () => { @@ -112,3 +113,16 @@ describe("Given a `bunfit.toml` file with a relative path to a preload in a pare expect(code).toBe(0); }); }); // + +// `preload="preload.ts"` is a relative path, just like `preload="./preload.ts"` +// fixture is in "relative" +describe("Given a `bunfig.toml` file with a relative path without a leading './'", () => { + const dir = fixturePath("relative"); + + it("preload = 'preload.ts' is treated like a relative path and loaded", async () => { + const [out, err, code] = await run("index.ts", { cwd: dir }); + expect(err).toEqual(""); + expect(out).toEqual(""); + expect(code).toBe(0); + }); +}); // From f8e71bc287bfada13a7bac68ef092654dfbbb10d Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Mon, 13 Jan 2025 17:07:28 -0800 Subject: [PATCH 8/9] cli merge testing --- .../fixtures/preload/multi/cli-merge.ts | 2 +- test/config/bunfig/preload.test.ts | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/test/config/bunfig/fixtures/preload/multi/cli-merge.ts b/test/config/bunfig/fixtures/preload/multi/cli-merge.ts index 9349e85765539f..becf498022748c 100644 --- a/test/config/bunfig/fixtures/preload/multi/cli-merge.ts +++ b/test/config/bunfig/fixtures/preload/multi/cli-merge.ts @@ -1,2 +1,2 @@ import assert from "node:assert"; -assert.strictEqual(globalThis.preload, ["multi/preload1.ts", "multi/preload2.ts", "multi/preload3.ts"]); +assert.deepStrictEqual(globalThis.preload, ["multi/preload1.ts", "multi/preload2.ts", "multi/preload3.ts"]); diff --git a/test/config/bunfig/preload.test.ts b/test/config/bunfig/preload.test.ts index 778bffed90e028..7696a55119d0e6 100644 --- a/test/config/bunfig/preload.test.ts +++ b/test/config/bunfig/preload.test.ts @@ -5,13 +5,12 @@ import type { SpawnOptions } from "bun"; const fixturePath = (...segs: string[]) => resolve(import.meta.dirname, "fixtures", "preload", ...segs); type Opts = { - subcommand?: "run" | "test"; args?: string[]; cwd?: string; }; type Out = [stdout: string, stderr: string, exitCode: number]; -const run = (file: string, { subcommand = "run", args = [], cwd }: Opts = {}): Promise => { - const res = Bun.spawn([bunExe(), subcommand, ...args, file], { +const run = (file: string, { args = [], cwd }: Opts = {}): Promise => { + const res = Bun.spawn([bunExe(), ...args, file], { cwd, stdio: ["ignore", "pipe", "pipe"], env: bunEnv, @@ -36,7 +35,7 @@ describe("Given a single universal preload", () => { expect(code).toBe(0); }); - it("When `bun run` is run from a different directory but bunfig.toml is explicitly used, preloads are run", async () => { + it("When `bun run` is run from a different directory but bunfig.toml is explicitly used, preloads are run", async () => { // `bun run index.ts` const [out, err, code] = await run(join(dir, "index.ts"), { args: [`--config=${join(dir, "bunfig.toml")}`], @@ -59,7 +58,7 @@ describe("Given a bunfig.toml with both universal and test-only preloads", () => }); it("`bun test` only loads test-only preloads, clobbering the universal ones", async () => { - const [out, err, code] = await run("./index.fixture-test.ts", { subcommand: "test", cwd: dir }); + const [out, err, code] = await run("./index.fixture-test.ts", { args: ["test"], cwd: dir }); // note: err has test report, out has "bun test " expect(code).toBe(0); @@ -83,9 +82,16 @@ describe("Given a `bunfig.toml` with a list of preloads", () => { expect(code).toBe(0); }); - it("When `--preload=preload3.ts` is passed via CLI args, its added to the list of preloads", async () => { - // const [out, err, code] = await run("cli-merge.ts", { args: ["--preload=preload3.ts"], cwd: dir }); - const [out, err, code] = await run("cli-merge.ts", { args: ["--preload", "./preload3.ts"], cwd: dir }); + it.each([ + // + "--preload ./preload3.ts", + "--preload=./preload3.ts", + "--preload ./preload3.ts run", + "--preload=./preload3.ts run", + "run --preload ./preload3.ts", + "run --preload=./preload3.ts", + ])("When `bun %s cli-merge.ts` is run, `--preload` adds the target file to the list of preloads", async args => { + const [out, err, code] = await run("cli-merge.ts", { args: args.split(" "), cwd: dir }); expect(err).toEqual(""); expect(out).toEqual(""); expect(code).toBe(0); From 58d60bc8adf896cc46b1f83204a04acfa107a15f Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Mon, 13 Jan 2025 17:24:33 -0800 Subject: [PATCH 9/9] test: disable currently-failing test cases --- test/config/bunfig/preload.test.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/test/config/bunfig/preload.test.ts b/test/config/bunfig/preload.test.ts index 7696a55119d0e6..5ffda91d719711 100644 --- a/test/config/bunfig/preload.test.ts +++ b/test/config/bunfig/preload.test.ts @@ -35,7 +35,8 @@ describe("Given a single universal preload", () => { expect(code).toBe(0); }); - it("When `bun run` is run from a different directory but bunfig.toml is explicitly used, preloads are run", async () => { + // FIXME: relative paths are being resolved to cwd, not the file's directory + it.skip("When `bun run` is run from a different directory but bunfig.toml is explicitly used, preloads are run", async () => { // `bun run index.ts` const [out, err, code] = await run(join(dir, "index.ts"), { args: [`--config=${join(dir, "bunfig.toml")}`], @@ -86,10 +87,11 @@ describe("Given a `bunfig.toml` with a list of preloads", () => { // "--preload ./preload3.ts", "--preload=./preload3.ts", - "--preload ./preload3.ts run", - "--preload=./preload3.ts run", - "run --preload ./preload3.ts", - "run --preload=./preload3.ts", + // FIXME: Tests are failing due to active bugs + // "--preload ./preload3.ts run", + // "--preload=./preload3.ts run", + // "run --preload ./preload3.ts", + // "run --preload=./preload3.ts", ])("When `bun %s cli-merge.ts` is run, `--preload` adds the target file to the list of preloads", async args => { const [out, err, code] = await run("cli-merge.ts", { args: args.split(" "), cwd: dir }); expect(err).toEqual(""); @@ -120,12 +122,11 @@ describe("Given a `bunfig.toml` file with a relative path to a preload in a pare }); }); // -// `preload="preload.ts"` is a relative path, just like `preload="./preload.ts"` -// fixture is in "relative" describe("Given a `bunfig.toml` file with a relative path without a leading './'", () => { const dir = fixturePath("relative"); - it("preload = 'preload.ts' is treated like a relative path and loaded", async () => { + // FIXME: currently treaded as an import to an external package + it.skip("preload = 'preload.ts' is treated like a relative path and loaded", async () => { const [out, err, code] = await run("index.ts", { cwd: dir }); expect(err).toEqual(""); expect(out).toEqual("");