@nwire/cli 0.7.0 → 0.8.0

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.
Files changed (84) hide show
  1. package/README.md +58 -30
  2. package/dist/__tests__/bench.test.d.ts +2 -0
  3. package/dist/__tests__/bench.test.d.ts.map +1 -0
  4. package/dist/__tests__/bench.test.js +94 -0
  5. package/dist/__tests__/bench.test.js.map +1 -0
  6. package/dist/__tests__/replay.test.d.ts +2 -0
  7. package/dist/__tests__/replay.test.d.ts.map +1 -0
  8. package/dist/__tests__/replay.test.js +202 -0
  9. package/dist/__tests__/replay.test.js.map +1 -0
  10. package/dist/__tests__/trace.test.d.ts +2 -0
  11. package/dist/__tests__/trace.test.d.ts.map +1 -0
  12. package/dist/__tests__/trace.test.js +136 -0
  13. package/dist/__tests__/trace.test.js.map +1 -0
  14. package/dist/__tests__/watch.test.d.ts +2 -0
  15. package/dist/__tests__/watch.test.d.ts.map +1 -0
  16. package/dist/__tests__/watch.test.js +109 -0
  17. package/dist/__tests__/watch.test.js.map +1 -0
  18. package/dist/cache-runner.js +62 -14
  19. package/dist/cache-runner.js.map +1 -1
  20. package/dist/cli.js +8 -0
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/bench.d.ts +103 -0
  23. package/dist/commands/bench.d.ts.map +1 -0
  24. package/dist/commands/bench.js +203 -0
  25. package/dist/commands/bench.js.map +1 -0
  26. package/dist/commands/dev.d.ts.map +1 -1
  27. package/dist/commands/dev.js +31 -20
  28. package/dist/commands/dev.js.map +1 -1
  29. package/dist/commands/doctor.d.ts.map +1 -1
  30. package/dist/commands/doctor.js +29 -5
  31. package/dist/commands/doctor.js.map +1 -1
  32. package/dist/commands/infra.d.ts.map +1 -1
  33. package/dist/commands/infra.js +7 -0
  34. package/dist/commands/infra.js.map +1 -1
  35. package/dist/commands/logs.d.ts.map +1 -1
  36. package/dist/commands/logs.js +64 -11
  37. package/dist/commands/logs.js.map +1 -1
  38. package/dist/commands/replay.d.ts +45 -0
  39. package/dist/commands/replay.d.ts.map +1 -0
  40. package/dist/commands/replay.js +159 -0
  41. package/dist/commands/replay.js.map +1 -0
  42. package/dist/commands/run.d.ts.map +1 -1
  43. package/dist/commands/run.js +14 -4
  44. package/dist/commands/run.js.map +1 -1
  45. package/dist/commands/studio.d.ts.map +1 -1
  46. package/dist/commands/studio.js +7 -1
  47. package/dist/commands/studio.js.map +1 -1
  48. package/dist/commands/test.d.ts.map +1 -1
  49. package/dist/commands/test.js +3 -0
  50. package/dist/commands/test.js.map +1 -1
  51. package/dist/commands/trace.d.ts +40 -0
  52. package/dist/commands/trace.d.ts.map +1 -0
  53. package/dist/commands/trace.js +195 -0
  54. package/dist/commands/trace.js.map +1 -0
  55. package/dist/commands/watch.d.ts +33 -0
  56. package/dist/commands/watch.d.ts.map +1 -0
  57. package/dist/commands/watch.js +152 -0
  58. package/dist/commands/watch.js.map +1 -0
  59. package/dist/lib/dev-entry.d.ts +39 -0
  60. package/dist/lib/dev-entry.d.ts.map +1 -0
  61. package/dist/lib/dev-entry.js +102 -0
  62. package/dist/lib/dev-entry.js.map +1 -0
  63. package/dist/lib/exec.d.ts +7 -0
  64. package/dist/lib/exec.d.ts.map +1 -1
  65. package/dist/lib/exec.js +19 -1
  66. package/dist/lib/exec.js.map +1 -1
  67. package/dist/lib/run-task.d.ts.map +1 -1
  68. package/dist/lib/run-task.js +6 -1
  69. package/dist/lib/run-task.js.map +1 -1
  70. package/dist/lib/sse.d.ts +24 -0
  71. package/dist/lib/sse.d.ts.map +1 -0
  72. package/dist/lib/sse.js +63 -0
  73. package/dist/lib/sse.js.map +1 -0
  74. package/dist/lib/wire-discovery.d.ts +9 -0
  75. package/dist/lib/wire-discovery.d.ts.map +1 -0
  76. package/dist/lib/wire-discovery.js +82 -0
  77. package/dist/lib/wire-discovery.js.map +1 -0
  78. package/dist/load-config.d.ts +3 -3
  79. package/dist/load-config.d.ts.map +1 -1
  80. package/dist/load-config.js +15 -3
  81. package/dist/load-config.js.map +1 -1
  82. package/dist/ls-runner.js +2 -2
  83. package/dist/ls-runner.js.map +1 -1
  84. package/package.json +8 -4
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Unit tests for `nwire watch`.
3
+ *
4
+ * Same approach as trace.test.ts: command meta, hook-glob → regex
5
+ * translation, output line formatting, and an integration check of the
6
+ * wire-discovery helper hitting a stubbed loopback HTTP server.
7
+ */
8
+ import { describe, it, expect, afterEach } from "vitest";
9
+ import { createServer } from "node:http";
10
+ import { watchCommand, hookGlobToRegex, formatHookStepLine } from "../commands/watch.js";
11
+ import { findWireUrl } from "../lib/wire-discovery.js";
12
+ let server;
13
+ afterEach(async () => {
14
+ if (server) {
15
+ await new Promise((res) => server.close(() => res()));
16
+ server = undefined;
17
+ }
18
+ delete process.env.NWIRE_INSPECT_URL;
19
+ });
20
+ describe("nwire watch — command meta", () => {
21
+ it("registers a `watch` subcommand with a required hook positional", () => {
22
+ expect(watchCommand.meta).toBeDefined();
23
+ const meta = watchCommand.meta;
24
+ expect(meta.name).toBe("watch");
25
+ const args = watchCommand.args;
26
+ expect(args.hook.type).toBe("positional");
27
+ expect(args.hook.required).toBe(true);
28
+ });
29
+ });
30
+ describe("hookGlobToRegex", () => {
31
+ it("matches an exact hook name", () => {
32
+ const r = hookGlobToRegex("plugin.boot:identity");
33
+ expect(r.test("plugin.boot:identity")).toBe(true);
34
+ expect(r.test("plugin.boot:rbac")).toBe(false);
35
+ });
36
+ it("expands a trailing * to a wildcard", () => {
37
+ const r = hookGlobToRegex("plugin.boot:*");
38
+ expect(r.test("plugin.boot:identity")).toBe(true);
39
+ expect(r.test("plugin.boot:rbac")).toBe(true);
40
+ expect(r.test("action.dispatch:identity")).toBe(false);
41
+ });
42
+ it("escapes regex metacharacters", () => {
43
+ // `.` is escaped — `plugin.boot:identity` matches but `pluginXboot:identity` doesn't
44
+ const r = hookGlobToRegex("plugin.boot:identity");
45
+ expect(r.test("pluginXboot:identity")).toBe(false);
46
+ });
47
+ it("anchors the match (no partial matches)", () => {
48
+ const r = hookGlobToRegex("plugin.boot:identity");
49
+ expect(r.test("xx plugin.boot:identity yy")).toBe(false);
50
+ });
51
+ });
52
+ describe("formatHookStepLine", () => {
53
+ it("includes phase, stepKind, stepName, and duration", () => {
54
+ const line = formatHookStepLine({
55
+ kind: "hook.step",
56
+ hookName: "plugin.boot:identity",
57
+ phase: "end",
58
+ stepKind: "provide",
59
+ stepName: "User",
60
+ durationMs: 42,
61
+ occurredAt: "2026-05-29T10:00:00.000Z",
62
+ });
63
+ expect(line).toContain("end");
64
+ expect(line).toContain("provide");
65
+ expect(line).toContain("User");
66
+ expect(line).toContain("(42ms)");
67
+ });
68
+ it("renders error: <msg> when phase is error", () => {
69
+ const line = formatHookStepLine({
70
+ kind: "hook.step",
71
+ hookName: "plugin.boot:identity",
72
+ phase: "error",
73
+ stepKind: "provide",
74
+ stepName: "User",
75
+ error: { message: "boom" },
76
+ });
77
+ expect(line).toContain("error");
78
+ expect(line).toContain("boom");
79
+ });
80
+ it("accepts a string `error` field", () => {
81
+ const line = formatHookStepLine({
82
+ kind: "hook.step",
83
+ hookName: "h",
84
+ phase: "error",
85
+ stepName: "x",
86
+ error: "literal-string-error",
87
+ });
88
+ expect(line).toContain("literal-string-error");
89
+ });
90
+ });
91
+ describe("findWireUrl — discovery via stubbed wire", () => {
92
+ it("returns the URL of a stubbed wire that answers /_nwire/events/recent", async () => {
93
+ server = createServer((req, res) => {
94
+ if (req.url?.startsWith("/_nwire/events/recent")) {
95
+ res.writeHead(200, { "content-type": "application/json" });
96
+ res.end("[]");
97
+ return;
98
+ }
99
+ res.writeHead(404);
100
+ res.end();
101
+ });
102
+ await new Promise((res) => server.listen(0, "127.0.0.1", res));
103
+ const port = server.address().port;
104
+ process.env.NWIRE_INSPECT_URL = `http://127.0.0.1:${port}`;
105
+ const url = await findWireUrl();
106
+ expect(url).toBe(`http://127.0.0.1:${port}`);
107
+ });
108
+ });
109
+ //# sourceMappingURL=watch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.test.js","sourceRoot":"","sources":["../../src/__tests__/watch.test.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,39 @@
1
1
  // Cache runner — invoked by `nwire cache`. Imports the consumer's apps
