@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 +69 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +13 -0
- package/build/index.js.map +1 -1
- package/build/local-storage.d.ts +26 -1
- package/build/local-storage.js +268 -12
- package/build/local-storage.js.map +1 -1
- package/build/search.js +4 -15
- package/build/search.js.map +1 -1
- package/build/star-utils.d.ts +9 -0
- package/build/star-utils.js +50 -0
- package/build/star-utils.js.map +1 -0
- package/build/storage-utils.d.ts +3 -1
- package/build/storage-utils.js +20 -2
- package/build/storage-utils.js.map +1 -1
- package/build/storage.d.ts +25 -1
- package/build/storage.js +214 -19
- package/build/storage.js.map +1 -1
- package/build/type.d.ts +24 -1
- package/package.json +19 -15
- package/src/index.ts +1 -0
- package/src/local-storage.ts +281 -4
- package/src/star-utils.ts +38 -0
- package/src/storage-utils.ts +22 -5
- package/src/storage.ts +251 -7
- package/src/type.ts +28 -1
- package/test/search.spec.ts +3 -2
- package/test/storage-utils.spec.ts +95 -1
- package/test/storage.spec.ts +245 -0
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
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) {
|
package/build/index.js.map
CHANGED
|
@@ -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"}
|
package/build/local-storage.d.ts
CHANGED
|
@@ -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 |
|
|
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
|
package/build/local-storage.js
CHANGED
|
@@ -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,
|
|
1069
|
+
_updatePackage(name, updateHandler, onEnd) {
|
|
855
1070
|
const storage = this._getLocalStorage(name);
|
|
856
1071
|
|
|
857
1072
|
if (!storage) {
|
|
858
|
-
return
|
|
1073
|
+
return onEnd(_core.errorUtils.getNotFound());
|
|
859
1074
|
}
|
|
860
1075
|
|
|
861
|
-
storage.updatePackage(name, updateHandler, this._writePackage.bind(this), _storageUtils.normalizePackage,
|
|
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) {
|