@streamotter/cli 0.1.0-rc.1

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Orca Solutions
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # @streamotter/cli
2
+
3
+ The `streamotter` command: scaffold a project, validate its configuration, generate TypeScript channel types, run a development gateway with the local workbench, and start the production gateway.
4
+
5
+ > **Release candidate.** `0.1.0-rc.1` is published under the `next` tag. Package versions follow SemVer independently of the V1 protocol and `configVersion: 1`.
6
+
7
+ ```bash
8
+ npm install @streamotter/cli@next
9
+ ```
10
+
11
+ Requires Node.js 24 or later. It installs [`@streamotter/gateway`](https://www.npmjs.com/package/@streamotter/gateway) and the workbench assets. Install it as a regular dependency, because `streamotter start` runs in production.
12
+
13
+ ## From zero to a live channel
14
+
15
+ ```bash
16
+ mkdir live-jobs && cd live-jobs
17
+ npm init -y
18
+ npm install @streamotter/cli@next @streamotter/client@next
19
+ npx streamotter init .
20
+ ```
21
+
22
+ `init` creates a fixture-backed project that needs no Kafka broker. It refuses to overwrite existing files.
23
+
24
+ | File | Purpose |
25
+ | --- | --- |
26
+ | `streamotter.json` | The portable configuration: a `jobs` fixture source, schemas, and a `jobProgress` channel |
27
+ | `server/handlers.mjs` | Your trusted handlers (`authenticate`, `authorize`, `map`, `snapshot`), plus a `development` export with a `developer` principal and fixture records |
28
+ | `web/example.ts` | A browser subscription with cleanup and error handling |
29
+ | `README.md` | These steps, for your team |
30
+
31
+ ```bash
32
+ npx streamotter validate --config streamotter.json
33
+ npx streamotter dev --config streamotter.json --handlers server/handlers.mjs
34
+ ```
35
+
36
+ `validate` checks structure, schemas, and references (no network, no handlers) and prints the configuration's SHA-256 fingerprint. `dev` starts the gateway in development mode and prints its addresses and a one-time management token:
37
+
38
+ ```text
39
+ StreamOtter development gateway
40
+ Gateway http://127.0.0.1:7400 (Socket.IO path /streamotter/socket.io)
41
+ Workbench http://127.0.0.1:7401/
42
+ Management http://127.0.0.1:7401/management/v1 (local only)
43
+ Token <per-run token>
44
+ …
45
+ ```
46
+
47
+ ## The workbench
48
+
49
+ Open the workbench URL and paste the token. The page keeps it in memory only, so you paste it again after a reload.
50
+
51
+ - **Connect**: source status and staged connection checks (resolve → connect → TLS → authenticate → metadata). Advance fixture records here.
52
+ - **Define**: the channel contracts, and a candidate configuration editor with validation. Edits are candidates only: they change nothing until you export them and restart `dev`.
53
+ - **Preview**: subscribe as a development principal (`developer`) with the real SDK. Try `jobProgress` with `{"jobId": "job_1"}`, advance the `jobs` fixture, and watch revisions arrive. You can force a disconnect to see `stale` → fresh snapshot → `live`.
54
+ - **Inspect**: the payload-free trace of each record through validate, map, queue, send, receipt, and commit.
55
+ - **Export**: the canonical `streamotter.json` and its fingerprint. `streamotter validate` prints the same fingerprint.
56
+
57
+ The management API and workbench listen on loopback only (`--management-port`, default 7401), require the token, and check the browser origin. `streamotter start` never starts them.
58
+
59
+ ## Integrate
60
+
61
+ ```bash
62
+ npx streamotter generate --config streamotter.json --out generated
63
+ ```
64
+
65
+ This writes `generated/streamotter.generated.ts` (`AppChannels`, the parameter and payload types, and `channelVersions`) and `generated/streamotter.client.example.ts`. The generator overwrites only files that carry its own marker. Use the types with [`@streamotter/client`](https://www.npmjs.com/package/@streamotter/client) in the browser and with `HandlerRegistry<AppChannels>` on the server. Numeric ranges and string lengths are still checked at runtime.
66
+
67
+ ## Go to production
68
+
69
+ 1. Implement `authenticate` with your real session verification, and read snapshots from your authoritative store.
70
+ 2. Replace the fixture source with a Kafka source over TLS (optionally with SASL); see the [gateway guide](https://www.npmjs.com/package/@streamotter/gateway).
71
+ 3. Compile your handlers to JavaScript (the CLI loads compiled modules only and refuses `.ts` files).
72
+ 4. Run exactly one gateway per project:
73
+
74
+ ```bash
75
+ NODE_ENV=production npx streamotter start --config streamotter.json --handlers dist/handlers.js
76
+ ```
77
+
78
+ `start` serves delivery only. There is no management API, workbench, preview token, or fixture control, and the handler module's `development` export is ignored. It refuses:
79
+
80
+ - fixture sources and plaintext Kafka (`"tls": false`), with exit code 2;
81
+ - missing secret environment variables or unreadable CA files, without printing their values;
82
+ - browser connections whose `Origin` is missing or not listed in `gateway.allowedOrigins` (no wildcards).
83
+
84
+ Startup waits until every source has joined its consumer group (30-second deadline). If a source fails, `start` prints staged diagnostics and exits.
85
+
86
+ ## Commands and exit codes
87
+
88
+ | Command | |
89
+ | --- | --- |
90
+ | `streamotter init <directory>` | Scaffold a fixture-only project |
91
+ | `streamotter validate --config <path>` | Validate; print the fingerprint |
92
+ | `streamotter generate --config <path> --out <directory>` | Generate TypeScript channel types |
93
+ | `streamotter dev --config <path> --handlers <module> [--management-port <port>]` | Development gateway, workbench, and management API |
94
+ | `streamotter start --config <path> --handlers <module>` | Production gateway |
95
+
96
+ Exit codes: `0` success, `2` invalid input or configuration, `1` startup or runtime failure. `SIGINT` and `SIGTERM` shut down gracefully (10-second deadline) and exit 0.
97
+
98
+ ## More
99
+
100
+ - [Running StreamOtter](https://github.com/jfricano/StreamOtter/blob/main/docs/DEPLOYMENT.md): local development, the production boundary, and a verified reverse-proxy recipe
101
+ - [V1 API specification](https://github.com/jfricano/StreamOtter/blob/main/docs/V1_API.md): configuration (§2), management and workbench (§10), CLI (§11)
102
+ - [Repository](https://github.com/jfricano/StreamOtter) · [Issues](https://github.com/jfricano/StreamOtter/issues)
103
+
104
+ MIT License © 2026 Orca Solutions
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/main.js";
package/dist/cli.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export declare const EXIT: {
2
+ readonly ok: 0;
3
+ readonly runtime: 1;
4
+ readonly invalid: 2;
5
+ };
6
+ export interface CliIO {
7
+ out(line: string): void;
8
+ err(line: string): void;
9
+ /** Resolves when the process should shut down (SIGINT/SIGTERM). */
10
+ shutdownSignal: Promise<string>;
11
+ }
12
+ /** Runs the CLI and returns its exit code: 0 success, 2 invalid input/configuration, 1 startup/runtime failure. */
13
+ export declare function runCli(argv: readonly string[], io: CliIO): Promise<number>;
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,IAAI;;;;CAA6C,CAAC;AAE/D,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mEAAmE;IACnE,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AA+ND,mHAAmH;AACnH,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDhF"}
package/dist/cli.js ADDED
@@ -0,0 +1,306 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { existsSync } from "node:fs";
10
+ import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
11
+ import { basename, dirname, extname, join, resolve } from "node:path";
12
+ import { createRequire } from "node:module";
13
+ import { pathToFileURL } from "node:url";
14
+ import { parseArgs } from "node:util";
15
+ import { canonicalJsonPretty, validateProjectConfig } from "@streamotter/contracts";
16
+ import { createGateway } from "@streamotter/gateway";
17
+ import { startManagementServer } from "@streamotter/gateway/management";
18
+ import { getGatewayInternals } from "@streamotter/gateway/internals";
19
+ import { fingerprint, generateFiles, GENERATED_MARKER } from "./generate.js";
20
+ import { scaffoldFiles } from "./templates.js";
21
+ export const EXIT = { ok: 0, runtime: 1, invalid: 2 };
22
+ class CliError extends Error {
23
+ exitCode;
24
+ constructor(exitCode, message) {
25
+ super(message);
26
+ this.exitCode = exitCode;
27
+ }
28
+ }
29
+ const USAGE = `Usage:
30
+ streamotter init <directory>
31
+ streamotter validate --config <path>
32
+ streamotter generate --config <path> --out <directory>
33
+ streamotter dev --config <path> --handlers <module> [--management-port <port>]
34
+ streamotter start --config <path> --handlers <module>`;
35
+ function formatIssues(issues) {
36
+ return issues.map(issue => ` ${issue.path || "/"} ${issue.code}: ${issue.message}`).join("\n");
37
+ }
38
+ async function loadConfig(path) {
39
+ if (path === undefined)
40
+ throw new CliError(EXIT.invalid, "--config <path> is required.");
41
+ const absolute = resolve(path);
42
+ let text;
43
+ try {
44
+ text = await readFile(absolute, "utf8");
45
+ }
46
+ catch {
47
+ throw new CliError(EXIT.invalid, `Cannot read configuration file ${path}.`);
48
+ }
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(text);
52
+ }
53
+ catch (error) {
54
+ throw new CliError(EXIT.invalid, `${path} is not valid JSON: ${error.message}`);
55
+ }
56
+ const { valid, issues } = validateProjectConfig(parsed);
57
+ if (!valid)
58
+ throw new CliError(EXIT.invalid, `${path} is invalid (${issues.length} issue${issues.length === 1 ? "" : "s"}):\n${formatIssues(issues)}`);
59
+ return { config: parsed, path: absolute };
60
+ }
61
+ async function loadHandlers(path) {
62
+ if (path === undefined)
63
+ throw new CliError(EXIT.invalid, "--handlers <module> is required.");
64
+ const absolute = resolve(path);
65
+ const extension = extname(absolute);
66
+ if ([".ts", ".tsx", ".mts", ".cts"].includes(extension)) {
67
+ throw new CliError(EXIT.invalid, `${path} is TypeScript. StreamOtter loads compiled JavaScript modules; compile your handlers and pass the .js output.`);
68
+ }
69
+ if (!existsSync(absolute))
70
+ throw new CliError(EXIT.invalid, `Handler module ${path} does not exist.`);
71
+ let module;
72
+ try {
73
+ module = await import(__rewriteRelativeImportExtension(pathToFileURL(absolute).href));
74
+ }
75
+ catch (error) {
76
+ throw new CliError(EXIT.runtime, `Failed to load handler module ${path}: ${error.message}`);
77
+ }
78
+ if (typeof module["handlers"] !== "object" || module["handlers"] === null) {
79
+ throw new CliError(EXIT.invalid, `${path} must export \`handlers\` (a HandlerRegistry).`);
80
+ }
81
+ return {
82
+ handlers: module["handlers"],
83
+ development: module["development"]
84
+ };
85
+ }
86
+ function cliLogger(io) {
87
+ const line = (level, message, fields) => `${new Date().toISOString()} ${level.padEnd(5)} ${message}${fields !== undefined && Object.keys(fields).length > 0 ? ` ${JSON.stringify(fields)}` : ""}`;
88
+ return {
89
+ info: (message, fields) => io.out(line("info", message, fields)),
90
+ warn: (message, fields) => io.err(line("warn", message, fields)),
91
+ error: (message, fields) => io.err(line("error", message, fields))
92
+ };
93
+ }
94
+ function workbenchDirectory() {
95
+ try {
96
+ const require = createRequire(import.meta.url);
97
+ const manifest = require.resolve("@streamotter/workbench/package.json");
98
+ const dir = join(dirname(manifest), "dist");
99
+ return existsSync(join(dir, "index.html")) ? dir : null;
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ async function reportStartupFailure(io, gateway, error) {
106
+ io.err(`Gateway startup failed: ${error.message}`);
107
+ try {
108
+ for (const { sourceId, steps } of await getGatewayInternals(gateway).checkAllSources()) {
109
+ io.err(`Source "${sourceId}" diagnostics:`);
110
+ for (const step of steps)
111
+ io.err(` ${step.outcome === "ok" ? "✓" : step.outcome === "failed" ? "✗" : "-"} ${step.stage.padEnd(12)} ${step.message}`);
112
+ }
113
+ }
114
+ catch {
115
+ // Diagnostics are best effort.
116
+ }
117
+ await gateway.stop({ timeoutMs: 2_000 }).catch(() => undefined);
118
+ const code = error.code;
119
+ throw new CliError(code === "CONFIG_INVALID" ? EXIT.invalid : EXIT.runtime, "The gateway did not start.");
120
+ }
121
+ async function runUntilSignal(io, gateway) {
122
+ const signal = await io.shutdownSignal;
123
+ io.out(`Received ${signal}; shutting down gracefully.`);
124
+ await gateway.stop({ timeoutMs: 10_000 });
125
+ return EXIT.ok;
126
+ }
127
+ async function commandInit(positionals, io) {
128
+ const directory = positionals[0];
129
+ if (directory === undefined || positionals.length > 1)
130
+ throw new CliError(EXIT.invalid, "Usage: streamotter init <directory>");
131
+ const target = resolve(directory);
132
+ if (existsSync(target) && !(await stat(target)).isDirectory())
133
+ throw new CliError(EXIT.invalid, `${directory} exists and is not a directory.`);
134
+ const projectId = basename(target).replace(/[^A-Za-z0-9_-]/g, "-").replace(/^[^A-Za-z]+/, "") || "streamotter-app";
135
+ const files = scaffoldFiles(projectId.slice(0, 64));
136
+ const conflicts = files.filter(file => existsSync(join(target, file.path))).map(file => file.path);
137
+ if (conflicts.length > 0)
138
+ throw new CliError(EXIT.invalid, `Refusing to overwrite existing files: ${conflicts.join(", ")}`);
139
+ for (const file of files) {
140
+ await mkdir(dirname(join(target, file.path)), { recursive: true });
141
+ await writeFile(join(target, file.path), file.content, { flag: "wx" });
142
+ io.out(` created ${join(directory, file.path)}`);
143
+ }
144
+ io.out(`\nNext:\n cd ${directory}\n streamotter dev --config streamotter.json --handlers server/handlers.mjs`);
145
+ return EXIT.ok;
146
+ }
147
+ async function commandValidate(values, io) {
148
+ const { config, path } = await loadConfig(values["config"]);
149
+ io.out(`${path} is valid.`);
150
+ io.out(`Fingerprint: sha256:${fingerprint(config)}`);
151
+ if (canonicalJsonPretty(config) !== await readFile(path, "utf8")) {
152
+ io.out("Note: the file is not in canonical form (workbench exports use sorted keys and two-space indentation); the fingerprint is unaffected.");
153
+ }
154
+ return EXIT.ok;
155
+ }
156
+ async function commandGenerate(values, io) {
157
+ const { config } = await loadConfig(values["config"]);
158
+ const out = values["out"];
159
+ if (out === undefined)
160
+ throw new CliError(EXIT.invalid, "--out <directory> is required.");
161
+ const target = resolve(out);
162
+ const files = generateFiles(config);
163
+ const blocked = [];
164
+ for (const file of files) {
165
+ const path = join(target, file.path);
166
+ if (existsSync(path) && !(await readFile(path, "utf8")).startsWith(GENERATED_MARKER))
167
+ blocked.push(file.path);
168
+ }
169
+ if (blocked.length > 0) {
170
+ throw new CliError(EXIT.invalid, `Refusing to overwrite files that were not created by the generator: ${blocked.join(", ")}`);
171
+ }
172
+ await mkdir(target, { recursive: true });
173
+ for (const file of files) {
174
+ await writeFile(join(target, file.path), file.content);
175
+ io.out(` wrote ${join(out, file.path)}`);
176
+ }
177
+ return EXIT.ok;
178
+ }
179
+ async function commandDev(values, io) {
180
+ const { config, path } = await loadConfig(values["config"]);
181
+ const { handlers, development } = await loadHandlers(values["handlers"]);
182
+ const managementPort = values["management-port"] === undefined ? 7401 : Number(values["management-port"]);
183
+ if (!Number.isInteger(managementPort) || managementPort < 0 || managementPort > 65_535)
184
+ throw new CliError(EXIT.invalid, "--management-port must be a port number.");
185
+ let gateway;
186
+ try {
187
+ gateway = createGateway({
188
+ config, handlers, mode: "development", configDir: dirname(path), logger: cliLogger(io),
189
+ ...(development === undefined ? {} : { development })
190
+ });
191
+ }
192
+ catch (error) {
193
+ throw new CliError(EXIT.invalid, error.message);
194
+ }
195
+ let address;
196
+ try {
197
+ address = await gateway.start();
198
+ }
199
+ catch (error) {
200
+ return reportStartupFailure(io, gateway, error);
201
+ }
202
+ const workbenchDir = workbenchDirectory();
203
+ let management;
204
+ try {
205
+ management = await startManagementServer({ gateway, port: managementPort, workbenchDir });
206
+ }
207
+ catch (error) {
208
+ await gateway.stop();
209
+ throw new CliError(EXIT.runtime, `The management server could not start: ${error.message}`);
210
+ }
211
+ const internals = getGatewayInternals(gateway);
212
+ io.out("");
213
+ io.out("StreamOtter development gateway");
214
+ io.out(` Gateway ${address.origin} (Socket.IO path ${address.path})`);
215
+ io.out(` Workbench ${workbenchDir === null ? "(not built; run pnpm build)" : `${management.origin}/`}`);
216
+ io.out(` Management ${management.origin}/management/v1 (local only)`);
217
+ io.out(` Token ${management.token}`);
218
+ io.out(` Config ${path} sha256:${internals.fingerprint.slice(0, 16)}…`);
219
+ io.out(` Sources ${internals.sources().map(source => `${source.sourceId} (${source.kind}, ${source.status})`).join(", ")}`);
220
+ const principals = development === undefined ? [] : Object.keys(development.principals ?? {});
221
+ io.out(` Principals ${principals.length === 0 ? "(none registered)" : principals.join(", ")}`);
222
+ io.out("");
223
+ io.out("Enter the token in the workbench. It is valid only for this run. Configuration edits in the");
224
+ io.out("workbench are candidates: export them and restart this command to apply. Press Ctrl+C to stop.");
225
+ return runUntilSignal(io, gateway);
226
+ }
227
+ async function commandStart(values, io) {
228
+ const { config, path } = await loadConfig(values["config"]);
229
+ const { handlers } = await loadHandlers(values["handlers"]);
230
+ let gateway;
231
+ try {
232
+ // The module's development export is deliberately ignored in production.
233
+ gateway = createGateway({ config, handlers, mode: "production", configDir: dirname(path), logger: cliLogger(io) });
234
+ }
235
+ catch (error) {
236
+ throw new CliError(EXIT.invalid, error.message);
237
+ }
238
+ let address;
239
+ try {
240
+ address = await gateway.start();
241
+ }
242
+ catch (error) {
243
+ return reportStartupFailure(io, gateway, error);
244
+ }
245
+ io.out(`StreamOtter gateway (production) listening on ${address.origin} path ${address.path}. No management or development endpoints are exposed.`);
246
+ return runUntilSignal(io, gateway);
247
+ }
248
+ /** Runs the CLI and returns its exit code: 0 success, 2 invalid input/configuration, 1 startup/runtime failure. */
249
+ export async function runCli(argv, io) {
250
+ const [command, ...rest] = argv;
251
+ if (command === undefined || command === "--help" || command === "-h" || command === "help") {
252
+ io.out(USAGE);
253
+ return command === undefined ? EXIT.invalid : EXIT.ok;
254
+ }
255
+ let parsed;
256
+ try {
257
+ parsed = parseArgs({
258
+ args: [...rest],
259
+ allowPositionals: true,
260
+ strict: true,
261
+ options: {
262
+ config: { type: "string" },
263
+ handlers: { type: "string" },
264
+ out: { type: "string" },
265
+ "management-port": { type: "string" }
266
+ }
267
+ });
268
+ }
269
+ catch (error) {
270
+ io.err(`${error.message}\n\n${USAGE}`);
271
+ return EXIT.invalid;
272
+ }
273
+ const { values, positionals } = parsed;
274
+ const allowed = {
275
+ init: [], validate: ["config"], generate: ["config", "out"], dev: ["config", "handlers", "management-port"], start: ["config", "handlers"]
276
+ };
277
+ const permitted = allowed[command];
278
+ if (permitted === undefined) {
279
+ io.err(`Unknown command "${command}".\n\n${USAGE}`);
280
+ return EXIT.invalid;
281
+ }
282
+ const extra = Object.keys(values).filter(key => !permitted.includes(key));
283
+ if (extra.length > 0 || (command !== "init" && positionals.length > 0)) {
284
+ io.err(`Unexpected arguments for ${command}: ${[...extra.map(key => `--${key}`), ...(command === "init" ? [] : positionals)].join(" ")}\n\n${USAGE}`);
285
+ return EXIT.invalid;
286
+ }
287
+ try {
288
+ switch (command) {
289
+ case "init": return await commandInit(positionals, io);
290
+ case "validate": return await commandValidate(values, io);
291
+ case "generate": return await commandGenerate(values, io);
292
+ case "dev": return await commandDev(values, io);
293
+ case "start": return await commandStart(values, io);
294
+ default: return EXIT.invalid;
295
+ }
296
+ }
297
+ catch (error) {
298
+ if (error instanceof CliError) {
299
+ io.err(error.message);
300
+ return error.exitCode;
301
+ }
302
+ io.err(`Unexpected failure: ${error.stack ?? String(error)}`);
303
+ return EXIT.runtime;
304
+ }
305
+ }
306
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ProjectConfig, type Schema } from "@streamotter/contracts";
2
+ export declare const GENERATED_MARKER = "// @generated by streamotter generate";
3
+ export declare function fingerprint(config: unknown): string;
4
+ /** Maps schema IDs to unique, valid, non-shadowing TypeScript type names. */
5
+ export declare function typeNames(schemaIds: readonly string[]): Map<string, string>;
6
+ /** Renders a schema as a TypeScript type expression (type aliases, never interfaces, so values stay assignable to Json). */
7
+ export declare function renderType(schema: Schema, indent?: string): string;
8
+ export interface GeneratedFile {
9
+ path: string;
10
+ content: string;
11
+ }
12
+ /**
13
+ * Generates the application channel contract (AppChannels with each channel's
14
+ * parameter type, payload type, and literal version) plus a vanilla TypeScript
15
+ * integration example. Numeric ranges and string lengths remain runtime checks.
16
+ */
17
+ export declare function generateFiles(config: ProjectConfig): GeneratedFile[];
18
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAExF,eAAO,MAAM,gBAAgB,0CAA0C,CAAC;AAQxE,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEnD;AAMD,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAY3E;AA4BD,4HAA4H;AAC5H,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,CA8B9D;AAED,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAEhE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,EAAE,CAgFpE"}