@duplojs/agents-kit 0.0.0-stage → 0.1.0-beta.3

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 (551) hide show
  1. package/README.md +73 -2
  2. package/dist/bin/index.d.ts +2 -0
  3. package/dist/bin/index.mjs +7 -0
  4. package/dist/bin/install/index.d.ts +2 -0
  5. package/dist/bin/install/index.mjs +25 -0
  6. package/dist/bin/install/skill.d.ts +28 -0
  7. package/dist/bin/install/skill.mjs +58 -0
  8. package/dist/bin/packagePath.d.ts +2 -0
  9. package/dist/bin/packagePath.mjs +12 -0
  10. package/dist/bin/setup/index.d.ts +12 -0
  11. package/dist/bin/setup/index.mjs +33 -0
  12. package/dist/bin/setup/instructions.d.ts +8 -0
  13. package/dist/bin/setup/instructions.mjs +27 -0
  14. package/dist/index.cjs +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.mjs +0 -0
  17. package/docs/API/10-lang/10-array/10-at.ts +65 -0
  18. package/docs/API/10-lang/10-array/10-chunk.ts +42 -0
  19. package/docs/API/10-lang/10-array/10-coalescing.ts +19 -0
  20. package/docs/API/10-lang/10-array/10-concat.ts +34 -0
  21. package/docs/API/10-lang/10-array/10-copyWithin.ts +34 -0
  22. package/docs/API/10-lang/10-array/10-every.ts +25 -0
  23. package/docs/API/10-lang/10-array/10-fill.ts +34 -0
  24. package/docs/API/10-lang/10-array/10-fillAll.ts +34 -0
  25. package/docs/API/10-lang/10-array/10-filter.ts +43 -0
  26. package/docs/API/10-lang/10-array/10-find.ts +33 -0
  27. package/docs/API/10-lang/10-array/10-findAndReplace.ts +35 -0
  28. package/docs/API/10-lang/10-array/10-findAndSpliceDelete.ts +35 -0
  29. package/docs/API/10-lang/10-array/10-findAndSpliceInsert.ts +35 -0
  30. package/docs/API/10-lang/10-array/10-findAndSpliceReplace.ts +24 -0
  31. package/docs/API/10-lang/10-array/10-findDuplicates.ts +19 -0
  32. package/docs/API/10-lang/10-array/10-findIndex.ts +25 -0
  33. package/docs/API/10-lang/10-array/10-findLast.ts +33 -0
  34. package/docs/API/10-lang/10-array/10-findLastIndex.ts +25 -0
  35. package/docs/API/10-lang/10-array/10-first.ts +21 -0
  36. package/docs/API/10-lang/10-array/10-flat.ts +22 -0
  37. package/docs/API/10-lang/10-array/10-flatMap.ts +24 -0
  38. package/docs/API/10-lang/10-array/10-from.ts +25 -0
  39. package/docs/API/10-lang/10-array/10-group.ts +27 -0
  40. package/docs/API/10-lang/10-array/10-groupOutput.ts +30 -0
  41. package/docs/API/10-lang/10-array/10-includes.ts +24 -0
  42. package/docs/API/10-lang/10-array/10-indexOf.ts +24 -0
  43. package/docs/API/10-lang/10-array/10-insert.ts +34 -0
  44. package/docs/API/10-lang/10-array/10-is.ts +15 -0
  45. package/docs/API/10-lang/10-array/10-isLastIndex.ts +24 -0
  46. package/docs/API/10-lang/10-array/10-last.ts +21 -0
  47. package/docs/API/10-lang/10-array/10-lastIndexOf.ts +24 -0
  48. package/docs/API/10-lang/10-array/10-length.ts +28 -0
  49. package/docs/API/10-lang/10-array/10-lengthEqual.ts +39 -0
  50. package/docs/API/10-lang/10-array/10-map.ts +34 -0
  51. package/docs/API/10-lang/10-array/10-maxElements.ts +44 -0
  52. package/docs/API/10-lang/10-array/10-minElements.ts +44 -0
  53. package/docs/API/10-lang/10-array/10-notIncludes.ts +24 -0
  54. package/docs/API/10-lang/10-array/10-pop.ts +23 -0
  55. package/docs/API/10-lang/10-array/10-prepend.ts +34 -0
  56. package/docs/API/10-lang/10-array/10-push.ts +34 -0
  57. package/docs/API/10-lang/10-array/10-reduce.ts +28 -0
  58. package/docs/API/10-lang/10-array/10-reduceFrom.ts +16 -0
  59. package/docs/API/10-lang/10-array/10-reduceRight.ts +28 -0
  60. package/docs/API/10-lang/10-array/10-reverse.ts +25 -0
  61. package/docs/API/10-lang/10-array/10-select.ts +26 -0
  62. package/docs/API/10-lang/10-array/10-set.ts +24 -0
  63. package/docs/API/10-lang/10-array/10-shift.ts +23 -0
  64. package/docs/API/10-lang/10-array/10-slice.ts +24 -0
  65. package/docs/API/10-lang/10-array/10-some.ts +25 -0
  66. package/docs/API/10-lang/10-array/10-sort.ts +34 -0
  67. package/docs/API/10-lang/10-array/10-spliceDelete.ts +34 -0
  68. package/docs/API/10-lang/10-array/10-spliceInsert.ts +34 -0
  69. package/docs/API/10-lang/10-array/10-spliceReplace.ts +24 -0
  70. package/docs/API/10-lang/10-array/10-unshift.ts +34 -0
  71. package/docs/API/10-lang/10-array/index.llms.md +220 -0
  72. package/docs/API/10-lang/10-array/index.md +3 -0
  73. package/docs/API/10-lang/10-chrono/10-addDays.ts +25 -0
  74. package/docs/API/10-lang/10-chrono/10-addHours.ts +25 -0
  75. package/docs/API/10-lang/10-chrono/10-addMilliseconds.ts +25 -0
  76. package/docs/API/10-lang/10-chrono/10-addMinutes.ts +25 -0
  77. package/docs/API/10-lang/10-chrono/10-addMonths.ts +25 -0
  78. package/docs/API/10-lang/10-chrono/10-addSeconds.ts +25 -0
  79. package/docs/API/10-lang/10-chrono/10-addTime.ts +38 -0
  80. package/docs/API/10-lang/10-chrono/10-addWeeks.ts +25 -0
  81. package/docs/API/10-lang/10-chrono/10-addYears.ts +25 -0
  82. package/docs/API/10-lang/10-chrono/10-applyTimezone.ts +29 -0
  83. package/docs/API/10-lang/10-chrono/10-betweenThanDate.ts +27 -0
  84. package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualDate.ts +27 -0
  85. package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualTime.ts +27 -0
  86. package/docs/API/10-lang/10-chrono/10-betweenThanTime.ts +27 -0
  87. package/docs/API/10-lang/10-chrono/10-closestTo.ts +48 -0
  88. package/docs/API/10-lang/10-chrono/10-computeTime.ts +35 -0
  89. package/docs/API/10-lang/10-chrono/10-createDate.ts +122 -0
  90. package/docs/API/10-lang/10-chrono/10-createDateOrThrow.ts +39 -0
  91. package/docs/API/10-lang/10-chrono/10-createTime.ts +86 -0
  92. package/docs/API/10-lang/10-chrono/10-createTimeOrThrow.ts +28 -0
  93. package/docs/API/10-lang/10-chrono/10-eachDate.ts +67 -0
  94. package/docs/API/10-lang/10-chrono/10-equalDate.ts +26 -0
  95. package/docs/API/10-lang/10-chrono/10-equalTime.ts +26 -0
  96. package/docs/API/10-lang/10-chrono/10-formatDate.ts +43 -0
  97. package/docs/API/10-lang/10-chrono/10-formatTime.ts +37 -0
  98. package/docs/API/10-lang/10-chrono/10-getDayOfMonth.ts +37 -0
  99. package/docs/API/10-lang/10-chrono/10-getDayOfWeek.ts +30 -0
  100. package/docs/API/10-lang/10-chrono/10-getDayOfYear.ts +28 -0
  101. package/docs/API/10-lang/10-chrono/10-getDifference.ts +29 -0
  102. package/docs/API/10-lang/10-chrono/10-getFirstDayOfMonth.ts +24 -0
  103. package/docs/API/10-lang/10-chrono/10-getFirstDayOfWeek.ts +24 -0
  104. package/docs/API/10-lang/10-chrono/10-getHour.ts +28 -0
  105. package/docs/API/10-lang/10-chrono/10-getLastDayOfMonth.ts +24 -0
  106. package/docs/API/10-lang/10-chrono/10-getLastDayOfWeek.ts +24 -0
  107. package/docs/API/10-lang/10-chrono/10-getMilliseconds.ts +24 -0
  108. package/docs/API/10-lang/10-chrono/10-getMinute.ts +27 -0
  109. package/docs/API/10-lang/10-chrono/10-getMonth.ts +27 -0
  110. package/docs/API/10-lang/10-chrono/10-getSecond.ts +27 -0
  111. package/docs/API/10-lang/10-chrono/10-getTimezoneOffset.ts +28 -0
  112. package/docs/API/10-lang/10-chrono/10-getWeekOfYear.ts +27 -0
  113. package/docs/API/10-lang/10-chrono/10-getYear.ts +27 -0
  114. package/docs/API/10-lang/10-chrono/10-greaterThanDate.ts +26 -0
  115. package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualDate.ts +26 -0
  116. package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualTime.ts +26 -0
  117. package/docs/API/10-lang/10-chrono/10-greaterThanTime.ts +26 -0
  118. package/docs/API/10-lang/10-chrono/10-isDate.ts +23 -0
  119. package/docs/API/10-lang/10-chrono/10-isSafeTimeValue.ts +19 -0
  120. package/docs/API/10-lang/10-chrono/10-isSafeTimestamp.ts +19 -0
  121. package/docs/API/10-lang/10-chrono/10-isSerializedTheDate.ts +26 -0
  122. package/docs/API/10-lang/10-chrono/10-isSerializedTheTime.ts +26 -0
  123. package/docs/API/10-lang/10-chrono/10-isTime.ts +23 -0
  124. package/docs/API/10-lang/10-chrono/10-lessThanDate.ts +26 -0
  125. package/docs/API/10-lang/10-chrono/10-lessThanOrEqualDate.ts +26 -0
  126. package/docs/API/10-lang/10-chrono/10-lessThanOrEqualTime.ts +26 -0
  127. package/docs/API/10-lang/10-chrono/10-lessThanTime.ts +26 -0
  128. package/docs/API/10-lang/10-chrono/10-makeSafeTimeValue.ts +19 -0
  129. package/docs/API/10-lang/10-chrono/10-makeSafeTimestamp.ts +19 -0
  130. package/docs/API/10-lang/10-chrono/10-maxDate.ts +23 -0
  131. package/docs/API/10-lang/10-chrono/10-maxTime.ts +23 -0
  132. package/docs/API/10-lang/10-chrono/10-minDate.ts +23 -0
  133. package/docs/API/10-lang/10-chrono/10-minTime.ts +23 -0
  134. package/docs/API/10-lang/10-chrono/10-now.ts +13 -0
  135. package/docs/API/10-lang/10-chrono/10-round.ts +41 -0
  136. package/docs/API/10-lang/10-chrono/10-serialize.ts +23 -0
  137. package/docs/API/10-lang/10-chrono/10-sortDates.ts +32 -0
  138. package/docs/API/10-lang/10-chrono/10-sortTimes.ts +31 -0
  139. package/docs/API/10-lang/10-chrono/10-subtractDays.ts +25 -0
  140. package/docs/API/10-lang/10-chrono/10-subtractHours.ts +25 -0
  141. package/docs/API/10-lang/10-chrono/10-subtractMilliseconds.ts +25 -0
  142. package/docs/API/10-lang/10-chrono/10-subtractMinutes.ts +25 -0
  143. package/docs/API/10-lang/10-chrono/10-subtractMonths.ts +25 -0
  144. package/docs/API/10-lang/10-chrono/10-subtractSeconds.ts +25 -0
  145. package/docs/API/10-lang/10-chrono/10-subtractTime.ts +38 -0
  146. package/docs/API/10-lang/10-chrono/10-subtractWeeks.ts +25 -0
  147. package/docs/API/10-lang/10-chrono/10-subtractYears.ts +25 -0
  148. package/docs/API/10-lang/10-chrono/10-toDateISOString.ts +17 -0
  149. package/docs/API/10-lang/10-chrono/10-toNative.ts +25 -0
  150. package/docs/API/10-lang/10-chrono/10-toTimeValue.ts +17 -0
  151. package/docs/API/10-lang/10-chrono/10-toTimestamp.ts +17 -0
  152. package/docs/API/10-lang/10-chrono/10-today.ts +13 -0
  153. package/docs/API/10-lang/10-chrono/10-tomorrow.ts +13 -0
  154. package/docs/API/10-lang/10-chrono/10-yesterday.ts +13 -0
  155. package/docs/API/10-lang/10-chrono/index.llms.md +332 -0
  156. package/docs/API/10-lang/10-chrono/index.md +3 -0
  157. package/docs/API/10-lang/10-common/10-and.ts +45 -0
  158. package/docs/API/10-lang/10-common/10-asserts.ts +13 -0
  159. package/docs/API/10-lang/10-common/10-asyncInnerPipe.ts +23 -0
  160. package/docs/API/10-lang/10-common/10-asyncLoop.ts +25 -0
  161. package/docs/API/10-lang/10-common/10-asyncPipe.ts +21 -0
  162. package/docs/API/10-lang/10-common/10-callThen.ts +22 -0
  163. package/docs/API/10-lang/10-common/10-cast.ts +16 -0
  164. package/docs/API/10-lang/10-common/10-clone.ts +12 -0
  165. package/docs/API/10-lang/10-common/10-createAsyncRetry.ts +34 -0
  166. package/docs/API/10-lang/10-common/10-createBuilder.ts +19 -0
  167. package/docs/API/10-lang/10-common/10-createEnum.ts +25 -0
  168. package/docs/API/10-lang/10-common/10-createExternalPromise.ts +13 -0
  169. package/docs/API/10-lang/10-common/10-createFormData.ts +16 -0
  170. package/docs/API/10-lang/10-common/10-createInterpolation.ts +12 -0
  171. package/docs/API/10-lang/10-common/10-createQueue.ts +16 -0
  172. package/docs/API/10-lang/10-common/10-createTransformer.ts +16 -0
  173. package/docs/API/10-lang/10-common/10-detachObjectMethod.ts +20 -0
  174. package/docs/API/10-lang/10-common/10-equal.ts +31 -0
  175. package/docs/API/10-lang/10-common/10-escapeRegExp.ts +11 -0
  176. package/docs/API/10-lang/10-common/10-falsy.ts +12 -0
  177. package/docs/API/10-lang/10-common/10-forward.ts +11 -0
  178. package/docs/API/10-lang/10-common/10-forwardAsserts.ts +17 -0
  179. package/docs/API/10-lang/10-common/10-forwardLog.ts +11 -0
  180. package/docs/API/10-lang/10-common/10-infer.ts +16 -0
  181. package/docs/API/10-lang/10-common/10-innerPipe.ts +23 -0
  182. package/docs/API/10-lang/10-common/10-instanceOf.ts +23 -0
  183. package/docs/API/10-lang/10-common/10-isType.ts +29 -0
  184. package/docs/API/10-lang/10-common/10-justExec.ts +28 -0
  185. package/docs/API/10-lang/10-common/10-justReturn.ts +19 -0
  186. package/docs/API/10-lang/10-common/10-loop.ts +20 -0
  187. package/docs/API/10-lang/10-common/10-memo.ts +12 -0
  188. package/docs/API/10-lang/10-common/10-memoObject.ts +11 -0
  189. package/docs/API/10-lang/10-common/10-memoPromise.ts +16 -0
  190. package/docs/API/10-lang/10-common/10-or.ts +29 -0
  191. package/docs/API/10-lang/10-common/10-pipe.ts +21 -0
  192. package/docs/API/10-lang/10-common/10-pipeCall.ts +20 -0
  193. package/docs/API/10-lang/10-common/10-prepareAsyncPipe.ts +20 -0
  194. package/docs/API/10-lang/10-common/10-preparePipe.ts +20 -0
  195. package/docs/API/10-lang/10-common/10-promiseAll.ts +16 -0
  196. package/docs/API/10-lang/10-common/10-promiseObject.ts +22 -0
  197. package/docs/API/10-lang/10-common/10-removeConstraint.ts +13 -0
  198. package/docs/API/10-lang/10-common/10-shameOnYou.ts +20 -0
  199. package/docs/API/10-lang/10-common/10-simpleClone.ts +12 -0
  200. package/docs/API/10-lang/10-common/10-stringToBytes.ts +16 -0
  201. package/docs/API/10-lang/10-common/10-stringToMillisecond.ts +17 -0
  202. package/docs/API/10-lang/10-common/10-timeout.ts +11 -0
  203. package/docs/API/10-lang/10-common/10-toCurriedPredicate.ts +28 -0
  204. package/docs/API/10-lang/10-common/10-toJSON.ts +15 -0
  205. package/docs/API/10-lang/10-common/10-toNative.ts +15 -0
  206. package/docs/API/10-lang/10-common/10-toRegExp.ts +17 -0
  207. package/docs/API/10-lang/10-common/10-transformer.ts +21 -0
  208. package/docs/API/10-lang/10-common/10-truthy.ts +12 -0
  209. package/docs/API/10-lang/10-common/10-useAsyncRetry.ts +31 -0
  210. package/docs/API/10-lang/10-common/10-when.ts +27 -0
  211. package/docs/API/10-lang/10-common/10-whenElse.ts +28 -0
  212. package/docs/API/10-lang/10-common/10-whenNot.ts +26 -0
  213. package/docs/API/10-lang/10-common/index.llms.md +228 -0
  214. package/docs/API/10-lang/10-common/index.md +3 -0
  215. package/docs/API/10-lang/10-dataStructure/10-absolutePath.ts +25 -0
  216. package/docs/API/10-lang/10-dataStructure/10-allowedCharacters.ts +25 -0
  217. package/docs/API/10-lang/10-dataStructure/10-array.ts +23 -0
  218. package/docs/API/10-lang/10-dataStructure/10-arrayLengthEqual.ts +25 -0
  219. package/docs/API/10-lang/10-dataStructure/10-betweenThan.ts +25 -0
  220. package/docs/API/10-lang/10-dataStructure/10-betweenThanOrEqual.ts +25 -0
  221. package/docs/API/10-lang/10-dataStructure/10-bigint.ts +22 -0
  222. package/docs/API/10-lang/10-dataStructure/10-boolean.ts +22 -0
  223. package/docs/API/10-lang/10-dataStructure/10-createCodec.ts +45 -0
  224. package/docs/API/10-lang/10-dataStructure/10-createCodecs.ts +134 -0
  225. package/docs/API/10-lang/10-dataStructure/10-createErrorInterpreter.ts +74 -0
  226. package/docs/API/10-lang/10-dataStructure/10-date.ts +23 -0
  227. package/docs/API/10-lang/10-dataStructure/10-email.ts +25 -0
  228. package/docs/API/10-lang/10-dataStructure/10-endsWith.ts +24 -0
  229. package/docs/API/10-lang/10-dataStructure/10-even.ts +25 -0
  230. package/docs/API/10-lang/10-dataStructure/10-extend.ts +27 -0
  231. package/docs/API/10-lang/10-dataStructure/10-greaterThan.ts +25 -0
  232. package/docs/API/10-lang/10-dataStructure/10-greaterThanOrEqual.ts +25 -0
  233. package/docs/API/10-lang/10-dataStructure/10-include.ts +24 -0
  234. package/docs/API/10-lang/10-dataStructure/10-integer.ts +25 -0
  235. package/docs/API/10-lang/10-dataStructure/10-isNullStructure.ts +12 -0
  236. package/docs/API/10-lang/10-dataStructure/10-isNullable.ts +12 -0
  237. package/docs/API/10-lang/10-dataStructure/10-isOptional.ts +12 -0
  238. package/docs/API/10-lang/10-dataStructure/10-isUndefinedStructure.ts +12 -0
  239. package/docs/API/10-lang/10-dataStructure/10-lazy.ts +23 -0
  240. package/docs/API/10-lang/10-dataStructure/10-lessThan.ts +25 -0
  241. package/docs/API/10-lang/10-dataStructure/10-lessThanOrEqual.ts +25 -0
  242. package/docs/API/10-lang/10-dataStructure/10-literal.ts +19 -0
  243. package/docs/API/10-lang/10-dataStructure/10-maxCharacters.ts +25 -0
  244. package/docs/API/10-lang/10-dataStructure/10-maxElements.ts +25 -0
  245. package/docs/API/10-lang/10-dataStructure/10-minCharacters.ts +25 -0
  246. package/docs/API/10-lang/10-dataStructure/10-minElements.ts +25 -0
  247. package/docs/API/10-lang/10-dataStructure/10-multipleOf.ts +25 -0
  248. package/docs/API/10-lang/10-dataStructure/10-negative.ts +25 -0
  249. package/docs/API/10-lang/10-dataStructure/10-notEmpty.ts +25 -0
  250. package/docs/API/10-lang/10-dataStructure/10-notZero.ts +25 -0
  251. package/docs/API/10-lang/10-dataStructure/10-null.ts +22 -0
  252. package/docs/API/10-lang/10-dataStructure/10-nullable.ts +19 -0
  253. package/docs/API/10-lang/10-dataStructure/10-number.ts +22 -0
  254. package/docs/API/10-lang/10-dataStructure/10-numberInString.ts +25 -0
  255. package/docs/API/10-lang/10-dataStructure/10-object.ts +25 -0
  256. package/docs/API/10-lang/10-dataStructure/10-odd.ts +25 -0
  257. package/docs/API/10-lang/10-dataStructure/10-optional.ts +19 -0
  258. package/docs/API/10-lang/10-dataStructure/10-partial.ts +23 -0
  259. package/docs/API/10-lang/10-dataStructure/10-path.ts +25 -0
  260. package/docs/API/10-lang/10-dataStructure/10-positive.ts +25 -0
  261. package/docs/API/10-lang/10-dataStructure/10-record.ts +22 -0
  262. package/docs/API/10-lang/10-dataStructure/10-refine.ts +27 -0
  263. package/docs/API/10-lang/10-dataStructure/10-regex.ts +24 -0
  264. package/docs/API/10-lang/10-dataStructure/10-required.ts +21 -0
  265. package/docs/API/10-lang/10-dataStructure/10-safe.ts +25 -0
  266. package/docs/API/10-lang/10-dataStructure/10-segmentPath.ts +25 -0
  267. package/docs/API/10-lang/10-dataStructure/10-startsWith.ts +24 -0
  268. package/docs/API/10-lang/10-dataStructure/10-strictNegative.ts +25 -0
  269. package/docs/API/10-lang/10-dataStructure/10-strictPositive.ts +25 -0
  270. package/docs/API/10-lang/10-dataStructure/10-string.ts +22 -0
  271. package/docs/API/10-lang/10-dataStructure/10-stringLengthEqual.ts +25 -0
  272. package/docs/API/10-lang/10-dataStructure/10-time.ts +23 -0
  273. package/docs/API/10-lang/10-dataStructure/10-trimmed.ts +25 -0
  274. package/docs/API/10-lang/10-dataStructure/10-typeStructureIdentifier.ts +33 -0
  275. package/docs/API/10-lang/10-dataStructure/10-undefined.ts +22 -0
  276. package/docs/API/10-lang/10-dataStructure/10-union.ts +24 -0
  277. package/docs/API/10-lang/10-dataStructure/10-unwrapLazy.ts +17 -0
  278. package/docs/API/10-lang/10-dataStructure/10-url.ts +25 -0
  279. package/docs/API/10-lang/10-dataStructure/10-uuid.ts +25 -0
  280. package/docs/API/10-lang/10-dataStructure/index.llms.md +264 -0
  281. package/docs/API/10-lang/10-dataStructure/index.md +3 -0
  282. package/docs/API/10-lang/10-either/10-asyncGroup.ts +44 -0
  283. package/docs/API/10-lang/10-either/10-asyncSafeCallback.ts +23 -0
  284. package/docs/API/10-lang/10-either/10-error.ts +12 -0
  285. package/docs/API/10-lang/10-either/10-expect.ts +13 -0
  286. package/docs/API/10-lang/10-either/10-fail.ts +12 -0
  287. package/docs/API/10-lang/10-either/10-forwardAssertsSelection.ts +28 -0
  288. package/docs/API/10-lang/10-either/10-group.ts +58 -0
  289. package/docs/API/10-lang/10-either/10-hasInformation.ts +24 -0
  290. package/docs/API/10-lang/10-either/10-isLeft.ts +16 -0
  291. package/docs/API/10-lang/10-either/10-isRight.ts +16 -0
  292. package/docs/API/10-lang/10-either/10-isSelected.ts +29 -0
  293. package/docs/API/10-lang/10-either/10-keepAsRightByInformation.ts +29 -0
  294. package/docs/API/10-lang/10-either/10-keepAsRightSelection.ts +23 -0
  295. package/docs/API/10-lang/10-either/10-left.ts +13 -0
  296. package/docs/API/10-lang/10-either/10-matchInformation.ts +26 -0
  297. package/docs/API/10-lang/10-either/10-matchInformationOtherwise.ts +27 -0
  298. package/docs/API/10-lang/10-either/10-none.ts +12 -0
  299. package/docs/API/10-lang/10-either/10-ok.ts +12 -0
  300. package/docs/API/10-lang/10-either/10-result.ts +18 -0
  301. package/docs/API/10-lang/10-either/10-rewriteInformation.ts +24 -0
  302. package/docs/API/10-lang/10-either/10-right.ts +13 -0
  303. package/docs/API/10-lang/10-either/10-rightAsyncPipe.ts +69 -0
  304. package/docs/API/10-lang/10-either/10-rightPipe.ts +72 -0
  305. package/docs/API/10-lang/10-either/10-safeCallback.ts +29 -0
  306. package/docs/API/10-lang/10-either/10-some.ts +12 -0
  307. package/docs/API/10-lang/10-either/10-success.ts +12 -0
  308. package/docs/API/10-lang/10-either/10-toMaybe.ts +53 -0
  309. package/docs/API/10-lang/10-either/10-unwrapByInformation.ts +20 -0
  310. package/docs/API/10-lang/10-either/10-unwrapByInformationOrThrow.ts +19 -0
  311. package/docs/API/10-lang/10-either/10-unwrapLeft.ts +14 -0
  312. package/docs/API/10-lang/10-either/10-unwrapLeftOrThrow.ts +17 -0
  313. package/docs/API/10-lang/10-either/10-unwrapOr.ts +17 -0
  314. package/docs/API/10-lang/10-either/10-unwrapOtherwise.ts +20 -0
  315. package/docs/API/10-lang/10-either/10-unwrapRight.ts +14 -0
  316. package/docs/API/10-lang/10-either/10-unwrapRightOrThrow.ts +17 -0
  317. package/docs/API/10-lang/10-either/10-unwrapSelection.ts +26 -0
  318. package/docs/API/10-lang/10-either/10-unwrapSelectionOrThrow.ts +19 -0
  319. package/docs/API/10-lang/10-either/10-whenHasInformation.ts +35 -0
  320. package/docs/API/10-lang/10-either/10-whenHasInformationOtherwise.ts +29 -0
  321. package/docs/API/10-lang/10-either/10-whenIsLeft.ts +20 -0
  322. package/docs/API/10-lang/10-either/10-whenIsLeftOtherwise.ts +27 -0
  323. package/docs/API/10-lang/10-either/10-whenIsRight.ts +20 -0
  324. package/docs/API/10-lang/10-either/10-whenIsRightOtherwise.ts +26 -0
  325. package/docs/API/10-lang/10-either/10-whenIsSelected.ts +33 -0
  326. package/docs/API/10-lang/10-either/10-whenIsSelectedOtherwise.ts +35 -0
  327. package/docs/API/10-lang/10-either/index.llms.md +184 -0
  328. package/docs/API/10-lang/10-either/index.md +3 -0
  329. package/docs/API/10-lang/10-generator/10-asyncChunk.ts +55 -0
  330. package/docs/API/10-lang/10-generator/10-asyncConcat.ts +46 -0
  331. package/docs/API/10-lang/10-generator/10-asyncFilter.ts +41 -0
  332. package/docs/API/10-lang/10-generator/10-asyncFlat.ts +37 -0
  333. package/docs/API/10-lang/10-generator/10-asyncGroup.ts +65 -0
  334. package/docs/API/10-lang/10-generator/10-asyncLoop.ts +59 -0
  335. package/docs/API/10-lang/10-generator/10-asyncMap.ts +48 -0
  336. package/docs/API/10-lang/10-generator/10-asyncReduce.ts +63 -0
  337. package/docs/API/10-lang/10-generator/10-chunk.ts +44 -0
  338. package/docs/API/10-lang/10-generator/10-concat.ts +37 -0
  339. package/docs/API/10-lang/10-generator/10-createExternalAsyncGenerator.ts +29 -0
  340. package/docs/API/10-lang/10-generator/10-execute.ts +44 -0
  341. package/docs/API/10-lang/10-generator/10-filter.ts +35 -0
  342. package/docs/API/10-lang/10-generator/10-flat.ts +25 -0
  343. package/docs/API/10-lang/10-generator/10-group.ts +44 -0
  344. package/docs/API/10-lang/10-generator/10-groupOutput.ts +48 -0
  345. package/docs/API/10-lang/10-generator/10-loop.ts +55 -0
  346. package/docs/API/10-lang/10-generator/10-map.ts +35 -0
  347. package/docs/API/10-lang/10-generator/10-reduce.ts +51 -0
  348. package/docs/API/10-lang/10-generator/10-reduceFrom.ts +30 -0
  349. package/docs/API/10-lang/10-generator/index.llms.md +84 -0
  350. package/docs/API/10-lang/10-generator/index.md +3 -0
  351. package/docs/API/10-lang/index.md +3 -0
  352. package/docs/API/index.md +3 -0
  353. package/docs/API.llms.md +31 -0
  354. package/docs/concepts/01-fundamental/01-constraint/01-use.ts +22 -0
  355. package/docs/concepts/01-fundamental/01-constraint/10-built-in-constraint.ts +37 -0
  356. package/docs/concepts/01-fundamental/01-constraint/20-manipulation.ts +38 -0
  357. package/docs/concepts/01-fundamental/01-constraint/30-cast.ts +62 -0
  358. package/docs/concepts/01-fundamental/01-constraint/40-custom-constraint.ts +45 -0
  359. package/docs/concepts/01-fundamental/01-constraint/index.md +3 -0
  360. package/docs/concepts/01-fundamental/02-currying/01-use.ts +33 -0
  361. package/docs/concepts/01-fundamental/02-currying/10-built-in-function.ts +178 -0
  362. package/docs/concepts/01-fundamental/02-currying/20-inner-pipe.ts +39 -0
  363. package/docs/concepts/01-fundamental/02-currying/30-async-pipe.ts +42 -0
  364. package/docs/concepts/01-fundamental/02-currying/index.md +3 -0
  365. package/docs/concepts/01-fundamental/03-either/01-use.ts +21 -0
  366. package/docs/concepts/01-fundamental/03-either/10-discrimination.ts +79 -0
  367. package/docs/concepts/01-fundamental/03-either/20-exhaustive-handling.ts +73 -0
  368. package/docs/concepts/01-fundamental/03-either/30-composition.ts +72 -0
  369. package/docs/concepts/01-fundamental/03-either/40-result-adaptation.ts +40 -0
  370. package/docs/concepts/01-fundamental/03-either/50-external-results.ts +59 -0
  371. package/docs/concepts/01-fundamental/03-either/60-contextual-state.ts +40 -0
  372. package/docs/concepts/01-fundamental/03-either/index.md +3 -0
  373. package/docs/concepts/01-fundamental/04-data-structure/01-use.ts +22 -0
  374. package/docs/concepts/01-fundamental/04-data-structure/10-structure.ts +193 -0
  375. package/docs/concepts/01-fundamental/04-data-structure/20-constraint.ts +78 -0
  376. package/docs/concepts/01-fundamental/04-data-structure/30-validation.ts +100 -0
  377. package/docs/concepts/01-fundamental/04-data-structure/40-codecs.ts +151 -0
  378. package/docs/concepts/01-fundamental/04-data-structure/50-recursive.ts +48 -0
  379. package/docs/concepts/01-fundamental/04-data-structure/60-interpret-error.ts +123 -0
  380. package/docs/concepts/01-fundamental/04-data-structure/index.md +3 -0
  381. package/docs/concepts/01-fundamental/05-chrono/01-use.ts +14 -0
  382. package/docs/concepts/01-fundamental/05-chrono/10-creation.ts +59 -0
  383. package/docs/concepts/01-fundamental/05-chrono/20-manipulation.ts +94 -0
  384. package/docs/concepts/01-fundamental/05-chrono/30-serialized.ts +73 -0
  385. package/docs/concepts/01-fundamental/05-chrono/40-timezone.ts +81 -0
  386. package/docs/concepts/01-fundamental/05-chrono/index.md +3 -0
  387. package/docs/concepts/01-fundamental/06-modeling/10-new-type.ts +42 -0
  388. package/docs/concepts/01-fundamental/06-modeling/20-entity.ts +204 -0
  389. package/docs/concepts/01-fundamental/06-modeling/30-tagged-object.ts +181 -0
  390. package/docs/concepts/01-fundamental/06-modeling/40-entity-lifecycle.ts +275 -0
  391. package/docs/concepts/01-fundamental/06-modeling/50-evidence.ts +94 -0
  392. package/docs/concepts/01-fundamental/06-modeling/60-signed-function.ts +26 -0
  393. package/docs/concepts/01-fundamental/06-modeling/index.md +3 -0
  394. package/docs/concepts/01-fundamental/07-discrimination/10-entity.ts +104 -0
  395. package/docs/concepts/01-fundamental/07-discrimination/20-fact.ts +142 -0
  396. package/docs/concepts/01-fundamental/07-discrimination/30-tagged-object.ts +105 -0
  397. package/docs/concepts/01-fundamental/07-discrimination/40-error.ts +57 -0
  398. package/docs/concepts/01-fundamental/07-discrimination/50-literal.ts +87 -0
  399. package/docs/concepts/01-fundamental/07-discrimination/60-shape.ts +152 -0
  400. package/docs/concepts/01-fundamental/07-discrimination/70-predicate.ts +89 -0
  401. package/docs/concepts/01-fundamental/07-discrimination/index.md +3 -0
  402. package/docs/concepts/01-fundamental/index.md +1 -0
  403. package/docs/concepts/02-server/10-file/10-manipulation.ts +40 -0
  404. package/docs/concepts/02-server/10-file/20-path.ts +56 -0
  405. package/docs/concepts/02-server/10-file/index.md +3 -0
  406. package/docs/concepts/02-server/20-http/10-init.ts +31 -0
  407. package/docs/concepts/02-server/20-http/20-route.ts +174 -0
  408. package/docs/concepts/02-server/20-http/30-routine.ts +195 -0
  409. package/docs/concepts/02-server/20-http/40-jwt.ts +137 -0
  410. package/docs/concepts/02-server/20-http/50-codegen.ts +29 -0
  411. package/docs/concepts/02-server/20-http/index.md +3 -0
  412. package/docs/concepts/02-server/30-environment/10-platform.ts +38 -0
  413. package/docs/concepts/02-server/30-environment/20-variable.ts +41 -0
  414. package/docs/concepts/02-server/30-environment/index.md +3 -0
  415. package/docs/concepts/02-server/40-command/10-use.ts +112 -0
  416. package/docs/concepts/02-server/40-command/20-sub-command.ts +48 -0
  417. package/docs/concepts/02-server/40-command/index.md +3 -0
  418. package/docs/concepts/02-server/index.md +1 -0
  419. package/docs/concepts/03-client/10-http/10-init.ts +64 -0
  420. package/docs/concepts/03-client/10-http/20-request.ts +244 -0
  421. package/docs/concepts/03-client/10-http/30-hook.ts +139 -0
  422. package/docs/concepts/03-client/10-http/index.md +3 -0
  423. package/docs/concepts/03-client/20-form/10-init.ts +95 -0
  424. package/docs/concepts/03-client/20-form/20-input.ts +96 -0
  425. package/docs/concepts/03-client/20-form/30-layout.ts +160 -0
  426. package/docs/concepts/03-client/20-form/40-template.ts +89 -0
  427. package/docs/concepts/03-client/20-form/index.md +3 -0
  428. package/docs/concepts/03-client/index.md +1 -0
  429. package/docs/concepts/04-tests/01-unit/10-either.ts +136 -0
  430. package/docs/concepts/04-tests/01-unit/20-server-mocking.ts +53 -0
  431. package/docs/concepts/04-tests/01-unit/index.md +3 -0
  432. package/docs/concepts/04-tests/02-e2e/10-init.ts +80 -0
  433. package/docs/concepts/04-tests/02-e2e/20-architecture.ts +76 -0
  434. package/docs/concepts/04-tests/02-e2e/30-testing.ts +90 -0
  435. package/docs/concepts/04-tests/02-e2e/index.md +3 -0
  436. package/docs/concepts/04-tests/index.md +1 -0
  437. package/docs/concepts/05-type-driven-design/01-architecture/10-boundaries.md +41 -0
  438. package/docs/concepts/05-type-driven-design/01-architecture/index.md +3 -0
  439. package/docs/concepts/05-type-driven-design/02-domains/10-entities.md +58 -0
  440. package/docs/concepts/05-type-driven-design/02-domains/20-aggregates.md +49 -0
  441. package/docs/concepts/05-type-driven-design/02-domains/30-repositories.md +41 -0
  442. package/docs/concepts/05-type-driven-design/02-domains/index.md +3 -0
  443. package/docs/concepts/05-type-driven-design/03-applications/10-use-case.md +69 -0
  444. package/docs/concepts/05-type-driven-design/03-applications/index.md +3 -0
  445. package/docs/concepts/05-type-driven-design/04-infrastructure/10-implementation.md +56 -0
  446. package/docs/concepts/05-type-driven-design/04-infrastructure/index.md +3 -0
  447. package/docs/concepts/05-type-driven-design/fixtures/business/applications/index.ts +2 -0
  448. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/book.ts +10 -0
  449. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/client.ts +10 -0
  450. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/email.ts +7 -0
  451. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/index.ts +3 -0
  452. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientGiveBackBook.ts +27 -0
  453. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientRentBook.ts +30 -0
  454. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/createBook.ts +32 -0
  455. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/index.ts +2 -0
  456. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientGiveBackBook.ts +15 -0
  457. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientRentBook.ts +16 -0
  458. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/createBook.ts +21 -0
  459. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/index.ts +3 -0
  460. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/create.ts +34 -0
  461. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/index.ts +3 -0
  462. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/rental.ts +31 -0
  463. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/returnBook.ts +30 -0
  464. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/index.ts +87 -0
  465. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/giveBackBook.ts +33 -0
  466. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/index.ts +2 -0
  467. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/rentBook.ts +32 -0
  468. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/index.ts +82 -0
  469. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/index.ts +2 -0
  470. package/docs/concepts/05-type-driven-design/fixtures/business/domains/index.ts +3 -0
  471. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/book.ts +16 -0
  472. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/client.ts +7 -0
  473. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/email.ts +12 -0
  474. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/index.ts +3 -0
  475. package/docs/concepts/05-type-driven-design/fixtures/business/index.ts +2 -0
  476. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/clientRentBook.ts +62 -0
  477. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/index.ts +11 -0
  478. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/bookExist.ts +19 -0
  479. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/clientExist.ts +19 -0
  480. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/index.ts +2 -0
  481. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/main.ts +19 -0
  482. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientGiveBackBook.ts +37 -0
  483. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientRentBook.ts +50 -0
  484. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/index.ts +2 -0
  485. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/book.ts +25 -0
  486. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/client.ts +7 -0
  487. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/email.ts +10 -0
  488. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/index.ts +3 -0
  489. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/useCases/index.ts +12 -0
  490. package/docs/concepts/05-type-driven-design/index.md +3 -0
  491. package/docs/concepts.llms.md +475 -0
  492. package/instructions/coding-conventions.md +8 -0
  493. package/package.json +96 -3
  494. package/skills/command/SKILL.md +63 -0
  495. package/skills/command/references/examples/cli.ts +22 -0
  496. package/skills/command/references/examples/options-only.ts +27 -0
  497. package/skills/command/references/examples/preview-command.ts +57 -0
  498. package/skills/command/references/execution.md +31 -0
  499. package/skills/command/references/inputs.md +27 -0
  500. package/skills/fundamental/SKILL.md +80 -0
  501. package/skills/fundamental/references/composition.md +35 -0
  502. package/skills/fundamental/references/constraints-and-validation.md +61 -0
  503. package/skills/fundamental/references/examples/async-composition.ts +15 -0
  504. package/skills/fundamental/references/examples/cast.ts +18 -0
  505. package/skills/fundamental/references/examples/composition.ts +40 -0
  506. package/skills/fundamental/references/examples/environment-initialization.ts +19 -0
  507. package/skills/fundamental/references/examples/error-propagation.ts +24 -0
  508. package/skills/fundamental/references/examples/generic-inference.ts +31 -0
  509. package/skills/fundamental/references/examples/guaranteed-array-access.ts +31 -0
  510. package/skills/fundamental/references/examples/independent-inputs.ts +18 -0
  511. package/skills/fundamental/references/examples/infer.ts +21 -0
  512. package/skills/fundamental/references/examples/input-validation.ts +37 -0
  513. package/skills/fundamental/references/examples/safe-declarations.ts +25 -0
  514. package/skills/fundamental/references/results-and-errors.md +59 -0
  515. package/skills/http-client/SKILL.md +50 -0
  516. package/skills/http-client/references/configuration.md +9 -0
  517. package/skills/http-client/references/examples/client-expectations.ts +84 -0
  518. package/skills/http-client/references/examples/client-streams.ts +74 -0
  519. package/skills/http-client/references/examples/external-client.ts +78 -0
  520. package/skills/http-client/references/hooks.md +7 -0
  521. package/skills/http-client/references/responses.md +39 -0
  522. package/skills/http-client/references/streams.md +10 -0
  523. package/skills/http-server/SKILL.md +66 -0
  524. package/skills/http-server/references/code-generation.md +31 -0
  525. package/skills/http-server/references/examples/authentication.ts +42 -0
  526. package/skills/http-server/references/examples/contracts.ts +19 -0
  527. package/skills/http-server/references/examples/generate-sdk.ts +36 -0
  528. package/skills/http-server/references/examples/initialize.ts +29 -0
  529. package/skills/http-server/references/examples/minimal-route.ts +18 -0
  530. package/skills/http-server/references/examples/protected-route.ts +31 -0
  531. package/skills/http-server/references/examples/rename-user-route.ts +54 -0
  532. package/skills/http-server/references/examples/user-checker.ts +26 -0
  533. package/skills/http-server/references/examples/user-route.ts +38 -0
  534. package/skills/http-server/references/initialization.md +33 -0
  535. package/skills/http-server/references/reusable-flows.md +40 -0
  536. package/skills/http-server/references/routes-and-floor.md +38 -0
  537. package/skills/modeling/SKILL.md +76 -0
  538. package/skills/modeling/references/domain.md +33 -0
  539. package/skills/modeling/references/orchestration.md +36 -0
  540. package/skills/server/SKILL.md +55 -0
  541. package/skills/server/references/environment.md +30 -0
  542. package/skills/server/references/examples/environment.ts +41 -0
  543. package/skills/server/references/examples/file-structure.ts +26 -0
  544. package/skills/server/references/examples/files.ts +52 -0
  545. package/skills/server/references/files.md +38 -0
  546. package/skills/server/references/structures.md +15 -0
  547. package/skills/test/SKILL.md +70 -0
  548. package/skills/test/references/examples/results.ts +95 -0
  549. package/skills/test/references/examples/server.ts +59 -0
  550. package/skills/test/references/results.md +21 -0
  551. package/skills/test/references/server.md +17 -0
