react-obsidian 0.0.41 → 0.0.43

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 (47) hide show
  1. package/dist/src/graph/CircularDependenciesDetector.d.ts +11 -0
  2. package/dist/src/graph/CircularDependenciesDetector.d.ts.map +1 -0
  3. package/dist/src/graph/CircularDependenciesDetector.js +27 -0
  4. package/dist/src/graph/CircularDependenciesDetector.js.map +1 -0
  5. package/dist/src/graph/ObjectGraph.d.ts +2 -1
  6. package/dist/src/graph/ObjectGraph.d.ts.map +1 -1
  7. package/dist/src/graph/ObjectGraph.js +2 -2
  8. package/dist/src/graph/ObjectGraph.js.map +1 -1
  9. package/dist/src/graph/PropertyRetriever.d.ts +2 -1
  10. package/dist/src/graph/PropertyRetriever.d.ts.map +1 -1
  11. package/dist/src/graph/PropertyRetriever.js +18 -7
  12. package/dist/src/graph/PropertyRetriever.js.map +1 -1
  13. package/dist/src/graph/PropertyRetrieverDelegate.d.ts +2 -1
  14. package/dist/src/graph/PropertyRetrieverDelegate.d.ts.map +1 -1
  15. package/dist/src/graph/VisitedNodes.d.ts +10 -0
  16. package/dist/src/graph/VisitedNodes.d.ts.map +1 -0
  17. package/dist/src/graph/VisitedNodes.js +32 -0
  18. package/dist/src/graph/VisitedNodes.js.map +1 -0
  19. package/dist/test/fixtures/CircularDependencyFromSubgraph.d.ts +5 -0
  20. package/dist/test/fixtures/CircularDependencyFromSubgraph.d.ts.map +1 -0
  21. package/dist/test/fixtures/CircularDependencyFromSubgraph.js +30 -0
  22. package/dist/test/fixtures/CircularDependencyFromSubgraph.js.map +1 -0
  23. package/dist/test/fixtures/CircularDependencyGraph.d.ts +5 -0
  24. package/dist/test/fixtures/CircularDependencyGraph.d.ts.map +1 -0
  25. package/dist/test/fixtures/CircularDependencyGraph.js +29 -0
  26. package/dist/test/fixtures/CircularDependencyGraph.js.map +1 -0
  27. package/dist/test/fixtures/CircularDependencyGraph2.d.ts +7 -0
  28. package/dist/test/fixtures/CircularDependencyGraph2.d.ts.map +1 -0
  29. package/dist/test/fixtures/CircularDependencyGraph2.js +47 -0
  30. package/dist/test/fixtures/CircularDependencyGraph2.js.map +1 -0
  31. package/dist/test/fixtures/GraphWithMultipleDependencies.d.ts +8 -0
  32. package/dist/test/fixtures/GraphWithMultipleDependencies.d.ts.map +1 -0
  33. package/dist/test/fixtures/GraphWithMultipleDependencies.js +56 -0
  34. package/dist/test/fixtures/GraphWithMultipleDependencies.js.map +1 -0
  35. package/dist/test/fixtures/SubgraphWithCircularDependency.d.ts +6 -0
  36. package/dist/test/fixtures/SubgraphWithCircularDependency.d.ts.map +1 -0
  37. package/dist/test/fixtures/SubgraphWithCircularDependency.js +39 -0
  38. package/dist/test/fixtures/SubgraphWithCircularDependency.js.map +1 -0
  39. package/documentation/package-lock.json +7 -7
  40. package/documentation/package.json +1 -1
  41. package/documentation/src/theme/SearchBar.js +3 -4
  42. package/package.json +1 -1
  43. package/src/graph/CircularDependenciesDetector.ts +27 -0
  44. package/src/graph/ObjectGraph.ts +7 -2
  45. package/src/graph/PropertyRetriever.ts +32 -7
  46. package/src/graph/PropertyRetrieverDelegate.ts +7 -1
  47. package/src/graph/VisitedNodes.ts +30 -0
