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.
Files changed (2) hide show
  1. package/dist/index.js +160 -102
  2. 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 buildDerivedSignals(entries, state, input, derivedSnapshot) {
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
- const env = signal(derivedSnapshot?.[entry.key] ?? {
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
- let ac = new AbortController();
289
- let skipFirst = derivedSnapshot != null && entry.key in derivedSnapshot;
290
- const stopEffect = effect(() => {
291
- ac.abort();
292
- ac = new AbortController();
293
- const currentAc = ac;
294
- const result = entry.fn({
295
- state,
296
- input,
297
- signal: currentAc.signal
298
- });
299
- if (skipFirst) {
300
- skipFirst = false;
301
- if (result instanceof Promise) result.catch(() => {});
302
- return;
303
- }
304
- if (!(result instanceof Promise)) {
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: false,
308
- value: result,
378
+ loading: true,
379
+ value: env().value,
309
380
  error: void 0
310
381
  });
311
382
  setActiveSub(prevSub);
312
- return;
313
- }
314
- const prevSub = setActiveSub(void 0);
315
- env({
316
- loading: true,
317
- value: env().value,
318
- error: void 0
319
- });
320
- setActiveSub(prevSub);
321
- result.then((value) => {
322
- if (currentAc.signal.aborted) return;
323
- env({
324
- loading: false,
325
- value,
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
- stops.push(() => {
338
- stopEffect();
339
- ac.abort();
340
- });
341
- }
399
+ stops.push(() => {
400
+ stopEffect();
401
+ ac.abort();
402
+ });
403
+ }
404
+ return () => stops.forEach((s) => s());
405
+ };
342
406
  return {
343
- proxy: new Proxy({}, { get(_, key) {
344
- const env = envelopes.get(key);
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, stop: stopDerived } = buildDerivedSignals(deriveds, state, input, derivedSnapshot);
778
- cleanups.push(stopDerived);
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.2",
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.1.2"
26
+ "alien-signals": "3.2.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "zod": "^4.4.3"