react-obsidian 0.0.40 → 0.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/clearGraphs.js +2 -2
  2. package/dist/clearGraphs.js.map +1 -1
  3. package/dist/src/GraphProperties.js +9 -10
  4. package/dist/src/GraphProperties.js.map +1 -1
  5. package/dist/src/Obsidian.js +15 -18
  6. package/dist/src/Obsidian.js.map +1 -1
  7. package/dist/src/ProvidedPropertiesStore.js +13 -14
  8. package/dist/src/ProvidedPropertiesStore.js.map +1 -1
  9. package/dist/src/ReferenceCounter.js +9 -10
  10. package/dist/src/ReferenceCounter.js.map +1 -1
  11. package/dist/src/decorators/Graph.js +3 -4
  12. package/dist/src/decorators/Graph.js.map +1 -1
  13. package/dist/src/decorators/LifecycleBound.js +1 -1
  14. package/dist/src/decorators/LifecycleBound.js.map +1 -1
  15. package/dist/src/decorators/Memoize.js +3 -3
  16. package/dist/src/decorators/Memoize.js.map +1 -1
  17. package/dist/src/decorators/Singleton.js +1 -1
  18. package/dist/src/decorators/Singleton.js.map +1 -1
  19. package/dist/src/decorators/inject/Inject.js +4 -4
  20. package/dist/src/decorators/inject/Inject.js.map +1 -1
  21. package/dist/src/decorators/inject/Injectable.js +2 -2
  22. package/dist/src/decorators/inject/Injectable.js.map +1 -1
  23. package/dist/src/decorators/inject/LateInject.js +3 -3
  24. package/dist/src/decorators/inject/LateInject.js.map +1 -1
  25. package/dist/src/decorators/provides/MemoizeDescriptor.js +5 -9
  26. package/dist/src/decorators/provides/MemoizeDescriptor.js.map +1 -1
  27. package/dist/src/decorators/provides/Provides.js +3 -4
  28. package/dist/src/decorators/provides/Provides.js.map +1 -1
  29. package/dist/src/graph/CircularDependenciesDetector.d.ts +10 -0
  30. package/dist/src/graph/CircularDependenciesDetector.d.ts.map +1 -0
  31. package/dist/src/graph/CircularDependenciesDetector.js +24 -0
  32. package/dist/src/graph/CircularDependenciesDetector.js.map +1 -0
  33. package/dist/src/graph/ObjectGraph.d.ts +2 -1
  34. package/dist/src/graph/ObjectGraph.d.ts.map +1 -1
  35. package/dist/src/graph/ObjectGraph.js +20 -25
  36. package/dist/src/graph/ObjectGraph.js.map +1 -1
  37. package/dist/src/graph/PropertyRetriever.d.ts +2 -1
  38. package/dist/src/graph/PropertyRetriever.d.ts.map +1 -1
  39. package/dist/src/graph/PropertyRetriever.js +28 -20
  40. package/dist/src/graph/PropertyRetriever.js.map +1 -1
  41. package/dist/src/graph/PropertyRetrieverDelegate.d.ts +2 -1
  42. package/dist/src/graph/PropertyRetrieverDelegate.d.ts.map +1 -1
  43. package/dist/src/graph/ProviderBinder.js +3 -3
  44. package/dist/src/graph/ProviderBinder.js.map +1 -1
  45. package/dist/src/graph/ServiceLocatorFactory.js +9 -12
  46. package/dist/src/graph/ServiceLocatorFactory.js.map +1 -1
  47. package/dist/src/graph/VisitedNodes.d.ts +9 -0
  48. package/dist/src/graph/VisitedNodes.d.ts.map +1 -0
  49. package/dist/src/graph/VisitedNodes.js +28 -0
  50. package/dist/src/graph/VisitedNodes.js.map +1 -0
  51. package/dist/src/graph/registry/DefaultGraphResolver.js +5 -25
  52. package/dist/src/graph/registry/DefaultGraphResolver.js.map +1 -1
  53. package/dist/src/graph/registry/GraphMiddleware.js +3 -23
  54. package/dist/src/graph/registry/GraphMiddleware.js.map +1 -1
  55. package/dist/src/graph/registry/GraphMiddlewareChain.js +12 -14
  56. package/dist/src/graph/registry/GraphMiddlewareChain.js.map +1 -1
  57. package/dist/src/graph/registry/GraphRegistry.js +38 -41
  58. package/dist/src/graph/registry/GraphRegistry.js.map +1 -1
  59. package/dist/src/graph/registry/Middleware.js +11 -19
  60. package/dist/src/graph/registry/Middleware.js.map +1 -1
  61. package/dist/src/index.js +1 -1
  62. package/dist/src/index.js.map +1 -1
  63. package/dist/src/injectors/class/ClassInjector.js +25 -40
  64. package/dist/src/injectors/class/ClassInjector.js.map +1 -1
  65. package/dist/src/injectors/class/ConstructorArgs.js +11 -12
  66. package/dist/src/injectors/class/ConstructorArgs.js.map +1 -1
  67. package/dist/src/injectors/class/InjectionMetadata.js +21 -22
  68. package/dist/src/injectors/class/InjectionMetadata.js.map +1 -1
  69. package/dist/src/injectors/class/LateInjector.js +12 -15
  70. package/dist/src/injectors/class/LateInjector.js.map +1 -1
  71. package/dist/src/injectors/components/ComponentInjector.js +18 -21
  72. package/dist/src/injectors/components/ComponentInjector.js.map +1 -1
  73. package/dist/src/injectors/components/InjectComponent.js +3 -3
  74. package/dist/src/injectors/components/InjectComponent.js.map +1 -1
  75. package/dist/src/injectors/components/PropsInjector.js +7 -9
  76. package/dist/src/injectors/components/PropsInjector.js.map +1 -1
  77. package/dist/src/injectors/components/useGraph.js +10 -10
  78. package/dist/src/injectors/components/useGraph.js.map +1 -1
  79. package/dist/src/injectors/hooks/HookInjector.js +12 -16
  80. package/dist/src/injectors/hooks/HookInjector.js.map +1 -1
  81. package/dist/src/injectors/hooks/InjectHook.js +2 -2
  82. package/dist/src/injectors/hooks/InjectHook.js.map +1 -1
  83. package/dist/src/observable/MediatorObservable.js +23 -34
  84. package/dist/src/observable/MediatorObservable.js.map +1 -1
  85. package/dist/src/observable/Observable.js +16 -22
  86. package/dist/src/observable/Observable.js.map +1 -1
  87. package/dist/src/observable/useObserver.js +4 -4
  88. package/dist/src/observable/useObserver.js.map +1 -1
  89. package/dist/src/utils/React.js +1 -1
  90. package/dist/src/utils/React.js.map +1 -1
  91. package/dist/test/fixtures/CircularDependencyFromSubgraph.d.ts +5 -0
  92. package/dist/test/fixtures/CircularDependencyFromSubgraph.d.ts.map +1 -0
  93. package/dist/test/fixtures/CircularDependencyFromSubgraph.js +30 -0
  94. package/dist/test/fixtures/CircularDependencyFromSubgraph.js.map +1 -0
  95. package/dist/test/fixtures/CircularDependencyGraph.d.ts +5 -0
  96. package/dist/test/fixtures/CircularDependencyGraph.d.ts.map +1 -0
  97. package/dist/test/fixtures/CircularDependencyGraph.js +29 -0
  98. package/dist/test/fixtures/CircularDependencyGraph.js.map +1 -0
  99. package/dist/test/fixtures/CircularDependencyGraph2.d.ts +7 -0
  100. package/dist/test/fixtures/CircularDependencyGraph2.d.ts.map +1 -0
  101. package/dist/test/fixtures/CircularDependencyGraph2.js +47 -0
  102. package/dist/test/fixtures/CircularDependencyGraph2.js.map +1 -0
  103. package/dist/test/fixtures/GraphWithOnBind.js +16 -36
  104. package/dist/test/fixtures/GraphWithOnBind.js.map +1 -1
  105. package/dist/test/fixtures/InjectedComponent.js +4 -7
  106. package/dist/test/fixtures/InjectedComponent.js.map +1 -1
  107. package/dist/test/fixtures/LifecycleBoundGraph.js +23 -42
  108. package/dist/test/fixtures/LifecycleBoundGraph.js.map +1 -1
  109. package/dist/test/fixtures/MainGraph.js +25 -45
  110. package/dist/test/fixtures/MainGraph.js.map +1 -1
  111. package/dist/test/fixtures/SingletonGraph.js +21 -39
  112. package/dist/test/fixtures/SingletonGraph.js.map +1 -1
  113. package/dist/test/fixtures/StringProvider.js +4 -6
  114. package/dist/test/fixtures/StringProvider.js.map +1 -1
  115. package/dist/test/fixtures/Subgraph.js +41 -61
  116. package/dist/test/fixtures/Subgraph.js.map +1 -1
  117. package/dist/test/fixtures/SubgraphWithCircularDependency.d.ts +6 -0
  118. package/dist/test/fixtures/SubgraphWithCircularDependency.d.ts.map +1 -0
  119. package/dist/test/fixtures/SubgraphWithCircularDependency.js +39 -0
  120. package/dist/test/fixtures/SubgraphWithCircularDependency.js.map +1 -0
  121. package/dist/test/fixtures/ThrowingMainGraph.js +15 -35
  122. package/dist/test/fixtures/ThrowingMainGraph.js.map +1 -1
  123. package/dist/test/fixtures/UniqueNumberGraph.js +27 -45
  124. package/dist/test/fixtures/UniqueNumberGraph.js.map +1 -1
  125. package/dist/testkit/index.js +12 -35
  126. package/dist/testkit/index.js.map +1 -1
  127. package/dist/transformers/babel-plugin-obsidian/helpers/index.js +11 -11
  128. package/dist/transformers/babel-plugin-obsidian/helpers/index.js.map +1 -1
  129. package/dist/transformers/babel-plugin-obsidian/index.js +8 -12
  130. package/dist/transformers/babel-plugin-obsidian/index.js.map +1 -1
  131. package/dist/transformers/babel-plugin-obsidian/unmagler/index.js +2 -2
  132. package/dist/transformers/babel-plugin-obsidian/unmagler/index.js.map +1 -1
  133. package/dist/transformers/babel-plugin-obsidian/unmagler/method.js +3 -3
  134. package/dist/transformers/babel-plugin-obsidian/unmagler/method.js.map +1 -1
  135. package/dist/transformers/babel-plugin-obsidian/unmagler/property.js +2 -2
  136. package/dist/transformers/babel-plugin-obsidian/unmagler/property.js.map +1 -1
  137. package/documentation/package-lock.json +1819 -88
  138. package/documentation/package.json +1 -0
  139. package/documentation/src/theme/SearchBar.js +21 -0
  140. package/package.json +2 -2
  141. package/src/graph/CircularDependenciesDetector.ts +23 -0
  142. package/src/graph/ObjectGraph.ts +7 -2
  143. package/src/graph/PropertyRetriever.ts +29 -6
  144. package/src/graph/PropertyRetrieverDelegate.ts +7 -1
  145. package/src/graph/VisitedNodes.ts +25 -0
  146. package/tsconfig.base.json +1 -1
