@verdaccio/store 7.0.0-next-7.15 → 7.0.0-next-7.17
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 +39 -0
- package/build/lib/storage-utils.d.ts +1 -0
- package/build/lib/storage-utils.js +5 -1
- package/build/lib/storage-utils.js.map +1 -1
- package/build/storage.d.ts +7 -4
- package/build/storage.js +126 -20
- package/build/storage.js.map +1 -1
- package/build/type.d.ts +5 -0
- package/build/type.js.map +1 -1
- package/package.json +14 -14
- package/src/lib/storage-utils.ts +5 -1
- package/src/storage.ts +151 -24
- package/src/type.ts +6 -0
- package/test/fixtures/config/publishWithOwnerAndCheck.yaml +18 -0
- package/test/fixtures/config/publishWithOwnerDefault.yaml +15 -0
- package/test/storage-utils.spec.ts +1 -0
- package/test/storage.spec.ts +356 -8
- package/test/versions.spec.ts +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# @verdaccio/store
|
|
2
2
|
|
|
3
|
+
## 7.0.0-next-7.17
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 6e764e3: feat: add support for npm owner
|
|
8
|
+
- de6ff5c: fix: update fields for abbreviated manifest
|
|
9
|
+
- Updated dependencies [6e764e3]
|
|
10
|
+
- @verdaccio/config@7.0.0-next-7.17
|
|
11
|
+
- @verdaccio/core@7.0.0-next-7.17
|
|
12
|
+
- @verdaccio/tarball@12.0.0-next-7.17
|
|
13
|
+
- @verdaccio/url@12.0.0-next-7.17
|
|
14
|
+
- @verdaccio/hooks@7.0.0-next-7.17
|
|
15
|
+
- @verdaccio/loaders@7.0.0-next-7.17
|
|
16
|
+
- @verdaccio/logger@7.0.0-next-7.17
|
|
17
|
+
- @verdaccio/local-storage@12.0.0-next-7.17
|
|
18
|
+
- @verdaccio/proxy@7.0.0-next-7.17
|
|
19
|
+
- @verdaccio/search@7.0.0-next-7.6
|
|
20
|
+
- @verdaccio/utils@7.0.0-next-7.17
|
|
21
|
+
|
|
22
|
+
## 7.0.0-next-7.16
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- e5624e1: chore: fix types for some store tests
|
|
27
|
+
- 5bfab62: feat: add tarball details for published packages
|
|
28
|
+
- Updated dependencies [5bfab62]
|
|
29
|
+
- Updated dependencies [38b1e82]
|
|
30
|
+
- @verdaccio/tarball@12.0.0-next-7.16
|
|
31
|
+
- @verdaccio/url@12.0.0-next-7.16
|
|
32
|
+
- @verdaccio/logger@7.0.0-next-7.16
|
|
33
|
+
- @verdaccio/hooks@7.0.0-next-7.16
|
|
34
|
+
- @verdaccio/loaders@7.0.0-next-7.16
|
|
35
|
+
- @verdaccio/local-storage@12.0.0-next-7.16
|
|
36
|
+
- @verdaccio/proxy@7.0.0-next-7.16
|
|
37
|
+
- @verdaccio/search@7.0.0-next-7.5
|
|
38
|
+
- @verdaccio/core@7.0.0-next-7.16
|
|
39
|
+
- @verdaccio/config@7.0.0-next-7.16
|
|
40
|
+
- @verdaccio/utils@7.0.0-next-7.16
|
|
41
|
+
|
|
3
42
|
## 7.0.0-next-7.15
|
|
4
43
|
|
|
5
44
|
### Patch Changes
|
|
@@ -36,6 +36,7 @@ export declare function updateUpLinkMetadata(uplinkId: any, manifest: Manifest,
|
|
|
36
36
|
time: import("@verdaccio/types").GenericBody;
|
|
37
37
|
versions: Versions;
|
|
38
38
|
maintainers?: import("@verdaccio/types").Author[] | undefined;
|
|
39
|
+
contributors?: import("@verdaccio/types").Author[] | undefined;
|
|
39
40
|
readme?: string | undefined;
|
|
40
41
|
users?: import("@verdaccio/types").PackageUsers | undefined;
|
|
41
42
|
access?: any;
|
|
@@ -48,6 +48,7 @@ function generatePackageTemplate(name) {
|
|
|
48
48
|
time: {},
|
|
49
49
|
[_core.USERS]: {},
|
|
50
50
|
[_core.DIST_TAGS]: {},
|
|
51
|
+
[_core.MAINTAINERS]: [],
|
|
51
52
|
_uplinks: {},
|
|
52
53
|
_distfiles: {},
|
|
53
54
|
_attachments: {},
|
|
@@ -111,7 +112,7 @@ function cleanUpReadme(version) {
|
|
|
111
112
|
}
|
|
112
113
|
return version;
|
|
113
114
|
}
|
|
114
|
-
const WHITELIST = exports.WHITELIST = ['_rev', 'name', 'versions', 'dist-tags', 'readme', 'time', '_id', 'users'];
|
|
115
|
+
const WHITELIST = exports.WHITELIST = ['_rev', 'name', 'versions', 'dist-tags', 'readme', 'time', '_id', 'users', 'maintainers'];
|
|
115
116
|
function cleanUpLinksRef(result, keepUpLinkData) {
|
|
116
117
|
const propertyToKeep = [...WHITELIST];
|
|
117
118
|
if (keepUpLinkData === true) {
|
|
@@ -278,6 +279,9 @@ function mergeVersions(cacheManifest, remoteManifest) {
|
|
|
278
279
|
}
|
|
279
280
|
}
|
|
280
281
|
}
|
|
282
|
+
|
|
283
|
+
// TODO: Should we merge owners? _cacheManifest[MAINTAINERS]
|
|
284
|
+
|
|
281
285
|
return cacheManifest;
|
|
282
286
|
}
|
|
283
287
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-utils.js","names":["_lodash","_interopRequireDefault","require","_semver","_core","_utils","_versionsUtils","obj","__esModule","default","STORAGE","exports","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","_sorted","sortVersionsAndFilterInvalid","pop","isArray","isString","parse","hasDeprecatedVersions","pkgInfo","prototype","hasOwnProperty","call","isDeprecatedManifest","mapManifestToSearchPackageBody","searchItem","scope","date","publisher","links","npm","package","scoped"],"sources":["../../src/lib/storage-utils.ts"],"sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\n\nimport { errorUtils, pkgUtils, searchUtils, 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\nexport function mapManifestToSearchPackageBody(\n pkg: Manifest,\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage-utils.js","names":["_lodash","_interopRequireDefault","require","_semver","_core","_utils","_versionsUtils","obj","__esModule","default","STORAGE","exports","PACKAGE_FILE_NAME","FILE_EXIST_ERROR","NO_SUCH_FILE_ERROR","DEFAULT_REVISION","generatePackageTemplate","name","versions","time","USERS","DIST_TAGS","MAINTAINERS","_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","_sorted","sortVersionsAndFilterInvalid","pop","isArray","isString","parse","hasDeprecatedVersions","pkgInfo","prototype","hasOwnProperty","call","isDeprecatedManifest","mapManifestToSearchPackageBody","searchItem","scope","date","publisher","links","npm","package","scoped"],"sources":["../../src/lib/storage-utils.ts"],"sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\n\nimport { errorUtils, pkgUtils, searchUtils, validatioUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, MAINTAINERS, 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 [MAINTAINERS]: [],\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 'maintainers',\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 // TODO: Should we merge owners? _cacheManifest[MAINTAINERS]\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\nexport function mapManifestToSearchPackageBody(\n pkg: Manifest,\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"],"mappings":"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"}
|
package/build/storage.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { ISyncUplinksOptions, ProxyInstanceList, ProxySearchParams } from '@verd
|
|
|
5
5
|
import { AbbreviatedManifest, Config, Logger, Manifest, MergeTags, Token, TokenFilter, Version } from '@verdaccio/types';
|
|
6
6
|
import { UpdateManifestOptions } from '.';
|
|
7
7
|
import { LocalStorage } from './local-storage';
|
|
8
|
-
import { IGetPackageOptionsNext, StarManifestBody } from './type';
|
|
8
|
+
import { IGetPackageOptionsNext, OwnerManifestBody, StarManifestBody } from './type';
|
|
9
9
|
export type Filters = pluginUtils.ManifestFilter<Config>[];
|
|
10
10
|
export declare const noSuchFile = "ENOENT";
|
|
11
11
|
export declare const resourceNotAvailable = "EAGAIN";
|
|
@@ -25,7 +25,7 @@ declare class Storage {
|
|
|
25
25
|
Used storages: local (write)
|
|
26
26
|
*/
|
|
27
27
|
changePackage(name: string, metadata: Manifest, revision: string): Promise<void>;
|
|
28
|
-
removePackage(name: string, revision:
|
|
28
|
+
removePackage(name: string, revision: string, username: string): Promise<void>;
|
|
29
29
|
/**
|
|
30
30
|
Remove a tarball from a system
|
|
31
31
|
Function removes a tarball from local storage.
|
|
@@ -33,7 +33,7 @@ declare class Storage {
|
|
|
33
33
|
versions, i.e. package version should be unpublished first.
|
|
34
34
|
Used storage: local (write)
|
|
35
35
|
*/
|
|
36
|
-
removeTarball(name: string, filename: string, _revision: string): Promise<Manifest>;
|
|
36
|
+
removeTarball(name: string, filename: string, _revision: string, username: string): Promise<Manifest>;
|
|
37
37
|
/**
|
|
38
38
|
* Handle search on packages and proxies.
|
|
39
39
|
* Iterate all proxies configured and search in all endpoints in v2 and pipe all responses
|
|
@@ -111,9 +111,10 @@ declare class Storage {
|
|
|
111
111
|
*/
|
|
112
112
|
mergeTagsNext(name: string, tags: MergeTags): Promise<Manifest>;
|
|
113
113
|
private getUpLinkForDistFile;
|
|
114
|
-
updateManifest(manifest: Manifest | StarManifestBody, options: UpdateManifestOptions): Promise<string | undefined>;
|
|
114
|
+
updateManifest(manifest: Manifest | StarManifestBody | OwnerManifestBody, options: UpdateManifestOptions): Promise<string | undefined>;
|
|
115
115
|
private deprecate;
|
|
116
116
|
private star;
|
|
117
|
+
private changeOwners;
|
|
117
118
|
/**
|
|
118
119
|
* Get local package, on fails return null.
|
|
119
120
|
* Errors are considered package not found.
|
|
@@ -272,5 +273,7 @@ declare class Storage {
|
|
|
272
273
|
@returns return a merged manifest.
|
|
273
274
|
*/
|
|
274
275
|
updateVersionsNext(name: string, remoteManifest: Manifest): Promise<Manifest>;
|
|
276
|
+
private getTarballStats;
|
|
277
|
+
private checkAllowedToChangePackage;
|
|
275
278
|
}
|
|
276
279
|
export { Storage };
|
package/build/storage.js
CHANGED
|
@@ -53,12 +53,12 @@ class Storage {
|
|
|
53
53
|
*/
|
|
54
54
|
async changePackage(name, metadata, revision) {
|
|
55
55
|
debug('change existing package for package %o revision %o', name, revision);
|
|
56
|
-
debug(`change manifest tags for %o revision %
|
|
56
|
+
debug(`change manifest tags for %o revision %o`, name, revision);
|
|
57
57
|
if (!_core.validatioUtils.isObject(metadata.versions) || !_core.validatioUtils.isObject(metadata[_core.DIST_TAGS])) {
|
|
58
58
|
debug(`change manifest bad data for %o`, name);
|
|
59
59
|
throw _core.errorUtils.getBadData();
|
|
60
60
|
}
|
|
61
|
-
debug(`change manifest
|
|
61
|
+
debug(`change manifest updating manifest for %o`, name);
|
|
62
62
|
await this.updatePackage(name, async localData => {
|
|
63
63
|
// eslint-disable-next-line guard-for-in
|
|
64
64
|
for (const version in localData.versions) {
|
|
@@ -99,12 +99,13 @@ class Storage {
|
|
|
99
99
|
}
|
|
100
100
|
localData[_core.USERS] = metadata[_core.USERS];
|
|
101
101
|
localData[_core.DIST_TAGS] = metadata[_core.DIST_TAGS];
|
|
102
|
+
localData[_core.MAINTAINERS] = metadata[_core.MAINTAINERS];
|
|
102
103
|
return localData;
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
|
-
async removePackage(name, revision) {
|
|
106
|
+
async removePackage(name, revision, username) {
|
|
106
107
|
debug('remove package %o', name);
|
|
107
|
-
await this.removePackageByRevision(name, revision);
|
|
108
|
+
await this.removePackageByRevision(name, revision, username);
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
/**
|
|
@@ -114,8 +115,9 @@ class Storage {
|
|
|
114
115
|
versions, i.e. package version should be unpublished first.
|
|
115
116
|
Used storage: local (write)
|
|
116
117
|
*/
|
|
118
|
+
async removeTarball(name, filename,
|
|
117
119
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
118
|
-
|
|
120
|
+
_revision, username) {
|
|
119
121
|
debug('remove tarball %s for %s', filename, name);
|
|
120
122
|
(0, _assert.default)(_core.validatioUtils.validateName(filename));
|
|
121
123
|
const storage = this.getPrivatePackageStorage(name);
|
|
@@ -129,6 +131,9 @@ class Storage {
|
|
|
129
131
|
if (!cacheManifest._attachments[filename]) {
|
|
130
132
|
throw _core.errorUtils.getNotFound('no such file available');
|
|
131
133
|
}
|
|
134
|
+
|
|
135
|
+
// check if logged in user is allowed to remove tarball
|
|
136
|
+
await this.checkAllowedToChangePackage(cacheManifest, username);
|
|
132
137
|
} catch (err) {
|
|
133
138
|
if (err.code === noSuchFile) {
|
|
134
139
|
throw _core.errorUtils.getNotFound();
|
|
@@ -382,6 +387,18 @@ class Storage {
|
|
|
382
387
|
async getPackageManifest(options) {
|
|
383
388
|
// convert dist remotes to local bars
|
|
384
389
|
const [manifest] = await this.getPackageNext(options);
|
|
390
|
+
|
|
391
|
+
// If change access is requested (?write=true), then check if logged in user is allowed to change package
|
|
392
|
+
if (options.byPassCache === true) {
|
|
393
|
+
try {
|
|
394
|
+
await this.checkAllowedToChangePackage(manifest, options.requestOptions.username);
|
|
395
|
+
} catch (error) {
|
|
396
|
+
_logger.logger.error({
|
|
397
|
+
error: error.message
|
|
398
|
+
}, 'getting package has failed: @{error}');
|
|
399
|
+
throw _core.errorUtils.getBadRequest(error.message);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
385
402
|
const convertedManifest = (0, _tarball.convertDistRemoteToLocalTarballUrls)(manifest, options.requestOptions, this.config.url_prefix);
|
|
386
403
|
return convertedManifest;
|
|
387
404
|
}
|
|
@@ -393,7 +410,6 @@ class Storage {
|
|
|
393
410
|
const _version_abbreviated = {
|
|
394
411
|
name: _version.name,
|
|
395
412
|
version: _version.version,
|
|
396
|
-
description: _version.description,
|
|
397
413
|
deprecated: _version.deprecated,
|
|
398
414
|
bin: _version.bin,
|
|
399
415
|
dist: _version.dist,
|
|
@@ -405,6 +421,10 @@ class Storage {
|
|
|
405
421
|
peerDependencies: _version.peerDependencies,
|
|
406
422
|
optionalDependencies: _version.optionalDependencies,
|
|
407
423
|
bundleDependencies: _version.bundleDependencies,
|
|
424
|
+
cpu: _version.cpu,
|
|
425
|
+
os: _version.os,
|
|
426
|
+
peerDependenciesMeta: _version.peerDependenciesMeta,
|
|
427
|
+
acceptDependencies: _version.acceptDependencies,
|
|
408
428
|
// npm cli specifics
|
|
409
429
|
_hasShrinkwrap: _version._hasShrinkwrap,
|
|
410
430
|
hasInstallScript: _version.hasInstallScript
|
|
@@ -596,7 +616,7 @@ class Storage {
|
|
|
596
616
|
}
|
|
597
617
|
return results;
|
|
598
618
|
}
|
|
599
|
-
async removePackageByRevision(pkgName, revision) {
|
|
619
|
+
async removePackageByRevision(pkgName, revision, username) {
|
|
600
620
|
const storage = this.getPrivatePackageStorage(pkgName);
|
|
601
621
|
debug('get package metadata for %o', pkgName);
|
|
602
622
|
if (typeof storage === 'undefined') {
|
|
@@ -624,6 +644,8 @@ class Storage {
|
|
|
624
644
|
|
|
625
645
|
// TODO: move this to another method
|
|
626
646
|
try {
|
|
647
|
+
// check if logged in user is allowed to remove package
|
|
648
|
+
await this.checkAllowedToChangePackage(manifest, username);
|
|
627
649
|
await this.localStorage.getStoragePlugin().remove(pkgName);
|
|
628
650
|
// remove each attachment
|
|
629
651
|
const attachments = Object.keys(manifest._attachments);
|
|
@@ -740,6 +762,7 @@ class Storage {
|
|
|
740
762
|
return uplink;
|
|
741
763
|
}
|
|
742
764
|
async updateManifest(manifest, options) {
|
|
765
|
+
debug('update manifest %o for user %o', manifest._id, options.requestOptions.username);
|
|
743
766
|
if ((0, _2.isDeprecatedManifest)(manifest)) {
|
|
744
767
|
// if the manifest is deprecated, we need to update the package.json
|
|
745
768
|
await this.deprecate(manifest, {
|
|
@@ -751,6 +774,12 @@ class Storage {
|
|
|
751
774
|
...options
|
|
752
775
|
});
|
|
753
776
|
return _core.API_MESSAGE.PKG_CHANGED;
|
|
777
|
+
} else if ((0, _starUtils.isPublishablePackage)(manifest) === false && Array.isArray(manifest.maintainers)) {
|
|
778
|
+
// if user request to change owners of package
|
|
779
|
+
await this.changeOwners(manifest, {
|
|
780
|
+
...options
|
|
781
|
+
});
|
|
782
|
+
return _core.API_MESSAGE.PKG_CHANGED;
|
|
754
783
|
} else if (_core.validatioUtils.validatePublishSingleVersion(manifest)) {
|
|
755
784
|
// if continue, the version to be published does not exist
|
|
756
785
|
// we create a new package
|
|
@@ -775,7 +804,7 @@ class Storage {
|
|
|
775
804
|
return message;
|
|
776
805
|
} else {
|
|
777
806
|
debug('invalid body format');
|
|
778
|
-
_logger.logger.
|
|
807
|
+
_logger.logger.warn({
|
|
779
808
|
packageName: options.name
|
|
780
809
|
}, `wrong package format on publish a package @{packageName}`);
|
|
781
810
|
throw _core.errorUtils.getBadRequest(_core.API_ERROR.UNSUPORTED_REGISTRY_CALL);
|
|
@@ -830,6 +859,35 @@ class Storage {
|
|
|
830
859
|
}, options.revision);
|
|
831
860
|
return _core.API_MESSAGE.PKG_CHANGED;
|
|
832
861
|
}
|
|
862
|
+
async changeOwners(manifest, options) {
|
|
863
|
+
const {
|
|
864
|
+
maintainers
|
|
865
|
+
} = manifest;
|
|
866
|
+
const {
|
|
867
|
+
requestOptions,
|
|
868
|
+
name
|
|
869
|
+
} = options;
|
|
870
|
+
debug('change owners of %o', name);
|
|
871
|
+
const {
|
|
872
|
+
username
|
|
873
|
+
} = requestOptions;
|
|
874
|
+
if (!username) {
|
|
875
|
+
throw _core.errorUtils.getBadRequest('update owners only allowed for logged in users');
|
|
876
|
+
}
|
|
877
|
+
if (!maintainers || maintainers.length === 0) {
|
|
878
|
+
throw _core.errorUtils.getBadRequest('maintainers field is required and must not be empty');
|
|
879
|
+
}
|
|
880
|
+
const localPackage = await this.getPackageManifest({
|
|
881
|
+
name,
|
|
882
|
+
requestOptions,
|
|
883
|
+
uplinksLook: false
|
|
884
|
+
});
|
|
885
|
+
await this.changePackage(name, {
|
|
886
|
+
...localPackage,
|
|
887
|
+
maintainers: maintainers
|
|
888
|
+
}, options.revision);
|
|
889
|
+
return _core.API_MESSAGE.PKG_CHANGED;
|
|
890
|
+
}
|
|
833
891
|
|
|
834
892
|
/**
|
|
835
893
|
* Get local package, on fails return null.
|
|
@@ -887,7 +945,8 @@ class Storage {
|
|
|
887
945
|
const {
|
|
888
946
|
name
|
|
889
947
|
} = options;
|
|
890
|
-
|
|
948
|
+
const username = options.requestOptions.username;
|
|
949
|
+
debug('publishing a new package for %o as %o', name, username);
|
|
891
950
|
let successResponseMessage;
|
|
892
951
|
const manifest = {
|
|
893
952
|
..._core.validatioUtils.normalizeMetadata(body, name)
|
|
@@ -929,33 +988,34 @@ class Storage {
|
|
|
929
988
|
}
|
|
930
989
|
const hasPackageInStorage = await this.hasPackage(name);
|
|
931
990
|
if (!hasPackageInStorage) {
|
|
932
|
-
await this.createNewLocalCachePackage(name);
|
|
991
|
+
await this.createNewLocalCachePackage(name, username);
|
|
933
992
|
successResponseMessage = _core.API_MESSAGE.PKG_CREATED;
|
|
934
993
|
} else {
|
|
994
|
+
await this.checkAllowedToChangePackage(localManifest, username);
|
|
935
995
|
successResponseMessage = _core.API_MESSAGE.PKG_CHANGED;
|
|
936
996
|
}
|
|
937
997
|
} catch (err) {
|
|
938
998
|
debug('error on change or update a package with %o', err.message);
|
|
939
999
|
_logger.logger.error({
|
|
940
1000
|
err: err.message
|
|
941
|
-
}, 'error on
|
|
1001
|
+
}, 'error on publish new version: @{err}');
|
|
942
1002
|
throw err;
|
|
943
1003
|
}
|
|
944
1004
|
|
|
945
1005
|
// 1. after tarball has been successfully uploaded, we update the version
|
|
946
1006
|
try {
|
|
1007
|
+
const tarballStats = await this.getTarballStats(versions[versionToPublish], buffer);
|
|
947
1008
|
// Older package managers like npm6 do not send readme content as part of version but include it on root level
|
|
948
1009
|
if (_lodash.default.isEmpty(versions[versionToPublish].readme)) {
|
|
949
1010
|
versions[versionToPublish].readme = _lodash.default.isNil(manifest.readme) === false ? String(manifest.readme) : '';
|
|
950
1011
|
}
|
|
951
1012
|
// addVersion will move the readme from the the published version to the root level
|
|
952
|
-
await this.addVersion(name, versionToPublish, versions[versionToPublish], null);
|
|
1013
|
+
await this.addVersion(name, versionToPublish, versions[versionToPublish], null, tarballStats);
|
|
953
1014
|
} catch (err) {
|
|
954
1015
|
_logger.logger.error({
|
|
955
1016
|
err: err.message
|
|
956
1017
|
}, 'updated version has failed: @{err}');
|
|
957
1018
|
debug('error on create a version for %o with error %o', name, err.message);
|
|
958
|
-
// TODO: remove tarball if add version fails
|
|
959
1019
|
throw err;
|
|
960
1020
|
}
|
|
961
1021
|
|
|
@@ -974,8 +1034,7 @@ class Storage {
|
|
|
974
1034
|
}, 'merge version has failed: @{err}');
|
|
975
1035
|
debug('error on create a version for %o with error %o', name, err.message);
|
|
976
1036
|
// TODO: undo if this fails
|
|
977
|
-
// 1. remove
|
|
978
|
-
// 2. remove updated version
|
|
1037
|
+
// 1. remove updated version
|
|
979
1038
|
throw err;
|
|
980
1039
|
}
|
|
981
1040
|
|
|
@@ -989,6 +1048,9 @@ class Storage {
|
|
|
989
1048
|
_logger.logger.error({
|
|
990
1049
|
err: err.message
|
|
991
1050
|
}, 'upload tarball has failed: @{err}');
|
|
1051
|
+
// TODO: undo if this fails
|
|
1052
|
+
// 1. remove updated version
|
|
1053
|
+
// 2. remove new dist tags
|
|
992
1054
|
throw err;
|
|
993
1055
|
}
|
|
994
1056
|
_logger.logger.info({
|
|
@@ -1131,16 +1193,25 @@ class Storage {
|
|
|
1131
1193
|
* @param metadata version metadata
|
|
1132
1194
|
* @param tag tag of the version
|
|
1133
1195
|
*/
|
|
1134
|
-
async addVersion(name, version, metadata, tag) {
|
|
1196
|
+
async addVersion(name, version, metadata, tag, tarballStats) {
|
|
1135
1197
|
debug(`add version %s package for %s`, version, name);
|
|
1136
1198
|
await this.updatePackage(name, async data => {
|
|
1137
1199
|
// keep only one readme per package
|
|
1138
1200
|
data.readme = metadata.readme;
|
|
1139
|
-
debug('%s
|
|
1201
|
+
debug('%s readme mutated', name);
|
|
1140
1202
|
// TODO: lodash remove
|
|
1141
1203
|
metadata = (0, _2.cleanUpReadme)(metadata);
|
|
1142
1204
|
metadata.contributors = (0, _utils.normalizeContributors)(metadata.contributors);
|
|
1143
|
-
debug('%s
|
|
1205
|
+
debug('%s contributors normalized', name);
|
|
1206
|
+
|
|
1207
|
+
// Copy current owners to version
|
|
1208
|
+
metadata.maintainers = data.maintainers;
|
|
1209
|
+
|
|
1210
|
+
// Update tarball stats
|
|
1211
|
+
if (metadata.dist) {
|
|
1212
|
+
metadata.dist.fileCount = tarballStats.fileCount;
|
|
1213
|
+
metadata.dist.unpackedSize = tarballStats.unpackedSize;
|
|
1214
|
+
}
|
|
1144
1215
|
|
|
1145
1216
|
// if uploaded tarball has a different shasum, it's very likely that we
|
|
1146
1217
|
// have some kind of error
|
|
@@ -1187,7 +1258,7 @@ class Storage {
|
|
|
1187
1258
|
// TODO: review this method, it's a bit ugly
|
|
1188
1259
|
(0, _2.tagVersion)(data, version, tag);
|
|
1189
1260
|
try {
|
|
1190
|
-
debug('%s
|
|
1261
|
+
debug('%s add on database', name);
|
|
1191
1262
|
await this.localStorage.getStoragePlugin().add(name);
|
|
1192
1263
|
this.logger.debug({
|
|
1193
1264
|
name,
|
|
@@ -1205,7 +1276,7 @@ class Storage {
|
|
|
1205
1276
|
* @param name name of the package
|
|
1206
1277
|
* @returns
|
|
1207
1278
|
*/
|
|
1208
|
-
async createNewLocalCachePackage(name) {
|
|
1279
|
+
async createNewLocalCachePackage(name, username) {
|
|
1209
1280
|
const storage = this.getPrivatePackageStorage(name);
|
|
1210
1281
|
if (!storage) {
|
|
1211
1282
|
debug(`storage is missing for %o package cannot be added`, name);
|
|
@@ -1219,6 +1290,16 @@ class Storage {
|
|
|
1219
1290
|
modified: currentTime
|
|
1220
1291
|
}
|
|
1221
1292
|
};
|
|
1293
|
+
|
|
1294
|
+
// Set initial package owner
|
|
1295
|
+
// TODO: Add email of user
|
|
1296
|
+
packageData.maintainers = username && username.length > 0 ? [{
|
|
1297
|
+
name: username,
|
|
1298
|
+
email: ''
|
|
1299
|
+
}] : [{
|
|
1300
|
+
name: _core.DEFAULT_USER,
|
|
1301
|
+
email: ''
|
|
1302
|
+
}];
|
|
1222
1303
|
try {
|
|
1223
1304
|
await storage.createPackage(name, packageData);
|
|
1224
1305
|
this.logger.info({
|
|
@@ -1690,6 +1771,31 @@ class Storage {
|
|
|
1690
1771
|
return cacheManifest;
|
|
1691
1772
|
}
|
|
1692
1773
|
}
|
|
1774
|
+
async getTarballStats(version, buffer) {
|
|
1775
|
+
var _version$dist, _version$dist2;
|
|
1776
|
+
if (version.dist == undefined || ((_version$dist = version.dist) === null || _version$dist === void 0 ? void 0 : _version$dist.fileCount) == undefined || ((_version$dist2 = version.dist) === null || _version$dist2 === void 0 ? void 0 : _version$dist2.unpackedSize) == undefined) {
|
|
1777
|
+
debug('tarball stats not found, calculating');
|
|
1778
|
+
return await (0, _tarball.getTarballDetails)(buffer);
|
|
1779
|
+
} else {
|
|
1780
|
+
debug('tarball stats found');
|
|
1781
|
+
return {
|
|
1782
|
+
fileCount: version.dist.fileCount,
|
|
1783
|
+
unpackedSize: version.dist.unpackedSize
|
|
1784
|
+
};
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
async checkAllowedToChangePackage(manifest, username) {
|
|
1788
|
+
var _this$config3, _this$config3$publish;
|
|
1789
|
+
// Checks to perform if config "publish:check_owners" is true
|
|
1790
|
+
debug('check if user %o is an owner and allowed to change package', username);
|
|
1791
|
+
// if name of owner is not included in list of maintainers, then throw an error
|
|
1792
|
+
if (((_this$config3 = this.config) === null || _this$config3 === void 0 ? void 0 : (_this$config3$publish = _this$config3.publish) === null || _this$config3$publish === void 0 ? void 0 : _this$config3$publish.check_owners) === true && manifest.maintainers && manifest.maintainers.length > 0 && !manifest.maintainers.some(maintainer => maintainer.name === username)) {
|
|
1793
|
+
_logger.logger.error({
|
|
1794
|
+
username
|
|
1795
|
+
}, '@{username} is not a maintainer (package owner)');
|
|
1796
|
+
throw Error('only owners are allowed to change package');
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1693
1799
|
}
|
|
1694
1800
|
exports.Storage = Storage;
|
|
1695
1801
|
//# sourceMappingURL=storage.js.map
|