@lepid-labs/weft 0.1.1 → 0.1.3

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,9 @@
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 { browserHost, chooseUiMode, selfCheck, startBuiltServer, startDevServer, } from "../ui-server.js";
4
+ import { UnknownStyleError, assertServableStyle, loadStyleRoster, parseStyleFlag, } from "../styles.js";
5
+ import { resolveSubRoot } from "../sub-root.js";
6
+ import { browserHost, chooseUiMode, isPortInUse, selfCheck, startBuiltServer, startDevServer, statusTag, } from "../ui-server.js";
5
7
  export const serveCommand = command({
6
8
  name: "serve",
7
9
  help: {
@@ -16,7 +18,8 @@ export const serveCommand = command({
16
18
  },
17
19
  host: {
18
20
  type: String,
19
- description: "Interface to listen on (default: every interface; try 127.0.0.1 if the browser cannot connect)",
21
+ description: "Interface to listen on (0.0.0.0 or :: to expose it on every interface)",
22
+ default: "127.0.0.1",
20
23
  },
21
24
  open: {
22
25
  type: Boolean,
@@ -36,6 +39,10 @@ export const serveCommand = command({
36
39
  type: String,
37
40
  description: "Alias of --repo",
38
41
  },
42
+ dir: {
43
+ type: String,
44
+ description: "Serve this subdirectory of the root (or of the fetched repo) as the root: its weft.config.yaml, its docs",
45
+ },
39
46
  ref: {
40
47
  type: String,
41
48
  description: "Branch, tag or commit sha to fetch (with --repo; default: remote HEAD)",
@@ -45,6 +52,14 @@ export const serveCommand = command({
45
52
  description: "Re-resolve fetched refs even when the cached resolution is fresh",
46
53
  default: false,
47
54
  },
55
+ style: {
56
+ type: String,
57
+ description: "ui-std-lib style: one theme name, or a dark/light pair (e.g. luminous-precision/summer-cloud); overrides the config",
58
+ },
59
+ styleUrl: {
60
+ type: String,
61
+ description: "Base URL serving ui-std-lib theme CSS and manifest.json, for a style newer than the bundled set",
62
+ },
48
63
  },
49
64
  }, async (argv) => {
50
65
  const port = argv.flags.port;
@@ -66,6 +81,15 @@ export const serveCommand = command({
66
81
  console.error("serve: pass either a root directory or --repo, not both");
67
82
  process.exit(1);
68
83
  }
84
+ // A malformed --style fails before anything is fetched or indexed.
85
+ let styleFlag;
86
+ try {
87
+ styleFlag = argv.flags.style === undefined ? undefined : parseStyleFlag(argv.flags.style);
88
+ }
89
+ catch (err) {
90
+ console.error(err instanceof Error ? err.message : err);
91
+ process.exit(1);
92
+ }
69
93
  try {
70
94
  // Decide how the UI is served before fetching anything, so a missing
71
95
  // build fails fast rather than after a clone.
@@ -83,6 +107,9 @@ export const serveCommand = command({
83
107
  else {
84
108
  rootDir = resolve(argv._.rootDir ?? process.cwd());
85
109
  }
110
+ // One repo can hold several sites: --dir picks which one is the root, so
111
+ // its config, docs and repos map resolve from there.
112
+ rootDir = resolveSubRoot(rootDir, argv.flags.dir);
86
113
  // The CLI owns the single WeftService. The UI never constructs one — it
87
114
  // consumes /api JSON (client) and the manifest file (SSR).
88
115
  let config = await loadConfig(rootDir);
@@ -91,6 +118,16 @@ export const serveCommand = command({
91
118
  // local checkout wins, everything else is fetched at its HEAD.
92
119
  config = await resolveFetchedRepos(config, { refresh: argv.flags.refresh });
93
120
  }
121
+ // Flags outrank both config files: the committed one and the local
122
+ // override. With --repo the local file would live inside the fetch
123
+ // cache, so the flag is the only per-run override there.
124
+ if (styleFlag)
125
+ config = { ...config, style: styleFlag };
126
+ if (argv.flags.styleUrl)
127
+ config = { ...config, styleUrl: argv.flags.styleUrl };
128
+ // A name nothing can serve fails here, not in the browser — the UI
129
+ // runs the same check, but only once a page is requested.
130
+ assertServableStyle(config.style, config.styleUrl, loadStyleRoster(uiRoot));
94
131
  const service = new WeftService(config);
95
132
  const manifest = await service.rebuild();
96
133
  await service.writeManifest();
@@ -104,16 +141,18 @@ export const serveCommand = command({
104
141
  : await startDevServer(service, uiRoot, port, host);
105
142
  const url = `http://${browserHost(host)}:${port}`;
106
143
  console.log(`Weft ${version} on Node ${process.version}, listening on ${server.address}`);
107
- console.log(`Weft server running at ${url}${mode === "dev" ? " (vite dev)" : ""}`);
108
- // Prove the url works from here before sending a browser to it, so a
109
- // browser that still cannot connect is known to be blocked on its side.
144
+ // Prove the url works from here before announcing it or sending a
145
+ // browser to it, so a browser that still cannot connect is known to be
146
+ // blocked on its side.
110
147
  const check = await selfCheck(url);
148
+ const running = `Weft server running at ${url}${mode === "dev" ? " (vite dev)" : ""}`;
111
149
  if (check.ok) {
112
- console.log("Self-check passed: the UI and the API answer at that url from this process");
150
+ console.log(`${statusTag(true)} ${running}`);
113
151
  }
114
152
  else {
153
+ console.error(`${statusTag(false)} ${running}`);
115
154
  console.error(`Self-check failed (${check.reason}): the server is listening on ${server.address} ` +
116
- `but ${url} does not answer from this process. Try --host 127.0.0.1, or another --port.`);
155
+ `but ${url} does not answer from this process. Try another --port, or another --host.`);
117
156
  }
118
157
  if (argv.flags.open)
119
158
  openBrowser(url);
@@ -132,7 +171,16 @@ export const serveCommand = command({
132
171
  process.on("SIGTERM", shutdown);
133
172
  }
134
173
  catch (err) {
135
- console.error("Failed to start server:", err);
174
+ if (err instanceof UnknownStyleError) {
175
+ console.error(`serve: ${err.message}`);
176
+ }
177
+ else if (isPortInUse(err)) {
178
+ const where = `${argv.flags.host}:${port}`;
179
+ console.error(`${where} is already in use — another Weft, or something else. Pass --port to pick another.`);
180
+ }
181
+ else {
182
+ console.error("Failed to start server:", err);
183
+ }
136
184
  process.exit(1);
137
185
  }
138
186
  });
@@ -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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"}
@@ -0,0 +1,24 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import { isAbsolute, relative, resolve, sep } from "node:path";
3
+ /**
4
+ * The directory `serve --dir` names inside a root: a checkout or a fetched
5
+ * repo. It must be relative and stay inside the root, since with `--repo` the
6
+ * root is a cache entry and anything outside it is another repo's clone.
7
+ */
8
+ export function resolveSubRoot(root, dir) {
9
+ if (dir === undefined || dir === "" || dir === ".")
10
+ return root;
11
+ if (isAbsolute(dir)) {
12
+ throw new Error(`--dir "${dir}" must be relative to the served root`);
13
+ }
14
+ const target = resolve(root, dir);
15
+ const rel = relative(root, target);
16
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
17
+ throw new Error(`--dir "${dir}" leaves the served root`);
18
+ }
19
+ if (!existsSync(target) || !statSync(target).isDirectory()) {
20
+ throw new Error(`--dir "${dir}" is not a directory in ${root}`);
21
+ }
22
+ return target;
23
+ }
24
+ //# sourceMappingURL=sub-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-root.js","sourceRoot":"","sources":["../src/sub-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE/D;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAuB;IACnE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,uCAAuC,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,2BAA2B,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { describe, expect, it } from "vitest";
5
+ import { resolveSubRoot } from "./sub-root.js";
6
+ function tree() {
7
+ const root = mkdtempSync(join(tmpdir(), "weft-sub-root-"));
8
+ mkdirSync(join(root, "sites", "help"), { recursive: true });
9
+ writeFileSync(join(root, "README.md"), "# root\n");
10
+ return root;
11
+ }
12
+ describe("resolveSubRoot", () => {
13
+ it("returns the root when no dir is given", () => {
14
+ const root = tree();
15
+ expect(resolveSubRoot(root, undefined)).toBe(root);
16
+ expect(resolveSubRoot(root, "")).toBe(root);
17
+ expect(resolveSubRoot(root, ".")).toBe(root);
18
+ });
19
+ it("resolves a nested directory", () => {
20
+ const root = tree();
21
+ expect(resolveSubRoot(root, "sites/help")).toBe(join(root, "sites", "help"));
22
+ expect(resolveSubRoot(root, "sites/../sites/help/")).toBe(join(root, "sites", "help"));
23
+ });
24
+ it("refuses absolute paths and paths that leave the root", () => {
25
+ const root = tree();
26
+ expect(() => resolveSubRoot(root, "/etc")).toThrow(/must be relative/);
27
+ expect(() => resolveSubRoot(root, "..")).toThrow(/leaves the served root/);
28
+ expect(() => resolveSubRoot(root, "sites/../../x")).toThrow(/leaves the served root/);
29
+ });
30
+ it("refuses a missing directory or a file", () => {
31
+ const root = tree();
32
+ expect(() => resolveSubRoot(root, "sites/news")).toThrow(/is not a directory/);
33
+ expect(() => resolveSubRoot(root, "README.md")).toThrow(/is not a directory/);
34
+ });
35
+ });
36
+ //# sourceMappingURL=sub-root.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-root.test.js","sourceRoot":"","sources":["../src/sub-root.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,SAAS,IAAI;IACZ,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC3D,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC3E,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
package/dist/ui-server.js CHANGED
@@ -66,12 +66,38 @@ export function describeAddress(address) {
66
66
  * The host to put in the url the browser is sent to. A wildcard bind (or
67
67
  * none, which binds every interface) is reached as `localhost`; an explicit
68
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.
69
75
  */
70
76
  export function browserHost(host) {
71
77
  if (host === undefined || host === "0.0.0.0" || host === "::")
72
78
  return "localhost";
73
79
  return host.includes(":") ? `[${host}]` : host;
74
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
+ }
75
101
  /**
76
102
  * Request the UI and the API from inside the process, before the browser is
77
103
  * asked to. A pass proves the server answers at the url that was printed, so
@@ -83,8 +109,12 @@ export async function selfCheck(url, timeoutMs = 5000) {
83
109
  for (const path of ["/api/manifest", "/"]) {
84
110
  try {
85
111
  const res = await fetch(url + path, { signal: AbortSignal.timeout(timeoutMs) });
86
- if (!res.ok)
87
- return { ok: false, reason: `GET ${path} → HTTP ${res.status}` };
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
+ }
88
118
  await res.arrayBuffer(); // drain, so the connection is released
89
119
  }
90
120
  catch (err) {
@@ -131,7 +161,9 @@ export async function startDevServer(service, uiRoot, port, host) {
131
161
  process.chdir(uiRoot);
132
162
  const server = await createViteServer({
133
163
  root: uiRoot,
134
- server: { port, host },
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 },
135
167
  plugins: [weftApiPlugin(service)],
136
168
  });
137
169
  await server.listen();
@@ -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, browserHost, chooseUiMode, describeAddress, routeRequest, selfCheck, } 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", () => {
@@ -128,7 +128,7 @@ describe("selfCheck", () => {
128
128
  try {
129
129
  expect(await selfCheck(`http://127.0.0.1:${port}`)).toEqual({
130
130
  ok: false,
131
- reason: "GET / → HTTP 500",
131
+ reason: "GET / → HTTP 500 (is something else answering on that port?)",
132
132
  });
133
133
  }
134
134
  finally {
@@ -159,4 +159,50 @@ describe("browserHost", () => {
159
159
  expect(browserHost("docs.local")).toBe("docs.local");
160
160
  });
161
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
+ });
207
+ });
162
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.1",
3
+ "version": "0.1.3",
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,15 +18,15 @@
18
18
  "weft": "bin/weft.js"
19
19
  },
20
20
  "dependencies": {
21
- "@lepid-labs/weft-core": "0.1.1",
22
- "@lepid-labs/weft-ui": "0.1.1",
21
+ "@lepid-labs/weft-core": "0.1.3",
22
+ "@lepid-labs/weft-ui": "0.1.3",
23
23
  "cleye": "^1.3.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.0.0",
27
27
  "typescript": "^5.7.0",
28
28
  "vite": "^6.4.3",
29
- "vitest": "^3.2.6"
29
+ "vitest": "^4.1.11"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "vite": "^6.4.3"