@thisisagile/easy 18.6.0 → 18.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/dist/{chunk-34COXZ5A.mjs → chunk-5N6Q7OXJ.mjs} +3 -3
  2. package/dist/{chunk-ZBVKM7WT.mjs → chunk-63DTRTSC.mjs} +4 -8
  3. package/dist/{chunk-ZBVKM7WT.mjs.map → chunk-63DTRTSC.mjs.map} +1 -1
  4. package/dist/{chunk-U3NVU37K.mjs → chunk-6PMTGQVO.mjs} +3 -3
  5. package/dist/{chunk-ISRJB7Z4.mjs → chunk-6YTIRHPN.mjs} +4 -6
  6. package/dist/{chunk-ISRJB7Z4.mjs.map → chunk-6YTIRHPN.mjs.map} +1 -1
  7. package/dist/{chunk-GOZMSSH5.mjs → chunk-AYR4US3Z.mjs} +2 -2
  8. package/dist/{chunk-6MBDCDGA.mjs → chunk-B37NZCNW.mjs} +2 -2
  9. package/dist/{chunk-H73MZAGT.mjs → chunk-FF3BNZ4H.mjs} +3 -5
  10. package/dist/{chunk-H73MZAGT.mjs.map → chunk-FF3BNZ4H.mjs.map} +1 -1
  11. package/dist/{chunk-WWYPWYFC.mjs → chunk-FFD2T6YV.mjs} +2 -2
  12. package/dist/{chunk-GV6NUD6R.mjs → chunk-FSWASMJZ.mjs} +2 -2
  13. package/dist/{chunk-TRR2LTWJ.mjs → chunk-GF7JYGJU.mjs} +4 -8
  14. package/dist/{chunk-TRR2LTWJ.mjs.map → chunk-GF7JYGJU.mjs.map} +1 -1
  15. package/dist/{chunk-LPT6LW5N.mjs → chunk-GKQMIKIY.mjs} +2 -2
  16. package/dist/{chunk-C6VQGKDB.mjs → chunk-IESVFCB3.mjs} +3 -3
  17. package/dist/{chunk-JZCNZKGP.mjs → chunk-IYUYA5OX.mjs} +5 -5
  18. package/dist/{chunk-SW73SKB2.mjs → chunk-J5PB7ZVO.mjs} +4 -6
  19. package/dist/{chunk-SW73SKB2.mjs.map → chunk-J5PB7ZVO.mjs.map} +1 -1
  20. package/dist/{chunk-V6TMXDF7.mjs → chunk-JI7MC5EA.mjs} +2 -2
  21. package/dist/{chunk-GMFUUU3V.mjs → chunk-JM6NAJQ3.mjs} +4 -6
  22. package/dist/{chunk-GMFUUU3V.mjs.map → chunk-JM6NAJQ3.mjs.map} +1 -1
  23. package/dist/{chunk-2SE4U4T2.mjs → chunk-JNZUGKMO.mjs} +2 -2
  24. package/dist/{chunk-MLYUI7R7.mjs → chunk-KPXOQFEB.mjs} +4 -6
  25. package/dist/{chunk-MLYUI7R7.mjs.map → chunk-KPXOQFEB.mjs.map} +1 -1
  26. package/dist/{chunk-FAFNTQIS.mjs → chunk-LHDTOERW.mjs} +3 -5
  27. package/dist/{chunk-FAFNTQIS.mjs.map → chunk-LHDTOERW.mjs.map} +1 -1
  28. package/dist/{chunk-CFJJ2C6C.mjs → chunk-M2S4OLVZ.mjs} +2 -2
  29. package/dist/{chunk-SW5NBVHL.mjs → chunk-O4RWZGFC.mjs} +4 -6
  30. package/dist/{chunk-SW5NBVHL.mjs.map → chunk-O4RWZGFC.mjs.map} +1 -1
  31. package/dist/{chunk-ZEIIFJDX.mjs → chunk-QBPSI5NM.mjs} +4 -4
  32. package/dist/{chunk-HBDIZSIE.mjs → chunk-QLEGIYVU.mjs} +3 -5
  33. package/dist/{chunk-HBDIZSIE.mjs.map → chunk-QLEGIYVU.mjs.map} +1 -1
  34. package/dist/{chunk-DUYHH6LC.mjs → chunk-QZPBFVZL.mjs} +2 -2
  35. package/dist/{chunk-YXLGHJ5Q.mjs → chunk-RBJBAJOK.mjs} +2 -2
  36. package/dist/{chunk-5C5OHGRW.mjs → chunk-RW4AKBCN.mjs} +3 -3
  37. package/dist/{chunk-5FD5G442.mjs → chunk-SBT3WGBP.mjs} +7 -7
  38. package/dist/{chunk-USR4ETA7.mjs → chunk-TNIG6FU2.mjs} +2 -2
  39. package/dist/{chunk-5BGTUK7G.mjs → chunk-TUO7ZPSP.mjs} +540 -104
  40. package/dist/chunk-TUO7ZPSP.mjs.map +1 -0
  41. package/dist/{chunk-UATZAAX2.mjs → chunk-WOUH6UVC.mjs} +3 -5
  42. package/dist/{chunk-UATZAAX2.mjs.map → chunk-WOUH6UVC.mjs.map} +1 -1
  43. package/dist/{chunk-KXNGKB2N.mjs → chunk-XQ4F3L4F.mjs} +22 -16
  44. package/dist/{chunk-KXNGKB2N.mjs.map → chunk-XQ4F3L4F.mjs.map} +1 -1
  45. package/dist/{chunk-5MCJXABA.mjs → chunk-XQJ5LQEQ.mjs} +2 -2
  46. package/dist/{chunk-5JE4QW4E.mjs → chunk-ZBOGLMG2.mjs} +4 -4
  47. package/dist/{chunk-UGNNHNYX.mjs → chunk-ZRH6FGUK.mjs} +4 -4
  48. package/dist/{chunk-LCJEJ3LU.mjs → chunk-ZZ73Z5CU.mjs} +2 -2
  49. package/dist/data/Condition.mjs +5 -4
  50. package/dist/data/Database.mjs +4 -5
  51. package/dist/data/Field.mjs +5 -4
  52. package/dist/data/Field.mjs.map +1 -1
  53. package/dist/data/InMemoryGateway.mjs +4 -9
  54. package/dist/data/InMemoryGateway.mjs.map +1 -1
  55. package/dist/domain/Audit.mjs +8 -13
  56. package/dist/domain/Child.mjs +5 -10
  57. package/dist/domain/Child.mjs.map +1 -1
  58. package/dist/domain/DateTime.mjs +4 -9
  59. package/dist/domain/Entity.mjs +8 -13
  60. package/dist/domain/Entity.mjs.map +1 -1
  61. package/dist/domain/Repo.mjs +7 -14
  62. package/dist/domain/Repo.mjs.map +1 -1
  63. package/dist/domain/Struct.mjs +4 -9
  64. package/dist/domain/Typo.mjs +4 -9
  65. package/dist/domain/Typo.mjs.map +1 -1
  66. package/dist/http/CacheControl.mjs +6 -12
  67. package/dist/http/CacheControl.mjs.map +1 -1
  68. package/dist/http/ContentType.mjs +4 -5
  69. package/dist/http/HttpStatus.mjs +4 -5
  70. package/dist/http/HttpVerb.mjs +4 -5
  71. package/dist/http/LocalRequestStore.mjs +2 -7
  72. package/dist/http/LocalRequestStore.mjs.map +1 -1
  73. package/dist/http/RequestOptions.mjs +4 -9
  74. package/dist/http/RestResult.mjs +4 -9
  75. package/dist/http/toResponse.mjs +5 -10
  76. package/dist/index.js +540 -521
  77. package/dist/index.js.map +1 -1
  78. package/dist/process/App.mjs +3 -8
  79. package/dist/process/App.mjs.map +1 -1
  80. package/dist/process/Manage.mjs +4 -9
  81. package/dist/process/Manage.mjs.map +1 -1
  82. package/dist/process/Scope.mjs +3 -8
  83. package/dist/process/Search.mjs +4 -9
  84. package/dist/process/UseCase.mjs +5 -12
  85. package/dist/process/UseCase.mjs.map +1 -1
  86. package/dist/resources/Req.mjs +4 -9
  87. package/dist/resources/Req.mjs.map +1 -1
  88. package/dist/services/Api.mjs +12 -17
  89. package/dist/services/ApiGateway.mjs +15 -20
  90. package/dist/services/AxiosProvider.mjs +10 -15
  91. package/dist/services/MappedRouteGateway.mjs +18 -23
  92. package/dist/services/MappedRouteGateway.mjs.map +1 -1
  93. package/dist/services/RouteGateway.mjs +16 -21
  94. package/dist/services/ViewRouteGateway.mjs +18 -24
  95. package/dist/services/ViewRouteGateway.mjs.map +1 -1
  96. package/dist/sql/Column.mjs +3 -8
  97. package/dist/sql/Count.mjs +6 -4
  98. package/dist/sql/Delete.mjs +5 -3
  99. package/dist/sql/Insert.mjs +5 -3
  100. package/dist/sql/Select.mjs +5 -3
  101. package/dist/sql/SqlQuery.mjs +4 -2
  102. package/dist/sql/Table.mjs +13 -18
  103. package/dist/sql/Table.mjs.map +1 -1
  104. package/dist/sql/TableGateway.mjs +5 -11
  105. package/dist/sql/TableGateway.mjs.map +1 -1
  106. package/dist/sql/Update.mjs +5 -3
  107. package/dist/types/Cache.mjs +3 -3
  108. package/dist/types/CacheAge.mjs +4 -9
  109. package/dist/types/Case.mjs +2 -7
  110. package/dist/types/Context.mjs +2 -7
  111. package/dist/types/Enum.mjs +3 -4
  112. package/dist/types/Environment.mjs +3 -4
  113. package/dist/types/Environment.mjs.map +1 -1
  114. package/dist/types/Exception.mjs +2 -7
  115. package/dist/types/Gateway.mjs +3 -8
  116. package/dist/types/IsEqual.mjs +2 -8
  117. package/dist/types/Json.mjs +4 -3
  118. package/dist/types/List.mjs +3 -1
  119. package/dist/types/Meta.mjs +3 -3
  120. package/dist/types/Number.mjs +3 -8
  121. package/dist/types/Object.mjs +3 -2
  122. package/dist/types/PageList.mjs +3 -8
  123. package/dist/types/Parser.mjs +2 -7
  124. package/dist/types/Parser.mjs.map +1 -1
  125. package/dist/types/Repository.mjs +3 -8
  126. package/dist/types/Result.mjs +2 -7
  127. package/dist/types/Results.mjs +2 -7
  128. package/dist/types/Tag.mjs +3 -3
  129. package/dist/types/Template.mjs +2 -7
  130. package/dist/types/ToText.mjs +2 -7
  131. package/dist/types/Try.mjs +2 -7
  132. package/dist/types/Uri.mjs +5 -13
  133. package/dist/types/Uri.mjs.map +1 -1
  134. package/dist/utils/If.d.ts +2 -0
  135. package/dist/utils/If.mjs +5 -1
  136. package/dist/utils/Mapper.mjs +5 -5
  137. package/dist/utils/Period.mjs +4 -9
  138. package/dist/utils/Period.mjs.map +1 -1
  139. package/dist/utils/Promise.mjs +3 -3
  140. package/dist/utils/Seconds.mjs +4 -2
  141. package/dist/utils/Sentence.mjs +2 -7
  142. package/dist/utils/Sentence.mjs.map +1 -1
  143. package/dist/utils/View.d.ts +7 -0
  144. package/dist/utils/View.mjs +5 -11
  145. package/dist/validation/Contraints.mjs +3 -8
  146. package/dist/validation/Validate.mjs +2 -7
  147. package/dist/validation/When.mjs +2 -7
  148. package/package.json +1 -1
  149. package/src/utils/If.ts +7 -0
  150. package/src/utils/View.ts +14 -0
  151. package/dist/chunk-2PL5VUHT.mjs +0 -37
  152. package/dist/chunk-2PL5VUHT.mjs.map +0 -1
  153. package/dist/chunk-5BGTUK7G.mjs.map +0 -1
  154. package/dist/chunk-5FAZA55F.mjs +0 -58
  155. package/dist/chunk-5FAZA55F.mjs.map +0 -1
  156. package/dist/chunk-7A3RM67L.mjs +0 -68
  157. package/dist/chunk-7A3RM67L.mjs.map +0 -1
  158. package/dist/chunk-AJZIKJEC.mjs +0 -54
  159. package/dist/chunk-AJZIKJEC.mjs.map +0 -1
  160. package/dist/chunk-AQXV7L65.mjs +0 -310
  161. package/dist/chunk-AQXV7L65.mjs.map +0 -1
  162. package/dist/chunk-DC5HIBQG.mjs +0 -23
  163. package/dist/chunk-DC5HIBQG.mjs.map +0 -1
  164. /package/dist/{chunk-34COXZ5A.mjs.map → chunk-5N6Q7OXJ.mjs.map} +0 -0
  165. /package/dist/{chunk-U3NVU37K.mjs.map → chunk-6PMTGQVO.mjs.map} +0 -0
  166. /package/dist/{chunk-GOZMSSH5.mjs.map → chunk-AYR4US3Z.mjs.map} +0 -0
  167. /package/dist/{chunk-6MBDCDGA.mjs.map → chunk-B37NZCNW.mjs.map} +0 -0
  168. /package/dist/{chunk-WWYPWYFC.mjs.map → chunk-FFD2T6YV.mjs.map} +0 -0
  169. /package/dist/{chunk-GV6NUD6R.mjs.map → chunk-FSWASMJZ.mjs.map} +0 -0
  170. /package/dist/{chunk-LPT6LW5N.mjs.map → chunk-GKQMIKIY.mjs.map} +0 -0
  171. /package/dist/{chunk-C6VQGKDB.mjs.map → chunk-IESVFCB3.mjs.map} +0 -0
  172. /package/dist/{chunk-JZCNZKGP.mjs.map → chunk-IYUYA5OX.mjs.map} +0 -0
  173. /package/dist/{chunk-V6TMXDF7.mjs.map → chunk-JI7MC5EA.mjs.map} +0 -0
  174. /package/dist/{chunk-2SE4U4T2.mjs.map → chunk-JNZUGKMO.mjs.map} +0 -0
  175. /package/dist/{chunk-CFJJ2C6C.mjs.map → chunk-M2S4OLVZ.mjs.map} +0 -0
  176. /package/dist/{chunk-ZEIIFJDX.mjs.map → chunk-QBPSI5NM.mjs.map} +0 -0
  177. /package/dist/{chunk-DUYHH6LC.mjs.map → chunk-QZPBFVZL.mjs.map} +0 -0
  178. /package/dist/{chunk-YXLGHJ5Q.mjs.map → chunk-RBJBAJOK.mjs.map} +0 -0
  179. /package/dist/{chunk-5C5OHGRW.mjs.map → chunk-RW4AKBCN.mjs.map} +0 -0
  180. /package/dist/{chunk-5FD5G442.mjs.map → chunk-SBT3WGBP.mjs.map} +0 -0
  181. /package/dist/{chunk-USR4ETA7.mjs.map → chunk-TNIG6FU2.mjs.map} +0 -0
  182. /package/dist/{chunk-5MCJXABA.mjs.map → chunk-XQJ5LQEQ.mjs.map} +0 -0
  183. /package/dist/{chunk-5JE4QW4E.mjs.map → chunk-ZBOGLMG2.mjs.map} +0 -0
  184. /package/dist/{chunk-UGNNHNYX.mjs.map → chunk-ZRH6FGUK.mjs.map} +0 -0
  185. /package/dist/{chunk-LCJEJ3LU.mjs.map → chunk-ZZ73Z5CU.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -148,6 +148,7 @@ __export(src_exports, {
148
148
  ifA: () => ifA,
149
149
  ifDefined: () => ifDefined,
150
150
  ifEither: () => ifEither,
151
+ ifEqual: () => ifEqual,
151
152
  ifFalse: () => ifFalse,
152
153
  ifGet: () => ifGet,
153
154
  ifNotEmpty: () => ifNotEmpty,
@@ -671,26 +672,6 @@ var asList = (c, items = []) => toList(toArray(items).map((i) => new c(i)));
671
672
  var maxValue = (l, key) => l.desc(key).first()?.[key];
672
673
  var minValue = (l, key) => l.asc(key).first()?.[key];
673
674
 
674
- // src/utils/If.ts
675
- function ifTrue(o, f, alt) {
676
- return isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
677
- }
678
- function ifFalse(o, f, alt) {
679
- return !isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
680
- }
681
- function ifDefined(o, f, alt) {
682
- return isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt);
683
- }
684
- function ifNotEmpty(o, f = (o2) => o2, alt) {
685
- return isNotEmpty(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
686
- }
687
- function ifEither(os, f = (o) => o, alt) {
688
- return use(
689
- toList(os).first((o) => isPresent(o)),
690
- (o) => isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt, o)
691
- );
692
- }
693
-
694
675
  // src/types/Object.ts
695
676
  function entries(subject) {
696
677
  return ifDefined(
@@ -716,124 +697,29 @@ function extractKeys(obj, keys2) {
716
697
  );
717
698
  }
718
699
 
719
- // src/types/Json.ts
720
- var isJson = (subject) => isA(subject, "toJSON");
721
- var json = {
722
- parse: (subject) => JSON.parse(JSON.stringify(subject ?? {})),
723
- merge: (...subjects) => json.parse(subjects.map((s) => asJson(s, (s2) => json.parse(s2))).reduce((js, j) => ({ ...js, ...j }), {})),
724
- delete: (subject, key) => {
725
- ifDefined(subject, () => delete subject[key]);
726
- return subject;
727
- },
728
- set: (subject, key = "", value) => isEmpty(key) ? subject : value !== void 0 ? { ...subject, ...{ [key]: value } } : json.delete(subject, key),
729
- omit: (subject, ...keys2) => keys2.reduce((js, k) => json.delete(js, k), json.parse(subject)),
730
- pick: (subject, ...keys2) => keys2.reduce((js, k) => json.set(js, k, subject[k]), {}),
731
- defaults: (options = {}, defaults = {}) => json.merge(defaults, options),
732
- isSubset: (subject, subset) => !entries(subset).some(([k, v]) => subject[k] !== v),
733
- split: (t, keys2, prop = "extracted") => {
734
- const extracted = {};
735
- const rest2 = { ...t };
736
- keys2.forEach((key) => {
737
- if (key in t) {
738
- ifDefined(t[key], (v) => extracted[key] = v);
739
- delete rest2[key];
740
- }
741
- });
742
- return { [prop]: extracted, ...rest2 };
743
- }
744
- };
745
- var toJson = json.merge;
746
- var asJson = (j, alt = {}) => isJson(j) ? j.toJSON() : isObject(j) ? j : ofGet(alt, j);
747
- var Any = class {
748
- constructor(value) {
749
- this.value = value;
750
- }
751
- merge = (...subjects) => any(json.merge(this.value, ...subjects));
752
- delete = (key) => any(json.delete(this.value, key));
753
- omit = (...keys2) => any(json.omit(this.value, ...keys2));
754
- set = (key, value) => any(json.set(this.value, key, value));
755
- toJSON() {
756
- return this.value;
757
- }
758
- };
759
- var takeFirstKey = (j, alt = "") => entries(asJson(j)).first(([, v]) => isDefined(v))?.[0] ?? alt;
760
- var takeFirst = (j) => entries(j).first(([, v]) => isDefined(v));
761
- var any = (value) => new Any(value);
762
-
763
- // src/utils/Convert.ts
764
- var Convert = class {
765
- constructor(from, to) {
766
- this.from = from;
767
- this.to = to;
768
- }
769
- };
770
- var convert = {
771
- default: new Convert(
772
- (a) => a,
773
- (a) => a
774
- ),
775
- ignore: new Convert(
776
- () => void 0,
777
- () => void 0
778
- ),
779
- toBool: {
780
- fromNumber: new Convert(
781
- (b) => b ? 1 : 0,
782
- (n) => n !== 0
783
- ),
784
- fromString: new Convert(
785
- (b) => b ? "true" : "false",
786
- (s) => s === "true"
787
- )
788
- },
789
- toDate: {
790
- fromString: new Convert(
791
- (s) => new Date(s).toISOString(),
792
- (s) => s
793
- )
794
- },
795
- toNumber: {
796
- fromString: new Convert(
797
- (n) => asString(n),
798
- (s) => parseInt(s)
799
- )
800
- }
801
- };
802
-
803
- // src/data/Condition.ts
804
- var Condition = class {
805
- constructor(key, operator, value) {
806
- this.key = key;
807
- this.operator = operator;
808
- this.value = value;
809
- }
810
- and = (...others) => new LogicalCondition("and", [this, ...others]);
811
- or = (...others) => new LogicalCondition("or", [this, ...others]);
812
- toJSON() {
813
- return { [this.key]: { [`$${this.operator}`]: json.parse(this.value) } };
814
- }
815
- };
816
- var LogicalCondition = class {
817
- constructor(operator, conditions) {
818
- this.operator = operator;
819
- this.conditions = conditions;
820
- }
821
- toJSON() {
822
- return { [`$${this.operator}`]: this.conditions.map((c) => c.toJSON()) };
823
- }
824
- };
825
- var SortCondition = class extends Condition {
826
- constructor(key, value) {
827
- super(key, "", value);
828
- this.key = key;
829
- this.value = value;
830
- }
831
- toJSON() {
832
- return { [this.key]: this.value };
833
- }
700
+ // src/utils/Promise.ts
701
+ var resolve = (subject) => Promise.resolve(subject);
702
+ var reject = (e) => Promise.reject(e);
703
+ var tuple = {
704
+ 2: (first, second) => Promise.all([first, second]),
705
+ 3: (first, second, third) => Promise.all([first, second, third]),
706
+ 4: (first, second, third, forth) => Promise.all([first, second, third, forth]),
707
+ 5: (first, second, third, forth, fifth) => Promise.all([first, second, third, forth, fifth]),
708
+ all: (first, second) => Promise.all([first, Promise.all(second)]),
709
+ spread: (first, ...second) => Promise.all([first, Promise.all(toArray(second))]),
710
+ list: (list) => Promise.all([...list]).then(toList),
711
+ settled: (list) => Promise.allSettled([...list]).then((rs) => ({
712
+ fulfilled: toList(...rs.filter((r) => r.status === "fulfilled").map((r) => r.value)),
713
+ rejected: toList(...rs.filter((r) => r.status === "rejected").map((r) => asString(r.reason)))
714
+ })),
715
+ object: (obj) => use(keys(obj), (ks) => tuple.list(values(obj)).then((vs) => vs.reduce((acc, v, i) => on(acc, (a) => a[ks[i]] = v), {})))
834
716
  };
835
- var toCondition = (field, operator, value, conv = convert.default) => new Condition(field, operator, conv.from(value));
836
- var isSortCondition = (s) => isDefined(s) && s instanceof SortCondition;
717
+ var tuple2 = tuple[2];
718
+ var tuple3 = tuple[3];
719
+ var tuple4 = tuple[4];
720
+ var tuple5 = tuple[5];
721
+ var tupleO = tuple.object;
722
+ var settled = tuple.settled;
837
723
 
838
724
  // src/types/Meta.ts
839
725
  var import_reflect_metadata = require("reflect-metadata");
@@ -919,69 +805,305 @@ var Enum = class {
919
805
  };
920
806
  var isEnum = (e) => isDefined(e) && e instanceof Enum && isAn(e, "name", "id", "code");
921
807
 
922
- // src/utils/Promise.ts
923
- var resolve = (subject) => Promise.resolve(subject);
924
- var reject = (e) => Promise.reject(e);
925
- var tuple = {
926
- 2: (first, second) => Promise.all([first, second]),
927
- 3: (first, second, third) => Promise.all([first, second, third]),
928
- 4: (first, second, third, forth) => Promise.all([first, second, third, forth]),
929
- 5: (first, second, third, forth, fifth) => Promise.all([first, second, third, forth, fifth]),
930
- all: (first, second) => Promise.all([first, Promise.all(second)]),
931
- spread: (first, ...second) => Promise.all([first, Promise.all(toArray(second))]),
932
- list: (list) => Promise.all([...list]).then(toList),
933
- settled: (list) => Promise.allSettled([...list]).then((rs) => ({
934
- fulfilled: toList(...rs.filter((r) => r.status === "fulfilled").map((r) => r.value)),
935
- rejected: toList(...rs.filter((r) => r.status === "rejected").map((r) => asString(r.reason)))
936
- })),
937
- object: (obj) => use(keys(obj), (ks) => tuple.list(values(obj)).then((vs) => vs.reduce((acc, v, i) => on(acc, (a) => a[ks[i]] = v), {})))
808
+ // src/types/Try.ts
809
+ var Try = class _Try {
810
+ is = {
811
+ defined: (prop) => this.filter((v) => isDefined(prop ? prop(v) : v)),
812
+ empty: (prop) => this.filter((v) => isEmpty(prop ? prop(v) : v)),
813
+ valid: (prop) => this.filter((v) => validate(prop ? prop(v) : v).isValid),
814
+ true: (prop) => this.filter((v) => isTrue(prop ? prop(v) : v)),
815
+ false: (prop) => this.filter((v) => !isTrue(prop ? prop(v) : v)),
816
+ not: {
817
+ defined: (prop) => this.filter((v) => !isDefined(prop ? prop(v) : v)),
818
+ empty: (prop) => this.filter((v) => !isEmpty(prop ? prop(v) : v)),
819
+ valid: (prop) => this.filter((v) => !validate(prop ? prop(v) : v).isValid)
820
+ }
821
+ };
822
+ if = this.is;
823
+ static of = (c, ...args) => {
824
+ try {
825
+ const out = ofGet(c, ...args);
826
+ return new Success(out instanceof _Try ? out.value : out);
827
+ } catch (e) {
828
+ return new Failure(e);
829
+ }
830
+ };
938
831
  };
939
- var tuple2 = tuple[2];
940
- var tuple3 = tuple[3];
941
- var tuple4 = tuple[4];
942
- var tuple5 = tuple[5];
943
- var tupleO = tuple.object;
944
- var settled = tuple.settled;
945
-
946
- // src/validation/When.ts
947
- var When = class _When {
948
- constructor(subject, valid2 = true, results) {
949
- this.subject = subject;
950
- this.valid = valid2;
951
- this.results = results;
832
+ var Success = class extends Try {
833
+ constructor(value) {
834
+ super();
835
+ this.value = value;
952
836
  }
953
- get not() {
954
- return this.clone(!this.valid);
837
+ get error() {
838
+ throw new Error("No error found");
955
839
  }
956
- get and() {
957
- return this.clone(this.valid);
840
+ get isValid() {
841
+ return true;
958
842
  }
959
- get isDefined() {
960
- return this.clone(this.valid === isDefined(this.subject));
843
+ map(f) {
844
+ return tryTo(f, this.value);
961
845
  }
962
- get isEmpty() {
963
- return this.clone(this.valid === isEmpty(this.subject));
846
+ recover(f) {
847
+ return this;
964
848
  }
965
- get isTrue() {
966
- return this.clone(this.valid === !!this.subject);
849
+ recoverFrom(type, f) {
850
+ return this;
967
851
  }
968
- get isValid() {
969
- this.results = validate(this.subject);
970
- return this.clone(this.valid === this.results.isValid);
852
+ accept(f) {
853
+ return tryTo(() => {
854
+ f(this.value);
855
+ return this;
856
+ });
971
857
  }
972
- isInstance = (c) => this.clone(this.valid === this.subject instanceof c);
973
- with = (pred) => this.clone(this.valid === ofGet(pred, this.subject));
974
- contains = (property) => this.clone(this.valid === isDefined(ofGet(property, this.subject)));
975
- in = (...items) => this.clone(this.valid === isIn(this.subject, toArray(...items)));
976
- is = (item) => this.clone(this.valid === (this.subject === item));
977
- reject = (error) => !this.valid ? resolve(this.subject) : reject(ofGet(error, this.subject) ?? this.results ?? Exception.Unknown);
978
- recover = (f) => resolve(!this.valid ? this.subject : f(this.subject));
979
- clone = (result = true) => new _When(this.subject, result, this.results);
980
- };
981
- var when = (subject) => new When(subject);
982
-
983
- // src/types/Context.ts
984
- var DotEnvContext = class {
858
+ filter(predicate) {
859
+ return tryTo(() => {
860
+ if (predicate(this.value))
861
+ return this;
862
+ throw new Error(`Applying filter(${predicate.toString()}) failed.`);
863
+ });
864
+ }
865
+ or(value) {
866
+ return this.value;
867
+ }
868
+ orElse(value) {
869
+ return this.value;
870
+ }
871
+ orThrow(_error) {
872
+ return this.value;
873
+ }
874
+ };
875
+ var Failure = class _Failure extends Try {
876
+ constructor(error) {
877
+ super();
878
+ this.error = error;
879
+ }
880
+ get value() {
881
+ throw this.error;
882
+ }
883
+ get isValid() {
884
+ return false;
885
+ }
886
+ map(f) {
887
+ return new _Failure(this.error);
888
+ }
889
+ recover(f) {
890
+ return tryTo(f, this.error);
891
+ }
892
+ recoverFrom(type, f) {
893
+ return tryTo(() => this.error instanceof type ? this.recover(f) : this);
894
+ }
895
+ accept(f) {
896
+ return this;
897
+ }
898
+ filter(predicate) {
899
+ return this;
900
+ }
901
+ or(value) {
902
+ return ofGet(value);
903
+ }
904
+ orElse(value) {
905
+ return ofGet(value);
906
+ }
907
+ orThrow(error) {
908
+ throw ofConstruct(error);
909
+ }
910
+ };
911
+ var tryTo = (c, ...args) => Try.of(c, ...args);
912
+
913
+ // src/types/Template.ts
914
+ var Template = class {
915
+ constructor(template2, subject = {}, options = {}) {
916
+ this.template = template2;
917
+ this.subject = subject;
918
+ this.options = options;
919
+ }
920
+ knownPrefixes = /* @__PURE__ */ new Set(["typeof", "property", "actual", "subject"]);
921
+ toString = () => {
922
+ return entries(this.options).reduce((t, [k]) => this.option(t, k), this.object()).replace(" ", " ");
923
+ };
924
+ props = (tmpl, key, result = toList()) => {
925
+ const i1 = tmpl.indexOf(`{${key}`);
926
+ if (i1 < 0) {
927
+ return result;
928
+ }
929
+ const i2 = tmpl.indexOf("}", i1);
930
+ return this.props(tmpl.slice(i2 + 1), key, result.add(tmpl.substring(i1 + 1, i2)));
931
+ };
932
+ object = () => tryTo(() => this.template.replace(/\{this\./g, "{")).map((t) => t.replace(/\{([^{}]+)}/g, (match, p) => this.knownPrefixes.has(p.split(".")[0]) ? match : textValue(this.subject, p))).or("");
933
+ option = (tmpl, prop) => {
934
+ return this.props(tmpl, prop).reduce((t, p) => t.replace(`{${p}}`, textValue(this.options, p)), tmpl);
935
+ };
936
+ };
937
+ function template(tmpl, subject, options = {}) {
938
+ return new Template(asString(tmpl), subject, {
939
+ typeof: toName(subject),
940
+ subject: text(JSON.stringify(subject)),
941
+ ...options
942
+ });
943
+ }
944
+
945
+ // src/types/ToText.ts
946
+ var ToText = class {
947
+ constructor(subject) {
948
+ this.subject = subject;
949
+ }
950
+ get cap() {
951
+ return this.map((s) => capitalize(s?.toLowerCase()));
952
+ }
953
+ get capFirst() {
954
+ return this.map((s) => capitalize(s));
955
+ }
956
+ get title() {
957
+ return this.map(
958
+ (s) => s.split(" ").map((w) => text(w).cap).join(" ")
959
+ );
960
+ }
961
+ get pascal() {
962
+ return this.title.replace(" ", "");
963
+ }
964
+ get lower() {
965
+ return this.map((s) => s.toLowerCase());
966
+ }
967
+ get upper() {
968
+ return this.map((s) => s.toUpperCase());
969
+ }
970
+ get camel() {
971
+ return this.title.trim.map((s) => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);
972
+ }
973
+ get kebab() {
974
+ return this.lower.replace(" ", "-");
975
+ }
976
+ get strictKebab() {
977
+ return this.map((s) => s.replace(/[^a-z\d]+/gi, " ").trim()).kebab;
978
+ }
979
+ get slug() {
980
+ return this.map(
981
+ (s) => s.replace(/ß/g, "ss").normalize("NFKD").replace(/[\u0300-\u036F]/g, "").toLowerCase().replace(/[^a-z\d]+/g, "-").replace(/(^-)|(-$)/g, "")
982
+ );
983
+ }
984
+ get snake() {
985
+ return this.upper.replace(" ", "_");
986
+ }
987
+ get plural() {
988
+ return this.ifLike("") ?? this.add("s");
989
+ }
990
+ get space() {
991
+ return this.map((s) => s.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]/g, " "));
992
+ }
993
+ get sentence() {
994
+ return this.isEmpty ? this : this.map((s) => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);
995
+ }
996
+ get initials() {
997
+ return this.map(
998
+ (s) => s.split(" ").map((w) => w[0]).join("")
999
+ );
1000
+ }
1001
+ get trim() {
1002
+ return this.map((s) => s.replace(/[- ,_#]/g, ""));
1003
+ }
1004
+ get trimSentence() {
1005
+ return this.map(
1006
+ (s) => s.replace(/[\u200B-\u200D\uFEFF]/g, "").replace(/[\s\u00A0]+/g, " ").replace(/\s+([.,;:!?])/g, "$1").trim()
1007
+ );
1008
+ }
1009
+ get isEmpty() {
1010
+ return isEmpty(this.toString());
1011
+ }
1012
+ parse = (subject, options = {}) => text(template(this.subject, subject, { typeof: toName(subject), ...options }));
1013
+ is = (...others) => others.some((o) => this.toString() === text(o).toString());
1014
+ equals = this.is;
1015
+ like = (...others) => others.some((o) => this.trim.lower.toString().includes(text(o).trim.lower.toString()));
1016
+ isLike = (...others) => others.some((o) => this.trim.lower.is(text(o).trim.lower));
1017
+ ifLike = (...others) => this.isLike(...others) ? this : void 0;
1018
+ endsWith = (end) => this.subject.endsWith(asString(end));
1019
+ startsWith = (end) => this.subject.startsWith(asString(end));
1020
+ first = (n) => this.map((s) => s.substring(0, n));
1021
+ last = (n) => this.map((s) => s.substring(s.length - n));
1022
+ map = (func) => text(ofGet(func, this.subject));
1023
+ replace = (search, replace) => this.map((s) => replaceAll(s, search, replace));
1024
+ add = (add, separator = "") => this.map((s) => isNotEmpty(add) ? `${s}${separator}${text(add)}` : s);
1025
+ with = (separator, ...other) => this.map(
1026
+ (s) => toList(s).add(...other.map((u) => text(u).toString())).filter((s2) => isNotEmpty(s2)).join(separator)
1027
+ );
1028
+ split = (separator = " ") => toList(this.subject.split(separator));
1029
+ toString() {
1030
+ return this.subject;
1031
+ }
1032
+ toJSON() {
1033
+ return this.subject;
1034
+ }
1035
+ };
1036
+ function text(subject, alt = "") {
1037
+ const sub = subject ? asString(subject) : alt;
1038
+ return new ToText(sub !== "[object Object]" ? sub : "");
1039
+ }
1040
+ function textValue(subject, prop) {
1041
+ const p = prop.split(".");
1042
+ const root = subject?.[p[0]];
1043
+ const initial = typeof root === "object" && root !== null ? root : text(root);
1044
+ return p.splice(1).reduce((t, s) => (typeof t === "object" && t !== null ? t : text(t))?.[s], initial)?.toString() ?? "";
1045
+ }
1046
+
1047
+ // src/types/Exception.ts
1048
+ var Exception = class _Exception extends Enum {
1049
+ constructor(message, id, reason) {
1050
+ super(message, id ?? text(message).pascal.toString());
1051
+ this.message = message;
1052
+ this.reason = reason;
1053
+ }
1054
+ static AlreadyExists = new _Exception("Subject already exists");
1055
+ static DoesNotExist = new _Exception("Does not exist");
1056
+ static IsMissingId = new _Exception("Subject is missing an id");
1057
+ static IsNotImplemented = new _Exception("Is not implemented");
1058
+ static IsNotValid = new _Exception("Is not valid");
1059
+ static Unknown = new _Exception("Unknown error");
1060
+ static CouldNotExecute = (target) => new _Exception(`Could not execute ${target}.`, "CouldNotExecute");
1061
+ static CouldNotValidate = (target) => new _Exception(`Could not validate ${target}.`, "CouldNotValidate");
1062
+ static EnvironmentVariableNotFound = (variable) => new _Exception(`Environment variable ${text(variable).upper} could not be found.`, "EnvironmentVariableNotFound");
1063
+ because = (reason) => new _Exception(this.message, this.id, reason);
1064
+ };
1065
+ var isException = (e, t) => e instanceof Exception && (isDefined(t) ? e.equals(asString(t)) : true);
1066
+ var isDoesNotExist = (e) => e instanceof Exception && Exception.DoesNotExist.equals(e);
1067
+
1068
+ // src/validation/When.ts
1069
+ var When = class _When {
1070
+ constructor(subject, valid2 = true, results) {
1071
+ this.subject = subject;
1072
+ this.valid = valid2;
1073
+ this.results = results;
1074
+ }
1075
+ get not() {
1076
+ return this.clone(!this.valid);
1077
+ }
1078
+ get and() {
1079
+ return this.clone(this.valid);
1080
+ }
1081
+ get isDefined() {
1082
+ return this.clone(this.valid === isDefined(this.subject));
1083
+ }
1084
+ get isEmpty() {
1085
+ return this.clone(this.valid === isEmpty(this.subject));
1086
+ }
1087
+ get isTrue() {
1088
+ return this.clone(this.valid === !!this.subject);
1089
+ }
1090
+ get isValid() {
1091
+ this.results = validate(this.subject);
1092
+ return this.clone(this.valid === this.results.isValid);
1093
+ }
1094
+ isInstance = (c) => this.clone(this.valid === this.subject instanceof c);
1095
+ with = (pred) => this.clone(this.valid === ofGet(pred, this.subject));
1096
+ contains = (property) => this.clone(this.valid === isDefined(ofGet(property, this.subject)));
1097
+ in = (...items) => this.clone(this.valid === isIn(this.subject, toArray(...items)));
1098
+ is = (item) => this.clone(this.valid === (this.subject === item));
1099
+ reject = (error) => !this.valid ? resolve(this.subject) : reject(ofGet(error, this.subject) ?? this.results ?? Exception.Unknown);
1100
+ recover = (f) => resolve(!this.valid ? this.subject : f(this.subject));
1101
+ clone = (result = true) => new _When(this.subject, result, this.results);
1102
+ };
1103
+ var when = (subject) => new When(subject);
1104
+
1105
+ // src/types/Context.ts
1106
+ var DotEnvContext = class {
985
1107
  domain = process.env.DOMAIN ?? "easy";
986
1108
  name = process.env.ENVIRONMENT_NAME ?? "";
987
1109
  host = process.env.HOST ?? "";
@@ -1088,13 +1210,57 @@ var Results = class {
1088
1210
  var toResults = (...r) => new Results(...r);
1089
1211
  var isResults = (r) => isDefined(r) && r instanceof Results;
1090
1212
 
1091
- // src/types/Case.ts
1092
- var CaseBuilder = class {
1093
- constructor(v) {
1094
- this.v = v;
1095
- }
1096
- is = {
1097
- true: (pred, out) => this.case(pred, out),
1213
+ // src/types/Value.ts
1214
+ var Value = class {
1215
+ constructor(value) {
1216
+ this.value = value;
1217
+ this.value = value;
1218
+ }
1219
+ get isValid() {
1220
+ return isDefined(this.value);
1221
+ }
1222
+ toJSON() {
1223
+ return this.value;
1224
+ }
1225
+ toString() {
1226
+ return asString(this.value);
1227
+ }
1228
+ };
1229
+ var isValue = (v) => v instanceof Value;
1230
+
1231
+ // src/types/Validatable.ts
1232
+ var isValidatable = (v) => isA(v, "isValid");
1233
+
1234
+ // src/validation/Validate.ts
1235
+ var asResults = (subject, template2, options = {}) => toResults(toResult(text(template2).parse(subject, options), toName(subject)));
1236
+ var validators = (subject) => meta(subject).keys("constraint").reduce((list, vs) => list.add(vs), toList());
1237
+ var runValidator = (v, subject) => {
1238
+ try {
1239
+ const actual = isFunction(subject[v.property]) ? subject[v.property]() : subject[v.property];
1240
+ const constraint2 = v.constraint(actual);
1241
+ return isResults(constraint2) ? constraint2 : !constraint2 ? asResults(subject, v.text, {
1242
+ ...v,
1243
+ actual
1244
+ }) : toResults();
1245
+ } catch (e) {
1246
+ return asResults(subject, asString(e));
1247
+ }
1248
+ };
1249
+ var constraints = (subject) => validators(subject).map((vs) => runValidator(vs, subject)).reduce((rs, r) => rs.add(...r.results), toResults());
1250
+ var validate = (subject) => choose(subject).is.not.defined(
1251
+ (s) => s,
1252
+ () => toResults("Subject is not defined.")
1253
+ ).type(isEnum, (e) => e.isValid ? toResults() : asResults(e, "This is not a valid {typeof}.")).type(isValue, (v) => v.isValid ? toResults() : asResults(v, "This is not a valid {typeof}.")).type(isArray, (a) => a.map((i) => validate(i)).reduce((rs, r) => rs.add(...r.results), toResults())).type(isValidatable, (v) => constraints(v)).else(toResults());
1254
+ var validateReject = (subject) => when(subject).not.isValid.reject();
1255
+ var isValid = (t) => validate(t).isValid;
1256
+
1257
+ // src/types/Case.ts
1258
+ var CaseBuilder = class {
1259
+ constructor(v) {
1260
+ this.v = v;
1261
+ }
1262
+ is = {
1263
+ true: (pred, out) => this.case(pred, out),
1098
1264
  false: (pred, out) => this.case(!ofGet(pred, this.v), out),
1099
1265
  truthy: (prop, out) => this.case(!!prop(this.v), out),
1100
1266
  falsy: (prop, out) => this.case(!prop(this.v), out),
@@ -1160,337 +1326,186 @@ var Case = class {
1160
1326
  type(guard, out) {
1161
1327
  return tryTo(guard, this.value).is.true().map(() => out(this.value)).map((res) => new Found(this.value, res)).or(this);
1162
1328
  }
1163
- equals(value, out) {
1164
- return this.case(this.value === value, out);
1165
- }
1166
- else(alt) {
1167
- return ofGet(alt, this.value);
1168
- }
1169
- };
1170
- var Found = class extends Case {
1171
- constructor(value, outcome) {
1172
- super(value, outcome);
1173
- this.value = value;
1174
- this.outcome = outcome;
1175
- }
1176
- case(pred, out) {
1177
- return this;
1178
- }
1179
- type(guard, out) {
1180
- return this;
1181
- }
1182
- equals(value, out) {
1183
- return this;
1184
- }
1185
- else(alt) {
1186
- return this.outcome;
1187
- }
1188
- };
1189
- var choose = (value) => new CaseBuilder(value);
1190
-
1191
- // src/types/Value.ts
1192
- var Value = class {
1193
- constructor(value) {
1194
- this.value = value;
1195
- this.value = value;
1196
- }
1197
- get isValid() {
1198
- return isDefined(this.value);
1199
- }
1200
- toJSON() {
1201
- return this.value;
1202
- }
1203
- toString() {
1204
- return asString(this.value);
1205
- }
1206
- };
1207
- var isValue = (v) => v instanceof Value;
1208
-
1209
- // src/types/Validatable.ts
1210
- var isValidatable = (v) => isA(v, "isValid");
1211
-
1212
- // src/validation/Validate.ts
1213
- var asResults = (subject, template2, options = {}) => toResults(toResult(text(template2).parse(subject, options), toName(subject)));
1214
- var validators = (subject) => meta(subject).keys("constraint").reduce((list, vs) => list.add(vs), toList());
1215
- var runValidator = (v, subject) => {
1216
- try {
1217
- const actual = isFunction(subject[v.property]) ? subject[v.property]() : subject[v.property];
1218
- const constraint2 = v.constraint(actual);
1219
- return isResults(constraint2) ? constraint2 : !constraint2 ? asResults(subject, v.text, {
1220
- ...v,
1221
- actual
1222
- }) : toResults();
1223
- } catch (e) {
1224
- return asResults(subject, asString(e));
1225
- }
1226
- };
1227
- var constraints = (subject) => validators(subject).map((vs) => runValidator(vs, subject)).reduce((rs, r) => rs.add(...r.results), toResults());
1228
- var validate = (subject) => choose(subject).is.not.defined(
1229
- (s) => s,
1230
- () => toResults("Subject is not defined.")
1231
- ).type(isEnum, (e) => e.isValid ? toResults() : asResults(e, "This is not a valid {typeof}.")).type(isValue, (v) => v.isValid ? toResults() : asResults(v, "This is not a valid {typeof}.")).type(isArray, (a) => a.map((i) => validate(i)).reduce((rs, r) => rs.add(...r.results), toResults())).type(isValidatable, (v) => constraints(v)).else(toResults());
1232
- var validateReject = (subject) => when(subject).not.isValid.reject();
1233
- var isValid = (t) => validate(t).isValid;
1234
-
1235
- // src/types/Try.ts
1236
- var Try = class _Try {
1237
- is = {
1238
- defined: (prop) => this.filter((v) => isDefined(prop ? prop(v) : v)),
1239
- empty: (prop) => this.filter((v) => isEmpty(prop ? prop(v) : v)),
1240
- valid: (prop) => this.filter((v) => validate(prop ? prop(v) : v).isValid),
1241
- true: (prop) => this.filter((v) => isTrue(prop ? prop(v) : v)),
1242
- false: (prop) => this.filter((v) => !isTrue(prop ? prop(v) : v)),
1243
- not: {
1244
- defined: (prop) => this.filter((v) => !isDefined(prop ? prop(v) : v)),
1245
- empty: (prop) => this.filter((v) => !isEmpty(prop ? prop(v) : v)),
1246
- valid: (prop) => this.filter((v) => !validate(prop ? prop(v) : v).isValid)
1247
- }
1248
- };
1249
- if = this.is;
1250
- static of = (c, ...args) => {
1251
- try {
1252
- const out = ofGet(c, ...args);
1253
- return new Success(out instanceof _Try ? out.value : out);
1254
- } catch (e) {
1255
- return new Failure(e);
1256
- }
1257
- };
1258
- };
1259
- var Success = class extends Try {
1260
- constructor(value) {
1261
- super();
1262
- this.value = value;
1263
- }
1264
- get error() {
1265
- throw new Error("No error found");
1266
- }
1267
- get isValid() {
1268
- return true;
1269
- }
1270
- map(f) {
1271
- return tryTo(f, this.value);
1272
- }
1273
- recover(f) {
1274
- return this;
1275
- }
1276
- recoverFrom(type, f) {
1277
- return this;
1278
- }
1279
- accept(f) {
1280
- return tryTo(() => {
1281
- f(this.value);
1282
- return this;
1283
- });
1284
- }
1285
- filter(predicate) {
1286
- return tryTo(() => {
1287
- if (predicate(this.value))
1288
- return this;
1289
- throw new Error(`Applying filter(${predicate.toString()}) failed.`);
1290
- });
1291
- }
1292
- or(value) {
1293
- return this.value;
1294
- }
1295
- orElse(value) {
1296
- return this.value;
1297
- }
1298
- orThrow(_error) {
1299
- return this.value;
1300
- }
1301
- };
1302
- var Failure = class _Failure extends Try {
1303
- constructor(error) {
1304
- super();
1305
- this.error = error;
1306
- }
1307
- get value() {
1308
- throw this.error;
1309
- }
1310
- get isValid() {
1311
- return false;
1312
- }
1313
- map(f) {
1314
- return new _Failure(this.error);
1315
- }
1316
- recover(f) {
1317
- return tryTo(f, this.error);
1318
- }
1319
- recoverFrom(type, f) {
1320
- return tryTo(() => this.error instanceof type ? this.recover(f) : this);
1321
- }
1322
- accept(f) {
1323
- return this;
1324
- }
1325
- filter(predicate) {
1326
- return this;
1327
- }
1328
- or(value) {
1329
- return ofGet(value);
1330
- }
1331
- orElse(value) {
1332
- return ofGet(value);
1333
- }
1334
- orThrow(error) {
1335
- throw ofConstruct(error);
1336
- }
1337
- };
1338
- var tryTo = (c, ...args) => Try.of(c, ...args);
1339
-
1340
- // src/types/Template.ts
1341
- var Template = class {
1342
- constructor(template2, subject = {}, options = {}) {
1343
- this.template = template2;
1344
- this.subject = subject;
1345
- this.options = options;
1346
- }
1347
- knownPrefixes = /* @__PURE__ */ new Set(["typeof", "property", "actual", "subject"]);
1348
- toString = () => {
1349
- return entries(this.options).reduce((t, [k]) => this.option(t, k), this.object()).replace(" ", " ");
1350
- };
1351
- props = (tmpl, key, result = toList()) => {
1352
- const i1 = tmpl.indexOf(`{${key}`);
1353
- if (i1 < 0) {
1354
- return result;
1355
- }
1356
- const i2 = tmpl.indexOf("}", i1);
1357
- return this.props(tmpl.slice(i2 + 1), key, result.add(tmpl.substring(i1 + 1, i2)));
1358
- };
1359
- object = () => tryTo(() => this.template.replace(/\{this\./g, "{")).map((t) => t.replace(/\{([^{}]+)}/g, (match, p) => this.knownPrefixes.has(p.split(".")[0]) ? match : textValue(this.subject, p))).or("");
1360
- option = (tmpl, prop) => {
1361
- return this.props(tmpl, prop).reduce((t, p) => t.replace(`{${p}}`, textValue(this.options, p)), tmpl);
1362
- };
1363
- };
1364
- function template(tmpl, subject, options = {}) {
1365
- return new Template(asString(tmpl), subject, {
1366
- typeof: toName(subject),
1367
- subject: text(JSON.stringify(subject)),
1368
- ...options
1369
- });
1370
- }
1371
-
1372
- // src/types/ToText.ts
1373
- var ToText = class {
1374
- constructor(subject) {
1375
- this.subject = subject;
1376
- }
1377
- get cap() {
1378
- return this.map((s) => capitalize(s?.toLowerCase()));
1379
- }
1380
- get capFirst() {
1381
- return this.map((s) => capitalize(s));
1382
- }
1383
- get title() {
1384
- return this.map(
1385
- (s) => s.split(" ").map((w) => text(w).cap).join(" ")
1386
- );
1387
- }
1388
- get pascal() {
1389
- return this.title.replace(" ", "");
1390
- }
1391
- get lower() {
1392
- return this.map((s) => s.toLowerCase());
1329
+ equals(value, out) {
1330
+ return this.case(this.value === value, out);
1393
1331
  }
1394
- get upper() {
1395
- return this.map((s) => s.toUpperCase());
1332
+ else(alt) {
1333
+ return ofGet(alt, this.value);
1396
1334
  }
1397
- get camel() {
1398
- return this.title.trim.map((s) => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);
1335
+ };
1336
+ var Found = class extends Case {
1337
+ constructor(value, outcome) {
1338
+ super(value, outcome);
1339
+ this.value = value;
1340
+ this.outcome = outcome;
1399
1341
  }
1400
- get kebab() {
1401
- return this.lower.replace(" ", "-");
1342
+ case(pred, out) {
1343
+ return this;
1402
1344
  }
1403
- get strictKebab() {
1404
- return this.map((s) => s.replace(/[^a-z\d]+/gi, " ").trim()).kebab;
1345
+ type(guard, out) {
1346
+ return this;
1405
1347
  }
1406
- get slug() {
1407
- return this.map(
1408
- (s) => s.replace(/ß/g, "ss").normalize("NFKD").replace(/[\u0300-\u036F]/g, "").toLowerCase().replace(/[^a-z\d]+/g, "-").replace(/(^-)|(-$)/g, "")
1409
- );
1348
+ equals(value, out) {
1349
+ return this;
1410
1350
  }
1411
- get snake() {
1412
- return this.upper.replace(" ", "_");
1351
+ else(alt) {
1352
+ return this.outcome;
1413
1353
  }
1414
- get plural() {
1415
- return this.ifLike("") ?? this.add("s");
1354
+ };
1355
+ var choose = (value) => new CaseBuilder(value);
1356
+
1357
+ // src/types/IsEqual.ts
1358
+ var isEqualArray = (one, another) => choose([one, another]).case(([o, a]) => !isArray(o) || !isArray(a), false).case(([o, a]) => o?.length !== a?.length, false).else(([o, a]) => !o.some((v, i) => !isEqual(v, a[i])));
1359
+ var isEqualObject = (one, another) => choose([Object.keys(one), Object.keys(another)]).case(([keysO, keysA]) => keysO.length !== keysA.length, false).case(([keysO, keysA]) => keysO.some((k) => !keysA.includes(k)), false).case(([keysO]) => keysO.some((k) => !isEqual(one[k], another[k])), false).else(true);
1360
+ var isEqual = (one, another) => choose([one, another]).case(([o, a]) => o === a, true).case(
1361
+ ([o, a]) => isArray(o) || isArray(a),
1362
+ ([o, a]) => isEqualArray(o, a)
1363
+ ).case(
1364
+ ([o, a]) => o == null || a == null || !isObject(o) && !isObject(a),
1365
+ ([o, a]) => o !== o && a !== a
1366
+ ).else(([o, a]) => isEqualObject(o, a));
1367
+
1368
+ // src/utils/If.ts
1369
+ function ifTrue(o, f, alt) {
1370
+ return isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
1371
+ }
1372
+ function ifFalse(o, f, alt) {
1373
+ return !isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
1374
+ }
1375
+ function ifDefined(o, f, alt) {
1376
+ return isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt);
1377
+ }
1378
+ function ifNotEmpty(o, f = (o2) => o2, alt) {
1379
+ return isNotEmpty(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
1380
+ }
1381
+ function ifEqual(one, another, f, alt) {
1382
+ return isEqual(one, another) ? ofConstruct(f) : ofConstruct(alt);
1383
+ }
1384
+ function ifEither(os, f = (o) => o, alt) {
1385
+ return use(
1386
+ toList(os).first((o) => isPresent(o)),
1387
+ (o) => isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt, o)
1388
+ );
1389
+ }
1390
+
1391
+ // src/types/Json.ts
1392
+ var isJson = (subject) => isA(subject, "toJSON");
1393
+ var json = {
1394
+ parse: (subject) => JSON.parse(JSON.stringify(subject ?? {})),
1395
+ merge: (...subjects) => json.parse(subjects.map((s) => asJson(s, (s2) => json.parse(s2))).reduce((js, j) => ({ ...js, ...j }), {})),
1396
+ delete: (subject, key) => {
1397
+ ifDefined(subject, () => delete subject[key]);
1398
+ return subject;
1399
+ },
1400
+ set: (subject, key = "", value) => isEmpty(key) ? subject : value !== void 0 ? { ...subject, ...{ [key]: value } } : json.delete(subject, key),
1401
+ omit: (subject, ...keys2) => keys2.reduce((js, k) => json.delete(js, k), json.parse(subject)),
1402
+ pick: (subject, ...keys2) => keys2.reduce((js, k) => json.set(js, k, subject[k]), {}),
1403
+ defaults: (options = {}, defaults = {}) => json.merge(defaults, options),
1404
+ isSubset: (subject, subset) => !entries(subset).some(([k, v]) => subject[k] !== v),
1405
+ split: (t, keys2, prop = "extracted") => {
1406
+ const extracted = {};
1407
+ const rest2 = { ...t };
1408
+ keys2.forEach((key) => {
1409
+ if (key in t) {
1410
+ ifDefined(t[key], (v) => extracted[key] = v);
1411
+ delete rest2[key];
1412
+ }
1413
+ });
1414
+ return { [prop]: extracted, ...rest2 };
1416
1415
  }
1417
- get space() {
1418
- return this.map((s) => s.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]/g, " "));
1416
+ };
1417
+ var toJson = json.merge;
1418
+ var asJson = (j, alt = {}) => isJson(j) ? j.toJSON() : isObject(j) ? j : ofGet(alt, j);
1419
+ var Any = class {
1420
+ constructor(value) {
1421
+ this.value = value;
1419
1422
  }
1420
- get sentence() {
1421
- return this.isEmpty ? this : this.map((s) => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);
1423
+ merge = (...subjects) => any(json.merge(this.value, ...subjects));
1424
+ delete = (key) => any(json.delete(this.value, key));
1425
+ omit = (...keys2) => any(json.omit(this.value, ...keys2));
1426
+ set = (key, value) => any(json.set(this.value, key, value));
1427
+ toJSON() {
1428
+ return this.value;
1422
1429
  }
1423
- get initials() {
1424
- return this.map(
1425
- (s) => s.split(" ").map((w) => w[0]).join("")
1426
- );
1430
+ };
1431
+ var takeFirstKey = (j, alt = "") => entries(asJson(j)).first(([, v]) => isDefined(v))?.[0] ?? alt;
1432
+ var takeFirst = (j) => entries(j).first(([, v]) => isDefined(v));
1433
+ var any = (value) => new Any(value);
1434
+
1435
+ // src/utils/Convert.ts
1436
+ var Convert = class {
1437
+ constructor(from, to) {
1438
+ this.from = from;
1439
+ this.to = to;
1427
1440
  }
1428
- get trim() {
1429
- return this.map((s) => s.replace(/[- ,_#]/g, ""));
1441
+ };
1442
+ var convert = {
1443
+ default: new Convert(
1444
+ (a) => a,
1445
+ (a) => a
1446
+ ),
1447
+ ignore: new Convert(
1448
+ () => void 0,
1449
+ () => void 0
1450
+ ),
1451
+ toBool: {
1452
+ fromNumber: new Convert(
1453
+ (b) => b ? 1 : 0,
1454
+ (n) => n !== 0
1455
+ ),
1456
+ fromString: new Convert(
1457
+ (b) => b ? "true" : "false",
1458
+ (s) => s === "true"
1459
+ )
1460
+ },
1461
+ toDate: {
1462
+ fromString: new Convert(
1463
+ (s) => new Date(s).toISOString(),
1464
+ (s) => s
1465
+ )
1466
+ },
1467
+ toNumber: {
1468
+ fromString: new Convert(
1469
+ (n) => asString(n),
1470
+ (s) => parseInt(s)
1471
+ )
1430
1472
  }
1431
- get trimSentence() {
1432
- return this.map(
1433
- (s) => s.replace(/[\u200B-\u200D\uFEFF]/g, "").replace(/[\s\u00A0]+/g, " ").replace(/\s+([.,;:!?])/g, "$1").trim()
1434
- );
1473
+ };
1474
+
1475
+ // src/data/Condition.ts
1476
+ var Condition = class {
1477
+ constructor(key, operator, value) {
1478
+ this.key = key;
1479
+ this.operator = operator;
1480
+ this.value = value;
1435
1481
  }
1436
- get isEmpty() {
1437
- return isEmpty(this.toString());
1482
+ and = (...others) => new LogicalCondition("and", [this, ...others]);
1483
+ or = (...others) => new LogicalCondition("or", [this, ...others]);
1484
+ toJSON() {
1485
+ return { [this.key]: { [`$${this.operator}`]: json.parse(this.value) } };
1438
1486
  }
1439
- parse = (subject, options = {}) => text(template(this.subject, subject, { typeof: toName(subject), ...options }));
1440
- is = (...others) => others.some((o) => this.toString() === text(o).toString());
1441
- equals = this.is;
1442
- like = (...others) => others.some((o) => this.trim.lower.toString().includes(text(o).trim.lower.toString()));
1443
- isLike = (...others) => others.some((o) => this.trim.lower.is(text(o).trim.lower));
1444
- ifLike = (...others) => this.isLike(...others) ? this : void 0;
1445
- endsWith = (end) => this.subject.endsWith(asString(end));
1446
- startsWith = (end) => this.subject.startsWith(asString(end));
1447
- first = (n) => this.map((s) => s.substring(0, n));
1448
- last = (n) => this.map((s) => s.substring(s.length - n));
1449
- map = (func) => text(ofGet(func, this.subject));
1450
- replace = (search, replace) => this.map((s) => replaceAll(s, search, replace));
1451
- add = (add, separator = "") => this.map((s) => isNotEmpty(add) ? `${s}${separator}${text(add)}` : s);
1452
- with = (separator, ...other) => this.map(
1453
- (s) => toList(s).add(...other.map((u) => text(u).toString())).filter((s2) => isNotEmpty(s2)).join(separator)
1454
- );
1455
- split = (separator = " ") => toList(this.subject.split(separator));
1456
- toString() {
1457
- return this.subject;
1487
+ };
1488
+ var LogicalCondition = class {
1489
+ constructor(operator, conditions) {
1490
+ this.operator = operator;
1491
+ this.conditions = conditions;
1458
1492
  }
1459
1493
  toJSON() {
1460
- return this.subject;
1494
+ return { [`$${this.operator}`]: this.conditions.map((c) => c.toJSON()) };
1461
1495
  }
1462
1496
  };
1463
- function text(subject, alt = "") {
1464
- const sub = subject ? asString(subject) : alt;
1465
- return new ToText(sub !== "[object Object]" ? sub : "");
1466
- }
1467
- function textValue(subject, prop) {
1468
- const p = prop.split(".");
1469
- const root = subject?.[p[0]];
1470
- const initial = typeof root === "object" && root !== null ? root : text(root);
1471
- return p.splice(1).reduce((t, s) => (typeof t === "object" && t !== null ? t : text(t))?.[s], initial)?.toString() ?? "";
1472
- }
1473
-
1474
- // src/types/Exception.ts
1475
- var Exception = class _Exception extends Enum {
1476
- constructor(message, id, reason) {
1477
- super(message, id ?? text(message).pascal.toString());
1478
- this.message = message;
1479
- this.reason = reason;
1497
+ var SortCondition = class extends Condition {
1498
+ constructor(key, value) {
1499
+ super(key, "", value);
1500
+ this.key = key;
1501
+ this.value = value;
1502
+ }
1503
+ toJSON() {
1504
+ return { [this.key]: this.value };
1480
1505
  }
1481
- static AlreadyExists = new _Exception("Subject already exists");
1482
- static DoesNotExist = new _Exception("Does not exist");
1483
- static IsMissingId = new _Exception("Subject is missing an id");
1484
- static IsNotImplemented = new _Exception("Is not implemented");
1485
- static IsNotValid = new _Exception("Is not valid");
1486
- static Unknown = new _Exception("Unknown error");
1487
- static CouldNotExecute = (target) => new _Exception(`Could not execute ${target}.`, "CouldNotExecute");
1488
- static CouldNotValidate = (target) => new _Exception(`Could not validate ${target}.`, "CouldNotValidate");
1489
- static EnvironmentVariableNotFound = (variable) => new _Exception(`Environment variable ${text(variable).upper} could not be found.`, "EnvironmentVariableNotFound");
1490
- because = (reason) => new _Exception(this.message, this.id, reason);
1491
1506
  };
1492
- var isException = (e, t) => e instanceof Exception && (isDefined(t) ? e.equals(asString(t)) : true);
1493
- var isDoesNotExist = (e) => e instanceof Exception && Exception.DoesNotExist.equals(e);
1507
+ var toCondition = (field, operator, value, conv = convert.default) => new Condition(field, operator, conv.from(value));
1508
+ var isSortCondition = (s) => isDefined(s) && s instanceof SortCondition;
1494
1509
 
1495
1510
  // src/types/Gateway.ts
1496
1511
  var Gateway = class {
@@ -2879,17 +2894,6 @@ var MappedRouteGateway = class extends RouteGateway {
2879
2894
  }
2880
2895
  };
2881
2896
 
2882
- // src/types/IsEqual.ts
2883
- var isEqualArray = (one, another) => choose([one, another]).case(([o, a]) => !isArray(o) || !isArray(a), false).case(([o, a]) => o?.length !== a?.length, false).else(([o, a]) => !o.some((v, i) => !isEqual(v, a[i])));
2884
- var isEqualObject = (one, another) => choose([Object.keys(one), Object.keys(another)]).case(([keysO, keysA]) => keysO.length !== keysA.length, false).case(([keysO, keysA]) => keysO.some((k) => !keysA.includes(k)), false).case(([keysO]) => keysO.some((k) => !isEqual(one[k], another[k])), false).else(true);
2885
- var isEqual = (one, another) => choose([one, another]).case(([o, a]) => o === a, true).case(
2886
- ([o, a]) => isArray(o) || isArray(a),
2887
- ([o, a]) => isEqualArray(o, a)
2888
- ).case(
2889
- ([o, a]) => o == null || a == null || !isObject(o) && !isObject(a),
2890
- ([o, a]) => o !== o && a !== a
2891
- ).else(([o, a]) => isEqualObject(o, a));
2892
-
2893
2897
  // src/utils/View.ts
2894
2898
  var ignore = Symbol("view.ignore");
2895
2899
  var keep = Symbol("view.keep");
@@ -2955,6 +2959,20 @@ var views = {
2955
2959
  key: (altKey) => (a, key) => traverse(a, key) ?? traverse(a, altKey),
2956
2960
  value: (altValue) => (a, key) => traverse(a, key) ?? altValue,
2957
2961
  func: (altFunc) => (a, key) => traverse(a, key) ?? altFunc(a, key)
2962
+ },
2963
+ to: (ctorOrFunc) => {
2964
+ const apply = (v) => isConstructor(ctorOrFunc) ? new ctorOrFunc(v) : ctorOrFunc(v);
2965
+ const base = (a, key) => {
2966
+ const v = traverse(a, key);
2967
+ return v != null ? apply(v) : void 0;
2968
+ };
2969
+ return Object.assign(base, {
2970
+ or: {
2971
+ key: (altKey) => (a, key) => base(a, key) ?? traverse(a, altKey),
2972
+ value: (altValue) => (a, key) => base(a, key) ?? altValue,
2973
+ func: (altFunc) => (a, key) => base(a, key) ?? altFunc(a, key)
2974
+ }
2975
+ });
2958
2976
  }
2959
2977
  };
2960
2978
 
@@ -3677,6 +3695,7 @@ var wait = (millis) => Wait.wait(millis);
3677
3695
  ifA,
3678
3696
  ifDefined,
3679
3697
  ifEither,
3698
+ ifEqual,
3680
3699
  ifFalse,
3681
3700
  ifGet,
3682
3701
  ifNotEmpty,