@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.
- package/README.md +73 -2
- package/dist/bin/index.d.ts +2 -0
- package/dist/bin/index.mjs +7 -0
- package/dist/bin/install/index.d.ts +2 -0
- package/dist/bin/install/index.mjs +25 -0
- package/dist/bin/install/skill.d.ts +28 -0
- package/dist/bin/install/skill.mjs +58 -0
- package/dist/bin/packagePath.d.ts +2 -0
- package/dist/bin/packagePath.mjs +12 -0
- package/dist/bin/setup/index.d.ts +12 -0
- package/dist/bin/setup/index.mjs +33 -0
- package/dist/bin/setup/instructions.d.ts +8 -0
- package/dist/bin/setup/instructions.mjs +27 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +0 -0
- package/docs/API/10-lang/10-array/10-at.ts +65 -0
- package/docs/API/10-lang/10-array/10-chunk.ts +42 -0
- package/docs/API/10-lang/10-array/10-coalescing.ts +19 -0
- package/docs/API/10-lang/10-array/10-concat.ts +34 -0
- package/docs/API/10-lang/10-array/10-copyWithin.ts +34 -0
- package/docs/API/10-lang/10-array/10-every.ts +25 -0
- package/docs/API/10-lang/10-array/10-fill.ts +34 -0
- package/docs/API/10-lang/10-array/10-fillAll.ts +34 -0
- package/docs/API/10-lang/10-array/10-filter.ts +43 -0
- package/docs/API/10-lang/10-array/10-find.ts +33 -0
- package/docs/API/10-lang/10-array/10-findAndReplace.ts +35 -0
- package/docs/API/10-lang/10-array/10-findAndSpliceDelete.ts +35 -0
- package/docs/API/10-lang/10-array/10-findAndSpliceInsert.ts +35 -0
- package/docs/API/10-lang/10-array/10-findAndSpliceReplace.ts +24 -0
- package/docs/API/10-lang/10-array/10-findDuplicates.ts +19 -0
- package/docs/API/10-lang/10-array/10-findIndex.ts +25 -0
- package/docs/API/10-lang/10-array/10-findLast.ts +33 -0
- package/docs/API/10-lang/10-array/10-findLastIndex.ts +25 -0
- package/docs/API/10-lang/10-array/10-first.ts +21 -0
- package/docs/API/10-lang/10-array/10-flat.ts +22 -0
- package/docs/API/10-lang/10-array/10-flatMap.ts +24 -0
- package/docs/API/10-lang/10-array/10-from.ts +25 -0
- package/docs/API/10-lang/10-array/10-group.ts +27 -0
- package/docs/API/10-lang/10-array/10-groupOutput.ts +30 -0
- package/docs/API/10-lang/10-array/10-includes.ts +24 -0
- package/docs/API/10-lang/10-array/10-indexOf.ts +24 -0
- package/docs/API/10-lang/10-array/10-insert.ts +34 -0
- package/docs/API/10-lang/10-array/10-is.ts +15 -0
- package/docs/API/10-lang/10-array/10-isLastIndex.ts +24 -0
- package/docs/API/10-lang/10-array/10-last.ts +21 -0
- package/docs/API/10-lang/10-array/10-lastIndexOf.ts +24 -0
- package/docs/API/10-lang/10-array/10-length.ts +28 -0
- package/docs/API/10-lang/10-array/10-lengthEqual.ts +39 -0
- package/docs/API/10-lang/10-array/10-map.ts +34 -0
- package/docs/API/10-lang/10-array/10-maxElements.ts +44 -0
- package/docs/API/10-lang/10-array/10-minElements.ts +44 -0
- package/docs/API/10-lang/10-array/10-notIncludes.ts +24 -0
- package/docs/API/10-lang/10-array/10-pop.ts +23 -0
- package/docs/API/10-lang/10-array/10-prepend.ts +34 -0
- package/docs/API/10-lang/10-array/10-push.ts +34 -0
- package/docs/API/10-lang/10-array/10-reduce.ts +28 -0
- package/docs/API/10-lang/10-array/10-reduceFrom.ts +16 -0
- package/docs/API/10-lang/10-array/10-reduceRight.ts +28 -0
- package/docs/API/10-lang/10-array/10-reverse.ts +25 -0
- package/docs/API/10-lang/10-array/10-select.ts +26 -0
- package/docs/API/10-lang/10-array/10-set.ts +24 -0
- package/docs/API/10-lang/10-array/10-shift.ts +23 -0
- package/docs/API/10-lang/10-array/10-slice.ts +24 -0
- package/docs/API/10-lang/10-array/10-some.ts +25 -0
- package/docs/API/10-lang/10-array/10-sort.ts +34 -0
- package/docs/API/10-lang/10-array/10-spliceDelete.ts +34 -0
- package/docs/API/10-lang/10-array/10-spliceInsert.ts +34 -0
- package/docs/API/10-lang/10-array/10-spliceReplace.ts +24 -0
- package/docs/API/10-lang/10-array/10-unshift.ts +34 -0
- package/docs/API/10-lang/10-array/index.llms.md +220 -0
- package/docs/API/10-lang/10-array/index.md +3 -0
- package/docs/API/10-lang/10-chrono/10-addDays.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addHours.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addMilliseconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addMinutes.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addMonths.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addSeconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addTime.ts +38 -0
- package/docs/API/10-lang/10-chrono/10-addWeeks.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addYears.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-applyTimezone.ts +29 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanDate.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualDate.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualTime.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanTime.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-closestTo.ts +48 -0
- package/docs/API/10-lang/10-chrono/10-computeTime.ts +35 -0
- package/docs/API/10-lang/10-chrono/10-createDate.ts +122 -0
- package/docs/API/10-lang/10-chrono/10-createDateOrThrow.ts +39 -0
- package/docs/API/10-lang/10-chrono/10-createTime.ts +86 -0
- package/docs/API/10-lang/10-chrono/10-createTimeOrThrow.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-eachDate.ts +67 -0
- package/docs/API/10-lang/10-chrono/10-equalDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-equalTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-formatDate.ts +43 -0
- package/docs/API/10-lang/10-chrono/10-formatTime.ts +37 -0
- package/docs/API/10-lang/10-chrono/10-getDayOfMonth.ts +37 -0
- package/docs/API/10-lang/10-chrono/10-getDayOfWeek.ts +30 -0
- package/docs/API/10-lang/10-chrono/10-getDayOfYear.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-getDifference.ts +29 -0
- package/docs/API/10-lang/10-chrono/10-getFirstDayOfMonth.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getFirstDayOfWeek.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getHour.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-getLastDayOfMonth.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getLastDayOfWeek.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getMilliseconds.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getMinute.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getMonth.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getSecond.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getTimezoneOffset.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-getWeekOfYear.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getYear.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-isDate.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-isSafeTimeValue.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-isSafeTimestamp.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-isSerializedTheDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-isSerializedTheTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-isTime.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-lessThanDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-lessThanOrEqualDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-lessThanOrEqualTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-lessThanTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-makeSafeTimeValue.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-makeSafeTimestamp.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-maxDate.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-maxTime.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-minDate.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-minTime.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-now.ts +13 -0
- package/docs/API/10-lang/10-chrono/10-round.ts +41 -0
- package/docs/API/10-lang/10-chrono/10-serialize.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-sortDates.ts +32 -0
- package/docs/API/10-lang/10-chrono/10-sortTimes.ts +31 -0
- package/docs/API/10-lang/10-chrono/10-subtractDays.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractHours.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractMilliseconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractMinutes.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractMonths.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractSeconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractTime.ts +38 -0
- package/docs/API/10-lang/10-chrono/10-subtractWeeks.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractYears.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-toDateISOString.ts +17 -0
- package/docs/API/10-lang/10-chrono/10-toNative.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-toTimeValue.ts +17 -0
- package/docs/API/10-lang/10-chrono/10-toTimestamp.ts +17 -0
- package/docs/API/10-lang/10-chrono/10-today.ts +13 -0
- package/docs/API/10-lang/10-chrono/10-tomorrow.ts +13 -0
- package/docs/API/10-lang/10-chrono/10-yesterday.ts +13 -0
- package/docs/API/10-lang/10-chrono/index.llms.md +332 -0
- package/docs/API/10-lang/10-chrono/index.md +3 -0
- package/docs/API/10-lang/10-common/10-and.ts +45 -0
- package/docs/API/10-lang/10-common/10-asserts.ts +13 -0
- package/docs/API/10-lang/10-common/10-asyncInnerPipe.ts +23 -0
- package/docs/API/10-lang/10-common/10-asyncLoop.ts +25 -0
- package/docs/API/10-lang/10-common/10-asyncPipe.ts +21 -0
- package/docs/API/10-lang/10-common/10-callThen.ts +22 -0
- package/docs/API/10-lang/10-common/10-cast.ts +16 -0
- package/docs/API/10-lang/10-common/10-clone.ts +12 -0
- package/docs/API/10-lang/10-common/10-createAsyncRetry.ts +34 -0
- package/docs/API/10-lang/10-common/10-createBuilder.ts +19 -0
- package/docs/API/10-lang/10-common/10-createEnum.ts +25 -0
- package/docs/API/10-lang/10-common/10-createExternalPromise.ts +13 -0
- package/docs/API/10-lang/10-common/10-createFormData.ts +16 -0
- package/docs/API/10-lang/10-common/10-createInterpolation.ts +12 -0
- package/docs/API/10-lang/10-common/10-createQueue.ts +16 -0
- package/docs/API/10-lang/10-common/10-createTransformer.ts +16 -0
- package/docs/API/10-lang/10-common/10-detachObjectMethod.ts +20 -0
- package/docs/API/10-lang/10-common/10-equal.ts +31 -0
- package/docs/API/10-lang/10-common/10-escapeRegExp.ts +11 -0
- package/docs/API/10-lang/10-common/10-falsy.ts +12 -0
- package/docs/API/10-lang/10-common/10-forward.ts +11 -0
- package/docs/API/10-lang/10-common/10-forwardAsserts.ts +17 -0
- package/docs/API/10-lang/10-common/10-forwardLog.ts +11 -0
- package/docs/API/10-lang/10-common/10-infer.ts +16 -0
- package/docs/API/10-lang/10-common/10-innerPipe.ts +23 -0
- package/docs/API/10-lang/10-common/10-instanceOf.ts +23 -0
- package/docs/API/10-lang/10-common/10-isType.ts +29 -0
- package/docs/API/10-lang/10-common/10-justExec.ts +28 -0
- package/docs/API/10-lang/10-common/10-justReturn.ts +19 -0
- package/docs/API/10-lang/10-common/10-loop.ts +20 -0
- package/docs/API/10-lang/10-common/10-memo.ts +12 -0
- package/docs/API/10-lang/10-common/10-memoObject.ts +11 -0
- package/docs/API/10-lang/10-common/10-memoPromise.ts +16 -0
- package/docs/API/10-lang/10-common/10-or.ts +29 -0
- package/docs/API/10-lang/10-common/10-pipe.ts +21 -0
- package/docs/API/10-lang/10-common/10-pipeCall.ts +20 -0
- package/docs/API/10-lang/10-common/10-prepareAsyncPipe.ts +20 -0
- package/docs/API/10-lang/10-common/10-preparePipe.ts +20 -0
- package/docs/API/10-lang/10-common/10-promiseAll.ts +16 -0
- package/docs/API/10-lang/10-common/10-promiseObject.ts +22 -0
- package/docs/API/10-lang/10-common/10-removeConstraint.ts +13 -0
- package/docs/API/10-lang/10-common/10-shameOnYou.ts +20 -0
- package/docs/API/10-lang/10-common/10-simpleClone.ts +12 -0
- package/docs/API/10-lang/10-common/10-stringToBytes.ts +16 -0
- package/docs/API/10-lang/10-common/10-stringToMillisecond.ts +17 -0
- package/docs/API/10-lang/10-common/10-timeout.ts +11 -0
- package/docs/API/10-lang/10-common/10-toCurriedPredicate.ts +28 -0
- package/docs/API/10-lang/10-common/10-toJSON.ts +15 -0
- package/docs/API/10-lang/10-common/10-toNative.ts +15 -0
- package/docs/API/10-lang/10-common/10-toRegExp.ts +17 -0
- package/docs/API/10-lang/10-common/10-transformer.ts +21 -0
- package/docs/API/10-lang/10-common/10-truthy.ts +12 -0
- package/docs/API/10-lang/10-common/10-useAsyncRetry.ts +31 -0
- package/docs/API/10-lang/10-common/10-when.ts +27 -0
- package/docs/API/10-lang/10-common/10-whenElse.ts +28 -0
- package/docs/API/10-lang/10-common/10-whenNot.ts +26 -0
- package/docs/API/10-lang/10-common/index.llms.md +228 -0
- package/docs/API/10-lang/10-common/index.md +3 -0
- package/docs/API/10-lang/10-dataStructure/10-absolutePath.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-allowedCharacters.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-array.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-arrayLengthEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-betweenThan.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-betweenThanOrEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-bigint.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-boolean.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-createCodec.ts +45 -0
- package/docs/API/10-lang/10-dataStructure/10-createCodecs.ts +134 -0
- package/docs/API/10-lang/10-dataStructure/10-createErrorInterpreter.ts +74 -0
- package/docs/API/10-lang/10-dataStructure/10-date.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-email.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-endsWith.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-even.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-extend.ts +27 -0
- package/docs/API/10-lang/10-dataStructure/10-greaterThan.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-greaterThanOrEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-include.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-integer.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-isNullStructure.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-isNullable.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-isOptional.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-isUndefinedStructure.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-lazy.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-lessThan.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-lessThanOrEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-literal.ts +19 -0
- package/docs/API/10-lang/10-dataStructure/10-maxCharacters.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-maxElements.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-minCharacters.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-minElements.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-multipleOf.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-negative.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-notEmpty.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-notZero.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-null.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-nullable.ts +19 -0
- package/docs/API/10-lang/10-dataStructure/10-number.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-numberInString.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-object.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-odd.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-optional.ts +19 -0
- package/docs/API/10-lang/10-dataStructure/10-partial.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-path.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-positive.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-record.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-refine.ts +27 -0
- package/docs/API/10-lang/10-dataStructure/10-regex.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-required.ts +21 -0
- package/docs/API/10-lang/10-dataStructure/10-safe.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-segmentPath.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-startsWith.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-strictNegative.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-strictPositive.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-string.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-stringLengthEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-time.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-trimmed.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-typeStructureIdentifier.ts +33 -0
- package/docs/API/10-lang/10-dataStructure/10-undefined.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-union.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-unwrapLazy.ts +17 -0
- package/docs/API/10-lang/10-dataStructure/10-url.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-uuid.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/index.llms.md +264 -0
- package/docs/API/10-lang/10-dataStructure/index.md +3 -0
- package/docs/API/10-lang/10-either/10-asyncGroup.ts +44 -0
- package/docs/API/10-lang/10-either/10-asyncSafeCallback.ts +23 -0
- package/docs/API/10-lang/10-either/10-error.ts +12 -0
- package/docs/API/10-lang/10-either/10-expect.ts +13 -0
- package/docs/API/10-lang/10-either/10-fail.ts +12 -0
- package/docs/API/10-lang/10-either/10-forwardAssertsSelection.ts +28 -0
- package/docs/API/10-lang/10-either/10-group.ts +58 -0
- package/docs/API/10-lang/10-either/10-hasInformation.ts +24 -0
- package/docs/API/10-lang/10-either/10-isLeft.ts +16 -0
- package/docs/API/10-lang/10-either/10-isRight.ts +16 -0
- package/docs/API/10-lang/10-either/10-isSelected.ts +29 -0
- package/docs/API/10-lang/10-either/10-keepAsRightByInformation.ts +29 -0
- package/docs/API/10-lang/10-either/10-keepAsRightSelection.ts +23 -0
- package/docs/API/10-lang/10-either/10-left.ts +13 -0
- package/docs/API/10-lang/10-either/10-matchInformation.ts +26 -0
- package/docs/API/10-lang/10-either/10-matchInformationOtherwise.ts +27 -0
- package/docs/API/10-lang/10-either/10-none.ts +12 -0
- package/docs/API/10-lang/10-either/10-ok.ts +12 -0
- package/docs/API/10-lang/10-either/10-result.ts +18 -0
- package/docs/API/10-lang/10-either/10-rewriteInformation.ts +24 -0
- package/docs/API/10-lang/10-either/10-right.ts +13 -0
- package/docs/API/10-lang/10-either/10-rightAsyncPipe.ts +69 -0
- package/docs/API/10-lang/10-either/10-rightPipe.ts +72 -0
- package/docs/API/10-lang/10-either/10-safeCallback.ts +29 -0
- package/docs/API/10-lang/10-either/10-some.ts +12 -0
- package/docs/API/10-lang/10-either/10-success.ts +12 -0
- package/docs/API/10-lang/10-either/10-toMaybe.ts +53 -0
- package/docs/API/10-lang/10-either/10-unwrapByInformation.ts +20 -0
- package/docs/API/10-lang/10-either/10-unwrapByInformationOrThrow.ts +19 -0
- package/docs/API/10-lang/10-either/10-unwrapLeft.ts +14 -0
- package/docs/API/10-lang/10-either/10-unwrapLeftOrThrow.ts +17 -0
- package/docs/API/10-lang/10-either/10-unwrapOr.ts +17 -0
- package/docs/API/10-lang/10-either/10-unwrapOtherwise.ts +20 -0
- package/docs/API/10-lang/10-either/10-unwrapRight.ts +14 -0
- package/docs/API/10-lang/10-either/10-unwrapRightOrThrow.ts +17 -0
- package/docs/API/10-lang/10-either/10-unwrapSelection.ts +26 -0
- package/docs/API/10-lang/10-either/10-unwrapSelectionOrThrow.ts +19 -0
- package/docs/API/10-lang/10-either/10-whenHasInformation.ts +35 -0
- package/docs/API/10-lang/10-either/10-whenHasInformationOtherwise.ts +29 -0
- package/docs/API/10-lang/10-either/10-whenIsLeft.ts +20 -0
- package/docs/API/10-lang/10-either/10-whenIsLeftOtherwise.ts +27 -0
- package/docs/API/10-lang/10-either/10-whenIsRight.ts +20 -0
- package/docs/API/10-lang/10-either/10-whenIsRightOtherwise.ts +26 -0
- package/docs/API/10-lang/10-either/10-whenIsSelected.ts +33 -0
- package/docs/API/10-lang/10-either/10-whenIsSelectedOtherwise.ts +35 -0
- package/docs/API/10-lang/10-either/index.llms.md +184 -0
- package/docs/API/10-lang/10-either/index.md +3 -0
- package/docs/API/10-lang/10-generator/10-asyncChunk.ts +55 -0
- package/docs/API/10-lang/10-generator/10-asyncConcat.ts +46 -0
- package/docs/API/10-lang/10-generator/10-asyncFilter.ts +41 -0
- package/docs/API/10-lang/10-generator/10-asyncFlat.ts +37 -0
- package/docs/API/10-lang/10-generator/10-asyncGroup.ts +65 -0
- package/docs/API/10-lang/10-generator/10-asyncLoop.ts +59 -0
- package/docs/API/10-lang/10-generator/10-asyncMap.ts +48 -0
- package/docs/API/10-lang/10-generator/10-asyncReduce.ts +63 -0
- package/docs/API/10-lang/10-generator/10-chunk.ts +44 -0
- package/docs/API/10-lang/10-generator/10-concat.ts +37 -0
- package/docs/API/10-lang/10-generator/10-createExternalAsyncGenerator.ts +29 -0
- package/docs/API/10-lang/10-generator/10-execute.ts +44 -0
- package/docs/API/10-lang/10-generator/10-filter.ts +35 -0
- package/docs/API/10-lang/10-generator/10-flat.ts +25 -0
- package/docs/API/10-lang/10-generator/10-group.ts +44 -0
- package/docs/API/10-lang/10-generator/10-groupOutput.ts +48 -0
- package/docs/API/10-lang/10-generator/10-loop.ts +55 -0
- package/docs/API/10-lang/10-generator/10-map.ts +35 -0
- package/docs/API/10-lang/10-generator/10-reduce.ts +51 -0
- package/docs/API/10-lang/10-generator/10-reduceFrom.ts +30 -0
- package/docs/API/10-lang/10-generator/index.llms.md +84 -0
- package/docs/API/10-lang/10-generator/index.md +3 -0
- package/docs/API/10-lang/index.md +3 -0
- package/docs/API/index.md +3 -0
- package/docs/API.llms.md +31 -0
- package/docs/concepts/01-fundamental/01-constraint/01-use.ts +22 -0
- package/docs/concepts/01-fundamental/01-constraint/10-built-in-constraint.ts +37 -0
- package/docs/concepts/01-fundamental/01-constraint/20-manipulation.ts +38 -0
- package/docs/concepts/01-fundamental/01-constraint/30-cast.ts +62 -0
- package/docs/concepts/01-fundamental/01-constraint/40-custom-constraint.ts +45 -0
- package/docs/concepts/01-fundamental/01-constraint/index.md +3 -0
- package/docs/concepts/01-fundamental/02-currying/01-use.ts +33 -0
- package/docs/concepts/01-fundamental/02-currying/10-built-in-function.ts +178 -0
- package/docs/concepts/01-fundamental/02-currying/20-inner-pipe.ts +39 -0
- package/docs/concepts/01-fundamental/02-currying/30-async-pipe.ts +42 -0
- package/docs/concepts/01-fundamental/02-currying/index.md +3 -0
- package/docs/concepts/01-fundamental/03-either/01-use.ts +21 -0
- package/docs/concepts/01-fundamental/03-either/10-discrimination.ts +79 -0
- package/docs/concepts/01-fundamental/03-either/20-exhaustive-handling.ts +73 -0
- package/docs/concepts/01-fundamental/03-either/30-composition.ts +72 -0
- package/docs/concepts/01-fundamental/03-either/40-result-adaptation.ts +40 -0
- package/docs/concepts/01-fundamental/03-either/50-external-results.ts +59 -0
- package/docs/concepts/01-fundamental/03-either/60-contextual-state.ts +40 -0
- package/docs/concepts/01-fundamental/03-either/index.md +3 -0
- package/docs/concepts/01-fundamental/04-data-structure/01-use.ts +22 -0
- package/docs/concepts/01-fundamental/04-data-structure/10-structure.ts +193 -0
- package/docs/concepts/01-fundamental/04-data-structure/20-constraint.ts +78 -0
- package/docs/concepts/01-fundamental/04-data-structure/30-validation.ts +100 -0
- package/docs/concepts/01-fundamental/04-data-structure/40-codecs.ts +151 -0
- package/docs/concepts/01-fundamental/04-data-structure/50-recursive.ts +48 -0
- package/docs/concepts/01-fundamental/04-data-structure/60-interpret-error.ts +123 -0
- package/docs/concepts/01-fundamental/04-data-structure/index.md +3 -0
- package/docs/concepts/01-fundamental/05-chrono/01-use.ts +14 -0
- package/docs/concepts/01-fundamental/05-chrono/10-creation.ts +59 -0
- package/docs/concepts/01-fundamental/05-chrono/20-manipulation.ts +94 -0
- package/docs/concepts/01-fundamental/05-chrono/30-serialized.ts +73 -0
- package/docs/concepts/01-fundamental/05-chrono/40-timezone.ts +81 -0
- package/docs/concepts/01-fundamental/05-chrono/index.md +3 -0
- package/docs/concepts/01-fundamental/06-modeling/10-new-type.ts +42 -0
- package/docs/concepts/01-fundamental/06-modeling/20-entity.ts +204 -0
- package/docs/concepts/01-fundamental/06-modeling/30-tagged-object.ts +181 -0
- package/docs/concepts/01-fundamental/06-modeling/40-entity-lifecycle.ts +275 -0
- package/docs/concepts/01-fundamental/06-modeling/50-evidence.ts +94 -0
- package/docs/concepts/01-fundamental/06-modeling/60-signed-function.ts +26 -0
- package/docs/concepts/01-fundamental/06-modeling/index.md +3 -0
- package/docs/concepts/01-fundamental/07-discrimination/10-entity.ts +104 -0
- package/docs/concepts/01-fundamental/07-discrimination/20-fact.ts +142 -0
- package/docs/concepts/01-fundamental/07-discrimination/30-tagged-object.ts +105 -0
- package/docs/concepts/01-fundamental/07-discrimination/40-error.ts +57 -0
- package/docs/concepts/01-fundamental/07-discrimination/50-literal.ts +87 -0
- package/docs/concepts/01-fundamental/07-discrimination/60-shape.ts +152 -0
- package/docs/concepts/01-fundamental/07-discrimination/70-predicate.ts +89 -0
- package/docs/concepts/01-fundamental/07-discrimination/index.md +3 -0
- package/docs/concepts/01-fundamental/index.md +1 -0
- package/docs/concepts/02-server/10-file/10-manipulation.ts +40 -0
- package/docs/concepts/02-server/10-file/20-path.ts +56 -0
- package/docs/concepts/02-server/10-file/index.md +3 -0
- package/docs/concepts/02-server/20-http/10-init.ts +31 -0
- package/docs/concepts/02-server/20-http/20-route.ts +174 -0
- package/docs/concepts/02-server/20-http/30-routine.ts +195 -0
- package/docs/concepts/02-server/20-http/40-jwt.ts +137 -0
- package/docs/concepts/02-server/20-http/50-codegen.ts +29 -0
- package/docs/concepts/02-server/20-http/index.md +3 -0
- package/docs/concepts/02-server/30-environment/10-platform.ts +38 -0
- package/docs/concepts/02-server/30-environment/20-variable.ts +41 -0
- package/docs/concepts/02-server/30-environment/index.md +3 -0
- package/docs/concepts/02-server/40-command/10-use.ts +112 -0
- package/docs/concepts/02-server/40-command/20-sub-command.ts +48 -0
- package/docs/concepts/02-server/40-command/index.md +3 -0
- package/docs/concepts/02-server/index.md +1 -0
- package/docs/concepts/03-client/10-http/10-init.ts +64 -0
- package/docs/concepts/03-client/10-http/20-request.ts +244 -0
- package/docs/concepts/03-client/10-http/30-hook.ts +139 -0
- package/docs/concepts/03-client/10-http/index.md +3 -0
- package/docs/concepts/03-client/20-form/10-init.ts +95 -0
- package/docs/concepts/03-client/20-form/20-input.ts +96 -0
- package/docs/concepts/03-client/20-form/30-layout.ts +160 -0
- package/docs/concepts/03-client/20-form/40-template.ts +89 -0
- package/docs/concepts/03-client/20-form/index.md +3 -0
- package/docs/concepts/03-client/index.md +1 -0
- package/docs/concepts/04-tests/01-unit/10-either.ts +136 -0
- package/docs/concepts/04-tests/01-unit/20-server-mocking.ts +53 -0
- package/docs/concepts/04-tests/01-unit/index.md +3 -0
- package/docs/concepts/04-tests/02-e2e/10-init.ts +80 -0
- package/docs/concepts/04-tests/02-e2e/20-architecture.ts +76 -0
- package/docs/concepts/04-tests/02-e2e/30-testing.ts +90 -0
- package/docs/concepts/04-tests/02-e2e/index.md +3 -0
- package/docs/concepts/04-tests/index.md +1 -0
- package/docs/concepts/05-type-driven-design/01-architecture/10-boundaries.md +41 -0
- package/docs/concepts/05-type-driven-design/01-architecture/index.md +3 -0
- package/docs/concepts/05-type-driven-design/02-domains/10-entities.md +58 -0
- package/docs/concepts/05-type-driven-design/02-domains/20-aggregates.md +49 -0
- package/docs/concepts/05-type-driven-design/02-domains/30-repositories.md +41 -0
- package/docs/concepts/05-type-driven-design/02-domains/index.md +3 -0
- package/docs/concepts/05-type-driven-design/03-applications/10-use-case.md +69 -0
- package/docs/concepts/05-type-driven-design/03-applications/index.md +3 -0
- package/docs/concepts/05-type-driven-design/04-infrastructure/10-implementation.md +56 -0
- package/docs/concepts/05-type-driven-design/04-infrastructure/index.md +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/book.ts +10 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/client.ts +10 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/email.ts +7 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientGiveBackBook.ts +27 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientRentBook.ts +30 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/createBook.ts +32 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientGiveBackBook.ts +15 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientRentBook.ts +16 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/createBook.ts +21 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/create.ts +34 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/rental.ts +31 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/returnBook.ts +30 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/index.ts +87 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/giveBackBook.ts +33 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/rentBook.ts +32 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/index.ts +82 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/book.ts +16 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/client.ts +7 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/email.ts +12 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/clientRentBook.ts +62 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/index.ts +11 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/bookExist.ts +19 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/clientExist.ts +19 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/main.ts +19 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientGiveBackBook.ts +37 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientRentBook.ts +50 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/book.ts +25 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/client.ts +7 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/email.ts +10 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/useCases/index.ts +12 -0
- package/docs/concepts/05-type-driven-design/index.md +3 -0
- package/docs/concepts.llms.md +475 -0
- package/instructions/coding-conventions.md +8 -0
- package/package.json +96 -3
- package/skills/command/SKILL.md +63 -0
- package/skills/command/references/examples/cli.ts +22 -0
- package/skills/command/references/examples/options-only.ts +27 -0
- package/skills/command/references/examples/preview-command.ts +57 -0
- package/skills/command/references/execution.md +31 -0
- package/skills/command/references/inputs.md +27 -0
- package/skills/fundamental/SKILL.md +80 -0
- package/skills/fundamental/references/composition.md +35 -0
- package/skills/fundamental/references/constraints-and-validation.md +61 -0
- package/skills/fundamental/references/examples/async-composition.ts +15 -0
- package/skills/fundamental/references/examples/cast.ts +18 -0
- package/skills/fundamental/references/examples/composition.ts +40 -0
- package/skills/fundamental/references/examples/environment-initialization.ts +19 -0
- package/skills/fundamental/references/examples/error-propagation.ts +24 -0
- package/skills/fundamental/references/examples/generic-inference.ts +31 -0
- package/skills/fundamental/references/examples/guaranteed-array-access.ts +31 -0
- package/skills/fundamental/references/examples/independent-inputs.ts +18 -0
- package/skills/fundamental/references/examples/infer.ts +21 -0
- package/skills/fundamental/references/examples/input-validation.ts +37 -0
- package/skills/fundamental/references/examples/safe-declarations.ts +25 -0
- package/skills/fundamental/references/results-and-errors.md +59 -0
- package/skills/http-client/SKILL.md +50 -0
- package/skills/http-client/references/configuration.md +9 -0
- package/skills/http-client/references/examples/client-expectations.ts +84 -0
- package/skills/http-client/references/examples/client-streams.ts +74 -0
- package/skills/http-client/references/examples/external-client.ts +78 -0
- package/skills/http-client/references/hooks.md +7 -0
- package/skills/http-client/references/responses.md +39 -0
- package/skills/http-client/references/streams.md +10 -0
- package/skills/http-server/SKILL.md +66 -0
- package/skills/http-server/references/code-generation.md +31 -0
- package/skills/http-server/references/examples/authentication.ts +42 -0
- package/skills/http-server/references/examples/contracts.ts +19 -0
- package/skills/http-server/references/examples/generate-sdk.ts +36 -0
- package/skills/http-server/references/examples/initialize.ts +29 -0
- package/skills/http-server/references/examples/minimal-route.ts +18 -0
- package/skills/http-server/references/examples/protected-route.ts +31 -0
- package/skills/http-server/references/examples/rename-user-route.ts +54 -0
- package/skills/http-server/references/examples/user-checker.ts +26 -0
- package/skills/http-server/references/examples/user-route.ts +38 -0
- package/skills/http-server/references/initialization.md +33 -0
- package/skills/http-server/references/reusable-flows.md +40 -0
- package/skills/http-server/references/routes-and-floor.md +38 -0
- package/skills/modeling/SKILL.md +76 -0
- package/skills/modeling/references/domain.md +33 -0
- package/skills/modeling/references/orchestration.md +36 -0
- package/skills/server/SKILL.md +55 -0
- package/skills/server/references/environment.md +30 -0
- package/skills/server/references/examples/environment.ts +41 -0
- package/skills/server/references/examples/file-structure.ts +26 -0
- package/skills/server/references/examples/files.ts +52 -0
- package/skills/server/references/files.md +38 -0
- package/skills/server/references/structures.md +15 -0
- package/skills/test/SKILL.md +70 -0
- package/skills/test/references/examples/results.ts +95 -0
- package/skills/test/references/examples/server.ts +59 -0
- package/skills/test/references/results.md +21 -0
- 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,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,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 @@
|
|
|
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
|
+
});
|