@joist/templating 4.5.0 → 4.6.0

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 (78) hide show
  1. package/package.json +1 -1
  2. package/src/lib/bind.ts +13 -4
  3. package/src/lib/elements/async.element.ts +4 -4
  4. package/src/lib/elements/bind.element.test.ts +2 -2
  5. package/src/lib/elements/bind.element.ts +4 -2
  6. package/src/lib/elements/for.element.test.ts +10 -10
  7. package/src/lib/elements/for.element.ts +5 -3
  8. package/src/lib/elements/if.element.ts +4 -2
  9. package/src/lib/events.ts +2 -2
  10. package/src/lib/expression.ts +4 -3
  11. package/target/lib/bind.d.ts +6 -1
  12. package/target/lib/bind.d.ts.map +1 -0
  13. package/target/lib/bind.js +8 -3
  14. package/target/lib/bind.js.map +1 -1
  15. package/target/lib/bind.test.d.ts +1 -0
  16. package/target/lib/bind.test.d.ts.map +1 -0
  17. package/target/lib/bind.test.js +35 -1
  18. package/target/lib/bind.test.js.map +1 -1
  19. package/target/lib/define.d.ts +1 -0
  20. package/target/lib/define.d.ts.map +1 -0
  21. package/target/lib/elements/async.element.d.ts +1 -0
  22. package/target/lib/elements/async.element.d.ts.map +1 -0
  23. package/target/lib/elements/async.element.js +37 -2
  24. package/target/lib/elements/async.element.js.map +1 -1
  25. package/target/lib/elements/async.element.test.d.ts +1 -0
  26. package/target/lib/elements/async.element.test.d.ts.map +1 -0
  27. package/target/lib/elements/async.element.test.js +11 -0
  28. package/target/lib/elements/async.element.test.js.map +1 -1
  29. package/target/lib/elements/bind.element.d.ts +1 -0
  30. package/target/lib/elements/bind.element.d.ts.map +1 -0
  31. package/target/lib/elements/bind.element.js +39 -3
  32. package/target/lib/elements/bind.element.js.map +1 -1
  33. package/target/lib/elements/bind.element.test.d.ts +1 -0
  34. package/target/lib/elements/bind.element.test.d.ts.map +1 -0
  35. package/target/lib/elements/bind.element.test.js +3 -0
  36. package/target/lib/elements/bind.element.test.js.map +1 -1
  37. package/target/lib/elements/for.element.d.ts +1 -0
  38. package/target/lib/elements/for.element.d.ts.map +1 -0
  39. package/target/lib/elements/for.element.js +47 -3
  40. package/target/lib/elements/for.element.js.map +1 -1
  41. package/target/lib/elements/for.element.test.d.ts +1 -0
  42. package/target/lib/elements/for.element.test.d.ts.map +1 -0
  43. package/target/lib/elements/for.element.test.js +44 -0
  44. package/target/lib/elements/for.element.test.js.map +1 -1
  45. package/target/lib/elements/if.element.d.ts +1 -0
  46. package/target/lib/elements/if.element.d.ts.map +1 -0
  47. package/target/lib/elements/if.element.js +39 -2
  48. package/target/lib/elements/if.element.js.map +1 -1
  49. package/target/lib/elements/if.element.test.d.ts +1 -0
  50. package/target/lib/elements/if.element.test.d.ts.map +1 -0
  51. package/target/lib/elements/if.element.test.js +3 -0
  52. package/target/lib/elements/if.element.test.js.map +1 -1
  53. package/target/lib/elements/scope.element.d.ts +1 -0
  54. package/target/lib/elements/scope.element.d.ts.map +1 -0
  55. package/target/lib/elements/scope.element.js +35 -1
  56. package/target/lib/elements/scope.element.js.map +1 -1
  57. package/target/lib/elements/scope.element.test.d.ts +1 -0
  58. package/target/lib/elements/scope.element.test.d.ts.map +1 -0
  59. package/target/lib/elements/scope.element.test.js +1 -0
  60. package/target/lib/elements/scope.element.test.js.map +1 -1
  61. package/target/lib/elements/value.element.d.ts +1 -0
  62. package/target/lib/elements/value.element.d.ts.map +1 -0
  63. package/target/lib/elements/value.element.js +35 -1
  64. package/target/lib/elements/value.element.js.map +1 -1
  65. package/target/lib/elements/value.element.test.d.ts +1 -0
  66. package/target/lib/elements/value.element.test.d.ts.map +1 -0
  67. package/target/lib/elements/value.element.test.js +3 -0
  68. package/target/lib/elements/value.element.test.js.map +1 -1
  69. package/target/lib/events.d.ts +3 -2
  70. package/target/lib/events.d.ts.map +1 -0
  71. package/target/lib/expression.d.ts +52 -0
  72. package/target/lib/expression.d.ts.map +1 -0
  73. package/target/lib/expression.js +67 -1
  74. package/target/lib/expression.js.map +1 -1
  75. package/target/lib/expression.test.d.ts +1 -0
  76. package/target/lib/expression.test.d.ts.map +1 -0
  77. package/target/lib.d.ts +1 -0
  78. package/target/lib.d.ts.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"value.element.js","sourceRoot":"","sources":["../../../src/lib/elements/value.element.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;IAMlC,iBAAiB;4BAJ7B,OAAO,CAAC;YAEP,SAAS,EAAE,CAAC,GAAG,CAAA,2BAA2B,EAAE,IAAI,CAAA,eAAe,CAAC;SACjE,CAAC;;;;sBACqC,WAAW;;;;;;;iCAAnB,SAAQ,WAAW;;;;gCAC/C,IAAI,EAAE;qCAGN,IAAI,CAAC;oBACJ,IAAI,EAAE,YAAY;iBACnB,CAAC;YAJF,iKAAS,IAAI,6BAAJ,IAAI,mFAAM;YAKnB,gLAAS,SAAS,6BAAT,SAAS,6FAAM;YAP1B,6KAgCC;;;YAhCY,uDAAiB;;QAE5B,qEAAgB,EAAE,EAAC;QAAnB,IAAS,IAAI,0CAAM;QAAnB,IAAS,IAAI,gDAAM;QAKnB,kIAAqB,EAAE,GAAC;QAAxB,IAAS,SAAS,+CAAM;QAAxB,IAAS,SAAS,qDAAM;QAExB,KAAK,CAAC,iBAAiB;YACrB,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAC/E,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,aAAa,CAChB,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAEpD,IACE,YAAY,KAAK,IAAI;oBACrB,YAAY,KAAK,SAAS;oBAC1B,IAAI,CAAC,WAAW,KAAK,YAAY,EACjC,CAAC;oBACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;;;;;;;;SA/BU,iBAAiB"}
