@backstage/integration
Version:
Helpers for managing integrations towards external systems
94 lines (88 loc) • 2.38 kB
JavaScript
;
var parseGitUrl = require('git-url-parse');
var lodash = require('lodash');
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
var parseGitUrl__default = /*#__PURE__*/_interopDefaultCompat(parseGitUrl);
function parseGitUrlSafe(url) {
const parsed = parseGitUrl__default.default(url);
if (parsed.filepath) {
let decoded = parsed.filepath;
let previous;
do {
previous = decoded;
try {
decoded = decodeURIComponent(decoded);
} catch {
break;
}
} while (decoded !== previous);
if (decoded.split("/").some((segment) => segment === ".." || segment === ".")) {
throw new Error(
"Invalid SCM URL: path traversal is not allowed in the URL"
);
}
}
return parsed;
}
function isValidHost(host) {
const check = new URL("http://example.com");
check.host = host;
return check.host === host;
}
function isValidUrl(url) {
try {
new URL(url);
return true;
} catch {
return false;
}
}
function basicIntegrations(integrations, getHost) {
return {
list() {
return integrations;
},
byUrl(url) {
try {
const parsed = typeof url === "string" ? new URL(url) : url;
return integrations.find((i) => getHost(i) === parsed.host);
} catch {
return void 0;
}
},
byHost(host) {
return integrations.find((i) => getHost(i) === host);
}
};
}
function defaultScmResolveUrl(options) {
const { url, base, lineNumber } = options;
try {
new URL(url);
return url;
} catch {
}
let updated;
if (url.startsWith("/")) {
const { href, filepath } = parseGitUrlSafe(base);
updated = new URL(href);
const repoRootPath = lodash.trimEnd(
updated.pathname.substring(0, updated.pathname.length - filepath.length),
"/"
);
updated.pathname = `${repoRootPath}${url}`;
} else {
updated = new URL(url, base);
}
updated.search = new URL(base).search;
if (lineNumber) {
updated.hash = `L${lineNumber}`;
}
return updated.toString();
}
exports.basicIntegrations = basicIntegrations;
exports.defaultScmResolveUrl = defaultScmResolveUrl;
exports.isValidHost = isValidHost;
exports.isValidUrl = isValidUrl;
exports.parseGitUrlSafe = parseGitUrlSafe;
//# sourceMappingURL=helpers.cjs.js.map