@jalvin/runtime 2.0.41 → 2.0.43

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.
Files changed (53) hide show
  1. package/dist/bibi.d.ts +0 -4
  2. package/dist/bibi.d.ts.map +1 -1
  3. package/dist/bibi.js +9 -11
  4. package/dist/bibi.js.map +1 -1
  5. package/dist/coroutines.js +47 -22
  6. package/dist/coroutines.js.map +1 -1
  7. package/dist/index.d.ts +2 -5
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +224 -20
  10. package/dist/index.js.map +1 -1
  11. package/dist/stateflow.js +19 -8
  12. package/dist/stateflow.js.map +1 -1
  13. package/dist/stdlib/collections.js +108 -55
  14. package/dist/stdlib/collections.js.map +1 -1
  15. package/dist/stdlib/conversions.d.ts +0 -2
  16. package/dist/stdlib/conversions.d.ts.map +1 -1
  17. package/dist/stdlib/conversions.js +29 -17
  18. package/dist/stdlib/conversions.js.map +1 -1
  19. package/dist/stdlib/delegates.js +28 -14
  20. package/dist/stdlib/delegates.js.map +1 -1
  21. package/dist/stdlib/equality.js +4 -1
  22. package/dist/stdlib/equality.js.map +1 -1
  23. package/dist/stdlib/index.js +28 -12
  24. package/dist/stdlib/index.js.map +1 -1
  25. package/dist/stdlib/io.js +6 -2
  26. package/dist/stdlib/io.js.map +1 -1
  27. package/dist/stdlib/math.js +37 -29
  28. package/dist/stdlib/math.js.map +1 -1
  29. package/dist/stdlib/random.js +8 -3
  30. package/dist/stdlib/random.js.map +1 -1
  31. package/dist/stdlib/regex.js +8 -4
  32. package/dist/stdlib/regex.js.map +1 -1
  33. package/dist/stdlib/result.js +9 -3
  34. package/dist/stdlib/result.js.map +1 -1
  35. package/dist/stdlib/strings.js +51 -24
  36. package/dist/stdlib/strings.js.map +1 -1
  37. package/dist/stdlib/timing.js +8 -3
  38. package/dist/stdlib/timing.js.map +1 -1
  39. package/dist/stdlib/types.js +29 -13
  40. package/dist/stdlib/types.js.map +1 -1
  41. package/dist/ui.d.ts +69 -12
  42. package/dist/ui.d.ts.map +1 -1
  43. package/dist/ui.js +228 -130
  44. package/dist/ui.js.map +1 -1
  45. package/package.json +1 -1
  46. package/dist/dom.d.ts +0 -15
  47. package/dist/dom.d.ts.map +0 -1
  48. package/dist/dom.js +0 -212
  49. package/dist/dom.js.map +0 -1
  50. package/dist/nav.d.ts +0 -104
  51. package/dist/nav.d.ts.map +0 -1
  52. package/dist/nav.js +0 -261
  53. package/dist/nav.js.map +0 -1
package/dist/ui.js CHANGED
@@ -1,173 +1,271 @@
1
+ "use strict";
1
2
  // ─────────────────────────────────────────────────────────────────────────────
2
- // Jalvin UI runtime — Vanilla DOM reactivity system
3
+ // Jalvin UI runtime — React hooks for StateFlow, ViewModel, remember, mutableStateOf
4
+ //
5
+ // These are the companion hooks that make Jalvin's UI primitives
6
+ // work inside React components.
7
+ //
8
+ // `component fun` blocks compiled to React components call these hooks.
3
9
  // ─────────────────────────────────────────────────────────────────────────────
