shelving 1.236.0 → 1.236.2
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/api/cache/APICache.d.ts +69 -6
- package/api/cache/APICache.js +61 -5
- package/api/cache/EndpointCache.d.ts +75 -7
- package/api/cache/EndpointCache.js +75 -7
- package/api/endpoint/Endpoint.d.ts +141 -25
- package/api/endpoint/Endpoint.js +55 -9
- package/api/endpoint/util.d.ts +28 -6
- package/api/provider/APIProvider.d.ts +58 -14
- package/api/provider/APIProvider.js +24 -2
- package/api/provider/CachedAPIProvider.d.ts +58 -5
- package/api/provider/CachedAPIProvider.js +58 -6
- package/api/provider/ClientAPIProvider.d.ts +80 -4
- package/api/provider/ClientAPIProvider.js +75 -4
- package/api/provider/DebugAPIProvider.d.ts +40 -1
- package/api/provider/DebugAPIProvider.js +40 -1
- package/api/provider/JSONAPIProvider.d.ts +18 -2
- package/api/provider/JSONAPIProvider.js +18 -2
- package/api/provider/LoggingAPIProvider.d.ts +25 -2
- package/api/provider/LoggingAPIProvider.js +25 -2
- package/api/provider/MockAPIProvider.d.ts +72 -1
- package/api/provider/MockAPIProvider.js +60 -4
- package/api/provider/MockEndpointAPIProvider.d.ts +9 -0
- package/api/provider/MockEndpointAPIProvider.js +9 -0
- package/api/provider/ThroughAPIProvider.d.ts +67 -1
- package/api/provider/ThroughAPIProvider.js +67 -1
- package/api/provider/ValidationAPIProvider.d.ts +32 -1
- package/api/provider/ValidationAPIProvider.js +32 -1
- package/api/provider/XMLAPIProvider.d.ts +18 -2
- package/api/provider/XMLAPIProvider.js +18 -2
- package/api/store/EndpointStore.d.ts +24 -1
- package/api/store/EndpointStore.js +24 -1
- package/bun/BunPostgreSQLProvider.d.ts +38 -0
- package/bun/BunPostgreSQLProvider.js +38 -2
- package/cloudflare/CloudflareD1Provider.d.ts +29 -2
- package/cloudflare/CloudflareD1Provider.js +29 -2
- package/cloudflare/CloudflareKVProvider.d.ts +115 -0
- package/cloudflare/CloudflareKVProvider.js +115 -0
- package/cloudflare/types.d.ts +41 -7
- package/db/cache/CollectionCache.d.ts +83 -7
- package/db/cache/CollectionCache.js +83 -7
- package/db/cache/DBCache.d.ts +93 -8
- package/db/cache/DBCache.js +85 -7
- package/db/collection/Collection.d.ts +103 -15
- package/db/collection/Collection.js +58 -6
- package/db/migrate/DBMigrator.d.ts +29 -1
- package/db/migrate/DBMigrator.js +20 -1
- package/db/migrate/PostgreSQLMigrator.d.ts +8 -1
- package/db/migrate/PostgreSQLMigrator.js +8 -1
- package/db/migrate/SQLMigrator.d.ts +63 -4
- package/db/migrate/SQLMigrator.js +51 -1
- package/db/migrate/SQLiteMigrator.d.ts +8 -1
- package/db/migrate/SQLiteMigrator.js +8 -1
- package/db/provider/CacheDBProvider.d.ts +135 -1
- package/db/provider/CacheDBProvider.js +135 -1
- package/db/provider/ChangesDBProvider.d.ts +84 -3
- package/db/provider/ChangesDBProvider.js +77 -2
- package/db/provider/DBProvider.d.ts +148 -1
- package/db/provider/DBProvider.js +51 -1
- package/db/provider/DebugDBProvider.d.ts +118 -1
- package/db/provider/DebugDBProvider.js +118 -1
- package/db/provider/MemoryDBProvider.d.ts +262 -7
- package/db/provider/MemoryDBProvider.js +262 -7
- package/db/provider/MockDBProvider.d.ts +113 -2
- package/db/provider/MockDBProvider.js +106 -1
- package/db/provider/PostgreSQLProvider.d.ts +34 -2
- package/db/provider/PostgreSQLProvider.js +34 -4
- package/db/provider/SQLProvider.d.ts +250 -14
- package/db/provider/SQLProvider.js +237 -13
- package/db/provider/SQLiteProvider.d.ts +41 -1
- package/db/provider/SQLiteProvider.js +41 -4
- package/db/provider/ThroughDBProvider.d.ts +156 -1
- package/db/provider/ThroughDBProvider.js +156 -1
- package/db/provider/ValidationDBProvider.d.ts +120 -1
- package/db/provider/ValidationDBProvider.js +120 -1
- package/db/store/ItemStore.d.ts +38 -2
- package/db/store/ItemStore.js +38 -2
- package/db/store/QueryStore.d.ts +64 -6
- package/db/store/QueryStore.js +64 -6
- package/error/BaseError.d.ts +27 -2
- package/error/BaseError.js +14 -0
- package/error/Errors.d.ts +12 -1
- package/error/Errors.js +12 -1
- package/error/NetworkError.d.ts +13 -1
- package/error/NetworkError.js +13 -1
- package/error/RequestError.d.ts +90 -7
- package/error/RequestError.js +90 -7
- package/error/RequiredError.d.ts +11 -1
- package/error/RequiredError.js +11 -1
- package/error/ResponseError.d.ts +19 -2
- package/error/ResponseError.js +19 -2
- package/error/UnexpectedError.d.ts +14 -1
- package/error/UnexpectedError.js +14 -1
- package/error/UnimplementedError.d.ts +13 -1
- package/error/UnimplementedError.js +13 -1
- package/error/ValueError.d.ts +14 -1
- package/error/ValueError.js +14 -1
- package/extract/DirectoryExtractor.d.ts +35 -1
- package/extract/DirectoryExtractor.js +30 -0
- package/extract/Extractor.d.ts +21 -2
- package/extract/Extractor.js +7 -1
- package/extract/FileExtractor.d.ts +18 -0
- package/extract/FileExtractor.js +18 -0
- package/extract/IndexExtractor.d.ts +36 -1
- package/extract/IndexExtractor.js +31 -0
- package/extract/MarkupExtractor.d.ts +15 -0
- package/extract/MarkupExtractor.js +15 -0
- package/extract/MergingExtractor.d.ts +36 -1
- package/extract/MergingExtractor.js +31 -0
- package/extract/ModuleExtractor.d.ts +25 -1
- package/extract/ModuleExtractor.js +20 -0
- package/extract/PackageExtractor.d.ts +36 -1
- package/extract/PackageExtractor.js +31 -0
- package/extract/ThroughExtractor.d.ts +22 -1
- package/extract/ThroughExtractor.js +22 -1
- package/extract/TypescriptExtractor.d.ts +21 -0
- package/extract/TypescriptExtractor.js +28 -3
- package/firestore/client/FirestoreClientProvider.d.ts +129 -4
- package/firestore/client/FirestoreClientProvider.js +129 -4
- package/firestore/lite/FirestoreLiteProvider.d.ts +128 -3
- package/firestore/lite/FirestoreLiteProvider.js +128 -3
- package/firestore/server/FirestoreServerProvider.d.ts +129 -2
- package/firestore/server/FirestoreServerProvider.js +129 -2
- package/markup/MarkupParser.d.ts +57 -10
- package/markup/MarkupParser.js +50 -9
- package/markup/MarkupRule.d.ts +34 -1
- package/markup/Parser.d.ts +18 -0
- package/markup/Parser.js +11 -0
- package/markup/rule/blockquote.d.ts +3 -0
- package/markup/rule/blockquote.js +3 -0
- package/markup/rule/code.d.ts +3 -0
- package/markup/rule/code.js +3 -0
- package/markup/rule/fenced.d.ts +3 -0
- package/markup/rule/fenced.js +3 -0
- package/markup/rule/heading.d.ts +3 -0
- package/markup/rule/heading.js +3 -0
- package/markup/rule/index.d.ts +16 -3
- package/markup/rule/index.js +16 -3
- package/markup/rule/inline.d.ts +4 -1
- package/markup/rule/inline.js +5 -2
- package/markup/rule/linebreak.d.ts +3 -0
- package/markup/rule/linebreak.js +3 -0
- package/markup/rule/link.d.ts +6 -0
- package/markup/rule/link.js +6 -0
- package/markup/rule/ordered.d.ts +3 -0
- package/markup/rule/ordered.js +3 -0
- package/markup/rule/paragraph.d.ts +3 -0
- package/markup/rule/paragraph.js +3 -0
- package/markup/rule/separator.d.ts +3 -0
- package/markup/rule/separator.js +3 -0
- package/markup/rule/table.d.ts +3 -0
- package/markup/rule/table.js +3 -0
- package/markup/rule/unordered.d.ts +3 -0
- package/markup/rule/unordered.js +3 -0
- package/markup/util/regexp.d.ts +80 -3
- package/markup/util/regexp.js +44 -0
- package/package.json +1 -1
- package/react/createAPIContext.d.ts +15 -0
- package/react/createAPIContext.js +10 -0
- package/react/createDBContext.d.ts +15 -0
- package/react/createDBContext.js +10 -0
- package/react/useInstance.d.ts +11 -0
- package/react/useInstance.js +11 -0
- package/react/useLazy.d.ts +11 -0
- package/react/useMap.d.ts +14 -1
- package/react/useMap.js +14 -1
- package/react/useReduce.d.ts +12 -0
- package/react/useSequence.d.ts +10 -0
- package/react/useSequence.js +10 -0
- package/react/useStore.d.ts +16 -1
- package/schema/AddressSchema.d.ts +41 -4
- package/schema/AddressSchema.js +36 -3
- package/schema/ArraySchema.d.ts +48 -6
- package/schema/ArraySchema.js +40 -5
- package/schema/BooleanSchema.d.ts +59 -3
- package/schema/BooleanSchema.js +51 -2
- package/schema/ChoiceSchema.d.ts +61 -7
- package/schema/ChoiceSchema.js +44 -2
- package/schema/ColorSchema.d.ts +41 -8
- package/schema/ColorSchema.js +36 -7
- package/schema/CountrySchema.d.ts +44 -4
- package/schema/CountrySchema.js +39 -3
- package/schema/CurrencyAmountSchema.d.ts +104 -8
- package/schema/CurrencyAmountSchema.js +91 -4
- package/schema/CurrencyCodeSchema.d.ts +56 -4
- package/schema/CurrencyCodeSchema.js +49 -3
- package/schema/DataSchema.d.ts +101 -10
- package/schema/DataSchema.js +87 -8
- package/schema/DateSchema.d.ts +73 -4
- package/schema/DateSchema.js +57 -2
- package/schema/DateTimeSchema.d.ts +40 -3
- package/schema/DateTimeSchema.js +40 -3
- package/schema/DictionarySchema.d.ts +54 -4
- package/schema/DictionarySchema.js +47 -3
- package/schema/EmailSchema.d.ts +34 -3
- package/schema/EmailSchema.js +34 -3
- package/schema/EntitySchema.d.ts +45 -4
- package/schema/EntitySchema.js +38 -3
- package/schema/FileSchema.d.ts +45 -4
- package/schema/FileSchema.js +39 -3
- package/schema/KeySchema.d.ts +32 -3
- package/schema/KeySchema.js +32 -3
- package/schema/NullableSchema.d.ts +64 -4
- package/schema/NullableSchema.js +59 -3
- package/schema/NumberSchema.d.ts +137 -12
- package/schema/NumberSchema.js +127 -11
- package/schema/OptionalSchema.d.ts +61 -4
- package/schema/OptionalSchema.js +56 -4
- package/schema/PasswordSchema.d.ts +37 -1
- package/schema/PasswordSchema.js +32 -1
- package/schema/PhoneSchema.d.ts +40 -4
- package/schema/PhoneSchema.js +35 -3
- package/schema/RequiredSchema.d.ts +39 -3
- package/schema/RequiredSchema.js +41 -3
- package/schema/Schema.d.ts +67 -7
- package/schema/Schema.js +42 -6
- package/schema/SlugSchema.d.ts +37 -5
- package/schema/SlugSchema.js +37 -5
- package/schema/StringSchema.d.ts +124 -19
- package/schema/StringSchema.js +107 -17
- package/schema/ThroughSchema.d.ts +35 -2
- package/schema/ThroughSchema.js +30 -1
- package/schema/TimeSchema.d.ts +43 -3
- package/schema/TimeSchema.js +43 -3
- package/schema/URISchema.d.ts +67 -6
- package/schema/URISchema.js +60 -6
- package/schema/URLSchema.d.ts +69 -6
- package/schema/URLSchema.js +61 -6
- package/schema/UUIDSchema.d.ts +37 -4
- package/schema/UUIDSchema.js +37 -4
- package/sequence/DeferredSequence.d.ts +49 -3
- package/sequence/DeferredSequence.js +39 -3
- package/sequence/InspectSequence.d.ts +59 -5
- package/sequence/InspectSequence.js +59 -5
- package/sequence/LazySequence.d.ts +30 -2
- package/sequence/LazySequence.js +30 -2
- package/sequence/Sequence.d.ts +11 -0
- package/sequence/Sequence.js +10 -0
- package/sequence/ThroughSequence.d.ts +15 -0
- package/sequence/ThroughSequence.js +15 -0
- package/store/ArrayStore.d.ts +74 -11
- package/store/ArrayStore.js +74 -11
- package/store/BooleanStore.d.ts +19 -2
- package/store/BooleanStore.js +19 -2
- package/store/BusyStore.d.ts +13 -1
- package/store/BusyStore.js +13 -1
- package/store/DataStore.d.ts +118 -15
- package/store/DataStore.js +118 -15
- package/store/DictionaryStore.d.ts +66 -8
- package/store/DictionaryStore.js +66 -8
- package/store/FetchStore.d.ts +43 -6
- package/store/FetchStore.js +36 -5
- package/store/PathStore.d.ts +44 -5
- package/store/PathStore.js +44 -5
- package/store/PayloadFetchStore.d.ts +16 -1
- package/store/PayloadFetchStore.js +9 -1
- package/store/Store.d.ts +85 -16
- package/store/Store.js +52 -10
- package/store/URLStore.d.ts +173 -15
- package/store/URLStore.js +173 -15
- package/test/basics.d.ts +70 -0
- package/test/basics.js +60 -0
- package/test/people.d.ts +45 -0
- package/test/people.js +35 -0
- package/test/util.d.ts +30 -3
- package/test/util.js +30 -3
- package/ui/app/App.d.ts +14 -2
- package/ui/app/App.js +9 -2
- package/ui/app/App.tsx +14 -2
- package/ui/block/Address.d.ts +45 -3
- package/ui/block/Address.js +30 -3
- package/ui/block/Address.tsx +46 -3
- package/ui/block/Block.d.ts +23 -1
- package/ui/block/Block.js +13 -1
- package/ui/block/Block.tsx +23 -1
- package/ui/block/Blockquote.d.ts +21 -0
- package/ui/block/Blockquote.js +16 -0
- package/ui/block/Blockquote.tsx +22 -0
- package/ui/block/Caption.d.ts +21 -1
- package/ui/block/Caption.js +16 -1
- package/ui/block/Caption.tsx +22 -1
- package/ui/block/Card.d.ts +6 -0
- package/ui/block/Card.js +1 -0
- package/ui/block/Card.tsx +6 -0
- package/ui/block/Definitions.d.ts +18 -0
- package/ui/block/Definitions.js +13 -0
- package/ui/block/Definitions.tsx +19 -0
- package/ui/block/Divider.d.ts +21 -0
- package/ui/block/Divider.js +16 -0
- package/ui/block/Divider.tsx +22 -0
- package/ui/block/Heading.d.ts +20 -1
- package/ui/block/Heading.js +15 -0
- package/ui/block/Heading.tsx +21 -1
- package/ui/block/Image.d.ts +23 -0
- package/ui/block/Image.js +18 -0
- package/ui/block/Image.tsx +24 -0
- package/ui/block/Label.d.ts +18 -3
- package/ui/block/Label.js +13 -3
- package/ui/block/Label.tsx +18 -3
- package/ui/block/List.d.ts +30 -0
- package/ui/block/List.js +25 -0
- package/ui/block/List.tsx +32 -0
- package/ui/block/Panel.d.ts +13 -1
- package/ui/block/Panel.js +3 -0
- package/ui/block/Panel.tsx +13 -1
- package/ui/block/Paragraph.d.ts +23 -0
- package/ui/block/Paragraph.js +18 -0
- package/ui/block/Paragraph.tsx +24 -0
- package/ui/block/Preformatted.d.ts +20 -0
- package/ui/block/Preformatted.js +15 -0
- package/ui/block/Preformatted.tsx +21 -0
- package/ui/block/Prose.d.ts +14 -1
- package/ui/block/Prose.js +9 -1
- package/ui/block/Prose.tsx +14 -1
- package/ui/block/Section.d.ts +69 -6
- package/ui/block/Section.js +59 -6
- package/ui/block/Section.tsx +70 -6
- package/ui/block/Subheading.d.ts +20 -1
- package/ui/block/Subheading.js +15 -0
- package/ui/block/Subheading.tsx +21 -1
- package/ui/block/Table.d.ts +20 -0
- package/ui/block/Table.js +15 -0
- package/ui/block/Table.tsx +21 -0
- package/ui/block/Title.d.ts +20 -1
- package/ui/block/Title.js +15 -0
- package/ui/block/Title.tsx +21 -1
- package/ui/block/Video.d.ts +50 -3
- package/ui/block/Video.js +30 -3
- package/ui/block/Video.tsx +50 -3
- package/ui/dialog/Dialog.d.ts +28 -1
- package/ui/dialog/Dialog.js +18 -1
- package/ui/dialog/Dialog.tsx +28 -1
- package/ui/dialog/Dialogs.d.ts +53 -6
- package/ui/dialog/Dialogs.js +43 -6
- package/ui/dialog/Dialogs.tsx +53 -6
- package/ui/dialog/Modal.d.ts +13 -0
- package/ui/dialog/Modal.js +8 -0
- package/ui/dialog/Modal.tsx +13 -0
- package/ui/docs/DocumentationButtons.d.ts +5 -1
- package/ui/docs/DocumentationButtons.tsx +5 -1
- package/ui/docs/DocumentationCard.d.ts +6 -1
- package/ui/docs/DocumentationCard.js +6 -1
- package/ui/docs/DocumentationCard.tsx +6 -1
- package/ui/docs/DocumentationKind.d.ts +13 -1
- package/ui/docs/DocumentationKind.js +8 -0
- package/ui/docs/DocumentationKind.tsx +13 -1
- package/ui/docs/DocumentationPage.d.ts +6 -1
- package/ui/docs/DocumentationPage.js +6 -1
- package/ui/docs/DocumentationPage.tsx +6 -1
- package/ui/docs/DocumentationSignatures.d.ts +10 -1
- package/ui/docs/DocumentationSignatures.js +5 -0
- package/ui/docs/DocumentationSignatures.tsx +10 -1
- package/ui/form/ArrayInput.d.ts +15 -0
- package/ui/form/ArrayInput.tsx +15 -0
- package/ui/form/ArrayRadioInputs.d.ts +10 -0
- package/ui/form/ArrayRadioInputs.js +5 -0
- package/ui/form/ArrayRadioInputs.tsx +10 -0
- package/ui/form/Button.d.ts +19 -3
- package/ui/form/Button.js +14 -2
- package/ui/form/Button.tsx +19 -3
- package/ui/form/ButtonInput.d.ts +14 -1
- package/ui/form/ButtonInput.js +9 -1
- package/ui/form/ButtonInput.tsx +14 -1
- package/ui/form/ButtonInputPopover.d.ts +10 -0
- package/ui/form/ButtonInputPopover.js +5 -0
- package/ui/form/ButtonInputPopover.tsx +10 -0
- package/ui/form/ButtonPopover.d.ts +11 -1
- package/ui/form/ButtonPopover.js +6 -1
- package/ui/form/ButtonPopover.tsx +11 -1
- package/ui/form/CheckboxInput.d.ts +14 -1
- package/ui/form/CheckboxInput.js +9 -1
- package/ui/form/CheckboxInput.tsx +14 -1
- package/ui/form/ChoiceRadioInputs.d.ts +10 -0
- package/ui/form/ChoiceRadioInputs.tsx +10 -0
- package/ui/form/Clickable.d.ts +45 -5
- package/ui/form/Clickable.js +30 -3
- package/ui/form/Clickable.tsx +45 -5
- package/ui/form/DataInput.d.ts +14 -0
- package/ui/form/DataInput.tsx +14 -0
- package/ui/form/DateInput.d.ts +14 -0
- package/ui/form/DateInput.js +9 -0
- package/ui/form/DateInput.tsx +14 -0
- package/ui/form/DictionaryInput.d.ts +15 -0
- package/ui/form/DictionaryInput.tsx +15 -0
- package/ui/form/Field.d.ts +5 -0
- package/ui/form/Field.tsx +5 -0
- package/ui/form/FileInput.d.ts +14 -0
- package/ui/form/FileInput.js +9 -0
- package/ui/form/FileInput.tsx +14 -0
- package/ui/form/Form.d.ts +55 -6
- package/ui/form/Form.js +35 -3
- package/ui/form/Form.tsx +55 -6
- package/ui/form/FormContext.d.ts +24 -3
- package/ui/form/FormContext.js +5 -1
- package/ui/form/FormContext.tsx +24 -3
- package/ui/form/FormFields.d.ts +15 -2
- package/ui/form/FormFields.js +15 -2
- package/ui/form/FormFields.tsx +15 -2
- package/ui/form/FormFooter.d.ts +13 -3
- package/ui/form/FormFooter.js +8 -3
- package/ui/form/FormFooter.tsx +13 -3
- package/ui/form/FormInput.d.ts +21 -2
- package/ui/form/FormInput.js +16 -2
- package/ui/form/FormInput.tsx +21 -2
- package/ui/form/FormMessage.d.ts +8 -1
- package/ui/form/FormMessage.js +8 -1
- package/ui/form/FormMessage.tsx +8 -2
- package/ui/form/FormNotice.d.ts +8 -1
- package/ui/form/FormNotice.js +8 -1
- package/ui/form/FormNotice.tsx +8 -2
- package/ui/form/FormNotify.d.ts +8 -1
- package/ui/form/FormNotify.js +8 -1
- package/ui/form/FormNotify.tsx +8 -2
- package/ui/form/FormStore.d.ts +50 -6
- package/ui/form/FormStore.js +50 -6
- package/ui/form/FormStore.tsx +50 -6
- package/ui/form/Input.d.ts +65 -1
- package/ui/form/Input.js +60 -0
- package/ui/form/Input.tsx +77 -1
- package/ui/form/NumberInput.d.ts +14 -0
- package/ui/form/NumberInput.js +9 -0
- package/ui/form/NumberInput.tsx +14 -0
- package/ui/form/OutputInput.d.ts +13 -1
- package/ui/form/OutputInput.js +8 -1
- package/ui/form/OutputInput.tsx +13 -1
- package/ui/form/Popover.d.ts +18 -2
- package/ui/form/Popover.js +8 -2
- package/ui/form/Popover.tsx +18 -2
- package/ui/form/Progress.d.ts +26 -2
- package/ui/form/Progress.js +16 -2
- package/ui/form/Progress.tsx +26 -2
- package/ui/form/QueryInput.d.ts +14 -5
- package/ui/form/QueryInput.js +9 -5
- package/ui/form/QueryInput.tsx +14 -5
- package/ui/form/RadioInput.d.ts +14 -1
- package/ui/form/RadioInput.js +9 -1
- package/ui/form/RadioInput.tsx +14 -1
- package/ui/form/SchemaInput.d.ts +138 -7
- package/ui/form/SchemaInput.js +79 -4
- package/ui/form/SchemaInput.tsx +138 -7
- package/ui/form/SelectInput.d.ts +14 -0
- package/ui/form/SelectInput.tsx +14 -0
- package/ui/form/SubmitButton.d.ts +14 -1
- package/ui/form/SubmitButton.js +9 -1
- package/ui/form/SubmitButton.tsx +14 -1
- package/ui/form/TextInput.d.ts +15 -0
- package/ui/form/TextInput.js +10 -0
- package/ui/form/TextInput.tsx +15 -0
- package/ui/inline/Code.d.ts +29 -0
- package/ui/inline/Code.js +24 -0
- package/ui/inline/Code.tsx +31 -0
- package/ui/inline/Deleted.d.ts +23 -0
- package/ui/inline/Deleted.js +18 -0
- package/ui/inline/Deleted.tsx +24 -0
- package/ui/inline/Emphasis.d.ts +23 -0
- package/ui/inline/Emphasis.js +18 -0
- package/ui/inline/Emphasis.tsx +24 -0
- package/ui/inline/Inserted.d.ts +23 -0
- package/ui/inline/Inserted.js +18 -0
- package/ui/inline/Inserted.tsx +24 -0
- package/ui/inline/Link.d.ts +23 -0
- package/ui/inline/Link.js +18 -0
- package/ui/inline/Link.tsx +24 -0
- package/ui/inline/Mark.d.ts +23 -0
- package/ui/inline/Mark.js +18 -0
- package/ui/inline/Mark.tsx +24 -0
- package/ui/inline/Small.d.ts +23 -0
- package/ui/inline/Small.js +18 -0
- package/ui/inline/Small.tsx +24 -0
- package/ui/inline/Strong.d.ts +23 -0
- package/ui/inline/Strong.js +18 -0
- package/ui/inline/Strong.tsx +24 -0
- package/ui/inline/Subscript.d.ts +23 -0
- package/ui/inline/Subscript.js +18 -0
- package/ui/inline/Subscript.tsx +24 -0
- package/ui/inline/Superscript.d.ts +23 -0
- package/ui/inline/Superscript.js +18 -0
- package/ui/inline/Superscript.tsx +24 -0
- package/ui/inline/When.d.ts +42 -3
- package/ui/inline/When.js +27 -3
- package/ui/inline/When.tsx +42 -3
- package/ui/layout/CenteredLayout.d.ts +12 -1
- package/ui/layout/CenteredLayout.js +7 -1
- package/ui/layout/CenteredLayout.tsx +12 -1
- package/ui/layout/Layout.d.ts +12 -3
- package/ui/layout/Layout.js +12 -3
- package/ui/layout/Layout.ts +12 -3
- package/ui/layout/SidebarLayout.d.ts +12 -0
- package/ui/layout/SidebarLayout.js +7 -0
- package/ui/layout/SidebarLayout.tsx +12 -0
- package/ui/menu/Menu.d.ts +22 -0
- package/ui/menu/Menu.js +12 -0
- package/ui/menu/Menu.tsx +22 -0
- package/ui/misc/Catcher.d.ts +77 -5
- package/ui/misc/Catcher.js +47 -5
- package/ui/misc/Catcher.tsx +77 -5
- package/ui/misc/Loading.d.ts +20 -0
- package/ui/misc/Loading.js +15 -0
- package/ui/misc/Loading.tsx +20 -0
- package/ui/misc/Mapper.d.ts +13 -1
- package/ui/misc/Mapper.js +4 -0
- package/ui/misc/Mapper.tsx +13 -1
- package/ui/misc/Markup.d.ts +9 -1
- package/ui/misc/Markup.js +4 -0
- package/ui/misc/Markup.tsx +9 -1
- package/ui/misc/MetaContext.d.ts +24 -7
- package/ui/misc/MetaContext.js +19 -6
- package/ui/misc/MetaContext.tsx +24 -7
- package/ui/misc/StatusIcon.d.ts +16 -1
- package/ui/misc/StatusIcon.js +11 -1
- package/ui/misc/StatusIcon.tsx +16 -1
- package/ui/misc/Tag.d.ts +21 -0
- package/ui/misc/Tag.js +11 -0
- package/ui/misc/Tag.tsx +21 -0
- package/ui/notice/Message.d.ts +27 -1
- package/ui/notice/Message.js +22 -1
- package/ui/notice/Message.tsx +27 -1
- package/ui/notice/Notice.d.ts +24 -0
- package/ui/notice/Notice.js +19 -0
- package/ui/notice/Notice.tsx +24 -0
- package/ui/notice/NoticeStore.d.ts +30 -2
- package/ui/notice/NoticeStore.js +30 -2
- package/ui/notice/NoticeStore.ts +30 -2
- package/ui/notice/Notices.d.ts +11 -1
- package/ui/notice/Notices.js +6 -1
- package/ui/notice/Notices.tsx +11 -1
- package/ui/notice/NoticesStore.d.ts +23 -3
- package/ui/notice/NoticesStore.js +23 -3
- package/ui/notice/NoticesStore.ts +23 -3
- package/ui/page/HTML.d.ts +13 -2
- package/ui/page/HTML.js +8 -2
- package/ui/page/HTML.tsx +13 -2
- package/ui/page/Head.d.ts +5 -1
- package/ui/page/Head.js +5 -1
- package/ui/page/Head.tsx +5 -1
- package/ui/page/Page.d.ts +12 -1
- package/ui/page/Page.js +7 -1
- package/ui/page/Page.tsx +12 -1
- package/ui/router/Navigation.d.ts +11 -0
- package/ui/router/Navigation.js +6 -0
- package/ui/router/Navigation.tsx +11 -0
- package/ui/router/NavigationContext.d.ts +14 -2
- package/ui/router/NavigationContext.js +14 -2
- package/ui/router/NavigationContext.tsx +14 -2
- package/ui/router/NavigationStore.d.ts +29 -1
- package/ui/router/NavigationStore.js +29 -1
- package/ui/router/NavigationStore.tsx +29 -1
- package/ui/router/Router.d.ts +12 -1
- package/ui/router/Router.js +7 -1
- package/ui/router/Router.tsx +12 -1
- package/ui/router/Routes.d.ts +14 -4
- package/ui/router/Routes.tsx +14 -4
- package/ui/style/Color.d.ts +15 -2
- package/ui/style/Color.js +5 -0
- package/ui/style/Color.tsx +15 -2
- package/ui/style/Flex.d.ts +41 -4
- package/ui/style/Flex.js +26 -3
- package/ui/style/Flex.tsx +41 -4
- package/ui/style/Gap.d.ts +18 -3
- package/ui/style/Gap.js +8 -1
- package/ui/style/Gap.tsx +18 -3
- package/ui/style/Padding.d.ts +18 -3
- package/ui/style/Padding.js +8 -1
- package/ui/style/Padding.tsx +18 -3
- package/ui/style/Scroll.d.ts +36 -1
- package/ui/style/Scroll.js +26 -1
- package/ui/style/Scroll.tsx +37 -1
- package/ui/style/Space.d.ts +18 -3
- package/ui/style/Space.js +8 -1
- package/ui/style/Space.tsx +18 -3
- package/ui/style/Status.d.ts +23 -7
- package/ui/style/Status.js +13 -5
- package/ui/style/Status.tsx +23 -7
- package/ui/style/Tint.d.ts +7 -1
- package/ui/style/Tint.js +7 -1
- package/ui/style/Tint.tsx +7 -1
- package/ui/style/Typography.d.ts +38 -6
- package/ui/style/Typography.js +8 -0
- package/ui/style/Typography.tsx +38 -6
- package/ui/style/Width.d.ts +18 -1
- package/ui/style/Width.js +8 -0
- package/ui/style/Width.tsx +18 -1
- package/ui/transition/CollapseTransition.d.ts +13 -0
- package/ui/transition/CollapseTransition.js +8 -0
- package/ui/transition/CollapseTransition.tsx +13 -0
- package/ui/transition/FadeTransition.d.ts +13 -0
- package/ui/transition/FadeTransition.js +8 -0
- package/ui/transition/FadeTransition.tsx +13 -0
- package/ui/transition/HorizontalTransition.d.ts +13 -0
- package/ui/transition/HorizontalTransition.js +8 -0
- package/ui/transition/HorizontalTransition.tsx +13 -0
- package/ui/transition/Transition.d.ts +12 -4
- package/ui/transition/Transition.js +7 -3
- package/ui/transition/Transition.tsx +12 -4
- package/ui/transition/VerticalTransition.d.ts +13 -0
- package/ui/transition/VerticalTransition.js +8 -0
- package/ui/transition/VerticalTransition.tsx +13 -0
- package/ui/transition/util.d.ts +16 -6
- package/ui/transition/util.js +7 -1
- package/ui/transition/util.tsx +16 -6
- package/ui/tree/TreeApp.d.ts +11 -0
- package/ui/tree/TreeApp.js +6 -0
- package/ui/tree/TreeApp.tsx +11 -0
- package/ui/tree/TreeBreadcrumbs.d.ts +11 -0
- package/ui/tree/TreeBreadcrumbs.js +6 -0
- package/ui/tree/TreeBreadcrumbs.tsx +11 -0
- package/ui/tree/TreeButton.d.ts +9 -1
- package/ui/tree/TreeButton.js +4 -0
- package/ui/tree/TreeButton.tsx +9 -1
- package/ui/tree/TreeCard.d.ts +8 -1
- package/ui/tree/TreeCard.js +8 -1
- package/ui/tree/TreeCard.tsx +8 -1
- package/ui/tree/TreeCards.d.ts +16 -1
- package/ui/tree/TreeCards.js +11 -1
- package/ui/tree/TreeCards.tsx +16 -1
- package/ui/tree/TreeContext.d.ts +18 -1
- package/ui/tree/TreeContext.js +18 -1
- package/ui/tree/TreeContext.tsx +18 -1
- package/ui/tree/TreeMenu.d.ts +28 -1
- package/ui/tree/TreeMenu.js +23 -1
- package/ui/tree/TreeMenu.tsx +28 -1
- package/ui/tree/TreePage.d.ts +6 -0
- package/ui/tree/TreePage.js +6 -0
- package/ui/tree/TreePage.tsx +6 -0
- package/ui/tree/TreeRouter.d.ts +17 -2
- package/ui/tree/TreeRouter.js +12 -2
- package/ui/tree/TreeRouter.tsx +17 -2
- package/ui/tree/TreeSidebar.d.ts +11 -0
- package/ui/tree/TreeSidebar.js +6 -0
- package/ui/tree/TreeSidebar.tsx +11 -0
- package/ui/util/context.d.ts +13 -1
- package/ui/util/context.ts +13 -1
- package/ui/util/css.d.ts +17 -4
- package/ui/util/css.js +5 -1
- package/ui/util/css.ts +17 -4
- package/ui/util/event.d.ts +9 -1
- package/ui/util/event.js +9 -1
- package/ui/util/event.ts +9 -1
- package/ui/util/focus.d.ts +24 -5
- package/ui/util/focus.js +24 -5
- package/ui/util/focus.ts +24 -5
- package/ui/util/meta.d.ts +113 -21
- package/ui/util/meta.js +73 -13
- package/ui/util/meta.ts +113 -21
- package/ui/util/notice.d.ts +98 -10
- package/ui/util/notice.js +93 -9
- package/ui/util/notice.ts +98 -10
- package/ui/util/props.d.ts +10 -2
- package/ui/util/props.ts +10 -2
- package/ui/util/refresh.d.ts +10 -1
- package/ui/util/refresh.js +10 -1
- package/ui/util/refresh.ts +10 -1
- package/ui/util/scroll.d.ts +20 -4
- package/ui/util/scroll.js +20 -4
- package/ui/util/scroll.ts +20 -4
- package/ui/util/state.d.ts +19 -5
- package/ui/util/state.js +19 -5
- package/ui/util/state.ts +19 -5
- package/util/ansi.d.ts +118 -0
- package/util/ansi.js +116 -0
- package/util/array.d.ts +349 -33
- package/util/array.js +284 -27
- package/util/async.d.ts +87 -9
- package/util/async.js +80 -8
- package/util/base64.d.ts +56 -6
- package/util/base64.js +56 -6
- package/util/boolean.d.ts +75 -10
- package/util/boolean.js +75 -10
- package/util/buffer.d.ts +26 -3
- package/util/buffer.js +21 -3
- package/util/bytes.d.ts +42 -4
- package/util/bytes.js +32 -2
- package/util/class.d.ts +59 -8
- package/util/class.js +44 -5
- package/util/color.d.ts +131 -13
- package/util/color.js +126 -12
- package/util/constants.d.ts +132 -19
- package/util/constants.js +132 -19
- package/util/crypto.d.ts +17 -1
- package/util/crypto.js +17 -1
- package/util/currency.d.ts +38 -4
- package/util/currency.js +33 -3
- package/util/data.d.ts +139 -24
- package/util/data.js +39 -5
- package/util/date.d.ts +152 -18
- package/util/date.js +147 -17
- package/util/debug.d.ts +112 -11
- package/util/debug.js +114 -11
- package/util/dictionary.d.ts +205 -24
- package/util/dictionary.js +162 -17
- package/util/diff.d.ts +22 -3
- package/util/diff.js +11 -1
- package/util/dispose.d.ts +74 -2
- package/util/dispose.js +74 -2
- package/util/duration.d.ts +278 -16
- package/util/duration.js +267 -15
- package/util/element.d.ts +59 -6
- package/util/element.js +32 -3
- package/util/entity.d.ts +39 -6
- package/util/entity.js +5 -1
- package/util/entry.d.ts +56 -9
- package/util/entry.js +32 -4
- package/util/env.d.ts +26 -4
- package/util/env.js +26 -4
- package/util/equal.d.ts +181 -17
- package/util/equal.js +181 -17
- package/util/error.d.ts +57 -5
- package/util/error.js +52 -4
- package/util/file.d.ts +30 -7
- package/util/file.js +25 -6
- package/util/filter.d.ts +36 -4
- package/util/filter.js +31 -3
- package/util/focus.d.ts +9 -1
- package/util/focus.js +9 -1
- package/util/format.d.ts +186 -22
- package/util/format.js +135 -14
- package/util/function.d.ts +66 -11
- package/util/function.js +31 -4
- package/util/geo.d.ts +60 -8
- package/util/geo.js +45 -5
- package/util/hash.d.ts +21 -2
- package/util/hash.js +21 -2
- package/util/http.d.ts +134 -19
- package/util/http.js +94 -11
- package/util/hydrate.d.ts +19 -2
- package/util/hydrate.js +12 -1
- package/util/item.d.ts +70 -11
- package/util/item.js +35 -4
- package/util/iterate.d.ts +109 -13
- package/util/iterate.js +86 -10
- package/util/jwt.d.ts +47 -13
- package/util/jwt.js +36 -12
- package/util/lazy.d.ts +9 -6
- package/util/link.d.ts +10 -3
- package/util/link.js +5 -2
- package/util/log.d.ts +26 -3
- package/util/log.js +26 -3
- package/util/map.d.ts +144 -19
- package/util/map.js +101 -11
- package/util/merge.d.ts +23 -1
- package/util/merge.js +6 -0
- package/util/null.d.ts +102 -13
- package/util/null.js +92 -11
- package/util/number.d.ts +125 -8
- package/util/number.js +120 -7
- package/util/object.d.ts +263 -31
- package/util/object.js +154 -17
- package/util/path.d.ts +91 -15
- package/util/path.js +60 -9
- package/util/query.d.ts +78 -9
- package/util/query.js +58 -6
- package/util/random.d.ts +67 -4
- package/util/random.js +67 -4
- package/util/regexp.d.ts +201 -24
- package/util/regexp.js +106 -11
- package/util/sequence.d.ts +66 -8
- package/util/sequence.js +52 -7
- package/util/serialise.d.ts +7 -1
- package/util/serialise.js +7 -1
- package/util/set.d.ts +103 -13
- package/util/set.js +83 -9
- package/util/sort.d.ts +32 -7
- package/util/sort.js +26 -6
- package/util/source.d.ts +28 -3
- package/util/source.js +22 -2
- package/util/start.d.ts +62 -5
- package/util/start.js +47 -2
- package/util/string.d.ts +209 -25
- package/util/string.js +188 -21
- package/util/template.d.ts +58 -9
- package/util/template.js +45 -6
- package/util/timeout.d.ts +35 -11
- package/util/timeout.js +35 -11
- package/util/transform.d.ts +87 -8
- package/util/transform.js +75 -7
- package/util/tree.d.ts +39 -6
- package/util/tree.js +3 -0
- package/util/types.d.ts +8 -2
- package/util/undefined.d.ts +47 -6
- package/util/undefined.js +47 -6
- package/util/units.d.ts +107 -12
- package/util/units.js +97 -12
- package/util/update.d.ts +36 -4
- package/util/update.js +24 -2
- package/util/uri.d.ts +138 -6
- package/util/uri.js +44 -3
- package/util/url.d.ts +152 -7
- package/util/url.js +136 -5
- package/util/uuid.d.ts +28 -3
- package/util/uuid.js +28 -3
- package/util/validate.d.ts +85 -20
- package/util/validate.js +61 -12
- package/util/xml.d.ts +9 -10
- package/util/xml.js +9 -10
|
@@ -7,93 +7,209 @@ import type { AbsolutePath } from "../../util/path.js";
|
|
|
7
7
|
import { type TemplatePlaceholders } from "../../util/template.js";
|
|
8
8
|
import type { EndpointCallback, EndpointHandler } from "./util.js";
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* A typed API resource definition pairing a method and path with payload and result schemas.
|
|
11
|
+
* - Acts as the contract both ends of an API agree on: providers render requests from it, handlers validate against it.
|
|
12
|
+
* - Path may contain `{placeholder}` segments that are filled from the payload at request time.
|
|
11
13
|
*
|
|
12
14
|
* @param method The method of the endpoint, e.g. `GET`
|
|
13
15
|
* @param path Endpoint path, possibly including placeholders e.g. `/users/{id}`
|
|
14
16
|
* @param payload A `Schema` for the payload of the endpoint.
|
|
15
17
|
* @param result A `Schema` for the result of the endpoint.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const getUser = new Endpoint("GET", "/users/{id}", USER_PAYLOAD, USER_RESULT);
|
|
21
|
+
*
|
|
22
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint
|
|
16
23
|
*/
|
|
17
24
|
export declare class Endpoint<P = unknown, R = unknown> {
|
|
18
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* The HTTP method this endpoint responds to, e.g. `GET`
|
|
27
|
+
*
|
|
28
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/method
|
|
29
|
+
*/
|
|
19
30
|
readonly method: RequestMethod;
|
|
20
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Endpoint path, possibly including placeholders e.g. `/users/{id}`
|
|
33
|
+
*
|
|
34
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/path
|
|
35
|
+
*/
|
|
21
36
|
readonly path: AbsolutePath;
|
|
22
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* The `{placeholder}` segments extracted from `path`, used to render and match URLs.
|
|
39
|
+
*
|
|
40
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/placeholders
|
|
41
|
+
*/
|
|
23
42
|
readonly placeholders: TemplatePlaceholders;
|
|
24
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* The `Schema` that request payloads are validated against.
|
|
45
|
+
*
|
|
46
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/payload
|
|
47
|
+
*/
|
|
25
48
|
readonly payload: Schema<P>;
|
|
26
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* The `Schema` that response results are validated against.
|
|
51
|
+
*
|
|
52
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/result
|
|
53
|
+
*/
|
|
27
54
|
readonly result: Schema<R>;
|
|
28
55
|
constructor(method: RequestMethod, path: AbsolutePath, payload: Schema<P>, result: Schema<R>);
|
|
29
56
|
/**
|
|
30
57
|
* Render the path for this endpoint with the given payload.
|
|
31
58
|
* - Path might contain `{placeholder}` values that are replaced with values from `payload`.
|
|
32
59
|
*
|
|
33
|
-
* @
|
|
34
|
-
*
|
|
60
|
+
* @param payload The payload supplying values for any `{placeholders}` in the path.
|
|
61
|
+
* @param caller The function to attribute thrown errors to (defaults to this method).
|
|
62
|
+
* @returns The rendered absolute path, with any `{placeholders}` filled from `payload`.
|
|
35
63
|
* @throws {RequiredError} if this endpoint's path has `{placeholders}` but `payload` is not a data object.
|
|
64
|
+
* @example endpoint.renderPath({ id: "abc" }) // "/users/abc"
|
|
65
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/renderPath
|
|
36
66
|
*/
|
|
37
67
|
renderPath(payload: P, caller?: AnyCaller): AbsolutePath;
|
|
38
68
|
/**
|
|
39
69
|
* Match a method/path pair against this endpoint and return any matched `{placeholder}` params.
|
|
70
|
+
*
|
|
71
|
+
* @param method The request method to compare against this endpoint's method.
|
|
72
|
+
* @param path The request path to match against this endpoint's path template.
|
|
73
|
+
* @param caller The function to attribute thrown errors to (defaults to this method).
|
|
74
|
+
* @returns A dictionary of matched `{placeholder}` params, or `undefined` if the method or path doesn't match.
|
|
75
|
+
* @example endpoint.match("GET", "/users/abc") // { id: "abc" }
|
|
76
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/match
|
|
40
77
|
*/
|
|
41
78
|
match(method: RequestMethod, path: AbsolutePath, caller?: AnyCaller): RequestParams | undefined;
|
|
42
79
|
/**
|
|
43
80
|
* Create an endpoint handler pairing for this endpoint.
|
|
81
|
+
*
|
|
44
82
|
* @param callback The callback function that implements the logic for this endpoint by receiving the payload and returning the response.
|
|
45
83
|
* @returns An `EndpointHandler` object combining this endpoint and the callback into a single typed object.
|
|
84
|
+
* @example endpoint.handler((payload, request) => ({ ...payload }))
|
|
85
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/handler
|
|
46
86
|
*/
|
|
47
87
|
handler<C>(callback: EndpointCallback<P, R, C>): EndpointHandler<P, R, C>;
|
|
48
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Convert this endpoint to a string in `METHOD /path` form, e.g. `GET /user/{id}`
|
|
90
|
+
*
|
|
91
|
+
* @returns The method and path joined with a space, e.g. `GET /user/{id}`
|
|
92
|
+
* @example endpoint.toString() // "GET /users/{id}"
|
|
93
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/toString
|
|
94
|
+
*/
|
|
49
95
|
toString(): string;
|
|
50
96
|
}
|
|
51
|
-
/**
|
|
97
|
+
/**
|
|
98
|
+
* An `Endpoint` with any payload and result type, for use where the specific types don't matter.
|
|
99
|
+
*
|
|
100
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/AnyEndpoint
|
|
101
|
+
*/
|
|
52
102
|
export type AnyEndpoint = Endpoint<any, any>;
|
|
53
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* An immutable list of endpoints.
|
|
105
|
+
*
|
|
106
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoints
|
|
107
|
+
*/
|
|
54
108
|
export type Endpoints = ImmutableArray<AnyEndpoint>;
|
|
55
|
-
/**
|
|
109
|
+
/**
|
|
110
|
+
* Extract the payload type from an `Endpoint`.
|
|
111
|
+
*
|
|
112
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/PayloadType
|
|
113
|
+
*/
|
|
56
114
|
export type PayloadType<X extends Endpoint<unknown, unknown>> = X extends Endpoint<infer Y, unknown> ? Y : never;
|
|
57
|
-
/**
|
|
115
|
+
/**
|
|
116
|
+
* Extract the result type from an `Endpoint`.
|
|
117
|
+
*
|
|
118
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/EndpointType
|
|
119
|
+
*/
|
|
58
120
|
export type EndpointType<X extends Endpoint<unknown, unknown>> = X extends Endpoint<unknown, infer Y> ? Y : never;
|
|
59
121
|
/**
|
|
60
|
-
*
|
|
61
|
-
* "The HEAD method requests a representation of the specified resource. Requests using HEAD should only retrieve data and should not contain a request content."
|
|
122
|
+
* Define a `HEAD` endpoint at a path, with validated payload and result types.
|
|
123
|
+
* - "The HEAD method requests a representation of the specified resource. Requests using HEAD should only retrieve data and should not contain a request content."
|
|
124
|
+
*
|
|
125
|
+
* *Factory for `Endpoint`.*
|
|
126
|
+
*
|
|
127
|
+
* @param path The endpoint path, possibly including `{placeholders}`
|
|
128
|
+
* @param payload An optional `Schema` validating the request payload.
|
|
129
|
+
* @param result An optional `Schema` validating the response result.
|
|
130
|
+
* @returns An `Endpoint` configured for the `HEAD` method.
|
|
131
|
+
* @example HEAD("/users/{id}")
|
|
132
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/HEAD
|
|
62
133
|
*/
|
|
63
134
|
export declare function HEAD<P extends Data, R>(path: AbsolutePath, payload?: Schema<P>, result?: Schema<R>): Endpoint<P, R>;
|
|
64
135
|
export declare function HEAD<P extends Data>(path: AbsolutePath, payload: Schema<P>): Endpoint<P, undefined>;
|
|
65
136
|
export declare function HEAD<R>(path: AbsolutePath, payload: undefined, result: Schema<R>): Endpoint<undefined, R>;
|
|
66
137
|
/**
|
|
67
|
-
*
|
|
68
|
-
* "The GET method requests a representation of the specified resource. Requests using GET should only retrieve data and should not contain a request content."
|
|
138
|
+
* Define a `GET` endpoint at a path, with validated payload and result types.
|
|
139
|
+
* - "The GET method requests a representation of the specified resource. Requests using GET should only retrieve data and should not contain a request content."
|
|
140
|
+
*
|
|
141
|
+
* *Factory for `Endpoint`.*
|
|
142
|
+
*
|
|
143
|
+
* @param path The endpoint path, possibly including `{placeholders}`
|
|
144
|
+
* @param payload An optional `Schema` validating the request payload.
|
|
145
|
+
* @param result An optional `Schema` validating the response result.
|
|
146
|
+
* @returns An `Endpoint` configured for the `GET` method.
|
|
147
|
+
* @example GET("/users/{id}", undefined, USER)
|
|
148
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/GET
|
|
69
149
|
*/
|
|
70
150
|
export declare function GET<P extends Data, R>(path: AbsolutePath, payload?: Schema<P>, result?: Schema<R>): Endpoint<P, R>;
|
|
71
151
|
export declare function GET<P extends Data>(path: AbsolutePath, payload: Schema<P>): Endpoint<P, undefined>;
|
|
72
152
|
export declare function GET<R>(path: AbsolutePath, payload: undefined, result: Schema<R>): Endpoint<undefined, R>;
|
|
73
153
|
/**
|
|
74
|
-
*
|
|
75
|
-
* "The POST method submits an entity to the specified resource, often causing a change in state or side effects on the server.
|
|
154
|
+
* Define a `POST` endpoint at a path, with validated payload and result types.
|
|
155
|
+
* - "The POST method submits an entity to the specified resource, often causing a change in state or side effects on the server."
|
|
156
|
+
*
|
|
157
|
+
* *Factory for `Endpoint`.*
|
|
158
|
+
*
|
|
159
|
+
* @param path The endpoint path, possibly including `{placeholders}`
|
|
160
|
+
* @param payload An optional `Schema` validating the request payload.
|
|
161
|
+
* @param result An optional `Schema` validating the response result.
|
|
162
|
+
* @returns An `Endpoint` configured for the `POST` method.
|
|
163
|
+
* @example POST("/users", USER, USER_RESULT)
|
|
164
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/POST
|
|
76
165
|
*/
|
|
77
166
|
export declare function POST<P, R>(path: AbsolutePath, payload?: Schema<P>, result?: Schema<R>): Endpoint<P, R>;
|
|
78
167
|
export declare function POST<P>(path: AbsolutePath, payload: Schema<P>): Endpoint<P, undefined>;
|
|
79
168
|
export declare function POST<R>(path: AbsolutePath, payload: undefined, result: Schema<R>): Endpoint<undefined, R>;
|
|
80
169
|
/**
|
|
81
|
-
*
|
|
82
|
-
* "The PUT method replaces all current representations of the target resource with the request content."
|
|
170
|
+
* Define a `PUT` endpoint at a path, with validated payload and result types.
|
|
171
|
+
* - "The PUT method replaces all current representations of the target resource with the request content."
|
|
172
|
+
*
|
|
173
|
+
* *Factory for `Endpoint`.*
|
|
174
|
+
*
|
|
175
|
+
* @param path The endpoint path, possibly including `{placeholders}`
|
|
176
|
+
* @param payload An optional `Schema` validating the request payload.
|
|
177
|
+
* @param result An optional `Schema` validating the response result.
|
|
178
|
+
* @returns An `Endpoint` configured for the `PUT` method.
|
|
179
|
+
* @example PUT("/users/{id}", USER)
|
|
180
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/PUT
|
|
83
181
|
*/
|
|
84
182
|
export declare function PUT<P, R>(path: AbsolutePath, payload?: Schema<P>, result?: Schema<R>): Endpoint<P, R>;
|
|
85
183
|
export declare function PUT<P>(path: AbsolutePath, payload: Schema<P>): Endpoint<P, undefined>;
|
|
86
184
|
export declare function PUT<R>(path: AbsolutePath, payload: undefined, result: Schema<R>): Endpoint<undefined, R>;
|
|
87
185
|
/**
|
|
88
|
-
*
|
|
89
|
-
* "The PATCH method applies partial modifications to a resource."
|
|
186
|
+
* Define a `PATCH` endpoint at a path, with validated payload and result types.
|
|
187
|
+
* - "The PATCH method applies partial modifications to a resource."
|
|
188
|
+
*
|
|
189
|
+
* *Factory for `Endpoint`.*
|
|
190
|
+
*
|
|
191
|
+
* @param path The endpoint path, possibly including `{placeholders}`
|
|
192
|
+
* @param payload An optional `Schema` validating the request payload.
|
|
193
|
+
* @param result An optional `Schema` validating the response result.
|
|
194
|
+
* @returns An `Endpoint` configured for the `PATCH` method.
|
|
195
|
+
* @example PATCH("/users/{id}", PARTIAL_USER)
|
|
196
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/PATCH
|
|
90
197
|
*/
|
|
91
198
|
export declare function PATCH<P, R>(path: AbsolutePath, payload?: Schema<P>, result?: Schema<R>): Endpoint<P, R>;
|
|
92
199
|
export declare function PATCH<P>(path: AbsolutePath, payload: Schema<P>): Endpoint<P, undefined>;
|
|
93
200
|
export declare function PATCH<R>(path: AbsolutePath, payload: undefined, result: Schema<R>): Endpoint<undefined, R>;
|
|
94
201
|
/**
|
|
95
|
-
*
|
|
96
|
-
* "The DELETE method deletes the specified resource."
|
|
202
|
+
* Define a `DELETE` endpoint at a path, with validated payload and result types.
|
|
203
|
+
* - "The DELETE method deletes the specified resource."
|
|
204
|
+
*
|
|
205
|
+
* *Factory for `Endpoint`.*
|
|
206
|
+
*
|
|
207
|
+
* @param path The endpoint path, possibly including `{placeholders}`
|
|
208
|
+
* @param payload An optional `Schema` validating the request payload.
|
|
209
|
+
* @param result An optional `Schema` validating the response result.
|
|
210
|
+
* @returns An `Endpoint` configured for the `DELETE` method.
|
|
211
|
+
* @example DELETE("/users/{id}")
|
|
212
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/DELETE
|
|
97
213
|
*/
|
|
98
214
|
export declare function DELETE<P, R>(path: AbsolutePath, payload?: Schema<P>, result?: Schema<R>): Endpoint<P, R>;
|
|
99
215
|
export declare function DELETE<P>(path: AbsolutePath, payload: Schema<P>): Endpoint<P, undefined>;
|
package/api/endpoint/Endpoint.js
CHANGED
|
@@ -3,23 +3,50 @@ import { UNDEFINED } from "../../schema/Schema.js";
|
|
|
3
3
|
import { isData } from "../../util/data.js";
|
|
4
4
|
import { getPlaceholders, matchPathTemplate, renderPathTemplate } from "../../util/template.js";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* A typed API resource definition pairing a method and path with payload and result schemas.
|
|
7
|
+
* - Acts as the contract both ends of an API agree on: providers render requests from it, handlers validate against it.
|
|
8
|
+
* - Path may contain `{placeholder}` segments that are filled from the payload at request time.
|
|
7
9
|
*
|
|
8
10
|
* @param method The method of the endpoint, e.g. `GET`
|
|
9
11
|
* @param path Endpoint path, possibly including placeholders e.g. `/users/{id}`
|
|
10
12
|
* @param payload A `Schema` for the payload of the endpoint.
|
|
11
13
|
* @param result A `Schema` for the result of the endpoint.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const getUser = new Endpoint("GET", "/users/{id}", USER_PAYLOAD, USER_RESULT);
|
|
17
|
+
*
|
|
18
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint
|
|
12
19
|
*/
|
|
13
20
|
export class Endpoint {
|
|
14
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* The HTTP method this endpoint responds to, e.g. `GET`
|
|
23
|
+
*
|
|
24
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/method
|
|
25
|
+
*/
|
|
15
26
|
method;
|
|
16
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Endpoint path, possibly including placeholders e.g. `/users/{id}`
|
|
29
|
+
*
|
|
30
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/path
|
|
31
|
+
*/
|
|
17
32
|
path;
|
|
18
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* The `{placeholder}` segments extracted from `path`, used to render and match URLs.
|
|
35
|
+
*
|
|
36
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/placeholders
|
|
37
|
+
*/
|
|
19
38
|
placeholders;
|
|
20
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* The `Schema` that request payloads are validated against.
|
|
41
|
+
*
|
|
42
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/payload
|
|
43
|
+
*/
|
|
21
44
|
payload;
|
|
22
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* The `Schema` that response results are validated against.
|
|
47
|
+
*
|
|
48
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/result
|
|
49
|
+
*/
|
|
23
50
|
result;
|
|
24
51
|
constructor(method, path, payload, result) {
|
|
25
52
|
this.method = method;
|
|
@@ -32,9 +59,12 @@ export class Endpoint {
|
|
|
32
59
|
* Render the path for this endpoint with the given payload.
|
|
33
60
|
* - Path might contain `{placeholder}` values that are replaced with values from `payload`.
|
|
34
61
|
*
|
|
35
|
-
* @
|
|
36
|
-
*
|
|
62
|
+
* @param payload The payload supplying values for any `{placeholders}` in the path.
|
|
63
|
+
* @param caller The function to attribute thrown errors to (defaults to this method).
|
|
64
|
+
* @returns The rendered absolute path, with any `{placeholders}` filled from `payload`.
|
|
37
65
|
* @throws {RequiredError} if this endpoint's path has `{placeholders}` but `payload` is not a data object.
|
|
66
|
+
* @example endpoint.renderPath({ id: "abc" }) // "/users/abc"
|
|
67
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/renderPath
|
|
38
68
|
*/
|
|
39
69
|
renderPath(payload, caller = this.renderPath) {
|
|
40
70
|
// Placeholders.
|
|
@@ -47,6 +77,13 @@ export class Endpoint {
|
|
|
47
77
|
}
|
|
48
78
|
/**
|
|
49
79
|
* Match a method/path pair against this endpoint and return any matched `{placeholder}` params.
|
|
80
|
+
*
|
|
81
|
+
* @param method The request method to compare against this endpoint's method.
|
|
82
|
+
* @param path The request path to match against this endpoint's path template.
|
|
83
|
+
* @param caller The function to attribute thrown errors to (defaults to this method).
|
|
84
|
+
* @returns A dictionary of matched `{placeholder}` params, or `undefined` if the method or path doesn't match.
|
|
85
|
+
* @example endpoint.match("GET", "/users/abc") // { id: "abc" }
|
|
86
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/match
|
|
50
87
|
*/
|
|
51
88
|
match(method, path, caller = this.match) {
|
|
52
89
|
if (method !== this.method)
|
|
@@ -55,13 +92,22 @@ export class Endpoint {
|
|
|
55
92
|
}
|
|
56
93
|
/**
|
|
57
94
|
* Create an endpoint handler pairing for this endpoint.
|
|
95
|
+
*
|
|
58
96
|
* @param callback The callback function that implements the logic for this endpoint by receiving the payload and returning the response.
|
|
59
97
|
* @returns An `EndpointHandler` object combining this endpoint and the callback into a single typed object.
|
|
98
|
+
* @example endpoint.handler((payload, request) => ({ ...payload }))
|
|
99
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/handler
|
|
60
100
|
*/
|
|
61
101
|
handler(callback) {
|
|
62
102
|
return { endpoint: this, callback };
|
|
63
103
|
}
|
|
64
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* Convert this endpoint to a string in `METHOD /path` form, e.g. `GET /user/{id}`
|
|
106
|
+
*
|
|
107
|
+
* @returns The method and path joined with a space, e.g. `GET /user/{id}`
|
|
108
|
+
* @example endpoint.toString() // "GET /users/{id}"
|
|
109
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/Endpoint/Endpoint/toString
|
|
110
|
+
*/
|
|
65
111
|
toString() {
|
|
66
112
|
return `${this.method} ${this.path}`;
|
|
67
113
|
}
|
package/api/endpoint/util.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { AnyCaller } from "../../util/function.js";
|
|
|
2
2
|
import { type PossibleURL } from "../../util/url.js";
|
|
3
3
|
import type { Endpoint } from "./Endpoint.js";
|
|
4
4
|
/**
|
|
5
|
-
* A function that handles an endpoint request,
|
|
5
|
+
* A function that handles an endpoint request, receiving a validated payload and returning a result.
|
|
6
6
|
*
|
|
7
7
|
* @param payload The payload for the callback combining the `{placeholders}`, `?search` params, and body content (this has been validated against the Endpoint's payload schema).
|
|
8
8
|
* @param request The original incoming request object.
|
|
@@ -10,26 +10,48 @@ import type { Endpoint } from "./Endpoint.js";
|
|
|
10
10
|
*
|
|
11
11
|
* @returns {Response} Returning a `Response` object (this will pass back to the client without validation).
|
|
12
12
|
* @returns {R} Returning the return type of the handler (this will be validated against the Endpoint's result schema).
|
|
13
|
+
*
|
|
14
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/util/EndpointCallback
|
|
13
15
|
*/
|
|
14
16
|
export type EndpointCallback<P, R, C = void> = (payload: P, request: Request, context: C) => R | Response | Promise<R | Response>;
|
|
15
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* A typed endpoint definition paired with its implementation callback.
|
|
19
|
+
* - Created with `Endpoint.handler()`; matched and invoked by `handleEndpoints()`.
|
|
20
|
+
*
|
|
21
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/util/EndpointHandler
|
|
22
|
+
*/
|
|
16
23
|
export interface EndpointHandler<P, R, C = void> {
|
|
17
24
|
readonly endpoint: Endpoint<P, R>;
|
|
18
25
|
readonly callback: EndpointCallback<P, R, C>;
|
|
19
26
|
}
|
|
20
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* An `EndpointHandler` with any payload and result type, for use where the specific types don't matter.
|
|
29
|
+
*
|
|
30
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/util/AnyEndpointHandler
|
|
31
|
+
*/
|
|
21
32
|
export type AnyEndpointHandler<C = any> = EndpointHandler<any, any, C>;
|
|
22
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* A collection of endpoint handlers that can be matched and invoked by `handleEndpoints()`.
|
|
35
|
+
*
|
|
36
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/util/EndpointHandlers
|
|
37
|
+
*/
|
|
23
38
|
export type EndpointHandlers<C = void> = Iterable<AnyEndpointHandler<C>>;
|
|
24
39
|
/**
|
|
25
40
|
* Handle a `Request` with the first matching endpoint handler after stripping any base-path prefix from the request pathname.
|
|
26
41
|
* - The original `Request` object is passed through to the callback unchanged.
|
|
27
42
|
* - Path params and query params are merged before payload validation.
|
|
28
43
|
*
|
|
29
|
-
* @param request The input request to handle.
|
|
30
|
-
*
|
|
31
44
|
* @param base The base URL for the API, e.g. `https://myapi.com/a/b`
|
|
32
45
|
* - `pathname` of this URL gets trimmed from `request.path` to form the target path when matching against endpoints, e.g. `/a/b/c/d` will produce `/c/d` for matching.
|
|
46
|
+
* @param handlers The iterable of `EndpointHandler` objects to match the request against, in order.
|
|
47
|
+
* @param request The input request to handle.
|
|
48
|
+
* @param context The additional context value passed through to the matched handler's callback.
|
|
49
|
+
* @param caller The function to attribute thrown errors to (defaults to this function).
|
|
50
|
+
* @returns A promise resolving to the `Response` produced by the matching handler.
|
|
51
|
+
* @throws {MethodNotAllowedError} if the request method is not a supported HTTP method.
|
|
52
|
+
* @throws {NotFoundError} if no base path matches, or no endpoint matches the target path.
|
|
53
|
+
* @example await handleEndpoints("https://myapi.com", [getUser.handler(loadUser)], request, undefined)
|
|
54
|
+
* @see https://dhoulb.github.io/shelving/api/endpoint/util/handleEndpoints
|
|
33
55
|
*/
|
|
34
56
|
export declare function handleEndpoints<C>(base: PossibleURL, handlers: EndpointHandlers<C>, request: Request, context: C, caller?: AnyCaller): Promise<Response>;
|
|
35
57
|
export declare function handleEndpoints(base: PossibleURL, handlers: EndpointHandlers<void>, request: Request, context?: undefined, caller?: AnyCaller): Promise<Response>;
|
|
@@ -1,47 +1,91 @@
|
|
|
1
1
|
import type { AnyCaller } from "../../util/function.js";
|
|
2
2
|
import type { RequestOptions } from "../../util/http.js";
|
|
3
3
|
import type { Endpoint } from "../endpoint/Endpoint.js";
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base for API providers that send requests to a set of `Endpoint` definitions rooted at a common base URL.
|
|
6
|
+
* - Concrete subclasses implement `renderURL()`, `createRequest()`, `fetch()`, and `parseResponse()`; `call()` orchestrates them.
|
|
7
|
+
* - Implements `AsyncDisposable` so providers can be wrapped and disposed in a chain.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const provider = new ClientAPIProvider({ url: "https://api.example.com" });
|
|
11
|
+
* const user = await provider.call(getUser, { id: "abc" });
|
|
12
|
+
*
|
|
13
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider
|
|
14
|
+
*/
|
|
5
15
|
export declare abstract class APIProvider<P = unknown, R = unknown> implements AsyncDisposable {
|
|
6
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* The common base URL that every endpoint request is resolved against.
|
|
18
|
+
*
|
|
19
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider/url
|
|
20
|
+
*/
|
|
7
21
|
abstract readonly url: URL;
|
|
8
22
|
/**
|
|
9
23
|
* Render the full final URL for an API request to a given endpoint with a given payload.
|
|
10
24
|
* - Includes `?query` params if this is a `HEAD` or `GET` request.
|
|
11
25
|
*
|
|
26
|
+
* @param endpoint The endpoint whose path is rendered into the base URL.
|
|
27
|
+
* @param payload The payload supplying `{placeholder}` and query-param values.
|
|
28
|
+
* @param caller The function to attribute thrown errors to (defaults to this method).
|
|
29
|
+
* @returns The fully resolved request `URL`.
|
|
12
30
|
* @throws {RequiredError} if this endpoint's path has `{placeholders}` but `payload` is not a data object.
|
|
13
31
|
* @throws {RequiredError} if this is a `HEAD` or `GET` request but `payload` is not a data object.
|
|
32
|
+
* @example provider.renderURL(getUser, { id: "abc" }) // URL("https://api.example.com/users/abc")
|
|
33
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider/renderURL
|
|
14
34
|
*/
|
|
15
35
|
abstract renderURL<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>, payload: PP, caller?: AnyCaller): URL;
|
|
16
36
|
/**
|
|
17
37
|
* Create a `Request` that targets this endpoint with a given base URL.
|
|
18
38
|
*
|
|
39
|
+
* @param endpoint The endpoint the request targets.
|
|
19
40
|
* @param payload The payload to embed into the `Request` to send to the endpoint.
|
|
20
41
|
* - Path `{placeholders}` are rendered from `payload`
|
|
21
42
|
* - For `GET` and `HEAD`, remaining `payload` fields are appended as `?query` params.
|
|
22
43
|
* - For all other requests, `payload` is sent as the body.
|
|
23
|
-
*
|
|
24
|
-
* @param
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @returns The created request.
|
|
28
|
-
* - Merges `options` with `this.options` to make the final request options.
|
|
29
|
-
* - Includes an `AbortSignal` based on `this.timeout` if it's set to a number in milliseconds.
|
|
30
|
-
* - The timeout `AbortSignal` is merged with any manual signal set in `
|
|
31
|
-
*
|
|
44
|
+
* @param options The `RequestOptions` to use when creating the `Request`, merged over the provider's own options.
|
|
45
|
+
* @param caller The function to attribute thrown errors to (defaults to this method).
|
|
46
|
+
* @returns The created `Request`, including any timeout `AbortSignal` configured on the provider.
|
|
32
47
|
* @throws {RequiredError} if this endpoint's path has `{placeholders}` but `payload` is not a data object.
|
|
33
48
|
* @throws {RequiredError} if this is a `HEAD` or `GET` request but `payload` is not a data object.
|
|
49
|
+
* @example provider.createRequest(getUser, { id: "abc" })
|
|
50
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider/createRequest
|
|
34
51
|
*/
|
|
35
52
|
abstract createRequest<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>, payload: PP, options?: RequestOptions, caller?: AnyCaller): Request;
|
|
36
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Send a `Request` and return its `Response` (defaults to the JavaScript `fetch()` API).
|
|
55
|
+
*
|
|
56
|
+
* @param request The `Request` to send.
|
|
57
|
+
* @returns A promise resolving to the `Response`.
|
|
58
|
+
* @example const response = await provider.fetch(request);
|
|
59
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider/fetch
|
|
60
|
+
*/
|
|
37
61
|
abstract fetch(request: Request): Promise<Response>;
|
|
38
62
|
/**
|
|
39
|
-
* Parse an HTTP `Response` for this endpoint.
|
|
63
|
+
* Parse an HTTP `Response` for this endpoint into a result value.
|
|
40
64
|
* - Non-2xx responses become `ResponseError`.
|
|
41
65
|
* - Does not validate the result against the endpoint schema — use `ValidationAPIProvider` for that.
|
|
66
|
+
*
|
|
67
|
+
* @param _endpoint The endpoint the response was produced for.
|
|
68
|
+
* @param response The `Response` to parse.
|
|
69
|
+
* @param caller The function to attribute thrown errors to (defaults to this method).
|
|
70
|
+
* @returns A promise resolving to the parsed result.
|
|
71
|
+
* @throws {ResponseError} if the response status is non-2xx.
|
|
72
|
+
* @example const result = await provider.parseResponse(getUser, response);
|
|
73
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider/parseResponse
|
|
42
74
|
*/
|
|
43
75
|
abstract parseResponse<PP extends P, RR extends R>(_endpoint: Endpoint<PP, RR>, response: Response, caller?: AnyCaller): Promise<RR>;
|
|
44
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Send a payload to an `Endpoint` and retrieve the parsed result.
|
|
78
|
+
* - Composes `createRequest()`, `fetch()`, and `parseResponse()` into a single round trip.
|
|
79
|
+
*
|
|
80
|
+
* @param endpoint The endpoint to call.
|
|
81
|
+
* @param payload The payload to send to the endpoint.
|
|
82
|
+
* @param options The `RequestOptions` to use, merged over the provider's own options.
|
|
83
|
+
* @param caller The function to attribute thrown errors to.
|
|
84
|
+
* @returns A promise resolving to the parsed result.
|
|
85
|
+
* @throws {ResponseError} if the response status is non-2xx.
|
|
86
|
+
* @example const user = await provider.call(getUser, { id: "abc" });
|
|
87
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider/call
|
|
88
|
+
*/
|
|
45
89
|
call<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>, payload: PP, options?: RequestOptions, caller?: AnyCaller): Promise<RR>;
|
|
46
90
|
[Symbol.asyncDispose](): Promise<void>;
|
|
47
91
|
}
|
|
@@ -1,6 +1,28 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for API providers that send requests to a set of `Endpoint` definitions rooted at a common base URL.
|
|
3
|
+
* - Concrete subclasses implement `renderURL()`, `createRequest()`, `fetch()`, and `parseResponse()`; `call()` orchestrates them.
|
|
4
|
+
* - Implements `AsyncDisposable` so providers can be wrapped and disposed in a chain.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const provider = new ClientAPIProvider({ url: "https://api.example.com" });
|
|
8
|
+
* const user = await provider.call(getUser, { id: "abc" });
|
|
9
|
+
*
|
|
10
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider
|
|
11
|
+
*/
|
|
2
12
|
export class APIProvider {
|
|
3
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Send a payload to an `Endpoint` and retrieve the parsed result.
|
|
15
|
+
* - Composes `createRequest()`, `fetch()`, and `parseResponse()` into a single round trip.
|
|
16
|
+
*
|
|
17
|
+
* @param endpoint The endpoint to call.
|
|
18
|
+
* @param payload The payload to send to the endpoint.
|
|
19
|
+
* @param options The `RequestOptions` to use, merged over the provider's own options.
|
|
20
|
+
* @param caller The function to attribute thrown errors to.
|
|
21
|
+
* @returns A promise resolving to the parsed result.
|
|
22
|
+
* @throws {ResponseError} if the response status is non-2xx.
|
|
23
|
+
* @example const user = await provider.call(getUser, { id: "abc" });
|
|
24
|
+
* @see https://dhoulb.github.io/shelving/api/provider/APIProvider/APIProvider/call
|
|
25
|
+
*/
|
|
4
26
|
async call(endpoint, payload, options, caller) {
|
|
5
27
|
const request = this.createRequest(endpoint, payload, options, caller);
|
|
6
28
|
const response = await this.fetch(request);
|
|
@@ -4,23 +4,76 @@ import type { Endpoint } from "../endpoint/Endpoint.js";
|
|
|
4
4
|
import type { APIProvider } from "./APIProvider.js";
|
|
5
5
|
import { ThroughAPIProvider } from "./ThroughAPIProvider.js";
|
|
6
6
|
/**
|
|
7
|
-
* API provider wrapper that serves requests through an `APICache
|
|
8
|
-
* - Constructor accepts a `source` provider and an optional default `maxAge`.
|
|
7
|
+
* API provider wrapper that serves requests through an `APICache` so repeated calls reuse cached results.
|
|
9
8
|
* - On `call(...)`, triggers `cache.refresh(maxAge)` for the endpoint+payload before awaiting `cache.call(...)`.
|
|
10
9
|
* - `invalidate`, `invalidateAll`, `refresh`, and `refreshAll` pass through to the underlying cache and use `this.maxAge` as the default refresh timing.
|
|
11
10
|
*
|
|
12
|
-
* @
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* @example
|
|
12
|
+
* const api = new CachedAPIProvider(source);
|
|
13
|
+
* const result = await api.call(endpoint, payload);
|
|
14
|
+
* @see https://dhoulb.github.io/shelving/api/provider/CachedAPIProvider/CachedAPIProvider
|
|
15
15
|
*/
|
|
16
16
|
export declare class CachedAPIProvider<P, R> extends ThroughAPIProvider<P, R> implements AsyncDisposable {
|
|
17
|
+
/**
|
|
18
|
+
* The maximum age used when calling `call()`, defaulting to `AVOID_REFRESH` (only refresh if invalidated or still loading).
|
|
19
|
+
* - Not used for `refresh()` calls, which always refetch immediately.
|
|
20
|
+
* @see https://dhoulb.github.io/shelving/api/provider/CachedAPIProvider/CachedAPIProvider/maxAge
|
|
21
|
+
*/
|
|
17
22
|
readonly maxAge: number | undefined;
|
|
18
23
|
private readonly _cache;
|
|
24
|
+
/**
|
|
25
|
+
* Create a cached provider wrapping a source provider.
|
|
26
|
+
*
|
|
27
|
+
* @param source The source provider whose results are cached.
|
|
28
|
+
* @param maxAge Default maximum age in milliseconds for `call()` (defaults to `AVOID_REFRESH`).
|
|
29
|
+
* @example new CachedAPIProvider(source)
|
|
30
|
+
*/
|
|
19
31
|
constructor(source: APIProvider<P, R>, maxAge?: number);
|
|
32
|
+
/**
|
|
33
|
+
* Call an endpoint through the cache, reusing a cached result where possible instead of fetching fresh.
|
|
34
|
+
*
|
|
35
|
+
* @param endpoint The endpoint to call.
|
|
36
|
+
* @param payload The payload to call the endpoint with.
|
|
37
|
+
* @param _options Request options (unused; the cache key is derived from endpoint and payload).
|
|
38
|
+
* @param caller The calling function used for error stack traces.
|
|
39
|
+
* @returns Promise resolving to the (possibly cached) result.
|
|
40
|
+
* @example await api.call(endpoint, payload)
|
|
41
|
+
* @see https://dhoulb.github.io/shelving/api/provider/CachedAPIProvider/CachedAPIProvider/call
|
|
42
|
+
*/
|
|
20
43
|
call<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>, payload: PP, _options?: RequestOptions, caller?: AnyCaller): Promise<RR>;
|
|
44
|
+
/**
|
|
45
|
+
* Invalidate the cached result for a specific endpoint and payload.
|
|
46
|
+
*
|
|
47
|
+
* @param endpoint The endpoint whose cached result should be invalidated.
|
|
48
|
+
* @param payload The payload identifying the cached result.
|
|
49
|
+
* @example api.invalidate(endpoint, payload)
|
|
50
|
+
* @see https://dhoulb.github.io/shelving/api/provider/CachedAPIProvider/CachedAPIProvider/invalidate
|
|
51
|
+
*/
|
|
21
52
|
invalidate<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>, payload: PP): void;
|
|
53
|
+
/**
|
|
54
|
+
* Invalidate every cached result for an endpoint, across all payloads.
|
|
55
|
+
*
|
|
56
|
+
* @param endpoint The endpoint whose cached results should be invalidated.
|
|
57
|
+
* @example api.invalidateAll(endpoint)
|
|
58
|
+
* @see https://dhoulb.github.io/shelving/api/provider/CachedAPIProvider/CachedAPIProvider/invalidateAll
|
|
59
|
+
*/
|
|
22
60
|
invalidateAll<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>): void;
|
|
61
|
+
/**
|
|
62
|
+
* Refresh the cached result for a specific endpoint and payload.
|
|
63
|
+
*
|
|
64
|
+
* @param endpoint The endpoint whose cached result should be refreshed.
|
|
65
|
+
* @param payload The payload identifying the cached result.
|
|
66
|
+
* @example api.refresh(endpoint, payload)
|
|
67
|
+
* @see https://dhoulb.github.io/shelving/api/provider/CachedAPIProvider/CachedAPIProvider/refresh
|
|
68
|
+
*/
|
|
23
69
|
refresh<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>, payload: PP): void;
|
|
70
|
+
/**
|
|
71
|
+
* Refresh every cached result for an endpoint, across all payloads.
|
|
72
|
+
*
|
|
73
|
+
* @param endpoint The endpoint whose cached results should be refreshed.
|
|
74
|
+
* @example api.refreshAll(endpoint)
|
|
75
|
+
* @see https://dhoulb.github.io/shelving/api/provider/CachedAPIProvider/CachedAPIProvider/refreshAll
|
|
76
|
+
*/
|
|
24
77
|
refreshAll<PP extends P, RR extends R>(endpoint: Endpoint<PP, RR>): void;
|
|
25
78
|
[Symbol.asyncDispose](): Promise<void>;
|
|
26
79
|
}
|