ilha 0.4.2 → 0.4.3
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/index.js +160 -102
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -275,81 +275,137 @@ function batch(fn) {
|
|
|
275
275
|
endBatch();
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
|
-
function
|
|
278
|
+
function createDerivedProxy(entries, state, input, derivedSnapshot) {
|
|
279
279
|
const envelopes = /* @__PURE__ */ new Map();
|
|
280
|
-
const stops = [];
|
|
281
280
|
for (const entry of entries) {
|
|
282
|
-
|
|
281
|
+
let initialEnvelope;
|
|
282
|
+
if (derivedSnapshot != null && entry.key in derivedSnapshot) initialEnvelope = { ...derivedSnapshot[entry.key] };
|
|
283
|
+
else if (!(entry.fn.constructor.name === "AsyncFunction" || entry.fn.constructor.name === "AsyncGeneratorFunction")) {
|
|
284
|
+
const ac = new AbortController();
|
|
285
|
+
try {
|
|
286
|
+
const result = entry.fn({
|
|
287
|
+
state,
|
|
288
|
+
input,
|
|
289
|
+
signal: ac.signal
|
|
290
|
+
});
|
|
291
|
+
if (!(result instanceof Promise)) initialEnvelope = {
|
|
292
|
+
loading: false,
|
|
293
|
+
value: result,
|
|
294
|
+
error: void 0
|
|
295
|
+
};
|
|
296
|
+
else {
|
|
297
|
+
initialEnvelope = {
|
|
298
|
+
loading: true,
|
|
299
|
+
value: void 0,
|
|
300
|
+
error: void 0
|
|
301
|
+
};
|
|
302
|
+
result.catch(() => {});
|
|
303
|
+
}
|
|
304
|
+
} catch (err) {
|
|
305
|
+
initialEnvelope = {
|
|
306
|
+
loading: false,
|
|
307
|
+
value: void 0,
|
|
308
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
309
|
+
};
|
|
310
|
+
} finally {
|
|
311
|
+
ac.abort();
|
|
312
|
+
}
|
|
313
|
+
} else initialEnvelope = {
|
|
283
314
|
loading: true,
|
|
284
315
|
value: void 0,
|
|
285
316
|
error: void 0
|
|
286
|
-
}
|
|
317
|
+
};
|
|
318
|
+
const env = signal(initialEnvelope);
|
|
287
319
|
envelopes.set(entry.key, env);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
320
|
+
}
|
|
321
|
+
const proxy = new Proxy({}, { get(_, key) {
|
|
322
|
+
const env = envelopes.get(key);
|
|
323
|
+
if (!env) return {
|
|
324
|
+
loading: false,
|
|
325
|
+
value: void 0,
|
|
326
|
+
error: void 0
|
|
327
|
+
};
|
|
328
|
+
return env();
|
|
329
|
+
} });
|
|
330
|
+
const setup = () => {
|
|
331
|
+
const stops = [];
|
|
332
|
+
for (const entry of entries) {
|
|
333
|
+
const env = envelopes.get(entry.key);
|
|
334
|
+
let ac = new AbortController();
|
|
335
|
+
let skipFirst = derivedSnapshot != null && entry.key in derivedSnapshot;
|
|
336
|
+
const stopEffect = effect(() => {
|
|
337
|
+
ac.abort();
|
|
338
|
+
ac = new AbortController();
|
|
339
|
+
const currentAc = ac;
|
|
340
|
+
let result;
|
|
341
|
+
try {
|
|
342
|
+
result = entry.fn({
|
|
343
|
+
state,
|
|
344
|
+
input,
|
|
345
|
+
signal: currentAc.signal
|
|
346
|
+
});
|
|
347
|
+
} catch (err) {
|
|
348
|
+
if (skipFirst) {
|
|
349
|
+
skipFirst = false;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const prevSub = setActiveSub(void 0);
|
|
353
|
+
env({
|
|
354
|
+
loading: false,
|
|
355
|
+
value: void 0,
|
|
356
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
357
|
+
});
|
|
358
|
+
setActiveSub(prevSub);
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
if (skipFirst) {
|
|
362
|
+
skipFirst = false;
|
|
363
|
+
if (result instanceof Promise) result.catch(() => {});
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (!(result instanceof Promise)) {
|
|
367
|
+
const prevSub = setActiveSub(void 0);
|
|
368
|
+
env({
|
|
369
|
+
loading: false,
|
|
370
|
+
value: result,
|
|
371
|
+
error: void 0
|
|
372
|
+
});
|
|
373
|
+
setActiveSub(prevSub);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
305
376
|
const prevSub = setActiveSub(void 0);
|
|
306
377
|
env({
|
|
307
|
-
loading:
|
|
308
|
-
value:
|
|
378
|
+
loading: true,
|
|
379
|
+
value: env().value,
|
|
309
380
|
error: void 0
|
|
310
381
|
});
|
|
311
382
|
setActiveSub(prevSub);
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
error: void 0
|
|
327
|
-
});
|
|
328
|
-
}).catch((err) => {
|
|
329
|
-
if (currentAc.signal.aborted) return;
|
|
330
|
-
env({
|
|
331
|
-
loading: false,
|
|
332
|
-
value: void 0,
|
|
333
|
-
error: err instanceof Error ? err : new Error(String(err))
|
|
383
|
+
result.then((value) => {
|
|
384
|
+
if (currentAc.signal.aborted) return;
|
|
385
|
+
env({
|
|
386
|
+
loading: false,
|
|
387
|
+
value,
|
|
388
|
+
error: void 0
|
|
389
|
+
});
|
|
390
|
+
}).catch((err) => {
|
|
391
|
+
if (currentAc.signal.aborted) return;
|
|
392
|
+
env({
|
|
393
|
+
loading: false,
|
|
394
|
+
value: void 0,
|
|
395
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
396
|
+
});
|
|
334
397
|
});
|
|
335
398
|
});
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
}
|
|
341
|
-
|
|
399
|
+
stops.push(() => {
|
|
400
|
+
stopEffect();
|
|
401
|
+
ac.abort();
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
return () => stops.forEach((s) => s());
|
|
405
|
+
};
|
|
342
406
|
return {
|
|
343
|
-
proxy
|
|
344
|
-
|
|
345
|
-
if (!env) return {
|
|
346
|
-
loading: false,
|
|
347
|
-
value: void 0,
|
|
348
|
-
error: void 0
|
|
349
|
-
};
|
|
350
|
-
return env();
|
|
351
|
-
} }),
|
|
352
|
-
stop: () => stops.forEach((s) => s())
|
|
407
|
+
proxy,
|
|
408
|
+
setup
|
|
353
409
|
};
|
|
354
410
|
}
|
|
355
411
|
function resolveBindConfig(el) {
|
|
@@ -774,8 +830,8 @@ Element: ${host.outerHTML.slice(0, 120)}`);
|
|
|
774
830
|
const result = transition.enter(host);
|
|
775
831
|
if (result instanceof Promise) result.catch(console.error);
|
|
776
832
|
}
|
|
777
|
-
const { proxy: derived,
|
|
778
|
-
|
|
833
|
+
const { proxy: derived, setup: setupDerived } = createDerivedProxy(deriveds, state, input, derivedSnapshot);
|
|
834
|
+
let stopDerived = () => {};
|
|
779
835
|
function reportError(err, source) {
|
|
780
836
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
781
837
|
if (onErrors.length === 0) {
|
|
@@ -947,6 +1003,47 @@ Element: ${host.outerHTML.slice(0, 120)}`);
|
|
|
947
1003
|
}
|
|
948
1004
|
if (userCleanup) cleanups.push(userCleanup);
|
|
949
1005
|
}
|
|
1006
|
+
for (const entry of effects) {
|
|
1007
|
+
let userCleanup;
|
|
1008
|
+
let runController = null;
|
|
1009
|
+
const stopEffect = effect(() => {
|
|
1010
|
+
if (userCleanup) {
|
|
1011
|
+
try {
|
|
1012
|
+
userCleanup();
|
|
1013
|
+
} catch (err) {
|
|
1014
|
+
reportError(err, "effect");
|
|
1015
|
+
}
|
|
1016
|
+
userCleanup = void 0;
|
|
1017
|
+
}
|
|
1018
|
+
if (runController) runController.abort();
|
|
1019
|
+
runController = new AbortController();
|
|
1020
|
+
const runSignal = anySignal([unmountController.signal, runController.signal]);
|
|
1021
|
+
startBatch();
|
|
1022
|
+
try {
|
|
1023
|
+
userCleanup = entry.fn({
|
|
1024
|
+
state,
|
|
1025
|
+
input,
|
|
1026
|
+
host,
|
|
1027
|
+
signal: runSignal
|
|
1028
|
+
});
|
|
1029
|
+
} catch (err) {
|
|
1030
|
+
reportError(err, "effect");
|
|
1031
|
+
} finally {
|
|
1032
|
+
endBatch();
|
|
1033
|
+
}
|
|
1034
|
+
});
|
|
1035
|
+
cleanups.push(() => {
|
|
1036
|
+
stopEffect();
|
|
1037
|
+
if (userCleanup) try {
|
|
1038
|
+
userCleanup();
|
|
1039
|
+
} catch (err) {
|
|
1040
|
+
reportError(err, "effect");
|
|
1041
|
+
}
|
|
1042
|
+
if (runController) runController.abort();
|
|
1043
|
+
});
|
|
1044
|
+
}
|
|
1045
|
+
stopDerived = setupDerived();
|
|
1046
|
+
cleanups.push(stopDerived);
|
|
950
1047
|
let initialized = false;
|
|
951
1048
|
const initialRenderedHtml = initial.html;
|
|
952
1049
|
const stopRender = effect(() => {
|
|
@@ -989,45 +1086,6 @@ Element: ${host.outerHTML.slice(0, 120)}`);
|
|
|
989
1086
|
});
|
|
990
1087
|
cleanups.push(stopRender);
|
|
991
1088
|
cleanups.push(detachListeners);
|
|
992
|
-
for (const entry of effects) {
|
|
993
|
-
let userCleanup;
|
|
994
|
-
let runController = null;
|
|
995
|
-
const stopEffect = effect(() => {
|
|
996
|
-
if (userCleanup) {
|
|
997
|
-
try {
|
|
998
|
-
userCleanup();
|
|
999
|
-
} catch (err) {
|
|
1000
|
-
reportError(err, "effect");
|
|
1001
|
-
}
|
|
1002
|
-
userCleanup = void 0;
|
|
1003
|
-
}
|
|
1004
|
-
if (runController) runController.abort();
|
|
1005
|
-
runController = new AbortController();
|
|
1006
|
-
const runSignal = anySignal([unmountController.signal, runController.signal]);
|
|
1007
|
-
startBatch();
|
|
1008
|
-
try {
|
|
1009
|
-
userCleanup = entry.fn({
|
|
1010
|
-
state,
|
|
1011
|
-
input,
|
|
1012
|
-
host,
|
|
1013
|
-
signal: runSignal
|
|
1014
|
-
});
|
|
1015
|
-
} catch (err) {
|
|
1016
|
-
reportError(err, "effect");
|
|
1017
|
-
} finally {
|
|
1018
|
-
endBatch();
|
|
1019
|
-
}
|
|
1020
|
-
});
|
|
1021
|
-
cleanups.push(() => {
|
|
1022
|
-
stopEffect();
|
|
1023
|
-
if (userCleanup) try {
|
|
1024
|
-
userCleanup();
|
|
1025
|
-
} catch (err) {
|
|
1026
|
-
reportError(err, "effect");
|
|
1027
|
-
}
|
|
1028
|
-
if (runController) runController.abort();
|
|
1029
|
-
});
|
|
1030
|
-
}
|
|
1031
1089
|
let tornDown = false;
|
|
1032
1090
|
const unmount = () => {
|
|
1033
1091
|
if (tornDown) return;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ilha",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "A tiny, framework-free island architecture library",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ryuz <ryuzer@proton.me>",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"test": "bun test"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"alien-signals": "3.
|
|
26
|
+
"alien-signals": "3.2.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"zod": "^4.4.3"
|