1
+ {"version":3,"file":"value.element.js","sourceRoot":"","sources":["../../../src/lib/elements/value.element.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;IAMlC,iBAAiB;4BAJ7B,OAAO,CAAC;YACP,kBAAkB;YAClB,SAAS,EAAE,CAAC,GAAG,CAAA,2BAA2B,EAAE,IAAI,CAAA,eAAe,CAAC;SACjE,CAAC;;;;sBACqC,WAAW;;;;;;;iCAAnB,SAAQ,WAAW;;;;gCAC/C,IAAI,EAAE;qCAGN,IAAI,CAAC;oBACJ,IAAI,EAAE,YAAY;iBACnB,CAAC;YAJF,iKAAS,IAAI,6BAAJ,IAAI,mFAAM;YAKnB,gLAAS,SAAS,6BAAT,SAAS,6FAAM;YAP1B,6KAgCC;;;YAhCY,uDAAiB;;QAE5B,qEAAgB,EAAE,EAAC;QAAnB,IAAS,IAAI,0CAAM;QAAnB,IAAS,IAAI,gDAAM;QAKnB,kIAAqB,EAAE,GAAC;QAAxB,IAAS,SAAS,+CAAM;QAAxB,IAAS,SAAS,qDAAM;QAExB,KAAK,CAAC,iBAAiB;YACrB,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAC/E,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,aAAa,CAChB,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAEpD,IACE,YAAY,KAAK,IAAI;oBACrB,YAAY,KAAK,SAAS;oBAC1B,IAAI,CAAC,WAAW,KAAK,YAAY,EACjC,CAAC;oBACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;;;;;;;;SA/BU,iBAAiB"}
@@ -1 +1,2 @@
1
1
  import "../define.js";
2
+ //# sourceMappingURL=value.element.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value.element.test.d.ts","sourceRoot":"","sources":["../../../src/lib/elements/value.element.test.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC"}
@@ -55,11 +55,14 @@ it("should wait for depends-on before dispatching events", async () => {
55
55
  <j-val bind="test" depends-on="dependency-1,dependency-2"></j-val>
56
56
  </div>
57
57
  `);
58
+ // Initially, no event should be dispatched
58
59
  assert.isFalse(eventDispatched);
60
+ // Wait for the custom elements to be defined
59
61
  await Promise.all([
60
62
  customElements.whenDefined("dependency-1"),
61
63
  customElements.whenDefined("dependency-2"),
62
64
  ]);
65
+ // Now the event should be dispatched
63
66
  assert.isTrue(eventDispatched);
64
67
  });
65
68
  //# sourceMappingURL=value.element.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"value.element.test.js","sourceRoot":"","sources":["../../../src/lib/elements/value.element.test.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAI9B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACxD,CAAC;;;;GAIJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACrD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;;;;GAIJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;;;;GAIJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACpE,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,cAAc,CAAC,MAAM,CAAC,cAAc,EAAE,KAAM,SAAQ,WAAW;KAAG,CAAC,CAAC;IACpE,cAAc,CAAC,MAAM,CAAC,cAAc,EAAE,KAAM,SAAQ,WAAW;KAAG,CAAC,CAAC;IAEpE,WAAW,CAAC,IAAI,CAAA;;sBAEI,CAAC,CAAkB,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACnC,eAAe,GAAG,IAAI,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;;;;GAIJ,CAAC,CAAC;IAGH,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAGhC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC;QAC1C,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC;KAC3C,CAAC,CAAC;IAGH,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"value.element.test.js","sourceRoot":"","sources":["../../../src/lib/elements/value.element.test.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAI9B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACxD,CAAC;;;;GAIJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACrD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;;;;GAIJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;;;;GAIJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACpE,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,cAAc,CAAC,MAAM,CAAC,cAAc,EAAE,KAAM,SAAQ,WAAW;KAAG,CAAC,CAAC;IACpE,cAAc,CAAC,MAAM,CAAC,cAAc,EAAE,KAAM,SAAQ,WAAW;KAAG,CAAC,CAAC;IAEpE,WAAW,CAAC,IAAI,CAAA;;sBAEI,CAAC,CAAkB,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACnC,eAAe,GAAG,IAAI,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;;;;GAIJ,CAAC,CAAC;IAEH,2CAA2C;IAC3C,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,6CAA6C;IAC7C,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC;QAC1C,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC;KAC3C,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC"}
@@ -6,11 +6,12 @@ declare global {
6
6
  }
7
7
  }
8
8
  export interface BindChange<T> extends Change<T> {
9
- alwaysUpdate?: boolean;
10
- firstChange?: boolean;
9
+ alwaysUpdate?: boolean | undefined;
10
+ firstChange?: boolean | undefined;
11
11
  }
12
12
  export declare class JoistValueEvent extends Event {
13
13
  readonly expression: JExpression;
14
14
  readonly update: (value: BindChange<unknown>) => void;
15
15
  constructor(expression: JExpression, update: (value: BindChange<unknown>) => void);
16
16
  }
17
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/lib/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,eAAe;QACvB,cAAc,EAAE,eAAe,CAAC;KACjC;CACF;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;gBAE1C,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI;CAMlF"}
@@ -1,13 +1,65 @@
1
+ /**
2
+ * JExpression represents a token that can be used to extract and compare values from objects.
3
+ *
4
+ * Supported operators:
5
+ * - `==` : Equality comparison (e.g., "status==active")
6
+ * - `!=` : Inequality comparison (e.g., "status!=active")
7
+ * - `>` : Greater than comparison (e.g., "count>5")
8
+ * - `<` : Less than comparison (e.g., "count<10")
9
+ *
10
+ * Examples:
11
+ * ```typescript
12
+ * // Basic path access
13
+ * new JExpression("user.name").readTokenValueFrom({ user: { name: "John" } }) // "John"
14
+ *
15
+ * // Equality comparison
16
+ * new JExpression("status == active").readTokenValueFrom({ status: "active" }) // true
17
+ *
18
+ * // Inequality comparison
19
+ * new JExpression("status != active").readTokenValueFrom({ status: "inactive" }) // true
20
+ *
21
+ * // Greater than comparison
22
+ * new JExpression("count > 5").readTokenValueFrom({ count: 10 }) // true
23
+ *
24
+ * // Less than comparison
25
+ * new JExpression("count < 10").readTokenValueFrom({ count: 5 }) // true
26
+ *
27
+ * // With negation
28
+ * new JExpression("!status == active").readTokenValueFrom({ status: "inactive" }) // true
29
+ *
30
+ * // Nested paths
31
+ * new JExpression("user.score > 100").readTokenValueFrom({ user: { score: 150 } }) // true
32
+ * ```
33
+ */
1
34
  export declare class JExpression {
2
35
  #private;
36
+ /** The raw token string as provided to the constructor */
3
37
  rawToken: string;
38
+ /** Whether the token is negated (starts with '!') */
4
39
  isNegated: boolean;
40
+ /** The first part of the path (before the first dot) */
5
41
  bindTo: string;
42
+ /** The remaining parts of the path (after the first dot) */
6
43
  path: string[];
44
+ /** The value to compare against for equality (==) */
7
45
  equalsValue: string | undefined;
46
+ /** The value to compare against for inequality (!=) */
8
47
  notEqualsValue: string | undefined;
48
+ /** The value to compare against for greater than (>) */
9
49
  gtValue: string | undefined;
50
+ /** The value to compare against for less than (<) */
10
51
  ltValue: string | undefined;
52
+ /**
53
+ * Creates a new JExpression instance.
54
+ * @param rawToken - The token string to parse. Can include operators (==, !=, >, <) and negation (!)
55
+ */
11
56
  constructor(rawToken: string);
57
+ /**
58
+ * Reads a value from the provided object using the token's path and performs any comparison.
59
+ * @param value - The object to read from
60
+ * @returns The value at the path, or the result of the comparison if an operator is present
61
+ * @template T - The expected return type
62
+ */
12
63
  evaluate<T = unknown>(value: unknown): T;
13
64
  }
65
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/lib/expression.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,WAAW;;IACtB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,UAAS;IAClB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,IAAI,EAAE,MAAM,EAAE,CAAM;IACpB,qDAAqD;IACrD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,uDAAuD;IACvD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,wDAAwD;IACxD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,qDAAqD;IACrD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B;;;OAGG;gBACS,QAAQ,EAAE,MAAM;IA0B5B;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC;CAoFzC"}
@@ -1,12 +1,57 @@
1
+ /**
2
+ * JExpression represents a token that can be used to extract and compare values from objects.
3
+ *
4
+ * Supported operators:
5
+ * - `==` : Equality comparison (e.g., "status==active")
6
+ * - `!=` : Inequality comparison (e.g., "status!=active")
7
+ * - `>` : Greater than comparison (e.g., "count>5")
8
+ * - `<` : Less than comparison (e.g., "count<10")
9
+ *
10
+ * Examples:
11
+ * ```typescript
12
+ * // Basic path access
13
+ * new JExpression("user.name").readTokenValueFrom({ user: { name: "John" } }) // "John"
14
+ *
15
+ * // Equality comparison
16
+ * new JExpression("status == active").readTokenValueFrom({ status: "active" }) // true
17
+ *
18
+ * // Inequality comparison
19
+ * new JExpression("status != active").readTokenValueFrom({ status: "inactive" }) // true
20
+ *
21
+ * // Greater than comparison
22
+ * new JExpression("count > 5").readTokenValueFrom({ count: 10 }) // true
23
+ *
24
+ * // Less than comparison
25
+ * new JExpression("count < 10").readTokenValueFrom({ count: 5 }) // true
26
+ *
27
+ * // With negation
28
+ * new JExpression("!status == active").readTokenValueFrom({ status: "inactive" }) // true
29
+ *
30
+ * // Nested paths
31
+ * new JExpression("user.score > 100").readTokenValueFrom({ user: { score: 150 } }) // true
32
+ * ```
33
+ */
1
34
  export class JExpression {
35
+ /** The raw token string as provided to the constructor */
2
36
  rawToken;
37
+ /** Whether the token is negated (starts with '!') */
3
38
  isNegated = false;
39
+ /** The first part of the path (before the first dot) */
4
40
  bindTo;
41
+ /** The remaining parts of the path (after the first dot) */
5
42
  path = [];
43
+ /** The value to compare against for equality (==) */
6
44
  equalsValue;
45
+ /** The value to compare against for inequality (!=) */
7
46
  notEqualsValue;
47
+ /** The value to compare against for greater than (>) */
8
48
  gtValue;
49
+ /** The value to compare against for less than (<) */
9
50
  ltValue;
51
+ /**
52
+ * Creates a new JExpression instance.
53
+ * @param rawToken - The token string to parse. Can include operators (==, !=, >, <) and negation (!)
54
+ */
10
55
  constructor(rawToken) {
11
56
  this.rawToken = rawToken;
12
57
  this.isNegated = this.rawToken.startsWith("!");
@@ -14,6 +59,7 @@ export class JExpression {
14
59
  this.path = path;
15
60
  this.bindTo = this.path.shift() ?? "";
16
61
  this.bindTo = this.bindTo.replaceAll("!", "");
62
+ // Set the appropriate comparison value based on the operator
17
63
  switch (operator) {
18
64
  case "==":
19
65
  this.equalsValue = value;
@@ -29,6 +75,12 @@ export class JExpression {
29
75
  break;
30
76
  }
31
77
  }
78
+ /**
79
+ * Reads a value from the provided object using the token's path and performs any comparison.
80
+ * @param value - The object to read from
81
+ * @returns The value at the path, or the result of the comparison if an operator is present
82
+ * @template T - The expected return type
83
+ */
32
84
  evaluate(value) {
33
85
  if (typeof value !== "object" && typeof value !== "string") {
34
86
  return value;
@@ -36,13 +88,17 @@ export class JExpression {
36
88
  const pathValue = this.#getValueAtPath(value);
37
89
  return this.#performComparison(pathValue);
38
90
  }
91
+ /**
92
+ * Parses the raw token into its components.
93
+ * @returns An object containing the path parts and any comparison operator/value
94
+ */
39
95
  #parseToken() {
40
96
  const operators = ["==", "!=", ">", "<"];
41
97
  for (const operator of operators) {
42
98
  if (this.rawToken.includes(operator)) {
43
99
  const [tokenPart, value] = this.rawToken.split(operator).map((part) => part.trim());
44
100
  return {
45
- path: tokenPart.split("."),
101
+ path: tokenPart?.split(".") ?? [],
46
102
  value,
47
103
  operator,
48
104
  };
@@ -52,6 +108,11 @@ export class JExpression {
52
108
  path: this.rawToken.split("."),
53
109
  };
54
110
  }
111
+ /**
112
+ * Gets the value at the token's path in the provided object.
113
+ * @param value - The object to read from
114
+ * @returns The value at the path, or undefined if the path doesn't exist
115
+ */
55
116
  #getValueAtPath(value) {
56
117
  if (value === null || value === undefined) {
57
118
  return value;
@@ -68,6 +129,11 @@ export class JExpression {
68
129
  }
69
130
  return pointer;
70
131
  }
132
+ /**
133
+ * Performs the comparison operation if an operator is present.
134
+ * @param value - The value to compare
135
+ * @returns The result of the comparison, or the original value if no operator is present
136
+ */
71
137
  #performComparison(value) {
72
138
  if (this.equalsValue !== undefined) {
73
139
  return String(value) === this.equalsValue;
@@ -1 +1 @@
1
- {"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/lib/expression.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/lib/expression.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=expression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.test.d.ts","sourceRoot":"","sources":["../../src/lib/expression.test.ts"],"names":[],"mappings":""}
package/target/lib.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { bind } from "./lib/bind.js";
2
2
  export { JoistValueEvent } from "./lib/events.js";
3
+ //# sourceMappingURL=lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}