@explorins/pers-shared 2.1.191 → 2.1.192

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 (61) hide show
  1. package/dist/cjs/shared-lib/dto/business/businessTypeCreate.request.dto.d.ts +1 -1
  2. package/dist/cjs/shared-lib/dto/business/businessTypeCreate.request.dto.d.ts.map +1 -1
  3. package/dist/cjs/shared-lib/dto/business/businessTypeCreate.request.dto.js +2 -2
  4. package/dist/cjs/shared-lib/dto/business/businessTypeCreate.request.dto.js.map +1 -1
  5. package/dist/cjs/shared-lib/enum/signing-account-provider.enum.d.ts +1 -0
  6. package/dist/cjs/shared-lib/enum/signing-account-provider.enum.d.ts.map +1 -1
  7. package/dist/cjs/shared-lib/enum/signing-account-provider.enum.js +1 -0
  8. package/dist/cjs/shared-lib/enum/signing-account-provider.enum.js.map +1 -1
  9. package/dist/cjs/shared-lib/interfaces/eligibility.interface.d.ts +38 -0
  10. package/dist/cjs/shared-lib/interfaces/eligibility.interface.d.ts.map +1 -0
  11. package/dist/cjs/shared-lib/interfaces/eligibility.interface.js +10 -0
  12. package/dist/cjs/shared-lib/interfaces/eligibility.interface.js.map +1 -0
  13. package/dist/cjs/shared-lib/interfaces/index.d.ts +1 -0
  14. package/dist/cjs/shared-lib/interfaces/index.d.ts.map +1 -1
  15. package/dist/cjs/shared-lib/interfaces/index.js +1 -0
  16. package/dist/cjs/shared-lib/interfaces/index.js.map +1 -1
  17. package/dist/cjs/shared-lib/validation/index.d.ts +2 -0
  18. package/dist/cjs/shared-lib/validation/index.d.ts.map +1 -1
  19. package/dist/cjs/shared-lib/validation/index.js +4 -0
  20. package/dist/cjs/shared-lib/validation/index.js.map +1 -1
  21. package/dist/cjs/shared-lib/validation/redemption-eligibility.d.ts +107 -0
  22. package/dist/cjs/shared-lib/validation/redemption-eligibility.d.ts.map +1 -0
  23. package/dist/cjs/shared-lib/validation/redemption-eligibility.js +74 -0
  24. package/dist/cjs/shared-lib/validation/redemption-eligibility.js.map +1 -0
  25. package/dist/cjs/shared-lib/validation/status-hierarchy.d.ts +33 -0
  26. package/dist/cjs/shared-lib/validation/status-hierarchy.d.ts.map +1 -0
  27. package/dist/cjs/shared-lib/validation/status-hierarchy.js +73 -0
  28. package/dist/cjs/shared-lib/validation/status-hierarchy.js.map +1 -0
  29. package/dist/cjs/shared-patterns/functions/token-metadata.functions.js +2 -2
  30. package/dist/cjs/shared-patterns/functions/token-metadata.functions.js.map +1 -1
  31. package/dist/esm/shared-lib/dto/business/businessTypeCreate.request.dto.d.ts +1 -1
  32. package/dist/esm/shared-lib/dto/business/businessTypeCreate.request.dto.d.ts.map +1 -1
  33. package/dist/esm/shared-lib/dto/business/businessTypeCreate.request.dto.js +2 -2
  34. package/dist/esm/shared-lib/dto/business/businessTypeCreate.request.dto.js.map +1 -1
  35. package/dist/esm/shared-lib/enum/signing-account-provider.enum.d.ts +1 -0
  36. package/dist/esm/shared-lib/enum/signing-account-provider.enum.d.ts.map +1 -1
  37. package/dist/esm/shared-lib/enum/signing-account-provider.enum.js +1 -0
  38. package/dist/esm/shared-lib/enum/signing-account-provider.enum.js.map +1 -1
  39. package/dist/esm/shared-lib/interfaces/eligibility.interface.d.ts +38 -0
  40. package/dist/esm/shared-lib/interfaces/eligibility.interface.d.ts.map +1 -0
  41. package/dist/esm/shared-lib/interfaces/eligibility.interface.js +9 -0
  42. package/dist/esm/shared-lib/interfaces/eligibility.interface.js.map +1 -0
  43. package/dist/esm/shared-lib/interfaces/index.d.ts +1 -0
  44. package/dist/esm/shared-lib/interfaces/index.d.ts.map +1 -1
  45. package/dist/esm/shared-lib/interfaces/index.js +1 -0
  46. package/dist/esm/shared-lib/interfaces/index.js.map +1 -1
  47. package/dist/esm/shared-lib/validation/index.d.ts +2 -0
  48. package/dist/esm/shared-lib/validation/index.d.ts.map +1 -1
  49. package/dist/esm/shared-lib/validation/index.js +4 -0
  50. package/dist/esm/shared-lib/validation/index.js.map +1 -1
  51. package/dist/esm/shared-lib/validation/redemption-eligibility.d.ts +107 -0
  52. package/dist/esm/shared-lib/validation/redemption-eligibility.d.ts.map +1 -0
  53. package/dist/esm/shared-lib/validation/redemption-eligibility.js +70 -0
  54. package/dist/esm/shared-lib/validation/redemption-eligibility.js.map +1 -0
  55. package/dist/esm/shared-lib/validation/status-hierarchy.d.ts +33 -0
  56. package/dist/esm/shared-lib/validation/status-hierarchy.d.ts.map +1 -0
  57. package/dist/esm/shared-lib/validation/status-hierarchy.js +70 -0
  58. package/dist/esm/shared-lib/validation/status-hierarchy.js.map +1 -0
  59. package/dist/esm/shared-patterns/functions/token-metadata.functions.js +2 -2
  60. package/dist/esm/shared-patterns/functions/token-metadata.functions.js.map +1 -1
  61. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  export declare class BusinessTypeCreateRequestDTO {
2
2
  name: string;
3
- description: string;
3
+ description?: string;
4
4
  code?: string;
5
5
  iconUrl?: string;
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"businessTypeCreate.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":"AAIA,qBAAa,4BAA4B;IAKrC,IAAI,EAAG,MAAM,CAAA;IAKb,WAAW,EAAG,MAAM,CAAC;IAKrB,IAAI,CAAC,EAAE,MAAM,CAAC;IAKd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"businessTypeCreate.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":"AAIA,qBAAa,4BAA4B;IAKrC,IAAI,EAAG,MAAM,CAAA;IAKb,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,IAAI,CAAC,EAAE,MAAM,CAAC;IAKd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -27,8 +27,8 @@ __decorate([
27
27
  __metadata("design:type", String)
28
28
  ], BusinessTypeCreateRequestDTO.prototype, "name", void 0);
29
29
  __decorate([
30
- (0, swagger_1.ApiProperty)({ description: 'Business type description' }),
31
- (0, class_validator_1.IsNotEmpty)(),
30
+ (0, swagger_1.ApiPropertyOptional)({ description: 'Business type description' }),
31
+ (0, decorators_1.OptionalStrip)(),
32
32
  (0, class_validator_1.IsString)(),
33
33
  __metadata("design:type", String)
34
34
  ], BusinessTypeCreateRequestDTO.prototype, "description", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"businessTypeCreate.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAmE;AACnE,qDAA8D;AAC9D,iDAAiD;AAEjD,MAAa,4BAA4B;IAKrC,IAAI,CAAS;IAKb,WAAW,CAAU;IAKrB,IAAI,CAAU;IAKd,OAAO,CAAU;CACpB;AArBD,oEAqBC;AAhBG;IAHC,IAAA,qBAAW,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IAChE,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;0DACE;AAKb;IAHC,IAAA,qBAAW,EAAC,EAAC,WAAW,EAAE,2BAA2B,EAAC,CAAC;IACvD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;iEACU;AAKrB;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IACxE,IAAA,0BAAa,GAAE;IACf,IAAA,0BAAQ,GAAE;;0DACG;AAKd;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,wBAAwB,EAAC,CAAC;IAC5E,IAAA,0BAAa,GAAE;IACf,IAAA,uBAAK,GAAE;;6DACS"}
1
+ {"version":3,"file":"businessTypeCreate.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAmE;AACnE,qDAA8D;AAC9D,iDAAiD;AAEjD,MAAa,4BAA4B;IAKrC,IAAI,CAAS;IAKb,WAAW,CAAU;IAKrB,IAAI,CAAU;IAKd,OAAO,CAAU;CACpB;AArBD,oEAqBC;AAhBG;IAHC,IAAA,qBAAW,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IAChE,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;0DACE;AAKb;IAHC,IAAA,6BAAmB,EAAC,EAAC,WAAW,EAAE,2BAA2B,EAAC,CAAC;IAC/D,IAAA,0BAAa,GAAE;IACf,IAAA,0BAAQ,GAAE;;iEACU;AAKrB;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IACxE,IAAA,0BAAa,GAAE;IACf,IAAA,0BAAQ,GAAE;;0DACG;AAKd;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,wBAAwB,EAAC,CAAC;IAC5E,IAAA,0BAAa,GAAE;IACf,IAAA,uBAAK,GAAE;;6DACS"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  export declare enum SigningAccountProvider {
8
8
  DFNS = "DFNS",
9
+ TURNKEY = "TURNKEY",
9
10
  PERS_INTERNAL = "PERS_INTERNAL"
10
11
  }
11
12
  //# sourceMappingURL=signing-account-provider.enum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signing-account-provider.enum.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,oBAAY,sBAAsB;IAIhC,IAAI,SAAsB;IAE1B,aAAa,kBAAuB;CACrC"}
1
+ {"version":3,"file":"signing-account-provider.enum.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,oBAAY,sBAAsB;IAIhC,IAAI,SAAsB;IAC1B,OAAO,YAAsB;IAE7B,aAAa,kBAAuB;CACrC"}
@@ -13,6 +13,7 @@ var SigningAccountProvider;
13
13
  WALLETCONNECT = 'walletconnect',
14
14
  COINBASE_WALLET = 'coinbase_wallet', */
15
15
  SigningAccountProvider["DFNS"] = "DFNS";
16
+ SigningAccountProvider["TURNKEY"] = "TURNKEY";
16
17
  // CUSTODIAL = 'custodial'
17
18
  SigningAccountProvider["PERS_INTERNAL"] = "PERS_INTERNAL"; // Internal PERS managed signing accounts
18
19
  })(SigningAccountProvider || (exports.SigningAccountProvider = SigningAccountProvider = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"signing-account-provider.enum.js","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC;;6CAEyC;IACzC,uCAA0B,CAAA;IAC1B,kCAAkC;IAClC,yDAAoC,CAAA,CAAC,yCAAyC;AAChF,CAAC,EAPW,sBAAsB,sCAAtB,sBAAsB,QAOjC"}
1
+ {"version":3,"file":"signing-account-provider.enum.js","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,IAAY,sBAQX;AARD,WAAY,sBAAsB;IAChC;;6CAEyC;IACzC,uCAA0B,CAAA;IAC1B,6CAA6B,CAAA;IAC7B,kCAAkC;IAClC,yDAAoC,CAAA,CAAC,yCAAyC;AAChF,CAAC,EARW,sBAAsB,sCAAtB,sBAAsB,QAQjC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Generic, reusable eligibility primitives.
3
+ *
4
+ * A domain-agnostic way to express "can this actor perform this action?" as an
5
+ * aggregate verdict (`isEligible`) plus a set of self-describing, per-gate checks.
6
+ * Specialize `Eligibility<TChecks>` per domain by supplying a typed `checks` shape.
7
+ */
8
+ /**
9
+ * Result of a single eligibility gate.
10
+ *
11
+ * When `passed` is true, `reason` and `detail` are omitted/null.
12
+ *
13
+ * @typeParam TCode - Stable machine-readable failure code (defaults to `string`).
14
+ * @typeParam TDetail - Structured, check-specific detail on failure (defaults to `unknown`).
15
+ */
16
+ export interface EligibilityCheck<TCode extends string = string, TDetail = unknown> {
17
+ /** True if this gate is satisfied. */
18
+ passed: boolean;
19
+ /** Why the gate failed. Null/omitted when passed. */
20
+ reason?: {
21
+ code: TCode;
22
+ message: string;
23
+ } | null;
24
+ /** Structured, check-specific detail. Only present when failed (and applicable). */
25
+ detail?: TDetail;
26
+ }
27
+ /**
28
+ * Aggregate eligibility verdict: an overall flag plus a map of named gate results.
29
+ *
30
+ * @typeParam TChecks - Record of named gates to their {@link EligibilityCheck} results.
31
+ */
32
+ export interface Eligibility<TChecks extends Record<string, EligibilityCheck> = Record<string, EligibilityCheck>> {
33
+ /** AND of every check in `checks`. True only when every gate passes. */
34
+ isEligible: boolean;
35
+ /** Per-gate results. Each gate is self-describing on failure. */
36
+ checks: TChecks;
37
+ }
38
+ //# sourceMappingURL=eligibility.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.interface.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligibility.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO;IAC9E,sCAAsC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,qDAAqD;IACrD,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW,CACxB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAEnF,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,MAAM,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Generic, reusable eligibility primitives.
4
+ *
5
+ * A domain-agnostic way to express "can this actor perform this action?" as an
6
+ * aggregate verdict (`isEligible`) plus a set of self-describing, per-gate checks.
7
+ * Specialize `Eligibility<TChecks>` per domain by supplying a typed `checks` shape.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ //# sourceMappingURL=eligibility.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.interface.js","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligibility.interface.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
@@ -25,4 +25,5 @@ export * from './ws-relay.types';
25
25
  export * from './external-token-issuer.interface';
26
26
  export * from './email-config.interface';
27
27
  export * from './eligible-business-summary.interface';
28
+ export * from './eligibility.interface';
28
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":"AACA,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AAExC,cAAc,4CAA4C,CAAC;AAE3D,cAAc,YAAY,CAAC;AAE3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kBAAkB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAElD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,uCAAuC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":"AACA,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AAExC,cAAc,4CAA4C,CAAC;AAE3D,cAAc,YAAY,CAAC;AAE3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kBAAkB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAElD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,uCAAuC,CAAC;AAEtD,cAAc,yBAAyB,CAAC"}
@@ -42,4 +42,5 @@ __exportStar(require("./ws-relay.types"), exports);
42
42
  __exportStar(require("./external-token-issuer.interface"), exports);
43
43
  __exportStar(require("./email-config.interface"), exports);
44
44
  __exportStar(require("./eligible-business-summary.interface"), exports);
45
+ __exportStar(require("./eligibility.interface"), exports);
45
46
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAkD;AAClD,mEAAiD;AACjD,uEAAqD;AACrD,iEAA+C;AAC/C,iEAA+C;AAC/C,0DAAwC;AACxC,+DAA6C;AAC7C,2EAAyD;AACzD,iEAA+C;AAC/C,qDAAmC;AACnC,gEAA8C;AAC9C,kEAAgD;AAChD,sEAAoD;AACpD,8DAA4C;AAC5C,kEAAgD;AAChD,4EAA0D;AAC1D,mEAAiD;AAEjD,0DAAwC;AAExC,6EAA2D;AAE3D,6CAA2B;AAE3B,+DAA6C;AAC7C,qEAAmD;AACnD,8DAA4C;AAC5C,sEAAoD;AAEpD,mDAAiC;AAEjC,oEAAkD;AAElD,2DAAyC;AAEzC,wEAAsD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAkD;AAClD,mEAAiD;AACjD,uEAAqD;AACrD,iEAA+C;AAC/C,iEAA+C;AAC/C,0DAAwC;AACxC,+DAA6C;AAC7C,2EAAyD;AACzD,iEAA+C;AAC/C,qDAAmC;AACnC,gEAA8C;AAC9C,kEAAgD;AAChD,sEAAoD;AACpD,8DAA4C;AAC5C,kEAAgD;AAChD,4EAA0D;AAC1D,mEAAiD;AAEjD,0DAAwC;AAExC,6EAA2D;AAE3D,6CAA2B;AAE3B,+DAA6C;AAC7C,qEAAmD;AACnD,8DAA4C;AAC5C,sEAAoD;AAEpD,mDAAiC;AAEjC,oEAAkD;AAElD,2DAAyC;AAEzC,wEAAsD;AAEtD,0DAAwC"}
@@ -1,4 +1,6 @@
1
1
  export * from './validation.types';
2
2
  export * from './validators';
3
3
  export * from './field-validation';
4
+ export * from './status-hierarchy';
5
+ export * from './redemption-eligibility';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AAGnC,cAAc,cAAc,CAAC;AAG7B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AAGnC,cAAc,cAAc,CAAC;AAG7B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,0BAA0B,CAAC"}
@@ -20,4 +20,8 @@ __exportStar(require("./validation.types"), exports);
20
20
  __exportStar(require("./validators"), exports);
21
21
  // Field validation functions (also re-exports types and validators)
22
22
  __exportStar(require("./field-validation"), exports);
23
+ // Status hierarchy resolution (pure)
24
+ __exportStar(require("./status-hierarchy"), exports);
25
+ // Redemption eligibility types + pure aggregator
26
+ __exportStar(require("./redemption-eligibility"), exports);
23
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,qDAAmC;AAEnC,wBAAwB;AACxB,+CAA6B;AAE7B,oEAAoE;AACpE,qDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,qDAAmC;AAEnC,wBAAwB;AACxB,+CAA6B;AAE7B,oEAAoE;AACpE,qDAAmC;AAEnC,qCAAqC;AACrC,qDAAmC;AAEnC,iDAAiD;AACjD,2DAAyC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Redemption eligibility (pure, framework-agnostic).
3
+ *
4
+ * Specializes the generic {@link Eligibility} primitive for the redeem-time gates
5
+ * enforced by the backend redemption workflow, and provides a pure aggregator so
6
+ * backend and frontend can derive the same verdict from already-known signals.
7
+ *
8
+ * NOTE: the live credit-token balance gate is intentionally excluded — it is
9
+ * volatile and validated at redeem time, not as a pre-flight check.
10
+ */
11
+ import type { Eligibility, EligibilityCheck } from "../interfaces/eligibility.interface";
12
+ import { type StatusHierarchyNode } from "./status-hierarchy";
13
+ import type { UserStatusTypeDTO } from "../dto/user-status-type.dto";
14
+ /** Minimal user shape needed to evaluate eligibility. */
15
+ type EligibilityUser = {
16
+ isActive?: boolean;
17
+ included?: {
18
+ statusTypes?: UserStatusTypeDTO[];
19
+ };
20
+ };
21
+ /** Minimal redemption shape needed to evaluate eligibility. */
22
+ type EligibilityRedemption = {
23
+ maxPerUser?: number | null;
24
+ minUserStatusType?: UserStatusTypeDTO | null;
25
+ included?: {
26
+ requiredUserInfo?: {
27
+ isValid: boolean;
28
+ fieldDefinitions?: Array<{
29
+ isMissing?: boolean;
30
+ key?: string;
31
+ id?: string;
32
+ }>;
33
+ } | null;
34
+ booking?: {
35
+ isValid: boolean;
36
+ } | null;
37
+ };
38
+ };
39
+ /**
40
+ * Canonical list of redemption eligibility gates.
41
+ *
42
+ * ⚠️ SYNC CONTRACT: These gates must mirror the validation steps in
43
+ * `RedemptionRedeemWorkflow` (backend). If you add or remove a gate here,
44
+ * update the workflow too — and vice versa.
45
+ *
46
+ * Use this constant in tests to assert that `evaluateRedemptionEligibility`
47
+ * returns exactly these keys (no more, no less):
48
+ *
49
+ * expect(Object.keys(result.checks)).toEqual([...REDEMPTION_ELIGIBILITY_GATES]);
50
+ */
51
+ export declare const REDEMPTION_ELIGIBILITY_GATES: readonly ["userActive", "requiredFields", "booking", "userStatus", "maxPerUser"];
52
+ export type RedemptionEligibilityGate = typeof REDEMPTION_ELIGIBILITY_GATES[number];
53
+ /**
54
+ * Stable machine-readable codes for a failed redemption eligibility check.
55
+ */
56
+ export type RedemptionEligibilityReasonCode = 'USER_INACTIVE' | 'MISSING_REQUIRED_FIELDS' | 'BOOKING_REQUIRED' | 'INSUFFICIENT_USER_STATUS' | 'MAX_PER_USER_REACHED';
57
+ /** Structured detail emitted by redemption eligibility gates on failure. */
58
+ export type RedemptionEligibilityDetail = {
59
+ missingFieldKeys: string[];
60
+ } | {
61
+ minRequiredStatusTypeId: number;
62
+ userStatusTypeIds: number[];
63
+ } | {
64
+ maxPerUser: number;
65
+ userRedeemCount: number;
66
+ };
67
+ /**
68
+ * Result of a single redemption eligibility gate.
69
+ * Specializes the generic {@link EligibilityCheck} with redemption-specific codes/detail.
70
+ */
71
+ export type RedemptionEligibilityCheck = EligibilityCheck<RedemptionEligibilityReasonCode, RedemptionEligibilityDetail>;
72
+ /**
73
+ * Aggregate pre-flight eligibility verdict for a user redeeming a redemption.
74
+ * Specializes the generic {@link Eligibility} with the redeem-time gates.
75
+ * Excludes the live credit-token balance check (validated at redeem time).
76
+ */
77
+ export type RedemptionEligibility = Eligibility<{
78
+ userActive: RedemptionEligibilityCheck;
79
+ requiredFields: RedemptionEligibilityCheck;
80
+ booking: RedemptionEligibilityCheck;
81
+ userStatus: RedemptionEligibilityCheck;
82
+ maxPerUser: RedemptionEligibilityCheck;
83
+ }>;
84
+ /** Signals required to derive a redemption eligibility verdict. */
85
+ export interface RedemptionEligibilityInput {
86
+ user: EligibilityUser;
87
+ redemption: EligibilityRedemption;
88
+ /** All status types — needed for hierarchical status comparison. */
89
+ allStatusTypes: StatusHierarchyNode[];
90
+ /**
91
+ * How many times this user has already redeemed this redemption.
92
+ * Required for the maxPerUser gate. Fetch from GET /redemptions/redeems?userId=&redemptionId=
93
+ */
94
+ userRedeemCount: number;
95
+ }
96
+ /**
97
+ * Derives an aggregate redemption eligibility verdict from the user, redemption and status list.
98
+ *
99
+ * Pure and side-effect free: pass the DTOs directly from your API responses; the function
100
+ * computes all per-gate verdicts (including status hierarchy and maxPerUser math) internally.
101
+ *
102
+ * Requires `?include=requiredUserInfo,booking` on the redemption fetch and
103
+ * `?include=status` on the user fetch for full accuracy.
104
+ */
105
+ export declare function evaluateRedemptionEligibility(input: RedemptionEligibilityInput): RedemptionEligibility;
106
+ export {};
107
+ //# sourceMappingURL=redemption-eligibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redemption-eligibility.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/redemption-eligibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAiC,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,yDAAyD;AACzD,KAAK,eAAe,GAAG;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAC;CACpD,CAAC;AAEF,+DAA+D;AAC/D,KAAK,qBAAqB,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE;QACP,gBAAgB,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC;gBAAE,SAAS,CAAC,EAAE,OAAO,CAAC;gBAAC,GAAG,CAAC,EAAE,MAAM,CAAC;gBAAC,EAAE,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GAAG,IAAI,CAAC;QAC7H,OAAO,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,GAAG,IAAI,CAAC;KACzC,CAAC;CACL,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B,kFAM/B,CAAC;AAEX,MAAM,MAAM,yBAAyB,GAAG,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAEpF;;GAEG;AACH,MAAM,MAAM,+BAA+B,GACrC,eAAe,GACf,yBAAyB,GACzB,kBAAkB,GAClB,0BAA0B,GAC1B,sBAAsB,CAAC;AAE7B,4EAA4E;AAC5E,MAAM,MAAM,2BAA2B,GACjC;IAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9B;IAAE,uBAAuB,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,GAChE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,gBAAgB,CAAC,+BAA+B,EAAE,2BAA2B,CAAC,CAAC;AAExH;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,0BAA0B,CAAC;IACvC,cAAc,EAAE,0BAA0B,CAAC;IAC3C,OAAO,EAAE,0BAA0B,CAAC;IACpC,UAAU,EAAE,0BAA0B,CAAC;IACvC,UAAU,EAAE,0BAA0B,CAAC;CAC1C,CAAC,CAAC;AAEH,mEAAmE;AACnE,MAAM,WAAW,0BAA0B;IACvC,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,qBAAqB,CAAC;IAClC,oEAAoE;IACpE,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;CAC3B;AAaD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,0BAA0B,GAAG,qBAAqB,CA2DtG"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REDEMPTION_ELIGIBILITY_GATES = void 0;
4
+ exports.evaluateRedemptionEligibility = evaluateRedemptionEligibility;
5
+ const status_hierarchy_1 = require("./status-hierarchy");
6
+ /**
7
+ * Canonical list of redemption eligibility gates.
8
+ *
9
+ * ⚠️ SYNC CONTRACT: These gates must mirror the validation steps in
10
+ * `RedemptionRedeemWorkflow` (backend). If you add or remove a gate here,
11
+ * update the workflow too — and vice versa.
12
+ *
13
+ * Use this constant in tests to assert that `evaluateRedemptionEligibility`
14
+ * returns exactly these keys (no more, no less):
15
+ *
16
+ * expect(Object.keys(result.checks)).toEqual([...REDEMPTION_ELIGIBILITY_GATES]);
17
+ */
18
+ exports.REDEMPTION_ELIGIBILITY_GATES = [
19
+ 'userActive',
20
+ 'requiredFields',
21
+ 'booking',
22
+ 'userStatus',
23
+ 'maxPerUser',
24
+ ];
25
+ function makeCheck(passed, code, message, detail) {
26
+ return passed
27
+ ? { passed: true, reason: null }
28
+ : { passed: false, reason: { code, message }, ...(detail ? { detail } : {}) };
29
+ }
30
+ /**
31
+ * Derives an aggregate redemption eligibility verdict from the user, redemption and status list.
32
+ *
33
+ * Pure and side-effect free: pass the DTOs directly from your API responses; the function
34
+ * computes all per-gate verdicts (including status hierarchy and maxPerUser math) internally.
35
+ *
36
+ * Requires `?include=requiredUserInfo,booking` on the redemption fetch and
37
+ * `?include=status` on the user fetch for full accuracy.
38
+ */
39
+ function evaluateRedemptionEligibility(input) {
40
+ const { user, redemption, allStatusTypes, userRedeemCount } = input;
41
+ const userStatusTypeIds = (user.included?.statusTypes ?? []).map(s => s.id).filter((id) => id !== undefined);
42
+ const minUserStatusTypeId = redemption.minUserStatusType?.id ?? null;
43
+ const requiredUserInfo = redemption.included?.requiredUserInfo;
44
+ const booking = redemption.included?.booking;
45
+ // userStatus — delegate to shared pure hierarchy check
46
+ const userStatusPassed = !minUserStatusTypeId ||
47
+ (0, status_hierarchy_1.meetsMinimumStatusRequirement)(minUserStatusTypeId, userStatusTypeIds, allStatusTypes);
48
+ // maxPerUser — pure numeric comparison
49
+ const maxPerUserPassed = !redemption.maxPerUser || userRedeemCount < redemption.maxPerUser;
50
+ // requiredFields — use isValid from the include; derive missing keys from field definitions
51
+ const requiredFieldsPassed = !requiredUserInfo || requiredUserInfo.isValid;
52
+ const missingFieldKeys = requiredUserInfo?.fieldDefinitions
53
+ ?.filter(f => f.isMissing)
54
+ .map(f => f.key ?? f.id ?? '')
55
+ .filter(Boolean) ?? [];
56
+ const checks = {
57
+ userActive: makeCheck(user.isActive !== false, 'USER_INACTIVE', 'User account is inactive'),
58
+ requiredFields: makeCheck(requiredFieldsPassed, 'MISSING_REQUIRED_FIELDS', 'User is missing one or more required fields', requiredFieldsPassed ? undefined : { missingFieldKeys }),
59
+ booking: makeCheck(!booking || booking.isValid, 'BOOKING_REQUIRED', 'User does not have a valid booking meeting the requirements'),
60
+ userStatus: makeCheck(userStatusPassed, 'INSUFFICIENT_USER_STATUS', 'User does not meet the minimum status requirement', userStatusPassed || !minUserStatusTypeId ? undefined : {
61
+ minRequiredStatusTypeId: minUserStatusTypeId,
62
+ userStatusTypeIds,
63
+ }),
64
+ maxPerUser: makeCheck(maxPerUserPassed, 'MAX_PER_USER_REACHED', 'User has reached the maximum number of redeems allowed', maxPerUserPassed || !redemption.maxPerUser ? undefined : {
65
+ maxPerUser: redemption.maxPerUser,
66
+ userRedeemCount,
67
+ }),
68
+ };
69
+ return {
70
+ isEligible: Object.values(checks).every(c => c.passed),
71
+ checks,
72
+ };
73
+ }
74
+ //# sourceMappingURL=redemption-eligibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redemption-eligibility.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/redemption-eligibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * User status hierarchy resolution (pure, framework-agnostic).
3
+ *
4
+ * Centralizes the rule for "does a user's earned status satisfy a minimum
5
+ * requirement?" so backend and frontend evaluate it identically.
6
+ *
7
+ * Hierarchy semantics:
8
+ * - Exact match always qualifies.
9
+ * - Otherwise a user qualifies if they hold a status in the SAME hierarchy with
10
+ * an `order` greater than or equal to the required status `order`.
11
+ * - Hierarchies (tracks) are separated by tags: statuses with no tags share the
12
+ * global hierarchy; tagged statuses share a track only when their tags overlap.
13
+ * - A required status without an `order` requires an exact match (backward compatible).
14
+ */
15
+ /** Minimal status-type shape needed to resolve hierarchy. */
16
+ export interface StatusHierarchyNode {
17
+ id: number;
18
+ /** Higher = more prestigious. Null/undefined = no hierarchy ranking. */
19
+ order?: number | null;
20
+ /** Track tags. Empty/undefined = global hierarchy. */
21
+ tags?: string[] | null;
22
+ }
23
+ /**
24
+ * Determines whether a user meets a minimum status requirement, honoring the
25
+ * tag-scoped status hierarchy.
26
+ *
27
+ * @param requiredStatusId - The minimum status type ID required.
28
+ * @param userStatusIds - Status type IDs the user has earned.
29
+ * @param allStatusTypes - All status types (must include the required and user statuses).
30
+ * @returns True if the user satisfies the requirement (exact match or higher in same track).
31
+ */
32
+ export declare function meetsMinimumStatusRequirement(requiredStatusId: number, userStatusIds: number[], allStatusTypes: StatusHierarchyNode[]): boolean;
33
+ //# sourceMappingURL=status-hierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-hierarchy.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/status-hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC1B;AAYD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CACzC,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,EAAE,EACvB,cAAc,EAAE,mBAAmB,EAAE,GACtC,OAAO,CA4CT"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ /**
3
+ * User status hierarchy resolution (pure, framework-agnostic).
4
+ *
5
+ * Centralizes the rule for "does a user's earned status satisfy a minimum
6
+ * requirement?" so backend and frontend evaluate it identically.
7
+ *
8
+ * Hierarchy semantics:
9
+ * - Exact match always qualifies.
10
+ * - Otherwise a user qualifies if they hold a status in the SAME hierarchy with
11
+ * an `order` greater than or equal to the required status `order`.
12
+ * - Hierarchies (tracks) are separated by tags: statuses with no tags share the
13
+ * global hierarchy; tagged statuses share a track only when their tags overlap.
14
+ * - A required status without an `order` requires an exact match (backward compatible).
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.meetsMinimumStatusRequirement = meetsMinimumStatusRequirement;
18
+ /**
19
+ * Returns true if any two tag arrays share at least one tag (case-insensitive).
20
+ * Statuses that overlap on tags belong to the same track.
21
+ */
22
+ function tagsOverlap(tags1, tags2) {
23
+ if (!tags1.length || !tags2.length)
24
+ return false;
25
+ const set1 = new Set(tags1.map(t => t.toLowerCase()));
26
+ return tags2.some(tag => set1.has(tag.toLowerCase()));
27
+ }
28
+ /**
29
+ * Determines whether a user meets a minimum status requirement, honoring the
30
+ * tag-scoped status hierarchy.
31
+ *
32
+ * @param requiredStatusId - The minimum status type ID required.
33
+ * @param userStatusIds - Status type IDs the user has earned.
34
+ * @param allStatusTypes - All status types (must include the required and user statuses).
35
+ * @returns True if the user satisfies the requirement (exact match or higher in same track).
36
+ */
37
+ function meetsMinimumStatusRequirement(requiredStatusId, userStatusIds, allStatusTypes) {
38
+ // Quick check: exact match
39
+ if (userStatusIds.includes(requiredStatusId)) {
40
+ return true;
41
+ }
42
+ const statusMap = new Map(allStatusTypes.map(s => [s.id, s]));
43
+ const requiredStatus = statusMap.get(requiredStatusId);
44
+ if (!requiredStatus) {
45
+ return false; // Required status doesn't exist
46
+ }
47
+ const requiredOrder = requiredStatus.order;
48
+ if (requiredOrder === null || requiredOrder === undefined) {
49
+ // No order on required status = require exact match only (backward compatible)
50
+ return false;
51
+ }
52
+ const requiredTags = requiredStatus.tags || [];
53
+ // Check if user has any status with equal or higher order in the same hierarchy
54
+ for (const userStatusId of userStatusIds) {
55
+ const userStatus = statusMap.get(userStatusId);
56
+ if (!userStatus)
57
+ continue;
58
+ const userOrder = userStatus.order;
59
+ if (userOrder === null || userOrder === undefined)
60
+ continue; // No order
61
+ const userTags = userStatus.tags || [];
62
+ // Same hierarchy when: both untagged (global), OR they share a track tag.
63
+ const sameHierarchy = (requiredTags.length === 0 && userTags.length === 0) ||
64
+ tagsOverlap(requiredTags, userTags);
65
+ if (!sameHierarchy)
66
+ continue; // Different hierarchy
67
+ if (userOrder >= requiredOrder) {
68
+ return true;
69
+ }
70
+ }
71
+ return false;
72
+ }
73
+ //# sourceMappingURL=status-hierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-hierarchy.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/status-hierarchy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AA8BH,sEAgDC;AAnED;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAe,EAAE,KAAe;IACjD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,6BAA6B,CACzC,gBAAwB,EACxB,aAAuB,EACvB,cAAqC;IAErC,2BAA2B;IAC3B,IAAI,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9D,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC,CAAC,gCAAgC;IAClD,CAAC;IAED,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC;IAC3C,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACxD,+EAA+E;QAC/E,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC;IAE/C,gFAAgF;IAChF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC;QACnC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS;YAAE,SAAS,CAAC,WAAW;QAExE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvC,0EAA0E;QAC1E,MAAM,aAAa,GACf,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;YACpD,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAExC,IAAI,CAAC,aAAa;YAAE,SAAS,CAAC,sBAAsB;QAEpD,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -158,10 +158,10 @@ const extractTagsFromMetadata = (metadata) => {
158
158
  // Case-insensitive comparison to handle legacy formats ('Tags', 'tags', etc.)
159
159
  const tagsAttribute = metadata.attributes.find(attr => attr.trait_type.toLowerCase() === token_storage_data_interface_1.TokenStorageDataAttributesType.TAGS.toLowerCase());
160
160
  if (tagsAttribute?.value) {
161
- // Tags are stored as comma-separated string, split and trim
161
+ // Tags are stored as comma-separated string, split, trim, and normalize to lowercase
162
162
  return tagsAttribute.value
163
163
  .split(',')
164
- .map(tag => tag.trim())
164
+ .map(tag => tag.trim().toLowerCase()) // ✅ Always return lowercase tags
165
165
  .filter(Boolean);
166
166
  }
167
167
  return [];
@@ -1 +1 @@
1
- {"version":3,"file":"token-metadata.functions.js","sourceRoot":"","sources":["../../../../src/shared-patterns/functions/token-metadata.functions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-metadata.functions.js","sourceRoot":"","sources":["../../../../src/shared-patterns/functions/token-metadata.functions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export declare class BusinessTypeCreateRequestDTO {
2
2
  name: string;
3
- description: string;
3
+ description?: string;
4
4
  code?: string;
5
5
  iconUrl?: string;
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"businessTypeCreate.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":"AAIA,qBAAa,4BAA4B;IAKrC,IAAI,EAAG,MAAM,CAAA;IAKb,WAAW,EAAG,MAAM,CAAC;IAKrB,IAAI,CAAC,EAAE,MAAM,CAAC;IAKd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"businessTypeCreate.request.dto.d.ts","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":"AAIA,qBAAa,4BAA4B;IAKrC,IAAI,EAAG,MAAM,CAAA;IAKb,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,IAAI,CAAC,EAAE,MAAM,CAAC;IAKd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -19,8 +19,8 @@ __decorate([
19
19
  IsString()
20
20
  ], BusinessTypeCreateRequestDTO.prototype, "name", void 0);
21
21
  __decorate([
22
- ApiProperty({ description: 'Business type description' }),
23
- IsNotEmpty(),
22
+ ApiPropertyOptional({ description: 'Business type description' }),
23
+ OptionalStrip(),
24
24
  IsString()
25
25
  ], BusinessTypeCreateRequestDTO.prototype, "description", void 0);
26
26
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"businessTypeCreate.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,OAAO,4BAA4B;IAKrC,IAAI,CAAS;IAKb,WAAW,CAAU;IAKrB,IAAI,CAAU;IAKd,OAAO,CAAU;CACpB;AAhBG;IAHC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IAChE,UAAU,EAAE;IACZ,QAAQ,EAAE;0DACE;AAKb;IAHC,WAAW,CAAC,EAAC,WAAW,EAAE,2BAA2B,EAAC,CAAC;IACvD,UAAU,EAAE;IACZ,QAAQ,EAAE;iEACU;AAKrB;IAHC,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IACxE,aAAa,EAAE;IACf,QAAQ,EAAE;0DACG;AAKd;IAHC,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,wBAAwB,EAAC,CAAC;IAC5E,aAAa,EAAE;IACf,KAAK,EAAE;6DACS"}
1
+ {"version":3,"file":"businessTypeCreate.request.dto.js","sourceRoot":"","sources":["../../../../../src/shared-lib/dto/business/businessTypeCreate.request.dto.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,OAAO,4BAA4B;IAKrC,IAAI,CAAS;IAKb,WAAW,CAAU;IAKrB,IAAI,CAAU;IAKd,OAAO,CAAU;CACpB;AAhBG;IAHC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IAChE,UAAU,EAAE;IACZ,QAAQ,EAAE;0DACE;AAKb;IAHC,mBAAmB,CAAC,EAAC,WAAW,EAAE,2BAA2B,EAAC,CAAC;IAC/D,aAAa,EAAE;IACf,QAAQ,EAAE;iEACU;AAKrB;IAHC,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,oBAAoB,EAAC,CAAC;IACxE,aAAa,EAAE;IACf,QAAQ,EAAE;0DACG;AAKd;IAHC,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAC,WAAW,EAAE,wBAAwB,EAAC,CAAC;IAC5E,aAAa,EAAE;IACf,KAAK,EAAE;6DACS"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  export declare enum SigningAccountProvider {
8
8
  DFNS = "DFNS",
9
+ TURNKEY = "TURNKEY",
9
10
  PERS_INTERNAL = "PERS_INTERNAL"
10
11
  }
11
12
  //# sourceMappingURL=signing-account-provider.enum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signing-account-provider.enum.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,oBAAY,sBAAsB;IAIhC,IAAI,SAAsB;IAE1B,aAAa,kBAAuB;CACrC"}
1
+ {"version":3,"file":"signing-account-provider.enum.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,oBAAY,sBAAsB;IAIhC,IAAI,SAAsB;IAC1B,OAAO,YAAsB;IAE7B,aAAa,kBAAuB;CACrC"}
@@ -10,6 +10,7 @@ export var SigningAccountProvider;
10
10
  WALLETCONNECT = 'walletconnect',
11
11
  COINBASE_WALLET = 'coinbase_wallet', */
12
12
  SigningAccountProvider["DFNS"] = "DFNS";
13
+ SigningAccountProvider["TURNKEY"] = "TURNKEY";
13
14
  // CUSTODIAL = 'custodial'
14
15
  SigningAccountProvider["PERS_INTERNAL"] = "PERS_INTERNAL"; // Internal PERS managed signing accounts
15
16
  })(SigningAccountProvider || (SigningAccountProvider = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"signing-account-provider.enum.js","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAN,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC;;6CAEyC;IACzC,uCAA0B,CAAA;IAC1B,kCAAkC;IAClC,yDAAoC,CAAA,CAAC,yCAAyC;AAChF,CAAC,EAPW,sBAAsB,KAAtB,sBAAsB,QAOjC"}
1
+ {"version":3,"file":"signing-account-provider.enum.js","sourceRoot":"","sources":["../../../../src/shared-lib/enum/signing-account-provider.enum.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAN,IAAY,sBAQX;AARD,WAAY,sBAAsB;IAChC;;6CAEyC;IACzC,uCAA0B,CAAA;IAC1B,6CAA6B,CAAA;IAC7B,kCAAkC;IAClC,yDAAoC,CAAA,CAAC,yCAAyC;AAChF,CAAC,EARW,sBAAsB,KAAtB,sBAAsB,QAQjC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Generic, reusable eligibility primitives.
3
+ *
4
+ * A domain-agnostic way to express "can this actor perform this action?" as an
5
+ * aggregate verdict (`isEligible`) plus a set of self-describing, per-gate checks.
6
+ * Specialize `Eligibility<TChecks>` per domain by supplying a typed `checks` shape.
7
+ */
8
+ /**
9
+ * Result of a single eligibility gate.
10
+ *
11
+ * When `passed` is true, `reason` and `detail` are omitted/null.
12
+ *
13
+ * @typeParam TCode - Stable machine-readable failure code (defaults to `string`).
14
+ * @typeParam TDetail - Structured, check-specific detail on failure (defaults to `unknown`).
15
+ */
16
+ export interface EligibilityCheck<TCode extends string = string, TDetail = unknown> {
17
+ /** True if this gate is satisfied. */
18
+ passed: boolean;
19
+ /** Why the gate failed. Null/omitted when passed. */
20
+ reason?: {
21
+ code: TCode;
22
+ message: string;
23
+ } | null;
24
+ /** Structured, check-specific detail. Only present when failed (and applicable). */
25
+ detail?: TDetail;
26
+ }
27
+ /**
28
+ * Aggregate eligibility verdict: an overall flag plus a map of named gate results.
29
+ *
30
+ * @typeParam TChecks - Record of named gates to their {@link EligibilityCheck} results.
31
+ */
32
+ export interface Eligibility<TChecks extends Record<string, EligibilityCheck> = Record<string, EligibilityCheck>> {
33
+ /** AND of every check in `checks`. True only when every gate passes. */
34
+ isEligible: boolean;
35
+ /** Per-gate results. Each gate is self-describing on failure. */
36
+ checks: TChecks;
37
+ }
38
+ //# sourceMappingURL=eligibility.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.interface.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligibility.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO;IAC9E,sCAAsC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,qDAAqD;IACrD,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW,CACxB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAEnF,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,MAAM,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generic, reusable eligibility primitives.
3
+ *
4
+ * A domain-agnostic way to express "can this actor perform this action?" as an
5
+ * aggregate verdict (`isEligible`) plus a set of self-describing, per-gate checks.
6
+ * Specialize `Eligibility<TChecks>` per domain by supplying a typed `checks` shape.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=eligibility.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.interface.js","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/eligibility.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -25,4 +25,5 @@ export * from './ws-relay.types';
25
25
  export * from './external-token-issuer.interface';
26
26
  export * from './email-config.interface';
27
27
  export * from './eligible-business-summary.interface';
28
+ export * from './eligibility.interface';
28
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":"AACA,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AAExC,cAAc,4CAA4C,CAAC;AAE3D,cAAc,YAAY,CAAC;AAE3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kBAAkB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAElD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,uCAAuC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":"AACA,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AAExC,cAAc,4CAA4C,CAAC;AAE3D,cAAc,YAAY,CAAC;AAE3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kBAAkB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAElD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,uCAAuC,CAAC;AAEtD,cAAc,yBAAyB,CAAC"}
@@ -26,4 +26,5 @@ export * from './ws-relay.types.js';
26
26
  export * from './external-token-issuer.interface.js';
27
27
  export * from './email-config.interface.js';
28
28
  export * from './eligible-business-summary.interface.js';
29
+ export * from './eligibility.interface.js';
29
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AAExC,cAAc,4CAA4C,CAAC;AAE3D,cAAc,YAAY,CAAC;AAE3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kBAAkB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAElD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,uCAAuC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AAExC,cAAc,4CAA4C,CAAC;AAE3D,cAAc,YAAY,CAAC;AAE3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,kBAAkB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAElD,cAAc,0BAA0B,CAAC;AAEzC,cAAc,uCAAuC,CAAC;AAEtD,cAAc,yBAAyB,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export * from './validation.types';
2
2
  export * from './validators';
3
3
  export * from './field-validation';
4
+ export * from './status-hierarchy';
5
+ export * from './redemption-eligibility';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AAGnC,cAAc,cAAc,CAAC;AAG7B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AAGnC,cAAc,cAAc,CAAC;AAG7B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,0BAA0B,CAAC"}
@@ -4,4 +4,8 @@ export * from './validation.types.js';
4
4
  export * from './validators.js';
5
5
  // Field validation functions (also re-exports types and validators)
6
6
  export * from './field-validation.js';
7
+ // Status hierarchy resolution (pure)
8
+ export * from './status-hierarchy.js';
9
+ // Redemption eligibility types + pure aggregator
10
+ export * from './redemption-eligibility.js';
7
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,oBAAoB,CAAC;AAEnC,wBAAwB;AACxB,cAAc,cAAc,CAAC;AAE7B,oEAAoE;AACpE,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,oBAAoB,CAAC;AAEnC,wBAAwB;AACxB,cAAc,cAAc,CAAC;AAE7B,oEAAoE;AACpE,cAAc,oBAAoB,CAAC;AAEnC,qCAAqC;AACrC,cAAc,oBAAoB,CAAC;AAEnC,iDAAiD;AACjD,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Redemption eligibility (pure, framework-agnostic).
3
+ *
4
+ * Specializes the generic {@link Eligibility} primitive for the redeem-time gates
5
+ * enforced by the backend redemption workflow, and provides a pure aggregator so
6
+ * backend and frontend can derive the same verdict from already-known signals.
7
+ *
8
+ * NOTE: the live credit-token balance gate is intentionally excluded — it is
9
+ * volatile and validated at redeem time, not as a pre-flight check.
10
+ */
11
+ import type { Eligibility, EligibilityCheck } from "../interfaces/eligibility.interface";
12
+ import { type StatusHierarchyNode } from "./status-hierarchy";
13
+ import type { UserStatusTypeDTO } from "../dto/user-status-type.dto";
14
+ /** Minimal user shape needed to evaluate eligibility. */
15
+ type EligibilityUser = {
16
+ isActive?: boolean;
17
+ included?: {
18
+ statusTypes?: UserStatusTypeDTO[];
19
+ };
20
+ };
21
+ /** Minimal redemption shape needed to evaluate eligibility. */
22
+ type EligibilityRedemption = {
23
+ maxPerUser?: number | null;
24
+ minUserStatusType?: UserStatusTypeDTO | null;
25
+ included?: {
26
+ requiredUserInfo?: {
27
+ isValid: boolean;
28
+ fieldDefinitions?: Array<{
29
+ isMissing?: boolean;
30
+ key?: string;
31
+ id?: string;
32
+ }>;
33
+ } | null;
34
+ booking?: {
35
+ isValid: boolean;
36
+ } | null;
37
+ };
38
+ };
39
+ /**
40
+ * Canonical list of redemption eligibility gates.
41
+ *
42
+ * ⚠️ SYNC CONTRACT: These gates must mirror the validation steps in
43
+ * `RedemptionRedeemWorkflow` (backend). If you add or remove a gate here,
44
+ * update the workflow too — and vice versa.
45
+ *
46
+ * Use this constant in tests to assert that `evaluateRedemptionEligibility`
47
+ * returns exactly these keys (no more, no less):
48
+ *
49
+ * expect(Object.keys(result.checks)).toEqual([...REDEMPTION_ELIGIBILITY_GATES]);
50
+ */
51
+ export declare const REDEMPTION_ELIGIBILITY_GATES: readonly ["userActive", "requiredFields", "booking", "userStatus", "maxPerUser"];
52
+ export type RedemptionEligibilityGate = typeof REDEMPTION_ELIGIBILITY_GATES[number];
53
+ /**
54
+ * Stable machine-readable codes for a failed redemption eligibility check.
55
+ */
56
+ export type RedemptionEligibilityReasonCode = 'USER_INACTIVE' | 'MISSING_REQUIRED_FIELDS' | 'BOOKING_REQUIRED' | 'INSUFFICIENT_USER_STATUS' | 'MAX_PER_USER_REACHED';
57
+ /** Structured detail emitted by redemption eligibility gates on failure. */
58
+ export type RedemptionEligibilityDetail = {
59
+ missingFieldKeys: string[];
60
+ } | {
61
+ minRequiredStatusTypeId: number;
62
+ userStatusTypeIds: number[];
63
+ } | {
64
+ maxPerUser: number;
65
+ userRedeemCount: number;
66
+ };
67
+ /**
68
+ * Result of a single redemption eligibility gate.
69
+ * Specializes the generic {@link EligibilityCheck} with redemption-specific codes/detail.
70
+ */
71
+ export type RedemptionEligibilityCheck = EligibilityCheck<RedemptionEligibilityReasonCode, RedemptionEligibilityDetail>;
72
+ /**
73
+ * Aggregate pre-flight eligibility verdict for a user redeeming a redemption.
74
+ * Specializes the generic {@link Eligibility} with the redeem-time gates.
75
+ * Excludes the live credit-token balance check (validated at redeem time).
76
+ */
77
+ export type RedemptionEligibility = Eligibility<{
78
+ userActive: RedemptionEligibilityCheck;
79
+ requiredFields: RedemptionEligibilityCheck;
80
+ booking: RedemptionEligibilityCheck;
81
+ userStatus: RedemptionEligibilityCheck;
82
+ maxPerUser: RedemptionEligibilityCheck;
83
+ }>;
84
+ /** Signals required to derive a redemption eligibility verdict. */
85
+ export interface RedemptionEligibilityInput {
86
+ user: EligibilityUser;
87
+ redemption: EligibilityRedemption;
88
+ /** All status types — needed for hierarchical status comparison. */
89
+ allStatusTypes: StatusHierarchyNode[];
90
+ /**
91
+ * How many times this user has already redeemed this redemption.
92
+ * Required for the maxPerUser gate. Fetch from GET /redemptions/redeems?userId=&redemptionId=
93
+ */
94
+ userRedeemCount: number;
95
+ }
96
+ /**
97
+ * Derives an aggregate redemption eligibility verdict from the user, redemption and status list.
98
+ *
99
+ * Pure and side-effect free: pass the DTOs directly from your API responses; the function
100
+ * computes all per-gate verdicts (including status hierarchy and maxPerUser math) internally.
101
+ *
102
+ * Requires `?include=requiredUserInfo,booking` on the redemption fetch and
103
+ * `?include=status` on the user fetch for full accuracy.
104
+ */
105
+ export declare function evaluateRedemptionEligibility(input: RedemptionEligibilityInput): RedemptionEligibility;
106
+ export {};
107
+ //# sourceMappingURL=redemption-eligibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redemption-eligibility.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/redemption-eligibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAiC,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,yDAAyD;AACzD,KAAK,eAAe,GAAG;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAC;CACpD,CAAC;AAEF,+DAA+D;AAC/D,KAAK,qBAAqB,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE;QACP,gBAAgB,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC;gBAAE,SAAS,CAAC,EAAE,OAAO,CAAC;gBAAC,GAAG,CAAC,EAAE,MAAM,CAAC;gBAAC,EAAE,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GAAG,IAAI,CAAC;QAC7H,OAAO,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,GAAG,IAAI,CAAC;KACzC,CAAC;CACL,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B,kFAM/B,CAAC;AAEX,MAAM,MAAM,yBAAyB,GAAG,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAEpF;;GAEG;AACH,MAAM,MAAM,+BAA+B,GACrC,eAAe,GACf,yBAAyB,GACzB,kBAAkB,GAClB,0BAA0B,GAC1B,sBAAsB,CAAC;AAE7B,4EAA4E;AAC5E,MAAM,MAAM,2BAA2B,GACjC;IAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9B;IAAE,uBAAuB,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,GAChE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,gBAAgB,CAAC,+BAA+B,EAAE,2BAA2B,CAAC,CAAC;AAExH;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,0BAA0B,CAAC;IACvC,cAAc,EAAE,0BAA0B,CAAC;IAC3C,OAAO,EAAE,0BAA0B,CAAC;IACpC,UAAU,EAAE,0BAA0B,CAAC;IACvC,UAAU,EAAE,0BAA0B,CAAC;CAC1C,CAAC,CAAC;AAEH,mEAAmE;AACnE,MAAM,WAAW,0BAA0B;IACvC,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,qBAAqB,CAAC;IAClC,oEAAoE;IACpE,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;CAC3B;AAaD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,0BAA0B,GAAG,qBAAqB,CA2DtG"}
@@ -0,0 +1,70 @@
1
+ import { meetsMinimumStatusRequirement } from "./status-hierarchy.js";
2
+ /**
3
+ * Canonical list of redemption eligibility gates.
4
+ *
5
+ * ⚠️ SYNC CONTRACT: These gates must mirror the validation steps in
6
+ * `RedemptionRedeemWorkflow` (backend). If you add or remove a gate here,
7
+ * update the workflow too — and vice versa.
8
+ *
9
+ * Use this constant in tests to assert that `evaluateRedemptionEligibility`
10
+ * returns exactly these keys (no more, no less):
11
+ *
12
+ * expect(Object.keys(result.checks)).toEqual([...REDEMPTION_ELIGIBILITY_GATES]);
13
+ */
14
+ export const REDEMPTION_ELIGIBILITY_GATES = [
15
+ 'userActive',
16
+ 'requiredFields',
17
+ 'booking',
18
+ 'userStatus',
19
+ 'maxPerUser',
20
+ ];
21
+ function makeCheck(passed, code, message, detail) {
22
+ return passed
23
+ ? { passed: true, reason: null }
24
+ : { passed: false, reason: { code, message }, ...(detail ? { detail } : {}) };
25
+ }
26
+ /**
27
+ * Derives an aggregate redemption eligibility verdict from the user, redemption and status list.
28
+ *
29
+ * Pure and side-effect free: pass the DTOs directly from your API responses; the function
30
+ * computes all per-gate verdicts (including status hierarchy and maxPerUser math) internally.
31
+ *
32
+ * Requires `?include=requiredUserInfo,booking` on the redemption fetch and
33
+ * `?include=status` on the user fetch for full accuracy.
34
+ */
35
+ export function evaluateRedemptionEligibility(input) {
36
+ const { user, redemption, allStatusTypes, userRedeemCount } = input;
37
+ const userStatusTypeIds = (user.included?.statusTypes ?? []).map(s => s.id).filter((id) => id !== undefined);
38
+ const minUserStatusTypeId = redemption.minUserStatusType?.id ?? null;
39
+ const requiredUserInfo = redemption.included?.requiredUserInfo;
40
+ const booking = redemption.included?.booking;
41
+ // userStatus — delegate to shared pure hierarchy check
42
+ const userStatusPassed = !minUserStatusTypeId ||
43
+ meetsMinimumStatusRequirement(minUserStatusTypeId, userStatusTypeIds, allStatusTypes);
44
+ // maxPerUser — pure numeric comparison
45
+ const maxPerUserPassed = !redemption.maxPerUser || userRedeemCount < redemption.maxPerUser;
46
+ // requiredFields — use isValid from the include; derive missing keys from field definitions
47
+ const requiredFieldsPassed = !requiredUserInfo || requiredUserInfo.isValid;
48
+ const missingFieldKeys = requiredUserInfo?.fieldDefinitions
49
+ ?.filter(f => f.isMissing)
50
+ .map(f => f.key ?? f.id ?? '')
51
+ .filter(Boolean) ?? [];
52
+ const checks = {
53
+ userActive: makeCheck(user.isActive !== false, 'USER_INACTIVE', 'User account is inactive'),
54
+ requiredFields: makeCheck(requiredFieldsPassed, 'MISSING_REQUIRED_FIELDS', 'User is missing one or more required fields', requiredFieldsPassed ? undefined : { missingFieldKeys }),
55
+ booking: makeCheck(!booking || booking.isValid, 'BOOKING_REQUIRED', 'User does not have a valid booking meeting the requirements'),
56
+ userStatus: makeCheck(userStatusPassed, 'INSUFFICIENT_USER_STATUS', 'User does not meet the minimum status requirement', userStatusPassed || !minUserStatusTypeId ? undefined : {
57
+ minRequiredStatusTypeId: minUserStatusTypeId,
58
+ userStatusTypeIds,
59
+ }),
60
+ maxPerUser: makeCheck(maxPerUserPassed, 'MAX_PER_USER_REACHED', 'User has reached the maximum number of redeems allowed', maxPerUserPassed || !redemption.maxPerUser ? undefined : {
61
+ maxPerUser: redemption.maxPerUser,
62
+ userRedeemCount,
63
+ }),
64
+ };
65
+ return {
66
+ isEligible: Object.values(checks).every(c => c.passed),
67
+ checks,
68
+ };
69
+ }
70
+ //# sourceMappingURL=redemption-eligibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redemption-eligibility.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/redemption-eligibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * User status hierarchy resolution (pure, framework-agnostic).
3
+ *
4
+ * Centralizes the rule for "does a user's earned status satisfy a minimum
5
+ * requirement?" so backend and frontend evaluate it identically.
6
+ *
7
+ * Hierarchy semantics:
8
+ * - Exact match always qualifies.
9
+ * - Otherwise a user qualifies if they hold a status in the SAME hierarchy with
10
+ * an `order` greater than or equal to the required status `order`.
11
+ * - Hierarchies (tracks) are separated by tags: statuses with no tags share the
12
+ * global hierarchy; tagged statuses share a track only when their tags overlap.
13
+ * - A required status without an `order` requires an exact match (backward compatible).
14
+ */
15
+ /** Minimal status-type shape needed to resolve hierarchy. */
16
+ export interface StatusHierarchyNode {
17
+ id: number;
18
+ /** Higher = more prestigious. Null/undefined = no hierarchy ranking. */
19
+ order?: number | null;
20
+ /** Track tags. Empty/undefined = global hierarchy. */
21
+ tags?: string[] | null;
22
+ }
23
+ /**
24
+ * Determines whether a user meets a minimum status requirement, honoring the
25
+ * tag-scoped status hierarchy.
26
+ *
27
+ * @param requiredStatusId - The minimum status type ID required.
28
+ * @param userStatusIds - Status type IDs the user has earned.
29
+ * @param allStatusTypes - All status types (must include the required and user statuses).
30
+ * @returns True if the user satisfies the requirement (exact match or higher in same track).
31
+ */
32
+ export declare function meetsMinimumStatusRequirement(requiredStatusId: number, userStatusIds: number[], allStatusTypes: StatusHierarchyNode[]): boolean;
33
+ //# sourceMappingURL=status-hierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-hierarchy.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/status-hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC1B;AAYD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CACzC,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,EAAE,EACvB,cAAc,EAAE,mBAAmB,EAAE,GACtC,OAAO,CA4CT"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * User status hierarchy resolution (pure, framework-agnostic).
3
+ *
4
+ * Centralizes the rule for "does a user's earned status satisfy a minimum
5
+ * requirement?" so backend and frontend evaluate it identically.
6
+ *
7
+ * Hierarchy semantics:
8
+ * - Exact match always qualifies.
9
+ * - Otherwise a user qualifies if they hold a status in the SAME hierarchy with
10
+ * an `order` greater than or equal to the required status `order`.
11
+ * - Hierarchies (tracks) are separated by tags: statuses with no tags share the
12
+ * global hierarchy; tagged statuses share a track only when their tags overlap.
13
+ * - A required status without an `order` requires an exact match (backward compatible).
14
+ */
15
+ /**
16
+ * Returns true if any two tag arrays share at least one tag (case-insensitive).
17
+ * Statuses that overlap on tags belong to the same track.
18
+ */
19
+ function tagsOverlap(tags1, tags2) {
20
+ if (!tags1.length || !tags2.length)
21
+ return false;
22
+ const set1 = new Set(tags1.map(t => t.toLowerCase()));
23
+ return tags2.some(tag => set1.has(tag.toLowerCase()));
24
+ }
25
+ /**
26
+ * Determines whether a user meets a minimum status requirement, honoring the
27
+ * tag-scoped status hierarchy.
28
+ *
29
+ * @param requiredStatusId - The minimum status type ID required.
30
+ * @param userStatusIds - Status type IDs the user has earned.
31
+ * @param allStatusTypes - All status types (must include the required and user statuses).
32
+ * @returns True if the user satisfies the requirement (exact match or higher in same track).
33
+ */
34
+ export function meetsMinimumStatusRequirement(requiredStatusId, userStatusIds, allStatusTypes) {
35
+ // Quick check: exact match
36
+ if (userStatusIds.includes(requiredStatusId)) {
37
+ return true;
38
+ }
39
+ const statusMap = new Map(allStatusTypes.map(s => [s.id, s]));
40
+ const requiredStatus = statusMap.get(requiredStatusId);
41
+ if (!requiredStatus) {
42
+ return false; // Required status doesn't exist
43
+ }
44
+ const requiredOrder = requiredStatus.order;
45
+ if (requiredOrder === null || requiredOrder === undefined) {
46
+ // No order on required status = require exact match only (backward compatible)
47
+ return false;
48
+ }
49
+ const requiredTags = requiredStatus.tags || [];
50
+ // Check if user has any status with equal or higher order in the same hierarchy
51
+ for (const userStatusId of userStatusIds) {
52
+ const userStatus = statusMap.get(userStatusId);
53
+ if (!userStatus)
54
+ continue;
55
+ const userOrder = userStatus.order;
56
+ if (userOrder === null || userOrder === undefined)
57
+ continue; // No order
58
+ const userTags = userStatus.tags || [];
59
+ // Same hierarchy when: both untagged (global), OR they share a track tag.
60
+ const sameHierarchy = (requiredTags.length === 0 && userTags.length === 0) ||
61
+ tagsOverlap(requiredTags, userTags);
62
+ if (!sameHierarchy)
63
+ continue; // Different hierarchy
64
+ if (userOrder >= requiredOrder) {
65
+ return true;
66
+ }
67
+ }
68
+ return false;
69
+ }
70
+ //# sourceMappingURL=status-hierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-hierarchy.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/status-hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAe,EAAE,KAAe;IACjD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,6BAA6B,CACzC,gBAAwB,EACxB,aAAuB,EACvB,cAAqC;IAErC,2BAA2B;IAC3B,IAAI,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9D,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC,CAAC,gCAAgC;IAClD,CAAC;IAED,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC;IAC3C,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACxD,+EAA+E;QAC/E,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC;IAE/C,gFAAgF;IAChF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC;QACnC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS;YAAE,SAAS,CAAC,WAAW;QAExE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;QAEvC,0EAA0E;QAC1E,MAAM,aAAa,GACf,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;YACpD,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAExC,IAAI,CAAC,aAAa;YAAE,SAAS,CAAC,sBAAsB;QAEpD,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -151,10 +151,10 @@ export const extractTagsFromMetadata = (metadata) => {
151
151
  // Case-insensitive comparison to handle legacy formats ('Tags', 'tags', etc.)
152
152
  const tagsAttribute = metadata.attributes.find(attr => attr.trait_type.toLowerCase() === TokenStorageDataAttributesType.TAGS.toLowerCase());
153
153
  if (tagsAttribute?.value) {
154
- // Tags are stored as comma-separated string, split and trim
154
+ // Tags are stored as comma-separated string, split, trim, and normalize to lowercase
155
155
  return tagsAttribute.value
156
156
  .split(',')
157
- .map(tag => tag.trim())
157
+ .map(tag => tag.trim().toLowerCase()) // ✅ Always return lowercase tags
158
158
  .filter(Boolean);
159
159
  }
160
160
  return [];
@@ -1 +1 @@
1
- {"version":3,"file":"token-metadata.functions.js","sourceRoot":"","sources":["../../../../src/shared-patterns/functions/token-metadata.functions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-metadata.functions.js","sourceRoot":"","sources":["../../../../src/shared-patterns/functions/token-metadata.functions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAA0B,MAAM,gDAAgD,CAAC;AAC5G,OAAO,EAAoB,8BAA8B,EAAE,MAAM,0DAA0D,CAAC;AAG5H;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAW,EAAE;IACrE,MAAM,QAAQ,GAAG,uBAAuB,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,YAAgC,EAChC,gBAAyB,EACzB,eAAsB,EACtB,eAAqB,IAAI,IAAI,EAAE,EAC/B,cAIC,EACiB,EAAE;IACpB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,8DAA8D;QAC9D,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,uFAAuF;IACvF,MAAM,iBAAiB,GAAG,cAAc,EAAE,eAAe,IAAI,gBAAgB,CAAC;IAE9E,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,kBAAkB,CAAC,UAAU;YAChC,OAAO,eAAe,CAAC;QAEzB,KAAK,kBAAkB,CAAC,kBAAkB;YACxC,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1C,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,gBAAgB,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC;QAEpB,KAAK,kBAAkB,CAAC,mBAAmB;YACzC,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACjE,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3C,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,gBAAgB,CAAC,CAAC;YAChE,OAAO,WAAW,CAAC;QAErB,KAAK,kBAAkB,CAAC,oBAAoB;YAC1C,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACjE,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5C,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,gBAAgB,CAAC,CAAC;YAClE,OAAO,YAAY,CAAC;QAEtB,KAAK,kBAAkB,CAAC,YAAY;YAClC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1C,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,mDAAmD;YAC1E,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,UAAU,CAAC;QAEpB,KAAK,kBAAkB,CAAC,WAAW;YACjC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;YACnC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtB,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpC,OAAO,SAAS,CAAC;QAEnB,sDAAsD;QACtD,KAAK,kBAAkB,CAAC,YAAY;YAClC,kEAAkE;YAClE,OAAO,cAAc,EAAE,WAAW,CAAC;QAErC,KAAK,kBAAkB,CAAC,kBAAkB;YACxC,yEAAyE;YACzE,OAAO,cAAc,EAAE,cAAc,IAAI,cAAc,EAAE,WAAW,CAAC;QAEvE,KAAK,kBAAkB,CAAC,iBAAiB;YACvC,IAAI,CAAC,cAAc,EAAE,WAAW;gBAAE,OAAO,SAAS,CAAC;YACnD,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,IAAI,CAAC;gBAAE,OAAO,cAAc,CAAC,WAAW,CAAC;YACpF,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7D,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;YACvE,OAAO,eAAe,CAAC;QAEzB,KAAK,kBAAkB,CAAC,kBAAkB;YACxC,IAAI,CAAC,cAAc,EAAE,WAAW;gBAAE,OAAO,SAAS,CAAC;YACnD,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,IAAI,CAAC;gBAAE,OAAO,cAAc,CAAC,WAAW,CAAC;YACpF,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC9D,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,iBAAiB,CAAC,CAAC;YAC3E,OAAO,gBAAgB,CAAC;QAE1B;YACE,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,UAAwB,EACxB,gBAAsB,IAAI,IAAI,EAAE,EACX,EAAE;IACvB,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC;AAC9C,CAAC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,QAAiC,EAAe,EAAE;IAC9F,IAAI,CAAC,QAAQ,EAAE,UAAU;QAAE,OAAO,IAAI,CAAC;IAEvC,uDAAuD;IACvD,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAC9C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,8BAA8B,CAAC,WAAW,CAAC,WAAW,EAAE,CACnG,CAAC;IAEF,IAAI,eAAe,EAAE,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAiC,EAAY,EAAE;IACrF,IAAI,CAAC,QAAQ,EAAE,UAAU;QAAE,OAAO,EAAE,CAAC;IAErC,8EAA8E;IAC9E,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAC5C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,CAC5F,CAAC;IAEF,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;QACzB,qFAAqF;QACrF,OAAO,aAAa,CAAC,KAAK;aACvB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,iCAAiC;aACtE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,QAAiC,EAAY,EAAE;IAC5F,IAAI,CAAC,QAAQ,EAAE,UAAU;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CACnD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,8BAA8B,CAAC,YAAY,CAAC,WAAW,EAAE,CACpG,CAAC;IAEF,IAAI,oBAAoB,EAAE,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,6BAAsC,EACtC,cAA+B,EAC/B,eAAgC,EACJ,EAAE;IAC9B,qEAAqE;IACrE,MAAM,uBAAuB,GAAG,6BAA6B,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5F,IAAI,CAAC,cAAc,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,qEAAqE;IACrE,OAAO;QACL,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;KACjB,CAAC;AACtB,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorins/pers-shared",
3
- "version": "2.1.191",
3
+ "version": "2.1.192",
4
4
  "scripts": {
5
5
  "clean": "find dist -type f -delete 2>/dev/null || true",
6
6
  "build:esm": "tsc -p tsconfig.esm.json && node scripts/add-js-extensions.js",