@@ -19,6 +19,7 @@
19
19
  "@docusaurus/preset-classic": "2.2.0",
20
20
  "@mdx-js/react": "^1.6.22",
21
21
  "clsx": "^1.2.1",
22
+ "enhancedocs-search": "^0.1.5",
22
23
  "prism-react-renderer": "^1.3.5",
23
24
  "react": "^17.0.2",
24
25
  "react-dom": "^17.0.2"
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import EnhancedSearch from 'enhancedocs-search';
3
+
4
+ import 'enhancedocs-search/dist/style.css';
5
+
6
+ export default function SearchBarWrapper(props) {
7
+ return (
8
+ <EnhancedSearch
9
+ config={{
10
+ enhancedSearch: {
11
+ projectId: '642ef48a9b7dab8fff36a55b',
12
+ accessToken: 'pk_b6c6de86cb63d0857b2a96b3f90ec2906be49358981ac67f'
13
+ }
14
+ }}
15
+ theme={{
16
+ primaryColor: '#B94BEE'
17
+ }}
18
+ {...props}
19
+ />
20
+ );
21
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-obsidian",
3
- "version": "0.0.40",
3
+ "version": "0.0.42",
4
4
  "description": "Dependency injection framework for React and React Native applications",
5
5
  "scripts": {
6
6
  "prepack": "npm run lint && tsc --project tsconfig.prod.json",
@@ -8,7 +8,7 @@
8
8
  "pretest": "tsc",
9
9
  "test": "npx jest"
10
10
  },
11
- "main": "src/index.ts",
11
+ "main": "dist/src/index.js",
12
12
  "directories": {
13
13
  "test": "test"
14
14
  },
@@ -0,0 +1,23 @@
1
+ import { VisitedNodes } from './VisitedNodes';
2
+
3
+ export class CircularDependenciesDetector {
4
+ private visitedNodes = new VisitedNodes();
5
+
6
+ constructor(public graphName: string) {}
7
+
8
+ public visit(graphName: string, dependencyName: string): boolean {
9
+ return this.visitedNodes.visit(graphName, dependencyName);
10
+ }
11
+
12
+ public hasCircularDependencies(): boolean {
13
+ return this.visitedNodes.isCircularPath();
14
+ }
15
+
16
+ public getDependencies(): string[] {
17
+ return this.visitedNodes.getNodes();
18
+ }
19
+
20
+ public get firstDependencyName(): string {
21
+ return this.visitedNodes.getNodes()[0];
22
+ }
23
+ }
@@ -4,6 +4,7 @@ import { bindProviders } from './ProviderBinder';
4
4
  import { Graph } from './Graph';
5
5
  import PropertyRetriever from './PropertyRetriever';
6
6
  import { Constructable } from '../types';
7
+ import { CircularDependenciesDetector } from './CircularDependenciesDetector';
7
8
 
8
9
  export abstract class ObjectGraph<T = unknown> implements Graph {
9
10
  private propertyRetriever = new PropertyRetriever(this);
@@ -17,8 +18,12 @@ export abstract class ObjectGraph<T = unknown> implements Graph {
17
18
  bindProviders(this);
18
19
  }
19
20
 
20
- retrieve<Dependency>(property: string, receiver?: unknown): Dependency | undefined {
21
- return this.propertyRetriever.retrieve(property, receiver) as Dependency | undefined;
21
+ retrieve<Dependency>(
22
+ property: string,
23
+ receiver?: unknown,
24
+ detector?: CircularDependenciesDetector,
25
+ ): Dependency | undefined {
26
+ return this.propertyRetriever.retrieve(property, receiver, detector) as Dependency | undefined;
22
27
  }
23
28
 
24
29
  onBind(_target: any) {
@@ -1,22 +1,41 @@
1
1
  import graphRegistry from './registry/GraphRegistry';
2
2
  import { Graph } from './Graph';
3
3
  import providedPropertiesStore from '../ProvidedPropertiesStore';
4
+ import { CircularDependenciesDetector } from './CircularDependenciesDetector';
4
5
 
5
6
  export default class PropertyRetriever {
6
7
  constructor(private graph: Graph) { }
7
8
 
8
- retrieve(property: string, receiver?: unknown): unknown | undefined {
9
+ retrieve(
10
+ property: string,
11
+ receiver?: unknown,
12
+ maybeDetector?: CircularDependenciesDetector,
13
+ ): unknown | undefined {
9
14
  const mangledPropertyKey = providedPropertiesStore.getMangledProperty(this.graph, property);
10
- if (mangledPropertyKey && mangledPropertyKey in this.graph) {
15
+ const circularDependenciesDetector = maybeDetector ?? new CircularDependenciesDetector(this.graph.name);
16
+
17
+ if (
18
+ mangledPropertyKey
19
+ && mangledPropertyKey in this.graph
20
+ && circularDependenciesDetector.visit(this.graph.name, property)
21
+ ) {
11
22
  const proxiedGraph = new Proxy(this.graph, {
12
23
  get(graph: Graph, dependencyName: string) {
13
- return graph.retrieve(dependencyName);
24
+ return graph.retrieve(dependencyName, receiver, circularDependenciesDetector);
14
25
  },
15
26
  });
16
27
  return Reflect.get(this.graph, mangledPropertyKey, receiver)(proxiedGraph);
17
28
  }
18
29
 
19
- const results = this.getFromSubgraphs(property, receiver);
30
+ if (circularDependenciesDetector.hasCircularDependencies()) {
31
+ throw new Error(
32
+ `Could not resolve ${circularDependenciesDetector.firstDependencyName}`
33
+ + ` from ${circularDependenciesDetector.graphName} because of a circular dependency:`
34
+ + ` ${circularDependenciesDetector.getDependencies().join(' -> ')}`,
35
+ );
36
+ }
37
+
38
+ const results = this.getFromSubgraphs(property, circularDependenciesDetector, receiver);
20
39
  if (results.length === 1) return results[0];
21
40
  if (results.length > 1) {
22
41
  throw new Error(
@@ -27,10 +46,14 @@ export default class PropertyRetriever {
27
46
  return undefined;
28
47
  }
29
48
 
30
- private getFromSubgraphs(property: string, receiver: unknown): unknown[] {
49
+ private getFromSubgraphs(
50
+ property: string,
51
+ circularDependenciesDetector: CircularDependenciesDetector,
52
+ receiver: unknown,
53
+ ): unknown[] {
31
54
  const subgraphs = graphRegistry.getSubgraphs(this.graph);
32
55
  return subgraphs
33
- .map((subgraph: Graph) => subgraph.retrieve(property, receiver))
56
+ .map((subgraph: Graph) => subgraph.retrieve(property, receiver, circularDependenciesDetector))
34
57
  .filter((result) => result !== undefined);
35
58
  }
36
59
  }
@@ -1,5 +1,11 @@
1
+ import { CircularDependenciesDetector } from './CircularDependenciesDetector';
2
+
1
3
  interface PropertyRetrieverDelegate {
2
- retrieve: (property: string, receiver?: unknown) => unknown | undefined;
4
+ retrieve: (
5
+ property: string,
6
+ receiver?: unknown,
7
+ circularDependenciesDetector?: CircularDependenciesDetector
8
+ ) => unknown | undefined;
3
9
  }
4
10
 
5
11
  export default PropertyRetrieverDelegate;
@@ -0,0 +1,25 @@
1
+ export class VisitedNodes {
2
+ private visitedNodes = new Set<`${string}.${string}`>();
3
+ private visitPath: string[] = [];
4
+
5
+ public visit(graphName: string, dependencyName: string): boolean {
6
+ this.visitPath.push(dependencyName);
7
+ if (this.canVisit(graphName, dependencyName)) {
8
+ this.visitedNodes.add(`${graphName}.${dependencyName}`);
9
+ return true;
10
+ }
11
+ return false;
12
+ }
13
+
14
+ public canVisit(graphName: string, dependencyName: string) {
15
+ return !this.visitedNodes.has(`${graphName}.${dependencyName}`);
16
+ }
17
+
18
+ public isCircularPath(): boolean {
19
+ return this.visitedNodes.size < this.visitPath.length;
20
+ }
21
+
22
+ getNodes(): string[] {
23
+ return this.visitPath;
24
+ }
25
+ }
@@ -10,7 +10,7 @@
10
10
  "dist"
11
11
  ],
12
12
  "compilerOptions": {
13
- "target": "es5",
13
+ "target": "es2018",
14
14
  "module": "commonjs",
15
15
  "lib": [
16
16
  "ES6",