@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/build/search.js CHANGED
@@ -3,17 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.SearchManager = exports.SearchInstance = void 0;
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
- return results.filter(pkg => {
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
- await Promise.all([...searchUplinksStreams]);
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
- await this.localStorage.search(streamPassThrough, options.query);
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('Pipeline succeeded.');
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 checkAccessPromises = removeDuplicates(data);
153
- debug('stream finish event %s', checkAccessPromises.length);
154
- return resolve(checkAccessPromises);
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
@@ -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"}
@@ -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;
@@ -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, (err, latest) => {
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":"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","sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\n\nimport { errorUtils, pkgUtils, validatioUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, USERS } from '@verdaccio/core';\nimport { AttachMents, Package, StringValue, Version, Versions } from '@verdaccio/types';\nimport { generateRandomHexString, isNil, isObject, normalizeDistTags } from '@verdaccio/utils';\n\nimport { LocalStorage } from './local-storage';\n\nexport const STORAGE = {\n PACKAGE_FILE_NAME: 'package.json',\n FILE_EXIST_ERROR: 'EEXISTS',\n NO_SUCH_FILE_ERROR: 'ENOENT',\n DEFAULT_REVISION: '0-0000000000000000',\n};\n\nexport function generatePackageTemplate(name: string): Package {\n return {\n // standard things\n name,\n versions: {},\n time: {},\n [USERS]: {},\n [DIST_TAGS]: {},\n _uplinks: {},\n _distfiles: {},\n _attachments: {},\n _rev: '',\n };\n}\n\n/**\n * Normalize package properties, tags, revision id.\n * @param {Object} pkg package reference.\n */\nexport function normalizePackage(pkg: Package): Package {\n const pkgProperties = ['versions', 'dist-tags', '_distfiles', '_attachments', '_uplinks', 'time'];\n\n pkgProperties.forEach((key): void => {\n const pkgProp = pkg[key];\n\n if (isNil(pkgProp) || validatioUtils.isObject(pkgProp) === false) {\n pkg[key] = {};\n }\n });\n\n if (_.isString(pkg._rev) === false) {\n pkg._rev = STORAGE.DEFAULT_REVISION;\n }\n\n if (_.isString(pkg._id) === false) {\n pkg._id = pkg.name;\n }\n\n // normalize dist-tags\n return normalizeDistTags(pkg);\n}\n\nexport function generateRevision(rev: string): string {\n const _rev = rev.split('-');\n\n return (+_rev[0] || 0) + 1 + '-' + generateRandomHexString();\n}\n\nexport function getLatestReadme(pkg: Package): string {\n const versions = pkg['versions'] || {};\n const distTags = pkg[DIST_TAGS] || {};\n // FIXME: here is a bit tricky add the types\n const latestVersion: Version | any = distTags['latest'] ? versions[distTags['latest']] || {} : {};\n let readme = _.trim(pkg.readme || latestVersion.readme || '');\n if (readme) {\n return readme;\n }\n\n // In case of empty readme - trying to get ANY readme in the following order:\n // 'next','beta','alpha','test','dev','canary'\n const readmeDistTagsPriority = ['next', 'beta', 'alpha', 'test', 'dev', 'canary'];\n readmeDistTagsPriority.forEach(function (tag): string | void {\n if (readme) {\n return readme;\n }\n const version: Version | any = distTags[tag] ? versions[distTags[tag]] || {} : {};\n readme = _.trim(version.readme || readme);\n });\n return readme;\n}\n\n// FIXME: type any due this\nexport function cleanUpReadme(version: any): Version {\n if (isNil(version) === false) {\n delete version.readme;\n }\n\n return version;\n}\n\nexport const WHITELIST = [\n '_rev',\n 'name',\n 'versions',\n 'dist-tags',\n 'readme',\n 'time',\n '_id',\n 'users',\n];\n\nexport function cleanUpLinksRef(result: Package, keepUpLinkData?: boolean): Package {\n const propertyToKeep = [...WHITELIST];\n if (keepUpLinkData === true) {\n propertyToKeep.push('_uplinks');\n }\n\n for (const i in result) {\n if (propertyToKeep.indexOf(i) === -1) {\n // Remove sections like '_uplinks' from response\n delete result[i];\n }\n }\n\n return result;\n}\n\n/**\n * Check whether a package it is already a local package\n * @param {*} name\n * @param {*} localStorage\n */\nexport function checkPackageLocal(name: string, localStorage: LocalStorage): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n localStorage.getPackageMetadata(name, (err, results): void => {\n if (!isNil(err) && err.status !== HTTP_STATUS.NOT_FOUND) {\n return reject(err);\n }\n if (results) {\n return reject(errorUtils.getConflict(API_ERROR.PACKAGE_EXIST));\n }\n return resolve();\n });\n });\n}\n\nexport function publishPackage(\n name: string,\n metadata: any,\n localStorage: LocalStorage\n): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n localStorage.addPackage(name, metadata, (err): void => {\n if (!_.isNull(err)) {\n return reject(err);\n }\n return resolve();\n });\n });\n}\n\nexport function checkPackageRemote(\n name: string,\n isAllowPublishOffline: boolean,\n syncMetadata: Function\n): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n syncMetadata(name, null, {}, (err, packageJsonLocal, upLinksErrors): void => {\n // something weird\n if (err && err.status !== HTTP_STATUS.NOT_FOUND) {\n return reject(err);\n }\n\n // checking package exist already\n if (isNil(packageJsonLocal) === false) {\n return reject(errorUtils.getConflict(API_ERROR.PACKAGE_EXIST));\n }\n\n for (let errorItem = 0; errorItem < upLinksErrors.length; errorItem++) {\n // checking error\n // if uplink fails with a status other than 404, we report failure\n if (isNil(upLinksErrors[errorItem][0]) === false) {\n if (upLinksErrors[errorItem][0].status !== HTTP_STATUS.NOT_FOUND) {\n if (isAllowPublishOffline) {\n return resolve();\n }\n\n return reject(errorUtils.getServiceUnavailable(API_ERROR.UPLINK_OFFLINE_PUBLISH));\n }\n }\n }\n\n return resolve();\n });\n });\n}\n\nexport function mergeUplinkTimeIntoLocal(localMetadata: Package, remoteMetadata: Package): any {\n if ('time' in remoteMetadata) {\n return Object.assign({}, localMetadata.time, remoteMetadata.time);\n }\n\n return localMetadata.time;\n}\n\nexport function prepareSearchPackage(data: Package): any {\n const latest = pkgUtils.getLatest(data);\n\n if (latest && data.versions[latest]) {\n const version: Version = data.versions[latest];\n const versions: any = { [latest]: 'latest' };\n const pkg: any = {\n name: version.name,\n description: version.description,\n [DIST_TAGS]: { latest },\n maintainers: version.maintainers || [version.author].filter(Boolean),\n author: version.author,\n repository: version.repository,\n readmeFilename: version.readmeFilename || '',\n homepage: version.homepage,\n keywords: version.keywords,\n bugs: version.bugs,\n license: version.license,\n // time: {\n // modified: time,\n // },\n versions,\n };\n\n return pkg;\n }\n}\n\n/**\n * Create a tag for a package\n * @param {*} data\n * @param {*} version\n * @param {*} tag\n * @return {Boolean} whether a package has been tagged\n */\nexport function tagVersion(data: Package, version: string, tag: StringValue): boolean {\n if (tag && data[DIST_TAGS][tag] !== version && semver.parse(version, true)) {\n // valid version - store\n data[DIST_TAGS][tag] = version;\n return true;\n }\n return false;\n}\n\nexport function isDifferentThanOne(versions: Versions | AttachMents): boolean {\n return Object.keys(versions).length !== 1;\n}\n\nexport function hasInvalidPublishBody(manifest: Pick<Package, '_attachments' | 'versions'>) {\n if (!manifest) {\n return false;\n }\n\n const { _attachments, versions } = manifest;\n const res =\n isObject(_attachments) === false ||\n isDifferentThanOne(_attachments) ||\n isObject(versions) === false ||\n isDifferentThanOne(versions);\n return res;\n}\n"],"file":"storage-utils.js"}
@@ -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
- getPackageNext(options: IGetPackageOptionsNext): Promise<Package | Version>;
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