@verdaccio/store 7.0.0-next-7.16 → 7.0.0-next-7.18
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 +36 -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 +6 -4
- package/build/storage.js +104 -18
- 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 +125 -22
- 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.spec.ts +310 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
# @verdaccio/store
|
|
2
2
|
|
|
3
|
+
## 7.0.0-next-7.18
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [10dd81f]
|
|
8
|
+
- @verdaccio/config@7.0.0-next-7.18
|
|
9
|
+
- @verdaccio/core@7.0.0-next-7.18
|
|
10
|
+
- @verdaccio/tarball@12.0.0-next-7.18
|
|
11
|
+
- @verdaccio/url@12.0.0-next-7.18
|
|
12
|
+
- @verdaccio/hooks@7.0.0-next-7.18
|
|
13
|
+
- @verdaccio/loaders@7.0.0-next-7.18
|
|
14
|
+
- @verdaccio/logger@7.0.0-next-7.18
|
|
15
|
+
- @verdaccio/local-storage@12.0.0-next-7.18
|
|
16
|
+
- @verdaccio/proxy@7.0.0-next-7.18
|
|
17
|
+
- @verdaccio/search@7.0.0-next-7.7
|
|
18
|
+
- @verdaccio/utils@7.0.0-next-7.18
|
|
19
|
+
|
|
20
|
+
## 7.0.0-next-7.17
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- 6e764e3: feat: add support for npm owner
|
|
25
|
+
- de6ff5c: fix: update fields for abbreviated manifest
|
|
26
|
+
- Updated dependencies [6e764e3]
|
|
27
|
+
- @verdaccio/config@7.0.0-next-7.17
|
|
28
|
+
- @verdaccio/core@7.0.0-next-7.17
|
|
29
|
+
- @verdaccio/tarball@12.0.0-next-7.17
|
|
30
|
+
- @verdaccio/url@12.0.0-next-7.17
|
|
31
|
+
- @verdaccio/hooks@7.0.0-next-7.17
|
|
32
|
+
- @verdaccio/loaders@7.0.0-next-7.17
|
|
33
|
+
- @verdaccio/logger@7.0.0-next-7.17
|
|
34
|
+
- @verdaccio/local-storage@12.0.0-next-7.17
|
|
35
|
+
- @verdaccio/proxy@7.0.0-next-7.17
|
|
36
|
+
- @verdaccio/search@7.0.0-next-7.6
|
|
37
|
+
- @verdaccio/utils@7.0.0-next-7.17
|
|
38
|
+
|
|
3
39
|
## 7.0.0-next-7.16
|
|
4
40
|
|
|
5
41
|
### 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":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,KAAA,GAAAF,OAAA;AAGA,IAAAG,MAAA,GAAAH,OAAA;AAEA,IAAAI,cAAA,GAAAJ,OAAA;AAAgE,SAAAD,uBAAAM,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEzD,MAAMG,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG;EACrBE,iBAAiB,EAAE,cAAc;EACjCC,gBAAgB,EAAE,SAAS;EAC3BC,kBAAkB,EAAE,QAAQ;EAC5BC,gBAAgB,EAAE;AACpB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,SAASC,uBAAuBA,CAACC,IAAY,EAAY;EAC9D,OAAO;IACL;IACAA,IAAI;IACJC,QAAQ,EAAE,CAAC,CAAC;IACZC,IAAI,EAAE,CAAC,CAAC;IACR,CAACC,WAAK,GAAG,CAAC,CAAC;IACX,CAACC,eAAS,GAAG,CAAC,CAAC;IACfC,QAAQ,EAAE,CAAC,CAAC;IACZC,UAAU,EAAE,CAAC,CAAC;IACdC,YAAY,EAAE,CAAC,CAAC;IAChBC,IAAI,EAAE;EACR,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACO,SAASC,gBAAgBA,CAACC,GAAa,EAAY;EACxD,MAAMC,aAAa,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC;EAEjGA,aAAa,CAACC,OAAO,CAAEC,GAAG,IAAW;IACnC,MAAMC,OAAO,GAAGJ,GAAG,CAACG,GAAG,CAAC;IAExB,IAAI,IAAAE,YAAK,EAACD,OAAO,CAAC,IAAIE,oBAAc,CAACC,QAAQ,CAACH,OAAO,CAAC,KAAK,KAAK,EAAE;MAChEJ,GAAG,CAACG,GAAG,CAAC,GAAG,CAAC,CAAC;IACf;EACF,CAAC,CAAC;EAEF,IAAI,QAAOH,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEF,IAAI,MAAK,QAAQ,EAAE;IACjCE,GAAG,CAACF,IAAI,GAAGf,OAAO,CAACK,gBAAgB;EACrC;EAEA,IAAI,QAAOY,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEQ,GAAG,MAAK,QAAQ,EAAE;IAChCR,GAAG,CAACQ,GAAG,GAAGR,GAAG,CAACV,IAAI;EACpB;;EAEA;EACA,OAAOmB,iBAAiB,CAACT,GAAG,CAAC;AAC/B;AAEO,SAASU,gBAAgBA,CAACC,GAAW,EAAU;EACpD,MAAMb,IAAI,GAAGa,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC;EAE3B,OAAO,CAAC,CAACd,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAAe,8BAAuB,EAAC,CAAC;AAC9D;AAEO,SAASC,eAAeA,CAACd,GAAa,EAAU;EACrD,MAAMT,QAAQ,GAAGS,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;EACtC,MAAMe,QAAQ,GAAGf,GAAG,CAACN,eAAS,CAAC,IAAI,CAAC,CAAC;EACrC;EACA,MAAMsB,aAA4B,GAAGD,QAAQ,CAAC,QAAQ,CAAC,GAAGxB,QAAQ,CAACwB,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;EACjG,IAAIE,MAAM,GAAGC,eAAC,CAACC,IAAI,CAACnB,GAAG,CAACiB,MAAM,IAAID,aAAa,CAACC,MAAM,IAAI,EAAE,CAAC;EAC7D,IAAIA,MAAM,EAAE;IACV,OAAOA,MAAM;EACf;;EAEA;EACA;EACA,MAAMG,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;EACjFA,sBAAsB,CAAClB,OAAO,CAAC,UAAUmB,GAAG,EAAiB;IAC3D,IAAIJ,MAAM,EAAE;MACV,OAAOA,MAAM;IACf;IACA,MAAMK,OAAsB,GAAGP,QAAQ,CAACM,GAAG,CAAC,GAAG9B,QAAQ,CAACwB,QAAQ,CAACM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjFJ,MAAM,GAAGC,eAAC,CAACC,IAAI,CAACG,OAAO,CAACL,MAAM,IAAIA,MAAM,CAAC;EAC3C,CAAC,CAAC;EACF,OAAOA,MAAM;AACf;;AAEA;AACO,SAASM,aAAaA,CAACD,OAAY,EAAW;EACnD,IAAI,IAAAjB,YAAK,EAACiB,OAAO,CAAC,KAAK,KAAK,EAAE;IAC5B,OAAOA,OAAO,CAACL,MAAM;EACvB;EAEA,OAAOK,OAAO;AAChB;AAEO,MAAME,SAAS,GAAAxC,OAAA,CAAAwC,SAAA,GAAG,CACvB,MAAM,EACN,MAAM,EACN,UAAU,EACV,WAAW,EACX,QAAQ,EACR,MAAM,EACN,KAAK,EACL,OAAO,CACR;AAEM,SAASC,eAAeA,CAACC,MAAgB,EAAEC,cAAwB,EAAY;EACpF,MAAMC,cAAc,GAAG,CAAC,GAAGJ,SAAS,CAAC;EACrC,IAAIG,cAAc,KAAK,IAAI,EAAE;IAC3BC,cAAc,CAACC,IAAI,CAAC,UAAU,CAAC;EACjC;EAEA,KAAK,MAAMC,CAAC,IAAIJ,MAAM,EAAE;IACtB,IAAIE,cAAc,CAACG,OAAO,CAACD,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;MACpC;MACA,OAAOJ,MAAM,CAACI,CAAC,CAAC;IAClB;EACF;EAEA,OAAOJ,MAAM;AACf;;AAEA;AACA;AACO,SAASM,kBAAkBA,CAChC1C,IAAY,EACZ2C,qBAA8B,EAC9BC,YAAsB,EACR;EACd,OAAO,IAAIC,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAW;IAClDH,YAAY,CAAC5C,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAACgD,GAAG,EAAEC,gBAAgB,EAAEC,aAAa,KAAW;MAC3E;MACA,IAAIF,GAAG,IAAIA,GAAG,CAACG,MAAM,KAAKC,iBAAW,CAACC,SAAS,EAAE;QAC/C,OAAON,MAAM,CAACC,GAAG,CAAC;MACpB;;MAEA;MACA,IAAI,IAAAjC,YAAK,EAACkC,gBAAgB,CAAC,KAAK,KAAK,EAAE;QACrC,OAAOF,MAAM,CAACO,gBAAU,CAACC,WAAW,CAACC,eAAS,CAACC,aAAa,CAAC,CAAC;MAChE;MAEA,KAAK,IAAIC,SAAS,GAAG,CAAC,EAAEA,SAAS,GAAGR,aAAa,CAACS,MAAM,EAAED,SAAS,EAAE,EAAE;QACrE;QACA;QACA,IAAI,IAAA3C,YAAK,EAACmC,aAAa,CAACQ,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;UAChD,IAAIR,aAAa,CAACQ,SAAS,CAAC,CAAC,CAAC,CAAC,CAACP,MAAM,KAAKC,iBAAW,CAACC,SAAS,EAAE;YAChE,IAAIV,qBAAqB,EAAE;cACzB,OAAOG,OAAO,CAAC,CAAC;YAClB;YAEA,OAAOC,MAAM,CAACO,gBAAU,CAACM,qBAAqB,CAACJ,eAAS,CAACK,sBAAsB,CAAC,CAAC;UACnF;QACF;MACF;MAEA,OAAOf,OAAO,CAAC,CAAC;IAClB,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ;;AAEA;AACO,SAASgB,wBAAwBA,CAACC,aAAuB,EAAEC,cAAwB,EAAO;EAC/F,IAAI,MAAM,IAAIA,cAAc,EAAE;IAC5B,OAAOC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEH,aAAa,CAAC7D,IAAI,EAAE8D,cAAc,CAAC9D,IAAI,CAAC;EACnE;EAEA,OAAO6D,aAAa,CAAC7D,IAAI;AAC3B;AAEO,SAASiE,4BAA4BA,CAC1CC,aAAuB,EACvBC,cAAwB,EACd;EACV,IAAI,MAAM,IAAIA,cAAc,EAAE;IAC5B;IACA,OAAO;MAAE,GAAGD,aAAa;MAAElE,IAAI,EAAE;QAAE,GAAGkE,aAAa,CAAClE,IAAI;QAAE,GAAGmE,cAAc,CAACnE;MAAK;IAAE,CAAC;EACtF;EAEA,OAAOkE,aAAa;AACtB;AAEO,SAASE,oBAAoBA,CAACC,QAAQ,EAAEC,QAAkB,EAAEC,IAAY,EAAE;EAC/E,MAAMpE,QAAQ,GAAG;IACf,GAAGmE,QAAQ,CAACnE,QAAQ;IACpB,CAACkE,QAAQ,GAAG;MACVE,IAAI;MACJC,OAAO,EAAEC,IAAI,CAACC,GAAG,CAAC;IACpB;EACF,CAAC;EACD,OAAO;IACL,GAAGJ,QAAQ;IACXnE;EACF,CAAC;AACH;AAEO,SAASwE,oBAAoBA,CAACC,IAAc,EAAO;EACxD,MAAMC,MAAM,GAAGC,cAAQ,CAACC,SAAS,CAACH,IAAI,CAAC;EAEvC,IAAIC,MAAM,IAAID,IAAI,CAAC7E,QAAQ,CAAC8E,MAAM,CAAC,EAAE;IACnC,MAAM/C,OAAgB,GAAG8C,IAAI,CAAC7E,QAAQ,CAAC8E,MAAM,CAAC;IAC9C,MAAM9E,QAAa,GAAG;MAAE,CAAC8E,MAAM,GAAG;IAAS,CAAC;IAC5C,MAAMrE,GAAQ,GAAG;MACfV,IAAI,EAAEgC,OAAO,CAAChC,IAAI;MAClBkF,WAAW,EAAElD,OAAO,CAACkD,WAAW;MAChC,CAAC9E,eAAS,GAAG;QAAE2E;MAAO,CAAC;MACvBI,WAAW,EAAEnD,OAAO,CAACmD,WAAW,IAAI,CAACnD,OAAO,CAACoD,MAAM,CAAC,CAACC,MAAM,CAACC,OAAO,CAAC;MACpEF,MAAM,EAAEpD,OAAO,CAACoD,MAAM;MACtBG,UAAU,EAAEvD,OAAO,CAACuD,UAAU;MAC9BC,cAAc,EAAExD,OAAO,CAACwD,cAAc,IAAI,EAAE;MAC5CC,QAAQ,EAAEzD,OAAO,CAACyD,QAAQ;MAC1BC,QAAQ,EAAE1D,OAAO,CAAC0D,QAAQ;MAC1BC,IAAI,EAAE3D,OAAO,CAAC2D,IAAI;MAClBC,OAAO,EAAE5D,OAAO,CAAC4D,OAAO;MACxB;MACA;MACA;MACA3F;IACF,CAAC;IAED,OAAOS,GAAG;EACZ;AACF;AAEO,SAASmF,kBAAkBA,CAAC5F,QAAgC,EAAW;EAC5E,OAAOgE,MAAM,CAAC6B,IAAI,CAAC7F,QAAQ,CAAC,CAAC0D,MAAM,KAAK,CAAC;AAC3C;;AAEA;AACO,SAASoC,qBAAqBA,CAACvB,QAAqD,EAAE;EAC3F,IAAI,CAACA,QAAQ,EAAE;IACb,OAAO,KAAK;EACd;EAEA,MAAM;IAAEjE,YAAY;IAAEN;EAAS,CAAC,GAAGuE,QAAQ;EAC3C,MAAMwB,GAAG,GACP,IAAA/E,eAAQ,EAACV,YAAY,CAAC,KAAK,KAAK,IAChCsF,kBAAkB,CAACtF,YAAY,CAAC,IAChC,IAAAU,eAAQ,EAAChB,QAAQ,CAAC,KAAK,KAAK,IAC5B4F,kBAAkB,CAAC5F,QAAQ,CAAC;EAC9B,OAAO+F,GAAG;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,aAAaA,CAAC7B,aAAuB,EAAEC,cAAwB,EAAY;EACzF,IAAI6B,cAAc,GAAG;IAAE,GAAG9B;EAAc,CAAC;EACzC,MAAM;IAAEnE,QAAQ;IAAEC;EAAK,CAAC,GAAGmE,cAAc;EACzC;EACA;EACA,KAAK,MAAM7B,CAAC,IAAIvC,QAAQ,EAAE;IACxB,IAAI,OAAOmE,aAAa,CAACnE,QAAQ,CAACuC,CAAC,CAAC,KAAK,WAAW,EAAE;MACpD0D,cAAc,CAACjG,QAAQ,CAACuC,CAAC,CAAC,GAAGvC,QAAQ,CAACuC,CAAC,CAAC;IAC1C;EACF;EAEA,KAAK,MAAMA,CAAC,IAAItC,IAAI,EAAE;IACpB,IAAI,OAAOkE,aAAa,CAAClE,IAAI,CAACsC,CAAC,CAAC,KAAK,WAAW,EAAE;MAChD0D,cAAc,CAAChG,IAAI,CAACsC,CAAC,CAAC,GAAGtC,IAAI,CAACsC,CAAC,CAAC;IAClC;EACF;EAEA,KAAK,MAAM2D,OAAO,IAAI9B,cAAc,CAACjE,eAAS,CAAC,EAAE;IAC/C,IAAI8F,cAAc,CAAC9F,eAAS,CAAC,CAAC+F,OAAO,CAAC,KAAK9B,cAAc,CAACjE,eAAS,CAAC,CAAC+F,OAAO,CAAC,EAAE;MAC7E,IACE,CAACD,cAAc,CAAC9F,eAAS,CAAC,CAAC+F,OAAO,CAAC,IACnCC,eAAM,CAACC,GAAG,CAACH,cAAc,CAAC9F,eAAS,CAAC,CAAC+F,OAAO,CAAC,EAAE9B,cAAc,CAACjE,eAAS,CAAC,CAAC+F,OAAO,CAAC,CAAC,EAClF;QACAD,cAAc,CAAC9F,eAAS,CAAC,CAAC+F,OAAO,CAAC,GAAG9B,cAAc,CAACjE,eAAS,CAAC,CAAC+F,OAAO,CAAC;MACzE;MACA,IACEA,OAAO,KAAK,QAAQ,IACpBD,cAAc,CAAC9F,eAAS,CAAC,CAAC+F,OAAO,CAAC,KAAK9B,cAAc,CAACjE,eAAS,CAAC,CAAC+F,OAAO,CAAC,EACzE;QACA;QACA;QACA/B,aAAa,GAAG;UAAE,GAAG8B,cAAc;UAAEvE,MAAM,EAAE0C,cAAc,CAAC1C;QAAO,CAAC;MACtE;IACF;EACF;EAEA,OAAOyC,aAAa;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASjD,iBAAiBA,CAACqD,QAAkB,EAAY;EAC9D,IAAI8B,MAAM;EACV;EACA,IAAI,CAAC9B,QAAQ,CAACpE,eAAS,CAAC,CAAC2E,MAAM,EAAE;IAAA,IAAAwB,OAAA;IAC/B;IACAD,MAAM,GAAG,IAAAE,2CAA4B,EAACvC,MAAM,CAAC6B,IAAI,CAACtB,QAAQ,CAACvE,QAAQ,CAAC,CAAC;IACrE,KAAAsG,OAAA,GAAID,MAAM,cAAAC,OAAA,eAANA,OAAA,CAAQ5C,MAAM,EAAE;MAClB;MACAa,QAAQ,CAACpE,eAAS,CAAC,CAAC2E,MAAM,GAAGuB,MAAM,CAACG,GAAG,CAAC,CAAC;IAC3C;EACF;EAEA,KAAK,MAAM1E,GAAG,IAAIyC,QAAQ,CAACpE,eAAS,CAAC,EAAE;IACrC;IACA;IACA,IAAIwB,eAAC,CAAC8E,OAAO,CAAClC,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC,CAAC,EAAE;MACvC,IAAIyC,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC,CAAC4B,MAAM,EAAE;QACnC;QACA;QACA;QACA2C,MAAM,GAAG,IAAAE,2CAA4B,EAAChC,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC,CAAC;QAC/D,IAAIuE,MAAM,CAAC3C,MAAM,EAAE;UACjB;UACAa,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC,GAAGuE,MAAM,CAACG,GAAG,CAAC,CAAC;QACzC;MACF,CAAC,MAAM;QACL,OAAOjC,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC;MACjC;IACF,CAAC,MAAM,IAAIH,eAAC,CAAC+E,QAAQ,CAACnC,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC,CAAC,EAAE;MAC/C,IAAI,CAACqE,eAAM,CAACQ,KAAK,CAACpC,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE;QACjD;QACA,OAAOyC,QAAQ,CAACpE,eAAS,CAAC,CAAC2B,GAAG,CAAC;MACjC;IACF;EACF;EAEA,OAAOyC,QAAQ;AACjB;AAEO,SAASqC,qBAAqBA,CAACC,OAAiB,EAAW;EAChE,MAAM;IAAE7G;EAAS,CAAC,GAAG6G,OAAO;EAC5B,KAAK,MAAM9E,OAAO,IAAI/B,QAAQ,EAAE;IAC9B,IAAIgE,MAAM,CAAC8C,SAAS,CAACC,cAAc,CAACC,IAAI,CAAChH,QAAQ,CAAC+B,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE;MACzE,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AAEO,SAASkF,oBAAoBA,CAAC1C,QAAkB,EAAW;EAChE,OAAOqC,qBAAqB,CAACrC,QAAQ,CAAC,IAAIP,MAAM,CAAC6B,IAAI,CAACtB,QAAQ,CAACjE,YAAY,CAAC,CAACoD,MAAM,KAAK,CAAC;AAC3F;AAEO,SAASwD,8BAA8BA,CAC5CzG,GAAa,EACb0G,UAAkC,EACH;EAC/B,MAAMrC,MAAM,GAAGC,cAAQ,CAACC,SAAS,CAACvE,GAAG,CAAC;EACtC,MAAMsB,OAAgB,GAAGtB,GAAG,CAACT,QAAQ,CAAC8E,MAAM,CAAC;EAC7C,MAAM3C,MAAqC,GAAG;IAC5CpC,IAAI,EAAEgC,OAAO,CAAChC,IAAI;IAClBqH,KAAK,EAAE,EAAE;IACTnC,WAAW,EAAElD,OAAO,CAACkD,WAAW;IAChClD,OAAO,EAAE+C,MAAM;IACfW,QAAQ,EAAE1D,OAAO,CAAC0D,QAAQ;IAC1B4B,IAAI,EAAE5G,GAAG,CAACR,IAAI,CAAC6E,MAAM,CAAC;IACtB;IACAK,MAAM,EAAEpD,OAAO,CAACoD,MAAa;IAC7B;IACAmC,SAAS,EAAE,CAAC,CAAC;IACb;IACApC,WAAW,EAAEnD,OAAO,CAACmD,WAAkB;IACvCqC,KAAK,EAAE;MACLC,GAAG,EAAE,EAAE;MACPhC,QAAQ,EAAEzD,OAAO,CAACyD,QAAQ;MAC1BF,UAAU,EAAEvD,OAAO,CAACuD,UAAU;MAC9BI,IAAI,EAAE3D,OAAO,CAAC2D;IAChB;EACF,CAAC;EAED,IAAI,OAAOyB,UAAU,CAACM,OAAO,CAACC,MAAM,KAAK,QAAQ,EAAE;IACjDvF,MAAM,CAACiF,KAAK,GAAGD,UAAU,CAACM,OAAO,CAACC,MAAM;EAC1C;EAEA,OAAOvF,MAAM;AACf"}
|
|
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.
|
|
@@ -273,5 +274,6 @@ declare class Storage {
|
|
|
273
274
|
*/
|
|
274
275
|
updateVersionsNext(name: string, remoteManifest: Manifest): Promise<Manifest>;
|
|
275
276
|
private getTarballStats;
|
|
277
|
+
private checkAllowedToChangePackage;
|
|
276
278
|
}
|
|
277
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,16 +988,17 @@ 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
|
|
|
@@ -956,7 +1016,6 @@ class Storage {
|
|
|
956
1016
|
err: err.message
|
|
957
1017
|
}, 'updated version has failed: @{err}');
|
|
958
1018
|
debug('error on create a version for %o with error %o', name, err.message);
|
|
959
|
-
// TODO: remove tarball if add version fails
|
|
960
1019
|
throw err;
|
|
961
1020
|
}
|
|
962
1021
|
|
|
@@ -975,8 +1034,7 @@ class Storage {
|
|
|
975
1034
|
}, 'merge version has failed: @{err}');
|
|
976
1035
|
debug('error on create a version for %o with error %o', name, err.message);
|
|
977
1036
|
// TODO: undo if this fails
|
|
978
|
-
// 1. remove
|
|
979
|
-
// 2. remove updated version
|
|
1037
|
+
// 1. remove updated version
|
|
980
1038
|
throw err;
|
|
981
1039
|
}
|
|
982
1040
|
|
|
@@ -990,6 +1048,9 @@ class Storage {
|
|
|
990
1048
|
_logger.logger.error({
|
|
991
1049
|
err: err.message
|
|
992
1050
|
}, 'upload tarball has failed: @{err}');
|
|
1051
|
+
// TODO: undo if this fails
|
|
1052
|
+
// 1. remove updated version
|
|
1053
|
+
// 2. remove new dist tags
|
|
993
1054
|
throw err;
|
|
994
1055
|
}
|
|
995
1056
|
_logger.logger.info({
|
|
@@ -1137,11 +1198,14 @@ class Storage {
|
|
|
1137
1198
|
await this.updatePackage(name, async data => {
|
|
1138
1199
|
// keep only one readme per package
|
|
1139
1200
|
data.readme = metadata.readme;
|
|
1140
|
-
debug('%s
|
|
1201
|
+
debug('%s readme mutated', name);
|
|
1141
1202
|
// TODO: lodash remove
|
|
1142
1203
|
metadata = (0, _2.cleanUpReadme)(metadata);
|
|
1143
1204
|
metadata.contributors = (0, _utils.normalizeContributors)(metadata.contributors);
|
|
1144
|
-
debug('%s
|
|
1205
|
+
debug('%s contributors normalized', name);
|
|
1206
|
+
|
|
1207
|
+
// Copy current owners to version
|
|
1208
|
+
metadata.maintainers = data.maintainers;
|
|
1145
1209
|
|
|
1146
1210
|
// Update tarball stats
|
|
1147
1211
|
if (metadata.dist) {
|
|
@@ -1194,7 +1258,7 @@ class Storage {
|
|
|
1194
1258
|
// TODO: review this method, it's a bit ugly
|
|
1195
1259
|
(0, _2.tagVersion)(data, version, tag);
|
|
1196
1260
|
try {
|
|
1197
|
-
debug('%s
|
|
1261
|
+
debug('%s add on database', name);
|
|
1198
1262
|
await this.localStorage.getStoragePlugin().add(name);
|
|
1199
1263
|
this.logger.debug({
|
|
1200
1264
|
name,
|
|
@@ -1212,7 +1276,7 @@ class Storage {
|
|
|
1212
1276
|
* @param name name of the package
|
|
1213
1277
|
* @returns
|
|
1214
1278
|
*/
|
|
1215
|
-
async createNewLocalCachePackage(name) {
|
|
1279
|
+
async createNewLocalCachePackage(name, username) {
|
|
1216
1280
|
const storage = this.getPrivatePackageStorage(name);
|
|
1217
1281
|
if (!storage) {
|
|
1218
1282
|
debug(`storage is missing for %o package cannot be added`, name);
|
|
@@ -1226,6 +1290,16 @@ class Storage {
|
|
|
1226
1290
|
modified: currentTime
|
|
1227
1291
|
}
|
|
1228
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
|
+
}];
|
|
1229
1303
|
try {
|
|
1230
1304
|
await storage.createPackage(name, packageData);
|
|
1231
1305
|
this.logger.info({
|
|
@@ -1710,6 +1784,18 @@ class Storage {
|
|
|
1710
1784
|
};
|
|
1711
1785
|
}
|
|
1712
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
|
+
}
|
|
1713
1799
|
}
|
|
1714
1800
|
exports.Storage = Storage;
|
|
1715
1801
|
//# sourceMappingURL=storage.js.map
|