// 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"); }, });