1 | import { F as stubFalse, pipe } from 'ramda';
|
---|
2 | import { isString } from 'ramda-adjunct';
|
---|
3 | import { visit as astVisit, BREAK, mergeAllVisitors, cloneNode as cloneNodeDefault } from '@swagger-api/apidom-ast';
|
---|
4 | import { isElement, isMemberElement, isArrayElement, isStringElement, isBooleanElement, isLinkElement, isRefElement, isObjectElement, isNullElement, isNumberElement } from "../predicates/index.mjs";
|
---|
5 | import { cloneShallow } from "../clone/index.mjs";
|
---|
6 | export { BREAK, mergeAllVisitors };
|
---|
7 |
|
---|
8 | // getNodeType :: Node -> String
|
---|
9 | export const getNodeType = element => {
|
---|
10 | /*
|
---|
11 | * We're translating every possible higher element type to primitive minim type here.
|
---|
12 | * We're using polymorphism to recognize any higher element type as ObjectElement or ArrayElement.
|
---|
13 | * Using polymorphism allows us to assume any namespace.
|
---|
14 | *
|
---|
15 | * There is a problem with naming visitor methods described here: https://github.com/babel/babel/discussions/12874
|
---|
16 | */
|
---|
17 | return isObjectElement(element) ? 'ObjectElement' : isArrayElement(element) ? 'ArrayElement' : isMemberElement(element) ? 'MemberElement' : isStringElement(element) ? 'StringElement' : isBooleanElement(element) ? 'BooleanElement' : isNumberElement(element) ? 'NumberElement' : isNullElement(element) ? 'NullElement' : isLinkElement(element) ? 'LinkElement' : isRefElement(element) ? 'RefElement' : undefined;
|
---|
18 | };
|
---|
19 |
|
---|
20 | // cloneNode :: a -> a
|
---|
21 | export const cloneNode = node => {
|
---|
22 | if (isElement(node)) {
|
---|
23 | return cloneShallow(node);
|
---|
24 | }
|
---|
25 | return cloneNodeDefault(node);
|
---|
26 | };
|
---|
27 |
|
---|
28 | // isNode :: Node -> Boolean
|
---|
29 | export const isNode = pipe(getNodeType, isString);
|
---|
30 | export const keyMapDefault = {
|
---|
31 | ObjectElement: ['content'],
|
---|
32 | ArrayElement: ['content'],
|
---|
33 | MemberElement: ['key', 'value'],
|
---|
34 | StringElement: [],
|
---|
35 | BooleanElement: [],
|
---|
36 | NumberElement: [],
|
---|
37 | NullElement: [],
|
---|
38 | RefElement: [],
|
---|
39 | LinkElement: [],
|
---|
40 | Annotation: [],
|
---|
41 | Comment: [],
|
---|
42 | ParseResultElement: ['content'],
|
---|
43 | SourceMap: ['content']
|
---|
44 | };
|
---|
45 | export class PredicateVisitor {
|
---|
46 | result;
|
---|
47 | predicate;
|
---|
48 | returnOnTrue;
|
---|
49 | returnOnFalse;
|
---|
50 | constructor({
|
---|
51 | predicate = stubFalse,
|
---|
52 | returnOnTrue,
|
---|
53 | returnOnFalse
|
---|
54 | } = {}) {
|
---|
55 | this.result = [];
|
---|
56 | this.predicate = predicate;
|
---|
57 | this.returnOnTrue = returnOnTrue;
|
---|
58 | this.returnOnFalse = returnOnFalse;
|
---|
59 | }
|
---|
60 | enter(element) {
|
---|
61 | if (this.predicate(element)) {
|
---|
62 | this.result.push(element);
|
---|
63 | return this.returnOnTrue;
|
---|
64 | }
|
---|
65 | return this.returnOnFalse;
|
---|
66 | }
|
---|
67 | }
|
---|
68 | export const visit = (root,
|
---|
69 | // @ts-ignore
|
---|
70 | visitor, {
|
---|
71 | keyMap = keyMapDefault,
|
---|
72 | ...rest
|
---|
73 | } = {}) => {
|
---|
74 | // @ts-ignore
|
---|
75 | return astVisit(root, visitor, {
|
---|
76 | // @ts-ignore
|
---|
77 | keyMap,
|
---|
78 | // @ts-ignore
|
---|
79 | nodeTypeGetter: getNodeType,
|
---|
80 | nodePredicate: isNode,
|
---|
81 | nodeCloneFn: cloneNode,
|
---|
82 | ...rest
|
---|
83 | });
|
---|
84 | };
|
---|
85 |
|
---|
86 | // @ts-ignore
|
---|
87 | visit[Symbol.for('nodejs.util.promisify.custom')] = async (root,
|
---|
88 | // @ts-ignore
|
---|
89 | visitor, {
|
---|
90 | keyMap = keyMapDefault,
|
---|
91 | ...rest
|
---|
92 | } = {}) => {
|
---|
93 | // @ts-ignore
|
---|
94 | return astVisit[Symbol.for('nodejs.util.promisify.custom')](root, visitor, {
|
---|
95 | // @ts-ignore
|
---|
96 | keyMap,
|
---|
97 | // @ts-ignore
|
---|
98 | nodeTypeGetter: getNodeType,
|
---|
99 | nodePredicate: isNode,
|
---|
100 | nodeCloneFn: cloneNode,
|
---|
101 | ...rest
|
---|
102 | });
|
---|
103 | }; |
---|