-
Notifications
You must be signed in to change notification settings - Fork 21
feat(parser-adapter-asyncapi-yaml-3): add package for parser adapter … #5047
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| /**/*.js | ||
| /**/*.mjs | ||
| /**/*.cjs | ||
| /dist | ||
| /types | ||
| /config | ||
| /.nyc_output | ||
| /node_modules |
| 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 |
| 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"] | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| save-prefix="=" | ||
| save=false |
| 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. |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,92 @@ | ||||||||||||||||||
| # @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#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 | ||||||||||||||||||
| [ | ||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We also have 3.0.1 supported in the namespace apidom/packages/apidom-ns-asyncapi-3/src/media-types.ts Lines 36 to 43 in 831a533
|
||||||||||||||||||
| 'application/vnd.aai.asyncapi;version=3.0.0', | ||||||||||||||||||
| 'application/vnd.aai.asyncapi+yaml;version=3.0.0', | ||||||||||||||||||
| ] | ||||||||||||||||||
| ``` | ||||||||||||||||||
|
|
||||||||||||||||||
| ### detect | ||||||||||||||||||
|
|
||||||||||||||||||
| [Detection](https://github.com/swagger-api/apidom/blob/main/packages/apidom-parser-adapter-asyncapi-yaml-3/src/adapter.ts#L13) 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" | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| import path from 'node:path'; | ||
| import { nonMinimizeTrait, minimizeTrait } from './traits.config.js'; | ||
|
|
||
| const browser = { | ||
| mode: 'production', | ||
| entry: ['./src/adapter.ts'], | ||
| target: 'web', | ||
| performance: { | ||
| maxEntrypointSize: 2300000, | ||
| maxAssetSize: 2300000, | ||
| }, | ||
| output: { | ||
| path: path.resolve('./dist'), | ||
| filename: 'apidom-parser-adapter-asyncapi-yaml-3.browser.js', | ||
| libraryTarget: 'umd', | ||
| library: 'apidomParserAdapterAsyncApiYaml3', | ||
| }, | ||
| resolve: { | ||
| extensions: ['.ts', '.mjs', '.js', '.json'], | ||
| fallback: { | ||
| fs: false, | ||
| path: false, | ||
| }, | ||
| }, | ||
| module: { | ||
| rules: [ | ||
| { | ||
| test: /\.wasm$/, | ||
| loader: 'file-loader', | ||
| type: 'javascript/auto', | ||
| }, | ||
| { | ||
| test: /\.(ts|js)?$/, | ||
| exclude: /node_modules/, | ||
| use: { | ||
| loader: 'babel-loader', | ||
| options: { | ||
| babelrc: true, | ||
| rootMode: 'upward', | ||
| }, | ||
| }, | ||
| }, | ||
| ], | ||
| }, | ||
| ...nonMinimizeTrait, | ||
| }; | ||
|
|
||
| const browserMin = { | ||
| mode: 'production', | ||
| entry: ['./src/adapter.ts'], | ||
| target: 'web', | ||
| performance: { | ||
| maxEntrypointSize: 350000, | ||
| maxAssetSize: 350000, | ||
| }, | ||
| output: { | ||
| path: path.resolve('./dist'), | ||
| filename: 'apidom-parser-adapter-asyncapi-yaml-3.browser.min.js', | ||
| libraryTarget: 'umd', | ||
| library: 'apidomParserAdapterAsyncApiYaml3', | ||
| }, | ||
| resolve: { | ||
| extensions: ['.ts', '.mjs', '.js', '.json'], | ||
| fallback: { | ||
| fs: false, | ||
| path: false, | ||
| }, | ||
| }, | ||
| module: { | ||
| rules: [ | ||
| { | ||
| test: /\.wasm$/, | ||
| loader: 'file-loader', | ||
| type: 'javascript/auto', | ||
| }, | ||
| { | ||
| test: /\.(ts|js)?$/, | ||
| exclude: /node_modules/, | ||
| use: { | ||
| loader: 'babel-loader', | ||
| options: { | ||
| babelrc: true, | ||
| rootMode: 'upward', | ||
| }, | ||
| }, | ||
| }, | ||
| ], | ||
| }, | ||
| ...minimizeTrait, | ||
| }; | ||
|
|
||
| export default [browser, browserMin]; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| import webpack from 'webpack'; | ||
| import TerserPlugin from 'terser-webpack-plugin'; | ||
|
|
||
| export const nonMinimizeTrait = { | ||
| optimization: { | ||
| minimize: false, | ||
| usedExports: false, | ||
| concatenateModules: false, | ||
| }, | ||
| }; | ||
|
|
||
| export const minimizeTrait = { | ||
| plugins: [ | ||
| new webpack.LoaderOptionsPlugin({ | ||
| minimize: true, | ||
| }), | ||
| ], | ||
| optimization: { | ||
| minimizer: [ | ||
| new TerserPlugin({ | ||
| terserOptions: { | ||
| compress: { | ||
| warnings: false, | ||
| }, | ||
| output: { | ||
| comments: false, | ||
| }, | ||
| }, | ||
| }), | ||
| ], | ||
| }, | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we not do the integration in
apidom-lsonly when we're implementing the language services then?