Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apidom/packages/apidom-ls/src/utils/utils.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// @ts-ignore
import { isMemberElement, isObjectElement, traverse } from 'apidom';
import { Element, ObjectElement, MemberElement } from 'minim';
import { isOpenApiApi3_1Element } from 'apidom-ns-openapi-3-1';
import { isOpenApi3_1Element } from 'apidom-ns-openapi-3-1';
import { CompletionItem, CompletionItemKind, InsertTextFormat } from 'vscode-languageserver-types';

export class SourceMap {
Expand Down Expand Up @@ -132,7 +132,7 @@ export function addMetadataMapping(root: Element): void {
}

export function addMetadata(element: Element): void {
if (isOpenApiApi3_1Element(element)) {
if (isOpenApi3_1Element(element)) {
element.attributes.set('completion', ['info', 'paths']);
}
}
Expand Down
2 changes: 1 addition & 1 deletion apidom/packages/apidom-ns-openapi-3-1/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export {
} from 'apidom';

export {
isOpenApiApi3_1Element,
isOpenApi3_1Element,
isContactElement,
isLicenseElement,
isInfoElement,
Expand Down
80 changes: 79 additions & 1 deletion apidom/packages/apidom-ns-openapi-3-1/src/predicates.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { allPass, either, is } from 'ramda';
import { createPredicate } from 'apidom';

import CallbackElement from './elements/Callback';
import ComponentsElement from './elements/Components';
import ContactElement from './elements/Contact';
import InfoElement from './elements/Info';
Expand All @@ -14,8 +15,13 @@ import PathsElement from './elements/Paths';
import PathItemElement from './elements/PathItem';
import OperationElement from './elements/Operation';
import ReferenceElement from './elements/Reference';
import ExternalDocumentationElement from './elements/ExternalDocumentation';
import ParameterElement from './elements/Parameter';
import RequestBodyElement from './elements/RequestBody';
import ResponsesElement from './elements/Responses';
import SecurityRequirementElement from './elements/SecurityRequirement';

export const isOpenApiApi3_1Element = createPredicate(
export const isOpenApi3_1Element = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq, hasClass }) => {
const isElementTypeOpenApi3_1 = isElementType('openApi3-1');
const primitiveEqObject = primitiveEq('object');
Expand Down Expand Up @@ -88,6 +94,30 @@ export const isComponentsElement = createPredicate(
},
);

export const isCallbackElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeComponents = isElementType('callback');
const primitiveEqObject = primitiveEq('object');

return either(
is(CallbackElement),
allPass([hasBasicElementProps, isElementTypeComponents, primitiveEqObject]),
);
},
);

export const isExternalDocumentationElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeComponents = isElementType('externalDocumentation');
const primitiveEqObject = primitiveEq('object');

return either(
is(ExternalDocumentationElement),
allPass([hasBasicElementProps, isElementTypeComponents, primitiveEqObject]),
);
},
);

export const isSchemaElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeSchema = isElementType('schema');
Expand Down Expand Up @@ -160,6 +190,18 @@ export const isOperationElement = createPredicate(
},
);

export const isParameterElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeOperation = isElementType('parameter');
const primitiveEqObject = primitiveEq('object');

return either(
is(ParameterElement),
allPass([hasBasicElementProps, isElementTypeOperation, primitiveEqObject]),
);
},
);

export const isReferenceElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeReference = isElementType('reference');
Expand All @@ -171,3 +213,39 @@ export const isReferenceElement = createPredicate(
);
},
);

export const isRequestBodyElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeReference = isElementType('requestBody');
const primitiveEqObject = primitiveEq('object');

return either(
is(RequestBodyElement),
allPass([hasBasicElementProps, isElementTypeReference, primitiveEqObject]),
);
},
);

export const isResponsesBodyElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeReference = isElementType('responses');
const primitiveEqObject = primitiveEq('object');

return either(
is(ResponsesElement),
allPass([hasBasicElementProps, isElementTypeReference, primitiveEqObject]),
);
},
);

export const isSecurityRequirementElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
const isElementTypeReference = isElementType('securityRequirement');
const primitiveEqObject = primitiveEq('object');

return either(
is(SecurityRequirementElement),
allPass([hasBasicElementProps, isElementTypeReference, primitiveEqObject]),
);
},
);
7 changes: 2 additions & 5 deletions apidom/packages/apidom-ns-openapi-3-1/src/refractor/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,10 @@ import specification from './specification';

