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

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