@verdaccio/server 6.0.0-6-next.31 → 6.0.0-6-next.34

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.
Files changed (73) hide show
  1. package/.babelrc +1 -1
  2. package/CHANGELOG.md +97 -0
  3. package/build/debug/index.d.ts +1 -1
  4. package/build/debug/index.js +1 -1
  5. package/build/debug/index.js.map +1 -1
  6. package/build/env.js.map +1 -1
  7. package/build/index.js.map +1 -1
  8. package/build/server.d.ts +2 -2
  9. package/build/server.js +5 -3
  10. package/build/server.js.map +1 -1
  11. package/build/utils.d.ts +1 -0
  12. package/build/utils.js +19 -0
  13. package/build/utils.js.map +1 -0
  14. package/jest.config.js +7 -2
  15. package/package.json +19 -21
  16. package/src/debug/index.ts +2 -2
  17. package/src/server.ts +8 -7
  18. package/src/utils.ts +11 -0
  19. package/test/_helper.ts +29 -0
  20. package/test/config/conf.yaml +28 -0
  21. package/test/config/no_debug.yaml +26 -0
  22. package/test/config/powered-custom.yaml +29 -0
  23. package/test/config/powered-disabled.yaml +29 -0
  24. package/test/config/web-disabled.yaml +27 -0
  25. package/test/server.spec.ts +113 -0
  26. package/tsconfig.build.json +1 -1
  27. package/tsconfig.json +14 -14
  28. package/jest.setup.js +0 -1
  29. package/test/.eslintrc +0 -8
  30. package/test/README.md +0 -12
  31. package/test/api/api.spec.yaml +0 -87
  32. package/test/api/helpers/publish-api.js +0 -60
  33. package/test/api/helpers/utils.ts +0 -149
  34. package/test/api/htpasswd +0 -10
  35. package/test/api/index.spec.ts +0 -862
  36. package/test/api/mock/store/@jquery/jquery/jquery-1.5.1.tgz +0 -0
  37. package/test/api/mock/store/@jquery/jquery/package.json +0 -76
  38. package/test/api/mock/store/corrupted-package/package.json +0 -12
  39. package/test/api/mock/store/jquery/jquery-1.5.1.tgz +0 -0
  40. package/test/api/mock/store/jquery/package.json +0 -4919
  41. package/test/api/mock/store/npm_test/package.json +0 -75
  42. package/test/api/mock/store/vue/package.json +0 -25169
  43. package/test/api/plugin/filter.ts +0 -25
  44. package/test/basic/basic.yaml +0 -14
  45. package/test/basic/index.spec.ts +0 -64
  46. package/test/jwt/index.spec.ts +0 -163
  47. package/test/jwt/jwt.yaml +0 -35
  48. package/test/jwt/mock/store/vue/package.json +0 -25169
  49. package/test/package-access/index.spec.ts +0 -100
  50. package/test/package-access/mock/store/.gitkeep +0 -0
  51. package/test/package-access/mock/store/jquery/jquery-1.5.1.tgz +0 -0
  52. package/test/package-access/mock/store/jquery/package.json +0 -4919
  53. package/test/package-access/mock/store/vue/package.json +0 -25169
  54. package/test/package-access/pkg.access.yaml +0 -12
  55. package/test/profile/index.spec.ts +0 -129
  56. package/test/profile/mock/store/.gitkeep +0 -0
  57. package/test/profile/profile.yaml +0 -21
  58. package/test/storage/index.spec.ts +0 -219
  59. package/test/storage/mock/store/@jquery/jquery/jquery-1.5.1.tgz +0 -0
  60. package/test/storage/mock/store/@jquery/jquery/package.json +0 -76
  61. package/test/storage/mock/store/corrupted-package/package.json +0 -12
  62. package/test/storage/mock/store/jquery/jquery-1.5.1.tgz +0 -0
  63. package/test/storage/mock/store/jquery/package.json +0 -4919
  64. package/test/storage/mock/store/npm_test/package.json +0 -75
  65. package/test/storage/store.spec.yaml +0 -24
  66. package/test/token/index.spec.ts +0 -227
  67. package/test/token/mock/store/.gitkeep +0 -0
  68. package/test/token/token.spec.yaml +0 -26
  69. package/test/web/index.spec.ts +0 -157
  70. package/test/web/mock/store/.gitkeep +0 -0
  71. package/test/web/partials/forbidden-place.js +0 -50
  72. package/test/web/partials/publish-api.js +0 -50
  73. package/test/web/web.yaml +0 -20
package/.babelrc CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "extends": "../../.babelrc"
2
+ "extends": "../../../.babelrc"
3
3
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,102 @@
1
1
  # @verdaccio/server
2
2
 
