Skip to content

Commit 387d3ac

Browse files
committed
feat: adding endpoint's extensions
Signed-off-by: Pawel Psztyc <[email protected]>
1 parent 4032bec commit 387d3ac

File tree

9 files changed

+182
-75
lines changed

9 files changed

+182
-75
lines changed

apis/arc-demo-api/arc-demo-api.raml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ resourceTypes:
105105
traits:
106106
Paginated: !include traits/pagination.raml
107107
Adminable: !include traits/adminable.raml
108+
RateLimited: !include traits/rate-limited.raml
108109
securitySchemes:
109110
oauth_2_0: !include securitySchemes/oauth_2_0.raml
110111
x-custom: !include securitySchemes/x-custom.raml
@@ -162,6 +163,8 @@ securedBy: [basic]
162163
description: To test enum values in the URI parameters for global type declaration.
163164
/people:
164165
displayName: People
166+
type: RequestErrorResponse
167+
is: [RateLimited]
165168
get:
166169
(annotationTest):
167170
displayName: List people
@@ -284,6 +287,7 @@ securedBy: [basic]
284287
/products:
285288
displayName: Products
286289
description: The API is to be used to access data about the products.
290+
type: RequestErrorResponse
287291
post:
288292
displayName: Create product
289293
description: |
@@ -328,6 +332,7 @@ securedBy: [basic]
328332
description: The request has been rejected. Probably the product already exists in the datastore.
329333
/orgs:
330334
/{orgId}:
335+
is: [RateLimited]
331336
get:
332337
displayName: Get organization
333338
description: Returns an organization info.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#%RAML 1.0 Trait
2+
3+
displayName: RateLimited
4+
usage: TO be used when the API has a rate limit on the API gateway.
5+
headers:
6+
x-rate-client-id:
7+
description: he client ID to use for the rate limit.
8+
example: 5757gh76
9+
required: true

package-lock.json

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

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@api-components/amf-helper-mixin",
33
"description": "A mixin with common functions user by most AMF components to compute AMF values",
4-
"version": "4.5.14",
4+
"version": "4.5.15",
55
"license": "Apache-2.0",
66
"main": "index.js",
77
"module": "index.js",
@@ -38,7 +38,7 @@
3838
"eslint": "^7.32.0",
3939
"eslint-config-prettier": "^8.3.0",
4040
"husky": "^7.0.2",
41-
"lint-staged": "^11.1.2",
41+
"lint-staged": "^11.2.0",
4242
"lit-element": "^2.5.1",
4343
"lit-html": "^1.4.1",
4444
"sinon": "^11.1.2",

src/AmfSerializer.js

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ import { AmfHelperMixin, expandKey, findAmfType, getArrayItems } from "./AmfHelp
4949
/** @typedef {import('./types').ApiDataNodeUnion} ApiDataNodeUnion */
5050
/** @typedef {import('./types').ApiDocumentSourceMaps} ApiDocumentSourceMaps */
5151
/** @typedef {import('./types').ApiSynthesizedField} ApiSynthesizedField */
52+
/** @typedef {import('./types').ApiParametrizedDeclaration} ApiParametrizedDeclaration */
5253
/** @typedef {import('./types').ApiParametrizedTrait} ApiParametrizedTrait */
54+
/** @typedef {import('./types').ApiParametrizedResourceType} ApiParametrizedResourceType */
5355
/** @typedef {import('./types').ApiVariableValue} ApiVariableValue */
5456
/** @typedef {import('./types').ApiAbstractDeclaration} ApiAbstractDeclaration */
5557
/** @typedef {import('./types').ShapeProcessingOptions} ShapeProcessingOptions */
@@ -106,7 +108,9 @@ import { AmfHelperMixin, expandKey, findAmfType, getArrayItems } from "./AmfHelp
106108
/** @typedef {import('./amf').Tag} Tag */
107109
/** @typedef {import('./amf').DocumentSourceMaps} DocumentSourceMaps */
108110
/** @typedef {import('./amf').SynthesizedField} SynthesizedField */
111+
/** @typedef {import('./amf').ParametrizedDeclaration} ParametrizedDeclaration */
109112
/** @typedef {import('./amf').ParametrizedTrait} ParametrizedTrait */
113+
/** @typedef {import('./amf').ParametrizedResourceType} ParametrizedResourceType */
110114
/** @typedef {import('./amf').VariableValue} VariableValue */
111115
/** @typedef {import('./amf').AbstractDeclaration} AbstractDeclaration */
112116
/** @typedef {import('./amf').Organization} Organization */
@@ -1303,6 +1307,7 @@ export class AmfSerializer extends AmfHelperMixin(Object) {
13031307
payloads: [],
13041308
servers: [],
13051309
security: [],
1310+
extends: [],
13061311
});
13071312
const { ns } = this;
13081313
const path = this._getValue(object, ns.aml.vocabularies.apiContract.path);
@@ -1341,6 +1346,21 @@ export class AmfSerializer extends AmfHelperMixin(Object) {
13411346
if (Array.isArray(security) && security.length) {
13421347
result.security = security.map(i => this.securityRequirement(i));
13431348
}
1349+
const extensions = this[getArrayItems](object, ns.aml.vocabularies.document.extends);
1350+
if (Array.isArray(extensions) && extensions.length) {
1351+
result.extends = [];
1352+
extensions.forEach((ex) => {
1353+
let extension = ex;
1354+
if (Array.isArray(extension)) {
1355+
[extension] = extension;
1356+
}
1357+
if (this._hasType(extension, ns.aml.vocabularies.apiContract.ParametrizedResourceType)) {
1358+
result.extends.push(this.parametrizedResourceType(extension));
1359+
} else if (this._hasType(extension, ns.aml.vocabularies.apiContract.ParametrizedTrait)) {
1360+
result.extends.push(this.parametrizedTrait(extension));
1361+
}
1362+
});
1363+
}
13441364
return result;
13451365
}
13461366

