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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/build/index.d.ts +5 -4
  3. package/build/index.js +31 -15
  4. package/build/index.js.map +1 -1
  5. package/build/lib/TransFormResults.d.ts +15 -0
  6. package/build/lib/TransFormResults.js +61 -0
  7. package/build/lib/TransFormResults.js.map +1 -0
  8. package/build/lib/search-utils.d.ts +4 -0
  9. package/build/lib/search-utils.js +59 -0
  10. package/build/lib/search-utils.js.map +1 -0
  11. package/build/lib/star-utils.d.ts +14 -0
  12. package/build/{star-utils.js → lib/star-utils.js} +16 -2
  13. package/build/lib/star-utils.js.map +1 -0
  14. package/build/lib/storage-utils.d.ts +82 -0
  15. package/build/{storage-utils.js → lib/storage-utils.js} +173 -60
  16. package/build/lib/storage-utils.js.map +1 -0
  17. package/build/lib/uplink-util.d.ts +10 -0
  18. package/build/lib/uplink-util.js +49 -0
  19. package/build/lib/uplink-util.js.map +1 -0
  20. package/build/lib/versions-utils.d.ts +28 -0
  21. package/build/lib/versions-utils.js +104 -0
  22. package/build/lib/versions-utils.js.map +1 -0
  23. package/build/local-storage.d.ts +3 -165
  24. package/build/local-storage.js +6 -1166
  25. package/build/local-storage.js.map +1 -1
  26. package/build/storage.d.ts +242 -86
  27. package/build/storage.js +1681 -548
  28. package/build/storage.js.map +1 -1
  29. package/build/type.d.ts +42 -19
  30. package/build/type.js.map +1 -1
  31. package/jest.config.js +8 -2
  32. package/package.json +71 -71
  33. package/src/index.ts +5 -4
  34. package/src/lib/TransFormResults.ts +42 -0
  35. package/src/lib/search-utils.ts +50 -0
  36. package/src/{star-utils.ts → lib/star-utils.ts} +16 -5
  37. package/src/lib/storage-utils.ts +362 -0
  38. package/src/lib/uplink-util.ts +41 -0
  39. package/src/lib/versions-utils.ts +87 -0
  40. package/src/local-storage.ts +7 -1217
  41. package/src/storage.ts +1683 -635
  42. package/src/type.ts +47 -21
  43. package/test/fixtures/config/getTarballNext-getupstream.yaml +17 -0
  44. package/test/fixtures/config/syncDoubleUplinksMetadata.yaml +25 -0
  45. package/test/fixtures/config/syncNoUplinksMetadata.yaml +17 -0
  46. package/test/fixtures/config/syncSingleUplinksMetadata.yaml +21 -0
  47. package/test/fixtures/config/updateManifest-1.yaml +16 -0
  48. package/test/fixtures/manifests/foo-npmjs.json +253 -0
  49. package/test/fixtures/manifests/foo-verdaccio.json +253 -0
  50. package/test/fixtures/tarball.tgz +0 -0
  51. package/test/helpers.ts +22 -0
  52. package/test/local-store.__disabled__.ts +553 -0
  53. package/test/search.spec.ts +4 -5
  54. package/test/star.spec.ts +31 -0
  55. package/test/storage-utils.spec.ts +129 -42
  56. package/test/storage.spec.ts +943 -33
  57. package/test/versions.spec.ts +109 -0
  58. package/tsconfig.json +6 -3
  59. package/build/search.d.ts +0 -35
  60. package/build/search.js +0 -198
  61. package/build/search.js.map +0 -1
  62. package/build/star-utils.d.ts +0 -9
  63. package/build/star-utils.js.map +0 -1
  64. package/build/storage-utils.d.ts +0 -39
  65. package/build/storage-utils.js.map +0 -1
  66. package/build/uplink-util.d.ts +0 -7
  67. package/build/uplink-util.js +0 -38
  68. package/build/uplink-util.js.map +0 -1
  69. package/src/search.ts +0 -175
  70. package/src/storage-utils.ts +0 -263
  71. package/src/uplink-util.ts +0 -32
  72. package/test/local-storage.spec.ts +0 -583
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/local-storage.ts"],"names":["debug","noSuchFile","resourceNotAvailable","normalizeSearchPackage","pkg","searchItem","latest","pkgUtils","getLatest","version","versions","result","name","scope","description","keywords","date","time","author","publisher","maintainers","links","npm","homepage","repository","bugs","package","scoped","PROTO_NAME","LocalStorage","constructor","config","logger","child","sub","storagePlugin","init","_loadStorage","warn","addPackage","callback","storage","_getLocalStorage","_","isNil","errorUtils","getNotFound","createPackage","err","isNull","code","STORAGE","FILE_EXIST_ERROR","HTTP_STATUS","CONFLICT","message","getConflict","removePackage","Promise","resolve","reject","readPackage","data","NO_SUCH_FILE_ERROR","NOT_FOUND","remove","attachments","Object","keys","_attachments","length","attachment","deletePackage","PACKAGE_FILE_NAME","error","getBadData","updateVersions","packageInfo","_readCreatePackage","packageLocalJson","change","readme","versionId","contributors","dist","tarball","urlObject","UrlNode","parse","filename","pathname","replace","_distfiles","hash","url","sha","shasum","upLink","Symbol","for","_updateUplinkToRemoteProtocol","tag","DIST_TAGS","up","_uplinks","prototype","hasOwnProperty","call","need_change","etag","fetched","isEqual","_writePackage","addVersion","metadata","_updatePackage","cb","hasVersion","validatioUtils","isObject","isString","errorMessage","getBadRequest","currentDate","Date","toISOString","created","add","addVersionNext","updatePackageNext","mergeTags","pkgName","tags","API_ERROR","VERSION_NOT_EXIST","changePackage","incomingPkg","revision","localData","incomingVersion","info","file","incomingDeprecated","deprecated","modified","USERS","changePackageNext","removeTarball","validateName","then","catch","getInternalError","addTarball","shaOneHash","uploadStream","UploadTarball","_transform","abort","done","args","update","appliedData","apply","process","nextTick","emit","getForbidden","writeStream","writeTarball","on","getPackageMetadata","_err","updater","digest","pipe","getTarball","_createFailureStreamResponse","_streamSuccessReadTarBall","stream","ReadTarball","readTarballStream","readTarball","e404","content","getPackageMetadataNext","_readPackageNext","_readPackage","search","searchStream","query","t","text","q","quality","p","popularity","m","maintenance","s","size","getMetadata","isEmpty","searchPackage","searchPackageItem","score","verdaccioPkgCached","verdaccioPrivate","flags","searchScore","end","items","item","write","getPackageStorage","_internalError","readPackageNext","_createNewPackage","updateHandler","onEnd","updatePackage","bind","normalizePackage","updatedManifest","writePackageNext","json","savePackage","_setDefaultRevision","savePackageNext","_rev","DEFAULT_REVISION","_debug","upLinkKey","tarballUrl","uplinkUrl","uplinks","host","protocol","registry","format","getSecret","secretKey","setSecret","checkSecretKey","Storage","_loadStorePlugin","LocalDatabase","plugin_params","plugins","store","plugin","head","saveToken","token","isFunction","getCode","SERVICE_UNAVAILABLE","SUPPORT_ERRORS","PLUGIN_MISSING_INTERFACE","deleteToken","user","tokenKey","readTokens","filter"],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport { PassThrough } from 'stream';\nimport UrlNode from 'url';\n\nimport { errorUtils, pkgUtils, pluginUtils, searchUtils, validatioUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, SUPPORT_ERRORS, USERS } from '@verdaccio/core';\nimport { VerdaccioError } from '@verdaccio/core';\nimport { loadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport { ReadTarball, UploadTarball } from '@verdaccio/streams';\nimport {\n Author,\n Callback,\n CallbackAction,\n Config,\n DistFile,\n IPackageStorage,\n IReadTarball,\n IUploadTarball,\n Logger,\n MergeTags,\n Package,\n StorageUpdateCallback,\n StringValue,\n Token,\n TokenFilter,\n Version,\n} from '@verdaccio/types';\nimport { getLatestVersion, isObject } from '@verdaccio/utils';\nimport { createTarballHash, normalizeContributors } from '@verdaccio/utils';\n\nimport {\n STORAGE,\n cleanUpReadme,\n generatePackageTemplate,\n generateRevision,\n getLatestReadme,\n normalizePackage,\n tagVersion,\n} from './storage-utils';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type IPluginStorage = pluginUtils.IPluginStorage<Config>;\n\nexport function normalizeSearchPackage(\n pkg: Package,\n searchItem: searchUtils.SearchItem\n): searchUtils.SearchPackageBody {\n const latest = pkgUtils.getLatest(pkg);\n const version: Version = pkg.versions[latest];\n const result: searchUtils.SearchPackageBody = {\n name: version.name,\n scope: '',\n description: version.description,\n version: latest,\n keywords: version.keywords,\n date: pkg.time[latest],\n // FIXME: type\n author: version.author as any,\n // FIXME: not possible fill this out from a private package\n publisher: {},\n // FIXME: type\n maintainers: version.maintainers as any,\n links: {\n npm: '',\n homepage: version.homepage,\n repository: version.repository,\n bugs: version.bugs,\n },\n };\n\n if (typeof searchItem.package.scoped === 'string') {\n result.scope = searchItem.package.scoped;\n }\n\n return result;\n}\n\nexport const PROTO_NAME = '__proto__';\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: IPluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = this._loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public addPackage(name: string, pkg: Package, callback: Callback): void {\n debug(`creating a package for`, name);\n const storage: any = this._getLocalStorage(name);\n\n if (_.isNil(storage)) {\n debug(`storage is missing for %o package cannot be added`, name);\n return callback(errorUtils.getNotFound('this package cannot be added'));\n }\n\n storage.createPackage(name, generatePackageTemplate(name), (err) => {\n if (\n _.isNull(err) === false &&\n (err.code === STORAGE.FILE_EXIST_ERROR || err.code === HTTP_STATUS.CONFLICT)\n ) {\n debug(`error on creating a package for %o with error %o`, name, err.message);\n return callback(errorUtils.getConflict());\n }\n\n const latest = getLatestVersion(pkg);\n if (_.isNil(latest) === false && pkg.versions[latest]) {\n debug('latest version found %o for %o', latest, name);\n return callback(null, pkg.versions[latest]);\n }\n\n debug('no latest version found for %o', name);\n return callback();\n });\n }\n\n /**\n * Remove package with all it contents.\n */\n public async removePackage(name: string): Promise<void> {\n debug('remove package %s', name);\n const storage: any = this._getLocalStorage(name);\n\n if (_.isNil(storage)) {\n throw errorUtils.getNotFound();\n }\n\n return new Promise((resolve, reject) => {\n storage.readPackage(name, async (err, data: Package): Promise<void> => {\n if (_.isNil(err) === false) {\n if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {\n debug(`error on not found %o with error %o`, name, err.message);\n return reject(errorUtils.getNotFound());\n }\n return reject(err);\n }\n\n data = normalizePackage(data);\n\n try {\n await this.storagePlugin.remove(name);\n // remove each attachment\n const attachments = Object.keys(data._attachments);\n debug('attachments to remove %s', attachments?.length);\n for (let attachment of attachments) {\n debug('remove attachment %s', attachment);\n await storage.deletePackage(attachment);\n }\n // remove package.json\n debug('remove package.json');\n await storage.deletePackage(STORAGE.PACKAGE_FILE_NAME);\n // remove folder\n debug('remove package folder');\n await storage.removePackage();\n resolve();\n } catch (err: any) {\n this.logger.error({ err }, 'removed package has failed @{err.message}');\n throw errorUtils.getBadData(err.message);\n }\n });\n });\n }\n\n /**\n * Synchronize remote package info with the local one\n * @param {*} name\n * @param {*} packageInfo\n * @param {*} callback\n */\n public updateVersions(name: string, packageInfo: Package, callback: Callback): void {\n debug(`updating versions for package %o`, name);\n this._readCreatePackage(name, (err, packageLocalJson): void => {\n if (err) {\n return callback(err);\n }\n\n let change = false;\n // updating readme\n packageLocalJson.readme = getLatestReadme(packageInfo);\n if (packageInfo.readme !== packageLocalJson.readme) {\n change = true;\n }\n\n debug('update versions');\n for (const versionId in packageInfo.versions) {\n if (_.isNil(packageLocalJson.versions[versionId])) {\n let version = packageInfo.versions[versionId];\n\n // we don't keep readme for package versions,\n // only one readme per package\n version = cleanUpReadme(version);\n debug('clean up readme for %o', versionId);\n version.contributors = normalizeContributors(version.contributors as Author[]);\n\n change = true;\n packageLocalJson.versions[versionId] = version;\n\n if (version?.dist?.tarball) {\n const urlObject: any = UrlNode.parse(version.dist.tarball);\n const filename = urlObject.pathname.replace(/^.*\\//, '');\n\n // we do NOT overwrite any existing records\n if (_.isNil(packageLocalJson._distfiles[filename])) {\n const hash: DistFile = (packageLocalJson._distfiles[filename] = {\n url: version.dist.tarball,\n sha: version.dist.shasum,\n });\n const upLink: string = version[Symbol.for('__verdaccio_uplink')];\n\n if (_.isNil(upLink) === false) {\n this._updateUplinkToRemoteProtocol(hash, upLink);\n }\n }\n }\n }\n }\n\n debug('update dist-tags');\n for (const tag in packageInfo[DIST_TAGS]) {\n if (\n !packageLocalJson[DIST_TAGS][tag] ||\n packageLocalJson[DIST_TAGS][tag] !== packageInfo[DIST_TAGS][tag]\n ) {\n change = true;\n packageLocalJson[DIST_TAGS][tag] = packageInfo[DIST_TAGS][tag];\n }\n }\n\n for (const up in packageInfo._uplinks) {\n if (Object.prototype.hasOwnProperty.call(packageInfo._uplinks, up)) {\n const need_change =\n !isObject(packageLocalJson._uplinks[up]) ||\n packageInfo._uplinks[up].etag !== packageLocalJson._uplinks[up].etag ||\n packageInfo._uplinks[up].fetched !== packageLocalJson._uplinks[up].fetched;\n\n if (need_change) {\n change = true;\n packageLocalJson._uplinks[up] = packageInfo._uplinks[up];\n }\n }\n }\n\n debug('update time');\n if ('time' in packageInfo && !_.isEqual(packageLocalJson.time, packageInfo.time)) {\n packageLocalJson.time = packageInfo.time;\n change = true;\n }\n\n if (change) {\n debug('updating package info %o', name);\n this._writePackage(name, packageLocalJson, function (err): void {\n callback(err, packageLocalJson);\n });\n } else {\n callback(null, packageLocalJson);\n }\n });\n }\n\n /**\n * Add a new version to a previous local package.\n * @param {*} name\n * @param {*} version\n * @param {*} metadata\n * @param {*} tag\n * @param {*} callback\n */\n public addVersion(\n name: string,\n version: string,\n metadata: Version,\n tag: StringValue,\n callback: Callback\n ): void {\n debug(`add version %s package for %s`, version, name);\n this._updatePackage(\n name,\n async (data, cb: Callback): Promise<void> => {\n debug('%s package is being updated', name);\n // keep only one readme per package\n data.readme = metadata.readme;\n debug('%s` readme mutated', name);\n // TODO: lodash remove\n metadata = cleanUpReadme(metadata);\n metadata.contributors = normalizeContributors(metadata.contributors as Author[]);\n debug('%s` contributors normalized', name);\n const hasVersion = data.versions[version] != null;\n if (hasVersion) {\n debug('%s version %s already exists', name, version);\n return cb(errorUtils.getConflict());\n }\n\n // if uploaded tarball has a different shasum, it's very likely that we\n // have some kind of error\n if (validatioUtils.isObject(metadata.dist) && _.isString(metadata.dist.tarball)) {\n const tarball = metadata.dist.tarball.replace(/.*\\//, '');\n\n if (validatioUtils.isObject(data._attachments[tarball])) {\n if (\n _.isNil(data._attachments[tarball].shasum) === false &&\n _.isNil(metadata.dist.shasum) === false\n ) {\n if (data._attachments[tarball].shasum != metadata.dist.shasum) {\n const errorMessage =\n `shasum error, ` +\n `${data._attachments[tarball].shasum} != ${metadata.dist.shasum}`;\n return cb(errorUtils.getBadRequest(errorMessage));\n }\n }\n\n const currentDate = new Date().toISOString();\n\n // some old storage do not have this field #740\n if (_.isNil(data.time)) {\n data.time = {};\n }\n\n data.time['modified'] = currentDate;\n\n if ('created' in data.time === false) {\n data.time.created = currentDate;\n }\n\n data.time[version] = currentDate;\n data._attachments[tarball].version = version;\n }\n }\n\n data.versions[version] = metadata;\n tagVersion(data, version, tag);\n\n try {\n debug('%s` add on database', name);\n await this.storagePlugin.add(name);\n cb();\n } catch (err: any) {\n cb(errorUtils.getBadData(err.message));\n }\n },\n callback\n );\n }\n\n public async addVersionNext(\n name: string,\n version: string,\n metadata: Version,\n tag: StringValue\n ): Promise<void> {\n debug(`add version %s package for %s`, version, name);\n await this.updatePackageNext(name, async (data: Package): Promise<Package> => {\n debug('%s package is being updated', name);\n // keep only one readme per package\n data.readme = metadata.readme;\n debug('%s` readme mutated', name);\n // TODO: lodash remove\n metadata = cleanUpReadme(metadata);\n metadata.contributors = normalizeContributors(metadata.contributors as Author[]);\n debug('%s` contributors normalized', name);\n const hasVersion = data.versions[version] != null;\n if (hasVersion) {\n debug('%s version %s already exists', name, version);\n throw errorUtils.getConflict();\n }\n\n // if uploaded tarball has a different shasum, it's very likely that we\n // have some kind of error\n if (validatioUtils.isObject(metadata.dist) && _.isString(metadata.dist.tarball)) {\n const tarball = metadata.dist.tarball.replace(/.*\\//, '');\n\n if (validatioUtils.isObject(data._attachments[tarball])) {\n if (\n _.isNil(data._attachments[tarball].shasum) === false &&\n _.isNil(metadata.dist.shasum) === false\n ) {\n if (data._attachments[tarball].shasum != metadata.dist.shasum) {\n const errorMessage =\n `shasum error, ` +\n `${data._attachments[tarball].shasum} != ${metadata.dist.shasum}`;\n throw errorUtils.getBadRequest(errorMessage);\n }\n }\n\n const currentDate = new Date().toISOString();\n\n // some old storage do not have this field #740\n if (_.isNil(data.time)) {\n data.time = {};\n }\n\n data.time['modified'] = currentDate;\n\n if ('created' in data.time === false) {\n data.time.created = currentDate;\n }\n\n data.time[version] = currentDate;\n data._attachments[tarball].version = version;\n }\n }\n\n data.versions[version] = metadata;\n tagVersion(data, version, tag);\n\n try {\n debug('%s` add on database', name);\n await this.storagePlugin.add(name);\n } catch (err: any) {\n throw errorUtils.getBadData(err.message);\n }\n return data;\n });\n\n // this._updatePackage(\n // name,\n // async (data, cb: Callback): Promise<void> => {\n // debug('%s package is being updated', name);\n // // keep only one readme per package\n // data.readme = metadata.readme;\n // debug('%s` readme mutated', name);\n // // TODO: lodash remove\n // metadata = cleanUpReadme(metadata);\n // metadata.contributors = normalizeContributors(metadata.contributors as Author[]);\n // debug('%s` contributors normalized', name);\n // const hasVersion = data.versions[version] != null;\n // if (hasVersion) {\n // debug('%s version %s already exists', name, version);\n // return cb(errorUtils.getConflict());\n // }\n\n // // if uploaded tarball has a different shasum, it's very likely that we\n // // have some kind of error\n // if (validatioUtils.isObject(metadata.dist) && _.isString(metadata.dist.tarball)) {\n // const tarball = metadata.dist.tarball.replace(/.*\\//, '');\n\n // if (validatioUtils.isObject(data._attachments[tarball])) {\n // if (\n // _.isNil(data._attachments[tarball].shasum) === false &&\n // _.isNil(metadata.dist.shasum) === false\n // ) {\n // if (data._attachments[tarball].shasum != metadata.dist.shasum) {\n // const errorMessage =\n // `shasum error, ` +\n // `${data._attachments[tarball].shasum} != ${metadata.dist.shasum}`;\n // return cb(errorUtils.getBadRequest(errorMessage));\n // }\n // }\n\n // const currentDate = new Date().toISOString();\n\n // // some old storage do not have this field #740\n // if (_.isNil(data.time)) {\n // data.time = {};\n // }\n\n // data.time['modified'] = currentDate;\n\n // if ('created' in data.time === false) {\n // data.time.created = currentDate;\n // }\n\n // data.time[version] = currentDate;\n // data._attachments[tarball].version = version;\n // }\n // }\n\n // data.versions[version] = metadata;\n // tagVersion(data, version, tag);\n\n // try {\n // debug('%s` add on database', name);\n // await this.storagePlugin.add(name);\n // cb();\n // } catch (err: any) {\n // cb(errorUtils.getBadData(err.message));\n // }\n // },\n // callback\n // );\n }\n\n /**\n * Merge a new list of tags for a local packages with the existing one.\n * @param {*} pkgName\n * @param {*} tags\n * @param {*} callback\n */\n public mergeTags(pkgName: string, tags: MergeTags, callback: Callback): void {\n debug(`merge tags for`, pkgName);\n this._updatePackage(\n pkgName,\n (data, cb): void => {\n /* eslint guard-for-in: 0 */\n for (const tag in tags) {\n // this handle dist-tag rm command\n if (_.isNull(tags[tag])) {\n delete data[DIST_TAGS][tag];\n continue;\n }\n\n if (_.isNil(data.versions[tags[tag]])) {\n return cb(errorUtils.getNotFound(API_ERROR.VERSION_NOT_EXIST));\n }\n const version: string = tags[tag];\n tagVersion(data, version, tag);\n }\n cb(null);\n },\n callback\n );\n }\n\n /**\n * Update the package metadata, tags and attachments (tarballs).\n * Note: Currently supports unpublishing and deprecation.\n * @param {*} name\n * @param {*} incomingPkg\n * @param {*} revision\n * @param {*} callback\n * @return {Function}\n */\n public changePackage(\n name: string,\n incomingPkg: Package,\n revision: string | undefined,\n callback: Callback\n ): void {\n debug(`change package tags for %o revision %s`, name, revision);\n if (\n !validatioUtils.isObject(incomingPkg.versions) ||\n !validatioUtils.isObject(incomingPkg[DIST_TAGS])\n ) {\n debug(`change package bad data for %o`, name);\n return callback(errorUtils.getBadData());\n }\n\n debug(`change package udapting package for %o`, name);\n this._updatePackage(\n name,\n (localData: Package, cb: CallbackAction): void => {\n for (const version in localData.versions) {\n const incomingVersion = incomingPkg.versions[version];\n if (_.isNil(incomingVersion)) {\n this.logger.info({ name: name, version: version }, 'unpublishing @{name}@@{version}');\n\n // FIXME: I prefer return a new object rather mutate the metadata\n delete localData.versions[version];\n delete localData.time![version];\n\n for (const file in localData._attachments) {\n if (localData._attachments[file].version === version) {\n delete localData._attachments[file].version;\n }\n }\n } else if (Object.prototype.hasOwnProperty.call(incomingVersion, 'deprecated')) {\n const incomingDeprecated = incomingVersion.deprecated;\n if (incomingDeprecated != localData.versions[version].deprecated) {\n if (!incomingDeprecated) {\n this.logger.info(\n { name: name, version: version },\n 'undeprecating @{name}@@{version}'\n );\n delete localData.versions[version].deprecated;\n } else {\n this.logger.info(\n { name: name, version: version },\n 'deprecating @{name}@@{version}'\n );\n localData.versions[version].deprecated = incomingDeprecated;\n }\n localData.time!.modified = new Date().toISOString();\n }\n }\n }\n\n localData[USERS] = incomingPkg[USERS];\n localData[DIST_TAGS] = incomingPkg[DIST_TAGS];\n cb(null);\n },\n function (err): void {\n if (err) {\n return callback(err);\n }\n callback();\n }\n );\n }\n\n /**\n * Update the package metadata, tags and attachments (tarballs).\n * Note: Currently supports unpublishing and deprecation.\n * @param {*} name\n * @param {*} incomingPkg\n * @param {*} revision\n * @param {*} callback\n * @return {Function}\n */\n public async changePackageNext(\n name: string,\n incomingPkg: Package,\n revision: string | undefined\n ): Promise<void> {\n debug(`change package tags for %o revision %s`, name, revision);\n if (\n !validatioUtils.isObject(incomingPkg.versions) ||\n !validatioUtils.isObject(incomingPkg[DIST_TAGS])\n ) {\n debug(`change package bad data for %o`, name);\n throw errorUtils.getBadData();\n }\n\n debug(`change package udapting package for %o`, name);\n await this.updatePackageNext(name, async (localData: Package): Promise<Package> => {\n for (const version in localData.versions) {\n const incomingVersion = incomingPkg.versions[version];\n if (_.isNil(incomingVersion)) {\n this.logger.info({ name: name, version: version }, 'unpublishing @{name}@@{version}');\n\n // FIXME: I prefer return a new object rather mutate the metadata\n delete localData.versions[version];\n delete localData.time![version];\n\n for (const file in localData._attachments) {\n if (localData._attachments[file].version === version) {\n delete localData._attachments[file].version;\n }\n }\n } else if (Object.prototype.hasOwnProperty.call(incomingVersion, 'deprecated')) {\n const incomingDeprecated = incomingVersion.deprecated;\n if (incomingDeprecated != localData.versions[version].deprecated) {\n if (!incomingDeprecated) {\n this.logger.info(\n { name: name, version: version },\n 'undeprecating @{name}@@{version}'\n );\n delete localData.versions[version].deprecated;\n } else {\n this.logger.info({ name: name, version: version }, 'deprecating @{name}@@{version}');\n localData.versions[version].deprecated = incomingDeprecated;\n }\n localData.time!.modified = new Date().toISOString();\n }\n }\n }\n\n localData[USERS] = incomingPkg[USERS];\n localData[DIST_TAGS] = incomingPkg[DIST_TAGS];\n return localData;\n });\n }\n\n /**\n * Remove a tarball.\n * @param {*} name\n * @param {*} filename\n * @param {*} revision\n * @param {*} callback\n */\n public removeTarball(\n name: string,\n filename: string,\n revision: string,\n callback: CallbackAction\n ): void {\n debug('remove tarball %s for %s', filename, name);\n assert(validatioUtils.validateName(filename));\n this._updatePackage(\n name,\n (data, cb): void => {\n if (data._attachments[filename]) {\n // TODO: avoid using delete\n delete data._attachments[filename];\n cb(null);\n } else {\n cb(errorUtils.getNotFound('no such file available'));\n }\n },\n (err: VerdaccioError) => {\n if (err) {\n this.logger.error({ err }, 'remove tarball error @{err.message}');\n return callback(err);\n }\n const storage = this._getLocalStorage(name);\n\n if (storage) {\n debug('removing %s from storage', filename);\n storage\n .deletePackage(filename)\n .then((): void => {\n debug('package %s removed', filename);\n return callback(null);\n })\n .catch((err) => {\n this.logger.error({ err }, 'error removing %s from storage');\n return callback(null);\n });\n } else {\n callback(errorUtils.getInternalError());\n }\n }\n );\n }\n\n /**\n * Add a tarball.\n * @param {String} name\n * @param {String} filename\n * @return {Stream}\n */\n public addTarball(name: string, filename: string): IUploadTarball {\n debug(`add a tarball for %o`, name);\n assert(validatioUtils.validateName(filename));\n\n let length = 0;\n const shaOneHash = createTarballHash();\n const uploadStream: IUploadTarball = new UploadTarball({});\n const _transform = uploadStream._transform;\n const storage = this._getLocalStorage(name);\n\n uploadStream.abort = function (): void {};\n uploadStream.done = function (): void {};\n\n uploadStream._transform = function (data, ...args): void {\n shaOneHash.update(data);\n // measure the length for validation reasons\n length += data.length;\n const appliedData = [data, ...args];\n // FIXME: not sure about this approach, tsc complains\n // @ts-ignore\n _transform.apply(uploadStream, appliedData);\n };\n\n if (name === PROTO_NAME) {\n process.nextTick((): void => {\n uploadStream.emit('error', errorUtils.getForbidden());\n });\n return uploadStream;\n }\n\n // FIXME: this condition will never met, storage is always defined\n if (!storage) {\n process.nextTick((): void => {\n uploadStream.emit('error', \"can't upload this package\");\n });\n return uploadStream;\n }\n\n const writeStream: IUploadTarball = storage.writeTarball(filename);\n\n writeStream.on('error', (err) => {\n // @ts-ignore\n if (err.code === STORAGE.FILE_EXIST_ERROR || err.code === HTTP_STATUS.CONFLICT) {\n uploadStream.emit('error', errorUtils.getConflict());\n uploadStream.abort();\n // @ts-ignore\n } else if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {\n // check if package exists to throw an appropriate message\n this.getPackageMetadata(name, function (_err: VerdaccioError): void {\n if (_err) {\n uploadStream.emit('error', _err);\n } else {\n uploadStream.emit('error', err);\n }\n });\n } else {\n uploadStream.emit('error', err);\n }\n });\n\n writeStream.on('open', function (): void {\n // re-emitting open because it's handled in storage.js\n uploadStream.emit('open');\n });\n\n writeStream.on('success', (): void => {\n this._updatePackage(\n name,\n function updater(data, cb): void {\n // FUTURE: move this to tarballUtils\n data._attachments[filename] = {\n shasum: shaOneHash.digest('hex'),\n };\n cb(null);\n },\n function (err): void {\n if (err) {\n // FIXME: if the update package fails, remove tarball to avoid left\n // orphan tarballs\n uploadStream.emit('error', err);\n } else {\n uploadStream.emit('success');\n }\n }\n );\n });\n\n uploadStream.abort = function (): void {\n writeStream.abort();\n };\n\n uploadStream.done = function (): void {\n if (!length) {\n uploadStream.emit('error', errorUtils.getBadData('refusing to accept zero-length file'));\n writeStream.abort();\n } else {\n writeStream.done();\n }\n };\n\n uploadStream.pipe(writeStream);\n\n return uploadStream;\n }\n\n /**\n * Get a tarball.\n * @param {*} name\n * @param {*} filename\n * @return {ReadTarball}\n */\n public getTarball(name: string, filename: string): IReadTarball {\n assert(validatioUtils.validateName(filename));\n\n const storage: IPackageStorage = this._getLocalStorage(name);\n\n if (_.isNil(storage)) {\n return this._createFailureStreamResponse();\n }\n\n return this._streamSuccessReadTarBall(storage, filename);\n }\n\n /**\n * Return a stream that emits a read failure.\n * @private\n * @return {ReadTarball}\n */\n private _createFailureStreamResponse(): IReadTarball {\n const stream: IReadTarball = new ReadTarball({});\n\n process.nextTick((): void => {\n stream.emit('error', errorUtils.getNotFound('no such file available'));\n });\n return stream;\n }\n\n /**\n * Return a stream that emits the tarball data\n * @param {Object} storage\n * @param {String} filename\n * @private\n * @return {ReadTarball}\n */\n private _streamSuccessReadTarBall(storage: any, filename: string): IReadTarball {\n const stream: IReadTarball = new ReadTarball({});\n const readTarballStream = storage.readTarball(filename);\n const e404 = errorUtils.getNotFound;\n\n stream.abort = function (): void {\n if (_.isNil(readTarballStream) === false) {\n readTarballStream.abort();\n }\n };\n\n readTarballStream.on('error', function (err) {\n // @ts-ignore\n if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {\n stream.emit('error', e404('no such file available'));\n } else {\n stream.emit('error', err);\n }\n });\n\n readTarballStream.on('content-length', function (content): void {\n stream.emit('content-length', content);\n });\n\n readTarballStream.on('open', function (): void {\n // re-emitting open because it's handled in storage.js\n stream.emit('open');\n readTarballStream.pipe(stream);\n });\n\n return stream;\n }\n\n public async getPackageMetadataNext(name: string): Promise<Package> {\n const storage: IPackageStorage = this._getLocalStorage(name);\n debug('get package metadata for %o', name);\n if (typeof storage === 'undefined') {\n // TODO: this might be a better an error to throw\n // if storage is not there cannot be 404.\n throw errorUtils.getNotFound();\n }\n\n return await this._readPackageNext(name, storage);\n }\n\n /**\n * Retrieve a package by name.\n * @param {*} name\n * @param {*} callback\n * @return {Function}\n * @deprecated\n */\n public getPackageMetadata(name: string, callback: Callback = (): void => {}): void {\n const storage: IPackageStorage = this._getLocalStorage(name);\n debug('get package metadata for %o', name);\n if (typeof storage === 'undefined') {\n return callback(errorUtils.getNotFound());\n }\n\n this._readPackage(name, storage, callback);\n }\n\n public async search(searchStream: PassThrough, query: searchUtils.SearchQuery): Promise<void> {\n debug('search on each package');\n this.logger.info(\n { t: query.text, q: query.quality, p: query.popularity, m: query.maintenance, s: query.size },\n 'search by text @{t}| maintenance @{m}| quality @{q}| popularity @{p}'\n );\n const getMetadata = (searchItem: searchUtils.SearchItem) => {\n return new Promise((resolve, reject) => {\n this.getPackageMetadata(\n searchItem?.package?.name,\n (err: VerdaccioError, pkg: Package): void => {\n if (err) {\n this.logger.error(\n { err, pkgName: searchItem?.package?.name },\n 'error on load package @{pkgName} metaadata @{err.message}'\n );\n reject(err);\n }\n\n if (_.isEmpty(pkg?.versions)) {\n return resolve({});\n }\n\n const searchPackage = normalizeSearchPackage(pkg, searchItem);\n const searchPackageItem: searchUtils.SearchPackageItem = {\n package: searchPackage,\n score: searchItem.score,\n verdaccioPkgCached: searchItem.verdaccioPkgCached,\n verdaccioPrivate: searchItem.verdaccioPrivate,\n flags: searchItem?.flags,\n // FUTURE: find a better way to calculate the score\n searchScore: 1,\n };\n debug('push to stream %o', searchItem?.package?.name);\n resolve(searchPackageItem);\n }\n );\n });\n };\n\n if (typeof this.storagePlugin.search === 'undefined') {\n this.logger.info('plugin search not implemented yet');\n searchStream.end();\n } else {\n debug('search on each package by plugin');\n const items = await this.storagePlugin.search(query);\n try {\n for (const item of items) {\n const metadata = await getMetadata(item);\n searchStream.write(metadata);\n }\n debug('search local stream end');\n searchStream.end();\n } catch (err) {\n this.logger.error({ err, query }, 'error on search by plugin @{err.message}');\n searchStream.emit('error', err);\n }\n }\n }\n\n /**\n * Retrieve a wrapper that provide access to the package location.\n * @param {Object} pkgName package name.\n * @return {Object}\n */\n private _getLocalStorage(pkgName: string): IPackageStorage {\n debug('get local storage for %o', pkgName);\n return this.storagePlugin.getPackageStorage(pkgName);\n }\n\n /**\n * Read a json file from storage.\n * @param {Object} storage\n * @param {Function} callback\n * @deprecated\n */\n private _readPackage(name: string, storage: any, callback: Callback): void {\n storage.readPackage(name, (err, result): void => {\n if (err) {\n if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {\n debug('package %s not found', name);\n return callback(errorUtils.getNotFound());\n }\n return callback(this._internalError(err, STORAGE.PACKAGE_FILE_NAME, 'error reading'));\n }\n\n callback(err, normalizePackage(result));\n });\n }\n\n private async _readPackageNext(name: string, storage: any): Promise<Package> {\n try {\n const result: Package = await storage.readPackageNext(name);\n return normalizePackage(result);\n } catch (err: any) {\n if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {\n debug('package %s not found', name);\n throw errorUtils.getNotFound();\n }\n this.logger.error(\n { err: err, file: STORAGE.PACKAGE_FILE_NAME },\n `error reading @{file}: @{!err.message}`\n );\n\n throw errorUtils.getInternalError();\n }\n }\n\n /**\n * Retrieve either a previous created local package or a boilerplate.\n * @param {*} pkgName\n * @param {*} callback\n * @return {Function}\n */\n private _readCreatePackage(pkgName: string, callback: Callback): void {\n const storage: any = this._getLocalStorage(pkgName);\n if (_.isNil(storage)) {\n this._createNewPackage(pkgName, callback);\n return;\n }\n\n storage.readPackage(pkgName, (err, data): void => {\n // TODO: race condition\n if (_.isNil(err) === false) {\n if (err.code === STORAGE.NO_SUCH_FILE_ERROR || err.code === HTTP_STATUS.NOT_FOUND) {\n data = generatePackageTemplate(pkgName);\n } else {\n return callback(this._internalError(err, STORAGE.PACKAGE_FILE_NAME, 'error reading'));\n }\n }\n\n callback(null, normalizePackage(data));\n });\n }\n\n private _createNewPackage(name: string, callback: Callback): Callback {\n return callback(null, normalizePackage(generatePackageTemplate(name)));\n }\n\n /**\n * Handle internal error\n * @param {*} err\n * @param {*} file\n * @param {*} message\n * @return {Object} Error instance\n */\n private _internalError(err: string, file: string, message: string): VerdaccioError {\n this.logger.error({ err: err, file: file }, `${message} @{file}: @{!err.message}`);\n\n return errorUtils.getInternalError();\n }\n\n /**\n * @param {*} name package name\n * @param {*} updateHandler function(package, cb) - update function\n * @param {*} callback callback that gets invoked after it's all updated\n * @return {Function}\n */\n private _updatePackage(\n name: string,\n updateHandler: StorageUpdateCallback,\n onEnd: Callback\n ): void {\n const storage: IPackageStorage = this._getLocalStorage(name);\n\n if (!storage) {\n return onEnd(errorUtils.getNotFound());\n }\n\n storage.updatePackage(\n name,\n updateHandler,\n this._writePackage.bind(this),\n normalizePackage,\n onEnd\n );\n }\n\n /**\n * @param {*} name package name\n * @param {*} updateHandler function(package, cb) - update function\n * @param {*} callback callback that gets invoked after it's all updated\n * @return {Function}\n */\n private async updatePackageNext(\n name: string,\n updateHandler: (manifest: Package) => Promise<Package>\n ): Promise<void> {\n const storage: IPackageStorage = this._getLocalStorage(name);\n\n if (!storage) {\n throw errorUtils.getNotFound();\n }\n\n // we update the package on the local storage\n const updatedManifest: Package = await storage.updatePackageNext(name, updateHandler);\n // after correctly updated write to the storage\n try {\n await this.writePackageNext(name, normalizePackage(updatedManifest));\n } catch (err: any) {\n if (err.code === resourceNotAvailable) {\n throw errorUtils.getInternalError('resource temporarily unavailable');\n } else if (err.code === noSuchFile) {\n throw errorUtils.getNotFound();\n } else {\n throw err;\n }\n }\n }\n\n /**\n * Update the revision (_rev) string for a package.\n * @param {*} name\n * @param {*} json\n * @param {*} callback\n * @return {Function}\n */\n private _writePackage(name: string, json: Package, callback: Callback): void {\n const storage: any = this._getLocalStorage(name);\n if (_.isNil(storage)) {\n return callback();\n }\n storage.savePackage(name, this._setDefaultRevision(json), callback);\n }\n\n private async writePackageNext(name: string, json: Package): Promise<void> {\n const storage: any = this._getLocalStorage(name);\n if (_.isNil(storage)) {\n // TODO: replace here 500 error\n throw errorUtils.getBadData();\n }\n await storage.savePackageNext(name, this._setDefaultRevision(json));\n }\n\n private _setDefaultRevision(json: Package): Package {\n // calculate revision from couch db\n if (_.isString(json._rev) === false) {\n json._rev = STORAGE.DEFAULT_REVISION;\n }\n\n // this is intended in debug mode we do not want modify the store revision\n if (_.isNil(this.config._debug)) {\n json._rev = generateRevision(json._rev);\n }\n\n return json;\n }\n\n // private _deleteAttachments(storage: any, attachments: string[], callback: Callback): void {\n // debug('deleting %o attachments total %o', attachments?.length);\n // const unlinkNext = function (cb): void {\n // if (_.isEmpty(attachments)) {\n // return cb();\n // }\n\n // const attachment = attachments.shift();\n // storage.deletePackage(attachment, function (): void {\n // unlinkNext(cb);\n // });\n // };\n\n // unlinkNext(function (): void {\n // // try to unlink the directory, but ignore errors because it can fail\n // storage.removePackage(function (err): void {\n // callback(err);\n // });\n // });\n // }\n\n /**\n * Ensure the dist file remains as the same protocol\n * @param {Object} hash metadata\n * @param {String} upLinkKey registry key\n * @private\n */\n private _updateUplinkToRemoteProtocol(hash: DistFile, upLinkKey: string): void {\n // if we got this information from a known registry,\n // use the same protocol for the tarball\n //\n // see https://github.com/rlidwka/sinopia/issues/166\n const tarballUrl: any = UrlNode.parse(hash.url);\n const uplinkUrl: any = UrlNode.parse(this.config.uplinks[upLinkKey].url);\n\n if (uplinkUrl.host === tarballUrl.host) {\n tarballUrl.protocol = uplinkUrl.protocol;\n hash.registry = upLinkKey;\n hash.url = UrlNode.format(tarballUrl);\n }\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private _loadStorage(config: Config, logger: Logger): IPluginStorage {\n const Storage = this._loadStorePlugin();\n\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n return new LocalDatabase(this.config, logger);\n }\n return Storage as IPluginStorage;\n }\n\n private _loadStorePlugin(): IPluginStorage | void {\n const plugin_params = {\n config: this.config,\n logger: this.logger,\n };\n\n const plugins: IPluginStorage[] = loadPlugin<IPluginStorage>(\n this.config,\n this.config.store,\n plugin_params,\n (plugin): IPluginStorage => {\n return plugin.getPackageStorage;\n }\n );\n\n return _.head(plugins);\n }\n\n public saveToken(token: Token): Promise<any> {\n if (_.isFunction(this.storagePlugin.saveToken) === false) {\n return Promise.reject(\n errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE)\n );\n }\n\n return this.storagePlugin.saveToken(token);\n }\n\n public deleteToken(user: string, tokenKey: string): Promise<any> {\n if (_.isFunction(this.storagePlugin.deleteToken) === false) {\n return Promise.reject(\n errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE)\n );\n }\n\n return this.storagePlugin.deleteToken(user, tokenKey);\n }\n\n public readTokens(filter: TokenFilter): Promise<Token[]> {\n if (_.isFunction(this.storagePlugin.readTokens) === false) {\n return Promise.reject(\n errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.PLUGIN_MISSING_INTERFACE)\n );\n }\n\n return this.storagePlugin.readTokens(filter);\n }\n}\n\nexport { LocalStorage };\n"],"file":"local-storage.js"}
1
+ {"version":3,"file":"local-storage.js","names":["debug","buildDebug","noSuchFile","resourceNotAvailable","LocalStorage","constructor","config","logger","child","sub","storagePlugin","init","_loadStorage","warn","getStoragePlugin","errorUtils","getInternalError","getSecret","secretKey","setSecret","checkSecretKey","Storage","_loadStorePlugin","_","isNil","assert","storage","LocalDatabase","plugin_params","plugins","loadPlugin","store","plugin","getPackageStorage","head"],"sources":["../src/local-storage.ts"],"sourcesContent":["import assert from 'assert';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { errorUtils, pluginUtils } from '@verdaccio/core';\nimport { loadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport { Config, Logger } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type IPluginStorage = pluginUtils.IPluginStorage<Config>;\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: IPluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = this._loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public getStoragePlugin(): IPluginStorage {\n if (this.storagePlugin === null) {\n throw errorUtils.getInternalError('storage plugin is not initialized');\n }\n\n return this.storagePlugin;\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private _loadStorage(config: Config, logger: Logger): IPluginStorage {\n const Storage = this._loadStorePlugin();\n\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n return new LocalDatabase(config, logger);\n }\n return Storage as IPluginStorage;\n }\n\n private _loadStorePlugin(): IPluginStorage | void {\n const plugin_params = {\n config: this.config,\n logger: this.logger,\n };\n\n const plugins: IPluginStorage[] = loadPlugin<IPluginStorage>(\n this.config,\n this.config.store,\n plugin_params,\n (plugin): IPluginStorage => {\n return plugin.getPackageStorage;\n }\n );\n\n return _.head(plugins);\n }\n}\n\nexport { LocalStorage };\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;;;AAGA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,yBAAX,CAAd;AAEO,MAAMC,UAAU,GAAG,QAAnB;;AACA,MAAMC,oBAAoB,GAAG,QAA7B;;;AAGP;AACA;AACA;AACA,MAAMC,YAAN,CAAmB;EAKVC,WAAW,CAACC,MAAD,EAAiBC,MAAjB,EAAiC;IACjDP,KAAK,CAAC,uBAAD,CAAL;IACA,KAAKO,MAAL,GAAcA,MAAM,CAACC,KAAP,CAAa;MAAEC,GAAG,EAAE;IAAP,CAAb,CAAd;IACA,KAAKH,MAAL,GAAcA,MAAd,CAHiD,CAIjD;;IACA,KAAKI,aAAL,GAAqB,IAArB;EACD;;EAEgB,MAAJC,IAAI,GAAG;IAClB,IAAI,KAAKD,aAAL,KAAuB,IAA3B,EAAiC;MAC/B,KAAKA,aAAL,GAAqB,KAAKE,YAAL,CAAkB,KAAKN,MAAvB,EAA+B,KAAKC,MAApC,CAArB;MACAP,KAAK,CAAC,qBAAD,CAAL;MACA,MAAM,KAAKU,aAAL,CAAmBC,IAAnB,EAAN;MACAX,KAAK,CAAC,4BAAD,CAAL;IACD,CALD,MAKO;MACL,KAAKO,MAAL,CAAYM,IAAZ,CAAiB,6CAAjB;IACD;;IACD;EACD;;EAEMC,gBAAgB,GAAmB;IACxC,IAAI,KAAKJ,aAAL,KAAuB,IAA3B,EAAiC;MAC/B,MAAMK,gBAAA,CAAWC,gBAAX,CAA4B,mCAA5B,CAAN;IACD;;IAED,OAAO,KAAKN,aAAZ;EACD;;EAEqB,MAATO,SAAS,CAACX,MAAD,EAAgC;IACpD,MAAMY,SAAS,GAAG,MAAM,KAAKR,aAAL,CAAmBO,SAAnB,EAAxB;IAEA,OAAO,KAAKP,aAAL,CAAmBS,SAAnB,CAA6Bb,MAAM,CAACc,cAAP,CAAsBF,SAAtB,CAA7B,CAAP;EACD;;EAEON,YAAY,CAACN,MAAD,EAAiBC,MAAjB,EAAiD;IACnE,MAAMc,OAAO,GAAG,KAAKC,gBAAL,EAAhB;;IAEA,IAAIC,eAAA,CAAEC,KAAF,CAAQH,OAAR,CAAJ,EAAsB;MACpB,IAAAI,eAAA,EAAO,KAAKnB,MAAL,CAAYoB,OAAnB,EAA4B,kCAA5B;MACA,OAAO,IAAIC,qBAAJ,CAAkBrB,MAAlB,EAA0BC,MAA1B,CAAP;IACD;;IACD,OAAOc,OAAP;EACD;;EAEOC,gBAAgB,GAA0B;IAChD,MAAMM,aAAa,GAAG;MACpBtB,MAAM,EAAE,KAAKA,MADO;MAEpBC,MAAM,EAAE,KAAKA;IAFO,CAAtB;IAKA,MAAMsB,OAAyB,GAAG,IAAAC,mBAAA,EAChC,KAAKxB,MAD2B,EAEhC,KAAKA,MAAL,CAAYyB,KAFoB,EAGhCH,aAHgC,EAI/BI,MAAD,IAA4B;MAC1B,OAAOA,MAAM,CAACC,iBAAd;IACD,CAN+B,CAAlC;IASA,OAAOV,eAAA,CAAEW,IAAF,CAAOL,OAAP,CAAP;EACD;;AAjEgB"}
@@ -1,127 +1,283 @@
1
- import { IProxy, ProxyList } from '@verdaccio/proxy';
2
- import { Callback, CallbackAction, Config, IReadTarball, IUploadTarball, Logger, MergeTags, Package, StringValue, Token, TokenFilter, Version, Versions } from '@verdaccio/types';
1
+ /// <reference types="node" />
2
+ import { PassThrough, Readable } from 'stream';
3
+ import { searchUtils } from '@verdaccio/core';
4
+ import { ISyncUplinksOptions, ProxySearchParams } from '@verdaccio/proxy';
5
+ import { AbbreviatedManifest, Config, Logger, Manifest, MergeTags, StringValue, Token, TokenFilter, Version } from '@verdaccio/types';
6
+ import { UpdateManifestOptions } from '.';
7
+ import { ProxyInstanceList } from './lib/uplink-util';
3
8
  import { LocalStorage } from './local-storage';
4
- import { SearchManager } from './search';
5
- import { IGetPackageOptions, IGetPackageOptionsNext, IPluginFilters, ISyncUplinks } from './type';
9
+ import { IGetPackageOptionsNext, IPluginFilters } from './type';
10
+ export declare const noSuchFile = "ENOENT";
11
+ export declare const resourceNotAvailable = "EAGAIN";
12
+ export declare const PROTO_NAME = "__proto__";
6
13
  declare class Storage {
7
14
  localStorage: LocalStorage;
8
- searchManager: SearchManager | null;
15
+ filters: IPluginFilters;
9
16
  readonly config: Config;
10
17
  readonly logger: Logger;
11
- readonly uplinks: ProxyList;
12
- filters: IPluginFilters;
18
+ readonly uplinks: ProxyInstanceList;
13
19
  constructor(config: Config);
14
- init(config: Config, filters?: IPluginFilters): Promise<void>;
20
+ static ABBREVIATED_HEADER: string;
15
21
  /**
16
- * Add a {name} package to a system
17
- Function checks if package with the same name is available from uplinks.
18
- If it isn't, we create package locally
19
- Used storages: local (write) && uplinks
22
+ * Change an existing package (i.e. unpublish one version)
23
+ Function changes a package info from local storage and all uplinks with write access./
24
+ Used storages: local (write)
20
25
  */
21
- addPackage(name: string, metadata: any, callback: Function): Promise<void>;
26
+ changePackageNext(name: string, metadata: Manifest, revision: string): Promise<void>;
27
+ removePackage(name: string, revision: any): Promise<void>;
22
28
  /**
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
29
+ Remove a tarball from a system
30
+ Function removes a tarball from local storage.
31
+ Tarball in question should not be linked to in any existing
32
+ versions, i.e. package version should be unpublished first.
33
+ Used storage: local (write)
27
34
  */
28
- addPackageNext(name: string, metadata: Package): Promise<Package>;
29
- private _isAllowPublishOffline;
30
- readTokens(filter: TokenFilter): Promise<Token[]>;
31
- saveToken(token: Token): Promise<void>;
35
+ removeTarball(name: string, filename: string, _revision: string): Promise<Manifest>;
36
+ /**
37
+ * Handle search on packages and proxies.
38
+ * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses
39
+ * to a stream, once the proxies request has finished search in local storage for all packages
40
+ * (privated and cached).
41
+ */
42
+ search(options: ProxySearchParams): Promise<searchUtils.SearchPackageItem[]>;
43
+ private getTarballFromUpstream;
44
+ /**
45
+ *
46
+ * @param name
47
+ * @param filename
48
+ * @param param2
49
+ * @returns
50
+ */
51
+ getTarballNext(name: string, filename: string, { signal }: {
52
+ signal: any;
53
+ }): Promise<PassThrough>;
54
+ getPackageByVersion(options: IGetPackageOptionsNext): Promise<Version>;
55
+ getPackageManifest(options: IGetPackageOptionsNext): Promise<Manifest>;
56
+ private convertAbbreviatedManifest;
57
+ /**
58
+ * Return a manifest or version based on the options.
59
+ * @param options {Object}
60
+ * @returns A package manifest or specific version
61
+ */
62
+ getPackageByOptions(options: IGetPackageOptionsNext): Promise<Manifest | AbbreviatedManifest | Version>;
63
+ getLocalDatabaseNext(): Promise<Version[]>;
64
+ saveToken(token: Token): Promise<any>;
32
65
  deleteToken(user: string, tokenKey: string): Promise<any>;
66
+ readTokens(filter: TokenFilter): Promise<Token[]>;
33
67
  /**
34
- * Add a new version of package {name} to a system
35
- Used storages: local (write)
68
+ * Initialize the storage asynchronously.
69
+ * @param config Config
70
+ * @param filters IPluginFilters
71
+ * @returns Storage instance
36
72
  */
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>;
73
+ init(config: Config, filters?: IPluginFilters): Promise<void>;
39
74
  /**
40
- * Tags a package version with a provided tag
41
- Used storages: local (write)
75
+ * Consume the upstream and pipe it to a transformable stream.
42
76
  */
43
- mergeTags(name: string, tagHash: MergeTags, callback: CallbackAction): void;
77
+ private consumeSearchStream;
44
78
  /**
45
- * Change an existing package (i.e. unpublish one version)
46
- Function changes a package info from local storage and all uplinks with write access./
47
- Used storages: local (write)
79
+ * Retrieve a wrapper that provide access to the package location.
80
+ * @param {Object} pkgName package name.
81
+ * @return {Object}
48
82
  */
49
- changePackage(name: string, metadata: Package, revision: string, callback: Callback): void;
83
+ private getPrivatePackageStorage;
50
84
  /**
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)
85
+ * Create a tarball stream from a package.
86
+ * @param name
87
+ * @param filename
88
+ * @param options
89
+ * @returns
54
90
  */
55
- changePackageNext(name: string, metadata: Package, revision: string): Promise<void>;
91
+ getLocalTarball(pkgName: string, filename: string, { signal }: {
92
+ signal: AbortSignal;
93
+ }): Promise<Readable>;
94
+ private searchCachedPackages;
95
+ private removePackageByRevision;
56
96
  /**
57
- * Remove a package from a system
58
- Function removes a package from local storage
59
- Used storages: local (write)
97
+ * Get a package local manifest.
98
+ *
99
+ * Fails if package is not found.
100
+ * @param name package name
101
+ * @param revision of package
102
+ * @returns local manifest
60
103
  */
61
- removePackage(name: string): Promise<void>;
104
+ getPackageLocalMetadata(name: string, _revision?: string): Promise<Manifest>;
62
105
  /**
63
- Remove a tarball from a system
64
- Function removes a tarball from local storage.
65
- Tarball in question should not be linked to in any existing
66
- versions, i.e. package version should be unpublished first.
67
- Used storage: local (write)
106
+ * Fail the stream response with an not found error.
107
+ * @returns
68
108
  */
69
- removeTarball(name: string, filename: string, revision: string, callback: CallbackAction): void;
109
+ private createFailureStreamResponseNext;
70
110
  /**
71
- * Upload a tarball for {name} package
72
- Function is synchronous and returns a WritableStream
73
- Used storages: local (write)
111
+ * Update a package and merge tags
112
+ * @param name package name
113
+ * @param tags list of dist-tags
74
114
  */
75
- addTarball(name: string, filename: string): IUploadTarball;
115
+ mergeTagsNext(name: string, tags: MergeTags): Promise<Manifest>;
116
+ private getUpLinkForDistFile;
117
+ updateLocalMetadata(pkgName: string): Promise<void>;
118
+ updateManifest(manifest: Manifest, options: UpdateManifestOptions): Promise<void>;
119
+ private deprecate;
120
+ private star;
76
121
  /**
77
- Get a tarball from a storage for {name} package
78
- Function is synchronous and returns a ReadableStream
79
- Function tries to read tarball locally, if it fails then it reads package
80
- information in order to figure out where we can get this tarball from
81
- Used storages: local || uplink (just one)
122
+ * Get local package, on fails return null.
123
+ * Errors are considered package not found.
124
+ * @param name
125
+ * @returns
82
126
  */
83
- getTarball(name: string, filename: string): IReadTarball;
84
- getPackageByVersion(options: IGetPackageOptionsNext): Promise<Version>;
85
- getPackageManifest(options: IGetPackageOptionsNext): Promise<Package>;
127
+ private getPackagelocalByNameNext;
86
128
  /**
87
- * Return a manifest or version based on the options.
88
- * @param options {Object}
89
- * @returns A package manifest or specific version
129
+ * Convert tarball as string into a Buffer and validate the length.
130
+ * @param data the tarball data as string
131
+ * @returns
90
132
  */
91
- getPackageByOptions(options: IGetPackageOptionsNext): Promise<Package | Version>;
92
- getPackageNext(options: IGetPackageOptionsNext): Promise<[Package, any[]]>;
93
- private _syncUplinksMetadataNext;
133
+ private getBufferManifest;
94
134
  /**
95
- Retrieve a package metadata for {name} package
96
- Function invokes localStorage.getPackage and uplink.get_package for every
97
- uplink with proxy_access rights against {name} and combines results
98
- into one json object
99
- Used storages: local && uplink (proxy_access)
100
-
101
- * @param {object} options
102
- * @property {string} options.name Package Name
103
- * @property {object} options.req Express `req` object
104
- * @property {boolean} options.keepUpLinkData keep up link info in package meta, last update, etc.
105
- * @property {function} options.callback Callback for receive data
135
+ * Verify if the package exists in the local storage
136
+ * (the package refers to the package.json), directory would return false.
137
+ * @param pkgName package name
138
+ * @returns boolean
106
139
  */
107
- getPackage(options: IGetPackageOptions): void;
140
+ private hasPackage;
108
141
  /**
109
- * Retrieve only private local packages
110
- * @param {*} callback
142
+ * Create a new package.
143
+ * This situation happens only of the package does not exist on the cache.
144
+ *
145
+ * @param body package metadata
146
+ * @param options
147
+ * @returns
148
+ */
149
+ private publishANewVersion;
150
+ private notify;
151
+ private getProxyList;
152
+ /**
153
+ * Wrap uploadTarballAsStream into a promise.
154
+ * @param name package name
155
+ * @param fileName tarball name
156
+ * @param contentReadable content as readable stream
157
+ * @param options
158
+ * @returns
159
+ */
160
+ uploadTarball(name: string, fileName: string, contentReadable: Readable, { signal }: {
161
+ signal: any;
162
+ }): Promise<void>;
163
+ uploadTarballAsStream(pkgName: string, filename: string, { signal }: {
164
+ signal: any;
165
+ }): Promise<PassThrough>;
166
+ /**
167
+ * Add a new version to a package.
168
+ * @param name package name
169
+ * @param version version
170
+ * @param metadata version metadata
171
+ * @param tag tag of the version
172
+ */
173
+ addVersionNext(name: string, version: string, metadata: Version, tag: StringValue): Promise<void>;
174
+ /**
175
+ * Create an empty new local cache package without versions.
176
+ * @param name name of the package
177
+ * @returns
178
+ */
179
+ private createNewLocalCachePackage;
180
+ private isAllowPublishOffline;
181
+ /**
182
+ *
183
+ * @param name package name
184
+ * @param uplinksLook
185
+ * @returns
111
186
  */
112
- getLocalDatabase(callback: Callback): void;
187
+ private checkPackageRemote;
188
+ private setDefaultRevision;
189
+ private writePackageNext;
190
+ /**
191
+ * @param {*} name package name
192
+ * @param {*} updateHandler function(package, cb) - update function
193
+ * @param {*} callback callback that gets invoked after it's all updated
194
+ * @return {Function}
195
+ */
196
+ private updatePackageNext;
197
+ /**
198
+ *
199
+ * @protected
200
+ * @param {IGetPackageOptionsNext} options
201
+ * @return {*} {Promise<[Manifest, any[]]>}
202
+ * @memberof AbstractStorage
203
+ */
204
+ private getPackageNext;
113
205
  /**
114
206
  * Function fetches package metadata from uplinks and synchronizes it with local data
115
- if package is available locally, it MUST be provided in pkginfo
116
- returns callback(err, result, uplink_errors)
207
+ if package is available locally, it MUST be provided in pkginfo.
208
+
209
+ Using this example:
210
+
211
+ "jquery":
212
+ access: $all
213
+ publish: $authenticated
214
+ unpublish: $authenticated
215
+ # two uplinks setup
216
+ proxy: ver npmjs
217
+ # one uplink setup
218
+ proxy: npmjs
219
+
220
+ A package requires uplinks syncronization if enables the proxy section, uplinks
221
+ can be more than one, the more are the most slow request will take, the request
222
+ are made in serie and if 1st call fails, the second will be triggered, otherwise
223
+ the 1st will reply and others will be discareded. The order is important.
224
+
225
+ Errors on upkinks are considered are, time outs, connection fails and http status 304,
226
+ in that case the request returns empty body and we want ask next on the list if has fresh
227
+ updates.
228
+ */
229
+ syncUplinksMetadataNext(name: string, localManifest: Manifest | null, options?: ISyncUplinksOptions): Promise<[Manifest | null, any]>;
230
+ /**
231
+ * Merge a manifest with a remote manifest.
232
+ *
233
+ * If the uplinks are not available, the local manifest is returned.
234
+ * If the uplinks are available, the local manifest is merged with the remote one.
235
+ *
236
+ *
237
+ * @param uplink uplink instance
238
+ * @param cachedManifest the local cached manifest
239
+ * @param options options
240
+ * @returns Returns a promise that resolves with the merged manifest.
241
+ */
242
+ private mergeCacheRemoteMetadata;
243
+ /**
244
+ * Apply filters to manifest.
245
+ * @param manifest
246
+ * @returns
117
247
  */
118
- _syncUplinksMetadata(name: string, packageInfo: Package, options: ISyncUplinks, callback: Callback): void;
248
+ applyFilters(manifest: Manifest): Promise<[Manifest, any]>;
249
+ private _createNewPackageNext;
119
250
  /**
120
- * Set a hidden value for each version.
121
- * @param {Array} versions list of version
122
- * @param {String} upLink uplink name
251
+ * Ensure the dist file remains as the same protocol
252
+ * @param {Object} hash metadata
253
+ * @param {String} upLinkKey registry key
123
254
  * @private
255
+ * @deprecated use _updateUplinkToRemoteProtocolNext (???)
124
256
  */
125
- _updateVersionsHiddenUpLink(versions: Versions, upLink: IProxy): void;
257
+ private updateUplinkToRemoteProtocol;
258
+ /**
259
+ * Create or read a package.
260
+ *
261
+ * If the package already exists, it will be read.
262
+ * If the package is not found, it will be created.
263
+ * If the error is anything else will throw an error
264
+ *
265
+ * @param {*} pkgName
266
+ * @param {*} callback
267
+ * @return {Function}
268
+ */
269
+ private readCreatePackage;
270
+ /**
271
+ Updates the local cache with the merge from the remote/client manifest.
272
+
273
+ The steps are the following.
274
+ 1. Get the latest version of the package from the cache.
275
+ 2. If does not exist will return a
276
+
277
+ @param name
278
+ @param remoteManifest
279
+ @returns return a merged manifest.
280
+ */
281
+ updateVersionsNext(name: string, remoteManifest: Manifest): Promise<Manifest>;
126
282
  }
127
283
  export { Storage };