create-rezi 0.1.0-alpha.35 → 0.1.0-alpha.37
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/README.md +4 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/scaffold.d.ts +1 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +15 -0
- package/dist/scaffold.js.map +1 -1
- package/package.json +2 -2
- package/templates/starship/README.md +112 -0
- package/templates/starship/package.json +25 -0
- package/templates/starship/src/__tests__/keybindings.test.ts +39 -0
- package/templates/starship/src/__tests__/reducer.test.ts +113 -0
- package/templates/starship/src/__tests__/render.test.ts +127 -0
- package/templates/starship/src/helpers/formatters.ts +109 -0
- package/templates/starship/src/helpers/keybindings.ts +132 -0
- package/templates/starship/src/helpers/simulation.ts +269 -0
- package/templates/starship/src/helpers/state.ts +740 -0
- package/templates/starship/src/main.ts +461 -0
- package/templates/starship/src/screens/bridge.ts +310 -0
- package/templates/starship/src/screens/cargo.ts +238 -0
- package/templates/starship/src/screens/comms.ts +200 -0
- package/templates/starship/src/screens/crew.ts +309 -0
- package/templates/starship/src/screens/engineering.ts +307 -0
- package/templates/starship/src/screens/index.ts +36 -0
- package/templates/starship/src/screens/settings.ts +252 -0
- package/templates/starship/src/screens/shell.ts +282 -0
- package/templates/starship/src/theme.ts +143 -0
- package/templates/starship/src/types.ts +200 -0
- package/templates/starship/tsconfig.json +15 -0
package/README.md
CHANGED
|
@@ -29,6 +29,8 @@ Currently available templates:
|
|
|
29
29
|
- Aliases: `animation`, `anim`, `lab`, `motion`
|
|
30
30
|
- `minimal` - Single-screen utility starter for small tools
|
|
31
31
|
- Aliases: `mini`, `basic`, `utility`
|
|
32
|
+
- `starship` - Starship command console starter with routed multi-deck operations
|
|
33
|
+
- Aliases: `ship`, `bridge`, `command`
|
|
32
34
|
|
|
33
35
|
```bash
|
|
34
36
|
npm create rezi my-app -- --template dashboard
|
|
@@ -36,6 +38,7 @@ npm create rezi my-app -- --template stress-test
|
|
|
36
38
|
npm create rezi my-app -- --template cli-tool
|
|
37
39
|
npm create rezi my-app -- --template animation-lab
|
|
38
40
|
npm create rezi my-app -- --template minimal
|
|
41
|
+
npm create rezi my-app -- --template starship
|
|
39
42
|
```
|
|
40
43
|
|
|
41
44
|
List templates and highlights from the CLI:
|
|
@@ -46,7 +49,7 @@ npm create rezi -- --list-templates
|
|
|
46
49
|
|
|
47
50
|
## Options
|
|
48
51
|
|
|
49
|
-
- `--template, -t <name>`: Select a template (`dashboard`, `stress-test`, `cli-tool`, `animation-lab`, `minimal`, plus aliases).
|
|
52
|
+
- `--template, -t <name>`: Select a template (`dashboard`, `stress-test`, `cli-tool`, `animation-lab`, `minimal`, `starship`, plus aliases).
|
|
50
53
|
- `--no-install, --skip-install`: Skip dependency installation.
|
|
51
54
|
- `--pm, --package-manager <npm|pnpm|yarn|bun>`: Choose a package manager.
|
|
52
55
|
- `--list-templates, --templates`: Print available templates and highlights.
|
package/dist/index.js
CHANGED
|
@@ -66,7 +66,7 @@ function printHelp() {
|
|
|
66
66
|
stdout.write(" npm create rezi my-app\n");
|
|
67
67
|
stdout.write(" bun create rezi my-app\n\n");
|
|
68
68
|
stdout.write("Options:\n");
|
|
69
|
-
stdout.write(" --template, -t <name> dashboard | stress-test | cli-tool | animation-lab | minimal\n");
|
|
69
|
+
stdout.write(" --template, -t <name> dashboard | stress-test | cli-tool | animation-lab | minimal | starship\n");
|
|
70
70
|
stdout.write(" --no-install Skip dependency install\n");
|
|
71
71
|
stdout.write(" --pm <npm|pnpm|yarn|bun> Choose a package manager\n");
|
|
72
72
|
stdout.write(" --list-templates Show templates and highlights\n");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type TemplateKey = "dashboard" | "stress-test" | "cli-tool" | "animation-lab" | "minimal";
|
|
1
|
+
export type TemplateKey = "dashboard" | "stress-test" | "cli-tool" | "animation-lab" | "minimal" | "starship";
|
|
2
2
|
export type TemplateDefinition = {
|
|
3
3
|
key: TemplateKey;
|
|
4
4
|
label: string;
|
package/dist/scaffold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,aAAa,GACb,UAAU,GACV,eAAe,GACf,SAAS,GACT,UAAU,CAAC;AAEf,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EA6EpD,CAAC;AA2BX,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQvE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/D;AA+BD,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyB/F"}
|
package/dist/scaffold.js
CHANGED
|
@@ -62,6 +62,18 @@ export const TEMPLATE_DEFINITIONS = [
|
|
|
62
62
|
],
|
|
63
63
|
dir: "minimal",
|
|
64
64
|
},
|
|
65
|
+
{
|
|
66
|
+
key: "starship",
|
|
67
|
+
label: "Starship Command Console",
|
|
68
|
+
description: "Multi-deck command console showcasing routing, animation, charts, forms, and the full widget catalog",
|
|
69
|
+
safetyTag: "safe-default",
|
|
70
|
+
safetyNote: "Feature-rich showcase template with moderate CPU usage from animation hooks and live telemetry.",
|
|
71
|
+
highlights: [
|
|
72
|
+
"six-screen bridge with routing, animated gauges, live telemetry charts, and crew management",
|
|
73
|
+
"command palette, modal dialogs, toast notifications, forms, split panes, canvas, and theme cycling with keybinding modes",
|
|
74
|
+
],
|
|
75
|
+
dir: "starship",
|
|
76
|
+
},
|
|
65
77
|
];
|
|
66
78
|
const TEMPLATE_BY_KEY = new Map(TEMPLATE_DEFINITIONS.map((template) => [template.key, template]));
|
|
67
79
|
const TEMPLATE_ALIASES = new Map(TEMPLATE_DEFINITIONS.map((template) => [template.key, template.key]));
|
|
@@ -79,6 +91,9 @@ TEMPLATE_ALIASES.set("motion", "animation-lab");
|
|
|
79
91
|
TEMPLATE_ALIASES.set("mini", "minimal");
|
|
80
92
|
TEMPLATE_ALIASES.set("basic", "minimal");
|
|
81
93
|
TEMPLATE_ALIASES.set("utility", "minimal");
|
|
94
|
+
TEMPLATE_ALIASES.set("ship", "starship");
|
|
95
|
+
TEMPLATE_ALIASES.set("bridge", "starship");
|
|
96
|
+
TEMPLATE_ALIASES.set("command", "starship");
|
|
82
97
|
const PACKAGE_NAME_RE = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
|
|
83
98
|
export function normalizeTemplateName(value) {
|
|
84
99
|
const cleaned = value.trim().toLowerCase();
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-rezi",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.37",
|
|
4
4
|
"description": "Scaffold a Rezi terminal UI app.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://rezitui.dev",
|
|
@@ -28,6 +28,6 @@
|
|
|
28
28
|
"bun": ">=1.3.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@rezi-ui/testkit": "0.1.0-alpha.
|
|
31
|
+
"@rezi-ui/testkit": "0.1.0-alpha.37"
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# __APP_NAME__
|
|
2
|
+
|
|
3
|
+
Scaffolded with `create-rezi` using the **__TEMPLATE_LABEL__** template.
|
|
4
|
+
|
|
5
|
+
## Concept
|
|
6
|
+
|
|
7
|
+
`__APP_NAME__` is a multi-deck starship operations console. It demonstrates routed application architecture, deterministic telemetry simulation, rich widgets, layered overlays, and declarative animation hooks in a cohesive, production-like TUI.
|
|
8
|
+
|
|
9
|
+
## Decks
|
|
10
|
+
|
|
11
|
+
- `bridge`: Command overview with animated schematic, gauges, sparkline/line chart telemetry, and system health lanes.
|
|
12
|
+
- `engineering`: Split-pane reactor/diagnostics deck with tree navigation, accordion diagnostics, heatmap, and animated subsystem bring-up.
|
|
13
|
+
- `crew`: Manifest deck with searchable/sortable table, master-detail, assignment editor form, and pagination.
|
|
14
|
+
- `comms`: Channel tabs, logs console, rich text inspection, emergency callouts, and modal hail composer.
|
|
15
|
+
- `cargo`: High-volume cargo analytics with bar/scatter charts, virtualized manifest, sorting/filter controls, and priority editor.
|
|
16
|
+
- `settings`: Full settings form, validation callouts, theme preview, keybinding reference, and reset confirmation dialog.
|
|
17
|
+
|
|
18
|
+
## Keybindings
|
|
19
|
+
|
|
20
|
+
### Global
|
|
21
|
+
|
|
22
|
+
| Key | Command |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `q`, `ctrl+c` | Quit |
|
|
25
|
+
| `1-6` | Navigate decks (`bridge` → `settings`) |
|
|
26
|
+
| `tab`, `shift+tab` | Next/previous deck |
|
|
27
|
+
| `t` | Cycle theme |
|
|
28
|
+
| `ctrl+p` | Toggle command palette |
|
|
29
|
+
| `?` | Toggle help modal |
|
|
30
|
+
| `space` | Pause/resume simulation |
|
|
31
|
+
| `g`, `y`, `r` | Set alert level (green/yellow/red) |
|
|
32
|
+
|
|
33
|
+
### Bridge
|
|
34
|
+
|
|
35
|
+
| Key | Command |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `a` | Toggle autopilot |
|
|
38
|
+
| `r` | Toggle red alert |
|
|
39
|
+
| `s` | Scan |
|
|
40
|
+
|
|
41
|
+
### Engineering
|
|
42
|
+
|
|
43
|
+
| Key | Command |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `b` | Toggle boost |
|
|
46
|
+
| `d` | Toggle diagnostics |
|
|
47
|
+
|
|
48
|
+
### Crew
|
|
49
|
+
|
|
50
|
+
| Key | Command |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `n` | New assignment |
|
|
53
|
+
| `e` | Edit selected crew member |
|
|
54
|
+
| `/` | Focus/search crew workflow |
|
|
55
|
+
|
|
56
|
+
### Comms
|
|
57
|
+
|
|
58
|
+
| Key | Command |
|
|
59
|
+
|---|---|
|
|
60
|
+
| `h` | Open hail dialog |
|
|
61
|
+
| `enter` | Acknowledge next unacked message |
|
|
62
|
+
| `n`, `p` | Next/previous channel |
|
|
63
|
+
| `/` | Search messages |
|
|
64
|
+
|
|
65
|
+
### Cargo / Settings
|
|
66
|
+
|
|
67
|
+
| Key | Command |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `n`, `c`, `q`, `p` (Cargo) | Sort by name/category/quantity/priority |
|
|
70
|
+
| `ctrl+r` (Settings) | Open reset confirmation |
|
|
71
|
+
| `ctrl+s` (Settings) | Save snapshot |
|
|
72
|
+
|
|
73
|
+
## Feature Showcase
|
|
74
|
+
|
|
75
|
+
- **Routing + shell:** `createNodeApp({ routes })`, `routerBreadcrumb()`, `routerTabs()`, route-aware key command dispatch.
|
|
76
|
+
- **Layouts:** `ui.appShell`, `ui.page`, `ui.panel`, `ui.card`, `ui.grid`, `ui.masterDetail`, `ui.splitPane`, `ui.center`.
|
|
77
|
+
- **Data + forms:** `ui.table`, `ui.tree`, `ui.virtualList`, `ui.form`, `ui.field`, `ui.actions`, `ui.select`, `ui.radioGroup`, `ui.slider`.
|
|
78
|
+
- **Visualization:** `ui.canvas` (braille), `ui.gauge`, `ui.progress`, `ui.sparkline`, `ui.lineChart`, `ui.barChart`, `ui.scatter`, `ui.heatmap`.
|
|
79
|
+
- **Overlays:** `ui.layers`, `ui.layer`, `ui.modal`, `ui.dialog`, `ui.toastContainer`, `ui.commandPalette`.
|
|
80
|
+
- **Composition hooks:** `defineWidget`, `useTransition`, `useSpring`, `useSequence`, `useStagger`, `useInterval`, `useAsync`.
|
|
81
|
+
- **Render helpers:** `show`, `when`, `match`, `maybe`, `each`, `eachInline`.
|
|
82
|
+
|
|
83
|
+
## File Layout
|
|
84
|
+
|
|
85
|
+
- `src/types.ts`: readonly state, domain entities, actions.
|
|
86
|
+
- `src/theme.ts`: starship theme catalog and display styles.
|
|
87
|
+
- `src/helpers/simulation.ts`: deterministic seed generators + toast events.
|
|
88
|
+
- `src/helpers/formatters.ts`: UI format and badge helpers.
|
|
89
|
+
- `src/helpers/state.ts`: reducer, selectors, simulation evolution.
|
|
90
|
+
- `src/helpers/keybindings.ts`: route-aware key resolution.
|
|
91
|
+
- `src/screens/`: shared shell + six route screens.
|
|
92
|
+
- `src/main.ts`: app bootstrap, routing, keybindings, timers, lifecycle.
|
|
93
|
+
- `src/__tests__/`: reducer, keybinding, and render coverage.
|
|
94
|
+
|
|
95
|
+
## Quickstart
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm install
|
|
99
|
+
npm run start
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Dev (HSR)
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm run dev
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Tests
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
npm test
|
|
112
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__PACKAGE_NAME__",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "tsx src/main.ts",
|
|
8
|
+
"dev": "tsx src/main.ts --hsr",
|
|
9
|
+
"build": "tsc --pretty false",
|
|
10
|
+
"typecheck": "tsc --noEmit",
|
|
11
|
+
"test": "tsx --test src/__tests__"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@rezi-ui/core": "^0.1.0-alpha.17",
|
|
15
|
+
"@rezi-ui/node": "^0.1.0-alpha.17"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^18.0.0",
|
|
19
|
+
"tsx": "^4.20.0",
|
|
20
|
+
"typescript": "^5.6.3"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { resolveStarshipCommand } from "../helpers/keybindings.js";
|
|
4
|
+
|
|
5
|
+
test("global keys resolve correctly", () => {
|
|
6
|
+
assert.equal(resolveStarshipCommand("q"), "quit");
|
|
7
|
+
assert.equal(resolveStarshipCommand("ctrl+c"), "quit");
|
|
8
|
+
assert.equal(resolveStarshipCommand("1"), "go-bridge");
|
|
9
|
+
assert.equal(resolveStarshipCommand("2"), "go-engineering");
|
|
10
|
+
assert.equal(resolveStarshipCommand("3"), "go-crew");
|
|
11
|
+
assert.equal(resolveStarshipCommand("4"), "go-comms");
|
|
12
|
+
assert.equal(resolveStarshipCommand("5"), "go-cargo");
|
|
13
|
+
assert.equal(resolveStarshipCommand("6"), "go-settings");
|
|
14
|
+
assert.equal(resolveStarshipCommand("t"), "cycle-theme");
|
|
15
|
+
assert.equal(resolveStarshipCommand("?"), "toggle-help");
|
|
16
|
+
assert.equal(resolveStarshipCommand("ctrl+p"), "toggle-command-palette");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("route-specific keys resolve on matching routes", () => {
|
|
20
|
+
assert.equal(resolveStarshipCommand("a", "bridge"), "toggle-autopilot");
|
|
21
|
+
assert.equal(resolveStarshipCommand("b", "engineering"), "engineering-boost");
|
|
22
|
+
assert.equal(resolveStarshipCommand("n", "crew"), "crew-new-assignment");
|
|
23
|
+
assert.equal(resolveStarshipCommand("h", "comms"), "comms-hail");
|
|
24
|
+
assert.equal(resolveStarshipCommand("enter", "comms"), "comms-acknowledge");
|
|
25
|
+
assert.equal(resolveStarshipCommand("h", "settings"), undefined);
|
|
26
|
+
assert.equal(resolveStarshipCommand("n", "bridge"), undefined);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("key normalization trims and lowercases input", () => {
|
|
30
|
+
assert.equal(resolveStarshipCommand(" Q "), "quit");
|
|
31
|
+
assert.equal(resolveStarshipCommand("CTRL+P"), "toggle-command-palette");
|
|
32
|
+
assert.equal(resolveStarshipCommand(""), undefined);
|
|
33
|
+
assert.equal(resolveStarshipCommand(" "), undefined);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("unknown keys return undefined", () => {
|
|
37
|
+
assert.equal(resolveStarshipCommand("z"), undefined);
|
|
38
|
+
assert.equal(resolveStarshipCommand("ctrl+alt+9"), undefined);
|
|
39
|
+
});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import {
|
|
4
|
+
createInitialState,
|
|
5
|
+
reduceStarshipState,
|
|
6
|
+
sortedCargo,
|
|
7
|
+
visibleCrew,
|
|
8
|
+
} from "../helpers/state.js";
|
|
9
|
+
|
|
10
|
+
test("tick advances telemetry deterministically", () => {
|
|
11
|
+
const initial = createInitialState(1_000);
|
|
12
|
+
const nextA = reduceStarshipState(initial, { type: "tick", nowMs: 1_800 });
|
|
13
|
+
const nextB = reduceStarshipState(initial, { type: "tick", nowMs: 1_800 });
|
|
14
|
+
|
|
15
|
+
assert.deepEqual(nextA.telemetry, nextB.telemetry);
|
|
16
|
+
assert.equal(nextA.tick, 1);
|
|
17
|
+
assert.equal(nextA.telemetryHistory.length, 60);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("toggle-pause toggles state", () => {
|
|
21
|
+
const initial = createInitialState(0);
|
|
22
|
+
const paused = reduceStarshipState(initial, { type: "toggle-pause" });
|
|
23
|
+
const resumed = reduceStarshipState(paused, { type: "toggle-pause" });
|
|
24
|
+
assert.equal(paused.paused, true);
|
|
25
|
+
assert.equal(resumed.paused, false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("toggle-red-alert cycles alert level", () => {
|
|
29
|
+
const initial = createInitialState(0);
|
|
30
|
+
const red = reduceStarshipState(initial, { type: "toggle-red-alert" });
|
|
31
|
+
const yellow = reduceStarshipState(red, { type: "toggle-red-alert" });
|
|
32
|
+
assert.equal(red.alertLevel, "red");
|
|
33
|
+
assert.equal(yellow.alertLevel, "yellow");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("crew selection and search filtering", () => {
|
|
37
|
+
const initial = createInitialState(0);
|
|
38
|
+
const member = initial.crew[5];
|
|
39
|
+
assert.ok(member);
|
|
40
|
+
|
|
41
|
+
const selected = reduceStarshipState(initial, { type: "select-crew", crewId: member.id });
|
|
42
|
+
assert.equal(selected.selectedCrewId, member.id);
|
|
43
|
+
|
|
44
|
+
const searched = reduceStarshipState(selected, {
|
|
45
|
+
type: "set-crew-search",
|
|
46
|
+
query: member.name.split(" ")[0] ?? "",
|
|
47
|
+
});
|
|
48
|
+
const visible = visibleCrew(searched);
|
|
49
|
+
assert.ok(visible.some((entry) => entry.id === member.id));
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("subsystem tree expansion toggles", () => {
|
|
53
|
+
const initial = createInitialState(0);
|
|
54
|
+
const target = "warp-core";
|
|
55
|
+
const opened = reduceStarshipState(initial, { type: "toggle-subsystem", subsystemId: target });
|
|
56
|
+
assert.equal(opened.expandedSubsystemIds.includes(target), true);
|
|
57
|
+
|
|
58
|
+
const closed = reduceStarshipState(opened, { type: "toggle-subsystem", subsystemId: target });
|
|
59
|
+
assert.equal(closed.expandedSubsystemIds.includes(target), false);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("comms channel switching and message acknowledgment", () => {
|
|
63
|
+
const initial = createInitialState(0);
|
|
64
|
+
const switched = reduceStarshipState(initial, { type: "switch-channel", channel: "emergency" });
|
|
65
|
+
assert.equal(switched.activeChannel, "emergency");
|
|
66
|
+
|
|
67
|
+
const first = switched.messages[0];
|
|
68
|
+
assert.ok(first);
|
|
69
|
+
const acknowledged = reduceStarshipState(switched, {
|
|
70
|
+
type: "acknowledge-message",
|
|
71
|
+
messageId: first.id,
|
|
72
|
+
});
|
|
73
|
+
assert.equal(acknowledged.messages.find((item) => item.id === first.id)?.acknowledged, true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("cargo sorting updates ordering", () => {
|
|
77
|
+
const initial = createInitialState(0);
|
|
78
|
+
const sortedByName = reduceStarshipState(initial, { type: "set-cargo-sort", sortBy: "name" });
|
|
79
|
+
const sorted = sortedCargo(sortedByName);
|
|
80
|
+
assert.ok(sorted.length > 5);
|
|
81
|
+
const first = sorted[0];
|
|
82
|
+
const second = sorted[1];
|
|
83
|
+
assert.ok(first);
|
|
84
|
+
assert.ok(second);
|
|
85
|
+
assert.equal(first.name.localeCompare(second.name) <= 0, true);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("settings name can be validated by reducer result", () => {
|
|
89
|
+
const initial = createInitialState(0);
|
|
90
|
+
const invalid = reduceStarshipState(initial, { type: "set-ship-name", name: "" });
|
|
91
|
+
assert.equal(invalid.shipName.trim().length, 0);
|
|
92
|
+
|
|
93
|
+
const valid = reduceStarshipState(invalid, { type: "set-ship-name", name: "USS Atlas" });
|
|
94
|
+
assert.equal(valid.shipName, "USS Atlas");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("toast add and dismiss", () => {
|
|
98
|
+
const initial = createInitialState(0);
|
|
99
|
+
const withToast = reduceStarshipState(initial, {
|
|
100
|
+
type: "add-toast",
|
|
101
|
+
toast: {
|
|
102
|
+
id: "toast-1",
|
|
103
|
+
message: "Hello",
|
|
104
|
+
level: "info",
|
|
105
|
+
timestamp: 0,
|
|
106
|
+
durationMs: 1000,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
assert.equal(withToast.toasts.length, 1);
|
|
110
|
+
|
|
111
|
+
const dismissed = reduceStarshipState(withToast, { type: "dismiss-toast", toastId: "toast-1" });
|
|
112
|
+
assert.equal(dismissed.toasts.length, 0);
|
|
113
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import type { RouteRenderContext, RouterApi } from "@rezi-ui/core";
|
|
4
|
+
import { createTestRenderer } from "@rezi-ui/core/testing";
|
|
5
|
+
import { createInitialState } from "../helpers/state.js";
|
|
6
|
+
import { renderBridgeScreen } from "../screens/bridge.js";
|
|
7
|
+
import { renderCargoScreen } from "../screens/cargo.js";
|
|
8
|
+
import { renderCommsScreen } from "../screens/comms.js";
|
|
9
|
+
import { renderCrewScreen } from "../screens/crew.js";
|
|
10
|
+
import { renderEngineeringScreen } from "../screens/engineering.js";
|
|
11
|
+
import { STARSHIP_ROUTES } from "../screens/index.js";
|
|
12
|
+
import { renderSettingsScreen } from "../screens/settings.js";
|
|
13
|
+
import type { RouteDeps, RouteId, StarshipState } from "../types.js";
|
|
14
|
+
|
|
15
|
+
function createRouter(initialRoute: RouteId): RouterApi {
|
|
16
|
+
let current = initialRoute;
|
|
17
|
+
const historyStack: Array<{ id: string; params: Readonly<Record<string, string>> }> = [
|
|
18
|
+
{ id: initialRoute, params: Object.freeze({}) },
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
navigate: (routeId, params = Object.freeze({})) => {
|
|
23
|
+
current = routeId as RouteId;
|
|
24
|
+
historyStack.push({ id: routeId, params });
|
|
25
|
+
},
|
|
26
|
+
replace: (routeId, params = Object.freeze({})) => {
|
|
27
|
+
current = routeId as RouteId;
|
|
28
|
+
historyStack[historyStack.length - 1] = { id: routeId, params };
|
|
29
|
+
},
|
|
30
|
+
back: () => {
|
|
31
|
+
if (historyStack.length > 1) {
|
|
32
|
+
historyStack.pop();
|
|
33
|
+
}
|
|
34
|
+
current = historyStack[historyStack.length - 1]?.id as RouteId;
|
|
35
|
+
},
|
|
36
|
+
currentRoute: () => ({ id: current, params: Object.freeze({}) }),
|
|
37
|
+
canGoBack: () => historyStack.length > 1,
|
|
38
|
+
history: () => Object.freeze(historyStack.map((entry) => Object.freeze({ ...entry }))),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function createContext(state: StarshipState, routeId: RouteId): RouteRenderContext<StarshipState> {
|
|
43
|
+
return {
|
|
44
|
+
router: createRouter(routeId),
|
|
45
|
+
state,
|
|
46
|
+
update: () => {},
|
|
47
|
+
outlet: null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function createDeps(): RouteDeps {
|
|
52
|
+
return {
|
|
53
|
+
dispatch: () => {},
|
|
54
|
+
navigate: () => {},
|
|
55
|
+
routes: STARSHIP_ROUTES,
|
|
56
|
+
getBindings: () => [],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
test("bridge screen renders core markers", () => {
|
|
61
|
+
const state = createInitialState(0);
|
|
62
|
+
const renderer = createTestRenderer({ viewport: { cols: 140, rows: 48 } });
|
|
63
|
+
const output = renderer
|
|
64
|
+
.render(renderBridgeScreen(createContext(state, "bridge"), createDeps()))
|
|
65
|
+
.toText();
|
|
66
|
+
|
|
67
|
+
assert.match(output, /USS Rezi/);
|
|
68
|
+
assert.match(output, /Bridge Overview/);
|
|
69
|
+
assert.match(output, /Command Deck/);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("engineering screen renders core markers", () => {
|
|
73
|
+
const state = createInitialState(0);
|
|
74
|
+
const renderer = createTestRenderer({ viewport: { cols: 140, rows: 48 } });
|
|
75
|
+
const output = renderer
|
|
76
|
+
.render(renderEngineeringScreen(createContext(state, "engineering"), createDeps()))
|
|
77
|
+
.toText();
|
|
78
|
+
|
|
79
|
+
assert.match(output, /Engineering Deck/);
|
|
80
|
+
assert.match(output, /Power and Thermal Control/);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("crew screen renders loading/ops markers", () => {
|
|
84
|
+
const state = createInitialState(0);
|
|
85
|
+
const renderer = createTestRenderer({ viewport: { cols: 140, rows: 48 } });
|
|
86
|
+
const output = renderer
|
|
87
|
+
.render(renderCrewScreen(createContext(state, "crew"), createDeps()))
|
|
88
|
+
.toText();
|
|
89
|
+
|
|
90
|
+
assert.match(output, /Crew Manifest/);
|
|
91
|
+
assert.match(output, /Crew Command/);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test("comms screen renders control markers", () => {
|
|
95
|
+
const state = createInitialState(0);
|
|
96
|
+
const renderer = createTestRenderer({ viewport: { cols: 140, rows: 48 } });
|
|
97
|
+
const output = renderer
|
|
98
|
+
.render(renderCommsScreen(createContext(state, "comms"), createDeps()))
|
|
99
|
+
.toText();
|
|
100
|
+
|
|
101
|
+
assert.match(output, /Communications/);
|
|
102
|
+
assert.match(output, /Channel Controls/);
|
|
103
|
+
assert.match(output, /Open Hail/);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("settings screen renders form fields", () => {
|
|
107
|
+
const state = createInitialState(0);
|
|
108
|
+
const renderer = createTestRenderer({ viewport: { cols: 140, rows: 48 } });
|
|
109
|
+
const output = renderer
|
|
110
|
+
.render(renderSettingsScreen(createContext(state, "settings"), createDeps()))
|
|
111
|
+
.toText();
|
|
112
|
+
|
|
113
|
+
assert.match(output, /Ship Settings/);
|
|
114
|
+
assert.match(output, /Ship Name/);
|
|
115
|
+
assert.match(output, /Alert Threshold/);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("cargo screen renders manifest widgets", () => {
|
|
119
|
+
const state = createInitialState(0);
|
|
120
|
+
const renderer = createTestRenderer({ viewport: { cols: 140, rows: 48 } });
|
|
121
|
+
const output = renderer
|
|
122
|
+
.render(renderCargoScreen(createContext(state, "cargo"), createDeps()))
|
|
123
|
+
.toText();
|
|
124
|
+
|
|
125
|
+
assert.match(output, /Cargo Hold/);
|
|
126
|
+
assert.match(output, /Manifest/);
|
|
127
|
+
});
|