@@ -0,0 +1,11 @@
1
+ export declare class CircularDependenciesDetector {
2
+ graphName: string;
3
+ private visitedNodes;
4
+ constructor(graphName: string);
5
+ visit(graphName: string, dependencyName: string): boolean;
6
+ hasCircularDependencies(): boolean;
7
+ getDependencies(): string[];
8
+ get firstDependencyName(): string;
9
+ clear(): void;
10
+ }
11
+ //# sourceMappingURL=CircularDependenciesDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependenciesDetector.d.ts","sourceRoot":"","sources":["../../../src/graph/CircularDependenciesDetector.ts"],"names":[],"mappings":"AAEA,qBAAa,4BAA4B;IAGpB,SAAS,EAAE,MAAM;IAFpC,OAAO,CAAC,YAAY,CAAsB;gBAEvB,SAAS,EAAE,MAAM;IAE7B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IAIzD,uBAAuB,IAAI,OAAO;IAIlC,eAAe,IAAI,MAAM,EAAE;IAIlC,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAEM,KAAK;CAGb"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CircularDependenciesDetector = void 0;
4
+ const VisitedNodes_1 = require("./VisitedNodes");
5
+ class CircularDependenciesDetector {
6
+ constructor(graphName) {
7
+ this.graphName = graphName;
8
+ this.visitedNodes = new VisitedNodes_1.VisitedNodes();
9
+ }
10
+ visit(graphName, dependencyName) {
11
+ return this.visitedNodes.visit(graphName, dependencyName);
12
+ }
13
+ hasCircularDependencies() {
14
+ return this.visitedNodes.isCircularPath();
15
+ }
16
+ getDependencies() {
17
+ return this.visitedNodes.getNodes();
18
+ }
19
+ get firstDependencyName() {
20
+ return this.visitedNodes.getNodes()[0];
21
+ }
22
+ clear() {
23
+ this.visitedNodes.clear();
24
+ }
25
+ }
26
+ exports.CircularDependenciesDetector = CircularDependenciesDetector;
27
+ //# sourceMappingURL=CircularDependenciesDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependenciesDetector.js","sourceRoot":"","sources":["../../../src/graph/CircularDependenciesDetector.ts"],"names":[],"mappings":";;;AAAA,iDAA8C;AAE9C,MAAa,4BAA4B;IAGvC,YAAmB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;QAF5B,iBAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;IAEH,CAAC;IAEjC,KAAK,CAAC,SAAiB,EAAE,cAAsB;QACpD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC5D,CAAC;IAEM,uBAAuB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;IAC5C,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF;AAxBD,oEAwBC"}
@@ -1,11 +1,12 @@
1
1
  import { Graph } from './Graph';
2
2
  import { Constructable } from '../types';
3
+ import { CircularDependenciesDetector } from './CircularDependenciesDetector';
3
4
  export declare abstract class ObjectGraph<T = unknown> implements Graph {
4
5
  protected _props?: T | undefined;
5
6
  private propertyRetriever;
6
7
  get name(): string;
7
8
  constructor(_props?: T | undefined);
8
- retrieve<Dependency>(property: string, receiver?: unknown): Dependency | undefined;
9
+ retrieve<Dependency>(property: string, receiver?: unknown, detector?: CircularDependenciesDetector): Dependency | undefined;
9
10
  onBind(_target: any): void;
10
11
  }
11
12
  export declare function isGraph(object: Constructable<ObjectGraph> | any): object is Constructable<ObjectGraph>;
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectGraph.d.ts","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,8BAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,KAAK;IAQjD,SAAS,CAAC,MAAM,CAAC;IAP7B,OAAO,CAAC,iBAAiB,CAA+B;IAExD,IACI,IAAI,IAAI,MAAM,CAEjB;gBAEqB,MAAM,CAAC,eAAG;IAIhC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS;IAIlF,MAAM,CAAC,OAAO,EAAE,GAAG;CAGpB;AAID,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC,WAAW,CAAC,CAEtG"}
1
+ {"version":3,"file":"ObjectGraph.d.ts","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,8BAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,KAAK;IAQjD,SAAS,CAAC,MAAM,CAAC;IAP7B,OAAO,CAAC,iBAAiB,CAA+B;IAExD,IACI,IAAI,IAAI,MAAM,CAEjB;gBAEqB,MAAM,CAAC,eAAG;IAIhC,QAAQ,CAAC,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,QAAQ,CAAC,EAAE,4BAA4B,GACtC,UAAU,GAAG,SAAS;IAIzB,MAAM,CAAC,OAAO,EAAE,GAAG;CAGpB;AAID,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC,WAAW,CAAC,CAEtG"}
@@ -26,8 +26,8 @@ class ObjectGraph {
26
26
  this.propertyRetriever = new PropertyRetriever_1.default(this);
27
27
  (0, ProviderBinder_1.bindProviders)(this);
28
28
  }
