@thisisagile/easy 18.11.2 → 18.13.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 (157) hide show
  1. package/dist/{chunk-VENBCZAM.mjs → chunk-23ZFESSO.mjs} +3 -3
  2. package/dist/{chunk-RMQZRTTG.mjs → chunk-3HEPK3TC.mjs} +2 -2
  3. package/dist/{chunk-4GK27OOO.mjs → chunk-3JALCI3D.mjs} +3 -3
  4. package/dist/{chunk-FBZHPHXB.mjs → chunk-4SO7UI5S.mjs} +2 -2
  5. package/dist/{chunk-M2LLIIPG.mjs → chunk-5LVVM522.mjs} +7 -7
  6. package/dist/{chunk-MRV7FQNU.mjs → chunk-6I4ZNNVM.mjs} +2 -2
  7. package/dist/{chunk-IKUC55KC.mjs → chunk-7VJ3E3GP.mjs} +2 -2
  8. package/dist/{chunk-2GYEWYBU.mjs → chunk-AHSUQCHS.mjs} +4 -4
  9. package/dist/{chunk-AVHYDITZ.mjs → chunk-BS5KUNX2.mjs} +786 -786
  10. package/dist/chunk-BS5KUNX2.mjs.map +1 -0
  11. package/dist/{chunk-QIBUS2GL.mjs → chunk-CB3LF3XW.mjs} +5 -5
  12. package/dist/{chunk-PDPNMABX.mjs → chunk-D5U4D63E.mjs} +4 -4
  13. package/dist/{chunk-J6OJWNBP.mjs → chunk-DMOWSGD3.mjs} +2 -2
  14. package/dist/{chunk-ZB323SGD.mjs → chunk-EPCIQ4J3.mjs} +2 -2
  15. package/dist/{chunk-KGW3CVDO.mjs → chunk-F2W64HKC.mjs} +2 -2
  16. package/dist/{chunk-GYJHZJKL.mjs → chunk-HI4ZNU6Z.mjs} +2 -2
  17. package/dist/chunk-HI4ZNU6Z.mjs.map +1 -0
  18. package/dist/{chunk-HFRGTGH6.mjs → chunk-HWR7EEVI.mjs} +3 -3
  19. package/dist/{chunk-YTXIST3O.mjs → chunk-M6I5JHJC.mjs} +2 -2
  20. package/dist/{chunk-VOZBRY56.mjs → chunk-MH4VLBIT.mjs} +4 -4
  21. package/dist/{chunk-6HTOXMLP.mjs → chunk-NL464DQQ.mjs} +3 -3
  22. package/dist/{chunk-G6EOJ3XG.mjs → chunk-NOZLL54Z.mjs} +2 -2
  23. package/dist/{chunk-ZPT6E6AF.mjs → chunk-NTK2UCHO.mjs} +5 -5
  24. package/dist/{chunk-TNJ2KFPQ.mjs → chunk-NWUALPMB.mjs} +2 -2
  25. package/dist/{chunk-44GORRHT.mjs → chunk-OLL5B5NN.mjs} +3 -3
  26. package/dist/{chunk-A7KUHZ3A.mjs → chunk-P2ZMGAQP.mjs} +2 -2
  27. package/dist/{chunk-CR2ZP2PA.mjs → chunk-PFLWEHXS.mjs} +2 -2
  28. package/dist/{chunk-JMAWKYXN.mjs → chunk-QMIBOIAF.mjs} +2 -2
  29. package/dist/{chunk-OWUSKHPI.mjs → chunk-S5J3TYAZ.mjs} +3 -3
  30. package/dist/{chunk-RPZ2XDQQ.mjs → chunk-SATFIUWH.mjs} +2 -2
  31. package/dist/{chunk-ULOORN2E.mjs → chunk-T773NDGK.mjs} +2 -2
  32. package/dist/{chunk-DWSZUI3N.mjs → chunk-T7YVWWJF.mjs} +4 -4
  33. package/dist/{chunk-66DVBO4C.mjs → chunk-TN6LYAFX.mjs} +2 -2
  34. package/dist/{chunk-NUFTFLAY.mjs → chunk-UIL3XRCV.mjs} +3 -3
  35. package/dist/{chunk-IUZTBZYP.mjs → chunk-W3LNVDFV.mjs} +2 -2
  36. package/dist/{chunk-TXXJY2Y7.mjs → chunk-WJGWSFCJ.mjs} +3 -3
  37. package/dist/{chunk-HIM2UTGC.mjs → chunk-Z37TBPTK.mjs} +2 -2
  38. package/dist/data/Condition.mjs +3 -3
  39. package/dist/data/Database.mjs +2 -2
  40. package/dist/data/Field.mjs +3 -3
  41. package/dist/data/InMemoryGateway.mjs +3 -3
  42. package/dist/domain/Audit.mjs +7 -7
  43. package/dist/domain/Child.mjs +4 -4
  44. package/dist/domain/DateTime.mjs +3 -3
  45. package/dist/domain/Entity.mjs +9 -9
  46. package/dist/domain/Repo.mjs +3 -3
  47. package/dist/domain/Struct.mjs +3 -3
  48. package/dist/domain/Typo.mjs +3 -3
  49. package/dist/http/CacheControl.mjs +3 -3
  50. package/dist/http/ContentType.mjs +2 -2
  51. package/dist/http/HttpStatus.mjs +2 -2
  52. package/dist/http/HttpVerb.mjs +2 -2
  53. package/dist/http/LocalRequestStore.mjs +1 -1
  54. package/dist/http/RequestOptions.mjs +3 -3
  55. package/dist/http/RestResult.mjs +3 -3
  56. package/dist/http/toResponse.mjs +4 -4
  57. package/dist/index.js +5 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/process/App.mjs +2 -2
  60. package/dist/process/Manage.mjs +3 -3
  61. package/dist/process/Scope.mjs +2 -2
  62. package/dist/process/Search.mjs +3 -3
  63. package/dist/process/UseCase.mjs +1 -1
  64. package/dist/resources/Req.mjs +2 -2
  65. package/dist/services/Api.mjs +11 -11
  66. package/dist/services/ApiGateway.mjs +14 -14
  67. package/dist/services/AxiosProvider.mjs +9 -9
  68. package/dist/services/MappedRouteGateway.mjs +18 -18
  69. package/dist/services/RouteGateway.mjs +15 -15
  70. package/dist/services/ViewRouteGateway.mjs +17 -17
  71. package/dist/sql/Column.mjs +2 -2
  72. package/dist/sql/Count.mjs +4 -4
  73. package/dist/sql/Delete.mjs +3 -3
  74. package/dist/sql/Insert.mjs +3 -3
  75. package/dist/sql/Select.mjs +3 -3
  76. package/dist/sql/SqlQuery.mjs +2 -2
  77. package/dist/sql/Table.mjs +14 -14
  78. package/dist/sql/TableGateway.mjs +3 -3
  79. package/dist/sql/Update.mjs +3 -3
  80. package/dist/types/Cache.mjs +1 -1
  81. package/dist/types/CacheAge.mjs +3 -3
  82. package/dist/types/Case.mjs +1 -1
  83. package/dist/types/Context.mjs +1 -1
  84. package/dist/types/Enum.mjs +1 -1
  85. package/dist/types/Environment.mjs +1 -1
  86. package/dist/types/ErrorOrigin.d.ts +2 -0
  87. package/dist/types/ErrorOrigin.mjs +31 -0
  88. package/dist/types/ErrorOrigin.mjs.map +1 -1
  89. package/dist/types/Exception.mjs +1 -1
  90. package/dist/types/Gateway.mjs +2 -2
  91. package/dist/types/IsEqual.mjs +1 -1
  92. package/dist/types/Json.mjs +2 -2
  93. package/dist/types/List.d.ts +1 -1
  94. package/dist/types/List.mjs +1 -1
  95. package/dist/types/Meta.mjs +1 -1
  96. package/dist/types/Number.mjs +2 -2
  97. package/dist/types/Object.mjs +1 -1
  98. package/dist/types/PageList.d.ts +1 -1
  99. package/dist/types/PageList.mjs +2 -2
  100. package/dist/types/Parser.mjs +1 -1
  101. package/dist/types/Repository.mjs +2 -2
  102. package/dist/types/Result.mjs +1 -1
  103. package/dist/types/Results.mjs +1 -1
  104. package/dist/types/Tag.mjs +1 -1
  105. package/dist/types/Template.mjs +1 -1
  106. package/dist/types/ToText.mjs +1 -1
  107. package/dist/types/Try.mjs +1 -1
  108. package/dist/types/Uri.mjs +1 -1
  109. package/dist/utils/If.mjs +1 -1
  110. package/dist/utils/Mapper.mjs +3 -3
  111. package/dist/utils/Period.mjs +3 -3
  112. package/dist/utils/Promise.mjs +1 -1
  113. package/dist/utils/Seconds.mjs +2 -2
  114. package/dist/utils/Sentence.mjs +1 -1
  115. package/dist/utils/View.mjs +4 -4
  116. package/dist/validation/Contraints.mjs +2 -2
  117. package/dist/validation/Validate.mjs +1 -1
  118. package/dist/validation/When.mjs +1 -1
  119. package/package.json +1 -1
  120. package/src/types/ErrorOrigin.ts +16 -4
  121. package/src/types/List.ts +2 -2
  122. package/src/types/PageList.ts +1 -1
  123. package/dist/chunk-AVHYDITZ.mjs.map +0 -1
  124. package/dist/chunk-GYJHZJKL.mjs.map +0 -1
  125. /package/dist/{chunk-VENBCZAM.mjs.map → chunk-23ZFESSO.mjs.map} +0 -0
  126. /package/dist/{chunk-RMQZRTTG.mjs.map → chunk-3HEPK3TC.mjs.map} +0 -0
  127. /package/dist/{chunk-4GK27OOO.mjs.map → chunk-3JALCI3D.mjs.map} +0 -0
  128. /package/dist/{chunk-FBZHPHXB.mjs.map → chunk-4SO7UI5S.mjs.map} +0 -0
  129. /package/dist/{chunk-M2LLIIPG.mjs.map → chunk-5LVVM522.mjs.map} +0 -0
  130. /package/dist/{chunk-MRV7FQNU.mjs.map → chunk-6I4ZNNVM.mjs.map} +0 -0
  131. /package/dist/{chunk-IKUC55KC.mjs.map → chunk-7VJ3E3GP.mjs.map} +0 -0
  132. /package/dist/{chunk-2GYEWYBU.mjs.map → chunk-AHSUQCHS.mjs.map} +0 -0
  133. /package/dist/{chunk-QIBUS2GL.mjs.map → chunk-CB3LF3XW.mjs.map} +0 -0
  134. /package/dist/{chunk-PDPNMABX.mjs.map → chunk-D5U4D63E.mjs.map} +0 -0
  135. /package/dist/{chunk-J6OJWNBP.mjs.map → chunk-DMOWSGD3.mjs.map} +0 -0
  136. /package/dist/{chunk-ZB323SGD.mjs.map → chunk-EPCIQ4J3.mjs.map} +0 -0
  137. /package/dist/{chunk-KGW3CVDO.mjs.map → chunk-F2W64HKC.mjs.map} +0 -0
  138. /package/dist/{chunk-HFRGTGH6.mjs.map → chunk-HWR7EEVI.mjs.map} +0 -0
  139. /package/dist/{chunk-YTXIST3O.mjs.map → chunk-M6I5JHJC.mjs.map} +0 -0
  140. /package/dist/{chunk-VOZBRY56.mjs.map → chunk-MH4VLBIT.mjs.map} +0 -0
  141. /package/dist/{chunk-6HTOXMLP.mjs.map → chunk-NL464DQQ.mjs.map} +0 -0
  142. /package/dist/{chunk-G6EOJ3XG.mjs.map → chunk-NOZLL54Z.mjs.map} +0 -0
  143. /package/dist/{chunk-ZPT6E6AF.mjs.map → chunk-NTK2UCHO.mjs.map} +0 -0
  144. /package/dist/{chunk-TNJ2KFPQ.mjs.map → chunk-NWUALPMB.mjs.map} +0 -0
  145. /package/dist/{chunk-44GORRHT.mjs.map → chunk-OLL5B5NN.mjs.map} +0 -0
  146. /package/dist/{chunk-A7KUHZ3A.mjs.map → chunk-P2ZMGAQP.mjs.map} +0 -0
  147. /package/dist/{chunk-CR2ZP2PA.mjs.map → chunk-PFLWEHXS.mjs.map} +0 -0
  148. /package/dist/{chunk-JMAWKYXN.mjs.map → chunk-QMIBOIAF.mjs.map} +0 -0
  149. /package/dist/{chunk-OWUSKHPI.mjs.map → chunk-S5J3TYAZ.mjs.map} +0 -0
  150. /package/dist/{chunk-RPZ2XDQQ.mjs.map → chunk-SATFIUWH.mjs.map} +0 -0
  151. /package/dist/{chunk-ULOORN2E.mjs.map → chunk-T773NDGK.mjs.map} +0 -0
  152. /package/dist/{chunk-DWSZUI3N.mjs.map → chunk-T7YVWWJF.mjs.map} +0 -0
  153. /package/dist/{chunk-66DVBO4C.mjs.map → chunk-TN6LYAFX.mjs.map} +0 -0
  154. /package/dist/{chunk-NUFTFLAY.mjs.map → chunk-UIL3XRCV.mjs.map} +0 -0
  155. /package/dist/{chunk-IUZTBZYP.mjs.map → chunk-W3LNVDFV.mjs.map} +0 -0
  156. /package/dist/{chunk-TXXJY2Y7.mjs.map → chunk-WJGWSFCJ.mjs.map} +0 -0
  157. /package/dist/{chunk-HIM2UTGC.mjs.map → chunk-Z37TBPTK.mjs.map} +0 -0
