effect-app 4.0.0-beta.32 → 4.0.0-beta.321

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 (369) hide show
  1. package/CHANGELOG.md +1570 -0
  2. package/dist/Array.d.ts +2 -1
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +4 -4
  5. package/dist/Chunk.d.ts.map +1 -1
  6. package/dist/Config/SecretURL.d.ts +3 -1
  7. package/dist/Config/SecretURL.d.ts.map +1 -1
  8. package/dist/Config/SecretURL.js +3 -6
  9. package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
  10. package/dist/Config/internal/configSecretURL.js +2 -2
  11. package/dist/Config.d.ts +2 -0
  12. package/dist/Config.d.ts.map +1 -0
  13. package/dist/Config.js +8 -0
  14. package/dist/ConfigProvider.d.ts +2 -0
  15. package/dist/ConfigProvider.d.ts.map +1 -0
  16. package/dist/ConfigProvider.js +6 -0
  17. package/dist/{ServiceMap.d.ts → Context.d.ts} +18 -20
  18. package/dist/Context.d.ts.map +1 -0
  19. package/dist/Context.js +67 -0
  20. package/dist/DataDependencies.d.ts +136 -0
  21. package/dist/DataDependencies.d.ts.map +1 -0
  22. package/dist/DataDependencies.js +112 -0
  23. package/dist/Effect.d.ts +10 -9
  24. package/dist/Effect.d.ts.map +1 -1
  25. package/dist/Effect.js +6 -9
  26. package/dist/Emailer.d.ts +51 -0
  27. package/dist/Emailer.d.ts.map +1 -0
  28. package/dist/Emailer.js +7 -0
  29. package/dist/Function.d.ts.map +1 -1
  30. package/dist/Layer.d.ts +10 -6
  31. package/dist/Layer.d.ts.map +1 -1
  32. package/dist/Layer.js +3 -2
  33. package/dist/Model/Repository/Registry.d.ts +22 -0
  34. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  35. package/dist/Model/Repository/Registry.js +18 -0
  36. package/dist/Model/Repository/dependency.d.ts +6 -0
  37. package/dist/Model/Repository/dependency.d.ts.map +1 -0
  38. package/dist/Model/Repository/dependency.js +29 -0
  39. package/dist/Model/Repository/ext.d.ts +60 -0
  40. package/dist/Model/Repository/ext.d.ts.map +1 -0
  41. package/dist/Model/Repository/ext.js +124 -0
  42. package/dist/Model/Repository/internal/internal.d.ts +68 -0
  43. package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
  44. package/dist/Model/Repository/internal/internal.js +579 -0
  45. package/dist/Model/Repository/legacy.d.ts +21 -0
  46. package/dist/Model/Repository/legacy.d.ts.map +1 -0
  47. package/dist/Model/Repository/legacy.js +2 -0
  48. package/dist/Model/Repository/makeRepo.d.ts +63 -0
  49. package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
  50. package/dist/Model/Repository/makeRepo.js +27 -0
  51. package/dist/Model/Repository/service.d.ts +121 -0
  52. package/dist/Model/Repository/service.d.ts.map +1 -0
  53. package/dist/Model/Repository/service.js +2 -0
  54. package/dist/Model/Repository/validation.d.ts +58 -0
  55. package/dist/Model/Repository/validation.d.ts.map +1 -0
  56. package/dist/Model/Repository/validation.js +32 -0
  57. package/dist/Model/Repository.d.ts +8 -0
  58. package/dist/Model/Repository.d.ts.map +1 -0
  59. package/dist/Model/Repository.js +8 -0
  60. package/dist/Model/dsl.d.ts +33 -0
  61. package/dist/Model/dsl.d.ts.map +1 -0
  62. package/dist/Model/dsl.js +43 -0
  63. package/dist/Model/filter/filterApi.d.ts +30 -0
  64. package/dist/Model/filter/filterApi.d.ts.map +1 -0
  65. package/dist/Model/filter/filterApi.js +2 -0
  66. package/dist/Model/filter/types/errors.d.ts +29 -0
  67. package/dist/Model/filter/types/errors.d.ts.map +1 -0
  68. package/dist/Model/filter/types/errors.js +2 -0
  69. package/dist/Model/filter/types/fields.d.ts +15 -0
  70. package/dist/Model/filter/types/fields.d.ts.map +1 -0
  71. package/dist/Model/filter/types/fields.js +2 -0
  72. package/dist/Model/filter/types/path/common.d.ts +316 -0
  73. package/dist/Model/filter/types/path/common.d.ts.map +1 -0
  74. package/dist/Model/filter/types/path/common.js +2 -0
  75. package/dist/Model/filter/types/path/eager.d.ts +94 -0
  76. package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
  77. package/dist/Model/filter/types/path/eager.js +36 -0
  78. package/dist/Model/filter/types/path/index.d.ts +4 -0
  79. package/dist/Model/filter/types/path/index.d.ts.map +1 -0
  80. package/dist/Model/filter/types/path/index.js +3 -0
  81. package/dist/Model/filter/types/utils.d.ts +79 -0
  82. package/dist/Model/filter/types/utils.d.ts.map +1 -0
  83. package/dist/Model/filter/types/utils.js +2 -0
  84. package/dist/Model/filter/types/validator.d.ts +30 -0
  85. package/dist/Model/filter/types/validator.d.ts.map +1 -0
  86. package/dist/Model/filter/types/validator.js +2 -0
  87. package/dist/Model/filter/types.d.ts +5 -0
  88. package/dist/Model/filter/types.d.ts.map +1 -0
  89. package/dist/Model/filter/types.js +7 -0
  90. package/dist/Model/query/dsl.d.ts +630 -0
  91. package/dist/Model/query/dsl.d.ts.map +1 -0
  92. package/dist/Model/query/dsl.js +376 -0
  93. package/dist/Model/query/new-kid-interpreter.d.ts +132 -0
  94. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
  95. package/dist/Model/query/new-kid-interpreter.js +370 -0
  96. package/dist/Model/query.d.ts +15 -0
  97. package/dist/Model/query.d.ts.map +1 -0
  98. package/dist/Model/query.js +3 -0
  99. package/dist/Model.d.ts +6 -0
  100. package/dist/Model.d.ts.map +1 -0
  101. package/dist/Model.js +6 -0
  102. package/dist/NonEmptySet.d.ts +3 -1
  103. package/dist/NonEmptySet.d.ts.map +1 -1
  104. package/dist/NonEmptySet.js +2 -2
  105. package/dist/Option.d.ts +1 -0
  106. package/dist/Option.d.ts.map +1 -1
  107. package/dist/Option.js +3 -1
  108. package/dist/Pure.d.ts +7 -5
  109. package/dist/Pure.d.ts.map +1 -1
  110. package/dist/Pure.js +7 -4
  111. package/dist/QueueMaker.d.ts +11 -0
  112. package/dist/QueueMaker.d.ts.map +1 -0
  113. package/dist/QueueMaker.js +11 -0
  114. package/dist/RequestContext.d.ts +87 -0
  115. package/dist/RequestContext.d.ts.map +1 -0
  116. package/dist/RequestContext.js +45 -0
  117. package/dist/RequestScopedDependencies.d.ts +21 -0
  118. package/dist/RequestScopedDependencies.d.ts.map +1 -0
  119. package/dist/RequestScopedDependencies.js +16 -0
  120. package/dist/Schema/Class.d.ts +200 -20
  121. package/dist/Schema/Class.d.ts.map +1 -1
  122. package/dist/Schema/Class.js +268 -17
  123. package/dist/Schema/FastCheck.d.ts.map +1 -1
  124. package/dist/Schema/SchemaParser.d.ts +5 -0
  125. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  126. package/dist/Schema/SchemaParser.js +6 -0
  127. package/dist/Schema/SpecialJsonSchema.d.ts +34 -0
  128. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
  129. package/dist/Schema/SpecialJsonSchema.js +117 -0
  130. package/dist/Schema/SpecialOpenApi.d.ts +32 -0
  131. package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
  132. package/dist/Schema/SpecialOpenApi.js +123 -0
  133. package/dist/Schema/brand.d.ts +5 -5
  134. package/dist/Schema/brand.d.ts.map +1 -1
  135. package/dist/Schema/brand.js +3 -1
  136. package/dist/Schema/email.d.ts.map +1 -1
  137. package/dist/Schema/email.js +7 -6
  138. package/dist/Schema/ext.d.ts +337 -56
  139. package/dist/Schema/ext.d.ts.map +1 -1
  140. package/dist/Schema/ext.js +381 -58
  141. package/dist/Schema/moreStrings.d.ts +82 -36
  142. package/dist/Schema/moreStrings.d.ts.map +1 -1
  143. package/dist/Schema/moreStrings.js +47 -51
  144. package/dist/Schema/numbers.d.ts +34 -21
  145. package/dist/Schema/numbers.d.ts.map +1 -1
  146. package/dist/Schema/numbers.js +55 -12
  147. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  148. package/dist/Schema/phoneNumber.js +6 -6
  149. package/dist/Schema/schema.d.ts +1 -1
  150. package/dist/Schema/schema.d.ts.map +1 -1
  151. package/dist/Schema/schema.js +2 -2
  152. package/dist/Schema/strings.d.ts +18 -4
  153. package/dist/Schema/strings.d.ts.map +1 -1
  154. package/dist/Schema/strings.js +1 -5
  155. package/dist/Schema.d.ts +225 -7
  156. package/dist/Schema.d.ts.map +1 -1
  157. package/dist/Schema.js +193 -26
  158. package/dist/SchemaAST.d.ts +2 -0
  159. package/dist/SchemaAST.d.ts.map +1 -0
  160. package/dist/SchemaAST.js +2 -0
  161. package/dist/Set.d.ts +4 -1
  162. package/dist/Set.d.ts.map +1 -1
  163. package/dist/Set.js +3 -2
  164. package/dist/Store.d.ts +170 -0
  165. package/dist/Store.d.ts.map +1 -0
  166. package/dist/Store.js +113 -0
  167. package/dist/_ext/Array.d.ts +1 -1
  168. package/dist/_ext/Array.d.ts.map +1 -1
  169. package/dist/_ext/Array.js +4 -2
  170. package/dist/_ext/misc.d.ts +4 -1
  171. package/dist/_ext/misc.d.ts.map +1 -1
  172. package/dist/_ext/misc.js +4 -2
  173. package/dist/_ext/ord.ext.d.ts +2 -1
  174. package/dist/_ext/ord.ext.d.ts.map +1 -1
  175. package/dist/_ext/ord.ext.js +2 -2
  176. package/dist/builtin.d.ts +2 -14
  177. package/dist/builtin.d.ts.map +1 -1
  178. package/dist/builtin.js +1 -1
  179. package/dist/client/InvalidationKeys.d.ts +30 -0
  180. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  181. package/dist/client/InvalidationKeys.js +37 -0
  182. package/dist/client/apiClientFactory.d.ts +19 -31
  183. package/dist/client/apiClientFactory.d.ts.map +1 -1
  184. package/dist/client/apiClientFactory.js +157 -39
  185. package/dist/client/clientFor.d.ts +54 -18
  186. package/dist/client/clientFor.d.ts.map +1 -1
  187. package/dist/client/clientFor.js +9 -1
  188. package/dist/client/errors.d.ts +82 -27
  189. package/dist/client/errors.d.ts.map +1 -1
  190. package/dist/client/errors.js +75 -19
  191. package/dist/client/makeClient.d.ts +490 -34
  192. package/dist/client/makeClient.d.ts.map +1 -1
  193. package/dist/client/makeClient.js +62 -30
  194. package/dist/client.d.ts +2 -0
  195. package/dist/client.d.ts.map +1 -1
  196. package/dist/client.js +3 -1
  197. package/dist/faker.d.ts.map +1 -1
  198. package/dist/http/Request.d.ts +1 -1
  199. package/dist/http/Request.d.ts.map +1 -1
  200. package/dist/http/Request.js +2 -2
  201. package/dist/ids.d.ts +42 -14
  202. package/dist/ids.d.ts.map +1 -1
  203. package/dist/ids.js +30 -5
  204. package/dist/index.d.ts +6 -7
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +8 -8
  207. package/dist/middleware.d.ts +13 -7
  208. package/dist/middleware.d.ts.map +1 -1
  209. package/dist/middleware.js +14 -8
  210. package/dist/rpc/Invalidation.d.ts +1124 -0
  211. package/dist/rpc/Invalidation.d.ts.map +1 -0
  212. package/dist/rpc/Invalidation.js +178 -0
  213. package/dist/rpc/MiddlewareMaker.d.ts +11 -7
  214. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  215. package/dist/rpc/MiddlewareMaker.js +59 -38
  216. package/dist/rpc/RpcContextMap.d.ts +3 -3
  217. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  218. package/dist/rpc/RpcContextMap.js +4 -4
  219. package/dist/rpc/RpcMiddleware.d.ts +14 -10
  220. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  221. package/dist/rpc/RpcMiddleware.js +1 -1
  222. package/dist/rpc.d.ts +1 -1
  223. package/dist/rpc.d.ts.map +1 -1
  224. package/dist/rpc.js +2 -2
  225. package/dist/runtime.d.ts +19 -0
  226. package/dist/runtime.d.ts.map +1 -0
  227. package/dist/runtime.js +40 -0
  228. package/dist/setupRequest.d.ts +20 -0
  229. package/dist/setupRequest.d.ts.map +1 -0
  230. package/dist/setupRequest.js +72 -0
  231. package/dist/toast.d.ts +51 -0
  232. package/dist/toast.d.ts.map +1 -0
  233. package/dist/toast.js +34 -0
  234. package/dist/transform.d.ts +1 -1
  235. package/dist/transform.d.ts.map +1 -1
  236. package/dist/transform.js +4 -5
  237. package/dist/utils/effectify.d.ts +1 -1
  238. package/dist/utils/effectify.d.ts.map +1 -1
  239. package/dist/utils/effectify.js +2 -2
  240. package/dist/utils/extend.d.ts.map +1 -1
  241. package/dist/utils/gen.d.ts +4 -4
  242. package/dist/utils/gen.d.ts.map +1 -1
  243. package/dist/utils/logLevel.d.ts +2 -2
  244. package/dist/utils/logLevel.d.ts.map +1 -1
  245. package/dist/utils/logger.d.ts +4 -3
  246. package/dist/utils/logger.d.ts.map +1 -1
  247. package/dist/utils/logger.js +4 -4
  248. package/dist/utils.d.ts +34 -39
  249. package/dist/utils.d.ts.map +1 -1
  250. package/dist/utils.js +33 -37
  251. package/dist/validation/validators.d.ts.map +1 -1
  252. package/dist/validation.d.ts.map +1 -1
  253. package/dist/withToast.d.ts +30 -0
  254. package/dist/withToast.d.ts.map +1 -0
  255. package/dist/withToast.js +64 -0
  256. package/package.json +27 -251
  257. package/src/Array.ts +5 -5
  258. package/src/Chunk.ts +3 -3
  259. package/src/Config/SecretURL.ts +6 -3
  260. package/src/Config/internal/configSecretURL.ts +2 -2
  261. package/src/Config.ts +7 -0
  262. package/src/ConfigProvider.ts +5 -0
  263. package/src/{ServiceMap.ts → Context.ts} +56 -63
  264. package/src/DataDependencies.ts +171 -0
  265. package/src/Effect.ts +15 -17
  266. package/src/Emailer.ts +51 -0
  267. package/src/Inputify.type.ts +1 -1
  268. package/src/Layer.ts +11 -7
  269. package/src/Model/Repository/Registry.ts +35 -0
  270. package/src/Model/Repository/dependency.ts +32 -0
  271. package/src/Model/Repository/ext.ts +374 -0
  272. package/src/Model/Repository/internal/internal.ts +950 -0
  273. package/src/Model/Repository/legacy.ts +29 -0
  274. package/src/Model/Repository/makeRepo.ts +156 -0
  275. package/src/Model/Repository/service.ts +676 -0
  276. package/src/Model/Repository/validation.ts +31 -0
  277. package/src/Model/Repository.ts +7 -0
  278. package/src/Model/dsl.ts +129 -0
  279. package/src/Model/filter/filterApi.ts +78 -0
  280. package/src/Model/filter/types/errors.ts +47 -0
  281. package/src/Model/filter/types/fields.ts +50 -0
  282. package/src/Model/filter/types/path/common.ts +404 -0
  283. package/src/Model/filter/types/path/eager.ts +329 -0
  284. package/src/Model/filter/types/path/index.ts +4 -0
  285. package/src/Model/filter/types/utils.ts +128 -0
  286. package/src/Model/filter/types/validator.ts +46 -0
  287. package/src/Model/filter/types.ts +6 -0
  288. package/src/Model/query/dsl.ts +3092 -0
  289. package/src/Model/query/new-kid-interpreter.ts +532 -0
  290. package/src/Model/query.ts +13 -0
  291. package/src/Model.ts +5 -0
  292. package/src/NonEmptySet.ts +6 -4
  293. package/src/Option.ts +2 -0
  294. package/src/Pure.ts +10 -7
  295. package/src/QueueMaker.ts +11 -0
  296. package/src/RequestContext.ts +48 -0
  297. package/src/RequestScopedDependencies.ts +45 -0
  298. package/src/Schema/Class.ts +648 -60
  299. package/src/Schema/SchemaParser.ts +12 -0
  300. package/src/Schema/SpecialJsonSchema.ts +137 -0
  301. package/src/Schema/SpecialOpenApi.ts +130 -0
  302. package/src/Schema/brand.ts +24 -9
  303. package/src/Schema/email.ts +9 -7
  304. package/src/Schema/ext.ts +502 -98
  305. package/src/Schema/moreStrings.ts +145 -83
  306. package/src/Schema/numbers.ts +97 -28
  307. package/src/Schema/phoneNumber.ts +8 -8
  308. package/src/Schema/schema.ts +1 -1
  309. package/src/Schema/strings.ts +23 -14
  310. package/src/Schema.ts +403 -46
  311. package/src/SchemaAST.ts +1 -0
  312. package/src/Set.ts +6 -2
  313. package/src/Store.ts +280 -0
  314. package/src/_ext/Array.ts +4 -2
  315. package/src/_ext/misc.ts +4 -1
  316. package/src/_ext/ord.ext.ts +2 -1
  317. package/src/builtin-json.d.ts +24 -0
  318. package/src/builtin.ts +16 -21
  319. package/src/client/InvalidationKeys.ts +55 -0
  320. package/src/client/apiClientFactory.ts +301 -141
  321. package/src/client/clientFor.ts +107 -34
  322. package/src/client/errors.ts +100 -29
  323. package/src/client/makeClient.ts +594 -80
  324. package/src/client.ts +6 -4
  325. package/src/http/Request.ts +3 -3
  326. package/src/http.ts +1 -1
  327. package/src/ids.ts +33 -6
  328. package/src/index.ts +20 -23
  329. package/src/middleware.ts +13 -9
  330. package/src/rpc/Invalidation.ts +278 -0
  331. package/src/rpc/MiddlewareMaker.ts +88 -80
  332. package/src/rpc/README.md +2 -2
  333. package/src/rpc/RpcContextMap.ts +7 -6
  334. package/src/rpc/RpcMiddleware.ts +19 -13
  335. package/src/rpc.ts +4 -4
  336. package/src/runtime.ts +57 -0
  337. package/src/setupRequest.ts +138 -0
  338. package/src/toast.ts +54 -0
  339. package/src/transform.ts +4 -4
  340. package/src/utils/effectify.ts +1 -1
  341. package/src/utils/gen.ts +8 -8
  342. package/src/utils/logLevel.ts +1 -1
  343. package/src/utils/logger.ts +4 -3
  344. package/src/utils.ts +85 -158
  345. package/src/validation.ts +2 -2
  346. package/src/withToast.ts +133 -0
  347. package/test/dist/rpc.test.d.ts.map +1 -1
  348. package/test/dist/rpcMiddlewareContext.test.d.ts.map +1 -0
  349. package/test/dist/secretURL.test.d.ts.map +1 -0
  350. package/test/dist/special.test.d.ts.map +1 -0
  351. package/test/moreStrings.test.ts +7 -9
  352. package/test/rpc.test.ts +42 -14
  353. package/test/rpcMiddlewareContext.test.ts +63 -0
  354. package/test/schema.test.ts +514 -35
  355. package/test/secretURL.test.ts +160 -0
  356. package/test/special.test.ts +1261 -0
  357. package/test/utils.test.ts +7 -7
  358. package/tsconfig.base.json +6 -5
  359. package/tsconfig.json +9 -2
  360. package/tsconfig.src.json +29 -29
  361. package/tsconfig.test.json +2 -2
  362. package/dist/Operations.d.ts +0 -123
  363. package/dist/Operations.d.ts.map +0 -1
  364. package/dist/Operations.js +0 -29
  365. package/dist/ServiceMap.d.ts.map +0 -1
  366. package/dist/ServiceMap.js +0 -91
  367. package/eslint.config.mjs +0 -26
  368. package/src/Operations.ts +0 -55
  369. package/tsconfig.json.bak +0 -12
