@verdaccio/api 6.0.0-6-next.25 → 6.0.0-6-next.28

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 (64) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/build/dist-tags.js +40 -35
  3. package/build/dist-tags.js.map +1 -1
  4. package/build/index.js +1 -7
  5. package/build/index.js.map +1 -1
  6. package/build/package.js +39 -28
  7. package/build/package.js.map +1 -1
  8. package/build/ping.js.map +1 -1
  9. package/build/publish.d.ts +79 -22
  10. package/build/publish.js +89 -313
  11. package/build/publish.js.map +1 -1
  12. package/build/search.js.map +1 -1
  13. package/build/star.js +53 -54
  14. package/build/star.js.map +1 -1
  15. package/build/stars.js +6 -6
  16. package/build/stars.js.map +1 -1
  17. package/build/user.js +19 -1
  18. package/build/user.js.map +1 -1
  19. package/build/v1/profile.js.map +1 -1
  20. package/build/v1/search.js +2 -4
  21. package/build/v1/search.js.map +1 -1
  22. package/build/v1/token.js.map +1 -1
  23. package/build/whoami.js +11 -25
  24. package/build/whoami.js.map +1 -1
  25. package/jest.config.js +8 -1
  26. package/package.json +71 -69
  27. package/src/dist-tags.ts +63 -50
  28. package/src/index.ts +1 -6
  29. package/src/package.ts +37 -44
  30. package/src/publish.ts +115 -336
  31. package/src/star.ts +53 -52
  32. package/src/stars.ts +9 -11
  33. package/src/user.ts +19 -2
  34. package/src/v1/search.ts +3 -3
  35. package/src/whoami.ts +8 -24
  36. package/test/integration/_helper.ts +97 -54
  37. package/test/integration/config/distTag.yaml +25 -0
  38. package/test/integration/config/package.yaml +3 -8
  39. package/test/integration/config/ping.yaml +2 -6
  40. package/test/integration/config/publish.yaml +4 -10
  41. package/test/integration/config/search.yaml +29 -0
  42. package/test/integration/config/token.jwt.yaml +27 -0
  43. package/test/integration/config/token.yaml +19 -0
  44. package/test/integration/config/user.jwt.yaml +37 -0
  45. package/test/integration/config/user.yaml +8 -14
  46. package/test/integration/config/whoami.yaml +4 -11
  47. package/test/integration/distTag.spec.ts +76 -0
  48. package/test/integration/package.spec.ts +53 -75
  49. package/test/integration/ping.spec.ts +4 -3
  50. package/test/integration/publish.spec.ts +60 -25
  51. package/test/integration/search.spec.ts +126 -0
  52. package/test/integration/token.spec.ts +124 -0
  53. package/test/integration/user.jwt.spec.ts +87 -0
  54. package/test/integration/user.spec.ts +1 -0
  55. package/test/integration/whoami.spec.ts +21 -39
  56. package/test/unit/publish.disabled.ts +252 -0
  57. package/tsconfig.json +1 -1
  58. package/__mocks__/@verdaccio/logger/index.js +0 -21
  59. package/build/utils.d.ts +0 -7
  60. package/build/utils.js +0 -36
  61. package/build/utils.js.map +0 -1
  62. package/src/utils.ts +0 -25
  63. package/test/unit/__snapshots__/publish.spec.ts.snap +0 -49
  64. package/test/unit/publish.spec.ts +0 -300
package/CHANGELOG.md CHANGED
@@ -1,5 +1,111 @@
1
1
  # @verdaccio/api
2
2
 
