@apideck/node
Version:
Apideck Node.js SDK
336 lines (287 loc) • 9.61 kB
text/typescript
/* tslint:disable */
/* eslint-disable */
/**
* Apideck
* The Apideck OpenAPI Spec: SDK Optimized
*
* The version of the OpenAPI document: 10.13.0
* Contact: support@apideck.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export const BASE_PATH = 'https://unify.apideck.com'.replace(/\/+$/, '')
const isBlob = (value: any) => typeof Blob !== 'undefined' && value instanceof Blob
/**
* This is the base class for all generated API classes.
*/
export class BaseAPI {
private middleware: Middleware[]
constructor(protected configuration = new Configuration()) {
this.middleware = configuration.middleware
}
withMiddleware<T extends BaseAPI>(this: T, ...middlewares: Middleware[]) {
const next = this.clone<T>()
next.middleware = next.middleware.concat(...middlewares)
return next
}
withPreMiddleware<T extends BaseAPI>(this: T, ...preMiddlewares: Array<Middleware['pre']>) {
const middlewares = preMiddlewares.map(pre => ({ pre }))
return this.withMiddleware<T>(...middlewares)
}
withPostMiddleware<T extends BaseAPI>(this: T, ...postMiddlewares: Array<Middleware['post']>) {
const middlewares = postMiddlewares.map(post => ({ post }))
return this.withMiddleware<T>(...middlewares)
}
protected async request(context: RequestOpts, initOverrides?: RequestInit): Promise<Response> {
const { url, init } = this.createFetchParams(context, initOverrides)
const response = await this.fetchApi(url, init)
if (response.status >= 200 && response.status < 300) {
return response
}
throw response
}
private createFetchParams(context: RequestOpts, initOverrides?: RequestInit) {
let url = this.configuration.basePath + context.path
if (context.query !== undefined && Object.keys(context.query).length !== 0) {
// only add the querystring to the URL if there are query parameters.
// this is done to avoid urls ending with a "?" character which buggy webservers
// do not handle correctly sometimes.
url += '?' + this.configuration.queryParamsStringify(context.query)
}
const body =
(typeof FormData !== 'undefined' && context.body instanceof FormData) ||
context.body instanceof URLSearchParams ||
isBlob(context.body)
? context.body
: JSON.stringify(context.body)
const headers = Object.assign({}, this.configuration.headers, context.headers)
const init = {
method: context.method,
headers: headers,
body,
credentials: this.configuration.credentials,
...initOverrides
}
return { url, init }
}
private fetchApi = async (url: string, init: RequestInit) => {
let fetchParams = { url, init }
for (const middleware of this.middleware) {
if (middleware.pre) {
fetchParams =
(await middleware.pre({
fetch: this.fetchApi,
...fetchParams
})) || fetchParams
}
}
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init)
for (const middleware of this.middleware) {
if (middleware.post) {
response =
(await middleware.post({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
response: response.clone()
})) || response
}
}
return response
}
/**
* Create a shallow clone of `this` by constructing a new instance
* and then shallow cloning data members.
*/
private clone<T extends BaseAPI>(this: T): T {
const constructor = this.constructor as any
const next = new constructor(this.configuration)
next.middleware = this.middleware.slice()
return next
}
}
export class RequiredError extends Error {
name: 'RequiredError' = 'RequiredError'
constructor(public field: string, msg?: string) {
super(msg)
}
}
export const COLLECTION_FORMATS = {
csv: ',',
ssv: ' ',
tsv: '\t',
pipes: '|'
}
export type FetchAPI = WindowOrWorkerGlobalScope['fetch']
export interface ConfigurationParameters {
basePath?: string // override base path
fetchApi?: FetchAPI // override for fetch implementation
middleware?: Middleware[] // middleware to apply before/after fetch requests
queryParamsStringify?: (params: HTTPQuery) => string // stringify function for query strings
username?: string // parameter for basic security
password?: string // parameter for basic security
apiKey?: string | ((name: string) => string) // parameter for apiKey security
accessToken?:
| string
| Promise<string>
| ((name?: string, scopes?: string[]) => string | Promise<string>) // parameter for oauth2 security
headers?: HTTPHeaders //header params we want to use on every request
credentials?: RequestCredentials //value for the credentials param we want to use on each request
}
export class Configuration {
constructor(private configuration: ConfigurationParameters = {}) {}
get basePath(): string {
return this.configuration.basePath != null ? this.configuration.basePath : BASE_PATH
}
get fetchApi(): FetchAPI | undefined {
return this.configuration.fetchApi
}
get middleware(): Middleware[] {
return this.configuration.middleware || []
}
get queryParamsStringify(): (params: HTTPQuery) => string {
return this.configuration.queryParamsStringify || querystring
}
get username(): string | undefined {
return this.configuration.username
}
get password(): string | undefined {
return this.configuration.password
}
get apiKey(): ((name: string) => string) | undefined {
const apiKey = this.configuration.apiKey
if (apiKey) {
return typeof apiKey === 'function' ? apiKey : () => apiKey
}
return undefined
}
get accessToken(): ((name?: string, scopes?: string[]) => string | Promise<string>) | undefined {
const accessToken = this.configuration.accessToken
if (accessToken) {
return typeof accessToken === 'function' ? accessToken : async () => accessToken
}
return undefined
}
get headers(): HTTPHeaders | undefined {
return this.configuration.headers
}
get credentials(): RequestCredentials | undefined {
return this.configuration.credentials
}
}
export type Json = any
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD'
export type HTTPHeaders = { [key: string]: string }
export type HTTPQuery = {
[key: string]:
| string
| number
| null
| boolean
| Array<string | number | null | boolean>
| HTTPQuery
}
export type HTTPBody = Json | FormData | URLSearchParams
export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original'
export interface FetchParams {
url: string
init: RequestInit
}
export interface RequestOpts {
path: string
method: HTTPMethod
headers: HTTPHeaders
query?: HTTPQuery
body?: HTTPBody
}
export function exists(json: any, key: string) {
const value = json[key]
return value !== null && value !== undefined
}
export function querystring(params: HTTPQuery, prefix: string = ''): string {
return Object.keys(params)
.map(key => {
const fullKey = prefix + (prefix.length ? `[${key}]` : key)
const value = params[key]
if (value instanceof Array) {
const multiValue = value
.map(singleValue => encodeURIComponent(String(singleValue)))
.join(`&${encodeURIComponent(fullKey)}=`)
return `${encodeURIComponent(fullKey)}=${multiValue}`
}
if (value instanceof Date) {
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(value.toISOString())}`
}
if (value instanceof Object) {
return querystring(value as HTTPQuery, fullKey)
}
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`
})
.filter(part => part.length > 0)
.join('&')
}
export function mapValues(data: any, fn: (item: any) => any) {
return Object.keys(data).reduce((acc, key) => ({ ...acc, [key]: fn(data[key]) }), {})
}
export function canConsumeForm(consumes: Consume[]): boolean {
for (const consume of consumes) {
if ('multipart/form-data' === consume.contentType) {
return true
}
}
return false
}
export interface Consume {
contentType: string
}
export interface RequestContext {
fetch: FetchAPI
url: string
init: RequestInit
}
export interface ResponseContext {
fetch: FetchAPI
url: string
init: RequestInit
response: Response
}
export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>
post?(context: ResponseContext): Promise<Response | void>
}
export interface ApiResponse<T> {
raw: Response
value(): Promise<T>
}
export interface ResponseTransformer<T> {
(json: any): T
}
export class JSONApiResponse<T> {
constructor(
public raw: Response,
private transformer: ResponseTransformer<T> = (jsonValue: any) => jsonValue
) {}
async value(): Promise<T> {
return this.transformer(await this.raw.json())
}
}
export class VoidApiResponse {
constructor(public raw: Response) {}
async value(): Promise<void> {
return undefined
}
}
export class BlobApiResponse {
constructor(public raw: Response) {}
async value(): Promise<Blob> {
return await this.raw.blob()
}
}
export class TextApiResponse {
constructor(public raw: Response) {}
async value(): Promise<string> {
return await this.raw.text()
}
}