@open-audio-stack/core
Version:
Open-source audio plugin management software
76 lines (75 loc) • 2.55 kB
JavaScript
import * as semver from 'semver';
import { packageErrors, packageIsVerified, packageRecommendations } from '../helpers/package.js';
import { isValidSlug } from '../helpers/utils.js';
import { Base } from './Base.js';
export class Package extends Base {
reports;
slug;
version;
versions;
constructor(slug, versions) {
super();
if (!isValidSlug(slug))
this.log('Invalid package slug', slug);
this.reports = new Map();
this.slug = slug;
this.versions = versions ? new Map(Object.entries(versions)) : new Map();
this.version = this.latestVersion();
}
addVersion(num, version) {
// For now allow package versions to be overwritten.
// if (this.versions.has(num)) return this.log(`Package ${version.name} version ${num} already exists`);
const errors = packageErrors(version);
const recs = packageRecommendations(version);
const report = {
...(errors.length > 0 && { errors }),
...(recs.length > 0 && { recs }),
};
if (Object.keys(report).length > 0)
this.reports.set(num, report);
if (errors.length > 0)
return this.log(`Package ${version.name} version ${num} errors`, errors);
version.verified = packageIsVerified(this.slug, version);
this.versions.set(num, version);
this.version = this.latestVersion();
}
removeVersion(num) {
if (!this.versions.has(num))
return;
this.versions.delete(num);
this.version = this.latestVersion();
}
getReport() {
return Object.fromEntries(this.reports);
}
outputReport() {
const reports = this.getReport();
for (const [ver, report] of Object.entries(reports)) {
this.logReport(`${this.slug}/${ver}`, report.errors, report.recs);
}
}
getVersion(num) {
return this.versions.get(num);
}
getVersionLatest() {
return this.versions.get(this.latestVersion());
}
getVersionOrLatest(num) {
if (num) {
const pkgVersion = this.getVersion(num);
if (pkgVersion)
return pkgVersion;
}
return this.getVersionLatest();
}
latestVersion() {
return Array.from(this.versions.keys()).sort(semver.rcompare)[0] || '0.0.0';
}
toJSON() {
return {
slug: this.slug,
version: this.version,
versions: Object.fromEntries(this.versions),
};
}
}