3
+ ## 6.0.0-6-next.28
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/auth@6.0.0-6-next.24
10
+ - @verdaccio/core@6.0.0-6-next.7
11
+ - @verdaccio/logger@6.0.0-6-next.13
12
+ - @verdaccio/store@6.0.0-6-next.25
13
+ - @verdaccio/middleware@6.0.0-6-next.24
14
+ - @verdaccio/config@6.0.0-6-next.16
15
+ - @verdaccio/utils@6.0.0-6-next.13
16
+
17
+ ## 6.0.0-6-next.27
18
+
19
+ ### Minor Changes
20
+
21
+ - 37274e4c: feat: implement abbreviated manifest
22
+
23
+ Enable abbreviated manifest data by adding the header:
24
+
25
+ ```
26
+ curl -H "Accept: application/vnd.npm.install-v1+json" https://registry.npmjs.org/verdaccio
27
+ ```
28
+
29
+ It returns a filtered manifest, additionally includes the [time](https://github.com/pnpm/rfcs/pull/2) field by request.
30
+
31
+ Current support for packages managers:
32
+
33
+ - npm: yes
34
+ - pnpm: yes
35
+ - yarn classic: yes
36
+ - yarn modern (+2.x): [no](https://github.com/yarnpkg/berry/pull/3981#issuecomment-1076566096)
37
+
38
+ https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-metadata-format
39
+
40
+ ### Patch Changes
41
+
42
+ - Updated dependencies [37274e4c]
43
+ - @verdaccio/store@6.0.0-6-next.24
44
+ - @verdaccio/auth@6.0.0-6-next.23
45
+ - @verdaccio/core@6.0.0-6-next.6
46
+ - @verdaccio/logger@6.0.0-6-next.12
47
+
48
+ ## 6.0.0-6-next.26
49
+
50
+ ### Major Changes
51
+
52
+ - 292c0a37: feat!: replace deprecated request dependency by got
53
+
54
+ 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.
55
+
56
+ ## Notes
57
+
58
+ - Remove deprecated `request` by other `got`, retry improved, custom Agent ( got does not include it built-in)
59
+ - Remove `async` dependency from storage (used by core) it was linked with proxy somehow safe to remove now
60
+ - Refactor with promises instead callback wherever is possible
61
+ - ~Document the API~
62
+ - Improve testing, integration tests
63
+ - Bugfix
64
+ - Clean up old validations
65
+ - Improve performance
66
+
67
+ ## 💥 Breaking changes
68
+
69
+ - Plugin API methods were callbacks based are returning promises, this will break current storage plugins, check documentation for upgrade.
70
+ - 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));`
71
+ - `@verdaccio/streams` stream abort support is legacy is being deprecated removed
72
+ - Remove AWS and Google Cloud packages for future refactoring [#2574](https://github.com/verdaccio/verdaccio/pull/2574).
73
+
74
+ ### Minor Changes
75
+
76
+ - 00d1d2a1: chore: env variable for launch fastify
77
+
78
+ - Update fastify to major release `v4.3.0`
79
+ - Update CLI launcher
80
+
81
+ via CLI
82
+
83
+ ```
84
+ VERDACCIO_SERVER=fastify verdaccio
85
+ ```
86
+
87
+ with docker
88
+
89
+ ```
90
+ docker run -it --rm --name verdaccio \
91
+ -e "VERDACCIO_SERVER=8080" -p 8080:8080 \
92
+ -e "VERDACCIO_SERVER=fastify" \
93
+ verdaccio/verdaccio
94
+ ```
95
+
96
+ ### Patch Changes
97
+
98
+ - Updated dependencies [292c0a37]
99
+ - Updated dependencies [a3a209b5]
100
+ - Updated dependencies [00d1d2a1]
101
+ - @verdaccio/auth@6.0.0-6-next.23
102
+ - @verdaccio/config@6.0.0-6-next.15
103
+ - @verdaccio/core@6.0.0-6-next.6
104
+ - @verdaccio/logger@6.0.0-6-next.12
105
+ - @verdaccio/middleware@6.0.0-6-next.23
106
+ - @verdaccio/store@6.0.0-6-next.23
107
+ - @verdaccio/utils@6.0.0-6-next.12
108
+
3
109
  ## 6.0.0-6-next.25
4
110
 
5
111
  ### Patch Changes
@@ -18,68 +18,73 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
18
18
  function _default(route, auth, storage) {
19
19
  const can = (0, _middleware.allow)(auth);
20
20
 
21
- const tag_package_version = function (req, res, next) {
21
+ const addTagPackageVersionMiddleware = async function (req, res, next) {
22
22
  if (_lodash.default.isString(req.body) === false) {
23
- return next('route');
23
+ return next(_core.errorUtils.getBadRequest('version is missing'));
24
24
  }
25
25
 
26
26
  const tags = {};
27
27
  tags[req.params.tag] = req.body;
28
- storage.mergeTags(req.params.package, tags, function (err) {
29
- if (err) {
30
- return next(err);
31
- }
32
28
 
29
+ try {
30
+ await storage.mergeTagsNext(req.params.package, tags);
33
31
  res.status(_core.constants.HTTP_STATUS.CREATED);
34
32
  return next({
35
33
  ok: _core.constants.API_MESSAGE.TAG_ADDED
36
34
  });
37
- });
35
+ } catch (err) {
36
+ next(err);
37
+ }
38
38
  }; // tagging a package.
39
39
 
40
40
 
41
- route.put('/:package/:tag', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), tag_package_version);
42
- route.post('/-/package/:package/dist-tags/:tag', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), tag_package_version);
43
- route.put('/-/package/:package/dist-tags/:tag', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), tag_package_version);
44
- route.delete('/-/package/:package/dist-tags/:tag', can('publish'), function (req, res, next) {
41
+ route.put('/:package/:tag', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), addTagPackageVersionMiddleware);
42
+ route.put('/-/package/:package/dist-tags/:tag', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), addTagPackageVersionMiddleware);
43
+ route.delete('/-/package/:package/dist-tags/:tag', can('publish'), async function (req, res, next) {
45
44
  const tags = {};
46
45
  tags[req.params.tag] = null;
47
- storage.mergeTags(req.params.package, tags, function (err) {
48
- if (err) {
49
- return next(err);
50
- }
51
46
 
47
+ try {
48
+ await storage.mergeTagsNext(req.params.package, tags);
52
49
  res.status(_core.constants.HTTP_STATUS.CREATED);
53
50
  return next({
54
51
  ok: _core.constants.API_MESSAGE.TAG_REMOVED
55
52
  });
56
- });
53
+ } catch (err) {
54
+ next(err);
55
+ }
57
56
  });
58
- route.get('/-/package/:package/dist-tags', can('access'), function (req, res, next) {
59
- storage.getPackage({
60
- name: req.params.package,
61
- uplinksLook: true,
62
- req,
63
- callback: function (err, info) {
64
- if (err) {
65
- return next(err);
66
- }
57
+ route.get('/-/package/:package/dist-tags', can('access'), async function (req, res, next) {
58
+ const name = req.params.package;
59
+ const requestOptions = {
60
+ protocol: req.protocol,
61
+ headers: req.headers,
62
+ // FIXME: if we migrate to req.hostname, the port is not longer included.
63
+ host: req.host,
64
+ remoteAddress: req.socket.remoteAddress
65
+ };
67
66
 
68
- next(info[_core.constants.DIST_TAGS]);
69
- }
70
- });
67
+ try {
68
+ const manifest = await storage.getPackageByOptions({
69
+ name,
70
+ uplinksLook: true,
71
+ requestOptions
72
+ });
73
+ next(manifest[_core.constants.DIST_TAGS]);
74
+ } catch (err) {
75
+ next(err);
76
+ }
71
77
  });
72
- route.post('/-/package/:package/dist-tags', can('publish'), function (req, res, next) {
73
- storage.mergeTags(req.params.package, req.body, function (err) {
74
- if (err) {
75
- return next(err);
76
- }
77
-
78
+ route.post('/-/package/:package/dist-tags', can('publish'), async function (req, res, next) {
79
+ try {
80
+ await storage.mergeTagsNext(req.params.package, req.body);
78
81
  res.status(_core.constants.HTTP_STATUS.CREATED);
79
82
  return next({
80
83
  ok: _core.constants.API_MESSAGE.TAG_UPDATED
81
84
  });
82
- });
85
+ } catch (err) {
86
+ next(err);
87
+ }
83
88
  });
84
89
  }
85
90
  //# sourceMappingURL=dist-tags.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dist-tags.ts"],"names":["route","auth","storage","can","tag_package_version","req","res","next","_","isString","body","tags","params","tag","mergeTags","package","err","status","constants","HTTP_STATUS","CREATED","ok","API_MESSAGE","TAG_ADDED","put","mime","getType","post","delete","TAG_REMOVED","get","getPackage","name","uplinksLook","callback","info","DIST_TAGS","TAG_UPDATED"],"mappings":"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","sourcesContent":["import { Router } from 'express';\nimport _ from 'lodash';\nimport mime from 'mime';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { VerdaccioError, constants } from '@verdaccio/core';\nimport { allow, media } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Package } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router, auth: IAuth, storage: Storage): void {\n const can = allow(auth);\n const tag_package_version = function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): $NextFunctionVer {\n if (_.isString(req.body) === false) {\n return next('route');\n }\n\n const tags = {};\n tags[req.params.tag] = req.body;\n storage.mergeTags(req.params.package, tags, function (err: Error): $NextFunctionVer {\n if (err) {\n return next(err);\n }\n res.status(constants.HTTP_STATUS.CREATED);\n return next({ ok: constants.API_MESSAGE.TAG_ADDED });\n });\n };\n\n // tagging a package.\n route.put('/:package/:tag', can('publish'), media(mime.getType('json')), tag_package_version);\n\n route.post(\n '/-/package/:package/dist-tags/:tag',\n can('publish'),\n media(mime.getType('json')),\n tag_package_version\n );\n\n route.put(\n '/-/package/:package/dist-tags/:tag',\n can('publish'),\n media(mime.getType('json')),\n tag_package_version\n );\n\n route.delete(\n '/-/package/:package/dist-tags/:tag',\n can('publish'),\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n const tags = {};\n tags[req.params.tag] = null;\n storage.mergeTags(req.params.package, tags, function (err: VerdaccioError): $NextFunctionVer {\n if (err) {\n return next(err);\n }\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_REMOVED,\n });\n });\n }\n );\n\n route.get(\n '/-/package/:package/dist-tags',\n can('access'),\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n storage.getPackage({\n name: req.params.package,\n uplinksLook: true,\n req,\n callback: function (err: VerdaccioError, info: Package): $NextFunctionVer {\n if (err) {\n return next(err);\n }\n\n next(info[constants.DIST_TAGS]);\n },\n });\n }\n );\n\n route.post(\n '/-/package/:package/dist-tags',\n can('publish'),\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n storage.mergeTags(\n req.params.package,\n req.body,\n function (err: VerdaccioError): $NextFunctionVer {\n if (err) {\n return next(err);\n }\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_UPDATED,\n });\n }\n );\n }\n );\n}\n"],"file":"dist-tags.js"}
1
+ {"version":3,"file":"dist-tags.js","names":["route","auth","storage","can","allow","addTagPackageVersionMiddleware","req","res","next","_","isString","body","errorUtils","getBadRequest","tags","params","tag","mergeTagsNext","package","status","constants","HTTP_STATUS","CREATED","ok","API_MESSAGE","TAG_ADDED","err","put","media","mime","getType","delete","TAG_REMOVED","get","name","requestOptions","protocol","headers","host","remoteAddress","socket","manifest","getPackageByOptions","uplinksLook","DIST_TAGS","post","TAG_UPDATED"],"sources":["../src/dist-tags.ts"],"sourcesContent":["import { Router } from 'express';\nimport _ from 'lodash';\nimport mime from 'mime';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { constants, errorUtils } from '@verdaccio/core';\nimport { allow, media } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router, auth: IAuth, storage: Storage): void {\n const can = allow(auth);\n const addTagPackageVersionMiddleware = async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<$NextFunctionVer> {\n if (_.isString(req.body) === false) {\n return next(errorUtils.getBadRequest('version is missing'));\n }\n\n const tags = {};\n tags[req.params.tag] = req.body;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_ADDED,\n });\n } catch (err) {\n next(err);\n }\n };\n\n // tagging a package.\n route.put(\n '/:package/:tag',\n can('publish'),\n media(mime.getType('json')),\n addTagPackageVersionMiddleware\n );\n\n route.put(\n '/-/package/:package/dist-tags/:tag',\n can('publish'),\n media(mime.getType('json')),\n addTagPackageVersionMiddleware\n );\n\n route.delete(\n '/-/package/:package/dist-tags/:tag',\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const tags = {};\n tags[req.params.tag] = null;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_REMOVED,\n });\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n '/-/package/:package/dist-tags',\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const name = req.params.package;\n const requestOptions = {\n protocol: req.protocol,\n headers: req.headers as any,\n // FIXME: if we migrate to req.hostname, the port is not longer included.\n host: req.host,\n remoteAddress: req.socket.remoteAddress,\n };\n try {\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n requestOptions,\n });\n next(manifest[constants.DIST_TAGS]);\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.post(\n '/-/package/:package/dist-tags',\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n try {\n await storage.mergeTagsNext(req.params.package, req.body);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_UPDATED,\n });\n } catch (err) {\n next(err);\n }\n }\n );\n}\n"],"mappings":"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"}
package/build/index.js CHANGED
@@ -9,8 +9,6 @@ var _bodyParser = _interopRequireDefault(require("body-parser"));
9
9
 
10
10
  var _express = _interopRequireDefault(require("express"));
11
11
 
12
- var _semver = _interopRequireDefault(require("semver"));
13
-
14
12
  var _middleware = require("@verdaccio/middleware");
15
13
 
16
14
  var _distTags = _interopRequireDefault(require("./dist-tags"));
@@ -37,10 +35,6 @@ var _whoami = _interopRequireDefault(require("./whoami"));
37
35
 
38
36
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
37
 
40
- if (_semver.default.lte(process.version, 'v15.0.0')) {
41
- global.AbortController = require('abortcontroller-polyfill/dist/cjs-ponyfill').AbortController;
42
- }
43
-
44
38
  function _default(config, auth, storage) {
45
39
  /* eslint new-cap:off */
46
40
  const app = _express.default.Router();
@@ -77,7 +71,7 @@ function _default(config, auth, storage) {
77
71
  (0, _search.default)(app);
78
72
  (0, _user.default)(app, auth, config);
79
73
  (0, _distTags.default)(app, auth, storage);
80
- (0, _publish.default)(app, auth, storage, config);
74
+ (0, _publish.default)(app, auth, storage);
81
75
  (0, _ping.default)(app);
82
76
  (0, _stars.default)(app, storage); // @ts-ignore
83
77
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["semver","lte","process","version","global","AbortController","require","config","auth","storage","app","express","Router","param","validatePackage","validateName","use","apiJWTmiddleware","bodyParser","json","strict","limit","max_body_size","encodeScopePackage"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAGA;;AAUA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEA,IAAIA,gBAAOC,GAAP,CAAWC,OAAO,CAACC,OAAnB,EAA4B,SAA5B,CAAJ,EAA4C;AAC1CC,EAAAA,MAAM,CAACC,eAAP,GAAyBC,OAAO,CAAC,4CAAD,CAAP,CAAsDD,eAA/E;AACD;;AAEc,kBAAUE,MAAV,EAA0BC,IAA1B,EAAuCC,OAAvC,EAAiE;AAC9E;AACA,QAAMC,GAAG,GAAGC,iBAAQC,MAAR,EAAZ;AACA;AAEA;AACA;;;AACAF,EAAAA,GAAG,CAACG,KAAJ,CAAU,SAAV,EAAqBC,2BAArB;AACAJ,EAAAA,GAAG,CAACG,KAAJ,CAAU,UAAV,EAAsBE,wBAAtB;AACAL,EAAAA,GAAG,CAACG,KAAJ,CAAU,KAAV,EAAiBE,wBAAjB;AACAL,EAAAA,GAAG,CAACG,KAAJ,CAAU,SAAV,EAAqBE,wBAArB;AACAL,EAAAA,GAAG,CAACG,KAAJ,CAAU,UAAV,EAAsBE,wBAAtB;AACAL,EAAAA,GAAG,CAACG,KAAJ,CAAU,OAAV,EAAmBE,wBAAnB,EAZ8E,CAc9E;AACA;;AACAL,EAAAA,GAAG,CAACG,KAAJ,CAAU,MAAV,EAAkB,uBAAM,QAAN,CAAlB;AACAH,EAAAA,GAAG,CAACG,KAAJ,CAAU,kBAAV,EAA8B,uBAAM,sBAAN,CAA9B;AACAH,EAAAA,GAAG,CAACG,KAAJ,CAAU,UAAV,EAAsB,uBAAM,IAAN,CAAtB;AACAH,EAAAA,GAAG,CAACM,GAAJ,CAAQR,IAAI,CAACS,gBAAL,EAAR;AACAP,EAAAA,GAAG,CAACM,GAAJ,CAAQE,oBAAWC,IAAX,CAAgB;AAAEC,IAAAA,MAAM,EAAE,KAAV;AAAiBC,IAAAA,KAAK,EAAEd,MAAM,CAACe,aAAP,IAAwB;AAAhD,GAAhB,CAAR,EApB8E,CAqB9E;;AACAZ,EAAAA,GAAG,CAACM,GAAJ,CAAQ,0BAAST,MAAT,CAAR,EAtB8E,CAuB9E;;AACAG,EAAAA,GAAG,CAACM,GAAJ,CAAQO,8BAAR,EAxB8E,CAyB9E;;AACA,uBAAOb,GAAP;AACA,wBAAIA,GAAJ,EAASF,IAAT,EAAeC,OAAf;AACA,wBAAQC,GAAR,EAAaF,IAAb,EA5B8E,CA6B9E;;AACA,uBAAOE,GAAP;AACA,qBAAKA,GAAL,EAAUF,IAAV,EAAgBD,MAAhB;AACA,yBAASG,GAAT,EAAcF,IAAd,EAAoBC,OAApB;AACA,wBAAQC,GAAR,EAAaF,IAAb,EAAmBC,OAAnB,EAA4BF,MAA5B;AACA,qBAAKG,GAAL;AACA,sBAAMA,GAAN,EAAWD,OAAX,EAnC8E,CAoC9E;;AACA,wBAASC,GAAT,EAAcF,IAAd,EAAoBC,OAApB;AACA,sBAAMC,GAAN,EAAWF,IAAX,EAAiBC,OAAjB,EAA0BF,MAA1B;AACA,SAAOG,GAAP;AACD","sourcesContent":["import bodyParser from 'body-parser';\nimport express, { Router } from 'express';\nimport semver from 'semver';\n\nimport { IAuth } from '@verdaccio/auth';\nimport {\n antiLoop,\n encodeScopePackage,\n match,\n validateName,\n validatePackage,\n} from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Config } from '@verdaccio/types';\n\nimport distTags from './dist-tags';\nimport pkg from './package';\nimport ping from './ping';\nimport publish from './publish';\nimport search from './search';\nimport stars from './stars';\nimport user from './user';\nimport profile from './v1/profile';\nimport v1Search from './v1/search';\nimport token from './v1/token';\nimport whoami from './whoami';\n\nif (semver.lte(process.version, 'v15.0.0')) {\n global.AbortController = require('abortcontroller-polyfill/dist/cjs-ponyfill').AbortController;\n}\n\nexport default function (config: Config, auth: IAuth, storage: Storage): Router {\n /* eslint new-cap:off */\n const app = express.Router();\n /* eslint new-cap:off */\n\n // validate all of these params as a package name\n // this might be too harsh, so ask if it causes trouble\n app.param('package', validatePackage);\n app.param('filename', validateName);\n app.param('tag', validateName);\n app.param('version', validateName);\n app.param('revision', validateName);\n app.param('token', validateName);\n\n // these can't be safely put into express url for some reason\n // TODO: For some reason? what reason?\n app.param('_rev', match(/^-rev$/));\n app.param('org_couchdb_user', match(/^org\\.couchdb\\.user:/));\n app.param('anything', match(/.*/));\n app.use(auth.apiJWTmiddleware());\n app.use(bodyParser.json({ strict: false, limit: config.max_body_size || '10mb' }));\n // @ts-ignore\n app.use(antiLoop(config));\n // encode / in a scoped package name to be matched as a single parameter in routes\n app.use(encodeScopePackage);\n // for \"npm whoami\"\n whoami(app);\n pkg(app, auth, storage);\n profile(app, auth);\n // @deprecated endpoint, 404 by default\n search(app);\n user(app, auth, config);\n distTags(app, auth, storage);\n publish(app, auth, storage, config);\n ping(app);\n stars(app, storage);\n // @ts-ignore\n v1Search(app, auth, storage);\n token(app, auth, storage, config);\n return app;\n}\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["config","auth","storage","app","express","Router","param","validatePackage","validateName","match","use","apiJWTmiddleware","bodyParser","json","strict","limit","max_body_size","antiLoop","encodeScopePackage","whoami","pkg","profile","search","user","distTags","publish","ping","stars","v1Search","token"],"sources":["../src/index.ts"],"sourcesContent":["import bodyParser from 'body-parser';\nimport express, { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport {\n antiLoop,\n encodeScopePackage,\n match,\n validateName,\n validatePackage,\n} from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Config } from '@verdaccio/types';\n\nimport distTags from './dist-tags';\nimport pkg from './package';\nimport ping from './ping';\nimport publish from './publish';\nimport search from './search';\nimport stars from './stars';\nimport user from './user';\nimport profile from './v1/profile';\nimport v1Search from './v1/search';\nimport token from './v1/token';\nimport whoami from './whoami';\n\nexport default function (config: Config, auth: IAuth, storage: Storage): Router {\n /* eslint new-cap:off */\n const app = express.Router();\n /* eslint new-cap:off */\n\n // validate all of these params as a package name\n // this might be too harsh, so ask if it causes trouble\n app.param('package', validatePackage);\n app.param('filename', validateName);\n app.param('tag', validateName);\n app.param('version', validateName);\n app.param('revision', validateName);\n app.param('token', validateName);\n\n // these can't be safely put into express url for some reason\n // TODO: For some reason? what reason?\n app.param('_rev', match(/^-rev$/));\n app.param('org_couchdb_user', match(/^org\\.couchdb\\.user:/));\n app.param('anything', match(/.*/));\n app.use(auth.apiJWTmiddleware());\n app.use(bodyParser.json({ strict: false, limit: config.max_body_size || '10mb' }));\n // @ts-ignore\n app.use(antiLoop(config));\n // encode / in a scoped package name to be matched as a single parameter in routes\n app.use(encodeScopePackage);\n // for \"npm whoami\"\n whoami(app);\n pkg(app, auth, storage);\n profile(app, auth);\n // @deprecated endpoint, 404 by default\n search(app);\n user(app, auth, config);\n distTags(app, auth, storage);\n publish(app, auth, storage);\n ping(app);\n stars(app, storage);\n // @ts-ignore\n v1Search(app, auth, storage);\n token(app, auth, storage, config);\n return app;\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AAGA;;AAUA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEe,kBAAUA,MAAV,EAA0BC,IAA1B,EAAuCC,OAAvC,EAAiE;EAC9E;EACA,MAAMC,GAAG,GAAGC,gBAAA,CAAQC,MAAR,EAAZ;EACA;EAEA;EACA;;;EACAF,GAAG,CAACG,KAAJ,CAAU,SAAV,EAAqBC,2BAArB;EACAJ,GAAG,CAACG,KAAJ,CAAU,UAAV,EAAsBE,wBAAtB;EACAL,GAAG,CAACG,KAAJ,CAAU,KAAV,EAAiBE,wBAAjB;EACAL,GAAG,CAACG,KAAJ,CAAU,SAAV,EAAqBE,wBAArB;EACAL,GAAG,CAACG,KAAJ,CAAU,UAAV,EAAsBE,wBAAtB;EACAL,GAAG,CAACG,KAAJ,CAAU,OAAV,EAAmBE,wBAAnB,EAZ8E,CAc9E;EACA;;EACAL,GAAG,CAACG,KAAJ,CAAU,MAAV,EAAkB,IAAAG,iBAAA,EAAM,QAAN,CAAlB;EACAN,GAAG,CAACG,KAAJ,CAAU,kBAAV,EAA8B,IAAAG,iBAAA,EAAM,sBAAN,CAA9B;EACAN,GAAG,CAACG,KAAJ,CAAU,UAAV,EAAsB,IAAAG,iBAAA,EAAM,IAAN,CAAtB;EACAN,GAAG,CAACO,GAAJ,CAAQT,IAAI,CAACU,gBAAL,EAAR;EACAR,GAAG,CAACO,GAAJ,CAAQE,mBAAA,CAAWC,IAAX,CAAgB;IAAEC,MAAM,EAAE,KAAV;IAAiBC,KAAK,EAAEf,MAAM,CAACgB,aAAP,IAAwB;EAAhD,CAAhB,CAAR,EApB8E,CAqB9E;;EACAb,GAAG,CAACO,GAAJ,CAAQ,IAAAO,oBAAA,EAASjB,MAAT,CAAR,EAtB8E,CAuB9E;;EACAG,GAAG,CAACO,GAAJ,CAAQQ,8BAAR,EAxB8E,CAyB9E;;EACA,IAAAC,eAAA,EAAOhB,GAAP;EACA,IAAAiB,gBAAA,EAAIjB,GAAJ,EAASF,IAAT,EAAeC,OAAf;EACA,IAAAmB,gBAAA,EAAQlB,GAAR,EAAaF,IAAb,EA5B8E,CA6B9E;;EACA,IAAAqB,eAAA,EAAOnB,GAAP;EACA,IAAAoB,aAAA,EAAKpB,GAAL,EAAUF,IAAV,EAAgBD,MAAhB;EACA,IAAAwB,iBAAA,EAASrB,GAAT,EAAcF,IAAd,EAAoBC,OAApB;EACA,IAAAuB,gBAAA,EAAQtB,GAAR,EAAaF,IAAb,EAAmBC,OAAnB;EACA,IAAAwB,aAAA,EAAKvB,GAAL;EACA,IAAAwB,cAAA,EAAMxB,GAAN,EAAWD,OAAX,EAnC8E,CAoC9E;;EACA,IAAA0B,gBAAA,EAASzB,GAAT,EAAcF,IAAd,EAAoBC,OAApB;EACA,IAAA2B,cAAA,EAAM1B,GAAN,EAAWF,IAAX,EAAiBC,OAAjB,EAA0BF,MAA1B;EACA,OAAOG,GAAP;AACD"}
package/build/package.js CHANGED
@@ -11,47 +11,37 @@ var _core = require("@verdaccio/core");
11
11
 
12
12
  var _middleware = require("@verdaccio/middleware");
13
13
 
14
+ var _store = require("@verdaccio/store");
15
+
14
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
17
 
16
18
  const debug = (0, _debug.default)('verdaccio:api:package');
17
19
 
18
- const downloadStream = (packageName, filename, storage, _req, res) => {
19
- const stream = storage.getTarball(packageName, filename);
20
- stream.on('content-length', function (content) {
21
- res.header('Content-Length', content);
22
- });
23
- stream.on('error', function (err) {
24
- return res.locals.report_error(err);
25
- });
26
- res.header(_core.HEADERS.CONTENT_TYPE, _core.HEADERS.OCTET_STREAM);
27
- stream.pipe(res);
28
- };
29
-
30
20
  function _default(route, auth, storage) {
31
21
  const can = (0, _middleware.allow)(auth);
32
22
  route.get('/:package/:version?', can('access'), async function (req, _res, next) {
33
23
  debug('init package by version');
34
24
  const name = req.params.package;
35
- let queryVersion = req.params.version;
25
+ let version = req.params.version;
26
+ const write = req.query.write === 'true';
27
+
28
+ const abbreviated = req.get('Accept') === _store.Storage.ABBREVIATED_HEADER;
29
+
36
30
  const requestOptions = {
37
31
  protocol: req.protocol,
38
32
  headers: req.headers,
39
33
  // FIXME: if we migrate to req.hostname, the port is not longer included.
40
- host: req.host
34
+ host: req.host,
35
+ remoteAddress: req.socket.remoteAddress,
36
+ byPassCache: write
41
37
  };
42
38
 
43
39
  try {
44
- // TODO: this is just temporary while I migrate all plugins to use the new API
45
- // the method will be renamed to getPackage again but Promise Based.
46
- if (!storage.getPackageByOptions) {
47
- throw _core.errorUtils.getInternalError('getPackageByOptions not implemented, check pr-2750 for more details');
48
- }
49
-
50
40
  const manifest = await storage.getPackageByOptions({
51
41
  name,
52
42
  uplinksLook: true,
53
- req,
54
- version: queryVersion,
43
+ abbreviated,
44
+ version,
55
45
  requestOptions
56
46
  });
57
47
  next(manifest);
@@ -59,15 +49,36 @@ function _default(route, auth, storage) {
59
49
  next(err);
60
50
  }
61
51
  });
62
- route.get('/:scopedPackage/-/:scope/:filename', can('access'), function (req, res) {
52
+ route.get('/:pkg/-/:filename', can('access'), async function (req, res, next) {
63
53
  const {
64
- scopedPackage,
54
+ pkg,
65
55
  filename
66
56
  } = req.params;
67
- downloadStream(scopedPackage, filename, storage, req, res);
68
- });
69
- route.get('/:package/-/:filename', can('access'), function (req, res) {
70
- downloadStream(req.params.package, req.params.filename, storage, req, res);
57
+ const abort = new AbortController();
58
+
59
+ try {
60
+ const stream = await storage.getTarballNext(pkg, filename, {
61
+ signal: abort.signal // enableRemote: true,
62
+
63
+ });
64
+ stream.on('content-length', size => {
65
+ res.header(_core.HEADER_TYPE.CONTENT_LENGTH, size);
66
+ });
67
+ stream.once('error', err => {
68
+ res.locals.report_error(err);
69
+ next(err);
70
+ });
71
+ req.on('abort', () => {
72
+ debug('request aborted for %o', req.url);
73
+ abort.abort();
74
+ });
75
+ res.header(_core.HEADERS.CONTENT_TYPE, _core.HEADERS.OCTET_STREAM);
76
+ stream.pipe(res);
77
+ } catch (err) {
78
+ // console.log('catch API error request', err);
79
+ res.locals.report_error(err);
80
+ next(err);
81
+ }
71
82
  });
72
83
  }
73
84
  //# sourceMappingURL=package.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/package.ts"],"names":["debug","downloadStream","packageName","filename","storage","_req","res","stream","getTarball","on","content","header","err","locals","report_error","HEADERS","CONTENT_TYPE","OCTET_STREAM","pipe","route","auth","can","get","req","_res","next","name","params","package","queryVersion","version","requestOptions","protocol","headers","host","getPackageByOptions","errorUtils","getInternalError","manifest","uplinksLook","scopedPackage"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { HEADERS, errorUtils } from '@verdaccio/core';\nimport { allow } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:package');\n\nconst downloadStream = (\n packageName: string,\n filename: string,\n storage: any,\n _req: $RequestExtend,\n res: $ResponseExtend\n): void => {\n const stream = storage.getTarball(packageName, filename);\n\n stream.on('content-length', function (content): void {\n res.header('Content-Length', content);\n });\n\n stream.on('error', function (err): void {\n return res.locals.report_error(err);\n });\n\n res.header(HEADERS.CONTENT_TYPE, HEADERS.OCTET_STREAM);\n stream.pipe(res);\n};\n\nexport default function (route: Router, auth: IAuth, storage: Storage): void {\n const can = allow(auth);\n\n route.get(\n '/:package/:version?',\n can('access'),\n async function (\n req: $RequestExtend,\n _res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('init package by version');\n const name = req.params.package;\n let queryVersion = req.params.version;\n const requestOptions = {\n protocol: req.protocol,\n headers: req.headers as any,\n // FIXME: if we migrate to req.hostname, the port is not longer included.\n host: req.host,\n };\n\n try {\n // TODO: this is just temporary while I migrate all plugins to use the new API\n // the method will be renamed to getPackage again but Promise Based.\n if (!storage.getPackageByOptions) {\n throw errorUtils.getInternalError(\n 'getPackageByOptions not implemented, check pr-2750 for more details'\n );\n }\n\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n req,\n version: queryVersion,\n requestOptions,\n });\n next(manifest);\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n '/:scopedPackage/-/:scope/:filename',\n can('access'),\n function (req: $RequestExtend, res: $ResponseExtend): void {\n const { scopedPackage, filename } = req.params;\n\n downloadStream(scopedPackage, filename, storage, req, res);\n }\n );\n\n route.get(\n '/:package/-/:filename',\n can('access'),\n function (req: $RequestExtend, res: $ResponseExtend): void {\n downloadStream(req.params.package, req.params.filename, storage, req, res);\n }\n );\n}\n"],"file":"package.js"}
1
+ {"version":3,"file":"package.js","names":["debug","buildDebug","route","auth","storage","can","allow","get","req","_res","next","name","params","package","version","write","query","abbreviated","Storage","ABBREVIATED_HEADER","requestOptions","protocol","headers","host","remoteAddress","socket","byPassCache","manifest","getPackageByOptions","uplinksLook","err","res","pkg","filename","abort","AbortController","stream","getTarballNext","signal","on","size","header","HEADER_TYPE","CONTENT_LENGTH","once","locals","report_error","url","HEADERS","CONTENT_TYPE","OCTET_STREAM","pipe"],"sources":["../src/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { HEADERS, HEADER_TYPE } from '@verdaccio/core';\nimport { allow } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:package');\n\nexport default function (route: Router, auth: IAuth, storage: Storage): void {\n const can = allow(auth);\n\n route.get(\n '/:package/:version?',\n can('access'),\n async function (\n req: $RequestExtend,\n _res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('init package by version');\n const name = req.params.package;\n let version = req.params.version;\n const write = req.query.write === 'true';\n const abbreviated = req.get('Accept') === Storage.ABBREVIATED_HEADER;\n const requestOptions = {\n protocol: req.protocol,\n headers: req.headers as any,\n // FIXME: if we migrate to req.hostname, the port is not longer included.\n host: req.host,\n remoteAddress: req.socket.remoteAddress,\n byPassCache: write,\n };\n\n try {\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n abbreviated,\n version,\n requestOptions,\n });\n next(manifest);\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n '/:pkg/-/:filename',\n can('access'),\n async function (req: $RequestExtend, res: $ResponseExtend, next): Promise<void> {\n const { pkg, filename } = req.params;\n const abort = new AbortController();\n try {\n const stream = (await storage.getTarballNext(pkg, filename, {\n signal: abort.signal,\n // enableRemote: true,\n })) as any;\n\n stream.on('content-length', (size) => {\n res.header(HEADER_TYPE.CONTENT_LENGTH, size);\n });\n\n stream.once('error', (err) => {\n res.locals.report_error(err);\n next(err);\n });\n\n req.on('abort', () => {\n debug('request aborted for %o', req.url);\n abort.abort();\n });\n\n res.header(HEADERS.CONTENT_TYPE, HEADERS.OCTET_STREAM);\n stream.pipe(res);\n } catch (err: any) {\n // console.log('catch API error request', err);\n res.locals.report_error(err);\n next(err);\n }\n }\n );\n}\n"],"mappings":";;;;;;;AAAA;;AAIA;;AACA;;AACA;;;;AAIA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,uBAAX,CAAd;;AAEe,kBAAUC,KAAV,EAAyBC,IAAzB,EAAsCC,OAAtC,EAA8D;EAC3E,MAAMC,GAAG,GAAG,IAAAC,iBAAA,EAAMH,IAAN,CAAZ;EAEAD,KAAK,CAACK,GAAN,CACE,qBADF,EAEEF,GAAG,CAAC,QAAD,CAFL,EAGE,gBACEG,GADF,EAEEC,IAFF,EAGEC,IAHF,EAIiB;IACfV,KAAK,CAAC,yBAAD,CAAL;IACA,MAAMW,IAAI,GAAGH,GAAG,CAACI,MAAJ,CAAWC,OAAxB;IACA,IAAIC,OAAO,GAAGN,GAAG,CAACI,MAAJ,CAAWE,OAAzB;IACA,MAAMC,KAAK,GAAGP,GAAG,CAACQ,KAAJ,CAAUD,KAAV,KAAoB,MAAlC;;IACA,MAAME,WAAW,GAAGT,GAAG,CAACD,GAAJ,CAAQ,QAAR,MAAsBW,cAAA,CAAQC,kBAAlD;;IACA,MAAMC,cAAc,GAAG;MACrBC,QAAQ,EAAEb,GAAG,CAACa,QADO;MAErBC,OAAO,EAAEd,GAAG,CAACc,OAFQ;MAGrB;MACAC,IAAI,EAAEf,GAAG,CAACe,IAJW;MAKrBC,aAAa,EAAEhB,GAAG,CAACiB,MAAJ,CAAWD,aALL;MAMrBE,WAAW,EAAEX;IANQ,CAAvB;;IASA,IAAI;MACF,MAAMY,QAAQ,GAAG,MAAMvB,OAAO,CAACwB,mBAAR,CAA4B;QACjDjB,IADiD;QAEjDkB,WAAW,EAAE,IAFoC;QAGjDZ,WAHiD;QAIjDH,OAJiD;QAKjDM;MALiD,CAA5B,CAAvB;MAOAV,IAAI,CAACiB,QAAD,CAAJ;IACD,CATD,CASE,OAAOG,GAAP,EAAY;MACZpB,IAAI,CAACoB,GAAD,CAAJ;IACD;EACF,CAlCH;EAqCA5B,KAAK,CAACK,GAAN,CACE,mBADF,EAEEF,GAAG,CAAC,QAAD,CAFL,EAGE,gBAAgBG,GAAhB,EAAqCuB,GAArC,EAA2DrB,IAA3D,EAAgF;IAC9E,MAAM;MAAEsB,GAAF;MAAOC;IAAP,IAAoBzB,GAAG,CAACI,MAA9B;IACA,MAAMsB,KAAK,GAAG,IAAIC,eAAJ,EAAd;;IACA,IAAI;MACF,MAAMC,MAAM,GAAI,MAAMhC,OAAO,CAACiC,cAAR,CAAuBL,GAAvB,EAA4BC,QAA5B,EAAsC;QAC1DK,MAAM,EAAEJ,KAAK,CAACI,MAD4C,CAE1D;;MAF0D,CAAtC,CAAtB;MAKAF,MAAM,CAACG,EAAP,CAAU,gBAAV,EAA6BC,IAAD,IAAU;QACpCT,GAAG,CAACU,MAAJ,CAAWC,iBAAA,CAAYC,cAAvB,EAAuCH,IAAvC;MACD,CAFD;MAIAJ,MAAM,CAACQ,IAAP,CAAY,OAAZ,EAAsBd,GAAD,IAAS;QAC5BC,GAAG,CAACc,MAAJ,CAAWC,YAAX,CAAwBhB,GAAxB;QACApB,IAAI,CAACoB,GAAD,CAAJ;MACD,CAHD;MAKAtB,GAAG,CAAC+B,EAAJ,CAAO,OAAP,EAAgB,MAAM;QACpBvC,KAAK,CAAC,wBAAD,EAA2BQ,GAAG,CAACuC,GAA/B,CAAL;QACAb,KAAK,CAACA,KAAN;MACD,CAHD;MAKAH,GAAG,CAACU,MAAJ,CAAWO,aAAA,CAAQC,YAAnB,EAAiCD,aAAA,CAAQE,YAAzC;MACAd,MAAM,CAACe,IAAP,CAAYpB,GAAZ;IACD,CAtBD,CAsBE,OAAOD,GAAP,EAAiB;MACjB;MACAC,GAAG,CAACc,MAAJ,CAAWC,YAAX,CAAwBhB,GAAxB;MACApB,IAAI,CAACoB,GAAD,CAAJ;IACD;EACF,CAjCH;AAmCD"}
package/build/ping.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ping.ts"],"names":["route","get","req","res","next"],"mappings":";;;;;;;AAIe,kBAAUA,KAAV,EAA+B;AAC5CA,EAAAA,KAAK,CAACC,GAAN,CACE,SADF,EAEE,UAAUC,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAA6E;AAC3EA,IAAAA,IAAI,CAAC,EAAD,CAAJ;AACD,GAJH;AAMD","sourcesContent":["import { Router } from 'express';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router): void {\n route.get(\n '/-/ping',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next({});\n }\n );\n}\n"],"file":"ping.js"}
1
+ {"version":3,"file":"ping.js","names":["route","get","req","res","next"],"sources":["../src/ping.ts"],"sourcesContent":["import { Router } from 'express';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router): void {\n route.get(\n '/-/ping',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next({});\n }\n );\n}\n"],"mappings":";;;;;;;AAIe,kBAAUA,KAAV,EAA+B;EAC5CA,KAAK,CAACC,GAAN,CACE,SADF,EAEE,UAAUC,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAA6E;IAC3EA,IAAI,CAAC,EAAD,CAAJ;EACD,CAJH;AAMD"}
@@ -1,26 +1,83 @@
1
1
  import { Router } from 'express';
2
2
  import { IAuth } from '@verdaccio/auth';
3
3
  import { Storage } from '@verdaccio/store';
4
- import { Config } from '@verdaccio/types';
5
- import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';
6
- export default function publish(router: Router, auth: IAuth, storage: Storage, config: Config): void;
7
4
  /**
8
- * Publish a package
9
- */
10
- export declare function publishPackage(storage: Storage, config: Config, auth: IAuth): any;
11
- /**
12
- * un-publish a package
13
- */
14
- export declare function unPublishPackage(storage: Storage): (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) => Promise<any>;
15
- /**
16
- * Delete tarball
17
- */
18
- export declare function removeTarball(storage: Storage): (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) => void;
19
- /**
20
- * Adds a new version
21
- */
22
- export declare function addVersion(storage: Storage): (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) => void;
23
- /**
24
- * uploadPackageTarball
25
- */
26
- export declare function uploadPackageTarball(storage: Storage): (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) => void;
5
+ * Publish a package / update package / un/start a package
6
+ *
7
+ * There are multiples scenarios here to be considered:
8
+ *
9
+ * 1. Publish scenario
10
+ *
11
+ * Publish a package consist of at least 1 step (PUT) with a metadata payload.
12
+ * When a package is published, an _attachment property is present that contains the data
13
+ * of the tarball.
14
+ *
15
+ * Example flow of publish.
16
+ *
17
+ * npm http fetch PUT 201 http://localhost:4873/@scope%2ftest1 9627ms
18
+ npm info lifecycle @scope/test1@1.0.1~publish: @scope/test1@1.0.1
19
+ npm info lifecycle @scope/test1@1.0.1~postpublish: @scope/test1@1.0.1
20
+ + @scope/test1@1.0.1
21
+ npm verb exit [ 0, true ]
22
+ *
23
+ *
24
+ * 2. Unpublish scenario
25
+ *
26
+ * Unpublish consist in 3 steps.
27
+ * 1. Try to fetch metadata -> if it fails, return 404
28
+ * 2. Compute metadata locally (client side) and send a mutate payload excluding the version to
29
+ * be unpublished
30
+ * eg: if metadata reflects 1.0.1, 1.0.2 and 1.0.3, the computed metadata won't include 1.0.3.
31
+ * 3. Once the second step has been successfully finished, delete the tarball.
32
+ *
33
+ * All these steps are consecutive and required, there is no transacions here, if step 3 fails,
34
+ * metadata might get corrupted.
35
+ *
36
+ * Note the unpublish call will suffix in the url a /-rev/14-5d500cfce92f90fd revision number,
37
+ * this not
38
+ * used internally.
39
+ *
40
+ *
41
+ * Example flow of unpublish.
42
+ *
43
+ * There are two possible flows:
44
+ *
45
+ * - Remove all packages (entirely)
46
+ * eg: npm unpublish package-name@* --force
47
+ * eg: npm unpublish package-name --force
48
+ *
49
+ * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1680ms
50
+ * npm http fetch DELETE 201 http://localhost:4873/custom-name/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms
51
+ *
52
+ * - Remove a specific version
53
+ * eg: npm unpublish package-name@1.0.0 --force
54
+ *
55
+ * Get fresh manifest
56
+ * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1680ms
57
+ * Update manifest without the version to be unpublished
58
+ * npm http fetch PUT 201 http://localhost:4873/custom-name/-rev/14-5d500cfce92f90fd 956606ms
59
+ * Get fresh manifest (revision should be different)
60
+ * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1601ms
61
+ * Remove the tarball
62
+ * npm http fetch DELETE 201 http://localhost:4873/custom-name/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms
63
+ *
64
+ * 3. Star a package
65
+ *
66
+ * Permissions: start a package depends of the publish and unpublish permissions, there is no
67
+ * specific flag for star or un start.
68
+ * The URL for star is similar to the unpublish (change package format)
69
+ *
70
+ * npm has no enpoint for star a package, rather mutate the metadata and acts as, the difference
71
+ * is the users property which is part of the payload and the body only includes
72
+ *
73
+ * {
74
+ "_id": pkgName,
75
+ "_rev": "3-b0cdaefc9bdb77c8",
76
+ "users": {
77
+ [username]: boolean value (true, false)
78
+ }
79
+ }
80
+ *
81
+ */
82
+ export default function publish(router: Router, auth: IAuth, storage: Storage): void;
83
+ export declare function publishPackageNext(storage: Storage): any;