@lepid-labs/weft 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,8 @@
1
1
  import { WeftService, fetchRepo, loadConfig, resolveFetchedRepos } from "@lepid-labs/weft-core";
2
2
  import { command } from "cleye";
3
3
  import { openBrowser } from "../open-browser.js";
4
- import { chooseUiMode, startBuiltServer, startDevServer } from "../ui-server.js";
4
+ import { UnknownStyleError, assertServableStyle, loadStyleRoster, parseStyleFlag, } from "../styles.js";
5
+ import { browserHost, chooseUiMode, isPortInUse, selfCheck, startBuiltServer, startDevServer, statusTag, } from "../ui-server.js";
5
6
  export const serveCommand = command({
6
7
  name: "serve",
7
8
  help: {
@@ -14,6 +15,11 @@ export const serveCommand = command({
14
15
  description: "Port to serve on",
15
16
  default: 7777,
16
17
  },
18
+ host: {
19
+ type: String,
20
+ description: "Interface to listen on (0.0.0.0 or :: to expose it on every interface)",
21
+ default: "127.0.0.1",
22
+ },
17
23
  open: {
18
24
  type: Boolean,
19
25
  description: "Open the browser once the server is up",
@@ -41,6 +47,14 @@ export const serveCommand = command({
41
47
  description: "Re-resolve fetched refs even when the cached resolution is fresh",
42
48
  default: false,
43
49
  },
50
+ style: {
51
+ type: String,
52
+ description: "ui-std-lib style: one theme name, or a dark/light pair (e.g. luminous-precision/summer-cloud); overrides the config",
53
+ },
54
+ styleUrl: {
55
+ type: String,
56
+ description: "Base URL serving ui-std-lib theme CSS and manifest.json, for a style newer than the bundled set",
57
+ },
44
58
  },
45
59
  }, async (argv) => {
46
60
  const port = argv.flags.port;
@@ -52,6 +66,7 @@ export const serveCommand = command({
52
66
  // drive letter on Windows (`/C:/...`), which resolve() then mangles.
53
67
  const require = createRequire(import.meta.url);
54
68
  const uiRoot = dirname(require.resolve("@lepid-labs/weft-ui/package.json"));
69
+ const { version } = require("../../package.json");
55
70
  if (argv.flags.repo && argv.flags.gh && argv.flags.repo !== argv.flags.gh) {
56
71
  console.error("serve: --repo and --gh name different repos; pass one of them");
57
72
  process.exit(1);
@@ -61,6 +76,15 @@ export const serveCommand = command({
61
76
  console.error("serve: pass either a root directory or --repo, not both");
62
77
  process.exit(1);
63
78
  }
79
+ // A malformed --style fails before anything is fetched or indexed.
80
+ let styleFlag;
81
+ try {
82
+ styleFlag = argv.flags.style === undefined ? undefined : parseStyleFlag(argv.flags.style);
83
+ }
84
+ catch (err) {
85
+ console.error(err instanceof Error ? err.message : err);
86
+ process.exit(1);
87
+ }
64
88
  try {
65
89
  // Decide how the UI is served before fetching anything, so a missing
66
90
  // build fails fast rather than after a clone.
@@ -86,17 +110,42 @@ export const serveCommand = command({
86
110
  // local checkout wins, everything else is fetched at its HEAD.
87
111
  config = await resolveFetchedRepos(config, { refresh: argv.flags.refresh });
88
112
  }
113
+ // Flags outrank both config files: the committed one and the local
114
+ // override. With --repo the local file would live inside the fetch
115
+ // cache, so the flag is the only per-run override there.
116
+ if (styleFlag)
117
+ config = { ...config, style: styleFlag };
118
+ if (argv.flags.styleUrl)
119
+ config = { ...config, styleUrl: argv.flags.styleUrl };
120
+ // A name nothing can serve fails here, not in the browser — the UI
121
+ // runs the same check, but only once a page is requested.
122
+ assertServableStyle(config.style, config.styleUrl, loadStyleRoster(uiRoot));
89
123
  const service = new WeftService(config);
90
- await service.rebuild();
124
+ const manifest = await service.rebuild();
91
125
  await service.writeManifest();
126
+ console.log(`Indexed ${manifest.nodes.length} docs, ${manifest.edges.length} edges in ${rootDir}`);
92
127
  // SvelteKit's server loads read the manifest file from this path — SSR
93
128
  // cannot reach the /api handler through SvelteKit's internal fetch.
94
129
  process.env.WEFT_MANIFEST_PATH = service.manifestPath;
130
+ const host = argv.flags.host;
95
131
  const server = mode === "built"
96
- ? await startBuiltServer(service, uiRoot, port)
97
- : await startDevServer(service, uiRoot, port);
98
- const url = `http://localhost:${port}`;
99
- console.log(`Weft server running at ${url}${mode === "dev" ? " (vite dev)" : ""}`);
132
+ ? await startBuiltServer(service, uiRoot, port, host)
133
+ : await startDevServer(service, uiRoot, port, host);
134
+ const url = `http://${browserHost(host)}:${port}`;
135
+ console.log(`Weft ${version} on Node ${process.version}, listening on ${server.address}`);
136
+ // Prove the url works from here before announcing it or sending a
137
+ // browser to it, so a browser that still cannot connect is known to be
138
+ // blocked on its side.
139
+ const check = await selfCheck(url);
140
+ const running = `Weft server running at ${url}${mode === "dev" ? " (vite dev)" : ""}`;
141
+ if (check.ok) {
142
+ console.log(`${statusTag(true)} ${running}`);
143
+ }
144
+ else {
145
+ console.error(`${statusTag(false)} ${running}`);
146
+ console.error(`Self-check failed (${check.reason}): the server is listening on ${server.address} ` +
147
+ `but ${url} does not answer from this process. Try another --port, or another --host.`);
148
+ }
100
149
  if (argv.flags.open)
101
150
  openBrowser(url);
102
151
  // Watch for doc changes
@@ -114,7 +163,16 @@ export const serveCommand = command({
114
163
  process.on("SIGTERM", shutdown);
115
164
  }
116
165
  catch (err) {
117
- console.error("Failed to start server:", err);
166
+ if (err instanceof UnknownStyleError) {
167
+ console.error(`serve: ${err.message}`);
168
+ }
169
+ else if (isPortInUse(err)) {
170
+ const where = `${argv.flags.host}:${port}`;
171
+ console.error(`${where} is already in use — another Weft, or something else. Pass --port to pick another.`);
172
+ }
173
+ else {
174
+ console.error("Failed to start server:", err);
175
+ }
118
176
  process.exit(1);
119
177
  }
120
178
  });
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
package/dist/styles.js ADDED
@@ -0,0 +1,50 @@
1
+ import { createRequire } from "node:module";
2
+ import { resolve } from "node:path";
3
+ import { validateStyle } from "@lepid-labs/weft-core";
4
+ /**
5
+ * `--style <name>` picks one theme; `--style <dark>/<light>` a pair the
6
+ * light/dark toggle switches between. Same shapes `style` takes in
7
+ * weft.config.yaml, and the same shape check.
8
+ */
9
+ export function parseStyleFlag(value) {
10
+ const parts = value.split("/");
11
+ const style = parts.length === 2 ? { dark: parts[0], light: parts[1] } : value;
12
+ if (parts.length > 2 || parts.some((p) => p.length === 0)) {
13
+ throw new Error(`serve: --style takes a style name, or a dark/light pair such as luminous-precision/summer-cloud (got "${value}")`);
14
+ }
15
+ validateStyle(style, "--style");
16
+ return style;
17
+ }
18
+ /**
19
+ * Read the ui-std-lib manifest the UI was built against. The CLI does not
20
+ * depend on @nazuraki/styles itself — it is the UI's dependency — so resolve
21
+ * it from the UI package's directory, which works under both pnpm's nested
22
+ * layout and npm's hoisted one.
23
+ */
24
+ export function loadStyleRoster(uiRoot) {
25
+ const require = createRequire(resolve(uiRoot, "package.json"));
26
+ const manifest = require("@nazuraki/styles/manifest");
27
+ return manifest.themes;
28
+ }
29
+ /** A style the bundled roster lacks, with no `styleUrl` to fetch it from. */
30
+ export class UnknownStyleError extends Error {
31
+ constructor(name, roster) {
32
+ super(`unknown style "${name}" — bundled styles are ${Object.keys(roster).join(", ")}; pass --style-url to load a newer one`);
33
+ this.name = "UnknownStyleError";
34
+ }
35
+ }
36
+ /**
37
+ * Reject a style nothing can serve: a name the bundled roster lacks with no
38
+ * `styleUrl` to fetch it from. Mirrors the UI's own check, but runs before the
39
+ * server starts, so a typo fails here rather than in the browser.
40
+ */
41
+ export function assertServableStyle(style, styleUrl, roster) {
42
+ if (!style || styleUrl)
43
+ return;
44
+ const names = typeof style === "string" ? [style] : [style.dark, style.light];
45
+ for (const name of names) {
46
+ if (!(name in roster))
47
+ throw new UnknownStyleError(name, roster);
48
+ }
49
+ }
50
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAY,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACxF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACd,yGAAyG,KAAK,IAAI,CAClH,CAAC;IACH,CAAC;IACD,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC;AACd,CAAC;AAKD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,2BAA2B,CAA4B,CAAC;IACjF,OAAO,QAAQ,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,6EAA6E;AAC7E,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC3C,YAAY,IAAY,EAAE,MAAmB;QAC5C,KAAK,CACJ,kBAAkB,IAAI,0BAA0B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CACtH,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACjC,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAA8B,EAC9B,QAA4B,EAC5B,MAAmB;IAEnB,IAAI,CAAC,KAAK,IAAI,QAAQ;QAAE,OAAO;IAC/B,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;AACF,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { createRequire } from "node:module";
2
+ import { dirname } from "node:path";
3
+ import { describe, expect, it } from "vitest";
4
+ import { assertServableStyle, loadStyleRoster, parseStyleFlag } from "./styles.js";
5
+ const ROSTER = {
6
+ "luminous-precision": { scheme: "dark" },
7
+ "summer-cloud": { scheme: "light" },
8
+ };
9
+ describe("parseStyleFlag", () => {
10
+ it("takes a single name", () => {
11
+ expect(parseStyleFlag("summer-cloud")).toBe("summer-cloud");
12
+ });
13
+ it("takes a dark/light pair", () => {
14
+ expect(parseStyleFlag("luminous-precision/summer-cloud")).toEqual({
15
+ dark: "luminous-precision",
16
+ light: "summer-cloud",
17
+ });
18
+ });
19
+ it.each(["", "/", "a/", "/b", "a/b/c"])("rejects %j", (value) => {
20
+ expect(() => parseStyleFlag(value)).toThrow(/--style/);
21
+ });
22
+ });
23
+ describe("assertServableStyle", () => {
24
+ it("accepts bundled names, single or paired", () => {
25
+ expect(() => assertServableStyle("summer-cloud", undefined, ROSTER)).not.toThrow();
26
+ expect(() => assertServableStyle({ dark: "luminous-precision", light: "summer-cloud" }, undefined, ROSTER)).not.toThrow();
27
+ });
28
+ it("accepts no style at all", () => {
29
+ expect(() => assertServableStyle(undefined, undefined, ROSTER)).not.toThrow();
30
+ });
31
+ it("names the unknown style and the roster", () => {
32
+ expect(() => assertServableStyle("neon-typo", undefined, ROSTER)).toThrow(/unknown style "neon-typo" — bundled styles are luminous-precision, summer-cloud/);
33
+ expect(() => assertServableStyle({ dark: "nope", light: "summer-cloud" }, undefined, ROSTER)).toThrow(/unknown style "nope"/);
34
+ });
35
+ it("defers to styleUrl for names the roster lacks", () => {
36
+ expect(() => assertServableStyle("some-future-theme", "https://cdn.example/styles", ROSTER)).not.toThrow();
37
+ });
38
+ });
39
+ describe("loadStyleRoster", () => {
40
+ it("reads the manifest the UI package depends on", () => {
41
+ const require = createRequire(import.meta.url);
42
+ const uiRoot = dirname(require.resolve("@lepid-labs/weft-ui/package.json"));
43
+ const roster = loadStyleRoster(uiRoot);
44
+ expect(roster["luminous-precision"]?.scheme).toBe("dark");
45
+ expect(roster["summer-cloud"]?.scheme).toBe("light");
46
+ });
47
+ });
48
+ //# sourceMappingURL=styles.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.test.js","sourceRoot":"","sources":["../src/styles.test.ts"],"names":[],"mappings":"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"}
package/dist/ui-server.js CHANGED
@@ -53,22 +53,101 @@ export function routeRequest(service, ui) {
53
53
  });
54
54
  };
55
55
  }
56
+ /** Render `server.address()` for a log line. */
57
+ export function describeAddress(address) {
58
+ if (!address)
59
+ return "(not listening)";
60
+ if (typeof address === "string")
61
+ return address;
62
+ const host = address.family === "IPv6" ? `[${address.address}]` : address.address;
63
+ return `${host}:${address.port}`;
64
+ }
65
+ /**
66
+ * The host to put in the url the browser is sent to. A wildcard bind (or
67
+ * none, which binds every interface) is reached as `localhost`; an explicit
68
+ * host is used as given, bracketed if it is an IPv6 literal.
69
+ *
70
+ * The serve command defaults `--host` to `127.0.0.1` rather than binding
71
+ * every interface: a wildcard bind is allowed to share its port with a
72
+ * process bound to a specific address, so it starts without complaint and
73
+ * the printed url reaches the other process. A loopback bind collides
74
+ * loudly instead.
75
+ */
76
+ export function browserHost(host) {
77
+ if (host === undefined || host === "0.0.0.0" || host === "::")
78
+ return "localhost";
79
+ return host.includes(":") ? `[${host}]` : host;
80
+ }
81
+ /**
82
+ * True for the error a listen raises when the port is taken: Node's
83
+ * `EADDRINUSE`, or Vite's plain-message rejection under `strictPort`.
84
+ */
85
+ export function isPortInUse(err) {
86
+ if (!(err instanceof Error))
87
+ return false;
88
+ if (err.code === "EADDRINUSE")
89
+ return true;
90
+ return /already in use/i.test(err.message);
91
+ }
92
+ /**
93
+ * `[OK]` or `[FAIL]` for a log line, coloured when stdout is a terminal that
94
+ * has not asked for plain output (`NO_COLOR`, https://no-color.org).
95
+ */
96
+ export function statusTag(ok, stream = process.stdout) {
97
+ const label = ok ? "OK" : "FAIL";
98
+ const colour = !!stream.isTTY && !process.env.NO_COLOR;
99
+ return colour ? `[\x1b[${ok ? 32 : 31}m${label}\x1b[0m]` : `[${label}]`;
100
+ }
101
+ /**
102
+ * Request the UI and the API from inside the process, before the browser is
103
+ * asked to. A pass proves the server answers at the url that was printed, so
104
+ * a browser that still cannot reach it is being kept away by something on
105
+ * its own side (a proxy that does not bypass localhost, a policy, a firewall);
106
+ * a failure names the first path that broke and the socket-level reason.
107
+ */
108
+ export async function selfCheck(url, timeoutMs = 5000) {
109
+ for (const path of ["/api/manifest", "/"]) {
110
+ try {
111
+ const res = await fetch(url + path, { signal: AbortSignal.timeout(timeoutMs) });
112
+ if (!res.ok) {
113
+ return {
114
+ ok: false,
115
+ reason: `GET ${path} → HTTP ${res.status} (is something else answering on that port?)`,
116
+ };
117
+ }
118
+ await res.arrayBuffer(); // drain, so the connection is released
119
+ }
120
+ catch (err) {
121
+ return { ok: false, reason: `GET ${path}: ${describeError(err)}` };
122
+ }
123
+ }
124
+ return { ok: true };
125
+ }
126
+ function describeError(err) {
127
+ // undici reports the socket error as `fetch failed` with the real one as `cause`.
128
+ const cause = err?.cause;
129
+ const e = cause instanceof Error ? cause : err instanceof Error ? err : undefined;
130
+ if (!e)
131
+ return String(err);
132
+ const code = e.code;
133
+ return code ? `${code}: ${e.message}` : e.message;
134
+ }
56
135
  /** Serve the adapter-node build over plain `node:http`, the API in front of it. */
57
- export async function startBuiltServer(service, uiRoot, port) {
136
+ export async function startBuiltServer(service, uiRoot, port, host) {
58
137
  const entry = pathToFileURL(join(uiRoot, BUILT_HANDLER)).href;
59
138
  const { handler } = (await import(entry));
60
139
  const server = createServer(routeRequest(service, handler));
61
140
  await new Promise((resolve, reject) => {
62
141
  server.once("error", reject);
63
- server.listen(port, () => {
142
+ server.listen(port, host, () => {
64
143
  server.off("error", reject);
65
144
  resolve();
66
145
  });
67
146
  });
68
- return { close: () => void server.close() };
147
+ return { close: () => void server.close(), address: describeAddress(server.address()) };
69
148
  }
70
149
  /** Serve the UI source through Vite's dev server, with the API as a plugin. */
71
- export async function startDevServer(service, uiRoot, port) {
150
+ export async function startDevServer(service, uiRoot, port, host) {
72
151
  let createViteServer;
73
152
  try {
74
153
  ({ createServer: createViteServer } = await import("vite"));
@@ -82,10 +161,15 @@ export async function startDevServer(service, uiRoot, port) {
82
161
  process.chdir(uiRoot);
83
162
  const server = await createViteServer({
84
163
  root: uiRoot,
85
- server: { port },
164
+ // strictPort: Vite would otherwise move to the next free port on its own,
165
+ // and the url the command prints would name a port nothing listens on.
166
+ server: { port, host, strictPort: true },
86
167
  plugins: [weftApiPlugin(service)],
87
168
  });
88
169
  await server.listen();
89
- return { close: () => void server.close() };
170
+ return {
171
+ close: () => void server.close(),
172
+ address: describeAddress(server.httpServer?.address()),
173
+ };
90
174
  }
91
175
  //# sourceMappingURL=ui-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-server.js","sourceRoot":"","sources":["../src/ui-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui-server.js","sourceRoot":"","sources":["../src/ui-server.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,8 @@ import { tmpdir } from "node:os";
4
4
  import { join, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { WeftService } from "@lepid-labs/weft-core";
7
- import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest";
8
- import { BUILT_HANDLER, chooseUiMode, routeRequest } from "./ui-server.js";
7
+ import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest";
8
+ import { BUILT_HANDLER, browserHost, chooseUiMode, describeAddress, isPortInUse, routeRequest, selfCheck, startBuiltServer, statusTag, } from "./ui-server.js";
9
9
  const __dirname = resolve(fileURLToPath(import.meta.url), "..");
10
10
  const FIXTURES_DIR = resolve(__dirname, "__fixtures__");
11
11
  describe("chooseUiMode", () => {
@@ -101,5 +101,108 @@ describe("routeRequest", () => {
101
101
  const res = await fetch(`${base}/apiary`);
102
102
  expect(await res.text()).toBe("ui:/apiary");
103
103
  });
104
+ it("passes the self-check when both the API and the UI answer", async () => {
105
+ expect(await selfCheck(base)).toEqual({ ok: true });
106
+ });
107
+ });
108
+ describe("selfCheck", () => {
109
+ it("names the socket error when nothing is listening", async () => {
110
+ // Bind to learn a free port, then release it so the check hits a closed one.
111
+ const probe = createServer();
112
+ await new Promise((done) => probe.listen(0, "127.0.0.1", done));
113
+ const { port } = probe.address();
114
+ await new Promise((done) => probe.close(() => done()));
115
+ const result = await selfCheck(`http://127.0.0.1:${port}`);
116
+ expect(result.ok).toBe(false);
117
+ if (result.ok)
118
+ return;
119
+ expect(result.reason).toMatch(/^GET \/api\/manifest: ECONNREFUSED/);
120
+ });
121
+ it("reports the first path that does not answer 2xx", async () => {
122
+ const server = createServer((req, res) => {
123
+ res.statusCode = req.url === "/" ? 500 : 200;
124
+ res.end("{}");
125
+ });
126
+ await new Promise((done) => server.listen(0, "127.0.0.1", done));
127
+ const { port } = server.address();
128
+ try {
129
+ expect(await selfCheck(`http://127.0.0.1:${port}`)).toEqual({
130
+ ok: false,
131
+ reason: "GET / → HTTP 500 (is something else answering on that port?)",
132
+ });
133
+ }
134
+ finally {
135
+ server.close();
136
+ }
137
+ });
138
+ });
139
+ describe("describeAddress", () => {
140
+ it("renders IPv4 and IPv6 socket addresses", () => {
141
+ expect(describeAddress({ address: "127.0.0.1", family: "IPv4", port: 7777 })).toBe("127.0.0.1:7777");
142
+ expect(describeAddress({ address: "::", family: "IPv6", port: 7777 })).toBe("[::]:7777");
143
+ });
144
+ it("passes a pipe path through and names a server that is not listening", () => {
145
+ expect(describeAddress("/tmp/weft.sock")).toBe("/tmp/weft.sock");
146
+ expect(describeAddress(null)).toBe("(not listening)");
147
+ expect(describeAddress(undefined)).toBe("(not listening)");
148
+ });
149
+ });
150
+ describe("browserHost", () => {
151
+ it("sends the browser to localhost for the default and wildcard binds", () => {
152
+ expect(browserHost(undefined)).toBe("localhost");
153
+ expect(browserHost("0.0.0.0")).toBe("localhost");
154
+ expect(browserHost("::")).toBe("localhost");
155
+ });
156
+ it("uses an explicit host as given, bracketing IPv6 literals", () => {
157
+ expect(browserHost("127.0.0.1")).toBe("127.0.0.1");
158
+ expect(browserHost("::1")).toBe("[::1]");
159
+ expect(browserHost("docs.local")).toBe("docs.local");
160
+ });
161
+ });
162
+ describe("isPortInUse", () => {
163
+ it("recognises Node's EADDRINUSE and Vite's strictPort rejection", () => {
164
+ expect(isPortInUse(Object.assign(new Error("listen EADDRINUSE"), { code: "EADDRINUSE" }))).toBe(true);
165
+ expect(isPortInUse(new Error("Port 7777 is already in use"))).toBe(true);
166
+ });
167
+ it("leaves every other failure alone", () => {
168
+ expect(isPortInUse(new Error("ENOENT: no such file"))).toBe(false);
169
+ expect(isPortInUse("EADDRINUSE")).toBe(false);
170
+ expect(isPortInUse(undefined)).toBe(false);
171
+ });
172
+ });
173
+ describe("startBuiltServer", () => {
174
+ it("fails with a port-in-use error rather than sharing a taken port", async () => {
175
+ // __fixtures__/ui-stub holds a stand-in for the adapter-node build.
176
+ const uiRoot = join(FIXTURES_DIR, "ui-stub");
177
+ const service = new WeftService({
178
+ rootDir: FIXTURES_DIR,
179
+ docsDir: "docs",
180
+ entryPoint: "docs/README.md",
181
+ ignore: [],
182
+ });
183
+ const occupant = createServer((_req, res) => res.end("not weft"));
184
+ await new Promise((done) => occupant.listen(0, "127.0.0.1", done));
185
+ const { port } = occupant.address();
186
+ try {
187
+ await expect(startBuiltServer(service, uiRoot, port, "127.0.0.1")).rejects.toSatisfy(isPortInUse);
188
+ }
189
+ finally {
190
+ occupant.close();
191
+ }
192
+ });
193
+ });
194
+ describe("statusTag", () => {
195
+ afterEach(() => vi.unstubAllEnvs());
196
+ it("colours the label green or red on a terminal", () => {
197
+ vi.stubEnv("NO_COLOR", undefined);
198
+ expect(statusTag(true, { isTTY: true })).toBe("[\x1b[32mOK\x1b[0m]");
199
+ expect(statusTag(false, { isTTY: true })).toBe("[\x1b[31mFAIL\x1b[0m]");
200
+ });
201
+ it("stays plain when piped or when NO_COLOR is set", () => {
202
+ vi.stubEnv("NO_COLOR", undefined);
203
+ expect(statusTag(true, { isTTY: false })).toBe("[OK]");
204
+ vi.stubEnv("NO_COLOR", "1");
205
+ expect(statusTag(true, { isTTY: true })).toBe("[OK]");
206
+ });
104
207
  });
105
208
  //# sourceMappingURL=ui-server.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-server.test.js","sourceRoot":"","sources":["../src/ui-server.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui-server.test.js","sourceRoot":"","sources":["../src/ui-server.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lepid-labs/weft",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Weft CLI: serve, index and check a documentation graph, from a checkout or straight from GitHub",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -18,9 +18,9 @@
18
18
  "weft": "bin/weft.js"
19
19
  },
20
20
  "dependencies": {
21
- "cleye": "^1.3.0",
22
- "@lepid-labs/weft-core": "0.1.0",
23
- "@lepid-labs/weft-ui": "0.1.0"
21
+ "@lepid-labs/weft-core": "0.1.2",
22
+ "@lepid-labs/weft-ui": "0.1.2",
23
+ "cleye": "^1.3.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.0.0",