cnpmcore
Version:
Private NPM Registry for Enterprise
175 lines • 13.8 kB
JavaScript
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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