"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (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 (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.typescriptVersionIsAtLeast = void 0;
const semver = __importStar(require("semver"));
const ts = __importStar(require("typescript"));
function semverCheck(version) {
    return semver.satisfies(ts.version, `>= ${version}.0 || >= ${version}.1-rc || >= ${version}.0-beta`, {
        includePrerelease: true,
    });
}
const versions = [
    //
    '3.7',
    '3.8',
    '3.9',
    '4.0',
];
const typescriptVersionIsAtLeast = {};
exports.typescriptVersionIsAtLeast = typescriptVersionIsAtLeast;
for (const version of versions) {
    typescriptVersionIsAtLeast[version] = semverCheck(version);
}
//# sourceMappingURL=version-check.js.map