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
|
@@ -1,60 +1,194 @@
|
|
|
1
1
|
import { awaitDispose } from "../../util/dispose.js";
|
|
2
2
|
import { DBProvider } from "./DBProvider.js";
|
|
3
3
|
import { MemoryDBProvider } from "./MemoryDBProvider.js";
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Database provider that keeps a copy of asynchronous remote data in a local synchronous cache.
|
|
6
|
+
*
|
|
7
|
+
* - Wraps a `source` provider and mirrors every read and write into an in-memory `MemoryDBProvider`, so subsequent reads can be served synchronously and live subscriptions stay seeded.
|
|
8
|
+
* - Reads fetch from `source`, then refresh the cache; writes hit `source`, then mirror the change into the cache.
|
|
9
|
+
* - Discover the cache from a wrapping layer with `getSource(CacheDBProvider, provider)` to seed stores from `.memory`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* const provider = new CacheDBProvider(new FirestoreProvider());
|
|
13
|
+
* await provider.getItem(users, 123); // Fetches from source, then caches in memory.
|
|
14
|
+
*
|
|
15
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider
|
|
16
|
+
*/
|
|
5
17
|
export class CacheDBProvider extends DBProvider {
|
|
18
|
+
/**
|
|
19
|
+
* The wrapped source provider that data is fetched from and written to.
|
|
20
|
+
*
|
|
21
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/source
|
|
22
|
+
*/
|
|
6
23
|
source;
|
|
24
|
+
/**
|
|
25
|
+
* The in-memory provider holding the local synchronous cache of `source` data.
|
|
26
|
+
*
|
|
27
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/memory
|
|
28
|
+
*/
|
|
7
29
|
memory;
|
|
30
|
+
/**
|
|
31
|
+
* Create a new `CacheDBProvider` wrapping a source provider.
|
|
32
|
+
*
|
|
33
|
+
* @param source The provider to fetch from and write to.
|
|
34
|
+
* @param cache In-memory provider to use as the cache (a fresh `MemoryDBProvider` by default).
|
|
35
|
+
*/
|
|
8
36
|
constructor(source, cache = new MemoryDBProvider()) {
|
|
9
37
|
super();
|
|
10
38
|
this.source = source;
|
|
11
39
|
this.memory = cache;
|
|
12
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Get an item from `source` by its id, refreshing the cache, or `undefined` if it doesn't exist.
|
|
43
|
+
*
|
|
44
|
+
* @param collection Collection the item belongs to.
|
|
45
|
+
* @param id Identifier of the item to get.
|
|
46
|
+
* @returns The item, or `undefined` if no item exists with that id.
|
|
47
|
+
* @example await provider.getItem(users, 123) // Item or undefined.
|
|
48
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/getItem
|
|
49
|
+
*/
|
|
13
50
|
async getItem(collection, id) {
|
|
14
51
|
const item = await this.source.getItem(collection, id);
|
|
15
52
|
const table = this.memory.getTable(collection);
|
|
16
53
|
item ? table.setItem(id, item) : table.deleteItem(id);
|
|
17
54
|
return item;
|
|
18
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Subscribe to live changes for a single item, mirroring each emission into the cache.
|
|
58
|
+
*
|
|
59
|
+
* @param collection Collection the item belongs to.
|
|
60
|
+
* @param id Identifier of the item to subscribe to.
|
|
61
|
+
* @returns Async sequence yielding the item (or `undefined`) on every change.
|
|
62
|
+
* @example for await (const item of provider.getItemSequence(users, 123)) console.log(item);
|
|
63
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/getItemSequence
|
|
64
|
+
*/
|
|
19
65
|
getItemSequence(collection, id) {
|
|
20
66
|
return this.memory.getTable(collection).setItemSequence(id, this.source.getItemSequence(collection, id));
|
|
21
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Add a new item to `source` and mirror it into the cache.
|
|
70
|
+
*
|
|
71
|
+
* @param collection Collection to add the item to.
|
|
72
|
+
* @param data Data for the new item.
|
|
73
|
+
* @returns The generated identifier for the new item.
|
|
74
|
+
* @example await provider.addItem(users, { name: "Dave" }) // 123
|
|
75
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/addItem
|
|
76
|
+
*/
|
|
22
77
|
async addItem(collection, data) {
|
|
23
78
|
const id = await this.source.addItem(collection, data);
|
|
24
79
|
this.memory.getTable(collection).setItem(id, data);
|
|
25
80
|
return id;
|
|
26
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Set (insert or overwrite) an item in `source` and mirror it into the cache.
|
|
84
|
+
*
|
|
85
|
+
* @param collection Collection the item belongs to.
|
|
86
|
+
* @param id Identifier of the item to set.
|
|
87
|
+
* @param data Full data to store for the item.
|
|
88
|
+
* @example await provider.setItem(users, 123, { name: "Dave" });
|
|
89
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/setItem
|
|
90
|
+
*/
|
|
27
91
|
async setItem(collection, id, data) {
|
|
28
92
|
await this.source.setItem(collection, id, data);
|
|
29
93
|
this.memory.getTable(collection).setItem(id, data);
|
|
30
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Apply partial updates to an item in `source` and mirror them into the cache.
|
|
97
|
+
*
|
|
98
|
+
* @param collection Collection the item belongs to.
|
|
99
|
+
* @param id Identifier of the item to update.
|
|
100
|
+
* @param updates Updates to apply to the item.
|
|
101
|
+
* @example await provider.updateItem(users, 123, { name: "Dave" });
|
|
102
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/updateItem
|
|
103
|
+
*/
|
|
31
104
|
async updateItem(collection, id, updates) {
|
|
32
105
|
await this.source.updateItem(collection, id, updates);
|
|
33
106
|
this.memory.getTable(collection).updateItem(id, updates);
|
|
34
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Delete an item from `source` and remove it from the cache.
|
|
110
|
+
*
|
|
111
|
+
* @param collection Collection the item belongs to.
|
|
112
|
+
* @param id Identifier of the item to delete.
|
|
113
|
+
* @example await provider.deleteItem(users, 123);
|
|
114
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/deleteItem
|
|
115
|
+
*/
|
|
35
116
|
async deleteItem(collection, id) {
|
|
36
117
|
await this.source.deleteItem(collection, id);
|
|
37
118
|
this.memory.getTable(collection).deleteItem(id);
|
|
38
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Count the items in `source` matching an optional query (not cached).
|
|
122
|
+
*
|
|
123
|
+
* @param collection Collection to count items in.
|
|
124
|
+
* @param query Query to filter the counted items (counts all items when omitted).
|
|
125
|
+
* @returns The number of matching items.
|
|
126
|
+
* @example await provider.countQuery(users, { age: 40 }) // 7
|
|
127
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/countQuery
|
|
128
|
+
*/
|
|
39
129
|
countQuery(collection, query) {
|
|
40
130
|
return this.source.countQuery(collection, query);
|
|
41
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Get the items in `source` matching an optional query, refreshing the cache.
|
|
134
|
+
*
|
|
135
|
+
* @param collection Collection to query.
|
|
136
|
+
* @param query Query to filter, sort, and limit the items (returns all items when omitted).
|
|
137
|
+
* @returns An array of matching items.
|
|
138
|
+
* @example await provider.getQuery(users, { age: 40, $order: "name" }) // Items.
|
|
139
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/getQuery
|
|
140
|
+
*/
|
|
42
141
|
async getQuery(collection, query) {
|
|
43
142
|
const items = await this.source.getQuery(collection, query);
|
|
44
143
|
this.memory.getTable(collection).setItems(items);
|
|
45
144
|
return items;
|
|
46
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Subscribe to live changes for a query, mirroring each emission into the cache.
|
|
148
|
+
*
|
|
149
|
+
* @param collection Collection to query.
|
|
150
|
+
* @param query Query to filter, sort, and limit the items.
|
|
151
|
+
* @returns Async sequence yielding the matching items on every change.
|
|
152
|
+
* @example for await (const items of provider.getQuerySequence(users, { age: 40 })) console.log(items);
|
|
153
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/getQuerySequence
|
|
154
|
+
*/
|
|
47
155
|
getQuerySequence(collection, query) {
|
|
48
156
|
return this.memory.getTable(collection).setItemsSequence(this.source.getQuerySequence(collection, query));
|
|
49
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Set (overwrite) every item in `source` matching a query and mirror the change into the cache.
|
|
160
|
+
*
|
|
161
|
+
* @param collection Collection to write to.
|
|
162
|
+
* @param query Query selecting the items to set.
|
|
163
|
+
* @param data Full data to store for each matching item.
|
|
164
|
+
* @example await provider.setQuery(users, { age: 40 }, { active: true });
|
|
165
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/setQuery
|
|
166
|
+
*/
|
|
50
167
|
async setQuery(collection, query, data) {
|
|
51
168
|
await this.source.setQuery(collection, query, data);
|
|
52
169
|
this.memory.getTable(collection).setQuery(query, data);
|
|
53
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Apply partial updates to every item in `source` matching a query and mirror them into the cache.
|
|
173
|
+
*
|
|
174
|
+
* @param collection Collection to write to.
|
|
175
|
+
* @param query Query selecting the items to update.
|
|
176
|
+
* @param updates Updates to apply to each matching item.
|
|
177
|
+
* @example await provider.updateQuery(users, { age: 40 }, { active: true });
|
|
178
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/updateQuery
|
|
179
|
+
*/
|
|
54
180
|
async updateQuery(collection, query, updates) {
|
|
55
181
|
await this.source.updateQuery(collection, query, updates);
|
|
56
182
|
this.memory.getTable(collection).updateQuery(query, updates);
|
|
57
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Delete every item in `source` matching a query and remove them from the cache.
|
|
186
|
+
*
|
|
187
|
+
* @param collection Collection to delete from.
|
|
188
|
+
* @param query Query selecting the items to delete.
|
|
189
|
+
* @example await provider.deleteQuery(users, { active: false });
|
|
190
|
+
* @see https://dhoulb.github.io/shelving/db/provider/CacheDBProvider/CacheDBProvider/deleteQuery
|
|
191
|
+
*/
|
|
58
192
|
async deleteQuery(collection, query) {
|
|
59
193
|
await this.source.deleteQuery(collection, query);
|
|
60
194
|
this.memory.getTable(collection).deleteQuery(query);
|
|
@@ -5,7 +5,13 @@ import type { Query } from "../../util/query.js";
|
|
|
5
5
|
import type { Updates } from "../../util/update.js";
|
|
6
6
|
import type { Collection } from "../collection/Collection.js";
|
|
7
7
|
import { ThroughDBProvider } from "./ThroughDBProvider.js";
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Structured log entry recording a single database write performed through a `ChangesDBProvider`.
|
|
10
|
+
*
|
|
11
|
+
* - `action` is the kind of write; `collection` is the collection name; `id`, `query`, `data`, and `updates` carry whichever fields apply to that write.
|
|
12
|
+
*
|
|
13
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/DBChange
|
|
14
|
+
*/
|
|
9
15
|
export type DBChange<I extends Identifier> = {
|
|
10
16
|
readonly action: "add" | "set" | "update" | "delete";
|
|
11
17
|
readonly collection: string;
|
|
@@ -15,17 +21,92 @@ export type DBChange<I extends Identifier> = {
|
|
|
15
21
|
readonly updates?: unknown;
|
|
16
22
|
};
|
|
17
23
|
/**
|
|
18
|
-
* Database provider that
|
|
19
|
-
*
|
|
24
|
+
* Database provider that records every write it performs to its `changes` log.
|
|
25
|
+
*
|
|
26
|
+
* - Wraps a `source` provider, delegates each write, then appends a `DBChange` entry describing what happened.
|
|
27
|
+
* - Useful for building audit logging, change feeds, or assertions in tests; reads are passed straight through and not logged.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* const provider = new ChangesDBProvider(new MemoryDBProvider());
|
|
31
|
+
* await provider.addItem(users, { name: "Dave" });
|
|
32
|
+
* provider.changes; // [{ action: "add", collection: "users", id: 123, data: { name: "Dave" } }]
|
|
33
|
+
*
|
|
34
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider
|
|
20
35
|
*/
|
|
21
36
|
export declare class ChangesDBProvider<I extends Identifier, T extends Data> extends ThroughDBProvider<I, T> {
|
|
37
|
+
/**
|
|
38
|
+
* The log of writes performed through this provider, in the order they happened.
|
|
39
|
+
*
|
|
40
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/changes
|
|
41
|
+
*/
|
|
22
42
|
get changes(): ReadonlyArray<DBChange<I>>;
|
|
23
43
|
readonly _changes: MutableArray<DBChange<I>>;
|
|
44
|
+
/**
|
|
45
|
+
* Add a new item, then log an `"add"` change.
|
|
46
|
+
*
|
|
47
|
+
* @param collection Collection to add the item to.
|
|
48
|
+
* @param data Data for the new item.
|
|
49
|
+
* @returns The generated identifier for the new item.
|
|
50
|
+
* @example await provider.addItem(users, { name: "Dave" }) // 123
|
|
51
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/addItem
|
|
52
|
+
*/
|
|
24
53
|
addItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, data: TT): Promise<II>;
|
|
54
|
+
/**
|
|
55
|
+
* Set (insert or overwrite) an item by its id, then log a `"set"` change.
|
|
56
|
+
*
|
|
57
|
+
* @param collection Collection the item belongs to.
|
|
58
|
+
* @param id Identifier of the item to set.
|
|
59
|
+
* @param data Full data to store for the item.
|
|
60
|
+
* @example await provider.setItem(users, 123, { name: "Dave" });
|
|
61
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/setItem
|
|
62
|
+
*/
|
|
25
63
|
setItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II, data: TT): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Apply partial updates to an item by its id, then log an `"update"` change.
|
|
66
|
+
*
|
|
67
|
+
* @param collection Collection the item belongs to.
|
|
68
|
+
* @param id Identifier of the item to update.
|
|
69
|
+
* @param updates Updates to apply to the item.
|
|
70
|
+
* @example await provider.updateItem(users, 123, { name: "Dave" });
|
|
71
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/updateItem
|
|
72
|
+
*/
|
|
26
73
|
updateItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II, updates: Updates<Item<II, TT>>): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Delete an item by its id, then log a `"delete"` change.
|
|
76
|
+
*
|
|
77
|
+
* @param collection Collection the item belongs to.
|
|
78
|
+
* @param id Identifier of the item to delete.
|
|
79
|
+
* @example await provider.deleteItem(users, 123);
|
|
80
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/deleteItem
|
|
81
|
+
*/
|
|
27
82
|
deleteItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Set (overwrite) every item matching a query, then log a `"set"` change.
|
|
85
|
+
*
|
|
86
|
+
* @param collection Collection to write to.
|
|
87
|
+
* @param query Query selecting the items to set.
|
|
88
|
+
* @param data Full data to store for each matching item.
|
|
89
|
+
* @example await provider.setQuery(users, { age: 40 }, { active: true });
|
|
90
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/setQuery
|
|
91
|
+
*/
|
|
28
92
|
setQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>, data: TT): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Apply partial updates to every item matching a query, then log an `"update"` change.
|
|
95
|
+
*
|
|
96
|
+
* @param collection Collection to write to.
|
|
97
|
+
* @param query Query selecting the items to update.
|
|
98
|
+
* @param updates Updates to apply to each matching item.
|
|
99
|
+
* @example await provider.updateQuery(users, { age: 40 }, { active: true });
|
|
100
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/updateQuery
|
|
101
|
+
*/
|
|
29
102
|
updateQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>, updates: Updates<TT>): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Delete every item matching a query, then log a `"delete"` change.
|
|
105
|
+
*
|
|
106
|
+
* @param collection Collection to delete from.
|
|
107
|
+
* @param query Query selecting the items to delete.
|
|
108
|
+
* @example await provider.deleteQuery(users, { active: false });
|
|
109
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/deleteQuery
|
|
110
|
+
*/
|
|
30
111
|
deleteQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>): Promise<void>;
|
|
31
112
|
}
|
|
@@ -1,38 +1,113 @@
|
|
|
1
1
|
import { ThroughDBProvider } from "./ThroughDBProvider.js";
|
|
2
2
|
/**
|
|
3
|
-
* Database provider that
|
|
4
|
-
*
|
|
3
|
+
* Database provider that records every write it performs to its `changes` log.
|
|
4
|
+
*
|
|
5
|
+
* - Wraps a `source` provider, delegates each write, then appends a `DBChange` entry describing what happened.
|
|
6
|
+
* - Useful for building audit logging, change feeds, or assertions in tests; reads are passed straight through and not logged.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const provider = new ChangesDBProvider(new MemoryDBProvider());
|
|
10
|
+
* await provider.addItem(users, { name: "Dave" });
|
|
11
|
+
* provider.changes; // [{ action: "add", collection: "users", id: 123, data: { name: "Dave" } }]
|
|
12
|
+
*
|
|
13
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider
|
|
5
14
|
*/
|
|
6
15
|
export class ChangesDBProvider extends ThroughDBProvider {
|
|
16
|
+
/**
|
|
17
|
+
* The log of writes performed through this provider, in the order they happened.
|
|
18
|
+
*
|
|
19
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/changes
|
|
20
|
+
*/
|
|
7
21
|
get changes() {
|
|
8
22
|
return this._changes;
|
|
9
23
|
}
|
|
10
24
|
_changes = [];
|
|
25
|
+
/**
|
|
26
|
+
* Add a new item, then log an `"add"` change.
|
|
27
|
+
*
|
|
28
|
+
* @param collection Collection to add the item to.
|
|
29
|
+
* @param data Data for the new item.
|
|
30
|
+
* @returns The generated identifier for the new item.
|
|
31
|
+
* @example await provider.addItem(users, { name: "Dave" }) // 123
|
|
32
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/addItem
|
|
33
|
+
*/
|
|
11
34
|
async addItem(collection, data) {
|
|
12
35
|
const id = await super.addItem(collection, data);
|
|
13
36
|
this._changes.push({ action: "add", collection: collection.name, id, data });
|
|
14
37
|
return id;
|
|
15
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Set (insert or overwrite) an item by its id, then log a `"set"` change.
|
|
41
|
+
*
|
|
42
|
+
* @param collection Collection the item belongs to.
|
|
43
|
+
* @param id Identifier of the item to set.
|
|
44
|
+
* @param data Full data to store for the item.
|
|
45
|
+
* @example await provider.setItem(users, 123, { name: "Dave" });
|
|
46
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/setItem
|
|
47
|
+
*/
|
|
16
48
|
async setItem(collection, id, data) {
|
|
17
49
|
await super.setItem(collection, id, data);
|
|
18
50
|
this._changes.push({ action: "set", collection: collection.name, id, data });
|
|
19
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Apply partial updates to an item by its id, then log an `"update"` change.
|
|
54
|
+
*
|
|
55
|
+
* @param collection Collection the item belongs to.
|
|
56
|
+
* @param id Identifier of the item to update.
|
|
57
|
+
* @param updates Updates to apply to the item.
|
|
58
|
+
* @example await provider.updateItem(users, 123, { name: "Dave" });
|
|
59
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/updateItem
|
|
60
|
+
*/
|
|
20
61
|
async updateItem(collection, id, updates) {
|
|
21
62
|
await super.updateItem(collection, id, updates);
|
|
22
63
|
this._changes.push({ action: "update", collection: collection.name, id, updates });
|
|
23
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Delete an item by its id, then log a `"delete"` change.
|
|
67
|
+
*
|
|
68
|
+
* @param collection Collection the item belongs to.
|
|
69
|
+
* @param id Identifier of the item to delete.
|
|
70
|
+
* @example await provider.deleteItem(users, 123);
|
|
71
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/deleteItem
|
|
72
|
+
*/
|
|
24
73
|
async deleteItem(collection, id) {
|
|
25
74
|
await super.deleteItem(collection, id);
|
|
26
75
|
this._changes.push({ action: "delete", collection: collection.name, id });
|
|
27
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Set (overwrite) every item matching a query, then log a `"set"` change.
|
|
79
|
+
*
|
|
80
|
+
* @param collection Collection to write to.
|
|
81
|
+
* @param query Query selecting the items to set.
|
|
82
|
+
* @param data Full data to store for each matching item.
|
|
83
|
+
* @example await provider.setQuery(users, { age: 40 }, { active: true });
|
|
84
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/setQuery
|
|
85
|
+
*/
|
|
28
86
|
async setQuery(collection, query, data) {
|
|
29
87
|
await super.setQuery(collection, query, data);
|
|
30
88
|
this._changes.push({ action: "set", collection: collection.name, query, data });
|
|
31
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Apply partial updates to every item matching a query, then log an `"update"` change.
|
|
92
|
+
*
|
|
93
|
+
* @param collection Collection to write to.
|
|
94
|
+
* @param query Query selecting the items to update.
|
|
95
|
+
* @param updates Updates to apply to each matching item.
|
|
96
|
+
* @example await provider.updateQuery(users, { age: 40 }, { active: true });
|
|
97
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/updateQuery
|
|
98
|
+
*/
|
|
32
99
|
async updateQuery(collection, query, updates) {
|
|
33
100
|
await super.updateQuery(collection, query, updates);
|
|
34
101
|
this._changes.push({ action: "update", collection: collection.name, query, updates });
|
|
35
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Delete every item matching a query, then log a `"delete"` change.
|
|
105
|
+
*
|
|
106
|
+
* @param collection Collection to delete from.
|
|
107
|
+
* @param query Query selecting the items to delete.
|
|
108
|
+
* @example await provider.deleteQuery(users, { active: false });
|
|
109
|
+
* @see https://dhoulb.github.io/shelving/db/provider/ChangesDBProvider/ChangesDBProvider/deleteQuery
|
|
110
|
+
*/
|
|
36
111
|
async deleteQuery(collection, query) {
|
|
37
112
|
await super.deleteQuery(collection, query);
|
|
38
113
|
this._changes.push({ action: "delete", collection: collection.name, query });
|
|
@@ -3,22 +3,169 @@ import type { Identifier, Item, Items, ItemsSequence, OptionalItem, OptionalItem
|
|
|
3
3
|
import type { Query } from "../../util/query.js";
|
|
4
4
|
import type { Updates } from "../../util/update.js";
|
|
5
5
|
import type { Collection } from "../collection/Collection.js";
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Provider with a fully asynchronous interface for database access.
|
|
8
|
+
*
|
|
9
|
+
* - Abstract base for every database provider; subclasses implement the storage backend (memory, SQL, remote, etc.).
|
|
10
|
+
* - All operations are keyed by a `Collection`, which carries the name plus identifier and data schemas.
|
|
11
|
+
* - Layered behaviour (caching, validation, logging) is added by wrapping a provider in a `Through*Provider`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const provider = new MemoryDBProvider();
|
|
15
|
+
* const id = await provider.addItem(users, { name: "Dave" });
|
|
16
|
+
*
|
|
17
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider
|
|
18
|
+
*/
|
|
7
19
|
export declare abstract class DBProvider<I extends Identifier = Identifier, T extends Data = Data> implements AsyncDisposable {
|
|
20
|
+
/**
|
|
21
|
+
* Get an item from a collection by its id, or `undefined` if it doesn't exist.
|
|
22
|
+
*
|
|
23
|
+
* @param collection Collection the item belongs to.
|
|
24
|
+
* @param id Identifier of the item to get.
|
|
25
|
+
* @returns The item, or `undefined` if no item exists with that id.
|
|
26
|
+
* @example await provider.getItem(users, 123) // Item or undefined.
|
|
27
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/getItem
|
|
28
|
+
*/
|
|
8
29
|
abstract getItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II): Promise<OptionalItem<II, TT>>;
|
|
30
|
+
/**
|
|
31
|
+
* Get an item from a collection by its id, or throw if it doesn't exist.
|
|
32
|
+
*
|
|
33
|
+
* @param collection Collection the item belongs to.
|
|
34
|
+
* @param id Identifier of the item to get.
|
|
35
|
+
* @returns The item.
|
|
36
|
+
* @throws `RequiredError` if no item exists with that id.
|
|
37
|
+
* @example await provider.requireItem(users, 123) // Item (or throws).
|
|
38
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/requireItem
|
|
39
|
+
*/
|
|
9
40
|
requireItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II): Promise<Item<II, TT>>;
|
|
41
|
+
/**
|
|
42
|
+
* Subscribe to live changes for a single item by its id.
|
|
43
|
+
*
|
|
44
|
+
* @param collection Collection the item belongs to.
|
|
45
|
+
* @param id Identifier of the item to subscribe to.
|
|
46
|
+
* @returns Async sequence yielding the item (or `undefined`) on every change.
|
|
47
|
+
* @example for await (const item of provider.getItemSequence(users, 123)) console.log(item);
|
|
48
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/getItemSequence
|
|
49
|
+
*/
|
|
10
50
|
abstract getItemSequence<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II): OptionalItemSequence<II, TT>;
|
|
51
|
+
/**
|
|
52
|
+
* Add a new item to a collection and return its generated id.
|
|
53
|
+
*
|
|
54
|
+
* @param collection Collection to add the item to.
|
|
55
|
+
* @param data Data for the new item.
|
|
56
|
+
* @returns The generated identifier for the new item.
|
|
57
|
+
* @example await provider.addItem(users, { name: "Dave" }) // 123
|
|
58
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/addItem
|
|
59
|
+
*/
|
|
11
60
|
abstract addItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, data: TT): Promise<II>;
|
|
61
|
+
/**
|
|
62
|
+
* Set (insert or overwrite) the data for an item by its id.
|
|
63
|
+
*
|
|
64
|
+
* @param collection Collection the item belongs to.
|
|
65
|
+
* @param id Identifier of the item to set.
|
|
66
|
+
* @param data Full data to store for the item.
|
|
67
|
+
* @example await provider.setItem(users, 123, { name: "Dave" });
|
|
68
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/setItem
|
|
69
|
+
*/
|
|
12
70
|
abstract setItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II, data: TT): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Apply partial updates to an existing item by its id.
|
|
73
|
+
*
|
|
74
|
+
* @param collection Collection the item belongs to.
|
|
75
|
+
* @param id Identifier of the item to update.
|
|
76
|
+
* @param updates Updates to apply to the item.
|
|
77
|
+
* @example await provider.updateItem(users, 123, { name: "Dave" });
|
|
78
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/updateItem
|
|
79
|
+
*/
|
|
13
80
|
abstract updateItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II, updates: Updates<Item<II, TT>>): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Delete an item from a collection by its id.
|
|
83
|
+
*
|
|
84
|
+
* @param collection Collection the item belongs to.
|
|
85
|
+
* @param id Identifier of the item to delete.
|
|
86
|
+
* @example await provider.deleteItem(users, 123);
|
|
87
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/deleteItem
|
|
88
|
+
*/
|
|
14
89
|
abstract deleteItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, id: II): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Count the items in a collection matching an optional query.
|
|
92
|
+
*
|
|
93
|
+
* @param collection Collection to count items in.
|
|
94
|
+
* @param query Query to filter the counted items (counts all items when omitted).
|
|
95
|
+
* @returns The number of matching items.
|
|
96
|
+
* @example await provider.countQuery(users, { age: 40 }) // 7
|
|
97
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/countQuery
|
|
98
|
+
*/
|
|
15
99
|
countQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query?: Query<Item<II, TT>>): Promise<number>;
|
|
100
|
+
/**
|
|
101
|
+
* Get the items in a collection matching an optional query.
|
|
102
|
+
*
|
|
103
|
+
* @param collection Collection to query.
|
|
104
|
+
* @param query Query to filter, sort, and limit the items (returns all items when omitted).
|
|
105
|
+
* @returns An array of matching items.
|
|
106
|
+
* @example await provider.getQuery(users, { age: 40, $order: "name" }) // Items.
|
|
107
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/getQuery
|
|
108
|
+
*/
|
|
16
109
|
abstract getQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query?: Query<Item<II, TT>>): Promise<Items<II, TT>>;
|
|
110
|
+
/**
|
|
111
|
+
* Subscribe to live changes for the result of a query.
|
|
112
|
+
*
|
|
113
|
+
* @param collection Collection to query.
|
|
114
|
+
* @param query Query to filter, sort, and limit the items.
|
|
115
|
+
* @returns Async sequence yielding the matching items on every change.
|
|
116
|
+
* @example for await (const items of provider.getQuerySequence(users, { age: 40 })) console.log(items);
|
|
117
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/getQuerySequence
|
|
118
|
+
*/
|
|
17
119
|
abstract getQuerySequence<II extends I, TT extends T>(collection: Collection<string, II, TT>, query?: Query<Item<II, TT>>): ItemsSequence<II, TT>;
|
|
120
|
+
/**
|
|
121
|
+
* Set (overwrite) the data for every item matching a query.
|
|
122
|
+
*
|
|
123
|
+
* @param collection Collection to write to.
|
|
124
|
+
* @param query Query selecting the items to set.
|
|
125
|
+
* @param data Full data to store for each matching item.
|
|
126
|
+
* @example await provider.setQuery(users, { age: 40 }, { active: true });
|
|
127
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/setQuery
|
|
128
|
+
*/
|
|
18
129
|
abstract setQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>, data: TT): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Apply partial updates to every item matching a query.
|
|
132
|
+
*
|
|
133
|
+
* @param collection Collection to write to.
|
|
134
|
+
* @param query Query selecting the items to update.
|
|
135
|
+
* @param updates Updates to apply to each matching item.
|
|
136
|
+
* @example await provider.updateQuery(users, { age: 40 }, { active: true });
|
|
137
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/updateQuery
|
|
138
|
+
*/
|
|
19
139
|
abstract updateQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>, updates: Updates<TT>): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Delete every item matching a query.
|
|
142
|
+
*
|
|
143
|
+
* @param collection Collection to delete from.
|
|
144
|
+
* @param query Query selecting the items to delete.
|
|
145
|
+
* @example await provider.deleteQuery(users, { active: false });
|
|
146
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/deleteQuery
|
|
147
|
+
*/
|
|
20
148
|
abstract deleteQuery<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>): Promise<void>;
|
|
149
|
+
/**
|
|
150
|
+
* Get the first item matching a query, or `undefined` if there are none.
|
|
151
|
+
*
|
|
152
|
+
* @param collection Collection to query.
|
|
153
|
+
* @param query Query to filter and sort the items.
|
|
154
|
+
* @returns The first matching item, or `undefined` if none match.
|
|
155
|
+
* @example await provider.getFirst(users, { $order: "name" }) // Item or undefined.
|
|
156
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/getFirst
|
|
157
|
+
*/
|
|
21
158
|
getFirst<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>): Promise<OptionalItem<II, TT>>;
|
|
159
|
+
/**
|
|
160
|
+
* Get the first item matching a query, or throw if there are none.
|
|
161
|
+
*
|
|
162
|
+
* @param collection Collection to query.
|
|
163
|
+
* @param query Query to filter and sort the items.
|
|
164
|
+
* @returns The first matching item.
|
|
165
|
+
* @throws `RequiredError` if no item matches the query.
|
|
166
|
+
* @example await provider.requireFirst(users, { $order: "name" }) // Item (or throws).
|
|
167
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/requireFirst
|
|
168
|
+
*/
|
|
22
169
|
requireFirst<II extends I, TT extends T>(collection: Collection<string, II, TT>, query: Query<Item<II, TT>>): Promise<Item<II, TT>>;
|
|
23
170
|
[Symbol.asyncDispose](): Promise<void>;
|
|
24
171
|
}
|
|
@@ -1,8 +1,30 @@
|
|
|
1
1
|
import { RequiredError } from "../../error/RequiredError.js";
|
|
2
2
|
import { countArray, getFirst } from "../../util/array.js";
|
|
3
3
|
import { awaitDispose } from "../../util/dispose.js";
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Provider with a fully asynchronous interface for database access.
|
|
6
|
+
*
|
|
7
|
+
* - Abstract base for every database provider; subclasses implement the storage backend (memory, SQL, remote, etc.).
|
|
8
|
+
* - All operations are keyed by a `Collection`, which carries the name plus identifier and data schemas.
|
|
9
|
+
* - Layered behaviour (caching, validation, logging) is added by wrapping a provider in a `Through*Provider`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* const provider = new MemoryDBProvider();
|
|
13
|
+
* const id = await provider.addItem(users, { name: "Dave" });
|
|
14
|
+
*
|
|
15
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider
|
|
16
|
+
*/
|
|
5
17
|
export class DBProvider {
|
|
18
|
+
/**
|
|
19
|
+
* Get an item from a collection by its id, or throw if it doesn't exist.
|
|
20
|
+
*
|
|
21
|
+
* @param collection Collection the item belongs to.
|
|
22
|
+
* @param id Identifier of the item to get.
|
|
23
|
+
* @returns The item.
|
|
24
|
+
* @throws `RequiredError` if no item exists with that id.
|
|
25
|
+
* @example await provider.requireItem(users, 123) // Item (or throws).
|
|
26
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/requireItem
|
|
27
|
+
*/
|
|
6
28
|
async requireItem(collection, id) {
|
|
7
29
|
const item = await this.getItem(collection, id);
|
|
8
30
|
if (!item)
|
|
@@ -14,12 +36,40 @@ export class DBProvider {
|
|
|
14
36
|
});
|
|
15
37
|
return item;
|
|
16
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Count the items in a collection matching an optional query.
|
|
41
|
+
*
|
|
42
|
+
* @param collection Collection to count items in.
|
|
43
|
+
* @param query Query to filter the counted items (counts all items when omitted).
|
|
44
|
+
* @returns The number of matching items.
|
|
45
|
+
* @example await provider.countQuery(users, { age: 40 }) // 7
|
|
46
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/countQuery
|
|
47
|
+
*/
|
|
17
48
|
async countQuery(collection, query) {
|
|
18
49
|
return countArray(await this.getQuery(collection, query));
|
|
19
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the first item matching a query, or `undefined` if there are none.
|
|
53
|
+
*
|
|
54
|
+
* @param collection Collection to query.
|
|
55
|
+
* @param query Query to filter and sort the items.
|
|
56
|
+
* @returns The first matching item, or `undefined` if none match.
|
|
57
|
+
* @example await provider.getFirst(users, { $order: "name" }) // Item or undefined.
|
|
58
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/getFirst
|
|
59
|
+
*/
|
|
20
60
|
async getFirst(collection, query) {
|
|
21
61
|
return getFirst(await this.getQuery(collection, { ...query, $limit: 1 }));
|
|
22
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the first item matching a query, or throw if there are none.
|
|
65
|
+
*
|
|
66
|
+
* @param collection Collection to query.
|
|
67
|
+
* @param query Query to filter and sort the items.
|
|
68
|
+
* @returns The first matching item.
|
|
69
|
+
* @throws `RequiredError` if no item matches the query.
|
|
70
|
+
* @example await provider.requireFirst(users, { $order: "name" }) // Item (or throws).
|
|
71
|
+
* @see https://dhoulb.github.io/shelving/db/provider/DBProvider/DBProvider/requireFirst
|
|
72
|
+
*/
|
|
23
73
|
async requireFirst(collection, query) {
|
|
24
74
|
const first = await this.getFirst(collection, query);
|
|
25
75
|
if (!first)
|