@verdaccio/config 6.0.0-6-next.59 → 6.0.0-6-next.61

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @verdaccio/config
2
2
 
3
+ ## 6.0.0-6-next.61
4
+
5
+ ### Minor Changes
6
+
7
+ - d167f92e: chore: rollback yaml dep support old nodejs versions
8
+
9
+ ### Patch Changes
10
+
11
+ - @verdaccio/core@6.0.0-6-next.61
12
+ - @verdaccio/utils@6.0.0-6-next.29
13
+
14
+ ## 6.0.0-6-next.60
15
+
16
+ ### Minor Changes
17
+
18
+ - 45c03819: refactor: render html middleware
19
+
20
+ ### Patch Changes
21
+
22
+ - @verdaccio/core@6.0.0-6-next.60
23
+ - @verdaccio/utils@6.0.0-6-next.28
24
+
3
25
  ## 6.0.0-6-next.59
4
26
 
5
27
  ### Patch Changes
package/build/agent.d.ts CHANGED
@@ -1 +1 @@
1
- export declare function getUserAgent(): string;
1
+ export declare function getUserAgent(customUserAgent?: boolean | string, version?: string, name?: string): string;
package/build/agent.js CHANGED
@@ -4,8 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getUserAgent = getUserAgent;
7
- const pkgVersion = require('../package.json').version;
8
- function getUserAgent() {
9
- return `verdaccio/${pkgVersion}`;
7
+ var _lodash = _interopRequireDefault(require("lodash"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ function getUserAgent(customUserAgent, version, name) {
10
+ if (customUserAgent === true) {
11
+ return `${name}/${version}`;
12
+ } else if (_lodash.default.isString(customUserAgent) && _lodash.default.isEmpty(customUserAgent) === false) {
13
+ return customUserAgent;
14
+ } else if (customUserAgent === false) {
15
+ return 'hidden';
16
+ }
17
+ return `${name}/${version}`;
10
18
  }
11
19
  //# sourceMappingURL=agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","names":["pkgVersion","require","version","getUserAgent"],"sources":["../src/agent.ts"],"sourcesContent":["const pkgVersion = require('../package.json').version;\n\nexport function getUserAgent(): string {\n return `verdaccio/${pkgVersion}`;\n}\n"],"mappings":";;;;;;AAAA,MAAMA,UAAU,GAAGC,OAAO,CAAC,iBAAiB,CAAC,CAACC,OAAO;AAE9C,SAASC,YAAY,GAAW;EACrC,OAAQ,aAAYH,UAAW,EAAC;AAClC"}
1
+ {"version":3,"file":"agent.js","names":["getUserAgent","customUserAgent","version","name","_","isString","isEmpty"],"sources":["../src/agent.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport function getUserAgent(\n customUserAgent?: boolean | string,\n version?: string,\n name?: string\n): string {\n if (customUserAgent === true) {\n return `${name}/${version}`;\n } else if (_.isString(customUserAgent) && _.isEmpty(customUserAgent) === false) {\n return customUserAgent;\n } else if (customUserAgent === false) {\n return 'hidden';\n }\n\n return `${name}/${version}`;\n}\n"],"mappings":";;;;;;AAAA;AAAuB;AAEhB,SAASA,YAAY,CAC1BC,eAAkC,EAClCC,OAAgB,EAChBC,IAAa,EACL;EACR,IAAIF,eAAe,KAAK,IAAI,EAAE;IAC5B,OAAQ,GAAEE,IAAK,IAAGD,OAAQ,EAAC;EAC7B,CAAC,MAAM,IAAIE,eAAC,CAACC,QAAQ,CAACJ,eAAe,CAAC,IAAIG,eAAC,CAACE,OAAO,CAACL,eAAe,CAAC,KAAK,KAAK,EAAE;IAC9E,OAAOA,eAAe;EACxB,CAAC,MAAM,IAAIA,eAAe,KAAK,KAAK,EAAE;IACpC,OAAO,QAAQ;EACjB;EAEA,OAAQ,GAAEE,IAAK,IAAGD,OAAQ,EAAC;AAC7B"}
package/build/config.d.ts CHANGED
@@ -1,10 +1,14 @@
1
- import { Config as AppConfig, AuthConf, ConfigYaml, FlagsConfig, PackageAccess, PackageList, Security, ServerSettingsConf } from '@verdaccio/types';
1
+ import { Config as AppConfig, AuthConf, ConfigYaml, FlagsConfig, PackageAccess, PackageList, RateLimit, Security, ServerSettingsConf } from '@verdaccio/types';
2
2
  export declare const WEB_TITLE = "Verdaccio";
3
+ export declare const defaultUserRateLimiting: {
4
+ windowMs: number;
5
+ max: number;
6
+ };
3
7
  /**
4
8
  * Coordinates the application configuration
5
9
  */
6
10
  declare class Config implements AppConfig {
7
- user_agent: string;
11
+ user_agent: string | undefined;
8
12
  uplinks: any;
9
13
  packages: PackageList;
10
14
  users: any;
@@ -18,6 +22,7 @@ declare class Config implements AppConfig {
18
22
  serverSettings: ServerSettingsConf;
19
23
  secret: string;
20
24
  flags: FlagsConfig;
25
+ userRateLimit: RateLimit;
21
26
  constructor(config: ConfigYaml & {
22
27
  config_path: string;
23
28
  });
package/build/config.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WEB_TITLE = exports.Config = void 0;
6
+ exports.defaultUserRateLimiting = exports.WEB_TITLE = exports.Config = void 0;
7
7
  var _assert = _interopRequireDefault(require("assert"));
8
8
  var _debug = _interopRequireDefault(require("debug"));
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
@@ -21,10 +21,18 @@ const allowedEnvConfig = ['http_proxy', 'https_proxy', 'no_proxy'];
21
21
  const debug = (0, _debug.default)('verdaccio:config');
22
22
  const WEB_TITLE = 'Verdaccio';
23
23
 
24
+ // we limit max 1000 request per 15 minutes on user endpoints
25
+ exports.WEB_TITLE = WEB_TITLE;
26
+ const defaultUserRateLimiting = {
27
+ windowMs: 15 * 60 * 1000,
28
+ // 15 minutes
29
+ max: 1000
30
+ };
31
+
24
32
  /**
25
33
  * Coordinates the application configuration
26
34
  */
27
- exports.WEB_TITLE = WEB_TITLE;
35
+ exports.defaultUserRateLimiting = defaultUserRateLimiting;
28
36
  class Config {
29
37
  // @deprecated use configPath instead
30
38
 
@@ -46,16 +54,21 @@ class Config {
46
54
  this.flags = {
47
55
  searchRemote: (_config$flags$searchR = (_config$flags = config.flags) === null || _config$flags === void 0 ? void 0 : _config$flags.searchRemote) !== null && _config$flags$searchR !== void 0 ? _config$flags$searchR : true
48
56
  };
57
+ this.user_agent = config.user_agent;
49
58
  for (const configProp in config) {
50
59
  if (self[configProp] == null) {
51
60
  self[configProp] = config[configProp];
52
61
  }
53
62
  }
54
-
55
- // @ts-ignore
56
- if (_lodash.default.isNil(this.user_agent)) {
57
- this.user_agent = (0, _agent.getUserAgent)();
63
+ if (typeof this.user_agent === 'undefined') {
64
+ // by default user agent is hidden
65
+ debug('set default user agent');
66
+ this.user_agent = (0, _agent.getUserAgent)(false);
58
67
  }
68
+ this.userRateLimit = {
69
+ ...defaultUserRateLimiting,
70
+ ...(config === null || config === void 0 ? void 0 : config.userRateLimit)
71
+ };
59
72
 
60
73
  // some weird shell scripts are valid yaml files parsed as string
61
74
  (0, _assert.default)(_lodash.default.isObject(config), _core.APP_ERROR.CONFIG_NOT_VALID);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":["strategicConfigProps","allowedEnvConfig","debug","buildDebug","WEB_TITLE","Config","constructor","config","self","storage","process","env","VERDACCIO_STORAGE_PATH","configPath","Error","config_path","plugins","security","_","merge","defaultSecurity","serverSettings","flags","searchRemote","configProp","isNil","user_agent","getUserAgent","assert","isObject","APP_ERROR","CONFIG_NOT_VALID","forEach","x","uplinks","sanityCheckUplinksProps","uplinkSanityCheck","packages","normalisePackageAccess","envConf","toUpperCase","server_id","generateRandomHexString","getMatchedPackagesSpec","pkgName","checkSecretKey","secret","isString","isEmpty","generateRandomSecretKey"],"sources":["../src/config.ts"],"sourcesContent":["import assert from 'assert';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { APP_ERROR } from '@verdaccio/core';\nimport {\n Config as AppConfig,\n AuthConf,\n ConfigYaml,\n FlagsConfig,\n PackageAccess,\n PackageList,\n Security,\n ServerSettingsConf,\n} from '@verdaccio/types';\nimport { generateRandomHexString, getMatchedPackagesSpec, isObject } from '@verdaccio/utils';\n\nimport { getUserAgent } from './agent';\nimport { normalisePackageAccess } from './package-access';\nimport { defaultSecurity } from './security';\nimport serverSettings 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/**\n * Coordinates the application configuration\n */\nclass Config implements AppConfig {\n public user_agent: string;\n public uplinks: any;\n public packages: PackageList;\n public users: any;\n public auth: AuthConf;\n public server_id: string;\n // @deprecated use configPath instead\n public config_path: string;\n public configPath: string;\n public storage: string | void;\n\n public plugins: string | void | null;\n public security: Security;\n public serverSettings: ServerSettingsConf;\n // @ts-ignore\n public secret: string;\n public flags: FlagsConfig;\n\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 throw new Error('config_path is required');\n }\n this.config_path = config.config_path ?? (config.configPath as string);\n this.configPath = config.configPath;\n debug('config path: %s', this.configPath);\n this.plugins = config.plugins;\n this.security = _.merge(defaultSecurity, config.security);\n this.serverSettings = serverSettings;\n this.flags = {\n searchRemote: config.flags?.searchRemote ?? true,\n };\n\n for (const configProp in config) {\n if (self[configProp] == null) {\n self[configProp] = config[configProp];\n }\n }\n\n // @ts-ignore\n if (_.isNil(this.user_agent)) {\n this.user_agent = getUserAgent();\n }\n\n // some weird shell scripts are valid yaml files parsed as string\n assert(_.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(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 = generateRandomHexString(6);\n }\n }\n\n /**\n * Check for package spec\n */\n public getMatchedPackagesSpec(pkgName: string): PackageAccess | void {\n // TODO: remove this method and replace by library utils\n return getMatchedPackagesSpec(pkgName, this.packages);\n }\n\n /**\n * Store or create whether receive a secret key\n */\n public checkSecretKey(secret?: string): string {\n debug('check secret key');\n if (_.isString(secret) && _.isEmpty(secret) === false) {\n this.secret = secret;\n debug('reusing previous key');\n return secret;\n }\n // it generates a secret key\n // FUTURE: this might be an external secret key, perhaps within config file?\n debug('generate a new key');\n this.secret = generateRandomSecretKey();\n return this.secret;\n }\n}\n\nexport { Config };\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","names":["strategicConfigProps","allowedEnvConfig","debug","buildDebug","WEB_TITLE","defaultUserRateLimiting","windowMs","max","Config","constructor","config","self","storage","process","env","VERDACCIO_STORAGE_PATH","configPath","Error","config_path","plugins","security","_","merge","defaultSecurity","serverSettings","flags","searchRemote","user_agent","configProp","getUserAgent","userRateLimit","assert","isObject","APP_ERROR","CONFIG_NOT_VALID","forEach","x","uplinks","sanityCheckUplinksProps","uplinkSanityCheck","packages","normalisePackageAccess","envConf","toUpperCase","server_id","generateRandomHexString","getMatchedPackagesSpec","pkgName","checkSecretKey","secret","isString","isEmpty","generateRandomSecretKey"],"sources":["../src/config.ts"],"sourcesContent":["import assert from 'assert';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { APP_ERROR } from '@verdaccio/core';\nimport {\n Config as AppConfig,\n AuthConf,\n ConfigYaml,\n FlagsConfig,\n PackageAccess,\n PackageList,\n RateLimit,\n Security,\n ServerSettingsConf,\n} from '@verdaccio/types';\nimport { generateRandomHexString, getMatchedPackagesSpec, isObject } from '@verdaccio/utils';\n\nimport { getUserAgent } from './agent';\nimport { normalisePackageAccess } from './package-access';\nimport { defaultSecurity } from './security';\nimport serverSettings 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\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 server_id: string;\n // @deprecated use configPath instead\n public config_path: string;\n public configPath: string;\n public storage: string | void;\n\n public plugins: string | void | null;\n public security: Security;\n public serverSettings: 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 throw new Error('config_path is required');\n }\n this.config_path = config.config_path ?? (config.configPath as string);\n this.configPath = config.configPath;\n debug('config path: %s', this.configPath);\n this.plugins = config.plugins;\n this.security = _.merge(defaultSecurity, config.security);\n this.serverSettings = serverSettings;\n this.flags = {\n searchRemote: config.flags?.searchRemote ?? true,\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(_.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(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 = generateRandomHexString(6);\n }\n }\n\n /**\n * Check for package spec\n */\n public getMatchedPackagesSpec(pkgName: string): PackageAccess | void {\n // TODO: remove this method and replace by library utils\n return getMatchedPackagesSpec(pkgName, this.packages);\n }\n\n /**\n * Store or create whether receive a secret key\n */\n public checkSecretKey(secret?: string): string {\n debug('check secret key');\n if (_.isString(secret) && _.isEmpty(secret) === false) {\n this.secret = secret;\n debug('reusing previous key');\n return secret;\n }\n // it generates a secret key\n // FUTURE: this might be an external secret key, perhaps within config file?\n debug('generate a new key');\n this.secret = generateRandomSecretKey();\n return this.secret;\n }\n}\n\nexport { Config };\n"],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './package-access';
5
5
  export { fromJStoYAML, parseConfigFile } from './parse';
6
6
  export * from './uplinks';
7
7
  export * from './security';
8
+ export * from './agent';
8
9
  export * from './user';
9
10
  export { default as ConfigBuilder } from './builder';
10
11
  export { getDefaultConfig } from './conf';
package/build/index.js CHANGED
@@ -106,6 +106,18 @@ Object.keys(_security).forEach(function (key) {
106
106
  }
107
107
  });
108
108
  });
109
+ var _agent = require("./agent");
110
+ Object.keys(_agent).forEach(function (key) {
111
+ if (key === "default" || key === "__esModule") return;
112
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
113
+ if (key in exports && exports[key] === _agent[key]) return;
114
+ Object.defineProperty(exports, key, {
115
+ enumerable: true,
116
+ get: function () {
117
+ return _agent[key];
118
+ }
119
+ });
120
+ });
109
121
  var _user = require("./user");
110
122
  Object.keys(_user).forEach(function (key) {
111
123
  if (key === "default" || key === "__esModule") return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from './config';\nexport * from './config-path';\nexport * from './token';\nexport * from './package-access';\nexport { fromJStoYAML, parseConfigFile } from './parse';\nexport * from './uplinks';\nexport * from './security';\nexport * from './user';\nexport { default as ConfigBuilder } from './builder';\nexport { getDefaultConfig } from './conf';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AACA;AAA0C"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from './config';\nexport * from './config-path';\nexport * from './token';\nexport * from './package-access';\nexport { fromJStoYAML, parseConfigFile } from './parse';\nexport * from './uplinks';\nexport * from './security';\nexport * from './agent';\nexport * from './user';\nexport { default as ConfigBuilder } from './builder';\nexport { getDefaultConfig } from './conf';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;AACA;AACA;AAA0C"}
package/build/parse.js CHANGED
@@ -7,8 +7,8 @@ exports.fromJStoYAML = fromJStoYAML;
7
7
  exports.parseConfigFile = parseConfigFile;
8
8
  var _debug = _interopRequireDefault(require("debug"));
9
9
  var _fs = _interopRequireDefault(require("fs"));
10
+ var _jsYaml = _interopRequireDefault(require("js-yaml"));
10
11
  var _lodash = require("lodash");
11
- var _yaml = _interopRequireDefault(require("yaml"));
12
12
  var _core = require("@verdaccio/core");
13
13
  var _configUtils = require("./config-utils");
14
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -26,7 +26,7 @@ function parseConfigFile(configPath) {
26
26
  debug('parsing config file: %o', configPath);
27
27
  try {
28
28
  if (/\.ya?ml$/i.test(configPath)) {
29
- const yamlConfig = _yaml.default.parse(_fs.default.readFileSync(configPath, 'utf8'), {
29
+ const yamlConfig = _jsYaml.default.load(_fs.default.readFileSync(configPath, 'utf8'), {
30
30
  strict: false
31
31
  });
32
32
  return Object.assign({}, yamlConfig, {
@@ -52,7 +52,7 @@ function parseConfigFile(configPath) {
52
52
  function fromJStoYAML(config) {
53
53
  debug('convert config from JSON to YAML');
54
54
  if ((0, _lodash.isObject)(config)) {
55
- return _yaml.default.stringify(config);
55
+ return _jsYaml.default.dump(config);
56
56
  } else {
57
57
  throw new Error(`config is not a valid object`);
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","names":["debug","buildDebug","parseConfigFile","configPath","fileExists","Error","test","yamlConfig","YAML","parse","fs","readFileSync","strict","Object","assign","config_path","jsonConfig","require","e","code","message","APP_ERROR","CONFIG_NOT_VALID","fromJStoYAML","config","isObject","stringify"],"sources":["../src/parse.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport fs from 'fs';\nimport { isObject } from 'lodash';\nimport YAML from 'yaml';\n\nimport { APP_ERROR } from '@verdaccio/core';\nimport { ConfigYaml } from '@verdaccio/types';\n\nimport { fileExists } from './config-utils';\n\nconst debug = buildDebug('verdaccio:config:parse');\n\n/**\n * Parse a config file from yaml to JSON.\n * @param configPath the absolute path of the configuration file\n */\nexport function parseConfigFile(configPath: string): ConfigYaml & {\n // @deprecated use configPath instead\n config_path: string;\n configPath: string;\n} {\n debug('parse config file %s', configPath);\n if (!fileExists(configPath)) {\n throw new Error(`config file does not exist or not reachable`);\n }\n debug('parsing config file: %o', configPath);\n try {\n if (/\\.ya?ml$/i.test(configPath)) {\n const yamlConfig = YAML.parse(fs.readFileSync(configPath, 'utf8'), {\n strict: false,\n }) as ConfigYaml;\n\n return Object.assign({}, yamlConfig, {\n configPath,\n // @deprecated use configPath instead\n config_path: configPath,\n });\n }\n\n const jsonConfig = require(configPath) as ConfigYaml;\n return Object.assign({}, jsonConfig, {\n configPath,\n // @deprecated use configPath instead\n config_path: configPath,\n });\n } catch (e: any) {\n if (e.code !== 'MODULE_NOT_FOUND') {\n debug('config module not found %o error: %o', configPath, e.message);\n throw Error(APP_ERROR.CONFIG_NOT_VALID);\n }\n\n throw e;\n }\n}\n\nexport function fromJStoYAML(config: Partial<ConfigYaml>): string | null {\n debug('convert config from JSON to YAML');\n if (isObject(config)) {\n return YAML.stringify(config);\n } else {\n throw new Error(`config is not a valid object`);\n }\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AAEA;AAGA;AAA4C;AAE5C,MAAMA,KAAK,GAAG,IAAAC,cAAU,EAAC,wBAAwB,CAAC;;AAElD;AACA;AACA;AACA;AACO,SAASC,eAAe,CAACC,UAAkB,EAIhD;EACAH,KAAK,CAAC,sBAAsB,EAAEG,UAAU,CAAC;EACzC,IAAI,CAAC,IAAAC,uBAAU,EAACD,UAAU,CAAC,EAAE;IAC3B,MAAM,IAAIE,KAAK,CAAE,6CAA4C,CAAC;EAChE;EACAL,KAAK,CAAC,yBAAyB,EAAEG,UAAU,CAAC;EAC5C,IAAI;IACF,IAAI,WAAW,CAACG,IAAI,CAACH,UAAU,CAAC,EAAE;MAChC,MAAMI,UAAU,GAAGC,aAAI,CAACC,KAAK,CAACC,WAAE,CAACC,YAAY,CAACR,UAAU,EAAE,MAAM,CAAC,EAAE;QACjES,MAAM,EAAE;MACV,CAAC,CAAe;MAEhB,OAAOC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEP,UAAU,EAAE;QACnCJ,UAAU;QACV;QACAY,WAAW,EAAEZ;MACf,CAAC,CAAC;IACJ;IAEA,MAAMa,UAAU,GAAGC,OAAO,CAACd,UAAU,CAAe;IACpD,OAAOU,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEE,UAAU,EAAE;MACnCb,UAAU;MACV;MACAY,WAAW,EAAEZ;IACf,CAAC,CAAC;EACJ,CAAC,CAAC,OAAOe,CAAM,EAAE;IACf,IAAIA,CAAC,CAACC,IAAI,KAAK,kBAAkB,EAAE;MACjCnB,KAAK,CAAC,sCAAsC,EAAEG,UAAU,EAAEe,CAAC,CAACE,OAAO,CAAC;MACpE,MAAMf,KAAK,CAACgB,eAAS,CAACC,gBAAgB,CAAC;IACzC;IAEA,MAAMJ,CAAC;EACT;AACF;AAEO,SAASK,YAAY,CAACC,MAA2B,EAAiB;EACvExB,KAAK,CAAC,kCAAkC,CAAC;EACzC,IAAI,IAAAyB,gBAAQ,EAACD,MAAM,CAAC,EAAE;IACpB,OAAOhB,aAAI,CAACkB,SAAS,CAACF,MAAM,CAAC;EAC/B,CAAC,MAAM;IACL,MAAM,IAAInB,KAAK,CAAE,8BAA6B,CAAC;EACjD;AACF"}
1
+ {"version":3,"file":"parse.js","names":["debug","buildDebug","parseConfigFile","configPath","fileExists","Error","test","yamlConfig","YAML","load","fs","readFileSync","strict","Object","assign","config_path","jsonConfig","require","e","code","message","APP_ERROR","CONFIG_NOT_VALID","fromJStoYAML","config","isObject","dump"],"sources":["../src/parse.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport fs from 'fs';\nimport YAML from 'js-yaml';\nimport { isObject } from 'lodash';\n\nimport { APP_ERROR } from '@verdaccio/core';\nimport { ConfigYaml } from '@verdaccio/types';\n\nimport { fileExists } from './config-utils';\n\nconst debug = buildDebug('verdaccio:config:parse');\n\n/**\n * Parse a config file from yaml to JSON.\n * @param configPath the absolute path of the configuration file\n */\nexport function parseConfigFile(configPath: string): ConfigYaml & {\n // @deprecated use configPath instead\n config_path: string;\n configPath: string;\n} {\n debug('parse config file %s', configPath);\n if (!fileExists(configPath)) {\n throw new Error(`config file does not exist or not reachable`);\n }\n debug('parsing config file: %o', configPath);\n try {\n if (/\\.ya?ml$/i.test(configPath)) {\n const yamlConfig = YAML.load(fs.readFileSync(configPath, 'utf8'), {\n strict: false,\n }) as ConfigYaml;\n\n return Object.assign({}, yamlConfig, {\n configPath,\n // @deprecated use configPath instead\n config_path: configPath,\n });\n }\n\n const jsonConfig = require(configPath) as ConfigYaml;\n return Object.assign({}, jsonConfig, {\n configPath,\n // @deprecated use configPath instead\n config_path: configPath,\n });\n } catch (e: any) {\n if (e.code !== 'MODULE_NOT_FOUND') {\n debug('config module not found %o error: %o', configPath, e.message);\n throw Error(APP_ERROR.CONFIG_NOT_VALID);\n }\n\n throw e;\n }\n}\n\nexport function fromJStoYAML(config: Partial<ConfigYaml>): string | null {\n debug('convert config from JSON to YAML');\n if (isObject(config)) {\n return YAML.dump(config);\n } else {\n throw new Error(`config is not a valid object`);\n }\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AAEA;AAGA;AAA4C;AAE5C,MAAMA,KAAK,GAAG,IAAAC,cAAU,EAAC,wBAAwB,CAAC;;AAElD;AACA;AACA;AACA;AACO,SAASC,eAAe,CAACC,UAAkB,EAIhD;EACAH,KAAK,CAAC,sBAAsB,EAAEG,UAAU,CAAC;EACzC,IAAI,CAAC,IAAAC,uBAAU,EAACD,UAAU,CAAC,EAAE;IAC3B,MAAM,IAAIE,KAAK,CAAE,6CAA4C,CAAC;EAChE;EACAL,KAAK,CAAC,yBAAyB,EAAEG,UAAU,CAAC;EAC5C,IAAI;IACF,IAAI,WAAW,CAACG,IAAI,CAACH,UAAU,CAAC,EAAE;MAChC,MAAMI,UAAU,GAAGC,eAAI,CAACC,IAAI,CAACC,WAAE,CAACC,YAAY,CAACR,UAAU,EAAE,MAAM,CAAC,EAAE;QAChES,MAAM,EAAE;MACV,CAAC,CAAe;MAEhB,OAAOC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEP,UAAU,EAAE;QACnCJ,UAAU;QACV;QACAY,WAAW,EAAEZ;MACf,CAAC,CAAC;IACJ;IAEA,MAAMa,UAAU,GAAGC,OAAO,CAACd,UAAU,CAAe;IACpD,OAAOU,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEE,UAAU,EAAE;MACnCb,UAAU;MACV;MACAY,WAAW,EAAEZ;IACf,CAAC,CAAC;EACJ,CAAC,CAAC,OAAOe,CAAM,EAAE;IACf,IAAIA,CAAC,CAACC,IAAI,KAAK,kBAAkB,EAAE;MACjCnB,KAAK,CAAC,sCAAsC,EAAEG,UAAU,EAAEe,CAAC,CAACE,OAAO,CAAC;MACpE,MAAMf,KAAK,CAACgB,eAAS,CAACC,gBAAgB,CAAC;IACzC;IAEA,MAAMJ,CAAC;EACT;AACF;AAEO,SAASK,YAAY,CAACC,MAA2B,EAAiB;EACvExB,KAAK,CAAC,kCAAkC,CAAC;EACzC,IAAI,IAAAyB,gBAAQ,EAACD,MAAM,CAAC,EAAE;IACpB,OAAOhB,eAAI,CAACkB,IAAI,CAACF,MAAM,CAAC;EAC1B,CAAC,MAAM;IACL,MAAM,IAAInB,KAAK,CAAE,8BAA6B,CAAC;EACjD;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/config",
3
- "version": "6.0.0-6-next.59",
3
+ "version": "6.0.0-6-next.61",
4
4
  "description": "logger",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -29,10 +29,10 @@
29
29
  "node": ">=12"
30
30
  },
31
31
  "dependencies": {
32
- "@verdaccio/core": "6.0.0-6-next.59",
33
- "@verdaccio/utils": "6.0.0-6-next.27",
32
+ "@verdaccio/core": "6.0.0-6-next.61",
33
+ "@verdaccio/utils": "6.0.0-6-next.29",
34
34
  "debug": "4.3.4",
35
- "yaml": "2.2.0",
35
+ "js-yaml": "4.1.0",
36
36
  "lodash": "4.17.21",
37
37
  "minimatch": "3.1.2",
38
38
  "yup": "0.32.11"
package/src/agent.ts CHANGED
@@ -1,5 +1,17 @@
1
- const pkgVersion = require('../package.json').version;
1
+ import _ from 'lodash';
2
2
 
3
- export function getUserAgent(): string {
4
- return `verdaccio/${pkgVersion}`;
3
+ export function getUserAgent(
4
+ customUserAgent?: boolean | string,
5
+ version?: string,
6
+ name?: string
7
+ ): string {
8
+ if (customUserAgent === true) {
9
+ return `${name}/${version}`;
10
+ } else if (_.isString(customUserAgent) && _.isEmpty(customUserAgent) === false) {
11
+ return customUserAgent;
12
+ } else if (customUserAgent === false) {
13
+ return 'hidden';
14
+ }
15
+
16
+ return `${name}/${version}`;
5
17
  }
package/src/config.ts CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  FlagsConfig,
11
11
  PackageAccess,
12
12
  PackageList,
13
+ RateLimit,
13
14
  Security,
14
15
  ServerSettingsConf,
15
16
  } from '@verdaccio/types';
@@ -28,11 +29,17 @@ const debug = buildDebug('verdaccio:config');
28
29
 
29
30
  export const WEB_TITLE = 'Verdaccio';
30
31
 
32
+ // we limit max 1000 request per 15 minutes on user endpoints
33
+ export const defaultUserRateLimiting = {
34
+ windowMs: 15 * 60 * 1000, // 15 minutes
35
+ max: 1000,
36
+ };
37
+
31
38
  /**
32
39
  * Coordinates the application configuration
33
40
  */
34
41
  class Config implements AppConfig {
35
- public user_agent: string;
42
+ public user_agent: string | undefined;
36
43
  public uplinks: any;
37
44
  public packages: PackageList;
38
45
  public users: any;
@@ -49,7 +56,7 @@ class Config implements AppConfig {
49
56
  // @ts-ignore
50
57
  public secret: string;
51
58
  public flags: FlagsConfig;
52
-
59
+ public userRateLimit: RateLimit;
53
60
  public constructor(config: ConfigYaml & { config_path: string }) {
54
61
  const self = this;
55
62
  this.storage = process.env.VERDACCIO_STORAGE_PATH || config.storage;
@@ -65,6 +72,7 @@ class Config implements AppConfig {
65
72
  this.flags = {
66
73
  searchRemote: config.flags?.searchRemote ?? true,
67
74
  };
75
+ this.user_agent = config.user_agent;
68
76
 
69
77
  for (const configProp in config) {
70
78
  if (self[configProp] == null) {
@@ -72,11 +80,14 @@ class Config implements AppConfig {
72
80
  }
73
81
  }
74
82
 
75
- // @ts-ignore
76
- if (_.isNil(this.user_agent)) {
77
- this.user_agent = getUserAgent();
83
+ if (typeof this.user_agent === 'undefined') {
84
+ // by default user agent is hidden
85
+ debug('set default user agent');
86
+ this.user_agent = getUserAgent(false);
78
87
  }
79
88
 
89
+ this.userRateLimit = { ...defaultUserRateLimiting, ...config?.userRateLimit };
90
+
80
91
  // some weird shell scripts are valid yaml files parsed as string
81
92
  assert(_.isObject(config), APP_ERROR.CONFIG_NOT_VALID);
82
93
 
package/src/index.ts CHANGED
@@ -5,6 +5,7 @@ export * from './package-access';
5
5
  export { fromJStoYAML, parseConfigFile } from './parse';
6
6
  export * from './uplinks';
7
7
  export * from './security';
8
+ export * from './agent';
8
9
  export * from './user';
9
10
  export { default as ConfigBuilder } from './builder';
10
11
  export { getDefaultConfig } from './conf';
package/src/parse.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import buildDebug from 'debug';
2
2
  import fs from 'fs';
3
+ import YAML from 'js-yaml';
3
4
  import { isObject } from 'lodash';
4
- import YAML from 'yaml';
5
5
 
6
6
  import { APP_ERROR } from '@verdaccio/core';
7
7
  import { ConfigYaml } from '@verdaccio/types';
@@ -26,7 +26,7 @@ export function parseConfigFile(configPath: string): ConfigYaml & {
26
26
  debug('parsing config file: %o', configPath);
27
27
  try {
28
28
  if (/\.ya?ml$/i.test(configPath)) {
29
- const yamlConfig = YAML.parse(fs.readFileSync(configPath, 'utf8'), {
29
+ const yamlConfig = YAML.load(fs.readFileSync(configPath, 'utf8'), {
30
30
  strict: false,
31
31
  }) as ConfigYaml;
32
32
 
@@ -56,7 +56,7 @@ export function parseConfigFile(configPath: string): ConfigYaml & {
56
56
  export function fromJStoYAML(config: Partial<ConfigYaml>): string | null {
57
57
  debug('convert config from JSON to YAML');
58
58
  if (isObject(config)) {
59
- return YAML.stringify(config);
59
+ return YAML.dump(config);
60
60
  } else {
61
61
  throw new Error(`config is not a valid object`);
62
62
  }
@@ -6,7 +6,7 @@ uplinks:
6
6
  npmjs:
7
7
  url: http://localhost:4873/
8
8
  packages:
9
- "@*/*":
9
+ '@*/*':
10
10
  access: $all
11
11
  publish: $all
12
12
  proxy: npmjs
@@ -32,7 +32,7 @@ packages:
32
32
  access: $authenticated
33
33
  publish: $authenticated
34
34
  proxy: npmjs
35
- "*":
35
+ '*':
36
36
  access: $all
37
37
  publish: $all
38
38
  proxy: npmjs