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
19 changes: 19 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/apidom-ls/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-rc.3",
"@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-rc.3",
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-rc.3",
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.0.0-rc.3",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.3",
"@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-rc.3",
"@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-rc.3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,14 @@ export class DefaultValidationService implements ValidationService {

let processedText;
const nameSpace = await findNamespace(text, this.settings?.defaultContentLanguage);
// TODO: Turned off validation, because we will implement it in the future.
if (
nameSpace.namespace === 'asyncapi' &&
nameSpace.version &&
['3.0.0', '3.0.1'].includes(nameSpace.version)
) {
return [];
}
let docNs: string = nameSpace.namespace;
// no API document has been parsed
if (result.annotations) {
Expand Down
14 changes: 14 additions & 0 deletions packages/apidom-ls/src/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import * as openapi31xAdapterJson from '@swagger-api/apidom-parser-adapter-opena
import * as openapi31xAdapterYaml from '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1';
import * as asyncapi2AdapterJson from '@swagger-api/apidom-parser-adapter-asyncapi-json-2';
import * as asyncapi2AdapterYaml from '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2';
import * as asyncapi3AdapterYaml from '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3';
import * as adsAdapterJson from '@swagger-api/apidom-parser-adapter-api-design-systems-json';
import * as adsAdapterYaml from '@swagger-api/apidom-parser-adapter-api-design-systems-yaml';
import * as adapterJson from '@swagger-api/apidom-parser-adapter-json';
Expand Down Expand Up @@ -836,6 +837,19 @@ export async function findNamespace(
};
}

if (await asyncapi3AdapterYaml.detect(text)) {
const asyncapi3YamlMatch = text.match(asyncapi3AdapterYaml.detectionRegExp)!;
const groups = asyncapi3YamlMatch.groups!;
const version = groups.version_json ?? groups.version_yaml;

return {
namespace: 'asyncapi',
version,
format: 'YAML',
mediaType: asyncapi3AdapterYaml.mediaTypes.findBy(version, 'yaml'),
};
}

