cnpmcore
Version:
204 lines • 16.9 kB
JavaScript
;
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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