@verdaccio/store 6.0.0-6-next.21 → 6.0.0-6-next.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/build/index.d.ts +5 -4
  3. package/build/index.js +31 -15
  4. package/build/index.js.map +1 -1
  5. package/build/lib/TransFormResults.d.ts +15 -0
  6. package/build/lib/TransFormResults.js +61 -0
  7. package/build/lib/TransFormResults.js.map +1 -0
  8. package/build/lib/search-utils.d.ts +4 -0
  9. package/build/lib/search-utils.js +59 -0
  10. package/build/lib/search-utils.js.map +1 -0
  11. package/build/lib/star-utils.d.ts +14 -0
  12. package/build/{star-utils.js → lib/star-utils.js} +16 -2
  13. package/build/lib/star-utils.js.map +1 -0
  14. package/build/lib/storage-utils.d.ts +82 -0
  15. package/build/{storage-utils.js → lib/storage-utils.js} +173 -60
  16. package/build/lib/storage-utils.js.map +1 -0
  17. package/build/lib/uplink-util.d.ts +10 -0
  18. package/build/lib/uplink-util.js +49 -0
  19. package/build/lib/uplink-util.js.map +1 -0
  20. package/build/lib/versions-utils.d.ts +28 -0
  21. package/build/lib/versions-utils.js +104 -0
  22. package/build/lib/versions-utils.js.map +1 -0
  23. package/build/local-storage.d.ts +3 -165
  24. package/build/local-storage.js +6 -1166
  25. package/build/local-storage.js.map +1 -1
  26. package/build/storage.d.ts +242 -86
  27. package/build/storage.js +1681 -548
  28. package/build/storage.js.map +1 -1
  29. package/build/type.d.ts +42 -19
  30. package/build/type.js.map +1 -1
  31. package/jest.config.js +8 -2
  32. package/package.json +71 -71
  33. package/src/index.ts +5 -4
  34. package/src/lib/TransFormResults.ts +42 -0
  35. package/src/lib/search-utils.ts +50 -0
  36. package/src/{star-utils.ts → lib/star-utils.ts} +16 -5
  37. package/src/lib/storage-utils.ts +362 -0
  38. package/src/lib/uplink-util.ts +41 -0
  39. package/src/lib/versions-utils.ts +87 -0
  40. package/src/local-storage.ts +7 -1217
  41. package/src/storage.ts +1683 -635
  42. package/src/type.ts +47 -21
  43. package/test/fixtures/config/getTarballNext-getupstream.yaml +17 -0
  44. package/test/fixtures/config/syncDoubleUplinksMetadata.yaml +25 -0
  45. package/test/fixtures/config/syncNoUplinksMetadata.yaml +17 -0
  46. package/test/fixtures/config/syncSingleUplinksMetadata.yaml +21 -0
  47. package/test/fixtures/config/updateManifest-1.yaml +16 -0
  48. package/test/fixtures/manifests/foo-npmjs.json +253 -0
  49. package/test/fixtures/manifests/foo-verdaccio.json +253 -0
  50. package/test/fixtures/tarball.tgz +0 -0
  51. package/test/helpers.ts +22 -0
  52. package/test/local-store.__disabled__.ts +553 -0
  53. package/test/search.spec.ts +4 -5
  54. package/test/star.spec.ts +31 -0
  55. package/test/storage-utils.spec.ts +129 -42
  56. package/test/storage.spec.ts +943 -33
  57. package/test/versions.spec.ts +109 -0
  58. package/tsconfig.json +6 -3
  59. package/build/search.d.ts +0 -35
  60. package/build/search.js +0 -198
  61. package/build/search.js.map +0 -1
  62. package/build/star-utils.d.ts +0 -9
  63. package/build/star-utils.js.map +0 -1
  64. package/build/storage-utils.d.ts +0 -39
  65. package/build/storage-utils.js.map +0 -1
  66. package/build/uplink-util.d.ts +0 -7
  67. package/build/uplink-util.js +0 -38
  68. package/build/uplink-util.js.map +0 -1
  69. package/src/search.ts +0 -175
  70. package/src/storage-utils.ts +0 -263
  71. package/src/uplink-util.ts +0 -32
  72. package/test/local-storage.spec.ts +0 -583
