@verdaccio/config 9.0.0-next-9.8 → 9.0.0-next-9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -268,7 +268,6 @@ log:
268
268
  # Renamed from "experiments" to "flags" in next major release
269
269
  # flags:
270
270
  # changePassword: true
271
- # searchRemote: true
272
271
 
273
272
  # Translate your registry, API and web UI
274
273
  # List of the available translations https://github.com/verdaccio/verdaccio/blob/master/packages/plugins/ui-theme/src/i18n/ABOUT_TRANSLATIONS.md
@@ -264,7 +264,6 @@ log:
264
264
  # Renamed from "experiments" to "flags" in next major release
265
265
  # flags:
266
266
  # changePassword: true
267
- # searchRemote: true
268
267
 
269
268
  # Translate your registry, API and web UI
270
269
  # List of the available translations https://github.com/verdaccio/verdaccio/blob/master/packages/plugins/ui-theme/src/i18n/ABOUT_TRANSLATIONS.md
package/build/config.js CHANGED
@@ -65,7 +65,6 @@ var Config = class {
65
65
  ...config.server
66
66
  };
67
67
  this.flags = {
68
- searchRemote: config.flags?.searchRemote ?? true,
69
68
  changePassword: config.flags?.changePassword ?? false,
70
69
  webLogin: config.flags?.webLogin ?? false,
71
70
  createUser: config.flags?.createUser ?? false
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { isEmpty, merge } from 'lodash-es';\nimport assert from 'node:assert';\n\nimport { APP_ERROR, authUtils, cryptoUtils, validationUtils } from '@verdaccio/core';\nimport type {\n Config as AppConfig,\n AuthConf,\n ConfigYaml,\n FlagsConfig,\n PackageAccess,\n PackageList,\n RateLimit,\n Security,\n ServerSettingsConf,\n} from '@verdaccio/types';\n\nimport { getUserAgent } from './agent';\nimport { normalisePackageAccess } from './package-access';\nimport { defaultSecurity } from './security';\nimport defaultServerSettings from './serverSettings';\nimport { generateRandomSecretKey } from './token';\nimport { sanityCheckUplinksProps, uplinkSanityCheck } from './uplinks';\n\nconst strategicConfigProps = ['uplinks', 'packages'];\nconst allowedEnvConfig = ['http_proxy', 'https_proxy', 'no_proxy'];\nconst debug = buildDebug('verdaccio:config');\n\nexport const WEB_TITLE = 'Verdaccio';\n\n// we limit max 1000 request per 15 minutes on user endpoints\nexport const defaultUserRateLimiting = {\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 1000,\n};\n\nconst TOKEN_VALID_LENGTH = 32;\n\n/**\n * Coordinates the application configuration\n */\nclass Config implements AppConfig {\n public user_agent: string | undefined;\n public uplinks: any;\n public packages: PackageList;\n public users: any;\n public auth: AuthConf;\n public store: any;\n public server_id: string;\n public configPath: string;\n /**\n * @deprecated use configPath or config.getConfigPath();\n */\n public self_path: string;\n public storage: string | void;\n\n public plugins: string | void | null;\n public security: Security;\n public server: ServerSettingsConf;\n // @ts-ignore\n public secret: string;\n public flags: FlagsConfig;\n public userRateLimit: RateLimit;\n public constructor(config: ConfigYaml & { config_path: string }) {\n const self = this;\n this.storage = process.env.VERDACCIO_STORAGE_PATH || config.storage;\n if (!config.configPath) {\n // backport self_path for previous to version 6\n // @ts-expect-error\n config.configPath = config.config_path ?? config.self_path;\n if (!config.configPath) {\n throw new Error('configPath property is required');\n }\n }\n this.configPath = config.configPath;\n this.self_path = this.configPath;\n debug('config path: %s', this.configPath);\n this.plugins = config.plugins;\n this.security = merge(defaultSecurity, config.security);\n this.server = { ...defaultServerSettings, ...config.server };\n this.flags = {\n searchRemote: config.flags?.searchRemote ?? true,\n changePassword: config.flags?.changePassword ?? false,\n webLogin: config.flags?.webLogin ?? false,\n createUser: config.flags?.createUser ?? false,\n };\n this.user_agent = config.user_agent;\n\n for (const configProp in config) {\n if (self[configProp] == null) {\n self[configProp] = config[configProp];\n }\n }\n\n if (typeof this.user_agent === 'undefined') {\n // by default user agent is hidden\n debug('set default user agent');\n this.user_agent = getUserAgent(false);\n }\n\n this.userRateLimit = { ...defaultUserRateLimiting, ...config?.userRateLimit };\n\n // some weird shell scripts are valid yaml files parsed as string\n assert(validationUtils.isObject(config), APP_ERROR.CONFIG_NOT_VALID);\n\n // sanity check for strategic config properties\n strategicConfigProps.forEach(function (x): void {\n if (self[x] == null) {\n self[x] = {};\n }\n\n assert(validationUtils.isObject(self[x]), `CONFIG: bad \"${x}\" value (object expected)`);\n });\n\n this.uplinks = sanityCheckUplinksProps(uplinkSanityCheck(this.uplinks));\n this.packages = normalisePackageAccess(self.packages);\n\n // loading these from ENV if aren't in config\n allowedEnvConfig.forEach((envConf): void => {\n if (!(envConf in self)) {\n self[envConf] = process.env[envConf] || process.env[envConf.toUpperCase()];\n }\n });\n\n // unique identifier of self server (or a cluster), used to avoid loops\n // @ts-ignore\n if (!this.server_id) {\n this.server_id = cryptoUtils.generateRandomHexString(6);\n }\n }\n\n public getConfigPath() {\n return this.configPath;\n }\n\n /**\n * Check for package spec\n * @param pkgName - package name\n * @returns package access\n * @deprecated use core.authUtils instead\n */\n public getMatchedPackagesSpec(pkgName: string): PackageAccess | void {\n // TODO: remove this method and replace by library utils\n return authUtils.getMatchedPackagesSpec(pkgName, this.packages);\n }\n\n /**\n * Verify if the secret complies with the required structure.\n * The secret must be exactly 32 characters long for aes-256-ctr encryption.\n * If no secret is provided, a new one will be generated.\n * @secret external secret key\n */\n public checkSecretKey(secret?: string): string {\n debug('checking secret key init');\n if (typeof secret === 'string' && isEmpty(secret) === false) {\n debug('checking secret key length %s', secret.length);\n if (secret.length !== TOKEN_VALID_LENGTH) {\n throw new Error(\n `Invalid storage secret key length, must be ${TOKEN_VALID_LENGTH} characters long but is ${secret.length}. ` +\n `Please generate a new one. Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`\n );\n }\n debug('detected valid secret key length %s', secret.length);\n this.secret = secret;\n return this.secret;\n } else {\n debug('generating a new secret key');\n this.secret = generateRandomSecretKey();\n debug('generated a new secret key length %s', this.secret?.length);\n return this.secret;\n }\n }\n}\n\nexport { Config };\n"],"mappings":";;;;;;;;;;;;;;AAwBA,IAAM,uBAAuB,CAAC,WAAW,WAAW;AACpD,IAAM,mBAAmB;CAAC;CAAc;CAAe;CAAW;AAClE,IAAM,WAAA,GAAA,MAAA,SAAmB,mBAAmB;AAE5C,IAAa,YAAY;AAGzB,IAAa,0BAA0B;CACrC,UAAU,MAAU;CACpB,KAAK;CACN;AAED,IAAM,qBAAqB;;;;AAK3B,IAAM,SAAN,MAAkC;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;;;CAIA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA,YAAmB,QAA8C;EAC/D,MAAM,OAAO;AACb,OAAK,UAAU,QAAQ,IAAI,0BAA0B,OAAO;AAC5D,MAAI,CAAC,OAAO,YAAY;AAGtB,UAAO,aAAa,OAAO,eAAe,OAAO;AACjD,OAAI,CAAC,OAAO,WACV,OAAM,IAAI,MAAM,kCAAkC;;AAGtD,OAAK,aAAa,OAAO;AACzB,OAAK,YAAY,KAAK;AACtB,UAAM,mBAAmB,KAAK,WAAW;AACzC,OAAK,UAAU,OAAO;AACtB,OAAK,YAAA,GAAA,UAAA,OAAiB,iBAAA,iBAAiB,OAAO,SAAS;AACvD,OAAK,SAAS;GAAE,GAAG,uBAAA;GAAuB,GAAG,OAAO;GAAQ;AAC5D,OAAK,QAAQ;GACX,cAAc,OAAO,OAAO,gBAAgB;GAC5C,gBAAgB,OAAO,OAAO,kBAAkB;GAChD,UAAU,OAAO,OAAO,YAAY;GACpC,YAAY,OAAO,OAAO,cAAc;GACzC;AACD,OAAK,aAAa,OAAO;AAEzB,OAAK,MAAM,cAAc,OACvB,KAAI,KAAK,eAAe,KACtB,MAAK,cAAc,OAAO;AAI9B,MAAI,OAAO,KAAK,eAAe,aAAa;AAE1C,WAAM,yBAAyB;AAC/B,QAAK,aAAa,cAAA,aAAa,MAAM;;AAGvC,OAAK,gBAAgB;GAAE,GAAG;GAAyB,GAAG,QAAQ;GAAe;AAG7E,GAAA,GAAA,YAAA,SAAO,gBAAA,gBAAgB,SAAS,OAAO,EAAE,gBAAA,UAAU,iBAAiB;AAGpE,uBAAqB,QAAQ,SAAU,GAAS;AAC9C,OAAI,KAAK,MAAM,KACb,MAAK,KAAK,EAAE;AAGd,IAAA,GAAA,YAAA,SAAO,gBAAA,gBAAgB,SAAS,KAAK,GAAG,EAAE,gBAAgB,EAAE,2BAA2B;IACvF;AAEF,OAAK,UAAU,gBAAA,wBAAwB,gBAAA,kBAAkB,KAAK,QAAQ,CAAC;AACvE,OAAK,WAAW,uBAAA,uBAAuB,KAAK,SAAS;AAGrD,mBAAiB,SAAS,YAAkB;AAC1C,OAAI,EAAE,WAAW,MACf,MAAK,WAAW,QAAQ,IAAI,YAAY,QAAQ,IAAI,QAAQ,aAAa;IAE3E;AAIF,MAAI,CAAC,KAAK,UACR,MAAK,YAAY,gBAAA,YAAY,wBAAwB,EAAE;;CAI3D,gBAAuB;AACrB,SAAO,KAAK;;;;;;;;CASd,uBAA8B,SAAuC;AAEnE,SAAO,gBAAA,UAAU,uBAAuB,SAAS,KAAK,SAAS;;;;;;;;CASjE,eAAsB,QAAyB;AAC7C,UAAM,2BAA2B;AACjC,MAAI,OAAO,WAAW,aAAA,GAAA,UAAA,SAAoB,OAAO,KAAK,OAAO;AAC3D,WAAM,iCAAiC,OAAO,OAAO;AACrD,OAAI,OAAO,WAAW,mBACpB,OAAM,IAAI,MACR,8CAA8C,mBAAmB,0BAA0B,OAAO,OAAO,oGAE1G;AAEH,WAAM,uCAAuC,OAAO,OAAO;AAC3D,QAAK,SAAS;AACd,UAAO,KAAK;SACP;AACL,WAAM,8BAA8B;AACpC,QAAK,SAAS,cAAA,yBAAyB;AACvC,WAAM,wCAAwC,KAAK,QAAQ,OAAO;AAClE,UAAO,KAAK"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { isEmpty, merge } from 'lodash-es';\nimport assert from 'node:assert';\n\nimport { APP_ERROR, authUtils, cryptoUtils, validationUtils } from '@verdaccio/core';\nimport type {\n Config as AppConfig,\n AuthConf,\n ConfigYaml,\n FlagsConfig,\n PackageAccess,\n PackageList,\n RateLimit,\n Security,\n ServerSettingsConf,\n} from '@verdaccio/types';\n\nimport { getUserAgent } from './agent';\nimport { normalisePackageAccess } from './package-access';\nimport { defaultSecurity } from './security';\nimport defaultServerSettings from './serverSettings';\nimport { generateRandomSecretKey } from './token';\nimport { sanityCheckUplinksProps, uplinkSanityCheck } from './uplinks';\n\nconst strategicConfigProps = ['uplinks', 'packages'];\nconst allowedEnvConfig = ['http_proxy', 'https_proxy', 'no_proxy'];\nconst debug = buildDebug('verdaccio:config');\n\nexport const WEB_TITLE = 'Verdaccio';\n\n// we limit max 1000 request per 15 minutes on user endpoints\nexport const defaultUserRateLimiting = {\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 1000,\n};\n\nconst TOKEN_VALID_LENGTH = 32;\n\n/**\n * Coordinates the application configuration\n */\nclass Config implements AppConfig {\n public user_agent: string | undefined;\n public uplinks: any;\n public packages: PackageList;\n public users: any;\n public auth: AuthConf;\n public store: any;\n public server_id: string;\n public configPath: string;\n /**\n * @deprecated use configPath or config.getConfigPath();\n */\n public self_path: string;\n public storage: string | void;\n\n public plugins: string | void | null;\n public security: Security;\n public server: ServerSettingsConf;\n // @ts-ignore\n public secret: string;\n public flags: FlagsConfig;\n public userRateLimit: RateLimit;\n public constructor(config: ConfigYaml & { config_path: string }) {\n const self = this;\n this.storage = process.env.VERDACCIO_STORAGE_PATH || config.storage;\n if (!config.configPath) {\n // backport self_path for previous to version 6\n // @ts-expect-error\n config.configPath = config.config_path ?? config.self_path;\n if (!config.configPath) {\n throw new Error('configPath property is required');\n }\n }\n this.configPath = config.configPath;\n this.self_path = this.configPath;\n debug('config path: %s', this.configPath);\n this.plugins = config.plugins;\n this.security = merge(defaultSecurity, config.security);\n this.server = { ...defaultServerSettings, ...config.server };\n this.flags = {\n changePassword: config.flags?.changePassword ?? false,\n webLogin: config.flags?.webLogin ?? false,\n createUser: config.flags?.createUser ?? false,\n };\n this.user_agent = config.user_agent;\n\n for (const configProp in config) {\n if (self[configProp] == null) {\n self[configProp] = config[configProp];\n }\n }\n\n if (typeof this.user_agent === 'undefined') {\n // by default user agent is hidden\n debug('set default user agent');\n this.user_agent = getUserAgent(false);\n }\n\n this.userRateLimit = { ...defaultUserRateLimiting, ...config?.userRateLimit };\n\n // some weird shell scripts are valid yaml files parsed as string\n assert(validationUtils.isObject(config), APP_ERROR.CONFIG_NOT_VALID);\n\n // sanity check for strategic config properties\n strategicConfigProps.forEach(function (x): void {\n if (self[x] == null) {\n self[x] = {};\n }\n\n assert(validationUtils.isObject(self[x]), `CONFIG: bad \"${x}\" value (object expected)`);\n });\n\n this.uplinks = sanityCheckUplinksProps(uplinkSanityCheck(this.uplinks));\n this.packages = normalisePackageAccess(self.packages);\n\n // loading these from ENV if aren't in config\n allowedEnvConfig.forEach((envConf): void => {\n if (!(envConf in self)) {\n self[envConf] = process.env[envConf] || process.env[envConf.toUpperCase()];\n }\n });\n\n // unique identifier of self server (or a cluster), used to avoid loops\n // @ts-ignore\n if (!this.server_id) {\n this.server_id = cryptoUtils.generateRandomHexString(6);\n }\n }\n\n public getConfigPath() {\n return this.configPath;\n }\n\n /**\n * Check for package spec\n * @param pkgName - package name\n * @returns package access\n * @deprecated use core.authUtils instead\n */\n public getMatchedPackagesSpec(pkgName: string): PackageAccess | void {\n // TODO: remove this method and replace by library utils\n return authUtils.getMatchedPackagesSpec(pkgName, this.packages);\n }\n\n /**\n * Verify if the secret complies with the required structure.\n * The secret must be exactly 32 characters long for aes-256-ctr encryption.\n * If no secret is provided, a new one will be generated.\n * @secret external secret key\n */\n public checkSecretKey(secret?: string): string {\n debug('checking secret key init');\n if (typeof secret === 'string' && isEmpty(secret) === false) {\n debug('checking secret key length %s', secret.length);\n if (secret.length !== TOKEN_VALID_LENGTH) {\n throw new Error(\n `Invalid storage secret key length, must be ${TOKEN_VALID_LENGTH} characters long but is ${secret.length}. ` +\n `Please generate a new one. Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`\n );\n }\n debug('detected valid secret key length %s', secret.length);\n this.secret = secret;\n return this.secret;\n } else {\n debug('generating a new secret key');\n this.secret = generateRandomSecretKey();\n debug('generated a new secret key length %s', this.secret?.length);\n return this.secret;\n }\n }\n}\n\nexport { Config };\n"],"mappings":";;;;;;;;;;;;;;AAwBA,IAAM,uBAAuB,CAAC,WAAW,WAAW;AACpD,IAAM,mBAAmB;CAAC;CAAc;CAAe;CAAW;AAClE,IAAM,WAAA,GAAA,MAAA,SAAmB,mBAAmB;AAE5C,IAAa,YAAY;AAGzB,IAAa,0BAA0B;CACrC,UAAU,MAAU;CACpB,KAAK;CACN;AAED,IAAM,qBAAqB;;;;AAK3B,IAAM,SAAN,MAAkC;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;;;CAIA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA,YAAmB,QAA8C;EAC/D,MAAM,OAAO;AACb,OAAK,UAAU,QAAQ,IAAI,0BAA0B,OAAO;AAC5D,MAAI,CAAC,OAAO,YAAY;AAGtB,UAAO,aAAa,OAAO,eAAe,OAAO;AACjD,OAAI,CAAC,OAAO,WACV,OAAM,IAAI,MAAM,kCAAkC;;AAGtD,OAAK,aAAa,OAAO;AACzB,OAAK,YAAY,KAAK;AACtB,UAAM,mBAAmB,KAAK,WAAW;AACzC,OAAK,UAAU,OAAO;AACtB,OAAK,YAAA,GAAA,UAAA,OAAiB,iBAAA,iBAAiB,OAAO,SAAS;AACvD,OAAK,SAAS;GAAE,GAAG,uBAAA;GAAuB,GAAG,OAAO;GAAQ;AAC5D,OAAK,QAAQ;GACX,gBAAgB,OAAO,OAAO,kBAAkB;GAChD,UAAU,OAAO,OAAO,YAAY;GACpC,YAAY,OAAO,OAAO,cAAc;GACzC;AACD,OAAK,aAAa,OAAO;AAEzB,OAAK,MAAM,cAAc,OACvB,KAAI,KAAK,eAAe,KACtB,MAAK,cAAc,OAAO;AAI9B,MAAI,OAAO,KAAK,eAAe,aAAa;AAE1C,WAAM,yBAAyB;AAC/B,QAAK,aAAa,cAAA,aAAa,MAAM;;AAGvC,OAAK,gBAAgB;GAAE,GAAG;GAAyB,GAAG,QAAQ;GAAe;AAG7E,GAAA,GAAA,YAAA,SAAO,gBAAA,gBAAgB,SAAS,OAAO,EAAE,gBAAA,UAAU,iBAAiB;AAGpE,uBAAqB,QAAQ,SAAU,GAAS;AAC9C,OAAI,KAAK,MAAM,KACb,MAAK,KAAK,EAAE;AAGd,IAAA,GAAA,YAAA,SAAO,gBAAA,gBAAgB,SAAS,KAAK,GAAG,EAAE,gBAAgB,EAAE,2BAA2B;IACvF;AAEF,OAAK,UAAU,gBAAA,wBAAwB,gBAAA,kBAAkB,KAAK,QAAQ,CAAC;AACvE,OAAK,WAAW,uBAAA,uBAAuB,KAAK,SAAS;AAGrD,mBAAiB,SAAS,YAAkB;AAC1C,OAAI,EAAE,WAAW,MACf,MAAK,WAAW,QAAQ,IAAI,YAAY,QAAQ,IAAI,QAAQ,aAAa;IAE3E;AAIF,MAAI,CAAC,KAAK,UACR,MAAK,YAAY,gBAAA,YAAY,wBAAwB,EAAE;;CAI3D,gBAAuB;AACrB,SAAO,KAAK;;;;;;;;CASd,uBAA8B,SAAuC;AAEnE,SAAO,gBAAA,UAAU,uBAAuB,SAAS,KAAK,SAAS;;;;;;;;CASjE,eAAsB,QAAyB;AAC7C,UAAM,2BAA2B;AACjC,MAAI,OAAO,WAAW,aAAA,GAAA,UAAA,SAAoB,OAAO,KAAK,OAAO;AAC3D,WAAM,iCAAiC,OAAO,OAAO;AACrD,OAAI,OAAO,WAAW,mBACpB,OAAM,IAAI,MACR,8CAA8C,mBAAmB,0BAA0B,OAAO,OAAO,oGAE1G;AAEH,WAAM,uCAAuC,OAAO,OAAO;AAC3D,QAAK,SAAS;AACd,UAAO,KAAK;SACP;AACL,WAAM,8BAA8B;AACpC,QAAK,SAAS,cAAA,yBAAyB;AACvC,WAAM,wCAAwC,KAAK,QAAQ,OAAO;AAClE,UAAO,KAAK"}
package/build/config.mjs CHANGED
@@ -62,7 +62,6 @@ var Config = class {
62
62
  ...config.server
63
63
  };
64
64
  this.flags = {
65
- searchRemote: config.flags?.searchRemote ?? true,
66
65
  changePassword: config.flags?.changePassword ?? false,
67
66
  webLogin: config.flags?.webLogin ?? false,
68
67
  createUser: config.flags?.createUser ?? false
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { isEmpty, merge } from 'lodash-es';\nimport assert from 'node:assert';\n\nimport { APP_ERROR, authUtils, cryptoUtils, validationUtils } from '@verdaccio/core';\nimport type {\n Config as AppConfig,\n AuthConf,\n ConfigYaml,\n FlagsConfig,\n PackageAccess,\n PackageList,\n RateLimit,\n Security,\n ServerSettingsConf,\n} from '@verdaccio/types';\n\nimport { getUserAgent } from './agent';\nimport { normalisePackageAccess } from './package-access';\nimport { defaultSecurity } from './security';\nimport defaultServerSettings from './serverSettings';\nimport { generateRandomSecretKey } from './token';\nimport { sanityCheckUplinksProps, uplinkSanityCheck } from './uplinks';\n\nconst strategicConfigProps = ['uplinks', 'packages'];\nconst allowedEnvConfig = ['http_proxy', 'https_proxy', 'no_proxy'];\nconst debug = buildDebug('verdaccio:config');\n\nexport const WEB_TITLE = 'Verdaccio';\n\n// we limit max 1000 request per 15 minutes on user endpoints\nexport const defaultUserRateLimiting = {\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 1000,\n};\n\nconst TOKEN_VALID_LENGTH = 32;\n\n/**\n * Coordinates the application configuration\n */\nclass Config implements AppConfig {\n public user_agent: string | undefined;\n public uplinks: any;\n public packages: PackageList;\n public users: any;\n public auth: AuthConf;\n public store: any;\n public server_id: string;\n public configPath: string;\n /**\n * @deprecated use configPath or config.getConfigPath();\n */\n public self_path: string;\n public storage: string | void;\n\n public plugins: string | void | null;\n public security: Security;\n public server: ServerSettingsConf;\n // @ts-ignore\n public secret: string;\n public flags: FlagsConfig;\n public userRateLimit: RateLimit;\n public constructor(config: ConfigYaml & { config_path: string }) {\n const self = this;\n this.storage = process.env.VERDACCIO_STORAGE_PATH || config.storage;\n if (!config.configPath) {\n // backport self_path for previous to version 6\n // @ts-expect-error\n config.configPath = config.config_path ?? config.self_path;\n if (!config.configPath) {\n throw new Error('configPath property is required');\n }\n }\n this.configPath = config.configPath;\n this.self_path = this.configPath;\n debug('config path: %s', this.configPath);\n this.plugins = config.plugins;\n this.security = merge(defaultSecurity, config.security);\n this.server = { ...defaultServerSettings, ...config.server };\n this.flags = {\n searchRemote: config.flags?.searchRemote ?? true,\n changePassword: config.flags?.changePassword ?? false,\n webLogin: config.flags?.webLogin ?? false,\n createUser: config.flags?.createUser ?? false,\n };\n this.user_agent = config.user_agent;\n\n for (const configProp in config) {\n if (self[configProp] == null) {\n self[configProp] = config[configProp];\n }\n }\n\n if (typeof this.user_agent === 'undefined') {\n // by default user agent is hidden\n debug('set default user agent');\n this.user_agent = getUserAgent(false);\n }\n\n this.userRateLimit = { ...defaultUserRateLimiting, ...config?.userRateLimit };\n\n // some weird shell scripts are valid yaml files parsed as string\n assert(validationUtils.isObject(config), APP_ERROR.CONFIG_NOT_VALID);\n\n // sanity check for strategic config properties\n strategicConfigProps.forEach(function (x): void {\n if (self[x] == null) {\n self[x] = {};\n }\n\n assert(validationUtils.isObject(self[x]), `CONFIG: bad \"${x}\" value (object expected)`);\n });\n\n this.uplinks = sanityCheckUplinksProps(uplinkSanityCheck(this.uplinks));\n this.packages = normalisePackageAccess(self.packages);\n\n // loading these from ENV if aren't in config\n allowedEnvConfig.forEach((envConf): void => {\n if (!(envConf in self)) {\n self[envConf] = process.env[envConf] || process.env[envConf.toUpperCase()];\n }\n });\n\n // unique identifier of self server (or a cluster), used to avoid loops\n // @ts-ignore\n if (!this.server_id) {\n this.server_id = cryptoUtils.generateRandomHexString(6);\n }\n }\n\n public getConfigPath() {\n return this.configPath;\n }\n\n /**\n * Check for package spec\n * @param pkgName - package name\n * @returns package access\n * @deprecated use core.authUtils instead\n */\n public getMatchedPackagesSpec(pkgName: string): PackageAccess | void {\n // TODO: remove this method and replace by library utils\n return authUtils.getMatchedPackagesSpec(pkgName, this.packages);\n }\n\n /**\n * Verify if the secret complies with the required structure.\n * The secret must be exactly 32 characters long for aes-256-ctr encryption.\n * If no secret is provided, a new one will be generated.\n * @secret external secret key\n */\n public checkSecretKey(secret?: string): string {\n debug('checking secret key init');\n if (typeof secret === 'string' && isEmpty(secret) === false) {\n debug('checking secret key length %s', secret.length);\n if (secret.length !== TOKEN_VALID_LENGTH) {\n throw new Error(\n `Invalid storage secret key length, must be ${TOKEN_VALID_LENGTH} characters long but is ${secret.length}. ` +\n `Please generate a new one. Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`\n );\n }\n debug('detected valid secret key length %s', secret.length);\n this.secret = secret;\n return this.secret;\n } else {\n debug('generating a new secret key');\n this.secret = generateRandomSecretKey();\n debug('generated a new secret key length %s', this.secret?.length);\n return this.secret;\n }\n }\n}\n\nexport { Config };\n"],"mappings":";;;;;;;;;;;AAwBA,IAAM,uBAAuB,CAAC,WAAW,WAAW;AACpD,IAAM,mBAAmB;CAAC;CAAc;CAAe;CAAW;AAClE,IAAM,QAAQ,WAAW,mBAAmB;AAE5C,IAAa,YAAY;AAGzB,IAAa,0BAA0B;CACrC,UAAU,MAAU;CACpB,KAAK;CACN;AAED,IAAM,qBAAqB;;;;AAK3B,IAAM,SAAN,MAAkC;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;;;CAIA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA,YAAmB,QAA8C;EAC/D,MAAM,OAAO;AACb,OAAK,UAAU,QAAQ,IAAI,0BAA0B,OAAO;AAC5D,MAAI,CAAC,OAAO,YAAY;AAGtB,UAAO,aAAa,OAAO,eAAe,OAAO;AACjD,OAAI,CAAC,OAAO,WACV,OAAM,IAAI,MAAM,kCAAkC;;AAGtD,OAAK,aAAa,OAAO;AACzB,OAAK,YAAY,KAAK;AACtB,QAAM,mBAAmB,KAAK,WAAW;AACzC,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,MAAM,iBAAiB,OAAO,SAAS;AACvD,OAAK,SAAS;GAAE,GAAG;GAAuB,GAAG,OAAO;GAAQ;AAC5D,OAAK,QAAQ;GACX,cAAc,OAAO,OAAO,gBAAgB;GAC5C,gBAAgB,OAAO,OAAO,kBAAkB;GAChD,UAAU,OAAO,OAAO,YAAY;GACpC,YAAY,OAAO,OAAO,cAAc;GACzC;AACD,OAAK,aAAa,OAAO;AAEzB,OAAK,MAAM,cAAc,OACvB,KAAI,KAAK,eAAe,KACtB,MAAK,cAAc,OAAO;AAI9B,MAAI,OAAO,KAAK,eAAe,aAAa;AAE1C,SAAM,yBAAyB;AAC/B,QAAK,aAAa,aAAa,MAAM;;AAGvC,OAAK,gBAAgB;GAAE,GAAG;GAAyB,GAAG,QAAQ;GAAe;AAG7E,SAAO,gBAAgB,SAAS,OAAO,EAAE,UAAU,iBAAiB;AAGpE,uBAAqB,QAAQ,SAAU,GAAS;AAC9C,OAAI,KAAK,MAAM,KACb,MAAK,KAAK,EAAE;AAGd,UAAO,gBAAgB,SAAS,KAAK,GAAG,EAAE,gBAAgB,EAAE,2BAA2B;IACvF;AAEF,OAAK,UAAU,wBAAwB,kBAAkB,KAAK,QAAQ,CAAC;AACvE,OAAK,WAAW,uBAAuB,KAAK,SAAS;AAGrD,mBAAiB,SAAS,YAAkB;AAC1C,OAAI,EAAE,WAAW,MACf,MAAK,WAAW,QAAQ,IAAI,YAAY,QAAQ,IAAI,QAAQ,aAAa;IAE3E;AAIF,MAAI,CAAC,KAAK,UACR,MAAK,YAAY,YAAY,wBAAwB,EAAE;;CAI3D,gBAAuB;AACrB,SAAO,KAAK;;;;;;;;CASd,uBAA8B,SAAuC;AAEnE,SAAO,UAAU,uBAAuB,SAAS,KAAK,SAAS;;;;;;;;CASjE,eAAsB,QAAyB;AAC7C,QAAM,2BAA2B;AACjC,MAAI,OAAO,WAAW,YAAY,QAAQ,OAAO,KAAK,OAAO;AAC3D,SAAM,iCAAiC,OAAO,OAAO;AACrD,OAAI,OAAO,WAAW,mBACpB,OAAM,IAAI,MACR,8CAA8C,mBAAmB,0BAA0B,OAAO,OAAO,oGAE1G;AAEH,SAAM,uCAAuC,OAAO,OAAO;AAC3D,QAAK,SAAS;AACd,UAAO,KAAK;SACP;AACL,SAAM,8BAA8B;AACpC,QAAK,SAAS,yBAAyB;AACvC,SAAM,wCAAwC,KAAK,QAAQ,OAAO;AAClE,UAAO,KAAK"}
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { isEmpty, merge } from 'lodash-es';\nimport assert from 'node:assert';\n\nimport { APP_ERROR, authUtils, cryptoUtils, validationUtils } from '@verdaccio/core';\nimport type {\n Config as AppConfig,\n AuthConf,\n ConfigYaml,\n FlagsConfig,\n PackageAccess,\n PackageList,\n RateLimit,\n Security,\n ServerSettingsConf,\n} from '@verdaccio/types';\n\nimport { getUserAgent } from './agent';\nimport { normalisePackageAccess } from './package-access';\nimport { defaultSecurity } from './security';\nimport defaultServerSettings from './serverSettings';\nimport { generateRandomSecretKey } from './token';\nimport { sanityCheckUplinksProps, uplinkSanityCheck } from './uplinks';\n\nconst strategicConfigProps = ['uplinks', 'packages'];\nconst allowedEnvConfig = ['http_proxy', 'https_proxy', 'no_proxy'];\nconst debug = buildDebug('verdaccio:config');\n\nexport const WEB_TITLE = 'Verdaccio';\n\n// we limit max 1000 request per 15 minutes on user endpoints\nexport const defaultUserRateLimiting = {\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 1000,\n};\n\nconst TOKEN_VALID_LENGTH = 32;\n\n/**\n * Coordinates the application configuration\n */\nclass Config implements AppConfig {\n public user_agent: string | undefined;\n public uplinks: any;\n public packages: PackageList;\n public users: any;\n public auth: AuthConf;\n public store: any;\n public server_id: string;\n public configPath: string;\n /**\n * @deprecated use configPath or config.getConfigPath();\n */\n public self_path: string;\n public storage: string | void;\n\n public plugins: string | void | null;\n public security: Security;\n public server: ServerSettingsConf;\n // @ts-ignore\n public secret: string;\n public flags: FlagsConfig;\n public userRateLimit: RateLimit;\n public constructor(config: ConfigYaml & { config_path: string }) {\n const self = this;\n this.storage = process.env.VERDACCIO_STORAGE_PATH || config.storage;\n if (!config.configPath) {\n // backport self_path for previous to version 6\n // @ts-expect-error\n config.configPath = config.config_path ?? config.self_path;\n if (!config.configPath) {\n throw new Error('configPath property is required');\n }\n }\n this.configPath = config.configPath;\n this.self_path = this.configPath;\n debug('config path: %s', this.configPath);\n this.plugins = config.plugins;\n this.security = merge(defaultSecurity, config.security);\n this.server = { ...defaultServerSettings, ...config.server };\n this.flags = {\n changePassword: config.flags?.changePassword ?? false,\n webLogin: config.flags?.webLogin ?? false,\n createUser: config.flags?.createUser ?? false,\n };\n this.user_agent = config.user_agent;\n\n for (const configProp in config) {\n if (self[configProp] == null) {\n self[configProp] = config[configProp];\n }\n }\n\n if (typeof this.user_agent === 'undefined') {\n // by default user agent is hidden\n debug('set default user agent');\n this.user_agent = getUserAgent(false);\n }\n\n this.userRateLimit = { ...defaultUserRateLimiting, ...config?.userRateLimit };\n\n // some weird shell scripts are valid yaml files parsed as string\n assert(validationUtils.isObject(config), APP_ERROR.CONFIG_NOT_VALID);\n\n // sanity check for strategic config properties\n strategicConfigProps.forEach(function (x): void {\n if (self[x] == null) {\n self[x] = {};\n }\n\n assert(validationUtils.isObject(self[x]), `CONFIG: bad \"${x}\" value (object expected)`);\n });\n\n this.uplinks = sanityCheckUplinksProps(uplinkSanityCheck(this.uplinks));\n this.packages = normalisePackageAccess(self.packages);\n\n // loading these from ENV if aren't in config\n allowedEnvConfig.forEach((envConf): void => {\n if (!(envConf in self)) {\n self[envConf] = process.env[envConf] || process.env[envConf.toUpperCase()];\n }\n });\n\n // unique identifier of self server (or a cluster), used to avoid loops\n // @ts-ignore\n if (!this.server_id) {\n this.server_id = cryptoUtils.generateRandomHexString(6);\n }\n }\n\n public getConfigPath() {\n return this.configPath;\n }\n\n /**\n * Check for package spec\n * @param pkgName - package name\n * @returns package access\n * @deprecated use core.authUtils instead\n */\n public getMatchedPackagesSpec(pkgName: string): PackageAccess | void {\n // TODO: remove this method and replace by library utils\n return authUtils.getMatchedPackagesSpec(pkgName, this.packages);\n }\n\n /**\n * Verify if the secret complies with the required structure.\n * The secret must be exactly 32 characters long for aes-256-ctr encryption.\n * If no secret is provided, a new one will be generated.\n * @secret external secret key\n */\n public checkSecretKey(secret?: string): string {\n debug('checking secret key init');\n if (typeof secret === 'string' && isEmpty(secret) === false) {\n debug('checking secret key length %s', secret.length);\n if (secret.length !== TOKEN_VALID_LENGTH) {\n throw new Error(\n `Invalid storage secret key length, must be ${TOKEN_VALID_LENGTH} characters long but is ${secret.length}. ` +\n `Please generate a new one. Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`\n );\n }\n debug('detected valid secret key length %s', secret.length);\n this.secret = secret;\n return this.secret;\n } else {\n debug('generating a new secret key');\n this.secret = generateRandomSecretKey();\n debug('generated a new secret key length %s', this.secret?.length);\n return this.secret;\n }\n }\n}\n\nexport { Config };\n"],"mappings":";;;;;;;;;;;AAwBA,IAAM,uBAAuB,CAAC,WAAW,WAAW;AACpD,IAAM,mBAAmB;CAAC;CAAc;CAAe;CAAW;AAClE,IAAM,QAAQ,WAAW,mBAAmB;AAE5C,IAAa,YAAY;AAGzB,IAAa,0BAA0B;CACrC,UAAU,MAAU;CACpB,KAAK;CACN;AAED,IAAM,qBAAqB;;;;AAK3B,IAAM,SAAN,MAAkC;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;;;CAIA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA,YAAmB,QAA8C;EAC/D,MAAM,OAAO;AACb,OAAK,UAAU,QAAQ,IAAI,0BAA0B,OAAO;AAC5D,MAAI,CAAC,OAAO,YAAY;AAGtB,UAAO,aAAa,OAAO,eAAe,OAAO;AACjD,OAAI,CAAC,OAAO,WACV,OAAM,IAAI,MAAM,kCAAkC;;AAGtD,OAAK,aAAa,OAAO;AACzB,OAAK,YAAY,KAAK;AACtB,QAAM,mBAAmB,KAAK,WAAW;AACzC,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,MAAM,iBAAiB,OAAO,SAAS;AACvD,OAAK,SAAS;GAAE,GAAG;GAAuB,GAAG,OAAO;GAAQ;AAC5D,OAAK,QAAQ;GACX,gBAAgB,OAAO,OAAO,kBAAkB;GAChD,UAAU,OAAO,OAAO,YAAY;GACpC,YAAY,OAAO,OAAO,cAAc;GACzC;AACD,OAAK,aAAa,OAAO;AAEzB,OAAK,MAAM,cAAc,OACvB,KAAI,KAAK,eAAe,KACtB,MAAK,cAAc,OAAO;AAI9B,MAAI,OAAO,KAAK,eAAe,aAAa;AAE1C,SAAM,yBAAyB;AAC/B,QAAK,aAAa,aAAa,MAAM;;AAGvC,OAAK,gBAAgB;GAAE,GAAG;GAAyB,GAAG,QAAQ;GAAe;AAG7E,SAAO,gBAAgB,SAAS,OAAO,EAAE,UAAU,iBAAiB;AAGpE,uBAAqB,QAAQ,SAAU,GAAS;AAC9C,OAAI,KAAK,MAAM,KACb,MAAK,KAAK,EAAE;AAGd,UAAO,gBAAgB,SAAS,KAAK,GAAG,EAAE,gBAAgB,EAAE,2BAA2B;IACvF;AAEF,OAAK,UAAU,wBAAwB,kBAAkB,KAAK,QAAQ,CAAC;AACvE,OAAK,WAAW,uBAAuB,KAAK,SAAS;AAGrD,mBAAiB,SAAS,YAAkB;AAC1C,OAAI,EAAE,WAAW,MACf,MAAK,WAAW,QAAQ,IAAI,YAAY,QAAQ,IAAI,QAAQ,aAAa;IAE3E;AAIF,MAAI,CAAC,KAAK,UACR,MAAK,YAAY,YAAY,wBAAwB,EAAE;;CAI3D,gBAAuB;AACrB,SAAO,KAAK;;;;;;;;CASd,uBAA8B,SAAuC;AAEnE,SAAO,UAAU,uBAAuB,SAAS,KAAK,SAAS;;;;;;;;CASjE,eAAsB,QAAyB;AAC7C,QAAM,2BAA2B;AACjC,MAAI,OAAO,WAAW,YAAY,QAAQ,OAAO,KAAK,OAAO;AAC3D,SAAM,iCAAiC,OAAO,OAAO;AACrD,OAAI,OAAO,WAAW,mBACpB,OAAM,IAAI,MACR,8CAA8C,mBAAmB,0BAA0B,OAAO,OAAO,oGAE1G;AAEH,SAAM,uCAAuC,OAAO,OAAO;AAC3D,QAAK,SAAS;AACd,UAAO,KAAK;SACP;AACL,SAAM,8BAA8B;AACpC,QAAK,SAAS,yBAAyB;AACvC,SAAM,wCAAwC,KAAK,QAAQ,OAAO;AAClE,UAAO,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/config",
3
- "version": "9.0.0-next-9.8",
3
+ "version": "9.0.0-next-9.10",
4
4
  "description": "Verdaccio Configuration",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -33,13 +33,13 @@
33
33
  "node": ">=24"
34
34
  },
35
35
  "dependencies": {
36
- "@verdaccio/core": "9.0.0-next-9.8",
36
+ "@verdaccio/core": "9.0.0-next-9.10",
37
37
  "debug": "4.4.3",
38
38
  "js-yaml": "4.1.1",
39
39
  "lodash-es": "4.17.23"
40
40
  },
41
41
  "devDependencies": {
42
- "@verdaccio/types": "14.0.0-next-9.4",
42
+ "@verdaccio/types": "14.0.0-next-9.5",
43
43
  "@types/lodash-es": "4.17.12",
44
44
  "vitest": "4.1.0"
45
45
  },