1import { findAvailablePort, nodeLoaderArgs } from "@/Util/Node";
2import { describe, expect, test } from "alchemy-test";
3import * as Effect from "effect/Effect";
4import * as NodeNet from "node:net";
5
6describe("Node utilities", { tags: ["unit", "local"] }, () => {
7 test("checkout .ts entries get the dev-mode hooks", () => {
8 for (const entry of [
9 "/repo/packages/alchemy/src/Cloudflare/Local.ts",
10 "/repo/src/Runner.tsx",
11 "/repo/src/Runner.mts",
12 ]) {
13 const args = nodeLoaderArgs(entry);
14 expect(args[0]).toBe("--import");
15 expect(args[1]).toMatch(/\/bin\/register-dev-mode\.js$/);
16 }
17 });
18
19 test("published .js entries get the Oxc loader alone", () => {
20 for (const entry of [
21 "/app/node_modules/alchemy/lib/Cloudflare/Local.js",
22 "/app/lib/Runner.mjs",
23 ]) {
24 const args = nodeLoaderArgs(entry);
25 expect(args[0]).toBe("--import");
26 expect(args[1]).toMatch(/\/bin\/register-oxc\.js$/);
27 }
28 });
29
30 test("finds and releases an available port", async () => {
31 const port = await Effect.runPromise(findAvailablePort());
32 expect(port).toBeGreaterThan(0);
33
34 await new Promise<void>((resolve, reject) => {
35 const server = NodeNet.createServer();
36 server.once("error", reject);
37 server.listen(port, "127.0.0.1", () => {
38 server.close((error) => (error ? reject(error) : resolve()));
39 });
40 });
41 });
42});