source: node_modules/@swagger-api/apidom-core/es/traversal/visitor.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 { F as stubFalse, pipe } from 'ramda';
2import { isString } from 'ramda-adjunct';
3import { visit as astVisit, BREAK, mergeAllVisitors, cloneNode as cloneNodeDefault } from '@swagger-api/apidom-ast';
4import { isElement, isMemberElement, isArrayElement, isStringElement, isBooleanElement, isLinkElement, isRefElement, isObjectElement, isNullElement, isNumberElement } from "../predicates/index.mjs";
5import { cloneShallow } from "../clone/index.mjs";
6export { BREAK, mergeAllVisitors };
7
8// getNodeType :: Node -> String
9export 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
21export const cloneNode = node => {
22 if (isElement(node)) {
23 return cloneShallow(node);
24 }
25 return cloneNodeDefault(node);
26};
27
28// isNode :: Node -> Boolean
29export const isNode = pipe(getNodeType, isString);
30export 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};
45export 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}
68export const visit = (root,
69// @ts-ignore
70visitor, {
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
87visit[Symbol.for('nodejs.util.promisify.custom')] = async (root,
88// @ts-ignore
89visitor, {
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};
Note: See TracBrowser for help on using the repository browser.