tutuca 0.9.53 → 0.9.54

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Zero-dependency batteries included SPA framework.
4
4
 
5
5
  - **Single file, no build, no dependencies, no setup** — a script tag is all you need
6
- - **Batteries included** — state management, side effects, automatic memoization, drag and drop and more
6
+ - **Batteries included** — state management, side effects, automatic memoization, drag and drop, testing, CLI tooling, LLM skills and more
7
7
  - **Fits in your head** (and the context window)
8
8
  - **View source friendly** — step through the whole stack
9
9
  - **As much HTML as possible, as little JS as needed**
@@ -3615,16 +3615,25 @@ function getFieldMethods(field) {
3615
3615
  name: `reset${uname}`,
3616
3616
  sig: `reset${uname}()`,
3617
3617
  desc: "Reset to default value"
3618
- },
3618
+ }
3619
+ ];
3620
+ const truthy = [
3619
3621
  {
3620
- name: `is${uname}NotSet`,
3621
- sig: `is${uname}NotSet()`,
3622
- desc: "Check if null/undefined"
3622
+ name: `is${uname}Truthy`,
3623
+ sig: `is${uname}Truthy()`,
3624
+ desc: "Check if value is truthy"
3623
3625
  },
3624
3626
  {
3625
- name: `is${uname}Set`,
3626
- sig: `is${uname}Set()`,
3627
- desc: "Check if not null/undefined"
3627
+ name: `is${uname}Falsy`,
3628
+ sig: `is${uname}Falsy()`,
3629
+ desc: "Check if value is falsy"
3630
+ }
3631
+ ];
3632
+ const nullable = [
3633
+ {
3634
+ name: `is${uname}Null`,
3635
+ sig: `is${uname}Null()`,
3636
+ desc: "Check if value is null/undefined"
3628
3637
  }
3629
3638
  ];
3630
3639
  switch (type3) {
@@ -3634,21 +3643,28 @@ function getFieldMethods(field) {
3634
3643
  name: `toggle${uname}`,
3635
3644
  sig: `toggle${uname}()`,
3636
3645
  desc: "Toggle boolean value"
3637
- });
3646
+ }, ...truthy);
3647
+ break;
3648
+ case "int":
3649
+ case "float":
3650
+ methods.push(...truthy);
3651
+ break;
3652
+ case "any":
3653
+ methods.push(...nullable, ...truthy);
3638
3654
  break;
3639
3655
  case "text":
3640
3656
  methods.push({
3641
3657
  name: `is${uname}Empty`,
3642
3658
  sig: `is${uname}Empty()`,
3643
3659
  desc: "Check if string is empty"
3644
- }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get string length" });
3660
+ }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get string length" }, ...truthy);
3645
3661
  break;
3646
3662
  case "list":
3647
3663
  methods.push({
3648
3664
  name: `is${uname}Empty`,
3649
3665
  sig: `is${uname}Empty()`,
3650
3666
  desc: "Check if list is empty"
3651
- }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get list size" }, {
3667
+ }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get list size" }, ...truthy, {
3652
3668
  name: `setIn${uname}At`,
3653
3669
  sig: `setIn${uname}At(i, v)`,
3654
3670
  desc: "Set item at index"
@@ -3689,7 +3705,7 @@ function getFieldMethods(field) {
3689
3705
  name: `${name}Len`,
3690
3706
  sig: `${name}Len()`,
3691
3707
  desc: `Get ${label} size`
3692
- }, {
3708
+ }, ...truthy, {
3693
3709
  name: `setIn${uname}At`,
3694
3710
  sig: `setIn${uname}At(key, v)`,
3695
3711
  desc: "Set value at key"
@@ -3717,7 +3733,7 @@ function getFieldMethods(field) {
3717
3733
  name: `is${uname}Empty`,
3718
3734
  sig: `is${uname}Empty()`,
3719
3735
  desc: "Check if set is empty"
3720
- }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get set size" }, {
3736
+ }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get set size" }, ...truthy, {
3721
3737
  name: `addIn${uname}`,