3
+ ## 6.0.0-6-next.34
4
+
5
+ ### Patch Changes
6
+
7
+ - 351aeeaa: fix(deps): @verdaccio/utils should be a prod dep of local-storage
8
+ - Updated dependencies [351aeeaa]
9
+ - @verdaccio/api@6.0.0-6-next.28
10
+ - @verdaccio/auth@6.0.0-6-next.24
11
+ - @verdaccio/core@6.0.0-6-next.7
12
+ - @verdaccio/loaders@6.0.0-6-next.14
13
+ - @verdaccio/logger@6.0.0-6-next.13
14
+ - verdaccio-audit@11.0.0-6-next.10
15
+ - @verdaccio/store@6.0.0-6-next.25
16
+ - @verdaccio/web@6.0.0-6-next.32
17
+ - @verdaccio/middleware@6.0.0-6-next.24
18
+ - @verdaccio/config@6.0.0-6-next.16
19
+ - @verdaccio/utils@6.0.0-6-next.13
20
+
21
+ ## 6.0.0-6-next.33
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [37274e4c]
26
+ - @verdaccio/api@6.0.0-6-next.27
27
+ - @verdaccio/store@6.0.0-6-next.24
28
+ - @verdaccio/web@6.0.0-6-next.31
29
+ - @verdaccio/auth@6.0.0-6-next.23
30
+ - @verdaccio/core@6.0.0-6-next.6
31
+ - @verdaccio/loaders@6.0.0-6-next.13
32
+ - @verdaccio/logger@6.0.0-6-next.12
33
+ - verdaccio-audit@11.0.0-6-next.9
34
+
35
+ ## 6.0.0-6-next.32
36
+
37
+ ### Major Changes
38
+
39
+ - 292c0a37: feat!: replace deprecated request dependency by got
40
+
41
+ This is a big refactoring of the core, fetching dependencies, improve code, more tests and better stability. This is essential for the next release, will take some time but would allow modularize more the core.
42
+
43
+ ## Notes
44
+
45
+ - Remove deprecated `request` by other `got`, retry improved, custom Agent ( got does not include it built-in)
46
+ - Remove `async` dependency from storage (used by core) it was linked with proxy somehow safe to remove now
47
+ - Refactor with promises instead callback wherever is possible
48
+ - ~Document the API~
49
+ - Improve testing, integration tests
50
+ - Bugfix
51
+ - Clean up old validations
52
+ - Improve performance
53
+
54
+ ## 💥 Breaking changes
55
+
56
+ - Plugin API methods were callbacks based are returning promises, this will break current storage plugins, check documentation for upgrade.
57
+ - Write Tarball, Read Tarball methods parameters change, a new set of options like `AbortController` signals are being provided to the `addAbortSignal` can be internally used with Streams when a request is aborted. eg: `addAbortSignal(signal, fs.createReadStream(pathName));`
58
+ - `@verdaccio/streams` stream abort support is legacy is being deprecated removed
59
+ - Remove AWS and Google Cloud packages for future refactoring [#2574](https://github.com/verdaccio/verdaccio/pull/2574).
60
+
61
+ ### Minor Changes
62
+
63
+ - 00d1d2a1: chore: env variable for launch fastify
64
+
65
+ - Update fastify to major release `v4.3.0`
66
+ - Update CLI launcher
67
+
68
+ via CLI
69
+
70
+ ```
71
+ VERDACCIO_SERVER=fastify verdaccio
72
+ ```
73
+
74
+ with docker
75
+
76
+ ```
77
+ docker run -it --rm --name verdaccio \
78
+ -e "VERDACCIO_SERVER=8080" -p 8080:8080 \
79
+ -e "VERDACCIO_SERVER=fastify" \
80
+ verdaccio/verdaccio
81
+ ```
82
+
83
+ ### Patch Changes
84
+
85
+ - Updated dependencies [292c0a37]
86
+ - Updated dependencies [a3a209b5]
87
+ - Updated dependencies [00d1d2a1]
88
+ - @verdaccio/api@6.0.0-6-next.26
89
+ - @verdaccio/auth@6.0.0-6-next.23
90
+ - @verdaccio/config@6.0.0-6-next.15
91
+ - @verdaccio/core@6.0.0-6-next.6
92
+ - @verdaccio/loaders@6.0.0-6-next.13
93
+ - @verdaccio/logger@6.0.0-6-next.12
94
+ - @verdaccio/middleware@6.0.0-6-next.23
95
+ - verdaccio-audit@11.0.0-6-next.9
96
+ - @verdaccio/store@6.0.0-6-next.23
97
+ - @verdaccio/utils@6.0.0-6-next.12
98
+ - @verdaccio/web@6.0.0-6-next.30
99
+
3
100
  ## 6.0.0-6-next.31
4
101
 
5
102
  ### Patch Changes
@@ -1,3 +1,3 @@
1
1
  import { Application } from 'express';
2
- declare const _default: (app: Application, configPath: string) => void;
2
+ declare const _default: (app: Application, configPath?: string) => void;
3
3
  export default _default;
@@ -15,7 +15,7 @@ var _default = (app, configPath) => {
15
15
  next({
16
16
  pid: process.pid,
17
17
  // @ts-ignore
18
- main: process.mainModule.filename,
18
+ main: process.main,
19
19
  conf: configPath,
20
20
  mem: process.memoryUsage(),
21
21
  gc: global.gc
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/debug/index.ts"],"names":["app","configPath","get","req","res","next","global","gc","pid","process","main","mainModule","filename","conf","mem","memoryUsage"],"mappings":";;;;;;;eAIe,CAACA,GAAD,EAAmBC,UAAnB,KAAgD;AAC7D;AACAD,EAAAA,GAAG,CAACE,GAAJ,CACE,WADF,EAEE,UAAUC,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACjF,QAAIC,MAAM,CAACC,EAAX,EAAe;AACbD,MAAAA,MAAM,CAACC,EAAP;AACD;;AAEDF,IAAAA,IAAI,CAAC;AACHG,MAAAA,GAAG,EAAEC,OAAO,CAACD,GADV;AAEH;AACAE,MAAAA,IAAI,EAAED,OAAO,CAACE,UAAR,CAAmBC,QAHtB;AAIHC,MAAAA,IAAI,EAAEZ,UAJH;AAKHa,MAAAA,GAAG,EAAEL,OAAO,CAACM,WAAR,EALF;AAMHR,MAAAA,EAAE,EAAED,MAAM,CAACC;AANR,KAAD,CAAJ;AAQD,GAfH;AAiBD,C","sourcesContent":["import { Application } from 'express';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../../types/custom';\n\nexport default (app: Application, configPath: string): void => {\n // Hook for tests only\n app.get(\n '/-/_debug',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n if (global.gc) {\n global.gc();\n }\n\n next({\n pid: process.pid,\n // @ts-ignore\n main: process.mainModule.filename,\n conf: configPath,\n mem: process.memoryUsage(),\n gc: global.gc,\n });\n }\n );\n};\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["app","configPath","get","req","res","next","global","gc","pid","process","main","conf","mem","memoryUsage"],"sources":["../../src/debug/index.ts"],"sourcesContent":["import { Application } from 'express';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../../types/custom';\n\nexport default (app: Application, configPath?: string): void => {\n // Hook for tests only\n app.get(\n '/-/_debug',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n if (global.gc) {\n global.gc();\n }\n\n next({\n pid: process.pid,\n // @ts-ignore\n main: process.main,\n conf: configPath,\n mem: process.memoryUsage(),\n gc: global.gc,\n });\n }\n );\n};\n"],"mappings":";;;;;;;eAIe,CAACA,GAAD,EAAmBC,UAAnB,KAAiD;EAC9D;EACAD,GAAG,CAACE,GAAJ,CACE,WADF,EAEE,UAAUC,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;IACjF,IAAIC,MAAM,CAACC,EAAX,EAAe;MACbD,MAAM,CAACC,EAAP;IACD;;IAEDF,IAAI,CAAC;MACHG,GAAG,EAAEC,OAAO,CAACD,GADV;MAEH;MACAE,IAAI,EAAED,OAAO,CAACC,IAHX;MAIHC,IAAI,EAAEV,UAJH;MAKHW,GAAG,EAAEH,OAAO,CAACI,WAAR,EALF;MAMHN,EAAE,EAAED,MAAM,CAACC;IANR,CAAD,CAAJ;EAQD,CAfH;AAiBD,C"}
package/build/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/env.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sourcesContent":["// const path = require('path');\n//\n// const APP_ROOT = path.resolve(__dirname, '../../');\n//\n// module.exports = {\n// APP_ROOT,\n// SRC_ROOT: path.resolve(APP_ROOT, 'src/')\n// };\n"],"file":"env.js"}
1
+ {"version":3,"file":"env.js","names":[],"sources":["../src/env.ts"],"sourcesContent":["// const path = require('path');\n//\n// const APP_ROOT = path.resolve(__dirname, '../../');\n//\n// module.exports = {\n// APP_ROOT,\n// SRC_ROOT: path.resolve(APP_ROOT, 'src/')\n// };\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA","sourcesContent":["export { default } from './server';\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export { default } from './server';\n"],"mappings":";;;;;;;;;;;;AAAA"}
package/build/server.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { IBasicAuth } from '@verdaccio/auth';
2
2
  import { Storage } from '@verdaccio/store';
3
- import { ConfigRuntime } from '@verdaccio/types';
3
+ import { ConfigYaml } from '@verdaccio/types';
4
4
  import { IPlugin } from '@verdaccio/types';
5
5
  export interface IPluginMiddleware<T> extends IPlugin<T> {
6
6
  register_middlewares(app: any, auth: IBasicAuth<T>, storage: Storage): void;
7
7
  }
8
- declare const _default: (configHash: ConfigRuntime) => Promise<any>;
8
+ declare const _default: (configHash: ConfigYaml) => Promise<any>;
9
9
  export default _default;
package/build/server.js CHANGED
@@ -39,6 +39,8 @@ var _web = _interopRequireDefault(require("@verdaccio/web"));
39
39
 
40
40
  var _debug2 = _interopRequireDefault(require("./debug"));
41
41
 
42
+ var _utils = require("./utils");
43
+
42
44
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
45
 
44
46
  const debug = (0, _debug.default)('verdaccio:server');
@@ -56,7 +58,7 @@ const defineAPI = function (config, storage) {
56
58
  app.use(_middleware.log);
57
59
  app.use(_middleware.errorReportingMiddleware);
58
60
  app.use(function (req, res, next) {
59
- res.setHeader('X-Powered-By', config.user_agent);
61
+ res.setHeader('x-powered-by', (0, _utils.getUserAgent)(config.user_agent));
60
62
  next();
61
63
  });
62
64
  app.use((0, _compression.default)());
@@ -66,7 +68,7 @@ const defineAPI = function (config, storage) {
66
68
  }); // Hook for tests only
67
69
 
68
70
  if (config._debug) {
69
- (0, _debug2.default)(app, config.config_path);
71
+ (0, _debug2.default)(app, config.configPath);
70
72
  } // register middleware plugins
71
73
 
72
74
 
@@ -105,7 +107,7 @@ const defineAPI = function (config, storage) {
105
107
 
106
108
 
107
109
  app.get('/*', function (req, res, next) {
108
- next(_core.errorUtils.getNotFound(_core.API_ERROR.FILE_NOT_FOUND));
110
+ next(_core.errorUtils.getNotFound('resource not found'));
109
111
  });
110
112
  app.use(function (err, req, res, next) {
111
113
  if (_lodash.default.isError(err)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":["debug","defineAPI","config","storage","auth","Auth","app","limiter","RateLimit","serverSettings","rateLimit","set","process","env","NODE_ENV","use","log","errorReportingMiddleware","req","res","next","setHeader","user_agent","get","url","_debug","config_path","plugin_params","logger","plugins","middlewares","plugin","register_middlewares","_","isEmpty","push","AuditMiddleware","enabled","strict_ssl","forEach","errorUtils","getNotFound","API_ERROR","WEB_DISABLED","FILE_NOT_FOUND","err","isError","code","statusCode","HTTP_STATUS","NOT_MODIFIED","isFunction","locals","report_error","noop","final","configHash","AppConfig","cloneDeep","filters","filter_metadata","Storage","init","error","msg","Error"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAGA;;AAGA;;;;AAMA,MAAMA,KAAK,GAAG,oBAAW,kBAAX,CAAd;;AAEA,MAAMC,SAAS,GAAG,UAAUC,MAAV,EAA2BC,OAA3B,EAAkD;AAClE,QAAMC,IAAU,GAAG,IAAIC,UAAJ,CAASH,MAAT,CAAnB;AACA,QAAMI,GAAgB,GAAG,uBAAzB;AACA,QAAMC,OAAO,GAAG,IAAIC,yBAAJ,CAAcN,MAAM,CAACO,cAAP,CAAsBC,SAApC,CAAhB,CAHkE,CAIlE;AACA;;AACAJ,EAAAA,GAAG,CAACK,GAAJ,CAAQ,KAAR,EAAeC,OAAO,CAACC,GAAR,CAAYC,QAAZ,IAAwB,YAAvC;AACAR,EAAAA,GAAG,CAACS,GAAJ,CAAQ,oBAAR;AACAT,EAAAA,GAAG,CAACS,GAAJ,CAAQR,OAAR,EARkE,CAUlE;;AACAD,EAAAA,GAAG,CAACS,GAAJ,CAAQC,eAAR;AACAV,EAAAA,GAAG,CAACS,GAAJ,CAAQE,oCAAR;AACAX,EAAAA,GAAG,CAACS,GAAJ,CAAQ,UAAUG,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACzFD,IAAAA,GAAG,CAACE,SAAJ,CAAc,cAAd,EAA8BnB,MAAM,CAACoB,UAArC;AACAF,IAAAA,IAAI;AACL,GAHD;AAKAd,EAAAA,GAAG,CAACS,GAAJ,CAAQ,2BAAR;AAEAT,EAAAA,GAAG,CAACiB,GAAJ,CACE,cADF,EAEE,UAAUL,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACjFF,IAAAA,GAAG,CAACM,GAAJ,GAAU,uBAAV;AACAJ,IAAAA,IAAI;AACL,GALH,EApBkE,CA4BlE;;AACA,MAAIlB,MAAM,CAACuB,MAAX,EAAmB;AACjB,yBAAUnB,GAAV,EAAeJ,MAAM,CAACwB,WAAtB;AACD,GA/BiE,CAiClE;;;AACA,QAAMC,aAAa,GAAG;AACpBzB,IAAAA,MAAM,EAAEA,MADY;AAEpB0B,IAAAA,MAAM,EAAEA;AAFY,GAAtB;AAKA,QAAMC,OAAqC,GAAG,yBAC5C3B,MAD4C,EAE5CA,MAAM,CAAC4B,WAFqC,EAG5CH,aAH4C,EAI5C,UAAUI,MAAV,EAA8C;AAC5C,WAAOA,MAAM,CAACC,oBAAd;AACD,GAN2C,CAA9C;;AASA,MAAIC,gBAAEC,OAAF,CAAUL,OAAV,CAAJ,EAAwB;AACtBA,IAAAA,OAAO,CAACM,IAAR,CACE,IAAIC,uBAAJ,CACE,EAAE,GAAGlC,MAAL;AAAamC,MAAAA,OAAO,EAAE,IAAtB;AAA4BC,MAAAA,UAAU,EAAE;AAAxC,KADF,EAEE;AAAEpC,MAAAA,MAAF;AAAU0B,MAAAA,MAAM,EAAEA;AAAlB,KAFF,CADF;AAMD;;AAEDC,EAAAA,OAAO,CAACU,OAAR,CAAiBR,MAAD,IAAwC;AACtDA,IAAAA,MAAM,CAACC,oBAAP,CAA4B1B,GAA5B,EAAiCF,IAAjC,EAAuCD,OAAvC;AACD,GAFD,EAzDkE,CA6DlE;AACA;;AACAG,EAAAA,GAAG,CAACS,GAAJ,CAAQ,kBAAYb,MAAZ,EAAoBE,IAApB,EAA0BD,OAA1B,CAAR,EA/DkE,CAiElE;;AACA,MAAI8B,gBAAEV,GAAF,CAAMrB,MAAN,EAAc,YAAd,EAA4B,IAA5B,CAAJ,EAAuC;AACrCI,IAAAA,GAAG,CAACS,GAAJ,CAAQ,kBAAcb,MAAd,EAAsBE,IAAtB,EAA4BD,OAA5B,CAAR;AACD,GAFD,MAEO;AACLG,IAAAA,GAAG,CAACiB,GAAJ,CAAQ,GAAR,EAAa,UAAUL,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAA6E;AACxFA,MAAAA,IAAI,CAACoB,iBAAWC,WAAX,CAAuBC,gBAAUC,YAAjC,CAAD,CAAJ;AACD,KAFD;AAGD,GAxEiE,CA0ElE;;;AACArC,EAAAA,GAAG,CAACiB,GAAJ,CAAQ,IAAR,EAAc,UAAUL,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAA6E;AACzFA,IAAAA,IAAI,CAACoB,iBAAWC,WAAX,CAAuBC,gBAAUE,cAAjC,CAAD,CAAJ;AACD,GAFD;AAIAtC,EAAAA,GAAG,CAACS,GAAJ,CAAQ,UACN8B,GADM,EAEN3B,GAFM,EAGNC,GAHM,EAINC,IAJM,EAKN;AACA,QAAIa,gBAAEa,OAAF,CAAUD,GAAV,CAAJ,EAAoB;AAClB,UAAIA,GAAG,CAACE,IAAJ,KAAa,YAAb,IAA6B5B,GAAG,CAAC6B,UAAJ,KAAmBC,kBAAYC,YAAhE,EAA8E;AAC5E,eAAO9B,IAAI,EAAX;AACD;;AACD,UAAIa,gBAAEkB,UAAF,CAAahC,GAAG,CAACiC,MAAJ,CAAWC,YAAxB,MAA0C,KAA9C,EAAqD;AACnD;AACA;AACA,kDAAyBnC,GAAzB,EAA8BC,GAA9B,EAAmCc,gBAAEqB,IAArC;AACD;;AACDnC,MAAAA,GAAG,CAACiC,MAAJ,CAAWC,YAAX,CAAwBR,GAAxB;AACD,KAVD,MAUO;AACL;AACA,aAAOzB,IAAI,CAACyB,GAAD,CAAX;AACD;AACF,GApBD;AAsBAvC,EAAAA,GAAG,CAACS,GAAJ,CAAQwC,iBAAR;AAEA,SAAOjD,GAAP;AACD,CAxGD;;eA0GgB,wBAAgBkD,UAAhB,EAAyD;AACvExD,EAAAA,KAAK,CAAC,cAAD,CAAL;AACA,QAAME,MAAe,GAAG,IAAIuD,cAAJ,CAAcxB,gBAAEyB,SAAF,CAAYF,UAAZ,CAAd,CAAxB,CAFuE,CAGvE;;AACA,QAAM7B,aAAa,GAAG;AACpBzB,IAAAA,MAAM,EAAEA,MADY;AAEpB0B,IAAAA,MAAM,EAAEA;AAFY,GAAtB;AAIA,QAAM+B,OAAO,GAAG,yBACdzD,MADc,EAEdA,MAAM,CAACyD,OAAP,IAAkB,EAFJ,EAGdhC,aAHc,EAIbI,MAAD,IAA2CA,MAAM,CAAC6B,eAJpC,CAAhB;AAMA5D,EAAAA,KAAK,CAAC,sBAAD,CAAL,CAduE,CAevE;;AACA,QAAMG,OAAgB,GAAG,IAAI0D,cAAJ,CAAY3D,MAAZ,CAAzB;;AACA,MAAI;AACF;AACAF,IAAAA,KAAK,CAAC,oBAAD,CAAL;AACA,UAAMG,OAAO,CAAC2D,IAAR,CAAa5D,MAAb,EAAqByD,OAArB,CAAN;AACA3D,IAAAA,KAAK,CAAC,kBAAD,CAAL;AACD,GALD,CAKE,OAAO6C,GAAP,EAAiB;AACjBjB,mBAAOmC,KAAP,CAAa;AAAEA,MAAAA,KAAK,EAAElB,GAAG,CAACmB;AAAb,KAAb,EAAiC,8BAAjC;;AACA,UAAM,IAAIC,KAAJ,CAAUpB,GAAV,CAAN;AACD;;AACD,SAAO5C,SAAS,CAACC,MAAD,EAASC,OAAT,CAAhB;AACD,C","sourcesContent":["import compression from 'compression';\nimport cors from 'cors';\nimport buildDebug from 'debug';\nimport express, { Application } from 'express';\nimport RateLimit from 'express-rate-limit';\nimport { HttpError } from 'http-errors';\nimport _ from 'lodash';\nimport AuditMiddleware from 'verdaccio-audit';\n\nimport apiEndpoint from '@verdaccio/api';\nimport { Auth, IBasicAuth } from '@verdaccio/auth';\nimport { Config as AppConfig } from '@verdaccio/config';\nimport { API_ERROR, HTTP_STATUS, errorUtils } from '@verdaccio/core';\nimport { loadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport { errorReportingMiddleware, final, log } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { ConfigRuntime } from '@verdaccio/types';\nimport { Config as IConfig, IPlugin, IPluginStorageFilter } from '@verdaccio/types';\nimport webMiddleware from '@verdaccio/web';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\nimport hookDebug from './debug';\n\nexport interface IPluginMiddleware<T> extends IPlugin<T> {\n register_middlewares(app: any, auth: IBasicAuth<T>, storage: Storage): void;\n}\n\nconst debug = buildDebug('verdaccio:server');\n\nconst defineAPI = function (config: IConfig, storage: Storage): any {\n const auth: Auth = new Auth(config);\n const app: Application = express();\n const limiter = new RateLimit(config.serverSettings.rateLimit);\n // run in production mode by default, just in case\n // it shouldn't make any difference anyway\n app.set('env', process.env.NODE_ENV || 'production');\n app.use(cors());\n app.use(limiter);\n\n // Router setup\n app.use(log);\n app.use(errorReportingMiddleware);\n app.use(function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n res.setHeader('X-Powered-By', config.user_agent);\n next();\n });\n\n app.use(compression());\n\n app.get(\n '/favicon.ico',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n req.url = '/-/static/favicon.png';\n next();\n }\n );\n\n // Hook for tests only\n if (config._debug) {\n hookDebug(app, config.config_path);\n }\n\n // register middleware plugins\n const plugin_params = {\n config: config,\n logger: logger,\n };\n\n const plugins: IPluginMiddleware<IConfig>[] = loadPlugin(\n config,\n config.middlewares,\n plugin_params,\n function (plugin: IPluginMiddleware<IConfig>) {\n return plugin.register_middlewares;\n }\n );\n\n if (_.isEmpty(plugins)) {\n plugins.push(\n new AuditMiddleware(\n { ...config, enabled: true, strict_ssl: true },\n { config, logger: logger }\n )\n );\n }\n\n plugins.forEach((plugin: IPluginMiddleware<IConfig>) => {\n plugin.register_middlewares(app, auth, storage);\n });\n\n // For npm request\n // @ts-ignore\n app.use(apiEndpoint(config, auth, storage));\n\n // For WebUI & WebUI API\n if (_.get(config, 'web.enable', true)) {\n app.use(webMiddleware(config, auth, storage));\n } else {\n app.get('/', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound(API_ERROR.WEB_DISABLED));\n });\n }\n\n // Catch 404\n app.get('/*', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound(API_ERROR.FILE_NOT_FOUND));\n });\n\n app.use(function (\n err: HttpError,\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ) {\n if (_.isError(err)) {\n if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) {\n return next();\n }\n if (_.isFunction(res.locals.report_error) === false) {\n // in case of very early error this middleware may not be loaded before error is generated\n // fixing that\n errorReportingMiddleware(req, res, _.noop);\n }\n res.locals.report_error(err);\n } else {\n // Fall to Middleware.final\n return next(err);\n }\n });\n\n app.use(final);\n\n return app;\n};\n\nexport default (async function (configHash: ConfigRuntime): Promise<any> {\n debug('start server');\n const config: IConfig = new AppConfig(_.cloneDeep(configHash));\n // register middleware plugins\n const plugin_params = {\n config: config,\n logger: logger,\n };\n const filters = loadPlugin(\n config,\n config.filters || {},\n plugin_params,\n (plugin: IPluginStorageFilter<IConfig>) => plugin.filter_metadata\n );\n debug('loaded filter plugin');\n // @ts-ignore\n const storage: Storage = new Storage(config);\n try {\n // waits until init calls have been initialized\n debug('storage init start');\n await storage.init(config, filters);\n debug('storage init end');\n } catch (err: any) {\n logger.error({ error: err.msg }, 'storage has failed: @{error}');\n throw new Error(err);\n }\n return defineAPI(config, storage);\n});\n"],"file":"server.js"}
1
+ {"version":3,"file":"server.js","names":["debug","buildDebug","defineAPI","config","storage","auth","Auth","app","express","limiter","RateLimit","serverSettings","rateLimit","set","process","env","NODE_ENV","use","cors","log","errorReportingMiddleware","req","res","next","setHeader","getUserAgent","user_agent","compression","get","url","_debug","hookDebug","configPath","plugin_params","logger","plugins","loadPlugin","middlewares","plugin","register_middlewares","_","isEmpty","push","AuditMiddleware","enabled","strict_ssl","forEach","apiEndpoint","webMiddleware","errorUtils","getNotFound","API_ERROR","WEB_DISABLED","err","isError","code","statusCode","HTTP_STATUS","NOT_MODIFIED","isFunction","locals","report_error","noop","final","configHash","AppConfig","cloneDeep","filters","filter_metadata","Storage","init","error","msg","Error"],"sources":["../src/server.ts"],"sourcesContent":["import compression from 'compression';\nimport cors from 'cors';\nimport buildDebug from 'debug';\nimport express, { Application } from 'express';\nimport RateLimit from 'express-rate-limit';\nimport { HttpError } from 'http-errors';\nimport _ from 'lodash';\nimport AuditMiddleware from 'verdaccio-audit';\n\nimport apiEndpoint from '@verdaccio/api';\nimport { Auth, IBasicAuth } from '@verdaccio/auth';\nimport { Config as AppConfig } from '@verdaccio/config';\nimport { API_ERROR, HTTP_STATUS, errorUtils } from '@verdaccio/core';\nimport { loadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport { errorReportingMiddleware, final, log } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { ConfigYaml } from '@verdaccio/types';\nimport { Config as IConfig, IPlugin, IPluginStorageFilter } from '@verdaccio/types';\nimport webMiddleware from '@verdaccio/web';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\nimport hookDebug from './debug';\nimport { getUserAgent } from './utils';\n\nexport interface IPluginMiddleware<T> extends IPlugin<T> {\n register_middlewares(app: any, auth: IBasicAuth<T>, storage: Storage): void;\n}\n\nconst debug = buildDebug('verdaccio:server');\n\nconst defineAPI = function (config: IConfig, storage: Storage): any {\n const auth: Auth = new Auth(config);\n const app: Application = express();\n const limiter = new RateLimit(config.serverSettings.rateLimit);\n // run in production mode by default, just in case\n // it shouldn't make any difference anyway\n app.set('env', process.env.NODE_ENV || 'production');\n app.use(cors());\n app.use(limiter);\n\n // Router setup\n app.use(log);\n app.use(errorReportingMiddleware);\n app.use(function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n res.setHeader('x-powered-by', getUserAgent(config.user_agent));\n next();\n });\n\n app.use(compression());\n\n app.get(\n '/favicon.ico',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n req.url = '/-/static/favicon.png';\n next();\n }\n );\n\n // Hook for tests only\n if (config._debug) {\n hookDebug(app, config.configPath);\n }\n\n // register middleware plugins\n const plugin_params = {\n config: config,\n logger: logger,\n };\n\n const plugins: IPluginMiddleware<IConfig>[] = loadPlugin(\n config,\n config.middlewares,\n plugin_params,\n function (plugin: IPluginMiddleware<IConfig>) {\n return plugin.register_middlewares;\n }\n );\n\n if (_.isEmpty(plugins)) {\n plugins.push(\n new AuditMiddleware(\n { ...config, enabled: true, strict_ssl: true },\n { config, logger: logger }\n )\n );\n }\n\n plugins.forEach((plugin: IPluginMiddleware<IConfig>) => {\n plugin.register_middlewares(app, auth, storage);\n });\n\n // For npm request\n // @ts-ignore\n app.use(apiEndpoint(config, auth, storage));\n\n // For WebUI & WebUI API\n if (_.get(config, 'web.enable', true)) {\n app.use(webMiddleware(config, auth, storage));\n } else {\n app.get('/', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound(API_ERROR.WEB_DISABLED));\n });\n }\n\n // Catch 404\n app.get('/*', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound('resource not found'));\n });\n\n app.use(function (\n err: HttpError,\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ) {\n if (_.isError(err)) {\n if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) {\n return next();\n }\n if (_.isFunction(res.locals.report_error) === false) {\n // in case of very early error this middleware may not be loaded before error is generated\n // fixing that\n errorReportingMiddleware(req, res, _.noop);\n }\n res.locals.report_error(err);\n } else {\n // Fall to Middleware.final\n return next(err);\n }\n });\n\n app.use(final);\n\n return app;\n};\n\nexport default (async function (configHash: ConfigYaml): Promise<any> {\n debug('start server');\n const config: IConfig = new AppConfig(_.cloneDeep(configHash) as any);\n // register middleware plugins\n const plugin_params = {\n config: config,\n logger,\n };\n const filters = loadPlugin(\n config,\n config.filters || {},\n plugin_params,\n (plugin: IPluginStorageFilter<IConfig>) => plugin.filter_metadata\n );\n debug('loaded filter plugin');\n // @ts-ignore\n const storage: Storage = new Storage(config);\n try {\n // waits until init calls have been initialized\n debug('storage init start');\n await storage.init(config, filters);\n debug('storage init end');\n } catch (err: any) {\n logger.error({ error: err.msg }, 'storage has failed: @{error}');\n throw new Error(err);\n }\n return defineAPI(config, storage);\n});\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function getUserAgent(userAgent: string): string;
package/build/utils.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getUserAgent = getUserAgent;
7
+
8
+ const pkgVersion = require('../package.json').version;
9
+
10
+ function getUserAgent(userAgent) {
11
+ if (typeof userAgent === 'string') {
12
+ return userAgent;
13
+ } else if (userAgent === false) {
14
+ return 'hidden';
15
+ }
16
+
17
+ return `verdaccio/${pkgVersion}`;
18
+ }
19
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":["pkgVersion","require","version","getUserAgent","userAgent"],"sources":["../src/utils.ts"],"sourcesContent":["const pkgVersion = require('../package.json').version;\n\nexport function getUserAgent(userAgent: string): string {\n if (typeof userAgent === 'string') {\n return userAgent;\n } else if (userAgent === false) {\n return 'hidden';\n }\n\n return `verdaccio/${pkgVersion}`;\n}\n"],"mappings":";;;;;;;AAAA,MAAMA,UAAU,GAAGC,OAAO,CAAC,iBAAD,CAAP,CAA2BC,OAA9C;;AAEO,SAASC,YAAT,CAAsBC,SAAtB,EAAiD;EACtD,IAAI,OAAOA,SAAP,KAAqB,QAAzB,EAAmC;IACjC,OAAOA,SAAP;EACD,CAFD,MAEO,IAAIA,SAAS,KAAK,KAAlB,EAAyB;IAC9B,OAAO,QAAP;EACD;;EAED,OAAQ,aAAYJ,UAAW,EAA/B;AACD"}
package/jest.config.js CHANGED
@@ -1,5 +1,10 @@
1
- const config = require('../../jest/config');
1
+ const config = require('../../../jest/config');
2
2
 
3
3
  module.exports = Object.assign({}, config, {
4
- setupFilesAfterEnv: ['./jest.setup.js'],
4
+ coverageThreshold: {
5
+ global: {
6
+ // FIXME: increase to 90
7
+ lines: 85,
8
+ },
9
+ },
5
10
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/server",
3
- "version": "6.0.0-6-next.31",
3
+ "version": "6.0.0-6-next.34",
4
4
  "description": "server logic",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -30,31 +30,29 @@
30
30
  "npm": ">=6"
31
31
  },
32
32
  "dependencies": {
33
- "@verdaccio/api": "6.0.0-6-next.25",
34
- "@verdaccio/auth": "6.0.0-6-next.22",
35
- "@verdaccio/core": "6.0.0-6-next.5",
36
- "@verdaccio/config": "6.0.0-6-next.14",
37
- "@verdaccio/loaders": "6.0.0-6-next.12",
38
- "@verdaccio/logger": "6.0.0-6-next.11",
39
- "@verdaccio/middleware": "6.0.0-6-next.22",
40
- "@verdaccio/store": "6.0.0-6-next.22",
41
- "@verdaccio/utils": "6.0.0-6-next.11",
42
- "@verdaccio/web": "6.0.0-6-next.29",
43
- "verdaccio-audit": "11.0.0-6-next.8",
33
+ "@verdaccio/api": "6.0.0-6-next.28",
34
+ "@verdaccio/auth": "6.0.0-6-next.24",
35
+ "@verdaccio/core": "6.0.0-6-next.7",
36
+ "@verdaccio/config": "6.0.0-6-next.16",
37
+ "@verdaccio/loaders": "6.0.0-6-next.14",
38
+ "@verdaccio/logger": "6.0.0-6-next.13",
39
+ "@verdaccio/middleware": "6.0.0-6-next.24",
40
+ "@verdaccio/store": "6.0.0-6-next.25",
41
+ "@verdaccio/utils": "6.0.0-6-next.13",
42
+ "@verdaccio/web": "6.0.0-6-next.32",
43
+ "verdaccio-audit": "11.0.0-6-next.10",
44
44
  "compression": "1.7.4",
45
45
  "cors": "2.8.5",
46
- "debug": "4.3.3",
47
- "express": "4.17.2",
46
+ "debug": "4.3.4",
47
+ "express": "4.18.1",
48
48
  "express-rate-limit": "5.5.1",
49
49
  "lodash": "4.17.21"
50
50
  },
51
51
  "devDependencies": {
52
- "@types/node": "16.11.21",
53
- "@verdaccio/mock": "6.0.0-6-next.15",
54
- "@verdaccio/proxy": "6.0.0-6-next.20",
55
- "@verdaccio/test-helper": "1.1.0-6-next.1",
56
- "http-errors": "1.8.1",
57
- "request": "2.88.0"
52
+ "@types/node": "16.11.56",
53
+ "@verdaccio/proxy": "6.0.0-6-next.23",
54
+ "@verdaccio/test-helper": "1.1.0-6-next.3",
55
+ "http-errors": "1.8.1"
58
56
  },
59
57
  "funding": {
60
58
  "type": "opencollective",
@@ -62,7 +60,7 @@
62
60
  },
63
61
  "scripts": {
64
62
  "clean": "rimraf ./build",
65
- "test": "cross-env NODE_ENV=test BABEL_ENV=test jest --detectOpenHandles",
63
+ "test": "jest",
66
64
  "type-check": "tsc --noEmit -p tsconfig.build.json",
67
65
  "build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
68
66
  "watch": "pnpm build:js -- --watch",
@@ -2,7 +2,7 @@ import { Application } from 'express';
2
2
 
3
3
  import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../../types/custom';
4
4
 
5
- export default (app: Application, configPath: string): void => {
5
+ export default (app: Application, configPath?: string): void => {
6
6
  // Hook for tests only
7
7
  app.get(
8
8
  '/-/_debug',
@@ -14,7 +14,7 @@ export default (app: Application, configPath: string): void => {
14
14
  next({
15
15
  pid: process.pid,
16
16
  // @ts-ignore
17
- main: process.mainModule.filename,
17
+ main: process.main,
18
18
  conf: configPath,
19
19
  mem: process.memoryUsage(),
20
20
  gc: global.gc,
package/src/server.ts CHANGED
@@ -15,12 +15,13 @@ import { loadPlugin } from '@verdaccio/loaders';
15
15
  import { logger } from '@verdaccio/logger';
16
16
  import { errorReportingMiddleware, final, log } from '@verdaccio/middleware';
17
17
  import { Storage } from '@verdaccio/store';
18
- import { ConfigRuntime } from '@verdaccio/types';
18
+ import { ConfigYaml } from '@verdaccio/types';
19
19
  import { Config as IConfig, IPlugin, IPluginStorageFilter } from '@verdaccio/types';
20
20
  import webMiddleware from '@verdaccio/web';
21
21
 
22
22
  import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';
23
23
  import hookDebug from './debug';
24
+ import { getUserAgent } from './utils';
24
25
 
25
26
  export interface IPluginMiddleware<T> extends IPlugin<T> {
26
27
  register_middlewares(app: any, auth: IBasicAuth<T>, storage: Storage): void;
@@ -42,7 +43,7 @@ const defineAPI = function (config: IConfig, storage: Storage): any {
42
43
  app.use(log);
43
44
  app.use(errorReportingMiddleware);
44
45
  app.use(function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
45
- res.setHeader('X-Powered-By', config.user_agent);
46
+ res.setHeader('x-powered-by', getUserAgent(config.user_agent));
46
47
  next();
47
48
  });
48
49
 
@@ -58,7 +59,7 @@ const defineAPI = function (config: IConfig, storage: Storage): any {
58
59
 
59
60
  // Hook for tests only
60
61
  if (config._debug) {
61
- hookDebug(app, config.config_path);
62
+ hookDebug(app, config.configPath);
62
63
  }
63
64
 
64
65
  // register middleware plugins
@@ -104,7 +105,7 @@ const defineAPI = function (config: IConfig, storage: Storage): any {
104
105
 
105
106
  // Catch 404
106
107
  app.get('/*', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {
107
- next(errorUtils.getNotFound(API_ERROR.FILE_NOT_FOUND));
108
+ next(errorUtils.getNotFound('resource not found'));
108
109
  });
109
110
 
110
111
  app.use(function (
@@ -134,13 +135,13 @@ const defineAPI = function (config: IConfig, storage: Storage): any {
134
135
  return app;
135
136
  };
136
137
 
137
- export default (async function (configHash: ConfigRuntime): Promise<any> {
138
+ export default (async function (configHash: ConfigYaml): Promise<any> {
138
139
  debug('start server');
139
- const config: IConfig = new AppConfig(_.cloneDeep(configHash));
140
+ const config: IConfig = new AppConfig(_.cloneDeep(configHash) as any);
140
141
  // register middleware plugins
141
142
  const plugin_params = {
142
143
  config: config,
143
- logger: logger,
144
+ logger,
144
145
  };
145
146
  const filters = loadPlugin(
146
147
  config,
package/src/utils.ts ADDED
@@ -0,0 +1,11 @@
1
+ const pkgVersion = require('../package.json').version;
2
+
3
+ export function getUserAgent(userAgent: string): string {
4
+ if (typeof userAgent === 'string') {
5
+ return userAgent;
6
+ } else if (userAgent === false) {
7
+ return 'hidden';
8
+ }
9
+
10
+ return `verdaccio/${pkgVersion}`;
11
+ }
@@ -0,0 +1,29 @@
1
+ import { Application } from 'express';
2
+ import path from 'path';
3
+
4
+ import { parseConfigFile } from '@verdaccio/config';
5
+ import { fileUtils } from '@verdaccio/core';
6
+ import { setup } from '@verdaccio/logger';
7
+ import { generateRandomHexString } from '@verdaccio/utils';
8
+
9
+ import apiMiddleware from '../src';
10
+
11
+ setup();
12
+
13
+ export const getConf = async (conf) => {
14
+ const configPath = path.join(__dirname, 'config', conf);
15
+ const config = parseConfigFile(configPath);
16
+ // generate and create storage folder
17
+ const storage = await fileUtils.createTempFolder('config');
18
+ config.storage = storage;
19
+ // custom config to avoid conflict with other tests
20
+ config.auth.htpasswd.file = path.join(
21
+ storage,
22
+ `${config.auth.htpasswd.file}-${generateRandomHexString()}`
23
+ );
24
+ return config;
25
+ };
26
+
27
+ export async function initializeServer(configName): Promise<Application> {
28
+ return apiMiddleware(await getConf(configName));
29
+ }
@@ -0,0 +1,28 @@
1
+ # storage: this is generated on _helper file
2
+
3
+ auth:
4
+ htpasswd:
5
+ file: ./htpasswd-package
6
+
7
+ web:
8
+ enable: true
9
+ title: verdaccio
10
+
11
+ publish:
12
+ allow_offline: false
13
+
14
+ uplinks:
15
+
16
+ log: { type: stdout, format: pretty, level: trace }
17
+
18
+ packages:
19
+ '@*/*':
20
+ access: $all
21
+ publish: $all
22
+ unpublish: none
23
+ '**':
24
+ access: $all
25
+ publish: $all
26
+ unpublish: none
27
+
28
+ _debug: true
@@ -0,0 +1,26 @@
1
+ # storage: this is generated on _helper file
2
+
3
+ auth:
4
+ htpasswd:
5
+ file: ./htpasswd-package
6
+
7
+ web:
8
+ enable: true
9
+ title: verdaccio
10
+
11
+ publish:
12
+ allow_offline: false
13
+
14
+ uplinks:
15
+
16
+ log: { type: stdout, format: pretty, level: trace }
17
+
18
+ packages:
19
+ '@*/*':
20
+ access: $all
21
+ publish: $all
22
+ unpublish: none
23
+ '**':
24
+ access: $all
25
+ publish: $all
26
+ unpublish: none
@@ -0,0 +1,29 @@
1
+ # storage: this is generated on _helper file
2
+
3
+ auth:
4
+ htpasswd:
5
+ file: ./htpasswd-package
6
+
7
+ web:
8
+ enable: true
9
+
10
+ user_agent: 'custom user agent'
11
+
12
+ publish:
13
+ allow_offline: false
14
+
15
+ uplinks:
16
+
17
+ log: { type: stdout, format: pretty, level: trace }
18
+
19
+ packages:
20
+ '@*/*':
21
+ access: $all
22
+ publish: $all
23
+ unpublish: none
24
+ '**':
25
+ access: $all
26
+ publish: $all
27
+ unpublish: none
28
+
29
+ _debug: true
@@ -0,0 +1,29 @@
1
+ # storage: this is generated on _helper file
2
+
3
+ auth:
4
+ htpasswd:
5
+ file: ./htpasswd-package
6
+
7
+ web:
8
+ enable: true
9
+
10
+ user_agent: false
11
+
12
+ publish:
13
+ allow_offline: false
14
+
15
+ uplinks:
16
+
17
+ log: { type: stdout, format: pretty, level: trace }
18
+
19
+ packages:
20
+ '@*/*':
21
+ access: $all
22
+ publish: $all
23
+ unpublish: none
24
+ '**':
25
+ access: $all
26
+ publish: $all
27
+ unpublish: none
28
+
29
+ _debug: true
@@ -0,0 +1,27 @@
1
+ # storage: this is generated on _helper file
2
+
3
+ auth:
4
+ htpasswd:
5
+ file: ./htpasswd-package
6
+
7
+ web:
8
+ enable: false
9
+
10
+ publish:
11
+ allow_offline: false
12
+
13
+ uplinks:
14
+
15
+ log: { type: stdout, format: pretty, level: trace }
16
+
17
+ packages:
18
+ '@*/*':
19
+ access: $all
20
+ publish: $all
21
+ unpublish: none
22
+ '**':
23
+ access: $all
24
+ publish: $all
25
+ unpublish: none
26
+
27
+ _debug: true