Files
bun.sh/test/bake/dev/esm.test.ts

254 lines
6.1 KiB
TypeScript

// ESM tests are about various esm features in development mode.
import { devTest, emptyHtmlFile, minimalFramework } from "../bake-harness";
const liveBindingTest = devTest("live bindings with `var`", {
framework: minimalFramework,
files: {
"state.ts": `
export var value = 0;
export function increment() {
value++;
}
`,
"routes/index.ts": `
import { value, increment } from '../state';
export default function(req, meta) {
increment();
return new Response('State: ' + value);
}
`,
},
async test(dev) {
await dev.fetch("/").equals("State: 1");
await dev.fetch("/").equals("State: 2");
await dev.fetch("/").equals("State: 3");
await dev.patch("routes/index.ts", {
find: "State",
replace: "Value",
});
await dev.fetch("/").equals("Value: 4");
await dev.fetch("/").equals("Value: 5");
await dev.write(
"state.ts",
`
export var value = 0;
export function increment() {
value--;
}
`,
);
await dev.fetch("/").equals("Value: -1");
await dev.fetch("/").equals("Value: -2");
},
});
devTest("live bindings through export clause", {
framework: minimalFramework,
files: {
"state.ts": `
export var value = 0;
export function increment() {
value++;
}
`,
"proxy.ts": `
import { value } from './state';
export { value as live };
`,
"routes/index.ts": `
import { increment } from '../state';
import { live } from '../proxy';
export default function(req, meta) {
increment();
return new Response('State: ' + live);
}
`,
},
test: liveBindingTest.test,
});
devTest("live bindings through export from", {
framework: minimalFramework,
files: {
"state.ts": `
export var value = 0;
export function increment() {
value++;
}
`,
"proxy.ts": `
export { value as live } from './state';
`,
"routes/index.ts": `
import { increment } from '../state';
import { live } from '../proxy';
export default function(req, meta) {
increment();
return new Response('State: ' + live);
}
`,
},
test: liveBindingTest.test,
});
// devTest("live bindings through export star", {
// framework: minimalFramework,
// files: {
// "state.ts": `
// export var value = 0;
// export function increment() {
// value++;
// }
// `,
// "proxy.ts": `
// export * from './state';
// `,
// "routes/index.ts": `
// import { increment } from '../state';
// import { live } from '../proxy';
// export default function(req, meta) {
// increment();
// return new Response('State: ' + live);
// }
// `,
// },
// test: liveBindingTest.test,
// });
devTest("export { x as y }", {
framework: minimalFramework,
files: {
"module.ts": `
function x(value) {
return value + 1;
}
export { x as y };
`,
"routes/index.ts": `
import { y } from '../module';
export default function(req, meta) {
return new Response('Value: ' + y(1));
}
`,
},
async test(dev) {
await dev.fetch("/").equals("Value: 2");
await dev.patch("module.ts", {
find: "1",
replace: "2",
});
await dev.fetch("/").equals("Value: 3");
},
});
devTest("import { x as y }", {
framework: minimalFramework,
files: {
"module.ts": `
export const x = 1;
`,
"routes/index.ts": `
import { x as y } from '../module';
export default function(req, meta) {
return new Response('Value: ' + y);
}
`,
},
async test(dev) {
await dev.fetch("/").equals("Value: 1");
await dev.patch("module.ts", {
find: "1",
replace: "2",
});
await dev.fetch("/").equals("Value: 2");
},
});
devTest("import { default as y }", {
framework: minimalFramework,
files: {
"module.ts": `
export default 1;
`,
"routes/index.ts": `
import { default as y } from '../module';
export default function(req, meta) {
return new Response('Value: ' + y);
}
`,
},
async test(dev) {
await dev.fetch("/").equals("Value: 1");
await dev.patch("module.ts", {
find: "1",
replace: "2",
});
await dev.fetch("/").equals("Value: 2");
},
});
devTest("export { default as y }", {
framework: minimalFramework,
files: {
"module.ts": `
export default 1;
`,
"middle.ts": `
export { default as y } from './module';
`,
"routes/index.ts": `
import { y } from '../middle';
export default function(req, meta) {
return new Response('Value: ' + y);
}
`,
},
async test(dev) {
await dev.fetch("/").equals("Value: 1");
await dev.patch("module.ts", {
find: "1",
replace: "2",
});
await dev.fetch("/").equals("Value: 2");
},
});
devTest("export * as namespace", {
files: {
"index.html": emptyHtmlFile({
scripts: ["index.ts"],
}),
"index.ts": `
import { ns as renamed } from './module';
if (typeof renamed !== 'object') throw new Error('renamed should be an object');
if (renamed.x !== 1) throw new Error('renamed.x should be 1');
if (renamed.y !== 2) throw new Error('renamed.y should be 2');
console.log('PASS');
`,
"module.ts": `
export * as ns from './module2';
`,
"module2.ts": `
export const x = 1;
export const y = 2;
export const ns = "FAIL";
`,
},
async test(dev) {
await using c = await dev.client();
await c.expectMessage("PASS");
},
});
devTest("ESM <-> CJS", {
files: {
"index.html": emptyHtmlFile({
scripts: ["index.ts"],
}),
"index.ts": `
await import('./esm'); // TODO: implement sync ESM
const mod = require('./esm');
if (!mod.__esModule) throw new Error('mod.__esModule should be set');
console.log('PASS');
`,
"esm.ts": `
export const x = 1;
`,
},
async test(dev) {
await using c = await dev.client();
await c.expectMessage("PASS");
},
});