@@ -1364,7 +1384,7 @@ export class AmfSerializer extends AmfHelperMixin(Object) {
13641384
schemes: [],
13651385
contentType: [],
13661386
tags: [],
1367-
traits: [],
1387+
extends: [],
13681388
});
13691389
const { ns } = this;
13701390
const method = this._getValue(object, ns.aml.vocabularies.apiContract.method);
@@ -1440,7 +1460,7 @@ export class AmfSerializer extends AmfHelperMixin(Object) {
14401460
}
14411461
const traits = object[this._getAmfKey(ns.aml.vocabularies.document.extends)];
14421462
if (Array.isArray(traits) && traits.length) {
1443-
result.traits = traits.map(t => this.parametrizedTrait(t));
1463+
result.extends = traits.map(t => this.parametrizedTrait(t));
14441464
}
14451465
return result;
14461466
}
@@ -2102,11 +2122,11 @@ export class AmfSerializer extends AmfHelperMixin(Object) {
21022122
}
21032123

21042124
/**
2105-
* @param {ParametrizedTrait} object
2106-
* @returns {ApiParametrizedTrait}
2125+
* @param {ParametrizedDeclaration} object
2126+
* @returns {ApiParametrizedDeclaration}
21072127
*/
2108-
parametrizedTrait(object) {
2109-
const result = /** @type ApiParametrizedTrait */ ({
2128+
parametrizedDeclaration(object) {
2129+
const result = /** @type ApiParametrizedDeclaration */ ({
21102130
id: object['@id'],
21112131
types: object['@type'].map(this[expandKey].bind(this)),
21122132
variables: [],
@@ -2132,6 +2152,24 @@ export class AmfSerializer extends AmfHelperMixin(Object) {
21322152
return result;
21332153
}
21342154

2155+
/**
2156+
* @param {ParametrizedTrait} object
2157+
* @returns {ApiParametrizedTrait}
2158+
*/
2159+
parametrizedTrait(object) {
2160+
const result = /** @type ApiParametrizedTrait */ (this.parametrizedDeclaration(object));
2161+
return result;
2162+
}
2163+
2164+
/**
2165+
* @param {ParametrizedResourceType} object
2166+
* @returns {ApiParametrizedResourceType}
2167+
*/
2168+
parametrizedResourceType(object) {
2169+
const result = /** @type ApiParametrizedResourceType */ (this.parametrizedDeclaration(object));
2170+
return result;
2171+
}
2172+
21352173
/**
21362174
* @param {VariableValue} object
21372175
* @returns {ApiVariableValue}

src/amf.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ export declare interface EndPoint extends DomainElement {
108108
'http://a.ml/vocabularies/apiContract#payload'?: Payload[];
109109
'http://a.ml/vocabularies/apiContract#server'?: Server[];
110110
'http://a.ml/vocabularies/security#security'?: SecurityRequirement[];
111+
'http://a.ml/vocabularies/document#extends'?: ParametrizedDeclaration[];
111112
}
112113

113114
export declare interface Operation extends DomainElement {
@@ -438,3 +439,4 @@ export interface AbstractDeclaration extends DomainElement {
438439
}
439440

440441
export interface ParametrizedTrait extends ParametrizedDeclaration {}
442+
export interface ParametrizedResourceType extends ParametrizedDeclaration {}

src/types.d.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ export interface ApiEndPoint extends ApiDomainProperty {
113113
servers: ApiServer[];
114114
security: ApiSecurityRequirement[];
115115
sourceMaps?: ApiDocumentSourceMaps;
116+
extends: ApiParametrizedDeclaration[];
116117
}
117118

118119
export interface ApiOperation extends ApiDomainProperty {
@@ -133,7 +134,7 @@ export interface ApiOperation extends ApiDomainProperty {
133134
servers: ApiServer[];
134135
tags: ApiTag[];
135136
sourceMaps?: ApiDocumentSourceMaps;
136-
traits: ApiParametrizedTrait[];
137+
extends: ApiParametrizedTrait[];
137138
}
138139

139140
export interface ApiTag extends ApiDomainProperty {
@@ -521,8 +522,8 @@ export interface ApiAbstractDeclaration extends ApiDomainProperty {
521522
variables: string[];
522523
}
523524

524-
export interface ApiParametrizedTrait extends ApiParametrizedDeclaration {
525-
}
525+
export interface ApiParametrizedTrait extends ApiParametrizedDeclaration {}
526+
export interface ApiParametrizedResourceType extends ApiParametrizedDeclaration {}
526527

527528
export interface ShapeProcessingOptions {
528529
/**

0 commit comments

Comments
 (0)