@@ -0,0 +1,195 @@
1
+ /**
2
+ * @title Faire une routine de vérification
3
+ *
4
+ * Vérifications dans les flux HTTP, réutilisation des traitements et adaptation de leurs résultats au contexte.
5
+ */
6
+ import { ResponseContract, createPresetChecker, useCheckerBuilder, usePreflightBuilder, useProcessBuilder, useRouteBuilder } from "@duplojs/http";
7
+ import * as DEither from "@duplojs/lang/either";
8
+ import * as DCommon from "@duplojs/lang/common";
9
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
10
+ import * as DObject from "@duplojs/lang/object";
11
+ import type * as DString from "@duplojs/lang/string";
12
+
13
+ const userStructure = DDataStructure.object({
14
+ id: DDataStructure.string([DDataStructure.uuid()]),
15
+ name: DDataStructure.string(),
16
+ email: DDataStructure.string([DDataStructure.email()]),
17
+ });
18
+
19
+ type User = DDataStructure.StructureValue<typeof userStructure>;
20
+
21
+ declare function checkToken(
22
+ token: string,
23
+ ): DEither.Success<User> | DEither.Fail;
24
+
25
+ declare function findOneUser(id: string & DString.Uuid): Promise<DEither.Maybe<User>>;
26
+
27
+ // Un checker encapsule une opération réutilisable et produit des résultats
28
+ // génériques. Il ne choisit pas leur sens HTTP.
29
+ //
30
+ // Ce sens est donné au point d'utilisation : une route peut interpréter le
31
+ // checker avec `check`, ou une interprétation récurrente peut être nommée
32
+ // avec un preset. Le même checker peut donc servir plusieurs flux sans être
33
+ // dupliqué pour chaque variation d'usage.
34
+ export const userExist = useCheckerBuilder()
35
+ .handler(
36
+ async(input: string & DString.Uuid, { output }) => {
37
+ const result = await findOneUser(input);
38
+
39
+ return DEither.matchInformation(result, {
40
+ some: (user) => output("user.find", user),
41
+ none: () => output("user.notfound", null),
42
+ });
43
+ },
44
+ );
45
+
46
+ // `cut` couvre les vérifications propres au flux courant.
47
+ // Il peut interrompre avec `response` ou poursuivre avec `output`.
48
+ useRouteBuilder("POST", "/users/{userId}/confirm-email")
49
+ .extract({
50
+ params: {
51
+ userId: DDataStructure.string([DDataStructure.uuid()]),
52
+ },
53
+ body: {
54
+ email: DDataStructure.string([DDataStructure.email()]),
55
+ },
56
+ })
57
+ .check(
58
+ userExist,
59
+ {
60
+ input: ({ userId }) => userId,
61
+ result: "user.find",
62
+ otherwise: ResponseContract.notFound("user.notfound"),
63
+ indexing: "user",
64
+ },
65
+ )
66
+ .cut(
67
+ ResponseContract.conflict("user.emailConfirmation.mismatch"),
68
+ ({ user, email }, { response, output }) => {
69
+ if (user.email !== email) {
70
+ return response("user.emailConfirmation.mismatch");
71
+ }
72
+
73
+ return output({ confirmedUser: user });
74
+ },
75
+ )
76
+ .handler(
77
+ ResponseContract.ok("user.emailConfirmed", userStructure),
78
+ ({ confirmedUser }, { response }) => response("user.emailConfirmed", confirmedUser),
79
+ );
80
+
81
+ // `check` interprète un checker pour un flux donné : input, résultat attendu,
82
+ // réponse sinon, et donnée ajoutée au `floor`.
83
+ useRouteBuilder("GET", "/users/{userId}")
84
+ .extract({
85
+ params: {
86
+ userId: DDataStructure.string([DDataStructure.uuid()]),
87
+ },
88
+ })
89
+ .check(
90
+ userExist,
91
+ {
92
+ input: ({ userId }) => userId,
93
+ result: "user.find",
94
+ otherwise: ResponseContract.notFound("user.notfound"),
95
+ indexing: "user",
96
+ },
97
+ )
98
+ .handler(
99
+ ResponseContract.ok("user.find", userStructure),
100
+ ({ user }, { response }) => response("user.find", user),
101
+ );
102
+
103
+ // Un preset nomme une interprétation récurrente du checker.
104
+ // Il fixe le sens habituel du résultat tout en laissant le flux fournir
105
+ // son input et son indexation locale.
106
+ export const iWantUserExist = createPresetChecker(
107
+ userExist,
108
+ {
109
+ result: "user.find",
110
+ otherwise: ResponseContract.notFound("user.notfound"),
111
+ },
112
+ );
113
+
114
+ // `presetCheck` applique le preset au flux courant.
115
+ useRouteBuilder("GET", "/users/{userId}")
116
+ .extract({
117
+ params: {
118
+ userId: DDataStructure.string([DDataStructure.uuid()]),
119
+ },
120
+ })
121
+ .presetCheck(
122
+ iWantUserExist.indexing("user"),
123
+ ({ userId }) => userId,
124
+ )
125
+ .handler(
126
+ ResponseContract.ok("user.find", userStructure),
127
+ ({ user }, { response }) => response("user.find", user),
128
+ );
129
+
130
+ // Un `process` réutilise une séquence complète de steps.
131
+ // Son `floor` reste local : seules les données déclarées avec `exports` sortent.
132
+ export const authenticationProcess = useProcessBuilder()
133
+ .extract({
134
+ headers: {
135
+ authorization: DDataStructure.string(),
136
+ },
137
+ })
138
+ .cut(
139
+ ResponseContract.unauthorized("token.invalid"),
140
+ ({ authorization }, { response, output }) => DCommon.pipe(
141
+ authorization,
142
+ checkToken,
143
+ DEither.whenIsRightOtherwise(
144
+ (user) => output({
145
+ authenticatedUserId: user.id,
146
+ }),
147
+ () => response("token.invalid"),
148
+ ),
149
+ ),
150
+ )
151
+ .check(
152
+ userExist,
153
+ {
154
+ input: DObject.getProperty("authenticatedUserId"),
155
+ result: "user.find",
156
+ otherwise: ResponseContract.notFound("token.user.notfound"),
157
+ indexing: "user",
158
+ },
159
+ )
160
+ .exports(["user"]);
161
+
162
+ // `exec` insère l'exécution du process dans le flux courant.
163
+ useRouteBuilder("GET", "/some-action")
164
+ .exec(
165
+ authenticationProcess,
166
+ {
167
+ imports: ["user"],
168
+ },
169
+ )
170
+ .handler(
171
+ ResponseContract.ok("some-information.send", userStructure),
172
+ ({ user }, { response }) => response(
173
+ "some-information.send",
174
+ user,
175
+ ),
176
+ );
177
+
178
+ // Un preflight préfixe un builder par un process récurrent.
179
+ export const useAuthenticatedRouteBuilder = usePreflightBuilder()
180
+ .exec(
181
+ authenticationProcess,
182
+ {
183
+ imports: ["user"],
184
+ },
185
+ )
186
+ .useRouteBuilder;
187
+
188
+ useAuthenticatedRouteBuilder("GET", "/some-action")
189
+ .handler(
190
+ ResponseContract.ok("some-information.send", userStructure),
191
+ ({ user }, { response }) => response(
192
+ "some-information.send",
193
+ user,
194
+ ),
195
+ );
@@ -0,0 +1,137 @@
1
+ /**
2
+ * @title Définir une politique de gestion de tokens
3
+ *
4
+ * Déclaration d'une politique unique pour créer et vérifier une famille de tokens.
5
+ */
6
+ import { Cipher, createTokenHandler, Signer } from "@duplojs/json-web-token";
7
+ import * as DChrono from "@duplojs/lang/chrono";
8
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
9
+ import * as DEither from "@duplojs/lang/either";
10
+
11
+ // Le `tokenHandler` est la source de vérité d'une famille de tokens :
12
+ // propriétés standard, payload/header applicatifs, signature et chiffrement.
13
+ const tokenHandler = createTokenHandler({
14
+ maxAge: DChrono.createTime(15, "minute"),
15
+ issuer: "my-application",
16
+ audience: "my-api",
17
+
18
+ signer: Signer.createHS256({
19
+ secret: "my-secret",
20
+ }),
21
+
22
+ customPayloadShape: {
23
+ userId: DDataStructure.string(),
24
+ role: DDataStructure.literal("admin"),
25
+ },
26
+
27
+ customHeaderShape: {
28
+ kid: DDataStructure.optional(
29
+ DDataStructure.string(),
30
+ ),
31
+ },
32
+ });
33
+
34
+ // À la création, les structures du handler typent et valident header/payload.
35
+ // | Right<"token-created", string>
36
+ // | Left<"header-encode-error", Error>
37
+ // | Left<"payload-encode-error", Error>;
38
+ const createdTokenResult = await tokenHandler.create(
39
+ {
40
+ userId: "42",
41
+ role: "admin",
42
+ },
43
+ {
44
+ header: {
45
+ kid: "main",
46
+ },
47
+ },
48
+ );
49
+
50
+ if (DEither.isRight(createdTokenResult)) {
51
+ // string
52
+ const token = DEither.unwrapRight(createdTokenResult);
53
+ }
54
+
55
+ // `verify` applique la même politique et restitue header/payload typés.
56
+ // | Left<"token-format", unknown>
57
+ // | Left<"header-json-error", unknown>
58
+ // | Left<"header-decode-error", Error>
59
+ // | Left<"payload-json-error", unknown>
60
+ // | Left<"payload-decode-error", Error>
61
+ // | Left<"signature-invalid", unknown>
62
+ // | Left<"issue-invalid", unknown>
63
+ // | Left<"subject-invalid", unknown>
64
+ // | Left<"audience-invalid", unknown>
65
+ // | Left<"expired", unknown>
66
+ // | Right<
67
+ // "token-verified",
68
+ // {
69
+ // readonly header: {
70
+ // readonly typ: "JWT";
71
+ // readonly alg: "HS256";
72
+ // readonly kid?: string | undefined;
73
+ // };
74
+ // readonly payload: {
75
+ // readonly iss: string;
76
+ // readonly sub: undefined;
77
+ // readonly aud: string;
78
+ // readonly exp: number;
79
+ // readonly iat: number;
80
+ // readonly userId: string;
81
+ // readonly role: "admin";
82
+ // };
83
+ // }
84
+ // >;
85
+ const verifiedTokenResult = await tokenHandler.verify("receive-token");
86
+
87
+ if (DEither.isRight(verifiedTokenResult)) {
88
+ const { payload, header } = DEither.unwrapRight(verifiedTokenResult);
89
+
90
+ const userId = payload.userId;
91
+ const role = payload.role;
92
+ const kid = header.kid;
93
+ }
94
+
95
+ // Avec une factory de `Signer` ou `Cipher`, la configuration est fournie
96
+ // au moment de chaque opération.
97
+ const dynamicTokenHandler = createTokenHandler({
98
+ maxAge: DChrono.createTime(15, "minute"),
99
+
100
+ signer: Signer.createHS256,
101
+ cipher: Cipher.createRSAOAEP,
102
+
103
+ customPayloadShape: {
104
+ userId: DDataStructure.string(),
105
+ },
106
+ });
107
+
108
+ const dynamicTokenResult = await dynamicTokenHandler.create(
109
+ {
110
+ userId: "42",
111
+ },
112
+ {
113
+ signer: {
114
+ secret: "my-secret",
115
+ },
116
+ cipher: {
117
+ privateKey: "private-key",
118
+ publicKey: "public-key",
119
+ },
120
+ },
121
+ );
122
+
123
+ const dynamicVerifiedTokenResult = await dynamicTokenHandler.verify(
124
+ "receive-token",
125
+ {
126
+ signer: {
127
+ secret: "my-secret",
128
+ },
129
+ cipher: {
130
+ privateKey: "private-key",
131
+ publicKey: "public-key",
132
+ },
133
+ },
134
+ );
135
+
136
+ // `Signer` et `Cipher` encapsulent signature et chiffrement.
137
+ // Les implémentations fournies peuvent être remplacées par des mécanismes personnalisés.
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @title Comment partager des ressources
3
+ *
4
+ * Génération du typage des routes et des `DataStructure` pour partager un contrat statique.
5
+ */
6
+ import { createHub, routeStore } from "@duplojs/http";
7
+ import { codeGeneratorPlugin } from "@duplojs/http/codeGenerator";
8
+ import * as DCommon from "@duplojs/lang/common";
9
+
10
+ const hub = createHub({ environment: "BUILD" })
11
+ .register(routeStore.getAll())
12
+ .plug(
13
+ codeGeneratorPlugin({
14
+ // Génère le typage des routes.
15
+ outputFile: DCommon.infer("types.d.ts"),
16
+
17
+ // Génère les `DataStructure` utilisées par les routes.
18
+ generateStructure: {
19
+ outputFolder: DCommon.infer("dataStructures"),
20
+ },
21
+ }),
22
+ );
23
+
24
+ // La génération produit des fichiers autonomes à distribuer aux consommateurs.
25
+ // Les `DataStructure` peuvent être générées depuis les routes ou sélectionnées explicitement.
26
+
27
+ // `codeGeneratorPlugin` exécute sa génération sur le hook `beforeStartServer`.
28
+ // Le `Hub` doit donc disposer d'un connecteur HTTP.
29
+ // En environnement `BUILD`, le cycle s'exécute sans démarrer le serveur HTTP.
@@ -0,0 +1,3 @@
1
+ ## HTTP
2
+
3
+ Interfaces HTTP côté serveur : réception et validation des requêtes, orchestration des traitements et contrats de réponse typés partageables avec les clients.
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @title Capacités de plateforme
3
+ *
4
+ * Utilisation des abstractions communes et des connecteurs pour garder le code
5
+ * applicatif indépendant du runtime.
6
+ */
7
+ import * as DCommon from "@duplojs/lang/common";
8
+ import type * as DPath from "@duplojs/lang/path";
9
+ import * as DSCommon from "@duplojs/server/common";
10
+ import * as DSFile from "@duplojs/server/file";
11
+ import { createHub } from "@duplojs/http";
12
+ import { createHttpServer } from "@duplojs/http/node";
13
+
14
+ // Les capacités proches entre runtimes sont exposées par une même API.
15
+ const resourcePath: string & DPath.Path = DCommon.cast("/resources/config.json");
16
+
17
+ // DEither.Right<file-system-write-json-file, void> | DEither.Left<...> | ...
18
+ const writeJsonResult = await DSFile.writeJsonFile(resourcePath, { version: 1.0 });
19
+
20
+ // DEither.Error<unknown> | DEither.Success<string & DPath.Absolute>
21
+ const currentWorkingDirectoryResult = DSCommon.getCurrentWorkDirectory();
22
+
23
+ // string[]
24
+ const processArguments = DSCommon.getProcessArguments();
25
+
26
+ const hub = createHub({
27
+ environment: "DEV",
28
+ });
29
+
30
+ // Les capacités plus liées au runtime passent par un connecteur.
31
+ // Ici, le hub HTTP reste générique et le démarrage utilise le connecteur Node.
32
+ await createHttpServer(
33
+ hub,
34
+ {
35
+ host: "localhost",
36
+ port: 1506,
37
+ },
38
+ );
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @title Manipuler les variables d'environnement
3
+ *
4
+ * Chargement de sources d'environnement, validation par `DataStructure` et
5
+ * obtention d'une configuration typée.
6
+ */
7
+ import * as DSCommon from "@duplojs/server/common";
8
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
9
+ import * as DCommon from "@duplojs/lang/common";
10
+
11
+ // `environmentVariableOrThrow` est adaptée au démarrage d'une application :
12
+ // une configuration invalide interrompt directement l'initialisation.
13
+ const envs = await DSCommon.environmentVariableOrThrow(
14
+ {
15
+ host: DDataStructure.literal(["0.0.0.0", "127.0.0.1", "localhost"]),
16
+ port: DDataStructure.number([DDataStructure.positive()]),
17
+ name: DDataStructure.string(),
18
+ ENVIRONMENT: DDataStructure.literal(["DEV", "PROD"]),
19
+ DATABASE_URL: DDataStructure.string([DDataStructure.url()]),
20
+ },
21
+ {
22
+ // Fichiers `.env` à lire en plus des variables déjà présentes
23
+ // dans l'environnement du runtime.
24
+ includedEnvironmentFiles: [DCommon.infer(".env"), DCommon.infer(".env.local")],
25
+
26
+ // `false` garde la priorité aux valeurs déjà présentes.
27
+ // `true` autorise les fichiers à remplacer ces valeurs.
28
+ override: false,
29
+
30
+ // `true` renvoie la configuration validée sans réécrire
31
+ // `process.env` ou `Deno.env`.
32
+ justRead: true,
33
+ },
34
+ );
35
+ // {
36
+ // readonly host: "0.0.0.0" | "127.0.0.1" | "localhost";
37
+ // readonly name: string;
38
+ // readonly port: number & Positive;
39
+ // readonly ENVIRONMENT: "DEV" | "PROD";
40
+ // readonly DATABASE_URL: string & Url;
41
+ // }
@@ -0,0 +1,3 @@
1
+ ## Environnement
2
+
3
+ Exploitation des capacités de l’environnement serveur et adaptation aux API des différentes plateformes d’exécution.
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @title Définir une commande
3
+ *
4
+ * Définition des entrées et du traitement d’une commande CLI.
5
+ */
6
+ import * as DSCommand from "@duplojs/server/command";
7
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
8
+
9
+ // Une commande simple peut uniquement déclarer les arguments
10
+ // dont elle a besoin.
11
+ // `exec` interprète les entrées selon leurs déclarations, puis transmet les
12
+ // valeurs typées au callback : les arguments dans `args`, les options dans `options`.
13
+ await DSCommand.exec(
14
+ {
15
+ description: "Display a greeting",
16
+ subjects: [
17
+ DSCommand.createArgument(
18
+ "name",
19
+ DDataStructure.string(),
20
+ ),
21
+ ],
22
+ },
23
+ ({ args: { name } }) => {
24
+ console.log(`Hello ${name}!`);
25
+ },
26
+ );
27
+
28
+ // Une commande peut combiner plusieurs arguments et différentes
29
+ // formes d'options.
30
+ await DSCommand.exec(
31
+ {
32
+ description: "Copy files to a destination",
33
+ options: [
34
+ // Une option classique attend une valeur qui sera
35
+ // interprétée avec sa `DataStructure`.
36
+ DSCommand.createOption(
37
+ "mode",
38
+ DDataStructure.literal([
39
+ "copy",
40
+ "move",
41
+ ]),
42
+ {
43
+ aliases: ["m"],
44
+ description: "Operation to perform",
45
+ },
46
+ ),
47
+ // Une option booléenne représente directement
48
+ // la présence ou non du flag.
49
+ DSCommand.createBooleanOption(
50
+ "force",
51
+ {
52
+ aliases: ["f"],
53
+ description: "Overwrite existing files",
54
+ },
55
+ ),
56
+ // Une option tableau permet de recevoir plusieurs
57
+ // valeurs respectant une même `DataStructure`.
58
+ DSCommand.createArrayOption(
59
+ "include",
60
+ DDataStructure.string(),
61
+ {
62
+ description: "Files to include",
63
+ min: 1,
64
+ max: 5,
65
+ },
66
+ ),
67
+ ],
68
+ subjects: [
69
+ DSCommand.createArgument(
70
+ "source",
71
+ DDataStructure.string(),
72
+ ),
73
+ DSCommand.createArgument(
74
+ "destination",
75
+ DDataStructure.string(),
76
+ ),
77
+ ],
78
+ },
79
+ ({
80
+ args: { source, destination },
81
+ options: { mode, force, include },
82
+ }) => {
83
+ void source;
84
+ void destination;
85
+ void mode;
86
+ void force;
87
+ void include;
88
+ },
89
+ );
90
+
91
+ // Si ce fichier est exposé comme binaire, `DSCommand.exec` lit les arguments
92
+ // transmis par le terminal. Le fichier peut être un `.ts` exécutable lorsque
93
+ // son shebang indique l'interpréteur à utiliser.
94
+ //
95
+ // #!/usr/bin/env -S tsx
96
+ //
97
+ // package.json
98
+ // {
99
+ // "bin": {
100
+ // "my-cli": "./scripts/bin.ts"
101
+ // }
102
+ // }
103
+ //
104
+ // my-cli Jane
105
+ // -> name: "Jane"
106
+ //
107
+ // my-cli ./src ./dist --mode=copy --force --include=a.ts,b.ts
108
+ // -> source: "./src"
109
+ // -> destination: "./dist"
110
+ // -> mode: "copy"
111
+ // -> force: true
112
+ // -> include: ["a.ts", "b.ts"]
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @title Créer des sous-commandes
3
+ *
4
+ * Composition de commandes sous forme d'arbre pour router l'exécution vers
5
+ * une branche spécialisée.
6
+ */
7
+ import * as DSCommand from "@duplojs/server/command";
8
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
9
+
10
+ const installCommand = DSCommand.create(
11
+ "install",
12
+ {
13
+ description: "Install a package",
14
+ options: [
15
+ DSCommand.createBooleanOption(
16
+ "yes",
17
+ {
18
+ aliases: ["y"],
19
+ description: "Answer yes to prompts",
20
+ },
21
+ ),
22
+ ],
23
+ subjects: [
24
+ DSCommand.createArgument(
25
+ "packageName",
26
+ DDataStructure.string(),
27
+ ),
28
+ ],
29
+ },
30
+ ({ options, args: { packageName } }) => {
31
+ console.log(
32
+ `install ${packageName}${options.yes ? " without prompt" : ""}`,
33
+ );
34
+ },
35
+ );
36
+
37
+ // La commande parente référence directement ses sous-commandes
38
+ // dans ses `subjects`. Une commande avec sous-commandes ne déclare pas
39
+ // d'arguments au même niveau.
40
+ await DSCommand.exec(
41
+ {
42
+ description: "Package manager",
43
+ subjects: [installCommand],
44
+ },
45
+ () => {
46
+ console.log("select a package command");
47
+ },
48
+ );
@@ -0,0 +1,3 @@
1
+ ## Créer des commandes
2
+
3
+ Création d’interfaces en ligne de commande (CLI) pour les applications serveur.
@@ -0,0 +1 @@
1
+ # Serveur
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @title Initialiser un client HTTP
3
+ *
4
+ * Création d'un client à partir du contrat statique des routes, configuration
5
+ * globale et conservation du typage des requêtes et réponses exposées par le
6
+ * serveur.
7
+ */
8
+ import { createHttpClient } from "@duplojs/http/client";
9
+
10
+ // Exemple réduit du contrat produit par `codeGeneratorPlugin`.
11
+ export interface Routes {
12
+ method: "GET";
13
+ path: "/hello-world";
14
+ query: {
15
+ name: string;
16
+ };
17
+ responses: {
18
+ code: "422";
19
+ information: "extract-error";
20
+ body?: undefined;
21
+ } | {
22
+ code: "200";
23
+ information: "helloWorld.send";
24
+ body: string;
25
+ };
26
+ }
27
+
28
+ // `baseUrl` suffit pour créer un client.
29
+ // Les autres options configurent le comportement global.
30
+ export const client = createHttpClient<Routes>({
31
+ baseUrl: "http://localhost:1506",
32
+ });
33
+
34
+ declare function getAuthToken(): string | undefined;
35
+
36
+ // Un header par défaut peut être fixe ou recalculé à chaque requête.
37
+ client.addDefaultHeader(
38
+ "authorization",
39
+ () => getAuthToken(),
40
+ );
41
+
42
+ // Le contrat limite les paths, paramètres et réponses disponibles.
43
+ const response = await client
44
+ .get(
45
+ "/hello-world",
46
+ {
47
+ query: {
48
+ name: "William",
49
+ },
50
+ },
51
+ )
52
+ .iWantInformationOrThrow("helloWorld.send");
53
+
54
+ void response.body;
55
+ void response.code;
56
+ void response.information;
57
+ void response.headers;
58
+ void response.raw;
59
+
60
+ // `information` est lue depuis le header `information`, sauf configuration.
61
+ createHttpClient<Routes>({
62
+ baseUrl: "http://localhost:1506",
63
+ informationHeaderKey: "x-information",
64
+ });