jsii-release
Version:
Release jsii modules to multiple package managers
316 lines • 28.1 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.clone = clone;
exports.detectGHE = detectGHE;
exports.getToken = getToken;
exports.detectSSH = detectSSH;
exports.diffIndex = diffIndex;
exports.add = add;
exports.rm = rm;
exports.commit = commit;
exports.init = init;
exports.tag = tag;
exports.push = push;
exports.checkout = checkout;
exports.username = username;
exports.email = email;
exports.identify = identify;
exports.branchExistsOnRemote = branchExistsOnRemote;
exports.repositorySlug = repositorySlug;
exports.parseRepositorySlug = parseRepositorySlug;
exports.head = head;
const shell = __importStar(require("./shell"));
/**
* Clones a repository from GitHub. Requires a `GITHUB_TOKEN` env variable.
*
* @param repositoryUrl the repository to clone.
* @param targetDir the clone directory.
*/
function clone(repositoryUrl, targetDir, { depth = 1, tags = false, branch } = {}) {
const cmd = ['git', 'clone'];
if (depth) {
cmd.push(`--depth ${depth}`);
}
if (branch) {
cmd.push(`--branch ${branch}`);
}
if (tags) {
cmd.push('--tags');
}
cmd.push(tryDetectRepositoryUrl(repositoryUrl));
cmd.push(targetDir);
shell.run(cmd.join(' '));
}
function tryDetectRepositoryUrl(repositoryUrl) {
const gitHubUseSsh = detectSSH();
if (gitHubUseSsh) {
const sshRepositoryUrl = repositoryUrl.replace('/', ':');
return `git@${sshRepositoryUrl}.git`;
}
const gitHubToken = getToken(detectGHE());
if (!gitHubToken) {
throw new Error('GITHUB_TOKEN env variable is required when GITHUB_USE_SSH env variable is not used');
}
return `https://${gitHubToken}@${repositoryUrl}.git`;
}
/**
* Checks if the current environment is an GHE environment.
*
* This check is using GITHUB_API_URL set in GitHub Actions workflow, as well as common gh cli env variables.
* https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
* https://cli.github.com/manual/gh_help_environment
*
* @return - `true` if GH_HOST or GITHUB_API_URL env var are defined and not equal to the public github endpoint, otherwise `false`
*/
function detectGHE() {
const githubApiUrl = process.env.GITHUB_API_URL;
const ghHost = process.env.GH_HOST;
return (Boolean(ghHost) && ghHost.trim().toLowerCase() != 'github.com')
|| (Boolean(githubApiUrl) && githubApiUrl.trim().toLowerCase() != 'https://api.github.com');
}
/**
* Returns an appropriate github token from the environment.
*
* @return GH_ENTERPRISE_TOKEN or GITHUB_ENTERPRISE_TOKEN or GITHUB_TOKEN if in an GHE environment, otherwise GITHUB_TOKEN
*/
function getToken(isGHE) {
if (isGHE) {
const githubEnterpiseToken = process.env.GH_ENTERPRISE_TOKEN ?? process.env.GITHUB_ENTERPRISE_TOKEN ?? process.env.GITHUB_TOKEN;
return githubEnterpiseToken;
}
return process.env.GITHUB_TOKEN;
}
/**
* Checks if SSH should be used to clone repo.
* This checks the presence and values of the GIT_USE_SSH env variable and the deprecated GITHUB_USE_SSH for legacy reason. Returns true if either of these env vars are defined and not falsy.
*/
function detectSSH() {
return Boolean(process.env.GIT_USE_SSH ?? process.env.GITHUB_USE_SSH);
}
/**
* Query the git index for changes.
*
* @return True if changes exist, False otherwise.
*/
function diffIndex() {
try {
shell.run('git diff-index --exit-code HEAD --');
return false;
}
catch (err) {
return true;
}
}
/**
* Add files to the index.
*
* @param p the path.
*/
function add(p) {
shell.run(`git add ${p}`);
}
/**
* Remove files from the working tree and from the index
*
* @param p the path.
*/
function rm(p, options = {}) {
const cmd = ['git', 'rm'];
if (options.recursive) {
cmd.push('-r');
}
cmd.push(p);
shell.run(cmd.join(' '));
}
/**
* Commit.
*
* @param message the commit message.
*/
function commit(message) {
shell.run(`git commit -m "${message}"`);
}
/**
* Initialize a repository.
*/
function init() {
shell.run('git init');
}
/**
* Cerate a tag.
*
* @param name tag name.
* @returns true if the tag was created, false if it already exists.
*/
function tag(name) {
try {
shell.run(`git tag -a ${name} -m ${name}`, { capture: true });
return true;
}
catch (e) {
if (e instanceof Error && e.message.includes('already exists')) {
return false;
}
throw e;
}
}
/**
* Push a ref to origin.
*
* @param ref the ref
*/
function push(ref) {
shell.run(`git push origin ${ref}`);
}
/**
* Checkout to a new branch. Creates a new one if `options.createIfMissing` is True and the branch doesn't exist.
*
* @param branch the branch.
* @param options options.
*/
function checkout(branch, options) {
if (options.createIfMissing) {
try {
shell.run(`git show-branch origin/${branch}`, { capture: true });
}
catch (e) {
if (e instanceof Error && e.message.includes('fatal: bad sha1 reference')) {
console.log('Remote branch not found, creating new branch.');
shell.run(`git checkout -B ${branch}`);
return;
}
}
}
shell.run(`git checkout ${branch}`);
}
/**
* Fetch the configured git user name for the current directory.
* Returns undefined if not configured.
*/
function username() {
try {
return shell.run('git config user.name', { capture: true });
}
catch (err) {
if (err instanceof Error) {
console.warn(err.message);
}
return undefined;
}
}
/**
* Fetch the configured git user email for the current directory.
* Returns undefined if not configured.
*/
function email() {
try {
return shell.run('git config user.email', { capture: true });
}
catch (err) {
if (err instanceof Error) {
console.warn(err.message);
}
return undefined;
}
}
/**
* Identify the committer with a username and email.
*
* @param user the username.
* @param email the email address.
*/
function identify(user, address) {
shell.run(`git config user.name "${user}"`);
shell.run(`git config user.email "${address}"`);
}
/**
* Does the given branch exists on the remote.
*/
function branchExistsOnRemote(repositoryUrl, branch) {
return shell.check(`git ls-remote --exit-code --heads ${tryDetectRepositoryUrl(repositoryUrl)} ${branch}`, { capture: true });
}
/**
* Returns the `owner/repo` slug of the `origin` remote in the current
* directory, or undefined if it cannot be determined (e.g. not in a git
* repository, or no `origin` remote configured).
*/
function repositorySlug() {
try {
const url = shell.run('git remote get-url origin', { capture: true });
return parseRepositorySlug(url);
}
catch {
return undefined;
}
}
/**
* Extracts the `owner/repo` slug from a git remote URL.
*
* Supports HTTPS (`https://github.com/owner/repo.git`), SSH
* (`git@github.com:owner/repo.git`, `ssh://git@github.com/owner/repo.git`)
* and URLs without a `.git` suffix.
*
* @returns the `owner/repo` slug, or undefined if it cannot be determined
*/
function parseRepositorySlug(url) {
const path = url
.trim()
.replace(/\.git$/, '')
// drop the scheme (https://, ssh://, git+ssh://, ...)
.replace(/^[a-z+]+:\/\//, '')
// normalize scp-like ssh syntax (git@host:owner/repo) to a path
.replace(/^git@[^:/]+[:/]/, '')
// strip a leading host segment (github.com/owner/repo)
.replace(/^[^/]+\.[^/]+\//, '');
const parts = path.split('/').filter(Boolean);
if (parts.length !== 2) {
return undefined;
}
return parts.join('/');
}
/**
* Returns the commit hash of HEAD in the current directory, or undefined if
* it cannot be determined (e.g. not in a git repository).
*/
function head() {
try {
return shell.run('git rev-parse HEAD', { capture: true });
}
catch {
return undefined;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHAvZ2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLHNCQW1CQztBQXlCRCw4QkFNQztBQVFELDRCQU1DO0FBT0QsOEJBRUM7QUFPRCw4QkFPQztBQU9ELGtCQUVDO0FBT0QsZ0JBU0M7QUFPRCx3QkFFQztBQUtELG9CQUVDO0FBUUQsa0JBVUM7QUFPRCxvQkFFQztBQVFELDRCQWFDO0FBTUQsNEJBU0M7QUFNRCxzQkFTQztBQVFELDRCQUdDO0FBS0Qsb0RBRUM7QUFPRCx3Q0FPQztBQVdELGtEQWVDO0FBTUQsb0JBTUM7QUE3U0QsK0NBQWlDO0FBbUJqQzs7Ozs7R0FLRztBQUNILFNBQWdCLEtBQUssQ0FBQyxhQUFxQixFQUFFLFNBQWlCLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLEVBQUUsTUFBTSxLQUFtQixFQUFFO0lBQ3BILE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTdCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFcEIsS0FBSyxDQUFDLEdB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QUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsSUFBSTtJQUNsQixJQUFJLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaGVsbCBmcm9tICcuL3NoZWxsJztcblxuZXhwb3J0IGludGVyZmFjZSBDbG9uZU9wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGJyYW5jaFxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENsb25lcyBhIHJlcG9zaXRvcnkgZnJvbSBHaXRIdWIuIFJlcXVpcmVzIGEgYEdJVEhVQl9UT0tFTmAgZW52IHZhcmlhYmxlLlxuICpcbiAqIEBwYXJhbSByZXBvc2l0b3J5VXJsIHRoZSByZXBvc2l0b3J5IHRvIGNsb25lLlxuICogQHBhcmFtIHRhcmdldERpciB0aGUgY2xvbmUgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUocmVwb3NpdG9yeVVybDogc3RyaW5nLCB0YXJnZXREaXI6IHN0cmluZywgeyBkZXB0aCA9IDEsIHRhZ3MgPSBmYWxzZSwgYnJhbmNoIH06IENsb25lT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNtZCA9IFsnZ2l0JywgJ2Nsb25lJ107XG5cbiAgaWYgKGRlcHRoKSB7XG4gICAgY21kLnB1c2goYC0tZGVwdGggJHtkZXB0aH1gKTtcbiAgfVxuXG4gIGlmIChicmFuY2gpIHtcbiAgICBjbWQucHVzaChgLS1icmFuY2ggJHticmFuY2h9YCk7XG4gIH1cblxuICBpZiAodGFncykge1xuICAgIGNtZC5wdXNoKCctLXRhZ3MnKTtcbiAgfVxuXG4gIGNtZC5wdXNoKHRyeURldGVjdFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeVVybCkpO1xuICBjbWQucHVzaCh0YXJnZXREaXIpO1xuXG4gIHNoZWxsLnJ1bihjbWQuam9pbignICcpKTtcbn1cblxuZnVuY3Rpb24gdHJ5RGV0ZWN0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5VXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBnaXRIdWJVc2VTc2ggPSBkZXRlY3RTU0goKTtcbiAgaWYgKGdpdEh1YlVzZVNzaCkge1xuICAgIGNvbnN0IHNzaFJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5VXJsLnJlcGxhY2UoJy8nLCAnOicpO1xuICAgIHJldHVybiBgZ2l0QCR7c3NoUmVwb3NpdG9yeVVybH0uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IGdpdEh1YlRva2VuID0gZ2V0VG9rZW4oZGV0ZWN0R0hFKCkpO1xuICBpZiAoIWdpdEh1YlRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHSVRIVUJfVE9LRU4gZW52IHZhcmlhYmxlIGlzIHJlcXVpcmVkIHdoZW4gR0lUSFVCX1VTRV9TU0ggZW52IHZhcmlhYmxlIGlzIG5vdCB1c2VkJyk7XG4gIH1cbiAgcmV0dXJuIGBodHRwczovLyR7Z2l0SHViVG9rZW59QCR7cmVwb3NpdG9yeVVybH0uZ2l0YDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYW4gR0hFIGVudmlyb25tZW50LlxuICpcbiAqIFRoaXMgY2hlY2sgaXMgdXNpbmcgR0lUSFVCX0FQSV9VUkwgc2V0IGluIEdpdEh1YiBBY3Rpb25zIHdvcmtmbG93LCBhcyB3ZWxsIGFzIGNvbW1vbiBnaCBjbGkgZW52IHZhcmlhYmxlcy5cbiAqIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvbGVhcm4tZ2l0aHViLWFjdGlvbnMvdmFyaWFibGVzI2RlZmF1bHQtZW52aXJvbm1lbnQtdmFyaWFibGVzXG4gKiBodHRwczovL2NsaS5naXRodWIuY29tL21hbnVhbC9naF9oZWxwX2Vudmlyb25tZW50XG4gKlxuICogQHJldHVybiAtIGB0cnVlYCBpZiBHSF9IT1NUIG9yIEdJVEhVQl9BUElfVVJMIGVudiB2YXIgYXJlIGRlZmluZWQgYW5kIG5vdCBlcXVhbCB0byB0aGUgcHVibGljIGdpdGh1YiBlbmRwb2ludCwgb3RoZXJ3aXNlIGBmYWxzZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEdIRSgpOiBib29sZWFuIHtcbiAgY29uc3QgZ2l0aHViQXBpVXJsID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkw7XG4gIGNvbnN0IGdoSG9zdCA9IHByb2Nlc3MuZW52LkdIX0hPU1Q7XG5cbiAgcmV0dXJuIChCb29sZWFuKGdoSG9zdCkgJiYgZ2hIb3N0IS50cmltKCkudG9Mb3dlckNhc2UoKSAhPSAnZ2l0aHViLmNvbScpXG4gICAgfHwgKEJvb2xlYW4oZ2l0aHViQXBpVXJsKSAmJiBnaXRodWJBcGlVcmwhLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9ICdodHRwczovL2FwaS5naXRodWIuY29tJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcHByb3ByaWF0ZSBnaXRodWIgdG9rZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gKlxuICogQHJldHVybiBHSF9FTlRFUlBSSVNFX1RPS0VOIG9yIEdJVEhVQl9FTlRFUlBSSVNFX1RPS0VOIG9yIEdJVEhVQl9UT0tFTiBpZiBpbiBhbiBHSEUgZW52aXJvbm1lbnQsIG90aGVyd2lzZSBHSVRIVUJfVE9LRU5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9rZW4oaXNHSEU6IGJvb2xlYW4pOiAoc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIGlmIChpc0dIRSkge1xuICAgIGNvbnN0IGdpdGh1YkVudGVycGlzZVRva2VuID0gcHJvY2Vzcy5lbnYuR0hfRU5URVJQUklTRV9UT0tFTiA/PyBwcm9jZXNzLmVudi5HSVRIVUJfRU5URVJQUklTRV9UT0tFTiA/PyBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG4gICAgcmV0dXJuIGdpdGh1YkVudGVycGlzZVRva2VuO1xuICB9XG4gIHJldHVybiBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIFNTSCBzaG91bGQgYmUgdXNlZCB0byBjbG9uZSByZXBvLlxuICogVGhpcyBjaGVja3MgdGhlIHByZXNlbmNlIGFuZCB2YWx1ZXMgb2YgdGhlIEdJVF9VU0VfU1NIIGVudiB2YXJpYWJsZSBhbmQgdGhlIGRlcHJlY2F0ZWQgR0lUSFVCX1VTRV9TU0ggZm9yIGxlZ2FjeSByZWFzb24uIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgb2YgdGhlc2UgZW52IHZhcnMgYXJlIGRlZmluZWQgYW5kIG5vdCBmYWxzeS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U1NIKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihwcm9jZXNzLmVudi5HSVRfVVNFX1NTSCA/PyBwcm9jZXNzLmVudi5HSVRIVUJfVVNFX1NTSCk7XG59XG5cbi8qKlxuICogUXVlcnkgdGhlIGdpdCBpbmRleCBmb3IgY2hhbmdlcy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgY2hhbmdlcyBleGlzdCwgRmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZkluZGV4KCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHNoZWxsLnJ1bignZ2l0IGRpZmYtaW5kZXggLS1leGl0LWNvZGUgSEVBRCAtLScpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgZmlsZXMgdG8gdGhlIGluZGV4LlxuICpcbiAqIEBwYXJhbSBwIHRoZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKHA6IHN0cmluZykge1xuICBzaGVsbC5ydW4oYGdpdCBhZGQgJHtwfWApO1xufVxuXG4vKipcbiAqIFJlbW92ZSBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUgYW5kIGZyb20gdGhlIGluZGV4XG4gKlxuICogQHBhcmFtIHAgdGhlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBybShwOiBzdHJpbmcsIG9wdGlvbnM6IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgY29uc3QgY21kID0gWydnaXQnLCAncm0nXTtcbiAgaWYgKG9wdGlvbnMucmVjdXJzaXZlKSB7XG4gICAgY21kLnB1c2goJy1yJyk7XG4gIH1cblxuICBjbWQucHVzaChwKTtcblxuICBzaGVsbC5ydW4oY21kLmpvaW4oJyAnKSk7XG59XG5cbi8qKlxuICogQ29tbWl0LlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIHRoZSBjb21taXQgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgc2hlbGwucnVuKGBnaXQgY29tbWl0IC1tIFwiJHttZXNzYWdlfVwiYCk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICBzaGVsbC5ydW4oJ2dpdCBpbml0Jyk7XG59XG5cbi8qKlxuICogQ2VyYXRlIGEgdGFnLlxuICpcbiAqIEBwYXJhbSBuYW1lIHRhZyBuYW1lLlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFnIHdhcyBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBzaGVsbC5ydW4oYGdpdCB0YWcgLWEgJHtuYW1lfSAtbSAke25hbWV9YCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG4vKipcbiAqIFB1c2ggYSByZWYgdG8gb3JpZ2luLlxuICpcbiAqIEBwYXJhbSByZWYgdGhlIHJlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVzaChyZWY6IHN0cmluZykge1xuICBzaGVsbC5ydW4oYGdpdCBwdXNoIG9yaWdpbiAke3JlZn1gKTtcbn1cblxuLyoqXG4gKiBDaGVja291dCB0byBhIG5ldyBicmFuY2guIENyZWF0ZXMgYSBuZXcgb25lIGlmIGBvcHRpb25zLmNyZWF0ZUlmTWlzc2luZ2AgaXMgVHJ1ZSBhbmQgdGhlIGJyYW5jaCBkb2Vzbid0IGV4aXN0LlxuICpcbiAqIEBwYXJhbSBicmFuY2ggdGhlIGJyYW5jaC5cbiAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja291dChicmFuY2g6IHN0cmluZywgb3B0aW9uczogeyBjcmVhdGVJZk1pc3Npbmc/OiBib29sZWFuIH0gKSB7XG4gIGlmIChvcHRpb25zLmNyZWF0ZUlmTWlzc2luZykge1xuICAgIHRyeSB7XG4gICAgICBzaGVsbC5ydW4oYGdpdCBzaG93LWJyYW5jaCBvcmlnaW4vJHticmFuY2h9YCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdmYXRhbDogYmFkIHNoYTEgcmVmZXJlbmNlJykpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW90ZSBicmFuY2ggbm90IGZvdW5kLCBjcmVhdGluZyBuZXcgYnJhbmNoLicpO1xuICAgICAgICBzaGVsbC5ydW4oYGdpdCBjaGVja291dCAtQiAke2JyYW5jaH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzaGVsbC5ydW4oYGdpdCBjaGVja291dCAke2JyYW5jaH1gKTtcbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgY29uZmlndXJlZCBnaXQgdXNlciBuYW1lIGZvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJuYW1lKCkge1xuICB0cnkge1xuICAgIHJldHVybiBzaGVsbC5ydW4oJ2dpdCBjb25maWcgdXNlci5uYW1lJywgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnIubWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgY29uZmlndXJlZCBnaXQgdXNlciBlbWFpbCBmb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbWFpbCgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc2hlbGwucnVuKCdnaXQgY29uZmlnIHVzZXIuZW1haWwnLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIElkZW50aWZ5IHRoZSBjb21taXR0ZXIgd2l0aCBhIHVzZXJuYW1lIGFuZCBlbWFpbC5cbiAqXG4gKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWUuXG4gKiBAcGFyYW0gZW1haWwgdGhlIGVtYWlsIGFkZHJlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeSh1c2VyOiBzdHJpbmcsIGFkZHJlc3M6IHN0cmluZykge1xuICBzaGVsbC5ydW4oYGdpdCBjb25maWcgdXNlci5uYW1lIFwiJHt1c2VyfVwiYCk7XG4gIHNoZWxsLnJ1bihgZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiJHthZGRyZXNzfVwiYCk7XG59XG5cbi8qKlxuICogRG9lcyB0aGUgZ2l2ZW4gYnJhbmNoIGV4aXN0cyBvbiB0aGUgcmVtb3RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJhbmNoRXhpc3RzT25SZW1vdGUocmVwb3NpdG9yeVVybDogc3RyaW5nLCBicmFuY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2hlbGwuY2hlY2soYGdpdCBscy1yZW1vdGUgLS1leGl0LWNvZGUgLS1oZWFkcyAke3RyeURldGVjdFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeVVybCl9ICR7YnJhbmNofWAsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBgb3duZXIvcmVwb2Agc2x1ZyBvZiB0aGUgYG9yaWdpbmAgcmVtb3RlIGluIHRoZSBjdXJyZW50XG4gKiBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAoZS5nLiBub3QgaW4gYSBnaXRcbiAqIHJlcG9zaXRvcnksIG9yIG5vIGBvcmlnaW5gIHJlbW90ZSBjb25maWd1cmVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnlTbHVnKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gc2hlbGwucnVuKCdnaXQgcmVtb3RlIGdldC11cmwgb3JpZ2luJywgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIHJldHVybiBwYXJzZVJlcG9zaXRvcnlTbHVnKHVybCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYG93bmVyL3JlcG9gIHNsdWcgZnJvbSBhIGdpdCByZW1vdGUgVVJMLlxuICpcbiAqIFN1cHBvcnRzIEhUVFBTIChgaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0YCksIFNTSFxuICogKGBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvLmdpdGAsIGBzc2g6Ly9naXRAZ2l0aHViLmNvbS9vd25lci9yZXBvLmdpdGApXG4gKiBhbmQgVVJMcyB3aXRob3V0IGEgYC5naXRgIHN1ZmZpeC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgYG93bmVyL3JlcG9gIHNsdWcsIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXBvc2l0b3J5U2x1Zyh1cmw6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdGggPSB1cmxcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UoL1xcLmdpdCQvLCAnJylcbiAgICAvLyBkcm9wIHRoZSBzY2hlbWUgKGh0dHBzOi8vLCBzc2g6Ly8sIGdpdCtzc2g6Ly8sIC4uLilcbiAgICAucmVwbGFjZSgvXlthLXorXSs6XFwvXFwvLywgJycpXG4gICAgLy8gbm9ybWFsaXplIHNjcC1saWtlIHNzaCBzeW50YXggKGdpdEBob3N0Om93bmVyL3JlcG8pIHRvIGEgcGF0aFxuICAgIC5yZXBsYWNlKC9eZ2l0QFteOi9dK1s6L10vLCAnJylcbiAgICAvLyBzdHJpcCBhIGxlYWRpbmcgaG9zdCBzZWdtZW50IChnaXRodWIuY29tL293bmVyL3JlcG8pXG4gICAgLnJlcGxhY2UoL15bXi9dK1xcLlteL10rXFwvLywgJycpO1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKCcvJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29tbWl0IGhhc2ggb2YgSEVBRCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZCBpZlxuICogaXQgY2Fubm90IGJlIGRldGVybWluZWQgKGUuZy4gbm90IGluIGEgZ2l0IHJlcG9zaXRvcnkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGVhZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBzaGVsbC5ydW4oJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19