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
|
@@ -3,8 +3,28 @@ import { UnimplementedError } from "../../error/UnimplementedError.js";
|
|
|
3
3
|
import { getQueryFilters, getQueryLimit, getQueryOrders } from "../../util/query.js";
|
|
4
4
|
import { getUpdates } from "../../util/update.js";
|
|
5
5
|
import { DBProvider } from "./DBProvider.js";
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Abstract database provider that implements CRUD and query operations by generating and executing SQL.
|
|
8
|
+
*
|
|
9
|
+
* - Subclasses implement `exec()` to run a query against a concrete database (e.g. SQLite, PostgreSQL).
|
|
10
|
+
* - The `sql*` helpers build composable `SQLFragment` objects so dialect differences can be overridden.
|
|
11
|
+
* - Realtime subscriptions are unsupported and throw `UnimplementedError`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* class MyProvider extends SQLProvider { async exec(strings, ...values) { ... } }
|
|
15
|
+
* const item = await new MyProvider().getItem(collection, "abc");
|
|
16
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider
|
|
17
|
+
*/
|
|
7
18
|
export class SQLProvider extends DBProvider {
|
|
19
|
+
/**
|
|
20
|
+
* Get a single item by ID, or `undefined` if it doesn't exist.
|
|
21
|
+
*
|
|
22
|
+
* @param collection The collection to read from.
|
|
23
|
+
* @param id The ID of the item to get.
|
|
24
|
+
* @returns Promise resolving to the item, or `undefined` if it doesn't exist.
|
|
25
|
+
* @example await provider.getItem(collection, "abc")
|
|
26
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/getItem
|
|
27
|
+
*/
|
|
8
28
|
async getItem(collection, id) {
|
|
9
29
|
const rows = await this.exec `
|
|
10
30
|
SELECT * FROM ${this.sqlIdentifier(collection.name)}
|
|
@@ -13,9 +33,29 @@ export class SQLProvider extends DBProvider {
|
|
|
13
33
|
`;
|
|
14
34
|
return rows[0];
|
|
15
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Subscribe to realtime updates for a single item — unsupported by SQL providers.
|
|
38
|
+
*
|
|
39
|
+
* @param collection The collection to read from.
|
|
40
|
+
* @param id The ID of the item to subscribe to.
|
|
41
|
+
* @returns Never returns; always throws.
|
|
42
|
+
* @throws {UnimplementedError} Always, because SQL providers don't support realtime subscriptions.
|
|
43
|
+
* @example provider.getItemSequence(collection, "abc") // throws
|
|
44
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/getItemSequence
|
|
45
|
+
*/
|
|
16
46
|
getItemSequence(_collection, _id) {
|
|
17
47
|
throw new UnimplementedError(`SQLProvider does not support realtime subscriptions`);
|
|
18
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Insert a new item and return its generated ID.
|
|
51
|
+
*
|
|
52
|
+
* @param collection The collection to insert into.
|
|
53
|
+
* @param data The data of the item to insert.
|
|
54
|
+
* @returns Promise resolving to the ID of the inserted item.
|
|
55
|
+
* @throws {RequiredError} If the `INSERT` didn't return an ID.
|
|
56
|
+
* @example await provider.addItem(collection, { name: "Dave" })
|
|
57
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/addItem
|
|
58
|
+
*/
|
|
19
59
|
async addItem(collection, data) {
|
|
20
60
|
const rows = await this.exec `
|
|
21
61
|
INSERT INTO ${this.sqlIdentifier(collection.name)} ${this.sqlValues(data)}
|
|
@@ -26,12 +66,32 @@ export class SQLProvider extends DBProvider {
|
|
|
26
66
|
throw new RequiredError(`No id returned from INSERT into "${collection.name}"`, { provider: this });
|
|
27
67
|
return id;
|
|
28
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Set (insert or overwrite) an item at a specific ID.
|
|
71
|
+
*
|
|
72
|
+
* @param collection The collection to write to.
|
|
73
|
+
* @param id The ID of the item to set.
|
|
74
|
+
* @param data The full data to store for the item.
|
|
75
|
+
* @returns Promise that resolves once the item has been set.
|
|
76
|
+
* @example await provider.setItem(collection, "abc", { name: "Dave" })
|
|
77
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/setItem
|
|
78
|
+
*/
|
|
29
79
|
async setItem(collection, id, data) {
|
|
30
80
|
await this.exec `
|
|
31
81
|
INSERT INTO ${this.sqlIdentifier(collection.name)} ${this.sqlValues({ id, ...data })}
|
|
32
82
|
ON CONFLICT (${this.sqlIdentifier("id")}) DO UPDATE SET ${this.sqlSetters(data)}
|
|
33
83
|
`;
|
|
34
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Apply a set of updates to a single item by ID.
|
|
87
|
+
*
|
|
88
|
+
* @param collection The collection to write to.
|
|
89
|
+
* @param id The ID of the item to update.
|
|
90
|
+
* @param updates The updates to apply.
|
|
91
|
+
* @returns Promise that resolves once the item has been updated.
|
|
92
|
+
* @example await provider.updateItem(collection, "abc", { name: "Dave" })
|
|
93
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/updateItem
|
|
94
|
+
*/
|
|
35
95
|
async updateItem(collection, id, updates) {
|
|
36
96
|
await this.exec `
|
|
37
97
|
UPDATE ${this.sqlIdentifier(collection.name)}
|
|
@@ -39,9 +99,27 @@ export class SQLProvider extends DBProvider {
|
|
|
39
99
|
WHERE ${this.sqlIdentifier("id")} = ${id}
|
|
40
100
|
`;
|
|
41
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Delete a single item by ID.
|
|
104
|
+
*
|
|
105
|
+
* @param collection The collection to delete from.
|
|
106
|
+
* @param id The ID of the item to delete.
|
|
107
|
+
* @returns Promise that resolves once the item has been deleted.
|
|
108
|
+
* @example await provider.deleteItem(collection, "abc")
|
|
109
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/deleteItem
|
|
110
|
+
*/
|
|
42
111
|
async deleteItem(collection, id) {
|
|
43
112
|
await this.exec `DELETE FROM ${this.sqlIdentifier(collection.name)} WHERE ${this.sqlIdentifier("id")} = ${id}`;
|
|
44
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Count the items in a collection that match an optional query.
|
|
116
|
+
*
|
|
117
|
+
* @param collection The collection to count.
|
|
118
|
+
* @param query Optional query to filter the items to count.
|
|
119
|
+
* @returns Promise resolving to the number of matching items.
|
|
120
|
+
* @example await provider.countQuery(collection, query)
|
|
121
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/countQuery
|
|
122
|
+
*/
|
|
45
123
|
async countQuery(collection, query) {
|
|
46
124
|
const rows = await this.exec `
|
|
47
125
|
SELECT COUNT(*) AS "count" FROM ${this.sqlIdentifier(collection.name)}
|
|
@@ -49,52 +127,145 @@ export class SQLProvider extends DBProvider {
|
|
|
49
127
|
`;
|
|
50
128
|
return rows[0]?.count ?? 0;
|
|
51
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Get the items in a collection that match an optional query.
|
|
132
|
+
*
|
|
133
|
+
* @param collection The collection to read from.
|
|
134
|
+
* @param query Optional query to filter, sort, and limit the items.
|
|
135
|
+
* @returns Promise resolving to the array of matching items.
|
|
136
|
+
* @example await provider.getQuery(collection, query)
|
|
137
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/getQuery
|
|
138
|
+
*/
|
|
52
139
|
async getQuery(collection, query) {
|
|
53
140
|
return this.exec `
|
|
54
141
|
SELECT * FROM ${this.sqlIdentifier(collection.name)}
|
|
55
142
|
${query ? this.sqlClauses(query) : this.sql ``}
|
|
56
143
|
`;
|
|
57
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Subscribe to realtime updates for a query — unsupported by SQL providers.
|
|
147
|
+
*
|
|
148
|
+
* @param collection The collection to read from.
|
|
149
|
+
* @param query Optional query to subscribe to.
|
|
150
|
+
* @returns Never returns; always throws.
|
|
151
|
+
* @throws {UnimplementedError} Always, because SQL providers don't support realtime subscriptions.
|
|
152
|
+
* @example provider.getQuerySequence(collection, query) // throws
|
|
153
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/getQuerySequence
|
|
154
|
+
*/
|
|
58
155
|
getQuerySequence(_collection, _query) {
|
|
59
156
|
throw new UnimplementedError(`SQLProvider does not support realtime subscriptions`);
|
|
60
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Set (overwrite) the data of every item matching a query.
|
|
160
|
+
*
|
|
161
|
+
* @param collection The collection to write to.
|
|
162
|
+
* @param query The query selecting the items to set.
|
|
163
|
+
* @param data The full data to store for each matching item.
|
|
164
|
+
* @returns Promise that resolves once the matching items have been set.
|
|
165
|
+
* @example await provider.setQuery(collection, query, { active: true })
|
|
166
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/setQuery
|
|
167
|
+
*/
|
|
61
168
|
async setQuery(collection, query, data) {
|
|
62
169
|
await this.exec `UPDATE ${this.sqlIdentifier(collection.name)} SET ${this.sqlSetters(data)}${this.sqlClauses(query)}`;
|
|
63
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Apply a set of updates to every item matching a query.
|
|
173
|
+
*
|
|
174
|
+
* @param collection The collection to write to.
|
|
175
|
+
* @param query The query selecting the items to update.
|
|
176
|
+
* @param updates The updates to apply to each matching item.
|
|
177
|
+
* @returns Promise that resolves once the matching items have been updated.
|
|
178
|
+
* @example await provider.updateQuery(collection, query, { active: true })
|
|
179
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/updateQuery
|
|
180
|
+
*/
|
|
64
181
|
async updateQuery(collection, query, updates) {
|
|
65
182
|
await this.exec `UPDATE ${this.sqlIdentifier(collection.name)} SET ${this.sqlUpdates(updates)}${this.sqlClauses(query)}`;
|
|
66
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Delete every item matching a query.
|
|
186
|
+
*
|
|
187
|
+
* @param collection The collection to delete from.
|
|
188
|
+
* @param query The query selecting the items to delete.
|
|
189
|
+
* @returns Promise that resolves once the matching items have been deleted.
|
|
190
|
+
* @example await provider.deleteQuery(collection, query)
|
|
191
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/deleteQuery
|
|
192
|
+
*/
|
|
67
193
|
async deleteQuery(collection, query) {
|
|
68
194
|
await this.exec `DELETE FROM ${this.sqlIdentifier(collection.name)}${this.sqlClauses(query)}`;
|
|
69
195
|
}
|
|
70
196
|
/**
|
|
71
197
|
* Define an SQL fragment using Javascript template literal format.
|
|
198
|
+
*
|
|
199
|
+
* @param strings The template string parts of the fragment.
|
|
200
|
+
* @param values The interpolated values to embed into the fragment.
|
|
201
|
+
* @returns The composed `SQLFragment`.
|
|
72
202
|
* @example this.sql`SELECT * FROM ${table}`; // SQLFragment
|
|
203
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sql
|
|
73
204
|
*/
|
|
74
205
|
sql(strings, ...values) {
|
|
75
206
|
return { strings, values };
|
|
76
207
|
}
|
|
77
|
-
/**
|
|
208
|
+
/**
|
|
209
|
+
* Define an SQL fragment for an escaped identifier, e.g. `"myTable"`.
|
|
210
|
+
*
|
|
211
|
+
* @param name The identifier (table or column name) to escape.
|
|
212
|
+
* @returns An `SQLFragment` containing the quoted identifier.
|
|
213
|
+
* @example this.sqlIdentifier("myTable"); // "myTable"
|
|
214
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlIdentifier
|
|
215
|
+
*/
|
|
78
216
|
sqlIdentifier(name) {
|
|
79
217
|
return { strings: [_escapeIdentifier(name)], values: [] };
|
|
80
218
|
}
|
|
81
|
-
/**
|
|
219
|
+
/**
|
|
220
|
+
* Define an SQL fragment that extracts a value at a key for comparison, e.g. `"a" #>> {"b","c"}` in Postgres.
|
|
221
|
+
* - Base implementation only supports flat (single-segment) keys; subclasses override for nested JSON paths.
|
|
222
|
+
*
|
|
223
|
+
* @param key The key segments identifying the column (and any nested path).
|
|
224
|
+
* @returns An `SQLFragment` extracting the value.
|
|
225
|
+
* @throws {UnimplementedError} If the key is nested (multi-segment).
|
|
226
|
+
* @example this.sqlExtract(["name"]); // "name"
|
|
227
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlExtract
|
|
228
|
+
*/
|
|
82
229
|
sqlExtract(key) {
|
|
83
230
|
if (key.length > 1)
|
|
84
231
|
throw new UnimplementedError("SQLProvider does not support nested filter keys");
|
|
85
232
|
return this.sqlIdentifier(key[0]);
|
|
86
233
|
}
|
|
87
|
-
/**
|
|
234
|
+
/**
|
|
235
|
+
* Define an SQL fragment that joins a series of fragments with a separator, e.g. `"a" = 1 AND "b" = 2`.
|
|
236
|
+
*
|
|
237
|
+
* @param values The fragments to join.
|
|
238
|
+
* @param separator The separator placed between fragments.
|
|
239
|
+
* @param before Text placed before the first fragment.
|
|
240
|
+
* @param after Text placed after the last fragment.
|
|
241
|
+
* @returns The joined `SQLFragment`.
|
|
242
|
+
* @example this.sqlConcat([a, b], " AND "); // a AND b
|
|
243
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlConcat
|
|
244
|
+
*/
|
|
88
245
|
sqlConcat(values, separator = ", ", before = "", after = "") {
|
|
89
246
|
const strings = [before, ...new Array(Math.max(0, values.length - 1)).fill(separator), after];
|
|
90
247
|
return { strings, values };
|
|
91
248
|
}
|
|
92
|
-
/**
|
|
249
|
+
/**
|
|
250
|
+
* Define an SQL fragment for setting a list of values, e.g. `"a" = 1, "b" = 2`.
|
|
251
|
+
*
|
|
252
|
+
* @param data The data whose entries become `column = value` assignments.
|
|
253
|
+
* @returns The composed `SQLFragment`.
|
|
254
|
+
* @example this.sqlSetters({ a: 1, b: 2 }); // "a" = 1, "b" = 2
|
|
255
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlSetters
|
|
256
|
+
*/
|
|
93
257
|
sqlSetters(data) {
|
|
94
258
|
const entries = Object.entries(data);
|
|
95
259
|
return this.sqlConcat(entries.map(([key, value]) => this.sql `${this.sqlIdentifier(key)} = ${value}`), ", ");
|
|
96
260
|
}
|
|
97
|
-
/**
|
|
261
|
+
/**
|
|
262
|
+
* Define an SQL fragment for a set of updates, e.g. `"a" = 1, "b" = "b" + 5`.
|
|
263
|
+
*
|
|
264
|
+
* @param updates The updates to convert into SQL assignments.
|
|
265
|
+
* @returns The composed `SQLFragment`.
|
|
266
|
+
* @example this.sqlUpdates({ a: 1 }); // "a" = 1
|
|
267
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlUpdates
|
|
268
|
+
*/
|
|
98
269
|
sqlUpdates(updates) {
|
|
99
270
|
return this.sqlConcat(getUpdates(updates).map(update => this.sqlUpdate(update)), ", ");
|
|
100
271
|
}
|
|
@@ -103,6 +274,12 @@ export class SQLProvider extends DBProvider {
|
|
|
103
274
|
* - Handles flat `set` and `sum` only (single-segment key).
|
|
104
275
|
* - Nested keys (multi-segment) and `with`/`omit` actions throw `UnimplementedError`.
|
|
105
276
|
* - Subclasses should override to support nested keys and array mutation actions.
|
|
277
|
+
*
|
|
278
|
+
* @param update The update action (`action`, `key`, `value`) to convert.
|
|
279
|
+
* @returns The composed `SQLFragment`.
|
|
280
|
+
* @throws {UnimplementedError} If the key is nested or the action is unsupported.
|
|
281
|
+
* @example this.sqlUpdate({ action: "set", key: ["a"], value: 1 }); // "a" = 1
|
|
282
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlUpdate
|
|
106
283
|
*/
|
|
107
284
|
sqlUpdate({ action, key, value }) {
|
|
108
285
|
if (key.length > 1)
|
|
@@ -114,18 +291,39 @@ export class SQLProvider extends DBProvider {
|
|
|
114
291
|
return this.sql `${column} = ${column} + ${value}`;
|
|
115
292
|
throw new UnimplementedError(`SQLProvider does not support "${action}" updates`);
|
|
116
293
|
}
|
|
117
|
-
/**
|
|
294
|
+
/**
|
|
295
|
+
* Define an SQL fragment for `VALUES` syntax, e.g. `("a", "b") VALUES (1, 2)`.
|
|
296
|
+
*
|
|
297
|
+
* @param data The data whose keys and values become the column list and values.
|
|
298
|
+
* @returns The composed `SQLFragment`.
|
|
299
|
+
* @example this.sqlValues({ a: 1, b: 2 }); // ("a", "b") VALUES (1, 2)
|
|
300
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlValues
|
|
301
|
+
*/
|
|
118
302
|
sqlValues(data) {
|
|
119
303
|
const entries = Object.entries(data);
|
|
120
304
|
const keys = this.sqlConcat(entries.map(([key]) => this.sqlIdentifier(key)), ", ");
|
|
121
305
|
const values = this.sqlConcat(entries.map(([, value]) => this.sql `${value}`), ", ");
|
|
122
306
|
return this.sql `(${keys}) VALUES (${values})`;
|
|
123
307
|
}
|
|
124
|
-
/**
|
|
308
|
+
/**
|
|
309
|
+
* Define an SQL fragment for the `WHERE`, `ORDER BY` and `LIMIT` clauses of a query, e.g. ` WHERE x = 1 ORDER BY "name" LIMIT 0, 50`.
|
|
310
|
+
*
|
|
311
|
+
* @param query The query to translate into clauses.
|
|
312
|
+
* @returns The composed `SQLFragment`.
|
|
313
|
+
* @example this.sqlClauses(query); // WHERE ... ORDER BY ... LIMIT ...
|
|
314
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlClauses
|
|
315
|
+
*/
|
|
125
316
|
sqlClauses(query) {
|
|
126
317
|
return this.sql `${this.sqlWhere(query)}${this.sqlOrder(query)}${this.sqlLimit(query)}`;
|
|
127
318
|
}
|
|
128
|
-
/**
|
|
319
|
+
/**
|
|
320
|
+
* Define an SQL fragment for a `WHERE` clause, e.g. ` WHERE x = 1 AND y <= 100`.
|
|
321
|
+
*
|
|
322
|
+
* @param query The query whose filters become the `WHERE` clause.
|
|
323
|
+
* @returns The composed `SQLFragment` (empty if there are no filters).
|
|
324
|
+
* @example this.sqlWhere(query); // WHERE x = 1
|
|
325
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlWhere
|
|
326
|
+
*/
|
|
129
327
|
sqlWhere(query) {
|
|
130
328
|
const filters = getQueryFilters(query);
|
|
131
329
|
if (filters.length)
|
|
@@ -133,7 +331,13 @@ export class SQLProvider extends DBProvider {
|
|
|
133
331
|
return this.sql ` WHERE ${this.sqlConcat(filters.map(filter => this.sqlFilter(filter)), " AND ")}`;
|
|
134
332
|
}
|
|
135
333
|
/**
|
|
136
|
-
* Define an SQL fragment for a filter clause on a column.
|
|
334
|
+
* Define an SQL fragment for a single filter clause on a column, e.g. `x = 1` or `x IN (1, 2)`.
|
|
335
|
+
*
|
|
336
|
+
* @param filter The filter (`key`, `operator`, `value`) to translate.
|
|
337
|
+
* @returns The composed `SQLFragment`.
|
|
338
|
+
* @throws {UnimplementedError} If the operator is unsupported.
|
|
339
|
+
* @example this.sqlFilter({ key: ["x"], operator: "is", value: 1 }); // "x" = 1
|
|
340
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlFilter
|
|
137
341
|
*/
|
|
138
342
|
sqlFilter({ key, operator, value }) {
|
|
139
343
|
const path = this.sqlExtract(key);
|
|
@@ -162,8 +366,14 @@ export class SQLProvider extends DBProvider {
|
|
|
162
366
|
throw new UnimplementedError(`SQLProvider does not support "${operator}" filters`);
|
|
163
367
|
}
|
|
164
368
|
/**
|
|
165
|
-
* Define an SQL fragment for an `ORDER BY` clause, e.g. ` ORDER BY "a" ASC, "b" DESC
|
|
369
|
+
* Define an SQL fragment for an `ORDER BY` clause, e.g. ` ORDER BY "a" ASC, "b" DESC`.
|
|
166
370
|
* - Nested keys (multi-segment) throw `UnimplementedError`.
|
|
371
|
+
*
|
|
372
|
+
* @param query The query whose orders become the `ORDER BY` clause.
|
|
373
|
+
* @returns The composed `SQLFragment` (empty if there are no orders).
|
|
374
|
+
* @throws {UnimplementedError} If an order key is nested (multi-segment).
|
|
375
|
+
* @example this.sqlOrder(query); // ORDER BY "a" ASC
|
|
376
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlOrder
|
|
167
377
|
*/
|
|
168
378
|
sqlOrder(query) {
|
|
169
379
|
const orders = getQueryOrders(query);
|
|
@@ -171,7 +381,14 @@ export class SQLProvider extends DBProvider {
|
|
|
171
381
|
return this.sql ``;
|
|
172
382
|
return this.sql ` ORDER BY ${this.sqlConcat(orders.map(order => this.sqlSort(order)), ", ")}`;
|
|
173
383
|
}
|
|
174
|
-
/**
|
|
384
|
+
/**
|
|
385
|
+
* Define an SQL fragment for an individual column in an `ORDER BY`, e.g. `"a" ASC`.
|
|
386
|
+
*
|
|
387
|
+
* @param order The order (`key`, `direction`) to translate.
|
|
388
|
+
* @returns The composed `SQLFragment`.
|
|
389
|
+
* @example this.sqlSort({ key: ["a"], direction: "asc" }); // "a" ASC
|
|
390
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlSort
|
|
391
|
+
*/
|
|
175
392
|
sqlSort({ key, direction }) {
|
|
176
393
|
const path = this.sqlExtract(key);
|
|
177
394
|
if (direction === "asc")
|
|
@@ -180,7 +397,14 @@ export class SQLProvider extends DBProvider {
|
|
|
180
397
|
return this.sql `${path} DESC`;
|
|
181
398
|
return direction; // Never happens.
|
|
182
399
|
}
|
|
183
|
-
/**
|
|
400
|
+
/**
|
|
401
|
+
* Define an SQL fragment for a `LIMIT` clause, e.g. ` LIMIT 50`.
|
|
402
|
+
*
|
|
403
|
+
* @param query The query whose limit becomes the `LIMIT` clause.
|
|
404
|
+
* @returns The composed `SQLFragment` (empty if the query has no limit).
|
|
405
|
+
* @example this.sqlLimit(query); // LIMIT 50
|
|
406
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLProvider/SQLProvider/sqlLimit
|
|
407
|
+
*/
|
|
184
408
|
sqlLimit(query) {
|
|
185
409
|
const limit = getQueryLimit(query);
|
|
186
410
|
return typeof limit === "number" ? this.sql ` LIMIT ${limit}` : this.sql ``;
|
|
@@ -11,13 +11,53 @@ import { type SQLFragment, SQLProvider } from "./SQLProvider.js";
|
|
|
11
11
|
* Note the following compatibility caveats:
|
|
12
12
|
* - For `with` and `omit` updates this does not preserve ordering of the original array.
|
|
13
13
|
* - For `with` and `omit` updates this does not guarantee equality for de-duplication when working with nested objects or arrays.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* class MyProvider extends SQLiteProvider { async exec(strings, ...values) { ... } }
|
|
17
|
+
* const item = await new MyProvider().getItem(collection, "abc");
|
|
18
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider
|
|
14
19
|
*/
|
|
15
20
|
export declare abstract class SQLiteProvider<I extends Identifier = Identifier, T extends Data = Data> extends SQLProvider<I, T> {
|
|
21
|
+
/**
|
|
22
|
+
* Insert a new item and return its ID, generating a UUID client-side for string-keyed collections.
|
|
23
|
+
* - SQLite has no native UUID generation, so for `StringSchema` IDs the UUID is generated here and delegated to `setItem`.
|
|
24
|
+
*
|
|
25
|
+
* @param collection The collection to insert into.
|
|
26
|
+
* @param data The data of the item to insert.
|
|
27
|
+
* @returns Promise resolving to the ID of the inserted item.
|
|
28
|
+
* @example await provider.addItem(collection, { name: "Dave" })
|
|
29
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/addItem
|
|
30
|
+
*/
|
|
16
31
|
addItem<II extends I, TT extends T>(collection: Collection<string, II, TT>, data: TT): Promise<II>;
|
|
17
32
|
/** Get the SQLite JSON path for the nested segments of a key (everything after the column name), e.g. `$.b.c` */
|
|
18
33
|
private sqlPath;
|
|
19
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Get the SQLite JSON extract syntax for a key, e.g. `json_extract("a", $.b.c)`.
|
|
36
|
+
*
|
|
37
|
+
* @param key The key segments identifying the column and any nested JSON path.
|
|
38
|
+
* @returns An `SQLFragment` extracting the value.
|
|
39
|
+
* @example this.sqlExtract(["a", "b"]); // json_extract("a", $.b)
|
|
40
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/sqlExtract
|
|
41
|
+
*/
|
|
20
42
|
sqlExtract(key: Segments): SQLFragment;
|
|
43
|
+
/**
|
|
44
|
+
* Define an SQL fragment for a single update action, with SQLite JSON1 support for nested keys and `with`/`omit` array mutations.
|
|
45
|
+
*
|
|
46
|
+
* @param update The update action (`action`, `key`, `value`) to convert.
|
|
47
|
+
* @returns The composed `SQLFragment`.
|
|
48
|
+
* @throws {UnimplementedError} If the action is unsupported.
|
|
49
|
+
* @example this.sqlUpdate({ action: "set", key: ["a", "b"], value: 1 })
|
|
50
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/sqlUpdate
|
|
51
|
+
*/
|
|
21
52
|
sqlUpdate(update: Update): SQLFragment;
|
|
53
|
+
/**
|
|
54
|
+
* Define an SQL fragment for a filter clause, with SQLite JSON1 support for `contains` and deeply-nested JSON queries.
|
|
55
|
+
*
|
|
56
|
+
* @param filter The filter (`key`, `operator`, `value`) to translate.
|
|
57
|
+
* @returns The composed `SQLFragment`.
|
|
58
|
+
* @throws {UnimplementedError} If the operator is unsupported.
|
|
59
|
+
* @example this.sqlFilter({ key: ["tags"], operator: "contains", value: "x" })
|
|
60
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/sqlFilter
|
|
61
|
+
*/
|
|
22
62
|
sqlFilter(filter: QueryFilter): SQLFragment;
|
|
23
63
|
}
|
|
@@ -6,9 +6,23 @@ import { SQLProvider } from "./SQLProvider.js";
|
|
|
6
6
|
* Note the following compatibility caveats:
|
|
7
7
|
* - For `with` and `omit` updates this does not preserve ordering of the original array.
|
|
8
8
|
* - For `with` and `omit` updates this does not guarantee equality for de-duplication when working with nested objects or arrays.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* class MyProvider extends SQLiteProvider { async exec(strings, ...values) { ... } }
|
|
12
|
+
* const item = await new MyProvider().getItem(collection, "abc");
|
|
13
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider
|
|
9
14
|
*/
|
|
10
15
|
export class SQLiteProvider extends SQLProvider {
|
|
11
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Insert a new item and return its ID, generating a UUID client-side for string-keyed collections.
|
|
18
|
+
* - SQLite has no native UUID generation, so for `StringSchema` IDs the UUID is generated here and delegated to `setItem`.
|
|
19
|
+
*
|
|
20
|
+
* @param collection The collection to insert into.
|
|
21
|
+
* @param data The data of the item to insert.
|
|
22
|
+
* @returns Promise resolving to the ID of the inserted item.
|
|
23
|
+
* @example await provider.addItem(collection, { name: "Dave" })
|
|
24
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/addItem
|
|
25
|
+
*/
|
|
12
26
|
// SQLite has no native UUID generation, so when the collection uses a `StringSchema` ID
|
|
13
27
|
// we generate the UUID client-side and delegate to `setItem`.
|
|
14
28
|
// Note: `as II` is required here because TypeScript cannot narrow the generic `II` from `instanceof StringSchema`.
|
|
@@ -24,7 +38,14 @@ export class SQLiteProvider extends SQLProvider {
|
|
|
24
38
|
sqlPath(key) {
|
|
25
39
|
return this.sqlConcat(key.slice(1).map(k => this.sqlIdentifier(k)), ".", "$.");
|
|
26
40
|
}
|
|
27
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* Get the SQLite JSON extract syntax for a key, e.g. `json_extract("a", $.b.c)`.
|
|
43
|
+
*
|
|
44
|
+
* @param key The key segments identifying the column and any nested JSON path.
|
|
45
|
+
* @returns An `SQLFragment` extracting the value.
|
|
46
|
+
* @example this.sqlExtract(["a", "b"]); // json_extract("a", $.b)
|
|
47
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/sqlExtract
|
|
48
|
+
*/
|
|
28
49
|
sqlExtract(key) {
|
|
29
50
|
const column = this.sqlIdentifier(key[0]);
|
|
30
51
|
if (key.length > 1) {
|
|
@@ -33,7 +54,15 @@ export class SQLiteProvider extends SQLProvider {
|
|
|
33
54
|
}
|
|
34
55
|
return column;
|
|
35
56
|
}
|
|
36
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Define an SQL fragment for a single update action, with SQLite JSON1 support for nested keys and `with`/`omit` array mutations.
|
|
59
|
+
*
|
|
60
|
+
* @param update The update action (`action`, `key`, `value`) to convert.
|
|
61
|
+
* @returns The composed `SQLFragment`.
|
|
62
|
+
* @throws {UnimplementedError} If the action is unsupported.
|
|
63
|
+
* @example this.sqlUpdate({ action: "set", key: ["a", "b"], value: 1 })
|
|
64
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/sqlUpdate
|
|
65
|
+
*/
|
|
37
66
|
sqlUpdate(update) {
|
|
38
67
|
const { action, key, value } = update;
|
|
39
68
|
const column = this.sqlIdentifier(key[0]);
|
|
@@ -94,7 +123,15 @@ export class SQLiteProvider extends SQLProvider {
|
|
|
94
123
|
}
|
|
95
124
|
return super.sqlUpdate(update);
|
|
96
125
|
}
|
|
97
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Define an SQL fragment for a filter clause, with SQLite JSON1 support for `contains` and deeply-nested JSON queries.
|
|
128
|
+
*
|
|
129
|
+
* @param filter The filter (`key`, `operator`, `value`) to translate.
|
|
130
|
+
* @returns The composed `SQLFragment`.
|
|
131
|
+
* @throws {UnimplementedError} If the operator is unsupported.
|
|
132
|
+
* @example this.sqlFilter({ key: ["tags"], operator: "contains", value: "x" })
|
|
133
|
+
* @see https://dhoulb.github.io/shelving/db/provider/SQLiteProvider/SQLiteProvider/sqlFilter
|
|
134
|
+
*/
|
|
98
135
|
sqlFilter(filter) {
|
|
99
136
|
const { key, operator, value } = filter;
|
|
100
137
|
// Implement `contains` filters.
|