UNPKG

cnpmcore

Version:
204 lines 16.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.cnpmcoreConfig = void 0; const node_assert_1 = require("node:assert"); const node_crypto_1 = require("node:crypto"); const node_path_1 = require("node:path"); const oss_cnpm_1 = __importDefault(require("oss-cnpm")); const typebox_1 = require("../app/port/typebox"); const constants_1 = require("../app/common/constants"); exports.cnpmcoreConfig = { name: 'cnpm', hookEnable: false, hooksLimit: 20, sourceRegistry: 'https://registry.npmjs.org', sourceRegistryIsCNpm: false, syncUpstreamFirst: false, sourceRegistrySyncTimeout: 180000, taskQueueHighWaterSize: 100, syncMode: constants_1.SyncMode.none, syncDeleteMode: constants_1.SyncDeleteMode.delete, syncPackageWorkerMaxConcurrentTasks: 10, triggerHookWorkerMaxConcurrentTasks: 10, createTriggerHookWorkerMaxConcurrentTasks: 10, syncPackageBlockList: [], enableCheckRecentlyUpdated: true, enableSyncBinary: false, syncBinaryFromAPISource: '', enableSyncDownloadData: false, syncDownloadDataSourceRegistry: '', syncDownloadDataMaxDate: '', enableChangesStream: false, checkChangesStreamInterval: 500, changesStreamRegistry: 'https://replicate.npmjs.com', changesStreamRegistryMode: constants_1.ChangesStreamMode.streaming, registry: process.env.CNPMCORE_CONFIG_REGISTRY || 'http://localhost:7001', alwaysAuth: false, allowScopes: [ '@cnpm', '@cnpmcore', '@example', ], allowPublishNonScopePackage: false, allowPublicRegistration: true, admins: { cnpmcore_admin: 'admin@cnpmjs.org', }, enableWebAuthn: !!process.env.CNPMCORE_CONFIG_ENABLE_WEB_AUTHN, enableCDN: false, cdnCacheControlHeader: 'public, max-age=300', cdnVaryHeader: 'Accept, Accept-Encoding', enableStoreFullPackageVersionManifestsToDatabase: false, enableNpmClientAndVersionCheck: true, syncNotFound: false, redirectNotFound: true, enableUnpkg: true, enableSyncUnpkgFiles: true, enableSyncUnpkgFilesWhiteList: false, strictSyncSpecivicVersion: false, enableElasticsearch: !!process.env.CNPMCORE_CONFIG_ENABLE_ES, elasticsearchIndex: 'cnpmcore_packages', strictValidateTarballPkg: false, }; exports.default = (appInfo) => { const config = {}; config.keys = process.env.CNPMCORE_EGG_KEYS || (0, node_crypto_1.randomUUID)(); config.cnpmcore = exports.cnpmcoreConfig; // override config from framework / plugin config.dataDir = process.env.CNPMCORE_DATA_DIR || (0, node_path_1.join)(appInfo.root, '.cnpmcore'); config.orm = { client: 'mysql2', database: process.env.CNPMCORE_MYSQL_DATABASE || process.env.MYSQL_DATABASE || 'cnpmcore', host: process.env.CNPMCORE_MYSQL_HOST || process.env.MYSQL_HOST || '127.0.0.1', port: process.env.CNPMCORE_MYSQL_PORT || process.env.MYSQL_PORT || 3306, user: process.env.CNPMCORE_MYSQL_USER || process.env.MYSQL_USER || 'root', password: process.env.CNPMCORE_MYSQL_PASSWORD || process.env.MYSQL_PASSWORD, charset: 'utf8mb4', logger: { // https://github.com/cyjake/leoric/blob/master/docs/zh/logging.md#logqueryerror // ignore query error logQueryError() { }, }, }; config.redis = { client: { port: Number(process.env.CNPMCORE_REDIS_PORT || 6379), host: process.env.CNPMCORE_REDIS_HOST || '127.0.0.1', password: process.env.CNPMCORE_REDIS_PASSWORD || '', db: Number(process.env.CNPMCORE_REDIS_DB || 0), }, }; config.security = { csrf: { enable: false, }, }; config.cors = { // allow all domains origin: (ctx) => { return ctx.get('Origin'); }, credentials: true, // https://github.com/koajs/cors/blob/master/index.js#L10C57-L10C64 allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS', }; config.nfs = { client: null, dir: process.env.CNPMCORE_NFS_DIR || (0, node_path_1.join)(config.dataDir, 'nfs'), }; /* c8 ignore next 17 */ // enable oss nfs store by env values if (process.env.CNPMCORE_NFS_TYPE === 'oss') { (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_OSS_BUCKET, 'require env CNPMCORE_NFS_OSS_BUCKET'); (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_OSS_ENDPOINT, 'require env CNPMCORE_NFS_OSS_ENDPOINT'); (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_OSS_ID, 'require env CNPMCORE_NFS_OSS_ID'); (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_OSS_SECRET, 'require env CNPMCORE_NFS_OSS_SECRET'); config.nfs.client = new oss_cnpm_1.default({ cdnBaseUrl: process.env.CNPMCORE_NFS_OSS_CDN, endpoint: process.env.CNPMCORE_NFS_OSS_ENDPOINT, bucket: process.env.CNPMCORE_NFS_OSS_BUCKET, accessKeyId: process.env.CNPMCORE_NFS_OSS_ID, accessKeySecret: process.env.CNPMCORE_NFS_OSS_SECRET, defaultHeaders: { 'Cache-Control': 'max-age=0, s-maxage=60', }, }); } else if (process.env.CNPMCORE_NFS_TYPE === 's3') { (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_S3_CLIENT_ENDPOINT, 'require env CNPMCORE_NFS_S3_CLIENT_ENDPOINT'); (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_S3_CLIENT_ID, 'require env CNPMCORE_NFS_S3_CLIENT_ID'); (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_S3_CLIENT_SECRET, 'require env CNPMCORE_NFS_S3_CLIENT_SECRET'); (0, node_assert_1.strict)(process.env.CNPMCORE_NFS_S3_CLIENT_BUCKET, 'require env CNPMCORE_NFS_S3_CLIENT_BUCKET'); // eslint-disable-next-line @typescript-eslint/no-var-requires const S3Client = require('s3-cnpmcore'); config.nfs.client = new S3Client({ region: process.env.CNPMCORE_NFS_S3_CLIENT_REGION || 'default', endpoint: process.env.CNPMCORE_NFS_S3_CLIENT_ENDPOINT, credentials: { accessKeyId: process.env.CNPMCORE_NFS_S3_CLIENT_ID, secretAccessKey: process.env.CNPMCORE_NFS_S3_CLIENT_SECRET, }, bucket: process.env.CNPMCORE_NFS_S3_CLIENT_BUCKET, forcePathStyle: !!process.env.CNPMCORE_NFS_S3_CLIENT_FORCE_PATH_STYLE, disableURL: !!process.env.CNPMCORE_NFS_S3_CLIENT_DISABLE_URL, }); } config.logger = { enablePerformanceTimer: true, enableFastContextLogger: true, appLogName: process.env.CNPMCORE_APP_LOG_NAME || `${appInfo.name}-web.log`, coreLogName: process.env.CNPMCORE_CORE_LOG_NAME || 'egg-web.log', agentLogName: process.env.CNPMCORE_AGENT_LOG_NAME || 'egg-agent.log', errorLogName: process.env.CNPMCORE_ERROR_LOG_NAME || 'common-error.log', outputJSON: Boolean(process.env.CNPMCORE_LOG_JSON_OUTPUT || false), }; if (process.env.CNPMCORE_LOG_DIR) { config.logger.dir = process.env.CNPMCORE_LOG_DIR; } if (process.env.CNPMCORE_LOG_JSON_OUTPUT) { config.logger.outputJSON = Boolean(process.env.CNPMCORE_LOG_JSON_OUTPUT); } config.logrotator = { // only keep 1 days log files maxDays: 1, }; config.bodyParser = { // saveTag will send version string in JSON format strict: false, // set default limit to 10mb, see https://github.com/npm/npm/issues/12750 jsonLimit: '10mb', // https://github.com/cnpm/cnpmcore/issues/551 ignore: constants_1.NOT_IMPLEMENTED_PATH, }; // https://github.com/xiekw2010/egg-typebox-validate#%E5%A6%82%E4%BD%95%E5%86%99%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%A1%E9%AA%8C%E8%A7%84%E5%88%99 config.typeboxValidate = { patchAjv: typebox_1.patchAjv }; config.httpclient = { useHttpClientNext: true, }; config.view = { root: (0, node_path_1.join)(appInfo.baseDir, 'app/port'), defaultViewEngine: 'nunjucks', }; config.customLogger = { sqlLogger: { file: 'sql.log', }, }; // more options: https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/configuration.html if (config.cnpmcore.enableElasticsearch) { config.elasticsearch = { client: { node: process.env.CNPMCORE_CONFIG_ES_CLIENT_NODE, auth: { username: process.env.CNPMCORE_CONFIG_ES_CLIENT_AUTH_USERNAME, password: process.env.CNPMCORE_CONFIG_ES_CLIENT_AUTH_PASSWORD, }, }, }; } return config; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb25maWcvY29uZmlnLmRlZmF1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkNBQStDO0FBQy9DLDZDQUF5QztBQUN6Qyx5Q0FBaUM7QUFFakMsd0RBQWlDO0FBQ2pDLGlEQUErQztBQUMvQyx1REFBNEc7QUFHL0YsUUFBQSxjQUFjLEdBQW1CO0lBQzVDLElBQUksRUFBRSxNQUFNO0lBQ1osVUFBVSxFQUFFLEtBQUs7SUFDakIsVUFBVSxFQUFFLEVBQUU7SUFDZCxjQUFjLEVBQUUsNEJBQTRCO0lBQzVDLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsaUJBQWlCLEVBQUUsS0FBSztJQUN4Qix5QkFBeUIsRUFBRSxNQUFNO0lBQ2pDLHNCQUFzQixFQUFFLEdBQUc7SUFDM0IsUUFBUSxFQUFFLG9CQUFRLENBQUMsSUFBSTtJQUN2QixjQUFjLEVBQUUsMEJBQWMsQ0FBQyxNQUFNO0lBQ3JDLG1DQUFtQyxFQUFFLEVBQUU7SUFDdkMsbUNBQW1DLEVBQUUsRUFBRTtJQUN2Qyx5Q0FBeUMsRUFBRSxFQUFFO0lBQzdDLG9CQUFvQixFQUFFLEVBQUU7SUFDeEIsMEJBQTBCLEVBQUUsSUFBSTtJQUNoQyxnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLHVCQUF1QixFQUFFLEVBQUU7SUFDM0Isc0JBQXNCLEVBQUUsS0FBSztJQUM3Qiw4QkFBOEIsRUFBRSxFQUFFO0lBQ2xDLHVCQUF1QixFQUFFLEVBQUU7SUFDM0IsbUJBQW1CLEVBQUUsS0FBSztJQUMxQiwwQkFBMEIsRUFBRSxHQUFHO0lBQy9CLHFCQUFxQixFQUFFLDZCQUE2QjtJQUNwRCx5QkFBeUIsRUFBRSw2QkFBaUIsQ0FBQyxTQUFTO0lBQ3RELFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLHVCQUF1QjtJQUN6RSxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUU7UUFD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