UNPKG

@tsed/cli

Version:
110 lines (109 loc) 4.49 kB
import { __decorate } from "tslib"; import { CliPackageJson, Command, createSubTasks, Inject, inject, NpmRegistryClient, PackageManagersModule, ProjectPackageJson } from "@tsed/cli-core"; import { getValue } from "@tsed/core"; import semver from "semver"; import { IGNORE_TAGS, IGNORE_VERSIONS, MINIMAL_TSED_VERSION } from "../../constants/index.js"; function cleanVersion(version = "") { return version.replace(/[\^~>=]/gi, ""); } function isGreaterThan(a, b) { a = cleanVersion(a); b = cleanVersion(b); return semver.gt(a, b) || a === b; } function shouldUpdate(pkg) { return pkg.includes("@tsed") && !pkg.includes("@tsed/cli") && !pkg.includes("@tsed/logger") && !pkg.includes("@tsed/barrels"); } let UpdateCmd = class UpdateCmd { constructor() { this.npmRegistryClient = inject(NpmRegistryClient); this.projectPackage = inject(ProjectPackageJson); this.packageManagers = inject(PackageManagersModule); this.cliPackage = inject(CliPackageJson); } async $prompt(initialOptions) { const versions = await this.getAvailableVersions(); return [ { type: "list", name: "version", message: "Select a Ts.ED version", default: initialOptions.version, when: !initialOptions.version, choices: versions } ]; } async $exec(ctx) { Object.keys(this.projectPackage.dependencies).forEach((pkg) => { if (shouldUpdate(pkg)) { this.projectPackage.addDependency(pkg, ctx.version); } }); Object.keys(this.projectPackage.devDependencies).forEach((pkg) => { if (shouldUpdate(pkg)) { this.projectPackage.addDevDependency(pkg, ctx.version); } }); const projectLoggerVersion = this.projectPackage.dependencies["@tsed/logger"]; if (projectLoggerVersion) { const loggerVersion = getValue("dependencies.@tsed/logger", this.versions[ctx.version], ""); if (loggerVersion && isGreaterThan(loggerVersion, projectLoggerVersion)) { this.projectPackage.addDependency("@tsed/logger", loggerVersion); } } const cliVersion = await this.getEligibleCliVersion(ctx.version); if (cliVersion) { Object.entries(this.projectPackage.devDependencies).forEach(([pkg, version]) => { if (pkg.includes("@tsed/cli-plugin") && isGreaterThan(cliVersion, version)) { this.projectPackage.addDevDependency(pkg, cliVersion); } }); } return [ { title: "Update packages", task: createSubTasks(() => this.packageManagers.install(), { ...ctx, concurrent: false }) } ]; } async getAvailableVersions() { const { versions } = await this.npmRegistryClient.info("@tsed/platform-http", 10); this.versions = versions; return Object.keys(versions) .filter((version) => version.split(".")[0] >= MINIMAL_TSED_VERSION) .sort((a, b) => (isGreaterThan(a, b) ? -1 : 1)) .filter((version) => !IGNORE_VERSIONS.includes(version)) .filter((version) => (IGNORE_TAGS ? !version.match(IGNORE_TAGS) : true)) .splice(0, 30); } async getEligibleCliVersion(tsedVersion) { let result; result = await this.npmRegistryClient.info("@tsed/cli-core", 10); if (!result) { result = await this.npmRegistryClient.info("@tsed/cli", 10); } let version; if (result) { const { versions } = result; version = Object.keys(versions) .sort((a, b) => (isGreaterThan(a, b) ? -1 : 1)) .find((pkg) => { const tsedCore = versions[pkg].devDependencies["@tsed/core"] || versions[pkg].dependencies["@tsed/core"]; if (tsedCore) { return isGreaterThan(tsedVersion, tsedCore); } }); } return version && isGreaterThan(version, this.cliPackage.version) ? version : this.cliPackage.version; } }; UpdateCmd = __decorate([ Command({ name: "update", description: "Update all Ts.ED packages used by your project", args: {}, options: {} }) ], UpdateCmd); export { UpdateCmd };