if (await openapi2AdapterJson.detect(text)) {
const openapi2JsonMatch = text.match(openapi2AdapterJson.detectionRegExp)!;
const groups = openapi2JsonMatch.groups!;
Expand Down
4 changes: 3 additions & 1 deletion packages/apidom-ls/test/hover-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,9 @@ describe('apidom-ls-hover-provider', function () {
logLevel,
};

it('test hover ref provider', async function () {
// TODO: Flaky test.
// eslint-disable-next-line mocha/no-skipped-tests
xit('test hover ref provider', async function () {
let languageService: LanguageService = getLanguageService(contextAsyncRef);

try {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import { Mixin } from 'ts-mixer';
import { test } from 'ramda';
import { ObjectElement } from '@swagger-api/apidom-core';
import { isReferenceLikeElement } from '@swagger-api/apidom-ns-asyncapi-2';

import PatternedFieldsVisitor, {
PatternedFieldsVisitorOptions,
SpecPath,
} from '../../generics/PatternedFieldsVisitor.ts';
import MapVisitor, { SpecPath, MapVisitorOptions } from '../../generics/MapVisitor.ts';
import FallbackVisitor, { FallbackVisitorOptions } from '../../FallbackVisitor.ts';
import MessagesElement from '../../../../elements/Messages.ts';
import ReferenceElement from '../../../../elements/Reference.ts';
Expand All @@ -15,14 +11,12 @@ import { isReferenceElement } from '../../../../predicates.ts';
/**
* @public
*/
export interface MessagesVisitorOptions
extends PatternedFieldsVisitorOptions,
FallbackVisitorOptions {}
export interface MessagesVisitorOptions extends MapVisitorOptions, FallbackVisitorOptions {}

/**
* @public
*/
class MessagesVisitor extends Mixin(PatternedFieldsVisitor, FallbackVisitor) {
class MessagesVisitor extends Mixin(MapVisitor, FallbackVisitor) {
declare public readonly element: MessagesElement;

declare protected readonly specPath: SpecPath<
Expand All @@ -41,12 +35,10 @@ class MessagesVisitor extends Mixin(PatternedFieldsVisitor, FallbackVisitor) {
: ['document', 'objects', 'Message'];
};
this.canSupportSpecificationExtensions = false;
// @ts-ignore
this.fieldPatternPredicate = test(/^[A-Za-z0-9_-]+$/);
}

ObjectElement(objectElement: ObjectElement) {
const result = PatternedFieldsVisitor.prototype.ObjectElement.call(this, objectElement);
const result = MapVisitor.prototype.ObjectElement.call(this, objectElement);

// @ts-ignore
this.element.filter(isReferenceElement).forEach((referenceElement: ReferenceElement) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import { Mixin } from 'ts-mixer';
import { test } from 'ramda';
import { ObjectElement } from '@swagger-api/apidom-core';
import { isReferenceLikeElement } from '@swagger-api/apidom-ns-asyncapi-2';

import PatternedFieldsVisitor, {
PatternedFieldsVisitorOptions,
SpecPath,
} from '../../generics/PatternedFieldsVisitor.ts';
import MapVisitor, { MapVisitorOptions, SpecPath } from '../../generics/MapVisitor.ts';
import FallbackVisitor, { FallbackVisitorOptions } from '../../FallbackVisitor.ts';
import OperationsElement from '../../../../elements/Operations.ts';
import ReferenceElement from '../../../../elements/Reference.ts';
Expand All @@ -15,14 +11,12 @@ import { isReferenceElement } from '../../../../predicates.ts';
/**
* @public
*/
export interface OperationsVisitorOptions
extends PatternedFieldsVisitorOptions,
FallbackVisitorOptions {}
export interface OperationsVisitorOptions extends MapVisitorOptions, FallbackVisitorOptions {}

/**
* @public
*/
class OperationsVisitor extends Mixin(PatternedFieldsVisitor, FallbackVisitor) {
class OperationsVisitor extends Mixin(MapVisitor, FallbackVisitor) {
declare public readonly element: OperationsElement;

declare protected readonly specPath: SpecPath<
Expand All @@ -41,12 +35,10 @@ class OperationsVisitor extends Mixin(PatternedFieldsVisitor, FallbackVisitor) {
: ['document', 'objects', 'Operation'];
};
this.canSupportSpecificationExtensions = false;
// @ts-ignore
this.fieldPatternPredicate = test(/^[A-Za-z0-9_-]+$/);
}

ObjectElement(objectElement: ObjectElement) {
const result = PatternedFieldsVisitor.prototype.ObjectElement.call(this, objectElement);
const result = MapVisitor.prototype.ObjectElement.call(this, objectElement);

// @ts-ignore
this.element.filter(isReferenceElement).forEach((referenceElement: ReferenceElement) => {
Expand Down
8 changes: 8 additions & 0 deletions packages/apidom-parser-adapter-asyncapi-yaml-3/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**/*.js
/**/*.mjs
/**/*.cjs
/dist
/types
/config
/.nyc_output
/node_modules
7 changes: 7 additions & 0 deletions packages/apidom-parser-adapter-asyncapi-yaml-3/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/src/**/*.mjs
/src/**/*.cjs
/test/**/*.mjs
/dist
/types
/NOTICE
/swagger-api-apidom-parser-adapter-asyncapi-yaml-3-*.tgz
8 changes: 8 additions & 0 deletions packages/apidom-parser-adapter-asyncapi-yaml-3/.mocharc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"extensions": ["ts"],
"loader": "ts-node/esm",
"recursive": true,
"spec": "test/**/*.ts",
"file": ["test/mocha-bootstrap.ts"],
"ignore": ["test/perf/**/*.ts"]
}
2 changes: 2 additions & 0 deletions packages/apidom-parser-adapter-asyncapi-yaml-3/.npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
save-prefix="="
save=false
4 changes: 4 additions & 0 deletions packages/apidom-parser-adapter-asyncapi-yaml-3/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Change Log

All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
94 changes: 94 additions & 0 deletions packages/apidom-parser-adapter-asyncapi-yaml-3/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# @swagger-api/apidom-parser-adapter-asyncapi-yaml-3

`@swagger-api/apidom-parser-adapter-asyncapi-yaml-3` is a parser adapter for following AsyncAPI specification versions defined in [YAML format](https://yaml.org/spec/1.2/spec.html):

- [AsyncAPI 3.0.0 specification](https://github.com/asyncapi/spec/blob/v3.0.0/spec/asyncapi.md)

Under the hood this adapter uses [@swagger-api/apidom-parser-adapter-yaml-1-2](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser-adapter-yaml-1-2)
to parse a source string into generic ApiDOM in [base ApiDOM namespace](https://github.com/swagger-api/apidom/tree/main/packages/apidom-core#base-namespace)

[//]: # (// TODO: The below link does not have content yet.)
which is then refracted with [AsyncApi 3.x.y Refractors](https://github.com/swagger-api/apidom/tree/main/packages/apidom-ns-asyncapi-3#refractors).

## Installation

After [prerequisites](https://github.com/swagger-api/apidom/blob/main/README.md#prerequisites) for installing this package are satisfied, you can install it
via [npm CLI](https://docs.npmjs.com/cli) by running the following command:

```sh
$ npm install @swagger-api/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3
```

## Parser adapter API

This parser adapter is fully compatible with parser adapter interface required by [@swagger-api/apidom-parser](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser#mounting-parser-adapters)
and implements all required properties.

### mediaTypes

Defines list of media types that this parser adapter recognizes.

```js
[
'application/vnd.aai.asyncapi;version=3.0.0',
'application/vnd.aai.asyncapi+yaml;version=3.0.0',
'application/vnd.aai.asyncapi;version=3.0.1',
'application/vnd.aai.asyncapi+yaml;version=3.0.1',
]
```

### detect

[Detection](https://github.com/swagger-api/apidom/blob/main/packages/apidom-parser-adapter-asyncapi-yaml-3/src/adapter.ts#L21) is based on a regular expression matching required AsyncApi 3.x.y specification symbols in YAML format.

### namespace

[//]: # (// TODO: Below link does not have content yet.)
This adapter exposes an instance of [AsyncApi 3.x.y ApiDOM namespace](https://github.com/swagger-api/apidom/tree/main/packages/apidom-ns-asyncapi-3#asyncapi-2xy-namespace).

### parse

`parse` function consumes various options as a second argument. Here is a list of these options:

Option | Type | Default | Description
--- | --- | --- | ---
<a name="specObj"></a>`specObj` | `Object` | [Specification Object](https://github.com/swagger-api/apidom/blob/main/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts) | This specification object drives the YAML AST transformation to AsyncAPI 3.x ApiDOM namespace.
<a name="sourceMap"></a>`sourceMap` | `Boolean` | `false` | Indicate whether to generate source maps.
<a name="refractorOpts"></a>`refractorOpts` | `Object` | `{}` | Refractor options are [passed to refractors](https://github.com/swagger-api/apidom/tree/main/packages/apidom-ns-asyncapi-3#refractor-plugins) during refracting phase.

All unrecognized arbitrary options will be ignored.

## Usage

This parser adapter can be used directly or indirectly via [@swagger-api/apidom-parser](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser).

### Direct usage

During direct usage you don't need to provide `mediaType` as the `parse` function is already pre-bound
with [supported media types](#mediatypes).

```js
import { parse, detect } from '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3';

// detecting
await detect('asyncapi: 3.0.0'); // => true
await detect('test'); // => false

// parsing
const parseResult = await parse('asyncapi: 3.0.0', { sourceMap: true });
```

### Indirect usage

You can omit the `mediaType` option here, but please read [Word on detect vs mediaTypes](https://github.com/swagger-api/apidom/tree/main/packages/apidom-parser#word-on-detect-vs-mediatypes) before you do so.

```js
import ApiDOMParser from '@swagger-api/apidom-parser';
import * as asyncApiYamlAdapter from '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3';

const parser = new ApiDOMParser();

parser.use(asyncApiYamlAdapter);

const parseResult = await parser.parse('asyncapi: 3.0.0', { mediaType: asyncApiYamlAdapter.mediaTypes.latest('yaml') });
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
"extends": "../../../../api-extractor.json",
"mainEntryPointFilePath": "../../types/adapter.d.ts"
}
Loading
Loading