2
2
  // registry (resolved via nwire.config.ts or fallback paths), builds the
3
3
  // cache, writes .nwire/.
4
+ //
5
+ // User code follows the bundler-style extensionless-import convention
6
+ // (e.g. `import { x } from './foo'` resolving `./foo.ts`), so we load
7
+ // it through jiti rather than Node's strict ESM loader — jiti gives us
8
+ // TS-on-the-fly + the same resolution semantics the dev server uses.
4
9
  import { resolve } from "node:path";
10
+ import { createJiti } from "jiti";
5
11
  import { buildCache, writeCache } from "@nwire/scan";
6
12
  import { loadConfig, resolveAppsEntry } from "./load-config.js";
7
13
  async function main() {
8
14
  const cwd = process.cwd();
9
15
  const config = await loadConfig(cwd);
10
16
  const appsPath = resolveAppsEntry(cwd, config);
17
+ const jiti = createJiti(cwd, {
18
+ fsCache: false,
19
+ moduleCache: false,
20
+ interopDefault: true,
21
+ });
11
22
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- const mod = await import(/* @vite-ignore */ appsPath);
23
+ const mod = await jiti.import(appsPath);
13
24
  // Resolve apps registry in this order:
14
- // 1. named export `allApps: AppDefinition[]`
15
- // 2. named export `apps: AppDefinition[]`
16
- // 3. default export — either AppDefinition[] or a single AppDefinition
17
- // 4. named export `app: AppDefinition`
18
- // 5. any single exported AppDefinition the module declares
25
+ // 1. named export `allApps: App[]`
26
+ // 2. named export `apps: App[]`
27
+ // 3. default export — either App[] or a single App
28
+ // 4. named export `app: App`
29
+ // 5. any single exported App the module declares
30
+ //
31
+ // "App" means either:
32
+ // - `AppDefinition` (legacy `defineApp(name, { modules })`)
33
+ // - bootable `App` (modern `createApp({ modules })`)
34
+ // Both expose `modules: ModuleDefinition[]` which is all the scanner
35
+ // needs — we normalize them into the AppDefinition shape buildCache
36
+ // expects.
19
37
  let apps = [];
20
38
  if (Array.isArray(mod.allApps))
21
39
  apps = mod.allApps;
@@ -23,24 +41,24 @@ async function main() {
23
41
  apps = mod.apps;
24
42
  else if (Array.isArray(mod.default))
25
43
  apps = mod.default;
26
- else if (isAppDef(mod.default))
44
+ else if (isAppLike(mod.default))
27
45
  apps = [mod.default];
28
- else if (isAppDef(mod.app))
46
+ else if (isAppLike(mod.app))
29
47
  apps = [mod.app];
30
48
  else {
31
- // Sweep all named exports for AppDefinitions.
32
- apps = Object.values(mod).filter(isAppDef);
49
+ apps = Object.values(mod).filter(isAppLike);
33
50
  }
34
51
  if (apps.length === 0) {
35
52
  console.error(`nwire cache: no apps found in ${appsPath}.\n` +
36
- `Expected: exported \`apps\`, \`allApps\`, or default-exported AppDefinition.\n` +
53
+ `Expected: exported \`app\`, \`apps\`, or \`allApps\` — either an AppDefinition (\`defineApp\`) or a runnable App (\`createApp\`).\n` +
37
54
  `Optional: nwire.config.ts with { appsEntry: "..." } to point at a custom location.`);
38
55
  process.exit(1);
39
56
  }
57
+ const normalized = apps.map(toAppDefinitionShape);
40
58
  // Route bindings are declared at the app layer via `httpInterface().wire()`
41
59
  // and surface in Studio through the running wire's `/_nwire/*` introspection
42
60
  // mount, not through the cache. The scan is module-domain-only.
43
- const cache = buildCache(apps);
61
+ const cache = buildCache(normalized);
44
62
  const outDir = resolve(cwd, config.cacheDir ?? ".nwire");
45
63
  await writeCache(cache, outDir);
46
64
  // eslint-disable-next-line no-console
@@ -48,8 +66,38 @@ async function main() {
48
66
  `${cache.actions.length} actions, ${cache.events.length} events, ` +
49
67
  `${cache.resolvers.length} resolvers to ${outDir}/`);
50
68
  }
51
- function isAppDef(x) {
52
- return (typeof x === "object" && x !== null && x.$kind === "app-definition");
69
+ function isAppLike(x) {
70
+ if (typeof x !== "object" || x === null)
71
+ return false;
72
+ const a = x;
73
+ return a.$kind === "app-definition" || a.$nwireApp === true;
74
+ }
75
+ /**
76
+ * Normalize either flavor of "app" into the AppDefinition shape the
77
+ * scanner reads. `createApp` returns an `App` with `appName` + the
78
+ * bootable runtime; `defineApp` returns `AppDefinition` with `name` +
79
+ * static metadata. Both expose `modules`, which is all we need.
80
+ */
81
+ function toAppDefinitionShape(x) {
82
+ const a = x;
83
+ return {
84
+ name: a.name ?? a.appName ?? "app",
85
+ description: a.description,
86
+ modules: a.modules ?? [],
87
+ plugins: a.plugins ?? [],
88
+ // Forward operator commands defensively. Apps registered via
89
+ // `defineApp` won't carry this; consumers who attach a
90
+ // `commands: defineCommand[]` to their AppDefinition flow it through to
91
+ // the scan emitter so `.nwire/commands.json` reflects ops surface.
92
+ commands: a.commands ?? [],
93
+ tenantModel: a.tenantModel,
94
+ tenantKey: a.tenantKey,
95
+ // Forward the container so the scanner can walk `container.list()` and
96
+ // emit `.nwire/di.json`. `defineApp` shape may carry it on `.runtime`;
97
+ // `createApp` exposes it directly.
98
+ container: a.container ?? a.runtime?.container,
99
+ runtime: a.runtime,
100
+ };
53
101
  }
54
102
  main().catch((err) => {
55
103
  console.error(err);
@@ -1 +1 @@
1
- {"version":3,"file":"cache-runner.js","sourceRoot":"","sources":["../src/cache-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache-runner.js","sourceRoot":"","sources":["../src/cache-runner.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -13,6 +13,7 @@
13
13
  * `kernel.router.register("<name>", handler)` in kernel-instance.ts
14
14
  */
15
15
  import { defineCommand, runMain } from "citty";
16
+ import { benchCommand } from "./commands/bench.js";
16
17
  import { buildCommand } from "./commands/build.js";
17
18
  import { cacheCommand } from "./commands/cache.js";
18
19
  import { checkCommand } from "./commands/check.js";
@@ -26,9 +27,12 @@ import { logsCommand } from "./commands/logs.js";
26
27
  import { lsCommand } from "./commands/ls.js";
27
28
  import { pleaseCommand } from "./commands/please.js";
28
29
  import { psCommand } from "./commands/ps.js";
30
+ import { replayCommand } from "./commands/replay.js";
29
31
  import { runCommand } from "./commands/run.js";
30
32
  import { studioCommand } from "./commands/studio.js";
31
33
  import { testCommand } from "./commands/test.js";
34
+ import { traceCommand } from "./commands/trace.js";
35
+ import { watchCommand } from "./commands/watch.js";
32
36
  const main = defineCommand({
33
37
  meta: {
34
38
  name: "nwire",
@@ -36,6 +40,7 @@ const main = defineCommand({
36
40
  description: "Nwire — event-driven framework. Dev, build, please, ps, logs, studio, …",
37
41
  },
38
42
  subCommands: {
43
+ bench: benchCommand,
39
44
  build: buildCommand,
40
45
  cache: cacheCommand,
41
46
  check: checkCommand,
@@ -48,9 +53,12 @@ const main = defineCommand({
48
53
  ls: lsCommand,
49
54
  please: pleaseCommand,
50
55
  ps: psCommand,
56
+ replay: replayCommand,
51
57
  run: runCommand,
52
58
  studio: studioCommand,
53
59
  test: testCommand,
60
+ trace: traceCommand,
61
+ watch: watchCommand,
54
62
  },
55
63
  });
56
64
  // Citty's parent-`run` fires alongside subcommand handlers, which would
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,yEAAyE;KACvF;IACD,WAAW,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;QACnB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,aAAa;QACrB,EAAE,EAAE,SAAS;QACb,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;KAClB;CACF,CAAC,CAAC;AAEH,wEAAwE;AACxE,uEAAuE;AACvE,wEAAwE;AACxE,gCAAgC;AAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC1B,KAAK,eAAe,CAAC,GAAI,CAAC,EAAW,CAAC,CAAC;AACzC,CAAC;KAAM,CAAC;IACN,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,yEAAyE;KACvF;IACD,WAAW,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;QACnB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,aAAa;QACrB,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;KACpB;CACF,CAAC,CAAC;AAEH,wEAAwE;AACxE,uEAAuE;AACvE,wEAAwE;AACxE,gCAAgC;AAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC1B,KAAK,eAAe,CAAC,GAAI,CAAC,EAAW,CAAC,CAAC;AACzC,CAAC;KAAM,CAAC;IACN,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `nwire bench` — primitive-level load probe wrapped around k6.
3
+ *
4
+ * k6 is a Go binary; we don't bundle it. The command shells out to
5
+ * whatever `k6` is on PATH and forwards the JSON summary to stdout (or
6
+ * to `--out`). Five scenarios ship with the repo:
7
+ *
8
+ * - action POST /api/<action> in a tight loop
9
+ * - roundtrip action → projection visible (tail latency)
10
+ * - read GET against a projection-backed query
11
+ * - workflow event → workflow → cascaded action
12
+ * - mixed 60/30/10 read/write/admin blend
13
+ *
14
+ * Defaults aim at "honest laptop bench" — 100 VUs, 30s ramp, 2m steady.
15
+ * Override with `--vus` + `--duration` if you want a quick smoke or a
16
+ * full soak.
17
+ *
18
+ * Discoverability hints:
19
+ * - The scripts live at `scripts/k6/<scenario>.js` in the repo. When
20
+ * running inside the framework repo we resolve them directly. When
21
+ * a consumer runs `nwire bench` in their own project, we still ship
22
+ * the scenarios via the published package (resolved from
23
+ * `@nwire/cli/scripts/k6/`); the resolver checks both locations.
24
+ * - The wire under load isn't booted by this command. The contract
25
+ * is: you run your wire in one shell, `nwire bench` in another.
26
+ *
27
+ * Examples:
28
+ * nwire bench --scenario action --vus 50 --duration 30s
29
+ * nwire bench --scenario mixed --base-url http://localhost:3030
30
+ * nwire bench --scenario all --out ./bench-results/
31
+ */
32
+ declare const SCENARIOS: {
33
+ readonly action: "action-dispatch.js";
34
+ readonly roundtrip: "event-publish-roundtrip.js";
35
+ readonly read: "projection-read.js";
36
+ readonly workflow: "workflow-fire.js";
37
+ readonly mixed: "mixed-workload.js";
38
+ };
39
+ type ScenarioKey = keyof typeof SCENARIOS;
40
+ /**
41
+ * The scenario scripts live at `scripts/k6/<file>` in the framework
42
+ * repo. We resolve by walking up from the supplied roots, in order,
43
+ * until we find the first `scripts/k6/<file>` that exists.
44
+ *
45
+ * Resolution order in production:
46
+ * 1. CWD upward — user's project may override
47
+ * 2. this file's dir — installed in node_modules of a consumer
48
+ *
49
+ * Exported so tests can pin the roots to a fixture directory.
50
+ */
51
+ export declare function resolveScenarioPath(scenario: ScenarioKey, cwd: string, roots?: ReadonlyArray<string>): string | null;
52
+ /** Result of probing `k6 --version`. Exported for testing. */
53
+ export interface K6Probe {
54
+ readonly installed: boolean;
55
+ readonly version?: string;
56
+ }
57
+ export declare function probeK6(): K6Probe;
58
+ export interface BenchArgs {
59
+ readonly scenario: ScenarioKey | "all";
60
+ readonly vus: number;
61
+ readonly duration: string;
62
+ readonly ramp: string;
63
+ readonly baseUrl: string;
64
+ readonly out?: string;
65
+ }
66
+ export declare function buildK6Args(opts: {
67
+ readonly script: string;
68
+ readonly args: BenchArgs;
69
+ readonly summaryOut?: string;
70
+ }): string[];
71
+ export declare const benchCommand: import("citty").CommandDef<{
72
+ scenario: {
73
+ type: "string";
74
+ description: string;
75
+ default: string;
76
+ };
77
+ vus: {
78
+ type: "string";
79
+ description: string;
80
+ default: string;
81
+ };
82
+ duration: {
83
+ type: "string";
84
+ description: string;
85
+ default: string;
86
+ };
87
+ ramp: {
88
+ type: "string";
89
+ description: string;
90
+ default: string;
91
+ };
92
+ "base-url": {
93
+ type: "string";
94
+ description: string;
95
+ default: string;
96
+ };
97
+ out: {
98
+ type: "string";
99
+ description: string;
100
+ };
101
+ }>;
102
+ export {};
103
+ //# sourceMappingURL=bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../src/commands/bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAUH,QAAA,MAAM,SAAS;;;;;;CAML,CAAC;AAEX,KAAK,WAAW,GAAG,MAAM,OAAO,SAAS,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,MAAM,GAAG,IAAI,CAef;AAcD,8DAA8D;AAC9D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,OAAO,IAAI,OAAO,CAOjC;AAID,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,KAAK,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,MAAM,EAAE,CAWX;AAID,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyGvB,CAAC"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * `nwire bench` — primitive-level load probe wrapped around k6.
3
+ *
4
+ * k6 is a Go binary; we don't bundle it. The command shells out to
5
+ * whatever `k6` is on PATH and forwards the JSON summary to stdout (or
6
+ * to `--out`). Five scenarios ship with the repo:
7
+ *
8
+ * - action POST /api/<action> in a tight loop
9
+ * - roundtrip action → projection visible (tail latency)
10
+ * - read GET against a projection-backed query
11
+ * - workflow event → workflow → cascaded action
12
+ * - mixed 60/30/10 read/write/admin blend
13
+ *
14
+ * Defaults aim at "honest laptop bench" — 100 VUs, 30s ramp, 2m steady.
15
+ * Override with `--vus` + `--duration` if you want a quick smoke or a
16
+ * full soak.
17
+ *
18
+ * Discoverability hints:
19
+ * - The scripts live at `scripts/k6/<scenario>.js` in the repo. When
20
+ * running inside the framework repo we resolve them directly. When
21
+ * a consumer runs `nwire bench` in their own project, we still ship
22
+ * the scenarios via the published package (resolved from
23
+ * `@nwire/cli/scripts/k6/`); the resolver checks both locations.
24
+ * - The wire under load isn't booted by this command. The contract
25
+ * is: you run your wire in one shell, `nwire bench` in another.
26
+ *
27
+ * Examples:
28
+ * nwire bench --scenario action --vus 50 --duration 30s
29
+ * nwire bench --scenario mixed --base-url http://localhost:3030
30
+ * nwire bench --scenario all --out ./bench-results/
31
+ */
32
+ import { defineCommand } from "citty";
33
+ import { spawnSync } from "node:child_process";
34
+ import { existsSync, mkdirSync } from "node:fs";
35
+ import { dirname, join, resolve } from "node:path";
36
+ import { fileURLToPath } from "node:url";
37
+ import { palette } from "../lib/colors.js";
38
+ const SCENARIOS = {
39
+ action: "action-dispatch.js",
40
+ roundtrip: "event-publish-roundtrip.js",
41
+ read: "projection-read.js",
42
+ workflow: "workflow-fire.js",
43
+ mixed: "mixed-workload.js",
44
+ };
45
+ // ─── path resolution ───────────────────────────────────────────────
46
+ /**
47
+ * The scenario scripts live at `scripts/k6/<file>` in the framework
48
+ * repo. We resolve by walking up from the supplied roots, in order,
49
+ * until we find the first `scripts/k6/<file>` that exists.
50
+ *
51
+ * Resolution order in production:
52
+ * 1. CWD upward — user's project may override
53
+ * 2. this file's dir — installed in node_modules of a consumer
54
+ *
55
+ * Exported so tests can pin the roots to a fixture directory.
56
+ */
57
+ export function resolveScenarioPath(scenario, cwd, roots) {
58
+ const file = SCENARIOS[scenario];
59
+ const effective = roots ?? defaultRoots(cwd);
60
+ for (const root of effective) {
61
+ let dir = root;
62
+ for (let i = 0; i < 8; i++) {
63
+ const candidate = join(dir, "scripts", "k6", file);
64
+ if (existsSync(candidate))
65
+ return candidate;
66
+ const next = dirname(dir);
67
+ if (next === dir)
68
+ break;
69
+ dir = next;
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+ function defaultRoots(cwd) {
75
+ let here;
76
+ try {
77
+ here = dirname(fileURLToPath(import.meta.url));
78
+ }
79
+ catch {
80
+ here = cwd;
81
+ }
82
+ return [cwd, here];
83
+ }
84
+ export function probeK6() {
85
+ const r = spawnSync("k6", ["version"], { encoding: "utf8" });
86
+ if (r.status === 0 && r.stdout) {
87
+ const first = r.stdout.split("\n")[0]?.trim();
88
+ return { installed: true, version: first };
89
+ }
90
+ return { installed: false };
91
+ }
92
+ export function buildK6Args(opts) {
93
+ const env = [
94
+ "-e", `VUS=${opts.args.vus}`,
95
+ "-e", `DURATION=${opts.args.duration}`,
96
+ "-e", `RAMP=${opts.args.ramp}`,
97
+ "-e", `BASE_URL=${opts.args.baseUrl}`,
98
+ ];
99
+ const out = opts.summaryOut
100
+ ? ["--summary-export", opts.summaryOut]
101
+ : [];
102
+ return ["run", ...env, ...out, opts.script];
103
+ }
104
+ // ─── command ───────────────────────────────────────────────────────
105
+ export const benchCommand = defineCommand({
106
+ meta: {
107
+ name: "bench",
108
+ description: "Run a k6 load probe against a Nwire wire (action / roundtrip / read / workflow / mixed)",
109
+ },
110
+ args: {
111
+ scenario: {
112
+ type: "string",
113
+ description: "action | roundtrip | read | workflow | mixed | all",
114
+ default: "action",
115
+ },
116
+ vus: {
117
+ type: "string",
118
+ description: "Peak virtual users",
119
+ default: "100",
120
+ },
121
+ duration: {
122
+ type: "string",
123
+ description: "Sustained-load duration (k6 timespan, e.g. 30s, 2m)",
124
+ default: "2m",
125
+ },
126
+ ramp: {
127
+ type: "string",
128
+ description: "Ramp-up duration before steady state",
129
+ default: "30s",
130
+ },
131
+ "base-url": {
132
+ type: "string",
133
+ description: "URL of the wire under load",
134
+ default: "http://localhost:3030",
135
+ },
136
+ out: {
137
+ type: "string",
138
+ description: "Directory for per-scenario summary JSON (default: stdout only)",
139
+ },
140
+ },
141
+ async run({ args }) {
142
+ const probe = probeK6();
143
+ if (!probe.installed) {
144
+ console.error(palette.err("nwire bench: k6 is not installed."));
145
+ console.error(palette.hint("Install with `brew install k6` (macOS) or see https://k6.io/docs/get-started/installation/"));
146
+ process.exit(1);
147
+ }
148
+ const scenario = String(args.scenario);
149
+ const valid = ["all", ...Object.keys(SCENARIOS)];
150
+ if (!valid.includes(scenario)) {
151
+ console.error(palette.err(`nwire bench: unknown scenario "${scenario}".`));
152
+ console.error(palette.hint(`Valid: ${valid.join(", ")}`));
153
+ process.exit(1);
154
+ }
155
+ const benchArgs = {
156
+ scenario,
157
+ vus: Number(args.vus),
158
+ duration: String(args.duration),
159
+ ramp: String(args.ramp),
160
+ baseUrl: String(args["base-url"]),
161
+ out: typeof args.out === "string" ? args.out : undefined,
162
+ };
163
+ if (Number.isNaN(benchArgs.vus) || benchArgs.vus < 1) {
164
+ console.error(palette.err("nwire bench: --vus must be a positive integer."));
165
+ process.exit(1);
166
+ }
167
+ if (benchArgs.out)
168
+ mkdirSync(resolve(process.cwd(), benchArgs.out), { recursive: true });
169
+ const scenarios = scenario === "all" ? Object.keys(SCENARIOS) : [scenario];
170
+ console.log("");
171
+ console.log(` ${palette.brand("nwire bench")} ${palette.dim(`(k6 ${probe.version ?? ""})`)}`);
172
+ console.log(palette.dim(` scenarios: ${scenarios.join(", ")}`));
173
+ console.log(palette.dim(` vus=${benchArgs.vus} ramp=${benchArgs.ramp} duration=${benchArgs.duration} base=${benchArgs.baseUrl}`));
174
+ console.log("");
175
+ let failures = 0;
176
+ for (const s of scenarios) {
177
+ const script = resolveScenarioPath(s, process.cwd());
178
+ if (!script) {
179
+ console.error(palette.err(`nwire bench: cannot locate scripts/k6/${SCENARIOS[s]}`));
180
+ console.error(palette.hint("Run from inside a Nwire repo, or copy scripts/k6/ into your project."));
181
+ failures++;
182
+ continue;
183
+ }
184
+ const summaryOut = benchArgs.out
185
+ ? resolve(process.cwd(), benchArgs.out, `${s}.json`)
186
+ : undefined;
187
+ const k6Args = buildK6Args({ script, args: benchArgs, summaryOut });
188
+ console.log(palette.dim(` → k6 ${k6Args.join(" ")}`));
189
+ const result = spawnSync("k6", k6Args, { stdio: "inherit" });
190
+ if (result.status !== 0) {
191
+ console.error(palette.warn(` scenario "${s}" exited with status ${result.status ?? "?"} (likely SLO threshold miss)`));
192
+ failures++;
193
+ }
194
+ }
195
+ if (failures > 0) {
196
+ console.log("");
197
+ console.log(palette.warn(` ${failures} scenario(s) flagged an issue — see k6 output above.`));
198
+ process.exit(1);
199
+ }
200
+ process.exit(0);
201
+ },
202
+ });
203
+ //# sourceMappingURL=bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bench.js","sourceRoot":"","sources":["../../src/commands/bench.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,eAAO,MAAM,UAAU,qDAuJrB,CAAC"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsBH,eAAO,MAAM,UAAU,qDAkKrB,CAAC"}