"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isLocalHost = exports.compareVersionStrings = exports.parseVersionString = exports.parseRuntimeVersion = exports.removePathSegments = exports.trimSlashes = exports.isValidWildcardMatch = exports.extractParamsFromPath = void 0;
const wildcardRegex = new RegExp("{[^/{}]*}");
const wildcardKeyRegex = new RegExp("^{(.+)}$");
function extractParamsFromPath(wildcardPath, snapshotPath) {
    if (!isValidWildcardMatch(wildcardPath, snapshotPath)) {
        return {};
    }
    const wildcardChunks = trimSlashes(wildcardPath).split("/");
    const snapshotChunks = trimSlashes(snapshotPath).split("/");
    return wildcardChunks
        .slice(-snapshotChunks.length)
        .reduce((params, chunk, index) => {
        const match = wildcardKeyRegex.exec(chunk);
        if (match) {
            const wildcardKey = match[1];
            const potentialWildcardValue = snapshotChunks[index];
            if (!wildcardKeyRegex.exec(potentialWildcardValue)) {
                params[wildcardKey] = potentialWildcardValue;
            }
        }
        return params;
    }, {});
}
exports.extractParamsFromPath = extractParamsFromPath;
function isValidWildcardMatch(wildcardPath, snapshotPath) {
    const wildcardChunks = trimSlashes(wildcardPath).split("/");
    const snapshotChunks = trimSlashes(snapshotPath).split("/");
    if (snapshotChunks.length > wildcardChunks.length) {
        return false;
    }
    const mismatchedChunks = wildcardChunks.slice(-snapshotChunks.length).filter((chunk, index) => {
        return !(wildcardRegex.exec(chunk) || chunk === snapshotChunks[index]);
    });
    return mismatchedChunks.length === 0;
}
exports.isValidWildcardMatch = isValidWildcardMatch;
function trimSlashes(str) {
    return str
        .split("/")
        .filter((c) => c)
        .join("/");
}
exports.trimSlashes = trimSlashes;
function removePathSegments(path, count) {
    return trimSlashes(path).split("/").slice(count).join("/");
}
exports.removePathSegments = removePathSegments;
function parseRuntimeVersion(runtime) {
    if (!runtime) {
        return undefined;
    }
    const runtimeRe = /(nodejs)?([0-9]+)/;
    const match = runtimeRe.exec(runtime);
    if (match) {
        return Number.parseInt(match[2]);
    }
    return undefined;
}
exports.parseRuntimeVersion = parseRuntimeVersion;
function parseVersionString(version) {
    const parts = (version || "0").split(".");
    parts.push("0");
    parts.push("0");
    return {
        major: parseInt(parts[0], 10),
        minor: parseInt(parts[1], 10),
        patch: parseInt(parts[2], 10),
    };
}
exports.parseVersionString = parseVersionString;
function compareVersionStrings(a, b) {
    const versionA = parseVersionString(a);
    const versionB = parseVersionString(b);
    if (versionA.major !== versionB.major) {
        return versionA.major - versionB.major;
    }
    if (versionA.minor !== versionB.minor) {
        return versionA.minor - versionB.minor;
    }
    if (versionA.patch !== versionB.patch) {
        return versionA.patch - versionB.patch;
    }
    return 0;
}
exports.compareVersionStrings = compareVersionStrings;
function isLocalHost(href) {
    return !!href.match(/^(http(s)?:\/\/)?(localhost|127.0.0.1|\[::1])/);
}
exports.isLocalHost = isLocalHost;