@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.
- package/package.json +1 -1
- package/src/lib/bind.ts +13 -4
- package/src/lib/elements/async.element.ts +4 -4
- package/src/lib/elements/bind.element.test.ts +2 -2
- package/src/lib/elements/bind.element.ts +4 -2
- package/src/lib/elements/for.element.test.ts +10 -10
- package/src/lib/elements/for.element.ts +5 -3
- package/src/lib/elements/if.element.ts +4 -2
- package/src/lib/events.ts +2 -2
- package/src/lib/expression.ts +4 -3
- package/target/lib/bind.d.ts +6 -1
- package/target/lib/bind.d.ts.map +1 -0
- package/target/lib/bind.js +8 -3
- package/target/lib/bind.js.map +1 -1
- package/target/lib/bind.test.d.ts +1 -0
- package/target/lib/bind.test.d.ts.map +1 -0
- package/target/lib/bind.test.js +35 -1
- package/target/lib/bind.test.js.map +1 -1
- package/target/lib/define.d.ts +1 -0
- package/target/lib/define.d.ts.map +1 -0
- package/target/lib/elements/async.element.d.ts +1 -0
- package/target/lib/elements/async.element.d.ts.map +1 -0
- package/target/lib/elements/async.element.js +37 -2
- package/target/lib/elements/async.element.js.map +1 -1
- package/target/lib/elements/async.element.test.d.ts +1 -0
- package/target/lib/elements/async.element.test.d.ts.map +1 -0
- package/target/lib/elements/async.element.test.js +11 -0
- package/target/lib/elements/async.element.test.js.map +1 -1
- package/target/lib/elements/bind.element.d.ts +1 -0
- package/target/lib/elements/bind.element.d.ts.map +1 -0
- package/target/lib/elements/bind.element.js +39 -3
- package/target/lib/elements/bind.element.js.map +1 -1
- package/target/lib/elements/bind.element.test.d.ts +1 -0
- package/target/lib/elements/bind.element.test.d.ts.map +1 -0
- package/target/lib/elements/bind.element.test.js +3 -0
- package/target/lib/elements/bind.element.test.js.map +1 -1
- package/target/lib/elements/for.element.d.ts +1 -0
- package/target/lib/elements/for.element.d.ts.map +1 -0
- package/target/lib/elements/for.element.js +47 -3
- package/target/lib/elements/for.element.js.map +1 -1
- package/target/lib/elements/for.element.test.d.ts +1 -0
- package/target/lib/elements/for.element.test.d.ts.map +1 -0
- package/target/lib/elements/for.element.test.js +44 -0
- package/target/lib/elements/for.element.test.js.map +1 -1
- package/target/lib/elements/if.element.d.ts +1 -0
- package/target/lib/elements/if.element.d.ts.map +1 -0
- package/target/lib/elements/if.element.js +39 -2
- package/target/lib/elements/if.element.js.map +1 -1
- package/target/lib/elements/if.element.test.d.ts +1 -0
- package/target/lib/elements/if.element.test.d.ts.map +1 -0
- package/target/lib/elements/if.element.test.js +3 -0
- package/target/lib/elements/if.element.test.js.map +1 -1
- package/target/lib/elements/scope.element.d.ts +1 -0
- package/target/lib/elements/scope.element.d.ts.map +1 -0
- package/target/lib/elements/scope.element.js +35 -1
- package/target/lib/elements/scope.element.js.map +1 -1
- package/target/lib/elements/scope.element.test.d.ts +1 -0
- package/target/lib/elements/scope.element.test.d.ts.map +1 -0
- package/target/lib/elements/scope.element.test.js +1 -0
- package/target/lib/elements/scope.element.test.js.map +1 -1
- package/target/lib/elements/value.element.d.ts +1 -0
- package/target/lib/elements/value.element.d.ts.map +1 -0
- package/target/lib/elements/value.element.js +35 -1
- package/target/lib/elements/value.element.js.map +1 -1
- package/target/lib/elements/value.element.test.d.ts +1 -0
- package/target/lib/elements/value.element.test.d.ts.map +1 -0
- package/target/lib/elements/value.element.test.js +3 -0
- package/target/lib/elements/value.element.test.js.map +1 -1
- package/target/lib/events.d.ts +3 -2
- package/target/lib/events.d.ts.map +1 -0
- package/target/lib/expression.d.ts +52 -0
- package/target/lib/expression.d.ts.map +1 -0
- package/target/lib/expression.js +67 -1
- package/target/lib/expression.js.map +1 -1
- package/target/lib/expression.test.d.ts +1 -0
- package/target/lib/expression.test.d.ts.map +1 -0
- package/target/lib.d.ts +1 -0
- 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":"
|
|
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"}
|
|
@@ -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;
|
|
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"}
|
package/target/lib/events.d.ts
CHANGED
|
@@ -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"}
|
package/target/lib/expression.js
CHANGED
|
@@ -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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/lib/expression.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,WAAW;IACtB,0DAA0D;IAC1D,QAAQ,CAAS;IACjB,qDAAqD;IACrD,SAAS,GAAG,KAAK,CAAC;IAClB,wDAAwD;IACxD,MAAM,CAAS;IACf,4DAA4D;IAC5D,IAAI,GAAa,EAAE,CAAC;IACpB,qDAAqD;IACrD,WAAW,CAAqB;IAChC,uDAAuD;IACvD,cAAc,CAAqB;IACnC,wDAAwD;IACxD,OAAO,CAAqB;IAC5B,qDAAqD;IACrD,OAAO,CAAqB;IAE5B;;;OAGG;IACH,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAE/C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE9C,6DAA6D;QAC7D,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,IAAI;gBACP,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,MAAM;YACR,KAAK,IAAI;gBACP,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,MAAM;YACR,KAAK,GAAG;gBACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR,KAAK,GAAG;gBACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,MAAM;QACV,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAc,KAAc;QAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,KAAU,CAAC;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE9C,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAM,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,MAAM,SAAS,GAAyB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAE/D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAEpF,OAAO;oBACL,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;oBACjC,KAAK;oBACL,QAAQ;iBACT,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,KAAc;QAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAQ,KAAK,CAAC;QAEzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC;QAC5C,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -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
|
@@ -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"}
|