minitel.ts
Version:
A port to typescript and extension of https://github.com/cquest/pynitel
122 lines (94 loc) • 2.78 kB
Markdown
Starting with a port of https://github.com/cquest/pynitel to TypeScript.
- Minimum NodeJS 23 (for direct typescript)
- Some basic routing, inspired by next.js
This example creates two screens which are saved in two .ts files under `/app`, demonstrates simple routing and state-management.
NPM install
```bash
npm install minitel.ts
```
Create a `.env` file, and set path & baudrate
```bash
MINITEL_PATH=/dev/tty.usbserial-0001
MINITEL_BAUDRATE=1200
MINITEL_SILENT=false
```
Create a `app.ts` file
```typescript
import MinitelTS from 'minitel.ts';
// Example usage:
const minitel = new MinitelTS();
await minitel.init();
await minitel.loop('./app');
```
Create a `app/index.ts` file
```typescript
import MinitelTS from 'minitel.ts';
import type { MinitelTSRoute } from "minitel.ts/types";
export const initialState = {userInput: '...'};
export default async function screen(minitel:MinitelTS, route:MinitelTSRoute) {
// shortcut
const { input, output } = minitel;
// global and local store/state
const { store, setStore } = minitel.store;
const { state, setState} = route.state;
// clear screen
output.cls();
// set position and welcome
output.pos(3, 5);
output.print(`Welcome to Minitel TS! ${store.loop || 0}`);
// if store, show to user
if (store.userInput) {
output.pos(7, 5);
output.foreColor(minitel.colors.vert);
output.print(`Minitel store.userInput: ${store.userInput}`);
}
// if state, show to user
if (state.userInput) {
output.pos(9, 5);
output.foreColor(minitel.colors.vert);
output.print(`Route state.userInput: ${state.userInput}`);
}
// set position and wait for input
output.pos(5, 5);
output.foreColor(minitel.colors.bleu);
output.print("Type something:");
let userInput = await input.line(6, 5, 10);
// set input into store & state
setStore({ userInput });
setState({ userInput });
// beep
minitel.bip();
// if DETAIL is entered, route to `detail.ts`
if (userInput === 'DETAIL') {
minitel.router.goto('detail');
}
}
```
Create a `app/detail.ts` file
```typescript
import MinitelTS from 'minitel.ts';
export default async function screen(minitel:MinitelTS) {
// shortcut
const { output } = minitel;
// get store
const { store, setStore } = minitel.store;
// show welcome
output.cls();
output.pos(3, 5);
output.print(`Welcome to Minitel TS! ${store.loop || 0}`);
// wait for key (any input)
await minitel.input.waitForKey();
// reset userInput in store
setStore({userInput: ''});
// beep
minitel.bip();
// go back to index
minitel.router.goto('index');
}
```
Run it! *(remember NodeJS > 23 for direct typescript)*
```bash
node app.ts
```