import { getUserAgent } from "universal-user-agent"; import { Collection } from "before-after-hook"; import { request } from "@octokit/request"; import { withCustomRequest } from "@octokit/graphql"; import { createTokenAuth } from "@octokit/auth-token"; import { VERSION } from "./version"; let Octokit = /** @class */ (() => { class Octokit { constructor(options = {}) { const hook = new Collection(); const requestDefaults = { baseUrl: request.endpoint.DEFAULTS.baseUrl, headers: {}, request: Object.assign({}, options.request, { hook: hook.bind(null, "request"), }), mediaType: { previews: [], format: "", }, }; // prepend default user agent with `options.userAgent` if set requestDefaults.headers["user-agent"] = [ options.userAgent, `octokit-core.js/${VERSION} ${getUserAgent()}`, ] .filter(Boolean) .join(" "); if (options.baseUrl) { requestDefaults.baseUrl = options.baseUrl; } if (options.previews) { requestDefaults.mediaType.previews = options.previews; } if (options.timeZone) { requestDefaults.headers["time-zone"] = options.timeZone; } this.request = request.defaults(requestDefaults); this.graphql = withCustomRequest(this.request).defaults({ ...requestDefaults, baseUrl: requestDefaults.baseUrl.replace(/\/api\/v3$/, "/api"), }); this.log = Object.assign({ debug: () => { }, info: () => { }, warn: console.warn.bind(console), error: console.error.bind(console), }, options.log); this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registred. // (2) If only `options.auth` is set, use the default token authentication strategy. // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. // TODO: type `options.auth` based on `options.authStrategy`. if (!options.authStrategy) { if (!options.auth) { // (1) this.auth = async () => ({ type: "unauthenticated", }); } else { // (2) const auth = createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ hook.wrap("request", auth.hook); this.auth = auth; } } else { const auth = options.authStrategy(Object.assign({ request: this.request, }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ hook.wrap("request", auth.hook); this.auth = auth; } // apply plugins // https://stackoverflow.com/a/16345172 const classConstructor = this.constructor; classConstructor.plugins.forEach((plugin) => { Object.assign(this, plugin(this, options)); }); } static defaults(defaults) { const OctokitWithDefaults = class extends this { constructor(...args) { const options = args[0] || {}; super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { userAgent: `${options.userAgent} ${defaults.userAgent}`, } : null)); } }; return OctokitWithDefaults; } /** * Attach a plugin (or many) to your Octokit instance. * * @example * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) */ static plugin(p1, ...p2) { var _a; if (p1 instanceof Array) { console.warn([ "Passing an array of plugins to Octokit.plugin() has been deprecated.", "Instead of:", " Octokit.plugin([plugin1, plugin2, ...])", "Use:", " Octokit.plugin(plugin1, plugin2, ...)", ].join("\n")); } const currentPlugins = this.plugins; let newPlugins = [ ...(p1 instanceof Array ? p1 : [p1]), ...p2, ]; const NewOctokit = (_a = class extends this { }, _a.plugins = currentPlugins.concat(newPlugins.filter((plugin) => !currentPlugins.includes(plugin))), _a); return NewOctokit; } } Octokit.VERSION = VERSION; Octokit.plugins = []; return Octokit; })(); export { Octokit };