3722
3738
  sig: `addIn${uname}(v)`,
3723
3739
  desc: "Add value to set"
@@ -3739,6 +3755,9 @@ function getFieldMethods(field) {
3739
3755
  desc: "Toggle value in set"
3740
3756
  });
3741
3757
  break;
3758
+ default:
3759
+ methods.push(...nullable, ...truthy);
3760
+ break;
3742
3761
  }
3743
3762
  return methods;
3744
3763
  }
@@ -5406,15 +5425,13 @@ class Components {
5406
5425
  return v?.[this.getComponentSymbol]?.() ?? null;
5407
5426
  }
5408
5427
  getOnEnterFor(v) {
5409
- const comp = this.getCompFor(v);
5410
- return comp ? comp.on.stackEnter : defaultOnStackEnter;
5428
+ return this.getCompFor(v)?.on.stackEnter ?? defaultOnStackEnter;
5411
5429
  }
5412
5430
  getHandlerFor(v, name, key) {
5413
5431
  return this.getCompFor(v)?.[key][name] ?? null;
5414
5432
  }
5415
5433
  getRequestFor(v, name) {
5416
- const comp = this.getCompFor(v);
5417
- return comp ? comp.scope.lookupRequest(name) : null;
5434
+ return this.getCompFor(v)?.scope.lookupRequest(name) ?? null;
5418
5435
  }
5419
5436
  compileStyles() {
5420
5437
  const styles2 = [];
@@ -8510,15 +8510,13 @@ class Components {
8510
8510
  return v?.[this.getComponentSymbol]?.() ?? null;
8511
8511
  }
8512
8512
  getOnEnterFor(v) {
8513
- const comp = this.getCompFor(v);
8514
- return comp ? comp.on.stackEnter : defaultOnStackEnter;
8513
+ return this.getCompFor(v)?.on.stackEnter ?? defaultOnStackEnter;
8515
8514
  }
8516
8515
  getHandlerFor(v, name, key) {
8517
8516
  return this.getCompFor(v)?.[key][name] ?? null;
8518
8517
  }
8519
8518
  getRequestFor(v, name) {
8520
- const comp = this.getCompFor(v);
8521
- return comp ? comp.scope.lookupRequest(name) : null;
8519
+ return this.getCompFor(v)?.scope.lookupRequest(name) ?? null;
8522
8520
  }
8523
8521
  compileStyles() {
8524
8522
  const styles2 = [];
@@ -8603,8 +8601,7 @@ class DynamicAlias extends Dynamic {
8603
8601
  this.dynName = dynName;
8604
8602
  }
8605
8603
  _resolveSymbol(stack) {
8606
- const t = stack.lookupType(this.compName);
8607
- return t?.dynamic[this.dynName]?.symbol ?? null;
8604
+ return stack.lookupType(this.compName)?.dynamic[this.dynName]?.symbol ?? null;
8608
8605
  }
8609
8606
  getSymbol(stack) {
8610
8607
  this.symbol ??= this._resolveSymbol(stack);
@@ -8652,9 +8649,8 @@ class Component {
8652
8649
  } else if (isString(dinfo?.default) && isString(dinfo?.for)) {
8653
8650
  const val = vp.parseDynamic(dinfo.default, this.views.main.ctx);
8654
8651
  const [compName, dynName] = dinfo.for.split(".");
8655
- if (isString(compName) && isString(dynName)) {
8652
+ if (isString(compName) && isString(dynName))
8656
8653
  this.dynamic[key] = new DynamicAlias(key, val, compName, dynName);
8657
- }
8658
8654
  }
8659
8655
  }
8660
8656
  for (const name in this.views)
@@ -14869,16 +14865,25 @@ function getFieldMethods(field) {
14869
14865
  name: `reset${uname}`,
14870
14866
  sig: `reset${uname}()`,
14871
14867
  desc: "Reset to default value"
14872
- },
14868
+ }
14869
+ ];
14870
+ const truthy = [
14873
14871
  {
14874
- name: `is${uname}NotSet`,
14875
- sig: `is${uname}NotSet()`,
14876
- desc: "Check if null/undefined"
14872
+ name: `is${uname}Truthy`,
14873
+ sig: `is${uname}Truthy()`,
14874
+ desc: "Check if value is truthy"
14877
14875
  },
14878
14876
  {
14879
- name: `is${uname}Set`,
14880
- sig: `is${uname}Set()`,
14881
- desc: "Check if not null/undefined"
14877
+ name: `is${uname}Falsy`,
14878
+ sig: `is${uname}Falsy()`,
14879
+ desc: "Check if value is falsy"
14880
+ }
14881
+ ];
14882
+ const nullable = [
14883
+ {
14884
+ name: `is${uname}Null`,
14885
+ sig: `is${uname}Null()`,
14886
+ desc: "Check if value is null/undefined"
14882
14887
  }
14883
14888
  ];
