UNPKG

cnpmcore

Version:

Private NPM Registry for Enterprise

175 lines 13.8 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { Inject } from 'egg'; import { NotFoundError, UnavailableForLegalReasonsError } from 'egg/errors'; import { SyncMode } from "../../common/constants.js"; import { getFullname, getScopeAndName } from "../../common/PackageUtil.js"; import { MiddlewareController } from "../middleware/index.js"; import { VersionRule } from "../typebox.js"; class PackageNotFoundError extends NotFoundError { } class ControllerRedirectError extends NotFoundError { constructor(location) { super(); this.location = location; } } export class AbstractController extends MiddlewareController { get sourceRegistry() { return this.config.cnpmcore.sourceRegistry; } get enableSync() { return this.config.cnpmcore.syncMode !== SyncMode.none; } isPrivateScope(scope) { return scope && this.config.cnpmcore.allowScopes.includes(scope); } async ensurePublishAccess(ctx, fullname, checkPkgExist = true) { const user = await this.userRoleManager.checkPublishAccess(ctx, fullname); if (!checkPkgExist) { // @ts-expect-error checkPkgExist is false, pkg is undefined return { user, }; } const [scope, name] = getScopeAndName(fullname); const pkg = await this.packageRepository.findPackage(scope, name); if (!pkg) { throw this.createPackageNotFoundError(fullname); } return { // @ts-expect-error pkg exists pkg, user, }; } get syncNotFound() { return this.config.cnpmcore.syncNotFound; } get redirectNotFound() { return this.config.cnpmcore.redirectNotFound; } getAllowSync(ctx) { let allowSync = false; // request not by node, consider it request from web, don't sync const ua = ctx.get('user-agent'); if (!ua || !ua.includes('node')) { return allowSync; } // if request with `/xxx?write=true`, meaning the read request using for write, don't sync if (ctx.query.write) { return allowSync; } allowSync = true; return allowSync; } createControllerRedirectError(location) { return new ControllerRedirectError(location); } createPackageNotFoundError(fullname, version) { const message = version ? `${fullname}@${version} not found` : `${fullname} not found`; return new PackageNotFoundError(message); } createPackageNotFoundErrorWithRedirect(fullname, version, allowSync = false) { // const err = new PackageNotFoundError(message); const err = this.createPackageNotFoundError(fullname, version); const [scope] = getScopeAndName(fullname); // don't sync private scope if (!this.isPrivateScope(scope)) { // syncMode = none/admin, redirect public package to source registry if (!this.enableSync && this.config.cnpmcore.syncMode !== SyncMode.admin) { if (this.redirectNotFound) { err.redirectToSourceRegistry = this.sourceRegistry; } } else { // syncMode = all/exist if (allowSync && this.syncNotFound) { // ErrorHandler will use syncPackage to create sync task err.syncPackage = { fullname, }; } if (allowSync && this.redirectNotFound) { // redirect when package not found err.redirectToSourceRegistry = this.sourceRegistry; } } } return err; } createPackageBlockError(reason, fullname, version) { const message = version ? `${fullname}@${version} was blocked` : `${fullname} was blocked`; return new UnavailableForLegalReasonsError(`${message}, reason: ${reason}`); } async getPackageEntityByFullname(fullname, allowSync) { const [scope, name] = getScopeAndName(fullname); return await this.getPackageEntity(scope, name, allowSync); } // try to get package entity, throw NotFoundError when package not exists async getPackageEntity(scope, name, allowSync) { const packageEntity = await this.packageRepository.findPackage(scope, name); if (!packageEntity) { const fullname = getFullname(scope, name); throw this.createPackageNotFoundErrorWithRedirect(fullname, undefined, allowSync); } return packageEntity; } async getPackageVersionEntity(pkg, version, allowSync) { const packageVersion = await this.packageRepository.findPackageVersion(pkg.packageId, version); if (!packageVersion) { throw this.createPackageNotFoundErrorWithRedirect(pkg.fullname, version, allowSync); } return packageVersion; } getAndCheckVersionFromFilename(ctx, fullname, filenameWithVersion) { const scopeAndName = getScopeAndName(fullname); const name = scopeAndName[1]; // @foo/bar/-/bar-1.0.0 == filename: bar ==> 1.0.0 // bar/-/bar-1.0.0 == filename: bar ==> 1.0.0 const version = filenameWithVersion.slice(name.length + 1); // check version format const data = { version }; ctx.tValidate(VersionRule, data); return data.version; } setCDNHeaders(ctx) { const config = this.config.cnpmcore; if (config.enableCDN) { ctx.set('cache-control', config.cdnCacheControlHeader); ctx.vary(config.cdnVaryHeader); } } } __decorate([ Inject(), __metadata("design:type", Function) ], AbstractController.prototype, "logger", void 0); __decorate([ Inject(), __metadata("design:type", Object) ], AbstractController.prototype, "config", void 0); __decorate([ Inject(), __metadata("design:type", Function) ], AbstractController.prototype, "userRoleManager", void 0); __decorate([ Inject(), __metadata("design:type", Function) ], AbstractController.prototype, "packageRepository", void 0); __decorate([ Inject(), __metadata("design:type", Function) ], AbstractController.prototype, "userRepository", void 0); __decorate([ Inject(), __metadata("design:type", Function) ], AbstractController.prototype, "userService", void 0); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9BYnN0cmFjdENvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFnQixNQUFNLEVBQXdCLE1BQU0sS0FBSyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFPM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc1QyxNQUFNLG9CQUFxQixTQUFRLGFBQWE7Q0FFL0M7QUFFRCxNQUFNLHVCQUF3QixTQUFRLGFBQWE7SUFFakQsWUFBWSxRQUFnQjtRQUMxQixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBZ0Isa0JBQW1CLFNBQVEsb0JBQW9CO0lBY25FLElBQWMsY0FBYztRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBYyxVQUFVO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDekQsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENB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