@verdaccio/web 6.0.0-6-next.29 → 6.0.0-6-next.30
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/api/index.js.map +1 -1
- package/build/api/package.d.ts +1 -8
- package/build/api/package.js +51 -54
- package/build/api/package.js.map +1 -1
- package/build/api/readme.d.ts +2 -2
- package/build/api/readme.js +25 -20
- package/build/api/readme.js.map +1 -1
- package/build/api/search.js +1 -3
- package/build/api/search.js.map +1 -1
- package/build/api/sidebar.d.ts +3 -3
- package/build/api/sidebar.js +46 -39
- package/build/api/sidebar.js.map +1 -1
- package/build/api/user.js.map +1 -1
- package/build/index.js.map +1 -1
- package/build/middleware/render-web.js.map +1 -1
- package/build/middleware/security.js.map +1 -1
- package/build/middleware/web-api.js.map +1 -1
- package/build/renderHTML.js.map +1 -1
- package/build/template.js.map +1 -1
- package/build/utils/manifest.js.map +1 -1
- package/build/utils/web-utils.js.map +1 -1
- package/build/web-middleware.js.map +1 -1
- package/jest.config.js +8 -1
- package/package.json +23 -23
- package/src/api/package.ts +53 -54
- package/src/api/readme.ts +33 -24
- package/src/api/search.ts +1 -1
- package/src/api/sidebar.ts +51 -39
- package/test/api.readme.test.ts +1 -1
- package/test/render.test.ts +2 -2
- package/tsconfig.json +0 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# @verdaccio/web
|
|
2
2
|
|
|
3
|
+
## 6.0.0-6-next.30
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 292c0a37: feat!: replace deprecated request dependency by got
|
|
8
|
+
|
|
9
|
+
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.
|
|
10
|
+
|
|
11
|
+
## Notes
|
|
12
|
+
|
|
13
|
+
- Remove deprecated `request` by other `got`, retry improved, custom Agent ( got does not include it built-in)
|
|
14
|
+
- Remove `async` dependency from storage (used by core) it was linked with proxy somehow safe to remove now
|
|
15
|
+
- Refactor with promises instead callback wherever is possible
|
|
16
|
+
- ~Document the API~
|
|
17
|
+
- Improve testing, integration tests
|
|
18
|
+
- Bugfix
|
|
19
|
+
- Clean up old validations
|
|
20
|
+
- Improve performance
|
|
21
|
+
|
|
22
|
+
## 💥 Breaking changes
|
|
23
|
+
|
|
24
|
+
- Plugin API methods were callbacks based are returning promises, this will break current storage plugins, check documentation for upgrade.
|
|
25
|
+
- 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));`
|
|
26
|
+
- `@verdaccio/streams` stream abort support is legacy is being deprecated removed
|
|
27
|
+
- Remove AWS and Google Cloud packages for future refactoring [#2574](https://github.com/verdaccio/verdaccio/pull/2574).
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [292c0a37]
|
|
32
|
+
- Updated dependencies [a3a209b5]
|
|
33
|
+
- Updated dependencies [00d1d2a1]
|
|
34
|
+
- @verdaccio/auth@6.0.0-6-next.23
|
|
35
|
+
- @verdaccio/config@6.0.0-6-next.15
|
|
36
|
+
- @verdaccio/core@6.0.0-6-next.6
|
|
37
|
+
- @verdaccio/readme@11.0.0-6-next.5
|
|
38
|
+
- @verdaccio/tarball@11.0.0-6-next.13
|
|
39
|
+
- @verdaccio/url@11.0.0-6-next.10
|
|
40
|
+
- @verdaccio/loaders@6.0.0-6-next.13
|
|
41
|
+
- @verdaccio/logger@6.0.0-6-next.12
|
|
42
|
+
- @verdaccio/middleware@6.0.0-6-next.23
|
|
43
|
+
- @verdaccio/store@6.0.0-6-next.23
|
|
44
|
+
- @verdaccio/utils@6.0.0-6-next.12
|
|
45
|
+
|
|
3
46
|
## 6.0.0-6-next.29
|
|
4
47
|
|
|
5
48
|
### Patch Changes
|
package/build/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":["auth","storage","config","route","Router","use","packageApi","search","sidebar","readme","hasLogin","user"],"sources":["../../src/api/index.ts"],"sourcesContent":["import { Router } from 'express';\n\nimport { hasLogin } from '../utils/web-utils';\nimport packageApi from './package';\nimport readme from './readme';\nimport search from './search';\nimport sidebar from './sidebar';\nimport user from './user';\n\nexport default (auth, storage, config) => {\n const route = Router(); /* eslint new-cap: 0 */\n route.use('/data/', packageApi(storage, auth, config));\n route.use('/data/', search(storage, auth));\n route.use('/data/', sidebar(config, storage, auth));\n route.use('/data/', readme(storage, auth));\n if (hasLogin(config)) {\n route.use('/sec/', user(auth, config));\n }\n return route;\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;eAEe,CAACA,IAAD,EAAOC,OAAP,EAAgBC,MAAhB,KAA2B;EACxC,MAAMC,KAAK,GAAG,IAAAC,eAAA,GAAd;EAAwB;;EACxBD,KAAK,CAACE,GAAN,CAAU,QAAV,EAAoB,IAAAC,gBAAA,EAAWL,OAAX,EAAoBD,IAApB,EAA0BE,MAA1B,CAApB;EACAC,KAAK,CAACE,GAAN,CAAU,QAAV,EAAoB,IAAAE,eAAA,EAAON,OAAP,EAAgBD,IAAhB,CAApB;EACAG,KAAK,CAACE,GAAN,CAAU,QAAV,EAAoB,IAAAG,gBAAA,EAAQN,MAAR,EAAgBD,OAAhB,EAAyBD,IAAzB,CAApB;EACAG,KAAK,CAACE,GAAN,CAAU,QAAV,EAAoB,IAAAI,eAAA,EAAOR,OAAP,EAAgBD,IAAhB,CAApB;;EACA,IAAI,IAAAU,kBAAA,EAASR,MAAT,CAAJ,EAAsB;IACpBC,KAAK,CAACE,GAAN,CAAU,OAAV,EAAmB,IAAAM,aAAA,EAAKX,IAAL,EAAWE,MAAX,CAAnB;EACD;;EACD,OAAOC,KAAP;AACD,C"}
|
package/build/api/package.d.ts
CHANGED
|
@@ -2,14 +2,7 @@ import { Router } from 'express';
|
|
|
2
2
|
import { IAuth } from '@verdaccio/auth';
|
|
3
3
|
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '@verdaccio/middleware';
|
|
4
4
|
import { Storage } from '@verdaccio/store';
|
|
5
|
-
import { Config
|
|
6
|
-
import { AuthorAvatar } from '../utils/web-utils';
|
|
5
|
+
import { Config } from '@verdaccio/types';
|
|
7
6
|
export { $RequestExtend, $ResponseExtend, $NextFunctionVer };
|
|
8
|
-
export declare type PackageExt = Package & {
|
|
9
|
-
author: AuthorAvatar;
|
|
10
|
-
dist?: {
|
|
11
|
-
tarball: string;
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
7
|
declare function addPackageWebApi(storage: Storage, auth: IAuth, config: Config): Router;
|
|
15
8
|
export default addPackageWebApi;
|
package/build/api/package.js
CHANGED
|
@@ -80,70 +80,67 @@ function addPackageWebApi(storage, auth, config) {
|
|
|
80
80
|
} catch (err) {
|
|
81
81
|
reject(err);
|
|
82
82
|
}
|
|
83
|
-
});
|
|
84
|
-
|
|
83
|
+
});
|
|
85
84
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
async function processPackages(packages = [], req) {
|
|
86
|
+
const permissions = [];
|
|
87
|
+
const packagesToProcess = packages.slice();
|
|
88
|
+
debug('process packages %o', packagesToProcess);
|
|
90
89
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
90
|
+
for (const pkg of packagesToProcess) {
|
|
91
|
+
const pkgCopy = { ...pkg
|
|
92
|
+
};
|
|
93
|
+
pkgCopy.author = (0, _utils.formatAuthor)(pkg.author);
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
// eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (!_lodash.default.isNil(pkgCopy.dist) && !_lodash.default.isNull(pkgCopy.dist.tarball)) {
|
|
114
|
-
pkgCopy.dist.tarball = (0, _tarball.getLocalRegistryTarballUri)(pkgCopy.dist.tarball, pkg.name, {
|
|
115
|
-
protocol: req.protocol,
|
|
116
|
-
headers: req.headers,
|
|
117
|
-
host: req.hostname
|
|
118
|
-
}, config === null || config === void 0 ? void 0 : config.url_prefix);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
permissions.push(pkgCopy);
|
|
122
|
-
}
|
|
123
|
-
} catch (err) {
|
|
124
|
-
debug('process packages error %o', err);
|
|
125
|
-
|
|
126
|
-
_logger.logger.logger.error({
|
|
127
|
-
name: pkg.name,
|
|
128
|
-
error: err
|
|
129
|
-
}, 'permission process for @{name} has failed: @{error}');
|
|
130
|
-
|
|
131
|
-
throw err;
|
|
95
|
+
try {
|
|
96
|
+
if (await checkAllow(pkg.name, req.remote_user)) {
|
|
97
|
+
if (config.web) {
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
pkgCopy.author.avatar = (0, _utils.generateGravatarUrl)(pkgCopy.author.email, config.web.gravatar);
|
|
100
|
+
} // convert any remote dist to a local reference
|
|
101
|
+
// eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if (!_lodash.default.isNil(pkgCopy.dist) && !_lodash.default.isNull(pkgCopy.dist.tarball)) {
|
|
105
|
+
pkgCopy.dist.tarball = (0, _tarball.getLocalRegistryTarballUri)(pkgCopy.dist.tarball, pkg.name, {
|
|
106
|
+
protocol: req.protocol,
|
|
107
|
+
headers: req.headers,
|
|
108
|
+
host: req.hostname
|
|
109
|
+
}, config === null || config === void 0 ? void 0 : config.url_prefix);
|
|
132
110
|
}
|
|
111
|
+
|
|
112
|
+
permissions.push(pkgCopy);
|
|
133
113
|
}
|
|
114
|
+
} catch (err) {
|
|
115
|
+
debug('process packages error %o', err);
|
|
116
|
+
|
|
117
|
+
_logger.logger.logger.error({
|
|
118
|
+
name: pkg.name,
|
|
119
|
+
error: err
|
|
120
|
+
}, 'permission process for @{name} has failed: @{error}');
|
|
134
121
|
|
|
135
|
-
|
|
122
|
+
throw err;
|
|
136
123
|
}
|
|
124
|
+
}
|
|
137
125
|
|
|
126
|
+
return permissions;
|
|
127
|
+
} // Get list of all visible package
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
pkgRouter.get('/packages', async function (req, res, next) {
|
|
131
|
+
debug('hit package web api %o');
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
var _config$web2;
|
|
135
|
+
|
|
136
|
+
const localPackages = await storage.getLocalDatabaseNext();
|
|
138
137
|
const order = getOrder(config === null || config === void 0 ? void 0 : (_config$web2 = config.web) === null || _config$web2 === void 0 ? void 0 : _config$web2.sort_packages);
|
|
139
138
|
debug('order %o', order);
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
});
|
|
139
|
+
const pkgs = await processPackages(localPackages, req);
|
|
140
|
+
next((0, _webUtils.sortByName)(pkgs, order));
|
|
141
|
+
} catch (error) {
|
|
142
|
+
next(error);
|
|
143
|
+
}
|
|
147
144
|
});
|
|
148
145
|
return pkgRouter;
|
|
149
146
|
}
|
package/build/api/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"package.js","names":["getOrder","order","debug","buildDebug","addPackageWebApi","storage","auth","config","isLoginEnabled","web","login","pkgRouter","Router","anonymousRemoteUser","name","undefined","real_groups","groups","checkAllow","remoteUser","Promise","resolve","reject","allow_access","packageName","err","allowed","processPackages","packages","req","permissions","packagesToProcess","slice","pkg","pkgCopy","author","formatAuthor","remote_user","avatar","generateGravatarUrl","email","gravatar","_","isNil","dist","isNull","tarball","getLocalRegistryTarballUri","protocol","headers","host","hostname","url_prefix","push","logger","error","get","res","next","localPackages","getLocalDatabaseNext","sort_packages","pkgs","sortByName"],"sources":["../../src/api/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { logger } from '@verdaccio/logger';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { getLocalRegistryTarballUri } from '@verdaccio/tarball';\nimport { Config, RemoteUser, Version } from '@verdaccio/types';\nimport { formatAuthor, generateGravatarUrl } from '@verdaccio/utils';\n\nimport { sortByName } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nconst getOrder = (order = 'asc') => {\n return order === 'asc';\n};\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: IAuth, config: Config): Router {\n const isLoginEnabled = config?.web?.login === true ?? true;\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const anonymousRemoteUser: RemoteUser = {\n name: undefined,\n real_groups: [],\n groups: [],\n };\n\n debug('initialized package web api');\n const checkAllow = (name: string, remoteUser: RemoteUser): Promise<boolean> =>\n new Promise((resolve, reject): void => {\n debug('is login disabled %o', isLoginEnabled);\n // FIXME: this logic does not work, review\n // const remoteUserAccess = !isLoginEnabled ? anonymousRemoteUser : remoteUser;\n try {\n auth.allow_access({ packageName: name }, remoteUser, (err, allowed): void => {\n if (err) {\n resolve(false);\n }\n resolve(allowed);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n async function processPackages(packages: Version[] = [], req): Promise<Version[]> {\n const permissions: Version[] = [];\n const packagesToProcess = packages.slice();\n debug('process packages %o', packagesToProcess);\n for (const pkg of packagesToProcess) {\n const pkgCopy = { ...pkg };\n pkgCopy.author = formatAuthor(pkg.author);\n try {\n if (await checkAllow(pkg.name, req.remote_user)) {\n if (config.web) {\n // @ts-ignore\n pkgCopy.author.avatar = generateGravatarUrl(pkgCopy.author.email, config.web.gravatar);\n }\n // convert any remote dist to a local reference\n // eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz\n if (!_.isNil(pkgCopy.dist) && !_.isNull(pkgCopy.dist.tarball)) {\n pkgCopy.dist.tarball = getLocalRegistryTarballUri(\n pkgCopy.dist.tarball,\n pkg.name,\n { protocol: req.protocol, headers: req.headers as any, host: req.hostname },\n config?.url_prefix\n );\n }\n permissions.push(pkgCopy);\n }\n } catch (err: any) {\n debug('process packages error %o', err);\n logger.logger.error(\n { name: pkg.name, error: err },\n 'permission process for @{name} has failed: @{error}'\n );\n throw err;\n }\n }\n\n return permissions;\n }\n\n // Get list of all visible package\n pkgRouter.get(\n '/packages',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('hit package web api %o');\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabaseNext();\n\n const order = getOrder(config?.web?.sort_packages);\n debug('order %o', order);\n const pkgs = await processPackages(localPackages, req);\n next(sortByName(pkgs, order));\n } catch (error: any) {\n next(error);\n }\n }\n );\n\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"mappings":"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"}
|
package/build/api/readme.d.ts
CHANGED
|
@@ -2,10 +2,10 @@ import { Router } from 'express';
|
|
|
2
2
|
import { IAuth } from '@verdaccio/auth';
|
|
3
3
|
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '@verdaccio/middleware';
|
|
4
4
|
import { Storage } from '@verdaccio/store';
|
|
5
|
-
import {
|
|
5
|
+
import { Manifest } from '@verdaccio/types';
|
|
6
6
|
import { AuthorAvatar } from '../utils/web-utils';
|
|
7
7
|
export { $RequestExtend, $ResponseExtend, $NextFunctionVer };
|
|
8
|
-
export declare type PackageExt =
|
|
8
|
+
export declare type PackageExt = Manifest & {
|
|
9
9
|
author: AuthorAvatar;
|
|
10
10
|
dist?: {
|
|
11
11
|
tarball: string;
|
package/build/api/readme.js
CHANGED
|
@@ -47,30 +47,35 @@ function addReadmeWebApi(storage, auth) {
|
|
|
47
47
|
const pkgRouter = (0, _express.Router)();
|
|
48
48
|
/* eslint new-cap: 0 */
|
|
49
49
|
|
|
50
|
-
pkgRouter.get('/package/readme/(@:scope/)?:package/:version?', can('access'), function (req, res, next) {
|
|
50
|
+
pkgRouter.get('/package/readme/(@:scope/)?:package/:version?', can('access'), async function (req, res, next) {
|
|
51
51
|
debug('readme hit');
|
|
52
|
-
const
|
|
53
|
-
debug('readme name %o',
|
|
52
|
+
const name = req.params.scope ? (0, _webUtils.addScope)(req.params.scope, req.params.package) : req.params.package;
|
|
53
|
+
debug('readme name %o', name);
|
|
54
|
+
const requestOptions = {
|
|
55
|
+
protocol: req.protocol,
|
|
56
|
+
headers: req.headers,
|
|
57
|
+
// FIXME: if we migrate to req.hostname, the port is not longer included.
|
|
58
|
+
host: req.host,
|
|
59
|
+
remoteAddress: req.socket.remoteAddress
|
|
60
|
+
};
|
|
54
61
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
try {
|
|
63
|
+
const manifest = await storage.getPackageByOptions({
|
|
64
|
+
name,
|
|
65
|
+
uplinksLook: true,
|
|
66
|
+
requestOptions
|
|
67
|
+
});
|
|
68
|
+
debug('readme pkg %o', manifest === null || manifest === void 0 ? void 0 : manifest.name);
|
|
69
|
+
res.set(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.TEXT_PLAIN_UTF8);
|
|
62
70
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
next((0, _webUtils.parseReadme)(info.name, info.readme));
|
|
69
|
-
} catch {
|
|
70
|
-
next((0, _readme.default)(NOT_README_FOUND));
|
|
71
|
-
}
|
|
71
|
+
try {
|
|
72
|
+
next((0, _webUtils.parseReadme)(manifest.name, manifest.readme));
|
|
73
|
+
} catch {
|
|
74
|
+
next((0, _readme.default)(NOT_README_FOUND));
|
|
72
75
|
}
|
|
73
|
-
})
|
|
76
|
+
} catch (err) {
|
|
77
|
+
next(err);
|
|
78
|
+
}
|
|
74
79
|
});
|
|
75
80
|
return pkgRouter;
|
|
76
81
|
}
|
package/build/api/readme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"readme.js","names":["debug","buildDebug","NOT_README_FOUND","addReadmeWebApi","storage","auth","can","allow","pkgRouter","Router","get","req","res","next","name","params","scope","addScope","package","requestOptions","protocol","headers","host","remoteAddress","socket","manifest","getPackageByOptions","uplinksLook","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","parseReadme","readme","sanitizyReadme","err"],"sources":["../../src/api/readme.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { HEADERS, HEADER_TYPE } from '@verdaccio/core';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\nimport sanitizyReadme from '@verdaccio/readme';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\n\nimport { AuthorAvatar, addScope, parseReadme } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\n// TODO: review this type, should be on @verdacid/types\nexport type PackageExt = Manifest & { author: AuthorAvatar; dist?: { tarball: string } };\n\nconst debug = buildDebug('verdaccio:web:api:readme');\n\nexport const NOT_README_FOUND = 'ERROR: No README data found!';\n\nfunction addReadmeWebApi(storage: Storage, auth: IAuth): Router {\n debug('initialized readme web api');\n const can = allow(auth);\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n\n pkgRouter.get(\n '/package/readme/(@:scope/)?:package/:version?',\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('readme hit');\n const name = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : req.params.package;\n debug('readme name %o', name);\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 debug('readme pkg %o', manifest?.name);\n res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);\n try {\n next(parseReadme(manifest.name, manifest.readme as string));\n } catch {\n next(sanitizyReadme(NOT_README_FOUND));\n }\n } catch (err) {\n next(err);\n }\n }\n );\n return pkgRouter;\n}\n\nexport default addReadmeWebApi;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAGA;;AACA;;AACA;;AAIA;;;;AAOA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,0BAAX,CAAd;AAEO,MAAMC,gBAAgB,GAAG,8BAAzB;;;AAEP,SAASC,eAAT,CAAyBC,OAAzB,EAA2CC,IAA3C,EAAgE;EAC9DL,KAAK,CAAC,4BAAD,CAAL;EACA,MAAMM,GAAG,GAAG,IAAAC,iBAAA,EAAMF,IAAN,CAAZ;EACA,MAAMG,SAAS,GAAG,IAAAC,eAAA,GAAlB;EAA4B;;EAE5BD,SAAS,CAACE,GAAV,CACE,+CADF,EAEEJ,GAAG,CAAC,QAAD,CAFL,EAGE,gBACEK,GADF,EAEEC,GAFF,EAGEC,IAHF,EAIiB;IACfb,KAAK,CAAC,YAAD,CAAL;IACA,MAAMc,IAAI,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GACT,IAAAC,kBAAA,EAASN,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWG,OAAtC,CADS,GAETP,GAAG,CAACI,MAAJ,CAAWG,OAFf;IAGAlB,KAAK,CAAC,gBAAD,EAAmBc,IAAnB,CAAL;IACA,MAAMK,cAAc,GAAG;MACrBC,QAAQ,EAAET,GAAG,CAACS,QADO;MAErBC,OAAO,EAAEV,GAAG,CAACU,OAFQ;MAGrB;MACAC,IAAI,EAAEX,GAAG,CAACW,IAJW;MAKrBC,aAAa,EAAEZ,GAAG,CAACa,MAAJ,CAAWD;IALL,CAAvB;;IAOA,IAAI;MACF,MAAME,QAAQ,GAAG,MAAMrB,OAAO,CAACsB,mBAAR,CAA4B;QACjDZ,IADiD;QAEjDa,WAAW,EAAE,IAFoC;QAGjDR;MAHiD,CAA5B,CAAvB;MAKAnB,KAAK,CAAC,eAAD,EAAkByB,QAAlB,aAAkBA,QAAlB,uBAAkBA,QAAQ,CAAEX,IAA5B,CAAL;MACAF,GAAG,CAACgB,GAAJ,CAAQC,iBAAA,CAAYC,YAApB,EAAkCC,aAAA,CAAQC,eAA1C;;MACA,IAAI;QACFnB,IAAI,CAAC,IAAAoB,qBAAA,EAAYR,QAAQ,CAACX,IAArB,EAA2BW,QAAQ,CAACS,MAApC,CAAD,CAAJ;MACD,CAFD,CAEE,MAAM;QACNrB,IAAI,CAAC,IAAAsB,eAAA,EAAejC,gBAAf,CAAD,CAAJ;MACD;IACF,CAbD,CAaE,OAAOkC,GAAP,EAAY;MACZvB,IAAI,CAACuB,GAAD,CAAJ;IACD;EACF,CApCH;EAsCA,OAAO5B,SAAP;AACD;;eAEcL,e"}
|
package/build/api/search.js
CHANGED
|
@@ -48,8 +48,6 @@ function addSearchWebApi(storage, auth) {
|
|
|
48
48
|
|
|
49
49
|
router.get('/search/:anything', async function (req, res, next) {
|
|
50
50
|
try {
|
|
51
|
-
var _storage$searchManage;
|
|
52
|
-
|
|
53
51
|
let data;
|
|
54
52
|
const abort = new AbortController();
|
|
55
53
|
req.on('aborted', () => {
|
|
@@ -72,7 +70,7 @@ function addSearchWebApi(storage, auth) {
|
|
|
72
70
|
|
|
73
71
|
const urlParams = new _url.URLSearchParams(query);
|
|
74
72
|
debug('search web init');
|
|
75
|
-
data = await (
|
|
73
|
+
data = await (storage === null || storage === void 0 ? void 0 : storage.search({
|
|
76
74
|
query,
|
|
77
75
|
url: `/-/v1/search?${urlParams.toString()}`,
|
|
78
76
|
abort
|
package/build/api/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"search.js","names":["debug","buildDebug","checkAccess","pkg","auth","remoteUser","Promise","resolve","reject","allow_access","packageName","package","name","err","allowed","status","String","match","addSearchWebApi","storage","router","Router","get","req","res","next","data","abort","AbortController","on","text","params","anything","size","from","query","maintenance","popularity","quality","urlParams","URLSearchParams","search","url","toString","checkAccessPromises","all","map","pkgItem","remote_user","final","filter","i","_","isNull","slice","errorUtils","getInternalError","message"],"sources":["../../src/api/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\nimport { URLSearchParams } from 'url';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { errorUtils, searchUtils } from '@verdaccio/core';\nimport { SearchQuery } from '@verdaccio/core/src/search-utils';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction checkAccess(pkg: any, auth: any, remoteUser): Promise<Manifest | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n}\n\nfunction addSearchWebApi(storage: Storage, auth: IAuth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n router.get(\n '/search/:anything',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n try {\n let data;\n const abort = new AbortController();\n req.on('aborted', () => {\n debug('search web aborted');\n abort.abort();\n });\n const text: string = (req.params.anything as string) ?? '';\n // These values are declared as optimal by npm cli\n // FUTURE: could be overwritten by ui settings.\n const size = 20;\n const from = 0;\n const query: SearchQuery = {\n from: 0,\n maintenance: 0.5,\n popularity: 0.98,\n quality: 0.65,\n size: 20,\n text,\n };\n // @ts-ignore\n const urlParams = new URLSearchParams(query);\n debug('search web init');\n data = await storage?.search({\n query,\n url: `/-/v1/search?${urlParams.toString()}`,\n abort,\n });\n const checkAccessPromises: searchUtils.SearchItemPkg[] = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final: searchUtils.SearchItemPkg[] = checkAccessPromises\n .filter((i) => !_.isNull(i))\n .slice(from, size);\n\n next(final);\n } catch (err: any) {\n next(errorUtils.getInternalError(err.message));\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"mappings":"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"}
|
package/build/api/sidebar.d.ts
CHANGED
|
@@ -2,16 +2,16 @@ import { Router } from 'express';
|
|
|
2
2
|
import { IAuth } from '@verdaccio/auth';
|
|
3
3
|
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '@verdaccio/middleware';
|
|
4
4
|
import { Storage } from '@verdaccio/store';
|
|
5
|
-
import { Config,
|
|
5
|
+
import { Config, Manifest, Version } from '@verdaccio/types';
|
|
6
6
|
import { AuthorAvatar } from '../utils/web-utils';
|
|
7
7
|
export { $RequestExtend, $ResponseExtend, $NextFunctionVer };
|
|
8
|
-
export declare type PackageExt =
|
|
8
|
+
export declare type PackageExt = Manifest & {
|
|
9
9
|
author: AuthorAvatar;
|
|
10
10
|
dist?: {
|
|
11
11
|
tarball: string;
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
|
-
export declare type $SidebarPackage =
|
|
14
|
+
export declare type $SidebarPackage = Manifest & {
|
|
15
15
|
latest: Version;
|
|
16
16
|
};
|
|
17
17
|
declare function addSidebarWebApi(config: Config, storage: Storage, auth: IAuth): Router;
|
package/build/api/sidebar.js
CHANGED
|
@@ -27,8 +27,6 @@ var _debug = _interopRequireDefault(require("debug"));
|
|
|
27
27
|
|
|
28
28
|
var _express = require("express");
|
|
29
29
|
|
|
30
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
31
|
-
|
|
32
30
|
var _core = require("@verdaccio/core");
|
|
33
31
|
|
|
34
32
|
var _middleware = require("@verdaccio/middleware");
|
|
@@ -50,44 +48,53 @@ function addSidebarWebApi(config, storage, auth) {
|
|
|
50
48
|
|
|
51
49
|
const can = (0, _middleware.allow)(auth); // Get package readme
|
|
52
50
|
|
|
53
|
-
router.get('/sidebar/(@:scope/)?:package', can('access'), function (req, res, next) {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
req,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
51
|
+
router.get('/sidebar/(@:scope/)?:package', can('access'), async function (req, res, next) {
|
|
52
|
+
const name = req.params.scope ? (0, _webUtils.addScope)(req.params.scope, req.params.package) : req.params.package;
|
|
53
|
+
const requestOptions = {
|
|
54
|
+
protocol: req.protocol,
|
|
55
|
+
headers: req.headers,
|
|
56
|
+
// FIXME: if we migrate to req.hostname, the port is not longer included.
|
|
57
|
+
host: req.host,
|
|
58
|
+
remoteAddress: req.socket.remoteAddress
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const info = await storage.getPackageByOptions({
|
|
63
|
+
name,
|
|
64
|
+
uplinksLook: true,
|
|
65
|
+
keepUpLinkData: true,
|
|
66
|
+
requestOptions
|
|
67
|
+
});
|
|
68
|
+
const {
|
|
69
|
+
v
|
|
70
|
+
} = req.query;
|
|
71
|
+
let sideBarInfo = { ...info
|
|
72
|
+
};
|
|
73
|
+
sideBarInfo.versions = (0, _tarball.convertDistRemoteToLocalTarballUrls)(info, {
|
|
74
|
+
protocol: req.protocol,
|
|
75
|
+
headers: req.headers,
|
|
76
|
+
host: req.hostname
|
|
77
|
+
}, config.url_prefix).versions; // TODO: review this implementation
|
|
78
|
+
|
|
79
|
+
if (typeof v === 'string' && (0, _utils.isVersionValid)(info, v)) {
|
|
80
|
+
// @ts-ignore
|
|
81
|
+
sideBarInfo.latest = sideBarInfo.versions[v]; // @ts-ignore
|
|
82
|
+
|
|
83
|
+
sideBarInfo.latest.author = (0, _utils.formatAuthor)(sideBarInfo.latest.author);
|
|
84
|
+
} else {
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
sideBarInfo.latest = sideBarInfo.versions[info[_core.DIST_TAGS].latest]; // @ts-ignore
|
|
87
|
+
|
|
88
|
+
sideBarInfo.latest.author = (0, _utils.formatAuthor)(sideBarInfo.latest.author);
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
|
|
91
|
+
sideBarInfo = (0, _webUtils.deleteProperties)(['readme', '_attachments', '_rev', 'name'], sideBarInfo);
|
|
92
|
+
const authorAvatar = config.web ? (0, _utils.addGravatarSupport)(sideBarInfo, config.web.gravatar) : (0, _utils.addGravatarSupport)(sideBarInfo);
|
|
93
|
+
next(authorAvatar);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
res.status(_core.HTTP_STATUS.NOT_FOUND);
|
|
96
|
+
res.end();
|
|
97
|
+
}
|
|
91
98
|
});
|
|
92
99
|
return router;
|
|
93
100
|
}
|
package/build/api/sidebar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"sidebar.js","names":["debug","buildDebug","addSidebarWebApi","config","storage","auth","router","Router","can","allow","get","req","res","next","name","params","scope","addScope","package","requestOptions","protocol","headers","host","remoteAddress","socket","info","getPackageByOptions","uplinksLook","keepUpLinkData","v","query","sideBarInfo","versions","convertDistRemoteToLocalTarballUrls","hostname","url_prefix","isVersionValid","latest","author","formatAuthor","DIST_TAGS","deleteProperties","authorAvatar","web","addGravatarSupport","gravatar","err","status","HTTP_STATUS","NOT_FOUND","end"],"sources":["../../src/api/sidebar.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { DIST_TAGS, HTTP_STATUS } from '@verdaccio/core';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { convertDistRemoteToLocalTarballUrls } from '@verdaccio/tarball';\nimport { Config, Manifest, Version } from '@verdaccio/types';\nimport { addGravatarSupport, formatAuthor, isVersionValid } from '@verdaccio/utils';\n\nimport { AuthorAvatar, addScope, deleteProperties } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nexport type PackageExt = Manifest & { author: AuthorAvatar; dist?: { tarball: string } };\n\nexport type $SidebarPackage = Manifest & { latest: Version };\nconst debug = buildDebug('verdaccio:web:api:sidebar');\n\nfunction addSidebarWebApi(config: Config, storage: Storage, auth: IAuth): Router {\n debug('initialized sidebar web api');\n const router = Router(); /* eslint new-cap: 0 */\n const can = allow(auth);\n // Get package readme\n router.get(\n '/sidebar/(@:scope/)?:package',\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const name: string = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : 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 info = (await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n keepUpLinkData: true,\n requestOptions,\n })) as Manifest;\n const { v } = req.query;\n let sideBarInfo = { ...info };\n sideBarInfo.versions = convertDistRemoteToLocalTarballUrls(\n info,\n { protocol: req.protocol, headers: req.headers as any, host: req.hostname },\n config.url_prefix\n ).versions;\n // TODO: review this implementation\n if (typeof v === 'string' && isVersionValid(info, v)) {\n // @ts-ignore\n sideBarInfo.latest = sideBarInfo.versions[v];\n // @ts-ignore\n sideBarInfo.latest.author = formatAuthor(sideBarInfo.latest.author);\n } else {\n // @ts-ignore\n sideBarInfo.latest = sideBarInfo.versions[info[DIST_TAGS].latest];\n // @ts-ignore\n sideBarInfo.latest.author = formatAuthor(sideBarInfo.latest.author);\n }\n sideBarInfo = deleteProperties(['readme', '_attachments', '_rev', 'name'], sideBarInfo);\n const authorAvatar = config.web\n ? addGravatarSupport(sideBarInfo, config.web.gravatar)\n : addGravatarSupport(sideBarInfo);\n next(authorAvatar);\n } catch (err) {\n res.status(HTTP_STATUS.NOT_FOUND);\n res.end();\n }\n }\n );\n\n return router;\n}\n\nexport default addSidebarWebApi;\n"],"mappings":"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"}
|
package/build/api/user.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"user.js","names":["debug","buildDebug","addUserAuthApi","auth","config","route","Router","post","req","res","next","username","password","body","authenticate","err","user","errorCode","message","HTTP_STATUS","UNAUTHORIZED","INTERNAL_ERROR","errorUtils","getCode","remote_user","jWTSignOptions","security","web","sign","token","jwtEncrypt","name","flags","changePassword","put","_","isNil","status","API_ERROR","MUST_BE_LOGGED","validatePassword","new","old","isUpdated","ok","getInternalError","INTERNAL_SERVER_ERROR","BAD_REQUEST","APP_ERROR","PASSWORD_VALIDATION"],"sources":["../../src/api/user.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Request, Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { API_ERROR, APP_ERROR, HTTP_STATUS, errorUtils } from '@verdaccio/core';\nimport { Config, JWTSignOptions, RemoteUser } from '@verdaccio/types';\nimport { validatePassword } from '@verdaccio/utils';\n\nimport { $NextFunctionVer } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:user');\n\nfunction addUserAuthApi(auth: IAuth, config: Config): Router {\n const route = Router(); /* eslint new-cap: 0 */\n route.post('/login', function (req: Request, res: Response, next: $NextFunctionVer): void {\n const { username, password } = req.body;\n debug('authenticate %o', username);\n auth.authenticate(username, password, async (err, user: RemoteUser): Promise<void> => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n debug('error authenticate %o', errorCode);\n next(errorUtils.getCode(errorCode, err.message));\n } else {\n req.remote_user = user;\n const jWTSignOptions: JWTSignOptions = config.security.web.sign;\n\n next({\n token: await auth.jwtEncrypt(user, jWTSignOptions),\n username: req.remote_user.name,\n });\n }\n });\n });\n\n if (config?.flags?.changePassword === true) {\n route.put(\n '/reset_password',\n function (req: Request, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n // FUTURE: update to a more meaningful message\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password } = req.body;\n const { name } = req.remote_user;\n\n if (validatePassword(password.new) === false) {\n auth.changePassword(\n name as string,\n password.old,\n password.new,\n (err, isUpdated): void => {\n if (_.isNil(err) && isUpdated) {\n next({\n ok: true,\n });\n } else {\n return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n }\n );\n } else {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_REQUEST, APP_ERROR.PASSWORD_VALIDATION));\n }\n }\n );\n }\n\n return route;\n}\n\nexport default addUserAuthApi;\n"],"mappings":"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"}
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export { default } from './web-middleware';\n"],"mappings":";;;;;;;;;;;;AAAA"}
|