@verdaccio/store 6.0.0-6-next.16 → 6.0.0-6-next.19

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,74 @@
1
1
  # @verdaccio/store
2
2
 
3
+ ## 6.0.0-6-next.19
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [b78f3525]
8
+ - @verdaccio/logger@6.0.0-6-next.10
9
+ - @verdaccio/loaders@6.0.0-6-next.10
10
+ - @verdaccio/proxy@6.0.0-6-next.18
11
+
12
+ ## 6.0.0-6-next.18
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [730b5d8c]
17
+ - @verdaccio/logger@6.0.0-6-next.9
18
+ - @verdaccio/loaders@6.0.0-6-next.9
19
+ - @verdaccio/proxy@6.0.0-6-next.17
20
+
21
+ ## 6.0.0-6-next.17
22
+
23
+ ### Major Changes
24
+
25
+ - a828271d: refactor: download manifest endpoint and integrate fastify
26
+
27
+ Much simpler API for fetching a package
28
+
29
+ ```
30
+ const manifest = await storage.getPackageNext({
31
+ name,
32
+ uplinksLook: true,
33
+ req,
34
+ version: queryVersion,
35
+ requestOptions,
36
+ });
37
+ ```
38
+
39
+ > not perfect, the `req` still is being passed to the proxy (this has to be refactored at proxy package) and then removed from here, in proxy we pass the request instance to the `request` library.
40
+
41
+ ### Details
42
+
43
+ - `async/await` sugar for getPackage()
44
+ - Improve and reuse code between current implementation and new fastify endpoint (add scaffolding for request manifest)
45
+ - Improve performance
46
+ - Add new tests
47
+
48
+ ### Breaking changes
49
+
50
+ All storage plugins will stop to work since the storage uses `getPackageNext` method which is Promise based, I won't replace this now because will force me to update all plugins, I'll follow up in another PR. Currently will throw http 500
51
+
52
+ ### Minor Changes
53
+
54
+ - b13a3fef: refactor: improve versions and dist-tag filters
55
+
56
+ ### Patch Changes
57
+
58
+ - Updated dependencies [a828271d]
59
+ - Updated dependencies [24b9be02]
60
+ - Updated dependencies [e75c0a3b]
61
+ - Updated dependencies [b13a3fef]
62
+ - @verdaccio/tarball@11.0.0-6-next.11
63
+ - @verdaccio/local-storage@11.0.0-6-next.11
64
+ - @verdaccio/utils@6.0.0-6-next.10
65
+ - @verdaccio/core@6.0.0-6-next.4
66
+ - @verdaccio/logger@6.0.0-6-next.8
67
+ - @verdaccio/proxy@6.0.0-6-next.16
68
+ - @verdaccio/config@6.0.0-6-next.12
69
+ - @verdaccio/loaders@6.0.0-6-next.8
70
+ - @verdaccio/streams@11.0.0-6-next.5
71
+
3
72
  ## 6.0.0-6-next.16
4
73
 
5
74
  ### Minor Changes
package/build/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './storage';
2
2
  export * from './storage-utils';
3
+ export * from './star-utils';
3
4
  export * from './search';
4
5
  export * from './type';
package/build/index.js CHANGED
@@ -30,6 +30,19 @@ Object.keys(_storageUtils).forEach(function (key) {
30
30
  });
31
31
  });
32
32
 
33
+ var _starUtils = require("./star-utils");
34
+
35
+ Object.keys(_starUtils).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _starUtils[key]) return;
38
+ Object.defineProperty(exports, key, {
39
+ enumerable: true,
40
+ get: function () {
41
+ return _starUtils[key];
42
+ }
43
+ });
44
+ });
45
+
33
46
  var _search = require("./search");
34
47
 
35
48
  Object.keys(_search).forEach(function (key) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["export * from './storage';\nexport * from './storage-utils';\nexport * from './search';\nexport * from './type';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["export * from './storage';\nexport * from './storage-utils';\nexport * from './star-utils';\nexport * from './search';\nexport * from './type';\n"],"file":"index.js"}
@@ -2,6 +2,8 @@
2
2
  import { PassThrough } from 'stream';
3
3
  import { pluginUtils, searchUtils } from '@verdaccio/core';
4
4
  import { Callback, CallbackAction, Config, IReadTarball, IUploadTarball, Logger, MergeTags, Package, StringValue, Token, TokenFilter, Version } from '@verdaccio/types';
5
+ export declare const noSuchFile = "ENOENT";
6
+ export declare const resourceNotAvailable = "EAGAIN";
5
7
  export declare type IPluginStorage = pluginUtils.IPluginStorage<Config>;
6
8
  export declare function normalizeSearchPackage(pkg: Package, searchItem: searchUtils.SearchItem): searchUtils.SearchPackageBody;
7
9
  export declare const PROTO_NAME = "__proto__";
@@ -35,6 +37,7 @@ declare class LocalStorage {
35
37
  * @param {*} callback
36
38
  */
37
39
  addVersion(name: string, version: string, metadata: Version, tag: StringValue, callback: Callback): void;
40
+ addVersionNext(name: string, version: string, metadata: Version, tag: StringValue): Promise<void>;
38
41
  /**
39
42
  * Merge a new list of tags for a local packages with the existing one.
40
43
  * @param {*} pkgName
@@ -51,7 +54,17 @@ declare class LocalStorage {
51
54
  * @param {*} callback
52
55
  * @return {Function}
53
56
  */
54
- changePackage(name: string, incomingPkg: Package, revision: string | void, callback: Callback): void;
57
+ changePackage(name: string, incomingPkg: Package, revision: string | undefined, callback: Callback): void;
58
+ /**
59
+ * Update the package metadata, tags and attachments (tarballs).
60
+ * Note: Currently supports unpublishing and deprecation.
61
+ * @param {*} name
62
+ * @param {*} incomingPkg
63
+ * @param {*} revision
64
+ * @param {*} callback
65
+ * @return {Function}
66
+ */
67
+ changePackageNext(name: string, incomingPkg: Package, revision: string | undefined): Promise<void>;
55
68
  /**
56
69
  * Remove a tarball.
57
70
  * @param {*} name
@@ -88,11 +101,13 @@ declare class LocalStorage {
88
101
  * @return {ReadTarball}
89
102
  */
90
103
  private _streamSuccessReadTarBall;
104
+ getPackageMetadataNext(name: string): Promise<Package>;
91
105
  /**
92
106
  * Retrieve a package by name.
93
107
  * @param {*} name
94
108
  * @param {*} callback
95
109
  * @return {Function}
110
+ * @deprecated
96
111
  */
97
112
  getPackageMetadata(name: string, callback?: Callback): void;
98
113
  search(searchStream: PassThrough, query: searchUtils.SearchQuery): Promise<void>;
@@ -106,8 +121,10 @@ declare class LocalStorage {
106
121
  * Read a json file from storage.
107
122
  * @param {Object} storage
108
123
  * @param {Function} callback
124
+ * @deprecated
109
125
  */
110
126
  private _readPackage;
127
+ private _readPackageNext;
111
128
  /**
112
129
  * Retrieve either a previous created local package or a boilerplate.
113
130
  * @param {*} pkgName
@@ -131,6 +148,13 @@ declare class LocalStorage {
131
148
  * @return {Function}
132
149
  */
133
150
  private _updatePackage;
151
+ /**
152
+ * @param {*} name package name
153
+ * @param {*} updateHandler function(package, cb) - update function
154
+ * @param {*} callback callback that gets invoked after it's all updated
155
+ * @return {Function}
156
+ */
157
+ private updatePackageNext;
134
158
  /**
135
159
  * Update the revision (_rev) string for a package.
136
160
  * @param {*} name
@@ -139,6 +163,7 @@ declare class LocalStorage {
139
163
  * @return {Function}
140
164
  */
141
165
  private _writePackage;
166
+ private writePackageNext;
142
167
  private _setDefaultRevision;
143
168
  /**
144
169
  * Ensure the dist file remains as the same protocol
@@ -3,8 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PROTO_NAME = exports.LocalStorage = void 0;
6
+ exports.noSuchFile = exports.PROTO_NAME = exports.LocalStorage = void 0;
7
7
  exports.normalizeSearchPackage = normalizeSearchPackage;
8
+ exports.resourceNotAvailable = void 0;
8
9
 
9
10
  var _assert = _interopRequireDefault(require("assert"));
10
11
 
@@ -28,9 +29,11 @@ var _storageUtils = require("./storage-utils");
28
29
 
29
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
30
31
 
31
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
32
-
33
32
  const debug = (0, _debug.default)('verdaccio:storage:local');
33
+ const noSuchFile = 'ENOENT';
34
+ exports.noSuchFile = noSuchFile;
35
+ const resourceNotAvailable = 'EAGAIN';
36
+ exports.resourceNotAvailable = resourceNotAvailable;
34
37
 
35
38
  function normalizeSearchPackage(pkg, searchItem) {
36
39
  const latest = _core.pkgUtils.getLatest(pkg);
@@ -73,12 +76,6 @@ exports.PROTO_NAME = PROTO_NAME;
73
76
 
74
77
  class LocalStorage {
75
78
  constructor(config, logger) {
76
- _defineProperty(this, "config", void 0);
77
-
78
- _defineProperty(this, "storagePlugin", void 0);
79
-
80
- _defineProperty(this, "logger", void 0);
81
-
82
79
  debug('local storage created');
83
80
  this.logger = logger.child({
84
81
  sub: 'fs'
@@ -350,6 +347,124 @@ class LocalStorage {
350
347
  }
351
348
  }, callback);
352
349
  }
350
+
351
+ async addVersionNext(name, version, metadata, tag) {
352
+ debug(`add version %s package for %s`, version, name);
353
+ await this.updatePackageNext(name, async data => {
354
+ debug('%s package is being updated', name); // keep only one readme per package
355
+
356
+ data.readme = metadata.readme;
357
+ debug('%s` readme mutated', name); // TODO: lodash remove
358
+
359
+ metadata = (0, _storageUtils.cleanUpReadme)(metadata);
360
+ metadata.contributors = (0, _utils.normalizeContributors)(metadata.contributors);
361
+ debug('%s` contributors normalized', name);
362
+ const hasVersion = data.versions[version] != null;
363
+
364
+ if (hasVersion) {
365
+ debug('%s version %s already exists', name, version);
366
+ throw _core.errorUtils.getConflict();
367
+ } // if uploaded tarball has a different shasum, it's very likely that we
368
+ // have some kind of error
369
+
370
+
371
+ if (_core.validatioUtils.isObject(metadata.dist) && _lodash.default.isString(metadata.dist.tarball)) {
372
+ const tarball = metadata.dist.tarball.replace(/.*\//, '');
373
+
374
+ if (_core.validatioUtils.isObject(data._attachments[tarball])) {
375
+ if (_lodash.default.isNil(data._attachments[tarball].shasum) === false && _lodash.default.isNil(metadata.dist.shasum) === false) {
376
+ if (data._attachments[tarball].shasum != metadata.dist.shasum) {
377
+ const errorMessage = `shasum error, ` + `${data._attachments[tarball].shasum} != ${metadata.dist.shasum}`;
378
+ throw _core.errorUtils.getBadRequest(errorMessage);
379
+ }
380
+ }
381
+
382
+ const currentDate = new Date().toISOString(); // some old storage do not have this field #740
383
+
384
+ if (_lodash.default.isNil(data.time)) {
385
+ data.time = {};
386
+ }
387
+
388
+ data.time['modified'] = currentDate;
389
+
390
+ if ('created' in data.time === false) {
391
+ data.time.created = currentDate;
392
+ }
393
+
394
+ data.time[version] = currentDate;
395
+ data._attachments[tarball].version = version;
396
+ }
397
+ }
398
+
399
+ data.versions[version] = metadata;
400
+ (0, _storageUtils.tagVersion)(data, version, tag);
401
+
402
+ try {
403
+ debug('%s` add on database', name);
404
+ await this.storagePlugin.add(name);
405
+ } catch (err) {
406
+ throw _core.errorUtils.getBadData(err.message);
407
+ }
408
+
409
+ return data;
410
+ }); // this._updatePackage(
411
+ // name,
412
+ // async (data, cb: Callback): Promise<void> => {
413
+ // debug('%s package is being updated', name);
414
+ // // keep only one readme per package
415
+ // data.readme = metadata.readme;
416
+ // debug('%s` readme mutated', name);
417
+ // // TODO: lodash remove
418
+ // metadata = cleanUpReadme(metadata);
419
+ // metadata.contributors = normalizeContributors(metadata.contributors as Author[]);
420
+ // debug('%s` contributors normalized', name);
421
+ // const hasVersion = data.versions[version] != null;
422
+ // if (hasVersion) {
423
+ // debug('%s version %s already exists', name, version);
424
+ // return cb(errorUtils.getConflict());
425
+ // }
426
+ // // if uploaded tarball has a different shasum, it's very likely that we
427
+ // // have some kind of error
428
+ // if (validatioUtils.isObject(metadata.dist) && _.isString(metadata.dist.tarball)) {
429
+ // const tarball = metadata.dist.tarball.replace(/.*\//, '');
430
+ // if (validatioUtils.isObject(data._attachments[tarball])) {
431
+ // if (
432
+ // _.isNil(data._attachments[tarball].shasum) === false &&
433
+ // _.isNil(metadata.dist.shasum) === false
434
+ // ) {
435
+ // if (data._attachments[tarball].shasum != metadata.dist.shasum) {
436
+ // const errorMessage =
437
+ // `shasum error, ` +
438
+ // `${data._attachments[tarball].shasum} != ${metadata.dist.shasum}`;
439
+ // return cb(errorUtils.getBadRequest(errorMessage));
440
+ // }
441
+ // }
442
+ // const currentDate = new Date().toISOString();
443
+ // // some old storage do not have this field #740
444
+ // if (_.isNil(data.time)) {
445
+ // data.time = {};
446
+ // }
447
+ // data.time['modified'] = currentDate;
448
+ // if ('created' in data.time === false) {
449
+ // data.time.created = currentDate;
450
+ // }
451
+ // data.time[version] = currentDate;
452
+ // data._attachments[tarball].version = version;
453
+ // }
454
+ // }
455
+ // data.versions[version] = metadata;
456
+ // tagVersion(data, version, tag);
457
+ // try {
458
+ // debug('%s` add on database', name);
459
+ // await this.storagePlugin.add(name);
460
+ // cb();
461
+ // } catch (err: any) {
462
+ // cb(errorUtils.getBadData(err.message));
463
+ // }
464
+ // },
465
+ // callback
466
+ // );
467
+ }
353
468
  /**
354
469
  * Merge a new list of tags for a local packages with the existing one.
355
470
  * @param {*} pkgName
@@ -454,6 +569,72 @@ class LocalStorage {
454
569
  callback();
455
570
  });
456
571
  }
572
+ /**
573
+ * Update the package metadata, tags and attachments (tarballs).
574
+ * Note: Currently supports unpublishing and deprecation.
575
+ * @param {*} name
576
+ * @param {*} incomingPkg
577
+ * @param {*} revision
578
+ * @param {*} callback
579
+ * @return {Function}
580
+ */
581
+
582
+
583
+ async changePackageNext(name, incomingPkg, revision) {
584
+ debug(`change package tags for %o revision %s`, name, revision);
585
+
586
+ if (!_core.validatioUtils.isObject(incomingPkg.versions) || !_core.validatioUtils.isObject(incomingPkg[_core.DIST_TAGS])) {
587
+ debug(`change package bad data for %o`, name);
588
+ throw _core.errorUtils.getBadData();
589
+ }
590
+
591
+ debug(`change package udapting package for %o`, name);
592
+ await this.updatePackageNext(name, async localData => {
593
+ for (const version in localData.versions) {
594
+ const incomingVersion = incomingPkg.versions[version];
595
+
596
+ if (_lodash.default.isNil(incomingVersion)) {
597
+ this.logger.info({
598
+ name: name,
599
+ version: version
600
+ }, 'unpublishing @{name}@@{version}'); // FIXME: I prefer return a new object rather mutate the metadata
601
+
602
+ delete localData.versions[version];
603
+ delete localData.time[version];
604
+
605
+ for (const file in localData._attachments) {
606
+ if (localData._attachments[file].version === version) {
607
+ delete localData._attachments[file].version;
608
+ }
609
+ }
610
+ } else if (Object.prototype.hasOwnProperty.call(incomingVersion, 'deprecated')) {
611
+ const incomingDeprecated = incomingVersion.deprecated;
612
+
613
+ if (incomingDeprecated != localData.versions[version].deprecated) {
614
+ if (!incomingDeprecated) {
615
+ this.logger.info({
616
+ name: name,
617
+ version: version
618
+ }, 'undeprecating @{name}@@{version}');
619
+ delete localData.versions[version].deprecated;
620
+ } else {
621
+ this.logger.info({
622
+ name: name,
623
+ version: version
624
+ }, 'deprecating @{name}@@{version}');
625
+ localData.versions[version].deprecated = incomingDeprecated;
626
+ }
627
+
628
+ localData.time.modified = new Date().toISOString();
629
+ }
630
+ }
631
+ }
632
+
633
+ localData[_core.USERS] = incomingPkg[_core.USERS];
634
+ localData[_core.DIST_TAGS] = incomingPkg[_core.DIST_TAGS];
635
+ return localData;
636
+ });
637
+ }
457
638
  /**
458
639
  * Remove a tarball.
459
640
  * @param {*} name
@@ -676,11 +857,26 @@ class LocalStorage {
676
857
  });
677
858
  return stream;
678
859
  }
860
+
861
+ async getPackageMetadataNext(name) {
862
+ const storage = this._getLocalStorage(name);
863
+
864
+ debug('get package metadata for %o', name);
865
+
866
+ if (typeof storage === 'undefined') {
867
+ // TODO: this might be a better an error to throw
868
+ // if storage is not there cannot be 404.
869
+ throw _core.errorUtils.getNotFound();
870
+ }
871
+
872
+ return await this._readPackageNext(name, storage);
873
+ }
679
874
  /**
680
875
  * Retrieve a package by name.
681
876
  * @param {*} name
682
877
  * @param {*} callback
683
878
  * @return {Function}
879
+ * @deprecated
684
880
  */
685
881
 
686
882
 
@@ -776,6 +972,7 @@ class LocalStorage {
776
972
  * Read a json file from storage.
777
973
  * @param {Object} storage
778
974
  * @param {Function} callback
975
+ * @deprecated
779
976
  */
780
977
 
781
978
 
@@ -793,6 +990,24 @@ class LocalStorage {
793
990
  callback(err, (0, _storageUtils.normalizePackage)(result));
794
991
  });
795
992
  }
993
+
994
+ async _readPackageNext(name, storage) {
995
+ try {
996
+ const result = await storage.readPackageNext(name);
997
+ return (0, _storageUtils.normalizePackage)(result);
998
+ } catch (err) {
999
+ if (err.code === _storageUtils.STORAGE.NO_SUCH_FILE_ERROR || err.code === _core.HTTP_STATUS.NOT_FOUND) {
1000
+ debug('package %s not found', name);
1001
+ throw _core.errorUtils.getNotFound();
1002
+ }
1003
+
1004
+ this.logger.error({
1005
+ err: err,
1006
+ file: _storageUtils.STORAGE.PACKAGE_FILE_NAME
1007
+ }, `error reading @{file}: @{!err.message}`);
1008
+ throw _core.errorUtils.getInternalError();
1009
+ }
1010
+ }
796
1011
  /**
797
1012
  * Retrieve either a previous created local package or a boilerplate.
798
1013
  * @param {*} pkgName
@@ -851,14 +1066,44 @@ class LocalStorage {
851
1066
  */
852
1067
 
853
1068
 
854
- _updatePackage(name, updateHandler, callback) {
1069
+ _updatePackage(name, updateHandler, onEnd) {
855
1070
  const storage = this._getLocalStorage(name);
856
1071
 
857
1072
  if (!storage) {
858
- return callback(_core.errorUtils.getNotFound());
1073
+ return onEnd(_core.errorUtils.getNotFound());
859
1074
  }
860
1075
 
861
- storage.updatePackage(name, updateHandler, this._writePackage.bind(this), _storageUtils.normalizePackage, callback);
1076
+ storage.updatePackage(name, updateHandler, this._writePackage.bind(this), _storageUtils.normalizePackage, onEnd);
1077
+ }
1078
+ /**
1079
+ * @param {*} name package name
1080
+ * @param {*} updateHandler function(package, cb) - update function
1081
+ * @param {*} callback callback that gets invoked after it's all updated
1082
+ * @return {Function}
1083
+ */
1084
+
1085
+
1086
+ async updatePackageNext(name, updateHandler) {
1087
+ const storage = this._getLocalStorage(name);
1088
+
1089
+ if (!storage) {
1090
+ throw _core.errorUtils.getNotFound();
1091
+ } // we update the package on the local storage
1092
+
1093
+
1094
+ const updatedManifest = await storage.updatePackageNext(name, updateHandler); // after correctly updated write to the storage
1095
+
1096
+ try {
1097
+ await this.writePackageNext(name, (0, _storageUtils.normalizePackage)(updatedManifest));
1098
+ } catch (err) {
1099
+ if (err.code === resourceNotAvailable) {
1100
+ throw _core.errorUtils.getInternalError('resource temporarily unavailable');
1101
+ } else if (err.code === noSuchFile) {
1102
+ throw _core.errorUtils.getNotFound();
1103
+ } else {
1104
+ throw err;
1105
+ }
1106
+ }
862
1107
  }
863
1108
  /**
864
1109
  * Update the revision (_rev) string for a package.
@@ -879,6 +1124,17 @@ class LocalStorage {
879
1124
  storage.savePackage(name, this._setDefaultRevision(json), callback);
880
1125
  }
881
1126
 
1127
+ async writePackageNext(name, json) {
1128
+ const storage = this._getLocalStorage(name);
1129
+
1130
+ if (_lodash.default.isNil(storage)) {
1131
+ // TODO: replace here 500 error
1132
+ throw _core.errorUtils.getBadData();
1133
+ }
1134
+
1135
+ await storage.savePackageNext(name, this._setDefaultRevision(json));
1136
+ }
1137
+
882
1138
  _setDefaultRevision(json) {
883
1139
  // calculate revision from couch db
884
1140
  if (_lodash.default.isString(json._rev) === false) {