const refract = <T extends Element>(
value: any,
{
specPath = ['visitors', 'document', 'objects', 'OpenApi', '$visitor'],
specObj = specification,
} = {},
{ specPath = ['visitors', 'document', 'objects', 'OpenApi', '$visitor'] } = {},
): T => {
const element = baseRefract(value);
const resolvedSpec = dereference(specObj);
const resolvedSpec = dereference(specification);
const visitor = invokeArgs(specPath, [], resolvedSpec);

// @ts-ignore
Expand Down
64 changes: 62 additions & 2 deletions apidom/packages/apidom-ns-openapi-3-1/src/traversal/visitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,72 @@ import {
keyMap as keyMapBase,
getNodeType as getNodeTypeBase,
} from 'apidom';
import { isReferenceElement } from '../predicates';
import {
isCallbackElement,
isComponentsElement,
isContactElement,
isExternalDocumentationElement,
isInfoElement,
isLicenseElement,
isOpenapiElement,
isOpenApi3_1Element,
isOperationElement,
isParameterElement,
isPathItemElement,
isPathsElement,
isReferenceElement,
isRequestBodyElement,
isResponsesBodyElement,
isSchemaElement,
isSecurityRequirementElement,
isServerElement,
isServerVariableElement,
} from '../predicates';

export { BREAK } from 'apidom';

export const getNodeType = <T extends Element>(element: T): string | undefined => {
return isReferenceElement(element) ? 'reference' : getNodeTypeBase(element);
/* eslint-disable no-nested-ternary */
return isCallbackElement(element)
? 'callback'
: isComponentsElement(element)
? 'components'
: isContactElement(element)
? 'contact'
: isExternalDocumentationElement(element)
? 'externalDocumentation'
: isInfoElement(element)
? 'info'
: isLicenseElement(element)
? 'license'
: isOpenapiElement(element)
? 'openapi'
: isOpenApi3_1Element(element)
? 'openApi3-1'
: isOperationElement(element)
? 'operation'
: isParameterElement(element)
? 'parameter'
: isPathItemElement(element)
? 'pathItem'
: isPathsElement(element)
? 'paths'
: isReferenceElement(element)
? 'reference'
: isRequestBodyElement(element)
? 'requestBody'
: isResponsesBodyElement(element)
? 'responses'
: isSchemaElement(element)
? 'schema'
: isSecurityRequirementElement(element)
? 'securityRequirement'
: isServerElement(element)
? 'server'
: isServerVariableElement(element)
? 'serverVariable'
: getNodeTypeBase(element);
/* eslint-enable */
};

export const keyMapDefault = {
Expand Down
22 changes: 11 additions & 11 deletions apidom/packages/apidom-ns-openapi-3-1/test/predicates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
isContactElement,
isComponentsElement,
isOpenapiElement,
isOpenApiApi3_1Element,
isOpenApi3_1Element,
isServerElement,
isServerVariableElement,
isPathsElement,
Expand Down Expand Up @@ -36,26 +36,26 @@ describe('predicates', function () {
specify('should return true', function () {
const element = new OpenApi3_1Element();

assert.isTrue(isOpenApiApi3_1Element(element));
assert.isTrue(isOpenApi3_1Element(element));
});
});

context('given subtype instance value', function () {
specify('should return true', function () {
class OpenApi3_1SubElement extends OpenApi3_1Element {}

assert.isTrue(isOpenApiApi3_1Element(new OpenApi3_1SubElement()));
assert.isTrue(isOpenApi3_1Element(new OpenApi3_1SubElement()));
});
});

context('given non OpenApi3_1SubElement instance value', function () {
specify('should return false', function () {
assert.isFalse(isOpenApiApi3_1Element(1));
assert.isFalse(isOpenApiApi3_1Element(null));
assert.isFalse(isOpenApiApi3_1Element(undefined));
assert.isFalse(isOpenApiApi3_1Element({}));
assert.isFalse(isOpenApiApi3_1Element([]));
assert.isFalse(isOpenApiApi3_1Element('string'));
assert.isFalse(isOpenApi3_1Element(1));
assert.isFalse(isOpenApi3_1Element(null));
assert.isFalse(isOpenApi3_1Element(undefined));
assert.isFalse(isOpenApi3_1Element({}));
assert.isFalse(isOpenApi3_1Element([]));
assert.isFalse(isOpenApi3_1Element('string'));
});
});

Expand Down Expand Up @@ -83,8 +83,8 @@ describe('predicates', function () {
},
};

assert.isTrue(isOpenApiApi3_1Element(openApi3_1ElementDuck));
assert.isFalse(isOpenApiApi3_1Element(openApi3_1ElementSwan));
assert.isTrue(isOpenApi3_1Element(openApi3_1ElementDuck));
assert.isFalse(isOpenApi3_1Element(openApi3_1ElementSwan));
});
});

Expand Down