@verdaccio/web 6.0.0-6-next.26 → 6.0.0-6-next.27
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 +52 -0
- package/build/api/readme.js +2 -3
- package/build/api/readme.js.map +1 -1
- package/build/api/search.js +64 -61
- package/build/api/search.js.map +1 -1
- package/build/middleware/render-web.d.ts +1 -1
- package/build/middleware/render-web.js +1 -6
- package/build/middleware/render-web.js.map +1 -1
- package/build/middleware/web-api.js +1 -6
- package/build/middleware/web-api.js.map +1 -1
- package/build/renderHTML.js +3 -0
- package/build/renderHTML.js.map +1 -1
- package/build/web-middleware.js +1 -1
- package/build/web-middleware.js.map +1 -1
- package/package.json +19 -15
- package/src/api/readme.ts +2 -3
- package/src/api/search.ts +64 -55
- package/src/middleware/render-web.ts +1 -3
- package/src/middleware/web-api.ts +0 -2
- package/src/renderHTML.ts +6 -1
- package/src/web-middleware.ts +1 -1
- package/test/api.readme.test.ts +29 -27
- package/test/api.search.test.ts +18 -45
- package/test/api.sidebar.test.ts +22 -36
- package/test/api.user.test.ts +1 -1
- package/test/config/default-test.yaml +1 -5
- package/test/config/login-disabled.yaml +1 -5
- package/test/helper.ts +7 -23
- package/test/partials/search/search-v1.json +157 -0
- package/test/render.test.ts +1 -1
- package/tsconfig.json +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# @verdaccio/web
|
|
2
2
|
|
|
3
|
+
## 6.0.0-6-next.27
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 82cb0f2b: feat!: config.logs throw an error, logging config not longer accept array or logs property
|
|
8
|
+
|
|
9
|
+
### 💥 Breaking change
|
|
10
|
+
|
|
11
|
+
This is valid
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
log: { type: stdout, format: pretty, level: http }
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This is invalid
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
logs: { type: stdout, format: pretty, level: http }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
or
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
logs:
|
|
27
|
+
- [{ type: stdout, format: pretty, level: http }]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Minor Changes
|
|
31
|
+
|
|
32
|
+
- 5167bb52: feat: ui search support for remote, local and private packages
|
|
33
|
+
|
|
34
|
+
The command `npm search` search globally and return all matches, with this improvement the user interface
|
|
35
|
+
is powered with the same capabilities.
|
|
36
|
+
|
|
37
|
+
The UI also tag where is the origin the package with a tag, also provide the latest version and description of the package.
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- Updated dependencies [82cb0f2b]
|
|
42
|
+
- Updated dependencies [5167bb52]
|
|
43
|
+
- @verdaccio/config@6.0.0-6-next.13
|
|
44
|
+
- @verdaccio/core@6.0.0-6-next.5
|
|
45
|
+
- @verdaccio/logger@6.0.0-6-next.11
|
|
46
|
+
- @verdaccio/store@6.0.0-6-next.21
|
|
47
|
+
- @verdaccio/auth@6.0.0-6-next.21
|
|
48
|
+
- @verdaccio/loaders@6.0.0-6-next.12
|
|
49
|
+
- @verdaccio/tarball@11.0.0-6-next.12
|
|
50
|
+
- @verdaccio/url@11.0.0-6-next.9
|
|
51
|
+
- @verdaccio/middleware@6.0.0-6-next.21
|
|
52
|
+
- @verdaccio/utils@6.0.0-6-next.11
|
|
53
|
+
- @verdaccio/readme@11.0.0-6-next.4
|
|
54
|
+
|
|
3
55
|
## 6.0.0-6-next.26
|
|
4
56
|
|
|
5
57
|
### Patch Changes
|
package/build/api/readme.js
CHANGED
|
@@ -57,14 +57,13 @@ function addReadmeWebApi(storage, auth) {
|
|
|
57
57
|
uplinksLook: true,
|
|
58
58
|
req,
|
|
59
59
|
callback: function (err, info) {
|
|
60
|
-
debug('readme
|
|
60
|
+
debug('readme pkg %o', info === null || info === void 0 ? void 0 : info.name);
|
|
61
|
+
res.set(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.TEXT_PLAIN_UTF8);
|
|
61
62
|
|
|
62
63
|
if (err) {
|
|
63
64
|
return next(err);
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
res.set(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.TEXT_PLAIN_UTF8);
|
|
67
|
-
|
|
68
67
|
try {
|
|
69
68
|
next((0, _webUtils.parseReadme)(info.name, info.readme));
|
|
70
69
|
} catch {
|
package/build/api/readme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/readme.ts"],"names":["debug","NOT_README_FOUND","addReadmeWebApi","storage","auth","can","pkgRouter","get","req","res","next","packageName","params","scope","package","getPackage","name","uplinksLook","callback","err","info","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","readme"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAGA;;AACA;;AACA;;AAIA;;;;AAMA,MAAMA,KAAK,GAAG,oBAAW,0BAAX,CAAd;AAEO,MAAMC,gBAAgB,GAAG,8BAAzB;;;AAEP,SAASC,eAAT,CAAyBC,OAAzB,EAA2CC,IAA3C,EAAgE;AAC9DJ,EAAAA,KAAK,CAAC,4BAAD,CAAL;AACA,QAAMK,GAAG,GAAG,uBAAMD,IAAN,CAAZ;AACA,QAAME,SAAS,GAAG,sBAAlB;AAA4B;;AAE5BA,EAAAA,SAAS,CAACC,GAAV,CACE,+CADF,EAEEF,GAAG,CAAC,QAAD,CAFL,EAGE,UAAUG,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACjFV,IAAAA,KAAK,CAAC,YAAD,CAAL;AACA,UAAMW,WAAW,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GAChB,wBAASL,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWE,OAAtC,CADgB,GAEhBN,GAAG,CAACI,MAAJ,CAAWE,OAFf;AAGAd,IAAAA,KAAK,CAAC,gBAAD,EAAmBW,WAAnB,CAAL,CALiF,CAOjF;;AACAR,IAAAA,OAAO,CAACY,UAAR,CAAmB;AACjBC,MAAAA,IAAI,EAAEL,WADW;AAEjBM,MAAAA,WAAW,EAAE,IAFI;AAGjBT,MAAAA,GAHiB;AAIjBU,MAAAA,QAAQ,EAAE,UAAUC,GAAV,EAAeC,IAAf,EAA2B;AACnCpB,QAAAA,KAAK,CAAC,eAAD,EAAkBoB,IAAlB,aAAkBA,IAAlB,uBAAkBA,IAAI,CAAEJ,IAAxB,CAAL
|
|
1
|
+
{"version":3,"sources":["../../src/api/readme.ts"],"names":["debug","NOT_README_FOUND","addReadmeWebApi","storage","auth","can","pkgRouter","get","req","res","next","packageName","params","scope","package","getPackage","name","uplinksLook","callback","err","info","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","readme"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAGA;;AACA;;AACA;;AAIA;;;;AAMA,MAAMA,KAAK,GAAG,oBAAW,0BAAX,CAAd;AAEO,MAAMC,gBAAgB,GAAG,8BAAzB;;;AAEP,SAASC,eAAT,CAAyBC,OAAzB,EAA2CC,IAA3C,EAAgE;AAC9DJ,EAAAA,KAAK,CAAC,4BAAD,CAAL;AACA,QAAMK,GAAG,GAAG,uBAAMD,IAAN,CAAZ;AACA,QAAME,SAAS,GAAG,sBAAlB;AAA4B;;AAE5BA,EAAAA,SAAS,CAACC,GAAV,CACE,+CADF,EAEEF,GAAG,CAAC,QAAD,CAFL,EAGE,UAAUG,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACjFV,IAAAA,KAAK,CAAC,YAAD,CAAL;AACA,UAAMW,WAAW,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GAChB,wBAASL,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWE,OAAtC,CADgB,GAEhBN,GAAG,CAACI,MAAJ,CAAWE,OAFf;AAGAd,IAAAA,KAAK,CAAC,gBAAD,EAAmBW,WAAnB,CAAL,CALiF,CAOjF;;AACAR,IAAAA,OAAO,CAACY,UAAR,CAAmB;AACjBC,MAAAA,IAAI,EAAEL,WADW;AAEjBM,MAAAA,WAAW,EAAE,IAFI;AAGjBT,MAAAA,GAHiB;AAIjBU,MAAAA,QAAQ,EAAE,UAAUC,GAAV,EAAeC,IAAf,EAA2B;AACnCpB,QAAAA,KAAK,CAAC,eAAD,EAAkBoB,IAAlB,aAAkBA,IAAlB,uBAAkBA,IAAI,CAAEJ,IAAxB,CAAL;AACAP,QAAAA,GAAG,CAACY,GAAJ,CAAQC,kBAAYC,YAApB,EAAkCC,cAAQC,eAA1C;;AACA,YAAIN,GAAJ,EAAS;AACP,iBAAOT,IAAI,CAACS,GAAD,CAAX;AACD;;AACD,YAAI;AACFT,UAAAA,IAAI,CAAC,2BAAYU,IAAI,CAACJ,IAAjB,EAAuBI,IAAI,CAACM,MAA5B,CAAD,CAAJ;AACD,SAFD,CAEE,MAAM;AACNhB,UAAAA,IAAI,CAAC,qBAAeT,gBAAf,CAAD,CAAJ;AACD;AACF;AAfgB,KAAnB;AAiBD,GA5BH;AA8BA,SAAOK,SAAP;AACD;;eAEcJ,e","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 { Package } from '@verdaccio/types';\n\nimport { AuthorAvatar, addScope, parseReadme } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nexport type PackageExt = Package & { 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 function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n debug('readme hit');\n const packageName = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : req.params.package;\n debug('readme name %o', packageName);\n\n // @ts-ignore\n storage.getPackage({\n name: packageName,\n uplinksLook: true,\n req,\n callback: function (err, info): void {\n debug('readme pkg %o', info?.name);\n res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);\n if (err) {\n return next(err);\n }\n try {\n next(parseReadme(info.name, info.readme));\n } catch {\n next(sanitizyReadme(NOT_README_FOUND));\n }\n },\n });\n }\n );\n return pkgRouter;\n}\n\nexport default addReadmeWebApi;\n"],"file":"readme.js"}
|
package/build/api/search.js
CHANGED
|
@@ -9,78 +9,81 @@ var _debug = _interopRequireDefault(require("debug"));
|
|
|
9
9
|
|
|
10
10
|
var _express = require("express");
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
+
|
|
14
|
+
var _url = require("url");
|
|
13
15
|
|
|
14
|
-
var
|
|
16
|
+
var _core = require("@verdaccio/core");
|
|
15
17
|
|
|
16
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
19
|
|
|
18
20
|
const debug = (0, _debug.default)('verdaccio:web:api:search');
|
|
19
21
|
|
|
22
|
+
function checkAccess(pkg, auth, remoteUser) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
var _pkg$package;
|
|
25
|
+
|
|
26
|
+
auth.allow_access({
|
|
27
|
+
packageName: pkg === null || pkg === void 0 ? void 0 : (_pkg$package = pkg.package) === null || _pkg$package === void 0 ? void 0 : _pkg$package.name
|
|
28
|
+
}, remoteUser, function (err, allowed) {
|
|
29
|
+
if (err) {
|
|
30
|
+
if (err.status && String(err.status).match(/^4\d\d$/)) {
|
|
31
|
+
// auth plugin returns 4xx user error,
|
|
32
|
+
// that's equivalent of !allowed basically
|
|
33
|
+
allowed = false;
|
|
34
|
+
return resolve(null);
|
|
35
|
+
} else {
|
|
36
|
+
reject(err);
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
return resolve(allowed ? pkg : null);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
20
45
|
function addSearchWebApi(storage, auth) {
|
|
21
46
|
const router = (0, _express.Router)();
|
|
22
47
|
/* eslint new-cap: 0 */
|
|
23
48
|
|
|
24
|
-
const getPackageInfo = async function (name, remoteUser) {
|
|
25
|
-
return new Promise((resolve, reject) => {
|
|
26
|
-
debug('searching for %o', name);
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
// @ts-ignore
|
|
30
|
-
storage.getPackage({
|
|
31
|
-
name,
|
|
32
|
-
uplinksLook: false,
|
|
33
|
-
callback: (err, pkg) => {
|
|
34
|
-
debug('callback get package err %o', err === null || err === void 0 ? void 0 : err.message);
|
|
35
|
-
|
|
36
|
-
if (!err && pkg) {
|
|
37
|
-
debug('valid package %o', pkg === null || pkg === void 0 ? void 0 : pkg.name);
|
|
38
|
-
auth.allow_access({
|
|
39
|
-
packageName: pkg.name
|
|
40
|
-
}, remoteUser, function (err, allowed) {
|
|
41
|
-
debug('is allowed %o', allowed);
|
|
42
|
-
|
|
43
|
-
if (err || !allowed) {
|
|
44
|
-
debug('deny access');
|
|
45
|
-
reject(err);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
debug('access succeed');
|
|
50
|
-
resolve(pkg.versions[pkg[_core.DIST_TAGS].latest]);
|
|
51
|
-
});
|
|
52
|
-
} else {
|
|
53
|
-
reject(err);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
} catch (err) {
|
|
58
|
-
reject(err);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
|
|
63
49
|
router.get('/search/:anything', async function (req, res, next) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
50
|
+
try {
|
|
51
|
+
var _storage$searchManage;
|
|
52
|
+
|
|
53
|
+
let data;
|
|
54
|
+
const abort = new AbortController();
|
|
55
|
+
req.on('aborted', () => {
|
|
56
|
+
debug('search web aborted');
|
|
57
|
+
abort.abort();
|
|
58
|
+
});
|
|
59
|
+
const text = req.params.anything ?? ''; // These values are declared as optimal by npm cli
|
|
60
|
+
// FUTURE: could be overwritten by ui settings.
|
|
61
|
+
|
|
62
|
+
const size = 20;
|
|
63
|
+
const from = 0;
|
|
64
|
+
const query = {
|
|
65
|
+
from: 0,
|
|
66
|
+
maintenance: 0.5,
|
|
67
|
+
popularity: 0.98,
|
|
68
|
+
quality: 0.65,
|
|
69
|
+
size: 20,
|
|
70
|
+
text
|
|
71
|
+
}; // @ts-ignore
|
|
72
|
+
|
|
73
|
+
const urlParams = new _url.URLSearchParams(query);
|
|
74
|
+
debug('search web init');
|
|
75
|
+
data = await ((_storage$searchManage = storage.searchManager) === null || _storage$searchManage === void 0 ? void 0 : _storage$searchManage.search({
|
|
76
|
+
query,
|
|
77
|
+
url: `/-/v1/search?${urlParams.toString()}`,
|
|
78
|
+
abort
|
|
79
|
+
}));
|
|
80
|
+
const checkAccessPromises = await Promise.all(data.map(pkgItem => {
|
|
81
|
+
return checkAccess(pkgItem, auth, req.remote_user);
|
|
82
|
+
}));
|
|
83
|
+
const final = checkAccessPromises.filter(i => !_lodash.default.isNull(i)).slice(from, size);
|
|
84
|
+
next(final);
|
|
85
|
+
} catch (err) {
|
|
86
|
+
next(_core.errorUtils.getInternalError(err.message));
|
|
84
87
|
}
|
|
85
88
|
});
|
|
86
89
|
return router;
|
package/build/api/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/search.ts"],"names":["debug","
|
|
1
|
+
{"version":3,"sources":["../../src/api/search.ts"],"names":["debug","checkAccess","pkg","auth","remoteUser","Promise","resolve","reject","allow_access","packageName","package","name","err","allowed","status","String","match","addSearchWebApi","storage","router","get","req","res","next","data","abort","AbortController","on","text","params","anything","size","from","query","maintenance","popularity","quality","urlParams","URLSearchParams","searchManager","search","url","toString","checkAccessPromises","all","map","pkgItem","remote_user","final","filter","i","_","isNull","slice","errorUtils","getInternalError","message"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAGA;;;;AAOA,MAAMA,KAAK,GAAG,oBAAW,0BAAX,CAAd;;AAEA,SAASC,WAAT,CAAqBC,GAArB,EAA+BC,IAA/B,EAA0CC,UAA1C,EAAgF;AAC9E,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AAAA;;AACtCJ,IAAAA,IAAI,CAACK,YAAL,CAAkB;AAAEC,MAAAA,WAAW,EAAEP,GAAF,aAAEA,GAAF,uCAAEA,GAAG,CAAEQ,OAAP,iDAAE,aAAcC;AAA7B,KAAlB,EAAuDP,UAAvD,EAAmE,UAAUQ,GAAV,EAAeC,OAAf,EAAwB;AACzF,UAAID,GAAJ,EAAS;AACP,YAAIA,GAAG,CAACE,MAAJ,IAAcC,MAAM,CAACH,GAAG,CAACE,MAAL,CAAN,CAAmBE,KAAnB,CAAyB,SAAzB,CAAlB,EAAuD;AACrD;AACA;AACAH,UAAAA,OAAO,GAAG,KAAV;AACA,iBAAOP,OAAO,CAAC,IAAD,CAAd;AACD,SALD,MAKO;AACLC,UAAAA,MAAM,CAACK,GAAD,CAAN;AACD;AACF,OATD,MASO;AACL,eAAON,OAAO,CAACO,OAAO,GAAGX,GAAH,GAAS,IAAjB,CAAd;AACD;AACF,KAbD;AAcD,GAfM,CAAP;AAgBD;;AAED,SAASe,eAAT,CAAyBC,OAAzB,EAA2Cf,IAA3C,EAAgE;AAC9D,QAAMgB,MAAM,GAAG,sBAAf;AAAyB;;AACzBA,EAAAA,MAAM,CAACC,GAAP,CACE,mBADF,EAEE,gBACEC,GADF,EAEEC,GAFF,EAGEC,IAHF,EAIiB;AACf,QAAI;AAAA;;AACF,UAAIC,IAAJ;AACA,YAAMC,KAAK,GAAG,IAAIC,eAAJ,EAAd;AACAL,MAAAA,GAAG,CAACM,EAAJ,CAAO,SAAP,EAAkB,MAAM;AACtB3B,QAAAA,KAAK,CAAC,oBAAD,CAAL;AACAyB,QAAAA,KAAK,CAACA,KAAN;AACD,OAHD;AAIA,YAAMG,IAAY,GAAIP,GAAG,CAACQ,MAAJ,CAAWC,QAAZ,IAAmC,EAAxD,CAPE,CAQF;AACA;;AACA,YAAMC,IAAI,GAAG,EAAb;AACA,YAAMC,IAAI,GAAG,CAAb;AACA,YAAMC,KAAkB,GAAG;AACzBD,QAAAA,IAAI,EAAE,CADmB;AAEzBE,QAAAA,WAAW,EAAE,GAFY;AAGzBC,QAAAA,UAAU,EAAE,IAHa;AAIzBC,QAAAA,OAAO,EAAE,IAJgB;AAKzBL,QAAAA,IAAI,EAAE,EALmB;AAMzBH,QAAAA;AANyB,OAA3B,CAZE,CAoBF;;AACA,YAAMS,SAAS,GAAG,IAAIC,oBAAJ,CAAoBL,KAApB,CAAlB;AACAjC,MAAAA,KAAK,CAAC,iBAAD,CAAL;AACAwB,MAAAA,IAAI,GAAG,gCAAMN,OAAO,CAACqB,aAAd,0DAAM,sBAAuBC,MAAvB,CAA8B;AACzCP,QAAAA,KADyC;AAEzCQ,QAAAA,GAAG,EAAG,gBAAeJ,SAAS,CAACK,QAAV,EAAqB,EAFD;AAGzCjB,QAAAA;AAHyC,OAA9B,CAAN,CAAP;AAKA,YAAMkB,mBAAgD,GAAG,MAAMtC,OAAO,CAACuC,GAAR,CAC7DpB,IAAI,CAACqB,GAAL,CAAUC,OAAD,IAAa;AACpB,eAAO7C,WAAW,CAAC6C,OAAD,EAAU3C,IAAV,EAAgBkB,GAAG,CAAC0B,WAApB,CAAlB;AACD,OAFD,CAD6D,CAA/D;AAMA,YAAMC,KAAkC,GAAGL,mBAAmB,CAC3DM,MADwC,CAChCC,CAAD,IAAO,CAACC,gBAAEC,MAAF,CAASF,CAAT,CADyB,EAExCG,KAFwC,CAElCrB,IAFkC,EAE5BD,IAF4B,CAA3C;AAIAR,MAAAA,IAAI,CAACyB,KAAD,CAAJ;AACD,KAvCD,CAuCE,OAAOpC,GAAP,EAAiB;AACjBW,MAAAA,IAAI,CAAC+B,iBAAWC,gBAAX,CAA4B3C,GAAG,CAAC4C,OAAhC,CAAD,CAAJ;AACD;AACF,GAjDH;AAmDA,SAAOrC,MAAP;AACD;;eAEcF,e","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.searchManager?.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"],"file":"search.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare function loadTheme(config: any): any;
|
|
2
|
-
export declare function renderWebMiddleware(config: any, auth: any
|
|
2
|
+
export declare function renderWebMiddleware(config: any, auth: any): any;
|
|
@@ -18,8 +18,6 @@ var _core = require("@verdaccio/core");
|
|
|
18
18
|
|
|
19
19
|
var _loaders = require("@verdaccio/loaders");
|
|
20
20
|
|
|
21
|
-
var _store = require("@verdaccio/store");
|
|
22
|
-
|
|
23
21
|
var _url = require("@verdaccio/url");
|
|
24
22
|
|
|
25
23
|
var _renderHTML = _interopRequireDefault(require("../renderHTML"));
|
|
@@ -50,7 +48,7 @@ const sendFileCallback = next => err => {
|
|
|
50
48
|
}
|
|
51
49
|
};
|
|
52
50
|
|
|
53
|
-
function renderWebMiddleware(config, auth
|
|
51
|
+
function renderWebMiddleware(config, auth) {
|
|
54
52
|
var _config$web;
|
|
55
53
|
|
|
56
54
|
const {
|
|
@@ -60,11 +58,8 @@ function renderWebMiddleware(config, auth, storage) {
|
|
|
60
58
|
} = require('@verdaccio/ui-theme')();
|
|
61
59
|
|
|
62
60
|
debug('static path %o', staticPath);
|
|
63
|
-
|
|
64
|
-
_store.SearchInstance.configureStorage(storage);
|
|
65
61
|
/* eslint new-cap:off */
|
|
66
62
|
|
|
67
|
-
|
|
68
63
|
const router = _express.default.Router();
|
|
69
64
|
|
|
70
65
|
router.use(auth.webUIJWTmiddleware());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/render-web.ts"],"names":["debug","loadTheme","config","_","isNil","theme","head","plugin","isString","sendFileCallback","next","err","status","HTTP_STATUS","NOT_FOUND","renderWebMiddleware","auth","
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/render-web.ts"],"names":["debug","loadTheme","config","_","isNil","theme","head","plugin","isString","sendFileCallback","next","err","status","HTTP_STATUS","NOT_FOUND","renderWebMiddleware","auth","staticPath","manifest","manifestFiles","require","router","express","Router","use","webUIJWTmiddleware","setSecurityWebHeaders","logoURI","web","logo","path","posix","join","basename","get","req","res","sendFile","resolve","filename","params","file"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { loadPlugin } from '@verdaccio/loaders';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport renderHTML from '../renderHTML';\nimport { setSecurityWebHeaders } from './security';\n\nconst debug = buildDebug('verdaccio:web:render');\n\nexport function loadTheme(config) {\n if (_.isNil(config.theme) === false) {\n return _.head(\n loadPlugin(\n config,\n config.theme,\n {},\n function (plugin) {\n return _.isString(plugin);\n },\n 'verdaccio-theme'\n )\n );\n }\n}\n\nconst sendFileCallback = (next) => (err) => {\n if (!err) {\n return;\n }\n if (err.status === HTTP_STATUS.NOT_FOUND) {\n next();\n } else {\n next(err);\n }\n};\n\nexport function renderWebMiddleware(config, auth): any {\n const { staticPath, manifest, manifestFiles } = require('@verdaccio/ui-theme')();\n debug('static path %o', staticPath);\n\n /* eslint new-cap:off */\n const router = express.Router();\n router.use(auth.webUIJWTmiddleware());\n router.use(setSecurityWebHeaders);\n\n // Logo\n let logoURI = config?.web?.logo ?? '';\n if (logoURI && !isURLhasValidProtocol(logoURI)) {\n // URI related to a local file\n\n // Note: `path.join` will break on Windows, because it transforms `/` to `\\`\n // Use POSIX version `path.posix.join` instead.\n logoURI = path.posix.join('/-/static/', path.basename(logoURI));\n router.get(logoURI, function (req, res, next) {\n res.sendFile(path.resolve(config.web.logo), sendFileCallback(next));\n debug('render static');\n });\n }\n\n // Static\n router.get('/-/static/*', function (req, res, next) {\n const filename = req.params[0];\n const file = `${staticPath}/${filename}`;\n debug('render static file %o', file);\n res.sendFile(file, sendFileCallback(next));\n });\n\n router.get('/-/web/:section/*', function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render html section');\n });\n\n router.get('/', function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render root');\n });\n\n return router;\n}\n"],"file":"render-web.js"}
|
|
@@ -11,8 +11,6 @@ var _express = require("express");
|
|
|
11
11
|
|
|
12
12
|
var _middleware = require("@verdaccio/middleware");
|
|
13
13
|
|
|
14
|
-
var _store = require("@verdaccio/store");
|
|
15
|
-
|
|
16
14
|
var _api = _interopRequireDefault(require("../api"));
|
|
17
15
|
|
|
18
16
|
var _security = require("./security");
|
|
@@ -21,12 +19,9 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
21
19
|
|
|
22
20
|
function webAPI(config, auth, storage) {
|
|
23
21
|
// eslint-disable-next-line new-cap
|
|
24
|
-
const route = (0, _express.Router)();
|
|
25
|
-
|
|
26
|
-
_store.SearchInstance.configureStorage(storage); // validate all of these params as a package name
|
|
22
|
+
const route = (0, _express.Router)(); // validate all of these params as a package name
|
|
27
23
|
// this might be too harsh, so ask if it causes trouble=
|
|
28
24
|
|
|
29
|
-
|
|
30
25
|
route.param('package', _middleware.validatePackage);
|
|
31
26
|
route.param('filename', _middleware.validateName);
|
|
32
27
|
route.param('version', _middleware.validateName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/web-api.ts"],"names":["webAPI","config","auth","storage","route","
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/web-api.ts"],"names":["webAPI","config","auth","storage","route","param","validatePackage","validateName","use","bodyParser","urlencoded","extended","webUIJWTmiddleware","setSecurityWebHeaders"],"mappings":";;;;;;;AAAA;;AACA;;AAGA;;AAIA;;AACA;;;;AAEO,SAASA,MAAT,CAAgBC,MAAhB,EAAgCC,IAAhC,EAA6CC,OAA7C,EAAuE;AAC5E;AACA,QAAMC,KAAK,GAAG,sBAAd,CAF4E,CAG5E;AACA;;AACAA,EAAAA,KAAK,CAACC,KAAN,CAAY,SAAZ,EAAuBC,2BAAvB;AACAF,EAAAA,KAAK,CAACC,KAAN,CAAY,UAAZ,EAAwBE,wBAAxB;AACAH,EAAAA,KAAK,CAACC,KAAN,CAAY,SAAZ,EAAuBE,wBAAvB;AACAH,EAAAA,KAAK,CAACC,KAAN,CAAY,UAAZ,EAAwB,uBAAM,IAAN,CAAxB;AACAD,EAAAA,KAAK,CAACI,GAAN,CAAUC,oBAAWC,UAAX,CAAsB;AAAEC,IAAAA,QAAQ,EAAE;AAAZ,GAAtB,CAAV;AACAP,EAAAA,KAAK,CAACI,GAAN,CAAUN,IAAI,CAACU,kBAAL,EAAV;AACAR,EAAAA,KAAK,CAACI,GAAN,CAAUK,+BAAV;AACAT,EAAAA,KAAK,CAACI,GAAN,CAAU,kBAAgBN,IAAhB,EAAsBC,OAAtB,EAA+BF,MAA/B,CAAV;AACA,SAAOG,KAAP;AACD","sourcesContent":["import bodyParser from 'body-parser';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { match, validateName, validatePackage } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Config } from '@verdaccio/types';\n\nimport webEndpointsApi from '../api';\nimport { setSecurityWebHeaders } from './security';\n\nexport function webAPI(config: Config, auth: IAuth, storage: Storage): Router {\n // eslint-disable-next-line new-cap\n const route = Router();\n // validate all of these params as a package name\n // this might be too harsh, so ask if it causes trouble=\n route.param('package', validatePackage);\n route.param('filename', validateName);\n route.param('version', validateName);\n route.param('anything', match(/.*/));\n route.use(bodyParser.urlencoded({ extended: false }));\n route.use(auth.webUIJWTmiddleware());\n route.use(setSecurityWebHeaders);\n route.use(webEndpointsApi(auth, storage, config));\n return route;\n}\n"],"file":"web-api.js"}
|
package/build/renderHTML.js
CHANGED
|
@@ -52,6 +52,8 @@ function renderHTML(config, manifest, manifestFiles, req, res) {
|
|
|
52
52
|
const logoURI = (config === null || config === void 0 ? void 0 : (_config$web4 = config.web) === null || _config$web4 === void 0 ? void 0 : _config$web4.logo) ?? '';
|
|
53
53
|
const pkgManagers = (config === null || config === void 0 ? void 0 : (_config$web5 = config.web) === null || _config$web5 === void 0 ? void 0 : _config$web5.pkgManagers) ?? ['yarn', 'pnpm', 'npm'];
|
|
54
54
|
const version = pkgJSON.version;
|
|
55
|
+
const flags = { ...config.flags
|
|
56
|
+
};
|
|
55
57
|
const primaryColor = (0, _webUtils.validatePrimaryColor)(config === null || config === void 0 ? void 0 : (_config$web6 = config.web) === null || _config$web6 === void 0 ? void 0 : _config$web6.primary_color) ?? '#4b5e40';
|
|
56
58
|
const {
|
|
57
59
|
scriptsBodyAfter,
|
|
@@ -70,6 +72,7 @@ function renderHTML(config, manifest, manifestFiles, req, res) {
|
|
|
70
72
|
primaryColor,
|
|
71
73
|
version,
|
|
72
74
|
logoURI,
|
|
75
|
+
flags,
|
|
73
76
|
login,
|
|
74
77
|
pkgManagers,
|
|
75
78
|
title,
|
package/build/renderHTML.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderHTML.ts"],"names":["pkgJSON","require","DEFAULT_LANGUAGE","cache","LRU","max","maxAge","debug","defaultManifestFiles","js","ico","renderHTML","config","manifest","manifestFiles","req","res","url_prefix","base","basename","URL","pathname","language","i18n","web","darkMode","title","WEB_TITLE","login","scope","logoURI","logo","pkgManagers","version","primaryColor","primary_color","scriptsBodyAfter","metaScripts","scriptsbodyBefore","Object","assign","bodyBefore","options","webPage","get","set","error","Error","stack","setHeader","HEADERS","TEXT_HTML","send"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;
|
|
1
|
+
{"version":3,"sources":["../src/renderHTML.ts"],"names":["pkgJSON","require","DEFAULT_LANGUAGE","cache","LRU","max","maxAge","debug","defaultManifestFiles","js","ico","renderHTML","config","manifest","manifestFiles","req","res","url_prefix","base","basename","URL","pathname","language","i18n","web","darkMode","title","WEB_TITLE","login","scope","logoURI","logo","pkgManagers","version","flags","primaryColor","primary_color","scriptsBodyAfter","metaScripts","scriptsbodyBefore","Object","assign","bodyBefore","options","webPage","get","set","error","Error","stack","setHeader","HEADERS","TEXT_HTML","send"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport LRU from 'lru-cache';\nimport { URL } from 'url';\n\nimport { WEB_TITLE } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\nimport { TemplateUIOptions } from '@verdaccio/types';\nimport { getPublicUrl } from '@verdaccio/url';\n\nimport renderTemplate from './template';\nimport { hasLogin, validatePrimaryColor } from './utils/web-utils';\n\nconst pkgJSON = require('../package.json');\nconst DEFAULT_LANGUAGE = 'es-US';\nconst cache = new LRU({ max: 500, maxAge: 1000 * 60 * 60 });\n\nconst debug = buildDebug('verdaccio:web:render');\n\nconst defaultManifestFiles = {\n js: ['runtime.js', 'vendors.js', 'main.js'],\n ico: 'favicon.ico',\n};\n\nexport default function renderHTML(config, manifest, manifestFiles, req, res) {\n const { url_prefix } = config;\n const base = getPublicUrl(config?.url_prefix, req);\n const basename = new URL(base).pathname;\n const language = config?.i18n?.web ?? DEFAULT_LANGUAGE;\n const darkMode = config?.web?.darkMode ?? false;\n const title = config?.web?.title ?? WEB_TITLE;\n const login = hasLogin(config);\n const scope = config?.web?.scope ?? '';\n const logoURI = config?.web?.logo ?? '';\n const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm'];\n const version = pkgJSON.version;\n const flags = {\n ...config.flags,\n };\n const primaryColor = validatePrimaryColor(config?.web?.primary_color) ?? '#4b5e40';\n const { scriptsBodyAfter, metaScripts, scriptsbodyBefore } = Object.assign(\n {},\n {\n scriptsBodyAfter: [],\n bodyBefore: [],\n metaScripts: [],\n },\n config?.web\n );\n const options: TemplateUIOptions = {\n darkMode,\n url_prefix,\n basename,\n base,\n primaryColor,\n version,\n logoURI,\n flags,\n login,\n pkgManagers,\n title,\n scope,\n language,\n };\n\n let webPage;\n\n try {\n webPage = cache.get('template');\n\n if (!webPage) {\n debug('web options %o', options);\n debug('web manifestFiles %o', manifestFiles);\n webPage = renderTemplate(\n {\n manifest: manifestFiles ?? defaultManifestFiles,\n options,\n scriptsBodyAfter,\n metaScripts,\n scriptsbodyBefore,\n },\n manifest\n );\n debug('template :: %o', webPage);\n cache.set('template', webPage);\n debug('set template cache');\n } else {\n debug('reuse template cache');\n }\n } catch (error: any) {\n throw new Error(`theme could not be load, stack ${error.stack}`);\n }\n res.setHeader('Content-Type', HEADERS.TEXT_HTML);\n res.send(webPage);\n debug('render web');\n}\n"],"file":"renderHTML.js"}
|
package/build/web-middleware.js
CHANGED
|
@@ -18,7 +18,7 @@ var _default = (config, auth, storage) => {
|
|
|
18
18
|
const app = _express.default.Router(); // load application
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
app.use('/', (0, _renderWeb.renderWebMiddleware)(config, auth
|
|
21
|
+
app.use('/', (0, _renderWeb.renderWebMiddleware)(config, auth)); // web endpoints, search, packages, etc
|
|
22
22
|
|
|
23
23
|
app.use('/-/verdaccio/', (0, _webApi.webAPI)(config, auth, storage));
|
|
24
24
|
return app;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/web-middleware.ts"],"names":["config","auth","storage","app","express","Router","use"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;;;eAEe,CAACA,MAAD,EAASC,IAAT,EAAeC,OAAf,KAA2B;AACxC;AACA,QAAMC,GAAG,GAAGC,iBAAQC,MAAR,EAAZ,CAFwC,CAGxC;;;AACAF,EAAAA,GAAG,CAACG,GAAJ,CAAQ,GAAR,EAAa,oCAAoBN,MAApB,EAA4BC,IAA5B,
|
|
1
|
+
{"version":3,"sources":["../src/web-middleware.ts"],"names":["config","auth","storage","app","express","Router","use"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;;;eAEe,CAACA,MAAD,EAASC,IAAT,EAAeC,OAAf,KAA2B;AACxC;AACA,QAAMC,GAAG,GAAGC,iBAAQC,MAAR,EAAZ,CAFwC,CAGxC;;;AACAF,EAAAA,GAAG,CAACG,GAAJ,CAAQ,GAAR,EAAa,oCAAoBN,MAApB,EAA4BC,IAA5B,CAAb,EAJwC,CAKxC;;AACAE,EAAAA,GAAG,CAACG,GAAJ,CAAQ,eAAR,EAAyB,oBAAON,MAAP,EAAeC,IAAf,EAAqBC,OAArB,CAAzB;AACA,SAAOC,GAAP;AACD,C","sourcesContent":["import express from 'express';\n\nimport { renderWebMiddleware } from './middleware/render-web';\nimport { webAPI } from './middleware/web-api';\n\nexport default (config, auth, storage) => {\n // eslint-disable-next-line new-cap\n const app = express.Router();\n // load application\n app.use('/', renderWebMiddleware(config, auth));\n // web endpoints, search, packages, etc\n app.use('/-/verdaccio/', webAPI(config, auth, storage));\n return app;\n};\n"],"file":"web-middleware.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdaccio/web",
|
|
3
|
-
"version": "6.0.0-6-next.
|
|
3
|
+
"version": "6.0.0-6-next.27",
|
|
4
4
|
"description": "web ui middleware",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
},
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@verdaccio/auth": "6.0.0-6-next.
|
|
29
|
-
"@verdaccio/core": "6.0.0-6-next.
|
|
30
|
-
"@verdaccio/config": "6.0.0-6-next.
|
|
31
|
-
"@verdaccio/loaders": "6.0.0-6-next.
|
|
32
|
-
"@verdaccio/logger": "6.0.0-6-next.
|
|
33
|
-
"@verdaccio/middleware": "6.0.0-6-next.
|
|
28
|
+
"@verdaccio/auth": "6.0.0-6-next.21",
|
|
29
|
+
"@verdaccio/core": "6.0.0-6-next.5",
|
|
30
|
+
"@verdaccio/config": "6.0.0-6-next.13",
|
|
31
|
+
"@verdaccio/loaders": "6.0.0-6-next.12",
|
|
32
|
+
"@verdaccio/logger": "6.0.0-6-next.11",
|
|
33
|
+
"@verdaccio/middleware": "6.0.0-6-next.21",
|
|
34
34
|
"@verdaccio/readme": "11.0.0-6-next.4",
|
|
35
|
-
"@verdaccio/store": "6.0.0-6-next.
|
|
36
|
-
"@verdaccio/tarball": "11.0.0-6-next.
|
|
37
|
-
"@verdaccio/url": "11.0.0-6-next.
|
|
38
|
-
"@verdaccio/utils": "6.0.0-6-next.
|
|
35
|
+
"@verdaccio/store": "6.0.0-6-next.21",
|
|
36
|
+
"@verdaccio/tarball": "11.0.0-6-next.12",
|
|
37
|
+
"@verdaccio/url": "11.0.0-6-next.9",
|
|
38
|
+
"@verdaccio/utils": "6.0.0-6-next.11",
|
|
39
39
|
"body-parser": "1.19.1",
|
|
40
40
|
"debug": "4.3.3",
|
|
41
41
|
"express": "4.17.2",
|
|
@@ -44,11 +44,15 @@
|
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "16.11.21",
|
|
47
|
-
"@verdaccio/types": "11.0.0-6-next.
|
|
47
|
+
"@verdaccio/types": "11.0.0-6-next.11",
|
|
48
|
+
"@verdaccio/test-helper": "1.1.0-6-next.0",
|
|
49
|
+
"@verdaccio/api": "6.0.0-6-next.24",
|
|
48
50
|
"node-html-parser": "4.1.5",
|
|
49
51
|
"supertest": "6.2.2",
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
+
"nock": "13.2.2",
|
|
53
|
+
"undici": "4.15.0",
|
|
54
|
+
"verdaccio-auth-memory": "11.0.0-6-next.8",
|
|
55
|
+
"verdaccio-memory": "11.0.0-6-next.9"
|
|
52
56
|
},
|
|
53
57
|
"funding": {
|
|
54
58
|
"type": "opencollective",
|
|
@@ -56,7 +60,7 @@
|
|
|
56
60
|
},
|
|
57
61
|
"scripts": {
|
|
58
62
|
"clean": "rimraf ./build",
|
|
59
|
-
"test": "cross-env NODE_ENV=test
|
|
63
|
+
"test": "cross-env NODE_ENV=test DEBUG=verdaccido* jest -u",
|
|
60
64
|
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
|
61
65
|
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
|
|
62
66
|
"build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
|
package/src/api/readme.ts
CHANGED
|
@@ -39,12 +39,11 @@ function addReadmeWebApi(storage: Storage, auth: IAuth): Router {
|
|
|
39
39
|
uplinksLook: true,
|
|
40
40
|
req,
|
|
41
41
|
callback: function (err, info): void {
|
|
42
|
-
debug('readme
|
|
42
|
+
debug('readme pkg %o', info?.name);
|
|
43
|
+
res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);
|
|
43
44
|
if (err) {
|
|
44
45
|
return next(err);
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);
|
|
48
47
|
try {
|
|
49
48
|
next(parseReadme(info.name, info.readme));
|
|
50
49
|
} catch {
|