@verdaccio/store 6.0.0-6-next.23 → 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.
- package/CHANGELOG.md +35 -0
- package/build/lib/storage-utils.js +8 -1
- package/build/lib/storage-utils.js.map +1 -1
- package/build/storage.d.ts +7 -5
- package/build/storage.js +54 -8
- package/build/storage.js.map +1 -1
- package/build/type.d.ts +5 -0
- package/build/type.js.map +1 -1
- package/jest.config.js +3 -3
- package/package.json +6 -6
- package/src/lib/storage-utils.ts +7 -1
- package/src/storage.ts +61 -7
- package/src/type.ts +6 -0
- package/test/storage.spec.ts +292 -44
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# @verdaccio/store
|
|
2
2
|
|
|
3
|
+
## 6.0.0-6-next.24
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 37274e4c: feat: implement abbreviated manifest
|
|
8
|
+
|
|
9
|
+
Enable abbreviated manifest data by adding the header:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
curl -H "Accept: application/vnd.npm.install-v1+json" https://registry.npmjs.org/verdaccio
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
It returns a filtered manifest, additionally includes the [time](https://github.com/pnpm/rfcs/pull/2) field by request.
|
|
16
|
+
|
|
17
|
+
Current support for packages managers:
|
|
18
|
+
|
|
19
|
+
- npm: yes
|
|
20
|
+
- pnpm: yes
|
|
21
|
+
- yarn classic: yes
|
|
22
|
+
- yarn modern (+2.x): [no](https://github.com/yarnpkg/berry/pull/3981#issuecomment-1076566096)
|
|
23
|
+
|
|
24
|
+
https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-metadata-format
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [37274e4c]
|
|
29
|
+
- @verdaccio/local-storage@11.0.0-6-next.14
|
|
30
|
+
- @verdaccio/core@6.0.0-6-next.6
|
|
31
|
+
- @verdaccio/tarball@11.0.0-6-next.13
|
|
32
|
+
- @verdaccio/url@11.0.0-6-next.10
|
|
33
|
+
- @verdaccio/hooks@6.0.0-6-next.14
|
|
34
|
+
- @verdaccio/loaders@6.0.0-6-next.13
|
|
35
|
+
- @verdaccio/logger@6.0.0-6-next.12
|
|
36
|
+
- @verdaccio/proxy@6.0.0-6-next.22
|
|
37
|
+
|
|
3
38
|
## 6.0.0-6-next.23
|
|
4
39
|
|
|
5
40
|
### Major Changes
|
|
@@ -280,7 +280,8 @@ function mergeVersions(cacheManifest, remoteManifest) {
|
|
|
280
280
|
let _cacheManifest = { ...cacheManifest
|
|
281
281
|
};
|
|
282
282
|
const {
|
|
283
|
-
versions
|
|
283
|
+
versions,
|
|
284
|
+
time
|
|
284
285
|
} = remoteManifest; // copy new versions to a cache
|
|
285
286
|
// NOTE: if a certain version was updated, we can't refresh it reliably
|
|
286
287
|
|
|
@@ -290,6 +291,12 @@ function mergeVersions(cacheManifest, remoteManifest) {
|
|
|
290
291
|
}
|
|
291
292
|
}
|
|
292
293
|
|
|
294
|
+
for (const i in time) {
|
|
295
|
+
if (typeof cacheManifest.time[i] === 'undefined') {
|
|
296
|
+
_cacheManifest.time[i] = time[i];
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
293
300
|
for (const distTag in remoteManifest[_core.DIST_TAGS]) {
|
|
294
301
|
if (_cacheManifest[_core.DIST_TAGS][distTag] !== remoteManifest[_core.DIST_TAGS][distTag]) {
|
|
295
302
|
if (!_cacheManifest[_core.DIST_TAGS][distTag] || _semver.default.lte(_cacheManifest[_core.DIST_TAGS][distTag], remoteManifest[_core.DIST_TAGS][distTag])) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-utils.js","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","isNil","validatioUtils","isObject","_id","normalizeDistTags","generateRevision","rev","split","generateRandomHexString","getLatestReadme","distTags","latestVersion","readme","_","trim","readmeDistTagsPriority","tag","version","cleanUpReadme","WHITELIST","cleanUpLinksRef","result","keepUpLinkData","propertyToKeep","push","i","indexOf","checkPackageRemote","isAllowPublishOffline","syncMetadata","Promise","resolve","reject","err","packageJsonLocal","upLinksErrors","status","HTTP_STATUS","NOT_FOUND","errorUtils","getConflict","API_ERROR","PACKAGE_EXIST","errorItem","length","getServiceUnavailable","UPLINK_OFFLINE_PUBLISH","mergeUplinkTimeIntoLocal","localMetadata","remoteMetadata","Object","assign","mergeUplinkTimeIntoLocalNext","cacheManifest","remoteManifest","updateUpLinkMetadata","uplinkId","manifest","etag","fetched","Date","now","prepareSearchPackage","data","latest","pkgUtils","getLatest","description","maintainers","author","filter","Boolean","repository","readmeFilename","homepage","keywords","bugs","license","isDifferentThanOne","keys","hasInvalidPublishBody","res","mergeVersions","_cacheManifest","distTag","semver","lte","sorted","sortVersionsAndFilterInvalid","pop","isArray","isString","parse","hasDeprecatedVersions","pkgInfo","prototype","hasOwnProperty","call","isDeprecatedManifest"],"sources":["../../src/lib/storage-utils.ts"],"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, Manifest, Version, Versions } from '@verdaccio/types';\nimport { generateRandomHexString, isNil, isObject } from '@verdaccio/utils';\n\nimport { sortVersionsAndFilterInvalid } from './versions-utils';\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\n/**\n * Create a new package in the storage, return a boilerplate package\n * @param name package name\n * @returns {Manifest}\n */\nexport function generatePackageTemplate(name: string): Manifest {\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: Manifest): Manifest {\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 (typeof pkg?._rev !== 'string') {\n pkg._rev = STORAGE.DEFAULT_REVISION;\n }\n\n if (typeof pkg?._id !== 'string') {\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: Manifest): 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: Manifest, keepUpLinkData?: boolean): Manifest {\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// TODO: move to abstract storage\n// @deprecated use abstract.storage.ts:checkPackageRemote\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\n// @deprecated use export function mergeUplinkTimeIntoLocalNext\nexport function mergeUplinkTimeIntoLocal(localMetadata: Manifest, remoteMetadata: Manifest): any {\n if ('time' in remoteMetadata) {\n return Object.assign({}, localMetadata.time, remoteMetadata.time);\n }\n\n return localMetadata.time;\n}\n\nexport function mergeUplinkTimeIntoLocalNext(\n cacheManifest: Manifest,\n remoteManifest: Manifest\n): Manifest {\n if ('time' in remoteManifest) {\n // remote override cache time conflicts\n return { ...cacheManifest, time: { ...cacheManifest.time, ...remoteManifest.time } };\n }\n\n return cacheManifest;\n}\n\nexport function updateUpLinkMetadata(uplinkId, manifest: Manifest, etag: string) {\n const _uplinks = {\n ...manifest._uplinks,\n [uplinkId]: {\n etag,\n fetched: Date.now(),\n },\n };\n return {\n ...manifest,\n _uplinks,\n };\n}\n\nexport function prepareSearchPackage(data: Manifest): 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\nexport function isDifferentThanOne(versions: Versions | AttachMents): boolean {\n return Object.keys(versions).length !== 1;\n}\n\n// @deprecated use validationUtils.validatePublishNewPackage\nexport function hasInvalidPublishBody(manifest: Pick<Manifest, '_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\n/**\n * Function gets a local info and an info from uplinks and tries to merge it\n exported for unit tests only.\n * @param {*} local\n * @param {*} remoteManifest\n * @param {*} config configuration file\n */\nexport function mergeVersions(cacheManifest: Manifest, remoteManifest: Manifest): Manifest {\n let _cacheManifest = { ...cacheManifest };\n const { versions } = remoteManifest;\n // copy new versions to a cache\n // NOTE: if a certain version was updated, we can't refresh it reliably\n for (const i in versions) {\n if (typeof cacheManifest.versions[i] === 'undefined') {\n _cacheManifest.versions[i] = versions[i];\n }\n }\n\n for (const distTag in remoteManifest[DIST_TAGS]) {\n if (_cacheManifest[DIST_TAGS][distTag] !== remoteManifest[DIST_TAGS][distTag]) {\n if (\n !_cacheManifest[DIST_TAGS][distTag] ||\n semver.lte(_cacheManifest[DIST_TAGS][distTag], remoteManifest[DIST_TAGS][distTag])\n ) {\n _cacheManifest[DIST_TAGS][distTag] = remoteManifest[DIST_TAGS][distTag];\n }\n if (\n distTag === 'latest' &&\n _cacheManifest[DIST_TAGS][distTag] === remoteManifest[DIST_TAGS][distTag]\n ) {\n // NOTE: this override the latest publish readme from local cache with\n // the remote one\n cacheManifest = { ..._cacheManifest, readme: remoteManifest.readme };\n }\n }\n }\n\n return cacheManifest;\n}\n\n/**\n * Normalize dist-tags.\n *\n * There is a legacy behaviour where the dist-tags could be an array, in such\n * case, the array is orderded and the highest version becames the\n * latest.\n *\n * The dist-tag tags must be plain strigs, if the latest is empty (for whatever reason) is\n * normalized to be the highest version available.\n *\n * This function cleans up every invalid version on dist-tags, but does not remove\n * invalid versions from the manifest.\n *\n * @param {*} data\n */\nexport function normalizeDistTags(manifest: Manifest): Manifest {\n let sorted;\n // handle missing latest dist-tag\n if (!manifest[DIST_TAGS].latest) {\n // if there is no latest tag, set the highest known version based on semver sort\n sorted = sortVersionsAndFilterInvalid(Object.keys(manifest.versions));\n if (sorted?.length) {\n // get the highest published version\n manifest[DIST_TAGS].latest = sorted.pop();\n }\n }\n\n for (const tag in manifest[DIST_TAGS]) {\n // deprecated (will be removed un future majors)\n // this should not happen, tags should be plain strings, legacy fallback\n if (_.isArray(manifest[DIST_TAGS][tag])) {\n if (manifest[DIST_TAGS][tag].length) {\n // sort array\n // FIXME: this is clearly wrong, we need to research why this is like this.\n // @ts-ignore\n sorted = sortVersionsAndFilterInvalid(manifest[DIST_TAGS][tag]);\n if (sorted.length) {\n // use highest version based on semver sort\n manifest[DIST_TAGS][tag] = sorted.pop();\n }\n } else {\n delete manifest[DIST_TAGS][tag];\n }\n } else if (_.isString(manifest[DIST_TAGS][tag])) {\n if (!semver.parse(manifest[DIST_TAGS][tag], true)) {\n // if the version is invalid, delete the dist-tag entry\n delete manifest[DIST_TAGS][tag];\n }\n }\n }\n\n return manifest;\n}\n\nexport function hasDeprecatedVersions(pkgInfo: Manifest): 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 isDeprecatedManifest(manifest: Manifest): boolean {\n return hasDeprecatedVersions(manifest) && Object.keys(manifest._attachments).length === 0;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage-utils.js","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","isNil","validatioUtils","isObject","_id","normalizeDistTags","generateRevision","rev","split","generateRandomHexString","getLatestReadme","distTags","latestVersion","readme","_","trim","readmeDistTagsPriority","tag","version","cleanUpReadme","WHITELIST","cleanUpLinksRef","result","keepUpLinkData","propertyToKeep","push","i","indexOf","checkPackageRemote","isAllowPublishOffline","syncMetadata","Promise","resolve","reject","err","packageJsonLocal","upLinksErrors","status","HTTP_STATUS","NOT_FOUND","errorUtils","getConflict","API_ERROR","PACKAGE_EXIST","errorItem","length","getServiceUnavailable","UPLINK_OFFLINE_PUBLISH","mergeUplinkTimeIntoLocal","localMetadata","remoteMetadata","Object","assign","mergeUplinkTimeIntoLocalNext","cacheManifest","remoteManifest","updateUpLinkMetadata","uplinkId","manifest","etag","fetched","Date","now","prepareSearchPackage","data","latest","pkgUtils","getLatest","description","maintainers","author","filter","Boolean","repository","readmeFilename","homepage","keywords","bugs","license","isDifferentThanOne","keys","hasInvalidPublishBody","res","mergeVersions","_cacheManifest","distTag","semver","lte","sorted","sortVersionsAndFilterInvalid","pop","isArray","isString","parse","hasDeprecatedVersions","pkgInfo","prototype","hasOwnProperty","call","isDeprecatedManifest"],"sources":["../../src/lib/storage-utils.ts"],"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, Manifest, Version, Versions } from '@verdaccio/types';\nimport { generateRandomHexString, isNil, isObject } from '@verdaccio/utils';\n\nimport { sortVersionsAndFilterInvalid } from './versions-utils';\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\n/**\n * Create a new package in the storage, return a boilerplate package\n * @param name package name\n * @returns {Manifest}\n */\nexport function generatePackageTemplate(name: string): Manifest {\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: Manifest): Manifest {\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 (typeof pkg?._rev !== 'string') {\n pkg._rev = STORAGE.DEFAULT_REVISION;\n }\n\n if (typeof pkg?._id !== 'string') {\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: Manifest): 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: Manifest, keepUpLinkData?: boolean): Manifest {\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// TODO: move to abstract storage\n// @deprecated use abstract.storage.ts:checkPackageRemote\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\n// @deprecated use export function mergeUplinkTimeIntoLocalNext\nexport function mergeUplinkTimeIntoLocal(localMetadata: Manifest, remoteMetadata: Manifest): any {\n if ('time' in remoteMetadata) {\n return Object.assign({}, localMetadata.time, remoteMetadata.time);\n }\n\n return localMetadata.time;\n}\n\nexport function mergeUplinkTimeIntoLocalNext(\n cacheManifest: Manifest,\n remoteManifest: Manifest\n): Manifest {\n if ('time' in remoteManifest) {\n // remote override cache time conflicts\n return { ...cacheManifest, time: { ...cacheManifest.time, ...remoteManifest.time } };\n }\n\n return cacheManifest;\n}\n\nexport function updateUpLinkMetadata(uplinkId, manifest: Manifest, etag: string) {\n const _uplinks = {\n ...manifest._uplinks,\n [uplinkId]: {\n etag,\n fetched: Date.now(),\n },\n };\n return {\n ...manifest,\n _uplinks,\n };\n}\n\nexport function prepareSearchPackage(data: Manifest): 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\nexport function isDifferentThanOne(versions: Versions | AttachMents): boolean {\n return Object.keys(versions).length !== 1;\n}\n\n// @deprecated use validationUtils.validatePublishNewPackage\nexport function hasInvalidPublishBody(manifest: Pick<Manifest, '_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\n/**\n * Function gets a local info and an info from uplinks and tries to merge it\n exported for unit tests only.\n * @param {*} local\n * @param {*} remoteManifest\n * @param {*} config configuration file\n */\nexport function mergeVersions(cacheManifest: Manifest, remoteManifest: Manifest): Manifest {\n let _cacheManifest = { ...cacheManifest };\n const { versions, time } = remoteManifest;\n // copy new versions to a cache\n // NOTE: if a certain version was updated, we can't refresh it reliably\n for (const i in versions) {\n if (typeof cacheManifest.versions[i] === 'undefined') {\n _cacheManifest.versions[i] = versions[i];\n }\n }\n\n for (const i in time) {\n if (typeof cacheManifest.time[i] === 'undefined') {\n _cacheManifest.time[i] = time[i];\n }\n }\n\n for (const distTag in remoteManifest[DIST_TAGS]) {\n if (_cacheManifest[DIST_TAGS][distTag] !== remoteManifest[DIST_TAGS][distTag]) {\n if (\n !_cacheManifest[DIST_TAGS][distTag] ||\n semver.lte(_cacheManifest[DIST_TAGS][distTag], remoteManifest[DIST_TAGS][distTag])\n ) {\n _cacheManifest[DIST_TAGS][distTag] = remoteManifest[DIST_TAGS][distTag];\n }\n if (\n distTag === 'latest' &&\n _cacheManifest[DIST_TAGS][distTag] === remoteManifest[DIST_TAGS][distTag]\n ) {\n // NOTE: this override the latest publish readme from local cache with\n // the remote one\n cacheManifest = { ..._cacheManifest, readme: remoteManifest.readme };\n }\n }\n }\n\n return cacheManifest;\n}\n\n/**\n * Normalize dist-tags.\n *\n * There is a legacy behaviour where the dist-tags could be an array, in such\n * case, the array is orderded and the highest version becames the\n * latest.\n *\n * The dist-tag tags must be plain strigs, if the latest is empty (for whatever reason) is\n * normalized to be the highest version available.\n *\n * This function cleans up every invalid version on dist-tags, but does not remove\n * invalid versions from the manifest.\n *\n * @param {*} data\n */\nexport function normalizeDistTags(manifest: Manifest): Manifest {\n let sorted;\n // handle missing latest dist-tag\n if (!manifest[DIST_TAGS].latest) {\n // if there is no latest tag, set the highest known version based on semver sort\n sorted = sortVersionsAndFilterInvalid(Object.keys(manifest.versions));\n if (sorted?.length) {\n // get the highest published version\n manifest[DIST_TAGS].latest = sorted.pop();\n }\n }\n\n for (const tag in manifest[DIST_TAGS]) {\n // deprecated (will be removed un future majors)\n // this should not happen, tags should be plain strings, legacy fallback\n if (_.isArray(manifest[DIST_TAGS][tag])) {\n if (manifest[DIST_TAGS][tag].length) {\n // sort array\n // FIXME: this is clearly wrong, we need to research why this is like this.\n // @ts-ignore\n sorted = sortVersionsAndFilterInvalid(manifest[DIST_TAGS][tag]);\n if (sorted.length) {\n // use highest version based on semver sort\n manifest[DIST_TAGS][tag] = sorted.pop();\n }\n } else {\n delete manifest[DIST_TAGS][tag];\n }\n } else if (_.isString(manifest[DIST_TAGS][tag])) {\n if (!semver.parse(manifest[DIST_TAGS][tag], true)) {\n // if the version is invalid, delete the dist-tag entry\n delete manifest[DIST_TAGS][tag];\n }\n }\n }\n\n return manifest;\n}\n\nexport function hasDeprecatedVersions(pkgInfo: Manifest): 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 isDeprecatedManifest(manifest: Manifest): boolean {\n return hasDeprecatedVersions(manifest) && Object.keys(manifest._attachments).length === 0;\n}\n"],"mappings":"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"}
|
package/build/storage.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { PassThrough, Readable } from 'stream';
|
|
3
3
|
import { searchUtils } from '@verdaccio/core';
|
|
4
|
-
import {
|
|
5
|
-
import { Config, Logger, Manifest, MergeTags, StringValue, Token, TokenFilter, Version } from '@verdaccio/types';
|
|
4
|
+
import { ISyncUplinksOptions, ProxySearchParams } from '@verdaccio/proxy';
|
|
5
|
+
import { AbbreviatedManifest, Config, Logger, Manifest, MergeTags, StringValue, Token, TokenFilter, Version } from '@verdaccio/types';
|
|
6
6
|
import { UpdateManifestOptions } from '.';
|
|
7
7
|
import { ProxyInstanceList } from './lib/uplink-util';
|
|
8
8
|
import { LocalStorage } from './local-storage';
|
|
@@ -17,6 +17,7 @@ declare class Storage {
|
|
|
17
17
|
readonly logger: Logger;
|
|
18
18
|
readonly uplinks: ProxyInstanceList;
|
|
19
19
|
constructor(config: Config);
|
|
20
|
+
static ABBREVIATED_HEADER: string;
|
|
20
21
|
/**
|
|
21
22
|
* Change an existing package (i.e. unpublish one version)
|
|
22
23
|
Function changes a package info from local storage and all uplinks with write access./
|
|
@@ -52,18 +53,19 @@ declare class Storage {
|
|
|
52
53
|
}): Promise<PassThrough>;
|
|
53
54
|
getPackageByVersion(options: IGetPackageOptionsNext): Promise<Version>;
|
|
54
55
|
getPackageManifest(options: IGetPackageOptionsNext): Promise<Manifest>;
|
|
56
|
+
private convertAbbreviatedManifest;
|
|
55
57
|
/**
|
|
56
58
|
* Return a manifest or version based on the options.
|
|
57
59
|
* @param options {Object}
|
|
58
60
|
* @returns A package manifest or specific version
|
|
59
61
|
*/
|
|
60
|
-
getPackageByOptions(options: IGetPackageOptionsNext): Promise<Manifest | Version>;
|
|
62
|
+
getPackageByOptions(options: IGetPackageOptionsNext): Promise<Manifest | AbbreviatedManifest | Version>;
|
|
61
63
|
getLocalDatabaseNext(): Promise<Version[]>;
|
|
62
64
|
saveToken(token: Token): Promise<any>;
|
|
63
65
|
deleteToken(user: string, tokenKey: string): Promise<any>;
|
|
64
66
|
readTokens(filter: TokenFilter): Promise<Token[]>;
|
|
65
67
|
/**
|
|
66
|
-
* Initialize the storage
|
|
68
|
+
* Initialize the storage asynchronously.
|
|
67
69
|
* @param config Config
|
|
68
70
|
* @param filters IPluginFilters
|
|
69
71
|
* @returns Storage instance
|
|
@@ -237,7 +239,7 @@ declare class Storage {
|
|
|
237
239
|
* @param options options
|
|
238
240
|
* @returns Returns a promise that resolves with the merged manifest.
|
|
239
241
|
*/
|
|
240
|
-
mergeCacheRemoteMetadata
|
|
242
|
+
private mergeCacheRemoteMetadata;
|
|
241
243
|
/**
|
|
242
244
|
* Apply filters to manifest.
|
|
243
245
|
* @param manifest
|
package/build/storage.js
CHANGED
|
@@ -71,13 +71,14 @@ class Storage {
|
|
|
71
71
|
this.localStorage = null;
|
|
72
72
|
debug('uplinks available %o', Object.keys(this.uplinks));
|
|
73
73
|
}
|
|
74
|
+
|
|
75
|
+
static ABBREVIATED_HEADER = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*';
|
|
74
76
|
/**
|
|
75
77
|
* Change an existing package (i.e. unpublish one version)
|
|
76
78
|
Function changes a package info from local storage and all uplinks with write access./
|
|
77
79
|
Used storages: local (write)
|
|
78
80
|
*/
|
|
79
81
|
|
|
80
|
-
|
|
81
82
|
async changePackageNext(name, metadata, revision) {
|
|
82
83
|
debug('change existing package for package %o revision %o', name, revision);
|
|
83
84
|
debug(`change manifest tags for %o revision %s`, name, revision);
|
|
@@ -508,6 +509,44 @@ class Storage {
|
|
|
508
509
|
const convertedManifest = (0, _tarball.convertDistRemoteToLocalTarballUrls)(manifest, options.requestOptions, this.config.url_prefix);
|
|
509
510
|
return convertedManifest;
|
|
510
511
|
}
|
|
512
|
+
|
|
513
|
+
convertAbbreviatedManifest(manifest) {
|
|
514
|
+
const abbreviatedVersions = Object.keys(manifest.versions).reduce((acc, version) => {
|
|
515
|
+
const _version = manifest.versions[version]; // This should be align with this document
|
|
516
|
+
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object
|
|
517
|
+
|
|
518
|
+
const _version_abbreviated = {
|
|
519
|
+
name: _version.name,
|
|
520
|
+
version: _version.version,
|
|
521
|
+
description: _version.description,
|
|
522
|
+
deprecated: _version.deprecated,
|
|
523
|
+
bin: _version.bin,
|
|
524
|
+
dist: _version.dist,
|
|
525
|
+
engines: _version.engines,
|
|
526
|
+
funding: _version.funding,
|
|
527
|
+
directories: _version.directories,
|
|
528
|
+
dependencies: _version.dependencies,
|
|
529
|
+
devDependencies: _version.devDependencies,
|
|
530
|
+
peerDependencies: _version.peerDependencies,
|
|
531
|
+
optionalDependencies: _version.optionalDependencies,
|
|
532
|
+
bundleDependencies: _version.bundleDependencies,
|
|
533
|
+
// npm cli specifics
|
|
534
|
+
_hasShrinkwrap: _version._hasShrinkwrap,
|
|
535
|
+
hasInstallScript: _version.hasInstallScript
|
|
536
|
+
};
|
|
537
|
+
acc[version] = _version_abbreviated;
|
|
538
|
+
return acc;
|
|
539
|
+
}, {});
|
|
540
|
+
const convertedManifest = {
|
|
541
|
+
name: manifest['name'],
|
|
542
|
+
[_core.DIST_TAGS]: manifest[_core.DIST_TAGS],
|
|
543
|
+
versions: abbreviatedVersions,
|
|
544
|
+
modified: manifest.time.modified,
|
|
545
|
+
// NOTE: special case for pnpm https://github.com/pnpm/rfcs/pull/2
|
|
546
|
+
time: manifest.time
|
|
547
|
+
};
|
|
548
|
+
return convertedManifest;
|
|
549
|
+
}
|
|
511
550
|
/**
|
|
512
551
|
* Return a manifest or version based on the options.
|
|
513
552
|
* @param options {Object}
|
|
@@ -520,7 +559,14 @@ class Storage {
|
|
|
520
559
|
if (_lodash.default.isNil(options.version) === false) {
|
|
521
560
|
return this.getPackageByVersion(options);
|
|
522
561
|
} else {
|
|
523
|
-
|
|
562
|
+
const manifest = await this.getPackageManifest(options);
|
|
563
|
+
|
|
564
|
+
if (options.abbreviated === true) {
|
|
565
|
+
debug('abbreviated manifest');
|
|
566
|
+
return this.convertAbbreviatedManifest(manifest);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
return manifest;
|
|
524
570
|
}
|
|
525
571
|
}
|
|
526
572
|
|
|
@@ -579,7 +625,7 @@ class Storage {
|
|
|
579
625
|
return this.localStorage.getStoragePlugin().readTokens(filter);
|
|
580
626
|
}
|
|
581
627
|
/**
|
|
582
|
-
* Initialize the storage
|
|
628
|
+
* Initialize the storage asynchronously.
|
|
583
629
|
* @param config Config
|
|
584
630
|
* @param filters IPluginFilters
|
|
585
631
|
* @returns Storage instance
|
|
@@ -1652,7 +1698,7 @@ class Storage {
|
|
|
1652
1698
|
const [remoteManifest, etag] = await uplink.getRemoteMetadataNext(_cacheManifest.name, remoteOptions);
|
|
1653
1699
|
|
|
1654
1700
|
try {
|
|
1655
|
-
_cacheManifest = _core.validatioUtils.normalizeMetadata(
|
|
1701
|
+
_cacheManifest = _core.validatioUtils.normalizeMetadata(_cacheManifest, _cacheManifest.name);
|
|
1656
1702
|
} catch (err) {
|
|
1657
1703
|
this.logger.error({
|
|
1658
1704
|
err: err
|
|
@@ -1665,7 +1711,7 @@ class Storage {
|
|
|
1665
1711
|
|
|
1666
1712
|
_cacheManifest = (0, _storageUtils.mergeUplinkTimeIntoLocalNext)(_cacheManifest, remoteManifest); // update the _uplinks field in the cache
|
|
1667
1713
|
|
|
1668
|
-
_cacheManifest = (0, _uplinkUtil.updateVersionsHiddenUpLinkNext)(
|
|
1714
|
+
_cacheManifest = (0, _uplinkUtil.updateVersionsHiddenUpLinkNext)(_cacheManifest, uplink);
|
|
1669
1715
|
|
|
1670
1716
|
try {
|
|
1671
1717
|
// merge versions from remote into the cache
|
|
@@ -1674,7 +1720,7 @@ class Storage {
|
|
|
1674
1720
|
} catch (err) {
|
|
1675
1721
|
this.logger.error({
|
|
1676
1722
|
err: err
|
|
1677
|
-
}, 'package.json
|
|
1723
|
+
}, 'package.json merge has failed @{!err?.message}\n@{err.stack}');
|
|
1678
1724
|
throw err;
|
|
1679
1725
|
}
|
|
1680
1726
|
}
|
|
@@ -1799,7 +1845,7 @@ class Storage {
|
|
|
1799
1845
|
for (const versionId in remoteManifest.versions) {
|
|
1800
1846
|
// if detect a new remote version does not exist cache
|
|
1801
1847
|
if (_lodash.default.isNil(cacheManifest.versions[versionId])) {
|
|
1802
|
-
var
|
|
1848
|
+
var _version2, _version2$dist;
|
|
1803
1849
|
|
|
1804
1850
|
debug('new version from upstream %o', versionId);
|
|
1805
1851
|
let version = remoteManifest.versions[versionId]; // we don't keep readme for package versions,
|
|
@@ -1812,7 +1858,7 @@ class Storage {
|
|
|
1812
1858
|
change = true;
|
|
1813
1859
|
cacheManifest.versions[versionId] = version;
|
|
1814
1860
|
|
|
1815
|
-
if ((
|
|
1861
|
+
if ((_version2 = version) !== null && _version2 !== void 0 && (_version2$dist = _version2.dist) !== null && _version2$dist !== void 0 && _version2$dist.tarball) {
|
|
1816
1862
|
const filename = _core.pkgUtils.extractTarballName(version.dist.tarball); // store a fast access to the dist file by tarball name
|
|
1817
1863
|
// it does NOT overwrite any existing records
|
|
1818
1864
|
|