cnpmcore
Version:
180 lines • 14.2 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);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractController = void 0;
const egg_errors_1 = require("egg-errors");
const tegg_1 = require("@eggjs/tegg");
const middleware_1 = require("../middleware");
const UserRoleManager_1 = require("../UserRoleManager");
const PackageRepository_1 = require("../../repository/PackageRepository");
const UserRepository_1 = require("../../repository/UserRepository");
const PackageUtil_1 = require("../../common/PackageUtil");
const UserService_1 = require("../../core/service/UserService");
const typebox_1 = require("../typebox");
const constants_1 = require("../../common/constants");
class PackageNotFoundError extends egg_errors_1.NotFoundError {
}
class ControllerRedirectError extends egg_errors_1.NotFoundError {
constructor(location) {
super();
this.location = location;
}
}
class AbstractController extends middleware_1.MiddlewareController {
get sourceRegistry() {
return this.config.cnpmcore.sourceRegistry;
}
get enableSync() {
return this.config.cnpmcore.syncMode !== constants_1.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);
let pkg = null;
if (checkPkgExist) {
const [scope, name] = (0, PackageUtil_1.getScopeAndName)(fullname);
pkg = await this.packageRepository.findPackage(scope, name);
if (!pkg) {
throw this.createPackageNotFoundError(fullname, undefined);
}
}
return {
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`;
const err = new PackageNotFoundError(message);
return err;
}
createPackageNotFoundErrorWithRedirect(fullname, version, allowSync = false) {
// const err = new PackageNotFoundError(message);
const err = this.createPackageNotFoundError(fullname, version);
const [scope] = (0, PackageUtil_1.getScopeAndName)(fullname);
// dont sync private scope
if (!this.isPrivateScope(scope)) {
// syncMode = none/admin, redirect public package to source registry
if (!this.enableSync && this.config.cnpmcore.syncMode !== constants_1.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 egg_errors_1.UnavailableForLegalReasonsError(`${message}, reason: ${reason}`);
}
async getPackageEntityByFullname(fullname, allowSync) {
const [scope, name] = (0, PackageUtil_1.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 = (0, PackageUtil_1.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 = (0, PackageUtil_1.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.substring(name.length + 1);
// check version format
const data = { version };
ctx.tValidate(typebox_1.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);
}
}
}
exports.AbstractController = AbstractController;
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], AbstractController.prototype, "logger", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", Object)
], AbstractController.prototype, "config", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", UserRoleManager_1.UserRoleManager)
], AbstractController.prototype, "userRoleManager", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", PackageRepository_1.PackageRepository)
], AbstractController.prototype, "packageRepository", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", UserRepository_1.UserRepository)
], AbstractController.prototype, "userRepository", void 0);
__decorate([
(0, tegg_1.Inject)(),
__metadata("design:type", UserService_1.UserService)
], AbstractController.prototype, "userService", void 0);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9BYnN0cmFjdENvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsMkNBR29CO0FBQ3BCLHNDQUdxQjtBQUtyQiw4Q0FBcUQ7QUFDckQsd0RBQXFEO0FBQ3JELDBFQUF1RTtBQUN2RSxvRUFBaUU7QUFDakUsMERBQXdFO0FBR3hFLGdFQUE2RDtBQUM3RCx3Q0FFb0I7QUFDcEIsc0RBQWtEO0FBRWxELE1BQU0sb0JBQXFCLFNBQVEsMEJBQWE7Q0FFL0M7QUFFRCxNQUFNLHVCQUF3QixTQUFRLDBCQUFhO0lBRWpELFlBQVksUUFBZ0I7UUFDMUIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFFRCxNQUFzQixrQkFBbUIsU0FBUSxpQ0FBb0I7SUFjbkUsSUFBYyxjQUFjO1FBQzFCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFjLFVBQVU7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssb0JBQVEsQ0FBQyxJQUFJLENBQUM7SUFDekQsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVTLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxHQUFlLEVBQUUsUUFBZ0IsRUFBRSxhQUFhLEdBQUcsSUFBSTtRQUN6RixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFFB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