From 805ffd9f123f7734afcaf6e4f159035169155b92 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 03:56:58 +0000 Subject: [PATCH] deploy: 0b53d20b1b2db15185c352b8e17664fefcc64825 --- 404.html | 2 +- assets/js/0c03ec8f.466e262b.js | 1 + assets/js/0c03ec8f.4f9eebb3.js | 1 - assets/js/2cbcd466.2d186895.js | 1 + assets/js/2cbcd466.a6fd9cc2.js | 1 - ...n.0c1f0126.js => runtime~main.b349233f.js} | 2 +- badges/coverage-branches.svg | 1 - badges/coverage-functions.svg | 1 - badges/coverage-jest coverage.svg | 1 - badges/coverage-lines.svg | 1 - badges/coverage-statements.svg | 1 - blog/archive/index.html | 2 +- blog/first-blog-post/index.html | 2 +- blog/index.html | 2 +- blog/long-blog-post/index.html | 2 +- blog/mdx-blog-post/index.html | 2 +- blog/tags/docusaurus/index.html | 2 +- blog/tags/facebook/index.html | 2 +- blog/tags/hello/index.html | 2 +- blog/tags/hola/index.html | 2 +- blog/tags/index.html | 2 +- blog/welcome/index.html | 2 +- docs/category/meta/index.html | 2 +- docs/category/testkit/index.html | 2 +- docs/category/usage/index.html | 2 +- docs/documentation/index.html | 2 +- docs/documentation/installation/index.html | 48 +++++-------------- .../meta/clearingGraphs/index.html | 2 +- docs/documentation/meta/eslint/index.html | 2 +- .../documentation/meta/middlewares/index.html | 2 +- .../usage/ClassComponents/index.html | 2 +- docs/documentation/usage/Classes/index.html | 2 +- .../usage/FunctionalComponents/index.html | 2 +- docs/documentation/usage/Graphs/index.html | 2 +- docs/documentation/usage/Hooks/index.html | 2 +- .../documentation/usage/Reactivity/index.html | 2 +- .../usage/ServiceLocator/index.html | 2 +- docs/guides/avoidingPropDrilling/index.html | 2 +- .../configurableApplications/index.html | 2 +- docs/guides/mockDependencies/index.html | 2 +- docs/guides/mvvm/index.html | 2 +- docs/reference/mediatorObservable/index.html | 2 +- docs/reference/model/index.html | 2 +- docs/reference/observable/index.html | 2 +- docs/reference/obsidian/index.html | 2 +- docs/reference/testKit/mockGraphs/index.html | 2 +- docs/reference/testKit/mockModel/index.html | 2 +- docs/reference/useObserver/index.html | 2 +- docs/reference/useObservers/index.html | 2 +- docs/tags/architecture/index.html | 2 +- docs/tags/graph/index.html | 2 +- docs/tags/index.html | 2 +- docs/tags/lifecycle-bound/index.html | 2 +- docs/tags/mediator-observable/index.html | 2 +- docs/tags/mock-graphs/index.html | 2 +- docs/tags/model/index.html | 2 +- docs/tags/mvvm/index.html | 2 +- docs/tags/observable/index.html | 2 +- docs/tags/reactivity/index.html | 2 +- docs/tags/service-locator/index.html | 2 +- docs/tags/testing/index.html | 2 +- docs/tags/use-observer/index.html | 2 +- docs/tags/use-observers/index.html | 2 +- docs/tags/view-model/index.html | 2 +- index.html | 2 +- playground/index.html | 2 +- 66 files changed, 70 insertions(+), 99 deletions(-) create mode 100644 assets/js/0c03ec8f.466e262b.js delete mode 100644 assets/js/0c03ec8f.4f9eebb3.js create mode 100644 assets/js/2cbcd466.2d186895.js delete mode 100644 assets/js/2cbcd466.a6fd9cc2.js rename assets/js/{runtime~main.0c1f0126.js => runtime~main.b349233f.js} (98%) delete mode 100644 badges/coverage-branches.svg delete mode 100644 badges/coverage-functions.svg delete mode 100644 badges/coverage-jest coverage.svg delete mode 100644 badges/coverage-lines.svg delete mode 100644 badges/coverage-statements.svg diff --git a/404.html b/404.html index 3699ec93..52bc0943 100644 --- a/404.html +++ b/404.html @@ -5,7 +5,7 @@ Page Not Found | Obsidian - + diff --git a/assets/js/0c03ec8f.466e262b.js b/assets/js/0c03ec8f.466e262b.js new file mode 100644 index 00000000..1c02e5eb --- /dev/null +++ b/assets/js/0c03ec8f.466e262b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[6437],{356:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs2":[{"type":"link","label":"Introduction","href":"/obsidian/docs/documentation/","docId":"documentation/documentation","unlisted":false},{"type":"link","label":"Installation","href":"/obsidian/docs/documentation/installation","docId":"documentation/installation","unlisted":false},{"type":"category","label":"Usage","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Graphs","href":"/obsidian/docs/documentation/usage/Graphs","docId":"documentation/usage/Graphs","unlisted":false},{"type":"link","label":"Hooks","href":"/obsidian/docs/documentation/usage/Hooks","docId":"documentation/usage/Hooks","unlisted":false},{"type":"link","label":"Functional components","href":"/obsidian/docs/documentation/usage/FunctionalComponents","docId":"documentation/usage/FunctionalComponents","unlisted":false},{"type":"link","label":"Class components","href":"/obsidian/docs/documentation/usage/ClassComponents","docId":"documentation/usage/ClassComponents","unlisted":false},{"type":"link","label":"Classes","href":"/obsidian/docs/documentation/usage/Classes","docId":"documentation/usage/Classes","unlisted":false},{"type":"link","label":"Reactivity","href":"/obsidian/docs/documentation/usage/Reactivity","docId":"documentation/usage/Reactivity","unlisted":false},{"type":"link","label":"Service locator","href":"/obsidian/docs/documentation/usage/ServiceLocator","docId":"documentation/usage/ServiceLocator","unlisted":false}],"href":"/obsidian/docs/category/usage"},{"type":"category","label":"Meta","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"ESLint plugin","href":"/obsidian/docs/documentation/meta/eslint","docId":"documentation/meta/eslint","unlisted":false},{"type":"link","label":"Clearing graphs","href":"/obsidian/docs/documentation/meta/clearingGraphs","docId":"documentation/meta/clearingGraphs","unlisted":false},{"type":"link","label":"Graph middlewares","href":"/obsidian/docs/documentation/meta/middlewares","docId":"documentation/meta/middlewares","unlisted":false}],"href":"/obsidian/docs/category/meta"}],"reference":[{"type":"link","label":"Obsidian","href":"/obsidian/docs/reference/obsidian","docId":"reference/obsidian","unlisted":false},{"type":"link","label":"Observable","href":"/obsidian/docs/reference/observable","docId":"reference/observable","unlisted":false},{"type":"link","label":"MediatorObservable","href":"/obsidian/docs/reference/mediatorObservable","docId":"reference/mediatorObservable","unlisted":false},{"type":"link","label":"useObserver","href":"/obsidian/docs/reference/useObserver","docId":"reference/useObserver","unlisted":false},{"type":"link","label":"Model","href":"/obsidian/docs/reference/model","docId":"reference/model","unlisted":false},{"type":"link","label":"useObservers","href":"/obsidian/docs/reference/useObservers","docId":"reference/useObservers","unlisted":false},{"type":"category","label":"TestKit","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"mockGraphs","href":"/obsidian/docs/reference/testKit/mockGraphs","docId":"reference/testKit/mockGraphs","unlisted":false},{"type":"link","label":"mockModel","href":"/obsidian/docs/reference/testKit/mockModel","docId":"reference/testKit/mockModel","unlisted":false}],"href":"/obsidian/docs/category/testkit"}],"guides":[{"type":"link","label":"MVVM architecture with Obsidian","href":"/obsidian/docs/guides/mvvm","docId":"guides/mvvm","unlisted":false},{"type":"link","label":" Avoiding prop drilling","href":"/obsidian/docs/guides/avoidingPropDrilling","docId":"guides/avoidingPropDrilling","unlisted":false},{"type":"link","label":"Configurable applications","href":"/obsidian/docs/guides/configurableApplications","docId":"guides/configurableApplications","unlisted":false},{"type":"link","label":"Mocking dependencies in unit tests","href":"/obsidian/docs/guides/mockDependencies","docId":"guides/mockDependencies","unlisted":false}]},"docs":{"documentation/documentation":{"id":"documentation/documentation","title":"Introduction","description":"Obsidian is a dependency injection container with first-class support for React and React Native applications.","sidebar":"docs2"},"documentation/installation":{"id":"documentation/installation","title":"Installation","description":"Installing Obsidian is a straightforward process that involves adding the package to your project, enabling TypeScript decorators, and adding Obsidian\'s transformer to your build system, either Babel or SWC. Let\'s go through the steps.","sidebar":"docs2"},"documentation/meta/clearingGraphs":{"id":"documentation/meta/clearingGraphs","title":"Clearing graphs","description":"Graphs can be cleared by invoking the Obsidian.clearGraphs() function. This is useful in tests or when you need to reset the system to it\'s original state, for example after a user logs out.","sidebar":"docs2"},"documentation/meta/eslint":{"id":"documentation/meta/eslint","title":"ESLint plugin","description":"The eslint-plugin-obsidian package provides ESLint rules for Obsidian. These rules help you catch common mistakes and enforce best practices when using Obsidian.","sidebar":"docs2"},"documentation/meta/middlewares":{"id":"documentation/meta/middlewares","title":"Graph middlewares","description":"Graph middlewares let you plug into the graph creation process and modify the graph in any way you want. This is useful when working on large scale applications where \\"observability\\" is a key concern. For example, you can use a middleware to swizzle providers, add logging, or even add a new provider to the graph.","sidebar":"docs2"},"documentation/usage/ClassComponents":{"id":"documentation/usage/ClassComponents","title":"Class components","description":"Injecting class components","sidebar":"docs2"},"documentation/usage/Classes":{"id":"documentation/usage/Classes","title":"Classes","description":"Injecting classes","sidebar":"docs2"},"documentation/usage/FunctionalComponents":{"id":"documentation/usage/FunctionalComponents","title":"Functional components","description":"Injecting functional components","sidebar":"docs2"},"documentation/usage/Graphs":{"id":"documentation/usage/Graphs","title":"Graphs","description":"Introduction","sidebar":"docs2"},"documentation/usage/Hooks":{"id":"documentation/usage/Hooks","title":"Hooks","description":"Injecting hooks","sidebar":"docs2"},"documentation/usage/Reactivity":{"id":"documentation/usage/Reactivity","title":"Reactivity","description":"Obsidian is first and foremost a dependency injection library. But it also includes reactive programming features that allow you to observe changes in your data and react to them. This is useful for things like updating the UI when a value changes.","sidebar":"docs2"},"documentation/usage/ServiceLocator":{"id":"documentation/usage/ServiceLocator","title":"Service locator","description":"Obtaining dependencies imperatively","sidebar":"docs2"},"guides/avoidingPropDrilling":{"id":"guides/avoidingPropDrilling","title":" Avoiding prop drilling","description":"Prop Drilling is a common issue in React development where props are passed down multiple levels of the component hierarchy, making the code difficult to maintain and understand. This guide will show you how to use @LifecycleBound graphs to avoid Prop Drilling.","sidebar":"guides"},"guides/configurableApplications":{"id":"guides/configurableApplications","title":"Configurable applications","description":"Designing applications to be flexible and configurable makes them more tolerable to changing requirements. The ability to change code frequently and quickly is one of the most important KPIs of any development team. This is generally made possible by a design that facilitates small pull requests, that modify a minimal amount of code across a minimal number of files.","sidebar":"guides"},"guides/mockDependencies":{"id":"guides/mockDependencies","title":"Mocking dependencies in unit tests","description":"Tests are an integral part of any software project. They let you verify that your code works as expected and that it doesn\'t break when you make changes. We want our tests to be as clear as possible so that developers don\'t have to waste time figuring out what the test is doing our how to fix it when it fails.","sidebar":"guides"},"guides/mvvm":{"id":"guides/mvvm","title":"MVVM architecture with Obsidian","description":"MVVM (Model-View-ViewModel) is a software architecture widely used in modern front-end development. It emphasizes separation of concerns and improves code structure. In the Model-View-ViewModel pattern, code is organized into three layers:","sidebar":"guides"},"reference/mediatorObservable":{"id":"reference/mediatorObservable","title":"MediatorObservable","description":"MediatorObservable is a type of Observable that acts as an adapter between one or more source Observables. It allows us to create a new observable stream based on the values of other observables.","sidebar":"reference"},"reference/model":{"id":"reference/model","title":"Model","description":"Model is an abstract utility class that provides an easy way to observe specific properties of an object.","sidebar":"reference"},"reference/observable":{"id":"reference/observable","title":"Observable","description":"Observable is a class that represents a stream of values. It is similar to Promise in that it is a container for a value that will be available in the future. However, unlike Promise, Observable can emit multiple values over time.","sidebar":"reference"},"reference/obsidian":{"id":"reference/obsidian","title":"Obsidian","description":"Obsidian exposes a set of functions that allow you to interact with the Obsidian framework imperatively.","sidebar":"reference"},"reference/testKit/mockGraphs":{"id":"reference/testKit/mockGraphs","title":"mockGraphs","description":"mockGraphs is a function that is used in tests to replace the implementation of graphs with a mock implementation.","sidebar":"reference"},"reference/testKit/mockModel":{"id":"reference/testKit/mockModel","title":"mockModel","description":"mockModel is a utility function that allows you to easily mock models.","sidebar":"reference"},"reference/useObserver":{"id":"reference/useObserver","title":"useObserver","description":"useObserver is a Hook that allows you to react to changes in an observable.","sidebar":"reference"},"reference/useObservers":{"id":"reference/useObservers","title":"useObservers","description":"useObservers is a Hook that allows you to react to changes in multiple observables in a single statement.","sidebar":"reference"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/0c03ec8f.4f9eebb3.js b/assets/js/0c03ec8f.4f9eebb3.js deleted file mode 100644 index 2d5dccf0..00000000 --- a/assets/js/0c03ec8f.4f9eebb3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[6437],{356:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs2":[{"type":"link","label":"Introduction","href":"/obsidian/docs/documentation/","docId":"documentation/documentation","unlisted":false},{"type":"link","label":"Installation","href":"/obsidian/docs/documentation/installation","docId":"documentation/installation","unlisted":false},{"type":"category","label":"Usage","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Graphs","href":"/obsidian/docs/documentation/usage/Graphs","docId":"documentation/usage/Graphs","unlisted":false},{"type":"link","label":"Hooks","href":"/obsidian/docs/documentation/usage/Hooks","docId":"documentation/usage/Hooks","unlisted":false},{"type":"link","label":"Functional components","href":"/obsidian/docs/documentation/usage/FunctionalComponents","docId":"documentation/usage/FunctionalComponents","unlisted":false},{"type":"link","label":"Class components","href":"/obsidian/docs/documentation/usage/ClassComponents","docId":"documentation/usage/ClassComponents","unlisted":false},{"type":"link","label":"Classes","href":"/obsidian/docs/documentation/usage/Classes","docId":"documentation/usage/Classes","unlisted":false},{"type":"link","label":"Reactivity","href":"/obsidian/docs/documentation/usage/Reactivity","docId":"documentation/usage/Reactivity","unlisted":false},{"type":"link","label":"Service locator","href":"/obsidian/docs/documentation/usage/ServiceLocator","docId":"documentation/usage/ServiceLocator","unlisted":false}],"href":"/obsidian/docs/category/usage"},{"type":"category","label":"Meta","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"ESLint plugin","href":"/obsidian/docs/documentation/meta/eslint","docId":"documentation/meta/eslint","unlisted":false},{"type":"link","label":"Clearing graphs","href":"/obsidian/docs/documentation/meta/clearingGraphs","docId":"documentation/meta/clearingGraphs","unlisted":false},{"type":"link","label":"Graph middlewares","href":"/obsidian/docs/documentation/meta/middlewares","docId":"documentation/meta/middlewares","unlisted":false}],"href":"/obsidian/docs/category/meta"}],"reference":[{"type":"link","label":"Obsidian","href":"/obsidian/docs/reference/obsidian","docId":"reference/obsidian","unlisted":false},{"type":"link","label":"Observable","href":"/obsidian/docs/reference/observable","docId":"reference/observable","unlisted":false},{"type":"link","label":"MediatorObservable","href":"/obsidian/docs/reference/mediatorObservable","docId":"reference/mediatorObservable","unlisted":false},{"type":"link","label":"useObserver","href":"/obsidian/docs/reference/useObserver","docId":"reference/useObserver","unlisted":false},{"type":"link","label":"Model","href":"/obsidian/docs/reference/model","docId":"reference/model","unlisted":false},{"type":"link","label":"useObservers","href":"/obsidian/docs/reference/useObservers","docId":"reference/useObservers","unlisted":false},{"type":"category","label":"TestKit","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"mockGraphs","href":"/obsidian/docs/reference/testKit/mockGraphs","docId":"reference/testKit/mockGraphs","unlisted":false},{"type":"link","label":"mockModel","href":"/obsidian/docs/reference/testKit/mockModel","docId":"reference/testKit/mockModel","unlisted":false}],"href":"/obsidian/docs/category/testkit"}],"guides":[{"type":"link","label":"MVVM architecture with Obsidian","href":"/obsidian/docs/guides/mvvm","docId":"guides/mvvm","unlisted":false},{"type":"link","label":" Avoiding prop drilling","href":"/obsidian/docs/guides/avoidingPropDrilling","docId":"guides/avoidingPropDrilling","unlisted":false},{"type":"link","label":"Configurable applications","href":"/obsidian/docs/guides/configurableApplications","docId":"guides/configurableApplications","unlisted":false},{"type":"link","label":"Mocking dependencies in unit tests","href":"/obsidian/docs/guides/mockDependencies","docId":"guides/mockDependencies","unlisted":false}]},"docs":{"documentation/documentation":{"id":"documentation/documentation","title":"Introduction","description":"Obsidian is a dependency injection container with first-class support for React and React Native applications.","sidebar":"docs2"},"documentation/installation":{"id":"documentation/installation","title":"Installation","description":"Like most Dependency Injection frameworks, Obsidian uses automatic code generation to create the bindings necessary for resolving dependencies. This approach helps reduce the amount of boilerplate code required by developers. Obsidian relies on Babel for code generation, so you\'ll need to have Babel configured in your project.","sidebar":"docs2"},"documentation/meta/clearingGraphs":{"id":"documentation/meta/clearingGraphs","title":"Clearing graphs","description":"Graphs can be cleared by invoking the Obsidian.clearGraphs() function. This is useful in tests or when you need to reset the system to it\'s original state, for example after a user logs out.","sidebar":"docs2"},"documentation/meta/eslint":{"id":"documentation/meta/eslint","title":"ESLint plugin","description":"The eslint-plugin-obsidian package provides ESLint rules for Obsidian. These rules help you catch common mistakes and enforce best practices when using Obsidian.","sidebar":"docs2"},"documentation/meta/middlewares":{"id":"documentation/meta/middlewares","title":"Graph middlewares","description":"Graph middlewares let you plug into the graph creation process and modify the graph in any way you want. This is useful when working on large scale applications where \\"observability\\" is a key concern. For example, you can use a middleware to swizzle providers, add logging, or even add a new provider to the graph.","sidebar":"docs2"},"documentation/usage/ClassComponents":{"id":"documentation/usage/ClassComponents","title":"Class components","description":"Injecting class components","sidebar":"docs2"},"documentation/usage/Classes":{"id":"documentation/usage/Classes","title":"Classes","description":"Injecting classes","sidebar":"docs2"},"documentation/usage/FunctionalComponents":{"id":"documentation/usage/FunctionalComponents","title":"Functional components","description":"Injecting functional components","sidebar":"docs2"},"documentation/usage/Graphs":{"id":"documentation/usage/Graphs","title":"Graphs","description":"Introduction","sidebar":"docs2"},"documentation/usage/Hooks":{"id":"documentation/usage/Hooks","title":"Hooks","description":"Injecting hooks","sidebar":"docs2"},"documentation/usage/Reactivity":{"id":"documentation/usage/Reactivity","title":"Reactivity","description":"Obsidian is first and foremost a dependency injection library. But it also includes reactive programming features that allow you to observe changes in your data and react to them. This is useful for things like updating the UI when a value changes.","sidebar":"docs2"},"documentation/usage/ServiceLocator":{"id":"documentation/usage/ServiceLocator","title":"Service locator","description":"Obtaining dependencies imperatively","sidebar":"docs2"},"guides/avoidingPropDrilling":{"id":"guides/avoidingPropDrilling","title":" Avoiding prop drilling","description":"Prop Drilling is a common issue in React development where props are passed down multiple levels of the component hierarchy, making the code difficult to maintain and understand. This guide will show you how to use @LifecycleBound graphs to avoid Prop Drilling.","sidebar":"guides"},"guides/configurableApplications":{"id":"guides/configurableApplications","title":"Configurable applications","description":"Designing applications to be flexible and configurable makes them more tolerable to changing requirements. The ability to change code frequently and quickly is one of the most important KPIs of any development team. This is generally made possible by a design that facilitates small pull requests, that modify a minimal amount of code across a minimal number of files.","sidebar":"guides"},"guides/mockDependencies":{"id":"guides/mockDependencies","title":"Mocking dependencies in unit tests","description":"Tests are an integral part of any software project. They let you verify that your code works as expected and that it doesn\'t break when you make changes. We want our tests to be as clear as possible so that developers don\'t have to waste time figuring out what the test is doing our how to fix it when it fails.","sidebar":"guides"},"guides/mvvm":{"id":"guides/mvvm","title":"MVVM architecture with Obsidian","description":"MVVM (Model-View-ViewModel) is a software architecture widely used in modern front-end development. It emphasizes separation of concerns and improves code structure. In the Model-View-ViewModel pattern, code is organized into three layers:","sidebar":"guides"},"reference/mediatorObservable":{"id":"reference/mediatorObservable","title":"MediatorObservable","description":"MediatorObservable is a type of Observable that acts as an adapter between one or more source Observables. It allows us to create a new observable stream based on the values of other observables.","sidebar":"reference"},"reference/model":{"id":"reference/model","title":"Model","description":"Model is an abstract utility class that provides an easy way to observe specific properties of an object.","sidebar":"reference"},"reference/observable":{"id":"reference/observable","title":"Observable","description":"Observable is a class that represents a stream of values. It is similar to Promise in that it is a container for a value that will be available in the future. However, unlike Promise, Observable can emit multiple values over time.","sidebar":"reference"},"reference/obsidian":{"id":"reference/obsidian","title":"Obsidian","description":"Obsidian exposes a set of functions that allow you to interact with the Obsidian framework imperatively.","sidebar":"reference"},"reference/testKit/mockGraphs":{"id":"reference/testKit/mockGraphs","title":"mockGraphs","description":"mockGraphs is a function that is used in tests to replace the implementation of graphs with a mock implementation.","sidebar":"reference"},"reference/testKit/mockModel":{"id":"reference/testKit/mockModel","title":"mockModel","description":"mockModel is a utility function that allows you to easily mock models.","sidebar":"reference"},"reference/useObserver":{"id":"reference/useObserver","title":"useObserver","description":"useObserver is a Hook that allows you to react to changes in an observable.","sidebar":"reference"},"reference/useObservers":{"id":"reference/useObservers","title":"useObservers","description":"useObservers is a Hook that allows you to react to changes in multiple observables in a single statement.","sidebar":"reference"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/2cbcd466.2d186895.js b/assets/js/2cbcd466.2d186895.js new file mode 100644 index 00000000..675dd816 --- /dev/null +++ b/assets/js/2cbcd466.2d186895.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[2835],{6765:(e,n,a)=>{a.d(n,{A:()=>s});a(4041);var t=a(3640);const r={tabItem:"tabItem_OMyP"};var l=a(1085);function s(e){let{children:n,hidden:a,className:s}=e;return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,s),hidden:a,children:n})}},6610:(e,n,a)=>{a.d(n,{A:()=>w});var t=a(4041),r=a(3640),l=a(3030),s=a(6090),i=a(931),o=a(4939),d=a(7192),c=a(4658);function u(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:a}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return u(e).map((e=>{let{props:{value:n,label:a,attributes:t,default:r}}=e;return{value:n,label:a,attributes:t,default:r}}))}(a);return function(e){const n=(0,d.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,a])}function h(e){let{value:n,tabValues:a}=e;return a.some((e=>e.value===n))}function b(e){let{queryString:n=!1,groupId:a}=e;const r=(0,s.W6)(),l=function(e){let{queryString:n=!1,groupId:a}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:n,groupId:a});return[(0,o.aZ)(l),(0,t.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function m(e){const{defaultValue:n,queryString:a=!1,groupId:r}=e,l=p(e),[s,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!h({value:n,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=a.find((e=>e.default))??a[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:l}))),[d,u]=b({queryString:a,groupId:r}),[m,f]=function(e){let{groupId:n}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,c.Dv)(a);return[r,(0,t.useCallback)((e=>{a&&l.set(e)}),[a,l])]}({groupId:r}),g=(()=>{const e=d??m;return h({value:e,tabValues:l})?e:null})();(0,i.A)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,t.useCallback)((e=>{if(!h({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),f(e)}),[u,f,l]),tabValues:l}}var f=a(8529);const g={tabList:"tabList_M0Dn",tabItem:"tabItem_ysIP"};var x=a(1085);function j(e){let{className:n,block:a,selectedValue:t,selectValue:s,tabValues:i}=e;const o=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.a_)(),c=e=>{const n=e.currentTarget,a=o.indexOf(n),r=i[a].value;r!==t&&(d(n),s(r))},u=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=o.indexOf(e.currentTarget)+1;n=o[a]??o[0];break}case"ArrowLeft":{const a=o.indexOf(e.currentTarget)-1;n=o[a]??o[o.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},n),children:i.map((e=>{let{value:n,label:a,attributes:l}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:u,onClick:c,...l,className:(0,r.A)("tabs__item",g.tabItem,l?.className,{"tabs__item--active":t===n}),children:a??n},n)}))})}function v(e){let{lazy:n,children:a,selectedValue:r}=e;const l=(Array.isArray(a)?a:[a]).filter(Boolean);if(n){const e=l.find((e=>e.props.value===r));return e?(0,t.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:l.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function y(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,x.jsx)(y,{...e,children:u(e.children)},String(n))}},5185:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>u});var t=a(1085),r=a(1184),l=a(6610),s=a(6765);const i={sidebar_position:2},o="Installation",d={id:"documentation/installation",title:"Installation",description:"Installing Obsidian is a straightforward process that involves adding the package to your project, enabling TypeScript decorators, and adding Obsidian's transformer to your build system, either Babel or SWC. Let's go through the steps.",source:"@site/docs/documentation/installation.mdx",sourceDirName:"documentation",slug:"/documentation/installation",permalink:"/obsidian/docs/documentation/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/documentation/installation.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"docs2",previous:{title:"Introduction",permalink:"/obsidian/docs/documentation/"},next:{title:"Usage",permalink:"/obsidian/docs/category/usage"}},c={},u=[{value:"1. Install Obsidian",id:"1-install-obsidian",level:2},{value:"2. Install Reflect-metadata",id:"2-install-reflect-metadata",level:2},{value:"3. Enable experimental decorators",id:"3-enable-experimental-decorators",level:2},{value:"4. Add Obsidian's transformer",id:"4-add-obsidians-transformer",level:2},{value:"Install the required Babel plugins",id:"install-the-required-babel-plugins",level:3},{value:"Update your Babel configuration",id:"update-your-babel-configuration",level:3},{value:"Install the required dependencies",id:"install-the-required-dependencies",level:3},{value:"Update your Vite configuration",id:"update-your-vite-configuration",level:3},{value:"5. Optional - Add Obsidian's ESLint plugin",id:"5-optional---add-obsidians-eslint-plugin",level:2}];function p(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"Installing Obsidian is a straightforward process that involves adding the package to your project, enabling TypeScript decorators, and adding Obsidian's transformer to your build system, either Babel or SWC. Let's go through the steps."}),"\n",(0,t.jsx)(n.h2,{id:"1-install-obsidian",children:"1. Install Obsidian"}),"\n",(0,t.jsx)(n.p,{children:"Install the package using your preferred package manager:"}),"\n",(0,t.jsxs)(l.A,{children:[(0,t.jsx)(s.A,{value:"yarn",label:"Yarn",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"yarn add react-obsidian\n"})})}),(0,t.jsx)(s.A,{value:"npm",label:"NPM",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"npm install react-obsidian\n"})})})]}),"\n",(0,t.jsx)(n.h2,{id:"2-install-reflect-metadata",children:"2. Install Reflect-metadata"}),"\n",(0,t.jsxs)(n.p,{children:["First, install the ",(0,t.jsx)(n.code,{children:"reflect-metadata"})," package:"]}),"\n",(0,t.jsxs)(l.A,{children:[(0,t.jsx)(s.A,{value:"yarn",label:"Yarn",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"yarn add reflect-metadata\n"})})}),(0,t.jsx)(s.A,{value:"npm",label:"NPM",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"npm install reflect-metadata\n"})})})]}),"\n",(0,t.jsxs)(n.p,{children:["Then, enable the ",(0,t.jsx)(n.code,{children:"reflect-metadata"})," polyfill by adding the following line to the top of your application's entry point (usually index.js or index.ts):"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",children:"import 'reflect-metadata';\n"})}),"\n",(0,t.jsx)(n.h2,{id:"3-enable-experimental-decorators",children:"3. Enable experimental decorators"}),"\n",(0,t.jsx)(n.p,{children:"Obsidian uses the Decorators feature whose proposal is at stage 3."}),"\n",(0,t.jsx)(n.p,{children:"Add the following options to your tsconfig.json file."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",children:'{\n "compilerOptions": {\n "experimentalDecorators": true,\n "emitDecoratorMetadata": true\n }\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"4-add-obsidians-transformer",children:"4. Add Obsidian's transformer"}),"\n",(0,t.jsx)(n.p,{children:"Like most Dependency Injection frameworks, Obsidian uses automatic code generation to create the bindings necessary for resolving dependencies. This approach helps reduce the amount of boilerplate code required by developers."}),"\n",(0,t.jsxs)(l.A,{children:[(0,t.jsxs)(s.A,{value:"babel",label:"Babel (React Native or Vite + Babel)",default:!0,children:[(0,t.jsx)(n.h3,{id:"install-the-required-babel-plugins",children:"Install the required Babel plugins"}),(0,t.jsx)(n.p,{children:"You will need to install these plugins if you don't have them already:"}),(0,t.jsxs)(l.A,{children:[(0,t.jsx)(s.A,{value:"yarn",label:"Yarn",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"yarn add @babel/plugin-proposal-decorators @babel/plugin-transform-class-properties babel-plugin-parameter-decorator @babel/core @babel/preset-env @babel/preset-typescript\n"})})}),(0,t.jsx)(s.A,{value:"npm",label:"NPM",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"npm install @babel/plugin-proposal-decorators @babel/plugin-transform-class-properties babel-plugin-parameter-decorator @babel/core @babel/preset-env\n"})})})]}),(0,t.jsx)(n.p,{children:"If this is your first time using Babel, you will also need to install Babel's core packages:"}),(0,t.jsxs)(l.A,{children:[(0,t.jsx)(s.A,{value:"yarn",label:"Yarn",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"yarn add @babel/core @babel/preset-env @babel/preset-typescript\n"})})}),(0,t.jsx)(s.A,{value:"npm",label:"NPM",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"npm install @babel/core @babel/preset-env @babel/preset-typescript\n"})})})]}),(0,t.jsx)(n.h3,{id:"update-your-babel-configuration",children:"Update your Babel configuration"}),(0,t.jsxs)(n.p,{children:["Add the transformer and the required plugins to the list of plugins in your ",(0,t.jsx)(n.code,{children:"babel.config.js"})," file or ",(0,t.jsx)(n.code,{children:".babelrc"})," file:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-diff",children:"module.exports = {\n presets: [\n 'module:metro-react-native-babel-preset',\n+ ['@babel/preset-typescript', {'onlyRemoveTypeImports': true}]\n ],\n plugins: [\n+ react-obsidian/dist/transformers/babel-plugin-obsidian,\n+ ['@babel/plugin-proposal-decorators', {legacy: true}],\n+ '@babel/plugin-transform-class-properties',\n+ 'babel-plugin-parameter-decorator'\n ]\n};\n"})})]}),(0,t.jsxs)(s.A,{value:"swc",label:"SWC (Vite + SWC)",children:[(0,t.jsx)(n.h3,{id:"install-the-required-dependencies",children:"Install the required dependencies"}),(0,t.jsxs)(l.A,{children:[(0,t.jsx)(s.A,{value:"yarn",label:"Yarn",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"yarn add -D unplugin-swc @swc/core\n"})})}),(0,t.jsx)(s.A,{value:"npm",label:"NPM",default:!0,children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"npm install -D unplugin-swc @swc/core\n"})})})]}),(0,t.jsx)(n.h3,{id:"update-your-vite-configuration",children:"Update your Vite configuration"}),(0,t.jsxs)(n.p,{children:["Add the transformer to the list of plugins in your ",(0,t.jsx)(n.code,{children:"vite.config.js"})," file:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",metastring:'title="vite.config.js"',children:"import { defineConfig } from 'vite';\nimport swc from 'unplugin-swc';\nimport obsidian from 'swc-plugin-obsidian';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n plugins: [\n swc.vite({\n jsc: {\n parser: {\n syntax: \"typescript\",\n decorators: true,\n },\n experimental: {\n runPluginFirst: true,\n plugins: [obsidian()],\n },\n },\n }),\n ],\n});\n"})})]})]}),"\n",(0,t.jsx)(n.h2,{id:"5-optional---add-obsidians-eslint-plugin",children:"5. Optional - Add Obsidian's ESLint plugin"}),"\n",(0,t.jsxs)(n.p,{children:["Obsidian provides an ESLint plugin that can help you find errors in your code related to dependency injection. See the ",(0,t.jsx)(n.a,{href:"/docs/documentation/meta/eslint",children:"ESLint plugin"})," documentation for more information."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},1184:(e,n,a)=>{a.d(n,{R:()=>s,x:()=>i});var t=a(4041);const r={},l=t.createContext(r);function s(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2cbcd466.a6fd9cc2.js b/assets/js/2cbcd466.a6fd9cc2.js deleted file mode 100644 index 7db57a83..00000000 --- a/assets/js/2cbcd466.a6fd9cc2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[2835],{6765:(e,t,n)=>{n.d(t,{A:()=>s});n(4041);var a=n(3640);const r={tabItem:"tabItem_OMyP"};var i=n(1085);function s(e){let{children:t,hidden:n,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,s),hidden:n,children:t})}},6610:(e,t,n)=>{n.d(t,{A:()=>w});var a=n(4041),r=n(3640),i=n(3030),s=n(6090),l=n(931),o=n(4939),d=n(7192),c=n(4658);function u(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}(n);return function(e){const t=(0,d.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function h(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function b(e){let{queryString:t=!1,groupId:n}=e;const r=(0,s.W6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(i),(0,a.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=p(e),[s,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:i}))),[d,u]=b({queryString:n,groupId:r}),[f,m]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,c.Dv)(n);return[r,(0,a.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),g=(()=>{const e=d??f;return h({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!h({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),m(e)}),[u,m,i]),tabValues:i}}var m=n(8529);const g={tabList:"tabList_M0Dn",tabItem:"tabItem_ysIP"};var v=n(1085);function j(e){let{className:t,block:n,selectedValue:a,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:d}=(0,i.a_)(),c=e=>{const t=e.currentTarget,n=o.indexOf(t),r=l[n].value;r!==a&&(d(t),s(r))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:i}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:e=>o.push(e),onKeyDown:u,onClick:c,...i,className:(0,r.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":a===t}),children:n??t},t)}))})}function x(e){let{lazy:t,children:n,selectedValue:r}=e;const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:i.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=f(e);return(0,v.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,v.jsx)(j,{...t,...e}),(0,v.jsx)(x,{...t,...e})]})}function w(e){const t=(0,m.A)();return(0,v.jsx)(y,{...e,children:u(e.children)},String(t))}},5185:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var a=n(1085),r=n(1184),i=n(6610),s=n(6765);const l={sidebar_position:2},o="Installation",d={id:"documentation/installation",title:"Installation",description:"Like most Dependency Injection frameworks, Obsidian uses automatic code generation to create the bindings necessary for resolving dependencies. This approach helps reduce the amount of boilerplate code required by developers. Obsidian relies on Babel for code generation, so you'll need to have Babel configured in your project.",source:"@site/docs/documentation/installation.mdx",sourceDirName:"documentation",slug:"/documentation/installation",permalink:"/obsidian/docs/documentation/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/documentation/installation.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"docs2",previous:{title:"Introduction",permalink:"/obsidian/docs/documentation/"},next:{title:"Usage",permalink:"/obsidian/docs/category/usage"}},c={},u=[{value:"1. Install Obsidian",id:"1-install-obsidian",level:2},{value:"2. Install Reflect-metadata",id:"2-install-reflect-metadata",level:2},{value:"3. Enable experimental decorators",id:"3-enable-experimental-decorators",level:2},{value:"4. Add the required Babel plugins",id:"4-add-the-required-babel-plugins",level:2},{value:"4.1. Install the required Babel plugins",id:"41-install-the-required-babel-plugins",level:3},{value:"4.2. Update your Babel configuration",id:"42-update-your-babel-configuration",level:3},{value:"5. Optional - Add Obsidian's ESLint plugin",id:"5-optional---add-obsidians-eslint-plugin",level:2},{value:"Integration with third-party front-end environments",id:"integration-with-third-party-front-end-environments",level:2},{value:"Vite",id:"vite",level:3},{value:"Create React App",id:"create-react-app",level:3},{value:"Install the required packages and modify the default scripts",id:"install-the-required-packages-and-modify-the-default-scripts",level:4},{value:"Configure Babel",id:"configure-babel",level:4}];function p(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,a.jsx)(t.p,{children:"Like most Dependency Injection frameworks, Obsidian uses automatic code generation to create the bindings necessary for resolving dependencies. This approach helps reduce the amount of boilerplate code required by developers. Obsidian relies on Babel for code generation, so you'll need to have Babel configured in your project."}),"\n",(0,a.jsx)(t.admonition,{type:"important",children:(0,a.jsxs)(t.p,{children:["If your project uses either ",(0,a.jsx)(t.strong,{children:"Vite"})," or ",(0,a.jsx)(t.strong,{children:"Create React App"}),", please refer to the ",(0,a.jsx)(t.a,{href:"#integration-with-third-party-front-end-environments",children:"Integration with third-party front-end environments"})," section before following the steps below."]})}),"\n",(0,a.jsx)(t.h2,{id:"1-install-obsidian",children:"1. Install Obsidian"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"npm install react-obsidian\n"})}),"\n",(0,a.jsx)(t.h2,{id:"2-install-reflect-metadata",children:"2. Install Reflect-metadata"}),"\n",(0,a.jsx)(t.p,{children:"First, install and enable the reflect-metadata polyfill."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"npm install reflect-metadata\n"})}),"\n",(0,a.jsx)(t.p,{children:"Then, add the following line to the top of your application's entry point (usually index.js or index.ts):"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-js",children:"import 'reflect-metadata';\n"})}),"\n",(0,a.jsx)(t.h2,{id:"3-enable-experimental-decorators",children:"3. Enable experimental decorators"}),"\n",(0,a.jsx)(t.p,{children:"Obsidian uses the Decorators feature whose proposal is at stage 3."}),"\n",(0,a.jsx)(t.p,{children:"Add the following options to your tsconfig.json file."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-js",children:'{\n "compilerOptions": {\n "experimentalDecorators": true,\n "emitDecoratorMetadata": true\n }\n}\n'})}),"\n",(0,a.jsx)(t.h2,{id:"4-add-the-required-babel-plugins",children:"4. Add the required Babel plugins"}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.a,{href:"https://babeljs.io/",children:"BabelJS"})," is a JavaScript compiler that is used to transpile modern JavaScript code into code that is compatible with older browsers. Obsidian uses a Babel transformer to generate code that is used to resolve dependencies."]}),"\n",(0,a.jsx)(t.h3,{id:"41-install-the-required-babel-plugins",children:"4.1. Install the required Babel plugins"}),"\n",(0,a.jsx)(t.p,{children:"You will need to install these plugins if you don't have them already:"}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(s.A,{value:"yarn",label:"Yarn",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"yarn add @babel/plugin-proposal-decorators @babel/plugin-transform-class-properties babel-plugin-parameter-decorator @babel/core @babel/preset-env @babel/preset-typescript\n"})})}),(0,a.jsx)(s.A,{value:"npm",label:"NPM",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"npm install @babel/plugin-proposal-decorators @babel/plugin-transform-class-properties babel-plugin-parameter-decorator @babel/core @babel/preset-env\n"})})})]}),"\n",(0,a.jsx)(t.p,{children:"If this is your first time using Babel, you will also need to install Babel's core packages:"}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(s.A,{value:"yarn",label:"Yarn",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"yarn add @babel/core @babel/preset-env @babel/preset-typescript\n"})})}),(0,a.jsx)(s.A,{value:"npm",label:"NPM",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-shell",children:"npm install @babel/core @babel/preset-env @babel/preset-typescript\n"})})})]}),"\n",(0,a.jsx)(t.h3,{id:"42-update-your-babel-configuration",children:"4.2. Update your Babel configuration"}),"\n",(0,a.jsxs)(t.p,{children:["Add the transformer and the required plugins to the list of plugins in your ",(0,a.jsx)(t.code,{children:"babel.config.js"})," file or ",(0,a.jsx)(t.code,{children:".babelrc"})," file:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-diff",children:"module.exports = {\n presets: [\n 'module:metro-react-native-babel-preset',\n+ ['@babel/preset-typescript', {'onlyRemoveTypeImports': true}]\n ],\n plugins: [\n+ react-obsidian/dist/transformers/babel-plugin-obsidian,\n+ ['@babel/plugin-proposal-decorators', {legacy: true}],\n+ '@babel/plugin-transform-class-properties',\n+ 'babel-plugin-parameter-decorator'\n ]\n};\n"})}),"\n",(0,a.jsx)(t.h2,{id:"5-optional---add-obsidians-eslint-plugin",children:"5. Optional - Add Obsidian's ESLint plugin"}),"\n",(0,a.jsxs)(t.p,{children:["Obsidian provides an ESLint plugin that can help you find errors in your code related to dependency injection. See the ",(0,a.jsx)(t.a,{href:"/docs/documentation/meta/eslint",children:"ESLint plugin"})," documentation for more information."]}),"\n",(0,a.jsx)(t.h2,{id:"integration-with-third-party-front-end-environments",children:"Integration with third-party front-end environments"}),"\n",(0,a.jsx)(t.h3,{id:"vite",children:"Vite"}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.a,{href:"https://vitejs.dev/",children:"Vite"})," provides a modern development environment for React application. It boasts an extremely fast development server that uses Hot Module Replacement (HMR) to enable near-instant startup time."]}),"\n",(0,a.jsxs)(t.p,{children:["When integrating Obsidian in a Vite application, follow steps ",(0,a.jsx)(t.strong,{children:"1-3 and step 4.1 that are listed above"}),". Instead of step 4.2, we'll configure Obsidian't Babel transformer in Vite's ",(0,a.jsx)(t.code,{children:"vite.config.js"})," file:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-js",metastring:'title="vite.config.js"',children:"import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n plugins: [\n react({\n babel: {\n plugins: [\n 'react-obsidian/dist/transformers/babel-plugin-obsidian',\n ['@babel/plugin-proposal-decorators', { legacy: true }],\n ],\n },\n }),\n ],\n});\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-react-app",children:"Create React App"}),"\n",(0,a.jsx)(t.p,{children:"Create React App (CRA) is a popular tool for getting started with React. It provides a pre-configured development environment that is ready to use out of the box."}),"\n",(0,a.jsxs)(t.p,{children:["When integrating Obsidian in a CRA application, follow steps ",(0,a.jsx)(t.strong,{children:"1-4 that are listed above"}),". Since CRA doesn't allow you to configure Babel directly, we'll need to install two additional packages:"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.a,{href:"https://github.com/timarney/react-app-rewired",children:"react-app-rewired"}),". This package allows you to customize CRA scripts without ejecting."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.a,{href:"https://github.com/arackaf/customize-cra",children:"customize-cra"}),". This package provides a set of utilities that can be used to customize CRA configurations. It has to be used instead of the default ",(0,a.jsx)(t.code,{children:"react-scripts"})," package."]}),"\n"]}),"\n",(0,a.jsx)(t.h4,{id:"install-the-required-packages-and-modify-the-default-scripts",children:"Install the required packages and modify the default scripts"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-diff",metastring:'title="package.json"',children:'{\n "devDependencies": {\n+ "customize-cra": "1.0.0",\n+ "react-app-rewired": "2.2.1"\n },\n "scripts": {\n+ "start": "react-app-rewired start",\n+ "build": "react-app-rewired build",\n+ "test": "npx jest",\n- "start": "react-scripts start",\n- "build": "react-scripts build",\n- "test": "react-scripts test --env=jsdom",\n }\n}\n'})}),"\n",(0,a.jsx)(t.h4,{id:"configure-babel",children:"Configure Babel"}),"\n",(0,a.jsxs)(t.p,{children:["Create a ",(0,a.jsx)(t.code,{children:"config-overrides.js"})," file in the root of your project and add the following code to it:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-js",metastring:'title="config-overrides.js"',children:"const { useBabelRc, override } = require('customize-cra');\nmodule.exports = override(useBabelRc());\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},1184:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>l});var a=n(4041);const r={},i=a.createContext(r);function s(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.0c1f0126.js b/assets/js/runtime~main.b349233f.js similarity index 98% rename from assets/js/runtime~main.0c1f0126.js rename to assets/js/runtime~main.b349233f.js index 9eafa9c2..f4d66e8e 100644 --- a/assets/js/runtime~main.0c1f0126.js +++ b/assets/js/runtime~main.b349233f.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return d[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=d,r.c=t,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({620:"b8e0686b",714:"44f2f429",735:"7a7b0db1",1151:"710d0097",1235:"a7456010",1416:"4074822b",1527:"e15422ef",1668:"9d82cd43",1805:"87cfdea4",1903:"acecf23e",1972:"73664a40",2141:"ebc6a388",2324:"c75c4c5e",2493:"8be0beec",2529:"7a13f2fd",2616:"5d329f59",2642:"9793203b",2711:"9e4087bc",2835:"2cbcd466",3090:"fe4b3386",3249:"ccc49370",3481:"2f9aaeb0",3544:"b0f703c2",3637:"f4f34a3a",3694:"8717b14a",4251:"35e8b1a7",4279:"df203c0f",4364:"47a1ecf0",4451:"d07bec2a",4583:"1df93b7f",4787:"3720c009",4813:"6875c492",5062:"cbffce37",5065:"9e870aea",5217:"723ac545",5539:"4c34a84e",5557:"d9f32620",5615:"d85bc350",5742:"aba21aa0",6061:"1f391b9e",6164:"41d7f69b",6193:"60288529",6437:"0c03ec8f",6533:"ee7b352a",6607:"62542827",6618:"7a317a56",6813:"d1c3910c",6969:"14eb3368",7098:"a7bd4aaa",7262:"45a8904d",7303:"47be7135",7434:"24d02ece",7472:"814f3328",7643:"a6aa9e1f",7709:"a6297cf8",7723:"5b356b27",7920:"82e4d5b9",7963:"4ee41cd2",8177:"fe04cb02",8209:"01a85c17",8280:"c22cea32",8401:"17896441",8609:"925b3f96",8703:"f63a9d47",8737:"7661071f",8785:"3766187b",8816:"d79581ed",9048:"a94703ab",9325:"59362658",9328:"e273c56f",9467:"b211b8e3",9585:"ce02e9e1",9647:"5e95c892",9799:"91367da3",9824:"7ce08518",9858:"36994c47",9874:"3bfbf8e3",9884:"a39ee2f6"}[e]||e)+"."+{620:"a3c27942",714:"fbe473d1",735:"782936db",991:"0c9ecbf3",1151:"c89016ef",1235:"51a4a774",1416:"20f62003",1527:"c5e108a9",1668:"39a07041",1805:"e0d6a165",1903:"6b98ee39",1972:"0294656b",2141:"64f8cb7b",2324:"b63304cf",2493:"ecd552b1",2529:"00632db4",2616:"6b4e9ccd",2642:"9ee88493",2711:"7308c417",2835:"a6fd9cc2",3090:"fdf830c7",3249:"3b887808",3481:"a4e183d4",3544:"4e9a176e",3637:"2abb31e2",3694:"91287d68",4251:"b2829a3e",4279:"440cc635",4364:"ae71888a",4366:"d38957d2",4451:"33343403",4583:"47d3d6b7",4787:"f16b8f7b",4813:"13b589a8",5062:"5fa0ebab",5065:"4c7f5acc",5217:"0a922b9d",5539:"62b1d96b",5557:"35e9f504",5615:"19ca6415",5742:"49179dbc",6061:"ed8d8ed4",6164:"c606a08f",6193:"1e2523dd",6437:"4f9eebb3",6533:"bc9a28a1",6607:"3a8120dd",6618:"445cd473",6813:"42ce689c",6969:"1e65b1ed",7098:"b9acb4bc",7262:"9568bcf5",7303:"5dbe83e1",7434:"29478b6d",7472:"111a8e3d",7643:"b7f45bc2",7709:"fa65cc2d",7723:"f9d78543",7920:"476a19f8",7963:"c4e5c575",8177:"301fa961",8209:"c9e3e621",8280:"6ae223ff",8401:"e93aed16",8415:"40deaf17",8609:"4c8cce29",8703:"8fceb596",8737:"e685afec",8785:"ae76924f",8816:"879b933e",9048:"0c91aab7",9325:"9cb56f78",9328:"c9e1af5f",9467:"f84e9a80",9585:"d0606e22",9647:"7a29b5d2",9799:"5b47c557",9824:"6300393a",9858:"a7e298fa",9874:"eb02a28a",9884:"2227cada"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="documentation:",r.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/obsidian/",r.gca=function(e){return e={17896441:"8401",59362658:"9325",60288529:"6193",62542827:"6607",b8e0686b:"620","44f2f429":"714","7a7b0db1":"735","710d0097":"1151",a7456010:"1235","4074822b":"1416",e15422ef:"1527","9d82cd43":"1668","87cfdea4":"1805",acecf23e:"1903","73664a40":"1972",ebc6a388:"2141",c75c4c5e:"2324","8be0beec":"2493","7a13f2fd":"2529","5d329f59":"2616","9793203b":"2642","9e4087bc":"2711","2cbcd466":"2835",fe4b3386:"3090",ccc49370:"3249","2f9aaeb0":"3481",b0f703c2:"3544",f4f34a3a:"3637","8717b14a":"3694","35e8b1a7":"4251",df203c0f:"4279","47a1ecf0":"4364",d07bec2a:"4451","1df93b7f":"4583","3720c009":"4787","6875c492":"4813",cbffce37:"5062","9e870aea":"5065","723ac545":"5217","4c34a84e":"5539",d9f32620:"5557",d85bc350:"5615",aba21aa0:"5742","1f391b9e":"6061","41d7f69b":"6164","0c03ec8f":"6437",ee7b352a:"6533","7a317a56":"6618",d1c3910c:"6813","14eb3368":"6969",a7bd4aaa:"7098","45a8904d":"7262","47be7135":"7303","24d02ece":"7434","814f3328":"7472",a6aa9e1f:"7643",a6297cf8:"7709","5b356b27":"7723","82e4d5b9":"7920","4ee41cd2":"7963",fe04cb02:"8177","01a85c17":"8209",c22cea32:"8280","925b3f96":"8609",f63a9d47:"8703","7661071f":"8737","3766187b":"8785",d79581ed:"8816",a94703ab:"9048",e273c56f:"9328",b211b8e3:"9467",ce02e9e1:"9585","5e95c892":"9647","91367da3":"9799","7ce08518":"9824","36994c47":"9858","3bfbf8e3":"9874",a39ee2f6:"9884"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return d[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=d,r.c=t,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({620:"b8e0686b",714:"44f2f429",735:"7a7b0db1",1151:"710d0097",1235:"a7456010",1416:"4074822b",1527:"e15422ef",1668:"9d82cd43",1805:"87cfdea4",1903:"acecf23e",1972:"73664a40",2141:"ebc6a388",2324:"c75c4c5e",2493:"8be0beec",2529:"7a13f2fd",2616:"5d329f59",2642:"9793203b",2711:"9e4087bc",2835:"2cbcd466",3090:"fe4b3386",3249:"ccc49370",3481:"2f9aaeb0",3544:"b0f703c2",3637:"f4f34a3a",3694:"8717b14a",4251:"35e8b1a7",4279:"df203c0f",4364:"47a1ecf0",4451:"d07bec2a",4583:"1df93b7f",4787:"3720c009",4813:"6875c492",5062:"cbffce37",5065:"9e870aea",5217:"723ac545",5539:"4c34a84e",5557:"d9f32620",5615:"d85bc350",5742:"aba21aa0",6061:"1f391b9e",6164:"41d7f69b",6193:"60288529",6437:"0c03ec8f",6533:"ee7b352a",6607:"62542827",6618:"7a317a56",6813:"d1c3910c",6969:"14eb3368",7098:"a7bd4aaa",7262:"45a8904d",7303:"47be7135",7434:"24d02ece",7472:"814f3328",7643:"a6aa9e1f",7709:"a6297cf8",7723:"5b356b27",7920:"82e4d5b9",7963:"4ee41cd2",8177:"fe04cb02",8209:"01a85c17",8280:"c22cea32",8401:"17896441",8609:"925b3f96",8703:"f63a9d47",8737:"7661071f",8785:"3766187b",8816:"d79581ed",9048:"a94703ab",9325:"59362658",9328:"e273c56f",9467:"b211b8e3",9585:"ce02e9e1",9647:"5e95c892",9799:"91367da3",9824:"7ce08518",9858:"36994c47",9874:"3bfbf8e3",9884:"a39ee2f6"}[e]||e)+"."+{620:"a3c27942",714:"fbe473d1",735:"782936db",991:"0c9ecbf3",1151:"c89016ef",1235:"51a4a774",1416:"20f62003",1527:"c5e108a9",1668:"39a07041",1805:"e0d6a165",1903:"6b98ee39",1972:"0294656b",2141:"64f8cb7b",2324:"b63304cf",2493:"ecd552b1",2529:"00632db4",2616:"6b4e9ccd",2642:"9ee88493",2711:"7308c417",2835:"2d186895",3090:"fdf830c7",3249:"3b887808",3481:"a4e183d4",3544:"4e9a176e",3637:"2abb31e2",3694:"91287d68",4251:"b2829a3e",4279:"440cc635",4364:"ae71888a",4366:"d38957d2",4451:"33343403",4583:"47d3d6b7",4787:"f16b8f7b",4813:"13b589a8",5062:"5fa0ebab",5065:"4c7f5acc",5217:"0a922b9d",5539:"62b1d96b",5557:"35e9f504",5615:"19ca6415",5742:"49179dbc",6061:"ed8d8ed4",6164:"c606a08f",6193:"1e2523dd",6437:"466e262b",6533:"bc9a28a1",6607:"3a8120dd",6618:"445cd473",6813:"42ce689c",6969:"1e65b1ed",7098:"b9acb4bc",7262:"9568bcf5",7303:"5dbe83e1",7434:"29478b6d",7472:"111a8e3d",7643:"b7f45bc2",7709:"fa65cc2d",7723:"f9d78543",7920:"476a19f8",7963:"c4e5c575",8177:"301fa961",8209:"c9e3e621",8280:"6ae223ff",8401:"e93aed16",8415:"40deaf17",8609:"4c8cce29",8703:"8fceb596",8737:"e685afec",8785:"ae76924f",8816:"879b933e",9048:"0c91aab7",9325:"9cb56f78",9328:"c9e1af5f",9467:"f84e9a80",9585:"d0606e22",9647:"7a29b5d2",9799:"5b47c557",9824:"6300393a",9858:"a7e298fa",9874:"eb02a28a",9884:"2227cada"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="documentation:",r.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/obsidian/",r.gca=function(e){return e={17896441:"8401",59362658:"9325",60288529:"6193",62542827:"6607",b8e0686b:"620","44f2f429":"714","7a7b0db1":"735","710d0097":"1151",a7456010:"1235","4074822b":"1416",e15422ef:"1527","9d82cd43":"1668","87cfdea4":"1805",acecf23e:"1903","73664a40":"1972",ebc6a388:"2141",c75c4c5e:"2324","8be0beec":"2493","7a13f2fd":"2529","5d329f59":"2616","9793203b":"2642","9e4087bc":"2711","2cbcd466":"2835",fe4b3386:"3090",ccc49370:"3249","2f9aaeb0":"3481",b0f703c2:"3544",f4f34a3a:"3637","8717b14a":"3694","35e8b1a7":"4251",df203c0f:"4279","47a1ecf0":"4364",d07bec2a:"4451","1df93b7f":"4583","3720c009":"4787","6875c492":"4813",cbffce37:"5062","9e870aea":"5065","723ac545":"5217","4c34a84e":"5539",d9f32620:"5557",d85bc350:"5615",aba21aa0:"5742","1f391b9e":"6061","41d7f69b":"6164","0c03ec8f":"6437",ee7b352a:"6533","7a317a56":"6618",d1c3910c:"6813","14eb3368":"6969",a7bd4aaa:"7098","45a8904d":"7262","47be7135":"7303","24d02ece":"7434","814f3328":"7472",a6aa9e1f:"7643",a6297cf8:"7709","5b356b27":"7723","82e4d5b9":"7920","4ee41cd2":"7963",fe04cb02:"8177","01a85c17":"8209",c22cea32:"8280","925b3f96":"8609",f63a9d47:"8703","7661071f":"8737","3766187b":"8785",d79581ed:"8816",a94703ab:"9048",e273c56f:"9328",b211b8e3:"9467",ce02e9e1:"9585","5e95c892":"9647","91367da3":"9799","7ce08518":"9824","36994c47":"9858","3bfbf8e3":"9874",a39ee2f6:"9884"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);nbranches: 86.18%branches86.18% \ No newline at end of file diff --git a/badges/coverage-functions.svg b/badges/coverage-functions.svg deleted file mode 100644 index 447bad85..00000000 --- a/badges/coverage-functions.svg +++ /dev/null @@ -1 +0,0 @@ -functions: 95.58%functions95.58% \ No newline at end of file diff --git a/badges/coverage-jest coverage.svg b/badges/coverage-jest coverage.svg deleted file mode 100644 index c6ad8320..00000000 --- a/badges/coverage-jest coverage.svg +++ /dev/null @@ -1 +0,0 @@ -jest coverage: 93.24%jest coverage93.24% \ No newline at end of file diff --git a/badges/coverage-lines.svg b/badges/coverage-lines.svg deleted file mode 100644 index 53c5cfc3..00000000 --- a/badges/coverage-lines.svg +++ /dev/null @@ -1 +0,0 @@ -lines: 96%lines96% \ No newline at end of file diff --git a/badges/coverage-statements.svg b/badges/coverage-statements.svg deleted file mode 100644 index 4318e84f..00000000 --- a/badges/coverage-statements.svg +++ /dev/null @@ -1 +0,0 @@ -statements: 95.19%statements95.19% \ No newline at end of file diff --git a/blog/archive/index.html b/blog/archive/index.html index 41e77de9..58fcb814 100644 --- a/blog/archive/index.html +++ b/blog/archive/index.html @@ -5,7 +5,7 @@ Archive | Obsidian - + diff --git a/blog/first-blog-post/index.html b/blog/first-blog-post/index.html index 462bcf61..3c029bb9 100644 --- a/blog/first-blog-post/index.html +++ b/blog/first-blog-post/index.html @@ -5,7 +5,7 @@ First Blog Post | Obsidian - + diff --git a/blog/index.html b/blog/index.html index be5989dd..84f1b2ee 100644 --- a/blog/index.html +++ b/blog/index.html @@ -5,7 +5,7 @@ Blog | Obsidian - + diff --git a/blog/long-blog-post/index.html b/blog/long-blog-post/index.html index 0fd1e2ab..280de6aa 100644 --- a/blog/long-blog-post/index.html +++ b/blog/long-blog-post/index.html @@ -5,7 +5,7 @@ Long Blog Post | Obsidian - + diff --git a/blog/mdx-blog-post/index.html b/blog/mdx-blog-post/index.html index 70b1d11a..0bfdf70f 100644 --- a/blog/mdx-blog-post/index.html +++ b/blog/mdx-blog-post/index.html @@ -5,7 +5,7 @@ MDX Blog Post | Obsidian - + diff --git a/blog/tags/docusaurus/index.html b/blog/tags/docusaurus/index.html index 7febeaef..f1f74a9b 100644 --- a/blog/tags/docusaurus/index.html +++ b/blog/tags/docusaurus/index.html @@ -5,7 +5,7 @@ 4 posts tagged with "docusaurus" | Obsidian - + diff --git a/blog/tags/facebook/index.html b/blog/tags/facebook/index.html index 9e2aa35b..f2d97e06 100644 --- a/blog/tags/facebook/index.html +++ b/blog/tags/facebook/index.html @@ -5,7 +5,7 @@ One post tagged with "facebook" | Obsidian - + diff --git a/blog/tags/hello/index.html b/blog/tags/hello/index.html index 8b9588ac..eb0ac1b9 100644 --- a/blog/tags/hello/index.html +++ b/blog/tags/hello/index.html @@ -5,7 +5,7 @@ 2 posts tagged with "hello" | Obsidian - + diff --git a/blog/tags/hola/index.html b/blog/tags/hola/index.html index 02b2b292..b4e7bfe4 100644 --- a/blog/tags/hola/index.html +++ b/blog/tags/hola/index.html @@ -5,7 +5,7 @@ One post tagged with "hola" | Obsidian - + diff --git a/blog/tags/index.html b/blog/tags/index.html index bccd13de..2cf99d08 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -5,7 +5,7 @@ Tags | Obsidian - + diff --git a/blog/welcome/index.html b/blog/welcome/index.html index 90a01461..51f19e1d 100644 --- a/blog/welcome/index.html +++ b/blog/welcome/index.html @@ -5,7 +5,7 @@ Welcome | Obsidian - + diff --git a/docs/category/meta/index.html b/docs/category/meta/index.html index e09142c3..037e0f23 100644 --- a/docs/category/meta/index.html +++ b/docs/category/meta/index.html @@ -5,7 +5,7 @@ Meta | Obsidian - + diff --git a/docs/category/testkit/index.html b/docs/category/testkit/index.html index 4151a4f2..e4b248bd 100644 --- a/docs/category/testkit/index.html +++ b/docs/category/testkit/index.html @@ -5,7 +5,7 @@ TestKit | Obsidian - + diff --git a/docs/category/usage/index.html b/docs/category/usage/index.html index 8c1accac..07c23bfb 100644 --- a/docs/category/usage/index.html +++ b/docs/category/usage/index.html @@ -5,7 +5,7 @@ Usage | Obsidian - + diff --git a/docs/documentation/index.html b/docs/documentation/index.html index 3d1a203a..22e82aac 100644 --- a/docs/documentation/index.html +++ b/docs/documentation/index.html @@ -5,7 +5,7 @@ Introduction | Obsidian - + diff --git a/docs/documentation/installation/index.html b/docs/documentation/installation/index.html index 3c94e687..9a3f8b62 100644 --- a/docs/documentation/installation/index.html +++ b/docs/documentation/installation/index.html @@ -3,54 +3,30 @@ -Installation | Obsidian +Installation | Obsidian - +

Installation

-

Like most Dependency Injection frameworks, Obsidian uses automatic code generation to create the bindings necessary for resolving dependencies. This approach helps reduce the amount of boilerplate code required by developers. Obsidian relies on Babel for code generation, so you'll need to have Babel configured in your project.

-
important

If your project uses either Vite or Create React App, please refer to the Integration with third-party front-end environments section before following the steps below.

+

Installing Obsidian is a straightforward process that involves adding the package to your project, enabling TypeScript decorators, and adding Obsidian's transformer to your build system, either Babel or SWC. Let's go through the steps.

1. Install Obsidian​

-
npm install react-obsidian
+

Install the package using your preferred package manager:

+
yarn add react-obsidian

2. Install Reflect-metadata​

-

First, install and enable the reflect-metadata polyfill.

-
npm install reflect-metadata
-

Then, add the following line to the top of your application's entry point (usually index.js or index.ts):

+

First, install the reflect-metadata package:

+
yarn add reflect-metadata
+

Then, enable the reflect-metadata polyfill by adding the following line to the top of your application's entry point (usually index.js or index.ts):

import 'reflect-metadata';

3. Enable experimental decorators​

Obsidian uses the Decorators feature whose proposal is at stage 3.

Add the following options to your tsconfig.json file.

{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
-

4. Add the required Babel plugins​

-

BabelJS is a JavaScript compiler that is used to transpile modern JavaScript code into code that is compatible with older browsers. Obsidian uses a Babel transformer to generate code that is used to resolve dependencies.

-

4.1. Install the required Babel plugins​

-

You will need to install these plugins if you don't have them already:

-
yarn add @babel/plugin-proposal-decorators @babel/plugin-transform-class-properties babel-plugin-parameter-decorator @babel/core @babel/preset-env @babel/preset-typescript
-

If this is your first time using Babel, you will also need to install Babel's core packages:

-
yarn add @babel/core @babel/preset-env @babel/preset-typescript
-

4.2. Update your Babel configuration​

-

Add the transformer and the required plugins to the list of plugins in your babel.config.js file or .babelrc file:

-
module.exports = {
presets: [
'module:metro-react-native-babel-preset',
+ ['@babel/preset-typescript', {'onlyRemoveTypeImports': true}]
],
plugins: [
+ react-obsidian/dist/transformers/babel-plugin-obsidian,
+ ['@babel/plugin-proposal-decorators', {legacy: true}],
+ '@babel/plugin-transform-class-properties',
+ 'babel-plugin-parameter-decorator'
]
};
+

4. Add Obsidian's transformer​

+

Like most Dependency Injection frameworks, Obsidian uses automatic code generation to create the bindings necessary for resolving dependencies. This approach helps reduce the amount of boilerplate code required by developers.

+

Install the required Babel plugins​

You will need to install these plugins if you don't have them already:

yarn add @babel/plugin-proposal-decorators @babel/plugin-transform-class-properties babel-plugin-parameter-decorator @babel/core @babel/preset-env @babel/preset-typescript

If this is your first time using Babel, you will also need to install Babel's core packages:

yarn add @babel/core @babel/preset-env @babel/preset-typescript

Update your Babel configuration​

Add the transformer and the required plugins to the list of plugins in your babel.config.js file or .babelrc file:

module.exports = {
presets: [
'module:metro-react-native-babel-preset',
+ ['@babel/preset-typescript', {'onlyRemoveTypeImports': true}]
],
plugins: [
+ react-obsidian/dist/transformers/babel-plugin-obsidian,
+ ['@babel/plugin-proposal-decorators', {legacy: true}],
+ '@babel/plugin-transform-class-properties',
+ 'babel-plugin-parameter-decorator'
]
};

5. Optional - Add Obsidian's ESLint plugin​

-

Obsidian provides an ESLint plugin that can help you find errors in your code related to dependency injection. See the ESLint plugin documentation for more information.

-

Integration with third-party front-end environments​

-

Vite​

-

Vite provides a modern development environment for React application. It boasts an extremely fast development server that uses Hot Module Replacement (HMR) to enable near-instant startup time.

-

When integrating Obsidian in a Vite application, follow steps 1-3 and step 4.1 that are listed above. Instead of step 4.2, we'll configure Obsidian't Babel transformer in Vite's vite.config.js file:

-
vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

// https://vitejs.dev/config/
export default defineConfig({
plugins: [
react({
babel: {
plugins: [
'react-obsidian/dist/transformers/babel-plugin-obsidian',
['@babel/plugin-proposal-decorators', { legacy: true }],
],
},
}),
],
});
-

Create React App​

-

Create React App (CRA) is a popular tool for getting started with React. It provides a pre-configured development environment that is ready to use out of the box.

-

When integrating Obsidian in a CRA application, follow steps 1-4 that are listed above. Since CRA doesn't allow you to configure Babel directly, we'll need to install two additional packages:

-
    -
  1. react-app-rewired. This package allows you to customize CRA scripts without ejecting.
  2. -
  3. customize-cra. This package provides a set of utilities that can be used to customize CRA configurations. It has to be used instead of the default react-scripts package.
  4. -
-

Install the required packages and modify the default scripts​

-
package.json
{
"devDependencies": {
+ "customize-cra": "1.0.0",
+ "react-app-rewired": "2.2.1"
},
"scripts": {
+ "start": "react-app-rewired start",
+ "build": "react-app-rewired build",
+ "test": "npx jest",
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test --env=jsdom",
}
}
-

Configure Babel​

-

Create a config-overrides.js file in the root of your project and add the following code to it:

-
config-overrides.js
const { useBabelRc, override } = require('customize-cra');
module.exports = override(useBabelRc());
+

Obsidian provides an ESLint plugin that can help you find errors in your code related to dependency injection. See the ESLint plugin documentation for more information.

\ No newline at end of file diff --git a/docs/documentation/meta/clearingGraphs/index.html b/docs/documentation/meta/clearingGraphs/index.html index c393171d..406da503 100644 --- a/docs/documentation/meta/clearingGraphs/index.html +++ b/docs/documentation/meta/clearingGraphs/index.html @@ -5,7 +5,7 @@ Clearing graphs | Obsidian - + diff --git a/docs/documentation/meta/eslint/index.html b/docs/documentation/meta/eslint/index.html index 29a5ea54..d88dcd88 100644 --- a/docs/documentation/meta/eslint/index.html +++ b/docs/documentation/meta/eslint/index.html @@ -5,7 +5,7 @@ ESLint plugin | Obsidian - + diff --git a/docs/documentation/meta/middlewares/index.html b/docs/documentation/meta/middlewares/index.html index d1ac07a4..7603208c 100644 --- a/docs/documentation/meta/middlewares/index.html +++ b/docs/documentation/meta/middlewares/index.html @@ -5,7 +5,7 @@ Graph middlewares | Obsidian - + diff --git a/docs/documentation/usage/ClassComponents/index.html b/docs/documentation/usage/ClassComponents/index.html index e0313be7..236fcc35 100644 --- a/docs/documentation/usage/ClassComponents/index.html +++ b/docs/documentation/usage/ClassComponents/index.html @@ -5,7 +5,7 @@ Class components | Obsidian - + diff --git a/docs/documentation/usage/Classes/index.html b/docs/documentation/usage/Classes/index.html index 79fda1a2..88ca623f 100644 --- a/docs/documentation/usage/Classes/index.html +++ b/docs/documentation/usage/Classes/index.html @@ -5,7 +5,7 @@ Classes | Obsidian - + diff --git a/docs/documentation/usage/FunctionalComponents/index.html b/docs/documentation/usage/FunctionalComponents/index.html index d57b102b..075767e8 100644 --- a/docs/documentation/usage/FunctionalComponents/index.html +++ b/docs/documentation/usage/FunctionalComponents/index.html @@ -5,7 +5,7 @@ Functional components | Obsidian - + diff --git a/docs/documentation/usage/Graphs/index.html b/docs/documentation/usage/Graphs/index.html index df2a7bd6..e66682d8 100644 --- a/docs/documentation/usage/Graphs/index.html +++ b/docs/documentation/usage/Graphs/index.html @@ -5,7 +5,7 @@ Graphs | Obsidian - + diff --git a/docs/documentation/usage/Hooks/index.html b/docs/documentation/usage/Hooks/index.html index 7c3d2639..d6447953 100644 --- a/docs/documentation/usage/Hooks/index.html +++ b/docs/documentation/usage/Hooks/index.html @@ -5,7 +5,7 @@ Hooks | Obsidian - + diff --git a/docs/documentation/usage/Reactivity/index.html b/docs/documentation/usage/Reactivity/index.html index 754755b1..20f896d3 100644 --- a/docs/documentation/usage/Reactivity/index.html +++ b/docs/documentation/usage/Reactivity/index.html @@ -5,7 +5,7 @@ Reactivity | Obsidian - + diff --git a/docs/documentation/usage/ServiceLocator/index.html b/docs/documentation/usage/ServiceLocator/index.html index 0d7bca59..ef6817ed 100644 --- a/docs/documentation/usage/ServiceLocator/index.html +++ b/docs/documentation/usage/ServiceLocator/index.html @@ -5,7 +5,7 @@ Service locator | Obsidian - + diff --git a/docs/guides/avoidingPropDrilling/index.html b/docs/guides/avoidingPropDrilling/index.html index 228e3bff..f221b0b4 100644 --- a/docs/guides/avoidingPropDrilling/index.html +++ b/docs/guides/avoidingPropDrilling/index.html @@ -5,7 +5,7 @@ Avoiding prop drilling | Obsidian - + diff --git a/docs/guides/configurableApplications/index.html b/docs/guides/configurableApplications/index.html index 504b3627..e04dc893 100644 --- a/docs/guides/configurableApplications/index.html +++ b/docs/guides/configurableApplications/index.html @@ -5,7 +5,7 @@ Configurable applications | Obsidian - + diff --git a/docs/guides/mockDependencies/index.html b/docs/guides/mockDependencies/index.html index 867d7061..e3ddbf5a 100644 --- a/docs/guides/mockDependencies/index.html +++ b/docs/guides/mockDependencies/index.html @@ -5,7 +5,7 @@ Mocking dependencies in unit tests | Obsidian - + diff --git a/docs/guides/mvvm/index.html b/docs/guides/mvvm/index.html index bc13df5b..f06ecc92 100644 --- a/docs/guides/mvvm/index.html +++ b/docs/guides/mvvm/index.html @@ -5,7 +5,7 @@ MVVM architecture with Obsidian | Obsidian - + diff --git a/docs/reference/mediatorObservable/index.html b/docs/reference/mediatorObservable/index.html index 33126ca3..60e61756 100644 --- a/docs/reference/mediatorObservable/index.html +++ b/docs/reference/mediatorObservable/index.html @@ -5,7 +5,7 @@ MediatorObservable | Obsidian - + diff --git a/docs/reference/model/index.html b/docs/reference/model/index.html index de01fa39..291eab8e 100644 --- a/docs/reference/model/index.html +++ b/docs/reference/model/index.html @@ -5,7 +5,7 @@ Model | Obsidian - + diff --git a/docs/reference/observable/index.html b/docs/reference/observable/index.html index 559305a9..3ff8b6da 100644 --- a/docs/reference/observable/index.html +++ b/docs/reference/observable/index.html @@ -5,7 +5,7 @@ Observable | Obsidian - + diff --git a/docs/reference/obsidian/index.html b/docs/reference/obsidian/index.html index b2d83a5c..96ce69d4 100644 --- a/docs/reference/obsidian/index.html +++ b/docs/reference/obsidian/index.html @@ -5,7 +5,7 @@ Obsidian | Obsidian - + diff --git a/docs/reference/testKit/mockGraphs/index.html b/docs/reference/testKit/mockGraphs/index.html index 3839f8c6..854df37e 100644 --- a/docs/reference/testKit/mockGraphs/index.html +++ b/docs/reference/testKit/mockGraphs/index.html @@ -5,7 +5,7 @@ mockGraphs | Obsidian - + diff --git a/docs/reference/testKit/mockModel/index.html b/docs/reference/testKit/mockModel/index.html index 4c33665b..6a4692aa 100644 --- a/docs/reference/testKit/mockModel/index.html +++ b/docs/reference/testKit/mockModel/index.html @@ -5,7 +5,7 @@ mockModel | Obsidian - + diff --git a/docs/reference/useObserver/index.html b/docs/reference/useObserver/index.html index aecddf88..1d81e3ef 100644 --- a/docs/reference/useObserver/index.html +++ b/docs/reference/useObserver/index.html @@ -5,7 +5,7 @@ useObserver | Obsidian - + diff --git a/docs/reference/useObservers/index.html b/docs/reference/useObservers/index.html index 0cc99e88..289a0542 100644 --- a/docs/reference/useObservers/index.html +++ b/docs/reference/useObservers/index.html @@ -5,7 +5,7 @@ useObservers | Obsidian - + diff --git a/docs/tags/architecture/index.html b/docs/tags/architecture/index.html index 06a14b0e..b5d327b9 100644 --- a/docs/tags/architecture/index.html +++ b/docs/tags/architecture/index.html @@ -5,7 +5,7 @@ 4 docs tagged with "Architecture" | Obsidian - + diff --git a/docs/tags/graph/index.html b/docs/tags/graph/index.html index b8375de0..04ddec57 100644 --- a/docs/tags/graph/index.html +++ b/docs/tags/graph/index.html @@ -5,7 +5,7 @@ 4 docs tagged with "Graph" | Obsidian - + diff --git a/docs/tags/index.html b/docs/tags/index.html index 23fc896b..95669914 100644 --- a/docs/tags/index.html +++ b/docs/tags/index.html @@ -5,7 +5,7 @@ Tags | Obsidian - + diff --git a/docs/tags/lifecycle-bound/index.html b/docs/tags/lifecycle-bound/index.html index e80a5125..f20951c1 100644 --- a/docs/tags/lifecycle-bound/index.html +++ b/docs/tags/lifecycle-bound/index.html @@ -5,7 +5,7 @@ 2 docs tagged with "Lifecycle-bound" | Obsidian - + diff --git a/docs/tags/mediator-observable/index.html b/docs/tags/mediator-observable/index.html index e63ed040..5900c4bc 100644 --- a/docs/tags/mediator-observable/index.html +++ b/docs/tags/mediator-observable/index.html @@ -5,7 +5,7 @@ 2 docs tagged with "MediatorObservable" | Obsidian - + diff --git a/docs/tags/mock-graphs/index.html b/docs/tags/mock-graphs/index.html index 8c8240a6..6baef569 100644 --- a/docs/tags/mock-graphs/index.html +++ b/docs/tags/mock-graphs/index.html @@ -5,7 +5,7 @@ One doc tagged with "mockGraphs" | Obsidian - + diff --git a/docs/tags/model/index.html b/docs/tags/model/index.html index 66ded3cf..0fae2ff0 100644 --- a/docs/tags/model/index.html +++ b/docs/tags/model/index.html @@ -5,7 +5,7 @@ 3 docs tagged with "Model" | Obsidian - + diff --git a/docs/tags/mvvm/index.html b/docs/tags/mvvm/index.html index 5c0f11ab..0241620a 100644 --- a/docs/tags/mvvm/index.html +++ b/docs/tags/mvvm/index.html @@ -5,7 +5,7 @@ 2 docs tagged with "MVVM" | Obsidian - + diff --git a/docs/tags/observable/index.html b/docs/tags/observable/index.html index 424f969d..e4a42b22 100644 --- a/docs/tags/observable/index.html +++ b/docs/tags/observable/index.html @@ -5,7 +5,7 @@ 2 docs tagged with "Observable" | Obsidian - + diff --git a/docs/tags/reactivity/index.html b/docs/tags/reactivity/index.html index e206ba51..1bfdd7a2 100644 --- a/docs/tags/reactivity/index.html +++ b/docs/tags/reactivity/index.html @@ -5,7 +5,7 @@ 7 docs tagged with "Reactivity" | Obsidian - + diff --git a/docs/tags/service-locator/index.html b/docs/tags/service-locator/index.html index 3d65ee97..fdf139ec 100644 --- a/docs/tags/service-locator/index.html +++ b/docs/tags/service-locator/index.html @@ -5,7 +5,7 @@ 2 docs tagged with "Service Locator" | Obsidian - + diff --git a/docs/tags/testing/index.html b/docs/tags/testing/index.html index 4e41f356..f9a9e940 100644 --- a/docs/tags/testing/index.html +++ b/docs/tags/testing/index.html @@ -5,7 +5,7 @@ 4 docs tagged with "Testing" | Obsidian - + diff --git a/docs/tags/use-observer/index.html b/docs/tags/use-observer/index.html index ffda2731..d6940066 100644 --- a/docs/tags/use-observer/index.html +++ b/docs/tags/use-observer/index.html @@ -5,7 +5,7 @@ 2 docs tagged with "useObserver" | Obsidian - + diff --git a/docs/tags/use-observers/index.html b/docs/tags/use-observers/index.html index b4b4f315..873b07d2 100644 --- a/docs/tags/use-observers/index.html +++ b/docs/tags/use-observers/index.html @@ -5,7 +5,7 @@ One doc tagged with "useObservers" | Obsidian - + diff --git a/docs/tags/view-model/index.html b/docs/tags/view-model/index.html index 785eded1..95db354d 100644 --- a/docs/tags/view-model/index.html +++ b/docs/tags/view-model/index.html @@ -5,7 +5,7 @@ One doc tagged with "ViewModel" | Obsidian - + diff --git a/index.html b/index.html index 47f007ed..e6f8e9e0 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,7 @@ Hello from Obsidian | Obsidian - + diff --git a/playground/index.html b/playground/index.html index b2059eb9..33df9212 100644 --- a/playground/index.html +++ b/playground/index.html @@ -5,7 +5,7 @@ Obsidian playground | Obsidian - +