29
- retrieve(property, receiver) {
30
- return this.propertyRetriever.retrieve(property, receiver);
29
+ retrieve(property, receiver, detector) {
30
+ return this.propertyRetriever.retrieve(property, receiver, detector);
31
31
  }
32
32
  onBind(_target) {
33
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectGraph.js","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mCAAkC;AAClC,oEAA4C;AAC5C,qDAAiD;AAEjD,4EAAoD;AAGpD,MAAsB,WAAW;IAG/B,IACI,IAAI;QACN,OAAO,IAAA,iBAAQ,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,YAAsB,MAAU;QAAV,WAAM,GAAN,MAAM,CAAI;QAPxB,sBAAiB,GAAG,IAAI,2BAAiB,CAAC,IAAI,CAAC,CAAC;QAQtD,IAAA,8BAAa,EAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,QAAQ,CAAa,QAAgB,EAAE,QAAkB;QACvD,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAA2B,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,OAAY;IAEnB,CAAC;CACF;AAhBC;IAAC,IAAA,iBAAO,GAAE;;;uCAGT;AANH,kCAmBC;AAED,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;AAE7D,SAAgB,OAAO,CAAC,MAAwC;IAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,KAAK,aAAa,CAAC;AACpE,CAAC;AAFD,0BAEC"}
1
+ {"version":3,"file":"ObjectGraph.js","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mCAAkC;AAClC,oEAA4C;AAC5C,qDAAiD;AAEjD,4EAAoD;AAIpD,MAAsB,WAAW;IAG/B,IACI,IAAI;QACN,OAAO,IAAA,iBAAQ,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,YAAsB,MAAU;QAAV,WAAM,GAAN,MAAM,CAAI;QAPxB,sBAAiB,GAAG,IAAI,2BAAiB,CAAC,IAAI,CAAC,CAAC;QAQtD,IAAA,8BAAa,EAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,QAAQ,CACN,QAAgB,EAChB,QAAkB,EAClB,QAAuC;QAEvC,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAA2B,CAAC;IACjG,CAAC;IAED,MAAM,CAAC,OAAY;IAEnB,CAAC;CACF;AApBC;IAAC,IAAA,iBAAO,GAAE;;;uCAGT;AANH,kCAuBC;AAED,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;AAE7D,SAAgB,OAAO,CAAC,MAAwC;IAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,KAAK,aAAa,CAAC;AACpE,CAAC;AAFD,0BAEC"}
@@ -1,8 +1,9 @@
1
1
  import { Graph } from './Graph';
2
+ import { CircularDependenciesDetector } from './CircularDependenciesDetector';
2
3
  export default class PropertyRetriever {
3
4
  private graph;
4
5
  constructor(graph: Graph);
5
- retrieve(property: string, receiver?: unknown): unknown | undefined;
6
+ retrieve(property: string, receiver?: unknown, maybeDetector?: CircularDependenciesDetector): unknown | undefined;
6
7
  private getFromSubgraphs;
7
8
  }
8
9
  //# sourceMappingURL=PropertyRetriever.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PropertyRetriever.d.ts","sourceRoot":"","sources":["../../../src/graph/PropertyRetriever.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACxB,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEhC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAsBnE,OAAO,CAAC,gBAAgB;CAMzB"}
1
+ {"version":3,"file":"PropertyRetriever.d.ts","sourceRoot":"","sources":["../../../src/graph/PropertyRetriever.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACxB,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEhC,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,aAAa,CAAC,EAAE,4BAA4B,GAC3C,OAAO,GAAG,SAAS;IAsCtB,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -5,21 +5,32 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const GraphRegistry_1 = __importDefault(require("./registry/GraphRegistry"));
7
7
  const ProvidedPropertiesStore_1 = __importDefault(require("../ProvidedPropertiesStore"));
8
+ const CircularDependenciesDetector_1 = require("./CircularDependenciesDetector");
8
9
  class PropertyRetriever {
9
10
  constructor(graph) {
10
11
  this.graph = graph;
11
12
  }
12
- retrieve(property, receiver) {
13
+ retrieve(property, receiver, maybeDetector) {
13
14
  const mangledPropertyKey = ProvidedPropertiesStore_1.default.getMangledProperty(this.graph, property);
14
- if (mangledPropertyKey && mangledPropertyKey in this.graph) {
15
+ const circularDependenciesDetector = maybeDetector !== null && maybeDetector !== void 0 ? maybeDetector : new CircularDependenciesDetector_1.CircularDependenciesDetector(this.graph.name);
16
+ if (mangledPropertyKey
17
+ && mangledPropertyKey in this.graph
18
+ && circularDependenciesDetector.visit(this.graph.name, property)) {
15
19
  const proxiedGraph = new Proxy(this.graph, {
16
20
  get(graph, dependencyName) {
17
- return graph.retrieve(dependencyName);
21
+ return graph.retrieve(dependencyName, receiver, circularDependenciesDetector);
18
22
  },
19
23
  });
20
- return Reflect.get(this.graph, mangledPropertyKey, receiver)(proxiedGraph);
24
+ const resolved = Reflect.get(this.graph, mangledPropertyKey, receiver)(proxiedGraph);
25
+ circularDependenciesDetector.clear();
26
+ return resolved;
21
27
  }
22
- const results = this.getFromSubgraphs(property, receiver);
28
+ if (circularDependenciesDetector.hasCircularDependencies()) {
29
+ throw new Error(`Could not resolve ${circularDependenciesDetector.firstDependencyName}`
30
+ + ` from ${circularDependenciesDetector.graphName} because of a circular dependency:`
31
+ + ` ${circularDependenciesDetector.getDependencies().join(' -> ')}`);
32
+ }
33
+ const results = this.getFromSubgraphs(property, circularDependenciesDetector, receiver);
23
34
  if (results.length === 1)
24
35
  return results[0];
25
36
  if (results.length > 1) {
@@ -28,10 +39,10 @@ class PropertyRetriever {
28
39
  }
29
40
  return undefined;
30
41
  }
31
- getFromSubgraphs(property, receiver) {
42
+ getFromSubgraphs(property, circularDependenciesDetector, receiver) {
32
43
  const subgraphs = GraphRegistry_1.default.getSubgraphs(this.graph);
33
44
  return subgraphs
34
- .map((subgraph) => subgraph.retrieve(property, receiver))
45
+ .map((subgraph) => subgraph.retrieve(property, receiver, circularDependenciesDetector))
35
46
  .filter((result) => result !== undefined);
36
47
  }
37
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PropertyRetriever.js","sourceRoot":"","sources":["../../../src/graph/PropertyRetriever.ts"],"names":[],"mappings":";;;;;AAAA,6EAAqD;AAErD,yFAAiE;AAEjE,MAAqB,iBAAiB;IACpC,YAAoB,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;IAAI,CAAC;IAErC,QAAQ,CAAC,QAAgB,EAAE,QAAkB;QAC3C,MAAM,kBAAkB,GAAG,iCAAuB,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5F,IAAI,kBAAkB,IAAI,kBAAkB,IAAI,IAAI,CAAC,KAAK,EAAE;YAC1D,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;gBACzC,GAAG,CAAC,KAAY,EAAE,cAAsB;oBACtC,OAAO,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;gBACxC,CAAC;aACF,CAAC,CAAC;YACH,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;SAC5E;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CACb,2CAA2C,QAAQ,GAAG;kBACpD,sGAAsG,CACzG,CAAC;SACH;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,gBAAgB,CAAC,QAAgB,EAAE,QAAiB;QAC1D,MAAM,SAAS,GAAG,uBAAa,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,SAAS;aACb,GAAG,CAAC,CAAC,QAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC/D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC9C,CAAC;CACF;AA/BD,oCA+BC"}
1
+ {"version":3,"file":"PropertyRetriever.js","sourceRoot":"","sources":["../../../src/graph/PropertyRetriever.ts"],"names":[],"mappings":";;;;;AAAA,6EAAqD;AAErD,yFAAiE;AACjE,iFAA8E;AAE9E,MAAqB,iBAAiB;IACpC,YAAoB,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;IAAI,CAAC;IAErC,QAAQ,CACN,QAAgB,EAChB,QAAkB,EAClB,aAA4C;QAE5C,MAAM,kBAAkB,GAAG,iCAAuB,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5F,MAAM,4BAA4B,GAAG,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,IAAI,2DAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAExG,IACE,kBAAkB;eACf,kBAAkB,IAAI,IAAI,CAAC,KAAK;eAChC,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAChE;YACA,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;gBACzC,GAAG,CAAC,KAAY,EAAE,cAAsB;oBACtC,OAAO,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;gBAChF,CAAC;aACF,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;YACrF,4BAA4B,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC;SACjB;QAED,IAAI,4BAA4B,CAAC,uBAAuB,EAAE,EAAE;YAC1D,MAAM,IAAI,KAAK,CACb,qBAAqB,4BAA4B,CAAC,mBAAmB,EAAE;kBACpE,SAAS,4BAA4B,CAAC,SAAS,oCAAoC;kBACnF,IAAI,4BAA4B,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACrE,CAAC;SACH;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,4BAA4B,EAAE,QAAQ,CAAC,CAAC;QACxF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CACb,2CAA2C,QAAQ,GAAG;kBACpD,sGAAsG,CACzG,CAAC;SACH;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,gBAAgB,CACtB,QAAgB,EAChB,4BAA0D,EAC1D,QAAiB;QAEjB,MAAM,SAAS,GAAG,uBAAa,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,SAAS;aACb,GAAG,CAAC,CAAC,QAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;aAC7F,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC9C,CAAC;CACF;AAvDD,oCAuDC"}
@@ -1,5 +1,6 @@
1
+ import { CircularDependenciesDetector } from './CircularDependenciesDetector';
1
2
  interface PropertyRetrieverDelegate {
2
- retrieve: (property: string, receiver?: unknown) => unknown | undefined;
3
+ retrieve: (property: string, receiver?: unknown, circularDependenciesDetector?: CircularDependenciesDetector) => unknown | undefined;
3
4
  }
4
5
  export default PropertyRetrieverDelegate;
5
6
  //# sourceMappingURL=PropertyRetrieverDelegate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PropertyRetrieverDelegate.d.ts","sourceRoot":"","sources":["../../../src/graph/PropertyRetrieverDelegate.ts"],"names":[],"mappings":"AAAA,UAAU,yBAAyB;IACjC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,CAAC;CACzE;AAED,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"PropertyRetrieverDelegate.d.ts","sourceRoot":"","sources":["../../../src/graph/PropertyRetrieverDelegate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,UAAU,yBAAyB;IACjC,QAAQ,EAAE,CACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,4BAA4B,CAAC,EAAE,4BAA4B,KACxD,OAAO,GAAG,SAAS,CAAC;CAC1B;AAED,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class VisitedNodes {
2
+ private visitedNodes;
3
+ private visitPath;
4
+ visit(graphName: string, dependencyName: string): boolean;
5
+ canVisit(graphName: string, dependencyName: string): boolean;
6
+ isCircularPath(): boolean;
7
+ getNodes(): string[];
8
+ clear(): void;
9
+ }
10
+ //# sourceMappingURL=VisitedNodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisitedNodes.d.ts","sourceRoot":"","sources":["../../../src/graph/VisitedNodes.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,SAAS,CAAgB;IAE1B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IASzD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAIlD,cAAc,IAAI,OAAO;IAIzB,QAAQ,IAAI,MAAM,EAAE;IAIpB,KAAK;CAIb"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VisitedNodes = void 0;
4
+ class VisitedNodes {
5
+ constructor() {
6
+ this.visitedNodes = new Set();
7
+ this.visitPath = [];
8
+ }
9
+ visit(graphName, dependencyName) {
10
+ this.visitPath.push(dependencyName);
11
+ if (this.canVisit(graphName, dependencyName)) {
12
+ this.visitedNodes.add(`${graphName}.${dependencyName}`);
13
+ return true;
14
+ }
15
+ return false;
16
+ }
17
+ canVisit(graphName, dependencyName) {
18
+ return !this.visitedNodes.has(`${graphName}.${dependencyName}`);
19
+ }
20
+ isCircularPath() {
21
+ return this.visitedNodes.size < this.visitPath.length;
22
+ }
23
+ getNodes() {
24
+ return this.visitPath;
25
+ }
26
+ clear() {
27
+ this.visitedNodes.clear();
28
+ this.visitPath.length = 0;
29
+ }
30
+ }
31
+ exports.VisitedNodes = VisitedNodes;
32
+ //# sourceMappingURL=VisitedNodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisitedNodes.js","sourceRoot":"","sources":["../../../src/graph/VisitedNodes.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAY;IAAzB;QACU,iBAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;QAChD,cAAS,GAAa,EAAE,CAAC;IA2BnC,CAAC;IAzBQ,KAAK,CAAC,SAAiB,EAAE,cAAsB;QACpD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE;YAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,cAAc,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,QAAQ,CAAC,SAAiB,EAAE,cAAsB;QACvD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,cAAc,EAAE,CAAC,CAAC;IAClE,CAAC;IAEM,cAAc;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IACxD,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF;AA7BD,oCA6BC"}
@@ -0,0 +1,5 @@
1
+ import { ObjectGraph } from '../../src';
2
+ export declare class CircularDependencyFromSubgraph extends ObjectGraph {
3
+ dep1(dep2: any): any;
4
+ }
5
+ //# sourceMappingURL=CircularDependencyFromSubgraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependencyFromSubgraph.d.ts","sourceRoot":"","sources":["../../../test/fixtures/CircularDependencyFromSubgraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAY,MAAM,WAAW,CAAC;AAGzD,qBACa,8BAA+B,SAAQ,WAAW;IAE7D,IAAI,CAAC,IAAI,EAAE,GAAG;CAGf"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CircularDependencyFromSubgraph = void 0;
13
+ const src_1 = require("../../src");
14
+ const SubgraphWithCircularDependency_1 = require("./SubgraphWithCircularDependency");
15
+ let CircularDependencyFromSubgraph = class CircularDependencyFromSubgraph extends src_1.ObjectGraph {
16
+ dep1(dep2) {
17
+ return dep2;
18
+ }
19
+ };
20
+ __decorate([
21
+ (0, src_1.Provides)(),
22
+ __metadata("design:type", Function),
23
+ __metadata("design:paramtypes", [Object]),
24
+ __metadata("design:returntype", void 0)
25
+ ], CircularDependencyFromSubgraph.prototype, "dep1", null);
26
+ CircularDependencyFromSubgraph = __decorate([
27
+ (0, src_1.Graph)({ subgraphs: [SubgraphWithCircularDependency_1.SubgraphWithCircularDependency] })
28
+ ], CircularDependencyFromSubgraph);
29
+ exports.CircularDependencyFromSubgraph = CircularDependencyFromSubgraph;
30
+ //# sourceMappingURL=CircularDependencyFromSubgraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependencyFromSubgraph.js","sourceRoot":"","sources":["../../../test/fixtures/CircularDependencyFromSubgraph.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAyD;AACzD,qFAAkF;AAG3E,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,iBAAW;IAE7D,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAJC;IAAC,IAAA,cAAQ,GAAE;;;;0DAGV;AAJU,8BAA8B;IAD1C,IAAA,WAAK,EAAC,EAAE,SAAS,EAAE,CAAC,+DAA8B,CAAC,EAAE,CAAC;GAC1C,8BAA8B,CAK1C;AALY,wEAA8B"}
@@ -0,0 +1,5 @@
1
+ import { ObjectGraph } from '../../src';
2
+ export declare class CircularDependencyGraph extends ObjectGraph {
3
+ aString(aString: string): string;
4
+ }
5
+ //# sourceMappingURL=CircularDependencyGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependencyGraph.d.ts","sourceRoot":"","sources":["../../../test/fixtures/CircularDependencyGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAY,MAAM,WAAW,CAAC;AAEzD,qBACa,uBAAwB,SAAQ,WAAW;IAEtD,OAAO,CAAC,OAAO,EAAE,MAAM;CAGxB"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CircularDependencyGraph = void 0;
13
+ const src_1 = require("../../src");
14
+ let CircularDependencyGraph = class CircularDependencyGraph extends src_1.ObjectGraph {
15
+ aString(aString) {
16
+ return aString;
17
+ }
18
+ };
19
+ __decorate([
20
+ (0, src_1.Provides)(),
21
+ __metadata("design:type", Function),
22
+ __metadata("design:paramtypes", [String]),
23
+ __metadata("design:returntype", void 0)
24
+ ], CircularDependencyGraph.prototype, "aString", null);
25
+ CircularDependencyGraph = __decorate([
26
+ (0, src_1.Graph)()
27
+ ], CircularDependencyGraph);
28
+ exports.CircularDependencyGraph = CircularDependencyGraph;
29
+ //# sourceMappingURL=CircularDependencyGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependencyGraph.js","sourceRoot":"","sources":["../../../test/fixtures/CircularDependencyGraph.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAyD;AAGlD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,iBAAW;IAEtD,OAAO,CAAC,OAAe;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;AAJC;IAAC,IAAA,cAAQ,GAAE;;;;sDAGV;AAJU,uBAAuB;IADnC,IAAA,WAAK,GAAE;GACK,uBAAuB,CAKnC;AALY,0DAAuB"}
@@ -0,0 +1,7 @@
1
+ import { ObjectGraph } from '../../src';
2
+ export declare class CircularDependencyGraph2 extends ObjectGraph {
3
+ dep1(dep2: any): any;
4
+ dep2(dep3: any): any;
5
+ dep3(dep1: any): any;
6
+ }
7
+ //# sourceMappingURL=CircularDependencyGraph2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependencyGraph2.d.ts","sourceRoot":"","sources":["../../../test/fixtures/CircularDependencyGraph2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAY,MAAM,WAAW,CAAC;AAEzD,qBACa,wBAAyB,SAAQ,WAAW;IAEvD,IAAI,CAAC,IAAI,EAAE,GAAG;IAKd,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG;IAKpB,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG;CAGrB"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CircularDependencyGraph2 = void 0;
13
+ const src_1 = require("../../src");
14
+ let CircularDependencyGraph2 = class CircularDependencyGraph2 extends src_1.ObjectGraph {
15
+ dep1(dep2) {
16
+ return dep2;
17
+ }
18
+ dep2(dep3) {
19
+ return dep3;
20
+ }
21
+ dep3(dep1) {
22
+ return dep1;
23
+ }
24
+ };
25
+ __decorate([
26
+ (0, src_1.Provides)(),
27
+ __metadata("design:type", Function),
28
+ __metadata("design:paramtypes", [Object]),
29
+ __metadata("design:returntype", void 0)
30
+ ], CircularDependencyGraph2.prototype, "dep1", null);
31
+ __decorate([
32
+ (0, src_1.Provides)(),
33
+ __metadata("design:type", Function),
34
+ __metadata("design:paramtypes", [Object]),
35
+ __metadata("design:returntype", Object)
36
+ ], CircularDependencyGraph2.prototype, "dep2", null);
37
+ __decorate([
38
+ (0, src_1.Provides)(),
39
+ __metadata("design:type", Function),
40
+ __metadata("design:paramtypes", [Object]),
41
+ __metadata("design:returntype", Object)
42
+ ], CircularDependencyGraph2.prototype, "dep3", null);
43
+ CircularDependencyGraph2 = __decorate([
44
+ (0, src_1.Graph)()
45
+ ], CircularDependencyGraph2);
46
+ exports.CircularDependencyGraph2 = CircularDependencyGraph2;
47
+ //# sourceMappingURL=CircularDependencyGraph2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircularDependencyGraph2.js","sourceRoot":"","sources":["../../../test/fixtures/CircularDependencyGraph2.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAyD;AAGlD,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,iBAAW;IAEvD,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAdC;IAAC,IAAA,cAAQ,GAAE;;;;oDAGV;AAED;IAAC,IAAA,cAAQ,GAAE;;;;oDAGV;AAED;IAAC,IAAA,cAAQ,GAAE;;;;oDAGV;AAdU,wBAAwB;IADpC,IAAA,WAAK,GAAE;GACK,wBAAwB,CAepC;AAfY,4DAAwB"}
@@ -0,0 +1,8 @@
1
+ import { ObjectGraph } from '../../src';
2
+ export declare class GraphWithMultipleDependencies extends ObjectGraph {
3
+ theDep(prefix: string, suffix: string): string;
4
+ prefix(noopDep: string): string;
5
+ suffix(noopDep: string): string;
6
+ noopDep(): string;
7
+ }
8
+ //# sourceMappingURL=GraphWithMultipleDependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphWithMultipleDependencies.d.ts","sourceRoot":"","sources":["../../../test/fixtures/GraphWithMultipleDependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAY,MAAM,WAAW,CAAC;AAEzD,qBACa,6BAA8B,SAAQ,WAAW;IAE5D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAKrC,MAAM,CAAC,OAAO,EAAE,MAAM;IAKtB,MAAM,CAAC,OAAO,EAAE,MAAM;IAKtB,OAAO,IAAI,MAAM;CAGlB"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.GraphWithMultipleDependencies = void 0;
13
+ const src_1 = require("../../src");
14
+ let GraphWithMultipleDependencies = class GraphWithMultipleDependencies extends src_1.ObjectGraph {
15
+ theDep(prefix, suffix) {
16
+ return prefix + suffix;
17
+ }
18
+ prefix(noopDep) {
19
+ return `prefix${noopDep}`;
20
+ }
21
+ suffix(noopDep) {
22
+ return `Suffix${noopDep}`;
23
+ }
24
+ noopDep() {
25
+ return '';
26
+ }
27
+ };
28
+ __decorate([
29
+ (0, src_1.Provides)(),
30
+ __metadata("design:type", Function),
31
+ __metadata("design:paramtypes", [String, String]),
32
+ __metadata("design:returntype", void 0)
33
+ ], GraphWithMultipleDependencies.prototype, "theDep", null);
34
+ __decorate([
35
+ (0, src_1.Provides)(),
36
+ __metadata("design:type", Function),
37
+ __metadata("design:paramtypes", [String]),
38
+ __metadata("design:returntype", void 0)
39
+ ], GraphWithMultipleDependencies.prototype, "prefix", null);
40
+ __decorate([
41
+ (0, src_1.Provides)(),
42
+ __metadata("design:type", Function),
43
+ __metadata("design:paramtypes", [String]),
44
+ __metadata("design:returntype", void 0)
45
+ ], GraphWithMultipleDependencies.prototype, "suffix", null);
46
+ __decorate([
47
+ (0, src_1.Provides)(),
48
+ __metadata("design:type", Function),
49
+ __metadata("design:paramtypes", []),
50
+ __metadata("design:returntype", String)
51
+ ], GraphWithMultipleDependencies.prototype, "noopDep", null);
52
+ GraphWithMultipleDependencies = __decorate([
53
+ (0, src_1.Graph)()
54
+ ], GraphWithMultipleDependencies);
55
+ exports.GraphWithMultipleDependencies = GraphWithMultipleDependencies;
56
+ //# sourceMappingURL=GraphWithMultipleDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphWithMultipleDependencies.js","sourceRoot":"","sources":["../../../test/fixtures/GraphWithMultipleDependencies.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAyD;AAGlD,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,iBAAW;IAE5D,MAAM,CAAC,MAAc,EAAE,MAAc;QACnC,OAAO,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAGD,MAAM,CAAC,OAAe;QACpB,OAAO,SAAS,OAAO,EAAE,CAAC;IAC5B,CAAC;IAGD,MAAM,CAAC,OAAe;QACpB,OAAO,SAAS,OAAO,EAAE,CAAC;IAC5B,CAAC;IAGD,OAAO;QACL,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAA;AAnBC;IAAC,IAAA,cAAQ,GAAE;;;;2DAGV;AAED;IAAC,IAAA,cAAQ,GAAE;;;;2DAGV;AAED;IAAC,IAAA,cAAQ,GAAE;;;;2DAGV;AAED;IAAC,IAAA,cAAQ,GAAE;;;;4DAGV;AAnBU,6BAA6B;IADzC,IAAA,WAAK,GAAE;GACK,6BAA6B,CAoBzC;AApBY,sEAA6B"}
@@ -0,0 +1,6 @@
1
+ import { ObjectGraph } from '../../src';
2
+ export declare class SubgraphWithCircularDependency extends ObjectGraph {
3
+ dep2(dep3: any): any;
4
+ dep3(dep2: any): any;
5
+ }
6
+ //# sourceMappingURL=SubgraphWithCircularDependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubgraphWithCircularDependency.d.ts","sourceRoot":"","sources":["../../../test/fixtures/SubgraphWithCircularDependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAGZ,MAAM,WAAW,CAAC;AAEnB,qBACa,8BAA+B,SAAQ,WAAW;IAE7D,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG;IAKpB,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG;CAGrB"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SubgraphWithCircularDependency = void 0;
13
+ const src_1 = require("../../src");
14
+ let SubgraphWithCircularDependency = class SubgraphWithCircularDependency extends src_1.ObjectGraph {
15
+ dep2(dep3) {
16
+ return dep3;
17
+ }
18
+ dep3(dep2) {
19
+ return dep2;
20
+ }
21
+ };
22
+ __decorate([
23
+ (0, src_1.Provides)(),
24
+ __metadata("design:type", Function),
25
+ __metadata("design:paramtypes", [Object]),
26
+ __metadata("design:returntype", Object)
27
+ ], SubgraphWithCircularDependency.prototype, "dep2", null);
28
+ __decorate([
29
+ (0, src_1.Provides)(),
30
+ __metadata("design:type", Function),
31
+ __metadata("design:paramtypes", [Object]),
32
+ __metadata("design:returntype", Object)
33
+ ], SubgraphWithCircularDependency.prototype, "dep3", null);
34
+ SubgraphWithCircularDependency = __decorate([
35
+ (0, src_1.Singleton)(),
36
+ (0, src_1.Graph)()
37
+ ], SubgraphWithCircularDependency);
38
+ exports.SubgraphWithCircularDependency = SubgraphWithCircularDependency;
39
+ //# sourceMappingURL=SubgraphWithCircularDependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubgraphWithCircularDependency.js","sourceRoot":"","sources":["../../../test/fixtures/SubgraphWithCircularDependency.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAKmB;AAGZ,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,iBAAW;IAE7D,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,CAAC,IAAS;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AATC;IAAC,IAAA,cAAQ,GAAE;;;;0DAGV;AAED;IAAC,IAAA,cAAQ,GAAE;;;;0DAGV;AATU,8BAA8B;IAD1C,IAAA,eAAS,GAAE;IAAE,IAAA,WAAK,GAAE;GACR,8BAA8B,CAU1C;AAVY,wEAA8B"}
@@ -12,7 +12,7 @@
12
12
  "@docusaurus/preset-classic": "2.2.0",
13
13
  "@mdx-js/react": "^1.6.22",
14
14
  "clsx": "^1.2.1",
15
- "enhancedocs-search": "^0.1.3",
15
+ "enhancedocs-search": "^0.1.5",
16
16
  "prism-react-renderer": "^1.3.5",
17
17
  "react": "^17.0.2",
18
18
  "react-dom": "^17.0.2"
@@ -5601,9 +5601,9 @@
5601
5601
  }
5602
5602
  },
5603
5603
  "node_modules/enhancedocs-search": {
5604
- "version": "0.1.3",
5605
- "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-0.1.3.tgz",
5606
- "integrity": "sha512-gKAZV8b9tosT0bKzw+3KOUULg0SthmrDxzdUPSUspIMiz+rtgMYpEr5ziX77BMOCI9CALruxTMckEzd+8eDSmQ==",
5604
+ "version": "0.1.5",
5605
+ "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-0.1.5.tgz",
5606
+ "integrity": "sha512-ChDJrxRSM07inFVrkMwmPYfBRzY5grJ8LI5cJAjHI3crNTf5hh4oJh4R/pZ9uN+tbmht9EkuLu+zpHu1Rdxfiw==",
5607
5607
  "dependencies": {
5608
5608
  "react-markdown": "^8.0.6",
5609
5609
  "react-modal": "^3.16.1",
@@ -17539,9 +17539,9 @@
17539
17539
  }
17540
17540
  },
17541
17541
  "enhancedocs-search": {
17542
- "version": "0.1.3",
17543
- "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-0.1.3.tgz",
17544
- "integrity": "sha512-gKAZV8b9tosT0bKzw+3KOUULg0SthmrDxzdUPSUspIMiz+rtgMYpEr5ziX77BMOCI9CALruxTMckEzd+8eDSmQ==",
17542
+ "version": "0.1.5",
17543
+ "resolved": "https://registry.npmjs.org/enhancedocs-search/-/enhancedocs-search-0.1.5.tgz",
17544
+ "integrity": "sha512-ChDJrxRSM07inFVrkMwmPYfBRzY5grJ8LI5cJAjHI3crNTf5hh4oJh4R/pZ9uN+tbmht9EkuLu+zpHu1Rdxfiw==",
17545
17545
  "requires": {
17546
17546
  "react-markdown": "^8.0.6",
17547
17547
  "react-modal": "^3.16.1",
@@ -19,7 +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.3",
22
+ "enhancedocs-search": "^0.1.5",
23
23
  "prism-react-renderer": "^1.3.5",
24
24
  "react": "^17.0.2",
25
25
  "react-dom": "^17.0.2"
@@ -1,7 +1,3 @@
1
- /**
2
- * @see https://docusaurus.io/docs/search#using-your-own-search
3
- */
4
-
5
1
  import React from 'react';
6
2
  import EnhancedSearch from 'enhancedocs-search';
7
3
 
@@ -16,6 +12,9 @@ export default function SearchBarWrapper(props) {
16
12
  accessToken: 'pk_b6c6de86cb63d0857b2a96b3f90ec2906be49358981ac67f'
17
13
  }
18
14
  }}
15
+ theme={{
16
+ primaryColor: '#B94BEE'
17
+ }}
19
18
  {...props}
20
19
  />
21
20
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-obsidian",
3
- "version": "0.0.41",
3
+ "version": "0.0.43",
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",
@@ -0,0 +1,27 @@
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
+
24
+ public clear() {
25
+ this.visitedNodes.clear();
26
+ }
27
+ }
@@ -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,43 @@
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
- return Reflect.get(this.graph, mangledPropertyKey, receiver)(proxiedGraph);
27
+ const resolved = Reflect.get(this.graph, mangledPropertyKey, receiver)(proxiedGraph);
28
+ circularDependenciesDetector.clear();
29
+ return resolved;
30
+ }
31
+
32
+ if (circularDependenciesDetector.hasCircularDependencies()) {
33
+ throw new Error(
34
+ `Could not resolve ${circularDependenciesDetector.firstDependencyName}`
35
+ + ` from ${circularDependenciesDetector.graphName} because of a circular dependency:`
36
+ + ` ${circularDependenciesDetector.getDependencies().join(' -> ')}`,
37
+ );
17
38
  }
18
39
 
19
- const results = this.getFromSubgraphs(property, receiver);
40
+ const results = this.getFromSubgraphs(property, circularDependenciesDetector, receiver);
20
41
  if (results.length === 1) return results[0];
21
42
  if (results.length > 1) {
22
43
  throw new Error(
@@ -27,10 +48,14 @@ export default class PropertyRetriever {
27
48
  return undefined;
28
49
  }
29
50
 
30
- private getFromSubgraphs(property: string, receiver: unknown): unknown[] {
51
+ private getFromSubgraphs(
52
+ property: string,
53
+ circularDependenciesDetector: CircularDependenciesDetector,
54
+ receiver: unknown,
55
+ ): unknown[] {
31
56
  const subgraphs = graphRegistry.getSubgraphs(this.graph);
32
57
  return subgraphs
33
- .map((subgraph: Graph) => subgraph.retrieve(property, receiver))
58
+ .map((subgraph: Graph) => subgraph.retrieve(property, receiver, circularDependenciesDetector))
34
59
  .filter((result) => result !== undefined);
35
60
  }
36
61
  }
@@ -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,30 @@
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
+ public getNodes(): string[] {
23
+ return this.visitPath;
24
+ }
25
+
26
+ public clear() {
27
+ this.visitedNodes.clear();
28
+ this.visitPath.length = 0;
29
+ }
30
+ }