import { EsmcI } from '.'; import { GetService, PutService } from './service'; import { checkVersionIsLow } from './util'; export type PublishBody = { name: string; version: string; main: string; deps: string[]; publisher: string; owner?: string[]; }; export class EsmcController { constructor(service: { get: GetService; put: PutService }) { this.get = service.get; this.put = service.put; } get: GetService; put: PutService; getBuyName = async (name: string) => { // 根据带版本的name返回资源 const nameVersion = name.split('@'); const nameStr = nameVersion[0]; const versionArr = nameVersion[1]?.split('.').map((ele) => +ele); if (!versionArr) { return await this.get(nameStr); } return await this.get(nameStr, ...versionArr); }; publish = async (data: PublishBody) => { const { version, name, deps, main, owner = [], publisher } = data; const versionArr = version.split('.').map((ele) => +ele); if (versionArr.length !== 3) { return { succ: false, errMsg: 'version must like major.minor.patch; such as 1.2.3', }; } const lastVersion = (await this.get(name)).data || ({} as EsmcI); if (lastVersion.owner && !lastVersion.owner.includes(publisher)) { // check has access return { succ: false, errMsg: 'no auth', }; } const lastVersionArr = [ lastVersion.majorVersion, lastVersion.minorVersion, lastVersion.patchVersion, ]; if (!checkVersionIsLow(versionArr, lastVersionArr)) { return { succ: false, errMsg: 'version has published', }; } return await this.put({ name, main, deps, owner, majorVersion: versionArr[0], minorVersion: versionArr[1], patchVersion: versionArr[2], }); }; }