14884
14889
  switch (type3) {
@@ -14888,21 +14893,28 @@ function getFieldMethods(field) {
14888
14893
  name: `toggle${uname}`,
14889
14894
  sig: `toggle${uname}()`,
14890
14895
  desc: "Toggle boolean value"
14891
- });
14896
+ }, ...truthy);
14897
+ break;
14898
+ case "int":
14899
+ case "float":
14900
+ methods.push(...truthy);
14901
+ break;
14902
+ case "any":
14903
+ methods.push(...nullable, ...truthy);
14892
14904
  break;
14893
14905
  case "text":
14894
14906
  methods.push({
14895
14907
  name: `is${uname}Empty`,
14896
14908
  sig: `is${uname}Empty()`,
14897
14909
  desc: "Check if string is empty"
14898
- }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get string length" });
14910
+ }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get string length" }, ...truthy);
14899
14911
  break;
14900
14912
  case "list":
14901
14913
  methods.push({
14902
14914
  name: `is${uname}Empty`,
14903
14915
  sig: `is${uname}Empty()`,
14904
14916
  desc: "Check if list is empty"
14905
- }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get list size" }, {
14917
+ }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get list size" }, ...truthy, {
14906
14918
  name: `setIn${uname}At`,
14907
14919
  sig: `setIn${uname}At(i, v)`,
14908
14920
  desc: "Set item at index"
@@ -14943,7 +14955,7 @@ function getFieldMethods(field) {
14943
14955
  name: `${name}Len`,
14944
14956
  sig: `${name}Len()`,
14945
14957
  desc: `Get ${label} size`
14946
- }, {
14958
+ }, ...truthy, {
14947
14959
  name: `setIn${uname}At`,
14948
14960
  sig: `setIn${uname}At(key, v)`,
14949
14961
  desc: "Set value at key"
@@ -14971,7 +14983,7 @@ function getFieldMethods(field) {
14971
14983
  name: `is${uname}Empty`,
14972
14984
  sig: `is${uname}Empty()`,
14973
14985
  desc: "Check if set is empty"
14974
- }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get set size" }, {
14986
+ }, { name: `${name}Len`, sig: `${name}Len()`, desc: "Get set size" }, ...truthy, {
14975
14987
  name: `addIn${uname}`,
14976
14988
  sig: `addIn${uname}(v)`,
14977
14989
  desc: "Add value to set"
@@ -14993,6 +15005,9 @@ function getFieldMethods(field) {
14993
15005
  desc: "Toggle value in set"
14994
15006
  });
14995
15007
  break;
15008
+ default:
15009
+ methods.push(...nullable, ...truthy);
15010
+ break;
14996
15011
  }
14997
15012
  return methods;
14998
15013
  }