@jalvin/runtime 2.0.42 → 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 -127
  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 -48
  51. package/dist/nav.d.ts.map +0 -1
  52. package/dist/nav.js +0 -136
  53. package/dist/nav.js.map +0 -1
package/dist/ui.js CHANGED
@@ -1,170 +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
- this._value = next;
23
- this.notify();
24
- }
25
- }
26
- notify() {
27
- for (const sub of Array.from(this.subscribers)) {
28
- sub();
29
- }
30
- }
31
- }
32
- // -- Hook System ------------------------------------------------------------
33
- let currentHookIndex = 0;
34
- let hookState = [];
35
- /** Reset the hook pointer (called at the start of every render). */
36
- function resetHooks() {
37
- currentHookIndex = 0;
38
37
  }
38
+ const stateflow_js_1 = require("./stateflow.js");
39
39
  /**
40
- * 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
41
47
  */
42
- export function mutableStateOf(initial) {
43
- 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;
44
72
  }
73
+ // ---------------------------------------------------------------------------
74
+ // remember { } — memoised value across recompositions
75
+ // ---------------------------------------------------------------------------
45
76
  /**
46
- * Persists a value across re-renders.
77
+ * Compute an expensive value once and remember it.
78
+ *
79
+ * val scope = remember { CoroutineScope() }
47
80
  */
48
- export function remember(compute, deps = []) {
49
- const idx = currentHookIndex++;
50
- const existing = hookState[idx];
51
- let depsChanged = !existing || !existing.deps || existing.deps.length !== deps.length;
52
- if (!depsChanged && existing) {
53
- for (let i = 0; i < deps.length; i++) {
54
- if (!Object.is(deps[i], existing.deps[i])) {
55
- depsChanged = true;
56
- break;
57
- }
58
- }
59
- }
60
- if (depsChanged) {
61
- hookState[idx] = { value: compute(), deps };
62
- }
63
- return hookState[idx].value;
81
+ function remember(compute, deps = []) {
82
+ const R = getReact();
83
+ return R.useMemo(compute, deps);
64
84
  }
65
85
  /**
66
- * Convenience wrapper.
86
+ * `remember { mutableStateOf(0) }` — convenience wrapper.
67
87
  */
68
- export function rememberMutableStateOf(initial) {
69
- 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), []);
70
92
  }
93
+ // ---------------------------------------------------------------------------
94
+ // collectAsState — subscribe to a StateFlow inside a component
95
+ // ---------------------------------------------------------------------------
71
96
  /**
72
- * 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()
73
101
  */
74
- export function collectAsState(flow) {
75
- const state = remember(() => {
76
- const s = mutableStateOf(flow.value);
77
- flow.collect((v) => { s.value = v; });
78
- 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
79
109
  }, [flow]);
80
- 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;
81
129
  }
130
+ // ---------------------------------------------------------------------------
131
+ // LaunchedEffect — run a suspend block tied to component lifecycle
132
+ // ---------------------------------------------------------------------------
82
133
  /**
83
- * 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
+ * }
84
139
  */
85
- export function LaunchedEffect(deps, fn) {
86
- remember(() => {
87
- fn();
88
- 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
89
151
  }, deps);
90
152
  }
91
- export function DisposableEffect(deps, fn) {
92
- remember(() => {
93
- fn();
94
- 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
95
162
  }, deps);
96
163
  }
97
- export function SideEffect(fn) {
98
- fn();
164
+ // ---------------------------------------------------------------------------
165
+ // SideEffect — run a non-suspending effect every recomposition
166
+ // ---------------------------------------------------------------------------
167
+ function SideEffect(fn) {
168
+ const R = getReact();
169
+ R.useEffect(fn);
99
170
  }
100
- export function widthToSizeClass(widthPx) {
171
+ /** @internal exported for testing */
172
+ function widthToSizeClass(widthPx) {
101
173
  if (widthPx < 600)
102
174
  return "Compact";
103
175
  if (widthPx < 840)
104
176
  return "Medium";
105
177
  return "Expanded";
106
178
  }
107
- export function heightToSizeClass(heightPx) {
179
+ /** @internal exported for testing */
180
+ function heightToSizeClass(heightPx) {
108
181
  if (heightPx < 480)
109
182
  return "Compact";
110
183
  if (heightPx < 900)
111
184
  return "Medium";
112
185
  return "Expanded";
113
186
  }
114
- const windowSizeState = new StateHolder({
115
- widthSizeClass: widthToSizeClass(typeof window !== "undefined" ? window.innerWidth : 1280),
116
- heightSizeClass: heightToSizeClass(typeof window !== "undefined" ? window.innerHeight : 800),
117
- });
118
- if (typeof window !== "undefined") {
119
- window.addEventListener("resize", () => {
120
- windowSizeState.value = {
121
- widthSizeClass: widthToSizeClass(window.innerWidth),
122
- heightSizeClass: heightToSizeClass(window.innerHeight),
123
- };
124
- });
125
- }
126
- export function calculateWindowSizeClass() {
127
- 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;
128
205
  }
129
- export function WindowSizeClassProvider({ children }) {
130
- 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);
131
243
  }
132
- // -- ViewModels -------------------------------------------------------------
133
- export { viewModel as useViewModel } from "./stateflow.js";
134
- // -- Root Rendering ---------------------------------------------------------
135
- let renderCount = 0;
136
- import { patch } from "./dom.js";
137
244
  /**
138
- * 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
+ * ```
139
266
  */
140
- export function render(rootComponent, container) {
141
- // Store the last rendered VNode on the container
142
- let oldVNode = container._jalvin_vnode || null;
143
- const update = () => {
144
- renderCount++;
145
- activeSubscriber = update;
146
- resetHooks();
147
- // Save current active element (focus) and selection
148
- let activeId = "";
149
- if (document.activeElement && document.activeElement.id) {
150
- activeId = document.activeElement.id;
151
- }
152
- else if (document.activeElement && document.activeElement.tagName === "INPUT") {
153
- activeId = document.activeElement.name;
154
- }
155
- const newVNode = rootComponent();
156
- // Patch the DOM instead of recreating it
157
- patch(container, newVNode, oldVNode);
158
- oldVNode = newVNode;
159
- container._jalvin_vnode = oldVNode;
160
- // Restore focus if possible
161
- if (activeId) {
162
- const toFocus = document.getElementById(activeId) || document.querySelector(`input[name="${activeId}"]`);
163
- if (toFocus)
164
- toFocus.focus();
165
- }
166
- activeSubscriber = null;
167
- };
168
- update();
267
+ function calculateWindowSizeClass() {
268
+ const R = getReact();
269
+ return R.useContext(getWindowSizeClassContext());
169
270
  }
170
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.42",
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"}