Skip to content

Commit b435155

Browse files
committed
feat: add base predicates
Refs #60
1 parent 5cd9847 commit b435155

File tree

11 files changed

+627
-16
lines changed

11 files changed

+627
-16
lines changed

apidom/package-lock.json

Lines changed: 10 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apidom/packages/@types/minim.d.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ declare module 'minim' {
1515

1616
public children: ArrayElement;
1717

18-
constructor(content: Array<unknown>, meta?: Meta, attributes?: Attributes);
18+
constructor(content?: Array<unknown>, meta?: Meta, attributes?: Attributes);
1919

2020
toValue(): any;
2121
}
@@ -48,6 +48,12 @@ declare module 'minim' {
4848

4949
export class StringElement extends Element {}
5050

51+
export class NumberElement extends Element {}
52+
53+
export class NullElement extends Element {}
54+
55+
export class BooleanElement extends Element {}
56+
5157
export class ArrayElement extends Element {
5258
first: Element | undefined;
5359

@@ -61,10 +67,22 @@ declare module 'minim' {
6167
}
6268

6369
export class ObjectElement extends ArrayElement {
64-
constructor(content: Array<unknown>, meta?: Meta, attributes?: Attributes);
70+
constructor(content?: Array<unknown>, meta?: Meta, attributes?: Attributes);
6571

6672
get(key: string): any;
6773

6874
set(key: string | StringElement, value: any): void;
6975
}
76+
77+
export class MemberElement extends Element {
78+
constructor(key?: unknown, value?: unknown, meta?: Meta, attributes?: Attributes);
79+
80+
get key(): unknown;
81+
82+
set key(key: unknown);
83+
84+
get value(): unknown;
85+
86+
set value(value: unknown);
87+
}
7088
}

apidom/packages/apidom-ast/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"homepage": "https://github.com/swagger-api/apidom#readme",
3737
"dependencies": {
3838
"ramda": "=0.27.0",
39-
"ramda-adjunct": "=2.26.0",
39+
"ramda-adjunct": "=2.27.0",
4040
"stampit": "=4.3.1"
4141
},
4242
"devDependencies": {

apidom/packages/apidom-parser-adapter-asyncapi2-0-json/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"apidom-ast": "file:../apidom-ast",
3030
"apidom-ns-asyncapi2-0": "file:../apidom-ns-asyncapi2-0",
3131
"ramda": "=0.27.0",
32-
"ramda-adjunct": "=2.26.0",
32+
"ramda-adjunct": "=2.27.0",
3333
"stampit": "=4.3.1",
3434
"tree-sitter": "=0.16.1",
3535
"tree-sitter-json": "=0.16.0",

apidom/packages/apidom-parser-adapter-openapi3-1-json/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"apidom-ast": "file:../apidom-ast",
3030
"apidom-ns-openapi3-1": "file:../apidom-ns-openapi3-1",
3131
"ramda": "=0.27.0",
32-
"ramda-adjunct": "=2.26.0",
32+
"ramda-adjunct": "=2.27.0",
3333
"stampit": "=4.3.1",
3434
"tree-sitter": "=0.16.1",
3535
"tree-sitter-json": "=0.16.0",

apidom/packages/apidom-parser/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"dependencies": {
3030
"@types/ramda": "=0.27.6",
3131
"ramda": "=0.27.0",
32-
"ramda-adjunct": "=2.26.0",
32+
"ramda-adjunct": "=2.27.0",
3333
"stampit": "=4.3.1",
3434
"apidom": "file:../apidom"
3535
}

apidom/packages/apidom/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
"author": "Vladimír Gorej",
2828
"license": "Apache-2.0",
2929
"dependencies": {
30-
"minim": "=0.23.8"
30+
"minim": "=0.23.8",
31+
"ramda": "=0.27.0",
32+
"ramda-adjunct": "=2.27.0"
3133
}
3234
}

apidom/packages/apidom/src/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ export { default as CommentElement } from './elements/Comment';
77
export { default as ParseResultElement } from './elements/ParseResult';
88
export { default as SourceMapElement } from './elements/SourceMap';
99

10+
export {
11+
isElement,
12+
isStringElement,
13+
isNumberElement,
14+
isNullElement,
15+
isBooleanElement,
16+
isArrayElement,
17+
isObjectElement,
18+
isMemberElement,
19+
} from './predicates';
20+
1021
export const createNamespace = (namespacePlugin: NamespacePlugin): ApiDOMNamespace => {
1122
const namespace = new ApiDOMNamespace();
1223
namespace.use(namespacePlugin);
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import {
2+
Element,
3+
StringElement,
4+
NumberElement,
5+
NullElement,
6+
BooleanElement,
7+
ArrayElement,
8+
ObjectElement,
9+
MemberElement,
10+
} from 'minim';
11+
import { either, allPass, is, both, has, curry, pathSatisfies, pathEq } from 'ramda';
12+
import { invokeArgs, isFunction } from 'ramda-adjunct';
13+
14+
// hasGetter :: String -> Object -> Boolean
15+
const hasGetter = curry((name: string, obj: Record<string, unknown>): boolean => {
16+
// @ts-ignore
17+
const descriptor = Object.getOwnPropertyDescriptor(obj, name);
18+
19+
return pathSatisfies(isFunction, ['get'], descriptor);
20+
});
21+
22+
// hasMethod :: String -> Object -> Boolean
23+
const hasMethod = curry((name: string, obj: Record<string, unknown>): boolean =>
24+
pathSatisfies(isFunction, [name], obj),
25+
);
26+
27+
// hasBasicElementProps :: Object -> Boolean
28+
const hasBasicElementProps = both(has('element'), has('content'));
29+
30+
// primitiveEq :: * -> Object -> Boolean
31+
const primitiveEq = curry(
32+
(val: undefined, obj: Record<string, unknown>): boolean =>
33+
invokeArgs(['primitive'], [], obj) === val,
34+
);
35+
36+
// isElementType :: String -> Boolean
37+
const isElementType = pathEq(['element']);
38+
39+
// @ts-ignore
40+
export const isElement = either(is(Element), both(hasBasicElementProps, primitiveEq(undefined)));
41+
42+
export const isStringElement = either(
43+
is(StringElement),
44+
allPass([
45+
hasBasicElementProps,
46+
// @ts-ignore
47+
isElementType('string'),
48+
// @ts-ignore
49+
primitiveEq('string'),
50+
// @ts-ignore
51+
hasGetter('length'),
52+
]),
53+
);
54+
55+
export const isNumberElement = either(
56+
is(NumberElement),
57+
// @ts-ignore
58+
allPass([hasBasicElementProps, isElementType('number'), primitiveEq('number')]),
59+
);
60+
61+
export const isNullElement = either(
62+
is(NullElement),
63+
// @ts-ignore
64+
allPass([hasBasicElementProps, isElementType('null'), primitiveEq('null')]),
65+
);
66+
67+
export const isBooleanElement = either(
68+
is(BooleanElement),
69+
// @ts-ignore
70+
allPass([hasBasicElementProps, isElementType('boolean'), primitiveEq('boolean')]),
71+
);
72+
73+
export const isArrayElement = either(
74+
is(ArrayElement),
75+
allPass([
76+
hasBasicElementProps,
77+
// @ts-ignore
78+
isElementType('array'),
79+
// @ts-ignore
80+
primitiveEq('array'),
81+
// @ts-ignore
82+
hasMethod('push'),
83+
// @ts-ignore
84+
hasMethod('unshift'),
85+
// @ts-ignore
86+
hasMethod('map'),
87+
// @ts-ignore
88+
hasMethod('reduce'),
89+
]),
90+
);
91+
92+
export const isObjectElement = either(
93+
is(ObjectElement),
94+
allPass([
95+
hasBasicElementProps,
96+
// @ts-ignore
97+
isElementType('object'),
98+
// @ts-ignore
99+
primitiveEq('object'),
100+
// @ts-ignore
101+
hasMethod('keys'),
102+
// @ts-ignore
103+
hasMethod('values'),
104+
// @ts-ignore
105+
hasMethod('items'),
106+
]),
107+
);
108+
109+
export const isMemberElement = either(
110+
is(MemberElement),
111+
allPass([
112+
hasBasicElementProps,
113+
// @ts-ignore
114+
isElementType('member'),
115+
// @ts-ignore
116+
primitiveEq(undefined),
117+
// @ts-ignore
118+
hasGetter('key'),
119+
// @ts-ignore
120+
hasGetter('value'),
121+
]),
122+
);

apidom/packages/apidom/test/.eslintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
"mocha/no-top-level-hooks": 2,
2525
"mocha/no-identical-title": 2,
2626
"mocha/no-nested-tests": 2,
27-
"mocha/no-exclusive-tests": 2
27+
"mocha/no-exclusive-tests": 2,
28+
"max-classes-per-file": 0,
2829
},
2930
"overrides": [{
3031
"files": ["mocha-bootstrap.js"],

0 commit comments

Comments
 (0)