@@ -0,0 +1,109 @@
1
+ import assert from 'assert';
2
+
3
+ import { getVersion, sortVersionsAndFilterInvalid, tagVersion } from '../src/index';
4
+
5
+ describe('versions-utils', () => {
6
+ const dist = (version) => ({
7
+ tarball: `http://registry.org/npm_test/-/npm_test-${version}.tgz`,
8
+ shasum: `sha1-${version}`,
9
+ });
10
+
11
+ describe('getVersion', () => {
12
+ const metadata = {
13
+ '1.0.0': { dist: dist('1.0.0') },
14
+ '1.0.1': { dist: dist('1.0.1') },
15
+ '0.2.1-1': { dist: dist('0.2.1-1') },
16
+ '0.2.1-alpha': { dist: dist('0.2.1-alpha') },
17
+ '0.2.1-alpha.0': { dist: dist('0.2.1-alpha.0') },
18
+ };
19
+
20
+ test('should get the right version', () => {
21
+ expect(getVersion({ ...metadata } as any, '1.0.0')).toEqual({ dist: dist('1.0.0') });
22
+ expect(getVersion({ ...metadata } as any, 'v1.0.0')).toEqual({ dist: dist('1.0.0') });
23
+ expect(getVersion({ ...metadata } as any, 'v0.2.1-1')).toEqual({ dist: dist('0.2.1-1') });
24
+ expect(getVersion({ ...metadata } as any, '0.2.1-alpha')).toEqual({
25
+ dist: dist('0.2.1-alpha'),
26
+ });
27
+ expect(getVersion({ ...metadata } as any, '0.2.1-alpha.0')).toEqual({
28
+ dist: dist('0.2.1-alpha.0'),
29
+ });
30
+ });
31
+
32
+ test('should return nothing on get non existing version', () => {
33
+ expect(getVersion({ ...metadata } as any, '0')).toBeUndefined();
34
+ expect(getVersion({ ...metadata } as any, '2.0.0')).toBeUndefined();
35
+ expect(getVersion({ ...metadata } as any, 'v2.0.0')).toBeUndefined();
36
+ });
37
+
38
+ test('should return nothing on get invalid versions', () => {
39
+ expect(getVersion({ ...metadata } as any, undefined)).toBeUndefined();
40
+ expect(getVersion({ ...metadata } as any, null)).toBeUndefined();
41
+ expect(getVersion({ ...metadata } as any, 8)).toBeUndefined();
42
+ });
43
+
44
+ test('should handle no versions', () => {
45
+ expect(getVersion(undefined, undefined)).toBeUndefined();
46
+ });
47
+ });
48
+
49
+ describe('sortVersionsAndFilterInvalid', () => {
50
+ test('should sort versions', () => {
51
+ expect(sortVersionsAndFilterInvalid(['1.0.0', '5.0.0', '2.0.0'])).toEqual([
52
+ '1.0.0',
53
+ '2.0.0',
54
+ '5.0.0',
55
+ ]);
56
+ });
57
+ test('should sort versions and filter out invalid', () => {
58
+ expect(sortVersionsAndFilterInvalid(['1.0.0', '5.0.0', '2.0.0', '', null])).toEqual([
59
+ '1.0.0',
60
+ '2.0.0',
61
+ '5.0.0',
62
+ ]);
63
+ });
64
+ });
65
+
66
+ describe('tagVersion', () => {
67
+ test('add new one', () => {
68
+ let pkg = {
69
+ versions: {},
70
+ 'dist-tags': {},
71
+ };
72
+
73
+ // @ts-ignore
74
+ assert(tagVersion(pkg, '1.1.1', 'foo', {}));
75
+ assert.deepEqual(pkg, {
76
+ versions: {},
77
+ 'dist-tags': { foo: '1.1.1' },
78
+ });
79
+ });
80
+
81
+ test('add (compat)', () => {
82
+ const x = {
83
+ versions: {},
84
+ 'dist-tags': { foo: '1.1.0' },
85
+ };
86
+
87
+ // @ts-ignore
88
+ assert(tagVersion(x, '1.1.1', 'foo'));
89
+ assert.deepEqual(x, {
90
+ versions: {},
91
+ 'dist-tags': { foo: '1.1.1' },
92
+ });
93
+ });
94
+
95
+ test('add fresh tag', () => {
96
+ let x = {
97
+ versions: {},
98
+ 'dist-tags': { foo: '1.1.0' },
99
+ };
100
+
101
+ // @ts-ignore
102
+ assert(tagVersion(x, '1.1.1', 'foo'));
103
+ assert.deepEqual(x, {
104
+ versions: {},
105
+ 'dist-tags': { foo: '1.1.1' },
106
+ });
107
+ });
108
+ });
109
+ });
package/tsconfig.json CHANGED
@@ -11,17 +11,20 @@
11
11
  "path": "../config"
12
12
  },
13
13
  {
14
- "path": "../core/commons-api"
14
+ "path": "../plugins/local-storage"
15
15
  },
16
16
  {
17
- "path": "../core/local-storage"
17
+ "path": "../core/streams"
18
18
  },
19
19
  {
20
- "path": "../core/streams"
20
+ "path": "../core/url"
21
21
  },
22
22
  {
23
23
  "path": "../core/core"
24
24
  },
25
+ {
26
+ "path": "../hooks"
27
+ },
25
28
  {
26
29
  "path": "../loaders"
27
30
  },
