@duplojs/agents-kit 0.1.0-beta.3 → 0.1.0-beta.6
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 +11 -11
- package/dist/bin/index.mjs +2 -2
- package/dist/bin/installSkill/index.d.ts +2 -0
- package/dist/bin/{install → installSkill}/index.mjs +3 -3
- package/dist/bin/{install → installSkill}/skill.mjs +1 -1
- package/dist/bin/setup/instructions.d.ts +1 -1
- package/docs/API/10-lang/10-array/10-at.ts +4 -4
- package/docs/API/10-lang/10-array/10-coalescing.ts +3 -2
- package/docs/API/10-lang/10-array/10-indexOf.ts +1 -1
- package/docs/API/10-lang/10-array/10-is.ts +17 -3
- package/docs/API/10-lang/10-array/10-lastIndexOf.ts +1 -1
- package/docs/API/10-lang/10-chrono/10-addTime.ts +1 -1
- package/docs/API/10-lang/10-chrono/10-closestTo.ts +5 -8
- package/docs/API/10-lang/10-chrono/10-isDate.ts +15 -2
- package/docs/API/10-lang/10-chrono/10-isSerializedTheDate.ts +16 -1
- package/docs/API/10-lang/10-chrono/10-isSerializedTheTime.ts +16 -1
- package/docs/API/10-lang/10-chrono/10-isTime.ts +15 -2
- package/docs/API/10-lang/10-chrono/10-maxDate.ts +4 -8
- package/docs/API/10-lang/10-chrono/10-maxTime.ts +4 -8
- package/docs/API/10-lang/10-chrono/10-minDate.ts +4 -8
- package/docs/API/10-lang/10-chrono/10-minTime.ts +4 -8
- package/docs/API/10-lang/10-chrono/10-sortDates.ts +6 -8
- package/docs/API/10-lang/10-chrono/10-sortTimes.ts +6 -8
- package/docs/API/10-lang/10-chrono/10-subtractTime.ts +1 -1
- package/docs/API/10-lang/10-common/10-and.ts +6 -0
- package/docs/API/10-lang/10-common/10-createQueue.ts +4 -3
- package/docs/API/10-lang/10-common/10-createTransformer.ts +1 -1
- package/docs/API/10-lang/10-common/10-equal.ts +6 -0
- package/docs/API/10-lang/10-common/10-falsy.ts +19 -0
- package/docs/API/10-lang/10-common/10-instanceOf.ts +14 -3
- package/docs/API/10-lang/10-common/10-isType.ts +6 -0
- package/docs/API/10-lang/10-common/10-justExec.ts +3 -3
- package/docs/API/10-lang/10-common/10-or.ts +17 -3
- package/docs/API/10-lang/10-common/10-tap.ts +28 -0
- package/docs/API/10-lang/10-common/10-toJSON.ts +1 -1
- package/docs/API/10-lang/10-common/10-toNative.ts +1 -1
- package/docs/API/10-lang/10-common/10-toRegExp.ts +1 -1
- package/docs/API/10-lang/10-common/10-truthy.ts +19 -0
- package/docs/API/10-lang/10-common/10-whenNot.ts +44 -13
- package/docs/API/10-lang/10-common/index.llms.md +4 -0
- package/docs/API/10-lang/10-dataStructure/10-typeStructureIdentifier.ts +2 -2
- package/docs/API/10-lang/10-either/10-asyncGroup.ts +1 -1
- package/docs/API/10-lang/10-either/10-asyncSafeCallback.ts +4 -2
- package/docs/API/10-lang/10-either/10-extractErrorInLeft.ts +45 -0
- package/docs/API/10-lang/10-either/10-forwardAssertsSelection.ts +1 -1
- package/docs/API/10-lang/10-either/10-group.ts +1 -1
- package/docs/API/10-lang/10-either/10-hasInformation.ts +6 -0
- package/docs/API/10-lang/10-either/10-isLeft.ts +10 -1
- package/docs/API/10-lang/10-either/10-isRight.ts +10 -1
- package/docs/API/10-lang/10-either/10-isSelected.ts +13 -1
- package/docs/API/10-lang/10-either/10-keepAsRightSelection.ts +1 -1
- package/docs/API/10-lang/10-either/10-matchInformation.ts +7 -5
- package/docs/API/10-lang/10-either/10-matchInformationCombination.ts +61 -0
- package/docs/API/10-lang/10-either/10-matchInformationCombinationOtherwise.ts +62 -0
- package/docs/API/10-lang/10-either/10-matchInformationOtherwise.ts +7 -5
- package/docs/API/10-lang/10-either/10-rightAsyncPipe.ts +2 -1
- package/docs/API/10-lang/10-either/10-rightPipe.ts +1 -1
- package/docs/API/10-lang/10-either/10-safeCallback.ts +1 -1
- package/docs/API/10-lang/10-either/10-unwrapOr.ts +2 -2
- package/docs/API/10-lang/10-either/10-unwrapOtherwise.ts +2 -2
- package/docs/API/10-lang/10-either/10-whenHasInformation.ts +4 -3
- package/docs/API/10-lang/10-either/10-whenHasInformationOtherwise.ts +5 -5
- package/docs/API/10-lang/10-either/10-whenIsLeft.ts +2 -2
- package/docs/API/10-lang/10-either/10-whenIsLeftOtherwise.ts +5 -5
- package/docs/API/10-lang/10-either/10-whenIsRight.ts +2 -2
- package/docs/API/10-lang/10-either/10-whenIsRightOtherwise.ts +7 -7
- package/docs/API/10-lang/10-either/10-whenIsSelected.ts +5 -5
- package/docs/API/10-lang/10-either/10-whenIsSelectedOtherwise.ts +5 -5
- package/docs/API/10-lang/10-either/index.llms.md +12 -0
- package/docs/API/10-lang/10-generator/10-asyncConcat.ts +7 -10
- package/docs/API/10-lang/10-generator/10-asyncFlat.ts +6 -6
- package/docs/API/10-lang/10-generator/10-concat.ts +3 -3
- package/docs/API/10-lang/10-generator/10-flat.ts +2 -2
- package/docs/API/10-lang/10-generator/10-map.ts +1 -1
- package/docs/API/10-lang/10-generator/10-reduce.ts +1 -1
- package/docs/API/10-lang/10-number/10-betweenThan.ts +43 -0
- package/docs/API/10-lang/10-number/10-betweenThanOrEqual.ts +43 -0
- package/docs/API/10-lang/10-number/10-greaterThan.ts +35 -0
- package/docs/API/10-lang/10-number/10-greaterThanOrEqual.ts +35 -0
- package/docs/API/10-lang/10-number/10-isEven.ts +33 -0
- package/docs/API/10-lang/10-number/10-isInteger.ts +33 -0
- package/docs/API/10-lang/10-number/10-isMultipleOf.ts +35 -0
- package/docs/API/10-lang/10-number/10-isNegative.ts +33 -0
- package/docs/API/10-lang/10-number/10-isNotZero.ts +33 -0
- package/docs/API/10-lang/10-number/10-isOdd.ts +33 -0
- package/docs/API/10-lang/10-number/10-isPositive.ts +33 -0
- package/docs/API/10-lang/10-number/10-isSafe.ts +33 -0
- package/docs/API/10-lang/10-number/10-isStrictNegative.ts +34 -0
- package/docs/API/10-lang/10-number/10-isStrictPositive.ts +33 -0
- package/docs/API/10-lang/10-number/10-lessThan.ts +35 -0
- package/docs/API/10-lang/10-number/10-lessThanOrEqual.ts +35 -0
- package/docs/API/10-lang/10-number/10-max.ts +19 -0
- package/docs/API/10-lang/10-number/10-maxOf.ts +19 -0
- package/docs/API/10-lang/10-number/10-min.ts +19 -0
- package/docs/API/10-lang/10-number/10-minOf.ts +19 -0
- package/docs/API/10-lang/10-number/10-sort.ts +19 -0
- package/docs/API/10-lang/10-number/10-sum.ts +19 -0
- package/docs/API/10-lang/10-number/index.llms.md +92 -0
- package/docs/API/10-lang/10-number/index.md +3 -0
- package/docs/API/10-lang/10-object/10-assign.ts +41 -0
- package/docs/API/10-lang/10-object/10-countKeys.ts +15 -0
- package/docs/API/10-lang/10-object/10-deepDiscriminate.ts +63 -0
- package/docs/API/10-lang/10-object/10-deepOverride.ts +35 -0
- package/docs/API/10-lang/10-object/10-discriminate.ts +55 -0
- package/docs/API/10-lang/10-object/10-discriminateEntryKey.ts +43 -0
- package/docs/API/10-lang/10-object/10-discriminateEntryValue.ts +44 -0
- package/docs/API/10-lang/10-object/10-entries.ts +19 -0
- package/docs/API/10-lang/10-object/10-entry.ts +17 -0
- package/docs/API/10-lang/10-object/10-fromEntries.ts +23 -0
- package/docs/API/10-lang/10-object/10-getDeepProperty.ts +26 -0
- package/docs/API/10-lang/10-object/10-getProperty.ts +24 -0
- package/docs/API/10-lang/10-object/10-hasKeys.ts +43 -0
- package/docs/API/10-lang/10-object/10-isSimple.ts +38 -0
- package/docs/API/10-lang/10-object/10-keys.ts +19 -0
- package/docs/API/10-lang/10-object/10-omit.ts +39 -0
- package/docs/API/10-lang/10-object/10-override.ts +24 -0
- package/docs/API/10-lang/10-object/10-pick.ts +41 -0
- package/docs/API/10-lang/10-object/10-to.ts +40 -0
- package/docs/API/10-lang/10-object/10-transformProperties.ts +43 -0
- package/docs/API/10-lang/10-object/10-transformProperty.ts +39 -0
- package/docs/API/10-lang/10-object/10-values.ts +19 -0
- package/docs/API/10-lang/10-object/index.llms.md +92 -0
- package/docs/API/10-lang/10-object/index.md +3 -0
- package/docs/API/10-lang/10-path/10-computeRelative.ts +19 -0
- package/docs/API/10-lang/10-path/10-concatSegment.ts +28 -0
- package/docs/API/10-lang/10-path/10-create.ts +21 -0
- package/docs/API/10-lang/10-path/10-createAbsolute.ts +21 -0
- package/docs/API/10-lang/10-path/10-createAbsoluteOrThrow.ts +16 -0
- package/docs/API/10-lang/10-path/10-createMatcher.ts +50 -0
- package/docs/API/10-lang/10-path/10-createOrThrow.ts +16 -0
- package/docs/API/10-lang/10-path/10-createSegment.ts +26 -0
- package/docs/API/10-lang/10-path/10-createSegmentOrThrow.ts +16 -0
- package/docs/API/10-lang/10-path/10-declareAbsolutePath.ts +15 -0
- package/docs/API/10-lang/10-path/10-declarePath.ts +15 -0
- package/docs/API/10-lang/10-path/10-declareSegment.ts +15 -0
- package/docs/API/10-lang/10-path/10-getBaseName.ts +22 -0
- package/docs/API/10-lang/10-path/10-getExtensionName.ts +22 -0
- package/docs/API/10-lang/10-path/10-getParentFolderPath.ts +25 -0
- package/docs/API/10-lang/10-path/10-is.ts +46 -0
- package/docs/API/10-lang/10-path/10-isAbsolute.ts +46 -0
- package/docs/API/10-lang/10-path/10-isSegment.ts +42 -0
- package/docs/API/10-lang/10-path/10-normalize.ts +26 -0
- package/docs/API/10-lang/10-path/10-resolveFrom.ts +37 -0
- package/docs/API/10-lang/10-path/10-resolveRelative.ts +23 -0
- package/docs/API/10-lang/10-path/index.llms.md +88 -0
- package/docs/API/10-lang/10-path/index.md +3 -0
- package/docs/API/10-lang/10-pattern/10-exhaustive.ts +26 -0
- package/docs/API/10-lang/10-pattern/10-isMatch.ts +72 -0
- package/docs/API/10-lang/10-pattern/10-match.ts +133 -0
- package/docs/API/10-lang/10-pattern/10-matchWithEntity.ts +49 -0
- package/docs/API/10-lang/10-pattern/10-matchWithEntityOtherwise.ts +55 -0
- package/docs/API/10-lang/10-pattern/10-matchWithError.ts +45 -0
- package/docs/API/10-lang/10-pattern/10-matchWithErrorOtherwise.ts +48 -0
- package/docs/API/10-lang/10-pattern/10-matchWithFact.ts +49 -0
- package/docs/API/10-lang/10-pattern/10-matchWithFactOtherwise.ts +49 -0
- package/docs/API/10-lang/10-pattern/10-matchWithNumber.ts +33 -0
- package/docs/API/10-lang/10-pattern/10-matchWithNumberOtherwise.ts +37 -0
- package/docs/API/10-lang/10-pattern/10-matchWithString.ts +34 -0
- package/docs/API/10-lang/10-pattern/10-matchWithStringOtherwise.ts +35 -0
- package/docs/API/10-lang/10-pattern/10-matchWithTaggedObject.ts +43 -0
- package/docs/API/10-lang/10-pattern/10-matchWithTaggedObjectOtherwise.ts +49 -0
- package/docs/API/10-lang/10-pattern/10-otherwise.ts +28 -0
- package/docs/API/10-lang/10-pattern/10-union.ts +47 -0
- package/docs/API/10-lang/10-pattern/10-when.ts +46 -0
- package/docs/API/10-lang/10-pattern/10-whenNot.ts +123 -0
- package/docs/API/10-lang/10-pattern/index.llms.md +80 -0
- package/docs/API/10-lang/10-pattern/index.md +3 -0
- package/docs/API/10-lang/10-printer/10-bold.ts +12 -0
- package/docs/API/10-lang/10-printer/10-colorized.ts +18 -0
- package/docs/API/10-lang/10-printer/10-colorizedBold.ts +18 -0
- package/docs/API/10-lang/10-printer/10-indent.ts +20 -0
- package/docs/API/10-lang/10-printer/10-primitives.md +11 -0
- package/docs/API/10-lang/10-printer/10-render.ts +29 -0
- package/docs/API/10-lang/10-printer/10-renderLine.ts +12 -0
- package/docs/API/10-lang/10-printer/10-renderParagraph.ts +16 -0
- package/docs/API/10-lang/10-printer/index.llms.md +37 -0
- package/docs/API/10-lang/10-printer/index.md +3 -0
- package/docs/API/10-lang/10-string/10-at.ts +18 -0
- package/docs/API/10-lang/10-string/10-capitalize.ts +18 -0
- package/docs/API/10-lang/10-string/10-charAt.ts +18 -0
- package/docs/API/10-lang/10-string/10-concat.ts +18 -0
- package/docs/API/10-lang/10-string/10-endsWith.ts +33 -0
- package/docs/API/10-lang/10-string/10-extract.ts +18 -0
- package/docs/API/10-lang/10-string/10-extractAll.ts +18 -0
- package/docs/API/10-lang/10-string/10-first.ts +17 -0
- package/docs/API/10-lang/10-string/10-includes.ts +33 -0
- package/docs/API/10-lang/10-string/10-indexOf.ts +17 -0
- package/docs/API/10-lang/10-string/10-isComposedOf.ts +33 -0
- package/docs/API/10-lang/10-string/10-isEmail.ts +56 -0
- package/docs/API/10-lang/10-string/10-isIn.ts +34 -0
- package/docs/API/10-lang/10-string/10-isKeyof.ts +37 -0
- package/docs/API/10-lang/10-string/10-isNotEmpty.ts +32 -0
- package/docs/API/10-lang/10-string/10-isNumber.ts +32 -0
- package/docs/API/10-lang/10-string/10-isTrimmed.ts +33 -0
- package/docs/API/10-lang/10-string/10-isUrl.ts +31 -0
- package/docs/API/10-lang/10-string/10-isUuid.ts +31 -0
- package/docs/API/10-lang/10-string/10-join.ts +18 -0
- package/docs/API/10-lang/10-string/10-last.ts +17 -0
- package/docs/API/10-lang/10-string/10-lastIndexOf.ts +17 -0
- package/docs/API/10-lang/10-string/10-length.ts +18 -0
- package/docs/API/10-lang/10-string/10-lengthEqual.ts +33 -0
- package/docs/API/10-lang/10-string/10-maxCharacters.ts +33 -0
- package/docs/API/10-lang/10-string/10-minCharacters.ts +33 -0
- package/docs/API/10-lang/10-string/10-normalize.ts +17 -0
- package/docs/API/10-lang/10-string/10-padEnd.ts +17 -0
- package/docs/API/10-lang/10-string/10-padStart.ts +17 -0
- package/docs/API/10-lang/10-string/10-pop.ts +17 -0
- package/docs/API/10-lang/10-string/10-prepend.ts +17 -0
- package/docs/API/10-lang/10-string/10-repeat.ts +17 -0
- package/docs/API/10-lang/10-string/10-replace.ts +18 -0
- package/docs/API/10-lang/10-string/10-replaceAll.ts +17 -0
- package/docs/API/10-lang/10-string/10-search.ts +17 -0
- package/docs/API/10-lang/10-string/10-shift.ts +17 -0
- package/docs/API/10-lang/10-string/10-slice.ts +17 -0
- package/docs/API/10-lang/10-string/10-sort.ts +19 -0
- package/docs/API/10-lang/10-string/10-sortCompare.ts +17 -0
- package/docs/API/10-lang/10-string/10-split.ts +34 -0
- package/docs/API/10-lang/10-string/10-startsWith.ts +33 -0
- package/docs/API/10-lang/10-string/10-stringify.ts +11 -0
- package/docs/API/10-lang/10-string/10-substring.ts +17 -0
- package/docs/API/10-lang/10-string/10-test.ts +17 -0
- package/docs/API/10-lang/10-string/10-to.ts +11 -0
- package/docs/API/10-lang/10-string/10-toLowerCase.ts +17 -0
- package/docs/API/10-lang/10-string/10-toUpperCase.ts +17 -0
- package/docs/API/10-lang/10-string/10-trim.ts +17 -0
- package/docs/API/10-lang/10-string/10-trimEnd.ts +17 -0
- package/docs/API/10-lang/10-string/10-trimStart.ts +17 -0
- package/docs/API/10-lang/10-string/10-uncapitalize.ts +17 -0
- package/docs/API/10-lang/10-string/index.llms.md +208 -0
- package/docs/API/10-lang/10-string/index.md +3 -0
- package/docs/API/10-lang/10-tuple/10-from.ts +50 -0
- package/docs/API/10-lang/10-tuple/10-map.ts +37 -0
- package/docs/API/10-lang/10-tuple/index.llms.md +12 -0
- package/docs/API/10-lang/10-tuple/index.md +3 -0
- package/docs/API/40-json-web-token/10-tokenHandler/10-createTokenHandler.ts +160 -0
- package/docs/API/40-json-web-token/10-tokenHandler/index.llms.md +8 -0
- package/docs/API/40-json-web-token/10-tokenHandler/index.md +3 -0
- package/docs/API/40-json-web-token/20-signer/10-createHS256.ts +24 -0
- package/docs/API/40-json-web-token/20-signer/10-createHS512.ts +24 -0
- package/docs/API/40-json-web-token/20-signer/10-createRS256.ts +28 -0
- package/docs/API/40-json-web-token/20-signer/10-createRS512.ts +28 -0
- package/docs/API/40-json-web-token/20-signer/10-factory.ts +29 -0
- package/docs/API/40-json-web-token/20-signer/index.llms.md +24 -0
- package/docs/API/40-json-web-token/20-signer/index.md +3 -0
- package/docs/API/40-json-web-token/30-cipher/10-createRSAOAEP.ts +26 -0
- package/docs/API/40-json-web-token/30-cipher/10-createRSAOAEP256.ts +26 -0
- package/docs/API/40-json-web-token/30-cipher/10-factory.ts +29 -0
- package/docs/API/40-json-web-token/30-cipher/index.llms.md +16 -0
- package/docs/API/40-json-web-token/30-cipher/index.md +3 -0
- package/docs/API/40-json-web-token/40-utils/10-AES_GCM.decrypt.ts +17 -0
- package/docs/API/40-json-web-token/40-utils/10-AES_GCM.encrypt.ts +11 -0
- package/docs/API/40-json-web-token/40-utils/10-AES_GCM.generateInitializationVector.ts +9 -0
- package/docs/API/40-json-web-token/40-utils/10-HMAC.sign.ts +13 -0
- package/docs/API/40-json-web-token/40-utils/10-HMAC.verify.ts +11 -0
- package/docs/API/40-json-web-token/40-utils/10-RSA.sign.ts +14 -0
- package/docs/API/40-json-web-token/40-utils/10-RSA.verify.ts +13 -0
- package/docs/API/40-json-web-token/40-utils/10-RSA_OAEP.decrypt.ts +13 -0
- package/docs/API/40-json-web-token/40-utils/10-RSA_OAEP.encrypt.ts +10 -0
- package/docs/API/40-json-web-token/40-utils/10-decodeBase64.ts +9 -0
- package/docs/API/40-json-web-token/40-utils/10-decodeBase64Url.ts +9 -0
- package/docs/API/40-json-web-token/40-utils/10-decodeText.ts +9 -0
- package/docs/API/40-json-web-token/40-utils/10-encodeBase64.ts +9 -0
- package/docs/API/40-json-web-token/40-utils/10-encodeBase64Url.ts +9 -0
- package/docs/API/40-json-web-token/40-utils/10-encodeText.ts +9 -0
- package/docs/API/40-json-web-token/40-utils/10-isBase64Url.ts +11 -0
- package/docs/API/40-json-web-token/40-utils/10-jsonParse.ts +11 -0
- package/docs/API/40-json-web-token/40-utils/10-pemToBinary.ts +11 -0
- package/docs/API/40-json-web-token/40-utils/index.llms.md +76 -0
- package/docs/API/40-json-web-token/40-utils/index.md +3 -0
- package/docs/API/40-json-web-token/index.md +3 -0
- package/docs/API/50-form/10-vue/10-construction/10-createForm.ts +48 -0
- package/docs/API/50-form/10-vue/10-construction/10-createFormField.ts +66 -0
- package/docs/API/50-form/10-vue/10-construction/10-createGridTemplates.ts +39 -0
- package/docs/API/50-form/10-vue/10-construction/10-createInput.ts +46 -0
- package/docs/API/50-form/10-vue/10-construction/10-createTemplate.ts +36 -0
- package/docs/API/50-form/10-vue/10-construction/fixtures/AddressInput.vue +19 -0
- package/docs/API/50-form/10-vue/10-construction/index.llms.md +24 -0
- package/docs/API/50-form/10-vue/10-construction/index.md +3 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useCheckLayout.ts +40 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useDisabledLayout.ts +34 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useMultiLayout.ts +32 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useRepeatLayout.ts +34 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useSectionLayout.ts +20 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useSlotLayout.ts +37 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useStepLayout.ts +31 -0
- package/docs/API/50-form/10-vue/20-layouts/10-useUnionLayout.ts +48 -0
- package/docs/API/50-form/10-vue/20-layouts/index.llms.md +36 -0
- package/docs/API/50-form/10-vue/20-layouts/index.md +3 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useCheckbox.ts +13 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useCheckboxPolicy.ts +18 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useDateInput.ts +20 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useDualRangeInput.ts +27 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useFileInput.ts +23 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useNumberInput.ts +18 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useRadioGroup.ts +31 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useRangeDateInput.ts +23 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useRangeInput.ts +18 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useRangeTimeInput.ts +23 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useSelectInput.ts +31 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useTextInput.ts +14 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useTextareaInput.ts +14 -0
- package/docs/API/50-form/10-vue/30-designSystem/10-useTimeInput.ts +20 -0
- package/docs/API/50-form/10-vue/30-designSystem/20-components.md +11 -0
- package/docs/API/50-form/10-vue/30-designSystem/index.llms.md +65 -0
- package/docs/API/50-form/10-vue/30-designSystem/index.md +3 -0
- package/docs/API/50-form/10-vue/fixtures/templates.ts +20 -0
- package/docs/API/50-form/10-vue/index.md +3 -0
- package/docs/API/50-form/index.md +3 -0
- package/docs/API/60-playwright/10-construction/10-createComponent.ts +47 -0
- package/docs/API/60-playwright/10-construction/10-createComponentInteraction.ts +28 -0
- package/docs/API/60-playwright/10-construction/10-createPage.ts +34 -0
- package/docs/API/60-playwright/10-construction/10-createStepWrapper.ts +23 -0
- package/docs/API/60-playwright/10-construction/10-createWebsite.ts +57 -0
- package/docs/API/60-playwright/10-construction/10-initClient.ts +38 -0
- package/docs/API/60-playwright/10-construction/index.llms.md +28 -0
- package/docs/API/60-playwright/10-construction/index.md +3 -0
- package/docs/API/60-playwright/20-actions/10-check.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-clear.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-click.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-dragTo.ts +10 -0
- package/docs/API/60-playwright/20-actions/10-extractContent.ts +10 -0
- package/docs/API/60-playwright/20-actions/10-fill.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-focus.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-forceClick.ts +10 -0
- package/docs/API/60-playwright/20-actions/10-hover.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-press.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-selectOption.ts +10 -0
- package/docs/API/60-playwright/20-actions/10-type.ts +10 -0
- package/docs/API/60-playwright/20-actions/10-uncheck.ts +9 -0
- package/docs/API/60-playwright/20-actions/10-withStep.ts +10 -0
- package/docs/API/60-playwright/20-actions/index.llms.md +60 -0
- package/docs/API/60-playwright/20-actions/index.md +3 -0
- package/docs/API/60-playwright/30-assertions/10-toBeBusy.ts +10 -0
- package/docs/API/60-playwright/30-assertions/10-toBeChecked.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-toBeDisabled.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-toBeEnabled.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-toBeHidden.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-toBeNotBusy.ts +10 -0
- package/docs/API/60-playwright/30-assertions/10-toBeVisible.ts +10 -0
- package/docs/API/60-playwright/30-assertions/10-toContainText.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-toHaveAttribute.ts +12 -0
- package/docs/API/60-playwright/30-assertions/10-toHaveClass.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-toHaveNoText.ts +10 -0
- package/docs/API/60-playwright/30-assertions/10-toHaveQuantity.ts +20 -0
- package/docs/API/60-playwright/30-assertions/10-toHaveText.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-toHaveValue.ts +9 -0
- package/docs/API/60-playwright/30-assertions/10-withStep.ts +10 -0
- package/docs/API/60-playwright/30-assertions/index.llms.md +64 -0
- package/docs/API/60-playwright/30-assertions/index.md +3 -0
- package/docs/API/60-playwright/fixtures/component.ts +44 -0
- package/docs/API/60-playwright/index.md +3 -0
- package/docs/API.llms.md +84 -0
- package/docs/concepts/01-fundamental/01-constraint/20-manipulation.ts +9 -6
- package/docs/concepts/01-fundamental/01-constraint/30-cast.ts +9 -5
- package/docs/concepts/01-fundamental/02-currying/01-use.ts +5 -0
- package/docs/concepts/01-fundamental/02-currying/10-built-in-function.ts +28 -16
- package/docs/concepts/01-fundamental/02-currying/20-inner-pipe.ts +11 -2
- package/docs/concepts/01-fundamental/02-currying/30-async-pipe.ts +11 -2
- package/docs/concepts/01-fundamental/03-either/10-discrimination.ts +23 -12
- package/docs/concepts/01-fundamental/03-either/20-exhaustive-handling.ts +27 -10
- package/docs/concepts/01-fundamental/03-either/30-composition.ts +18 -10
- package/docs/concepts/01-fundamental/03-either/40-result-adaptation.ts +10 -4
- package/docs/concepts/01-fundamental/03-either/50-external-results.ts +16 -3
- package/docs/concepts/01-fundamental/04-data-structure/10-structure.ts +110 -59
- package/docs/concepts/01-fundamental/04-data-structure/20-constraint.ts +20 -12
- package/docs/concepts/01-fundamental/04-data-structure/30-validation.ts +13 -9
- package/docs/concepts/01-fundamental/04-data-structure/40-codecs.ts +31 -20
- package/docs/concepts/01-fundamental/04-data-structure/50-recursive.ts +10 -1
- package/docs/concepts/01-fundamental/05-chrono/10-creation.ts +39 -13
- package/docs/concepts/01-fundamental/05-chrono/20-manipulation.ts +20 -4
- package/docs/concepts/01-fundamental/05-chrono/30-serialized.ts +22 -6
- package/docs/concepts/01-fundamental/05-chrono/40-timezone.ts +5 -1
- package/docs/concepts/01-fundamental/06-modeling/20-entity.ts +29 -42
- package/docs/concepts/01-fundamental/06-modeling/30-tagged-object.ts +46 -23
- package/docs/concepts/01-fundamental/06-modeling/40-entity-lifecycle.ts +30 -33
- package/docs/concepts/01-fundamental/07-discrimination/10-entity.ts +52 -20
- package/docs/concepts/01-fundamental/07-discrimination/20-fact.ts +54 -38
- package/docs/concepts/01-fundamental/07-discrimination/30-tagged-object.ts +52 -20
- package/docs/concepts/01-fundamental/07-discrimination/40-error.ts +26 -10
- package/docs/concepts/01-fundamental/07-discrimination/50-literal.ts +29 -10
- package/docs/concepts/01-fundamental/07-discrimination/60-shape.ts +10 -2
- package/docs/concepts/01-fundamental/07-discrimination/70-predicate.ts +18 -6
- package/docs/concepts/01-fundamental/08-kind/01-identity.md +7 -0
- package/docs/concepts/01-fundamental/08-kind/20-metadata.md +11 -0
- package/docs/concepts/01-fundamental/08-kind/30-transport.md +11 -0
- package/docs/concepts/01-fundamental/08-kind/index.md +3 -0
- package/docs/concepts/02-server/10-file/10-manipulation.ts +15 -3
- package/docs/concepts/02-server/10-file/20-path.ts +22 -6
- package/docs/concepts/02-server/20-http/10-init.ts +1 -9
- package/docs/concepts/02-server/20-http/20-route.ts +40 -32
- package/docs/concepts/02-server/20-http/30-routine.ts +12 -19
- package/docs/concepts/02-server/20-http/40-jwt.ts +49 -37
- package/docs/concepts/02-server/20-http/50-open-api.ts +44 -0
- package/docs/concepts/02-server/20-http/index.md +1 -1
- package/docs/concepts/02-server/30-environment/10-platform.ts +12 -3
- package/docs/concepts/02-server/30-environment/20-variable.ts +13 -7
- package/docs/concepts/03-client/10-http/10-init.ts +11 -23
- package/docs/concepts/03-client/10-http/20-request.ts +79 -69
- package/docs/concepts/03-client/10-http/30-hook.ts +23 -23
- package/docs/concepts/03-client/20-form/10-init.ts +18 -15
- package/docs/concepts/03-client/20-form/20-input.ts +13 -6
- package/docs/concepts/03-client/20-form/30-layout.ts +44 -49
- package/docs/concepts/03-client/20-form/40-template.ts +10 -5
- package/docs/concepts/03-client/20-form/50-integration.md +11 -0
- package/docs/concepts/03-client/20-form/examples/postModeration/ThePage.vue +32 -0
- package/docs/concepts/03-client/20-form/examples/postModeration/usePostModeration.ts +80 -0
- package/docs/concepts/05-type-driven-design/01-architecture/10-boundaries.md +23 -20
- package/docs/concepts/05-type-driven-design/01-architecture/index.md +1 -1
- package/docs/concepts/05-type-driven-design/02-domains/10-entities.md +29 -37
- package/docs/concepts/05-type-driven-design/02-domains/20-aggregates.md +42 -26
- package/docs/concepts/05-type-driven-design/02-domains/30-repositories.md +20 -26
- package/docs/concepts/05-type-driven-design/02-domains/40-refinements.md +30 -0
- package/docs/concepts/05-type-driven-design/02-domains/index.md +1 -1
- package/docs/concepts/05-type-driven-design/03-applications/10-use-case.md +33 -40
- package/docs/concepts/05-type-driven-design/03-applications/20-ports.md +49 -0
- package/docs/concepts/05-type-driven-design/03-applications/index.md +1 -1
- package/docs/concepts/05-type-driven-design/04-infrastructure/10-implementation.md +27 -36
- package/docs/concepts/05-type-driven-design/04-infrastructure/index.md +1 -1
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/index.ts +1 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/waitingListEntry.ts +17 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientGiveBackBook.ts +30 -12
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientRentBook.ts +9 -8
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/createBook.ts +7 -7
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/withdrawBook.ts +32 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientGiveBackBook.ts +72 -13
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientRentBook.ts +37 -11
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/createBook.ts +29 -17
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/index.ts +1 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/withdrawBook.ts +37 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/create.ts +4 -5
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/rental.ts +9 -9
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/reserve.ts +37 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/returnBook.ts +11 -9
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/withdraw.ts +21 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/index.ts +42 -11
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/giveBackBook.ts +11 -9
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/rentBook.ts +10 -10
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/index.ts +6 -29
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/index.ts +1 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/waitingListEntry/facts/cancel.ts +26 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/waitingListEntry/facts/create.ts +33 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/waitingListEntry/facts/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/waitingListEntry/facts/prepare.ts +23 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/waitingListEntry/index.ts +79 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/index.ts +1 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/refinements/index.ts +1 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/refinements/refineLinkBetweenClientAndBorrowedBook.ts +34 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/book.ts +1 -1
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/index.ts +1 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/waitingListEntry.ts +19 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/clientRentBook.ts +3 -3
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/bookExist.ts +2 -2
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/clientExist.ts +2 -2
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientGiveBackBook.ts +23 -14
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientRentBook.ts +7 -12
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/book.ts +1 -1
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/index.ts +1 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/waitingListEntry.ts +17 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/useCases/index.ts +2 -1
- package/docs/concepts/05-type-driven-design/index.md +2 -2
- package/docs/concepts.llms.md +71 -25
- package/instructions/coding-conventions.md +2 -2
- package/package.json +17 -14
- package/skills/http-client/SKILL.md +1 -1
- package/skills/http-client/references/configuration.md +3 -1
- package/skills/http-client/references/examples/client-expectations.ts +11 -10
- package/skills/http-client/references/examples/client-streams.ts +2 -2
- package/skills/http-client/references/examples/external-client.ts +2 -2
- package/skills/http-client/references/responses.md +1 -1
- package/skills/http-server/SKILL.md +4 -9
- package/skills/http-server/references/examples/authentication.ts +2 -2
- package/skills/http-server/references/examples/inferred-client.ts +54 -0
- package/skills/http-server/references/examples/minimal-route.ts +2 -3
- package/skills/http-server/references/examples/protected-route.ts +4 -6
- package/skills/http-server/references/examples/rename-user-route.ts +4 -6
- package/skills/http-server/references/examples/user-checker.ts +2 -2
- package/skills/http-server/references/examples/user-route.ts +12 -5
- package/skills/http-server/references/initialization.md +1 -1
- package/skills/http-server/references/reusable-flows.md +3 -3
- package/skills/http-server/references/routes-and-floor.md +11 -3
- package/dist/bin/install/index.d.ts +0 -2
- package/docs/concepts/02-server/20-http/50-codegen.ts +0 -29
- package/skills/http-server/references/code-generation.md +0 -31
- package/skills/http-server/references/examples/generate-sdk.ts +0 -36
- /package/dist/bin/{install → installSkill}/skill.d.ts +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Déclaration d'une politique unique pour créer et vérifier une famille de tokens.
|
|
5
5
|
*/
|
|
6
|
+
import type * as DCommon from "@duplojs/lang/common";
|
|
6
7
|
import { Cipher, createTokenHandler, Signer } from "@duplojs/json-web-token";
|
|
7
8
|
import * as DChrono from "@duplojs/lang/chrono";
|
|
8
9
|
import * as DDataStructure from "@duplojs/lang/dataStructure";
|
|
@@ -32,9 +33,6 @@ const tokenHandler = createTokenHandler({
|
|
|
32
33
|
});
|
|
33
34
|
|
|
34
35
|
// À 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
36
|
const createdTokenResult = await tokenHandler.create(
|
|
39
37
|
{
|
|
40
38
|
userId: "42",
|
|
@@ -46,50 +44,64 @@ const createdTokenResult = await tokenHandler.create(
|
|
|
46
44
|
},
|
|
47
45
|
},
|
|
48
46
|
);
|
|
47
|
+
type _CheckCreatedTokenResult = DCommon.ExpectType<
|
|
48
|
+
typeof createdTokenResult,
|
|
49
|
+
DEither.Right<"token-created", string> | DEither.Left<"header-encode-error", DDataStructure.Error> | DEither.Left<"payload-encode-error", DDataStructure.Error>,
|
|
50
|
+
"strict"
|
|
51
|
+
>;
|
|
49
52
|
|
|
50
53
|
if (DEither.isRight(createdTokenResult)) {
|
|
51
|
-
// string
|
|
52
54
|
const token = DEither.unwrapRight(createdTokenResult);
|
|
55
|
+
type _CheckToken = DCommon.ExpectType<typeof token, string, "strict">;
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
// `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
59
|
const verifiedTokenResult = await tokenHandler.verify("receive-token");
|
|
60
|
+
type _CheckVerifiedTokenResult = DCommon.ExpectType<typeof verifiedTokenResult,
|
|
61
|
+
DEither.Left<"token-format", unknown> | DEither.Left<"header-json-error", unknown> | DEither.Left<"header-decode-error", DDataStructure.Error> | DEither.Left<"payload-json-error", unknown> | DEither.Left<"payload-decode-error", DDataStructure.Error> | DEither.Left<"signature-invalid", unknown> | DEither.Left<"issue-invalid", unknown> | DEither.Left<"subject-invalid", unknown> | DEither.Left<"audience-invalid", unknown> | DEither.Left<"expired", unknown> | DEither.Right<"token-verified", {
|
|
62
|
+
readonly header: {
|
|
63
|
+
readonly typ: "JWT";
|
|
64
|
+
readonly alg: "HS256";
|
|
65
|
+
readonly kid?: string | undefined;
|
|
66
|
+
};
|
|
67
|
+
readonly payload: {
|
|
68
|
+
readonly iss: string;
|
|
69
|
+
readonly sub: undefined;
|
|
70
|
+
readonly aud: string;
|
|
71
|
+
readonly exp: number;
|
|
72
|
+
readonly iat: number;
|
|
73
|
+
readonly userId: string;
|
|
74
|
+
readonly role: "admin";
|
|
75
|
+
};
|
|
76
|
+
}>,
|
|
77
|
+
"strict"
|
|
78
|
+
>;
|
|
86
79
|
|
|
87
80
|
if (DEither.isRight(verifiedTokenResult)) {
|
|
88
|
-
const
|
|
81
|
+
const verifiedToken = DEither.unwrapRight(verifiedTokenResult);
|
|
82
|
+
type _CheckVerifiedToken = DCommon.ExpectType<typeof verifiedToken, {
|
|
83
|
+
readonly header: {
|
|
84
|
+
readonly typ: "JWT";
|
|
85
|
+
readonly alg: "HS256";
|
|
86
|
+
readonly kid?: string | undefined;
|
|
87
|
+
};
|
|
88
|
+
readonly payload: {
|
|
89
|
+
readonly iss: string;
|
|
90
|
+
readonly sub: undefined;
|
|
91
|
+
readonly aud: string;
|
|
92
|
+
readonly exp: number;
|
|
93
|
+
readonly iat: number;
|
|
94
|
+
readonly userId: string;
|
|
95
|
+
readonly role: "admin";
|
|
96
|
+
};
|
|
97
|
+
}, "strict">;
|
|
89
98
|
|
|
90
|
-
const userId = payload.userId;
|
|
91
|
-
const role = payload.role;
|
|
92
|
-
const kid = header.kid;
|
|
99
|
+
const userId = verifiedToken.payload.userId;
|
|
100
|
+
const role = verifiedToken.payload.role;
|
|
101
|
+
const kid = verifiedToken.header.kid;
|
|
102
|
+
type _CheckUserId = DCommon.ExpectType<typeof userId, string, "strict">;
|
|
103
|
+
type _CheckRole = DCommon.ExpectType<typeof role, "admin", "strict">;
|
|
104
|
+
type _CheckKid = DCommon.ExpectType<typeof kid, string | undefined, "strict">;
|
|
93
105
|
}
|
|
94
106
|
|
|
95
107
|
// Avec une factory de `Signer` ou `Cipher`, la configuration est fournie
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Générer la documentation OpenAPI d'une API HTTP.
|
|
3
|
+
*
|
|
4
|
+
* Décrire les réponses des routes et exposer leur documentation.
|
|
5
|
+
*/
|
|
6
|
+
import { createHub, useRouteBuilder } from "@duplojs/http";
|
|
7
|
+
import { OpenApiEndpointContractMetadata, openApiGeneratorPlugin } from "@duplojs/http/openApiGenerator";
|
|
8
|
+
import * as DDataStructure from "@duplojs/lang/dataStructure";
|
|
9
|
+
|
|
10
|
+
// Le plugin reprend les entrées déclarées dans les extractions. Décrire les
|
|
11
|
+
// réponses à documenter avec `OpenApiEndpointContractMetadata` sur les étapes
|
|
12
|
+
// concernées. Ces métadonnées servent à la documentation ; elles ne valident
|
|
13
|
+
// pas les réponses envoyées par la route.
|
|
14
|
+
const helloRoute = useRouteBuilder("GET", "/hello")
|
|
15
|
+
.extract(
|
|
16
|
+
{
|
|
17
|
+
query: { name: DDataStructure.string() },
|
|
18
|
+
},
|
|
19
|
+
({ response }) => response.badRequest("hello.invalid"),
|
|
20
|
+
OpenApiEndpointContractMetadata({
|
|
21
|
+
code: "400",
|
|
22
|
+
information: "hello.invalid",
|
|
23
|
+
}),
|
|
24
|
+
)
|
|
25
|
+
.handler(
|
|
26
|
+
({ name }, { response }) => response.ok("hello.received", { name }),
|
|
27
|
+
OpenApiEndpointContractMetadata({
|
|
28
|
+
code: "200",
|
|
29
|
+
information: "hello.received",
|
|
30
|
+
body: DDataStructure.object({ name: DDataStructure.string() }),
|
|
31
|
+
}),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Le plugin collecte les entrées des extractions et les métadonnées de sortie
|
|
35
|
+
// des routes, de leurs étapes et de leurs processus, y compris le preflight.
|
|
36
|
+
// Sans métadonnées de sortie, une réponse de handler n'est pas documentée.
|
|
37
|
+
// Une extraction sans métadonnée locale documente par défaut 422 / extract-error.
|
|
38
|
+
// Si le refus par défaut du Hub change, adapter aussi `defaultExtractMetadata`
|
|
39
|
+
// dans les options du plugin ; un refus local se décrit comme ci-dessus.
|
|
40
|
+
export const documentedHub = createHub({ environment: "DEV" })
|
|
41
|
+
.register(helloRoute)
|
|
42
|
+
.plug(openApiGeneratorPlugin({ routePath: "/swagger" }));
|
|
43
|
+
|
|
44
|
+
// Le connecteur déclenche la génération en environnement DEV ou BUILD.
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* applicatif indépendant du runtime.
|
|
6
6
|
*/
|
|
7
7
|
import * as DCommon from "@duplojs/lang/common";
|
|
8
|
+
import type * as DEither from "@duplojs/lang/either";
|
|
8
9
|
import type * as DPath from "@duplojs/lang/path";
|
|
9
10
|
import * as DSCommon from "@duplojs/server/common";
|
|
10
11
|
import * as DSFile from "@duplojs/server/file";
|
|
@@ -14,14 +15,22 @@ import { createHttpServer } from "@duplojs/http/node";
|
|
|
14
15
|
// Les capacités proches entre runtimes sont exposées par une même API.
|
|
15
16
|
const resourcePath: string & DPath.Path = DCommon.cast("/resources/config.json");
|
|
16
17
|
|
|
17
|
-
// DEither.Right<file-system-write-json-file, void> | DEither.Left<...> | ...
|
|
18
18
|
const writeJsonResult = await DSFile.writeJsonFile(resourcePath, { version: 1.0 });
|
|
19
|
+
type _CheckWriteJsonResult = DCommon.ExpectType<typeof writeJsonResult, DSFile.WriteJsonFileResult, "strict">;
|
|
19
20
|
|
|
20
|
-
// DEither.Error<unknown> | DEither.Success<string & DPath.Absolute>
|
|
21
21
|
const currentWorkingDirectoryResult = DSCommon.getCurrentWorkDirectory();
|
|
22
|
+
type _CheckCurrentWorkingDirectoryResultLine21 = DCommon.ExpectType<
|
|
23
|
+
typeof currentWorkingDirectoryResult,
|
|
24
|
+
DEither.Error<unknown> | DEither.Success<string & DPath.Absolute>,
|
|
25
|
+
"strict"
|
|
26
|
+
>;
|
|
22
27
|
|
|
23
|
-
// string[]
|
|
24
28
|
const processArguments = DSCommon.getProcessArguments();
|
|
29
|
+
type _CheckProcessArgumentsLine24 = DCommon.ExpectType<
|
|
30
|
+
typeof processArguments,
|
|
31
|
+
string[],
|
|
32
|
+
"strict"
|
|
33
|
+
>;
|
|
25
34
|
|
|
26
35
|
const hub = createHub({
|
|
27
36
|
environment: "DEV",
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
import * as DSCommon from "@duplojs/server/common";
|
|
8
8
|
import * as DDataStructure from "@duplojs/lang/dataStructure";
|
|
9
9
|
import * as DCommon from "@duplojs/lang/common";
|
|
10
|
+
import type * as DNumber from "@duplojs/lang/number";
|
|
11
|
+
import type * as DString from "@duplojs/lang/string";
|
|
10
12
|
|
|
11
13
|
// `environmentVariableOrThrow` est adaptée au démarrage d'une application :
|
|
12
14
|
// une configuration invalide interrompt directement l'initialisation.
|
|
@@ -32,10 +34,14 @@ const envs = await DSCommon.environmentVariableOrThrow(
|
|
|
32
34
|
justRead: true,
|
|
33
35
|
},
|
|
34
36
|
);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
type _CheckEnvs = DCommon.ExpectType<
|
|
38
|
+
typeof envs,
|
|
39
|
+
{
|
|
40
|
+
readonly host: "0.0.0.0" | "127.0.0.1" | "localhost";
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly port: number & DNumber.Positive;
|
|
43
|
+
readonly ENVIRONMENT: "DEV" | "PROD";
|
|
44
|
+
readonly DATABASE_URL: string & DString.Url;
|
|
45
|
+
},
|
|
46
|
+
"strict"
|
|
47
|
+
>;
|
|
@@ -1,29 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @title Initialiser un client HTTP
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* globale et conservation du typage des requêtes et réponses exposées par le
|
|
6
|
-
* serveur.
|
|
4
|
+
* Configuration d'un client HTTP typé et des paramètres communs aux requêtes.
|
|
7
5
|
*/
|
|
8
6
|
import { createHttpClient } from "@duplojs/http/client";
|
|
7
|
+
import { type RouteDeclarationToContract } from "@duplojs/http";
|
|
8
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
9
|
+
import { type usersRoute } from "../../02-server/20-http/20-route";
|
|
9
10
|
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
}
|
|
11
|
+
// L'import de type ne charge pas les déclarations de routes au runtime.
|
|
12
|
+
// Les réponses incluent les retours du handler et les refus des étapes.
|
|
13
|
+
export type Routes = RouteDeclarationToContract<typeof usersRoute>;
|
|
27
14
|
|
|
28
15
|
// `baseUrl` suffit pour créer un client.
|
|
29
16
|
// Les autres options configurent le comportement global.
|
|
@@ -42,14 +29,15 @@ client.addDefaultHeader(
|
|
|
42
29
|
// Le contrat limite les paths, paramètres et réponses disponibles.
|
|
43
30
|
const response = await client
|
|
44
31
|
.get(
|
|
45
|
-
"/
|
|
32
|
+
"/users",
|
|
46
33
|
{
|
|
47
34
|
query: {
|
|
48
|
-
|
|
35
|
+
page: DCommon.cast(1),
|
|
36
|
+
quantityPerPage: DCommon.cast(5),
|
|
49
37
|
},
|
|
50
38
|
},
|
|
51
39
|
)
|
|
52
|
-
.iWantInformationOrThrow("
|
|
40
|
+
.iWantInformationOrThrow("users.findMany");
|
|
53
41
|
|
|
54
42
|
void response.body;
|
|
55
43
|
void response.code;
|
|
@@ -9,74 +9,74 @@ import * as DCommon from "@duplojs/lang/common";
|
|
|
9
9
|
import * as DEither from "@duplojs/lang/either";
|
|
10
10
|
|
|
11
11
|
export type Routes = {
|
|
12
|
-
method: "POST";
|
|
13
|
-
path: "/users";
|
|
14
|
-
body: {
|
|
15
|
-
username: string;
|
|
16
|
-
age: number;
|
|
12
|
+
readonly method: "POST";
|
|
13
|
+
readonly path: "/users";
|
|
14
|
+
readonly body: {
|
|
15
|
+
readonly username: string;
|
|
16
|
+
readonly age: number;
|
|
17
17
|
};
|
|
18
|
-
responses: {
|
|
19
|
-
code: "422";
|
|
20
|
-
information: "extract-error";
|
|
21
|
-
body
|
|
18
|
+
readonly responses: {
|
|
19
|
+
readonly code: "422";
|
|
20
|
+
readonly information: "extract-error";
|
|
21
|
+
readonly body: Error;
|
|
22
22
|
} | {
|
|
23
|
-
code: "204";
|
|
24
|
-
information: "user.created";
|
|
25
|
-
body
|
|
23
|
+
readonly code: "204";
|
|
24
|
+
readonly information: "user.created";
|
|
25
|
+
readonly body: undefined;
|
|
26
26
|
};
|
|
27
27
|
} | {
|
|
28
|
-
method: "POST";
|
|
29
|
-
path: "/users/{userId}/posts";
|
|
30
|
-
params: {
|
|
31
|
-
userId: number;
|
|
28
|
+
readonly method: "POST";
|
|
29
|
+
readonly path: "/users/{userId}/posts";
|
|
30
|
+
readonly params: {
|
|
31
|
+
readonly userId: number;
|
|
32
32
|
};
|
|
33
|
-
body: {
|
|
34
|
-
title: string;
|
|
35
|
-
content: string;
|
|
33
|
+
readonly body: {
|
|
34
|
+
readonly title: string;
|
|
35
|
+
readonly content: string;
|
|
36
36
|
};
|
|
37
|
-
responses: {
|
|
38
|
-
code: "422";
|
|
39
|
-
information: "extract-error";
|
|
40
|
-
body
|
|
37
|
+
readonly responses: {
|
|
38
|
+
readonly code: "422";
|
|
39
|
+
readonly information: "extract-error";
|
|
40
|
+
readonly body: Error;
|
|
41
41
|
} | {
|
|
42
|
-
code: "204";
|
|
43
|
-
information: "post.created";
|
|
44
|
-
body
|
|
42
|
+
readonly code: "204";
|
|
43
|
+
readonly information: "post.created";
|
|
44
|
+
readonly body: undefined;
|
|
45
45
|
};
|
|
46
46
|
} | {
|
|
47
|
-
method: "POST";
|
|
48
|
-
path: "/documents";
|
|
49
|
-
body: DCommon.TheFormData<{
|
|
50
|
-
bool: boolean;
|
|
51
|
-
myFile: readonly File[] & DArray.LengthEqual<1>;
|
|
52
|
-
name: string;
|
|
47
|
+
readonly method: "POST";
|
|
48
|
+
readonly path: "/documents";
|
|
49
|
+
readonly body: DCommon.TheFormData<{
|
|
50
|
+
readonly bool: boolean;
|
|
51
|
+
readonly myFile: readonly File[] & DArray.LengthEqual<1>;
|
|
52
|
+
readonly name: string;
|
|
53
53
|
}>;
|
|
54
|
-
responses: {
|
|
55
|
-
code: "422";
|
|
56
|
-
information: "extract-error";
|
|
57
|
-
body
|
|
54
|
+
readonly responses: {
|
|
55
|
+
readonly code: "422";
|
|
56
|
+
readonly information: "extract-error";
|
|
57
|
+
readonly body: Error;
|
|
58
58
|
} | {
|
|
59
|
-
code: "204";
|
|
60
|
-
information: "file.receive";
|
|
61
|
-
body
|
|
59
|
+
readonly code: "204";
|
|
60
|
+
readonly information: "file.receive";
|
|
61
|
+
readonly body: undefined;
|
|
62
62
|
};
|
|
63
63
|
} | {
|
|
64
|
-
method: "GET";
|
|
65
|
-
path: "/posts";
|
|
66
|
-
query: {
|
|
67
|
-
page: number;
|
|
64
|
+
readonly method: "GET";
|
|
65
|
+
readonly path: "/posts";
|
|
66
|
+
readonly query: {
|
|
67
|
+
readonly page: number;
|
|
68
68
|
};
|
|
69
|
-
responses: {
|
|
70
|
-
code: "422";
|
|
71
|
-
information: "extract-error";
|
|
72
|
-
body
|
|
69
|
+
readonly responses: {
|
|
70
|
+
readonly code: "422";
|
|
71
|
+
readonly information: "extract-error";
|
|
72
|
+
readonly body: Error;
|
|
73
73
|
} | {
|
|
74
|
-
code: "200";
|
|
75
|
-
information: "post.findMany";
|
|
76
|
-
body: {
|
|
77
|
-
title: string;
|
|
78
|
-
content: string;
|
|
79
|
-
authorId: number;
|
|
74
|
+
readonly code: "200";
|
|
75
|
+
readonly information: "post.findMany";
|
|
76
|
+
readonly body: readonly {
|
|
77
|
+
readonly title: string;
|
|
78
|
+
readonly content: string;
|
|
79
|
+
readonly authorId: number;
|
|
80
80
|
}[];
|
|
81
81
|
};
|
|
82
82
|
};
|
|
@@ -138,18 +138,22 @@ await client
|
|
|
138
138
|
.whenInformation(
|
|
139
139
|
"post.findMany",
|
|
140
140
|
({ body }) => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
141
|
+
type _CheckPostBody = DCommon.ExpectType<
|
|
142
|
+
typeof body,
|
|
143
|
+
readonly {
|
|
144
|
+
readonly title: string;
|
|
145
|
+
readonly content: string;
|
|
146
|
+
readonly authorId: number;
|
|
147
|
+
}[],
|
|
148
|
+
"strict"
|
|
149
|
+
>;
|
|
146
150
|
void body;
|
|
147
151
|
},
|
|
148
152
|
)
|
|
149
153
|
.whenCode(
|
|
150
154
|
"422",
|
|
151
155
|
({ information }) => {
|
|
152
|
-
|
|
156
|
+
type _CheckErrorInformation = DCommon.ExpectType<typeof information, "extract-error", "strict">;
|
|
153
157
|
void information;
|
|
154
158
|
},
|
|
155
159
|
);
|
|
@@ -173,8 +177,7 @@ const maybeCreatedPost = await client
|
|
|
173
177
|
|
|
174
178
|
if (DEither.isRight(maybeCreatedPost)) {
|
|
175
179
|
const response = DEither.unwrapRight(maybeCreatedPost);
|
|
176
|
-
|
|
177
|
-
// information: "post.created"
|
|
180
|
+
type _CheckCreatedInformation = DCommon.ExpectType<typeof response.information, "post.created", "strict">;
|
|
178
181
|
void response.information;
|
|
179
182
|
}
|
|
180
183
|
|
|
@@ -193,6 +196,11 @@ const createdPostResponse = await client
|
|
|
193
196
|
},
|
|
194
197
|
)
|
|
195
198
|
.iWantInformationOrThrow("post.created");
|
|
199
|
+
type _CheckCreatedPostInformation = DCommon.ExpectType<
|
|
200
|
+
typeof createdPostResponse.information,
|
|
201
|
+
"post.created",
|
|
202
|
+
"strict"
|
|
203
|
+
>;
|
|
196
204
|
|
|
197
205
|
// `expected` regroupe les succès `2xx` et erreurs client `4xx`.
|
|
198
206
|
const maybeExpectedResponse = await client
|
|
@@ -208,8 +216,11 @@ const maybeExpectedResponse = await client
|
|
|
208
216
|
|
|
209
217
|
if (DEither.isRight(maybeExpectedResponse)) {
|
|
210
218
|
const response = DEither.unwrapRight(maybeExpectedResponse);
|
|
211
|
-
|
|
212
|
-
|
|
219
|
+
type _CheckExpectedInformation = DCommon.ExpectType<
|
|
220
|
+
typeof response.information,
|
|
221
|
+
"post.findMany" | "extract-error",
|
|
222
|
+
"strict"
|
|
223
|
+
>;
|
|
213
224
|
void response.information;
|
|
214
225
|
}
|
|
215
226
|
|
|
@@ -230,12 +241,11 @@ const maybePosts = await client
|
|
|
230
241
|
|
|
231
242
|
if (DEither.isRight(maybePosts)) {
|
|
232
243
|
const response = DEither.unwrapRight(maybePosts);
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
// }[]
|
|
244
|
+
type _CheckPostsBody = DCommon.ExpectType<typeof response.body, readonly {
|
|
245
|
+
readonly title: string;
|
|
246
|
+
readonly content: string;
|
|
247
|
+
readonly authorId: number;
|
|
248
|
+
}[], "strict">;
|
|
239
249
|
void response.body;
|
|
240
250
|
}
|
|
241
251
|
|
|
@@ -6,35 +6,35 @@
|
|
|
6
6
|
import { createHttpClient } from "@duplojs/http/client";
|
|
7
7
|
|
|
8
8
|
export type Routes = {
|
|
9
|
-
method: "GET";
|
|
10
|
-
path: "/profile";
|
|
11
|
-
responses: {
|
|
12
|
-
code: "401";
|
|
13
|
-
information: "auth.required";
|
|
14
|
-
body
|
|
9
|
+
readonly method: "GET";
|
|
10
|
+
readonly path: "/profile";
|
|
11
|
+
readonly responses: {
|
|
12
|
+
readonly code: "401";
|
|
13
|
+
readonly information: "auth.required";
|
|
14
|
+
readonly body: undefined;
|
|
15
15
|
} | {
|
|
16
|
-
code: "200";
|
|
17
|
-
information: "profile.found";
|
|
18
|
-
body: {
|
|
19
|
-
name: string;
|
|
20
|
-
email: string;
|
|
16
|
+
readonly code: "200";
|
|
17
|
+
readonly information: "profile.found";
|
|
18
|
+
readonly body: {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly email: string;
|
|
21
21
|
};
|
|
22
22
|
};
|
|
23
23
|
} | {
|
|
24
|
-
method: "POST";
|
|
25
|
-
path: "/users";
|
|
26
|
-
body: {
|
|
27
|
-
username: string;
|
|
28
|
-
age: number;
|
|
24
|
+
readonly method: "POST";
|
|
25
|
+
readonly path: "/users";
|
|
26
|
+
readonly body: {
|
|
27
|
+
readonly username: string;
|
|
28
|
+
readonly age: number;
|
|
29
29
|
};
|
|
30
|
-
responses: {
|
|
31
|
-
code: "422";
|
|
32
|
-
information: "extract-error";
|
|
33
|
-
body
|
|
30
|
+
readonly responses: {
|
|
31
|
+
readonly code: "422";
|
|
32
|
+
readonly information: "extract-error";
|
|
33
|
+
readonly body: Error;
|
|
34
34
|
} | {
|
|
35
|
-
code: "204";
|
|
36
|
-
information: "user.created";
|
|
37
|
-
body
|
|
35
|
+
readonly code: "204";
|
|
36
|
+
readonly information: "user.created";
|
|
37
|
+
readonly body: undefined;
|
|
38
38
|
};
|
|
39
39
|
};
|
|
40
40
|
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Initialisation et cycle de vie d’un formulaire Vue typé.
|
|
5
5
|
*/
|
|
6
|
-
import { createForm, useCheckLayout, useMultiLayout } from "@duplojs/form/vue";
|
|
6
|
+
import { createForm, useCheckLayout, useMultiLayout, type DetailsError } from "@duplojs/form/vue";
|
|
7
7
|
import { templateFormAddButton, templateFormNextButton, templateFormPreviousButton, templateFormRemoveButton, templateFormResetButton, templateFormSelect, useNumberInput, useTextInput } from "@duplojs/form/vueDesignSystem";
|
|
8
8
|
import { createGridTemplates } from "@duplojs/form/vueGrid";
|
|
9
9
|
import * as DDataStructure from "@duplojs/lang/dataStructure";
|
|
10
|
+
import type * as DCommon from "@duplojs/lang/common";
|
|
11
|
+
import type * as DEither from "@duplojs/lang/either";
|
|
12
|
+
import type * as DString from "@duplojs/lang/string";
|
|
10
13
|
|
|
11
14
|
// `createForm` fixe le système de rendu utilisé par cette famille de formulaires.
|
|
12
15
|
// `repeat`, `step` et `union` demandent des composants dédiés pour ajouter,
|
|
@@ -64,20 +67,24 @@ const { check, component: TheForm, currentValue, dispose, reset } = useForm(
|
|
|
64
67
|
);
|
|
65
68
|
|
|
66
69
|
// Valeur brute synchronisée avec l'état Vue du formulaire.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
type _CheckCurrentValue = DCommon.ExpectType<
|
|
71
|
+
typeof currentValue.value,
|
|
72
|
+
{
|
|
73
|
+
name: string;
|
|
74
|
+
email: string;
|
|
75
|
+
age: number;
|
|
76
|
+
},
|
|
77
|
+
"strict"
|
|
78
|
+
>;
|
|
72
79
|
void currentValue;
|
|
73
80
|
|
|
74
81
|
// `check` applique les validations déclarées et type la valeur validée.
|
|
75
|
-
// DEither.Error<DetailsError> | DEither.Success<{
|
|
76
|
-
// name: string;
|
|
77
|
-
// email: string & Email;
|
|
78
|
-
// age: number;
|
|
79
|
-
// }>
|
|
80
82
|
const checkedValue = await check();
|
|
83
|
+
type _CheckValue = DCommon.ExpectType<typeof checkedValue, DEither.Error<DetailsError> | DEither.Success<{
|
|
84
|
+
name: string;
|
|
85
|
+
email: string & DString.Email;
|
|
86
|
+
age: number;
|
|
87
|
+
}>, "strict">;
|
|
81
88
|
|
|
82
89
|
void checkedValue;
|
|
83
90
|
|
|
@@ -89,7 +96,3 @@ dispose();
|
|
|
89
96
|
|
|
90
97
|
// `component` est le composant Vue à monter ; le submit reste applicatif.
|
|
91
98
|
void TheForm;
|
|
92
|
-
|
|
93
|
-
// <TheForm @submit="() => console.log(check())">
|
|
94
|
-
// <PrimaryButton type="submit" label="Submit" />
|
|
95
|
-
// </TheForm>
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Création, intégration et validation des champs de saisie d’un formulaire Vue.
|
|
5
5
|
*/
|
|
6
|
-
import { createForm, createInput, useMultiLayout } from "@duplojs/form/vue";
|
|
6
|
+
import { createForm, createInput, type DetailsError, useMultiLayout } from "@duplojs/form/vue";
|
|
7
7
|
import { TextInput, templateFormAddButton, templateFormNextButton, templateFormPreviousButton, templateFormRemoveButton, templateFormResetButton, templateFormSelect, useNumberInput, useTextInput } from "@duplojs/form/vueDesignSystem";
|
|
8
8
|
import { createGridTemplates } from "@duplojs/form/vueGrid";
|
|
9
9
|
import * as DDataStructure from "@duplojs/lang/dataStructure";
|
|
10
|
+
import type * as DCommon from "@duplojs/lang/common";
|
|
11
|
+
import type * as DEither from "@duplojs/lang/either";
|
|
12
|
+
import type * as DString from "@duplojs/lang/string";
|
|
10
13
|
|
|
11
14
|
const gridTemplates = createGridTemplates({
|
|
12
15
|
repeat: {
|
|
@@ -50,10 +53,10 @@ const { component: TheForm, currentValue } = useForm(
|
|
|
50
53
|
}),
|
|
51
54
|
);
|
|
52
55
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
type _CheckCurrentValue = DCommon.ExpectType<typeof currentValue.value, {
|
|
57
|
+
name: string;
|
|
58
|
+
age: number;
|
|
59
|
+
}, "strict">;
|
|
57
60
|
void currentValue;
|
|
58
61
|
void TheForm;
|
|
59
62
|
|
|
@@ -90,7 +93,11 @@ const { check } = useForm(
|
|
|
90
93
|
|
|
91
94
|
// Lors du `check`, la librairie appelle d'abord le `check` exposé par le
|
|
92
95
|
// composant s'il existe, puis applique la `dataStructure` de l'input.
|
|
93
|
-
// DEither.Error<DetailsError> | DEither.Success<string & Email>
|
|
94
96
|
const checkedEmail = await check();
|
|
97
|
+
type _CheckCheckedEmail = DCommon.ExpectType<
|
|
98
|
+
typeof checkedEmail,
|
|
99
|
+
DEither.Error<DetailsError> | DEither.Success<string & DString.Email>,
|
|
100
|
+
"strict"
|
|
101
|
+
>;
|
|
95
102
|
|
|
96
103
|
void checkedEmail;
|