Skip to content

Instantly share code, notes, and snippets.

@frehner
Created July 15, 2022 18:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frehner/2b2ba6639d5cc13c39f5eeea707413c4 to your computer and use it in GitHub Desktop.
Save frehner/2b2ba6639d5cc13c39f5eeea707413c4 to your computer and use it in GitHub Desktop.
import {chromium} from 'playwright';
import '@shopify/hydrogen/web-polyfills';
import {createServer as createViteDevServer} from 'vite';
export async function startHydrogenServer() {
const app = import.meta.env.WATCH
? await createDevServer()
: await createNodeServer();
const browser = await chromium.launch();
const url = (pathname) => `http://localhost:${app.port}${pathname}`;
const newPage = async () => {
const page = await browser.newPage();
return {
page,
visit: async (pathname) => page.goto(url(pathname)),
};
};
const cleanUp = async () => {
await browser.close();
await app.server?.close();
};
return {url, newPage, cleanUp, watchForUpdates: () => {}};
}
async function createNodeServer() {
// @ts-ignore
const {createServer} = await import('../dist/node');
const app = (await createServer()).app;
const server = app.listen(0);
const port = await new Promise((resolve) => {
server.on('listening', () => {
resolve(getPortFromAddress(server.address()));
});
});
return {server, port};
}
async function createDevServer() {
const app = await createViteDevServer({
server: {force: true},
logLevel: 'silent',
});
const server = await app.listen(0);
return {
server: server.httpServer,
port: getPortFromAddress(server.httpServer.address()),
};
}
function getPortFromAddress(address) {
if (typeof address === 'string') {
return parseInt(address.split(':').pop());
} else {
return address.port;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment