@verdaccio/web 6.0.0-6-next.29 → 6.0.0-6-next.32

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 CHANGED
@@ -1,5 +1,101 @@
1
1
  # @verdaccio/web
2
2
 
3
+ ## 6.0.0-6-next.32
4
+
5
+ ### Patch Changes
6
+
7
+ - 351aeeaa: fix(deps): @verdaccio/utils should be a prod dep of local-storage
8
+ - Updated dependencies [351aeeaa]
9
+ - @verdaccio/auth@6.0.0-6-next.24
10
+ - @verdaccio/core@6.0.0-6-next.7
11
+ - @verdaccio/readme@11.0.0-6-next.6
12
+ - @verdaccio/tarball@11.0.0-6-next.14
13
+ - @verdaccio/url@11.0.0-6-next.11
14
+ - @verdaccio/loaders@6.0.0-6-next.14
15
+ - @verdaccio/logger@6.0.0-6-next.13
16
+ - @verdaccio/store@6.0.0-6-next.25
17
+ - @verdaccio/middleware@6.0.0-6-next.24
18
+ - @verdaccio/config@6.0.0-6-next.16
19
+ - @verdaccio/utils@6.0.0-6-next.13
20
+
21
+ ## 6.0.0-6-next.31
22
+
23
+ ### Minor Changes
24
+
25
+ - 37274e4c: feat: implement abbreviated manifest
26
+
27
+ Enable abbreviated manifest data by adding the header:
28
+
29
+ ```
30
+ curl -H "Accept: application/vnd.npm.install-v1+json" https://registry.npmjs.org/verdaccio
31
+ ```
32
+
33
+ It returns a filtered manifest, additionally includes the [time](https://github.com/pnpm/rfcs/pull/2) field by request.
34
+
35
+ Current support for packages managers:
36
+
37
+ - npm: yes
38
+ - pnpm: yes
39
+ - yarn classic: yes
40
+ - yarn modern (+2.x): [no](https://github.com/yarnpkg/berry/pull/3981#issuecomment-1076566096)
41
+
42
+ https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-metadata-format
43
+
44
+ ### Patch Changes
45
+
46
+ - Updated dependencies [37274e4c]
47
+ - @verdaccio/store@6.0.0-6-next.24
48
+ - @verdaccio/auth@6.0.0-6-next.23
49
+ - @verdaccio/core@6.0.0-6-next.6
50
+ - @verdaccio/readme@11.0.0-6-next.5
51
+ - @verdaccio/tarball@11.0.0-6-next.13
52
+ - @verdaccio/url@11.0.0-6-next.10
53
+ - @verdaccio/loaders@6.0.0-6-next.13
54
+ - @verdaccio/logger@6.0.0-6-next.12
55
+
56
+ ## 6.0.0-6-next.30
57
+
58
+ ### Major Changes
59
+
60
+ - 292c0a37: feat!: replace deprecated request dependency by got
61
+
62
+ 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.
63
+
64
+ ## Notes
65
+
66
+ - Remove deprecated `request` by other `got`, retry improved, custom Agent ( got does not include it built-in)
67
+ - Remove `async` dependency from storage (used by core) it was linked with proxy somehow safe to remove now
68
+ - Refactor with promises instead callback wherever is possible
69
+ - ~Document the API~
70
+ - Improve testing, integration tests
71
+ - Bugfix
72
+ - Clean up old validations
73
+ - Improve performance
74
+
75
+ ## 💥 Breaking changes
76
+
77
+ - Plugin API methods were callbacks based are returning promises, this will break current storage plugins, check documentation for upgrade.
78
+ - 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));`
79
+ - `@verdaccio/streams` stream abort support is legacy is being deprecated removed
80
+ - Remove AWS and Google Cloud packages for future refactoring [#2574](https://github.com/verdaccio/verdaccio/pull/2574).
81
+
82
+ ### Patch Changes
83
+
84
+ - Updated dependencies [292c0a37]
85
+ - Updated dependencies [a3a209b5]
86
+ - Updated dependencies [00d1d2a1]
87
+ - @verdaccio/auth@6.0.0-6-next.23
88
+ - @verdaccio/config@6.0.0-6-next.15
89
+ - @verdaccio/core@6.0.0-6-next.6
90
+ - @verdaccio/readme@11.0.0-6-next.5
91
+ - @verdaccio/tarball@11.0.0-6-next.13
92
+ - @verdaccio/url@11.0.0-6-next.10
93
+ - @verdaccio/loaders@6.0.0-6-next.13
94
+ - @verdaccio/logger@6.0.0-6-next.12
95
+ - @verdaccio/middleware@6.0.0-6-next.23
96
+ - @verdaccio/store@6.0.0-6-next.23
97
+ - @verdaccio/utils@6.0.0-6-next.12
98
+
3
99
  ## 6.0.0-6-next.29
4
100
 
5
101
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/index.ts"],"names":["auth","storage","config","route","use"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;eAEe,CAACA,IAAD,EAAOC,OAAP,EAAgBC,MAAhB,KAA2B;AACxC,QAAMC,KAAK,GAAG,sBAAd;AAAwB;;AACxBA,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,sBAAWH,OAAX,EAAoBD,IAApB,EAA0BE,MAA1B,CAApB;AACAC,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,qBAAOH,OAAP,EAAgBD,IAAhB,CAApB;AACAG,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,sBAAQF,MAAR,EAAgBD,OAAhB,EAAyBD,IAAzB,CAApB;AACAG,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,qBAAOH,OAAP,EAAgBD,IAAhB,CAApB;;AACA,MAAI,wBAASE,MAAT,CAAJ,EAAsB;AACpBC,IAAAA,KAAK,CAACC,GAAN,CAAU,OAAV,EAAmB,mBAAKJ,IAAL,EAAWE,MAAX,CAAnB;AACD;;AACD,SAAOC,KAAP;AACD,C","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"],"file":"index.js"}
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"}
@@ -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, Package } from '@verdaccio/types';
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;
@@ -80,70 +80,67 @@ function addPackageWebApi(storage, auth, config) {
80
80
  } catch (err) {
81
81
  reject(err);
82
82
  }
83
- }); // Get list of all visible package
84
-
83
+ });
85
84
 
86
- pkgRouter.get('/packages', function (req, res, next) {
87
- debug('hit package web api %o');
88
- storage.getLocalDatabase(async function (err, packages) {
89
- var _config$web2;
85
+ async function processPackages(packages = [], req) {
86
+ const permissions = [];
87
+ const packagesToProcess = packages.slice();
88
+ debug('process packages %o', packagesToProcess);
90
89
 
91
- if (err) {
92
- throw err;
93
- }
90
+ for (const pkg of packagesToProcess) {
91
+ const pkgCopy = { ...pkg
92
+ };
93
+ pkgCopy.author = (0, _utils.formatAuthor)(pkg.author);
94
94
 
95
- async function processPackages(packages = []) {
96
- const permissions = [];
97
- const packagesToProcess = packages.slice();
98
- debug('process packages %o', packagesToProcess);
99
-
100
- for (const pkg of packagesToProcess) {
101
- const pkgCopy = { ...pkg
102
- };
103
- pkgCopy.author = (0, _utils.formatAuthor)(pkg.author);
104
-
105
- try {
106
- if (await checkAllow(pkg.name, req.remote_user)) {
107
- if (config.web) {
108
- pkgCopy.author.avatar = (0, _utils.generateGravatarUrl)(pkgCopy.author.email, config.web.gravatar);
109
- } // convert any remote dist to a local reference
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.error({
118
+ name: pkg.name,
119
+ error: err
120
+ }, 'permission process for @{name} has failed: @{error}');
134
121
 
135
- return permissions;
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
- try {
142
- next((0, _webUtils.sortByName)(await processPackages(packages), order));
143
- } catch (error) {
144
- next(error);
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
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/package.ts"],"names":["getOrder","order","debug","addPackageWebApi","storage","auth","config","isLoginEnabled","web","login","pkgRouter","anonymousRemoteUser","name","undefined","real_groups","groups","checkAllow","remoteUser","Promise","resolve","reject","allow_access","packageName","err","allowed","get","req","res","next","getLocalDatabase","packages","processPackages","permissions","packagesToProcess","slice","pkg","pkgCopy","author","remote_user","avatar","email","gravatar","_","isNil","dist","isNull","tarball","protocol","headers","host","hostname","url_prefix","push","logger","error","sort_packages"],"mappings":"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","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, Package, RemoteUser } from '@verdaccio/types';\nimport { formatAuthor, generateGravatarUrl } from '@verdaccio/utils';\n\nimport { AuthorAvatar, 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\nexport type PackageExt = Package & { author: AuthorAvatar; dist?: { tarball: string } };\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 // Get list of all visible package\n pkgRouter.get(\n '/packages',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n debug('hit package web api %o');\n storage.getLocalDatabase(async function (err, packages): Promise<void> {\n if (err) {\n throw err;\n }\n async function processPackages(packages: PackageExt[] = []): Promise<PackageExt[]> {\n const permissions: PackageExt[] = [];\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 pkgCopy.author.avatar = generateGravatarUrl(\n pkgCopy.author.email,\n config.web.gravatar\n );\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 const order = getOrder(config?.web?.sort_packages);\n debug('order %o', order);\n\n try {\n next(sortByName(await processPackages(packages), order));\n } catch (error: any) {\n next(error);\n }\n });\n }\n );\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"file":"package.js"}
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.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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"}
@@ -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 { Package } from '@verdaccio/types';
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 = Package & {
8
+ export declare type PackageExt = Manifest & {
9
9
  author: AuthorAvatar;
10
10
  dist?: {
11
11
  tarball: string;
@@ -47,30 +47,36 @@ 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 packageName = req.params.scope ? (0, _webUtils.addScope)(req.params.scope, req.params.package) : req.params.package;
53
- debug('readme name %o', packageName); // @ts-ignore
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
- storage.getPackage({
56
- name: packageName,
57
- uplinksLook: true,
58
- req,
59
- callback: function (err, info) {
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);
62
+ try {
63
+ const manifest = await storage.getPackageByOptions({
64
+ name,
65
+ uplinksLook: true,
66
+ abbreviated: false,
67
+ requestOptions
68
+ });
69
+ debug('readme pkg %o', manifest === null || manifest === void 0 ? void 0 : manifest.name);
70
+ res.set(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.TEXT_PLAIN_UTF8);
62
71
 
63
- if (err) {
64
- return next(err);
65
- }
66
-
67
- try {
68
- next((0, _webUtils.parseReadme)(info.name, info.readme));
69
- } catch {
70
- next((0, _readme.default)(NOT_README_FOUND));
71
- }
72
+ try {
73
+ next((0, _webUtils.parseReadme)(manifest.name, manifest.readme));
74
+ } catch {
75
+ next((0, _readme.default)(NOT_README_FOUND));
72
76
  }
73
- });
77
+ } catch (err) {
78
+ next(err);
79
+ }
74
80
  });
75
81
  return pkgRouter;
76
82
  }
@@ -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;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"}
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","abbreviated","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 abbreviated: false,\n requestOptions,\n })) as Manifest;\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,GAAI,MAAMrB,OAAO,CAACsB,mBAAR,CAA4B;QAClDZ,IADkD;QAElDa,WAAW,EAAE,IAFqC;QAGlDC,WAAW,EAAE,KAHqC;QAIlDT;MAJkD,CAA5B,CAAxB;MAMAnB,KAAK,CAAC,eAAD,EAAkByB,QAAlB,aAAkBA,QAAlB,uBAAkBA,QAAQ,CAAEX,IAA5B,CAAL;MACAF,GAAG,CAACiB,GAAJ,CAAQC,iBAAA,CAAYC,YAApB,EAAkCC,aAAA,CAAQC,eAA1C;;MACA,IAAI;QACFpB,IAAI,CAAC,IAAAqB,qBAAA,EAAYT,QAAQ,CAACX,IAArB,EAA2BW,QAAQ,CAACU,MAApC,CAAD,CAAJ;MACD,CAFD,CAEE,MAAM;QACNtB,IAAI,CAAC,IAAAuB,eAAA,EAAelC,gBAAf,CAAD,CAAJ;MACD;IACF,CAdD,CAcE,OAAOmC,GAAP,EAAY;MACZxB,IAAI,CAACwB,GAAD,CAAJ;IACD;EACF,CArCH;EAuCA,OAAO7B,SAAP;AACD;;eAEcL,e"}
@@ -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 ((_storage$searchManage = storage.searchManager) === null || _storage$searchManage === void 0 ? void 0 : _storage$searchManage.search({
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
@@ -1 +1 @@
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":"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","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
+ {"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":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAGA;;;;AAOA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,0BAAX,CAAd;;AAEA,SAASC,WAAT,CAAqBC,GAArB,EAA+BC,IAA/B,EAA0CC,UAA1C,EAAgF;EAC9E,OAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;IAAA;;IACtCJ,IAAI,CAACK,YAAL,CAAkB;MAAEC,WAAW,EAAEP,GAAF,aAAEA,GAAF,uCAAEA,GAAG,CAAEQ,OAAP,iDAAE,aAAcC;IAA7B,CAAlB,EAAuDP,UAAvD,EAAmE,UAAUQ,GAAV,EAAeC,OAAf,EAAwB;MACzF,IAAID,GAAJ,EAAS;QACP,IAAIA,GAAG,CAACE,MAAJ,IAAcC,MAAM,CAACH,GAAG,CAACE,MAAL,CAAN,CAAmBE,KAAnB,CAAyB,SAAzB,CAAlB,EAAuD;UACrD;UACA;UACAH,OAAO,GAAG,KAAV;UACA,OAAOP,OAAO,CAAC,IAAD,CAAd;QACD,CALD,MAKO;UACLC,MAAM,CAACK,GAAD,CAAN;QACD;MACF,CATD,MASO;QACL,OAAON,OAAO,CAACO,OAAO,GAAGX,GAAH,GAAS,IAAjB,CAAd;MACD;IACF,CAbD;EAcD,CAfM,CAAP;AAgBD;;AAED,SAASe,eAAT,CAAyBC,OAAzB,EAA2Cf,IAA3C,EAAgE;EAC9D,MAAMgB,MAAM,GAAG,IAAAC,eAAA,GAAf;EAAyB;;EACzBD,MAAM,CAACE,GAAP,CACE,mBADF,EAEE,gBACEC,GADF,EAEEC,GAFF,EAGEC,IAHF,EAIiB;IACf,IAAI;MACF,IAAIC,IAAJ;MACA,MAAMC,KAAK,GAAG,IAAIC,eAAJ,EAAd;MACAL,GAAG,CAACM,EAAJ,CAAO,SAAP,EAAkB,MAAM;QACtB7B,KAAK,CAAC,oBAAD,CAAL;QACA2B,KAAK,CAACA,KAAN;MACD,CAHD;MAIA,MAAMG,IAAY,GAAIP,GAAG,CAACQ,MAAJ,CAAWC,QAAZ,IAAmC,EAAxD,CAPE,CAQF;MACA;;MACA,MAAMC,IAAI,GAAG,EAAb;MACA,MAAMC,IAAI,GAAG,CAAb;MACA,MAAMC,KAAkB,GAAG;QACzBD,IAAI,EAAE,CADmB;QAEzBE,WAAW,EAAE,GAFY;QAGzBC,UAAU,EAAE,IAHa;QAIzBC,OAAO,EAAE,IAJgB;QAKzBL,IAAI,EAAE,EALmB;QAMzBH;MANyB,CAA3B,CAZE,CAoBF;;MACA,MAAMS,SAAS,GAAG,IAAIC,oBAAJ,CAAoBL,KAApB,CAAlB;MACAnC,KAAK,CAAC,iBAAD,CAAL;MACA0B,IAAI,GAAG,OAAMP,OAAN,aAAMA,OAAN,uBAAMA,OAAO,CAAEsB,MAAT,CAAgB;QAC3BN,KAD2B;QAE3BO,GAAG,EAAG,gBAAeH,SAAS,CAACI,QAAV,EAAqB,EAFf;QAG3BhB;MAH2B,CAAhB,CAAN,CAAP;MAKA,MAAMiB,mBAAgD,GAAG,MAAMtC,OAAO,CAACuC,GAAR,CAC7DnB,IAAI,CAACoB,GAAL,CAAUC,OAAD,IAAa;QACpB,OAAO7C,WAAW,CAAC6C,OAAD,EAAU3C,IAAV,EAAgBmB,GAAG,CAACyB,WAApB,CAAlB;MACD,CAFD,CAD6D,CAA/D;MAMA,MAAMC,KAAkC,GAAGL,mBAAmB,CAC3DM,MADwC,CAChCC,CAAD,IAAO,CAACC,eAAA,CAAEC,MAAF,CAASF,CAAT,CADyB,EAExCG,KAFwC,CAElCpB,IAFkC,EAE5BD,IAF4B,CAA3C;MAIAR,IAAI,CAACwB,KAAD,CAAJ;IACD,CAvCD,CAuCE,OAAOpC,GAAP,EAAiB;MACjBY,IAAI,CAAC8B,gBAAA,CAAWC,gBAAX,CAA4B3C,GAAG,CAAC4C,OAAhC,CAAD,CAAJ;IACD;EACF,CAjDH;EAmDA,OAAOrC,MAAP;AACD;;eAEcF,e"}
@@ -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, Package, Version } from '@verdaccio/types';
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 = Package & {
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 = Package & {
14
+ export declare type $SidebarPackage = Manifest & {
15
15
  latest: Version;
16
16
  };
17
17
  declare function addSidebarWebApi(config: Config, storage: Storage, auth: IAuth): Router;
@@ -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 packageName = req.params.scope ? (0, _webUtils.addScope)(req.params.scope, req.params.package) : req.params.package;
55
- storage.getPackage({
56
- name: packageName,
57
- uplinksLook: true,
58
- keepUpLinkData: true,
59
- req,
60
- callback: function (err, info) {
61
- if (_lodash.default.isNil(err)) {
62
- const {
63
- v
64
- } = req.query;
65
-
66
- let sideBarInfo = _lodash.default.clone(info);
67
-
68
- sideBarInfo.versions = (0, _tarball.convertDistRemoteToLocalTarballUrls)(info, {
69
- protocol: req.protocol,
70
- headers: req.headers,
71
- host: req.hostname
72
- }, config.url_prefix).versions;
73
-
74
- if (typeof v === 'string' && (0, _utils.isVersionValid)(info, v)) {
75
- sideBarInfo.latest = sideBarInfo.versions[v];
76
- sideBarInfo.latest.author = (0, _utils.formatAuthor)(sideBarInfo.latest.author);
77
- } else {
78
- sideBarInfo.latest = sideBarInfo.versions[info[_core.DIST_TAGS].latest];
79
- sideBarInfo.latest.author = (0, _utils.formatAuthor)(sideBarInfo.latest.author);
80
- }
81
-
82
- sideBarInfo = (0, _webUtils.deleteProperties)(['readme', '_attachments', '_rev', 'name'], sideBarInfo);
83
- const authorAvatar = config.web ? (0, _utils.addGravatarSupport)(sideBarInfo, config.web.gravatar) : (0, _utils.addGravatarSupport)(sideBarInfo);
84
- next(authorAvatar);
85
- } else {
86
- res.status(_core.HTTP_STATUS.NOT_FOUND);
87
- res.end();
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
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/sidebar.ts"],"names":["debug","addSidebarWebApi","config","storage","auth","router","can","get","req","res","next","packageName","params","scope","package","getPackage","name","uplinksLook","keepUpLinkData","callback","err","info","_","isNil","v","query","sideBarInfo","clone","versions","protocol","headers","host","hostname","url_prefix","latest","author","DIST_TAGS","authorAvatar","web","gravatar","status","HTTP_STATUS","NOT_FOUND","end"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\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, Package, 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 = Package & { author: AuthorAvatar; dist?: { tarball: string } };\n\nexport type $SidebarPackage = Package & { 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 function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n const packageName: string = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : req.params.package;\n\n storage.getPackage({\n name: packageName,\n uplinksLook: true,\n keepUpLinkData: true,\n req,\n callback: function (err: Error, info: $SidebarPackage): void {\n if (_.isNil(err)) {\n const { v } = req.query;\n let sideBarInfo = _.clone(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 if (typeof v === 'string' && isVersionValid(info, v)) {\n sideBarInfo.latest = sideBarInfo.versions[v];\n sideBarInfo.latest.author = formatAuthor(sideBarInfo.latest.author);\n } else {\n sideBarInfo.latest = sideBarInfo.versions[info[DIST_TAGS].latest];\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 } else {\n res.status(HTTP_STATUS.NOT_FOUND);\n res.end();\n }\n },\n });\n }\n );\n\n return router;\n}\n\nexport default addSidebarWebApi;\n"],"file":"sidebar.js"}
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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"}