@@ -0,0 +1,404 @@
1
+ import type { IsAny, IsNever } from "../utils.ts"
2
+
3
+ /**
4
+ * Type alias to `string` which describes a lodash-like path through an object.
5
+ * E.g. `'foo.bar.0.baz'`
6
+ */
7
+ export type PathString = string
8
+
9
+ /**
10
+ * Type which can be traversed through with a {@link PathString}.
11
+ * I.e. objects, arrays, and tuples
12
+ */
13
+ export type Traversable = object
14
+
15
+ /**
16
+ * Type to query whether an array type T is a tuple type.
17
+ * @typeParam T - type which may be an array or tuple
18
+ * @example
19
+ * ```
20
+ * IsTuple<[number]> = true
21
+ * IsTuple<number[]> = false
22
+ * ```
23
+ */
24
+ export type IsTuple<T extends ReadonlyArray<any>> = number extends T["length"] ? false
25
+ : true
26
+
27
+ /**
28
+ * Type which can be used to index an array or tuple type.
29
+ */
30
+ export type ArrayKey = number
31
+
32
+ /**
33
+ * Type which can be used to index an object.
34
+ */
35
+ export type Key = string
36
+
37
+ /**
38
+ * Type to assert that a type is a {@link Key}.
39
+ * @typeParam T - type which may be a {@link Key}
40
+ */
41
+ export type AsKey<T> = Extract<T, Key>
42
+
43
+ /**
44
+ * Type to convert a type to a {@link Key}.
45
+ * @typeParam T - type which may be converted to a {@link Key}
46
+ */
47
+ export type ToKey<T> = T extends ArrayKey ? `${T}` : AsKey<T>
48
+
49
+ /**
50
+ * Type which describes a path through an object
51
+ * as a list of individual {@link Key}s.
52
+ */
53
+ export type PathTuple = Key[]
54
+
55
+ /**
56
+ * Type to assert that a type is a {@link PathTuple}.
57
+ * @typeParam T - type which may be a {@link PathTuple}
58
+ */
59
+ export type AsPathTuple<T> = Extract<T, PathTuple>
60
+
61
+ /**
62
+ * Type to intersect a union type.
63
+ * See https://fettblog.eu/typescript-union-to-intersection/
64
+ * @typeParam U - union
65
+ * @example
66
+ * ```
67
+ * UnionToIntersection<{ foo: string } | { bar: number }>
68
+ * = { foo: string; bar: number }
69
+ * ```
70
+ */
71
+ export type UnionToIntersection<U> = (
72
+ U extends any ? (_: U) => any : never
73
+ ) extends (_: infer I) => any ? I
74
+ : never
75
+
76
+ /**
77
+ * Type which appends a {@link Key} to the {@link PathTuple} only if it is not
78
+ * blank, i.e. not the empty string.
79
+ * @typeParam PT - path
80
+ * @typeParam K - key
81
+ * @example
82
+ * ```
83
+ * AppendNonBlankKey<['foo'], 'bar'> = ['foo', 'bar']
84
+ * AppendNonBlankKey<['foo'], ''> = ['foo']
85
+ * ```
86
+ */
87
+ type AppendNonBlankKey<PT extends PathTuple, K extends Key> = K extends "" ? PT
88
+ : [...PT, K]
89
+
90
+ /**
91
+ * Type to implement {@link SplitPathString} tail recursively.
92
+ * @typeParam PS - remaining {@link PathString} which should be split into its
93
+ * individual {@link Key}s
94
+ * @typeParam PT - accumulator of the {@link Key}s which have been split from
95
+ * the original {@link PathString} already
96
+ */
97
+ type SplitPathStringImpl<
98
+ PS extends PathString,
99
+ PT extends PathTuple
100
+ > = PS extends `${infer K}.${infer R}` ? SplitPathStringImpl<R, AppendNonBlankKey<PT, K>>
101
+ : AppendNonBlankKey<PT, PS>
102
+
103
+ /**
104
+ * Type to split a {@link PathString} into a {@link PathTuple}.
105
+ * The individual {@link Key}s may be empty strings.
106
+ * @typeParam PS - {@link PathString} which should be split into its
107
+ * individual {@link Key}s
108
+ * @example
109
+ * ```
110
+ * SplitPathString<'foo'> = ['foo']
111
+ * SplitPathString<'foo.bar.0.baz'> = ['foo', 'bar', '0', 'baz']
112
+ * SplitPathString<'.'> = []
113
+ * ```
114
+ */
115
+ export type SplitPathString<PS extends PathString> = SplitPathStringImpl<
116
+ PS,
117
+ []
118
+ >
119
+
120
+ /**
121
+ * Type to implement {@link JoinPathTuple} tail-recursively.
122
+ * @typeParam PT - remaining {@link Key}s which needs to be joined
123
+ * @typeParam PS - accumulator of the already joined {@link Key}s
124
+ */
125
+ type JoinPathTupleImpl<
126
+ PT extends PathTuple,
127
+ PS extends PathString
128
+ > = PT extends [infer K, ...infer R] ? JoinPathTupleImpl<AsPathTuple<R>, `${PS}.${AsKey<K>}`>
129
+ : PS
130
+
131
+ /**
132
+ * Type to join a {@link PathTuple} to a {@link PathString}.
133
+ * @typeParam PT - {@link PathTuple} which should be joined.
134
+ * @example
135
+ * ```
136
+ * JoinPathTuple<['foo']> = 'foo'
137
+ * JoinPathTuple<['foo', 'bar', '0', 'baz']> = 'foo.bar.0.baz'
138
+ * JoinPathTuple<[]> = never
139
+ * ```
140
+ */
141
+ export type JoinPathTuple<PT extends PathTuple> = PT extends [
142
+ infer K,
143
+ ...infer R
144
+ ] ? JoinPathTupleImpl<AsPathTuple<R>, AsKey<K>>
145
+ : never
146
+
147
+ /**
148
+ * Type which converts all keys of an object to {@link Key}s.
149
+ * @typeParam T - object type
150
+ * @example
151
+ * ```
152
+ * MapKeys<{0: string}> = {'0': string}
153
+ * ```
154
+ */
155
+ type MapKeys<T> = { [K in keyof T as ToKey<K>]: T[K] }
156
+
157
+ /**
158
+ * Type to access a type by a key.
159
+ * - Returns undefined if it can't be indexed by that key.
160
+ * - Returns null if the type is null.
161
+ * - Returns undefined if the type is not traversable.
162
+ * @typeParam T - type which is indexed by the key
163
+ * @typeParam K - key into the type
164
+ * ```
165
+ * TryAccess<{foo: string}, 'foo'> = string
166
+ * TryAccess<{foo: string}, 'bar'> = undefined
167
+ * TryAccess<null, 'foo'> = null
168
+ * TryAccess<string, 'foo'> = undefined
169
+ * ```
170
+ */
171
+ type TryAccess<T, K> = K extends keyof T ? T[K]
172
+ : T extends null ? null
173
+ : undefined
174
+
175
+ /**
176
+ * Type to access an array type by a key.
177
+ * Returns undefined if the key is non-numeric.
178
+ * @typeParam T - type which is indexed by the key
179
+ * @typeParam K - key into the type
180
+ * ```
181
+ * TryAccessArray<string[], '0'> = string
182
+ * TryAccessArray<string[], 'foo'> = undefined
183
+ * ```
184
+ */
185
+ type TryAccessArray<
186
+ T extends ReadonlyArray<any>,
187
+ K extends Key
188
+ > = K extends `${ArrayKey}` ? T[number] : TryAccess<T, K>
189
+
190
+ /**
191
+ * Type to evaluate the type which the given key points to.
192
+ * @typeParam T - type which is indexed by the key
193
+ * @typeParam K - key into the type
194
+ * @example
195
+ * ```
196
+ * EvaluateKey<{foo: string}, 'foo'> = string
197
+ * EvaluateKey<[number, string], '1'> = string
198
+ * EvaluateKey<string[], '1'> = string
199
+ * ```
200
+ */
201
+ export type EvaluateKey<T, K extends Key> = T extends ReadonlyArray<any> ? IsTuple<T> extends true ? TryAccess<T, K>
202
+ : TryAccessArray<T, K>
203
+ : TryAccess<MapKeys<T>, K>
204
+
205
+ /**
206
+ * Type to evaluate the type which the given path points to.
207
+ * @typeParam T - deeply nested type which is indexed by the path
208
+ * @typeParam PT - path into the deeply nested type
209
+ * @example
210
+ * ```
211
+ * EvaluatePath<{foo: {bar: string}}, ['foo', 'bar']> = string
212
+ * EvaluatePath<[number, string], ['1']> = string
213
+ * EvaluatePath<number, []> = number
214
+ * EvaluatePath<number, ['foo']> = undefined
215
+ * ```
216
+ */
217
+ export type EvaluatePath<T, PT extends PathTuple> = PT extends [
218
+ infer K,
219
+ ...infer R
220
+ ] ? EvaluatePath<EvaluateKey<T, AsKey<K>>, AsPathTuple<R>>
221
+ : T
222
+
223
+ /**
224
+ * Type which given a tuple type returns its own keys, i.e. only its indices.
225
+ * @typeParam T - tuple type
226
+ * @example
227
+ * ```
228
+ * TupleKeys<[number, string]> = '0' | '1'
229
+ * ```
230
+ */
231
+ export type TupleKeys<T extends ReadonlyArray<any>> = Exclude<
232
+ keyof T,
233
+ keyof any[]
234
+ >
235
+
236
+ /**
237
+ * Type which extracts all numeric keys from an object.
238
+ * @typeParam T - type
239
+ * @example
240
+ * ```
241
+ * NumericObjectKeys<{0: string, '1': string, foo: string}> = '0' | '1'
242
+ * ```
243
+ */
244
+ type NumericObjectKeys<T extends Traversable> = ToKey<
245
+ Extract<keyof T, ArrayKey | `${ArrayKey}`>
246
+ >
247
+
248
+ /**
249
+ * Type which extracts all numeric keys from an object, tuple, or array.
250
+ * If a union is passed, it evaluates to the overlapping numeric keys.
251
+ * @typeParam T - type
252
+ * @example
253
+ * ```
254
+ * NumericKeys<{0: string, '1': string, foo: string}> = '0' | '1'
255
+ * NumericKeys<number[]> = `${number}`
256
+ * NumericKeys<[string, number]> = '0' | '1'
257
+ * NumericKeys<{0: string, '1': string} | [number] | number[]> = '0'
258
+ * ```
259
+ */
260
+ export type NumericKeys<T extends Traversable> = UnionToIntersection<
261
+ T extends ReadonlyArray<any> ? IsTuple<T> extends true ? [TupleKeys<T>]
262
+ : [ToKey<ArrayKey>]
263
+ : [NumericObjectKeys<T>]
264
+ >[never]
265
+
266
+ /**
267
+ * Type which extracts all keys from an object.
268
+ * If a union is passed, it evaluates to the overlapping keys.
269
+ * @typeParam T - object type
270
+ * @example
271
+ * ```
272
+ * ObjectKeys<{foo: string, bar: string}, string> = 'foo' | 'bar'
273
+ * ObjectKeys<{foo: string, bar: number}, string> = 'foo'
274
+ * ```
275
+ */
276
+ export type ObjectKeys<T extends Traversable> = Exclude<
277
+ ToKey<keyof T>,
278
+ `${string}.${string}` | ""
279
+ >
280
+
281
+ /**
282
+ * Type to check whether a type's property matches the constraint type
283
+ * and return its key. Converts the key to a {@link Key}.
284
+ * @typeParam T - type whose property should be checked
285
+ * @typeParam K - key of the property
286
+ * @typeParam U - constraint type
287
+ * @example
288
+ * ```
289
+ * CheckKeyConstraint<{foo: string}, 'foo', string> = 'foo'
290
+ * CheckKeyConstraint<{foo: string}, 'foo', number> = never
291
+ * CheckKeyConstraint<string[], number, string> = `${number}`
292
+ * ```
293
+ */
294
+ export type CheckKeyConstraint<T, K extends Key, U> = K extends any ? EvaluateKey<T, K> extends U ? K
295
+ : never
296
+ : never
297
+
298
+ /**
299
+ * Type which evaluates to true when the type is an array or tuple or is a union
300
+ * which contains an array or tuple.
301
+ * @typeParam T - type
302
+ * @example
303
+ * ```
304
+ * ContainsIndexable<{foo: string}> = false
305
+ * ContainsIndexable<{foo: string} | number[]> = true
306
+ * ```
307
+ */
308
+ export type ContainsIndexable<T> = IsNever<
309
+ Extract<T, ReadonlyArray<any>>
310
+ > extends true ? false
311
+ : true
312
+
313
+ /**
314
+ * Type to implement {@link Keys} for non-nullable values.
315
+ * @typeParam T - non-nullable type whose property should be checked
316
+ */
317
+ type KeysImpl<T> = [T] extends [Traversable] ? ContainsIndexable<T> extends true ? NumericKeys<T>
318
+ : ObjectKeys<T>
319
+ : never
320
+
321
+ /**
322
+ * Type to find all properties of a type that match the constraint type
323
+ * and return their keys.
324
+ * If a union is passed, it evaluates to the overlapping keys.
325
+ * @typeParam T - type whose property should be checked
326
+ * @typeParam U - constraint type
327
+ * @example
328
+ * ```
329
+ * Keys<{foo: string, bar: string}, string> = 'foo' | 'bar'
330
+ * Keys<{foo?: string, bar?: string}> = 'foo' | 'bar'
331
+ * Keys<{foo: string, bar: number}, string> = 'foo'
332
+ * Keys<[string, number], string> = '0'
333
+ * Keys<string[], string> = `${number}`
334
+ * Keys<{0: string, '1': string} | [number] | number[]> = '0'
335
+ * ```
336
+ */
337
+ export type Keys<T, U = unknown> = IsAny<T> extends true ? Key
338
+ : IsNever<T> extends true ? Key
339
+ : IsNever<NonNullable<T>> extends true ? never
340
+ : CheckKeyConstraint<T, KeysImpl<NonNullable<T>>, U>
341
+
342
+ /**
343
+ * Type to check whether a {@link Key} is present in a type.
344
+ * If a union of {@link Key}s is passed, all {@link Key}s have to be present
345
+ * in the type.
346
+ * @typeParam T - type which is introspected
347
+ * @typeParam K - key
348
+ * @example
349
+ * ```
350
+ * HasKey<{foo: string}, 'foo'> = true
351
+ * HasKey<{foo: string}, 'bar'> = false
352
+ * HasKey<{foo: string}, 'foo' | 'bar'> = false
353
+ * ```
354
+ */
355
+ export type HasKey<T, K extends Key> = IsNever<Exclude<K, Keys<T>>>
356
+
357
+ /**
358
+ * Type to implement {@link ValidPathPrefix} tail recursively.
359
+ * @typeParam T - type which the path should be checked against
360
+ * @typeParam PT - path which should exist within the given type
361
+ * @typeParam VPT - accumulates the prefix of {@link Key}s which have been
362
+ * confirmed to exist already
363
+ */
364
+ type ValidPathPrefixImpl<
365
+ T,
366
+ PT extends PathTuple,
367
+ VPT extends PathTuple
368
+ > = PT extends [infer K, ...infer R] ? HasKey<T, AsKey<K>> extends true ? ValidPathPrefixImpl<
369
+ EvaluateKey<T, AsKey<K>>,
370
+ AsPathTuple<R>,
371
+ AsPathTuple<[...VPT, K]>
372
+ >
373
+ : VPT
374
+ : VPT
375
+
376
+ /**
377
+ * Type to find the longest path prefix which is still valid,
378
+ * i.e. exists within the given type.
379
+ * @typeParam T - type which the path should be checked against
380
+ * @typeParam PT - path which should exist within the given type
381
+ * @example
382
+ * ```
383
+ * ValidPathPrefix<{foo: {bar: string}}, ['foo', 'bar']> = ['foo', 'bar']
384
+ * ValidPathPrefix<{foo: {bar: string}}, ['foo', 'ba']> = ['foo']
385
+ * ```
386
+ */
387
+ export type ValidPathPrefix<T, PT extends PathTuple> = ValidPathPrefixImpl<
388
+ T,
389
+ PT,
390
+ []
391
+ >
392
+
393
+ /**
394
+ * Type to check whether a path through a type exists.
395
+ * @typeParam T - type which the path should be checked against
396
+ * @typeParam PT - path which should exist within the given type
397
+ * @example
398
+ * ```
399
+ * HasPath<{foo: {bar: string}}, ['foo', 'bar']> = true
400
+ * HasPath<{foo: {bar: string}}, ['foo', 'ba']> = false
401
+ * ```
402
+ */
403
+ export type HasPath<T, PT extends PathTuple> = ValidPathPrefix<T, PT> extends PT ? true
404
+ : false