npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@comake/openapi-operation-executor

v0.12.1

Published

Sends web requests according to OpenApi specs

Downloads

699

Readme

npm version License: MIT

OpenAPI Operation Executor

This library provides a helper method to perform operations (web requests) specified by an OpenAPI spec.

Every operation in an OpenAPI spec has a unique field used to identify it, called an operationId. This library allows you to send properly formatted requests to an API by supplying an OpenAPI spec (as JSON), the operationId of the operation you want to perform, and the arguments for that operation. This makes it so that you do not have to take the time to generate an SDK out of an OpenAPI spec every time you need to work with a new spec or everytime an API/spec changes (for example using the openapi npm package). This also reduces your application's bundle size by removing dependencies on multiple SDKs per API your application needs to interact with.

Installation

npm install @comake/openapi-operation-executor

or

yarn add @comake/openapi-operation-executor

Usage

Using Typescript:

import { OpenApiOperationExecutor } from '@comake/openapi-operation-executor';
import type { OpenApi } from '@comake/openapi-operation-executor';

// Import your OpenAPI spec as a JSON module (requires the resolveJsonModule flag in typescript).
// Alternatively, you could read a YAML file uing fs and use the yaml npm module to convert to JSON.
import openApiSpec from './path/to/openapi-spec.json';

// Initialize the OpenAPI Operation Executor
const executor = new OpenApiOperationExecutor();
await executor.setOpenapiSpec(openApiSpec as OpenApi)

// Execute the operation and get the response
const response = await executor.executeOperation(
  'operationId',
  { accessToken: 'YOUR_ACCESS_TOKEN' },
  { arg: 'arg-value' },
);

Browser support

To use OpenApiOperationExecutor in a browser, you'll need to use a bundling tool such as Webpack, Rollup, Parcel, or Browserify. Some bundlers may require a bit of configuration, such as setting browser: true in rollup-plugin-resolve.

API

executeOperation

The executeOperation method of an OpenApiOperationExecutor instance sends a properly formatted web request to the API described in the provided OpenAPI spec (as JSON). This library uses axios to send web requests.

Requests automatically use the method (GET, POST, etc.) that the OpenAPI operation is nested under in the provided spec.

⚠️ This library currently only supports sending JSON data in request bodies. It automatically adds the header Content-Type: application/json to every request it sends.

Parameters

| Parameter | Type | Required | Description | | :--- | :--- | :--- | :--- | | operationId | string | Required | The operationId of the operation to perform. | | configuration | object | Required | An OpenApiClientConfiguration object. | | args | any | | Data conformant to the specified requestBody of the OpenAPI operation being performed to be send to the API as the body of the request. It will be serialized according to the Content-Type header, which is always set to application/json. | | options | object | | An AxiosRequestConfig object to override any request configurations. See the axios API documentation for reference. |

Configuration

These are the available config options for making requests (in Typescript):

export interface OpenApiClientConfiguration {
  /**
  * Parameter for HTTP authentication with the Bearer security scheme
  */
  bearerToken?: string
  | Promise<string>
  | (() => string) | (() => Promise<string>);
  /**
  * Parameter for apiKey security where the key is the name 
  * of the api key to be added to the header or query. Multiple api keys 
  * may be provided by name.
  * @param name - security name
  */
  [key: string]: undefined
  | string
  | Promise<string>
  | ((name: string) => string) | ((name: string) => Promise<string>);
  /**
  * Parameter for apiKey security which will be used if no named api key
  * matching the required security scheme is supplied.
  * @param name - security name
  */
  apiKey?: string
  | Promise<string>
  | ((name: string) => string) | ((name: string) => Promise<string>);
  /**
  * Parameter for HTTP authentication with the Basic security scheme
  */
  username?: string;
  /**
  * Parameter for HTTP authentication with the Basic security scheme
  */
  password?: string;
  /**
  * Parameter for oauth2 security
  * @param name - security name
  * @param scopes - oauth2 scope
  */
  accessToken?: string | Promise<string>
  | ((name?: string, scopes?: string[]) => string)
  | ((name?: string, scopes?: string[]) => Promise<string>);
  /**
  * Override base path
  */
  basePath?: string;
  /**
  * Base options for axios calls
  */
  baseOptions?: any;
}

⚠️ This library currently supports OpenApi security types oauth2, apiKey, and http (with scheme basic or bearer). See the OpenApi Spec for reference.

  • When using oauth2 type security, if an accessToken string or function is supplied, an Authorization header will be added with the value Bearer <accessToken>.
  • When using apiKey type security, if an apiKey string or function supplied, the return value will be added to the header or query of the request depending on the OpenAPI spec's Security Schemes. This library does not work with apiKeys as cookies.
  • When using http security with the basic scheme, if a username and password are supplied, an Authorization header will be added with the value Basic {CREDENTIALS} where CREDENTIALS is the username and password concatenated with a colon character ":" and base64 encoded as defined in the spec (RFC7617).
  • When using http security with the bearer scheme, if a bearerToken string or function is supplied, an Authorization header will be added with the value Bearer {bearerToken} as deinfed in the spec (RFC6750).
  • mutualTLS and openIdConnect security types are not yet supported.

Return value

executeOperation returns a Promise which resolves to an AxiosResponse.

Access the response using Promise syntax:

executor.executeOperation('operationId', { accessToken: 'ACCESS_TOKEN' })
  .then(response => {
    // Do something with the response...
  })
  .catch(error => {
    // Handle an error...
  });

Access the response using async/ await syntax:

const response = await executor.executeOperation('operationId', { accessToken: 'ACCESS_TOKEN' });

These are the fields exepcted in an AxiosResponse (in Typescript):

export interface AxiosResponse<T = any, D = any>  {
  // The response that was provided by the server
  data: T;
  // The HTTP status code from the server response
  status: number;
  // The HTTP status message from the server response
  statusText: string;
  // `headers` the HTTP headers that the server responded with
  // All header names are lowercase and can be accessed using the bracket notation.
  // Example: `response.headers['content-type']`
  headers: AxiosResponseHeaders;
  // The config that was provided to `axios` for the request
  config: AxiosRequestConfig<D>;
  // `request` is the request that generated this response
  // It is the last ClientRequest instance in node.js (in redirects)
  // and an XMLHttpRequest instance in the browser
  request?: any;
}