Source: fetchPublications.js

// dependencies
import request from 'request';
import Promise from 'bluebird';
import immutable from 'immutable';

// private
const requestAsync = Promise.promisify(request);
const api = 'https://www.npmjs.com/profile';

/**
* fetch the author's publications
*
* @module fetchPublications
* @param <string> author - npm user name
* @returns {promise<collection>} author's publications summary
* @see https://www.npmjs.com/profile/substack/packages?offset=0
*/
export default (author) => (
  Promise.all(
    immutable.Range(0, 11).map((offset) => (
      requestAsync(`${api}/${author}/packages?offset=${offset}`, {
        json: true,
        gzip: true,
      })
      .then(({ statusCode, body }) => {
        if (typeof body === 'string') {
          return Promise.reject(new Error(`${statusCode}: ${body}`));
        }

        return body.items;
      })
    ))
  )
  .then((pages) => pages.reduce((prev, current) => current.concat(prev), []))
);