UNPKG

@elemental-concept/grappa

Version:

Decorator-powered REST client for Angular and its HttpClient

1 lines 25.2 kB
{"version":3,"file":"elemental-concept-grappa.mjs","sources":["../../../projects/lib/src/lib/public/models/class-descriptor.ts","../../../projects/lib/src/lib/public/models/method-descriptor.ts","../../../projects/lib/src/lib/public/models/request-options.ts","../../../projects/lib/src/lib/internal/uid/uid.ts","../../../projects/lib/src/lib/internal/instances/instances.ts","../../../projects/lib/src/lib/internal/registry/registry.ts","../../../projects/lib/src/lib/public/decorators/after-request.ts","../../../projects/lib/src/lib/public/decorators/before-request.ts","../../../projects/lib/src/lib/public/decorators/delete.ts","../../../projects/lib/src/lib/public/decorators/get.ts","../../../projects/lib/src/lib/public/decorators/patch.ts","../../../projects/lib/src/lib/public/decorators/post.ts","../../../projects/lib/src/lib/public/decorators/put.ts","../../../projects/lib/src/lib/public/decorators/rest-client.ts","../../../projects/lib/src/lib/public/url-parser/url-parser.ts","../../../projects/lib/src/lib/internal/rest-client/rest-client.service.ts","../../../projects/lib/src/lib/grappa.module.ts","../../../projects/lib/src/elemental-concept-grappa.ts"],"sourcesContent":["import { UrlInput } from './url-input';\r\nimport { MethodDescriptor } from './method-descriptor';\r\nimport { FilterDescriptor } from './filter-descriptor';\r\nimport { HttpRestClient } from './http-rest-client';\r\nimport { CustomMetadata } from './custom-metadata';\r\n\r\nexport class ClassDescriptor {\r\n baseUrl: UrlInput;\r\n ctor: Function;\r\n methods: { [ key: string ]: MethodDescriptor } = {};\r\n customMetadata: { [ key: string ]: CustomMetadata } = {};\r\n filtersBefore: FilterDescriptor[] = [];\r\n filtersAfter: FilterDescriptor[] = [];\r\n\r\n restClient?: HttpRestClient<any>;\r\n\r\n constructor(public readonly uid: number,\r\n public readonly proto: Object) {\r\n }\r\n}\r\n","import { RequestOptions } from '../index';\r\n\r\nexport class MethodDescriptor {\r\n method: string;\r\n endpoint: string;\r\n options: RequestOptions;\r\n\r\n constructor(public readonly name: string) {\r\n }\r\n}\r\n","export interface RequestOptions {\r\n observe?: ObserveOptions;\r\n query?: number | boolean;\r\n emptyBody?: boolean;\r\n reportProgress?: boolean;\r\n}\r\n\r\nexport enum ObserveOptions {\r\n Body = 'body',\r\n Response = 'response',\r\n Events = 'events'\r\n}\r\n","const uidKey = '__GRAPPA_UID';\r\nlet generator = 0;\r\n\r\nexport function UID(o: Object) {\r\n if (o[ uidKey ] === undefined) {\r\n Object.defineProperty(o, uidKey, {\r\n value: ++generator,\r\n enumerable: false,\r\n writable: false\r\n });\r\n }\r\n\r\n return o[ uidKey ];\r\n}\r\n","import { RestClientService } from '../rest-client/rest-client.service';\r\n\r\nexport const instances: Instances = {\r\n restClientInstance: null\r\n};\r\n\r\nexport interface Instances {\r\n restClientInstance: RestClientService<any> | null;\r\n}\r\n","import { UID } from '../uid/uid';\r\n\r\nimport { instances } from '../instances/instances';\r\n\r\nimport {\r\n ClassDescriptor,\r\n FilterDescriptor,\r\n HttpRestClient,\r\n Initialisable,\r\n MethodDescriptor,\r\n ObserveOptions,\r\n OptionalList,\r\n RequestOptions,\r\n RestRequest,\r\n UrlInput\r\n} from '../../public';\r\n\r\nexport class RegistryImpl {\r\n private static readonly defaultRequestOptions: RequestOptions = { observe: ObserveOptions.Body };\r\n\r\n private classes: { [ key: string ]: ClassDescriptor } = {};\r\n\r\n get defaultClient() {\r\n return instances.restClientInstance;\r\n }\r\n\r\n registerRequest = (method: string, endpoint: string, proto: any, property: string, options: RequestOptions): void => {\r\n const classDescriptor = this.getClassDescriptor(proto);\r\n const methodDescriptor = new MethodDescriptor(property);\r\n\r\n methodDescriptor.method = method;\r\n methodDescriptor.endpoint = endpoint;\r\n methodDescriptor.options = Object.assign({}, RegistryImpl.defaultRequestOptions, options);\r\n classDescriptor.methods[ property ] = methodDescriptor;\r\n\r\n proto[ property ] = prepareRequest(classDescriptor, property);\r\n };\r\n\r\n registerClass = (baseUrl: UrlInput, constructor: Initialisable): void => {\r\n const classDescriptor = this.getClassDescriptor(constructor.prototype);\r\n\r\n classDescriptor.ctor = constructor;\r\n classDescriptor.baseUrl = baseUrl;\r\n };\r\n\r\n getCustomMetadata = (proto: any, method: string, customKey: string) => {\r\n const classDescriptor = this.getClassDescriptor(proto);\r\n\r\n return this.getCustomMetadataImpl(classDescriptor, method, customKey);\r\n };\r\n\r\n registerBeforeFilter = (proto: any, method: Function, applyTo: OptionalList<string>) =>\r\n this.getClassDescriptor(proto).filtersBefore.push({ filterFunction: method, applyTo });\r\n\r\n registerAfterFilter = (proto: any, method: Function, applyTo: OptionalList<string>) =>\r\n this.getClassDescriptor(proto).filtersAfter.push({ filterFunction: method, applyTo });\r\n\r\n getClassDescriptor = (proto: any): ClassDescriptor => {\r\n const uid = UID(proto);\r\n\r\n let classDescriptor = this.classes[ uid ];\r\n\r\n if (classDescriptor === undefined) {\r\n classDescriptor = new ClassDescriptor(uid, proto);\r\n this.classes[ uid ] = classDescriptor;\r\n }\r\n\r\n return classDescriptor;\r\n };\r\n\r\n // used for Grappa-Cache\r\n registerAlternativeHttpClient = <T>(proto: any, client: HttpRestClient<T>) =>\r\n this.getClassDescriptor(proto).restClient = client;\r\n\r\n // used for Grappa-Cache\r\n putCustomMetadata = (proto: any, method: string, customKey: string, data: any): void => {\r\n const classDescriptor = this.getClassDescriptor(proto);\r\n\r\n if (!classDescriptor.customMetadata.hasOwnProperty(method)) {\r\n classDescriptor.customMetadata[ method ] = {};\r\n }\r\n\r\n classDescriptor.customMetadata[ method ][ customKey ] = data;\r\n };\r\n\r\n // used for Grappa-Cache\r\n getCustomMetadataForDescriptor = (classDescriptor: ClassDescriptor, method: MethodDescriptor, customKey: string) =>\r\n this.getCustomMetadataImpl(classDescriptor, method.name, customKey);\r\n\r\n private getCustomMetadataImpl = (classDescriptor: ClassDescriptor, methodNAme: string, customKey: string) =>\r\n classDescriptor.customMetadata.hasOwnProperty(methodNAme)\r\n && classDescriptor.customMetadata[ methodNAme ].hasOwnProperty(customKey)\r\n ? classDescriptor.customMetadata[ methodNAme ][ customKey ]\r\n : null;\r\n}\r\n\r\nfunction prepareRequest(classDescriptor: ClassDescriptor, property: string) {\r\n // eslint-disable-next-line space-before-function-paren\r\n return function (...args: any[]) {\r\n if (!classDescriptor.methods.hasOwnProperty(property)) {\r\n throw new ReferenceError(`REST function \"${ property }\" is not defined for ${ classDescriptor.ctor.name }.`);\r\n }\r\n\r\n const method = classDescriptor.methods[ property ];\r\n const request: RestRequest = {\r\n baseUrl: classDescriptor.baseUrl,\r\n endpoint: method.endpoint,\r\n method: method.method,\r\n args,\r\n headers: {},\r\n emptyBody: false,\r\n classDescriptor,\r\n methodDescriptor: method,\r\n reportProgress: method.options.reportProgress\r\n };\r\n\r\n if (method.options.hasOwnProperty('query')) {\r\n const idx = typeof method.options.query === 'number' ? method.options.query : args.length - 1;\r\n\r\n if (idx >= 0 && idx < args.length) {\r\n request.params = args[ idx ];\r\n }\r\n }\r\n\r\n if (method.options.hasOwnProperty('emptyBody')) {\r\n request.emptyBody = true;\r\n }\r\n\r\n for (const filter of classDescriptor.filtersBefore) {\r\n if (isApplicable(filter, property)) {\r\n filter.filterFunction.call(this, request);\r\n }\r\n }\r\n\r\n const restClient = classDescriptor.restClient instanceof Object\r\n ? classDescriptor.restClient\r\n : instances.restClientInstance;\r\n\r\n let response = restClient.request(request, method.options.observe);\r\n\r\n for (const filter of classDescriptor.filtersAfter) {\r\n if (isApplicable(filter, property)) {\r\n response = filter.filterFunction.call(this, response);\r\n }\r\n }\r\n\r\n return response;\r\n };\r\n}\r\n\r\nfunction isApplicable(filter: FilterDescriptor, property: string) {\r\n if (filter.applyTo === null) {\r\n return true;\r\n }\r\n\r\n const nameList = typeof filter.applyTo === 'string' ? [ filter.applyTo ] : filter.applyTo;\r\n\r\n return nameList.indexOf(property) >= 0;\r\n}\r\n\r\nexport const Registry = new RegistryImpl();\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { OptionalList } from '../models';\r\n\r\nexport function AfterRequest(applyTo: OptionalList<string> = null) {\r\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\r\n Registry.registerAfterFilter(target, descriptor.value, applyTo);\r\n };\r\n}\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { OptionalList } from '../models';\r\n\r\nexport function BeforeRequest(applyTo: OptionalList<string> = null) {\r\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\r\n Registry.registerBeforeFilter(target, descriptor.value, applyTo);\r\n };\r\n}\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { RequestOptions } from '../models';\r\n\r\nexport function DELETE(endpoint: string, options: RequestOptions = {}) {\r\n return (target: any, property: string) => {\r\n Registry.registerRequest('DELETE', endpoint, target, property, options);\r\n };\r\n}\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { RequestOptions } from '../models';\r\n\r\nexport function GET(endpoint: string, options: RequestOptions = {}) {\r\n return (target: any, property: string) => {\r\n Registry.registerRequest('GET', endpoint, target, property, options);\r\n };\r\n}\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { RequestOptions } from '../models';\r\n\r\nexport function PATCH(endpoint: string, options: RequestOptions = {}) {\r\n return (target: any, property: string) => {\r\n Registry.registerRequest('PATCH', endpoint, target, property, options);\r\n };\r\n}\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { RequestOptions } from '../models';\r\n\r\nexport function POST(endpoint: string, options: RequestOptions = {}) {\r\n return (target: any, property: string) => {\r\n Registry.registerRequest('POST', endpoint, target, property, options);\r\n };\r\n}\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { RequestOptions } from '../models';\r\n\r\nexport function PUT(endpoint: string, options: RequestOptions = {}) {\r\n return (target: any, property: string) => {\r\n Registry.registerRequest('PUT', endpoint, target, property, options);\r\n };\r\n}\r\n","import { Registry } from '../../internal/registry/registry';\r\nimport { Initialisable, UrlInput } from '../models';\r\n\r\nexport function RestClient(baseUrl: UrlInput = '') {\r\n return (constructor: Initialisable) => {\r\n Registry.registerClass(baseUrl, constructor);\r\n };\r\n}\r\n","// @dynamic\r\nexport class UrlParser {\r\n private static readonly SlashSuffix = /[\\\\/]*$/;\r\n private static readonly SlashPrefix = /^[\\\\/]*/;\r\n private static readonly Placeholder = /{([0-9]+)}/g;\r\n\r\n static parse = (baseUrl: string, endpoint: string, args: any[]) =>\r\n UrlParser\r\n .merge(baseUrl, endpoint)\r\n .replace(UrlParser.Placeholder, (match, index) => UrlParser.replace(index, args));\r\n\r\n private static replace = (index, args: any[]): string => {\r\n const idx = parseInt(index, 10);\r\n\r\n if (idx < 0 || idx >= args.length) {\r\n throw new ReferenceError(`REST method was not provided with argument at index ${ idx }.`);\r\n }\r\n\r\n return encodeURIComponent(args[ idx ]);\r\n };\r\n\r\n private static merge = (baseUrl: string, endpoint: string): string => {\r\n if (typeof baseUrl === 'string' && baseUrl.length > 0) {\r\n return `${ baseUrl.replace(UrlParser.SlashSuffix, '') }/${ endpoint.replace(UrlParser.SlashPrefix, '') }`;\r\n }\r\n\r\n return endpoint;\r\n };\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { HttpRestClient, ObserveOptions, RestRequest, UrlParser } from '../../public';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RestClientService<T> implements HttpRestClient<T> {\r\n constructor(private readonly http: HttpClient) {\r\n }\r\n\r\n request = (request: RestRequest, observe: ObserveOptions): Observable<T> => {\r\n const method = request.method.toUpperCase();\r\n const baseUrl = this.getBaseUrl(request);\r\n const body = this.getBody(request, method);\r\n\r\n return this.http\r\n .request(\r\n method,\r\n UrlParser.parse(baseUrl, request.endpoint, request.args),\r\n {\r\n body,\r\n headers: request.headers,\r\n params: request.params,\r\n observe: request.reportProgress ? 'events' : observe,\r\n responseType: 'json',\r\n reportProgress: request.reportProgress\r\n }\r\n );\r\n };\r\n\r\n private getBaseUrl = (request: RestRequest): string =>\r\n typeof request.baseUrl === 'function'\r\n ? request.baseUrl()\r\n : request.baseUrl;\r\n\r\n private getBody = (request: RestRequest, method: string): any => {\r\n if (method === 'PATCH' || method === 'POST' || method === 'PUT') {\r\n return request.emptyBody\r\n ? null\r\n : request.args.length > 0\r\n ? request.args[ request.args.length - 1 ]\r\n : undefined;\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\n\r\nimport { RestClientService } from './internal/rest-client/rest-client.service';\r\n\r\nimport { instances } from './internal/instances/instances';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [ CommonModule, HttpClientModule ],\r\n exports: []\r\n})\r\nexport class GrappaModule {\r\n constructor(restClient: RestClientService<any>) {\r\n instances.restClientInstance = restClient;\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.RestClientService"],"mappings":"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"}