@@ -42,949 +42,959 @@ import {
42
42
  isTrue
43
43
  } from "./chunk-AAND4MKF.mjs";
44
44
 
45
- // src/types/Object.ts
46
- function entries(subject) {
47
- return ifDefined(
48
- subject,
49
- () => toList([...Object.entries(subject), ...Object.entries(Object.getPrototypeOf(subject) ?? {})]),
50
- () => toList()
51
- );
52
- }
53
- function values(subject) {
54
- return toList([...Object.values(subject), ...Object.values(Object.getPrototypeOf(subject) ?? {})]);
55
- }
56
- function keys(subject) {
57
- return toList([...Object.keys(subject), ...Object.keys(Object.getPrototypeOf(subject) ?? {})]);
58
- }
59
- function extractKeys(obj, keys2) {
60
- return keys2.filter((k) => k in obj).reduce(
61
- (acc, key) => {
62
- acc.keys[key] = obj[key];
63
- delete acc[key];
64
- return acc;
65
- },
66
- { keys: {}, ...obj }
67
- );
68
- }
69
-
70
- // src/utils/Promise.ts
71
- var resolve = (subject) => Promise.resolve(subject);
72
- var reject = (e) => Promise.reject(e);
73
- var tuple = {
74
- 2: (first, second) => Promise.all([first, second]),
75
- 3: (first, second, third) => Promise.all([first, second, third]),
76
- 4: (first, second, third, forth) => Promise.all([first, second, third, forth]),
77
- 5: (first, second, third, forth, fifth) => Promise.all([first, second, third, forth, fifth]),
78
- all: (first, second) => Promise.all([first, Promise.all(second)]),
79
- spread: (first, ...second) => Promise.all([first, Promise.all(toArray(second))]),
80
- list: (list) => Promise.all([...list]).then(toList),
81
- settled: (list) => Promise.allSettled([...list]).then((rs) => ({
82
- fulfilled: toList(...rs.filter((r) => r.status === "fulfilled").map((r) => r.value)),
83
- rejected: toList(...rs.filter((r) => r.status === "rejected").map((r) => asString(r.reason)))
84
- })),
85
- object: (obj) => use(keys(obj), (ks) => tuple.list(values(obj)).then((vs) => vs.reduce((acc, v, i) => on(acc, (a) => a[ks[i]] = v), {})))
86
- };
87
- var tuple2 = tuple[2];
88
- var tuple3 = tuple[3];
89
- var tuple4 = tuple[4];
90
- var tuple5 = tuple[5];
91
- var tupleO = tuple.object;
92
- var settled = tuple.settled;
93
-
94
- // src/types/Meta.ts
95
- import "reflect-metadata";
96
- var ClassMeta = class {
97
- constructor(subject, data = (subject.prototype ?? subject).constructor) {
98
- this.subject = subject;
99
- this.data = data;
100
- }
101
- get = (key) => Reflect.getMetadata(key, this.data);
102
- set = (key, value) => {
103
- Reflect.defineMetadata(key, value, this.data);
104
- return value;
105
- };
106
- entries = () => entries(this.subject);
107
- parse = (f, options = {}) => {
108
- const { initial = {}, skipUndefined = false } = options;
109
- return this.entries().reduce((a, [k, val]) => use(f(val), (v) => isDefined(v) || !skipUndefined ? on(a, (a2) => a2[k] = v) : a), initial);
110
- };
111
- properties = (key) => toList([...Object.getOwnPropertyNames(this.subject), ...Object.getOwnPropertyNames(Object.getPrototypeOf(this.subject))]).map((p) => this.property(p)).filter((p) => key ? p.get(key) : p);
112
- keys = (key) => this.properties().map((p) => p.get(key)).reduce((list, u) => u ? list.add(u) : list, toList());
113
- values = () => values(this.subject);
114
- property = (property) => new PropertyMeta(this.subject, property);
115
- };
116
- var PropertyMeta = class {
117
- constructor(subject, property, data = Reflect.getMetadata(property, subject)) {
118
- this.subject = subject;
119
- this.property = property;
120
- this.data = data;
121
- }
122
- get value() {
123
- return this.subject[this.property];
45
+ // src/types/Case.ts
46
+ var CaseBuilder = class {
47
+ constructor(v) {
48
+ this.v = v;
124
49
  }
125
- get = (key) => isDefined(this.data) && isDefined(this.data[key]) ? this.data[key] : void 0;
126
- set = (key, value) => {
127
- Reflect.defineMetadata(this.property, { ...this.data, [key]: value }, this.subject);
128
- return value;
50
+ is = {
51
+ true: (pred, out) => this.case(pred, out),
52
+ false: (pred, out) => this.case(!ofGet(pred, this.v), out),
53
+ truthy: (prop, out) => this.case(!!prop(this.v), out),
54
+ falsy: (prop, out) => this.case(!prop(this.v), out),
55
+ defined: (prop, out) => this.case(isDefined(prop(this.v)), out),
56
+ empty: (prop, out) => this.case(isEmpty(prop(this.v)), out),
57
+ valid: (prop, out) => this.case(validate(prop(this.v)).isValid, out),
58
+ in: (prop, out) => this.case(ofGet(prop, this.v).includes(this.v), out),
59
+ type: (guard, out) => this.type(guard, out),
60
+ not: {
61
+ true: (pred, out) => this.case(!ofGet(pred, this.v), out),
62
+ false: (pred, out) => this.case(pred, out),
63
+ truthy: (prop, out) => this.case(!prop(this.v), out),
64
+ falsy: (prop, out) => this.case(!!prop(this.v), out),
65
+ defined: (prop, out) => this.case(!isDefined(prop(this.v)), out),
66
+ empty: (prop, out) => this.case(!isEmpty(prop(this.v)), out),
67
+ valid: (prop, out) => this.case(!validate(prop(this.v)).isValid, out),
68
+ in: (prop, out) => this.case(!ofGet(prop, this.v).includes(this.v), out),
69
+ type: (guard, out) => this.case((v) => !guard(v), out)
70
+ }
129
71
  };
130
- };
131
- var meta = (subject) => new ClassMeta(subject ?? {});
132
-
133
- // src/types/Enum.ts
134
- var isEnumConstructor = (c) => isFunction(c) && c.isEnum;
135
- var Enum = class {
136
- constructor(name, id = name.toLowerCase(), code = id.toString()) {
137
- this.name = name;
138
- this.id = id;
139
- this.code = code;
140
- }
141
- static isEnum = true;
142
- get isValid() {
143
- return isDefined(this.id);
144
- }
145
- static all() {
146
- return meta(this.allTuple()).values();
147
- }
148
- static filter(p, params) {
149
- return this.all().filter(p, params);
150
- }
151
- static first(p, params) {
152
- return this.all().first(p, params);
153
- }
154
- static byIds(ids = []) {
155
- return toList(ids).mapDefined((id) => this.byId(id)).distinct();
156
- }
157
- static byId(id, alt) {
158
- return this.allTuple()[id] ?? ofGet(alt);
159
- }
160
- static allTuple() {
161
- return meta(this).get(`all-${this.name}`) ?? meta(this).set(`all-${this.name}`, meta(this).values().filter(isEnum).toObject("id"));
162
- }
163
- equals(other) {
164
- return this.id === (isEnum(other) ? other.id : other);
165
- }
166
- isIn(...items) {
167
- return items.some((i) => this.equals(i));
72
+ if = this.is;
73
+ case(pred, out) {
74
+ return new Case(this.v).case(pred, out);
168
75
  }
169
- toJSON() {
170
- return this.id;
76
+ type(guard, out) {
77
+ return new Case(this.v).type(guard, out);
171
78
  }
172
- toString() {
173
- return this.id.toString();
79
+ equals(value, out) {
80
+ return new Case(this.v).equals(value, out);
174
81
  }
175
82
  };
176
- var isEnum = (e) => isDefined(e) && e instanceof Enum && isAn(e, "name", "id", "code");
177
-
178
- // src/types/Try.ts
179
- var Try = class _Try {
83
+ var Case = class {
84
+ constructor(value, outcome) {
85
+ this.value = value;
86
+ this.outcome = outcome;
87
+ }
180
88
  is = {
181
- defined: (prop) => this.filter((v) => isDefined(prop ? prop(v) : v)),
182
- empty: (prop) => this.filter((v) => isEmpty(prop ? prop(v) : v)),
183
- valid: (prop) => this.filter((v) => validate(prop ? prop(v) : v).isValid),
184
- true: (prop) => this.filter((v) => isTrue(prop ? prop(v) : v)),
185
- false: (prop) => this.filter((v) => !isTrue(prop ? prop(v) : v)),
89
+ true: (pred, out) => this.case(pred, out),
90
+ false: (pred, out) => this.case(!ofGet(pred, this.value), out),
91
+ truthy: (prop, out) => this.case(!!prop(this.value), out),
92
+ falsy: (prop, out) => this.case(!prop(this.value), out),
93
+ defined: (prop, out) => this.case(isDefined(prop(this.value)), out),
94
+ empty: (prop, out) => this.case(isEmpty(prop(this.value)), out),
95
+ valid: (prop, out) => this.case(validate(prop(this.value)).isValid, out),
96
+ in: (prop, out) => this.case(ofGet(prop, this.value).includes(this.value), out),
97
+ type: (guard, out) => this.type(guard, out),
186
98
  not: {
187
- defined: (prop) => this.filter((v) => !isDefined(prop ? prop(v) : v)),
188
- empty: (prop) => this.filter((v) => !isEmpty(prop ? prop(v) : v)),
189
- valid: (prop) => this.filter((v) => !validate(prop ? prop(v) : v).isValid)
99
+ true: (pred, out) => this.case(!ofGet(pred, this.value), out),
100
+ false: (pred, out) => this.case(pred, out),
101
+ truthy: (prop, out) => this.case(!prop(this.value), out),
102
+ falsy: (prop, out) => this.case(!!prop(this.value), out),
103
+ defined: (prop, out) => this.case(!isDefined(prop(this.value)), out),
104
+ empty: (prop, out) => this.case(!isEmpty(prop(this.value)), out),
105
+ valid: (prop, out) => this.case(!validate(prop(this.value)).isValid, out),
106
+ in: (prop, out) => this.case(!ofGet(prop, this.value).includes(this.value), out),
107
+ type: (guard, out) => this.case((v) => !guard(v), out)
190
108
  }
191
109
  };
192
110
  if = this.is;
193
- static of = (c, ...args) => {
194
- try {
195
- const out = ofGet(c, ...args);
196
- return new Success(out instanceof _Try ? out.value : out);
197
- } catch (e) {
198
- return new Failure(e);
199
- }
200
- };
201
- };
202
- var Success = class extends Try {
203
- constructor(value) {
204
- super();
205
- this.value = value;
206
- }
207
- get error() {
208
- throw new Error("No error found");
209
- }
210
- get isValid() {
211
- return true;
212
- }
213
- map(f) {
214
- return tryTo(f, this.value);
215
- }
216
- recover(f) {
217
- return this;
218
- }
219
- recoverFrom(type, f) {
220
- return this;
221
- }
222
- accept(f) {
223
- return tryTo(() => {
224
- f(this.value);
225
- return this;
226
- });
227
- }
228
- filter(predicate) {
229
- return tryTo(() => {
230
- if (predicate(this.value))
231
- return this;
232
- throw new Error(`Applying filter(${predicate.toString()}) failed.`);
233
- });
111
+ case(pred, out) {
112
+ return tryTo(pred, this.value).is.true().map(() => ofGet(out, this.value)).map((res) => new Found(this.value, res)).or(this);
234
113
  }
235
- or(value) {
236
- return this.value;
114
+ type(guard, out) {
115
+ return tryTo(guard, this.value).is.true().map(() => out(this.value)).map((res) => new Found(this.value, res)).or(this);
237
116
  }
238
- orElse(value) {
239
- return this.value;
117
+ equals(value, out) {
118
+ return this.case(this.value === value, out);
240
119
  }
241
- orThrow(_error) {
242
- return this.value;
120
+ else(alt) {
121
+ return ofGet(alt, this.value);
243
122
  }
244
123
  };
245
- var Failure = class _Failure extends Try {
246
- constructor(error) {
247
- super();
248
- this.error = error;
249
- }
250
- get value() {
251
- throw this.error;
252
- }
253
- get isValid() {
254
- return false;
255
- }
256
- map(f) {
257
- return new _Failure(this.error);
258
- }
259
- recover(f) {
260
- return tryTo(f, this.error);
261
- }
262
- recoverFrom(type, f) {
263
- return tryTo(() => this.error instanceof type ? this.recover(f) : this);
124
+ var Found = class extends Case {
125
+ constructor(value, outcome) {
126
+ super(value, outcome);
127
+ this.value = value;
128
+ this.outcome = outcome;
264
129
  }
265
- accept(f) {
130
+ case(pred, out) {
266
131
  return this;
267
132
  }
268
- filter(predicate) {
133
+ type(guard, out) {
269
134
  return this;
270
135
  }
271
- or(value) {
272
- return ofGet(value);
273
- }
274
- orElse(value) {
275
- return ofGet(value);
136
+ equals(value, out) {
137
+ return this;
276
138
  }
277
- orThrow(error) {
278
- throw ofConstruct(error);
139
+ else(alt) {
140
+ return this.outcome;
279
141
  }
280
142
  };
281
- var tryTo = (c, ...args) => Try.of(c, ...args);
143
+ var choose = (value) => new CaseBuilder(value);
282
144
 
283
- // src/types/Template.ts
284
- var Template = class {
285
- constructor(template2, subject = {}, options = {}) {
286
- this.template = template2;
287
- this.subject = subject;
288
- this.options = options;
289
- }
290
- knownPrefixes = /* @__PURE__ */ new Set(["typeof", "property", "actual", "subject"]);
291
- toString = () => {
292
- return entries(this.options).reduce((t, [k]) => this.option(t, k), this.object()).replace(" ", " ");
293
- };
294
- props = (tmpl, key, result = toList()) => {
295
- const i1 = tmpl.indexOf(`{${key}`);
296
- if (i1 < 0) {
297
- return result;
298
- }
299
- const i2 = tmpl.indexOf("}", i1);
300
- return this.props(tmpl.slice(i2 + 1), key, result.add(tmpl.substring(i1 + 1, i2)));
301
- };
302
- 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("");
303
- option = (tmpl, prop) => {
304
- return this.props(tmpl, prop).reduce((t, p) => t.replace(`{${p}}`, textValue(this.options, p)), tmpl);
305
- };
306
- };
307
- function template(tmpl, subject, options = {}) {
308
- return new Template(asString(tmpl), subject, {
309
- typeof: toName(subject),
310
- subject: text(JSON.stringify(subject)),
311
- ...options
312
- });
145
+ // src/types/IsEqual.ts
146
+ 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])));
147
+ 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);
148
+ var isEqual = (one, another) => choose([one, another]).case(([o, a]) => o === a, true).case(
149
+ ([o, a]) => isArray(o) || isArray(a),
150
+ ([o, a]) => isEqualArray(o, a)
151
+ ).case(
152
+ ([o, a]) => o == null || a == null || !isObject(o) && !isObject(a),
153
+ ([o, a]) => o !== o && a !== a
154
+ ).else(([o, a]) => isEqualObject(o, a));
155
+
156
+ // src/utils/If.ts
157
+ function ifTrue(o, f, alt) {
158
+ return isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
159
+ }
160
+ function ifFalse(o, f, alt) {
161
+ return !isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
162
+ }
163
+ function ifDefined(o, f, alt) {
164
+ return isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt);
165
+ }
166
+ function ifNotEmpty(o, f = (o2) => o2, alt) {
167
+ return isNotEmpty(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
168
+ }
169
+ function ifEqual(one, another, f, alt) {
170
+ return isEqual(one, another) ? ofConstruct(f) : ofConstruct(alt);
171
+ }
172
+ function ifEither(os, f = (o) => o, alt) {
173
+ return use(
174
+ toList(os).first((o) => isPresent(o)),
175
+ (o) => isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt, o)
176
+ );
313
177
  }
314
178
 
315
- // src/types/ToText.ts
316
- var ToText = class {
317
- constructor(subject) {
318
- this.subject = subject;
179
+ // src/types/List.ts
180
+ var List = class extends Array {
181
+ get ids() {
182
+ return this.mapDefined((i) => i.id);
319
183
  }
320
- get cap() {
321
- return this.map((s) => capitalize(s?.toLowerCase()));
184
+ get indexed() {
185
+ return this.map((v, index) => ({ ...v, index }));
322
186
  }
323
- get capFirst() {
324
- return this.map((s) => capitalize(s));
187
+ isSubSetOf(...items) {
188
+ return this.diff(items).length === 0;
325
189
  }
326
- get title() {
327
- return this.map(
328
- (s) => s.split(" ").map((w) => text(w).cap).join(" ")
329
- );
190
+ isSuperSetOf(...items) {
191
+ return this.length > items.length && toList(...items).isSubSetOf(...this);
330
192
  }
331
- get pascal() {
332
- return this.title.replace(" ", "");
193
+ isIntersectingWith(...items) {
194
+ return this.intersect(items).length > 0;
333
195
  }
334
- get lower() {
335
- return this.map((s) => s.toLowerCase());
196
+ isDisjointWith(...items) {
197
+ return !this.isIntersectingWith(...items);
336
198
  }
337
- get upper() {
338
- return this.map((s) => s.toUpperCase());
199
+ areEqual(...items) {
200
+ return this.isSubSetOf(...items) && toList(...items).isSubSetOf(...this);
339
201
  }
340
- get camel() {
341
- return this.title.trim.map((s) => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);
202
+ asc(p) {
203
+ return toList(...this).sort((e1, e2) => ofProperty(e1, p) > ofProperty(e2, p) ? 1 : -1);
342
204
  }
343
- get kebab() {
344
- return this.lower.replace(" ", "-");
205
+ desc(p) {
206
+ return toList(...this).sort((e1, e2) => ofProperty(e1, p) < ofProperty(e2, p) ? 1 : -1);
345
207
  }
346
- get strictKebab() {
347
- return this.map((s) => s.replace(/[^a-z\d]+/gi, " ").trim()).kebab;
208
+ first(p, params) {
209
+ return p ? this.find(p, params) : this[0];
348
210
  }
349
- get slug() {
350
- return this.map(
351
- (s) => s.replace(/ß/g, "ss").normalize("NFKD").replace(/[\u0300-\u036F]/g, "").toLowerCase().replace(/[^a-z\d]+/g, "-").replace(/(^-)|(-$)/g, "")
211
+ firstValue(f, alt) {
212
+ return ifDefined(
213
+ this.first((t) => !!f(t)),
214
+ f,
215
+ (v) => ofGet(alt, v)
352
216
  );
353
217
  }
354
- get snake() {
355
- return this.upper.replace(" ", "_");
218
+ isFirst(value) {
219
+ return value === this.first();
356
220
  }
357
- get plural() {
358
- return this.ifLike("") ?? this.add("s");
221
+ next(p, params) {
222
+ return p ? this[this.findIndex(p, params) + 1] : this[0];
359
223
  }
360
- get space() {
361
- return this.map((s) => s.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]/g, " "));
224
+ prev(p, params) {
225
+ return p ? this[this.findIndex(p, params) - 1] : this[0];
362
226
  }
363
- get sentence() {
364
- return this.isEmpty ? this : this.map((s) => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);
227
+ last(p, params) {
228
+ return p ? this.filter(p, params).last() : this[this.length - 1];
365
229
  }
366
- get initials() {
367
- return this.map(
368
- (s) => s.split(" ").map((w) => w[0]).join("")
369
- );
230
+ isLast(value) {
231
+ return value === this.last();
370
232
  }
371
- get trim() {
372
- return this.map((s) => s.replace(/[- ,_#]/g, ""));
233
+ overlaps(...items) {
234
+ return toList(...items).some((i) => this.some((t) => i === t));
373
235
  }
374
- get trimSentence() {
375
- return this.map(
376
- (s) => s.replace(/[\u200B-\u200D\uFEFF]/g, "").replace(/[\s\u00A0]+/g, " ").replace(/\s+([.,;:!?])/g, "$1").trim()
377
- );
236
+ diff(others) {
237
+ return this.filter((i) => !others.includes(i));
378
238
  }
379
- get isEmpty() {
380
- return isEmpty(this.toString());
239
+ diffByKey(others, key) {
240
+ return this.filter((i) => !others.some((o) => o[key] === i[key]));
381
241
  }
382
- parse = (subject, options = {}) => text(template(this.subject, subject, { typeof: toName(subject), ...options }));
383
- is = (...others) => others.some((o) => this.toString() === text(o).toString());
384
- equals = this.is;
385
- like = (...others) => others.some((o) => this.trim.lower.toString().includes(text(o).trim.lower.toString()));
386
- isLike = (...others) => others.some((o) => this.trim.lower.is(text(o).trim.lower));
387
- ifLike = (...others) => this.isLike(...others) ? this : void 0;
388
- endsWith = (end) => this.subject.endsWith(asString(end));
389
- startsWith = (end) => this.subject.startsWith(asString(end));
390
- first = (n) => this.map((s) => s.substring(0, n));
391
- last = (n) => this.map((s) => s.substring(s.length - n));
392
- map = (func) => text(ofGet(func, this.subject));
393
- replace = (search, replace) => this.map((s) => replaceAll(s, search, replace));
394
- add = (add, separator = "") => this.map((s) => isNotEmpty(add) ? `${s}${separator}${text(add)}` : s);
395
- with = (separator, ...other) => this.map(
396
- (s) => toList(s).add(...other.map((u) => text(u).toString())).filter((s2) => isNotEmpty(s2)).join(separator)
397
- );
398
- split = (separator = " ") => toList(this.subject.split(separator));
399
- toString() {
400
- return this.subject;
242
+ symmetricDiff(others) {
243
+ return this.diff(others).concat(toList(...others).diff(this));
244
+ }
245
+ symmetricDiffByKey(others, key) {
246
+ return this.diffByKey(others, key).concat(toList(...others).diffByKey(this, key));
247
+ }
248
+ intersect(others) {
249
+ return this.filter((i) => others.includes(i));
250
+ }
251
+ intersectByKey(others, key) {
252
+ return this.filter((i) => others.some((o) => o[key] === i[key]));
253
+ }
254
+ intersectBy(others, f) {
255
+ return this.filter((i) => others.some((o) => f(i, o)));
256
+ }
257
+ accumulate(...keys2) {
258
+ return this.map((d, i, arr) => {
259
+ const acc = keys2.reduce((acc2, v) => {
260
+ acc2[v] = i === 0 ? d[v] : arr[i - 1][v] + d[v];
261
+ return acc2;
262
+ }, d);
263
+ arr[i] = acc;
264
+ return acc;
265
+ });
401
266
  }
402
267
  toJSON() {
403
- return this.subject;
268
+ return this.reduce((a, i) => {
269
+ a.push(JSON.parse(JSON.stringify(i ?? {})));
270
+ return a;
271
+ }, new Array());
404
272
  }
405
- };
406
- function text(subject, alt = "") {
407
- const sub = subject ? asString(subject) : alt;
408
- return new ToText(sub !== "[object Object]" ? sub : "");
409
- }
410
- function textValue(subject, prop) {
411
- const p = prop.split(".");
412
- const root = subject?.[p[0]];
413
- const initial = typeof root === "object" && root !== null ? root : text(root);
414
- return p.splice(1).reduce((t, s) => (typeof t === "object" && t !== null ? t : text(t))?.[s], initial)?.toString() ?? "";
415
- }
416
-
417
- // src/types/Exception.ts
418
- var Exception = class _Exception extends Enum {
419
- constructor(message, id, reason) {
420
- super(message, id ?? text(message).pascal.toString());
421
- this.message = message;
422
- this.reason = reason;
273
+ map(f, params) {
274
+ return toList(super.map(f, params));
423
275
  }
424
- static AlreadyExists = new _Exception("Subject already exists");
425
- static DoesNotExist = new _Exception("Does not exist");
426
- static IsMissingId = new _Exception("Subject is missing an id");
427
- static IsNotImplemented = new _Exception("Is not implemented");
428
- static IsNotValid = new _Exception("Is not valid");
429
- static Unknown = new _Exception("Unknown error");
430
- static CouldNotExecute = (target) => new _Exception(`Could not execute ${target}.`, "CouldNotExecute");
431
- static CouldNotValidate = (target) => new _Exception(`Could not validate ${target}.`, "CouldNotValidate");
432
- static EnvironmentVariableNotFound = (variable) => new _Exception(`Environment variable ${text(variable).upper} could not be found.`, "EnvironmentVariableNotFound");
433
- because = (reason) => new _Exception(this.message, this.id, reason);
434
- };
435
- var isException = (e, t) => e instanceof Exception && (isDefined(t) ? e.equals(asString(t)) : true);
436
- var isDoesNotExist = (e) => e instanceof Exception && Exception.DoesNotExist.equals(e);
437
-
438
- // src/validation/When.ts
439
- var When = class _When {
440
- constructor(subject, valid = true, results) {
441
- this.subject = subject;
442
- this.valid = valid;
443
- this.results = results;
276
+ flatMap(f, params) {
277
+ return toList(super.flatMap(f, params));
278
+ }
279
+ mapDefined(f, params) {
280
+ return this.map(f, params).defined();
281
+ }
282
+ mapAsync(f) {
283
+ return Promise.all(super.map((e) => f(e))).then((a) => toList(a));
284
+ }
285
+ mapSerial(f) {
286
+ return super.reduce((p, item) => p.then((results) => on(results, async (r) => r.push(await f(item)))), Promise.resolve(toList()));
444
287
  }
445
- get not() {
446
- return this.clone(!this.valid);
288
+ distinct() {
289
+ return this.filter((i, index) => this.indexOf(i) === index);
447
290
  }
448
- get and() {
449
- return this.clone(this.valid);
291
+ distinctByKey(key) {
292
+ const seen = /* @__PURE__ */ new Set();
293
+ return this.filter((item) => !seen.has(item[key]) && seen.add(item[key]));
450
294
  }
451
- get isDefined() {
452
- return this.clone(this.valid === isDefined(this.subject));
295
+ distinctByValue() {
296
+ const seen = /* @__PURE__ */ new Set();
297
+ return this.filter((item) => !seen.has(JSON.stringify(item)) && seen.add(JSON.stringify(item)));
453
298
  }
454
- get isEmpty() {
455
- return this.clone(this.valid === isEmpty(this.subject));
299
+ filter(p, params) {
300
+ return toList(super.filter(p, params));
456
301
  }
457
- get isTrue() {
458
- return this.clone(this.valid === !!this.subject);
302
+ sum(p) {
303
+ return this.reduce((sum, i) => sum + p(i), 0);
459
304
  }
460
- get isValid() {
461
- this.results = validate(this.subject);
462
- return this.clone(this.valid === this.results.isValid);
305
+ max(p) {
306
+ return this.desc(p).first();
463
307
  }
464
- isInstance = (c) => this.clone(this.valid === this.subject instanceof c);
465
- with = (pred) => this.clone(this.valid === ofGet(pred, this.subject));
466
- contains = (property) => this.clone(this.valid === isDefined(ofGet(property, this.subject)));
467
- in = (...items) => this.clone(this.valid === isIn(this.subject, toArray(...items)));
468
- is = (item) => this.clone(this.valid === (this.subject === item));
469
- reject = (error) => !this.valid ? resolve(this.subject) : reject(ofGet(error, this.subject) ?? this.results ?? Exception.Unknown);
470
- recover = (f) => resolve(!this.valid ? this.subject : f(this.subject));
471
- clone = (result = true) => new _When(this.subject, result, this.results);
472
- };
473
- var when = (subject) => new When(subject);
474
-
475
- // src/types/Context.ts
476
- var DotEnvContext = class {
477
- domain = process.env.DOMAIN ?? "easy";
478
- name = process.env.ENVIRONMENT_NAME ?? "";
479
- host = process.env.HOST ?? "";
480
- port = Number.parseInt(process.env.PORT ?? "8080");
481
- app = process.env.APP ?? "";
482
- get = (key, alt) => {
483
- const k = text(key).map((k2) => k2.replace(/([a-z])([A-Z])/g, "$1 $2")).snake.toString();
484
- return process.env[k] ?? alt;
485
- };
486
- };
487
- var BaseRequestContext = class {
488
- state = {};
489
- get token() {
490
- return this.get("token");
308
+ min(p) {
309
+ return this.asc(p).first();
491
310
  }
492
- set token(token) {
493
- this.set("token", token);
311
+ byId(id) {
312
+ return this.first((i) => equals(i.id, id));
494
313
  }
495
- get identity() {
496
- return this.token;
314
+ byKey(key, value) {
315
+ return this.first((i) => i[key] == value);
497
316
  }
498
- get jwt() {
499
- return this.get("jwt");
317
+ add(...items) {
318
+ super.push(...toArray(...items));
319
+ return this;
500
320
  }
501
- set jwt(jwt) {
502
- this.set("jwt", jwt);
321
+ concat(...items) {
322
+ return toList(super.concat(...items));
503
323
  }
504
- get correlationId() {
505
- return this.get("correlationId");
324
+ reverse() {
325
+ return toList(super.reverse());
506
326
  }
507
- set correlationId(id) {
508
- this.set("correlationId", id);
327
+ splice(start, deleteCount, ...items) {
328
+ return toList(super.splice(start, deleteCount, ...items));
509
329
  }
510
- get lastError() {
511
- return this.get("lastError");
330
+ remove(item) {
331
+ const index = this.indexOf(item);
332
+ if (index > -1) {
333
+ this.splice(index, 1);
334
+ }
335
+ return this;
512
336
  }
513
- set lastError(error) {
514
- this.set("lastError", error);
337
+ move(sourceId, destinationId) {
338
+ return this.moveOn("id", sourceId, destinationId);
515
339
  }
516
- get(key) {
517
- return this.state[key];
340
+ moveOn(key, sourceId, destinationId) {
341
+ const source = this.findIndex((i) => equals(i[key], sourceId));
342
+ const dest = this.findIndex((i) => equals(i[key], destinationId));
343
+ return on(toList(...this), (r) => r.splice(dest, 0, ...r.splice(source, 1)));
518
344
  }
519
- set(key, value) {
520
- return this.state[key] = value;
345
+ replace(key, item) {
346
+ const index = this.findIndex((i) => i[key] === item?.[key]);
347
+ ifTrue(index != -1, () => this.splice(index, 1, item));
348
+ return this;
521
349
  }
522
- create = (f) => f();
523
- wrap = (f) => f();
524
- };
525
- var BaseContext = class extends BaseRequestContext {
526
- };
527
- var Context = class {
528
- constructor(state = {}) {
529
- this.state = state;
530
- this.state = {
531
- ...{
532
- env: new DotEnvContext(),
533
- request: new BaseRequestContext(),
534
- other: {}
350
+ switch(item) {
351
+ return this.includes(item) ? this.remove(item) : this.add(item);
352
+ }
353
+ switchOn(item, on2) {
354
+ return use(
355
+ typeof on2 === "function" ? this.find(on2) : use(traverse(item, on2), (v) => this.find((i) => traverse(i, on2) === v)),
356
+ (i) => i ? this.remove(i) : this.add(item)
357
+ );
358
+ }
359
+ defined() {
360
+ return this.reduce((l, v) => isDefined(v) ? l.add(v) : l, toList());
361
+ }
362
+ toObject(key, options = {}) {
363
+ return this.reduce((o, i) => {
364
+ o[i[key]] = i;
365
+ if (options.deleteKey)
366
+ delete o[i[key]][key];
367
+ return o;
368
+ }, {});
369
+ }
370
+ toObjectList(key) {
371
+ return this.reduce(
372
+ (a, t) => {
373
+ const k = t[key];
374
+ a[k] = a[k] ?? toList();
375
+ a[k].push(t);
376
+ return a;
535
377
  },
536
- ...this.state
537
- };
378
+ {}
379
+ );
538
380
  }
539
- get env() {
540
- return this.state.env;
381
+ orElse(...alt) {
382
+ return !isEmpty(this) ? this : !isEmpty(...alt) ? toList(...alt) : void 0;
541
383
  }
542
- set env(env) {
543
- this.state.env = env;
384
+ weave(insertFrom, interval) {
385
+ for (let i = interval, n = 0; i <= this.length && n < insertFrom.length; i += interval + 1) {
386
+ this.splice(i, 0, insertFrom[n++]);
387
+ }
388
+ return this;
544
389
  }
545
- get request() {
546
- return this.state.request;
390
+ slice(start, end) {
391
+ return toList(super.slice(start, end));
547
392
  }
548
- set request(request) {
549
- this.state.request = request;
393
+ none(p) {
394
+ return !this.some(p);
550
395
  }
551
- get other() {
552
- return this.state.other;
396
+ chunk(chunkSize) {
397
+ return this.reduce((acc, _, index) => index % chunkSize === 0 ? on(acc, (a) => a.push(this.slice(index, index + chunkSize))) : acc, toList());
553
398
  }
554
- };
555
- var ctx = new Context();
556
-
557
- // src/types/Result.ts
558
- var toResult = (message, location, domain = ctx.env.domain) => ({
559
- message: message.toString(),
560
- location: location?.toString(),
561
- domain: domain?.toString()
562
- });
563
- var isResult = (r) => isA(r, "message");
564
-
565
- // src/types/Results.ts
566
- var parse = (...rs) => toArray(...rs).map((r) => isResult(r) ? r : toResult(r));
567
- var Results = class {
568
- results;
569
- constructor(...rs) {
570
- this.results = parse(...rs);
399
+ //we needed to add U because of a Typescript issue with generics
400
+ update(p, val) {
401
+ return this.map((v, i, a) => p(v, i, a) ? ofGet(val, v, i, a) : v);
571
402
  }
572
- get length() {
573
- return this.results.length;
403
+ updateFirst(p, val) {
404
+ const index = this.findIndex(p);
405
+ return this.update((t, i) => p(t, i, this) && i == index, val);
574
406
  }
575
- get isValid() {
576
- return this.results.length === 0;
407
+ updateFirstById(id, val) {
408
+ return this.updateFirst((i) => equals(i?.id, id), val);
577
409
  }
578
- add = (...rs) => toResults(...this.results, ...parse(...rs));
410
+ updateById(id, val) {
411
+ return this.update((i) => equals(i?.id, id), val);
412
+ }
413
+ groupBy(by) {
414
+ return toList(
415
+ Array.from(this.reduce((m, v, i, a) => use(by(v, i, a), (key) => m.set(key, (m.get(key) ?? toList()).add(v))), /* @__PURE__ */ new Map()).values())
416
+ );
417
+ }
418
+ };
419
+ var toList = (...items) => new List().add(...items);
420
+ var isList = (l) => isDefined(l) && isArray(l) && isA(l, "first", "last", "asc", "desc");
421
+ var asList = (c, items = []) => toList(toArray(items).map((i) => new c(i)));
422
+ var maxValue = (l, key) => l.desc(key).first()?.[key];
423
+ var minValue = (l, key) => l.asc(key).first()?.[key];
424
+
425
+ // src/types/Object.ts
426
+ function entries(subject) {
427
+ return ifDefined(
428
+ subject,
429
+ () => toList([...Object.entries(subject), ...Object.entries(Object.getPrototypeOf(subject) ?? {})]),
430
+ () => toList()
431
+ );
432
+ }
433
+ function values(subject) {
434
+ return toList([...Object.values(subject), ...Object.values(Object.getPrototypeOf(subject) ?? {})]);
435
+ }
436
+ function keys(subject) {
437
+ return toList([...Object.keys(subject), ...Object.keys(Object.getPrototypeOf(subject) ?? {})]);
438
+ }
439
+ function extractKeys(obj, keys2) {
440
+ return keys2.filter((k) => k in obj).reduce(
441
+ (acc, key) => {
442
+ acc.keys[key] = obj[key];
443
+ delete acc[key];
444
+ return acc;
445
+ },
446
+ { keys: {}, ...obj }
447
+ );
448
+ }
449
+
450
+ // src/utils/Promise.ts
451
+ var resolve = (subject) => Promise.resolve(subject);
452
+ var reject = (e) => Promise.reject(e);
453
+ var tuple = {
454
+ 2: (first, second) => Promise.all([first, second]),
455
+ 3: (first, second, third) => Promise.all([first, second, third]),
456
+ 4: (first, second, third, forth) => Promise.all([first, second, third, forth]),
457
+ 5: (first, second, third, forth, fifth) => Promise.all([first, second, third, forth, fifth]),
458
+ all: (first, second) => Promise.all([first, Promise.all(second)]),
459
+ spread: (first, ...second) => Promise.all([first, Promise.all(toArray(second))]),
460
+ list: (list) => Promise.all([...list]).then(toList),
461
+ settled: (list) => Promise.allSettled([...list]).then((rs) => ({
462
+ fulfilled: toList(...rs.filter((r) => r.status === "fulfilled").map((r) => r.value)),
463
+ rejected: toList(...rs.filter((r) => r.status === "rejected").map((r) => asString(r.reason)))
464
+ })),
465
+ object: (obj) => use(keys(obj), (ks) => tuple.list(values(obj)).then((vs) => vs.reduce((acc, v, i) => on(acc, (a) => a[ks[i]] = v), {})))
579
466
  };
580
- var toResults = (...r) => new Results(...r);
581
- var isResults = (r) => isDefined(r) && r instanceof Results;
467
+ var tuple2 = tuple[2];
468
+ var tuple3 = tuple[3];
469
+ var tuple4 = tuple[4];
470
+ var tuple5 = tuple[5];
471
+ var tupleO = tuple.object;
472
+ var settled = tuple.settled;
582
473
 
583
- // src/validation/Validate.ts
584
- var asResults = (subject, template2, options = {}) => toResults(toResult(text(template2).parse(subject, options), toName(subject)));
585
- var validators = (subject) => meta(subject).keys("constraint").reduce((list, vs) => list.add(vs), toList());
586
- var runValidator = (v, subject) => {
587
- try {
588
- const actual = isFunction(subject[v.property]) ? subject[v.property]() : subject[v.property];
589
- const constraint = v.constraint(actual);
590
- return isResults(constraint) ? constraint : !constraint ? asResults(subject, v.text, {
591
- ...v,
592
- actual
593
- }) : toResults();
594
- } catch (e) {
595
- return asResults(subject, asString(e));
474
+ // src/types/Meta.ts
475
+ import "reflect-metadata";
476
+ var ClassMeta = class {
477
+ constructor(subject, data = (subject.prototype ?? subject).constructor) {
478
+ this.subject = subject;
479
+ this.data = data;
596
480
  }
481
+ get = (key) => Reflect.getMetadata(key, this.data);
482
+ set = (key, value) => {
483
+ Reflect.defineMetadata(key, value, this.data);
484
+ return value;
485
+ };
486
+ entries = () => entries(this.subject);
487
+ parse = (f, options = {}) => {
488
+ const { initial = {}, skipUndefined = false } = options;
489
+ return this.entries().reduce((a, [k, val]) => use(f(val), (v) => isDefined(v) || !skipUndefined ? on(a, (a2) => a2[k] = v) : a), initial);
490
+ };
491
+ properties = (key) => toList([...Object.getOwnPropertyNames(this.subject), ...Object.getOwnPropertyNames(Object.getPrototypeOf(this.subject))]).map((p) => this.property(p)).filter((p) => key ? p.get(key) : p);
492
+ keys = (key) => this.properties().map((p) => p.get(key)).reduce((list, u) => u ? list.add(u) : list, toList());
493
+ values = () => values(this.subject);
494
+ property = (property) => new PropertyMeta(this.subject, property);
597
495
  };
598
- var constraints = (subject) => validators(subject).map((vs) => runValidator(vs, subject)).reduce((rs, r) => rs.add(...r.results), toResults());
599
- var validate = (subject) => choose(subject).is.not.defined(
600
- (s) => s,
601
- () => toResults("Subject is not defined.")
602
- ).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());
603
- var validateReject = (subject) => when(subject).not.isValid.reject();
604
- var isValid = (t) => validate(t).isValid;
605
-
606
- // src/types/Case.ts
607
- var CaseBuilder = class {
608
- constructor(v) {
609
- this.v = v;
496
+ var PropertyMeta = class {
497
+ constructor(subject, property, data = Reflect.getMetadata(property, subject)) {
498
+ this.subject = subject;
499
+ this.property = property;
500
+ this.data = data;
610
501
  }
611
- is = {
612
- true: (pred, out) => this.case(pred, out),
613
- false: (pred, out) => this.case(!ofGet(pred, this.v), out),
614
- truthy: (prop, out) => this.case(!!prop(this.v), out),
615
- falsy: (prop, out) => this.case(!prop(this.v), out),
616
- defined: (prop, out) => this.case(isDefined(prop(this.v)), out),
617
- empty: (prop, out) => this.case(isEmpty(prop(this.v)), out),
618
- valid: (prop, out) => this.case(validate(prop(this.v)).isValid, out),
619
- in: (prop, out) => this.case(ofGet(prop, this.v).includes(this.v), out),
620
- type: (guard, out) => this.type(guard, out),
621
- not: {
622
- true: (pred, out) => this.case(!ofGet(pred, this.v), out),
623
- false: (pred, out) => this.case(pred, out),
624
- truthy: (prop, out) => this.case(!prop(this.v), out),
625
- falsy: (prop, out) => this.case(!!prop(this.v), out),
626
- defined: (prop, out) => this.case(!isDefined(prop(this.v)), out),
627
- empty: (prop, out) => this.case(!isEmpty(prop(this.v)), out),
628
- valid: (prop, out) => this.case(!validate(prop(this.v)).isValid, out),
629
- in: (prop, out) => this.case(!ofGet(prop, this.v).includes(this.v), out),
630
- type: (guard, out) => this.case((v) => !guard(v), out)
631
- }
632
- };
633
- if = this.is;
634
- case(pred, out) {
635
- return new Case(this.v).case(pred, out);
502
+ get value() {
503
+ return this.subject[this.property];
636
504
  }
637
- type(guard, out) {
638
- return new Case(this.v).type(guard, out);
505
+ get = (key) => isDefined(this.data) && isDefined(this.data[key]) ? this.data[key] : void 0;
506
+ set = (key, value) => {
507
+ Reflect.defineMetadata(this.property, { ...this.data, [key]: value }, this.subject);
508
+ return value;
509
+ };
510
+ };
511
+ var meta = (subject) => new ClassMeta(subject ?? {});
512
+
513
+ // src/types/Enum.ts
514
+ var isEnumConstructor = (c) => isFunction(c) && c.isEnum;
515
+ var Enum = class {
516
+ constructor(name, id = name.toLowerCase(), code = id.toString()) {
517
+ this.name = name;
518
+ this.id = id;
519
+ this.code = code;
639
520
  }
640
- equals(value, out) {
641
- return new Case(this.v).equals(value, out);
521
+ static isEnum = true;
522
+ get isValid() {
523
+ return isDefined(this.id);
642
524
  }
643
- };
644
- var Case = class {
645
- constructor(value, outcome) {
646
- this.value = value;
647
- this.outcome = outcome;
525
+ static all() {
526
+ return meta(this.allTuple()).values();
648
527
  }
649
- is = {
650
- true: (pred, out) => this.case(pred, out),
651
- false: (pred, out) => this.case(!ofGet(pred, this.value), out),
652
- truthy: (prop, out) => this.case(!!prop(this.value), out),
653
- falsy: (prop, out) => this.case(!prop(this.value), out),
654
- defined: (prop, out) => this.case(isDefined(prop(this.value)), out),
655
- empty: (prop, out) => this.case(isEmpty(prop(this.value)), out),
656
- valid: (prop, out) => this.case(validate(prop(this.value)).isValid, out),
657
- in: (prop, out) => this.case(ofGet(prop, this.value).includes(this.value), out),
658
- type: (guard, out) => this.type(guard, out),
659
- not: {
660
- true: (pred, out) => this.case(!ofGet(pred, this.value), out),
661
- false: (pred, out) => this.case(pred, out),
662
- truthy: (prop, out) => this.case(!prop(this.value), out),
663
- falsy: (prop, out) => this.case(!!prop(this.value), out),
664
- defined: (prop, out) => this.case(!isDefined(prop(this.value)), out),
665
- empty: (prop, out) => this.case(!isEmpty(prop(this.value)), out),
666
- valid: (prop, out) => this.case(!validate(prop(this.value)).isValid, out),
667
- in: (prop, out) => this.case(!ofGet(prop, this.value).includes(this.value), out),
668
- type: (guard, out) => this.case((v) => !guard(v), out)
669
- }
670
- };
671
- if = this.is;
672
- case(pred, out) {
673
- return tryTo(pred, this.value).is.true().map(() => ofGet(out, this.value)).map((res) => new Found(this.value, res)).or(this);
528
+ static filter(p, params) {
529
+ return this.all().filter(p, params);
674
530
  }
675
- type(guard, out) {
676
- return tryTo(guard, this.value).is.true().map(() => out(this.value)).map((res) => new Found(this.value, res)).or(this);
531
+ static first(p, params) {
532
+ return this.all().first(p, params);
677
533
  }
678
- equals(value, out) {
679
- return this.case(this.value === value, out);
534
+ static byIds(ids = []) {
535
+ return toList(ids).mapDefined((id) => this.byId(id)).distinct();
680
536
  }
681
- else(alt) {
682
- return ofGet(alt, this.value);
537
+ static byId(id, alt) {
538
+ return this.allTuple()[id] ?? ofGet(alt);
683
539
  }
684
- };
685
- var Found = class extends Case {
686
- constructor(value, outcome) {
687
- super(value, outcome);
688
- this.value = value;
689
- this.outcome = outcome;
540
+ static allTuple() {
541
+ return meta(this).get(`all-${this.name}`) ?? meta(this).set(`all-${this.name}`, meta(this).values().filter(isEnum).toObject("id"));
690
542
  }
691
- case(pred, out) {
692
- return this;
543
+ equals(other) {
544
+ return this.id === (isEnum(other) ? other.id : other);
693
545
  }
694
- type(guard, out) {
695
- return this;
546
+ isIn(...items) {
547
+ return items.some((i) => this.equals(i));
696
548
  }
697
- equals(value, out) {
698
- return this;
549
+ toJSON() {
550
+ return this.id;
699
551
  }
700
- else(alt) {
701
- return this.outcome;
552
+ toString() {
553
+ return this.id.toString();
702
554
  }
703
555
  };
704
- var choose = (value) => new CaseBuilder(value);
705
-
706
- // src/types/IsEqual.ts
707
- 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])));
708
- 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);
709
- var isEqual = (one, another) => choose([one, another]).case(([o, a]) => o === a, true).case(
710
- ([o, a]) => isArray(o) || isArray(a),
711
- ([o, a]) => isEqualArray(o, a)
712
- ).case(
713
- ([o, a]) => o == null || a == null || !isObject(o) && !isObject(a),
714
- ([o, a]) => o !== o && a !== a
715
- ).else(([o, a]) => isEqualObject(o, a));
556
+ var isEnum = (e) => isDefined(e) && e instanceof Enum && isAn(e, "name", "id", "code");
716
557
 
717
- // src/utils/If.ts
718
- function ifTrue(o, f, alt) {
719
- return isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
720
- }
721
- function ifFalse(o, f, alt) {
722
- return !isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
723
- }
724
- function ifDefined(o, f, alt) {
725
- return isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt);
726
- }
727
- function ifNotEmpty(o, f = (o2) => o2, alt) {
728
- return isNotEmpty(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
729
- }
730
- function ifEqual(one, another, f, alt) {
731
- return isEqual(one, another) ? ofConstruct(f) : ofConstruct(alt);
732
- }
733
- function ifEither(os, f = (o) => o, alt) {
734
- return use(
735
- toList(os).first((o) => isPresent(o)),
736
- (o) => isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt, o)
737
- );
558
+ // src/types/Template.ts
559
+ var Template = class {
560
+ constructor(template2, subject = {}, options = {}) {
561
+ this.template = template2;
562
+ this.subject = subject;
563
+ this.options = options;
564
+ }
565
+ knownPrefixes = /* @__PURE__ */ new Set(["typeof", "property", "actual", "subject"]);
566
+ toString = () => {
567
+ return entries(this.options).reduce((t, [k]) => this.option(t, k), this.object()).replace(" ", " ");
568
+ };
569
+ props = (tmpl, key, result = toList()) => {
570
+ const i1 = tmpl.indexOf(`{${key}`);
571
+ if (i1 < 0) {
572
+ return result;
573
+ }
574
+ const i2 = tmpl.indexOf("}", i1);
575
+ return this.props(tmpl.slice(i2 + 1), key, result.add(tmpl.substring(i1 + 1, i2)));
576
+ };
577
+ 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("");
578
+ option = (tmpl, prop) => {
579
+ return this.props(tmpl, prop).reduce((t, p) => t.replace(`{${p}}`, textValue(this.options, p)), tmpl);
580
+ };
581
+ };
582
+ function template(tmpl, subject, options = {}) {
583
+ return new Template(asString(tmpl), subject, {
584
+ typeof: toName(subject),
585
+ subject: text(JSON.stringify(subject)),
586
+ ...options
587
+ });
738
588
  }
739
589
 
740
- // src/types/List.ts
741
- var List8 = class extends Array {
742
- get ids() {
743
- return this.mapDefined((i) => i.id);
590
+ // src/types/ToText.ts
591
+ var ToText = class {
592
+ constructor(subject) {
593
+ this.subject = subject;
594
+ }
595
+ get cap() {
596
+ return this.map((s) => capitalize(s?.toLowerCase()));
597
+ }
598
+ get capFirst() {
599
+ return this.map((s) => capitalize(s));
744
600
  }
745
- get indexed() {
746
- return this.map((v, index) => ({ ...v, index }));
601
+ get title() {
602
+ return this.map(
603
+ (s) => s.split(" ").map((w) => text(w).cap).join(" ")
604
+ );
747
605
  }
748
- isSubSetOf(...items) {
749
- return this.diff(items).length === 0;
606
+ get pascal() {
607
+ return this.title.replace(" ", "");
750
608
  }
751
- isSuperSetOf(...items) {
752
- return this.length > items.length && toList(...items).isSubSetOf(...this);
609
+ get lower() {
610
+ return this.map((s) => s.toLowerCase());
753
611
  }
754
- isIntersectingWith(...items) {
755
- return this.intersect(items).length > 0;
612
+ get upper() {
613
+ return this.map((s) => s.toUpperCase());
756
614
  }
757
- isDisjointWith(...items) {
758
- return !this.isIntersectingWith(...items);
615
+ get camel() {
616
+ return this.title.trim.map((s) => `${s.charAt(0).toLowerCase()}${s.slice(1)}`);
759
617
  }
760
- areEqual(...items) {
761
- return this.isSubSetOf(...items) && toList(...items).isSubSetOf(...this);
618
+ get kebab() {
619
+ return this.lower.replace(" ", "-");
762
620
  }
763
- asc(p) {
764
- return toList(...this).sort((e1, e2) => ofProperty(e1, p) > ofProperty(e2, p) ? 1 : -1);
621
+ get strictKebab() {
622
+ return this.map((s) => s.replace(/[^a-z\d]+/gi, " ").trim()).kebab;
765
623
  }
766
- desc(p) {
767
- return toList(...this).sort((e1, e2) => ofProperty(e1, p) < ofProperty(e2, p) ? 1 : -1);
624
+ get slug() {
625
+ return this.map(
626
+ (s) => s.replace(/ß/g, "ss").normalize("NFKD").replace(/[\u0300-\u036F]/g, "").toLowerCase().replace(/[^a-z\d]+/g, "-").replace(/(^-)|(-$)/g, "")
627
+ );
768
628
  }
769
- first(p, params) {
770
- return p ? this.find(p, params) : this[0];
629
+ get snake() {
630
+ return this.upper.replace(" ", "_");
771
631
  }
772
- firstValue(f, alt) {
773
- return ifDefined(
774
- this.first((t) => !!f(t)),
775
- f,
776
- (v) => ofGet(alt, v)
632
+ get plural() {
633
+ return this.ifLike("") ?? this.add("s");
634
+ }
635
+ get space() {
636
+ return this.map((s) => s.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]/g, " "));
637
+ }
638
+ get sentence() {
639
+ return this.isEmpty ? this : this.map((s) => `${s.charAt(0).toUpperCase()}${s.slice(1)}.`);
640
+ }
641
+ get initials() {
642
+ return this.map(
643
+ (s) => s.split(" ").map((w) => w[0]).join("")
777
644
  );
778
645
  }
779
- isFirst(value) {
780
- return value === this.first();
646
+ get trim() {
647
+ return this.map((s) => s.replace(/[- ,_#]/g, ""));
781
648
  }
782
- next(p, params) {
783
- return p ? this[this.findIndex(p, params) + 1] : this[0];
649
+ get trimSentence() {
650
+ return this.map(
651
+ (s) => s.replace(/[\u200B-\u200D\uFEFF]/g, "").replace(/[\s\u00A0]+/g, " ").replace(/\s+([.,;:!?])/g, "$1").trim()
652
+ );
784
653
  }
785
- prev(p, params) {
786
- return p ? this[this.findIndex(p, params) - 1] : this[0];
654
+ get isEmpty() {
655
+ return isEmpty(this.toString());
787
656
  }
788
- last(p, params) {
789
- return p ? this.filter(p, params).last() : this[this.length - 1];
657
+ parse = (subject, options = {}) => text(template(this.subject, subject, { typeof: toName(subject), ...options }));
658
+ is = (...others) => others.some((o) => this.toString() === text(o).toString());
659
+ equals = this.is;
660
+ like = (...others) => others.some((o) => this.trim.lower.toString().includes(text(o).trim.lower.toString()));
661
+ isLike = (...others) => others.some((o) => this.trim.lower.is(text(o).trim.lower));
662
+ ifLike = (...others) => this.isLike(...others) ? this : void 0;
663
+ endsWith = (end) => this.subject.endsWith(asString(end));
664
+ startsWith = (end) => this.subject.startsWith(asString(end));
665
+ first = (n) => this.map((s) => s.substring(0, n));
666
+ last = (n) => this.map((s) => s.substring(s.length - n));
667
+ map = (func) => text(ofGet(func, this.subject));
668
+ replace = (search, replace) => this.map((s) => replaceAll(s, search, replace));
669
+ add = (add, separator = "") => this.map((s) => isNotEmpty(add) ? `${s}${separator}${text(add)}` : s);
670
+ with = (separator, ...other) => this.map(
671
+ (s) => toList(s).add(...other.map((u) => text(u).toString())).filter((s2) => isNotEmpty(s2)).join(separator)
672
+ );
673
+ split = (separator = " ") => toList(this.subject.split(separator));
674
+ toString() {
675
+ return this.subject;
790
676
  }
791
- isLast(value) {
792
- return value === this.last();
677
+ toJSON() {
678
+ return this.subject;
793
679
  }
794
- overlaps(...items) {
795
- return toList(...items).some((i) => this.some((t) => i === t));
680
+ };
681
+ function text(subject, alt = "") {
682
+ const sub = subject ? asString(subject) : alt;
683
+ return new ToText(sub !== "[object Object]" ? sub : "");
684
+ }
685
+ function textValue(subject, prop) {
686
+ const p = prop.split(".");
687
+ const root = subject?.[p[0]];
688
+ const initial = typeof root === "object" && root !== null ? root : text(root);
689
+ return p.splice(1).reduce((t, s) => (typeof t === "object" && t !== null ? t : text(t))?.[s], initial)?.toString() ?? "";
690
+ }
691
+
692
+ // src/types/Exception.ts
693
+ var Exception = class _Exception extends Enum {
694
+ constructor(message, id, reason) {
695
+ super(message, id ?? text(message).pascal.toString());
696
+ this.message = message;
697
+ this.reason = reason;
796
698
  }
797
- diff(others) {
798
- return this.filter((i) => !others.includes(i));
699
+ static AlreadyExists = new _Exception("Subject already exists");
700
+ static DoesNotExist = new _Exception("Does not exist");
701
+ static IsMissingId = new _Exception("Subject is missing an id");
702
+ static IsNotImplemented = new _Exception("Is not implemented");
703
+ static IsNotValid = new _Exception("Is not valid");
704
+ static Unknown = new _Exception("Unknown error");
705
+ static CouldNotExecute = (target) => new _Exception(`Could not execute ${target}.`, "CouldNotExecute");
706
+ static CouldNotValidate = (target) => new _Exception(`Could not validate ${target}.`, "CouldNotValidate");
707
+ static EnvironmentVariableNotFound = (variable) => new _Exception(`Environment variable ${text(variable).upper} could not be found.`, "EnvironmentVariableNotFound");
708
+ because = (reason) => new _Exception(this.message, this.id, reason);
709
+ };
710
+ var isException = (e, t) => e instanceof Exception && (isDefined(t) ? e.equals(asString(t)) : true);
711
+ var isDoesNotExist = (e) => e instanceof Exception && Exception.DoesNotExist.equals(e);
712
+
713
+ // src/validation/When.ts
714
+ var When = class _When {
715
+ constructor(subject, valid = true, results) {
716
+ this.subject = subject;
717
+ this.valid = valid;
718
+ this.results = results;
799
719
  }
800
- diffByKey(others, key) {
801
- return this.filter((i) => !others.some((o) => o[key] === i[key]));
720
+ get not() {
721
+ return this.clone(!this.valid);
802
722
  }
803
- symmetricDiff(others) {
804
- return this.diff(others).concat(toList(...others).diff(this));
723
+ get and() {
724
+ return this.clone(this.valid);
805
725
  }
806
- symmetricDiffByKey(others, key) {
807
- return this.diffByKey(others, key).concat(toList(...others).diffByKey(this, key));
726
+ get isDefined() {
727
+ return this.clone(this.valid === isDefined(this.subject));
808
728
  }
809
- intersect(others) {
810
- return this.filter((i) => others.includes(i));
729
+ get isEmpty() {
730
+ return this.clone(this.valid === isEmpty(this.subject));
811
731
  }
812
- intersectByKey(others, key) {
813
- return this.filter((i) => others.some((o) => o[key] === i[key]));
732
+ get isTrue() {
733
+ return this.clone(this.valid === !!this.subject);
814
734
  }
815
- intersectBy(others, f) {
816
- return this.filter((i) => others.some((o) => f(i, o)));
735
+ get isValid() {
736
+ this.results = validate(this.subject);
737
+ return this.clone(this.valid === this.results.isValid);
817
738
  }
818
- accumulate(...keys2) {
819
- return this.map((d, i, arr) => {
820
- const acc = keys2.reduce((acc2, v) => {
821
- acc2[v] = i === 0 ? d[v] : arr[i - 1][v] + d[v];
822
- return acc2;
823
- }, d);
824
- arr[i] = acc;
825
- return acc;
826
- });
739
+ isInstance = (c) => this.clone(this.valid === this.subject instanceof c);
740
+ with = (pred) => this.clone(this.valid === ofGet(pred, this.subject));
741
+ contains = (property) => this.clone(this.valid === isDefined(ofGet(property, this.subject)));
742
+ in = (...items) => this.clone(this.valid === isIn(this.subject, toArray(...items)));
743
+ is = (item) => this.clone(this.valid === (this.subject === item));
744
+ reject = (error) => !this.valid ? resolve(this.subject) : reject(ofGet(error, this.subject) ?? this.results ?? Exception.Unknown);
745
+ recover = (f) => resolve(!this.valid ? this.subject : f(this.subject));
746
+ clone = (result = true) => new _When(this.subject, result, this.results);
747
+ };
748
+ var when = (subject) => new When(subject);
749
+
750
+ // src/types/Context.ts
751
+ var DotEnvContext = class {
752
+ domain = process.env.DOMAIN ?? "easy";
753
+ name = process.env.ENVIRONMENT_NAME ?? "";
754
+ host = process.env.HOST ?? "";
755
+ port = Number.parseInt(process.env.PORT ?? "8080");
756
+ app = process.env.APP ?? "";
757
+ get = (key, alt) => {
758
+ const k = text(key).map((k2) => k2.replace(/([a-z])([A-Z])/g, "$1 $2")).snake.toString();
759
+ return process.env[k] ?? alt;
760
+ };
761
+ };
762
+ var BaseRequestContext = class {
763
+ state = {};
764
+ get token() {
765
+ return this.get("token");
827
766
  }
828
- toJSON() {
829
- return this.reduce((a, i) => {
830
- a.push(JSON.parse(JSON.stringify(i ?? {})));
831
- return a;
832
- }, new Array());
767
+ set token(token) {
768
+ this.set("token", token);
833
769
  }
834
- map(f, params) {
835
- return toList(super.map(f, params));
770
+ get identity() {
771
+ return this.token;
836
772
  }
837
- flatMap(f, params) {
838
- return toList(super.flatMap(f, params));
773
+ get jwt() {
774
+ return this.get("jwt");
839
775
  }
840
- mapDefined(f, params) {
841
- return this.map(f, params).defined();
776
+ set jwt(jwt) {
777
+ this.set("jwt", jwt);
842
778
  }
843
- mapAsync(f) {
844
- return Promise.all(super.map((e) => f(e))).then((a) => toList(a));
779
+ get correlationId() {
780
+ return this.get("correlationId");
845
781
  }
846
- mapSerial(f) {
847
- return super.reduce((p, item) => p.then((results) => on(results, async (r) => r.push(await f(item)))), Promise.resolve(toList()));
782
+ set correlationId(id) {
783
+ this.set("correlationId", id);
848
784
  }
849
- distinct() {
850
- return this.filter((i, index) => this.indexOf(i) === index);
785
+ get lastError() {
786
+ return this.get("lastError");
851
787
  }
852
- distinctByKey(key) {
853
- const seen = /* @__PURE__ */ new Set();
854
- return this.filter((item) => !seen.has(item[key]) && seen.add(item[key]));
788
+ set lastError(error) {
789
+ this.set("lastError", error);
790
+ }
791
+ get(key) {
792
+ return this.state[key];
793
+ }
794
+ set(key, value) {
795
+ return this.state[key] = value;
796
+ }
797
+ create = (f) => f();
798
+ wrap = (f) => f();
799
+ };
800
+ var BaseContext = class extends BaseRequestContext {
801
+ };
802
+ var Context = class {
803
+ constructor(state = {}) {
804
+ this.state = state;
805
+ this.state = {
806
+ ...{
807
+ env: new DotEnvContext(),
808
+ request: new BaseRequestContext(),
809
+ other: {}
810
+ },
811
+ ...this.state
812
+ };
855
813
  }
856
- distinctByValue() {
857
- const seen = /* @__PURE__ */ new Set();
858
- return this.filter((item) => !seen.has(JSON.stringify(item)) && seen.add(JSON.stringify(item)));
814
+ get env() {
815
+ return this.state.env;
859
816
  }
860
- filter(p, params) {
861
- return toList(super.filter(p, params));
817
+ set env(env) {
818
+ this.state.env = env;
862
819
  }
863
- sum(p) {
864
- return this.reduce((sum, i) => sum + p(i), 0);
820
+ get request() {
821
+ return this.state.request;
865
822
  }
866
- max(p) {
867
- return this.desc(p).first();
823
+ set request(request) {
824
+ this.state.request = request;
868
825
  }
869
- min(p) {
870
- return this.asc(p).first();
826
+ get other() {
827
+ return this.state.other;
871
828
  }
872
- byId(id) {
873
- return this.first((i) => equals(i.id, id));
829
+ };
830
+ var ctx = new Context();
831
+
832
+ // src/types/Result.ts
833
+ var toResult = (message, location, domain = ctx.env.domain) => ({
834
+ message: message.toString(),
835
+ location: location?.toString(),
836
+ domain: domain?.toString()
837
+ });
838
+ var isResult = (r) => isA(r, "message");
839
+
840
+ // src/types/Results.ts
841
+ var parse = (...rs) => toArray(...rs).map((r) => isResult(r) ? r : toResult(r));
842
+ var Results = class {
843
+ results;
844
+ constructor(...rs) {
845
+ this.results = parse(...rs);
874
846
  }
875
- byKey(key, value) {
876
- return this.first((i) => i[key] == value);
847
+ get length() {
848
+ return this.results.length;
877
849
  }
878
- add(...items) {
879
- super.push(...toArray(...items));
880
- return this;
850
+ get isValid() {
851
+ return this.results.length === 0;
881
852
  }
882
- concat(...items) {
883
- return toList(super.concat(...items));
853
+ add = (...rs) => toResults(...this.results, ...parse(...rs));
854
+ };
855
+ var toResults = (...r) => new Results(...r);
856
+ var isResults = (r) => isDefined(r) && r instanceof Results;
857
+
858
+ // src/validation/Validate.ts
859
+ var asResults = (subject, template2, options = {}) => toResults(toResult(text(template2).parse(subject, options), toName(subject)));
860
+ var validators = (subject) => meta(subject).keys("constraint").reduce((list, vs) => list.add(vs), toList());
861
+ var runValidator = (v, subject) => {
862
+ try {
863
+ const actual = isFunction(subject[v.property]) ? subject[v.property]() : subject[v.property];
864
+ const constraint = v.constraint(actual);
865
+ return isResults(constraint) ? constraint : !constraint ? asResults(subject, v.text, {
866
+ ...v,
867
+ actual
868
+ }) : toResults();
869
+ } catch (e) {
870
+ return asResults(subject, asString(e));
884
871
  }
885
- reverse() {
886
- return toList(super.reverse());
872
+ };
873
+ var constraints = (subject) => validators(subject).map((vs) => runValidator(vs, subject)).reduce((rs, r) => rs.add(...r.results), toResults());
874
+ var validate = (subject) => choose(subject).is.not.defined(
875
+ (s) => s,
876
+ () => toResults("Subject is not defined.")
877
+ ).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());
878
+ var validateReject = (subject) => when(subject).not.isValid.reject();
879
+ var isValid = (t) => validate(t).isValid;
880
+
881
+ // src/types/Try.ts
882
+ var Try = class _Try {
883
+ is = {
884
+ defined: (prop) => this.filter((v) => isDefined(prop ? prop(v) : v)),
885
+ empty: (prop) => this.filter((v) => isEmpty(prop ? prop(v) : v)),
886
+ valid: (prop) => this.filter((v) => validate(prop ? prop(v) : v).isValid),
887
+ true: (prop) => this.filter((v) => isTrue(prop ? prop(v) : v)),
888
+ false: (prop) => this.filter((v) => !isTrue(prop ? prop(v) : v)),
889
+ not: {
890
+ defined: (prop) => this.filter((v) => !isDefined(prop ? prop(v) : v)),
891
+ empty: (prop) => this.filter((v) => !isEmpty(prop ? prop(v) : v)),
892
+ valid: (prop) => this.filter((v) => !validate(prop ? prop(v) : v).isValid)
893
+ }
894
+ };
895
+ if = this.is;
896
+ static of = (c, ...args) => {
897
+ try {
898
+ const out = ofGet(c, ...args);
899
+ return new Success(out instanceof _Try ? out.value : out);
900
+ } catch (e) {
901
+ return new Failure(e);
902
+ }
903
+ };
904
+ };
905
+ var Success = class extends Try {
906
+ constructor(value) {
907
+ super();
908
+ this.value = value;
887
909
  }
888
- splice(start, deleteCount, ...items) {
889
- return toList(super.splice(start, deleteCount, ...items));
910
+ get error() {
911
+ throw new Error("No error found");
890
912
  }
891
- remove(item) {
892
- const index = this.indexOf(item);
893
- if (index > -1) {
894
- this.splice(index, 1);
895
- }
896
- return this;
913
+ get isValid() {
914
+ return true;
897
915
  }
898
- move(sourceId, destinationId) {
899
- return this.moveOn("id", sourceId, destinationId);
916
+ map(f) {
917
+ return tryTo(f, this.value);
900
918
  }
901
- moveOn(key, sourceId, destinationId) {
902
- const source = this.findIndex((i) => equals(i[key], sourceId));
903
- const dest = this.findIndex((i) => equals(i[key], destinationId));
904
- return on(toList(...this), (r) => r.splice(dest, 0, ...r.splice(source, 1)));
919
+ recover(f) {
920
+ return this;
905
921
  }
906
- replace(key, item) {
907
- const index = this.findIndex((i) => i[key] === item?.[key]);
908
- ifTrue(index != -1, () => this.splice(index, 1, item));
922
+ recoverFrom(type, f) {
909
923
  return this;
910
924
  }
911
- switch(item) {
912
- return this.includes(item) ? this.remove(item) : this.add(item);
925
+ accept(f) {
926
+ return tryTo(() => {
927
+ f(this.value);
928
+ return this;
929
+ });
913
930
  }
914
- switchOn(item, on2) {
915
- return use(
916
- typeof on2 === "function" ? this.find(on2) : use(traverse(item, on2), (v) => this.find((i) => traverse(i, on2) === v)),
917
- (i) => i ? this.remove(i) : this.add(item)
918
- );
931
+ filter(predicate) {
932
+ return tryTo(() => {
933
+ if (predicate(this.value))
934
+ return this;
935
+ throw new Error(`Applying filter(${predicate.toString()}) failed.`);
936
+ });
919
937
  }
920
- defined() {
921
- return this.reduce((l, v) => isDefined(v) ? l.add(v) : l, toList());
938
+ or(value) {
939
+ return this.value;
922
940
  }
923
- toObject(key, options = {}) {
924
- return this.reduce((o, i) => {
925
- o[i[key]] = i;
926
- if (options.deleteKey)
927
- delete o[i[key]][key];
928
- return o;
929
- }, {});
941
+ orElse(value) {
942
+ return this.value;
930
943
  }
931
- toObjectList(key) {
932
- return this.reduce(
933
- (a, t) => {
934
- const k = t[key];
935
- a[k] = a[k] ?? toList();
936
- a[k].push(t);
937
- return a;
938
- },
939
- {}
940
- );
944
+ orThrow(_error) {
945
+ return this.value;
941
946
  }
942
- orElse(...alt) {
943
- return !isEmpty(this) ? this : !isEmpty(...alt) ? toList(...alt) : void 0;
947
+ };
948
+ var Failure = class _Failure extends Try {
949
+ constructor(error) {
950
+ super();
951
+ this.error = error;
944
952
  }
945
- weave(insertFrom, interval) {
946
- for (let i = interval, n = 0; i <= this.length && n < insertFrom.length; i += interval + 1) {
947
- this.splice(i, 0, insertFrom[n++]);
948
- }
949
- return this;
953
+ get value() {
954
+ throw this.error;
950
955
  }
951
- slice(start, end) {
952
- return toList(super.slice(start, end));
956
+ get isValid() {
957
+ return false;
953
958
  }
954
- none(p) {
955
- return !this.some(p);
959
+ map(f) {
960
+ return new _Failure(this.error);
956
961
  }
957
- chunk(chunkSize) {
958
- return this.reduce((acc, _, index) => index % chunkSize === 0 ? on(acc, (a) => a.push(this.slice(index, index + chunkSize))) : acc, toList());
962
+ recover(f) {
963
+ return tryTo(f, this.error);
959
964
  }
960
- //we needed to add U because of a Typescript issue with generics
961
- update(p, val) {
962
- return this.map((v, i, a) => p(v, i, a) ? ofGet(val, v, i, a) : v);
965
+ recoverFrom(type, f) {
966
+ return tryTo(() => this.error instanceof type ? this.recover(f) : this);
963
967
  }
964
- updateFirst(p, val) {
965
- const index = this.findIndex(p);
966
- return this.update((t, i) => p(t, i, this) && i == index, val);
968
+ accept(f) {
969
+ return this;
967
970
  }
968
- updateFirstById(id, val) {
969
- return this.updateFirst((i) => equals(i?.id, id), val);
971
+ filter(predicate) {
972
+ return this;
970
973
  }
971
- updateById(id, val) {
972
- return this.update((i) => equals(i?.id, id), val);
974
+ or(value) {
975
+ return ofGet(value);
973
976
  }
974
- groupBy(by) {
975
- return toList(
976
- Array.from(this.reduce((m, v, i, a) => use(by(v, i, a), (key) => m.set(key, (m.get(key) ?? toList()).add(v))), /* @__PURE__ */ new Map()).values())
977
- );
977
+ orElse(value) {
978
+ return ofGet(value);
979
+ }
980
+ orThrow(error) {
981
+ throw ofConstruct(error);
978
982
  }
979
983
  };
980
- var toList = (...items) => new List8().add(...items);
981
- var isList = (l) => isDefined(l) && isArray(l) && isA(l, "first", "last", "asc", "desc");
982
- var asList = (c, items = []) => toList(toArray(items).map((i) => new c(i)));
983
- var maxValue = (l, key) => l.desc(key).first()?.[key];
984
- var minValue = (l, key) => l.asc(key).first()?.[key];
984
+ var tryTo = (c, ...args) => Try.of(c, ...args);
985
985
 
986
986
  export {
987
- List8 as List,
987
+ Try,
988
+ tryTo,
989
+ choose,
990
+ isEqual,
991
+ ifTrue,
992
+ ifFalse,
993
+ ifDefined,
994
+ ifNotEmpty,
995
+ ifEqual,
996
+ ifEither,
997
+ List,
988
998
  toList,
989
999
  isList,
990
1000
  asList,
@@ -1007,8 +1017,6 @@ export {
1007
1017
  isEnumConstructor,
1008
1018
  Enum,
1009
1019
  isEnum,
1010
- Try,
1011
- tryTo,
1012
1020
  Template,
1013
1021
  template,
1014
1022
  ToText,
@@ -1032,14 +1040,6 @@ export {
1032
1040
  asResults,
1033
1041
  validate,
1034
1042
  validateReject,
1035
- isValid,
1036
- choose,
1037
- isEqual,
1038
- ifTrue,
1039
- ifFalse,
1040
- ifDefined,
1041
- ifNotEmpty,
1042
- ifEqual,
1043
- ifEither
1043
+ isValid
1044
1044
  };
1045
- //# sourceMappingURL=chunk-AVHYDITZ.mjs.map
1045
+ //# sourceMappingURL=chunk-BS5KUNX2.mjs.map