@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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Preuves de passage par une opération.
|
|
3
|
+
*
|
|
4
|
+
* Exiger dans les types qu’une valeur soit passée par un traitement préalable.
|
|
5
|
+
*/
|
|
6
|
+
import * as DModeling from "@duplojs/lang/modeling";
|
|
7
|
+
import * as DInvocation from "@duplojs/lang/invocation";
|
|
8
|
+
import * as DDataStructure from "@duplojs/lang/dataStructure";
|
|
9
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
10
|
+
import * as DEither from "@duplojs/lang/either";
|
|
11
|
+
|
|
12
|
+
// Certaines règles portent sur le parcours d’une valeur plutôt que sur sa seule forme.
|
|
13
|
+
const Id = DModeling.createNewType(
|
|
14
|
+
"Id",
|
|
15
|
+
DDataStructure.string(),
|
|
16
|
+
[DDataStructure.uuid()],
|
|
17
|
+
);
|
|
18
|
+
type Id = DDataStructure.StructureValue<typeof Id>;
|
|
19
|
+
|
|
20
|
+
interface Entity {
|
|
21
|
+
id: Id;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface IdGenerator {
|
|
25
|
+
// Evidence représente uniquement dans le typage la preuve produite par une opération.
|
|
26
|
+
// Le résultat ne porte pas seulement un Id, mais aussi la preuve "generated".
|
|
27
|
+
generateId(): Id & DInvocation.Evidence<"generated">;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const implementation: IdGenerator = {
|
|
31
|
+
generateId: () => DCommon.pipe(
|
|
32
|
+
"550e8400-e29b-41d4-a716-446655440000",
|
|
33
|
+
Id.map,
|
|
34
|
+
DEither.unwrapRightOrThrow,
|
|
35
|
+
|
|
36
|
+
// appendEvidence restitue la même valeur, sans propriété ni contrôle runtime.
|
|
37
|
+
// L'implémentation doit donc avoir établi la garantie avant d'ajouter la preuve.
|
|
38
|
+
// Cela fonctionne aussi avec les valeurs primitives.
|
|
39
|
+
DInvocation.appendEvidence("generated"),
|
|
40
|
+
),
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// GetEvidenceResult extrait du retour d'une méthode la valeur portant l'évidence demandée.
|
|
44
|
+
// createEntity exige ainsi l'Id avec la preuve "generated" du contrat de generateId.
|
|
45
|
+
// Deux méthodes annonçant la même valeur et la même évidence restent compatibles :
|
|
46
|
+
// pour distinguer leurs provenances, utiliser des noms d'évidence distincts.
|
|
47
|
+
declare function createEntity(
|
|
48
|
+
params: {
|
|
49
|
+
id: DInvocation.GetEvidenceResult<IdGenerator["generateId"], "generated">;
|
|
50
|
+
},
|
|
51
|
+
): Entity;
|
|
52
|
+
|
|
53
|
+
// La relation entre génération et création est exprimée dans la signature.
|
|
54
|
+
createEntity({ id: implementation.generateId() });
|
|
55
|
+
|
|
56
|
+
declare const idWithoutEvidence: Id;
|
|
57
|
+
// @ts-expect-error Un Id seul ne prouve pas le passage par la génération attendue.
|
|
58
|
+
createEntity({ id: idWithoutEvidence });
|
|
59
|
+
|
|
60
|
+
// Quand l'opération possède plusieurs issues, EvidenceResult associe chaque information
|
|
61
|
+
// à une valeur portant l'évidence du même nom. Comme appendEvidence, cette construction
|
|
62
|
+
// ne réalise pas la vérification : checkId doit réellement consulter le registre.
|
|
63
|
+
interface Registry {
|
|
64
|
+
checkId(id: Id): Promise<
|
|
65
|
+
| DInvocation.EvidenceResult<"id-available", Id>
|
|
66
|
+
| DInvocation.EvidenceResult<"id-already-registered", Id>
|
|
67
|
+
>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// GetEvidenceResult sélectionne ici une seule issue, même à travers la promesse et l'Either.
|
|
71
|
+
type AvailableId = DInvocation.GetEvidenceResult<Registry["checkId"], "id-available">;
|
|
72
|
+
type _CheckAvailableId = DCommon.ExpectType<AvailableId, Id & DInvocation.Evidence<"id-available">, "strict">;
|
|
73
|
+
|
|
74
|
+
declare function createRegisteredEntity(id: AvailableId): Entity;
|
|
75
|
+
|
|
76
|
+
// La couche appelante discrimine le résultat pour obtenir cette preuve.
|
|
77
|
+
// La disponibilité autorise la création ; l'autre issue devient un Left,
|
|
78
|
+
// propagé par rightAsyncPipe sans appeler createRegisteredEntity.
|
|
79
|
+
function registerEntity(registry: Registry, id: Id) {
|
|
80
|
+
return DEither.rightAsyncPipe(
|
|
81
|
+
DCommon.asyncPipe(
|
|
82
|
+
registry.checkId(id),
|
|
83
|
+
DEither.keepAsRightByInformation("id-available"),
|
|
84
|
+
),
|
|
85
|
+
createRegisteredEntity,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
declare const alreadyRegisteredId: DInvocation.GetEvidenceResult<Registry["checkId"], "id-already-registered">;
|
|
90
|
+
// @ts-expect-error Le résultat d'une autre branche ne prouve pas la disponibilité.
|
|
91
|
+
createRegisteredEntity(alreadyRegisteredId);
|
|
92
|
+
|
|
93
|
+
// @ts-expect-error La méthode ne produit pas d'évidence nommée generated.
|
|
94
|
+
type UnsupportedEvidence = DInvocation.GetEvidenceResult<Registry["checkId"], "generated">;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Identité des fonctions dans les dépendances.
|
|
3
|
+
*
|
|
4
|
+
* Exiger une fonction identifiée au-delà de sa seule signature TypeScript.
|
|
5
|
+
*/
|
|
6
|
+
import * as DInvocation from "@duplojs/lang/invocation";
|
|
7
|
+
|
|
8
|
+
interface ActionService {
|
|
9
|
+
// Deux fonctions () => void ne sont pas nécessairement interchangeables dans le modèle.
|
|
10
|
+
// SignedFunction ajoute à cette signature l’identité de l’opération attendue.
|
|
11
|
+
someAction: DInvocation.SignedFunction<"someAction", () => void>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const implementation: ActionService = {
|
|
15
|
+
// signedFunction associe l’identité à l’implémentation.
|
|
16
|
+
// Cette information existe au runtime sur la fonction, contrairement à une Evidence.
|
|
17
|
+
someAction: DInvocation.signedFunction("someAction", () => void 0),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// La dépendance exige précisément l’opération identifiée comme someAction.
|
|
21
|
+
declare function otherFunction(someFunction: ActionService["someAction"]): void;
|
|
22
|
+
|
|
23
|
+
otherFunction(implementation.someAction);
|
|
24
|
+
|
|
25
|
+
// @ts-expect-error Une même signature d’appel ne suffit pas sans l’identité attendue.
|
|
26
|
+
otherFunction(() => void 0);
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Discrimination des entités par identité.
|
|
3
|
+
*
|
|
4
|
+
* Sélection exhaustive ou partielle selon le nom métier, avec typage précis des branches.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import type * as DModeling from "@duplojs/lang/modeling";
|
|
8
|
+
import * as DPattern from "@duplojs/lang/pattern";
|
|
9
|
+
|
|
10
|
+
// Une Entity porte une identité associée à son nom. Le matcher utilise cette identité,
|
|
11
|
+
// sans devoir déduire le cas à partir de la forme de l’objet ou de ses propriétés.
|
|
12
|
+
interface User extends DModeling.Entity<"User"> {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly name: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface Admin extends DModeling.Entity<"Admin"> {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly permissions: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type Entity =
|
|
23
|
+
| User
|
|
24
|
+
| Admin;
|
|
25
|
+
|
|
26
|
+
declare const entity: Entity;
|
|
27
|
+
|
|
28
|
+
// `matchWithEntity` discrimine une union à partir du nom de chaque `Entity`.
|
|
29
|
+
//
|
|
30
|
+
// La sélection est exhaustive : chaque entité présente dans l'union
|
|
31
|
+
// doit posséder un handler.
|
|
32
|
+
//
|
|
33
|
+
// Chaque callback reçoit directement le type précis correspondant
|
|
34
|
+
// au nom de l'entité.
|
|
35
|
+
|
|
36
|
+
// string | number
|
|
37
|
+
const matchedEntity = DPattern.matchWithEntity(
|
|
38
|
+
entity,
|
|
39
|
+
{
|
|
40
|
+
// User
|
|
41
|
+
User: (user) => user.name,
|
|
42
|
+
|
|
43
|
+
// Admin
|
|
44
|
+
Admin: (admin) => admin.permissions.length,
|
|
45
|
+
},
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
// La sélection exhaustive crée un point d'ancrage dans le typage.
|
|
49
|
+
//
|
|
50
|
+
// Si une nouvelle `Entity` est ajoutée à l'union, le matcher devra
|
|
51
|
+
// également définir son traitement.
|
|
52
|
+
//
|
|
53
|
+
// À l'inverse, une clé ne correspondant à aucune entité de l'union
|
|
54
|
+
// ne peut pas être ajoutée au matcher.
|
|
55
|
+
|
|
56
|
+
// `matchWithEntity` possède également une forme curried afin d'être
|
|
57
|
+
// directement utilisée dans un pipe.
|
|
58
|
+
|
|
59
|
+
// string | number
|
|
60
|
+
const matchedEntityInPipe = DCommon.pipe(
|
|
61
|
+
entity,
|
|
62
|
+
DPattern.matchWithEntity({
|
|
63
|
+
// User
|
|
64
|
+
User: (user) => user.name,
|
|
65
|
+
|
|
66
|
+
// Admin
|
|
67
|
+
Admin: (admin) => admin.permissions.length,
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// `matchWithEntityOtherwise` permet de ne sélectionner explicitement
|
|
72
|
+
// qu'une partie des entités.
|
|
73
|
+
//
|
|
74
|
+
// `otherwise` reçoit uniquement les entités qui n'ont pas déjà
|
|
75
|
+
// été prises en charge par le matcher.
|
|
76
|
+
|
|
77
|
+
// string | number
|
|
78
|
+
const matchedEntityOtherwise = DPattern.matchWithEntityOtherwise(
|
|
79
|
+
entity,
|
|
80
|
+
{
|
|
81
|
+
// User
|
|
82
|
+
User: (user) => user.name,
|
|
83
|
+
},
|
|
84
|
+
// Admin
|
|
85
|
+
(admin) => admin.permissions.length,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// La forme curried est également disponible.
|
|
89
|
+
//
|
|
90
|
+
// Le typage de `otherwise` évolue avec les handlers déjà déclarés.
|
|
91
|
+
// Il représente toujours précisément le reste de l'union.
|
|
92
|
+
|
|
93
|
+
// string | number
|
|
94
|
+
const matchedEntityOtherwiseInPipe = DCommon.pipe(
|
|
95
|
+
entity,
|
|
96
|
+
DPattern.matchWithEntityOtherwise(
|
|
97
|
+
{
|
|
98
|
+
// User
|
|
99
|
+
User: (user) => user.name,
|
|
100
|
+
},
|
|
101
|
+
// Admin
|
|
102
|
+
(admin) => admin.permissions.length,
|
|
103
|
+
),
|
|
104
|
+
);
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Discrimination selon le fait courant.
|
|
3
|
+
*
|
|
4
|
+
* Choisir une branche selon la Fact portée par une valeur et accéder aux données du fait.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import * as DModeling from "@duplojs/lang/modeling";
|
|
8
|
+
import * as DPattern from "@duplojs/lang/pattern";
|
|
9
|
+
|
|
10
|
+
// Une Fact appliquée à une entité y conserve son nom et sa payload.
|
|
11
|
+
// La sélection porte sur ce fait courant, même lorsque toutes les variantes sont la même Entity.
|
|
12
|
+
interface UserCreatedFact extends DModeling.Fact<
|
|
13
|
+
"UserCreated",
|
|
14
|
+
{
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
> {}
|
|
18
|
+
|
|
19
|
+
interface UserDeletedFact extends DModeling.Fact<
|
|
20
|
+
"UserDeleted",
|
|
21
|
+
{
|
|
22
|
+
reason: string;
|
|
23
|
+
}
|
|
24
|
+
> {}
|
|
25
|
+
|
|
26
|
+
type UserCreated = (
|
|
27
|
+
& DModeling.Entity<"User">
|
|
28
|
+
& {
|
|
29
|
+
readonly id: string;
|
|
30
|
+
}
|
|
31
|
+
& UserCreatedFact
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
type UserDeleted = (
|
|
35
|
+
& DModeling.Entity<"User">
|
|
36
|
+
& {
|
|
37
|
+
readonly id: string;
|
|
38
|
+
}
|
|
39
|
+
& UserDeletedFact
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
type User =
|
|
43
|
+
| UserCreated
|
|
44
|
+
| UserDeleted;
|
|
45
|
+
|
|
46
|
+
declare const user: User;
|
|
47
|
+
|
|
48
|
+
// `matchWithFact` discrimine une union à partir du nom de la `Fact`
|
|
49
|
+
// portée par chaque valeur.
|
|
50
|
+
//
|
|
51
|
+
// La sélection est exhaustive : chaque fact présente dans l'union
|
|
52
|
+
// doit posséder un handler.
|
|
53
|
+
//
|
|
54
|
+
// Chaque callback reçoit directement la valeur avec la `Fact` précise
|
|
55
|
+
// correspondant au nom sélectionné. La payload est accessible sur cette valeur avec factKind.
|
|
56
|
+
// Cette lecture fonctionne dans les formes directe et curifiée.
|
|
57
|
+
|
|
58
|
+
// string | number
|
|
59
|
+
const matchedFact = DPattern.matchWithFact(
|
|
60
|
+
user,
|
|
61
|
+
{
|
|
62
|
+
// UserCreated
|
|
63
|
+
UserCreated: (createdUser) => (
|
|
64
|
+
DModeling.factKind.getValue(createdUser).payload.name
|
|
65
|
+
),
|
|
66
|
+
|
|
67
|
+
// UserDeleted
|
|
68
|
+
UserDeleted: (deletedUser) => (
|
|
69
|
+
DModeling.factKind.getValue(deletedUser).payload.reason.length
|
|
70
|
+
),
|
|
71
|
+
},
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
// La sélection exhaustive crée un point d'ancrage dans le typage.
|
|
75
|
+
//
|
|
76
|
+
// Si une nouvelle `Fact` est ajoutée à l'union, le matcher devra
|
|
77
|
+
// également définir son traitement.
|
|
78
|
+
//
|
|
79
|
+
// À l'inverse, une clé ne correspondant à aucune fact de l'union
|
|
80
|
+
// ne peut pas être ajoutée au matcher.
|
|
81
|
+
|
|
82
|
+
// `matchWithFact` possède également une forme curried afin d'être
|
|
83
|
+
// directement utilisée dans un pipe.
|
|
84
|
+
|
|
85
|
+
// string | number
|
|
86
|
+
const matchedFactInPipe = DCommon.pipe(
|
|
87
|
+
user,
|
|
88
|
+
DPattern.matchWithFact({
|
|
89
|
+
// UserCreated
|
|
90
|
+
UserCreated: (createdUser) => (
|
|
91
|
+
DModeling.factKind.getValue(createdUser).payload.name
|
|
92
|
+
),
|
|
93
|
+
|
|
94
|
+
// UserDeleted
|
|
95
|
+
UserDeleted: (deletedUser) => (
|
|
96
|
+
DModeling.factKind.getValue(deletedUser).payload.reason.length
|
|
97
|
+
),
|
|
98
|
+
}),
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// `matchWithFactOtherwise` permet de ne sélectionner explicitement
|
|
102
|
+
// qu'une partie des facts.
|
|
103
|
+
//
|
|
104
|
+
// `otherwise` reçoit uniquement les valeurs portant les facts
|
|
105
|
+
// qui n'ont pas déjà été prises en charge par le matcher.
|
|
106
|
+
|
|
107
|
+
// string | UserDeleted
|
|
108
|
+
const matchedFactOtherwise = DPattern.matchWithFactOtherwise(
|
|
109
|
+
user,
|
|
110
|
+
{
|
|
111
|
+
// UserCreated
|
|
112
|
+
UserCreated: (createdUser) => (
|
|
113
|
+
DModeling.factKind.getValue(createdUser).payload.name
|
|
114
|
+
),
|
|
115
|
+
},
|
|
116
|
+
// UserDeleted
|
|
117
|
+
(deletedUser) => (
|
|
118
|
+
deletedUser
|
|
119
|
+
),
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// La forme curried est également disponible.
|
|
123
|
+
//
|
|
124
|
+
// Le typage de `otherwise` évolue avec les handlers déjà déclarés.
|
|
125
|
+
// Il représente toujours précisément le reste de l'union de facts.
|
|
126
|
+
|
|
127
|
+
// string | UserDeleted
|
|
128
|
+
const matchedFactOtherwiseInPipe = DCommon.pipe(
|
|
129
|
+
user,
|
|
130
|
+
DPattern.matchWithFactOtherwise(
|
|
131
|
+
{
|
|
132
|
+
// UserCreated
|
|
133
|
+
UserCreated: (createdUser) => (
|
|
134
|
+
DModeling.factKind.getValue(createdUser).payload.name
|
|
135
|
+
),
|
|
136
|
+
},
|
|
137
|
+
// UserDeleted
|
|
138
|
+
(deletedUser) => (
|
|
139
|
+
deletedUser
|
|
140
|
+
),
|
|
141
|
+
),
|
|
142
|
+
);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Discrimination des objets par tag.
|
|
3
|
+
*
|
|
4
|
+
* Identifier la forme d’un objet par son tag et traiter tout ou partie de l’union.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import type * as DModeling from "@duplojs/lang/modeling";
|
|
8
|
+
import * as DPattern from "@duplojs/lang/pattern";
|
|
9
|
+
|
|
10
|
+
// Le tag fait partie de la donnée et identifie chaque TaggedObject.
|
|
11
|
+
// Le matcher l’utilise pour distinguer les variantes indépendamment de leurs propriétés.
|
|
12
|
+
interface EmailNotification extends DModeling.ObjectTag<"EmailNotification"> {
|
|
13
|
+
readonly email: string;
|
|
14
|
+
readonly subject: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface SmsNotification extends DModeling.ObjectTag<"SmsNotification"> {
|
|
18
|
+
readonly phone: string;
|
|
19
|
+
readonly message: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type Notification =
|
|
23
|
+
| EmailNotification
|
|
24
|
+
| SmsNotification;
|
|
25
|
+
|
|
26
|
+
declare const notification: Notification;
|
|
27
|
+
|
|
28
|
+
// `matchWithTaggedObject` discrimine une union à partir du tag
|
|
29
|
+
// porté par chaque `TaggedObject`.
|
|
30
|
+
//
|
|
31
|
+
// La sélection est exhaustive : chaque tag présent dans l'union
|
|
32
|
+
// doit posséder un handler.
|
|
33
|
+
//
|
|
34
|
+
// Chaque callback reçoit directement le `TaggedObject` précis
|
|
35
|
+
// correspondant au tag sélectionné.
|
|
36
|
+
|
|
37
|
+
// string
|
|
38
|
+
const matchedNotification = DPattern.matchWithTaggedObject(
|
|
39
|
+
notification,
|
|
40
|
+
{
|
|
41
|
+
// EmailNotification
|
|
42
|
+
EmailNotification: (emailNotification) => emailNotification.email,
|
|
43
|
+
|
|
44
|
+
// SmsNotification
|
|
45
|
+
SmsNotification: (smsNotification) => smsNotification.phone,
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// La sélection exhaustive crée un point d'ancrage dans le typage.
|
|
50
|
+
//
|
|
51
|
+
// Si un nouveau `TaggedObject` est ajouté à l'union, le matcher devra
|
|
52
|
+
// également définir son traitement.
|
|
53
|
+
//
|
|
54
|
+
// À l'inverse, une clé ne correspondant à aucun tag de l'union
|
|
55
|
+
// ne peut pas être ajoutée au matcher.
|
|
56
|
+
|
|
57
|
+
// `matchWithTaggedObject` possède également une forme curried afin d'être
|
|
58
|
+
// directement utilisée dans un pipe.
|
|
59
|
+
|
|
60
|
+
// string
|
|
61
|
+
const matchedNotificationInPipe = DCommon.pipe(
|
|
62
|
+
notification,
|
|
63
|
+
DPattern.matchWithTaggedObject({
|
|
64
|
+
// EmailNotification
|
|
65
|
+
EmailNotification: (emailNotification) => emailNotification.email,
|
|
66
|
+
|
|
67
|
+
// SmsNotification
|
|
68
|
+
SmsNotification: (smsNotification) => smsNotification.phone,
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
// `matchWithTaggedObjectOtherwise` permet de ne sélectionner explicitement
|
|
73
|
+
// qu'une partie des tags.
|
|
74
|
+
//
|
|
75
|
+
// `otherwise` reçoit uniquement les `TaggedObject` qui n'ont pas déjà
|
|
76
|
+
// été pris en charge par le matcher.
|
|
77
|
+
|
|
78
|
+
// string
|
|
79
|
+
const matchedNotificationOtherwise = DPattern.matchWithTaggedObjectOtherwise(
|
|
80
|
+
notification,
|
|
81
|
+
{
|
|
82
|
+
// EmailNotification
|
|
83
|
+
EmailNotification: (emailNotification) => emailNotification.email,
|
|
84
|
+
},
|
|
85
|
+
// SmsNotification
|
|
86
|
+
(smsNotification) => smsNotification.phone,
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// La forme curried est également disponible.
|
|
90
|
+
//
|
|
91
|
+
// Le typage de `otherwise` évolue avec les handlers déjà déclarés.
|
|
92
|
+
// Il représente toujours précisément le reste de l'union de `TaggedObject`.
|
|
93
|
+
|
|
94
|
+
// string
|
|
95
|
+
const matchedNotificationOtherwiseInPipe = DCommon.pipe(
|
|
96
|
+
notification,
|
|
97
|
+
DPattern.matchWithTaggedObjectOtherwise(
|
|
98
|
+
{
|
|
99
|
+
// EmailNotification
|
|
100
|
+
EmailNotification: (emailNotification) => emailNotification.email,
|
|
101
|
+
},
|
|
102
|
+
// SmsNotification
|
|
103
|
+
(smsNotification) => smsNotification.phone,
|
|
104
|
+
),
|
|
105
|
+
);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Discrimination des erreurs par identifiant.
|
|
3
|
+
*
|
|
4
|
+
* Sélection exhaustive ou partielle des erreurs DuploJS, avec typage précis des branches et des cas restants.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import * as DPattern from "@duplojs/lang/pattern";
|
|
8
|
+
|
|
9
|
+
// Le matcher sélectionne l'identifiant porté par le kind d'une DuploJSError.
|
|
10
|
+
// Cet identifiant est fixé ici par parentClass ; il ne dépend ni du message
|
|
11
|
+
// ni du nom de la classe.
|
|
12
|
+
class InvalidInputError extends DCommon.DuploJSError.parentClass("invalid-input") {}
|
|
13
|
+
class UnavailableServiceError extends DCommon.DuploJSError.parentClass("unavailable-service", Error) {}
|
|
14
|
+
|
|
15
|
+
type OperationError =
|
|
16
|
+
| InvalidInputError
|
|
17
|
+
| UnavailableServiceError;
|
|
18
|
+
|
|
19
|
+
declare const error: OperationError;
|
|
20
|
+
|
|
21
|
+
// matchWithError exige un handler pour chaque identifiant de l'union
|
|
22
|
+
// et refuse les clés étrangères à celle-ci. Ajouter une erreur au contrat
|
|
23
|
+
// impose donc de compléter le matcher.
|
|
24
|
+
// Chaque callback reçoit l'erreur précise, avec ses propriétés et sa cause typées.
|
|
25
|
+
|
|
26
|
+
// string | Error
|
|
27
|
+
const matchedError = DPattern.matchWithError(
|
|
28
|
+
error,
|
|
29
|
+
{
|
|
30
|
+
// InvalidInputError ; cause est undefined.
|
|
31
|
+
"invalid-input": (invalidInput) => invalidInput.message,
|
|
32
|
+
|
|
33
|
+
// UnavailableServiceError ; cause est Error.
|
|
34
|
+
"unavailable-service": (unavailableService) => unavailableService.cause,
|
|
35
|
+
},
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// matchWithErrorOtherwise sélectionne explicitement une partie des identifiants.
|
|
39
|
+
// Le callback otherwise reçoit uniquement les erreurs non prises en charge.
|
|
40
|
+
// Les deux fonctions existent en forme directe et curried, utilisable dans un pipe.
|
|
41
|
+
|
|
42
|
+
// string | Error
|
|
43
|
+
const matchedErrorOtherwise = DCommon.pipe(
|
|
44
|
+
error,
|
|
45
|
+
DPattern.matchWithErrorOtherwise(
|
|
46
|
+
{
|
|
47
|
+
// InvalidInputError
|
|
48
|
+
"invalid-input": (invalidInput) => invalidInput.message,
|
|
49
|
+
},
|
|
50
|
+
// UnavailableServiceError
|
|
51
|
+
(unavailableService) => unavailableService.cause,
|
|
52
|
+
),
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// Ces matchers attendent des DuploJSError dont les identifiants sont des types
|
|
56
|
+
// littéraux connus. Conserver l'union précise : Error natif et DuploJSError
|
|
57
|
+
// sans identifiant littéral ne fournissent pas ce contrat de discrimination.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Discrimination des valeurs littérales.
|
|
3
|
+
*
|
|
4
|
+
* Traitement exhaustif ou partiel d’une union selon la valeur, avec branches typées.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import * as DPattern from "@duplojs/lang/pattern";
|
|
8
|
+
|
|
9
|
+
// Pour une union de valeurs littérales, privilégier les matchers dédiés aux string ou number.
|
|
10
|
+
// Ils sélectionnent directement la valeur et affinent le type reçu dans chaque branche.
|
|
11
|
+
|
|
12
|
+
declare const status: "pending" | "ready" | "failed";
|
|
13
|
+
|
|
14
|
+
// `matchWithString` discrimine exhaustivement une union de string literals.
|
|
15
|
+
//
|
|
16
|
+
// Chaque valeur possible doit posséder un handler et chaque callback reçoit
|
|
17
|
+
// précisément le literal correspondant.
|
|
18
|
+
|
|
19
|
+
// "wait" | "run" | "error"
|
|
20
|
+
const matchedStatus = DPattern.matchWithString(
|
|
21
|
+
status,
|
|
22
|
+
{
|
|
23
|
+
// "pending"
|
|
24
|
+
pending: () => "wait" as const,
|
|
25
|
+
|
|
26
|
+
// "ready"
|
|
27
|
+
ready: () => "run" as const,
|
|
28
|
+
|
|
29
|
+
// "failed"
|
|
30
|
+
failed: () => "error" as const,
|
|
31
|
+
},
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// La forme curried peut être utilisée directement dans un pipe.
|
|
35
|
+
|
|
36
|
+
// "wait" | "run" | "error"
|
|
37
|
+
const matchedStatusInPipe = DCommon.pipe(
|
|
38
|
+
status,
|
|
39
|
+
DPattern.matchWithString({
|
|
40
|
+
pending: () => "wait" as const,
|
|
41
|
+
ready: () => "run" as const,
|
|
42
|
+
failed: () => "error" as const,
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// La variante `otherwise` permet de ne sélectionner qu'une partie de l'union.
|
|
47
|
+
//
|
|
48
|
+
// Le callback `otherwise` reçoit précisément les literals non traités.
|
|
49
|
+
|
|
50
|
+
// "run" | "not-ready"
|
|
51
|
+
const matchedStatusOtherwise = DPattern.matchWithStringOtherwise(
|
|
52
|
+
status,
|
|
53
|
+
{
|
|
54
|
+
ready: () => "run" as const,
|
|
55
|
+
},
|
|
56
|
+
// "pending" | "failed"
|
|
57
|
+
() => "not-ready" as const,
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
declare const code: 200 | 404 | 500;
|
|
61
|
+
|
|
62
|
+
// `matchWithNumber` applique le même principe aux unions de number literals.
|
|
63
|
+
|
|
64
|
+
// "success" | "not-found" | "error"
|
|
65
|
+
const matchedCode = DPattern.matchWithNumber(
|
|
66
|
+
code,
|
|
67
|
+
{
|
|
68
|
+
200: () => "success" as const,
|
|
69
|
+
404: () => "not-found" as const,
|
|
70
|
+
500: () => "error" as const,
|
|
71
|
+
},
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
// `matchWithNumberOtherwise` permet également une sélection partielle.
|
|
75
|
+
|
|
76
|
+
// "success" | "error"
|
|
77
|
+
const matchedCodeOtherwise = DPattern.matchWithNumberOtherwise(
|
|
78
|
+
code,
|
|
79
|
+
{
|
|
80
|
+
200: () => "success" as const,
|
|
81
|
+
},
|
|
82
|
+
// 404 | 500
|
|
83
|
+
() => "error" as const,
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
// Un matcher exhaustif doit couvrir chaque valeur possible et refuse les clés étrangères à l’union.
|
|
87
|
+
// Ajouter une valeur au contrat impose de réviser les branches, contrairement à une sélection partielle.
|