@yaebal/morda 0.0.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.
@@ -0,0 +1,226 @@
1
+ import { dialogs, } from "../index.js";
2
+ import { Fragment, VNODE } from "./jsx-runtime.js";
3
+ // component markers. never invoked by the runtime — matched by identity below.
4
+ export function Screen(props) {
5
+ return { [VNODE]: true, type: Screen, props: { ...props } };
6
+ }
7
+ export function ButtonRow(props) {
8
+ return { [VNODE]: true, type: ButtonRow, props: { ...props } };
9
+ }
10
+ export function Button(props) {
11
+ return { [VNODE]: true, type: Button, props: { ...props } };
12
+ }
13
+ const MARKERS = new Set([Screen, ButtonRow, Button, Fragment]);
14
+ let current;
15
+ function need() {
16
+ if (!current)
17
+ throw new Error("morda/jsx: hooks may only be called during a screen render");
18
+ return current;
19
+ }
20
+ /** per-frame state. `setState` re-renders the screen in place and resolves when the edit lands. */
21
+ export function useState(initial) {
22
+ const frame = need();
23
+ const i = frame.cursor++;
24
+ if (!(i in frame.slots)) {
25
+ frame.slots[i] = typeof initial === "function" ? initial() : initial;
26
+ }
27
+ const set = (next) => {
28
+ const prev = frame.slots[i];
29
+ frame.slots[i] = typeof next === "function" ? next(prev) : next;
30
+ // ponytail: one editMessageText per setState — no batching. Combine writes
31
+ // yourself if a handler calls setState many times in a row.
32
+ return frame.ctx.dialog.rerender();
33
+ };
34
+ return [frame.slots[i], set];
35
+ }
36
+ /**
37
+ * run an effect after the screen renders. `deps` gate re-runs.
38
+ * prefer passing `deps` — the no-deps form fires on every *internal* render
39
+ * (a button press renders once to route and again to commit), not once per tap.
40
+ */
41
+ export function useEffect(fn, deps) {
42
+ const frame = need();
43
+ const i = frame.cursor++;
44
+ const prev = frame.slots[i];
45
+ frame.slots[i] = { deps };
46
+ // ponytail: no cleanup support — effects are fire-and-forget (enough for bots).
47
+ if (!prev || !depsEqual(prev.deps, deps))
48
+ frame.effects.push(fn);
49
+ }
50
+ function depsEqual(a, b) {
51
+ if (!a || !b || a.length !== b.length)
52
+ return false;
53
+ return a.every((v, i) => Object.is(v, b[i]));
54
+ }
55
+ /** navigate by screen component (or window id). */
56
+ export function useNavigation() {
57
+ const frame = need();
58
+ const dialog = frame.ctx.dialog;
59
+ const idOf = (t) => {
60
+ if (typeof t === "string")
61
+ return t;
62
+ const id = frame.idByComponent.get(t);
63
+ if (id === undefined)
64
+ throw new Error("morda/jsx: navigating to a screen not in jsxDialogs()");
65
+ return id;
66
+ };
67
+ return {
68
+ push: (t) => dialog.push(idOf(t)),
69
+ replace: (t) => dialog.replace(idOf(t)),
70
+ back: () => dialog.back(),
71
+ };
72
+ }
73
+ /** the telegram user behind the current update. */
74
+ export function useUser() {
75
+ return need().ctx.from;
76
+ }
77
+ /** the session session (requires `@yaebal/session` installed before the dialog). */
78
+ export function useSession() {
79
+ return need().ctx.session;
80
+ }
81
+ /** i18n helpers (requires `@yaebal/i18n` installed before the dialog). */
82
+ export function useTranslation() {
83
+ const ctx = need().ctx;
84
+ if (!ctx.t || !ctx.changeLanguage) {
85
+ throw new Error("morda/jsx: useTranslation() requires @yaebal/i18n installed");
86
+ }
87
+ return { t: ctx.t, changeLanguage: ctx.changeLanguage };
88
+ }
89
+ // flattening
90
+ function isVNode(x) {
91
+ return typeof x === "object" && x !== null && VNODE in x;
92
+ }
93
+ function resolve(node) {
94
+ let cur = node;
95
+ for (let guard = 0; isVNode(cur) && typeof cur.type === "function" && !MARKERS.has(cur.type); guard++) {
96
+ if (guard >= 50)
97
+ throw new Error("morda/jsx: component nesting too deep (cyclic render?)");
98
+ cur = cur.type(cur.props);
99
+ }
100
+ return cur;
101
+ }
102
+ function toArray(x) {
103
+ if (Array.isArray(x))
104
+ return x;
105
+ return x === undefined ? [] : [x];
106
+ }
107
+ function textOf(children) {
108
+ const parts = [];
109
+ for (const c of toArray(children)) {
110
+ const n = resolve(c);
111
+ if (typeof n === "string" || typeof n === "number")
112
+ parts.push(String(n));
113
+ }
114
+ return parts.join("");
115
+ }
116
+ function toButton(node) {
117
+ const props = node.props;
118
+ const onClick = props.onClick;
119
+ return {
120
+ id: props.id,
121
+ label: textOf(props.children),
122
+ onClick: onClick ? () => onClick() : undefined,
123
+ };
124
+ }
125
+ function collectRow(children) {
126
+ const out = [];
127
+ for (const c of toArray(children)) {
128
+ const n = resolve(c);
129
+ if (isVNode(n) && n.type === Button)
130
+ out.push(toButton(n));
131
+ }
132
+ return out;
133
+ }
134
+ function collect(node, texts, rows) {
135
+ const n = resolve(node);
136
+ if (n === null || n === undefined || typeof n === "boolean")
137
+ return;
138
+ if (typeof n === "string" || typeof n === "number") {
139
+ texts.push(String(n));
140
+ return;
141
+ }
142
+ if (Array.isArray(n)) {
143
+ for (const c of n)
144
+ collect(c, texts, rows);
145
+ return;
146
+ }
147
+ if (isVNode(n)) {
148
+ if (n.type === Fragment) {
149
+ for (const c of toArray(n.props.children))
150
+ collect(c, texts, rows);
151
+ }
152
+ else if (n.type === ButtonRow) {
153
+ rows.push(collectRow(n.props.children));
154
+ }
155
+ else if (n.type === Button) {
156
+ rows.push([toButton(n)]);
157
+ }
158
+ }
159
+ }
160
+ function renderView(el) {
161
+ const screen = resolve(el);
162
+ if (!isVNode(screen) || screen.type !== Screen) {
163
+ throw new Error("morda/jsx: a screen component must render <Screen>…</Screen>");
164
+ }
165
+ const texts = [];
166
+ const rows = [];
167
+ for (const c of toArray(screen.props.children))
168
+ collect(c, texts, rows);
169
+ const keyboard = rows.filter((r) => r.length > 0);
170
+ return keyboard.length > 0 ? { text: texts.join(""), keyboard } : { text: texts.join("") };
171
+ }
172
+ // hook state per chat+window. evicted when a window leaves the stack (via morda's
173
+ // onLeave) so a reopened screen re-mounts fresh. bounded by chats × windows.
174
+ const slotStore = new Map();
175
+ const hookCounts = new Map();
176
+ function makeRender(windowId, Component, idByComponent) {
177
+ return async (ctx) => {
178
+ const storeKey = `${ctx.chat?.id ?? "_"}:${windowId}`;
179
+ let slots = slotStore.get(storeKey);
180
+ if (!slots) {
181
+ slots = [];
182
+ slotStore.set(storeKey, slots);
183
+ }
184
+ const frame = { slots, cursor: 0, effects: [], ctx, idByComponent };
185
+ const prev = current;
186
+ current = frame;
187
+ let tree;
188
+ try {
189
+ tree = Component();
190
+ }
191
+ finally {
192
+ current = prev;
193
+ }
194
+ // rules of hooks: a changed hook count means a conditional hook — fail loud
195
+ // instead of silently reinterpreting slots.
196
+ const expected = hookCounts.get(storeKey);
197
+ if (expected !== undefined && expected !== frame.cursor) {
198
+ throw new Error("morda/jsx: hooks must be called unconditionally (hook count changed between renders)");
199
+ }
200
+ hookCounts.set(storeKey, frame.cursor);
201
+ const view = renderView(tree);
202
+ for (const effect of frame.effects)
203
+ await effect();
204
+ return view;
205
+ };
206
+ }
207
+ /** install a set of JSX screens as a dialog. `bot.install(jsxDialogs({ main, settings }))`. */
208
+ export function jsxDialogs(screens, options) {
209
+ const idByComponent = new Map();
210
+ for (const [id, Component] of Object.entries(screens))
211
+ idByComponent.set(Component, id);
212
+ const def = {};
213
+ for (const [id, Component] of Object.entries(screens)) {
214
+ def[id] = makeRender(id, Component, idByComponent);
215
+ }
216
+ return dialogs(def, {
217
+ ...options,
218
+ onLeave: (chatId, windowId) => {
219
+ const key = `${chatId}:${windowId}`;
220
+ slotStore.delete(key);
221
+ hookCounts.delete(key);
222
+ options?.onLeave?.(chatId, windowId);
223
+ },
224
+ });
225
+ }
226
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jsx/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** brand so `isVNode` can't mistake a plain user object for an element. */
2
+ export declare const VNODE: unique symbol;
3
+ export interface VNode {
4
+ [VNODE]: true;
5
+ type: unknown;
6
+ props: {
7
+ children?: unknown;
8
+ [key: string]: unknown;
9
+ };
10
+ }
11
+ export declare function jsx(type: unknown, props: {
12
+ children?: unknown;
13
+ [key: string]: unknown;
14
+ }): VNode;
15
+ export declare const jsxs: typeof jsx;
16
+ export declare function Fragment(props: {
17
+ children?: unknown;
18
+ }): VNode;
19
+ export declare namespace JSX {
20
+ type Element = VNode;
21
+ interface ElementChildrenAttribute {
22
+ children: Record<never, never>;
23
+ }
24
+ interface IntrinsicElements {
25
+ [elem: string]: never;
26
+ }
27
+ }
28
+ //# sourceMappingURL=jsx-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../../src/jsx/jsx-runtime.ts"],"names":[],"mappings":"AAIA,2EAA2E;AAC3E,eAAO,MAAM,KAAK,EAAE,OAAO,MAAyC,CAAC;AAErE,MAAM,WAAW,KAAK;IACrB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACtD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,KAAK,CAE/F;AAED,eAAO,MAAM,IAAI,YAAM,CAAC;AAExB,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,KAAK,CAE7D;AAED,yBAAiB,GAAG,CAAC;IACpB,KAAY,OAAO,GAAG,KAAK,CAAC;IAE5B,UAAiB,wBAAwB;QACxC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KAC/B;IAED,UAAiB,iBAAiB;QACjC,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;KACtB;CACD"}
@@ -0,0 +1,13 @@
1
+ // automatic JSX runtime. `jsx(type, props)` just builds a vnode; the morda/jsx
2
+ // renderer flattens it to a WindowView. components are never invoked by the
3
+ // runtime itself — they are resolved during flattening.
4
+ /** brand so `isVNode` can't mistake a plain user object for an element. */
5
+ export const VNODE = Symbol.for("yaebal.morda.vnode");
6
+ export function jsx(type, props) {
7
+ return { [VNODE]: true, type, props };
8
+ }
9
+ export const jsxs = jsx;
10
+ export function Fragment(props) {
11
+ return { [VNODE]: true, type: Fragment, props };
12
+ }
13
+ //# sourceMappingURL=jsx-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../../src/jsx/jsx-runtime.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,wDAAwD;AAExD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,KAAK,GAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAQrE,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,KAAqD;IACvF,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AAExB,MAAM,UAAU,QAAQ,CAAC,KAA6B;IACrD,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jsx.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.test.d.ts","sourceRoot":"","sources":["../src/jsx.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,150 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@yaebal/morda/jsx-runtime";
2
+ import assert from "node:assert/strict";
3
+ import test from "node:test";
4
+ import { Composer, Context } from "@yaebal/core";
5
+ import { Button, ButtonRow, Screen, jsxDialogs, useEffect, useNavigation, useState, } from "./jsx/index.js";
6
+ const noop = async () => { };
7
+ const entry = (c) => c.toMiddleware();
8
+ function fakeApi() {
9
+ const calls = [];
10
+ let nextId = 100;
11
+ const api = {
12
+ sendMessage(params) {
13
+ calls.push({ method: "sendMessage", params });
14
+ return Promise.resolve({ message_id: nextId++ });
15
+ },
16
+ answerCallbackQuery(params) {
17
+ calls.push({ method: "answerCallbackQuery", params });
18
+ return Promise.resolve(true);
19
+ },
20
+ call(method, params) {
21
+ calls.push({ method, params });
22
+ return Promise.resolve(true);
23
+ },
24
+ };
25
+ return { api, calls };
26
+ }
27
+ const msgCtx = (api, text, chatId) => new Context({
28
+ api,
29
+ update: {
30
+ update_id: 1,
31
+ message: {
32
+ message_id: 1,
33
+ date: 0,
34
+ chat: { id: chatId, type: "private" },
35
+ from: { id: chatId, is_bot: false, first_name: "u" },
36
+ text,
37
+ },
38
+ },
39
+ updateType: "message",
40
+ });
41
+ const cbCtx = (api, data, chatId, messageId) => new Context({
42
+ api,
43
+ update: {
44
+ update_id: 1,
45
+ callback_query: {
46
+ id: "cb",
47
+ from: { id: chatId, is_bot: false, first_name: "u" },
48
+ message: { message_id: messageId, date: 0, chat: { id: chatId, type: "private" } },
49
+ data,
50
+ },
51
+ },
52
+ updateType: "callback_query",
53
+ });
54
+ // biome-ignore lint/suspicious/noExplicitAny: reaching into recorded params
55
+ const dataAt = (params, row, col) => params.reply_markup.inline_keyboard[row][col].callback_data;
56
+ test("useState re-renders the screen in place on setState", async () => {
57
+ function Counter() {
58
+ const [n, setN] = useState(0);
59
+ return (_jsxs(Screen, { children: [`n=${n}`, _jsx(ButtonRow, { children: _jsx(Button, { id: "inc", onClick: () => setN((v) => v + 1), children: "+" }) })] }));
60
+ }
61
+ const { api, calls } = fakeApi();
62
+ const mw = entry(new Composer()
63
+ .install(jsxDialogs({ counter: Counter }))
64
+ .command("go", (ctx) => ctx.dialog.start("counter")));
65
+ await mw(msgCtx(api, "/go", 1), noop);
66
+ const sent = calls.find((c) => c.method === "sendMessage");
67
+ assert.equal(sent?.params.text, "n=0");
68
+ const incData = dataAt(sent?.params, 0, 0);
69
+ calls.length = 0;
70
+ await mw(cbCtx(api, incData, 1, 100), noop);
71
+ assert.equal(calls.find((c) => c.method === "editMessageText")?.params.text, "n=1");
72
+ calls.length = 0;
73
+ await mw(cbCtx(api, incData, 1, 100), noop);
74
+ assert.equal(calls.find((c) => c.method === "editMessageText")?.params.text, "n=2");
75
+ });
76
+ test("useEffect with [] runs once on mount, not on re-render", async () => {
77
+ let runs = 0;
78
+ function Screen1() {
79
+ const [n, setN] = useState(0);
80
+ useEffect(() => {
81
+ runs++;
82
+ }, []);
83
+ return (_jsxs(Screen, { children: [`n=${n}`, _jsx(ButtonRow, { children: _jsx(Button, { id: "inc", onClick: () => setN((v) => v + 1), children: "+" }) })] }));
84
+ }
85
+ const { api, calls } = fakeApi();
86
+ const mw = entry(new Composer()
87
+ .install(jsxDialogs({ s: Screen1 }))
88
+ .command("go", (ctx) => ctx.dialog.start("s")));
89
+ await mw(msgCtx(api, "/go", 1), noop);
90
+ assert.equal(runs, 1);
91
+ const incData = dataAt(calls.find((c) => c.method === "sendMessage")?.params, 0, 0);
92
+ await mw(cbCtx(api, incData, 1, 100), noop); // re-renders twice (find + after setState)
93
+ assert.equal(runs, 1);
94
+ });
95
+ test("reopening a closed screen resets hook state", async () => {
96
+ let runs = 0;
97
+ function Counter() {
98
+ const [n, setN] = useState(0);
99
+ const { back } = useNavigation();
100
+ useEffect(() => {
101
+ runs++;
102
+ }, []);
103
+ return (_jsxs(Screen, { children: [`n=${n}`, _jsx(ButtonRow, { children: _jsx(Button, { id: "inc", onClick: () => setN((v) => v + 1), children: "+" }) }), _jsx(ButtonRow, { children: _jsx(Button, { id: "close", onClick: () => back(), children: "x" }) })] }));
104
+ }
105
+ const { api, calls } = fakeApi();
106
+ // distinct window id ("rc") so this test's hook slots don't collide with the
107
+ // other counter test (module-level slot store is keyed by chat:window).
108
+ const mw = entry(new Composer()
109
+ .install(jsxDialogs({ rc: Counter }))
110
+ .command("go", (ctx) => ctx.dialog.start("rc")));
111
+ await mw(msgCtx(api, "/go", 1), noop);
112
+ let sent = calls.find((c) => c.method === "sendMessage");
113
+ assert.equal(sent?.params.text, "n=0");
114
+ assert.equal(runs, 1);
115
+ const incData = dataAt(sent?.params, 0, 0);
116
+ const closeData = dataAt(sent?.params, 1, 0);
117
+ await mw(cbCtx(api, incData, 1, 100), noop); // n=1
118
+ calls.length = 0;
119
+ await mw(cbCtx(api, closeData, 1, 100), noop); // back() at root → close + evict slots
120
+ assert.ok(calls.some((c) => c.method === "deleteMessage"));
121
+ calls.length = 0;
122
+ await mw(msgCtx(api, "/go", 1), noop); // reopen
123
+ sent = calls.find((c) => c.method === "sendMessage");
124
+ assert.equal(sent?.params.text, "n=0"); // counter reset, not "n=1"
125
+ assert.equal(runs, 2); // mount effect re-fired
126
+ });
127
+ test("useNavigation pushes and pops across screens", async () => {
128
+ function Detail() {
129
+ const { back } = useNavigation();
130
+ return (_jsxs(Screen, { children: ["detail", _jsx(ButtonRow, { children: _jsx(Button, { id: "back", onClick: () => back(), children: "back" }) })] }));
131
+ }
132
+ function Home() {
133
+ const { push } = useNavigation();
134
+ return (_jsxs(Screen, { children: ["home", _jsx(ButtonRow, { children: _jsx(Button, { id: "go", onClick: () => push(Detail), children: "detail" }) })] }));
135
+ }
136
+ const { api, calls } = fakeApi();
137
+ const mw = entry(new Composer()
138
+ .install(jsxDialogs({ home: Home, detail: Detail }))
139
+ .command("go", (ctx) => ctx.dialog.start("home")));
140
+ await mw(msgCtx(api, "/go", 1), noop);
141
+ const goData = dataAt(calls.find((c) => c.method === "sendMessage")?.params, 0, 0);
142
+ calls.length = 0;
143
+ await mw(cbCtx(api, goData, 1, 100), noop);
144
+ const edit1 = calls.find((c) => c.method === "editMessageText");
145
+ assert.equal(edit1?.params.text, "detail");
146
+ calls.length = 0;
147
+ await mw(cbCtx(api, dataAt(edit1?.params, 0, 0), 1, 100), noop);
148
+ assert.equal(calls.find((c) => c.method === "editMessageText")?.params.text, "home");
149
+ });
150
+ //# sourceMappingURL=jsx.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.test.js","sourceRoot":"","sources":["../src/jsx.test.tsx"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@yaebal/morda",
3
+ "version": "0.0.1",
4
+ "description": "yaebal dialogs engine — declarative windows, callback routing, stack navigation.",
5
+ "type": "module",
6
+ "main": "./lib/index.js",
7
+ "types": "./lib/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/index.d.ts",
11
+ "import": "./lib/index.js"
12
+ },
13
+ "./jsx": {
14
+ "types": "./lib/jsx/index.d.ts",
15
+ "import": "./lib/jsx/index.js"
16
+ },
17
+ "./jsx-runtime": {
18
+ "types": "./lib/jsx/jsx-runtime.d.ts",
19
+ "import": "./lib/jsx/jsx-runtime.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "lib",
24
+ "src"
25
+ ],
26
+ "dependencies": {
27
+ "@yaebal/keyboard": "0.0.1",
28
+ "@yaebal/session": "0.0.1",
29
+ "@yaebal/core": "0.0.1",
30
+ "@yaebal/callback-data": "0.0.1"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "latest"
34
+ },
35
+ "engines": {
36
+ "node": ">=20"
37
+ },
38
+ "keywords": [
39
+ "telegram",
40
+ "telegram-bot",
41
+ "yaebal",
42
+ "dialogs",
43
+ "menu",
44
+ "fsm"
45
+ ],
46
+ "license": "MIT",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/neverlane/yaebal",
50
+ "directory": "packages/morda"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc -p tsconfig.json",
57
+ "typecheck": "tsc -p tsconfig.json --noEmit",
58
+ "test": "node --test lib"
59
+ }
60
+ }