@pritzlaff/nano-runes 0.0.0-stage → 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Aaron Pritzlaff
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 CHANGED
@@ -1,3 +1,26 @@
1
- # Temporary Holding Version
1
+ # @pritzlaff/nano-runes
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Write a component as plain state and functions; get an ordinary `@pritzlaff/nano-core` Component.
4
+
5
+ ```ts
6
+ const Counter = component('acme/counter', () => {
7
+ const s = state({ count: 0 })
8
+ return {
9
+ get count() { return s.count }, // a source: published when it changes, readable by calling it
10
+ increment: () => { s.count += 1 }, // an action: acme/counter/increment
11
+ }
12
+ })
13
+
14
+ reg.subscribe({ source: 'counter', op: Ops.key(Counter.ops.count), listener: 'log', target: Ops.key(Log.ops.log) })
15
+ ```
16
+
17
+ - **`state(init)`:** reactive state. A write at any depth schedules one publish per microtask of the getters whose
18
+ JSON changed. Subscribers receive copies, never the live state.
19
+ - **`event(schema?)`:** a source that isn't state, such as a click. Calling it publishes its argument. It is
20
+ named by its member key.
21
+ - **`component(id, make, schemas?)`:** functions become actions, getters become sources and events become sources.
22
+ `schemas` optionally types any member, and the runtime validates against it. `make` runs once when the
23
+ component is defined, to read its shape, and once per instance. `.ops` holds typed references to every op.
24
+
25
+ `state` and `event` must be called while `make` runs. Called anywhere else, they throw. State is JSON-shaped data:
26
+ arrays and plain objects are tracked (and copied per instance); a Map, Set or Date inside is stored but its changes are not seen.
package/index.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { type Static, type TSchema, type TUnknown } from 'typebox';
2
+ import { type Component, type Op } from '@pritzlaff/nano-core';
3
+ /** Reactive state for the component being made: any write, at any depth, re-publishes the getters that changed. */
4
+ export declare function state<T extends object>(init: T): T;
5
+ /** A source that is not state, such as a click: calling it publishes a copy of its argument. */
6
+ export declare function event<S extends TSchema = TUnknown>(schema?: S): (data: Static<S>) => void;
7
+ /**
8
+ * A component from a function returning its surface: functions become actions, getters become sources published
9
+ * when their value changes, and `event()` members become sources. `make` runs once here to read the shape.
10
+ */
11
+ export declare function component<A extends object>(id: string, make: () => A, schemas?: {
12
+ [K in keyof A]?: TSchema;
13
+ }): Component<A> & {
14
+ ops: {
15
+ [K in keyof A]: Op;
16
+ };
17
+ };
package/index.js ADDED
@@ -0,0 +1,148 @@
1
+ // packages/runes/src/index.ts
2
+ import { Type } from "typebox";
3
+ import { Components, Ops } from "@pritzlaff/nano-core";
4
+ var making;
5
+ var EVENT = Symbol("event");
6
+ var copy = (json) => json === undefined ? undefined : JSON.parse(json);
7
+ var inMake = (what) => {
8
+ if (!making)
9
+ throw new Error(`${what}() must be called while a component's make function runs`);
10
+ return making;
11
+ };
12
+ var targets = new WeakMap;
13
+ var plain = (v) => v !== null && typeof v === "object" && !Object.isFrozen(v) && (Array.isArray(v) || [Object.prototype, null].includes(Object.getPrototypeOf(v)));
14
+ var clone = (v) => {
15
+ const t = v !== null && typeof v === "object" && targets.get(v) || v;
16
+ if (!plain(t))
17
+ return t;
18
+ return Array.isArray(t) ? t.map(clone) : Object.fromEntries(Object.entries(t).map(([k, x]) => [k, clone(x)]));
19
+ };
20
+ function reactive(target, dirty, seen) {
21
+ if (!plain(target))
22
+ return target;
23
+ const cached = seen.get(target);
24
+ if (cached)
25
+ return cached;
26
+ const p = new Proxy(target, {
27
+ get: (t, k, r) => {
28
+ const v = Reflect.get(t, k, r);
29
+ return plain(v) ? reactive(v, dirty, seen) : v;
30
+ },
31
+ set: (t, k, v, r) => {
32
+ const ok = Reflect.set(t, k, clone(v), r);
33
+ dirty();
34
+ return ok;
35
+ },
36
+ deleteProperty: (t, k) => {
37
+ const ok = Reflect.deleteProperty(t, k);
38
+ dirty();
39
+ return ok;
40
+ }
41
+ });
42
+ seen.set(target, p);
43
+ targets.set(p, target);
44
+ return p;
45
+ }
46
+ function state(init) {
47
+ const m = inMake("state");
48
+ return reactive(clone(init), () => m.dirty(), new WeakMap);
49
+ }
50
+ function event(schema) {
51
+ const m = inMake("event");
52
+ let op;
53
+ const fire = (data) => {
54
+ if (op && m.env)
55
+ m.env.notify(op, copy(JSON.stringify(data)));
56
+ };
57
+ const mark = { schema, bind: (o) => {
58
+ op = o;
59
+ } };
60
+ return Object.assign(fire, { [EVENT]: mark });
61
+ }
62
+ function run(make, m) {
63
+ const prev = making;
64
+ making = m;
65
+ try {
66
+ return make();
67
+ } finally {
68
+ making = prev;
69
+ }
70
+ }
71
+ function component(id, make, schemas = {}) {
72
+ const kinds = new Map, ops = {};
73
+ for (const [k, d] of Object.entries(Object.getOwnPropertyDescriptors(run(make, { dirty() {} })))) {
74
+ const given = schemas[k], mark = d.value?.[EVENT];
75
+ if (d.get) {
76
+ kinds.set(k, "getter");
77
+ ops[k] = Ops.source(id, k, given ?? Type.Unknown());
78
+ } else if (mark) {
79
+ kinds.set(k, "event");
80
+ ops[k] = Ops.source(id, k, given ?? mark.schema ?? Type.Unknown());
81
+ } else if (typeof d.value === "function") {
82
+ kinds.set(k, "action");
83
+ ops[k] = Ops.action(id, k, given ?? Type.Unknown(), Type.Unknown());
84
+ }
85
+ }
86
+ const getters = [...kinds].filter(([, kind]) => kind === "getter").map(([k]) => k);
87
+ const at = id.lastIndexOf("/");
88
+ if (at < 1)
89
+ throw new Error(`component id ${id} needs a namespace, like acme/${id}`);
90
+ const c = Components.create({ ns: id.slice(0, at), name: id.slice(at + 1) }, (env) => {
91
+ const last = new Map;
92
+ let pending = false;
93
+ const read = (k) => JSON.stringify(api[k]);
94
+ const flush = () => {
95
+ try {
96
+ for (const k of getters) {
97
+ let now;
98
+ try {
99
+ now = read(k);
100
+ } catch {
101
+ continue;
102
+ }
103
+ if (now !== last.get(k)) {
104
+ last.set(k, now);
105
+ env.notify(ops[k], copy(now));
106
+ }
107
+ }
108
+ } finally {
109
+ pending = false;
110
+ }
111
+ };
112
+ const api = run(make, { env, dirty: () => {
113
+ if (!pending) {
114
+ pending = true;
115
+ queueMicrotask(flush);
116
+ }
117
+ } });
118
+ for (const k of getters) {
119
+ try {
120
+ last.set(k, read(k));
121
+ } catch {}
122
+ }
123
+ for (const [k, kind] of kinds)
124
+ if (kind === "event")
125
+ api[k][EVENT].bind(ops[k]);
126
+ return api;
127
+ });
128
+ for (const [k, kind] of kinds) {
129
+ if (kind === "getter")
130
+ c.action(ops[k], (a) => copy(JSON.stringify(a[k])));
131
+ else if (kind === "event")
132
+ c.action(ops[k]);
133
+ else
134
+ c.action(ops[k], (a, arg) => {
135
+ const r = a[k](arg);
136
+ return targets.has(r) ? clone(r) : r;
137
+ });
138
+ }
139
+ return Object.assign(c, { ops });
140
+ }
141
+ export {
142
+ state,
143
+ event,
144
+ component
145
+ };
146
+
147
+ //# debugId=386D5AD40023B56164756E2164756E21
148
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": [
5
+ "// Rune-style sugar over @pritzlaff/nano-core: write plain state and functions; get an ordinary core Component.\nimport { Type, type Static, type TSchema, type TUnknown } from 'typebox'\nimport { Components, Ops, type Component, type Environment, type Op } from '@pritzlaff/nano-core'\n\n/** The instance whose `make` is running: what state writes mark dirty, and where events publish. */\ntype Making = { dirty(): void; env?: Environment }\nlet making: Making | undefined\nconst EVENT = Symbol('event')\ntype EventMark = { schema?: TSchema; bind(op: Op): void }\n\nconst copy = (json: string | undefined) => (json === undefined ? undefined : JSON.parse(json))\nconst inMake = (what: string) => { if (!making) throw new Error(`${what}() must be called while a component's make function runs`); return making }\n\nconst targets = new WeakMap<object, object>() // every state proxy → the object it wraps\n/** State is JSON-shaped data: only arrays and plain, unfrozen objects are tracked. Map, Set, Date stay as they are. */\nconst plain = (v: unknown): v is object =>\n v !== null && typeof v === 'object' && !Object.isFrozen(v) && (Array.isArray(v) || [Object.prototype, null].includes(Object.getPrototypeOf(v)))\n/** A deep copy of plain data, unwrapping any state proxies inside it. Other objects (Map, Date) are kept as they are. */\nconst clone = (v: unknown): unknown => {\n const t = (v !== null && typeof v === 'object' && targets.get(v)) || v\n if (!plain(t)) return t\n return Array.isArray(t) ? t.map(clone) : Object.fromEntries(Object.entries(t).map(([k, x]) => [k, clone(x)]))\n}\n\n/** Wraps an object (and everything inside it) so every write marks the owner dirty. */\nfunction reactive<T extends object>(target: T, dirty: () => void, seen: WeakMap<object, object>): T {\n if (!plain(target)) return target\n const cached = seen.get(target)\n if (cached) return cached as T\n const p = new Proxy(target, {\n get: (t, k, r) => { const v = Reflect.get(t, k, r); return plain(v) ? reactive(v, dirty, seen) : v },\n set: (t, k, v, r) => {\n // store a copy: state never shares an object with the caller, or with another place in state\n const ok = Reflect.set(t, k, clone(v), r); dirty(); return ok\n },\n deleteProperty: (t, k) => { const ok = Reflect.deleteProperty(t, k); dirty(); return ok },\n })\n seen.set(target, p)\n targets.set(p, target)\n return p\n}\n\n/** Reactive state for the component being made: any write, at any depth, re-publishes the getters that changed. */\nexport function state<T extends object>(init: T): T {\n const m = inMake('state')\n return reactive(clone(init) as T, () => m.dirty(), new WeakMap()) // a copy: instances never share state\n}\n\n/** A source that is not state, such as a click: calling it publishes a copy of its argument. */\nexport function event<S extends TSchema = TUnknown>(schema?: S): (data: Static<S>) => void {\n const m = inMake('event')\n let op: Op | undefined\n const fire = (data: Static<S>) => { if (op && m.env) void m.env.notify(op, copy(JSON.stringify(data))) }\n const mark: EventMark = { schema, bind: o => { op = o } }\n return Object.assign(fire, { [EVENT]: mark })\n}\n\n/** Runs `make` with `m` as the instance being made. */\nfunction run<A>(make: () => A, m: Making): A {\n const prev = making\n making = m\n try { return make() } finally { making = prev }\n}\n\ntype Kind = 'getter' | 'event' | 'action'\n\n/**\n * A component from a function returning its surface: functions become actions, getters become sources published\n * when their value changes, and `event()` members become sources. `make` runs once here to read the shape.\n */\nexport function component<A extends object>(id: string, make: () => A, schemas: { [K in keyof A]?: TSchema } = {}): Component<A> & { ops: { [K in keyof A]: Op } } {\n const kinds = new Map<string, Kind>(), ops: Record<string, Op> = {}\n for (const [k, d] of Object.entries(Object.getOwnPropertyDescriptors(run(make, { dirty() {} })))) {\n const given = (schemas as Record<string, TSchema | undefined>)[k], mark = d.value?.[EVENT] as EventMark | undefined\n if (d.get) { kinds.set(k, 'getter'); ops[k] = Ops.source(id, k, given ?? Type.Unknown()) }\n else if (mark) { kinds.set(k, 'event'); ops[k] = Ops.source(id, k, given ?? mark.schema ?? Type.Unknown()) }\n else if (typeof d.value === 'function') { kinds.set(k, 'action'); ops[k] = Ops.action(id, k, given ?? Type.Unknown(), Type.Unknown()) }\n }\n const getters = [...kinds].filter(([, kind]) => kind === 'getter').map(([k]) => k)\n const at = id.lastIndexOf('/')\n if (at < 1) throw new Error(`component id ${id} needs a namespace, like acme/${id}`)\n const c = Components.create<A>({ ns: id.slice(0, at), name: id.slice(at + 1) }, env => {\n const last = new Map<string, string | undefined>()\n let pending = false\n const read = (k: string) => JSON.stringify((api as any)[k])\n const flush = () => {\n try {\n for (const k of getters) {\n let now: string | undefined\n try { now = read(k) } catch { continue } // a failing getter is skipped; calling it reports the error\n if (now !== last.get(k)) { last.set(k, now); void env.notify(ops[k]!, copy(now)) }\n }\n } finally { pending = false } // after the loop: writes made by getters don't schedule another flush\n }\n const api = run(make, { env, dirty: () => { if (!pending) { pending = true; queueMicrotask(flush) } } })\n for (const k of getters) { try { last.set(k, read(k)) } catch {} }\n for (const [k, kind] of kinds) if (kind === 'event') ((api as any)[k][EVENT] as EventMark).bind(ops[k]!)\n return api\n })\n for (const [k, kind] of kinds) {\n if (kind === 'getter') c.action(ops[k]!, a => copy(JSON.stringify((a as any)[k])))\n else if (kind === 'event') c.action(ops[k]!)\n else c.action(ops[k]!, (a, arg) => { const r = (a as any)[k](arg); return targets.has(r) ? clone(r) : r })\n }\n return Object.assign(c, { ops: ops as { [K in keyof A]: Op } })\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "386D5AD40023B56164756E2164756E21",
9
+ "names": []
10
+ }
package/package.json CHANGED
@@ -1,6 +1,27 @@
1
1
  {
2
2
  "name": "@pritzlaff/nano-runes",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/aaronp/nano.git",
9
+ "directory": "packages/runes"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./index.d.ts",
14
+ "import": "./index.js"
15
+ }
16
+ },
17
+ "types": "./index.d.ts",
18
+ "module": "./index.js",
19
+ "sideEffects": false,
20
+ "peerDependencies": {
21
+ "@pritzlaff/nano-core": "^0.1.0",
22
+ "typebox": "^1.4.0"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ }
27
+ }