Files
Boutique/docs/data/documentation/boutique.json
2023-08-25 22:35:47 +00:00

1 line
14 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"primaryContentSections":[{"kind":"content","content":[{"anchor":"Overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique is a simple but powerful persistence library, and so much more. With Boutiques dual-layered memory + disk caching architecture Boutique provides a way to build SwiftUI, UIKit, and AppKit apps that update in real time with full offline storage in only a few lines of code using an incredibly simple API."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique is built atop "},{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Bodega"},{"type":"text","text":", and below is a demo project that demonstrates the ideal Boutique app, along with many useful techniques you can apply to other SwiftUI apps."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Youll notice that it looks almost identical to any other SwiftUI app, an explicit goal of Boutique. Boutique stays as far away as it can from your apps logic as it can, allowing you to write the app you want to write, with full offline support and realtime state updates that propagate to all of your views in only a few lines of code. You can read more about the thinking behind Boutique and my preference towards a Model View Controller Store architecture in this "},{"type":"reference","isActive":true,"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"},{"type":"text","text":", but Boutique should work with any architecture."}]},{"anchor":"Getting-Started","level":2,"type":"heading","text":"Getting Started"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique only has one concept you need to understand. When you save data to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" your data will be persisted automatically for you and exposed as a regular Swift array. The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrappers work the same way, but instead of an array when you call "},{"type":"codeVoice","code":"$storedValue.set(value)"},{"type":"text","text":" a singular Swift value will be saved. Youll never have to think about databases, everything in your app is a regular Swift array or value using your apps models, with straightforward code that looks like any other app."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may be familiar with the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" from "},{"type":"reference","isActive":true,"identifier":"https:\/\/redux.js.org\/"},{"type":"text","text":" or "},{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture"},{"type":"text","text":", but unlike those frameworks you wont need to worry about adding Actions or Reducers. With this "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" implementation all your data is persisted for you automatically, no additional code required. This allows you to build realtime updating apps with full offline support in an incredibly simple and straightforward manner."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If youd like to explore these core concepts youll be up and running in no time."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Since Boutique is built atop Bodega, learning more about "},{"overridingTitleInlineContent":[{"type":"text","text":"Bodega"}],"isActive":true,"type":"reference","identifier":"https:\/\/github.com\/mergesort\/Bodega","overridingTitle":"Bodega"},{"type":"text","text":" may be helpful, especially to understand how a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"s "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" works."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/build.ms\/bodega\/docs"}]}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"kind":"symbol","metadata":{"roleHeading":"Framework","externalID":"Boutique","title":"Boutique","symbolKind":"module","role":"collection","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[[]]},"topicSections":[{"title":"Articles","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"],"generated":true},{"title":"Classes","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store"]},{"title":"Structures","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","doc:\/\/Boutique\/documentation\/Boutique\/Stored","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]},{"title":"Enumerations","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]}],"references":{"https://redux.js.org/":{"title":"Redux","titleInlineContent":[{"type":"text","text":"Redux"}],"type":"link","identifier":"https:\/\/redux.js.org\/","url":"https:\/\/redux.js.org\/"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"https://github.com/pointfreeco/swift-composable-architecture":{"title":"The Composable Architecture","titleInlineContent":[{"type":"text","text":"The Composable Architecture"}],"type":"link","identifier":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture","url":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture"},"doc://Boutique/documentation/Boutique/Using-Stores":{"role":"article","title":"Using Stores","abstract":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is at the heart of what makes Boutique, Boutique."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores","kind":"article","type":"topic","url":"\/documentation\/boutique\/using-stores"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"https://github.com/mergesort/Boutique/tree/main/Demo":{"title":"Boutique Demo","titleInlineContent":[{"type":"text","text":"Boutique Demo"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","url":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"},"https://build.ms/2022/06/22/model-view-controller-store":{"title":"blog post","titleInlineContent":[{"type":"text","text":"blog post"}],"type":"link","identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","url":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"},"https://github.com/mergesort/Bodega":{"title":"Bodega","titleInlineContent":[{"type":"text","text":"Bodega"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Bodega","url":"https:\/\/github.com\/mergesort\/Bodega"},"doc://Boutique/documentation/Boutique/The-@Stored-Family-Of-Property-Wrappers":{"role":"article","title":"The @Stored Family Of Property Wrappers","abstract":[{"type":"text","text":"Property Wrappers that take the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and make it magical. ✨"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","kind":"article","type":"topic","url":"\/documentation\/boutique\/the-@stored-family-of-property-wrappers"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"},"https://build.ms/bodega/docs":{"title":"Bodega Documentation","titleInlineContent":[{"type":"text","text":"Bodega Documentation"}],"type":"link","identifier":"https:\/\/build.ms\/bodega\/docs","url":"https:\/\/build.ms\/bodega\/docs"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"}}}