77 lines
2.6 KiB
JavaScript
77 lines
2.6 KiB
JavaScript
|
module.exports = authenticationPlugin;
|
||
|
|
||
|
const { createTokenAuth } = require("@octokit/auth-token");
|
||
|
const { Deprecation } = require("deprecation");
|
||
|
const once = require("once");
|
||
|
|
||
|
const beforeRequest = require("./before-request");
|
||
|
const requestError = require("./request-error");
|
||
|
const validate = require("./validate");
|
||
|
const withAuthorizationPrefix = require("./with-authorization-prefix");
|
||
|
|
||
|
const deprecateAuthBasic = once((log, deprecation) => log.warn(deprecation));
|
||
|
const deprecateAuthObject = once((log, deprecation) => log.warn(deprecation));
|
||
|
|
||
|
function authenticationPlugin(octokit, options) {
|
||
|
// If `options.authStrategy` is set then use it and pass in `options.auth`
|
||
|
if (options.authStrategy) {
|
||
|
const auth = options.authStrategy(options.auth);
|
||
|
octokit.hook.wrap("request", auth.hook);
|
||
|
octokit.auth = auth;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance
|
||
|
// is unauthenticated. The `octokit.auth()` method is a no-op and no request hook is registred.
|
||
|
if (!options.auth) {
|
||
|
octokit.auth = () =>
|
||
|
Promise.resolve({
|
||
|
type: "unauthenticated"
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const isBasicAuthString =
|
||
|
typeof options.auth === "string" &&
|
||
|
/^basic/.test(withAuthorizationPrefix(options.auth));
|
||
|
|
||
|
// If only `options.auth` is set to a string, use the default token authentication strategy.
|
||
|
if (typeof options.auth === "string" && !isBasicAuthString) {
|
||
|
const auth = createTokenAuth(options.auth);
|
||
|
octokit.hook.wrap("request", auth.hook);
|
||
|
octokit.auth = auth;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Otherwise log a deprecation message
|
||
|
const [deprecationMethod, deprecationMessapge] = isBasicAuthString
|
||
|
? [
|
||
|
deprecateAuthBasic,
|
||
|
'Setting the "new Octokit({ auth })" option to a Basic Auth string is deprecated. Use https://github.com/octokit/auth-basic.js instead. See (https://octokit.github.io/rest.js/#authentication)'
|
||
|
]
|
||
|
: [
|
||
|
deprecateAuthObject,
|
||
|
'Setting the "new Octokit({ auth })" option to an object without also setting the "authStrategy" option is deprecated and will be removed in v17. See (https://octokit.github.io/rest.js/#authentication)'
|
||
|
];
|
||
|
deprecationMethod(
|
||
|
octokit.log,
|
||
|
new Deprecation("[@octokit/rest] " + deprecationMessapge)
|
||
|
);
|
||
|
|
||
|
octokit.auth = () =>
|
||
|
Promise.resolve({
|
||
|
type: "deprecated",
|
||
|
message: deprecationMessapge
|
||
|
});
|
||
|
|
||
|
validate(options.auth);
|
||
|
|
||
|
const state = {
|
||
|
octokit,
|
||
|
auth: options.auth
|
||
|
};
|
||
|
|
||
|
octokit.hook.before("request", beforeRequest.bind(null, state));
|
||
|
octokit.hook.error("request", requestError.bind(null, state));
|
||
|
}
|