package/build/search.d.ts DELETED
@@ -1,35 +0,0 @@
1
- import { searchUtils } from '@verdaccio/core';
2
- import { ProxyList, ProxySearchParams } from '@verdaccio/proxy';
3
- import { Version } from '@verdaccio/types';
4
- import { LocalStorage } from './local-storage';
5
- import { Storage } from './storage';
6
- export interface ISearchResult {
7
- ref: string;
8
- score: number;
9
- }
10
- export interface IWebSearch {
11
- storage: Storage;
12
- query(query: string): ISearchResult[];
13
- add(pkg: Version): void;
14
- remove(name: string): void;
15
- reindex(): void;
16
- configureStorage(storage: Storage): void;
17
- }
18
- export declare function removeDuplicates(results: searchUtils.SearchPackageItem[]): searchUtils.SearchPackageItem[];
19
- export declare class SearchManager {
20
- readonly uplinks: ProxyList;
21
- readonly localStorage: LocalStorage;
22
- constructor(uplinks: ProxyList, storage: LocalStorage);
23
- get proxyList(): string[];
24
- /**
25
- * Handle search on packages and proxies.
26
- * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses
27
- * to a stream, once the proxies request has finished search in local storage for all packages
28
- * (privated and cached).
29
- */
30
- search(options: ProxySearchParams): Promise<searchUtils.SearchPackageItem[]>;
31
- /**
32
- * Consume the upstream and pipe it to a transformable stream.
33
- */
34
- private consumeSearchStream;
35
- }
package/build/search.js DELETED
@@ -1,198 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.SearchManager = void 0;
7
- exports.removeDuplicates = removeDuplicates;
8
-
9
- var _debug = _interopRequireDefault(require("debug"));
10
-
11
- var _lodash = _interopRequireDefault(require("lodash"));
12
-
13
- var _stream = require("stream");
14
-
15
- var _core = require("@verdaccio/core");
16
-
17
- var _logger = require("@verdaccio/logger");
18
-
19
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
-
21
- /* eslint-disable @typescript-eslint/no-unused-vars */
22
- // eslint-disable no-invalid-this
23
- const debug = (0, _debug.default)('verdaccio:storage:search');
24
-
25
- function removeDuplicates(results) {
26
- const pkgNames = [];
27
-
28
- const orderByResults = _lodash.default.orderBy(results, ['verdaccioPrivate', 'asc']);
29
-
30
- return orderByResults.filter(pkg => {
31
- var _pkg$package, _pkg$package2;
32
-
33
- if (pkgNames.includes(pkg === null || pkg === void 0 ? void 0 : (_pkg$package = pkg.package) === null || _pkg$package === void 0 ? void 0 : _pkg$package.name)) {
34
- return false;
35
- }
36
-
37
- pkgNames.push(pkg === null || pkg === void 0 ? void 0 : (_pkg$package2 = pkg.package) === null || _pkg$package2 === void 0 ? void 0 : _pkg$package2.name);
38
- return true;
39
- });
40
- }
41
-
42
- class TransFormResults extends _stream.Transform {
43
- constructor(options) {
44
- super(options);
45
- }
46
- /**
47
- * Transform either array of packages or a single package into a stream of packages.
48
- * From uplinks the chunks are array but from local packages are objects.
49
- * @param {string} chunk
50
- * @param {string} encoding
51
- * @param {function} done
52
- * @returns {void}
53
- * @override
54
- */
55
-
56
-
57
- _transform(chunk, _encoding, callback) {
58
- if (_lodash.default.isArray(chunk)) {
59
- // from remotes we should expect chunks as arrays
60
- chunk.filter(pkgItem => {
61
- var _pkgItem$package;
62
-
63
- debug(`streaming remote pkg name ${pkgItem === null || pkgItem === void 0 ? void 0 : (_pkgItem$package = pkgItem.package) === null || _pkgItem$package === void 0 ? void 0 : _pkgItem$package.name}`);
64
- return true;
65
- }).forEach(pkgItem => {
66
- this.push({ ...pkgItem,
67
- verdaccioPkgCached: false,
68
- verdaccioPrivate: false
69
- });
70
- });
71
- return callback();
72
- } else {
73
- var _chunk$package;
74
-
75
- // local we expect objects
76
- debug(`streaming local pkg name ${chunk === null || chunk === void 0 ? void 0 : (_chunk$package = chunk.package) === null || _chunk$package === void 0 ? void 0 : _chunk$package.name}`);
77
- this.push(chunk);
78
- return callback();
79
- }
80
- }
81
-
82
- }
83
-
84
- class SearchManager {
85
- constructor(uplinks, storage) {
86
- this.uplinks = uplinks;
87
- this.localStorage = storage;
88
- }
89
-
90
- get proxyList() {
91
- const uplinksList = Object.keys(this.uplinks);
92
- return uplinksList;
93
- }
94
- /**
95
- * Handle search on packages and proxies.
96
- * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses
97
- * to a stream, once the proxies request has finished search in local storage for all packages
98
- * (privated and cached).
99
- */
100
-
101
-
102
- async search(options) {
103
- const transformResults = new TransFormResults({
104
- objectMode: true
105
- });
106
- const streamPassThrough = new _stream.PassThrough({
107
- objectMode: true
108
- });
109
- const upLinkList = this.proxyList;
110
- const searchUplinksStreams = upLinkList.map(uplinkId => {
111
- const uplink = this.uplinks[uplinkId];
112
-
113
- if (!uplink) {
114
- // this should never tecnically happens
115
- _logger.logger.fatal({
116
- uplinkId
117
- }, 'uplink @upLinkId not found');
118
- }
119
-
120
- return this.consumeSearchStream(uplinkId, uplink, options, streamPassThrough);
121
- });
122
-
123
- try {
124
- debug('search uplinks'); // we only process those streams end successfully, if all fails
125
- // we just include local storage
126
-
127
- await Promise.allSettled([...searchUplinksStreams]);
128
- debug('search uplinks done');
129
- } catch (err) {
130
- _logger.logger.error({
131
- err: err === null || err === void 0 ? void 0 : err.message
132
- }, ' error on uplinks search @{err}');
133
-
134
- streamPassThrough.emit('error', err);
135
- }
136
-
137
- debug('search local');
138
-
139
- try {
140
- await this.localStorage.search(streamPassThrough, options.query);
141
- } catch (err) {
142
- _logger.logger.error({
143
- err: err === null || err === void 0 ? void 0 : err.message
144
- }, ' error on local search @{err}');
145
-
146
- streamPassThrough.emit('error', err);
147
- }
148
-
149
- const data = [];
150
- const outPutStream = new _stream.PassThrough({
151
- objectMode: true
152
- });
153
- (0, _stream.pipeline)(streamPassThrough, transformResults, outPutStream, err => {
154
- if (err) {
155
- throw _core.errorUtils.getInternalError(err ? err.message : 'unknown error');
156
- } else {
157
- debug('pipeline succeeded');
158
- }
159
- });
160
- outPutStream.on('data', chunk => {
161
- data.push(chunk);
162
- });
163
- return new Promise(resolve => {
164
- outPutStream.on('finish', async () => {
165
- const searchFinalResults = removeDuplicates(data);
166
- debug('search stream total results: %o', searchFinalResults.length);
167
- return resolve(searchFinalResults);
168
- });
169
- debug('search done');
170
- });
171
- }
172
- /**
173
- * Consume the upstream and pipe it to a transformable stream.
174
- */
175
-
176
-
177
- consumeSearchStream(uplinkId, uplink, options, searchPassThrough) {
178
- return uplink.search({ ...options
179
- }).then(bodyStream => {
180
- bodyStream.pipe(searchPassThrough, {
181
- end: false
182
- });
183
- bodyStream.on('error', err => {
184
- _logger.logger.error({
185
- uplinkId,
186
- err: err
187
- }, 'search error for uplink @{uplinkId}: @{err?.message}');
188
-
189
- searchPassThrough.end();
190
- });
191
- return new Promise(resolve => bodyStream.on('end', resolve));
192
- });
193
- }
194
-
195
- }
196
-
197
- exports.SearchManager = SearchManager;
198
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/search.ts"],"names":["debug","removeDuplicates","results","pkgNames","orderByResults","_","orderBy","filter","pkg","includes","package","name","push","TransFormResults","Transform","constructor","options","_transform","chunk","_encoding","callback","isArray","pkgItem","forEach","verdaccioPkgCached","verdaccioPrivate","SearchManager","uplinks","storage","localStorage","proxyList","uplinksList","Object","keys","search","transformResults","objectMode","streamPassThrough","PassThrough","upLinkList","searchUplinksStreams","map","uplinkId","uplink","logger","fatal","consumeSearchStream","Promise","allSettled","err","error","message","emit","query","data","outPutStream","errorUtils","getInternalError","on","resolve","searchFinalResults","length","searchPassThrough","then","bodyStream","pipe","end"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n// eslint-disable no-invalid-this\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport { PassThrough, Transform, pipeline } from 'stream';\n\nimport { VerdaccioError } from '@verdaccio/core';\nimport { errorUtils, searchUtils } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { IProxy, ProxyList, ProxySearchParams } from '@verdaccio/proxy';\nimport { Version } from '@verdaccio/types';\n\nimport { LocalStorage } from './local-storage';\nimport { Storage } from './storage';\n\nconst debug = buildDebug('verdaccio:storage:search');\nexport interface ISearchResult {\n ref: string;\n score: number;\n}\n// @deprecated not longer used\nexport interface IWebSearch {\n storage: Storage;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query(query: string): ISearchResult[];\n add(pkg: Version): void;\n remove(name: string): void;\n reindex(): void;\n configureStorage(storage: Storage): void;\n}\n\nexport function removeDuplicates(results: searchUtils.SearchPackageItem[]) {\n const pkgNames: any[] = [];\n const orderByResults = _.orderBy(results, ['verdaccioPrivate', 'asc']);\n return orderByResults.filter((pkg) => {\n if (pkgNames.includes(pkg?.package?.name)) {\n return false;\n }\n pkgNames.push(pkg?.package?.name);\n return true;\n });\n}\n\nclass TransFormResults extends Transform {\n public constructor(options) {\n super(options);\n }\n\n /**\n * Transform either array of packages or a single package into a stream of packages.\n * From uplinks the chunks are array but from local packages are objects.\n * @param {string} chunk\n * @param {string} encoding\n * @param {function} done\n * @returns {void}\n * @override\n */\n public _transform(chunk, _encoding, callback) {\n if (_.isArray(chunk)) {\n // from remotes we should expect chunks as arrays\n (chunk as searchUtils.SearchItem[])\n .filter((pkgItem) => {\n debug(`streaming remote pkg name ${pkgItem?.package?.name}`);\n return true;\n })\n .forEach((pkgItem) => {\n this.push({ ...pkgItem, verdaccioPkgCached: false, verdaccioPrivate: false });\n });\n return callback();\n } else {\n // local we expect objects\n debug(`streaming local pkg name ${chunk?.package?.name}`);\n this.push(chunk);\n return callback();\n }\n }\n}\n\nexport class SearchManager {\n public readonly uplinks: ProxyList;\n public readonly localStorage: LocalStorage;\n constructor(uplinks: ProxyList, storage: LocalStorage) {\n this.uplinks = uplinks;\n this.localStorage = storage;\n }\n\n public get proxyList() {\n const uplinksList = Object.keys(this.uplinks);\n\n return uplinksList;\n }\n\n /**\n * Handle search on packages and proxies.\n * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses\n * to a stream, once the proxies request has finished search in local storage for all packages\n * (privated and cached).\n */\n public async search(options: ProxySearchParams): Promise<searchUtils.SearchPackageItem[]> {\n const transformResults = new TransFormResults({ objectMode: true });\n const streamPassThrough = new PassThrough({ objectMode: true });\n const upLinkList = this.proxyList;\n\n const searchUplinksStreams = upLinkList.map((uplinkId) => {\n const uplink = this.uplinks[uplinkId];\n if (!uplink) {\n // this should never tecnically happens\n logger.fatal({ uplinkId }, 'uplink @upLinkId not found');\n }\n return this.consumeSearchStream(uplinkId, uplink, options, streamPassThrough);\n });\n\n try {\n debug('search uplinks');\n // we only process those streams end successfully, if all fails\n // we just include local storage\n await Promise.allSettled([...searchUplinksStreams]);\n debug('search uplinks done');\n } catch (err: any) {\n logger.error({ err: err?.message }, ' error on uplinks search @{err}');\n streamPassThrough.emit('error', err);\n }\n debug('search local');\n try {\n await this.localStorage.search(streamPassThrough, options.query as searchUtils.SearchQuery);\n } catch (err: any) {\n logger.error({ err: err?.message }, ' error on local search @{err}');\n streamPassThrough.emit('error', err);\n }\n const data: searchUtils.SearchPackageItem[] = [];\n const outPutStream = new PassThrough({ objectMode: true });\n pipeline(streamPassThrough, transformResults, outPutStream, (err) => {\n if (err) {\n throw errorUtils.getInternalError(err ? err.message : 'unknown error');\n } else {\n debug('pipeline succeeded');\n }\n });\n\n outPutStream.on('data', (chunk) => {\n data.push(chunk);\n });\n\n return new Promise((resolve) => {\n outPutStream.on('finish', async () => {\n const searchFinalResults: searchUtils.SearchPackageItem[] = removeDuplicates(data);\n debug('search stream total results: %o', searchFinalResults.length);\n return resolve(searchFinalResults);\n });\n debug('search done');\n });\n }\n\n /**\n * Consume the upstream and pipe it to a transformable stream.\n */\n private consumeSearchStream(\n uplinkId: string,\n uplink: IProxy,\n options: ProxySearchParams,\n searchPassThrough: PassThrough\n ): Promise<any> {\n return uplink.search({ ...options }).then((bodyStream) => {\n bodyStream.pipe(searchPassThrough, { end: false });\n bodyStream.on('error', (err: VerdaccioError): void => {\n logger.error(\n { uplinkId, err: err },\n 'search error for uplink @{uplinkId}: @{err?.message}'\n );\n searchPassThrough.end();\n });\n return new Promise((resolve) => bodyStream.on('end', resolve));\n });\n }\n}\n"],"file":"search.js"}
@@ -1,9 +0,0 @@
1
- import { Package } from '@verdaccio/types';
2
- import { Users } from '.';
3
- /**
4
- * Check whether the package metadta has enough data to be published
5
- * @param pkg metadata
6
- */
7
- export declare function isPublishablePackage(pkg: Package): boolean;
8
- export declare function isRelatedToDeprecation(pkgInfo: Package): boolean;
9
- export declare function validateInputs(localUsers: Users, username: string, isStar: boolean): boolean;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/star-utils.ts"],"names":["isPublishablePackage","pkg","keys","Object","_","includes","isRelatedToDeprecation","pkgInfo","versions","version","prototype","hasOwnProperty","call","validateInputs","localUsers","username","isStar","isExistlocalUsers","isNil"],"mappings":";;;;;;;;;AAAA;;;;AAMA;AACA;AACA;AACA;AAEO,SAASA,oBAAT,CAA8BC,GAA9B,EAAqD;AAC1D,QAAMC,IAAc,GAAGC,MAAM,CAACD,IAAP,CAAYD,GAAZ,CAAvB;AAEA,SAAOG,gBAAEC,QAAF,CAAWH,IAAX,EAAiB,UAAjB,CAAP;AACD;;AAEM,SAASI,sBAAT,CAAgCC,OAAhC,EAA2D;AAChE,QAAM;AAAEC,IAAAA;AAAF,MAAeD,OAArB;;AACA,OAAK,MAAME,OAAX,IAAsBD,QAAtB,EAAgC;AAC9B,QAAIL,MAAM,CAACO,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCJ,QAAQ,CAACC,OAAD,CAA7C,EAAwD,YAAxD,CAAJ,EAA2E;AACzE,aAAO,IAAP;AACD;AACF;;AACD,SAAO,KAAP;AACD;;AAEM,SAASI,cAAT,CAAwBC,UAAxB,EAA2CC,QAA3C,EAA6DC,MAA7D,EAAuF;AAC5F,QAAMC,iBAAiB,GAAGb,gBAAEc,KAAF,CAAQJ,UAAU,CAACC,QAAD,CAAlB,MAAkC,KAA5D;;AACA,MAAIC,MAAM,IAAIC,iBAAV,IAA+BH,UAAU,CAACC,QAAD,CAA7C,EAAyD;AACvD,WAAO,IAAP;AACD,GAFD,MAEO,IAAI,CAACC,MAAD,IAAWC,iBAAf,EAAkC;AACvC,WAAO,KAAP;AACD,GAFM,MAEA,IAAI,CAACD,MAAD,IAAW,CAACC,iBAAhB,EAAmC;AACxC,WAAO,IAAP;AACD;;AACD,SAAO,KAAP;AACD","sourcesContent":["import _ from 'lodash';\n\nimport { Package } from '@verdaccio/types';\n\nimport { Users } from '.';\n\n/**\n * Check whether the package metadta has enough data to be published\n * @param pkg metadata\n */\n\nexport function isPublishablePackage(pkg: Package): boolean {\n const keys: string[] = Object.keys(pkg);\n\n return _.includes(keys, 'versions');\n}\n\nexport function isRelatedToDeprecation(pkgInfo: Package): boolean {\n const { versions } = pkgInfo;\n for (const version in versions) {\n if (Object.prototype.hasOwnProperty.call(versions[version], 'deprecated')) {\n return true;\n }\n }\n return false;\n}\n\nexport function validateInputs(localUsers: Users, username: string, isStar: boolean): boolean {\n const isExistlocalUsers = _.isNil(localUsers[username]) === false;\n if (isStar && isExistlocalUsers && localUsers[username]) {\n return true;\n } else if (!isStar && isExistlocalUsers) {\n return false;\n } else if (!isStar && !isExistlocalUsers) {\n return true;\n }\n return false;\n}\n"],"file":"star-utils.js"}
@@ -1,39 +0,0 @@
1
- import { AttachMents, Package, StringValue, Version, Versions } from '@verdaccio/types';
2
- import { LocalStorage } from './local-storage';
3
- export declare const STORAGE: {
4
- PACKAGE_FILE_NAME: string;
5
- FILE_EXIST_ERROR: string;
6
- NO_SUCH_FILE_ERROR: string;
7
- DEFAULT_REVISION: string;
8
- };
9
- export declare function generatePackageTemplate(name: string): Package;
10
- /**
11
- * Normalize package properties, tags, revision id.
12
- * @param {Object} pkg package reference.
13
- */
14
- export declare function normalizePackage(pkg: Package): Package;
15
- export declare function generateRevision(rev: string): string;
16
- export declare function getLatestReadme(pkg: Package): string;
17
- export declare function cleanUpReadme(version: any): Version;
18
- export declare const WHITELIST: string[];
19
- export declare function cleanUpLinksRef(result: Package, keepUpLinkData?: boolean): Package;
20
- /**
21
- * Check whether a package it is already a local package
22
- * @param {*} name
23
- * @param {*} localStorage
24
- */
25
- export declare function checkPackageLocal(name: string, localStorage: LocalStorage): Promise<any>;
26
- export declare function publishPackage(name: string, metadata: any, localStorage: LocalStorage): Promise<any>;
27
- export declare function checkPackageRemote(name: string, isAllowPublishOffline: boolean, syncMetadata: Function): Promise<any>;
28
- export declare function mergeUplinkTimeIntoLocal(localMetadata: Package, remoteMetadata: Package): any;
29
- export declare function prepareSearchPackage(data: Package): any;
30
- /**
31
- * Create a tag for a package
32
- * @param {*} data
33
- * @param {*} version
34
- * @param {*} tag
35
- * @return {Boolean} whether a package has been tagged
36
- */
37
- export declare function tagVersion(data: Package, version: string, tag: StringValue): boolean;
38
- export declare function isDifferentThanOne(versions: Versions | AttachMents): boolean;
39
- export declare function hasInvalidPublishBody(manifest: Pick<Package, '_attachments' | 'versions'>): boolean;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/storage-utils.ts"],"names":["STORAGE","PACKAGE_FILE_NAME","FILE_EXIST_ERROR","NO_SUCH_FILE_ERROR","DEFAULT_REVISION","generatePackageTemplate","name","versions","time","USERS","DIST_TAGS","_uplinks","_distfiles","_attachments","_rev","normalizePackage","pkg","pkgProperties","forEach","key","pkgProp","validatioUtils","isObject","_","isString","_id","generateRevision","rev","split","getLatestReadme","distTags","latestVersion","readme","trim","readmeDistTagsPriority","tag","version","cleanUpReadme","WHITELIST","cleanUpLinksRef","result","keepUpLinkData","propertyToKeep","push","i","indexOf","checkPackageLocal","localStorage","Promise","resolve","reject","getPackageMetadata","err","results","status","HTTP_STATUS","NOT_FOUND","errorUtils","getConflict","API_ERROR","PACKAGE_EXIST","publishPackage","metadata","addPackage","isNull","checkPackageRemote","isAllowPublishOffline","syncMetadata","packageJsonLocal","upLinksErrors","errorItem","length","getServiceUnavailable","UPLINK_OFFLINE_PUBLISH","mergeUplinkTimeIntoLocal","localMetadata","remoteMetadata","Object","assign","prepareSearchPackage","data","latest","pkgUtils","getLatest","description","maintainers","author","filter","Boolean","repository","readmeFilename","homepage","keywords","bugs","license","tagVersion","semver","parse","isDifferentThanOne","keys","hasInvalidPublishBody","manifest","res"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\n\nimport { errorUtils, pkgUtils, validatioUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, USERS } from '@verdaccio/core';\nimport { AttachMents, Package, StringValue, Version, Versions } from '@verdaccio/types';\nimport { generateRandomHexString, isNil, isObject, normalizeDistTags } from '@verdaccio/utils';\n\nimport { LocalStorage } from './local-storage';\n\nexport const STORAGE = {\n PACKAGE_FILE_NAME: 'package.json',\n FILE_EXIST_ERROR: 'EEXISTS',\n NO_SUCH_FILE_ERROR: 'ENOENT',\n DEFAULT_REVISION: '0-0000000000000000',\n};\n\nexport function generatePackageTemplate(name: string): Package {\n return {\n // standard things\n name,\n versions: {},\n time: {},\n [USERS]: {},\n [DIST_TAGS]: {},\n _uplinks: {},\n _distfiles: {},\n _attachments: {},\n _rev: '',\n };\n}\n\n/**\n * Normalize package properties, tags, revision id.\n * @param {Object} pkg package reference.\n */\nexport function normalizePackage(pkg: Package): Package {\n const pkgProperties = ['versions', 'dist-tags', '_distfiles', '_attachments', '_uplinks', 'time'];\n\n pkgProperties.forEach((key): void => {\n const pkgProp = pkg[key];\n\n if (isNil(pkgProp) || validatioUtils.isObject(pkgProp) === false) {\n pkg[key] = {};\n }\n });\n\n if (_.isString(pkg._rev) === false) {\n pkg._rev = STORAGE.DEFAULT_REVISION;\n }\n\n if (_.isString(pkg._id) === false) {\n pkg._id = pkg.name;\n }\n\n // normalize dist-tags\n return normalizeDistTags(pkg);\n}\n\nexport function generateRevision(rev: string): string {\n const _rev = rev.split('-');\n\n return (+_rev[0] || 0) + 1 + '-' + generateRandomHexString();\n}\n\nexport function getLatestReadme(pkg: Package): string {\n const versions = pkg['versions'] || {};\n const distTags = pkg[DIST_TAGS] || {};\n // FIXME: here is a bit tricky add the types\n const latestVersion: Version | any = distTags['latest'] ? versions[distTags['latest']] || {} : {};\n let readme = _.trim(pkg.readme || latestVersion.readme || '');\n if (readme) {\n return readme;\n }\n\n // In case of empty readme - trying to get ANY readme in the following order:\n // 'next','beta','alpha','test','dev','canary'\n const readmeDistTagsPriority = ['next', 'beta', 'alpha', 'test', 'dev', 'canary'];\n readmeDistTagsPriority.forEach(function (tag): string | void {\n if (readme) {\n return readme;\n }\n const version: Version | any = distTags[tag] ? versions[distTags[tag]] || {} : {};\n readme = _.trim(version.readme || readme);\n });\n return readme;\n}\n\n// FIXME: type any due this\nexport function cleanUpReadme(version: any): Version {\n if (isNil(version) === false) {\n delete version.readme;\n }\n\n return version;\n}\n\nexport const WHITELIST = [\n '_rev',\n 'name',\n 'versions',\n 'dist-tags',\n 'readme',\n 'time',\n '_id',\n 'users',\n];\n\nexport function cleanUpLinksRef(result: Package, keepUpLinkData?: boolean): Package {\n const propertyToKeep = [...WHITELIST];\n if (keepUpLinkData === true) {\n propertyToKeep.push('_uplinks');\n }\n\n for (const i in result) {\n if (propertyToKeep.indexOf(i) === -1) {\n // Remove sections like '_uplinks' from response\n delete result[i];\n }\n }\n\n return result;\n}\n\n/**\n * Check whether a package it is already a local package\n * @param {*} name\n * @param {*} localStorage\n */\nexport function checkPackageLocal(name: string, localStorage: LocalStorage): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n localStorage.getPackageMetadata(name, (err, results): void => {\n if (!isNil(err) && err.status !== HTTP_STATUS.NOT_FOUND) {\n return reject(err);\n }\n if (results) {\n return reject(errorUtils.getConflict(API_ERROR.PACKAGE_EXIST));\n }\n return resolve();\n });\n });\n}\n\nexport function publishPackage(\n name: string,\n metadata: any,\n localStorage: LocalStorage\n): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n localStorage.addPackage(name, metadata, (err): void => {\n if (!_.isNull(err)) {\n return reject(err);\n }\n return resolve();\n });\n });\n}\n\nexport function checkPackageRemote(\n name: string,\n isAllowPublishOffline: boolean,\n syncMetadata: Function\n): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n syncMetadata(name, null, {}, (err, packageJsonLocal, upLinksErrors): void => {\n // something weird\n if (err && err.status !== HTTP_STATUS.NOT_FOUND) {\n return reject(err);\n }\n\n // checking package exist already\n if (isNil(packageJsonLocal) === false) {\n return reject(errorUtils.getConflict(API_ERROR.PACKAGE_EXIST));\n }\n\n for (let errorItem = 0; errorItem < upLinksErrors.length; errorItem++) {\n // checking error\n // if uplink fails with a status other than 404, we report failure\n if (isNil(upLinksErrors[errorItem][0]) === false) {\n if (upLinksErrors[errorItem][0].status !== HTTP_STATUS.NOT_FOUND) {\n if (isAllowPublishOffline) {\n return resolve();\n }\n\n return reject(errorUtils.getServiceUnavailable(API_ERROR.UPLINK_OFFLINE_PUBLISH));\n }\n }\n }\n\n return resolve();\n });\n });\n}\n\nexport function mergeUplinkTimeIntoLocal(localMetadata: Package, remoteMetadata: Package): any {\n if ('time' in remoteMetadata) {\n return Object.assign({}, localMetadata.time, remoteMetadata.time);\n }\n\n return localMetadata.time;\n}\n\nexport function prepareSearchPackage(data: Package): any {\n const latest = pkgUtils.getLatest(data);\n\n if (latest && data.versions[latest]) {\n const version: Version = data.versions[latest];\n const versions: any = { [latest]: 'latest' };\n const pkg: any = {\n name: version.name,\n description: version.description,\n [DIST_TAGS]: { latest },\n maintainers: version.maintainers || [version.author].filter(Boolean),\n author: version.author,\n repository: version.repository,\n readmeFilename: version.readmeFilename || '',\n homepage: version.homepage,\n keywords: version.keywords,\n bugs: version.bugs,\n license: version.license,\n // time: {\n // modified: time,\n // },\n versions,\n };\n\n return pkg;\n }\n}\n\n/**\n * Create a tag for a package\n * @param {*} data\n * @param {*} version\n * @param {*} tag\n * @return {Boolean} whether a package has been tagged\n */\nexport function tagVersion(data: Package, version: string, tag: StringValue): boolean {\n if (tag && data[DIST_TAGS][tag] !== version && semver.parse(version, true)) {\n // valid version - store\n data[DIST_TAGS][tag] = version;\n return true;\n }\n return false;\n}\n\nexport function isDifferentThanOne(versions: Versions | AttachMents): boolean {\n return Object.keys(versions).length !== 1;\n}\n\nexport function hasInvalidPublishBody(manifest: Pick<Package, '_attachments' | 'versions'>) {\n if (!manifest) {\n return false;\n }\n\n const { _attachments, versions } = manifest;\n const res =\n isObject(_attachments) === false ||\n isDifferentThanOne(_attachments) ||\n isObject(versions) === false ||\n isDifferentThanOne(versions);\n return res;\n}\n"],"file":"storage-utils.js"}
@@ -1,7 +0,0 @@
1
- import { IProxy, ProxyList } from '@verdaccio/proxy';
2
- import { Config, Versions } from '@verdaccio/types';
3
- /**
4
- * Set up the Up Storage for each link.
5
- */
6
- export declare function setupUpLinks(config: Config): ProxyList;
7
- export declare function updateVersionsHiddenUpLink(versions: Versions, upLink: IProxy): void;
@@ -1,38 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.setupUpLinks = setupUpLinks;
7
- exports.updateVersionsHiddenUpLink = updateVersionsHiddenUpLink;
8
-
9
- var _proxy = require("@verdaccio/proxy");
10
-
11
- /**
12
- * Set up the Up Storage for each link.
13
- */
14
- function setupUpLinks(config) {
15
- const uplinks = {};
16
-
17
- for (const uplinkName in config.uplinks) {
18
- if (Object.prototype.hasOwnProperty.call(config.uplinks, uplinkName)) {
19
- // instance for each up-link definition
20
- const proxy = new _proxy.ProxyStorage(config.uplinks[uplinkName], config);
21
- proxy.upname = uplinkName;
22
- uplinks[uplinkName] = proxy;
23
- }
24
- }
25
-
26
- return uplinks;
27
- }
28
-
29
- function updateVersionsHiddenUpLink(versions, upLink) {
30
- for (const i in versions) {
31
- if (Object.prototype.hasOwnProperty.call(versions, i)) {
32
- const version = versions[i]; // holds a "hidden" value to be used by the package storage.
33
-
34
- version[Symbol.for('__verdaccio_uplink')] = upLink.upname;
35
- }
36
- }
37
- }
38
- //# sourceMappingURL=uplink-util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/uplink-util.ts"],"names":["setupUpLinks","config","uplinks","uplinkName","Object","prototype","hasOwnProperty","call","proxy","ProxyStorage","upname","updateVersionsHiddenUpLink","versions","upLink","i","version","Symbol","for"],"mappings":";;;;;;;;AAAA;;AAGA;AACA;AACA;AACO,SAASA,YAAT,CAAsBC,MAAtB,EAAiD;AACtD,QAAMC,OAAkB,GAAG,EAA3B;;AAEA,OAAK,MAAMC,UAAX,IAAyBF,MAAM,CAACC,OAAhC,EAAyC;AACvC,QAAIE,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCN,MAAM,CAACC,OAA5C,EAAqDC,UAArD,CAAJ,EAAsE;AACpE;AACA,YAAMK,KAAa,GAAG,IAAIC,mBAAJ,CAAiBR,MAAM,CAACC,OAAP,CAAeC,UAAf,CAAjB,EAA6CF,MAA7C,CAAtB;AACAO,MAAAA,KAAK,CAACE,MAAN,GAAeP,UAAf;AAEAD,MAAAA,OAAO,CAACC,UAAD,CAAP,GAAsBK,KAAtB;AACD;AACF;;AAED,SAAON,OAAP;AACD;;AAEM,SAASS,0BAAT,CAAoCC,QAApC,EAAwDC,MAAxD,EAA8E;AACnF,OAAK,MAAMC,CAAX,IAAgBF,QAAhB,EAA0B;AACxB,QAAIR,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCK,QAArC,EAA+CE,CAA/C,CAAJ,EAAuD;AACrD,YAAMC,OAAO,GAAGH,QAAQ,CAACE,CAAD,CAAxB,CADqD,CAGrD;;AACAC,MAAAA,OAAO,CAACC,MAAM,CAACC,GAAP,CAAW,oBAAX,CAAD,CAAP,GAA4CJ,MAAM,CAACH,MAAnD;AACD;AACF;AACF","sourcesContent":["import { IProxy, ProxyList, ProxyStorage } from '@verdaccio/proxy';\nimport { Config, Versions } from '@verdaccio/types';\n\n/**\n * Set up the Up Storage for each link.\n */\nexport function setupUpLinks(config: Config): ProxyList {\n const uplinks: ProxyList = {};\n\n for (const uplinkName in config.uplinks) {\n if (Object.prototype.hasOwnProperty.call(config.uplinks, uplinkName)) {\n // instance for each up-link definition\n const proxy: IProxy = new ProxyStorage(config.uplinks[uplinkName], config);\n proxy.upname = uplinkName;\n\n uplinks[uplinkName] = proxy;\n }\n }\n\n return uplinks;\n}\n\nexport function updateVersionsHiddenUpLink(versions: Versions, upLink: IProxy): void {\n for (const i in versions) {\n if (Object.prototype.hasOwnProperty.call(versions, i)) {\n const version = versions[i];\n\n // holds a \"hidden\" value to be used by the package storage.\n version[Symbol.for('__verdaccio_uplink')] = upLink.upname;\n }\n }\n}\n"],"file":"uplink-util.js"}