aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/bun.js/bun-loader-svelte/bun-loader-svelte.ts18
-rw-r--r--test/bun.js/bun-loader-svelte/package.json4
-rw-r--r--test/bun.js/plugins.test.ts185
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);
+ }
+ });
});