gitlab-api-async-iterator

1.3.1 • Public • Published

gitlab-api-async-iterator

Async iterator for GitLab API based on axios

Usage

This module exposes a factory for creating async iterators for GitLab APIs.

This allows to use APIs pretty efficiently (code-wise).

It has a built-in retry feature in case you hit one of the following API errors: [429, 500, 502, 503, 504]

Instantiation

// es6 / webpack
import axios from "axios";
import {
  setupGitLabAPI,
  GitLabPagedAPIIterator,
} from "gitlab-api-async-iterator";
// CJS
const axios = require("axios");
const {
  setupGitLabAPI,
  GitLabPagedAPIIterator,
} = require("gitlab-api-async-iterator");

const GitLabAPI = setupGitLabAPI(axios, {
  //default values
  baseURL: "https://gitlab.com/api/v4/",
  // If no token is defined, it tries to read process.env.GITLAB_TOKEN || process.env.DANGER_GITLAB_API_TOKEN
  privateToken: null,
  // How often certain failing requests are retried
  maxRetries: 5,
  // Logging some warning messages, e.g. if we hit a retry limit. Default: Noop
  logger: () => {},
});

Usage of the API

let response;
// The GitLabAPI wraps an axios instance, so you could do:
response = await GitLabAPI.get("/user"); // Retrieve current user
response = await GitLabAPI.get("/version"); // Retrieve current GitLab version
response = await GitLabAPI.post("/projects", { name: "foobar" }); // Create a project

Usage of the API Iterator

// The real powerhouse is the GitLabPagedAPIIterator:
const groupIterator = new GitLabPagedAPIIterator(GitLabAPI, "/groups");

// This will paginate through _all_ groups, and you have normal loop controls
for await (const group of groupIterator) {
  //Skip groups starting with 'A'
  if (group.name.startsWith("A")) {
    continue;
  }
  // Stop looping as soon as we hit a group starting with C
  if (group.name.startsWith("C")) {
    break;
  }
  console.log("Group Details:", group);
}

// You can provide options to the group iterator:
const aliceIterator = new GitLabPagedAPIIterator(GitLabAPI, "/users", {
  // General parameters:
  page: 2, // Start with page two
  maxPages: Number.MAX_SAFE_INTEGER, // how many pages to receive at a maximum
  per_page: 20, //Pagination size (GitLab default is 20)
  // Parameters specific to the endpoint
  search: "Alice",
});

for await (const alice of aliceIterator) {
  console.log("Found an Alice", alice);
}

Subclassing the API Iterator:

class PipelineIterator extends GitLabPagedAPIIterator {
  constructor(projectId, options) {
    super(GitLabAPI, `/projects/${projectId}/pipelines`, options);
  }
}

class PipelineJobIterator extends GitLabPagedAPIIterator {
  constructor(projectId, pipelineId, options) {
    super(
      GitLabAPI,
      `/projects/${projectId}/pipelines/${pipelineId}/jobs`,
      options
    );
  }
}

const projectId = "foobar";

const pipelines = new PipelineIterator(projectId);
for await (const pipeline of pipelines) {
  console.log(pipeline);

  const jobs = new PipelineJobIterator(projectId, pipeline.id);

  let found = false;

  for await (const job of jobs) {
    if (job.name.includes("jest")) {
      found = true;
      break;
    }
  }

  if (found) {
    console.log(`${pipeline.web_url} is the first Pipeline with a jest job`);
    break;
  }
}

Package Sidebar

Install

npm i gitlab-api-async-iterator

Weekly Downloads

1,974

Version

1.3.1

License

MIT

Unpacked Size

16.6 kB

Total Files

7

Last publish

Collaborators

  • leipert