4
- let activeSubscriber = null;
5
- let stateHolderIdCounter = 0;
6
- class StateHolder {
7
- _value;
8
- subscribers = new Set();
9
- id = ++stateHolderIdCounter;
10
- constructor(initial) {
11
- this._value = initial;
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.mutableStateOf = mutableStateOf;
12
+ exports.remember = remember;
13
+ exports.rememberMutableStateOf = rememberMutableStateOf;
14
+ exports.collectAsState = collectAsState;
15
+ exports.useViewModel = useViewModel;
16
+ exports.LaunchedEffect = LaunchedEffect;
17
+ exports.DisposableEffect = DisposableEffect;
18
+ exports.SideEffect = SideEffect;
19
+ exports.widthToSizeClass = widthToSizeClass;
20
+ exports.heightToSizeClass = heightToSizeClass;
21
+ exports.WindowSizeClassProvider = WindowSizeClassProvider;
22
+ exports.calculateWindowSizeClass = calculateWindowSizeClass;
23
+ let _react = null;
24
+ function getReact() {
25
+ if (_react)
26
+ return _react;
27
+ try {
28
+ // Dynamic require keeps this file tree-shakeable in non-React builds
29
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
30
+ _react = require("react");
31
+ return _react;
12
32
  }
13
- get value() {
14
- if (activeSubscriber) {
15
- // console.log(`[State ${this.id}] Subscribing active render loop.`);
16
- this.subscribers.add(activeSubscriber);
17
- }
18
- return this._value;
33
+ catch {
34
+ throw new Error("[jalvin/runtime] React is required for component functions. " +
35
+ "Install react@>=18 and add it to your peer dependencies.");
19
36
  }
20
- set value(next) {
21
- if (!Object.is(this._value, next)) {
22
- console.log(`[State ${this.id}] Value changing:`, this._value, "->", next, "| Notifying", this.subscribers.size, "subscribers");
23
- this._value = next;
24
- this.notify();
25
- }
26
- }
27
- notify() {
28
- for (const sub of Array.from(this.subscribers)) {
29
- sub();
30
- }
31
- }
32
- }
33
- // -- Hook System ------------------------------------------------------------
34
- let currentHookIndex = 0;
35
- let hookState = [];
36
- /** Reset the hook pointer (called at the start of every render). */
37
- function resetHooks() {
38
- currentHookIndex = 0;
39
37
  }
38
+ const stateflow_js_1 = require("./stateflow.js");
40
39
  /**
41
- * Returns a reactive state holder.
40
+ * Hoisted `mutableStateOf(initial)` inside a `component fun`.
41
+ * Returns a mutable object whose `.value` setter triggers a re-render.
42
+ *
43
+ * Compiled output:
44
+ * val count = mutableStateOf(0)
45
+ * → const count = mutableStateOf(0);
46
+ * // count.value to read; count.value = x to update
42
47
  */
43
- export function mutableStateOf(initial) {
44
- return new StateHolder(initial);
48
+ function mutableStateOf(initial) {
49
+ const R = getReact();
50
+ const [v, setV] = R.useState(initial);
51
+ // stateRef tracks the latest React state value. Updated on every render so
52
+ // the value getter always returns the current value, not the initial one.
53
+ const stateRef = R.useRef(v);
54
+ const holderRef = R.useRef(null);
55
+ stateRef.current = v;
56
+ if (holderRef.current === null) {
57
+ const holder = {};
58
+ Object.defineProperties(holder, {
59
+ value: {
60
+ get() { return stateRef.current; },
61
+ set(next) {
62
+ if (!Object.is(stateRef.current, next))
63
+ setV(next);
64
+ },
65
+ enumerable: true,
66
+ configurable: false,
67
+ },
68
+ });
69
+ holderRef.current = holder;
70
+ }
71
+ return holderRef.current;
45
72
  }
73
+ // ---------------------------------------------------------------------------
74
+ // remember { } — memoised value across recompositions
75
+ // ---------------------------------------------------------------------------
46
76
  /**
47
- * Persists a value across re-renders.
77
+ * Compute an expensive value once and remember it.
78
+ *
79
+ * val scope = remember { CoroutineScope() }
48
80
  */
49
- export function remember(compute, deps = []) {
50
- const idx = currentHookIndex++;
51
- const existing = hookState[idx];
52
- let depsChanged = !existing || !existing.deps || existing.deps.length !== deps.length;
53
- if (!depsChanged && existing) {
54
- for (let i = 0; i < deps.length; i++) {
55
- if (!Object.is(deps[i], existing.deps[i])) {
56
- depsChanged = true;
57
- break;
58
- }
59
- }
60
- }
61
- if (depsChanged) {
62
- hookState[idx] = { value: compute(), deps };
63
- }
64
- return hookState[idx].value;
81
+ function remember(compute, deps = []) {
82
+ const R = getReact();
83
+ return R.useMemo(compute, deps);
65
84
  }
66
85
  /**
67
- * Convenience wrapper.
86
+ * `remember { mutableStateOf(0) }` — convenience wrapper.
68
87
  */
69
- export function rememberMutableStateOf(initial) {
70
- return remember(() => mutableStateOf(initial));
88
+ function rememberMutableStateOf(initial) {
89
+ const R = getReact();
90
+ // eslint-disable-next-line react-hooks/exhaustive-deps
91
+ return R.useMemo(() => mutableStateOf(initial), []);
71
92
  }
93
+ // ---------------------------------------------------------------------------
94
+ // collectAsState — subscribe to a StateFlow inside a component
95
+ // ---------------------------------------------------------------------------
72
96
  /**
73
- * Collects a StateFlow into reactive state, persisting the subscription across renders.
97
+ * Collects a StateFlow into React state. The component re-renders when
98
+ * the flow emits a new value.
99
+ *
100
+ * val currentName by viewModel.name.collectAsState()
74
101
  */
75
- export function collectAsState(flow) {
76
- const state = remember(() => {
77
- const s = mutableStateOf(flow.value);
78
- flow.collect((v) => { s.value = v; });
79
- return s;
102
+ function collectAsState(flow) {
103
+ const R = getReact();
104
+ const [value, setValue] = R.useState(flow.value);
105
+ R.useEffect(() => {
106
+ const unsub = flow.collect((v) => setValue(v));
107
+ return unsub;
108
+ // eslint-disable-next-line react-hooks/exhaustive-deps
80
109
  }, [flow]);
81
- return state.value;
110
+ return value;
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // useViewModel — get or create a ViewModel scoped to a component subtree
114
+ // ---------------------------------------------------------------------------
115
+ /**
116
+ * Returns a shared ViewModel instance for the given key.
117
+ *
118
+ * val vm = useViewModel("CounterVm") { CounterViewModel() }
119
+ */
120
+ function useViewModel(key, factory) {
121
+ const R = getReact();
122
+ const vm = R.useMemo(() => (0, stateflow_js_1.viewModel)(key, factory), []);
123
+ R.useEffect(() => {
124
+ return () => (0, stateflow_js_1.clearViewModel)(key);
125
+ // Only clear when the component truly unmounts from root
126
+ // eslint-disable-next-line react-hooks/exhaustive-deps
127
+ }, []);
128
+ return vm;
82
129
  }
130
+ // ---------------------------------------------------------------------------
131
+ // LaunchedEffect — run a suspend block tied to component lifecycle
132
+ // ---------------------------------------------------------------------------
83
133
  /**
84
- * Runs an effect tied to "component" execution.
134
+ * Runs a suspend block when deps change. Cancels on unmount.
135
+ *
136
+ * LaunchedEffect(Unit) {
137
+ * repeat(10) { delay(1_000) }
138
+ * }
85
139
  */
86
- export function LaunchedEffect(deps, fn) {
87
- remember(() => {
88
- fn();
89
- return true;
140
+ function LaunchedEffect(deps, fn) {
141
+ const R = getReact();
142
+ R.useEffect(() => {
143
+ let cancelled = false;
144
+ const guard = async () => {
145
+ if (!cancelled)
146
+ await fn();
147
+ };
148
+ guard();
149
+ return () => { cancelled = true; };
150
+ // eslint-disable-next-line react-hooks/exhaustive-deps
90
151
  }, deps);
91
152
  }
92
- export function DisposableEffect(deps, fn) {
93
- remember(() => {
94
- fn();
95
- return true;
153
+ // ---------------------------------------------------------------------------
154
+ // DisposableEffect — run setup/teardown on deps change
155
+ // ---------------------------------------------------------------------------
156
+ function DisposableEffect(deps, fn) {
157
+ const R = getReact();
158
+ R.useEffect(() => {
159
+ const cleanup = fn();
160
+ return cleanup;
161
+ // eslint-disable-next-line react-hooks/exhaustive-deps
96
162
  }, deps);
97
163
  }
98
- export function SideEffect(fn) {
99
- fn();
164
+ // ---------------------------------------------------------------------------
165
+ // SideEffect — run a non-suspending effect every recomposition
166
+ // ---------------------------------------------------------------------------
167
+ function SideEffect(fn) {
168
+ const R = getReact();
169
+ R.useEffect(fn);
100
170
  }
101
- export function widthToSizeClass(widthPx) {
171
+ /** @internal exported for testing */
172
+ function widthToSizeClass(widthPx) {
102
173
  if (widthPx < 600)
103
174
  return "Compact";
104
175
  if (widthPx < 840)
105
176
  return "Medium";
106
177
  return "Expanded";
107
178
  }
108
- export function heightToSizeClass(heightPx) {
179
+ /** @internal exported for testing */
180
+ function heightToSizeClass(heightPx) {
109
181
  if (heightPx < 480)
110
182
  return "Compact";
111
183
  if (heightPx < 900)
112
184
  return "Medium";
113
185
  return "Expanded";
114
186
  }
115
- const windowSizeState = new StateHolder({
116
- widthSizeClass: widthToSizeClass(typeof window !== "undefined" ? window.innerWidth : 1280),
117
- heightSizeClass: heightToSizeClass(typeof window !== "undefined" ? window.innerHeight : 800),
118
- });
119
- if (typeof window !== "undefined") {
120
- window.addEventListener("resize", () => {
121
- windowSizeState.value = {
122
- widthSizeClass: widthToSizeClass(window.innerWidth),
123
- heightSizeClass: heightToSizeClass(window.innerHeight),
124
- };
125
- });
126
- }
127
- export function calculateWindowSizeClass() {
128
- return windowSizeState.value;
187
+ // ---------------------------------------------------------------------------
188
+ // WindowSizeClassProvider single resize listener for the whole tree
189
+ //
190
+ // Mount this once at the app root. All calls to calculateWindowSizeClass()
191
+ // read from this context, so a single resize event produces exactly one
192
+ // coordinated state update regardless of how many components call the hook.
193
+ // ---------------------------------------------------------------------------
194
+ const DEFAULT_WINDOW_SIZE_CLASS = {
195
+ widthSizeClass: "Expanded",
196
+ heightSizeClass: "Medium",
197
+ };
198
+ // Lazily created so the module remains usable in non-React (Node) builds.
199
+ let _WindowSizeClassContext = null;
200
+ function getWindowSizeClassContext() {
201
+ if (!_WindowSizeClassContext) {
202
+ _WindowSizeClassContext = getReact().createContext(DEFAULT_WINDOW_SIZE_CLASS);
203
+ }
204
+ return _WindowSizeClassContext;
129
205
  }
130
- export function WindowSizeClassProvider({ children }) {
131
- return children;
206
+ /**
207
+ * Mount once at the app root. Registers a single `resize` listener and
208
+ * distributes the current {@link WindowSizeClassState} to all descendants
209
+ * that call {@link calculateWindowSizeClass}.
210
+ *
211
+ * The vite-plugin entry module wraps the root component in this provider
212
+ * automatically when the `entry` option is used.
213
+ *
214
+ * @example
215
+ * ```jalvin
216
+ * // main entry
217
+ * root.render(
218
+ * WindowSizeClassProvider { MyApp() }
219
+ * )
220
+ * ```
221
+ */
222
+ function WindowSizeClassProvider({ children }) {
223
+ const R = getReact();
224
+ const getState = () => ({
225
+ widthSizeClass: widthToSizeClass(typeof window !== "undefined" ? window.innerWidth : 1280),
226
+ heightSizeClass: heightToSizeClass(typeof window !== "undefined" ? window.innerHeight : 800),
227
+ });
228
+ const [state, setState] = R.useState(getState);
229
+ R.useEffect(() => {
230
+ const onResize = () => {
231
+ const next = getState();
232
+ setState(prev => prev.widthSizeClass === next.widthSizeClass &&
233
+ prev.heightSizeClass === next.heightSizeClass
234
+ ? prev
235
+ : next);
236
+ };
237
+ window.addEventListener("resize", onResize);
238
+ return () => window.removeEventListener("resize", onResize);
239
+ // eslint-disable-next-line react-hooks/exhaustive-deps
240
+ }, []);
241
+ const ctx = getWindowSizeClassContext();
242
+ return R.createElement(ctx.Provider, { value: state }, children);
132
243
  }
133
- // -- ViewModels -------------------------------------------------------------
134
- export { viewModel as useViewModel } from "./stateflow.js";
135
- // -- Root Rendering ---------------------------------------------------------
136
- let renderCount = 0;
137
- import { patch } from "./dom.js";
138
244
  /**
139
- * Mounts a Jalvin component to the DOM and sets up the re-render loop.
245
+ * Returns the current {@link WindowSizeClassState}. Re-renders only when the
246
+ * window crosses a breakpoint boundary.
247
+ *
248
+ * Requires {@link WindowSizeClassProvider} to be mounted somewhere above this
249
+ * component in the tree (the vite-plugin does this automatically). If no
250
+ * provider is found the hook falls back to "Expanded/Medium" and logs a
251
+ * warning in development.
252
+ *
253
+ * Mirrors `calculateWindowSizeClass()` from Compose Material3 Adaptive.
254
+ *
255
+ * @example
256
+ * ```jalvin
257
+ * component fun AdaptiveLayout() {
258
+ * val windowSize = calculateWindowSizeClass()
259
+ * if (windowSize.widthSizeClass == "Compact") {
260
+ * MobileLayout()
261
+ * } else {
262
+ * DesktopLayout()
263
+ * }
264
+ * }
265
+ * ```
140
266
  */
141
- export function render(rootComponent, container) {
142
- // Store the last rendered VNode on the container
143
- let oldVNode = container._jalvin_vnode || null;
144
- const update = () => {
145
- renderCount++;
146
- console.log(`[RENDER] Cycle ${renderCount} starting...`);
147
- activeSubscriber = update;
148
- resetHooks();
149
- // Save current active element (focus) and selection
150
- let activeId = "";
151
- if (document.activeElement && document.activeElement.id) {
152
- activeId = document.activeElement.id;
153
- }
154
- else if (document.activeElement && document.activeElement.tagName === "INPUT") {
155
- activeId = document.activeElement.name;
156
- }
157
- const newVNode = rootComponent();
158
- // Patch the DOM instead of recreating it
159
- patch(container, newVNode, oldVNode);
160
- oldVNode = newVNode;
161
- container._jalvin_vnode = oldVNode;
162
- // Restore focus if possible
163
- if (activeId) {
164
- const toFocus = document.getElementById(activeId) || document.querySelector(`input[name="${activeId}"]`);
165
- if (toFocus)
166
- toFocus.focus();
167
- }
168
- activeSubscriber = null;
169
- console.log(`[RENDER] Cycle ${renderCount} finished.`);
170
- };
171
- update();
267
+ function calculateWindowSizeClass() {
268
+ const R = getReact();
269
+ return R.useContext(getWindowSizeClassContext());
172
270
  }
173
271
  //# sourceMappingURL=ui.js.map
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jalvin/runtime",
3
- "version": "2.0.41",
3
+ "version": "2.0.43",
4
4
  "description": "Jalvin runtime — Bibi HTTP client, coroutines, StateFlow, ViewModel, UI reactivity",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/dist/dom.d.ts DELETED
@@ -1,15 +0,0 @@
1
- export interface VNode {
2
- tag: string;
3
- props: Record<string, any>;
4
- children: Array<VNode | string>;
5
- el?: Node;
6
- }
7
- /**
8
- * Creates a Virtual DOM Node instead of a real element.
9
- */
10
- export declare function jalvinCreateElement(tag: string | Function, props: Record<string, any> | null, ...children: any[]): VNode | any;
11
- /**
12
- * A basic diffing algorithm to update the DOM without recreating it.
13
- */
14
- export declare function patch(parentEl: HTMLElement, newVNode: VNode | string | null, oldVNode?: VNode | string | null, index?: number): void;
15
- //# sourceMappingURL=dom.d.ts.map
package/dist/dom.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,EAAE,IAAI,CAAC;CACX;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GAAG,QAAQ,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EACjC,GAAG,QAAQ,EAAE,GAAG,EAAE,GACjB,KAAK,GAAG,GAAG,CAmCb;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE,KAAK,SAAI,GAAG,IAAI,CAmD/H"}