@jalvin/runtime 2.0.38 → 2.0.40
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/dist/bibi.d.ts +4 -0
- package/dist/bibi.d.ts.map +1 -1
- package/dist/bibi.js +11 -9
- package/dist/bibi.js.map +1 -1
- package/dist/coroutines.js +22 -47
- package/dist/coroutines.js.map +1 -1
- package/dist/dom.d.ts +15 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +212 -0
- package/dist/dom.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -224
- package/dist/index.js.map +1 -1
- package/dist/stateflow.js +8 -19
- package/dist/stateflow.js.map +1 -1
- package/dist/stdlib/collections.js +55 -108
- package/dist/stdlib/collections.js.map +1 -1
- package/dist/stdlib/conversions.d.ts +2 -0
- package/dist/stdlib/conversions.d.ts.map +1 -1
- package/dist/stdlib/conversions.js +17 -29
- package/dist/stdlib/conversions.js.map +1 -1
- package/dist/stdlib/delegates.js +14 -28
- package/dist/stdlib/delegates.js.map +1 -1
- package/dist/stdlib/equality.js +1 -4
- package/dist/stdlib/equality.js.map +1 -1
- package/dist/stdlib/index.js +12 -28
- package/dist/stdlib/index.js.map +1 -1
- package/dist/stdlib/io.js +2 -6
- package/dist/stdlib/io.js.map +1 -1
- package/dist/stdlib/math.js +29 -37
- package/dist/stdlib/math.js.map +1 -1
- package/dist/stdlib/random.js +3 -8
- package/dist/stdlib/random.js.map +1 -1
- package/dist/stdlib/regex.js +4 -8
- package/dist/stdlib/regex.js.map +1 -1
- package/dist/stdlib/result.js +3 -9
- package/dist/stdlib/result.js.map +1 -1
- package/dist/stdlib/strings.js +24 -51
- package/dist/stdlib/strings.js.map +1 -1
- package/dist/stdlib/timing.js +3 -8
- package/dist/stdlib/timing.js.map +1 -1
- package/dist/stdlib/types.js +13 -29
- package/dist/stdlib/types.js.map +1 -1
- package/dist/ui.d.ts +12 -69
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +130 -228
- package/dist/ui.js.map +1 -1
- package/package.json +4 -12
- package/dist/utils.d.ts +0 -375
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -1180
- package/dist/utils.js.map +0 -1
package/dist/ui.js
CHANGED
|
@@ -1,271 +1,173 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
3
|
-
// Jalvin UI runtime —
|
|
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.
|
|
2
|
+
// Jalvin UI runtime — Vanilla DOM reactivity system
|
|
9
3
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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;
|
|
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;
|
|
32
12
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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;
|
|
36
19
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
* Compiled output:
|
|
44
|
-
* val count = mutableStateOf(0)
|
|
45
|
-
* → const count = mutableStateOf(0);
|
|
46
|
-
* // count.value to read; count.value = x to update
|
|
47
|
-
*/
|
|
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;
|
|
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
|
+
}
|
|
70
26
|
}
|
|
71
|
-
|
|
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;
|
|
72
39
|
}
|
|
73
|
-
// ---------------------------------------------------------------------------
|
|
74
|
-
// remember { } — memoised value across recompositions
|
|
75
|
-
// ---------------------------------------------------------------------------
|
|
76
40
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* val scope = remember { CoroutineScope() }
|
|
41
|
+
* Returns a reactive state holder.
|
|
80
42
|
*/
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
return R.useMemo(compute, deps);
|
|
43
|
+
export function mutableStateOf(initial) {
|
|
44
|
+
return new StateHolder(initial);
|
|
84
45
|
}
|
|
85
46
|
/**
|
|
86
|
-
*
|
|
47
|
+
* Persists a value across re-renders.
|
|
87
48
|
*/
|
|
88
|
-
function
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
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;
|
|
92
65
|
}
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
// collectAsState — subscribe to a StateFlow inside a component
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
66
|
/**
|
|
97
|
-
*
|
|
98
|
-
* the flow emits a new value.
|
|
99
|
-
*
|
|
100
|
-
* val currentName by viewModel.name.collectAsState()
|
|
67
|
+
* Convenience wrapper.
|
|
101
68
|
*/
|
|
102
|
-
function
|
|
103
|
-
|
|
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
|
|
109
|
-
}, [flow]);
|
|
110
|
-
return value;
|
|
69
|
+
export function rememberMutableStateOf(initial) {
|
|
70
|
+
return remember(() => mutableStateOf(initial));
|
|
111
71
|
}
|
|
112
|
-
// ---------------------------------------------------------------------------
|
|
113
|
-
// useViewModel — get or create a ViewModel scoped to a component subtree
|
|
114
|
-
// ---------------------------------------------------------------------------
|
|
115
72
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* val vm = useViewModel("CounterVm") { CounterViewModel() }
|
|
73
|
+
* Collects a StateFlow into reactive state, persisting the subscription across renders.
|
|
119
74
|
*/
|
|
120
|
-
function
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}, []);
|
|
128
|
-
return vm;
|
|
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;
|
|
80
|
+
}, [flow]);
|
|
81
|
+
return state.value;
|
|
129
82
|
}
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// LaunchedEffect — run a suspend block tied to component lifecycle
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
83
|
/**
|
|
134
|
-
* Runs
|
|
135
|
-
*
|
|
136
|
-
* LaunchedEffect(Unit) {
|
|
137
|
-
* repeat(10) { delay(1_000) }
|
|
138
|
-
* }
|
|
84
|
+
* Runs an effect tied to "component" execution.
|
|
139
85
|
*/
|
|
140
|
-
function LaunchedEffect(deps, fn) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
86
|
+
export function LaunchedEffect(deps, fn) {
|
|
87
|
+
remember(() => {
|
|
88
|
+
fn();
|
|
89
|
+
return true;
|
|
151
90
|
}, deps);
|
|
152
91
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const R = getReact();
|
|
158
|
-
R.useEffect(() => {
|
|
159
|
-
const cleanup = fn();
|
|
160
|
-
return cleanup;
|
|
161
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
|
+
export function DisposableEffect(deps, fn) {
|
|
93
|
+
remember(() => {
|
|
94
|
+
fn();
|
|
95
|
+
return true;
|
|
162
96
|
}, deps);
|
|
163
97
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
// ---------------------------------------------------------------------------
|
|
167
|
-
function SideEffect(fn) {
|
|
168
|
-
const R = getReact();
|
|
169
|
-
R.useEffect(fn);
|
|
98
|
+
export function SideEffect(fn) {
|
|
99
|
+
fn();
|
|
170
100
|
}
|
|
171
|
-
|
|
172
|
-
function widthToSizeClass(widthPx) {
|
|
101
|
+
export function widthToSizeClass(widthPx) {
|
|
173
102
|
if (widthPx < 600)
|
|
174
103
|
return "Compact";
|
|
175
104
|
if (widthPx < 840)
|
|
176
105
|
return "Medium";
|
|
177
106
|
return "Expanded";
|
|
178
107
|
}
|
|
179
|
-
|
|
180
|
-
function heightToSizeClass(heightPx) {
|
|
108
|
+
export function heightToSizeClass(heightPx) {
|
|
181
109
|
if (heightPx < 480)
|
|
182
110
|
return "Compact";
|
|
183
111
|
if (heightPx < 900)
|
|
184
112
|
return "Medium";
|
|
185
113
|
return "Expanded";
|
|
186
114
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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;
|
|
205
|
-
}
|
|
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);
|
|
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),
|
|
236
124
|
};
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
export function calculateWindowSizeClass() {
|
|
128
|
+
return windowSizeState.value;
|
|
129
|
+
}
|
|
130
|
+
export function WindowSizeClassProvider({ children }) {
|
|
131
|
+
return children;
|
|
243
132
|
}
|
|
133
|
+
// -- ViewModels -------------------------------------------------------------
|
|
134
|
+
export { viewModel as useViewModel } from "./stateflow.js";
|
|
135
|
+
// -- Root Rendering ---------------------------------------------------------
|
|
136
|
+
let renderCount = 0;
|
|
137
|
+
import { patch } from "./dom.js";
|
|
244
138
|
/**
|
|
245
|
-
*
|
|
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
|
+
* Mounts a Jalvin component to the DOM and sets up the re-render loop.
|
|
266
140
|
*/
|
|
267
|
-
function
|
|
268
|
-
|
|
269
|
-
|
|
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();
|
|
270
172
|
}
|
|
271
173
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,oDAAoD;AACpD,gFAAgF;AAQhF,IAAI,gBAAgB,GAAsB,IAAI,CAAC;AAC/C,IAAI,oBAAoB,GAAG,CAAC,CAAC;AAE7B,MAAM,WAAW;IACP,MAAM,CAAI;IACV,WAAW,GAAG,IAAI,GAAG,EAAc,CAAC;IAC3B,EAAE,GAAG,EAAE,oBAAoB,CAAC;IAE7C,YAAY,OAAU;QACpB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,IAAI,KAAK;QACP,IAAI,gBAAgB,EAAE,CAAC;YACrB,qEAAqE;YACrE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,IAAO;QACf,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAChI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,MAAM;QACZ,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/C,GAAG,EAAE,CAAC;QACR,CAAC;IACH,CAAC;CACF;AAED,8EAA8E;AAE9E,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,IAAI,SAAS,GAAU,EAAE,CAAC;AAE1B,oEAAoE;AACpE,SAAS,UAAU;IACjB,gBAAgB,GAAG,CAAC,CAAC;AACvB,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,OAAU;IAC1C,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAI,OAAgB,EAAE,OAA2B,EAAE;IACzE,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,WAAW,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;IACtF,IAAI,CAAC,WAAW,IAAI,QAAQ,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAI,OAAU;IAClD,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,IAAkB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAwB,EACxB,EAAuB;IAEvB,QAAQ,CAAC,GAAG,EAAE;QACZ,EAAE,EAAE,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAwB,EACxB,EAAsB;IAEtB,QAAQ,CAAC,GAAG,EAAE;QACZ,EAAE,EAAE,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAc;IACvC,EAAE,EAAE,CAAC;AACP,CAAC;AAMD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,QAAQ,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,QAAQ,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,UAAU,CAAC;AACpB,CAAC;AAOD,MAAM,eAAe,GAAG,IAAI,WAAW,CAAuB;IAC5D,cAAc,EAAE,gBAAgB,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1F,eAAe,EAAE,iBAAiB,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;CAC7F,CAAC,CAAC;AAEH,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;QACrC,eAAe,CAAC,KAAK,GAAG;YACtB,cAAc,EAAE,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC;YACnD,eAAe,EAAE,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC;SACvD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,eAAe,CAAC,KAAK,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAE,QAAQ,EAAsB;IACtE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAE9E,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE3D,8EAA8E;AAE9E,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,aAA0B,EAAE,SAAsB;IACvE,iDAAiD;IACjD,IAAI,QAAQ,GAAkB,SAAiB,CAAC,aAAa,IAAI,IAAI,CAAC;IAEtE,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,WAAW,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,cAAc,CAAC,CAAC;QACzD,gBAAgB,GAAG,MAAM,CAAC;QAC1B,UAAU,EAAE,CAAC;QAEb,oDAAoD;QACpD,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACxD,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,CAAC;aAAM,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAChF,QAAQ,GAAI,QAAQ,CAAC,aAAkC,CAAC,IAAI,CAAC;QAC/D,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;QAEjC,yCAAyC;QACzC,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrC,QAAQ,GAAG,QAAQ,CAAC;QACnB,SAAiB,CAAC,aAAa,GAAG,QAAQ,CAAC;QAE5C,4BAA4B;QAC5B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,eAAe,QAAQ,IAAI,CAAC,CAAC;YACzG,IAAI,OAAO;gBAAG,OAAuB,CAAC,KAAK,EAAE,CAAC;QAChD,CAAC;QAED,gBAAgB,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,YAAY,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,EAAE,CAAC;AACX,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jalvin/runtime",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"description": "Jalvin runtime — Bibi HTTP client, coroutines, StateFlow, ViewModel, UI
|
|
3
|
+
"version": "2.0.40",
|
|
4
|
+
"description": "Jalvin runtime — Bibi HTTP client, coroutines, StateFlow, ViewModel, UI reactivity",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"module": "dist/index.js",
|
|
7
8
|
"types": "dist/index.d.ts",
|
|
@@ -18,19 +19,10 @@
|
|
|
18
19
|
"files": [
|
|
19
20
|
"dist"
|
|
20
21
|
],
|
|
21
|
-
"peerDependencies": {
|
|
22
|
-
"react": ">=18.0.0"
|
|
23
|
-
},
|
|
24
|
-
"peerDependenciesMeta": {
|
|
25
|
-
"react": {
|
|
26
|
-
"optional": true
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
22
|
"devDependencies": {
|
|
30
|
-
"typescript": "^5.4.0",
|
|
31
23
|
"@types/node": "^20.0.0",
|
|
32
|
-
"@types/react": "^18.0.0",
|
|
33
24
|
"@vitest/coverage-v8": "^2.1.9",
|
|
25
|
+
"typescript": "^5.4.0",
|
|
34
26
|
"vitest": "^2.1.9"
|
|
35
27
|
},
|
|
36
28
|
"scripts": {
|