diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/bun.js/bun-loader-svelte/bun-loader-svelte.ts | 18 | ||||
-rw-r--r-- | test/bun.js/bun-loader-svelte/package.json | 4 | ||||
-rw-r--r-- | test/bun.js/plugins.test.ts | 185 |
3 files changed, 174 insertions, 33 deletions
diff --git a/test/bun.js/bun-loader-svelte/bun-loader-svelte.ts b/test/bun.js/bun-loader-svelte/bun-loader-svelte.ts new file mode 100644 index 000000000..f0a6e3419 --- /dev/null +++ b/test/bun.js/bun-loader-svelte/bun-loader-svelte.ts @@ -0,0 +1,18 @@ +import { plugin } from "bun"; + +await plugin({ + name: "svelte loader", + async setup(builder) { + var { compile } = await import("svelte/compiler"); + var { readFileSync } = await import("fs"); + await 2; + builder.onLoad({ filter: /\.svelte$/ }, ({ path }) => ({ + contents: compile(readFileSync(path, "utf8"), { + filename: path, + generate: "ssr", + }).js.code, + loader: "js", + })); + await 1; + }, +}); diff --git a/test/bun.js/bun-loader-svelte/package.json b/test/bun.js/bun-loader-svelte/package.json new file mode 100644 index 000000000..ae4958ccc --- /dev/null +++ b/test/bun.js/bun-loader-svelte/package.json @@ -0,0 +1,4 @@ +{ + "name": "bun-loader-svelte", + "module": "./bun-loader-svelte.ts" +} diff --git a/test/bun.js/plugins.test.ts b/test/bun.js/plugins.test.ts index 743790cac..6593b077d 100644 --- a/test/bun.js/plugins.test.ts +++ b/test/bun.js/plugins.test.ts @@ -1,7 +1,8 @@ -import { it, expect, describe, afterAll } from "bun:test"; +import { plugin } from "bun"; +import { describe, expect, it } from "bun:test"; import { resolve } from "path"; -Bun.plugin({ +plugin({ name: "boop beep beep", setup(builder) { builder.onResolve({ filter: /boop/, namespace: "beep" }, () => ({ @@ -16,68 +17,133 @@ Bun.plugin({ }, }); -var objectModuleResult = { - hello: "world", -}; -Bun.plugin({ +plugin({ name: "an object module", setup(builder) { + globalThis.objectModuleResult ||= { + hello: "world", + }; builder.onResolve({ filter: /.*/, namespace: "obj" }, ({ path }) => ({ path, namespace: "obj", })); builder.onLoad({ filter: /.*/, namespace: "obj" }, () => ({ - exports: objectModuleResult, + exports: globalThis.objectModuleResult, loader: "object", })); }, }); -Bun.plugin({ - name: "svelte loader", - setup(builder) { - var { compile } = require("svelte/compiler"); - var { readFileSync } = require("fs"); - builder.onLoad({ filter: /\.svelte$/ }, ({ path }) => ({ - contents: compile(readFileSync(path, "utf8"), { - filename: path, - generate: "ssr", - }).js.code, - loader: "js", - })); - }, -}); - -var failingObject; -Bun.plugin({ +plugin({ name: "failing loader", setup(builder) { + globalThis.failingObject ||= {}; builder.onResolve({ filter: /.*/, namespace: "fail" }, ({ path }) => ({ path, namespace: "fail", })); - builder.onLoad({ filter: /.*/, namespace: "fail" }, () => failingObject); + builder.onLoad( + { filter: /.*/, namespace: "fail" }, + () => globalThis.failingObject + ); }, }); -var laterCode = ""; - -Bun.plugin({ +plugin({ name: "delayed loader", setup(builder) { + globalThis.laterCode = ""; + builder.onResolve({ filter: /.*/, namespace: "delay" }, ({ path }) => ({ namespace: "delay", path, })); builder.onLoad({ filter: /.*/, namespace: "delay" }, ({ path }) => ({ - contents: laterCode, + contents: (globalThis.laterCode ||= ""), loader: "js", })); }, }); +plugin({ + name: "async onLoad", + setup(builder) { + globalThis.asyncOnLoad = ""; + + builder.onResolve({ filter: /.*/, namespace: "async" }, ({ path }) => ({ + namespace: "async", + path, + })); + + builder.onLoad({ filter: /.*/, namespace: "async" }, async ({ path }) => { + await Promise.resolve(1); + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve({ + contents: (globalThis.asyncOnLoad ||= ""), + loader: "js", + }); + }, 1); + }); + }); + + builder.onResolve({ filter: /.*/, namespace: "async-obj" }, ({ path }) => ({ + namespace: "async-obj", + path, + })); + globalThis.asyncObject = {}; + builder.onLoad( + { filter: /.*/, namespace: "async-obj" }, + async ({ path }) => { + await Promise.resolve(1); + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve({ + exports: (globalThis.asyncObject ||= {}), + loader: "object", + }); + }, 1); + }); + } + ); + + builder.onResolve({ filter: /.*/, namespace: "asyncfail" }, ({ path }) => ({ + namespace: "asyncfail", + path, + })); + + globalThis.asyncfail = false; + builder.onLoad( + { filter: /.*/, namespace: "asyncfail" }, + async ({ path }) => { + await Promise.resolve(1); + await 1; + throw globalThis.asyncfail; + } + ); + + builder.onResolve({ filter: /.*/, namespace: "asyncret" }, ({ path }) => ({ + namespace: "asyncret", + path, + })); + + globalThis.asyncret = 123; + builder.onLoad( + { filter: /.*/, namespace: "asyncret" }, + async ({ path }) => { + await 100; + await Promise.resolve(10); + return await globalThis.asyncret; + } + ); + }, +}); + +// This is to test that it works when imported from a separate file +import "bun-loader-svelte"; + describe("require", () => { it("SSRs `<h1>Hello world!</h1>` with Svelte", () => { const { default: App } = require("./hello.svelte"); @@ -114,6 +180,19 @@ describe("dynamic import", () => { const result = await import("beep:boop"); expect(result.default).toBe(42); }); + + it("async:onLoad returns 42", async () => { + globalThis.asyncOnLoad = "export default 42;"; + const result = await import("async:hello42"); + expect(result.default).toBe(42); + }); + + it("async object loader returns 42", async () => { + globalThis.asyncObject = { foo: 42, default: 43 }; + const result = await import("async-obj:hello42"); + expect(result.foo).toBe(42); + expect(result.default).toBe(43); + }); }); describe("import statement", () => { @@ -141,7 +220,7 @@ describe("errors", () => { for (let i = 0; i < validLoaders.length; i++) { const loader = validLoaders[i]; const input = inputs[i]; - failingObject = { contents: input, loader }; + globalThis.failingObject = { contents: input, loader }; expect(require(`fail:my-file-${loader}`).default).toBe("hi"); } }); @@ -157,7 +236,7 @@ describe("errors", () => { for (let i = 0; i < invalidLoaders.length; i++) { const loader = invalidLoaders[i]; const input = inputs[i]; - failingObject = { contents: input, loader }; + globalThis.failingObject = { contents: input, loader }; try { require(`fail:my-file-${loader}`); throw -1; @@ -176,7 +255,7 @@ describe("errors", () => { for (let i = 0; i < invalidLoaders.length; i++) { const loader = invalidLoaders[i]; const input = inputs[i]; - failingObject = { contents: input, loader }; + globalThis.failingObject = { contents: input, loader }; try { require(`fail:my-file-${loader}-3`); throw -1; @@ -189,6 +268,33 @@ describe("errors", () => { } }); + it("invalid async return value", async () => { + try { + globalThis.asyncret = { wat: true }; + await import("asyncret:my-file"); + throw -1; + } catch (e) { + if (e === -1) { + throw new Error("Expected error"); + } + + expect(e.message.length > 0).toBe(true); + } + }); + + it("async errors work", async () => { + try { + globalThis.asyncfail = new Error("async error"); + await import("asyncfail:my-file"); + throw -1; + } catch (e) { + if (e === -1) { + throw new Error("Expected error"); + } + expect(e.message.length > 0).toBe(true); + } + }); + it("invalid onLoad objects throw", () => { const invalidOnLoadObjects = [ {}, @@ -197,7 +303,7 @@ describe("errors", () => { { contents: "", loader: "klz", resolveDir: -1 }, ]; for (let i = 0; i < invalidOnLoadObjects.length; i++) { - failingObject = invalidOnLoadObjects[i]; + globalThis.failingObject = invalidOnLoadObjects[i]; try { require(`fail:my-file-${i}-2`); throw -1; @@ -209,4 +315,17 @@ describe("errors", () => { } } }); + + it("async transpiler errors work", async () => { + try { + globalThis.asyncOnLoad = `const x: string = -NaNAn../!!;`; + await import("async:fail"); + throw -1; + } catch (e) { + if (e === -1) { + throw new Error("Expected error"); + } + expect(e.message.length > 0).toBe(true); + } + }); }); |