@verdaccio/store 6.0.0-6-next.18 → 6.0.0-6-next.21
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 +41 -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 +22 -1
- package/build/local-storage.js +240 -4
- package/build/local-storage.js.map +1 -1
- package/build/search.d.ts +0 -43
- package/build/search.js +31 -142
- 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 -5
- package/build/storage-utils.js.map +1 -1
- package/build/storage.d.ts +23 -1
- package/build/storage.js +149 -53
- package/build/storage.js.map +1 -1
- package/build/type.d.ts +10 -1
- package/package.json +14 -18
- package/src/index.ts +1 -0
- package/src/local-storage.ts +255 -4
- package/src/search.ts +21 -124
- package/src/star-utils.ts +38 -0
- package/src/storage-utils.ts +21 -6
- package/src/storage.ts +188 -62
- package/src/type.ts +11 -1
- package/test/search.spec.ts +2 -66
- package/test/storage-utils.spec.ts +95 -1
- package/test/storage.spec.ts +7 -7
package/build/search.js
CHANGED
|
@@ -3,17 +3,13 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.SearchManager =
|
|
6
|
+
exports.SearchManager = void 0;
|
|
7
7
|
exports.removeDuplicates = removeDuplicates;
|
|
8
8
|
|
|
9
9
|
var _debug = _interopRequireDefault(require("debug"));
|
|
10
10
|
|
|
11
11
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
12
12
|
|
|
13
|
-
var _lunr = _interopRequireDefault(require("lunr"));
|
|
14
|
-
|
|
15
|
-
var _lunrMutableIndexes = _interopRequireDefault(require("lunr-mutable-indexes"));
|
|
16
|
-
|
|
17
13
|
var _stream = require("stream");
|
|
18
14
|
|
|
19
15
|
var _core = require("@verdaccio/core");
|
|
@@ -28,7 +24,10 @@ const debug = (0, _debug.default)('verdaccio:storage:search');
|
|
|
28
24
|
|
|
29
25
|
function removeDuplicates(results) {
|
|
30
26
|
const pkgNames = [];
|
|
31
|
-
|
|
27
|
+
|
|
28
|
+
const orderByResults = _lodash.default.orderBy(results, ['verdaccioPrivate', 'asc']);
|
|
29
|
+
|
|
30
|
+
return orderByResults.filter(pkg => {
|
|
32
31
|
var _pkg$package, _pkg$package2;
|
|
33
32
|
|
|
34
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)) {
|
|
@@ -57,18 +56,23 @@ class TransFormResults extends _stream.Transform {
|
|
|
57
56
|
|
|
58
57
|
_transform(chunk, _encoding, callback) {
|
|
59
58
|
if (_lodash.default.isArray(chunk)) {
|
|
59
|
+
// from remotes we should expect chunks as arrays
|
|
60
60
|
chunk.filter(pkgItem => {
|
|
61
61
|
var _pkgItem$package;
|
|
62
62
|
|
|
63
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
64
|
return true;
|
|
65
65
|
}).forEach(pkgItem => {
|
|
66
|
-
this.push(pkgItem
|
|
66
|
+
this.push({ ...pkgItem,
|
|
67
|
+
verdaccioPkgCached: false,
|
|
68
|
+
verdaccioPrivate: false
|
|
69
|
+
});
|
|
67
70
|
});
|
|
68
71
|
return callback();
|
|
69
72
|
} else {
|
|
70
73
|
var _chunk$package;
|
|
71
74
|
|
|
75
|
+
// local we expect objects
|
|
72
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}`);
|
|
73
77
|
this.push(chunk);
|
|
74
78
|
return callback();
|
|
@@ -111,28 +115,37 @@ class SearchManager {
|
|
|
111
115
|
_logger.logger.fatal({
|
|
112
116
|
uplinkId
|
|
113
117
|
}, 'uplink @upLinkId not found');
|
|
114
|
-
|
|
115
|
-
throw new Error(`uplink ${uplinkId} not found`);
|
|
116
118
|
}
|
|
117
119
|
|
|
118
120
|
return this.consumeSearchStream(uplinkId, uplink, options, streamPassThrough);
|
|
119
121
|
});
|
|
120
122
|
|
|
121
123
|
try {
|
|
122
|
-
debug('search uplinks');
|
|
123
|
-
|
|
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]);
|
|
124
128
|
debug('search uplinks done');
|
|
125
129
|
} catch (err) {
|
|
126
130
|
_logger.logger.error({
|
|
127
|
-
err
|
|
131
|
+
err: err === null || err === void 0 ? void 0 : err.message
|
|
128
132
|
}, ' error on uplinks search @{err}');
|
|
129
133
|
|
|
130
134
|
streamPassThrough.emit('error', err);
|
|
131
|
-
throw err;
|
|
132
135
|
}
|
|
133
136
|
|
|
134
137
|
debug('search local');
|
|
135
|
-
|
|
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
|
+
|
|
136
149
|
const data = [];
|
|
137
150
|
const outPutStream = new _stream.PassThrough({
|
|
138
151
|
objectMode: true
|
|
@@ -141,7 +154,7 @@ class SearchManager {
|
|
|
141
154
|
if (err) {
|
|
142
155
|
throw _core.errorUtils.getInternalError(err ? err.message : 'unknown error');
|
|
143
156
|
} else {
|
|
144
|
-
debug('
|
|
157
|
+
debug('pipeline succeeded');
|
|
145
158
|
}
|
|
146
159
|
});
|
|
147
160
|
outPutStream.on('data', chunk => {
|
|
@@ -149,9 +162,9 @@ class SearchManager {
|
|
|
149
162
|
});
|
|
150
163
|
return new Promise(resolve => {
|
|
151
164
|
outPutStream.on('finish', async () => {
|
|
152
|
-
const
|
|
153
|
-
debug('stream
|
|
154
|
-
return resolve(
|
|
165
|
+
const searchFinalResults = removeDuplicates(data);
|
|
166
|
+
debug('search stream total results: %o', searchFinalResults.length);
|
|
167
|
+
return resolve(searchFinalResults);
|
|
155
168
|
});
|
|
156
169
|
debug('search done');
|
|
157
170
|
});
|
|
@@ -180,130 +193,6 @@ class SearchManager {
|
|
|
180
193
|
}
|
|
181
194
|
|
|
182
195
|
}
|
|
183
|
-
/**
|
|
184
|
-
* Handle the search Indexer.
|
|
185
|
-
*/
|
|
186
|
-
|
|
187
196
|
|
|
188
197
|
exports.SearchManager = SearchManager;
|
|
189
|
-
|
|
190
|
-
class Search {
|
|
191
|
-
// @ts-ignore
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Constructor.
|
|
195
|
-
*/
|
|
196
|
-
constructor() {
|
|
197
|
-
this.index = (0, _lunrMutableIndexes.default)(function () {
|
|
198
|
-
// FIXME: there is no types for this library
|
|
199
|
-
|
|
200
|
-
/* eslint no-invalid-this:off */
|
|
201
|
-
// @ts-ignore
|
|
202
|
-
this.field('name', {
|
|
203
|
-
boost: 10
|
|
204
|
-
}); // @ts-ignore
|
|
205
|
-
|
|
206
|
-
this.field('description', {
|
|
207
|
-
boost: 4
|
|
208
|
-
}); // @ts-ignore
|
|
209
|
-
|
|
210
|
-
this.field('author', {
|
|
211
|
-
boost: 6
|
|
212
|
-
}); // @ts-ignore
|
|
213
|
-
|
|
214
|
-
this.field('keywords', {
|
|
215
|
-
boost: 7
|
|
216
|
-
}); // @ts-ignore
|
|
217
|
-
|
|
218
|
-
this.field('version'); // @ts-ignore
|
|
219
|
-
|
|
220
|
-
this.field('readme');
|
|
221
|
-
});
|
|
222
|
-
this.index.builder.pipeline.remove(_lunr.default.stemmer);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
init() {
|
|
226
|
-
return Promise.resolve();
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Performs a query to the indexer.
|
|
230
|
-
* If the keyword is a * it returns all local elements
|
|
231
|
-
* otherwise performs a search
|
|
232
|
-
* @param {*} q the keyword
|
|
233
|
-
* @return {Array} list of results.
|
|
234
|
-
*/
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
query(query) {
|
|
238
|
-
const localStorage = this.storage.localStorage;
|
|
239
|
-
return query === '*' ? localStorage.storagePlugin.get(items => {
|
|
240
|
-
items.map(function (pkg) {
|
|
241
|
-
return {
|
|
242
|
-
ref: pkg,
|
|
243
|
-
score: 1
|
|
244
|
-
};
|
|
245
|
-
});
|
|
246
|
-
}) : this.index.search(`*${query}*`);
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Add a new element to index
|
|
250
|
-
* @param {*} pkg the package
|
|
251
|
-
*/
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
add(pkg) {
|
|
255
|
-
this.index.add({
|
|
256
|
-
id: pkg.name,
|
|
257
|
-
name: pkg.name,
|
|
258
|
-
description: pkg.description,
|
|
259
|
-
version: `v${pkg.version}`,
|
|
260
|
-
keywords: pkg.keywords,
|
|
261
|
-
author: pkg._npmUser ? pkg._npmUser.name : '???'
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Remove an element from the index.
|
|
266
|
-
* @param {*} name the id element
|
|
267
|
-
*/
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
remove(name) {
|
|
271
|
-
this.index.remove({
|
|
272
|
-
id: name
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Force a re-index.
|
|
277
|
-
*/
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
reindex() {
|
|
281
|
-
this.storage.getLocalDatabase((error, packages) => {
|
|
282
|
-
if (error) {
|
|
283
|
-
// that function shouldn't produce any
|
|
284
|
-
throw error;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
let i = packages.length;
|
|
288
|
-
|
|
289
|
-
while (i--) {
|
|
290
|
-
this.add(packages[i]);
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Set up the {Storage}
|
|
296
|
-
* @param {*} storage An storage reference.
|
|
297
|
-
*/
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
configureStorage(storage) {
|
|
301
|
-
this.storage = storage;
|
|
302
|
-
this.reindex();
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const SearchInstance = new Search();
|
|
308
|
-
exports.SearchInstance = SearchInstance;
|
|
309
198
|
//# sourceMappingURL=search.js.map
|
package/build/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/search.ts"],"names":["debug","removeDuplicates","results","pkgNames","filter","pkg","includes","package","name","push","TransFormResults","Transform","constructor","options","_transform","chunk","_encoding","callback","_","isArray","pkgItem","forEach","SearchManager","uplinks","storage","localStorage","proxyList","uplinksList","Object","keys","search","transformResults","objectMode","streamPassThrough","PassThrough","upLinkList","searchUplinksStreams","map","uplinkId","uplink","logger","fatal","Error","consumeSearchStream","Promise","all","err","error","emit","query","data","outPutStream","errorUtils","getInternalError","message","on","resolve","checkAccessPromises","length","searchPassThrough","then","bodyStream","pipe","end","Search","index","field","boost","builder","pipeline","remove","lunr","stemmer","init","storagePlugin","get","items","ref","score","add","id","description","version","keywords","author","_npmUser","reindex","getLocalDatabase","packages","i","configureStorage","SearchInstance"],"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 lunr from 'lunr';\nimport lunrMutable from 'lunr-mutable-indexes';\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}\nexport interface IWebSearch {\n index: lunrMutable.index;\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 return results.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 (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);\n });\n return callback();\n } else {\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 throw new Error(`uplink ${uplinkId} not found`);\n }\n return this.consumeSearchStream(uplinkId, uplink, options, streamPassThrough);\n });\n\n try {\n debug('search uplinks');\n await Promise.all([...searchUplinksStreams]);\n debug('search uplinks done');\n } catch (err) {\n logger.error({ err }, ' error on uplinks search @{err}');\n streamPassThrough.emit('error', err);\n throw err;\n }\n debug('search local');\n await this.localStorage.search(streamPassThrough, options.query as searchUtils.SearchQuery);\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 checkAccessPromises: searchUtils.SearchPackageItem[] = removeDuplicates(data);\n debug('stream finish event %s', checkAccessPromises.length);\n return resolve(checkAccessPromises);\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\n/**\n * Handle the search Indexer.\n */\nclass Search implements IWebSearch {\n public readonly index: lunrMutable.index;\n // @ts-ignore\n public storage: Storage;\n\n /**\n * Constructor.\n */\n public constructor() {\n this.index = lunrMutable(function (): void {\n // FIXME: there is no types for this library\n /* eslint no-invalid-this:off */\n // @ts-ignore\n this.field('name', { boost: 10 });\n // @ts-ignore\n this.field('description', { boost: 4 });\n // @ts-ignore\n this.field('author', { boost: 6 });\n // @ts-ignore\n this.field('keywords', { boost: 7 });\n // @ts-ignore\n this.field('version');\n // @ts-ignore\n this.field('readme');\n });\n\n this.index.builder.pipeline.remove(lunr.stemmer);\n }\n\n public init() {\n return Promise.resolve();\n }\n\n /**\n * Performs a query to the indexer.\n * If the keyword is a * it returns all local elements\n * otherwise performs a search\n * @param {*} q the keyword\n * @return {Array} list of results.\n */\n public query(query: string): ISearchResult[] {\n const localStorage = this.storage.localStorage as LocalStorage;\n\n return query === '*'\n ? (localStorage.storagePlugin as any).get((items): any => {\n items.map(function (pkg): any {\n return { ref: pkg, score: 1 };\n });\n })\n : this.index.search(`*${query}*`);\n }\n\n /**\n * Add a new element to index\n * @param {*} pkg the package\n */\n public add(pkg: Version): void {\n this.index.add({\n id: pkg.name,\n name: pkg.name,\n description: pkg.description,\n version: `v${pkg.version}`,\n keywords: pkg.keywords,\n author: pkg._npmUser ? pkg._npmUser.name : '???',\n });\n }\n\n /**\n * Remove an element from the index.\n * @param {*} name the id element\n */\n public remove(name: string): void {\n this.index.remove({ id: name });\n }\n\n /**\n * Force a re-index.\n */\n public reindex(): void {\n this.storage.getLocalDatabase((error, packages): void => {\n if (error) {\n // that function shouldn't produce any\n throw error;\n }\n let i = packages.length;\n while (i--) {\n this.add(packages[i]);\n }\n });\n }\n\n /**\n * Set up the {Storage}\n * @param {*} storage An storage reference.\n */\n public configureStorage(storage: Storage): void {\n this.storage = storage;\n this.reindex();\n }\n}\n\nconst SearchInstance = new Search();\n\nexport { SearchInstance };\n"],"file":"search.js"}
|
|
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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isPublishablePackage = isPublishablePackage;
|
|
7
|
+
exports.isRelatedToDeprecation = isRelatedToDeprecation;
|
|
8
|
+
exports.validateInputs = validateInputs;
|
|
9
|
+
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Check whether the package metadta has enough data to be published
|
|
16
|
+
* @param pkg metadata
|
|
17
|
+
*/
|
|
18
|
+
function isPublishablePackage(pkg) {
|
|
19
|
+
const keys = Object.keys(pkg);
|
|
20
|
+
return _lodash.default.includes(keys, 'versions');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function isRelatedToDeprecation(pkgInfo) {
|
|
24
|
+
const {
|
|
25
|
+
versions
|
|
26
|
+
} = pkgInfo;
|
|
27
|
+
|
|
28
|
+
for (const version in versions) {
|
|
29
|
+
if (Object.prototype.hasOwnProperty.call(versions[version], 'deprecated')) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function validateInputs(localUsers, username, isStar) {
|
|
38
|
+
const isExistlocalUsers = _lodash.default.isNil(localUsers[username]) === false;
|
|
39
|
+
|
|
40
|
+
if (isStar && isExistlocalUsers && localUsers[username]) {
|
|
41
|
+
return true;
|
|
42
|
+
} else if (!isStar && isExistlocalUsers) {
|
|
43
|
+
return false;
|
|
44
|
+
} else if (!isStar && !isExistlocalUsers) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=star-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/build/storage-utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Package, StringValue, Version } from '@verdaccio/types';
|
|
1
|
+
import { AttachMents, Package, StringValue, Version, Versions } from '@verdaccio/types';
|
|
2
2
|
import { LocalStorage } from './local-storage';
|
|
3
3
|
export declare const STORAGE: {
|
|
4
4
|
PACKAGE_FILE_NAME: string;
|
|
@@ -35,3 +35,5 @@ export declare function prepareSearchPackage(data: Package): any;
|
|
|
35
35
|
* @return {Boolean} whether a package has been tagged
|
|
36
36
|
*/
|
|
37
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;
|
package/build/storage-utils.js
CHANGED
|
@@ -11,6 +11,8 @@ exports.cleanUpReadme = cleanUpReadme;
|
|
|
11
11
|
exports.generatePackageTemplate = generatePackageTemplate;
|
|
12
12
|
exports.generateRevision = generateRevision;
|
|
13
13
|
exports.getLatestReadme = getLatestReadme;
|
|
14
|
+
exports.hasInvalidPublishBody = hasInvalidPublishBody;
|
|
15
|
+
exports.isDifferentThanOne = isDifferentThanOne;
|
|
14
16
|
exports.mergeUplinkTimeIntoLocal = mergeUplinkTimeIntoLocal;
|
|
15
17
|
exports.normalizePackage = normalizePackage;
|
|
16
18
|
exports.prepareSearchPackage = prepareSearchPackage;
|
|
@@ -25,8 +27,6 @@ var _core = require("@verdaccio/core");
|
|
|
25
27
|
|
|
26
28
|
var _utils = require("@verdaccio/utils");
|
|
27
29
|
|
|
28
|
-
var _search = require("./search");
|
|
29
|
-
|
|
30
30
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
31
|
|
|
32
32
|
const STORAGE = {
|
|
@@ -164,11 +164,9 @@ function checkPackageLocal(name, localStorage) {
|
|
|
164
164
|
|
|
165
165
|
function publishPackage(name, metadata, localStorage) {
|
|
166
166
|
return new Promise((resolve, reject) => {
|
|
167
|
-
localStorage.addPackage(name, metadata,
|
|
167
|
+
localStorage.addPackage(name, metadata, err => {
|
|
168
168
|
if (!_lodash.default.isNull(err)) {
|
|
169
169
|
return reject(err);
|
|
170
|
-
} else if (!_lodash.default.isUndefined(latest)) {
|
|
171
|
-
_search.SearchInstance.add(latest);
|
|
172
170
|
}
|
|
173
171
|
|
|
174
172
|
return resolve();
|
|
@@ -264,4 +262,21 @@ function tagVersion(data, version, tag) {
|
|
|
264
262
|
|
|
265
263
|
return false;
|
|
266
264
|
}
|
|
265
|
+
|
|
266
|
+
function isDifferentThanOne(versions) {
|
|
267
|
+
return Object.keys(versions).length !== 1;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function hasInvalidPublishBody(manifest) {
|
|
271
|
+
if (!manifest) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const {
|
|
276
|
+
_attachments,
|
|
277
|
+
versions
|
|
278
|
+
} = manifest;
|
|
279
|
+
const res = (0, _utils.isObject)(_attachments) === false || isDifferentThanOne(_attachments) || (0, _utils.isObject)(versions) === false || isDifferentThanOne(versions);
|
|
280
|
+
return res;
|
|
281
|
+
}
|
|
267
282
|
//# sourceMappingURL=storage-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
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","latest","isNull","isUndefined","SearchInstance","add","checkPackageRemote","isAllowPublishOffline","syncMetadata","packageJsonLocal","upLinksErrors","errorItem","length","getServiceUnavailable","UPLINK_OFFLINE_PUBLISH","mergeUplinkTimeIntoLocal","localMetadata","remoteMetadata","Object","assign","prepareSearchPackage","data","pkgUtils","getLatest","description","maintainers","author","filter","Boolean","repository","readmeFilename","homepage","keywords","bugs","license","tagVersion","semver","parse"],"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 { Package, StringValue, Version } from '@verdaccio/types';\nimport { generateRandomHexString, isNil, normalizeDistTags } from '@verdaccio/utils';\n\nimport { LocalStorage } from './local-storage';\nimport { SearchInstance } from './search';\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, latest): void => {\n if (!_.isNull(err)) {\n return reject(err);\n } else if (!_.isUndefined(latest)) {\n SearchInstance.add(latest);\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"],"file":"storage-utils.js"}
|
|
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":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAEA;;AAGA;;;;AAIO,MAAMA,OAAO,GAAG;AACrBC,EAAAA,iBAAiB,EAAE,cADE;AAErBC,EAAAA,gBAAgB,EAAE,SAFG;AAGrBC,EAAAA,kBAAkB,EAAE,QAHC;AAIrBC,EAAAA,gBAAgB,EAAE;AAJG,CAAhB;;;AAOA,SAASC,uBAAT,CAAiCC,IAAjC,EAAwD;AAC7D,SAAO;AACL;AACAA,IAAAA,IAFK;AAGLC,IAAAA,QAAQ,EAAE,EAHL;AAILC,IAAAA,IAAI,EAAE,EAJD;AAKL,KAACC,WAAD,GAAS,EALJ;AAML,KAACC,eAAD,GAAa,EANR;AAOLC,IAAAA,QAAQ,EAAE,EAPL;AAQLC,IAAAA,UAAU,EAAE,EARP;AASLC,IAAAA,YAAY,EAAE,EATT;AAULC,IAAAA,IAAI,EAAE;AAVD,GAAP;AAYD;AAED;AACA;AACA;AACA;;;AACO,SAASC,gBAAT,CAA0BC,GAA1B,EAAiD;AACtD,QAAMC,aAAa,GAAG,CAAC,UAAD,EAAa,WAAb,EAA0B,YAA1B,EAAwC,cAAxC,EAAwD,UAAxD,EAAoE,MAApE,CAAtB;AAEAA,EAAAA,aAAa,CAACC,OAAd,CAAuBC,GAAD,IAAe;AACnC,UAAMC,OAAO,GAAGJ,GAAG,CAACG,GAAD,CAAnB;;AAEA,QAAI,kBAAMC,OAAN,KAAkBC,qBAAeC,QAAf,CAAwBF,OAAxB,MAAqC,KAA3D,EAAkE;AAChEJ,MAAAA,GAAG,CAACG,GAAD,CAAH,GAAW,EAAX;AACD;AACF,GAND;;AAQA,MAAII,gBAAEC,QAAF,CAAWR,GAAG,CAACF,IAAf,MAAyB,KAA7B,EAAoC;AAClCE,IAAAA,GAAG,CAACF,IAAJ,GAAWd,OAAO,CAACI,gBAAnB;AACD;;AAED,MAAImB,gBAAEC,QAAF,CAAWR,GAAG,CAACS,GAAf,MAAwB,KAA5B,EAAmC;AACjCT,IAAAA,GAAG,CAACS,GAAJ,GAAUT,GAAG,CAACV,IAAd;AACD,GAjBqD,CAmBtD;;;AACA,SAAO,8BAAkBU,GAAlB,CAAP;AACD;;AAEM,SAASU,gBAAT,CAA0BC,GAA1B,EAA+C;AACpD,QAAMb,IAAI,GAAGa,GAAG,CAACC,KAAJ,CAAU,GAAV,CAAb;;AAEA,SAAO,CAAC,CAACd,IAAI,CAAC,CAAD,CAAL,IAAY,CAAb,IAAkB,CAAlB,GAAsB,GAAtB,GAA4B,qCAAnC;AACD;;AAEM,SAASe,eAAT,CAAyBb,GAAzB,EAA+C;AACpD,QAAMT,QAAQ,GAAGS,GAAG,CAAC,UAAD,CAAH,IAAmB,EAApC;AACA,QAAMc,QAAQ,GAAGd,GAAG,CAACN,eAAD,CAAH,IAAkB,EAAnC,CAFoD,CAGpD;;AACA,QAAMqB,aAA4B,GAAGD,QAAQ,CAAC,QAAD,CAAR,GAAqBvB,QAAQ,CAACuB,QAAQ,CAAC,QAAD,CAAT,CAAR,IAAgC,EAArD,GAA0D,EAA/F;;AACA,MAAIE,MAAM,GAAGT,gBAAEU,IAAF,CAAOjB,GAAG,CAACgB,MAAJ,IAAcD,aAAa,CAACC,MAA5B,IAAsC,EAA7C,CAAb;;AACA,MAAIA,MAAJ,EAAY;AACV,WAAOA,MAAP;AACD,GARmD,CAUpD;AACA;;;AACA,QAAME,sBAAsB,GAAG,CAAC,MAAD,EAAS,MAAT,EAAiB,OAAjB,EAA0B,MAA1B,EAAkC,KAAlC,EAAyC,QAAzC,CAA/B;AACAA,EAAAA,sBAAsB,CAAChB,OAAvB,CAA+B,UAAUiB,GAAV,EAA8B;AAC3D,QAAIH,MAAJ,EAAY;AACV,aAAOA,MAAP;AACD;;AACD,UAAMI,OAAsB,GAAGN,QAAQ,CAACK,GAAD,CAAR,GAAgB5B,QAAQ,CAACuB,QAAQ,CAACK,GAAD,CAAT,CAAR,IAA2B,EAA3C,GAAgD,EAA/E;AACAH,IAAAA,MAAM,GAAGT,gBAAEU,IAAF,CAAOG,OAAO,CAACJ,MAAR,IAAkBA,MAAzB,CAAT;AACD,GAND;AAOA,SAAOA,MAAP;AACD,C,CAED;;;AACO,SAASK,aAAT,CAAuBD,OAAvB,EAA8C;AACnD,MAAI,kBAAMA,OAAN,MAAmB,KAAvB,EAA8B;AAC5B,WAAOA,OAAO,CAACJ,MAAf;AACD;;AAED,SAAOI,OAAP;AACD;;AAEM,MAAME,SAAS,GAAG,CACvB,MADuB,EAEvB,MAFuB,EAGvB,UAHuB,EAIvB,WAJuB,EAKvB,QALuB,EAMvB,MANuB,EAOvB,KAPuB,EAQvB,OARuB,CAAlB;;;AAWA,SAASC,eAAT,CAAyBC,MAAzB,EAA0CC,cAA1C,EAA6E;AAClF,QAAMC,cAAc,GAAG,CAAC,GAAGJ,SAAJ,CAAvB;;AACA,MAAIG,cAAc,KAAK,IAAvB,EAA6B;AAC3BC,IAAAA,cAAc,CAACC,IAAf,CAAoB,UAApB;AACD;;AAED,OAAK,MAAMC,CAAX,IAAgBJ,MAAhB,EAAwB;AACtB,QAAIE,cAAc,CAACG,OAAf,CAAuBD,CAAvB,MAA8B,CAAC,CAAnC,EAAsC;AACpC;AACA,aAAOJ,MAAM,CAACI,CAAD,CAAb;AACD;AACF;;AAED,SAAOJ,MAAP;AACD;AAED;AACA;AACA;AACA;AACA;;;AACO,SAASM,iBAAT,CAA2BxC,IAA3B,EAAyCyC,YAAzC,EAAmF;AACxF,SAAO,IAAIC,OAAJ,CAAkB,CAACC,OAAD,EAAUC,MAAV,KAA2B;AAClDH,IAAAA,YAAY,CAACI,kBAAb,CAAgC7C,IAAhC,EAAsC,CAAC8C,GAAD,EAAMC,OAAN,KAAwB;AAC5D,UAAI,CAAC,kBAAMD,GAAN,CAAD,IAAeA,GAAG,CAACE,MAAJ,KAAeC,kBAAYC,SAA9C,EAAyD;AACvD,eAAON,MAAM,CAACE,GAAD,CAAb;AACD;;AACD,UAAIC,OAAJ,EAAa;AACX,eAAOH,MAAM,CAACO,iBAAWC,WAAX,CAAuBC,gBAAUC,aAAjC,CAAD,CAAb;AACD;;AACD,aAAOX,OAAO,EAAd;AACD,KARD;AASD,GAVM,CAAP;AAWD;;AAEM,SAASY,cAAT,CACLvD,IADK,EAELwD,QAFK,EAGLf,YAHK,EAIS;AACd,SAAO,IAAIC,OAAJ,CAAkB,CAACC,OAAD,EAAUC,MAAV,KAA2B;AAClDH,IAAAA,YAAY,CAACgB,UAAb,CAAwBzD,IAAxB,EAA8BwD,QAA9B,EAAyCV,GAAD,IAAe;AACrD,UAAI,CAAC7B,gBAAEyC,MAAF,CAASZ,GAAT,CAAL,EAAoB;AAClB,eAAOF,MAAM,CAACE,GAAD,CAAb;AACD;;AACD,aAAOH,OAAO,EAAd;AACD,KALD;AAMD,GAPM,CAAP;AAQD;;AAEM,SAASgB,kBAAT,CACL3D,IADK,EAEL4D,qBAFK,EAGLC,YAHK,EAIS;AACd,SAAO,IAAInB,OAAJ,CAAkB,CAACC,OAAD,EAAUC,MAAV,KAA2B;AAClDiB,IAAAA,YAAY,CAAC7D,IAAD,EAAO,IAAP,EAAa,EAAb,EAAiB,CAAC8C,GAAD,EAAMgB,gBAAN,EAAwBC,aAAxB,KAAgD;AAC3E;AACA,UAAIjB,GAAG,IAAIA,GAAG,CAACE,MAAJ,KAAeC,kBAAYC,SAAtC,EAAiD;AAC/C,eAAON,MAAM,CAACE,GAAD,CAAb;AACD,OAJ0E,CAM3E;;;AACA,UAAI,kBAAMgB,gBAAN,MAA4B,KAAhC,EAAuC;AACrC,eAAOlB,MAAM,CAACO,iBAAWC,WAAX,CAAuBC,gBAAUC,aAAjC,CAAD,CAAb;AACD;;AAED,WAAK,IAAIU,SAAS,GAAG,CAArB,EAAwBA,SAAS,GAAGD,aAAa,CAACE,MAAlD,EAA0DD,SAAS,EAAnE,EAAuE;AACrE;AACA;AACA,YAAI,kBAAMD,aAAa,CAACC,SAAD,CAAb,CAAyB,CAAzB,CAAN,MAAuC,KAA3C,EAAkD;AAChD,cAAID,aAAa,CAACC,SAAD,CAAb,CAAyB,CAAzB,EAA4BhB,MAA5B,KAAuCC,kBAAYC,SAAvD,EAAkE;AAChE,gBAAIU,qBAAJ,EAA2B;AACzB,qBAAOjB,OAAO,EAAd;AACD;;AAED,mBAAOC,MAAM,CAACO,iBAAWe,qBAAX,CAAiCb,gBAAUc,sBAA3C,CAAD,CAAb;AACD;AACF;AACF;;AAED,aAAOxB,OAAO,EAAd;AACD,KA1BW,CAAZ;AA2BD,GA5BM,CAAP;AA6BD;;AAEM,SAASyB,wBAAT,CAAkCC,aAAlC,EAA0DC,cAA1D,EAAwF;AAC7F,MAAI,UAAUA,cAAd,EAA8B;AAC5B,WAAOC,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBH,aAAa,CAACnE,IAAhC,EAAsCoE,cAAc,CAACpE,IAArD,CAAP;AACD;;AAED,SAAOmE,aAAa,CAACnE,IAArB;AACD;;AAEM,SAASuE,oBAAT,CAA8BC,IAA9B,EAAkD;AACvD,QAAMC,MAAM,GAAGC,eAASC,SAAT,CAAmBH,IAAnB,CAAf;;AAEA,MAAIC,MAAM,IAAID,IAAI,CAACzE,QAAL,CAAc0E,MAAd,CAAd,EAAqC;AACnC,UAAM7C,OAAgB,GAAG4C,IAAI,CAACzE,QAAL,CAAc0E,MAAd,CAAzB;AACA,UAAM1E,QAAa,GAAG;AAAE,OAAC0E,MAAD,GAAU;AAAZ,KAAtB;AACA,UAAMjE,GAAQ,GAAG;AACfV,MAAAA,IAAI,EAAE8B,OAAO,CAAC9B,IADC;AAEf8E,MAAAA,WAAW,EAAEhD,OAAO,CAACgD,WAFN;AAGf,OAAC1E,eAAD,GAAa;AAAEuE,QAAAA;AAAF,OAHE;AAIfI,MAAAA,WAAW,EAAEjD,OAAO,CAACiD,WAAR,IAAuB,CAACjD,OAAO,CAACkD,MAAT,EAAiBC,MAAjB,CAAwBC,OAAxB,CAJrB;AAKfF,MAAAA,MAAM,EAAElD,OAAO,CAACkD,MALD;AAMfG,MAAAA,UAAU,EAAErD,OAAO,CAACqD,UANL;AAOfC,MAAAA,cAAc,EAAEtD,OAAO,CAACsD,cAAR,IAA0B,EAP3B;AAQfC,MAAAA,QAAQ,EAAEvD,OAAO,CAACuD,QARH;AASfC,MAAAA,QAAQ,EAAExD,OAAO,CAACwD,QATH;AAUfC,MAAAA,IAAI,EAAEzD,OAAO,CAACyD,IAVC;AAWfC,MAAAA,OAAO,EAAE1D,OAAO,CAAC0D,OAXF;AAYf;AACA;AACA;AACAvF,MAAAA;AAfe,KAAjB;AAkBA,WAAOS,GAAP;AACD;AACF;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAAS+E,UAAT,CAAoBf,IAApB,EAAmC5C,OAAnC,EAAoDD,GAApD,EAA+E;AACpF,MAAIA,GAAG,IAAI6C,IAAI,CAACtE,eAAD,CAAJ,CAAgByB,GAAhB,MAAyBC,OAAhC,IAA2C4D,gBAAOC,KAAP,CAAa7D,OAAb,EAAsB,IAAtB,CAA/C,EAA4E;AAC1E;AACA4C,IAAAA,IAAI,CAACtE,eAAD,CAAJ,CAAgByB,GAAhB,IAAuBC,OAAvB;AACA,WAAO,IAAP;AACD;;AACD,SAAO,KAAP;AACD;;AAEM,SAAS8D,kBAAT,CAA4B3F,QAA5B,EAAuE;AAC5E,SAAOsE,MAAM,CAACsB,IAAP,CAAY5F,QAAZ,EAAsBgE,MAAtB,KAAiC,CAAxC;AACD;;AAEM,SAAS6B,qBAAT,CAA+BC,QAA/B,EAAqF;AAC1F,MAAI,CAACA,QAAL,EAAe;AACb,WAAO,KAAP;AACD;;AAED,QAAM;AAAExF,IAAAA,YAAF;AAAgBN,IAAAA;AAAhB,MAA6B8F,QAAnC;AACA,QAAMC,GAAG,GACP,qBAASzF,YAAT,MAA2B,KAA3B,IACAqF,kBAAkB,CAACrF,YAAD,CADlB,IAEA,qBAASN,QAAT,MAAuB,KAFvB,IAGA2F,kBAAkB,CAAC3F,QAAD,CAJpB;AAKA,SAAO+F,GAAP;AACD","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"}
|
package/build/storage.d.ts
CHANGED
|
@@ -19,6 +19,13 @@ declare class Storage {
|
|
|
19
19
|
Used storages: local (write) && uplinks
|
|
20
20
|
*/
|
|
21
21
|
addPackage(name: string, metadata: any, callback: Function): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Add a {name} package to a system
|
|
24
|
+
Function checks if package with the same name is available from uplinks.
|
|
25
|
+
If it isn't, we create package locally
|
|
26
|
+
Used storages: local (write) && uplinks
|
|
27
|
+
*/
|
|
28
|
+
addPackageNext(name: string, metadata: Package): Promise<Package>;
|
|
22
29
|
private _isAllowPublishOffline;
|
|
23
30
|
readTokens(filter: TokenFilter): Promise<Token[]>;
|
|
24
31
|
saveToken(token: Token): Promise<void>;
|
|
@@ -28,6 +35,7 @@ declare class Storage {
|
|
|
28
35
|
Used storages: local (write)
|
|
29
36
|
*/
|
|
30
37
|
addVersion(name: string, version: string, metadata: Version, tag: StringValue, callback: CallbackAction): void;
|
|
38
|
+
addVersionNext(name: string, version: string, metadata: Version, tag: StringValue): Promise<void>;
|
|
31
39
|
/**
|
|
32
40
|
* Tags a package version with a provided tag
|
|
33
41
|
Used storages: local (write)
|
|
@@ -39,6 +47,12 @@ declare class Storage {
|
|
|
39
47
|
Used storages: local (write)
|
|
40
48
|
*/
|
|
41
49
|
changePackage(name: string, metadata: Package, revision: string, callback: Callback): void;
|
|
50
|
+
/**
|
|
51
|
+
* Change an existing package (i.e. unpublish one version)
|
|
52
|
+
Function changes a package info from local storage and all uplinks with write access./
|
|
53
|
+
Used storages: local (write)
|
|
54
|
+
*/
|
|
55
|
+
changePackageNext(name: string, metadata: Package, revision: string): Promise<void>;
|
|
42
56
|
/**
|
|
43
57
|
* Remove a package from a system
|
|
44
58
|
Function removes a package from local storage
|
|
@@ -67,7 +81,15 @@ declare class Storage {
|
|
|
67
81
|
Used storages: local || uplink (just one)
|
|
68
82
|
*/
|
|
69
83
|
getTarball(name: string, filename: string): IReadTarball;
|
|
70
|
-
|
|
84
|
+
getPackageByVersion(options: IGetPackageOptionsNext): Promise<Version>;
|
|
85
|
+
getPackageManifest(options: IGetPackageOptionsNext): Promise<Package>;
|
|
86
|
+
/**
|
|
87
|
+
* Return a manifest or version based on the options.
|
|
88
|
+
* @param options {Object}
|
|
89
|
+
* @returns A package manifest or specific version
|
|
90
|
+
*/
|
|
91
|
+
getPackageByOptions(options: IGetPackageOptionsNext): Promise<Package | Version>;
|
|
92
|
+
getPackageNext(options: IGetPackageOptionsNext): Promise<[Package, any[]]>;
|
|
71
93
|
private _syncUplinksMetadataNext;
|
|
72
94
|
/**
|
|
73
95
|
Retrieve a package metadata for {name} package
|