source: node_modules/@swagger-api/apidom-core/es/transcluder/Transcluder.mjs

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 3.1 KB
Line 
1import { isUndefined } from 'ramda-adjunct';
2import { isObjectElement, isArrayElement, isMemberElement } from "../predicates/index.mjs";
3const computeEdges = (element, edges = new WeakMap()) => {
4 if (isMemberElement(element)) {
5 // @ts-ignore
6 edges.set(element.key, element);
7 // @ts-ignore
8 computeEdges(element.key, edges);
9 // @ts-ignore
10 edges.set(element.value, element);
11 // @ts-ignore
12 computeEdges(element.value, edges);
13 } else {
14 element.children.forEach(childElement => {
15 edges.set(childElement, element);
16 computeEdges(childElement, edges);
17 });
18 }
19 return edges;
20};
21const transcludeChildOfMemberElement = (search, replace, edges) => {
22 const memberElement = edges.get(search);
23 if (!isMemberElement(memberElement)) {
24 return;
25 }
26 if (memberElement.key === search) {
27 memberElement.key = replace;
28 edges.delete(search);
29 edges.set(replace, memberElement);
30 }
31 if (memberElement.value === search) {
32 memberElement.value = replace;
33 edges.delete(search);
34 edges.set(replace, memberElement);
35 }
36};
37const transcludeChildOfObjectElement = (search, replace, edges) => {
38 const objectElement = edges.get(search);
39 if (!isObjectElement(objectElement)) {
40 return;
41 }
42 objectElement.content = objectElement.map((value, key, member) => {
43 if (member === search) {
44 edges.delete(search);
45 edges.set(replace, objectElement);
46 return replace;
47 }
48 return member;
49 });
50};
51const transcludeChildOfArrayElement = (search, replace, edges) => {
52 const arrayElement = edges.get(search);
53 if (!isArrayElement(arrayElement)) {
54 return;
55 }
56 arrayElement.content = arrayElement.map(element => {
57 if (element === search) {
58 edges.delete(search);
59 edges.set(replace, arrayElement);
60 return replace;
61 }
62 return element;
63 });
64};
65
66/**
67 * This is a mutating stamp. If you don't want your Element to be mutated,
68 * clone in before passing it to initializer of this stamp.
69 */
70
71class Transcluder {
72 element;
73 edges;
74 constructor({
75 element
76 }) {
77 this.element = element;
78 }
79 transclude(search, replace) {
80 var _this$edges;
81 // shortcut 1. - replacing entire ApiDOM tree
82 if (search === this.element) return replace;
83 // shortcut 2. - replacing nothing
84 if (search === replace) return this.element;
85 this.edges = (_this$edges = this.edges) !== null && _this$edges !== void 0 ? _this$edges : computeEdges(this.element);
86 const parent = this.edges.get(search);
87 if (isUndefined(parent)) {
88 return undefined;
89 }
90
91 /**
92 * This predicate must be first because ObjectElement extends ArrayElement.
93 * isArrayElement returns true for ObjectElements.
94 * (classical problems with polymorphism)
95 */
96 if (isObjectElement(parent)) {
97 // @ts-ignore
98 transcludeChildOfObjectElement(search, replace, this.edges);
99 } else if (isArrayElement(parent)) {
100 transcludeChildOfArrayElement(search, replace, this.edges);
101 } else if (isMemberElement(parent)) {
102 transcludeChildOfMemberElement(search, replace, this.edges);
103 }
104 return this.element;
105 }
106}
107export default Transcluder;
Note: See TracBrowser for help on using the repository browser.