@verdaccio/api 8.1.0-next-8.3 → 8.1.0-next-8.5
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 +43 -0
- package/build/dist-tags.d.ts +2 -1
- package/build/dist-tags.js +3 -4
- package/build/dist-tags.js.map +1 -1
- package/build/index.d.ts +2 -2
- package/build/index.js +9 -8
- package/build/index.js.map +1 -1
- package/build/package.d.ts +2 -1
- package/build/package.js +20 -6
- package/build/package.js.map +1 -1
- package/build/publish.d.ts +3 -2
- package/build/publish.js +30 -15
- package/build/publish.js.map +1 -1
- package/build/search.d.ts +2 -1
- package/build/search.js +2 -3
- package/build/search.js.map +1 -1
- package/build/user.d.ts +2 -1
- package/build/user.js +3 -4
- package/build/user.js.map +1 -1
- package/build/v1/search.d.ts +2 -1
- package/build/v1/search.js +3 -4
- package/build/v1/search.js.map +1 -1
- package/build/v1/token.d.ts +2 -1
- package/build/v1/token.js +8 -9
- package/build/v1/token.js.map +1 -1
- package/package.json +13 -13
- package/src/dist-tags.ts +2 -2
- package/src/index.ts +11 -9
- package/src/package.ts +19 -4
- package/src/publish.ts +30 -9
- package/src/search.ts +2 -2
- package/src/user.ts +7 -3
- package/src/v1/search.ts +2 -2
- package/src/v1/token.ts +8 -2
- package/test/integration/distTag.spec.ts +3 -0
- package/test/integration/package.spec.ts +4 -3
- package/test/integration/publish.spec.ts +3 -3
- package/test/integration/star.spec.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# @verdaccio/api
|
|
2
2
|
|
|
3
|
+
## 8.1.0-next-8.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- eca6259: fix: E409 username is already registered (adduser)
|
|
8
|
+
- 5cbee6f: fix: unpublish a package on storage package
|
|
9
|
+
- 6e344d0: chore(api): fix void return for some tests
|
|
10
|
+
- Updated dependencies [ba71932]
|
|
11
|
+
- Updated dependencies [64a7fc0]
|
|
12
|
+
- Updated dependencies [9041b0f]
|
|
13
|
+
- Updated dependencies [eca6259]
|
|
14
|
+
- Updated dependencies [4adaa83]
|
|
15
|
+
- Updated dependencies [80e4cb8]
|
|
16
|
+
- Updated dependencies [5cbee6f]
|
|
17
|
+
- Updated dependencies [538bb8f]
|
|
18
|
+
- Updated dependencies [a049bba]
|
|
19
|
+
- Updated dependencies [3967a52]
|
|
20
|
+
- @verdaccio/config@8.0.0-next-8.5
|
|
21
|
+
- @verdaccio/core@8.0.0-next-8.5
|
|
22
|
+
- @verdaccio/store@8.0.0-next-8.5
|
|
23
|
+
- @verdaccio/auth@8.0.0-next-8.5
|
|
24
|
+
- @verdaccio/logger@8.0.0-next-8.5
|
|
25
|
+
- @verdaccio/middleware@8.0.0-next-8.5
|
|
26
|
+
- @verdaccio/utils@8.1.0-next-8.5
|
|
27
|
+
|
|
28
|
+
## 8.1.0-next-8.4
|
|
29
|
+
|
|
30
|
+
### Patch Changes
|
|
31
|
+
|
|
32
|
+
- 58e0d95: fix(middleware): error 404 when getting scoped tarballs
|
|
33
|
+
- e93d6a3: chore: auth package requires logger as parameter
|
|
34
|
+
- Updated dependencies [48aa89f]
|
|
35
|
+
- Updated dependencies [58e0d95]
|
|
36
|
+
- Updated dependencies [1076a89]
|
|
37
|
+
- Updated dependencies [e93d6a3]
|
|
38
|
+
- @verdaccio/middleware@8.0.0-next-8.4
|
|
39
|
+
- @verdaccio/core@8.0.0-next-8.4
|
|
40
|
+
- @verdaccio/auth@8.0.0-next-8.4
|
|
41
|
+
- @verdaccio/config@8.0.0-next-8.4
|
|
42
|
+
- @verdaccio/store@8.0.0-next-8.4
|
|
43
|
+
- @verdaccio/utils@8.1.0-next-8.4
|
|
44
|
+
- @verdaccio/logger@8.0.0-next-8.4
|
|
45
|
+
|
|
3
46
|
## 8.1.0-next-8.3
|
|
4
47
|
|
|
5
48
|
### Patch Changes
|
package/build/dist-tags.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { Auth } from '@verdaccio/auth';
|
|
3
3
|
import { Storage } from '@verdaccio/store';
|
|
4
|
-
|
|
4
|
+
import { Logger } from '@verdaccio/types';
|
|
5
|
+
export default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void;
|
package/build/dist-tags.js
CHANGED
|
@@ -7,13 +7,12 @@ exports.default = _default;
|
|
|
7
7
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
8
|
var _mime = _interopRequireDefault(require("mime"));
|
|
9
9
|
var _core = require("@verdaccio/core");
|
|
10
|
-
var _logger = require("@verdaccio/logger");
|
|
11
10
|
var _middleware = require("@verdaccio/middleware");
|
|
12
11
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
function _default(route, auth, storage) {
|
|
12
|
+
function _default(route, auth, storage, logger) {
|
|
14
13
|
const can = (0, _middleware.allow)(auth, {
|
|
15
|
-
beforeAll: (a, b) =>
|
|
16
|
-
afterAll: (a, b) =>
|
|
14
|
+
beforeAll: (a, b) => logger.trace(a, b),
|
|
15
|
+
afterAll: (a, b) => logger.trace(a, b)
|
|
17
16
|
});
|
|
18
17
|
const addTagPackageVersionMiddleware = async function (req, res, next) {
|
|
19
18
|
if (_lodash.default.isString(req.body) === false) {
|
package/build/dist-tags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dist-tags.js","names":["_lodash","_interopRequireDefault","require","_mime","_core","
|
|
1
|
+
{"version":3,"file":"dist-tags.js","names":["_lodash","_interopRequireDefault","require","_mime","_core","_middleware","e","__esModule","default","_default","route","auth","storage","logger","can","allow","beforeAll","a","b","trace","afterAll","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"],"sources":["../src/dist-tags.ts"],"sourcesContent":["import { Router } from 'express';\nimport _ from 'lodash';\nimport mime from 'mime';\n\nimport { Auth } from '@verdaccio/auth';\nimport { constants, errorUtils } from '@verdaccio/core';\nimport { allow, media } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Logger } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\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"],"mappings":"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","ignoreList":[]}
|
package/build/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { Auth } from '@verdaccio/auth';
|
|
3
3
|
import { Storage } from '@verdaccio/store';
|
|
4
|
-
import { Config } from '@verdaccio/types';
|
|
5
|
-
export default function (config: Config, auth: Auth, storage: Storage): Router;
|
|
4
|
+
import { Config, Logger } from '@verdaccio/types';
|
|
5
|
+
export default function (config: Config, auth: Auth, storage: Storage, logger: Logger): Router;
|
package/build/index.js
CHANGED
|
@@ -18,7 +18,7 @@ var _search2 = _interopRequireDefault(require("./v1/search"));
|
|
|
18
18
|
var _token = _interopRequireDefault(require("./v1/token"));
|
|
19
19
|
var _whoami = _interopRequireDefault(require("./whoami"));
|
|
20
20
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
-
function _default(config, auth, storage) {
|
|
21
|
+
function _default(config, auth, storage, logger) {
|
|
22
22
|
/* eslint new-cap:off */
|
|
23
23
|
const app = _express.default.Router();
|
|
24
24
|
/* eslint new-cap:off */
|
|
@@ -42,20 +42,21 @@ function _default(config, auth, storage) {
|
|
|
42
42
|
limit: config.max_body_size || '10mb'
|
|
43
43
|
}));
|
|
44
44
|
app.use((0, _middleware.antiLoop)(config));
|
|
45
|
+
app.use(_middleware.makeURLrelative);
|
|
45
46
|
// encode / in a scoped package name to be matched as a single parameter in routes
|
|
46
47
|
app.use(_middleware.encodeScopePackage);
|
|
47
48
|
// for "npm whoami"
|
|
48
49
|
(0, _whoami.default)(app);
|
|
49
50
|
(0, _profile.default)(app, auth, config);
|
|
50
|
-
(0, _search.default)(app);
|
|
51
|
-
(0, _user.default)(app, auth, config);
|
|
52
|
-
(0, _distTags.default)(app, auth, storage);
|
|
53
|
-
(0, _publish.default)(app, auth, storage);
|
|
51
|
+
(0, _search.default)(app, logger);
|
|
52
|
+
(0, _user.default)(app, auth, config, logger);
|
|
53
|
+
(0, _distTags.default)(app, auth, storage, logger);
|
|
54
|
+
(0, _publish.default)(app, auth, storage, logger);
|
|
54
55
|
(0, _ping.default)(app);
|
|
55
56
|
(0, _stars.default)(app, storage);
|
|
56
|
-
(0, _search2.default)(app, auth, storage);
|
|
57
|
-
(0, _token.default)(app, auth, storage, config);
|
|
58
|
-
(0, _package.default)(app, auth, storage);
|
|
57
|
+
(0, _search2.default)(app, auth, storage, logger);
|
|
58
|
+
(0, _token.default)(app, auth, storage, config, logger);
|
|
59
|
+
(0, _package.default)(app, auth, storage, logger);
|
|
59
60
|
return app;
|
|
60
61
|
}
|
|
61
62
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_express","_interopRequireDefault","require","_middleware","_distTags","_package","_ping","_publish","_search","_stars","_user","_profile","_search2","_token","_whoami","e","__esModule","default","_default","config","auth","storage","app","express","Router","param","validatePackage","validateName","match","use","apiJWTmiddleware","json","strict","limit","max_body_size","antiLoop","encodeScopePackage","whoami","profile","search","user","distTags","publish","ping","stars","v1Search","token","pkg"],"sources":["../src/index.ts"],"sourcesContent":["import express, { Router } from 'express';\n\nimport { Auth } 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: Auth, 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 // Express route parameter names must be valid JavaScript identifiers, which means\n // they cannot start with a hyphen (-) or contain special characters like dots (.)\n app.param('_rev', match(/^-rev$/));\n app.param('org_couchdb_user', match(/^org\\.couchdb\\.user:/));\n\n app.use(auth.apiJWTmiddleware());\n app.use(express.json({ strict: false, limit: config.max_body_size || '10mb' }));\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 profile(app, auth, config);\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 v1Search(app, auth, storage);\n token(app, auth, storage, config);\n pkg(app, auth, storage);\n return app;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,WAAA,GAAAD,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","names":["_express","_interopRequireDefault","require","_middleware","_distTags","_package","_ping","_publish","_search","_stars","_user","_profile","_search2","_token","_whoami","e","__esModule","default","_default","config","auth","storage","logger","app","express","Router","param","validatePackage","validateName","match","use","apiJWTmiddleware","json","strict","limit","max_body_size","antiLoop","makeURLrelative","encodeScopePackage","whoami","profile","search","user","distTags","publish","ping","stars","v1Search","token","pkg"],"sources":["../src/index.ts"],"sourcesContent":["import express, { Router } from 'express';\n\nimport { Auth } from '@verdaccio/auth';\nimport {\n antiLoop,\n encodeScopePackage,\n makeURLrelative,\n match,\n validateName,\n validatePackage,\n} from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Config, Logger } 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: Auth, storage: Storage, logger: Logger): 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 // Express route parameter names must be valid JavaScript identifiers, which means\n // they cannot start with a hyphen (-) or contain special characters like dots (.)\n app.param('_rev', match(/^-rev$/));\n app.param('org_couchdb_user', match(/^org\\.couchdb\\.user:/));\n\n app.use(auth.apiJWTmiddleware());\n app.use(express.json({ strict: false, limit: config.max_body_size || '10mb' }));\n app.use(antiLoop(config));\n app.use(makeURLrelative);\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 profile(app, auth, config);\n search(app, logger);\n user(app, auth, config, logger);\n distTags(app, auth, storage, logger);\n publish(app, auth, storage, logger);\n ping(app);\n stars(app, storage);\n v1Search(app, auth, storage, logger);\n token(app, auth, storage, config, logger);\n pkg(app, auth, storage, logger);\n return app;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/build/package.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { Auth } from '@verdaccio/auth';
|
|
3
3
|
import { Storage } from '@verdaccio/store';
|
|
4
|
-
|
|
4
|
+
import { Logger } from '@verdaccio/types';
|
|
5
|
+
export default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void;
|
package/build/package.js
CHANGED
|
@@ -6,23 +6,33 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = _default;
|
|
7
7
|
var _debug = _interopRequireDefault(require("debug"));
|
|
8
8
|
var _core = require("@verdaccio/core");
|
|
9
|
-
var _logger = require("@verdaccio/logger");
|
|
10
9
|
var _middleware = require("@verdaccio/middleware");
|
|
11
10
|
var _store = require("@verdaccio/store");
|
|
12
11
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
12
|
const debug = (0, _debug.default)('verdaccio:api:package');
|
|
14
|
-
function _default(route, auth, storage) {
|
|
13
|
+
function _default(route, auth, storage, logger) {
|
|
15
14
|
const can = (0, _middleware.allow)(auth, {
|
|
16
|
-
beforeAll: (a, b) =>
|
|
17
|
-
afterAll: (a, b) =>
|
|
15
|
+
beforeAll: (a, b) => logger.trace(a, b),
|
|
16
|
+
afterAll: (a, b) => logger.trace(a, b)
|
|
18
17
|
});
|
|
19
18
|
route.get('/:package/:version?', can('access'), async function (req, _res, next) {
|
|
20
|
-
debug('
|
|
19
|
+
debug('get package by version');
|
|
21
20
|
const name = req.params.package;
|
|
22
21
|
let version = req.params.version;
|
|
23
22
|
const write = req.query.write === 'true';
|
|
24
23
|
const username = req?.remote_user?.name;
|
|
25
24
|
const abbreviated = _core.stringUtils.getByQualityPriorityValue(req.get('Accept')) === _store.Storage.ABBREVIATED_HEADER;
|
|
25
|
+
if (debug.enabled) {
|
|
26
|
+
debug('is write %o', write);
|
|
27
|
+
debug('is abbreviated %o', abbreviated);
|
|
28
|
+
debug('package %o', name);
|
|
29
|
+
debug('version %o', version);
|
|
30
|
+
debug('username %o', username);
|
|
31
|
+
debug('remote address %o', req.socket.remoteAddress);
|
|
32
|
+
debug('host %o', req.host);
|
|
33
|
+
debug('protocol %o', req.protocol);
|
|
34
|
+
debug('url %o', req.url);
|
|
35
|
+
}
|
|
26
36
|
const requestOptions = {
|
|
27
37
|
protocol: req.protocol,
|
|
28
38
|
headers: req.headers,
|
|
@@ -41,8 +51,10 @@ function _default(route, auth, storage) {
|
|
|
41
51
|
requestOptions
|
|
42
52
|
});
|
|
43
53
|
if (abbreviated) {
|
|
54
|
+
debug('abbreviated response');
|
|
44
55
|
_res.setHeader(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.JSON_INSTALL_CHARSET);
|
|
45
56
|
} else {
|
|
57
|
+
debug('full response');
|
|
46
58
|
_res.setHeader(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.JSON);
|
|
47
59
|
}
|
|
48
60
|
next(manifest);
|
|
@@ -57,15 +69,18 @@ function _default(route, auth, storage) {
|
|
|
57
69
|
} = req.params;
|
|
58
70
|
const abort = new AbortController();
|
|
59
71
|
try {
|
|
72
|
+
debug('downloading tarball %o', filename);
|
|
60
73
|
const stream = await storage.getTarball(pkgName, filename, {
|
|
61
74
|
signal: abort.signal
|
|
62
75
|
// TODO: review why this param
|
|
63
76
|
// enableRemote: true,
|
|
64
77
|
});
|
|
65
78
|
stream.on('content-length', size => {
|
|
79
|
+
debug('tarball size %o', size);
|
|
66
80
|
res.header(_core.HEADER_TYPE.CONTENT_LENGTH, size);
|
|
67
81
|
});
|
|
68
82
|
stream.once('error', err => {
|
|
83
|
+
debug('error on download tarball %o', err);
|
|
69
84
|
res.locals.report_error(err);
|
|
70
85
|
next(err);
|
|
71
86
|
});
|
|
@@ -76,7 +91,6 @@ function _default(route, auth, storage) {
|
|
|
76
91
|
res.header(_core.HEADERS.CONTENT_TYPE, _core.HEADERS.OCTET_STREAM);
|
|
77
92
|
stream.pipe(res);
|
|
78
93
|
} catch (err) {
|
|
79
|
-
// console.log('catch API error request', err);
|
|
80
94
|
res.locals.report_error(err);
|
|
81
95
|
next(err);
|
|
82
96
|
}
|
package/build/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","names":["_debug","_interopRequireDefault","require","_core","
|
|
1
|
+
{"version":3,"file":"package.js","names":["_debug","_interopRequireDefault","require","_core","_middleware","_store","e","__esModule","default","debug","buildDebug","_default","route","auth","storage","logger","can","allow","beforeAll","a","b","trace","afterAll","get","req","_res","next","name","params","package","version","write","query","username","remote_user","abbreviated","stringUtils","getByQualityPriorityValue","Storage","ABBREVIATED_HEADER","enabled","socket","remoteAddress","host","protocol","url","requestOptions","headers","byPassCache","manifest","getPackageByOptions","uplinksLook","setHeader","HEADER_TYPE","CONTENT_TYPE","HEADERS","JSON_INSTALL_CHARSET","JSON","err","res","pkgName","filename","abort","AbortController","stream","getTarball","signal","on","size","header","CONTENT_LENGTH","once","locals","report_error","OCTET_STREAM","pipe"],"sources":["../src/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { Auth } from '@verdaccio/auth';\nimport { HEADERS, HEADER_TYPE, stringUtils } from '@verdaccio/core';\nimport { allow } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Logger } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nconst debug = buildDebug('verdaccio:api:package');\n\nexport default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\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('get package by version');\n const name = req.params.package;\n let version = req.params.version;\n const write = req.query.write === 'true';\n const username = req?.remote_user?.name;\n const abbreviated =\n stringUtils.getByQualityPriorityValue(req.get('Accept')) === Storage.ABBREVIATED_HEADER;\n if (debug.enabled) {\n debug('is write %o', write);\n debug('is abbreviated %o', abbreviated);\n debug('package %o', name);\n debug('version %o', version);\n debug('username %o', username);\n debug('remote address %o', req.socket.remoteAddress);\n debug('host %o', req.host);\n debug('protocol %o', req.protocol);\n debug('url %o', req.url);\n }\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 username,\n };\n\n try {\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n abbreviated,\n version,\n requestOptions,\n });\n if (abbreviated) {\n debug('abbreviated response');\n _res.setHeader(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_INSTALL_CHARSET);\n } else {\n debug('full response');\n _res.setHeader(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON);\n }\n\n next(manifest);\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n '/:package/-/:filename',\n can('access'),\n async function (req: $RequestExtend, res: $ResponseExtend, next): Promise<void> {\n const { package: pkgName, filename } = req.params;\n const abort = new AbortController();\n try {\n debug('downloading tarball %o', filename);\n const stream = (await storage.getTarball(pkgName, filename, {\n signal: abort.signal,\n // TODO: review why this param\n // enableRemote: true,\n })) as any;\n\n stream.on('content-length', (size) => {\n debug('tarball size %o', size);\n res.header(HEADER_TYPE.CONTENT_LENGTH, size);\n });\n\n stream.once('error', (err) => {\n debug('error on download tarball %o', 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 res.locals.report_error(err);\n next(err);\n }\n }\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
package/build/publish.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { Auth } from '@verdaccio/auth';
|
|
3
3
|
import { Storage } from '@verdaccio/store';
|
|
4
|
+
import { Logger } from '@verdaccio/types';
|
|
4
5
|
/**
|
|
5
6
|
* Publish a package / update package / un/start a package
|
|
6
7
|
*
|
|
@@ -96,5 +97,5 @@ import { Storage } from '@verdaccio/store';
|
|
|
96
97
|
}
|
|
97
98
|
*
|
|
98
99
|
*/
|
|
99
|
-
export default function publish(router: Router, auth: Auth, storage: Storage): void;
|
|
100
|
-
export declare function publishPackage(storage: Storage): any;
|
|
100
|
+
export default function publish(router: Router, auth: Auth, storage: Storage, logger: Logger): void;
|
|
101
|
+
export declare function publishPackage(storage: Storage, logger: Logger, origin: string): any;
|
package/build/publish.js
CHANGED
|
@@ -8,7 +8,6 @@ exports.publishPackage = publishPackage;
|
|
|
8
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
9
9
|
var _mime = _interopRequireDefault(require("mime"));
|
|
10
10
|
var _core = require("@verdaccio/core");
|
|
11
|
-
var _logger = require("@verdaccio/logger");
|
|
12
11
|
var _middleware = require("@verdaccio/middleware");
|
|
13
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
13
|
// import star from './star';
|
|
@@ -74,7 +73,7 @@ const debug = (0, _debug.default)('verdaccio:api:publish');
|
|
|
74
73
|
* npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1601ms
|
|
75
74
|
* Remove the tarball
|
|
76
75
|
* npm http fetch DELETE 201 http://localhost:4873/custom-name/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms
|
|
77
|
-
*
|
|
76
|
+
*
|
|
78
77
|
* 3. Star a package
|
|
79
78
|
*
|
|
80
79
|
* Permissions: staring a package depends of the publish and unpublish permissions, there is no
|
|
@@ -95,7 +94,7 @@ const debug = (0, _debug.default)('verdaccio:api:publish');
|
|
|
95
94
|
* 4. Change owners of a package
|
|
96
95
|
*
|
|
97
96
|
* Similar to staring a package, changing owners (maintainers) of a package uses the publish
|
|
98
|
-
* endpoint.
|
|
97
|
+
* endpoint.
|
|
99
98
|
*
|
|
100
99
|
* The body includes a list of the new owners with the following format
|
|
101
100
|
*
|
|
@@ -110,27 +109,36 @@ const debug = (0, _debug.default)('verdaccio:api:publish');
|
|
|
110
109
|
}
|
|
111
110
|
*
|
|
112
111
|
*/
|
|
113
|
-
function publish(router, auth, storage) {
|
|
112
|
+
function publish(router, auth, storage, logger) {
|
|
114
113
|
const can = (0, _middleware.allow)(auth, {
|
|
115
|
-
beforeAll: (a, b) =>
|
|
116
|
-
afterAll: (a, b) =>
|
|
114
|
+
beforeAll: (a, b) => logger.trace(a, b),
|
|
115
|
+
afterAll: (a, b) => logger.trace(a, b)
|
|
117
116
|
});
|
|
118
|
-
router.put('/:package', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), _middleware.expectJson, publishPackage(storage));
|
|
119
|
-
router.put('/:package/-rev/:revision', can('unpublish'), (0, _middleware.media)(_mime.default.getType('json')), _middleware.expectJson, publishPackage(storage));
|
|
117
|
+
router.put('/:package', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), _middleware.expectJson, publishPackage(storage, logger, 'publish one version'));
|
|
118
|
+
router.put('/:package/-rev/:revision', can('unpublish'), (0, _middleware.media)(_mime.default.getType('json')), _middleware.expectJson, publishPackage(storage, logger, 'publish with revision'));
|
|
120
119
|
|
|
121
120
|
/**
|
|
122
121
|
* Un-publishing an entire package.
|
|
123
122
|
*
|
|
124
|
-
* This scenario happens when
|
|
125
|
-
*
|
|
123
|
+
* This scenario happens when any of these scenarios happens:
|
|
124
|
+
* - the first call detect there is only one version remaining
|
|
125
|
+
* - no version is specified in the unpublish call
|
|
126
|
+
* - all versions are removed npm unpublish package@*
|
|
127
|
+
* - there is no versions on the metadata
|
|
128
|
+
|
|
129
|
+
* then the client decides to DELETE the resource
|
|
130
|
+
* Example:
|
|
131
|
+
* Get fresh manifest (write=true is a flag to get the latest revision)
|
|
126
132
|
* npm http fetch GET 304 http://localhost:4873/package-name?write=true 1076ms (from cache)
|
|
133
|
+
* Send request to delete the package, this includes the revision number that must match
|
|
134
|
+
* and the package name, it will delete the entire package and all tarballs (or tarball depends the scenario)
|
|
127
135
|
* npm http fetch DELETE 201 http://localhost:4873/package-name/-rev/18-d8ebe3020bd4ac9c 22ms
|
|
128
136
|
*/
|
|
129
137
|
router.delete('/:package/-rev/:revision', can('unpublish'), async function (req, res, next) {
|
|
130
138
|
const packageName = req.params.package;
|
|
131
139
|
const rev = req.params.revision;
|
|
132
140
|
const username = req?.remote_user?.name;
|
|
133
|
-
|
|
141
|
+
logger.debug({
|
|
134
142
|
packageName
|
|
135
143
|
}, `unpublishing @{packageName}`);
|
|
136
144
|
try {
|
|
@@ -156,7 +164,7 @@ function publish(router, auth, storage) {
|
|
|
156
164
|
revision
|
|
157
165
|
} = req.params;
|
|
158
166
|
const username = req?.remote_user?.name;
|
|
159
|
-
|
|
167
|
+
logger.debug({
|
|
160
168
|
packageName,
|
|
161
169
|
filename,
|
|
162
170
|
revision
|
|
@@ -164,7 +172,7 @@ function publish(router, auth, storage) {
|
|
|
164
172
|
try {
|
|
165
173
|
await storage.removeTarball(packageName, filename, revision, username);
|
|
166
174
|
res.status(_core.HTTP_STATUS.CREATED);
|
|
167
|
-
|
|
175
|
+
logger.debug({
|
|
168
176
|
packageName,
|
|
169
177
|
filename,
|
|
170
178
|
revision
|
|
@@ -177,17 +185,23 @@ function publish(router, auth, storage) {
|
|
|
177
185
|
}
|
|
178
186
|
});
|
|
179
187
|
}
|
|
180
|
-
function publishPackage(storage) {
|
|
188
|
+
function publishPackage(storage, logger, origin) {
|
|
181
189
|
return async function (req, res, next) {
|
|
190
|
+
debug(origin);
|
|
182
191
|
const ac = new AbortController();
|
|
183
192
|
const packageName = req.params.package;
|
|
184
193
|
const {
|
|
185
194
|
revision
|
|
186
195
|
} = req.params;
|
|
196
|
+
debug('publishing package %s', packageName);
|
|
197
|
+
debug('revision %s', revision);
|
|
198
|
+
if (debug.enabled) {
|
|
199
|
+
debug('body %o', req.body);
|
|
200
|
+
}
|
|
187
201
|
const metadata = req.body;
|
|
188
202
|
const username = req?.remote_user?.name;
|
|
189
203
|
debug('publishing package %o for user %o', packageName, username);
|
|
190
|
-
|
|
204
|
+
logger.debug({
|
|
191
205
|
packageName,
|
|
192
206
|
username
|
|
193
207
|
}, 'publishing package @{packageName} for user @{username}');
|
|
@@ -204,6 +218,7 @@ function publishPackage(storage) {
|
|
|
204
218
|
},
|
|
205
219
|
uplinksLook: false
|
|
206
220
|
});
|
|
221
|
+
debug('package %s published', packageName);
|
|
207
222
|
res.status(_core.HTTP_STATUS.CREATED);
|
|
208
223
|
return next({
|
|
209
224
|
success: true,
|
package/build/publish.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","names":["_debug","_interopRequireDefault","require","_mime","_core","_logger","_middleware","e","__esModule","default","debug","buildDebug","publish","router","auth","storage","can","allow","beforeAll","a","b","logger","trace","afterAll","put","media","mime","getType","expectJson","publishPackage","delete","req","res","next","packageName","params","package","rev","revision","username","remote_user","name","removePackage","status","HTTP_STATUS","CREATED","ok","API_MESSAGE","PKG_REMOVED","err","filename","removeTarball","TARBALL_REMOVED","ac","AbortController","metadata","body","message","updateManifest","signal","requestOptions","host","hostname","protocol","headers","uplinksLook","success"],"sources":["../src/publish.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport mime from 'mime';\n\nimport { Auth } from '@verdaccio/auth';\nimport { API_MESSAGE, HTTP_STATUS } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { allow, expectJson, media } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\n// import star from './star';\n\nconst debug = buildDebug('verdaccio:api:publish');\n\n/**\n * Publish a package / update package / un/start a package\n *\n * There are multiples scenarios here to be considered:\n *\n * 1. Publish scenario\n *\n * Publish a package consist of at least 1 step (PUT) with a metadata payload.\n * When a package is published, an _attachment property is present that contains the data\n * of the tarball.\n *\n * Example flow of publish.\n *\n * npm http fetch PUT 201 http://localhost:4873/@scope%2ftest1 9627ms\n npm info lifecycle @scope/test1@1.0.1~publish: @scope/test1@1.0.1\n npm info lifecycle @scope/test1@1.0.1~postpublish: @scope/test1@1.0.1\n + @scope/test1@1.0.1\n npm verb exit [ 0, true ]\n *\n *\n * 2. Unpublish scenario\n *\n * Unpublish consist in 3 steps.\n * 1. Try to fetch metadata -> if it fails, return 404\n * 2. Compute metadata locally (client side) and send a mutate payload excluding the version to\n * be unpublished\n * eg: if metadata reflects 1.0.1, 1.0.2 and 1.0.3, the computed metadata won't include 1.0.3.\n * 3. Once the second step has been successfully finished, delete the tarball.\n *\n * All these steps are consecutive and required, there is no transacions here, if step 3 fails,\n * metadata might get corrupted.\n *\n * Note the unpublish call will suffix in the url a /-rev/14-5d500cfce92f90fd revision number,\n * this not\n * used internally.\n *\n *\n * Example flow of unpublish.\n *\n * There are two possible flows:\n *\n * - Remove all packages (entirely)\n * eg: npm unpublish package-name@* --force\n * eg: npm unpublish package-name --force\n *\n * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1680ms\n * npm http fetch DELETE 201 http://localhost:4873/custom-name/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms\n *\n * - Remove a specific version\n * eg: npm unpublish package-name@1.0.0 --force\n *\n * Get fresh manifest\n * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1680ms\n * Update manifest without the version to be unpublished\n * npm http fetch PUT 201 http://localhost:4873/custom-name/-rev/14-5d500cfce92f90fd 956606ms\n * Get fresh manifest (revision should be different)\n * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1601ms\n * Remove the tarball\n * npm http fetch DELETE 201 http://localhost:4873/custom-name/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms\n * \n * 3. Star a package\n *\n * Permissions: staring a package depends of the publish and unpublish permissions, there is no\n * specific flag for star or unstar.\n * The URL for star is similar to the unpublish (change package format)\n *\n * npm has no endpoint for staring a package, rather mutate the metadata and acts as, the difference\n * is the users property which is part of the payload and the body only includes\n *\n * {\n\t\t \"_id\": pkgName,\n\t \t\"_rev\": \"3-b0cdaefc9bdb77c8\",\n\t\t \"users\": {\n\t\t [username]: boolean value (true, false)\n\t\t }\n\t }\n *\n * 4. Change owners of a package\n *\n * Similar to staring a package, changing owners (maintainers) of a package uses the publish\n * endpoint. \n *\n * The body includes a list of the new owners with the following format\n *\n * {\n\t\t \"_id\": pkgName,\n\t \t\"_rev\": \"4-b0cdaefc9bdb77c8\",\n\t\t \"maintainers\": [\n { \"name\": \"first owner\", \"email\": \"me@verdaccio.org\" },\n { \"name\": \"second owner\", \"email\": \"you@verdaccio.org\" },\n ...\n\t\t ]\n\t }\n *\n */\nexport default function publish(router: Router, auth: Auth, storage: Storage): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n router.put(\n '/:package',\n can('publish'),\n media(mime.getType('json')),\n expectJson,\n publishPackage(storage)\n );\n\n router.put(\n '/:package/-rev/:revision',\n can('unpublish'),\n media(mime.getType('json')),\n expectJson,\n publishPackage(storage)\n );\n\n /**\n * Un-publishing an entire package.\n *\n * This scenario happens when the first call detect there is only one version remaining\n * in the metadata, then the client decides to DELETE the resource\n * npm http fetch GET 304 http://localhost:4873/package-name?write=true 1076ms (from cache)\n * npm http fetch DELETE 201 http://localhost:4873/package-name/-rev/18-d8ebe3020bd4ac9c 22ms\n */\n router.delete(\n '/:package/-rev/:revision',\n can('unpublish'),\n async function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n const packageName = req.params.package;\n const rev = req.params.revision;\n const username = req?.remote_user?.name;\n\n logger.debug({ packageName }, `unpublishing @{packageName}`);\n try {\n await storage.removePackage(packageName, rev, username);\n debug('package %s unpublished', packageName);\n res.status(HTTP_STATUS.CREATED);\n return next({ ok: API_MESSAGE.PKG_REMOVED });\n } catch (err) {\n return next(err);\n }\n }\n );\n\n /*\n Remove a tarball, this happens when npm unpublish a package unique version.\n npm http fetch DELETE 201 http://localhost:4873/package-name/-rev/18-d8ebe3020bd4ac9c 22ms\n */\n router.delete(\n '/:package/-/:filename/-rev/:revision',\n can('unpublish'),\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const packageName = req.params.package;\n const { filename, revision } = req.params;\n const username = req?.remote_user?.name;\n\n logger.debug(\n { packageName, filename, revision },\n `removing a tarball for @{packageName}-@{tarballName}-@{revision}`\n );\n try {\n await storage.removeTarball(packageName, filename, revision, username);\n res.status(HTTP_STATUS.CREATED);\n\n logger.debug(\n { packageName, filename, revision },\n `success remove tarball for @{packageName}-@{tarballName}-@{revision}`\n );\n return next({ ok: API_MESSAGE.TARBALL_REMOVED });\n } catch (err) {\n return next(err);\n }\n }\n );\n}\n\nexport function publishPackage(storage: Storage): any {\n return async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const ac = new AbortController();\n const packageName = req.params.package;\n const { revision } = req.params;\n const metadata = req.body;\n const username = req?.remote_user?.name;\n\n debug('publishing package %o for user %o', packageName, username);\n logger.debug(\n { packageName, username },\n 'publishing package @{packageName} for user @{username}'\n );\n\n try {\n const message = await storage.updateManifest(metadata, {\n name: packageName,\n revision,\n signal: ac.signal,\n requestOptions: {\n host: req.hostname,\n protocol: req.protocol,\n headers: req.headers as { [key: string]: string },\n username,\n },\n uplinksLook: false,\n });\n\n res.status(HTTP_STATUS.CREATED);\n\n return next({\n success: true,\n ok: message,\n });\n } catch (err: any) {\n // TODO: review if we need the abort controller here\n next(err);\n }\n };\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AAGA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,WAAA,GAAAJ,OAAA;AAAiE,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAKjE;;AAEA,MAAMG,KAAK,GAAG,IAAAC,cAAU,EAAC,uBAAuB,CAAC;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASC,OAAOA,CAACC,MAAc,EAAEC,IAAU,EAAEC,OAAgB,EAAQ;EAClF,MAAMC,GAAG,GAAG,IAAAC,iBAAK,EAACH,IAAI,EAAE;IACtBI,SAAS,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKC,cAAM,CAACC,KAAK,CAACH,CAAC,EAAEC,CAAC,CAAC;IACvCG,QAAQ,EAAEA,CAACJ,CAAC,EAAEC,CAAC,KAAKC,cAAM,CAACC,KAAK,CAACH,CAAC,EAAEC,CAAC;EACvC,CAAC,CAAC;EACFP,MAAM,CAACW,GAAG,CACR,WAAW,EACXR,GAAG,CAAC,SAAS,CAAC,EACd,IAAAS,iBAAK,EAACC,aAAI,CAACC,OAAO,CAAC,MAAM,CAAC,CAAC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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"publish.js","names":["_debug","_interopRequireDefault","require","_mime","_core","_middleware","e","__esModule","default","debug","buildDebug","publish","router","auth","storage","logger","can","allow","beforeAll","a","b","trace","afterAll","put","media","mime","getType","expectJson","publishPackage","delete","req","res","next","packageName","params","package","rev","revision","username","remote_user","name","removePackage","status","HTTP_STATUS","CREATED","ok","API_MESSAGE","PKG_REMOVED","err","filename","removeTarball","TARBALL_REMOVED","origin","ac","AbortController","enabled","body","metadata","message","updateManifest","signal","requestOptions","host","hostname","protocol","headers","uplinksLook","success"],"sources":["../src/publish.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport mime from 'mime';\n\nimport { Auth } from '@verdaccio/auth';\nimport { API_MESSAGE, HTTP_STATUS } from '@verdaccio/core';\nimport { allow, expectJson, media } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Logger } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\n// import star from './star';\n\nconst debug = buildDebug('verdaccio:api:publish');\n\n/**\n * Publish a package / update package / un/start a package\n *\n * There are multiples scenarios here to be considered:\n *\n * 1. Publish scenario\n *\n * Publish a package consist of at least 1 step (PUT) with a metadata payload.\n * When a package is published, an _attachment property is present that contains the data\n * of the tarball.\n *\n * Example flow of publish.\n *\n * npm http fetch PUT 201 http://localhost:4873/@scope%2ftest1 9627ms\n npm info lifecycle @scope/test1@1.0.1~publish: @scope/test1@1.0.1\n npm info lifecycle @scope/test1@1.0.1~postpublish: @scope/test1@1.0.1\n + @scope/test1@1.0.1\n npm verb exit [ 0, true ]\n *\n *\n * 2. Unpublish scenario\n *\n * Unpublish consist in 3 steps.\n * 1. Try to fetch metadata -> if it fails, return 404\n * 2. Compute metadata locally (client side) and send a mutate payload excluding the version to\n * be unpublished\n * eg: if metadata reflects 1.0.1, 1.0.2 and 1.0.3, the computed metadata won't include 1.0.3.\n * 3. Once the second step has been successfully finished, delete the tarball.\n *\n * All these steps are consecutive and required, there is no transacions here, if step 3 fails,\n * metadata might get corrupted.\n *\n * Note the unpublish call will suffix in the url a /-rev/14-5d500cfce92f90fd revision number,\n * this not\n * used internally.\n *\n *\n * Example flow of unpublish.\n *\n * There are two possible flows:\n *\n * - Remove all packages (entirely)\n * eg: npm unpublish package-name@* --force\n * eg: npm unpublish package-name --force\n *\n * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1680ms\n * npm http fetch DELETE 201 http://localhost:4873/custom-name/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms\n *\n * - Remove a specific version\n * eg: npm unpublish package-name@1.0.0 --force\n *\n * Get fresh manifest\n * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1680ms\n * Update manifest without the version to be unpublished\n * npm http fetch PUT 201 http://localhost:4873/custom-name/-rev/14-5d500cfce92f90fd 956606ms\n * Get fresh manifest (revision should be different)\n * npm http fetch GET 200 http://localhost:4873/custom-name?write=true 1601ms\n * Remove the tarball\n * npm http fetch DELETE 201 http://localhost:4873/custom-name/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms\n *\n * 3. Star a package\n *\n * Permissions: staring a package depends of the publish and unpublish permissions, there is no\n * specific flag for star or unstar.\n * The URL for star is similar to the unpublish (change package format)\n *\n * npm has no endpoint for staring a package, rather mutate the metadata and acts as, the difference\n * is the users property which is part of the payload and the body only includes\n *\n * {\n\t\t \"_id\": pkgName,\n\t \t\"_rev\": \"3-b0cdaefc9bdb77c8\",\n\t\t \"users\": {\n\t\t [username]: boolean value (true, false)\n\t\t }\n\t }\n *\n * 4. Change owners of a package\n *\n * Similar to staring a package, changing owners (maintainers) of a package uses the publish\n * endpoint.\n *\n * The body includes a list of the new owners with the following format\n *\n * {\n\t\t \"_id\": pkgName,\n\t \t\"_rev\": \"4-b0cdaefc9bdb77c8\",\n\t\t \"maintainers\": [\n { \"name\": \"first owner\", \"email\": \"me@verdaccio.org\" },\n { \"name\": \"second owner\", \"email\": \"you@verdaccio.org\" },\n ...\n\t\t ]\n\t }\n *\n */\nexport default function publish(\n router: Router,\n auth: Auth,\n storage: Storage,\n logger: Logger\n): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n router.put(\n '/:package',\n can('publish'),\n media(mime.getType('json')),\n expectJson,\n publishPackage(storage, logger, 'publish one version')\n );\n\n router.put(\n '/:package/-rev/:revision',\n can('unpublish'),\n media(mime.getType('json')),\n expectJson,\n publishPackage(storage, logger, 'publish with revision')\n );\n\n /**\n * Un-publishing an entire package.\n *\n * This scenario happens when any of these scenarios happens:\n * - the first call detect there is only one version remaining\n * - no version is specified in the unpublish call\n * - all versions are removed npm unpublish package@*\n * - there is no versions on the metadata\n \n * then the client decides to DELETE the resource\n * Example:\n * Get fresh manifest (write=true is a flag to get the latest revision)\n * npm http fetch GET 304 http://localhost:4873/package-name?write=true 1076ms (from cache)\n * Send request to delete the package, this includes the revision number that must match\n * and the package name, it will delete the entire package and all tarballs (or tarball depends the scenario)\n * npm http fetch DELETE 201 http://localhost:4873/package-name/-rev/18-d8ebe3020bd4ac9c 22ms\n */\n router.delete(\n '/:package/-rev/:revision',\n can('unpublish'),\n async function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n const packageName = req.params.package;\n const rev = req.params.revision;\n const username = req?.remote_user?.name;\n\n logger.debug({ packageName }, `unpublishing @{packageName}`);\n try {\n await storage.removePackage(packageName, rev, username);\n debug('package %s unpublished', packageName);\n res.status(HTTP_STATUS.CREATED);\n return next({ ok: API_MESSAGE.PKG_REMOVED });\n } catch (err) {\n return next(err);\n }\n }\n );\n\n /*\n Remove a tarball, this happens when npm unpublish a package unique version.\n npm http fetch DELETE 201 http://localhost:4873/package-name/-rev/18-d8ebe3020bd4ac9c 22ms\n */\n router.delete(\n '/:package/-/:filename/-rev/:revision',\n can('unpublish'),\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const packageName = req.params.package;\n const { filename, revision } = req.params;\n const username = req?.remote_user?.name;\n\n logger.debug(\n { packageName, filename, revision },\n `removing a tarball for @{packageName}-@{tarballName}-@{revision}`\n );\n try {\n await storage.removeTarball(packageName, filename, revision, username);\n res.status(HTTP_STATUS.CREATED);\n\n logger.debug(\n { packageName, filename, revision },\n `success remove tarball for @{packageName}-@{tarballName}-@{revision}`\n );\n return next({ ok: API_MESSAGE.TARBALL_REMOVED });\n } catch (err) {\n return next(err);\n }\n }\n );\n}\n\nexport function publishPackage(storage: Storage, logger: Logger, origin: string): any {\n return async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug(origin);\n const ac = new AbortController();\n const packageName = req.params.package;\n const { revision } = req.params;\n debug('publishing package %s', packageName);\n debug('revision %s', revision);\n if (debug.enabled) {\n debug('body %o', req.body);\n }\n const metadata = req.body;\n const username = req?.remote_user?.name;\n\n debug('publishing package %o for user %o', packageName, username);\n logger.debug(\n { packageName, username },\n 'publishing package @{packageName} for user @{username}'\n );\n\n try {\n const message = await storage.updateManifest(metadata, {\n name: packageName,\n revision,\n signal: ac.signal,\n requestOptions: {\n host: req.hostname,\n protocol: req.protocol,\n headers: req.headers as { [key: string]: string },\n username,\n },\n uplinksLook: false,\n });\n debug('package %s published', packageName);\n\n res.status(HTTP_STATUS.CREATED);\n\n return next({\n success: true,\n ok: message,\n });\n } catch (err: any) {\n // TODO: review if we need the abort controller here\n next(err);\n }\n };\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AAGA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AAAiE,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAMjE;;AAEA,MAAMG,KAAK,GAAG,IAAAC,cAAU,EAAC,uBAAuB,CAAC;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASC,OAAOA,CAC7BC,MAAc,EACdC,IAAU,EACVC,OAAgB,EAChBC,MAAc,EACR;EACN,MAAMC,GAAG,GAAG,IAAAC,iBAAK,EAACJ,IAAI,EAAE;IACtBK,SAAS,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKL,MAAM,CAACM,KAAK,CAACF,CAAC,EAAEC,CAAC,CAAC;IACvCE,QAAQ,EAAEA,CAACH,CAAC,EAAEC,CAAC,KAAKL,MAAM,CAACM,KAAK,CAACF,CAAC,EAAEC,CAAC;EACvC,CAAC,CAAC;EACFR,MAAM,CAACW,GAAG,CACR,WAAW,EACXP,GAAG,CAAC,SAAS,CAAC,EACd,IAAAQ,iBAAK,EAACC,aAAI,CAACC,OAAO,CAAC,MAAM,CAAC,CAAC,EAC3BC,sBAAU,EACVC,cAAc,CAACd,OAAO,EAAEC,MAAM,EAAE,qBAAqB,CACvD,CAAC;EAEDH,MAAM,CAACW,GAAG,CACR,0BAA0B,EAC1BP,GAAG,CAAC,WAAW,CAAC,EAChB,IAAAQ,iBAAK,EAACC,aAAI,CAACC,OAAO,CAAC,MAAM,CAAC,CAAC,EAC3BC,sBAAU,EACVC,cAAc,CAACd,OAAO,EAAEC,MAAM,EAAE,uBAAuB,CACzD,CAAC;;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEH,MAAM,CAACiB,MAAM,CACX,0BAA0B,EAC1Bb,GAAG,CAAC,WAAW,CAAC,EAChB,gBAAgBc,GAAmB,EAAEC,GAAoB,EAAEC,IAAsB,EAAE;IACjF,MAAMC,WAAW,GAAGH,GAAG,CAACI,MAAM,CAACC,OAAO;IACtC,MAAMC,GAAG,GAAGN,GAAG,CAACI,MAAM,CAACG,QAAQ;IAC/B,MAAMC,QAAQ,GAAGR,GAAG,EAAES,WAAW,EAAEC,IAAI;IAEvCzB,MAAM,CAACN,KAAK,CAAC;MAAEwB;IAAY,CAAC,EAAE,6BAA6B,CAAC;IAC5D,IAAI;MACF,MAAMnB,OAAO,CAAC2B,aAAa,CAACR,WAAW,EAAEG,GAAG,EAAEE,QAAQ,CAAC;MACvD7B,KAAK,CAAC,wBAAwB,EAAEwB,WAAW,CAAC;MAC5CF,GAAG,CAACW,MAAM,CAACC,iBAAW,CAACC,OAAO,CAAC;MAC/B,OAAOZ,IAAI,CAAC;QAAEa,EAAE,EAAEC,iBAAW,CAACC;MAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,OAAOhB,IAAI,CAACgB,GAAG,CAAC;IAClB;EACF,CACF,CAAC;;EAED;AACF;AACA;AACA;EACEpC,MAAM,CAACiB,MAAM,CACX,sCAAsC,EACtCb,GAAG,CAAC,WAAW,CAAC,EAChBA,GAAG,CAAC,SAAS,CAAC,EACd,gBACEc,GAAmB,EACnBC,GAAoB,EACpBC,IAAsB,EACP;IACf,MAAMC,WAAW,GAAGH,GAAG,CAACI,MAAM,CAACC,OAAO;IACtC,MAAM;MAAEc,QAAQ;MAAEZ;IAAS,CAAC,GAAGP,GAAG,CAACI,MAAM;IACzC,MAAMI,QAAQ,GAAGR,GAAG,EAAES,WAAW,EAAEC,IAAI;IAEvCzB,MAAM,CAACN,KAAK,CACV;MAAEwB,WAAW;MAAEgB,QAAQ;MAAEZ;IAAS,CAAC,EACnC,kEACF,CAAC;IACD,IAAI;MACF,MAAMvB,OAAO,CAACoC,aAAa,CAACjB,WAAW,EAAEgB,QAAQ,EAAEZ,QAAQ,EAAEC,QAAQ,CAAC;MACtEP,GAAG,CAACW,MAAM,CAACC,iBAAW,CAACC,OAAO,CAAC;MAE/B7B,MAAM,CAACN,KAAK,CACV;QAAEwB,WAAW;QAAEgB,QAAQ;QAAEZ;MAAS,CAAC,EACnC,sEACF,CAAC;MACD,OAAOL,IAAI,CAAC;QAAEa,EAAE,EAAEC,iBAAW,CAACK;MAAgB,CAAC,CAAC;IAClD,CAAC,CAAC,OAAOH,GAAG,EAAE;MACZ,OAAOhB,IAAI,CAACgB,GAAG,CAAC;IAClB;EACF,CACF,CAAC;AACH;AAEO,SAASpB,cAAcA,CAACd,OAAgB,EAAEC,MAAc,EAAEqC,MAAc,EAAO;EACpF,OAAO,gBACLtB,GAAmB,EACnBC,GAAoB,EACpBC,IAAsB,EACP;IACfvB,KAAK,CAAC2C,MAAM,CAAC;IACb,MAAMC,EAAE,GAAG,IAAIC,eAAe,CAAC,CAAC;IAChC,MAAMrB,WAAW,GAAGH,GAAG,CAACI,MAAM,CAACC,OAAO;IACtC,MAAM;MAAEE;IAAS,CAAC,GAAGP,GAAG,CAACI,MAAM;IAC/BzB,KAAK,CAAC,uBAAuB,EAAEwB,WAAW,CAAC;IAC3CxB,KAAK,CAAC,aAAa,EAAE4B,QAAQ,CAAC;IAC9B,IAAI5B,KAAK,CAAC8C,OAAO,EAAE;MACjB9C,KAAK,CAAC,SAAS,EAAEqB,GAAG,CAAC0B,IAAI,CAAC;IAC5B;IACA,MAAMC,QAAQ,GAAG3B,GAAG,CAAC0B,IAAI;IACzB,MAAMlB,QAAQ,GAAGR,GAAG,EAAES,WAAW,EAAEC,IAAI;IAEvC/B,KAAK,CAAC,mCAAmC,EAAEwB,WAAW,EAAEK,QAAQ,CAAC;IACjEvB,MAAM,CAACN,KAAK,CACV;MAAEwB,WAAW;MAAEK;IAAS,CAAC,EACzB,wDACF,CAAC;IAED,IAAI;MACF,MAAMoB,OAAO,GAAG,MAAM5C,OAAO,CAAC6C,cAAc,CAACF,QAAQ,EAAE;QACrDjB,IAAI,EAAEP,WAAW;QACjBI,QAAQ;QACRuB,MAAM,EAAEP,EAAE,CAACO,MAAM;QACjBC,cAAc,EAAE;UACdC,IAAI,EAAEhC,GAAG,CAACiC,QAAQ;UAClBC,QAAQ,EAAElC,GAAG,CAACkC,QAAQ;UACtBC,OAAO,EAAEnC,GAAG,CAACmC,OAAoC;UACjD3B;QACF,CAAC;QACD4B,WAAW,EAAE;MACf,CAAC,CAAC;MACFzD,KAAK,CAAC,sBAAsB,EAAEwB,WAAW,CAAC;MAE1CF,GAAG,CAACW,MAAM,CAACC,iBAAW,CAACC,OAAO,CAAC;MAE/B,OAAOZ,IAAI,CAAC;QACVmC,OAAO,EAAE,IAAI;QACbtB,EAAE,EAAEa;MACN,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOV,GAAQ,EAAE;MACjB;MACAhB,IAAI,CAACgB,GAAG,CAAC;IACX;EACF,CAAC;AACH","ignoreList":[]}
|
package/build/search.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { Logger } from '@verdaccio/types';
|
|
2
|
+
export default function (route: any, logger: Logger): void;
|
package/build/search.js
CHANGED
|
@@ -5,11 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = _default;
|
|
7
7
|
var _core = require("@verdaccio/core");
|
|
8
|
-
|
|
9
|
-
function _default(route) {
|
|
8
|
+
function _default(route, logger) {
|
|
10
9
|
// TODO: next major version, remove this
|
|
11
10
|
route.get('/-/all(/since)?', function (_req, res) {
|
|
12
|
-
|
|
11
|
+
logger.warn('search endpoint has been removed, please use search v1');
|
|
13
12
|
res.status(_core.HTTP_STATUS.NOT_FOUND);
|
|
14
13
|
res.json({
|
|
15
14
|
error: 'not found, endpoint was removed'
|
package/build/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","names":["_core","require","
|
|
1
|
+
{"version":3,"file":"search.js","names":["_core","require","_default","route","logger","get","_req","res","warn","status","HTTP_STATUS","NOT_FOUND","json","error"],"sources":["../src/search.ts"],"sourcesContent":["import { HTTP_STATUS } from '@verdaccio/core';\nimport { Logger } from '@verdaccio/types';\n\nexport default function (route, logger: Logger): void {\n // TODO: next major version, remove this\n route.get('/-/all(/since)?', function (_req, res) {\n logger.warn('search endpoint has been removed, please use search v1');\n res.status(HTTP_STATUS.NOT_FOUND);\n res.json({ error: 'not found, endpoint was removed' });\n });\n}\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGe,SAAAC,SAAUC,KAAK,EAAEC,MAAc,EAAQ;EACpD;EACAD,KAAK,CAACE,GAAG,CAAC,iBAAiB,EAAE,UAAUC,IAAI,EAAEC,GAAG,EAAE;IAChDH,MAAM,CAACI,IAAI,CAAC,wDAAwD,CAAC;IACrED,GAAG,CAACE,MAAM,CAACC,iBAAW,CAACC,SAAS,CAAC;IACjCJ,GAAG,CAACK,IAAI,CAAC;MAAEC,KAAK,EAAE;IAAkC,CAAC,CAAC;EACxD,CAAC,CAAC;AACJ","ignoreList":[]}
|
package/build/user.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { Auth } from '@verdaccio/auth';
|
|
3
|
+
import { Logger } from '@verdaccio/types';
|
|
3
4
|
import { Config } from '@verdaccio/types';
|
|
4
|
-
export default function (route: Router, auth: Auth, config: Config): void;
|
|
5
|
+
export default function (route: Router, auth: Auth, config: Config, logger: Logger): void;
|
package/build/user.js
CHANGED
|
@@ -8,15 +8,14 @@ var _debug = _interopRequireDefault(require("debug"));
|
|
|
8
8
|
var _auth = require("@verdaccio/auth");
|
|
9
9
|
var _config = require("@verdaccio/config");
|
|
10
10
|
var _core = require("@verdaccio/core");
|
|
11
|
-
var _logger = require("@verdaccio/logger");
|
|
12
11
|
var _middleware = require("@verdaccio/middleware");
|
|
13
12
|
var _utils = require("@verdaccio/utils");
|
|
14
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
14
|
const debug = (0, _debug.default)('verdaccio:api:user');
|
|
16
|
-
function _default(route, auth, config) {
|
|
15
|
+
function _default(route, auth, config, logger) {
|
|
17
16
|
route.get('/-/user/:org_couchdb_user', (0, _middleware.rateLimit)(config?.userRateLimit), function (req, res, next) {
|
|
18
17
|
debug('verifying user');
|
|
19
|
-
if (typeof req.remote_user.name !== 'string' || req.remote_user.name === '') {
|
|
18
|
+
if (!req.remote_user || typeof req.remote_user.name !== 'string' || req.remote_user.name === '') {
|
|
20
19
|
debug('user not logged in');
|
|
21
20
|
res.status(_core.HTTP_STATUS.OK);
|
|
22
21
|
return next({
|
|
@@ -67,7 +66,7 @@ function _default(route, auth, config) {
|
|
|
67
66
|
debug('login: no remote user detected');
|
|
68
67
|
auth.authenticate(name, password, async function callbackAuthenticate(err, user) {
|
|
69
68
|
if (err) {
|
|
70
|
-
|
|
69
|
+
logger.trace({
|
|
71
70
|
name,
|
|
72
71
|
err
|
|
73
72
|
}, 'authenticating for user @{username} failed. Error: @{err.message}');
|