@verdaccio/core 8.2.1 → 8.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/auth-utils.js +5 -0
- package/build/auth-utils.js.map +1 -1
- package/build/auth-utils.mjs +1 -1
- package/build/auth-utils.mjs.map +1 -1
- package/build/author-utils.d.ts +20 -0
- package/build/author-utils.js +98 -0
- package/build/author-utils.js.map +1 -0
- package/build/author-utils.mjs +87 -0
- package/build/author-utils.mjs.map +1 -0
- package/build/constants.js +6 -0
- package/build/constants.mjs +1 -1
- package/build/crypto-utils.js +5 -0
- package/build/crypto-utils.js.map +1 -1
- package/build/crypto-utils.mjs +1 -1
- package/build/crypto-utils.mjs.map +1 -1
- package/build/error-utils.js +9 -0
- package/build/error-utils.js.map +1 -1
- package/build/error-utils.mjs +1 -1
- package/build/file-utils.js +3 -0
- package/build/file-utils.js.map +1 -1
- package/build/file-utils.mjs +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.js +7 -0
- package/build/index.mjs +2 -1
- package/build/ip-utils.js +4 -0
- package/build/ip-utils.js.map +1 -1
- package/build/ip-utils.mjs +1 -1
- package/build/ip-utils.mjs.map +1 -1
- package/build/pkg-utils.d.ts +5 -0
- package/build/pkg-utils.js +14 -0
- package/build/pkg-utils.js.map +1 -1
- package/build/pkg-utils.mjs +9 -1
- package/build/pkg-utils.mjs.map +1 -1
- package/build/plugin-utils.js +1 -0
- package/build/plugin-utils.mjs +1 -1
- package/build/schemes/publish-manifest.js.map +1 -1
- package/build/schemes/publish-manifest.mjs.map +1 -1
- package/build/schemes/unpublish-manifest.js.map +1 -1
- package/build/schemes/unpublish-manifest.mjs.map +1 -1
- package/build/search-utils.js +1 -0
- package/build/search-utils.mjs +1 -1
- package/build/stream-utils.js +2 -0
- package/build/stream-utils.js.map +1 -1
- package/build/stream-utils.mjs +1 -1
- package/build/stream-utils.mjs.map +1 -1
- package/build/string-utils.js +1 -0
- package/build/string-utils.js.map +1 -1
- package/build/string-utils.mjs +1 -1
- package/build/string-utils.mjs.map +1 -1
- package/build/tarball-utils.js +3 -0
- package/build/tarball-utils.js.map +1 -1
- package/build/tarball-utils.mjs +1 -1
- package/build/tarball-utils.mjs.map +1 -1
- package/build/validation-utils.js +12 -2
- package/build/validation-utils.js.map +1 -1
- package/build/validation-utils.mjs +4 -3
- package/build/validation-utils.mjs.map +1 -1
- package/build/warning-utils.js +2 -0
- package/build/warning-utils.js.map +1 -1
- package/build/warning-utils.mjs +1 -1
- package/package.json +7 -6
package/build/auth-utils.js
CHANGED
|
@@ -33,5 +33,10 @@ Object.defineProperty(exports, "auth_utils_exports", {
|
|
|
33
33
|
return auth_utils_exports;
|
|
34
34
|
}
|
|
35
35
|
});
|
|
36
|
+
exports.buildToken = buildToken;
|
|
37
|
+
exports.buildUserBuffer = buildUserBuffer;
|
|
38
|
+
exports.createSessionToken = createSessionToken;
|
|
39
|
+
exports.getAuthenticatedMessage = getAuthenticatedMessage;
|
|
40
|
+
exports.getMatchedPackagesSpec = getMatchedPackagesSpec;
|
|
36
41
|
|
|
37
42
|
//# sourceMappingURL=auth-utils.js.map
|
package/build/auth-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-utils.js","names":[],"sources":["../src/auth-utils.ts"],"sourcesContent":["import type { MMRegExp } from 'minimatch';\nimport { minimatch } from 'minimatch';\n\nimport type { PackageAccess, PackageList } from '@verdaccio/types';\n\nexport interface CookieSessionToken {\n expires: Date;\n}\n\nexport function createSessionToken(): CookieSessionToken {\n const tenHoursTime = 10 * 60 * 60 * 1000;\n\n return {\n // npmjs.org sets 10h expire\n expires: new Date(Date.now() + tenHoursTime),\n };\n}\n\nexport function getAuthenticatedMessage(user: string): string {\n return `you are authenticated as '${user}'`;\n}\n\nexport function buildUserBuffer(name: string, password: string): Buffer {\n return Buffer.from(`${name}:${password}`, 'utf8');\n}\n\nexport function buildToken(type: string, token: string): string {\n return `${capitalize(type)} ${token}`;\n}\n\nexport function getMatchedPackagesSpec(\n pkgName: string,\n packages: PackageList\n): PackageAccess | void {\n for (const i in packages) {\n // match case-insensitively, npm package names are case-insensitive\n if ((minimatch.makeRe(i, { nocase: true }) as MMRegExp).exec(pkgName)) {\n return packages[i];\n }\n }\n return;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,qBAAyC;CAGvD,OAAO,EAEL,SAAS,IAAI,KAAK,KAAK,IAAI,IAJR,MAAU,KAAK,GAIS,EAC7C;AACF;AAEA,SAAgB,wBAAwB,MAAsB;CAC5D,OAAO,6BAA6B,KAAK;AAC3C;AAEA,SAAgB,gBAAgB,MAAc,UAA0B;CACtE,OAAO,OAAO,KAAK,GAAG,KAAK,GAAG,YAAY,MAAM;AAClD;AAEA,SAAgB,WAAW,MAAc,OAAuB;CAC9D,OAAO,GAAG,WAAW,IAAI,EAAE,GAAG;AAChC;AAEA,SAAgB,uBACd,SACA,UACsB;CACtB,KAAK,MAAM,KAAK,UAEd,IAAK,UAAA,UAAU,OAAO,GAAG,EAAE,QAAQ,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"auth-utils.js","names":[],"sources":["../src/auth-utils.ts"],"sourcesContent":["import type { MMRegExp } from 'minimatch';\nimport { minimatch } from 'minimatch';\n\nimport type { PackageAccess, PackageList } from '@verdaccio/types';\n\nexport interface CookieSessionToken {\n expires: Date;\n}\n\nexport function createSessionToken(): CookieSessionToken {\n const tenHoursTime = 10 * 60 * 60 * 1000;\n\n return {\n // npmjs.org sets 10h expire\n expires: new Date(Date.now() + tenHoursTime),\n };\n}\n\nexport function getAuthenticatedMessage(user: string): string {\n return `you are authenticated as '${user}'`;\n}\n\nexport function buildUserBuffer(name: string, password: string): Buffer {\n return Buffer.from(`${name}:${password}`, 'utf8');\n}\n\nexport function buildToken(type: string, token: string): string {\n return `${capitalize(type)} ${token}`;\n}\n\nexport function getMatchedPackagesSpec(\n pkgName: string,\n packages: PackageList\n): PackageAccess | void {\n for (const i in packages) {\n // match case-insensitively, npm package names are case-insensitive\n if ((minimatch.makeRe(i, { nocase: true }) as MMRegExp).exec(pkgName)) {\n return packages[i];\n }\n }\n return;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,qBAAyC;CAGvD,OAAO,EAEL,SAAS,IAAI,KAAK,KAAK,IAAI,IAJR,MAAU,KAAK,GAIS,EAC7C;AACF;AAEA,SAAgB,wBAAwB,MAAsB;CAC5D,OAAO,6BAA6B,KAAK;AAC3C;AAEA,SAAgB,gBAAgB,MAAc,UAA0B;CACtE,OAAO,OAAO,KAAK,GAAG,KAAK,GAAG,YAAY,MAAM;AAClD;AAEA,SAAgB,WAAW,MAAc,OAAuB;CAC9D,OAAO,GAAG,WAAW,IAAI,EAAE,GAAG;AAChC;AAEA,SAAgB,uBACd,SACA,UACsB;CACtB,KAAK,MAAM,KAAK,UAEd,IAAK,UAAA,UAAU,OAAO,GAAG,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAc,KAAK,OAAO,GAClE,OAAO,SAAS;AAItB;AAEA,SAAS,WAAW,KAAqB;CACvC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,YAAY;AAChE"}
|
package/build/auth-utils.mjs
CHANGED
|
@@ -27,6 +27,6 @@ function capitalize(str) {
|
|
|
27
27
|
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
|
|
28
28
|
}
|
|
29
29
|
//#endregion
|
|
30
|
-
export { auth_utils_exports };
|
|
30
|
+
export { auth_utils_exports, buildToken, buildUserBuffer, createSessionToken, getAuthenticatedMessage, getMatchedPackagesSpec };
|
|
31
31
|
|
|
32
32
|
//# sourceMappingURL=auth-utils.mjs.map
|
package/build/auth-utils.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-utils.mjs","names":[],"sources":["../src/auth-utils.ts"],"sourcesContent":["import type { MMRegExp } from 'minimatch';\nimport { minimatch } from 'minimatch';\n\nimport type { PackageAccess, PackageList } from '@verdaccio/types';\n\nexport interface CookieSessionToken {\n expires: Date;\n}\n\nexport function createSessionToken(): CookieSessionToken {\n const tenHoursTime = 10 * 60 * 60 * 1000;\n\n return {\n // npmjs.org sets 10h expire\n expires: new Date(Date.now() + tenHoursTime),\n };\n}\n\nexport function getAuthenticatedMessage(user: string): string {\n return `you are authenticated as '${user}'`;\n}\n\nexport function buildUserBuffer(name: string, password: string): Buffer {\n return Buffer.from(`${name}:${password}`, 'utf8');\n}\n\nexport function buildToken(type: string, token: string): string {\n return `${capitalize(type)} ${token}`;\n}\n\nexport function getMatchedPackagesSpec(\n pkgName: string,\n packages: PackageList\n): PackageAccess | void {\n for (const i in packages) {\n // match case-insensitively, npm package names are case-insensitive\n if ((minimatch.makeRe(i, { nocase: true }) as MMRegExp).exec(pkgName)) {\n return packages[i];\n }\n }\n return;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,qBAAyC;CAGvD,OAAO,EAEL,SAAS,IAAI,KAAK,KAAK,IAAI,IAJR,MAAU,KAAK,GAIS,EAC7C;AACF;AAEA,SAAgB,wBAAwB,MAAsB;CAC5D,OAAO,6BAA6B,KAAK;AAC3C;AAEA,SAAgB,gBAAgB,MAAc,UAA0B;CACtE,OAAO,OAAO,KAAK,GAAG,KAAK,GAAG,YAAY,MAAM;AAClD;AAEA,SAAgB,WAAW,MAAc,OAAuB;CAC9D,OAAO,GAAG,WAAW,IAAI,EAAE,GAAG;AAChC;AAEA,SAAgB,uBACd,SACA,UACsB;CACtB,KAAK,MAAM,KAAK,UAEd,IAAK,UAAU,OAAO,GAAG,EAAE,QAAQ,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"auth-utils.mjs","names":[],"sources":["../src/auth-utils.ts"],"sourcesContent":["import type { MMRegExp } from 'minimatch';\nimport { minimatch } from 'minimatch';\n\nimport type { PackageAccess, PackageList } from '@verdaccio/types';\n\nexport interface CookieSessionToken {\n expires: Date;\n}\n\nexport function createSessionToken(): CookieSessionToken {\n const tenHoursTime = 10 * 60 * 60 * 1000;\n\n return {\n // npmjs.org sets 10h expire\n expires: new Date(Date.now() + tenHoursTime),\n };\n}\n\nexport function getAuthenticatedMessage(user: string): string {\n return `you are authenticated as '${user}'`;\n}\n\nexport function buildUserBuffer(name: string, password: string): Buffer {\n return Buffer.from(`${name}:${password}`, 'utf8');\n}\n\nexport function buildToken(type: string, token: string): string {\n return `${capitalize(type)} ${token}`;\n}\n\nexport function getMatchedPackagesSpec(\n pkgName: string,\n packages: PackageList\n): PackageAccess | void {\n for (const i in packages) {\n // match case-insensitively, npm package names are case-insensitive\n if ((minimatch.makeRe(i, { nocase: true }) as MMRegExp).exec(pkgName)) {\n return packages[i];\n }\n }\n return;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,qBAAyC;CAGvD,OAAO,EAEL,SAAS,IAAI,KAAK,KAAK,IAAI,IAJR,MAAU,KAAK,GAIS,EAC7C;AACF;AAEA,SAAgB,wBAAwB,MAAsB;CAC5D,OAAO,6BAA6B,KAAK;AAC3C;AAEA,SAAgB,gBAAgB,MAAc,UAA0B;CACtE,OAAO,OAAO,KAAK,GAAG,KAAK,GAAG,YAAY,MAAM;AAClD;AAEA,SAAgB,WAAW,MAAc,OAAuB;CAC9D,OAAO,GAAG,WAAW,IAAI,EAAE,GAAG;AAChC;AAEA,SAAgB,uBACd,SACA,UACsB;CACtB,KAAK,MAAM,KAAK,UAEd,IAAK,UAAU,OAAO,GAAG,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAc,KAAK,OAAO,GAClE,OAAO,SAAS;AAItB;AAEA,SAAS,WAAW,KAAqB;CACvC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,YAAY;AAChE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Author, Manifest } from '@verdaccio/types';
|
|
2
|
+
export type AuthorAvatar = Author & {
|
|
3
|
+
avatar?: string;
|
|
4
|
+
};
|
|
5
|
+
export type AuthorFormat = Author | string | null | void;
|
|
6
|
+
export declare const GENERIC_AVATAR: string;
|
|
7
|
+
/**
|
|
8
|
+
* Formats author field for the web UI.
|
|
9
|
+
* @see https://docs.npmjs.com/files/package.json#author
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatAuthor(author: AuthorFormat): any;
|
|
12
|
+
/**
|
|
13
|
+
* Generate a gravatar url from an email address.
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateGravatarUrl(email?: string | void, online?: boolean): string;
|
|
16
|
+
export declare function normalizeContributors(contributors: Author[]): Author[];
|
|
17
|
+
/**
|
|
18
|
+
* Add gravatar avatars to the author, contributors and maintainers of a manifest.
|
|
19
|
+
*/
|
|
20
|
+
export declare function addGravatarSupport(pkgInfo: Manifest, online?: boolean): AuthorAvatar;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
const require_runtime = require("./_virtual/_rolldown/runtime.js");
|
|
2
|
+
const require_constants = require("./constants.js");
|
|
3
|
+
const require_crypto_utils = require("./crypto-utils.js");
|
|
4
|
+
let lodash = require("lodash");
|
|
5
|
+
lodash = require_runtime.__toESM(lodash);
|
|
6
|
+
//#region src/author-utils.ts
|
|
7
|
+
var author_utils_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
8
|
+
GENERIC_AVATAR: () => GENERIC_AVATAR,
|
|
9
|
+
addGravatarSupport: () => addGravatarSupport,
|
|
10
|
+
formatAuthor: () => formatAuthor,
|
|
11
|
+
generateGravatarUrl: () => generateGravatarUrl,
|
|
12
|
+
normalizeContributors: () => normalizeContributors
|
|
13
|
+
});
|
|
14
|
+
var AVATAR_PROVIDER = "https://www.gravatar.com/avatar/";
|
|
15
|
+
var GENERIC_AVATAR = "data:image/svg+xml;utf8," + encodeURIComponent("<svg height=\"100\" viewBox=\"-27 24 100 100\" width=\"100\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs><circle cx=\"23\" cy=\"74\" id=\"a\" r=\"50\"/></defs><use fill=\"#F5EEE5\" overflow=\"visible\" xlink:href=\"#a\"/><clipPath id=\"b\"><use overflow=\"visible\" xlink:href=\"#a\"/></clipPath><g clip-path=\"url(#b)\"><defs><path d=\"M36 95.9c0 4 4.7 5.2 7.1 5.8 7.6 2 22.8 5.9 22.8 5.9 3.2 1.1 5.7 3.5 7.1 6.6v9.8H-27v-9.8c1.3-3.1 3.9-5.5 7.1-6.6 0 0 15.2-3.9 22.8-5.9 2.4-.6 7.1-1.8 7.1-5.8V85h26v10.9z\" id=\"c\"/></defs><use fill=\"#E6C19C\" overflow=\"visible\" xlink:href=\"#c\"/><clipPath id=\"d\"><use overflow=\"visible\" xlink:href=\"#c\"/></clipPath><path clip-path=\"url(#d)\" d=\"M23.2 35h.2c3.3 0 8.2.2 11.4 2 3.3 1.9 7.3 5.6 8.5 12.1 2.4 13.7-2.1 35.4-6.3 42.4-4 6.7-9.8 9.2-13.5 9.4H23h-.1c-3.7-.2-9.5-2.7-13.5-9.4-4.2-7-8.7-28.7-6.3-42.4 1.2-6.5 5.2-10.2 8.5-12.1 3.2-1.8 8.1-2 11.4-2h.2z\" fill=\"#D4B08C\"/></g><path d=\"M22.6 40c19.1 0 20.7 13.8 20.8 15.1 1.1 11.9-3 28.1-6.8 33.7-4 5.9-9.8 8.1-13.5 8.3h-.5c-3.8-.3-9.6-2.5-13.6-8.4-3.8-5.6-7.9-21.8-6.8-33.8C2.3 53.7 3.5 40 22.6 40z\" fill=\"#F2CEA5\"/></svg>");
|
|
16
|
+
/**
|
|
17
|
+
* Formats author field for the web UI.
|
|
18
|
+
* @see https://docs.npmjs.com/files/package.json#author
|
|
19
|
+
*/
|
|
20
|
+
function formatAuthor(author) {
|
|
21
|
+
let authorDetails = {
|
|
22
|
+
name: require_constants.DEFAULT_USER,
|
|
23
|
+
email: "",
|
|
24
|
+
url: ""
|
|
25
|
+
};
|
|
26
|
+
if (lodash.default.isNil(author)) return authorDetails;
|
|
27
|
+
if (lodash.default.isString(author)) authorDetails = {
|
|
28
|
+
...authorDetails,
|
|
29
|
+
name: author
|
|
30
|
+
};
|
|
31
|
+
if (lodash.default.isObject(author)) authorDetails = {
|
|
32
|
+
...authorDetails,
|
|
33
|
+
...author
|
|
34
|
+
};
|
|
35
|
+
return authorDetails;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate a gravatar url from an email address.
|
|
39
|
+
*/
|
|
40
|
+
function generateGravatarUrl(email = "", online = true) {
|
|
41
|
+
if (online && lodash.default.isString(email) && lodash.default.size(email) > 0) {
|
|
42
|
+
email = email.trim().toLocaleLowerCase();
|
|
43
|
+
return `${AVATAR_PROVIDER}${require_crypto_utils.stringToMD5(email)}`;
|
|
44
|
+
}
|
|
45
|
+
return GENERIC_AVATAR;
|
|
46
|
+
}
|
|
47
|
+
function normalizeContributors(contributors) {
|
|
48
|
+
if (lodash.default.isNil(contributors)) return [];
|
|
49
|
+
else if (contributors && lodash.default.isArray(contributors) === false) return [contributors];
|
|
50
|
+
else if (lodash.default.isString(contributors)) return [{ name: contributors }];
|
|
51
|
+
return contributors;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Add gravatar avatars to the author, contributors and maintainers of a manifest.
|
|
55
|
+
*/
|
|
56
|
+
function addGravatarSupport(pkgInfo, online = true) {
|
|
57
|
+
const pkgInfoCopy = { ...pkgInfo };
|
|
58
|
+
const author = lodash.default.get(pkgInfo, "latest.author", null);
|
|
59
|
+
const contributors = normalizeContributors(lodash.default.get(pkgInfo, "latest.contributors", []));
|
|
60
|
+
const maintainers = lodash.default.get(pkgInfo, "latest.maintainers", []);
|
|
61
|
+
if (author && lodash.default.isObject(author)) {
|
|
62
|
+
const { email } = author;
|
|
63
|
+
pkgInfoCopy.latest.author.avatar = generateGravatarUrl(email, online);
|
|
64
|
+
}
|
|
65
|
+
if (author && lodash.default.isString(author)) pkgInfoCopy.latest.author = {
|
|
66
|
+
avatar: GENERIC_AVATAR,
|
|
67
|
+
email: "",
|
|
68
|
+
author
|
|
69
|
+
};
|
|
70
|
+
if (lodash.default.isEmpty(contributors) === false) pkgInfoCopy.latest.contributors = contributors.map((contributor) => {
|
|
71
|
+
if (lodash.default.isObject(contributor)) contributor.avatar = generateGravatarUrl(contributor.email, online);
|
|
72
|
+
else if (lodash.default.isString(contributor)) contributor = {
|
|
73
|
+
avatar: GENERIC_AVATAR,
|
|
74
|
+
email: contributor,
|
|
75
|
+
name: contributor
|
|
76
|
+
};
|
|
77
|
+
return contributor;
|
|
78
|
+
});
|
|
79
|
+
if (lodash.default.isEmpty(maintainers) === false) pkgInfoCopy.latest.maintainers = maintainers.map((maintainer) => {
|
|
80
|
+
maintainer.avatar = generateGravatarUrl(maintainer.email, online);
|
|
81
|
+
return maintainer;
|
|
82
|
+
});
|
|
83
|
+
return pkgInfoCopy;
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
exports.GENERIC_AVATAR = GENERIC_AVATAR;
|
|
87
|
+
exports.addGravatarSupport = addGravatarSupport;
|
|
88
|
+
Object.defineProperty(exports, "author_utils_exports", {
|
|
89
|
+
enumerable: true,
|
|
90
|
+
get: function() {
|
|
91
|
+
return author_utils_exports;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
exports.formatAuthor = formatAuthor;
|
|
95
|
+
exports.generateGravatarUrl = generateGravatarUrl;
|
|
96
|
+
exports.normalizeContributors = normalizeContributors;
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=author-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"author-utils.js","names":[],"sources":["../src/author-utils.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { Author, Manifest } from '@verdaccio/types';\n\nimport { DEFAULT_USER } from './constants';\nimport { stringToMD5 } from './crypto-utils';\n\nexport type AuthorAvatar = Author & { avatar?: string };\n\nexport type AuthorFormat = Author | string | null | void;\n\nconst AVATAR_PROVIDER = 'https://www.gravatar.com/avatar/';\n\nexport const GENERIC_AVATAR =\n 'data:image/svg+xml;utf8,' +\n encodeURIComponent(\n '<svg height=\"100\" viewBox=\"-27 24 100 100\" width=\"100\" xmlns=\"http://www.w3.org/' +\n '2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs><circle cx=\"23\" cy=\"7' +\n '4\" id=\"a\" r=\"50\"/></defs><use fill=\"#F5EEE5\" overflow=\"visible\" xlink:href=\"#a\"/' +\n '><clipPath id=\"b\"><use overflow=\"visible\" xlink:href=\"#a\"/></clipPath><g clip-pa' +\n 'th=\"url(#b)\"><defs><path d=\"M36 95.9c0 4 4.7 5.2 7.1 5.8 7.6 2 22.8 5.9 22.8 5.9' +\n ' 3.2 1.1 5.7 3.5 7.1 6.6v9.8H-27v-9.8c1.3-3.1 3.9-5.5 7.1-6.6 0 0 15.2-3.9 22.8-' +\n '5.9 2.4-.6 7.1-1.8 7.1-5.8V85h26v10.9z\" id=\"c\"/></defs><use fill=\"#E6C19C\" overf' +\n 'low=\"visible\" xlink:href=\"#c\"/><clipPath id=\"d\"><use overflow=\"visible\" xlink:hr' +\n 'ef=\"#c\"/></clipPath><path clip-path=\"url(#d)\" d=\"M23.2 35h.2c3.3 0 8.2.2 11.4 2 ' +\n '3.3 1.9 7.3 5.6 8.5 12.1 2.4 13.7-2.1 35.4-6.3 42.4-4 6.7-9.8 9.2-13.5 9.4H23h-.' +\n '1c-3.7-.2-9.5-2.7-13.5-9.4-4.2-7-8.7-28.7-6.3-42.4 1.2-6.5 5.2-10.2 8.5-12.1 3.2' +\n '-1.8 8.1-2 11.4-2h.2z\" fill=\"#D4B08C\"/></g><path d=\"M22.6 40c19.1 0 20.7 13.8 20' +\n '.8 15.1 1.1 11.9-3 28.1-6.8 33.7-4 5.9-9.8 8.1-13.5 8.3h-.5c-3.8-.3-9.6-2.5-13.6' +\n '-8.4-3.8-5.6-7.9-21.8-6.8-33.8C2.3 53.7 3.5 40 22.6 40z\" fill=\"#F2CEA5\"/></svg>'\n );\n\n/**\n * Formats author field for the web UI.\n * @see https://docs.npmjs.com/files/package.json#author\n */\nexport function formatAuthor(author: AuthorFormat): any {\n let authorDetails = {\n name: DEFAULT_USER,\n email: '',\n url: '',\n };\n\n if (_.isNil(author)) {\n return authorDetails;\n }\n\n if (_.isString(author)) {\n authorDetails = {\n ...authorDetails,\n name: author as string,\n };\n }\n\n if (_.isObject(author)) {\n authorDetails = {\n ...authorDetails,\n ...(author as Author),\n };\n }\n\n return authorDetails;\n}\n\n/**\n * Generate a gravatar url from an email address.\n */\nexport function generateGravatarUrl(email: string | void = '', online: boolean = true): string {\n if (online && _.isString(email) && _.size(email) > 0) {\n email = email.trim().toLocaleLowerCase();\n const emailMD5 = stringToMD5(email);\n return `${AVATAR_PROVIDER}${emailMD5}`;\n }\n return GENERIC_AVATAR;\n}\n\nexport function normalizeContributors(contributors: Author[]): Author[] {\n if (_.isNil(contributors)) {\n return [];\n } else if (contributors && _.isArray(contributors) === false) {\n return [contributors];\n } else if (_.isString(contributors)) {\n return [\n {\n name: contributors,\n },\n ];\n }\n\n return contributors;\n}\n\n/**\n * Add gravatar avatars to the author, contributors and maintainers of a manifest.\n */\nexport function addGravatarSupport(pkgInfo: Manifest, online = true): AuthorAvatar {\n const pkgInfoCopy = { ...pkgInfo } as any;\n const author: any = _.get(pkgInfo, 'latest.author', null) as any;\n const contributors: AuthorAvatar[] = normalizeContributors(\n _.get(pkgInfo, 'latest.contributors', [])\n );\n const maintainers = _.get(pkgInfo, 'latest.maintainers', []);\n\n // for author.\n if (author && _.isObject(author)) {\n const { email } = author as Author;\n pkgInfoCopy.latest.author.avatar = generateGravatarUrl(email, online);\n }\n\n if (author && _.isString(author)) {\n pkgInfoCopy.latest.author = {\n avatar: GENERIC_AVATAR,\n email: '',\n author,\n };\n }\n\n // for contributors\n if (_.isEmpty(contributors) === false) {\n pkgInfoCopy.latest.contributors = contributors.map((contributor): AuthorAvatar => {\n if (_.isObject(contributor)) {\n contributor.avatar = generateGravatarUrl(contributor.email, online);\n } else if (_.isString(contributor)) {\n contributor = {\n avatar: GENERIC_AVATAR,\n email: contributor,\n name: contributor,\n };\n }\n\n return contributor;\n });\n }\n\n // for maintainers\n if (_.isEmpty(maintainers) === false) {\n pkgInfoCopy.latest.maintainers = maintainers.map((maintainer): void => {\n // @ts-ignore\n maintainer.avatar = generateGravatarUrl(maintainer.email, online);\n return maintainer;\n });\n }\n\n return pkgInfoCopy;\n}\n"],"mappings":";;;;;;;;;;;;;AAWA,IAAM,kBAAkB;AAExB,IAAa,iBACX,6BACA,mBACE,2pCAcF;;;;;AAMF,SAAgB,aAAa,QAA2B;CACtD,IAAI,gBAAgB;EAClB,MAAM,kBAAA;EACN,OAAO;EACP,KAAK;CACP;CAEA,IAAI,OAAA,QAAE,MAAM,MAAM,GAChB,OAAO;CAGT,IAAI,OAAA,QAAE,SAAS,MAAM,GACnB,gBAAgB;EACd,GAAG;EACH,MAAM;CACR;CAGF,IAAI,OAAA,QAAE,SAAS,MAAM,GACnB,gBAAgB;EACd,GAAG;EACH,GAAI;CACN;CAGF,OAAO;AACT;;;;AAKA,SAAgB,oBAAoB,QAAuB,IAAI,SAAkB,MAAc;CAC7F,IAAI,UAAU,OAAA,QAAE,SAAS,KAAK,KAAK,OAAA,QAAE,KAAK,KAAK,IAAI,GAAG;EACpD,QAAQ,MAAM,KAAK,CAAC,CAAC,kBAAkB;EAEvC,OAAO,GAAG,kBADO,qBAAA,YAAY,KACD;CAC9B;CACA,OAAO;AACT;AAEA,SAAgB,sBAAsB,cAAkC;CACtE,IAAI,OAAA,QAAE,MAAM,YAAY,GACtB,OAAO,CAAC;MACH,IAAI,gBAAgB,OAAA,QAAE,QAAQ,YAAY,MAAM,OACrD,OAAO,CAAC,YAAY;MACf,IAAI,OAAA,QAAE,SAAS,YAAY,GAChC,OAAO,CACL,EACE,MAAM,aACR,CACF;CAGF,OAAO;AACT;;;;AAKA,SAAgB,mBAAmB,SAAmB,SAAS,MAAoB;CACjF,MAAM,cAAc,EAAE,GAAG,QAAQ;CACjC,MAAM,SAAc,OAAA,QAAE,IAAI,SAAS,iBAAiB,IAAI;CACxD,MAAM,eAA+B,sBACnC,OAAA,QAAE,IAAI,SAAS,uBAAuB,CAAC,CAAC,CAC1C;CACA,MAAM,cAAc,OAAA,QAAE,IAAI,SAAS,sBAAsB,CAAC,CAAC;CAG3D,IAAI,UAAU,OAAA,QAAE,SAAS,MAAM,GAAG;EAChC,MAAM,EAAE,UAAU;EAClB,YAAY,OAAO,OAAO,SAAS,oBAAoB,OAAO,MAAM;CACtE;CAEA,IAAI,UAAU,OAAA,QAAE,SAAS,MAAM,GAC7B,YAAY,OAAO,SAAS;EAC1B,QAAQ;EACR,OAAO;EACP;CACF;CAIF,IAAI,OAAA,QAAE,QAAQ,YAAY,MAAM,OAC9B,YAAY,OAAO,eAAe,aAAa,KAAK,gBAA8B;EAChF,IAAI,OAAA,QAAE,SAAS,WAAW,GACxB,YAAY,SAAS,oBAAoB,YAAY,OAAO,MAAM;OAC7D,IAAI,OAAA,QAAE,SAAS,WAAW,GAC/B,cAAc;GACZ,QAAQ;GACR,OAAO;GACP,MAAM;EACR;EAGF,OAAO;CACT,CAAC;CAIH,IAAI,OAAA,QAAE,QAAQ,WAAW,MAAM,OAC7B,YAAY,OAAO,cAAc,YAAY,KAAK,eAAqB;EAErE,WAAW,SAAS,oBAAoB,WAAW,OAAO,MAAM;EAChE,OAAO;CACT,CAAC;CAGH,OAAO;AACT"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { __exportAll } from "./_virtual/_rolldown/runtime.mjs";
|
|
2
|
+
import { DEFAULT_USER } from "./constants.mjs";
|
|
3
|
+
import { stringToMD5 } from "./crypto-utils.mjs";
|
|
4
|
+
import _ from "lodash";
|
|
5
|
+
//#region src/author-utils.ts
|
|
6
|
+
var author_utils_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
GENERIC_AVATAR: () => GENERIC_AVATAR,
|
|
8
|
+
addGravatarSupport: () => addGravatarSupport,
|
|
9
|
+
formatAuthor: () => formatAuthor,
|
|
10
|
+
generateGravatarUrl: () => generateGravatarUrl,
|
|
11
|
+
normalizeContributors: () => normalizeContributors
|
|
12
|
+
});
|
|
13
|
+
var AVATAR_PROVIDER = "https://www.gravatar.com/avatar/";
|
|
14
|
+
var GENERIC_AVATAR = "data:image/svg+xml;utf8," + encodeURIComponent("<svg height=\"100\" viewBox=\"-27 24 100 100\" width=\"100\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs><circle cx=\"23\" cy=\"74\" id=\"a\" r=\"50\"/></defs><use fill=\"#F5EEE5\" overflow=\"visible\" xlink:href=\"#a\"/><clipPath id=\"b\"><use overflow=\"visible\" xlink:href=\"#a\"/></clipPath><g clip-path=\"url(#b)\"><defs><path d=\"M36 95.9c0 4 4.7 5.2 7.1 5.8 7.6 2 22.8 5.9 22.8 5.9 3.2 1.1 5.7 3.5 7.1 6.6v9.8H-27v-9.8c1.3-3.1 3.9-5.5 7.1-6.6 0 0 15.2-3.9 22.8-5.9 2.4-.6 7.1-1.8 7.1-5.8V85h26v10.9z\" id=\"c\"/></defs><use fill=\"#E6C19C\" overflow=\"visible\" xlink:href=\"#c\"/><clipPath id=\"d\"><use overflow=\"visible\" xlink:href=\"#c\"/></clipPath><path clip-path=\"url(#d)\" d=\"M23.2 35h.2c3.3 0 8.2.2 11.4 2 3.3 1.9 7.3 5.6 8.5 12.1 2.4 13.7-2.1 35.4-6.3 42.4-4 6.7-9.8 9.2-13.5 9.4H23h-.1c-3.7-.2-9.5-2.7-13.5-9.4-4.2-7-8.7-28.7-6.3-42.4 1.2-6.5 5.2-10.2 8.5-12.1 3.2-1.8 8.1-2 11.4-2h.2z\" fill=\"#D4B08C\"/></g><path d=\"M22.6 40c19.1 0 20.7 13.8 20.8 15.1 1.1 11.9-3 28.1-6.8 33.7-4 5.9-9.8 8.1-13.5 8.3h-.5c-3.8-.3-9.6-2.5-13.6-8.4-3.8-5.6-7.9-21.8-6.8-33.8C2.3 53.7 3.5 40 22.6 40z\" fill=\"#F2CEA5\"/></svg>");
|
|
15
|
+
/**
|
|
16
|
+
* Formats author field for the web UI.
|
|
17
|
+
* @see https://docs.npmjs.com/files/package.json#author
|
|
18
|
+
*/
|
|
19
|
+
function formatAuthor(author) {
|
|
20
|
+
let authorDetails = {
|
|
21
|
+
name: DEFAULT_USER,
|
|
22
|
+
email: "",
|
|
23
|
+
url: ""
|
|
24
|
+
};
|
|
25
|
+
if (_.isNil(author)) return authorDetails;
|
|
26
|
+
if (_.isString(author)) authorDetails = {
|
|
27
|
+
...authorDetails,
|
|
28
|
+
name: author
|
|
29
|
+
};
|
|
30
|
+
if (_.isObject(author)) authorDetails = {
|
|
31
|
+
...authorDetails,
|
|
32
|
+
...author
|
|
33
|
+
};
|
|
34
|
+
return authorDetails;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate a gravatar url from an email address.
|
|
38
|
+
*/
|
|
39
|
+
function generateGravatarUrl(email = "", online = true) {
|
|
40
|
+
if (online && _.isString(email) && _.size(email) > 0) {
|
|
41
|
+
email = email.trim().toLocaleLowerCase();
|
|
42
|
+
return `${AVATAR_PROVIDER}${stringToMD5(email)}`;
|
|
43
|
+
}
|
|
44
|
+
return GENERIC_AVATAR;
|
|
45
|
+
}
|
|
46
|
+
function normalizeContributors(contributors) {
|
|
47
|
+
if (_.isNil(contributors)) return [];
|
|
48
|
+
else if (contributors && _.isArray(contributors) === false) return [contributors];
|
|
49
|
+
else if (_.isString(contributors)) return [{ name: contributors }];
|
|
50
|
+
return contributors;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Add gravatar avatars to the author, contributors and maintainers of a manifest.
|
|
54
|
+
*/
|
|
55
|
+
function addGravatarSupport(pkgInfo, online = true) {
|
|
56
|
+
const pkgInfoCopy = { ...pkgInfo };
|
|
57
|
+
const author = _.get(pkgInfo, "latest.author", null);
|
|
58
|
+
const contributors = normalizeContributors(_.get(pkgInfo, "latest.contributors", []));
|
|
59
|
+
const maintainers = _.get(pkgInfo, "latest.maintainers", []);
|
|
60
|
+
if (author && _.isObject(author)) {
|
|
61
|
+
const { email } = author;
|
|
62
|
+
pkgInfoCopy.latest.author.avatar = generateGravatarUrl(email, online);
|
|
63
|
+
}
|
|
64
|
+
if (author && _.isString(author)) pkgInfoCopy.latest.author = {
|
|
65
|
+
avatar: GENERIC_AVATAR,
|
|
66
|
+
email: "",
|
|
67
|
+
author
|
|
68
|
+
};
|
|
69
|
+
if (_.isEmpty(contributors) === false) pkgInfoCopy.latest.contributors = contributors.map((contributor) => {
|
|
70
|
+
if (_.isObject(contributor)) contributor.avatar = generateGravatarUrl(contributor.email, online);
|
|
71
|
+
else if (_.isString(contributor)) contributor = {
|
|
72
|
+
avatar: GENERIC_AVATAR,
|
|
73
|
+
email: contributor,
|
|
74
|
+
name: contributor
|
|
75
|
+
};
|
|
76
|
+
return contributor;
|
|
77
|
+
});
|
|
78
|
+
if (_.isEmpty(maintainers) === false) pkgInfoCopy.latest.maintainers = maintainers.map((maintainer) => {
|
|
79
|
+
maintainer.avatar = generateGravatarUrl(maintainer.email, online);
|
|
80
|
+
return maintainer;
|
|
81
|
+
});
|
|
82
|
+
return pkgInfoCopy;
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
export { GENERIC_AVATAR, addGravatarSupport, author_utils_exports, formatAuthor, generateGravatarUrl, normalizeContributors };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=author-utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"author-utils.mjs","names":[],"sources":["../src/author-utils.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { Author, Manifest } from '@verdaccio/types';\n\nimport { DEFAULT_USER } from './constants';\nimport { stringToMD5 } from './crypto-utils';\n\nexport type AuthorAvatar = Author & { avatar?: string };\n\nexport type AuthorFormat = Author | string | null | void;\n\nconst AVATAR_PROVIDER = 'https://www.gravatar.com/avatar/';\n\nexport const GENERIC_AVATAR =\n 'data:image/svg+xml;utf8,' +\n encodeURIComponent(\n '<svg height=\"100\" viewBox=\"-27 24 100 100\" width=\"100\" xmlns=\"http://www.w3.org/' +\n '2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs><circle cx=\"23\" cy=\"7' +\n '4\" id=\"a\" r=\"50\"/></defs><use fill=\"#F5EEE5\" overflow=\"visible\" xlink:href=\"#a\"/' +\n '><clipPath id=\"b\"><use overflow=\"visible\" xlink:href=\"#a\"/></clipPath><g clip-pa' +\n 'th=\"url(#b)\"><defs><path d=\"M36 95.9c0 4 4.7 5.2 7.1 5.8 7.6 2 22.8 5.9 22.8 5.9' +\n ' 3.2 1.1 5.7 3.5 7.1 6.6v9.8H-27v-9.8c1.3-3.1 3.9-5.5 7.1-6.6 0 0 15.2-3.9 22.8-' +\n '5.9 2.4-.6 7.1-1.8 7.1-5.8V85h26v10.9z\" id=\"c\"/></defs><use fill=\"#E6C19C\" overf' +\n 'low=\"visible\" xlink:href=\"#c\"/><clipPath id=\"d\"><use overflow=\"visible\" xlink:hr' +\n 'ef=\"#c\"/></clipPath><path clip-path=\"url(#d)\" d=\"M23.2 35h.2c3.3 0 8.2.2 11.4 2 ' +\n '3.3 1.9 7.3 5.6 8.5 12.1 2.4 13.7-2.1 35.4-6.3 42.4-4 6.7-9.8 9.2-13.5 9.4H23h-.' +\n '1c-3.7-.2-9.5-2.7-13.5-9.4-4.2-7-8.7-28.7-6.3-42.4 1.2-6.5 5.2-10.2 8.5-12.1 3.2' +\n '-1.8 8.1-2 11.4-2h.2z\" fill=\"#D4B08C\"/></g><path d=\"M22.6 40c19.1 0 20.7 13.8 20' +\n '.8 15.1 1.1 11.9-3 28.1-6.8 33.7-4 5.9-9.8 8.1-13.5 8.3h-.5c-3.8-.3-9.6-2.5-13.6' +\n '-8.4-3.8-5.6-7.9-21.8-6.8-33.8C2.3 53.7 3.5 40 22.6 40z\" fill=\"#F2CEA5\"/></svg>'\n );\n\n/**\n * Formats author field for the web UI.\n * @see https://docs.npmjs.com/files/package.json#author\n */\nexport function formatAuthor(author: AuthorFormat): any {\n let authorDetails = {\n name: DEFAULT_USER,\n email: '',\n url: '',\n };\n\n if (_.isNil(author)) {\n return authorDetails;\n }\n\n if (_.isString(author)) {\n authorDetails = {\n ...authorDetails,\n name: author as string,\n };\n }\n\n if (_.isObject(author)) {\n authorDetails = {\n ...authorDetails,\n ...(author as Author),\n };\n }\n\n return authorDetails;\n}\n\n/**\n * Generate a gravatar url from an email address.\n */\nexport function generateGravatarUrl(email: string | void = '', online: boolean = true): string {\n if (online && _.isString(email) && _.size(email) > 0) {\n email = email.trim().toLocaleLowerCase();\n const emailMD5 = stringToMD5(email);\n return `${AVATAR_PROVIDER}${emailMD5}`;\n }\n return GENERIC_AVATAR;\n}\n\nexport function normalizeContributors(contributors: Author[]): Author[] {\n if (_.isNil(contributors)) {\n return [];\n } else if (contributors && _.isArray(contributors) === false) {\n return [contributors];\n } else if (_.isString(contributors)) {\n return [\n {\n name: contributors,\n },\n ];\n }\n\n return contributors;\n}\n\n/**\n * Add gravatar avatars to the author, contributors and maintainers of a manifest.\n */\nexport function addGravatarSupport(pkgInfo: Manifest, online = true): AuthorAvatar {\n const pkgInfoCopy = { ...pkgInfo } as any;\n const author: any = _.get(pkgInfo, 'latest.author', null) as any;\n const contributors: AuthorAvatar[] = normalizeContributors(\n _.get(pkgInfo, 'latest.contributors', [])\n );\n const maintainers = _.get(pkgInfo, 'latest.maintainers', []);\n\n // for author.\n if (author && _.isObject(author)) {\n const { email } = author as Author;\n pkgInfoCopy.latest.author.avatar = generateGravatarUrl(email, online);\n }\n\n if (author && _.isString(author)) {\n pkgInfoCopy.latest.author = {\n avatar: GENERIC_AVATAR,\n email: '',\n author,\n };\n }\n\n // for contributors\n if (_.isEmpty(contributors) === false) {\n pkgInfoCopy.latest.contributors = contributors.map((contributor): AuthorAvatar => {\n if (_.isObject(contributor)) {\n contributor.avatar = generateGravatarUrl(contributor.email, online);\n } else if (_.isString(contributor)) {\n contributor = {\n avatar: GENERIC_AVATAR,\n email: contributor,\n name: contributor,\n };\n }\n\n return contributor;\n });\n }\n\n // for maintainers\n if (_.isEmpty(maintainers) === false) {\n pkgInfoCopy.latest.maintainers = maintainers.map((maintainer): void => {\n // @ts-ignore\n maintainer.avatar = generateGravatarUrl(maintainer.email, online);\n return maintainer;\n });\n }\n\n return pkgInfoCopy;\n}\n"],"mappings":";;;;;;;;;;;;AAWA,IAAM,kBAAkB;AAExB,IAAa,iBACX,6BACA,mBACE,2pCAcF;;;;;AAMF,SAAgB,aAAa,QAA2B;CACtD,IAAI,gBAAgB;EAClB,MAAM;EACN,OAAO;EACP,KAAK;CACP;CAEA,IAAI,EAAE,MAAM,MAAM,GAChB,OAAO;CAGT,IAAI,EAAE,SAAS,MAAM,GACnB,gBAAgB;EACd,GAAG;EACH,MAAM;CACR;CAGF,IAAI,EAAE,SAAS,MAAM,GACnB,gBAAgB;EACd,GAAG;EACH,GAAI;CACN;CAGF,OAAO;AACT;;;;AAKA,SAAgB,oBAAoB,QAAuB,IAAI,SAAkB,MAAc;CAC7F,IAAI,UAAU,EAAE,SAAS,KAAK,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG;EACpD,QAAQ,MAAM,KAAK,CAAC,CAAC,kBAAkB;EAEvC,OAAO,GAAG,kBADO,YAAY,KACD;CAC9B;CACA,OAAO;AACT;AAEA,SAAgB,sBAAsB,cAAkC;CACtE,IAAI,EAAE,MAAM,YAAY,GACtB,OAAO,CAAC;MACH,IAAI,gBAAgB,EAAE,QAAQ,YAAY,MAAM,OACrD,OAAO,CAAC,YAAY;MACf,IAAI,EAAE,SAAS,YAAY,GAChC,OAAO,CACL,EACE,MAAM,aACR,CACF;CAGF,OAAO;AACT;;;;AAKA,SAAgB,mBAAmB,SAAmB,SAAS,MAAoB;CACjF,MAAM,cAAc,EAAE,GAAG,QAAQ;CACjC,MAAM,SAAc,EAAE,IAAI,SAAS,iBAAiB,IAAI;CACxD,MAAM,eAA+B,sBACnC,EAAE,IAAI,SAAS,uBAAuB,CAAC,CAAC,CAC1C;CACA,MAAM,cAAc,EAAE,IAAI,SAAS,sBAAsB,CAAC,CAAC;CAG3D,IAAI,UAAU,EAAE,SAAS,MAAM,GAAG;EAChC,MAAM,EAAE,UAAU;EAClB,YAAY,OAAO,OAAO,SAAS,oBAAoB,OAAO,MAAM;CACtE;CAEA,IAAI,UAAU,EAAE,SAAS,MAAM,GAC7B,YAAY,OAAO,SAAS;EAC1B,QAAQ;EACR,OAAO;EACP;CACF;CAIF,IAAI,EAAE,QAAQ,YAAY,MAAM,OAC9B,YAAY,OAAO,eAAe,aAAa,KAAK,gBAA8B;EAChF,IAAI,EAAE,SAAS,WAAW,GACxB,YAAY,SAAS,oBAAoB,YAAY,OAAO,MAAM;OAC7D,IAAI,EAAE,SAAS,WAAW,GAC/B,cAAc;GACZ,QAAQ;GACR,OAAO;GACP,MAAM;EACR;EAGF,OAAO;CACT,CAAC;CAIH,IAAI,EAAE,QAAQ,WAAW,MAAM,OAC7B,YAAY,OAAO,cAAc,YAAY,KAAK,eAAqB;EAErE,WAAW,SAAS,oBAAoB,WAAW,OAAO,MAAM;EAChE,OAAO;CACT,CAAC;CAGH,OAAO;AACT"}
|
package/build/constants.js
CHANGED
|
@@ -190,15 +190,21 @@ exports.DEFAULT_PORT = DEFAULT_PORT;
|
|
|
190
190
|
exports.DEFAULT_PROTOCOL = DEFAULT_PROTOCOL;
|
|
191
191
|
exports.DEFAULT_USER = DEFAULT_USER;
|
|
192
192
|
exports.DIST_TAGS = DIST_TAGS;
|
|
193
|
+
exports.ERROR_CODE = ERROR_CODE;
|
|
193
194
|
exports.HEADERS = HEADERS;
|
|
194
195
|
exports.HEADER_TYPE = HEADER_TYPE;
|
|
195
196
|
exports.HTTP_STATUS = HTTP_STATUS;
|
|
196
197
|
exports.HtpasswdHashAlgorithm = HtpasswdHashAlgorithm;
|
|
197
198
|
exports.LATEST = LATEST;
|
|
199
|
+
exports.LOG_STATUS_MESSAGE = LOG_STATUS_MESSAGE;
|
|
200
|
+
exports.LOG_VERDACCIO_BYTES = LOG_VERDACCIO_BYTES;
|
|
201
|
+
exports.LOG_VERDACCIO_ERROR = LOG_VERDACCIO_ERROR;
|
|
198
202
|
exports.MAINTAINERS = MAINTAINERS;
|
|
203
|
+
exports.PACKAGE_ACCESS = PACKAGE_ACCESS;
|
|
199
204
|
exports.PLUGIN_CATEGORY = PLUGIN_CATEGORY;
|
|
200
205
|
exports.PLUGIN_PREFIX = PLUGIN_PREFIX;
|
|
201
206
|
exports.PLUGIN_UI_PREFIX = PLUGIN_UI_PREFIX;
|
|
207
|
+
exports.ROLES = ROLES;
|
|
202
208
|
exports.TOKEN_BASIC = TOKEN_BASIC;
|
|
203
209
|
exports.TOKEN_BEARER = TOKEN_BEARER;
|
|
204
210
|
exports.USERS = USERS;
|
package/build/constants.mjs
CHANGED
|
@@ -180,6 +180,6 @@ var DEFAULT_PORT = "4873";
|
|
|
180
180
|
var DEFAULT_PROTOCOL = "http";
|
|
181
181
|
var DEFAULT_DOMAIN = "localhost";
|
|
182
182
|
//#endregion
|
|
183
|
-
export { ANONYMOUS_USER, API_MESSAGE, CHARACTER_ENCODING, DEFAULT_DOMAIN, DEFAULT_PASSWORD_VALIDATION, DEFAULT_PORT, DEFAULT_PROTOCOL, DEFAULT_USER, DIST_TAGS, HEADERS, HEADER_TYPE, HTTP_STATUS, HtpasswdHashAlgorithm, LATEST, MAINTAINERS, PLUGIN_CATEGORY, PLUGIN_PREFIX, PLUGIN_UI_PREFIX, TOKEN_BASIC, TOKEN_BEARER, USERS, constants_exports };
|
|
183
|
+
export { ANONYMOUS_USER, API_MESSAGE, CHARACTER_ENCODING, DEFAULT_DOMAIN, DEFAULT_PASSWORD_VALIDATION, DEFAULT_PORT, DEFAULT_PROTOCOL, DEFAULT_USER, DIST_TAGS, ERROR_CODE, HEADERS, HEADER_TYPE, HTTP_STATUS, HtpasswdHashAlgorithm, LATEST, LOG_STATUS_MESSAGE, LOG_VERDACCIO_BYTES, LOG_VERDACCIO_ERROR, MAINTAINERS, PACKAGE_ACCESS, PLUGIN_CATEGORY, PLUGIN_PREFIX, PLUGIN_UI_PREFIX, ROLES, TOKEN_BASIC, TOKEN_BEARER, USERS, constants_exports };
|
|
184
184
|
|
|
185
185
|
//# sourceMappingURL=constants.mjs.map
|
package/build/crypto-utils.js
CHANGED
|
@@ -35,11 +35,16 @@ function mask(str, charNum = 3) {
|
|
|
35
35
|
return `${str.slice(0, charNum)}...${str.slice(-charNum)}`;
|
|
36
36
|
}
|
|
37
37
|
//#endregion
|
|
38
|
+
exports.createTarballHash = createTarballHash;
|
|
38
39
|
Object.defineProperty(exports, "crypto_utils_exports", {
|
|
39
40
|
enumerable: true,
|
|
40
41
|
get: function() {
|
|
41
42
|
return crypto_utils_exports;
|
|
42
43
|
}
|
|
43
44
|
});
|
|
45
|
+
exports.defaultTarballHashAlgorithm = defaultTarballHashAlgorithm;
|
|
46
|
+
exports.generateRandomHexString = generateRandomHexString;
|
|
47
|
+
exports.mask = mask;
|
|
48
|
+
exports.stringToMD5 = stringToMD5;
|
|
44
49
|
|
|
45
50
|
//# sourceMappingURL=crypto-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-utils.js","names":[],"sources":["../src/crypto-utils.ts"],"sourcesContent":["import type { Hash } from 'node:crypto';\nimport { createHash, randomBytes } from 'node:crypto';\n\nexport const defaultTarballHashAlgorithm = 'sha1';\n\nexport function createTarballHash(): Hash {\n return createHash(defaultTarballHashAlgorithm);\n}\n\n/**\n * Express doesn't do ETAGS with requests <= 1024b\n * we use md5 here, it works well on 1k+ bytes, but sucks with fewer data\n * could improve performance using crc32 after benchmarks.\n * @param {Object} data\n * @return {String}\n */\nexport function stringToMD5(data: Buffer | string): string {\n // @ts-ignore update method accepts Buffer or string\n return createHash('md5').update(data).digest('hex');\n}\n\nexport function generateRandomHexString(length = 8): string {\n return randomBytes(length).toString('hex');\n}\n\n/**\n * return a masquerade string with its first and last {charNum} and three dots in between.\n * @param {String} str\n * @param {Number} charNum\n * @returns {String}\n */\nexport function mask(str: string, charNum = 3): string {\n return `${str.slice(0, charNum)}...${str.slice(-charNum)}`;\n}\n"],"mappings":";;;;;;;;;;AAGA,IAAa,8BAA8B;AAE3C,SAAgB,oBAA0B;CACxC,QAAA,GAAA,YAAA,
|
|
1
|
+
{"version":3,"file":"crypto-utils.js","names":[],"sources":["../src/crypto-utils.ts"],"sourcesContent":["import type { Hash } from 'node:crypto';\nimport { createHash, randomBytes } from 'node:crypto';\n\nexport const defaultTarballHashAlgorithm = 'sha1';\n\nexport function createTarballHash(): Hash {\n return createHash(defaultTarballHashAlgorithm);\n}\n\n/**\n * Express doesn't do ETAGS with requests <= 1024b\n * we use md5 here, it works well on 1k+ bytes, but sucks with fewer data\n * could improve performance using crc32 after benchmarks.\n * @param {Object} data\n * @return {String}\n */\nexport function stringToMD5(data: Buffer | string): string {\n // @ts-ignore update method accepts Buffer or string\n return createHash('md5').update(data).digest('hex');\n}\n\nexport function generateRandomHexString(length = 8): string {\n return randomBytes(length).toString('hex');\n}\n\n/**\n * return a masquerade string with its first and last {charNum} and three dots in between.\n * @param {String} str\n * @param {Number} charNum\n * @returns {String}\n */\nexport function mask(str: string, charNum = 3): string {\n return `${str.slice(0, charNum)}...${str.slice(-charNum)}`;\n}\n"],"mappings":";;;;;;;;;;AAGA,IAAa,8BAA8B;AAE3C,SAAgB,oBAA0B;CACxC,QAAA,GAAA,YAAA,WAAA,CAAkB,2BAA2B;AAC/C;;;;;;;;AASA,SAAgB,YAAY,MAA+B;CAEzD,QAAA,GAAA,YAAA,WAAA,CAAkB,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK;AACpD;AAEA,SAAgB,wBAAwB,SAAS,GAAW;CAC1D,QAAA,GAAA,YAAA,YAAA,CAAmB,MAAM,CAAC,CAAC,SAAS,KAAK;AAC3C;;;;;;;AAQA,SAAgB,KAAK,KAAa,UAAU,GAAW;CACrD,OAAO,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,OAAO;AACzD"}
|
package/build/crypto-utils.mjs
CHANGED
|
@@ -35,6 +35,6 @@ function mask(str, charNum = 3) {
|
|
|
35
35
|
return `${str.slice(0, charNum)}...${str.slice(-charNum)}`;
|
|
36
36
|
}
|
|
37
37
|
//#endregion
|
|
38
|
-
export { crypto_utils_exports };
|
|
38
|
+
export { createTarballHash, crypto_utils_exports, defaultTarballHashAlgorithm, generateRandomHexString, mask, stringToMD5 };
|
|
39
39
|
|
|
40
40
|
//# sourceMappingURL=crypto-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-utils.mjs","names":[],"sources":["../src/crypto-utils.ts"],"sourcesContent":["import type { Hash } from 'node:crypto';\nimport { createHash, randomBytes } from 'node:crypto';\n\nexport const defaultTarballHashAlgorithm = 'sha1';\n\nexport function createTarballHash(): Hash {\n return createHash(defaultTarballHashAlgorithm);\n}\n\n/**\n * Express doesn't do ETAGS with requests <= 1024b\n * we use md5 here, it works well on 1k+ bytes, but sucks with fewer data\n * could improve performance using crc32 after benchmarks.\n * @param {Object} data\n * @return {String}\n */\nexport function stringToMD5(data: Buffer | string): string {\n // @ts-ignore update method accepts Buffer or string\n return createHash('md5').update(data).digest('hex');\n}\n\nexport function generateRandomHexString(length = 8): string {\n return randomBytes(length).toString('hex');\n}\n\n/**\n * return a masquerade string with its first and last {charNum} and three dots in between.\n * @param {String} str\n * @param {Number} charNum\n * @returns {String}\n */\nexport function mask(str: string, charNum = 3): string {\n return `${str.slice(0, charNum)}...${str.slice(-charNum)}`;\n}\n"],"mappings":";;;;;;;;;;AAGA,IAAa,8BAA8B;AAE3C,SAAgB,oBAA0B;CACxC,OAAO,WAAW,2BAA2B;AAC/C;;;;;;;;AASA,SAAgB,YAAY,MAA+B;CAEzD,OAAO,WAAW,KAAK,
|
|
1
|
+
{"version":3,"file":"crypto-utils.mjs","names":[],"sources":["../src/crypto-utils.ts"],"sourcesContent":["import type { Hash } from 'node:crypto';\nimport { createHash, randomBytes } from 'node:crypto';\n\nexport const defaultTarballHashAlgorithm = 'sha1';\n\nexport function createTarballHash(): Hash {\n return createHash(defaultTarballHashAlgorithm);\n}\n\n/**\n * Express doesn't do ETAGS with requests <= 1024b\n * we use md5 here, it works well on 1k+ bytes, but sucks with fewer data\n * could improve performance using crc32 after benchmarks.\n * @param {Object} data\n * @return {String}\n */\nexport function stringToMD5(data: Buffer | string): string {\n // @ts-ignore update method accepts Buffer or string\n return createHash('md5').update(data).digest('hex');\n}\n\nexport function generateRandomHexString(length = 8): string {\n return randomBytes(length).toString('hex');\n}\n\n/**\n * return a masquerade string with its first and last {charNum} and three dots in between.\n * @param {String} str\n * @param {Number} charNum\n * @returns {String}\n */\nexport function mask(str: string, charNum = 3): string {\n return `${str.slice(0, charNum)}...${str.slice(-charNum)}`;\n}\n"],"mappings":";;;;;;;;;;AAGA,IAAa,8BAA8B;AAE3C,SAAgB,oBAA0B;CACxC,OAAO,WAAW,2BAA2B;AAC/C;;;;;;;;AASA,SAAgB,YAAY,MAA+B;CAEzD,OAAO,WAAW,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK;AACpD;AAEA,SAAgB,wBAAwB,SAAS,GAAW;CAC1D,OAAO,YAAY,MAAM,CAAC,CAAC,SAAS,KAAK;AAC3C;;;;;;;AAQA,SAAgB,KAAK,KAAa,UAAU,GAAW;CACrD,OAAO,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,OAAO;AACzD"}
|
package/build/error-utils.js
CHANGED
|
@@ -112,5 +112,14 @@ Object.defineProperty(exports, "error_utils_exports", {
|
|
|
112
112
|
return error_utils_exports;
|
|
113
113
|
}
|
|
114
114
|
});
|
|
115
|
+
exports.getBadData = getBadData;
|
|
116
|
+
exports.getBadRequest = getBadRequest;
|
|
117
|
+
exports.getCode = getCode;
|
|
118
|
+
exports.getConflict = getConflict;
|
|
119
|
+
exports.getForbidden = getForbidden;
|
|
120
|
+
exports.getInternalError = getInternalError;
|
|
121
|
+
exports.getNotFound = getNotFound;
|
|
122
|
+
exports.getServiceUnavailable = getServiceUnavailable;
|
|
123
|
+
exports.getUnauthorized = getUnauthorized;
|
|
115
124
|
|
|
116
125
|
//# sourceMappingURL=error-utils.js.map
|
package/build/error-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-utils.js","names":[],"sources":["../src/error-utils.ts"],"sourcesContent":["import type { HttpError } from 'http-errors';\nimport createError from 'http-errors';\n\nimport { HTTP_STATUS } from './constants';\n\nexport const API_ERROR = {\n PASSWORD_SHORT: 'The provided password does not pass the validation',\n MUST_BE_LOGGED: 'You must be logged in to publish packages.',\n PLUGIN_ERROR: 'bug in the auth plugin system',\n CONFIG_BAD_FORMAT: 'config file must be an object',\n BAD_USERNAME_PASSWORD: 'bad username/password, access denied',\n NO_PACKAGE: 'no such package available',\n PACKAGE_CANNOT_BE_ADDED: 'this package cannot be added',\n BAD_DATA: 'bad data',\n NOT_ALLOWED: 'not allowed to access package',\n NOT_ALLOWED_PUBLISH: 'not allowed to publish package',\n INTERNAL_SERVER_ERROR: 'internal server error',\n UNKNOWN_ERROR: 'unknown error',\n NOT_PACKAGE_UPLINK: 'package does not exist on uplink',\n UPLINK_OFFLINE_PUBLISH: 'one of the uplinks is down, refuse to publish',\n UPLINK_OFFLINE: 'uplink is offline',\n NOT_MODIFIED_NO_DATA: 'no data',\n CONTENT_MISMATCH: 'content length mismatch',\n NOT_FILE_UPLINK: \"file doesn't exist on uplink\",\n MAX_USERS_REACHED: 'maximum amount of users reached',\n VERSION_NOT_EXIST: \"this version doesn't exist\",\n NO_SUCH_FILE: 'no such file available',\n UNSUPORTED_REGISTRY_CALL: 'unsupported registry call',\n FILE_NOT_FOUND: 'File not found',\n REGISTRATION_DISABLED: 'user registration disabled',\n UNAUTHORIZED_ACCESS: 'unauthorized access',\n BAD_STATUS_CODE: 'bad status code',\n SERVER_TIME_OUT: 'looks like the server is taking to long to respond',\n PACKAGE_EXIST: 'this package is already present',\n BAD_AUTH_HEADER: 'bad authorization header',\n WEB_DISABLED: 'Web interface is disabled in the config file',\n DEPRECATED_BASIC_HEADER: 'basic authentication is deprecated, please use JWT instead',\n BAD_FORMAT_USER_GROUP: 'user groups is different than an array',\n RESOURCE_UNAVAILABLE: 'resource unavailable',\n BAD_PACKAGE_DATA: 'bad incoming package data',\n USERNAME_PASSWORD_REQUIRED: 'username and password is required',\n USERNAME_ALREADY_REGISTERED: 'username is already registered',\n USERNAME_MISMATCH: 'username does not match logged in user',\n SESSION_ID_REQUIRED: 'session id is required',\n SESSION_ID_INVALID: 'session id is invalid',\n SESSION_TOKEN_EXPIRED: 'session token expired',\n};\n\nexport const SUPPORT_ERRORS = {\n PLUGIN_MISSING_INTERFACE: 'the plugin does not provide implementation of the requested feature',\n TFA_DISABLED: 'the two-factor authentication is not yet supported',\n STORAGE_NOT_IMPLEMENT: 'the storage does not support token saving',\n PARAMETERS_NOT_VALID: 'the parameters are not valid',\n};\n\nexport const APP_ERROR = {\n CONFIG_NOT_VALID: 'CONFIG: it does not look like a valid config file',\n PROFILE_ERROR: 'profile unexpected error',\n PASSWORD_VALIDATION: 'not valid password',\n};\n\nexport type VerdaccioError = HttpError & { code: number };\n\nfunction getError(code: number, message: string): VerdaccioError {\n const httpError = createError(code, message);\n\n httpError.code = code;\n\n return httpError as VerdaccioError;\n}\n\nexport function getConflict(message: string = API_ERROR.PACKAGE_EXIST): VerdaccioError {\n return getError(HTTP_STATUS.CONFLICT, message);\n}\n\nexport function getBadData(customMessage?: string): VerdaccioError {\n return getError(HTTP_STATUS.BAD_DATA, customMessage || API_ERROR.BAD_DATA);\n}\n\nexport function getBadRequest(customMessage: string): VerdaccioError {\n return getError(HTTP_STATUS.BAD_REQUEST, customMessage);\n}\n\nexport function getInternalError(customMessage?: string): VerdaccioError {\n return customMessage\n ? getError(HTTP_STATUS.INTERNAL_ERROR, customMessage)\n : getError(HTTP_STATUS.INTERNAL_ERROR, API_ERROR.UNKNOWN_ERROR);\n}\n\nexport function getUnauthorized(message = 'no credentials provided'): VerdaccioError {\n return getError(HTTP_STATUS.UNAUTHORIZED, message);\n}\n\nexport function getForbidden(message = \"can't use this filename\"): VerdaccioError {\n return getError(HTTP_STATUS.FORBIDDEN, message);\n}\n\nexport function getServiceUnavailable(\n message: string = API_ERROR.RESOURCE_UNAVAILABLE\n): VerdaccioError {\n return getError(HTTP_STATUS.SERVICE_UNAVAILABLE, message);\n}\n\nexport function getNotFound(customMessage?: string): VerdaccioError {\n return getError(HTTP_STATUS.NOT_FOUND, customMessage || API_ERROR.NO_PACKAGE);\n}\n\nexport function getCode(statusCode: number, customMessage: string): VerdaccioError {\n return getError(statusCode, customMessage);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAKA,IAAa,YAAY;CACvB,gBAAgB;CAChB,gBAAgB;CAChB,cAAc;CACd,mBAAmB;CACnB,uBAAuB;CACvB,YAAY;CACZ,yBAAyB;CACzB,UAAU;CACV,aAAa;CACb,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,oBAAoB;CACpB,wBAAwB;CACxB,gBAAgB;CAChB,sBAAsB;CACtB,kBAAkB;CAClB,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,qBAAqB;CACrB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,cAAc;CACd,yBAAyB;CACzB,uBAAuB;CACvB,sBAAsB;CACtB,kBAAkB;CAClB,4BAA4B;CAC5B,6BAA6B;CAC7B,mBAAmB;CACnB,qBAAqB;CACrB,oBAAoB;CACpB,uBAAuB;AACzB;AAEA,IAAa,iBAAiB;CAC5B,0BAA0B;CAC1B,cAAc;CACd,uBAAuB;CACvB,sBAAsB;AACxB;AAEA,IAAa,YAAY;CACvB,kBAAkB;CAClB,eAAe;CACf,qBAAqB;AACvB;AAIA,SAAS,SAAS,MAAc,SAAiC;CAC/D,MAAM,aAAA,GAAA,YAAA,
|
|
1
|
+
{"version":3,"file":"error-utils.js","names":[],"sources":["../src/error-utils.ts"],"sourcesContent":["import type { HttpError } from 'http-errors';\nimport createError from 'http-errors';\n\nimport { HTTP_STATUS } from './constants';\n\nexport const API_ERROR = {\n PASSWORD_SHORT: 'The provided password does not pass the validation',\n MUST_BE_LOGGED: 'You must be logged in to publish packages.',\n PLUGIN_ERROR: 'bug in the auth plugin system',\n CONFIG_BAD_FORMAT: 'config file must be an object',\n BAD_USERNAME_PASSWORD: 'bad username/password, access denied',\n NO_PACKAGE: 'no such package available',\n PACKAGE_CANNOT_BE_ADDED: 'this package cannot be added',\n BAD_DATA: 'bad data',\n NOT_ALLOWED: 'not allowed to access package',\n NOT_ALLOWED_PUBLISH: 'not allowed to publish package',\n INTERNAL_SERVER_ERROR: 'internal server error',\n UNKNOWN_ERROR: 'unknown error',\n NOT_PACKAGE_UPLINK: 'package does not exist on uplink',\n UPLINK_OFFLINE_PUBLISH: 'one of the uplinks is down, refuse to publish',\n UPLINK_OFFLINE: 'uplink is offline',\n NOT_MODIFIED_NO_DATA: 'no data',\n CONTENT_MISMATCH: 'content length mismatch',\n NOT_FILE_UPLINK: \"file doesn't exist on uplink\",\n MAX_USERS_REACHED: 'maximum amount of users reached',\n VERSION_NOT_EXIST: \"this version doesn't exist\",\n NO_SUCH_FILE: 'no such file available',\n UNSUPORTED_REGISTRY_CALL: 'unsupported registry call',\n FILE_NOT_FOUND: 'File not found',\n REGISTRATION_DISABLED: 'user registration disabled',\n UNAUTHORIZED_ACCESS: 'unauthorized access',\n BAD_STATUS_CODE: 'bad status code',\n SERVER_TIME_OUT: 'looks like the server is taking to long to respond',\n PACKAGE_EXIST: 'this package is already present',\n BAD_AUTH_HEADER: 'bad authorization header',\n WEB_DISABLED: 'Web interface is disabled in the config file',\n DEPRECATED_BASIC_HEADER: 'basic authentication is deprecated, please use JWT instead',\n BAD_FORMAT_USER_GROUP: 'user groups is different than an array',\n RESOURCE_UNAVAILABLE: 'resource unavailable',\n BAD_PACKAGE_DATA: 'bad incoming package data',\n USERNAME_PASSWORD_REQUIRED: 'username and password is required',\n USERNAME_ALREADY_REGISTERED: 'username is already registered',\n USERNAME_MISMATCH: 'username does not match logged in user',\n SESSION_ID_REQUIRED: 'session id is required',\n SESSION_ID_INVALID: 'session id is invalid',\n SESSION_TOKEN_EXPIRED: 'session token expired',\n};\n\nexport const SUPPORT_ERRORS = {\n PLUGIN_MISSING_INTERFACE: 'the plugin does not provide implementation of the requested feature',\n TFA_DISABLED: 'the two-factor authentication is not yet supported',\n STORAGE_NOT_IMPLEMENT: 'the storage does not support token saving',\n PARAMETERS_NOT_VALID: 'the parameters are not valid',\n};\n\nexport const APP_ERROR = {\n CONFIG_NOT_VALID: 'CONFIG: it does not look like a valid config file',\n PROFILE_ERROR: 'profile unexpected error',\n PASSWORD_VALIDATION: 'not valid password',\n};\n\nexport type VerdaccioError = HttpError & { code: number };\n\nfunction getError(code: number, message: string): VerdaccioError {\n const httpError = createError(code, message);\n\n httpError.code = code;\n\n return httpError as VerdaccioError;\n}\n\nexport function getConflict(message: string = API_ERROR.PACKAGE_EXIST): VerdaccioError {\n return getError(HTTP_STATUS.CONFLICT, message);\n}\n\nexport function getBadData(customMessage?: string): VerdaccioError {\n return getError(HTTP_STATUS.BAD_DATA, customMessage || API_ERROR.BAD_DATA);\n}\n\nexport function getBadRequest(customMessage: string): VerdaccioError {\n return getError(HTTP_STATUS.BAD_REQUEST, customMessage);\n}\n\nexport function getInternalError(customMessage?: string): VerdaccioError {\n return customMessage\n ? getError(HTTP_STATUS.INTERNAL_ERROR, customMessage)\n : getError(HTTP_STATUS.INTERNAL_ERROR, API_ERROR.UNKNOWN_ERROR);\n}\n\nexport function getUnauthorized(message = 'no credentials provided'): VerdaccioError {\n return getError(HTTP_STATUS.UNAUTHORIZED, message);\n}\n\nexport function getForbidden(message = \"can't use this filename\"): VerdaccioError {\n return getError(HTTP_STATUS.FORBIDDEN, message);\n}\n\nexport function getServiceUnavailable(\n message: string = API_ERROR.RESOURCE_UNAVAILABLE\n): VerdaccioError {\n return getError(HTTP_STATUS.SERVICE_UNAVAILABLE, message);\n}\n\nexport function getNotFound(customMessage?: string): VerdaccioError {\n return getError(HTTP_STATUS.NOT_FOUND, customMessage || API_ERROR.NO_PACKAGE);\n}\n\nexport function getCode(statusCode: number, customMessage: string): VerdaccioError {\n return getError(statusCode, customMessage);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAKA,IAAa,YAAY;CACvB,gBAAgB;CAChB,gBAAgB;CAChB,cAAc;CACd,mBAAmB;CACnB,uBAAuB;CACvB,YAAY;CACZ,yBAAyB;CACzB,UAAU;CACV,aAAa;CACb,qBAAqB;CACrB,uBAAuB;CACvB,eAAe;CACf,oBAAoB;CACpB,wBAAwB;CACxB,gBAAgB;CAChB,sBAAsB;CACtB,kBAAkB;CAClB,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,qBAAqB;CACrB,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,iBAAiB;CACjB,cAAc;CACd,yBAAyB;CACzB,uBAAuB;CACvB,sBAAsB;CACtB,kBAAkB;CAClB,4BAA4B;CAC5B,6BAA6B;CAC7B,mBAAmB;CACnB,qBAAqB;CACrB,oBAAoB;CACpB,uBAAuB;AACzB;AAEA,IAAa,iBAAiB;CAC5B,0BAA0B;CAC1B,cAAc;CACd,uBAAuB;CACvB,sBAAsB;AACxB;AAEA,IAAa,YAAY;CACvB,kBAAkB;CAClB,eAAe;CACf,qBAAqB;AACvB;AAIA,SAAS,SAAS,MAAc,SAAiC;CAC/D,MAAM,aAAA,GAAA,YAAA,QAAA,CAAwB,MAAM,OAAO;CAE3C,UAAU,OAAO;CAEjB,OAAO;AACT;AAEA,SAAgB,YAAY,UAAkB,UAAU,eAA+B;CACrF,OAAO,SAAS,kBAAA,YAAY,UAAU,OAAO;AAC/C;AAEA,SAAgB,WAAW,eAAwC;CACjE,OAAO,SAAS,kBAAA,YAAY,UAAU,iBAAiB,UAAU,QAAQ;AAC3E;AAEA,SAAgB,cAAc,eAAuC;CACnE,OAAO,SAAS,kBAAA,YAAY,aAAa,aAAa;AACxD;AAEA,SAAgB,iBAAiB,eAAwC;CACvE,OAAO,gBACH,SAAS,kBAAA,YAAY,gBAAgB,aAAa,IAClD,SAAS,kBAAA,YAAY,gBAAgB,UAAU,aAAa;AAClE;AAEA,SAAgB,gBAAgB,UAAU,2BAA2C;CACnF,OAAO,SAAS,kBAAA,YAAY,cAAc,OAAO;AACnD;AAEA,SAAgB,aAAa,UAAU,2BAA2C;CAChF,OAAO,SAAS,kBAAA,YAAY,WAAW,OAAO;AAChD;AAEA,SAAgB,sBACd,UAAkB,UAAU,sBACZ;CAChB,OAAO,SAAS,kBAAA,YAAY,qBAAqB,OAAO;AAC1D;AAEA,SAAgB,YAAY,eAAwC;CAClE,OAAO,SAAS,kBAAA,YAAY,WAAW,iBAAiB,UAAU,UAAU;AAC9E;AAEA,SAAgB,QAAQ,YAAoB,eAAuC;CACjF,OAAO,SAAS,YAAY,aAAa;AAC3C"}
|
package/build/error-utils.mjs
CHANGED
|
@@ -102,6 +102,6 @@ function getCode(statusCode, customMessage) {
|
|
|
102
102
|
return getError(statusCode, customMessage);
|
|
103
103
|
}
|
|
104
104
|
//#endregion
|
|
105
|
-
export { API_ERROR, APP_ERROR, SUPPORT_ERRORS, error_utils_exports };
|
|
105
|
+
export { API_ERROR, APP_ERROR, SUPPORT_ERRORS, error_utils_exports, getBadData, getBadRequest, getCode, getConflict, getForbidden, getInternalError, getNotFound, getServiceUnavailable, getUnauthorized };
|
|
106
106
|
|
|
107
107
|
//# sourceMappingURL=error-utils.mjs.map
|
package/build/file-utils.js
CHANGED
|
@@ -32,6 +32,9 @@ async function createTempStorageFolder(prefix, folder = "storage") {
|
|
|
32
32
|
return storageFolder;
|
|
33
33
|
}
|
|
34
34
|
//#endregion
|
|
35
|
+
exports.Files = Files;
|
|
36
|
+
exports.createTempFolder = createTempFolder;
|
|
37
|
+
exports.createTempStorageFolder = createTempStorageFolder;
|
|
35
38
|
Object.defineProperty(exports, "file_utils_exports", {
|
|
36
39
|
enumerable: true,
|
|
37
40
|
get: function() {
|
package/build/file-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils.js","names":[],"sources":["../src/file-utils.ts"],"sourcesContent":["import { mkdir, mkdtemp } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const Files = {\n DatabaseName: '.verdaccio-db.json',\n};\n\n/**\n * Create a temporary folder.\n * @param prefix The prefix of the folder name.\n * @returns string\n */\nexport async function createTempFolder(prefix: string): Promise<string> {\n return await mkdtemp(path.join(os.tmpdir(), 'verdaccio-' + prefix + '-'));\n}\n\n/**\n * Create temporary folder for an asset.\n * @param prefix\n * @param folder name\n * @returns\n */\nexport async function createTempStorageFolder(prefix: string, folder = 'storage'): Promise<string> {\n const tempFolder = await createTempFolder(prefix);\n const storageFolder = path.join(tempFolder, folder);\n await mkdir(storageFolder);\n return storageFolder;\n}\n"],"mappings":";;;;;;;;;;;;AAIA,IAAa,QAAQ,EACnB,cAAc,qBAChB;;;;;;AAOA,eAAsB,iBAAiB,QAAiC;CACtE,OAAO,OAAA,GAAA,iBAAA,
|
|
1
|
+
{"version":3,"file":"file-utils.js","names":[],"sources":["../src/file-utils.ts"],"sourcesContent":["import { mkdir, mkdtemp } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const Files = {\n DatabaseName: '.verdaccio-db.json',\n};\n\n/**\n * Create a temporary folder.\n * @param prefix The prefix of the folder name.\n * @returns string\n */\nexport async function createTempFolder(prefix: string): Promise<string> {\n return await mkdtemp(path.join(os.tmpdir(), 'verdaccio-' + prefix + '-'));\n}\n\n/**\n * Create temporary folder for an asset.\n * @param prefix\n * @param folder name\n * @returns\n */\nexport async function createTempStorageFolder(prefix: string, folder = 'storage'): Promise<string> {\n const tempFolder = await createTempFolder(prefix);\n const storageFolder = path.join(tempFolder, folder);\n await mkdir(storageFolder);\n return storageFolder;\n}\n"],"mappings":";;;;;;;;;;;;AAIA,IAAa,QAAQ,EACnB,cAAc,qBAChB;;;;;;AAOA,eAAsB,iBAAiB,QAAiC;CACtE,OAAO,OAAA,GAAA,iBAAA,QAAA,CAAc,UAAA,QAAK,KAAK,QAAA,QAAG,OAAO,GAAG,eAAe,SAAS,GAAG,CAAC;AAC1E;;;;;;;AAQA,eAAsB,wBAAwB,QAAgB,SAAS,WAA4B;CACjG,MAAM,aAAa,MAAM,iBAAiB,MAAM;CAChD,MAAM,gBAAgB,UAAA,QAAK,KAAK,YAAY,MAAM;CAClD,OAAA,GAAA,iBAAA,MAAA,CAAY,aAAa;CACzB,OAAO;AACT"}
|
package/build/file-utils.mjs
CHANGED
|
@@ -30,6 +30,6 @@ async function createTempStorageFolder(prefix, folder = "storage") {
|
|
|
30
30
|
return storageFolder;
|
|
31
31
|
}
|
|
32
32
|
//#endregion
|
|
33
|
-
export { file_utils_exports };
|
|
33
|
+
export { Files, createTempFolder, createTempStorageFolder, file_utils_exports };
|
|
34
34
|
|
|
35
35
|
//# sourceMappingURL=file-utils.mjs.map
|
package/build/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as authUtils from './auth-utils';
|
|
2
|
+
import * as authorUtils from './author-utils';
|
|
2
3
|
import * as constants from './constants';
|
|
3
4
|
import * as cryptoUtils from './crypto-utils';
|
|
4
5
|
import * as errorUtils from './error-utils';
|
|
@@ -15,4 +16,4 @@ import * as warningUtils from './warning-utils';
|
|
|
15
16
|
export type { VerdaccioError } from './error-utils';
|
|
16
17
|
export { API_ERROR, SUPPORT_ERRORS, APP_ERROR } from './error-utils';
|
|
17
18
|
export { TOKEN_BASIC, TOKEN_BEARER, HTTP_STATUS, API_MESSAGE, HEADERS, DIST_TAGS, CHARACTER_ENCODING, HEADER_TYPE, LATEST, DEFAULT_PASSWORD_VALIDATION, DEFAULT_USER, ANONYMOUS_USER, USERS, MAINTAINERS, PLUGIN_CATEGORY, PLUGIN_PREFIX, PLUGIN_UI_PREFIX, HtpasswdHashAlgorithm, DEFAULT_DOMAIN, DEFAULT_PORT, DEFAULT_PROTOCOL, } from './constants';
|
|
18
|
-
export { authUtils, cryptoUtils, fileUtils, ipUtils, pkgUtils, searchUtils, streamUtils, errorUtils, validationUtils, stringUtils, constants, pluginUtils, warningUtils, tarballUtils, };
|
|
19
|
+
export { authUtils, authorUtils, cryptoUtils, fileUtils, ipUtils, pkgUtils, searchUtils, streamUtils, errorUtils, validationUtils, stringUtils, constants, pluginUtils, warningUtils, tarballUtils, };
|
package/build/index.js
CHANGED
|
@@ -5,6 +5,7 @@ Object.defineProperties(exports, {
|
|
|
5
5
|
const require_auth_utils = require("./auth-utils.js");
|
|
6
6
|
const require_constants = require("./constants.js");
|
|
7
7
|
const require_crypto_utils = require("./crypto-utils.js");
|
|
8
|
+
const require_author_utils = require("./author-utils.js");
|
|
8
9
|
const require_error_utils = require("./error-utils.js");
|
|
9
10
|
const require_file_utils = require("./file-utils.js");
|
|
10
11
|
const require_ip_utils = require("./ip-utils.js");
|
|
@@ -46,6 +47,12 @@ Object.defineProperty(exports, "authUtils", {
|
|
|
46
47
|
return require_auth_utils.auth_utils_exports;
|
|
47
48
|
}
|
|
48
49
|
});
|
|
50
|
+
Object.defineProperty(exports, "authorUtils", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function() {
|
|
53
|
+
return require_author_utils.author_utils_exports;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
49
56
|
Object.defineProperty(exports, "constants", {
|
|
50
57
|
enumerable: true,
|
|
51
58
|
get: function() {
|
package/build/index.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { auth_utils_exports } from "./auth-utils.mjs";
|
|
2
2
|
import { ANONYMOUS_USER, API_MESSAGE, CHARACTER_ENCODING, DEFAULT_DOMAIN, DEFAULT_PASSWORD_VALIDATION, DEFAULT_PORT, DEFAULT_PROTOCOL, DEFAULT_USER, DIST_TAGS, HEADERS, HEADER_TYPE, HTTP_STATUS, HtpasswdHashAlgorithm, LATEST, MAINTAINERS, PLUGIN_CATEGORY, PLUGIN_PREFIX, PLUGIN_UI_PREFIX, TOKEN_BASIC, TOKEN_BEARER, USERS, constants_exports } from "./constants.mjs";
|
|
3
3
|
import { crypto_utils_exports } from "./crypto-utils.mjs";
|
|
4
|
+
import { author_utils_exports } from "./author-utils.mjs";
|
|
4
5
|
import { API_ERROR, APP_ERROR, SUPPORT_ERRORS, error_utils_exports } from "./error-utils.mjs";
|
|
5
6
|
import { file_utils_exports } from "./file-utils.mjs";
|
|
6
7
|
import { ip_utils_exports } from "./ip-utils.mjs";
|
|
@@ -12,4 +13,4 @@ import { string_utils_exports } from "./string-utils.mjs";
|
|
|
12
13
|
import { tarball_utils_exports } from "./tarball-utils.mjs";
|
|
13
14
|
import { validation_utils_exports } from "./validation-utils.mjs";
|
|
14
15
|
import { warning_utils_exports } from "./warning-utils.mjs";
|
|
15
|
-
export { ANONYMOUS_USER, API_ERROR, API_MESSAGE, APP_ERROR, CHARACTER_ENCODING, DEFAULT_DOMAIN, DEFAULT_PASSWORD_VALIDATION, DEFAULT_PORT, DEFAULT_PROTOCOL, DEFAULT_USER, DIST_TAGS, HEADERS, HEADER_TYPE, HTTP_STATUS, HtpasswdHashAlgorithm, LATEST, MAINTAINERS, PLUGIN_CATEGORY, PLUGIN_PREFIX, PLUGIN_UI_PREFIX, SUPPORT_ERRORS, TOKEN_BASIC, TOKEN_BEARER, USERS, auth_utils_exports as authUtils, constants_exports as constants, crypto_utils_exports as cryptoUtils, error_utils_exports as errorUtils, file_utils_exports as fileUtils, ip_utils_exports as ipUtils, pkg_utils_exports as pkgUtils, plugin_utils_exports as pluginUtils, search_utils_exports as searchUtils, stream_utils_exports as streamUtils, string_utils_exports as stringUtils, tarball_utils_exports as tarballUtils, validation_utils_exports as validationUtils, warning_utils_exports as warningUtils };
|
|
16
|
+
export { ANONYMOUS_USER, API_ERROR, API_MESSAGE, APP_ERROR, CHARACTER_ENCODING, DEFAULT_DOMAIN, DEFAULT_PASSWORD_VALIDATION, DEFAULT_PORT, DEFAULT_PROTOCOL, DEFAULT_USER, DIST_TAGS, HEADERS, HEADER_TYPE, HTTP_STATUS, HtpasswdHashAlgorithm, LATEST, MAINTAINERS, PLUGIN_CATEGORY, PLUGIN_PREFIX, PLUGIN_UI_PREFIX, SUPPORT_ERRORS, TOKEN_BASIC, TOKEN_BEARER, USERS, auth_utils_exports as authUtils, author_utils_exports as authorUtils, constants_exports as constants, crypto_utils_exports as cryptoUtils, error_utils_exports as errorUtils, file_utils_exports as fileUtils, ip_utils_exports as ipUtils, pkg_utils_exports as pkgUtils, plugin_utils_exports as pluginUtils, search_utils_exports as searchUtils, stream_utils_exports as streamUtils, string_utils_exports as stringUtils, tarball_utils_exports as tarballUtils, validation_utils_exports as validationUtils, warning_utils_exports as warningUtils };
|
package/build/ip-utils.js
CHANGED
|
@@ -62,5 +62,9 @@ Object.defineProperty(exports, "ip_utils_exports", {
|
|
|
62
62
|
return ip_utils_exports;
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
|
+
exports.isAddressAllowed = isAddressAllowed;
|
|
66
|
+
exports.isIPv4InCIDR = isIPv4InCIDR;
|
|
67
|
+
exports.normalizeAddress = normalizeAddress;
|
|
68
|
+
exports.parseIPv4 = parseIPv4;
|
|
65
69
|
|
|
66
70
|
//# sourceMappingURL=ip-utils.js.map
|
package/build/ip-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip-utils.js","names":[],"sources":["../src/ip-utils.ts"],"sourcesContent":["import net from 'node:net';\n\nconst IPV4_MAPPED_PREFIX = '::ffff:';\n\n/**\n * Trim an address and strip the IPv4-mapped IPv6 prefix (`::ffff:`) so that\n * mapped addresses are compared as plain IPv4.\n */\nexport function normalizeAddress(address?: string): string | undefined {\n if (!address) {\n return;\n }\n\n const trimmedAddress = address.trim();\n\n if (trimmedAddress.startsWith(IPV4_MAPPED_PREFIX)) {\n return trimmedAddress.slice(IPV4_MAPPED_PREFIX.length);\n }\n\n return trimmedAddress;\n}\n\n/**\n * Convert a dotted-quad IPv4 address into its unsigned 32-bit integer value.\n */\nexport function parseIPv4(address: string): number | undefined {\n if (net.isIP(address) !== 4) {\n return;\n }\n\n return (\n address\n .split('.')\n .map(Number)\n .reduce((accumulator, octet) => (accumulator << 8) + octet, 0) >>> 0\n );\n}\n\n/**\n * Whether an IPv4 `address` falls inside the `range`/`prefix` CIDR block.\n */\nexport function isIPv4InCIDR(address: string, range: string, prefix: number): boolean {\n const addressNumber = parseIPv4(address);\n const rangeNumber = parseIPv4(range);\n\n if (addressNumber === undefined || rangeNumber === undefined || prefix < 0 || prefix > 32) {\n return false;\n }\n\n const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;\n\n return (addressNumber & mask) === (rangeNumber & mask);\n}\n\n/**\n * Whether `address` is allowed by the provided `cidr` whitelist. An empty or\n * missing whitelist allows every address; an unparseable address is rejected.\n */\nexport function isAddressAllowed(address: string | undefined, cidr: string[] | undefined): boolean {\n if (!cidr || cidr.length === 0) {\n return true;\n }\n\n const normalizedAddress = normalizeAddress(address);\n\n if (!normalizedAddress) {\n return false;\n }\n\n return cidr.some((entry) => {\n const [range, prefixValue] = entry.split('/');\n const normalizedRange = normalizeAddress(range);\n\n if (!normalizedRange) {\n return false;\n }\n\n if (typeof prefixValue === 'undefined') {\n return normalizedAddress === normalizedRange;\n }\n\n const prefix = Number(prefixValue);\n\n if (Number.isInteger(prefix) === false) {\n return false;\n }\n\n if (net.isIP(normalizedAddress) === 4 && net.isIP(normalizedRange) === 4) {\n return isIPv4InCIDR(normalizedAddress, normalizedRange, prefix);\n }\n\n return prefix === 128 && normalizedAddress === normalizedRange;\n });\n}\n"],"mappings":";;;;;;;;;;AAEA,IAAM,qBAAqB;;;;;AAM3B,SAAgB,iBAAiB,SAAsC;CACrE,IAAI,CAAC,SACH;CAGF,MAAM,iBAAiB,QAAQ,KAAK;CAEpC,IAAI,eAAe,WAAW,kBAAkB,GAC9C,OAAO,eAAe,MAAM,CAAyB;CAGvD,OAAO;AACT;;;;AAKA,SAAgB,UAAU,SAAqC;CAC7D,IAAI,SAAA,QAAI,KAAK,OAAO,MAAM,GACxB;CAGF,OACE,QACG,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"ip-utils.js","names":[],"sources":["../src/ip-utils.ts"],"sourcesContent":["import net from 'node:net';\n\nconst IPV4_MAPPED_PREFIX = '::ffff:';\n\n/**\n * Trim an address and strip the IPv4-mapped IPv6 prefix (`::ffff:`) so that\n * mapped addresses are compared as plain IPv4.\n */\nexport function normalizeAddress(address?: string): string | undefined {\n if (!address) {\n return;\n }\n\n const trimmedAddress = address.trim();\n\n if (trimmedAddress.startsWith(IPV4_MAPPED_PREFIX)) {\n return trimmedAddress.slice(IPV4_MAPPED_PREFIX.length);\n }\n\n return trimmedAddress;\n}\n\n/**\n * Convert a dotted-quad IPv4 address into its unsigned 32-bit integer value.\n */\nexport function parseIPv4(address: string): number | undefined {\n if (net.isIP(address) !== 4) {\n return;\n }\n\n return (\n address\n .split('.')\n .map(Number)\n .reduce((accumulator, octet) => (accumulator << 8) + octet, 0) >>> 0\n );\n}\n\n/**\n * Whether an IPv4 `address` falls inside the `range`/`prefix` CIDR block.\n */\nexport function isIPv4InCIDR(address: string, range: string, prefix: number): boolean {\n const addressNumber = parseIPv4(address);\n const rangeNumber = parseIPv4(range);\n\n if (addressNumber === undefined || rangeNumber === undefined || prefix < 0 || prefix > 32) {\n return false;\n }\n\n const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;\n\n return (addressNumber & mask) === (rangeNumber & mask);\n}\n\n/**\n * Whether `address` is allowed by the provided `cidr` whitelist. An empty or\n * missing whitelist allows every address; an unparseable address is rejected.\n */\nexport function isAddressAllowed(address: string | undefined, cidr: string[] | undefined): boolean {\n if (!cidr || cidr.length === 0) {\n return true;\n }\n\n const normalizedAddress = normalizeAddress(address);\n\n if (!normalizedAddress) {\n return false;\n }\n\n return cidr.some((entry) => {\n const [range, prefixValue] = entry.split('/');\n const normalizedRange = normalizeAddress(range);\n\n if (!normalizedRange) {\n return false;\n }\n\n if (typeof prefixValue === 'undefined') {\n return normalizedAddress === normalizedRange;\n }\n\n const prefix = Number(prefixValue);\n\n if (Number.isInteger(prefix) === false) {\n return false;\n }\n\n if (net.isIP(normalizedAddress) === 4 && net.isIP(normalizedRange) === 4) {\n return isIPv4InCIDR(normalizedAddress, normalizedRange, prefix);\n }\n\n return prefix === 128 && normalizedAddress === normalizedRange;\n });\n}\n"],"mappings":";;;;;;;;;;AAEA,IAAM,qBAAqB;;;;;AAM3B,SAAgB,iBAAiB,SAAsC;CACrE,IAAI,CAAC,SACH;CAGF,MAAM,iBAAiB,QAAQ,KAAK;CAEpC,IAAI,eAAe,WAAW,kBAAkB,GAC9C,OAAO,eAAe,MAAM,CAAyB;CAGvD,OAAO;AACT;;;;AAKA,SAAgB,UAAU,SAAqC;CAC7D,IAAI,SAAA,QAAI,KAAK,OAAO,MAAM,GACxB;CAGF,OACE,QACG,MAAM,GAAG,CAAC,CACV,IAAI,MAAM,CAAC,CACX,QAAQ,aAAa,WAAW,eAAe,KAAK,OAAO,CAAC,MAAM;AAEzE;;;;AAKA,SAAgB,aAAa,SAAiB,OAAe,QAAyB;CACpF,MAAM,gBAAgB,UAAU,OAAO;CACvC,MAAM,cAAc,UAAU,KAAK;CAEnC,IAAI,kBAAkB,KAAA,KAAa,gBAAgB,KAAA,KAAa,SAAS,KAAK,SAAS,IACrF,OAAO;CAGT,MAAM,OAAO,WAAW,IAAI,IAAK,cAAe,KAAK,WAAa;CAElE,QAAQ,gBAAgB,WAAW,cAAc;AACnD;;;;;AAMA,SAAgB,iBAAiB,SAA6B,MAAqC;CACjG,IAAI,CAAC,QAAQ,KAAK,WAAW,GAC3B,OAAO;CAGT,MAAM,oBAAoB,iBAAiB,OAAO;CAElD,IAAI,CAAC,mBACH,OAAO;CAGT,OAAO,KAAK,MAAM,UAAU;EAC1B,MAAM,CAAC,OAAO,eAAe,MAAM,MAAM,GAAG;EAC5C,MAAM,kBAAkB,iBAAiB,KAAK;EAE9C,IAAI,CAAC,iBACH,OAAO;EAGT,IAAI,OAAO,gBAAgB,aACzB,OAAO,sBAAsB;EAG/B,MAAM,SAAS,OAAO,WAAW;EAEjC,IAAI,OAAO,UAAU,MAAM,MAAM,OAC/B,OAAO;EAGT,IAAI,SAAA,QAAI,KAAK,iBAAiB,MAAM,KAAK,SAAA,QAAI,KAAK,eAAe,MAAM,GACrE,OAAO,aAAa,mBAAmB,iBAAiB,MAAM;EAGhE,OAAO,WAAW,OAAO,sBAAsB;CACjD,CAAC;AACH"}
|
package/build/ip-utils.mjs
CHANGED
package/build/ip-utils.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip-utils.mjs","names":[],"sources":["../src/ip-utils.ts"],"sourcesContent":["import net from 'node:net';\n\nconst IPV4_MAPPED_PREFIX = '::ffff:';\n\n/**\n * Trim an address and strip the IPv4-mapped IPv6 prefix (`::ffff:`) so that\n * mapped addresses are compared as plain IPv4.\n */\nexport function normalizeAddress(address?: string): string | undefined {\n if (!address) {\n return;\n }\n\n const trimmedAddress = address.trim();\n\n if (trimmedAddress.startsWith(IPV4_MAPPED_PREFIX)) {\n return trimmedAddress.slice(IPV4_MAPPED_PREFIX.length);\n }\n\n return trimmedAddress;\n}\n\n/**\n * Convert a dotted-quad IPv4 address into its unsigned 32-bit integer value.\n */\nexport function parseIPv4(address: string): number | undefined {\n if (net.isIP(address) !== 4) {\n return;\n }\n\n return (\n address\n .split('.')\n .map(Number)\n .reduce((accumulator, octet) => (accumulator << 8) + octet, 0) >>> 0\n );\n}\n\n/**\n * Whether an IPv4 `address` falls inside the `range`/`prefix` CIDR block.\n */\nexport function isIPv4InCIDR(address: string, range: string, prefix: number): boolean {\n const addressNumber = parseIPv4(address);\n const rangeNumber = parseIPv4(range);\n\n if (addressNumber === undefined || rangeNumber === undefined || prefix < 0 || prefix > 32) {\n return false;\n }\n\n const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;\n\n return (addressNumber & mask) === (rangeNumber & mask);\n}\n\n/**\n * Whether `address` is allowed by the provided `cidr` whitelist. An empty or\n * missing whitelist allows every address; an unparseable address is rejected.\n */\nexport function isAddressAllowed(address: string | undefined, cidr: string[] | undefined): boolean {\n if (!cidr || cidr.length === 0) {\n return true;\n }\n\n const normalizedAddress = normalizeAddress(address);\n\n if (!normalizedAddress) {\n return false;\n }\n\n return cidr.some((entry) => {\n const [range, prefixValue] = entry.split('/');\n const normalizedRange = normalizeAddress(range);\n\n if (!normalizedRange) {\n return false;\n }\n\n if (typeof prefixValue === 'undefined') {\n return normalizedAddress === normalizedRange;\n }\n\n const prefix = Number(prefixValue);\n\n if (Number.isInteger(prefix) === false) {\n return false;\n }\n\n if (net.isIP(normalizedAddress) === 4 && net.isIP(normalizedRange) === 4) {\n return isIPv4InCIDR(normalizedAddress, normalizedRange, prefix);\n }\n\n return prefix === 128 && normalizedAddress === normalizedRange;\n });\n}\n"],"mappings":";;;;;;;;;AAEA,IAAM,qBAAqB;;;;;AAM3B,SAAgB,iBAAiB,SAAsC;CACrE,IAAI,CAAC,SACH;CAGF,MAAM,iBAAiB,QAAQ,KAAK;CAEpC,IAAI,eAAe,WAAW,kBAAkB,GAC9C,OAAO,eAAe,MAAM,CAAyB;CAGvD,OAAO;AACT;;;;AAKA,SAAgB,UAAU,SAAqC;CAC7D,IAAI,IAAI,KAAK,OAAO,MAAM,GACxB;CAGF,OACE,QACG,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"ip-utils.mjs","names":[],"sources":["../src/ip-utils.ts"],"sourcesContent":["import net from 'node:net';\n\nconst IPV4_MAPPED_PREFIX = '::ffff:';\n\n/**\n * Trim an address and strip the IPv4-mapped IPv6 prefix (`::ffff:`) so that\n * mapped addresses are compared as plain IPv4.\n */\nexport function normalizeAddress(address?: string): string | undefined {\n if (!address) {\n return;\n }\n\n const trimmedAddress = address.trim();\n\n if (trimmedAddress.startsWith(IPV4_MAPPED_PREFIX)) {\n return trimmedAddress.slice(IPV4_MAPPED_PREFIX.length);\n }\n\n return trimmedAddress;\n}\n\n/**\n * Convert a dotted-quad IPv4 address into its unsigned 32-bit integer value.\n */\nexport function parseIPv4(address: string): number | undefined {\n if (net.isIP(address) !== 4) {\n return;\n }\n\n return (\n address\n .split('.')\n .map(Number)\n .reduce((accumulator, octet) => (accumulator << 8) + octet, 0) >>> 0\n );\n}\n\n/**\n * Whether an IPv4 `address` falls inside the `range`/`prefix` CIDR block.\n */\nexport function isIPv4InCIDR(address: string, range: string, prefix: number): boolean {\n const addressNumber = parseIPv4(address);\n const rangeNumber = parseIPv4(range);\n\n if (addressNumber === undefined || rangeNumber === undefined || prefix < 0 || prefix > 32) {\n return false;\n }\n\n const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;\n\n return (addressNumber & mask) === (rangeNumber & mask);\n}\n\n/**\n * Whether `address` is allowed by the provided `cidr` whitelist. An empty or\n * missing whitelist allows every address; an unparseable address is rejected.\n */\nexport function isAddressAllowed(address: string | undefined, cidr: string[] | undefined): boolean {\n if (!cidr || cidr.length === 0) {\n return true;\n }\n\n const normalizedAddress = normalizeAddress(address);\n\n if (!normalizedAddress) {\n return false;\n }\n\n return cidr.some((entry) => {\n const [range, prefixValue] = entry.split('/');\n const normalizedRange = normalizeAddress(range);\n\n if (!normalizedRange) {\n return false;\n }\n\n if (typeof prefixValue === 'undefined') {\n return normalizedAddress === normalizedRange;\n }\n\n const prefix = Number(prefixValue);\n\n if (Number.isInteger(prefix) === false) {\n return false;\n }\n\n if (net.isIP(normalizedAddress) === 4 && net.isIP(normalizedRange) === 4) {\n return isIPv4InCIDR(normalizedAddress, normalizedRange, prefix);\n }\n\n return prefix === 128 && normalizedAddress === normalizedRange;\n });\n}\n"],"mappings":";;;;;;;;;AAEA,IAAM,qBAAqB;;;;;AAM3B,SAAgB,iBAAiB,SAAsC;CACrE,IAAI,CAAC,SACH;CAGF,MAAM,iBAAiB,QAAQ,KAAK;CAEpC,IAAI,eAAe,WAAW,kBAAkB,GAC9C,OAAO,eAAe,MAAM,CAAyB;CAGvD,OAAO;AACT;;;;AAKA,SAAgB,UAAU,SAAqC;CAC7D,IAAI,IAAI,KAAK,OAAO,MAAM,GACxB;CAGF,OACE,QACG,MAAM,GAAG,CAAC,CACV,IAAI,MAAM,CAAC,CACX,QAAQ,aAAa,WAAW,eAAe,KAAK,OAAO,CAAC,MAAM;AAEzE;;;;AAKA,SAAgB,aAAa,SAAiB,OAAe,QAAyB;CACpF,MAAM,gBAAgB,UAAU,OAAO;CACvC,MAAM,cAAc,UAAU,KAAK;CAEnC,IAAI,kBAAkB,KAAA,KAAa,gBAAgB,KAAA,KAAa,SAAS,KAAK,SAAS,IACrF,OAAO;CAGT,MAAM,OAAO,WAAW,IAAI,IAAK,cAAe,KAAK,WAAa;CAElE,QAAQ,gBAAgB,WAAW,cAAc;AACnD;;;;;AAMA,SAAgB,iBAAiB,SAA6B,MAAqC;CACjG,IAAI,CAAC,QAAQ,KAAK,WAAW,GAC3B,OAAO;CAGT,MAAM,oBAAoB,iBAAiB,OAAO;CAElD,IAAI,CAAC,mBACH,OAAO;CAGT,OAAO,KAAK,MAAM,UAAU;EAC1B,MAAM,CAAC,OAAO,eAAe,MAAM,MAAM,GAAG;EAC5C,MAAM,kBAAkB,iBAAiB,KAAK;EAE9C,IAAI,CAAC,iBACH,OAAO;EAGT,IAAI,OAAO,gBAAgB,aACzB,OAAO,sBAAsB;EAG/B,MAAM,SAAS,OAAO,WAAW;EAEjC,IAAI,OAAO,UAAU,MAAM,MAAM,OAC/B,OAAO;EAGT,IAAI,IAAI,KAAK,iBAAiB,MAAM,KAAK,IAAI,KAAK,eAAe,MAAM,GACrE,OAAO,aAAa,mBAAmB,iBAAiB,MAAM;EAGhE,OAAO,WAAW,OAAO,sBAAsB;CACjD,CAAC;AACH"}
|
package/build/pkg-utils.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export declare function semverSort(listVersions: string[]): string[];
|
|
|
10
10
|
* @returns The sanitized version string.
|
|
11
11
|
*/
|
|
12
12
|
export declare function semverSanitize(version: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Get the version tagged as latest in the dist-tags of a package.
|
|
15
|
+
* @param package metadata
|
|
16
|
+
**/
|
|
17
|
+
export declare function getLatestVersion(pkgInfo: Manifest): string;
|
|
13
18
|
/**
|
|
14
19
|
* Get the latest publihsed version of a package.
|
|
15
20
|
* @param package metadata
|
package/build/pkg-utils.js
CHANGED
|
@@ -9,6 +9,7 @@ semver = require_runtime.__toESM(semver);
|
|
|
9
9
|
//#region src/pkg-utils.ts
|
|
10
10
|
var pkg_utils_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
11
11
|
getLatest: () => getLatest,
|
|
12
|
+
getLatestVersion: () => getLatestVersion,
|
|
12
13
|
getPackageJson: () => getPackageJson,
|
|
13
14
|
mergeVersions: () => mergeVersions,
|
|
14
15
|
semverSanitize: () => semverSanitize,
|
|
@@ -33,6 +34,13 @@ function semverSanitize(version) {
|
|
|
33
34
|
return semver.default.valid(version) || semver.default.coerce(version, { includePrerelease: true })?.version || "";
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
37
|
+
* Get the version tagged as latest in the dist-tags of a package.
|
|
38
|
+
* @param package metadata
|
|
39
|
+
**/
|
|
40
|
+
function getLatestVersion(pkgInfo) {
|
|
41
|
+
return pkgInfo[require_constants.DIST_TAGS].latest;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
36
44
|
* Get the latest publihsed version of a package.
|
|
37
45
|
* @param package metadata
|
|
38
46
|
**/
|
|
@@ -67,11 +75,17 @@ function getPackageJson(packagePath, relativePath) {
|
|
|
67
75
|
return JSON.parse(node_fs.default.readFileSync(packageJsonPath, "utf8"));
|
|
68
76
|
}
|
|
69
77
|
//#endregion
|
|
78
|
+
exports.getLatest = getLatest;
|
|
79
|
+
exports.getLatestVersion = getLatestVersion;
|
|
80
|
+
exports.getPackageJson = getPackageJson;
|
|
81
|
+
exports.mergeVersions = mergeVersions;
|
|
70
82
|
Object.defineProperty(exports, "pkg_utils_exports", {
|
|
71
83
|
enumerable: true,
|
|
72
84
|
get: function() {
|
|
73
85
|
return pkg_utils_exports;
|
|
74
86
|
}
|
|
75
87
|
});
|
|
88
|
+
exports.semverSanitize = semverSanitize;
|
|
89
|
+
exports.semverSort = semverSort;
|
|
76
90
|
|
|
77
91
|
//# sourceMappingURL=pkg-utils.js.map
|
package/build/pkg-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkg-utils.js","names":[],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport semver from 'semver';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DIST_TAGS } from './constants';\n\n/**\n * Function filters out bad semver versions and sorts the array.\n * @return {Array} sorted Array\n */\nexport function semverSort(listVersions: string[]): string[] {\n return listVersions\n .filter(function (x): boolean {\n if (!semver.parse(x, true)) {\n return false;\n }\n return true;\n })\n .sort(semver.compareLoose)\n .map(String);\n}\n\n/**\n * Sanitize a version string to a valid semver version.\n * @param version - The version string to sanitize.\n * @returns The sanitized version string.\n */\nexport function semverSanitize(version: string): string {\n return (\n semver.valid(version) || semver.coerce(version, { includePrerelease: true })?.version || ''\n );\n}\n\n/**\n * Get the latest publihsed version of a package.\n * @param package metadata\n **/\nexport function getLatest(pkg: Manifest): string {\n const listVersions: string[] = Object.keys(pkg.versions);\n if (listVersions.length < 1) {\n throw Error('cannot get lastest version of none');\n }\n\n const versions: string[] = semverSort(listVersions);\n const latest: string | undefined = pkg[DIST_TAGS]?.latest ? pkg[DIST_TAGS].latest : versions[0];\n\n return latest;\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 {*} upstream\n * @param {*} config sds\n * @deprecated use @verdaccio/storage mergeVersions method\n */\n// @deprecated\nexport function mergeVersions(local: Manifest, upstream: Manifest) {\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 upstream.versions) {\n if (typeof local.versions[i] === 'undefined') {\n local.versions[i] = upstream.versions[i];\n }\n }\n\n for (const i in upstream[DIST_TAGS]) {\n if (local[DIST_TAGS][i] !== upstream[DIST_TAGS][i]) {\n if (!local[DIST_TAGS][i] || semver.lte(local[DIST_TAGS][i], upstream[DIST_TAGS][i])) {\n local[DIST_TAGS][i] = upstream[DIST_TAGS][i];\n }\n if (i === 'latest' && local[DIST_TAGS][i] === upstream[DIST_TAGS][i]) {\n // if remote has more fresh package, we should borrow its readme\n local.readme = upstream.readme;\n }\n }\n }\n}\n\n/**\n * Get package informations from package.json\n * @param packagePath - The path to the package.json file.\n * @returns The package.json content\n */\nexport function getPackageJson(packagePath: string, relativePath: string): Record<string, unknown> {\n const packageJsonPath = path.join(packagePath, relativePath, 'package.json');\n return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"pkg-utils.js","names":[],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport semver from 'semver';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DIST_TAGS } from './constants';\n\n/**\n * Function filters out bad semver versions and sorts the array.\n * @return {Array} sorted Array\n */\nexport function semverSort(listVersions: string[]): string[] {\n return listVersions\n .filter(function (x): boolean {\n if (!semver.parse(x, true)) {\n return false;\n }\n return true;\n })\n .sort(semver.compareLoose)\n .map(String);\n}\n\n/**\n * Sanitize a version string to a valid semver version.\n * @param version - The version string to sanitize.\n * @returns The sanitized version string.\n */\nexport function semverSanitize(version: string): string {\n return (\n semver.valid(version) || semver.coerce(version, { includePrerelease: true })?.version || ''\n );\n}\n\n/**\n * Get the version tagged as latest in the dist-tags of a package.\n * @param package metadata\n **/\nexport function getLatestVersion(pkgInfo: Manifest): string {\n return pkgInfo[DIST_TAGS].latest;\n}\n\n/**\n * Get the latest publihsed version of a package.\n * @param package metadata\n **/\nexport function getLatest(pkg: Manifest): string {\n const listVersions: string[] = Object.keys(pkg.versions);\n if (listVersions.length < 1) {\n throw Error('cannot get lastest version of none');\n }\n\n const versions: string[] = semverSort(listVersions);\n const latest: string | undefined = pkg[DIST_TAGS]?.latest ? pkg[DIST_TAGS].latest : versions[0];\n\n return latest;\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 {*} upstream\n * @param {*} config sds\n * @deprecated use @verdaccio/storage mergeVersions method\n */\n// @deprecated\nexport function mergeVersions(local: Manifest, upstream: Manifest) {\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 upstream.versions) {\n if (typeof local.versions[i] === 'undefined') {\n local.versions[i] = upstream.versions[i];\n }\n }\n\n for (const i in upstream[DIST_TAGS]) {\n if (local[DIST_TAGS][i] !== upstream[DIST_TAGS][i]) {\n if (!local[DIST_TAGS][i] || semver.lte(local[DIST_TAGS][i], upstream[DIST_TAGS][i])) {\n local[DIST_TAGS][i] = upstream[DIST_TAGS][i];\n }\n if (i === 'latest' && local[DIST_TAGS][i] === upstream[DIST_TAGS][i]) {\n // if remote has more fresh package, we should borrow its readme\n local.readme = upstream.readme;\n }\n }\n }\n}\n\n/**\n * Get package informations from package.json\n * @param packagePath - The path to the package.json file.\n * @returns The package.json content\n */\nexport function getPackageJson(packagePath: string, relativePath: string): Record<string, unknown> {\n const packageJsonPath = path.join(packagePath, relativePath, 'package.json');\n return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYA,SAAgB,WAAW,cAAkC;CAC3D,OAAO,aACJ,OAAO,SAAU,GAAY;EAC5B,IAAI,CAAC,OAAA,QAAO,MAAM,GAAG,IAAI,GACvB,OAAO;EAET,OAAO;CACT,CAAC,CAAC,CACD,KAAK,OAAA,QAAO,YAAY,CAAC,CACzB,IAAI,MAAM;AACf;;;;;;AAOA,SAAgB,eAAe,SAAyB;CACtD,OACE,OAAA,QAAO,MAAM,OAAO,KAAK,OAAA,QAAO,OAAO,SAAS,EAAE,mBAAmB,KAAK,CAAC,CAAC,EAAE,WAAW;AAE7F;;;;;AAMA,SAAgB,iBAAiB,SAA2B;CAC1D,OAAO,QAAQ,kBAAA,UAAU,CAAC;AAC5B;;;;;AAMA,SAAgB,UAAU,KAAuB;CAC/C,MAAM,eAAyB,OAAO,KAAK,IAAI,QAAQ;CACvD,IAAI,aAAa,SAAS,GACxB,MAAM,MAAM,oCAAoC;CAGlD,MAAM,WAAqB,WAAW,YAAY;CAGlD,OAFmC,IAAA,YAAc,EAAE,SAAS,IAAI,kBAAA,UAAU,CAAC,SAAS,SAAS;AAG/F;;;;;;;;;AAWA,SAAgB,cAAc,OAAiB,UAAoB;CAGjE,KAAK,MAAM,KAAK,SAAS,UACvB,IAAI,OAAO,MAAM,SAAS,OAAO,aAC/B,MAAM,SAAS,KAAK,SAAS,SAAS;CAI1C,KAAK,MAAM,KAAK,SAAS,kBAAA,YACvB,IAAI,MAAA,YAAgB,CAAC,OAAO,SAAA,YAAmB,CAAC,IAAI;EAClD,IAAI,CAAC,MAAA,YAAgB,CAAC,MAAM,OAAA,QAAO,IAAI,MAAA,YAAgB,CAAC,IAAI,SAAA,YAAmB,CAAC,EAAE,GAChF,MAAM,kBAAA,UAAU,CAAC,KAAK,SAAS,kBAAA,UAAU,CAAC;EAE5C,IAAI,MAAM,YAAY,MAAA,YAAgB,CAAC,OAAO,SAAA,YAAmB,CAAC,IAEhE,MAAM,SAAS,SAAS;CAE5B;AAEJ;;;;;;AAOA,SAAgB,eAAe,aAAqB,cAA+C;CACjG,MAAM,kBAAkB,UAAA,QAAK,KAAK,aAAa,cAAc,cAAc;CAC3E,OAAO,KAAK,MAAM,QAAA,QAAG,aAAa,iBAAiB,MAAM,CAAC;AAC5D"}
|
package/build/pkg-utils.mjs
CHANGED
|
@@ -6,6 +6,7 @@ import semver from "semver";
|
|
|
6
6
|
//#region src/pkg-utils.ts
|
|
7
7
|
var pkg_utils_exports = /* @__PURE__ */ __exportAll({
|
|
8
8
|
getLatest: () => getLatest,
|
|
9
|
+
getLatestVersion: () => getLatestVersion,
|
|
9
10
|
getPackageJson: () => getPackageJson,
|
|
10
11
|
mergeVersions: () => mergeVersions,
|
|
11
12
|
semverSanitize: () => semverSanitize,
|
|
@@ -30,6 +31,13 @@ function semverSanitize(version) {
|
|
|
30
31
|
return semver.valid(version) || semver.coerce(version, { includePrerelease: true })?.version || "";
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
34
|
+
* Get the version tagged as latest in the dist-tags of a package.
|
|
35
|
+
* @param package metadata
|
|
36
|
+
**/
|
|
37
|
+
function getLatestVersion(pkgInfo) {
|
|
38
|
+
return pkgInfo[DIST_TAGS].latest;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
33
41
|
* Get the latest publihsed version of a package.
|
|
34
42
|
* @param package metadata
|
|
35
43
|
**/
|
|
@@ -64,6 +72,6 @@ function getPackageJson(packagePath, relativePath) {
|
|
|
64
72
|
return JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
65
73
|
}
|
|
66
74
|
//#endregion
|
|
67
|
-
export { pkg_utils_exports };
|
|
75
|
+
export { getLatest, getLatestVersion, getPackageJson, mergeVersions, pkg_utils_exports, semverSanitize, semverSort };
|
|
68
76
|
|
|
69
77
|
//# sourceMappingURL=pkg-utils.mjs.map
|
package/build/pkg-utils.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkg-utils.mjs","names":[],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport semver from 'semver';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DIST_TAGS } from './constants';\n\n/**\n * Function filters out bad semver versions and sorts the array.\n * @return {Array} sorted Array\n */\nexport function semverSort(listVersions: string[]): string[] {\n return listVersions\n .filter(function (x): boolean {\n if (!semver.parse(x, true)) {\n return false;\n }\n return true;\n })\n .sort(semver.compareLoose)\n .map(String);\n}\n\n/**\n * Sanitize a version string to a valid semver version.\n * @param version - The version string to sanitize.\n * @returns The sanitized version string.\n */\nexport function semverSanitize(version: string): string {\n return (\n semver.valid(version) || semver.coerce(version, { includePrerelease: true })?.version || ''\n );\n}\n\n/**\n * Get the latest publihsed version of a package.\n * @param package metadata\n **/\nexport function getLatest(pkg: Manifest): string {\n const listVersions: string[] = Object.keys(pkg.versions);\n if (listVersions.length < 1) {\n throw Error('cannot get lastest version of none');\n }\n\n const versions: string[] = semverSort(listVersions);\n const latest: string | undefined = pkg[DIST_TAGS]?.latest ? pkg[DIST_TAGS].latest : versions[0];\n\n return latest;\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 {*} upstream\n * @param {*} config sds\n * @deprecated use @verdaccio/storage mergeVersions method\n */\n// @deprecated\nexport function mergeVersions(local: Manifest, upstream: Manifest) {\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 upstream.versions) {\n if (typeof local.versions[i] === 'undefined') {\n local.versions[i] = upstream.versions[i];\n }\n }\n\n for (const i in upstream[DIST_TAGS]) {\n if (local[DIST_TAGS][i] !== upstream[DIST_TAGS][i]) {\n if (!local[DIST_TAGS][i] || semver.lte(local[DIST_TAGS][i], upstream[DIST_TAGS][i])) {\n local[DIST_TAGS][i] = upstream[DIST_TAGS][i];\n }\n if (i === 'latest' && local[DIST_TAGS][i] === upstream[DIST_TAGS][i]) {\n // if remote has more fresh package, we should borrow its readme\n local.readme = upstream.readme;\n }\n }\n }\n}\n\n/**\n * Get package informations from package.json\n * @param packagePath - The path to the package.json file.\n * @returns The package.json content\n */\nexport function getPackageJson(packagePath: string, relativePath: string): Record<string, unknown> {\n const packageJsonPath = path.join(packagePath, relativePath, 'package.json');\n return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"pkg-utils.mjs","names":[],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport semver from 'semver';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DIST_TAGS } from './constants';\n\n/**\n * Function filters out bad semver versions and sorts the array.\n * @return {Array} sorted Array\n */\nexport function semverSort(listVersions: string[]): string[] {\n return listVersions\n .filter(function (x): boolean {\n if (!semver.parse(x, true)) {\n return false;\n }\n return true;\n })\n .sort(semver.compareLoose)\n .map(String);\n}\n\n/**\n * Sanitize a version string to a valid semver version.\n * @param version - The version string to sanitize.\n * @returns The sanitized version string.\n */\nexport function semverSanitize(version: string): string {\n return (\n semver.valid(version) || semver.coerce(version, { includePrerelease: true })?.version || ''\n );\n}\n\n/**\n * Get the version tagged as latest in the dist-tags of a package.\n * @param package metadata\n **/\nexport function getLatestVersion(pkgInfo: Manifest): string {\n return pkgInfo[DIST_TAGS].latest;\n}\n\n/**\n * Get the latest publihsed version of a package.\n * @param package metadata\n **/\nexport function getLatest(pkg: Manifest): string {\n const listVersions: string[] = Object.keys(pkg.versions);\n if (listVersions.length < 1) {\n throw Error('cannot get lastest version of none');\n }\n\n const versions: string[] = semverSort(listVersions);\n const latest: string | undefined = pkg[DIST_TAGS]?.latest ? pkg[DIST_TAGS].latest : versions[0];\n\n return latest;\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 {*} upstream\n * @param {*} config sds\n * @deprecated use @verdaccio/storage mergeVersions method\n */\n// @deprecated\nexport function mergeVersions(local: Manifest, upstream: Manifest) {\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 upstream.versions) {\n if (typeof local.versions[i] === 'undefined') {\n local.versions[i] = upstream.versions[i];\n }\n }\n\n for (const i in upstream[DIST_TAGS]) {\n if (local[DIST_TAGS][i] !== upstream[DIST_TAGS][i]) {\n if (!local[DIST_TAGS][i] || semver.lte(local[DIST_TAGS][i], upstream[DIST_TAGS][i])) {\n local[DIST_TAGS][i] = upstream[DIST_TAGS][i];\n }\n if (i === 'latest' && local[DIST_TAGS][i] === upstream[DIST_TAGS][i]) {\n // if remote has more fresh package, we should borrow its readme\n local.readme = upstream.readme;\n }\n }\n }\n}\n\n/**\n * Get package informations from package.json\n * @param packagePath - The path to the package.json file.\n * @returns The package.json content\n */\nexport function getPackageJson(packagePath: string, relativePath: string): Record<string, unknown> {\n const packageJsonPath = path.join(packagePath, relativePath, 'package.json');\n return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAYA,SAAgB,WAAW,cAAkC;CAC3D,OAAO,aACJ,OAAO,SAAU,GAAY;EAC5B,IAAI,CAAC,OAAO,MAAM,GAAG,IAAI,GACvB,OAAO;EAET,OAAO;CACT,CAAC,CAAC,CACD,KAAK,OAAO,YAAY,CAAC,CACzB,IAAI,MAAM;AACf;;;;;;AAOA,SAAgB,eAAe,SAAyB;CACtD,OACE,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,SAAS,EAAE,mBAAmB,KAAK,CAAC,CAAC,EAAE,WAAW;AAE7F;;;;;AAMA,SAAgB,iBAAiB,SAA2B;CAC1D,OAAO,QAAQ,UAAU,CAAC;AAC5B;;;;;AAMA,SAAgB,UAAU,KAAuB;CAC/C,MAAM,eAAyB,OAAO,KAAK,IAAI,QAAQ;CACvD,IAAI,aAAa,SAAS,GACxB,MAAM,MAAM,oCAAoC;CAGlD,MAAM,WAAqB,WAAW,YAAY;CAGlD,OAFmC,IAAA,YAAc,EAAE,SAAS,IAAI,UAAU,CAAC,SAAS,SAAS;AAG/F;;;;;;;;;AAWA,SAAgB,cAAc,OAAiB,UAAoB;CAGjE,KAAK,MAAM,KAAK,SAAS,UACvB,IAAI,OAAO,MAAM,SAAS,OAAO,aAC/B,MAAM,SAAS,KAAK,SAAS,SAAS;CAI1C,KAAK,MAAM,KAAK,SAAS,YACvB,IAAI,MAAA,YAAgB,CAAC,OAAO,SAAA,YAAmB,CAAC,IAAI;EAClD,IAAI,CAAC,MAAA,YAAgB,CAAC,MAAM,OAAO,IAAI,MAAA,YAAgB,CAAC,IAAI,SAAA,YAAmB,CAAC,EAAE,GAChF,MAAM,UAAU,CAAC,KAAK,SAAS,UAAU,CAAC;EAE5C,IAAI,MAAM,YAAY,MAAA,YAAgB,CAAC,OAAO,SAAA,YAAmB,CAAC,IAEhE,MAAM,SAAS,SAAS;CAE5B;AAEJ;;;;;;AAOA,SAAgB,eAAe,aAAqB,cAA+C;CACjG,MAAM,kBAAkB,KAAK,KAAK,aAAa,cAAc,cAAc;CAC3E,OAAO,KAAK,MAAM,GAAG,aAAa,iBAAiB,MAAM,CAAC;AAC5D"}
|
package/build/plugin-utils.js
CHANGED
package/build/plugin-utils.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-manifest.js","names":[],"sources":["../../src/schemes/publish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\n// FIXME: this could extend from @verdaccio/types but we need\n// schemas from @verdaccio/types to be able to validate them\ninterface Manifest {\n name: string;\n versions: object;\n _attachments: object;\n}\n\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', maxProperties: 1 },\n _attachments: { type: 'object', maxProperties: 1 },\n },\n required: ['name', 'versions', '_attachments'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validatePublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;;;AAyBA,IAAM,WAAW,IAtBD,IAAA,QAsBC,
|
|
1
|
+
{"version":3,"file":"publish-manifest.js","names":[],"sources":["../../src/schemes/publish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\n// FIXME: this could extend from @verdaccio/types but we need\n// schemas from @verdaccio/types to be able to validate them\ninterface Manifest {\n name: string;\n versions: object;\n _attachments: object;\n}\n\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', maxProperties: 1 },\n _attachments: { type: 'object', maxProperties: 1 },\n },\n required: ['name', 'versions', '_attachments'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validatePublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;;;AAyBA,IAAM,WAAW,IAtBD,IAAA,QAsBC,CAAA,CAAI,QAAQ;CAX3B,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,SAAS;EACvB,UAAU;GAAE,MAAM;GAAU,eAAe;EAAE;EAC7C,cAAc;GAAE,MAAM;GAAU,eAAe;EAAE;CACnD;CACA,UAAU;EAAC;EAAQ;EAAY;CAAc;CAC7C,sBAAsB;AAIK,CAAM;;;;;;;AAQnC,SAAgB,6BAA6B,UAAe;CAC1D,IAAI,CAAC,UACH,OAAO;CAET,OAAO,SAAS,QAAQ;AAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-manifest.mjs","names":[],"sources":["../../src/schemes/publish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\n// FIXME: this could extend from @verdaccio/types but we need\n// schemas from @verdaccio/types to be able to validate them\ninterface Manifest {\n name: string;\n versions: object;\n _attachments: object;\n}\n\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', maxProperties: 1 },\n _attachments: { type: 'object', maxProperties: 1 },\n },\n required: ['name', 'versions', '_attachments'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validatePublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;AAyBA,IAAM,WAAW,IAtBD,IAsBC,
|
|
1
|
+
{"version":3,"file":"publish-manifest.mjs","names":[],"sources":["../../src/schemes/publish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\n// FIXME: this could extend from @verdaccio/types but we need\n// schemas from @verdaccio/types to be able to validate them\ninterface Manifest {\n name: string;\n versions: object;\n _attachments: object;\n}\n\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', maxProperties: 1 },\n _attachments: { type: 'object', maxProperties: 1 },\n },\n required: ['name', 'versions', '_attachments'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validatePublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;AAyBA,IAAM,WAAW,IAtBD,IAsBC,CAAA,CAAI,QAAQ;CAX3B,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,SAAS;EACvB,UAAU;GAAE,MAAM;GAAU,eAAe;EAAE;EAC7C,cAAc;GAAE,MAAM;GAAU,eAAe;EAAE;CACnD;CACA,UAAU;EAAC;EAAQ;EAAY;CAAc;CAC7C,sBAAsB;AAIK,CAAM;;;;;;;AAQnC,SAAgB,6BAA6B,UAAe;CAC1D,IAAI,CAAC,UACH,OAAO;CAET,OAAO,SAAS,QAAQ;AAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpublish-manifest.js","names":[],"sources":["../../src/schemes/unpublish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\ninterface Manifest {\n name: string;\n versions: Record<string, unknown>;\n _rev: string;\n _id: string;\n time: {\n created: string;\n modified: string;\n [key: string]: string; // Allows pattern properties such as version numbers\n };\n readme: string;\n 'dist-tags': {\n latest: string;\n [key: string]: unknown; // Allows additional properties\n };\n}\n\n// @ts-ignore\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', minProperties: 1 },\n _rev: { type: 'string' },\n _id: { type: 'string' },\n time: {\n type: 'object',\n properties: {\n created: { type: 'string' },\n modified: { type: 'string' },\n },\n patternProperties: {\n '^[0-9]+\\\\.[0-9]+\\\\.[0-9]+-\\\\d+$': { type: 'string' },\n },\n additionalProperties: true,\n },\n readme: { type: 'string' },\n 'dist-tags': {\n type: 'object',\n properties: {\n latest: { type: 'string' },\n },\n required: ['latest'],\n additionalProperties: true,\n },\n },\n required: ['name', 'versions', 'dist-tags', '_rev', '_id', 'readme', 'time'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validateUnPublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;;;AAwDA,IAAM,WAAW,IArDD,IAAA,QAqDC,
|
|
1
|
+
{"version":3,"file":"unpublish-manifest.js","names":[],"sources":["../../src/schemes/unpublish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\ninterface Manifest {\n name: string;\n versions: Record<string, unknown>;\n _rev: string;\n _id: string;\n time: {\n created: string;\n modified: string;\n [key: string]: string; // Allows pattern properties such as version numbers\n };\n readme: string;\n 'dist-tags': {\n latest: string;\n [key: string]: unknown; // Allows additional properties\n };\n}\n\n// @ts-ignore\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', minProperties: 1 },\n _rev: { type: 'string' },\n _id: { type: 'string' },\n time: {\n type: 'object',\n properties: {\n created: { type: 'string' },\n modified: { type: 'string' },\n },\n patternProperties: {\n '^[0-9]+\\\\.[0-9]+\\\\.[0-9]+-\\\\d+$': { type: 'string' },\n },\n additionalProperties: true,\n },\n readme: { type: 'string' },\n 'dist-tags': {\n type: 'object',\n properties: {\n latest: { type: 'string' },\n },\n required: ['latest'],\n additionalProperties: true,\n },\n },\n required: ['name', 'versions', 'dist-tags', '_rev', '_id', 'readme', 'time'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validateUnPublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;;;AAwDA,IAAM,WAAW,IArDD,IAAA,QAqDC,CAAA,CAAI,QAAQ;CAhC3B,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,SAAS;EACvB,UAAU;GAAE,MAAM;GAAU,eAAe;EAAE;EAC7C,MAAM,EAAE,MAAM,SAAS;EACvB,KAAK,EAAE,MAAM,SAAS;EACtB,MAAM;GACJ,MAAM;GACN,YAAY;IACV,SAAS,EAAE,MAAM,SAAS;IAC1B,UAAU,EAAE,MAAM,SAAS;GAC7B;GACA,mBAAmB,EACjB,mCAAmC,EAAE,MAAM,SAAS,EACtD;GACA,sBAAsB;EACxB;EACA,QAAQ,EAAE,MAAM,SAAS;EACzB,aAAa;GACX,MAAM;GACN,YAAY,EACV,QAAQ,EAAE,MAAM,SAAS,EAC3B;GACA,UAAU,CAAC,QAAQ;GACnB,sBAAsB;EACxB;CACF;CACA,UAAU;EAAC;EAAQ;EAAY;EAAa;EAAQ;EAAO;EAAU;CAAM;CAC3E,sBAAsB;AAIK,CAAM;;;;;;;AAQnC,SAAgB,+BAA+B,UAAe;CAC5D,IAAI,CAAC,UACH,OAAO;CAET,OAAO,SAAS,QAAQ;AAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpublish-manifest.mjs","names":[],"sources":["../../src/schemes/unpublish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\ninterface Manifest {\n name: string;\n versions: Record<string, unknown>;\n _rev: string;\n _id: string;\n time: {\n created: string;\n modified: string;\n [key: string]: string; // Allows pattern properties such as version numbers\n };\n readme: string;\n 'dist-tags': {\n latest: string;\n [key: string]: unknown; // Allows additional properties\n };\n}\n\n// @ts-ignore\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', minProperties: 1 },\n _rev: { type: 'string' },\n _id: { type: 'string' },\n time: {\n type: 'object',\n properties: {\n created: { type: 'string' },\n modified: { type: 'string' },\n },\n patternProperties: {\n '^[0-9]+\\\\.[0-9]+\\\\.[0-9]+-\\\\d+$': { type: 'string' },\n },\n additionalProperties: true,\n },\n readme: { type: 'string' },\n 'dist-tags': {\n type: 'object',\n properties: {\n latest: { type: 'string' },\n },\n required: ['latest'],\n additionalProperties: true,\n },\n },\n required: ['name', 'versions', 'dist-tags', '_rev', '_id', 'readme', 'time'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validateUnPublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;AAwDA,IAAM,WAAW,IArDD,IAqDC,
|
|
1
|
+
{"version":3,"file":"unpublish-manifest.mjs","names":[],"sources":["../../src/schemes/unpublish-manifest.ts"],"sourcesContent":["import type { JSONSchemaType } from 'ajv';\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv();\n\ninterface Manifest {\n name: string;\n versions: Record<string, unknown>;\n _rev: string;\n _id: string;\n time: {\n created: string;\n modified: string;\n [key: string]: string; // Allows pattern properties such as version numbers\n };\n readme: string;\n 'dist-tags': {\n latest: string;\n [key: string]: unknown; // Allows additional properties\n };\n}\n\n// @ts-ignore\nconst schema: JSONSchemaType<Manifest> = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n versions: { type: 'object', minProperties: 1 },\n _rev: { type: 'string' },\n _id: { type: 'string' },\n time: {\n type: 'object',\n properties: {\n created: { type: 'string' },\n modified: { type: 'string' },\n },\n patternProperties: {\n '^[0-9]+\\\\.[0-9]+\\\\.[0-9]+-\\\\d+$': { type: 'string' },\n },\n additionalProperties: true,\n },\n readme: { type: 'string' },\n 'dist-tags': {\n type: 'object',\n properties: {\n latest: { type: 'string' },\n },\n required: ['latest'],\n additionalProperties: true,\n },\n },\n required: ['name', 'versions', 'dist-tags', '_rev', '_id', 'readme', 'time'],\n additionalProperties: true,\n};\n\n// validate is a type guard for MyData - type is inferred from schema type\nconst validate = ajv.compile(schema);\n\n/**\n * Validate if a manifest has the correct structure when a new package\n * is being created. The properties name, versions and _attachments must contain 1 element.\n * @param data a manifest object\n * @returns boolean\n */\nexport function validateUnPublishSingleVersion(manifest: any) {\n if (!manifest) {\n return false;\n }\n return validate(manifest);\n}\n"],"mappings":";;AAwDA,IAAM,WAAW,IArDD,IAqDC,CAAA,CAAI,QAAQ;CAhC3B,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,SAAS;EACvB,UAAU;GAAE,MAAM;GAAU,eAAe;EAAE;EAC7C,MAAM,EAAE,MAAM,SAAS;EACvB,KAAK,EAAE,MAAM,SAAS;EACtB,MAAM;GACJ,MAAM;GACN,YAAY;IACV,SAAS,EAAE,MAAM,SAAS;IAC1B,UAAU,EAAE,MAAM,SAAS;GAC7B;GACA,mBAAmB,EACjB,mCAAmC,EAAE,MAAM,SAAS,EACtD;GACA,sBAAsB;EACxB;EACA,QAAQ,EAAE,MAAM,SAAS;EACzB,aAAa;GACX,MAAM;GACN,YAAY,EACV,QAAQ,EAAE,MAAM,SAAS,EAC3B;GACA,UAAU,CAAC,QAAQ;GACnB,sBAAsB;EACxB;CACF;CACA,UAAU;EAAC;EAAQ;EAAY;EAAa;EAAQ;EAAO;EAAU;CAAM;CAC3E,sBAAsB;AAIK,CAAM;;;;;;;AAQnC,SAAgB,+BAA+B,UAAe;CAC5D,IAAI,CAAC,UACH,OAAO;CAET,OAAO,SAAS,QAAQ;AAC1B"}
|
package/build/search-utils.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
var search_utils_exports = /* @__PURE__ */ require("./_virtual/_rolldown/runtime.js").__exportAll({ UNSCOPED: () => UNSCOPED });
|
|
3
3
|
var UNSCOPED = "unscoped";
|
|
4
4
|
//#endregion
|
|
5
|
+
exports.UNSCOPED = UNSCOPED;
|
|
5
6
|
Object.defineProperty(exports, "search_utils_exports", {
|
|
6
7
|
enumerable: true,
|
|
7
8
|
get: function() {
|
package/build/search-utils.mjs
CHANGED
|
@@ -3,6 +3,6 @@ import { __exportAll } from "./_virtual/_rolldown/runtime.mjs";
|
|
|
3
3
|
var search_utils_exports = /* @__PURE__ */ __exportAll({ UNSCOPED: () => UNSCOPED });
|
|
4
4
|
var UNSCOPED = "unscoped";
|
|
5
5
|
//#endregion
|
|
6
|
-
export { search_utils_exports };
|
|
6
|
+
export { UNSCOPED, search_utils_exports };
|
|
7
7
|
|
|
8
8
|
//# sourceMappingURL=search-utils.mjs.map
|
package/build/stream-utils.js
CHANGED
|
@@ -25,11 +25,13 @@ var transformObjectToString = () => {
|
|
|
25
25
|
});
|
|
26
26
|
};
|
|
27
27
|
//#endregion
|
|
28
|
+
exports.readableToString = readableToString;
|
|
28
29
|
Object.defineProperty(exports, "stream_utils_exports", {
|
|
29
30
|
enumerable: true,
|
|
30
31
|
get: function() {
|
|
31
32
|
return stream_utils_exports;
|
|
32
33
|
}
|
|
33
34
|
});
|
|
35
|
+
exports.transformObjectToString = transformObjectToString;
|
|
34
36
|
|
|
35
37
|
//# sourceMappingURL=stream-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-utils.js","names":[],"sources":["../src/stream-utils.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport { Transform } from 'node:stream';\n\n/**\n * Converts a buffer stream to a string.\n */\nconst readableToString = async (stream: Readable) => {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.from(chunk));\n }\n const buffer = Buffer.concat(chunks);\n const str = buffer.toString('utf-8');\n return str;\n};\n\n/**\n * Transform stream object mode to string\n **/\nconst transformObjectToString = () => {\n return new Transform({\n objectMode: true,\n transform: (chunk, encoding, callback) => {\n callback(null, JSON.stringify(chunk));\n },\n });\n};\n\nexport { readableToString, transformObjectToString };\n"],"mappings":";;;;;;;;;;AAMA,IAAM,mBAAmB,OAAO,WAAqB;CACnD,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QACxB,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC;CAIhC,OAFe,OAAO,OAAO,MACjB,
|
|
1
|
+
{"version":3,"file":"stream-utils.js","names":[],"sources":["../src/stream-utils.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport { Transform } from 'node:stream';\n\n/**\n * Converts a buffer stream to a string.\n */\nconst readableToString = async (stream: Readable) => {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.from(chunk));\n }\n const buffer = Buffer.concat(chunks);\n const str = buffer.toString('utf-8');\n return str;\n};\n\n/**\n * Transform stream object mode to string\n **/\nconst transformObjectToString = () => {\n return new Transform({\n objectMode: true,\n transform: (chunk, encoding, callback) => {\n callback(null, JSON.stringify(chunk));\n },\n });\n};\n\nexport { readableToString, transformObjectToString };\n"],"mappings":";;;;;;;;;;AAMA,IAAM,mBAAmB,OAAO,WAAqB;CACnD,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QACxB,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC;CAIhC,OAFe,OAAO,OAAO,MACjB,CAAA,CAAO,SAAS,OACrB;AACT;;;;AAKA,IAAM,gCAAgC;CACpC,OAAO,IAAI,YAAA,UAAU;EACnB,YAAY;EACZ,YAAY,OAAO,UAAU,aAAa;GACxC,SAAS,MAAM,KAAK,UAAU,KAAK,CAAC;EACtC;CACF,CAAC;AACH"}
|
package/build/stream-utils.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-utils.mjs","names":[],"sources":["../src/stream-utils.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport { Transform } from 'node:stream';\n\n/**\n * Converts a buffer stream to a string.\n */\nconst readableToString = async (stream: Readable) => {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.from(chunk));\n }\n const buffer = Buffer.concat(chunks);\n const str = buffer.toString('utf-8');\n return str;\n};\n\n/**\n * Transform stream object mode to string\n **/\nconst transformObjectToString = () => {\n return new Transform({\n objectMode: true,\n transform: (chunk, encoding, callback) => {\n callback(null, JSON.stringify(chunk));\n },\n });\n};\n\nexport { readableToString, transformObjectToString };\n"],"mappings":";;;;;;;;;;AAMA,IAAM,mBAAmB,OAAO,WAAqB;CACnD,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QACxB,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC;CAIhC,OAFe,OAAO,OAAO,MACjB,
|
|
1
|
+
{"version":3,"file":"stream-utils.mjs","names":[],"sources":["../src/stream-utils.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport { Transform } from 'node:stream';\n\n/**\n * Converts a buffer stream to a string.\n */\nconst readableToString = async (stream: Readable) => {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.from(chunk));\n }\n const buffer = Buffer.concat(chunks);\n const str = buffer.toString('utf-8');\n return str;\n};\n\n/**\n * Transform stream object mode to string\n **/\nconst transformObjectToString = () => {\n return new Transform({\n objectMode: true,\n transform: (chunk, encoding, callback) => {\n callback(null, JSON.stringify(chunk));\n },\n });\n};\n\nexport { readableToString, transformObjectToString };\n"],"mappings":";;;;;;;;;;AAMA,IAAM,mBAAmB,OAAO,WAAqB;CACnD,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QACxB,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC;CAIhC,OAFe,OAAO,OAAO,MACjB,CAAA,CAAO,SAAS,OACrB;AACT;;;;AAKA,IAAM,gCAAgC;CACpC,OAAO,IAAI,UAAU;EACnB,YAAY;EACZ,YAAY,OAAO,UAAU,aAAa;GACxC,SAAS,MAAM,KAAK,UAAU,KAAK,CAAC;EACtC;CACF,CAAC;AACH"}
|
package/build/string-utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-utils.js","names":[],"sources":["../src/string-utils.ts"],"sourcesContent":["/**\n * Quality values, or q-values and q-factors, are used to describe the order\n * of priority of values in a comma-separated list.\n * It is a special syntax allowed in some HTTP headers and in HTML.\n * https://developer.mozilla.org/en-US/docs/Glossary/Quality_values\n * @param headerValue\n */\nexport function getByQualityPriorityValue(headerValue: string | undefined | null): string {\n if (typeof headerValue !== 'string') {\n return '';\n }\n\n const split = headerValue.split(',');\n\n if (split.length <= 1) {\n const qList = split[0].split(';');\n return qList[0];\n }\n\n const [header] = split\n .reduce((acc, item: string) => {\n const qList = item.split(';');\n if (qList.length > 1) {\n const [accept, q] = qList;\n const [, query] = q.split('=');\n acc.push([accept.trim(), query ? query : 0]);\n } else {\n acc.push([qList[0], 0]);\n }\n return acc;\n }, [] as any)\n .sort(function (a: number[], b: number[]) {\n return b[1] - a[1];\n });\n return header[0];\n}\n"],"mappings":";;;;;;;;;AAOA,SAAgB,0BAA0B,aAAgD;CACxF,IAAI,OAAO,gBAAgB,UACzB,OAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,GAAG;CAEnC,IAAI,MAAM,UAAU,GAElB,OADc,MAAM,
|
|
1
|
+
{"version":3,"file":"string-utils.js","names":[],"sources":["../src/string-utils.ts"],"sourcesContent":["/**\n * Quality values, or q-values and q-factors, are used to describe the order\n * of priority of values in a comma-separated list.\n * It is a special syntax allowed in some HTTP headers and in HTML.\n * https://developer.mozilla.org/en-US/docs/Glossary/Quality_values\n * @param headerValue\n */\nexport function getByQualityPriorityValue(headerValue: string | undefined | null): string {\n if (typeof headerValue !== 'string') {\n return '';\n }\n\n const split = headerValue.split(',');\n\n if (split.length <= 1) {\n const qList = split[0].split(';');\n return qList[0];\n }\n\n const [header] = split\n .reduce((acc, item: string) => {\n const qList = item.split(';');\n if (qList.length > 1) {\n const [accept, q] = qList;\n const [, query] = q.split('=');\n acc.push([accept.trim(), query ? query : 0]);\n } else {\n acc.push([qList[0], 0]);\n }\n return acc;\n }, [] as any)\n .sort(function (a: number[], b: number[]) {\n return b[1] - a[1];\n });\n return header[0];\n}\n"],"mappings":";;;;;;;;;AAOA,SAAgB,0BAA0B,aAAgD;CACxF,IAAI,OAAO,gBAAgB,UACzB,OAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,GAAG;CAEnC,IAAI,MAAM,UAAU,GAElB,OADc,MAAM,EAAE,CAAC,MAAM,GACtB,CAAA,CAAM;CAGf,MAAM,CAAC,UAAU,MACd,QAAQ,KAAK,SAAiB;EAC7B,MAAM,QAAQ,KAAK,MAAM,GAAG;EAC5B,IAAI,MAAM,SAAS,GAAG;GACpB,MAAM,CAAC,QAAQ,KAAK;GACpB,MAAM,GAAG,SAAS,EAAE,MAAM,GAAG;GAC7B,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,QAAQ,QAAQ,CAAC,CAAC;EAC7C,OACE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;EAExB,OAAO;CACT,GAAG,CAAC,CAAQ,CAAC,CACZ,KAAK,SAAU,GAAa,GAAa;EACxC,OAAO,EAAE,KAAK,EAAE;CAClB,CAAC;CACH,OAAO,OAAO;AAChB"}
|
package/build/string-utils.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-utils.mjs","names":[],"sources":["../src/string-utils.ts"],"sourcesContent":["/**\n * Quality values, or q-values and q-factors, are used to describe the order\n * of priority of values in a comma-separated list.\n * It is a special syntax allowed in some HTTP headers and in HTML.\n * https://developer.mozilla.org/en-US/docs/Glossary/Quality_values\n * @param headerValue\n */\nexport function getByQualityPriorityValue(headerValue: string | undefined | null): string {\n if (typeof headerValue !== 'string') {\n return '';\n }\n\n const split = headerValue.split(',');\n\n if (split.length <= 1) {\n const qList = split[0].split(';');\n return qList[0];\n }\n\n const [header] = split\n .reduce((acc, item: string) => {\n const qList = item.split(';');\n if (qList.length > 1) {\n const [accept, q] = qList;\n const [, query] = q.split('=');\n acc.push([accept.trim(), query ? query : 0]);\n } else {\n acc.push([qList[0], 0]);\n }\n return acc;\n }, [] as any)\n .sort(function (a: number[], b: number[]) {\n return b[1] - a[1];\n });\n return header[0];\n}\n"],"mappings":";;;;;;;;;;AAOA,SAAgB,0BAA0B,aAAgD;CACxF,IAAI,OAAO,gBAAgB,UACzB,OAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,GAAG;CAEnC,IAAI,MAAM,UAAU,GAElB,OADc,MAAM,
|
|
1
|
+
{"version":3,"file":"string-utils.mjs","names":[],"sources":["../src/string-utils.ts"],"sourcesContent":["/**\n * Quality values, or q-values and q-factors, are used to describe the order\n * of priority of values in a comma-separated list.\n * It is a special syntax allowed in some HTTP headers and in HTML.\n * https://developer.mozilla.org/en-US/docs/Glossary/Quality_values\n * @param headerValue\n */\nexport function getByQualityPriorityValue(headerValue: string | undefined | null): string {\n if (typeof headerValue !== 'string') {\n return '';\n }\n\n const split = headerValue.split(',');\n\n if (split.length <= 1) {\n const qList = split[0].split(';');\n return qList[0];\n }\n\n const [header] = split\n .reduce((acc, item: string) => {\n const qList = item.split(';');\n if (qList.length > 1) {\n const [accept, q] = qList;\n const [, query] = q.split('=');\n acc.push([accept.trim(), query ? query : 0]);\n } else {\n acc.push([qList[0], 0]);\n }\n return acc;\n }, [] as any)\n .sort(function (a: number[], b: number[]) {\n return b[1] - a[1];\n });\n return header[0];\n}\n"],"mappings":";;;;;;;;;;AAOA,SAAgB,0BAA0B,aAAgD;CACxF,IAAI,OAAO,gBAAgB,UACzB,OAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,GAAG;CAEnC,IAAI,MAAM,UAAU,GAElB,OADc,MAAM,EAAE,CAAC,MAAM,GACtB,CAAA,CAAM;CAGf,MAAM,CAAC,UAAU,MACd,QAAQ,KAAK,SAAiB;EAC7B,MAAM,QAAQ,KAAK,MAAM,GAAG;EAC5B,IAAI,MAAM,SAAS,GAAG;GACpB,MAAM,CAAC,QAAQ,KAAK;GACpB,MAAM,GAAG,SAAS,EAAE,MAAM,GAAG;GAC7B,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,QAAQ,QAAQ,CAAC,CAAC;EAC7C,OACE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;EAExB,OAAO;CACT,GAAG,CAAC,CAAQ,CAAC,CACZ,KAAK,SAAU,GAAa,GAAa;EACxC,OAAO,EAAE,KAAK,EAAE;CAClB,CAAC;CACH,OAAO,OAAO;AAChB"}
|
package/build/tarball-utils.js
CHANGED
|
@@ -41,6 +41,9 @@ function composeTarballFromPackage(name, version) {
|
|
|
41
41
|
else return `${name}-${version}.tgz`;
|
|
42
42
|
}
|
|
43
43
|
//#endregion
|
|
44
|
+
exports.composeTarballFromPackage = composeTarballFromPackage;
|
|
45
|
+
exports.extractTarballFromUrl = extractTarballFromUrl;
|
|
46
|
+
exports.getVersionFromTarball = getVersionFromTarball;
|
|
44
47
|
Object.defineProperty(exports, "tarball_utils_exports", {
|
|
45
48
|
enumerable: true,
|
|
46
49
|
get: function() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tarball-utils.js","names":[],"sources":["../src/tarball-utils.ts"],"sourcesContent":["import { URL } from 'node:url';\n\n/**\n * Return package version from tarball name\n *\n * test-1.2.4.tgz -> 1.2.4\n * @param {String} fileName\n * @returns {String}\n */\nexport function getVersionFromTarball(fileName: string): string | void {\n const groups = fileName.replace(/\\.tgz$/, '').match(/^[^/]+-(\\d+\\.\\d+\\.\\d+.*)/);\n\n return groups !== null ? groups[1] : undefined;\n}\n\n/**\n * Extract the tarball name from a registry dist url\n *\n * https://registry.npmjs.org/test/-/test-0.0.2.tgz -> test-0.0.2.tgz\n * @param tarball tarball url\n * @returns tarball filename\n */\nexport function extractTarballFromUrl(url: string): string {\n const urlObject = new URL(url);\n return urlObject.pathname.replace(/^.*\\//, '');\n}\n\n/**\n * Build the tarball filename from paackage name and version\n *\n * test, 1.2.4 -> test-1.2.4.tgz\n * @scope/name, 1.2.4 -> name-1.2.4.tgz\n * @param name package name\n * @param version package version\n * @returns tarball filename\n */\nexport function composeTarballFromPackage(name: string, version: string): string {\n if (name.includes('/')) {\n return `${name.split('/')[1]}-${version}.tgz`;\n } else {\n return `${name}-${version}.tgz`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AASA,SAAgB,sBAAsB,UAAiC;CACrE,MAAM,SAAS,SAAS,QAAQ,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"tarball-utils.js","names":[],"sources":["../src/tarball-utils.ts"],"sourcesContent":["import { URL } from 'node:url';\n\n/**\n * Return package version from tarball name\n *\n * test-1.2.4.tgz -> 1.2.4\n * @param {String} fileName\n * @returns {String}\n */\nexport function getVersionFromTarball(fileName: string): string | void {\n const groups = fileName.replace(/\\.tgz$/, '').match(/^[^/]+-(\\d+\\.\\d+\\.\\d+.*)/);\n\n return groups !== null ? groups[1] : undefined;\n}\n\n/**\n * Extract the tarball name from a registry dist url\n *\n * https://registry.npmjs.org/test/-/test-0.0.2.tgz -> test-0.0.2.tgz\n * @param tarball tarball url\n * @returns tarball filename\n */\nexport function extractTarballFromUrl(url: string): string {\n const urlObject = new URL(url);\n return urlObject.pathname.replace(/^.*\\//, '');\n}\n\n/**\n * Build the tarball filename from paackage name and version\n *\n * test, 1.2.4 -> test-1.2.4.tgz\n * @scope/name, 1.2.4 -> name-1.2.4.tgz\n * @param name package name\n * @param version package version\n * @returns tarball filename\n */\nexport function composeTarballFromPackage(name: string, version: string): string {\n if (name.includes('/')) {\n return `${name.split('/')[1]}-${version}.tgz`;\n } else {\n return `${name}-${version}.tgz`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AASA,SAAgB,sBAAsB,UAAiC;CACrE,MAAM,SAAS,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAC,MAAM,0BAA0B;CAE9E,OAAO,WAAW,OAAO,OAAO,KAAK,KAAA;AACvC;;;;;;;;AASA,SAAgB,sBAAsB,KAAqB;CAEzD,OAAO,IADe,SAAA,IAAI,GACnB,CAAA,CAAU,SAAS,QAAQ,SAAS,EAAE;AAC/C;;;;;;;;;;AAWA,SAAgB,0BAA0B,MAAc,SAAyB;CAC/E,IAAI,KAAK,SAAS,GAAG,GACnB,OAAO,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,QAAQ;MAExC,OAAO,GAAG,KAAK,GAAG,QAAQ;AAE9B"}
|
package/build/tarball-utils.mjs
CHANGED
|
@@ -41,6 +41,6 @@ function composeTarballFromPackage(name, version) {
|
|
|
41
41
|
else return `${name}-${version}.tgz`;
|
|
42
42
|
}
|
|
43
43
|
//#endregion
|
|
44
|
-
export { tarball_utils_exports };
|
|
44
|
+
export { composeTarballFromPackage, extractTarballFromUrl, getVersionFromTarball, tarball_utils_exports };
|
|
45
45
|
|
|
46
46
|
//# sourceMappingURL=tarball-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tarball-utils.mjs","names":[],"sources":["../src/tarball-utils.ts"],"sourcesContent":["import { URL } from 'node:url';\n\n/**\n * Return package version from tarball name\n *\n * test-1.2.4.tgz -> 1.2.4\n * @param {String} fileName\n * @returns {String}\n */\nexport function getVersionFromTarball(fileName: string): string | void {\n const groups = fileName.replace(/\\.tgz$/, '').match(/^[^/]+-(\\d+\\.\\d+\\.\\d+.*)/);\n\n return groups !== null ? groups[1] : undefined;\n}\n\n/**\n * Extract the tarball name from a registry dist url\n *\n * https://registry.npmjs.org/test/-/test-0.0.2.tgz -> test-0.0.2.tgz\n * @param tarball tarball url\n * @returns tarball filename\n */\nexport function extractTarballFromUrl(url: string): string {\n const urlObject = new URL(url);\n return urlObject.pathname.replace(/^.*\\//, '');\n}\n\n/**\n * Build the tarball filename from paackage name and version\n *\n * test, 1.2.4 -> test-1.2.4.tgz\n * @scope/name, 1.2.4 -> name-1.2.4.tgz\n * @param name package name\n * @param version package version\n * @returns tarball filename\n */\nexport function composeTarballFromPackage(name: string, version: string): string {\n if (name.includes('/')) {\n return `${name.split('/')[1]}-${version}.tgz`;\n } else {\n return `${name}-${version}.tgz`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AASA,SAAgB,sBAAsB,UAAiC;CACrE,MAAM,SAAS,SAAS,QAAQ,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"tarball-utils.mjs","names":[],"sources":["../src/tarball-utils.ts"],"sourcesContent":["import { URL } from 'node:url';\n\n/**\n * Return package version from tarball name\n *\n * test-1.2.4.tgz -> 1.2.4\n * @param {String} fileName\n * @returns {String}\n */\nexport function getVersionFromTarball(fileName: string): string | void {\n const groups = fileName.replace(/\\.tgz$/, '').match(/^[^/]+-(\\d+\\.\\d+\\.\\d+.*)/);\n\n return groups !== null ? groups[1] : undefined;\n}\n\n/**\n * Extract the tarball name from a registry dist url\n *\n * https://registry.npmjs.org/test/-/test-0.0.2.tgz -> test-0.0.2.tgz\n * @param tarball tarball url\n * @returns tarball filename\n */\nexport function extractTarballFromUrl(url: string): string {\n const urlObject = new URL(url);\n return urlObject.pathname.replace(/^.*\\//, '');\n}\n\n/**\n * Build the tarball filename from paackage name and version\n *\n * test, 1.2.4 -> test-1.2.4.tgz\n * @scope/name, 1.2.4 -> name-1.2.4.tgz\n * @param name package name\n * @param version package version\n * @returns tarball filename\n */\nexport function composeTarballFromPackage(name: string, version: string): string {\n if (name.includes('/')) {\n return `${name.split('/')[1]}-${version}.tgz`;\n } else {\n return `${name}-${version}.tgz`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AASA,SAAgB,sBAAsB,UAAiC;CACrE,MAAM,SAAS,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAC,MAAM,0BAA0B;CAE9E,OAAO,WAAW,OAAO,OAAO,KAAK,KAAA;AACvC;;;;;;;;AASA,SAAgB,sBAAsB,KAAqB;CAEzD,OAAO,IADe,IAAI,GACnB,CAAA,CAAU,SAAS,QAAQ,SAAS,EAAE;AAC/C;;;;;;;;;;AAWA,SAAgB,0BAA0B,MAAc,SAAyB;CAC/E,IAAI,KAAK,SAAS,GAAG,GACnB,OAAO,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,QAAQ;MAExC,OAAO,GAAG,KAAK,GAAG,QAAQ;AAE9B"}
|
|
@@ -52,9 +52,10 @@ function validateName(name) {
|
|
|
52
52
|
* @return {Boolean} whether the package is valid or not
|
|
53
53
|
*/
|
|
54
54
|
function validatePackage(name) {
|
|
55
|
-
const nameList = name.split("/"
|
|
55
|
+
const nameList = name.split("/");
|
|
56
56
|
if (nameList.length === 1) return validateName(nameList[0]);
|
|
57
|
-
return nameList[0][0] === "@" && validateName(nameList[0].slice(1)) && validateName(nameList[1]);
|
|
57
|
+
else if (nameList.length === 2) return nameList[0][0] === "@" && validateName(nameList[0].slice(1)) && validateName(nameList[1]);
|
|
58
|
+
return false;
|
|
58
59
|
}
|
|
59
60
|
/**
|
|
60
61
|
* Validate the package metadata, add additional properties whether are missing within
|
|
@@ -87,6 +88,15 @@ function validateUserName(userName, expectedName) {
|
|
|
87
88
|
return typeof userName === "string" && userName.split(":")[0] === "org.couchdb.user" && userName.split(":")[1] === expectedName;
|
|
88
89
|
}
|
|
89
90
|
//#endregion
|
|
91
|
+
exports.isObject = isObject;
|
|
92
|
+
exports.isPackageNameScoped = isPackageNameScoped;
|
|
93
|
+
exports.normalizeMetadata = normalizeMetadata;
|
|
94
|
+
exports.validateName = validateName;
|
|
95
|
+
exports.validatePackage = validatePackage;
|
|
96
|
+
exports.validatePassword = validatePassword;
|
|
97
|
+
exports.validatePublishSingleVersion = require_publish_manifest.validatePublishSingleVersion;
|
|
98
|
+
exports.validateUnPublishSingleVersion = require_unpublish_manifest.validateUnPublishSingleVersion;
|
|
99
|
+
exports.validateUserName = validateUserName;
|
|
90
100
|
Object.defineProperty(exports, "validation_utils_exports", {
|
|
91
101
|
enumerable: true,
|
|
92
102
|
get: function() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-utils.js","names":[],"sources":["../src/validation-utils.ts"],"sourcesContent":["import assert from 'node:assert';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DEFAULT_PASSWORD_VALIDATION, DIST_TAGS, MAINTAINERS } from './constants';\n\nexport { validatePublishSingleVersion } from './schemes/publish-manifest';\nexport { validateUnPublishSingleVersion } from './schemes/unpublish-manifest';\n\nexport function isPackageNameScoped(name: string): boolean {\n return name.startsWith('@');\n}\n\n/**\n * From normalize-package-data/lib/fixer.js\n * @param {*} name the package name\n * @return {Boolean} whether is valid or not\n */\nexport function validateName(name: string): boolean {\n if (typeof name !== 'string') {\n return false;\n }\n\n let normalizedName: string = name.toLowerCase();\n\n const isScoped: boolean = isPackageNameScoped(name);\n const scopedName = name.split('/', 2)[1];\n\n if (isScoped && typeof scopedName !== 'undefined') {\n normalizedName = scopedName.toLowerCase();\n }\n\n /**\n * Some context about the first regex\n * - npm used to have a different tarball naming system.\n * eg: http://registry.npmjs.com/thirty-two\n * https://registry.npmjs.org/thirty-two/-/thirty-two@0.0.1.tgz\n * The file name thirty-two@0.0.1.tgz, the version and the pkg name was separated by an at (@)\n * while nowadays the naming system is based in dashes\n * https://registry.npmjs.org/verdaccio/-/verdaccio-1.4.0.tgz\n *\n * more info here: https://github.com/rlidwka/sinopia/issues/75\n */\n return !(\n !normalizedName.match(/^[-a-zA-Z0-9_.!~*'()@]+$/) ||\n normalizedName.startsWith('.') || // \".bin\", etc.\n ['node_modules', '__proto__', 'favicon.ico'].includes(normalizedName)\n );\n}\n\n/**\n * Validate a package.\n * @return {Boolean} whether the package is valid or not\n */\nexport function validatePackage(name: string): boolean {\n const nameList = name.split('/'
|
|
1
|
+
{"version":3,"file":"validation-utils.js","names":[],"sources":["../src/validation-utils.ts"],"sourcesContent":["import assert from 'node:assert';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DEFAULT_PASSWORD_VALIDATION, DIST_TAGS, MAINTAINERS } from './constants';\n\nexport { validatePublishSingleVersion } from './schemes/publish-manifest';\nexport { validateUnPublishSingleVersion } from './schemes/unpublish-manifest';\n\nexport function isPackageNameScoped(name: string): boolean {\n return name.startsWith('@');\n}\n\n/**\n * From normalize-package-data/lib/fixer.js\n * @param {*} name the package name\n * @return {Boolean} whether is valid or not\n */\nexport function validateName(name: string): boolean {\n if (typeof name !== 'string') {\n return false;\n }\n\n let normalizedName: string = name.toLowerCase();\n\n const isScoped: boolean = isPackageNameScoped(name);\n const scopedName = name.split('/', 2)[1];\n\n if (isScoped && typeof scopedName !== 'undefined') {\n normalizedName = scopedName.toLowerCase();\n }\n\n /**\n * Some context about the first regex\n * - npm used to have a different tarball naming system.\n * eg: http://registry.npmjs.com/thirty-two\n * https://registry.npmjs.org/thirty-two/-/thirty-two@0.0.1.tgz\n * The file name thirty-two@0.0.1.tgz, the version and the pkg name was separated by an at (@)\n * while nowadays the naming system is based in dashes\n * https://registry.npmjs.org/verdaccio/-/verdaccio-1.4.0.tgz\n *\n * more info here: https://github.com/rlidwka/sinopia/issues/75\n */\n return !(\n !normalizedName.match(/^[-a-zA-Z0-9_.!~*'()@]+$/) ||\n normalizedName.startsWith('.') || // \".bin\", etc.\n ['node_modules', '__proto__', 'favicon.ico'].includes(normalizedName)\n );\n}\n\n/**\n * Validate a package.\n * @return {Boolean} whether the package is valid or not\n */\nexport function validatePackage(name: string): boolean {\n // Split on every separator (no limit) so trailing or interior slashes are not\n // silently dropped, keeping a single canonical form per package name.\n const nameList = name.split('/');\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n } else if (nameList.length === 2) {\n // scoped package\n return (\n nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1])\n );\n }\n // anything with 3+ segments is never a valid package name\n return false;\n}\n\n/**\n * Validate the package metadata, add additional properties whether are missing within\n * the metadata properties.\n * @param {*} manifest\n * @param {*} name\n * @return {Object} the object with additional properties as dist-tags ad versions\n */\nexport function normalizeMetadata(manifest: Manifest, name: string): Manifest {\n assert.strictEqual(manifest.name, name);\n const _manifest = { ...manifest };\n\n if (!isObject(manifest[DIST_TAGS])) {\n _manifest[DIST_TAGS] = {};\n }\n\n if (!Array.isArray(manifest[MAINTAINERS])) {\n _manifest[MAINTAINERS] = [];\n }\n\n // This may not be needed\n if (!isObject(manifest['versions'])) {\n _manifest['versions'] = {};\n }\n\n if (!isObject(manifest['time'])) {\n _manifest['time'] = {};\n }\n\n return _manifest;\n}\n\n/**\n * Check whether an element is an Object\n * @param {*} obj the element\n * @return {Boolean}\n */\nexport function isObject(obj: any): boolean {\n // if (obj === null || typeof obj === 'undefined' || typeof obj === 'string') {\n // return false;\n // }\n\n // return (\n // (typeof obj === 'object' || typeof obj.prototype === 'undefined') &&\n // Array.isArray(obj) === false\n // );\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function validatePassword(\n password: string,\n validation: RegExp = DEFAULT_PASSWORD_VALIDATION\n): boolean {\n return typeof password === 'string' && validation instanceof RegExp\n ? password.match(validation) !== null\n : false;\n}\n\nexport function validateUserName(userName: any, expectedName: string): boolean {\n return (\n typeof userName === 'string' &&\n userName.split(':')[0] === 'org.couchdb.user' &&\n userName.split(':')[1] === expectedName\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AASA,SAAgB,oBAAoB,MAAuB;CACzD,OAAO,KAAK,WAAW,GAAG;AAC5B;;;;;;AAOA,SAAgB,aAAa,MAAuB;CAClD,IAAI,OAAO,SAAS,UAClB,OAAO;CAGT,IAAI,iBAAyB,KAAK,YAAY;CAE9C,MAAM,WAAoB,oBAAoB,IAAI;CAClD,MAAM,aAAa,KAAK,MAAM,KAAK,CAAC,CAAC,CAAC;CAEtC,IAAI,YAAY,OAAO,eAAe,aACpC,iBAAiB,WAAW,YAAY;;;;;;;;;;;;CAc1C,OAAO,EACL,CAAC,eAAe,MAAM,0BAA0B,KAChD,eAAe,WAAW,GAAG,KAC7B;EAAC;EAAgB;EAAa;CAAa,CAAC,CAAC,SAAS,cAAc;AAExE;;;;;AAMA,SAAgB,gBAAgB,MAAuB;CAGrD,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;MAC1B,IAAI,SAAS,WAAW,GAE7B,OACE,SAAS,EAAE,CAAC,OAAO,OAAO,aAAa,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;CAI5F,OAAO;AACT;;;;;;;;AASA,SAAgB,kBAAkB,UAAoB,MAAwB;CAC5E,YAAA,QAAO,YAAY,SAAS,MAAM,IAAI;CACtC,MAAM,YAAY,EAAE,GAAG,SAAS;CAEhC,IAAI,CAAC,SAAS,SAAA,YAAmB,GAC/B,UAAU,kBAAA,aAAa,CAAC;CAG1B,IAAI,CAAC,MAAM,QAAQ,SAAA,cAAqB,GACtC,UAAU,kBAAA,eAAe,CAAC;CAI5B,IAAI,CAAC,SAAS,SAAS,WAAW,GAChC,UAAU,cAAc,CAAC;CAG3B,IAAI,CAAC,SAAS,SAAS,OAAO,GAC5B,UAAU,UAAU,CAAC;CAGvB,OAAO;AACT;;;;;;AAOA,SAAgB,SAAS,KAAmB;CAS1C,OAAO,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AACjD;AAEA,SAAgB,iBACd,UACA,aAAqB,kBAAA,6BACZ;CACT,OAAO,OAAO,aAAa,YAAY,sBAAsB,SACzD,SAAS,MAAM,UAAU,MAAM,OAC/B;AACN;AAEA,SAAgB,iBAAiB,UAAe,cAA+B;CAC7E,OACE,OAAO,aAAa,YACpB,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO,sBAC3B,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO;AAE/B"}
|
|
@@ -51,9 +51,10 @@ function validateName(name) {
|
|
|
51
51
|
* @return {Boolean} whether the package is valid or not
|
|
52
52
|
*/
|
|
53
53
|
function validatePackage(name) {
|
|
54
|
-
const nameList = name.split("/"
|
|
54
|
+
const nameList = name.split("/");
|
|
55
55
|
if (nameList.length === 1) return validateName(nameList[0]);
|
|
56
|
-
return nameList[0][0] === "@" && validateName(nameList[0].slice(1)) && validateName(nameList[1]);
|
|
56
|
+
else if (nameList.length === 2) return nameList[0][0] === "@" && validateName(nameList[0].slice(1)) && validateName(nameList[1]);
|
|
57
|
+
return false;
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
59
60
|
* Validate the package metadata, add additional properties whether are missing within
|
|
@@ -86,6 +87,6 @@ function validateUserName(userName, expectedName) {
|
|
|
86
87
|
return typeof userName === "string" && userName.split(":")[0] === "org.couchdb.user" && userName.split(":")[1] === expectedName;
|
|
87
88
|
}
|
|
88
89
|
//#endregion
|
|
89
|
-
export { validation_utils_exports };
|
|
90
|
+
export { isObject, isPackageNameScoped, normalizeMetadata, validateName, validatePackage, validatePassword, validatePublishSingleVersion, validateUnPublishSingleVersion, validateUserName, validation_utils_exports };
|
|
90
91
|
|
|
91
92
|
//# sourceMappingURL=validation-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-utils.mjs","names":[],"sources":["../src/validation-utils.ts"],"sourcesContent":["import assert from 'node:assert';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DEFAULT_PASSWORD_VALIDATION, DIST_TAGS, MAINTAINERS } from './constants';\n\nexport { validatePublishSingleVersion } from './schemes/publish-manifest';\nexport { validateUnPublishSingleVersion } from './schemes/unpublish-manifest';\n\nexport function isPackageNameScoped(name: string): boolean {\n return name.startsWith('@');\n}\n\n/**\n * From normalize-package-data/lib/fixer.js\n * @param {*} name the package name\n * @return {Boolean} whether is valid or not\n */\nexport function validateName(name: string): boolean {\n if (typeof name !== 'string') {\n return false;\n }\n\n let normalizedName: string = name.toLowerCase();\n\n const isScoped: boolean = isPackageNameScoped(name);\n const scopedName = name.split('/', 2)[1];\n\n if (isScoped && typeof scopedName !== 'undefined') {\n normalizedName = scopedName.toLowerCase();\n }\n\n /**\n * Some context about the first regex\n * - npm used to have a different tarball naming system.\n * eg: http://registry.npmjs.com/thirty-two\n * https://registry.npmjs.org/thirty-two/-/thirty-two@0.0.1.tgz\n * The file name thirty-two@0.0.1.tgz, the version and the pkg name was separated by an at (@)\n * while nowadays the naming system is based in dashes\n * https://registry.npmjs.org/verdaccio/-/verdaccio-1.4.0.tgz\n *\n * more info here: https://github.com/rlidwka/sinopia/issues/75\n */\n return !(\n !normalizedName.match(/^[-a-zA-Z0-9_.!~*'()@]+$/) ||\n normalizedName.startsWith('.') || // \".bin\", etc.\n ['node_modules', '__proto__', 'favicon.ico'].includes(normalizedName)\n );\n}\n\n/**\n * Validate a package.\n * @return {Boolean} whether the package is valid or not\n */\nexport function validatePackage(name: string): boolean {\n const nameList = name.split('/'
|
|
1
|
+
{"version":3,"file":"validation-utils.mjs","names":[],"sources":["../src/validation-utils.ts"],"sourcesContent":["import assert from 'node:assert';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { DEFAULT_PASSWORD_VALIDATION, DIST_TAGS, MAINTAINERS } from './constants';\n\nexport { validatePublishSingleVersion } from './schemes/publish-manifest';\nexport { validateUnPublishSingleVersion } from './schemes/unpublish-manifest';\n\nexport function isPackageNameScoped(name: string): boolean {\n return name.startsWith('@');\n}\n\n/**\n * From normalize-package-data/lib/fixer.js\n * @param {*} name the package name\n * @return {Boolean} whether is valid or not\n */\nexport function validateName(name: string): boolean {\n if (typeof name !== 'string') {\n return false;\n }\n\n let normalizedName: string = name.toLowerCase();\n\n const isScoped: boolean = isPackageNameScoped(name);\n const scopedName = name.split('/', 2)[1];\n\n if (isScoped && typeof scopedName !== 'undefined') {\n normalizedName = scopedName.toLowerCase();\n }\n\n /**\n * Some context about the first regex\n * - npm used to have a different tarball naming system.\n * eg: http://registry.npmjs.com/thirty-two\n * https://registry.npmjs.org/thirty-two/-/thirty-two@0.0.1.tgz\n * The file name thirty-two@0.0.1.tgz, the version and the pkg name was separated by an at (@)\n * while nowadays the naming system is based in dashes\n * https://registry.npmjs.org/verdaccio/-/verdaccio-1.4.0.tgz\n *\n * more info here: https://github.com/rlidwka/sinopia/issues/75\n */\n return !(\n !normalizedName.match(/^[-a-zA-Z0-9_.!~*'()@]+$/) ||\n normalizedName.startsWith('.') || // \".bin\", etc.\n ['node_modules', '__proto__', 'favicon.ico'].includes(normalizedName)\n );\n}\n\n/**\n * Validate a package.\n * @return {Boolean} whether the package is valid or not\n */\nexport function validatePackage(name: string): boolean {\n // Split on every separator (no limit) so trailing or interior slashes are not\n // silently dropped, keeping a single canonical form per package name.\n const nameList = name.split('/');\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n } else if (nameList.length === 2) {\n // scoped package\n return (\n nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1])\n );\n }\n // anything with 3+ segments is never a valid package name\n return false;\n}\n\n/**\n * Validate the package metadata, add additional properties whether are missing within\n * the metadata properties.\n * @param {*} manifest\n * @param {*} name\n * @return {Object} the object with additional properties as dist-tags ad versions\n */\nexport function normalizeMetadata(manifest: Manifest, name: string): Manifest {\n assert.strictEqual(manifest.name, name);\n const _manifest = { ...manifest };\n\n if (!isObject(manifest[DIST_TAGS])) {\n _manifest[DIST_TAGS] = {};\n }\n\n if (!Array.isArray(manifest[MAINTAINERS])) {\n _manifest[MAINTAINERS] = [];\n }\n\n // This may not be needed\n if (!isObject(manifest['versions'])) {\n _manifest['versions'] = {};\n }\n\n if (!isObject(manifest['time'])) {\n _manifest['time'] = {};\n }\n\n return _manifest;\n}\n\n/**\n * Check whether an element is an Object\n * @param {*} obj the element\n * @return {Boolean}\n */\nexport function isObject(obj: any): boolean {\n // if (obj === null || typeof obj === 'undefined' || typeof obj === 'string') {\n // return false;\n // }\n\n // return (\n // (typeof obj === 'object' || typeof obj.prototype === 'undefined') &&\n // Array.isArray(obj) === false\n // );\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function validatePassword(\n password: string,\n validation: RegExp = DEFAULT_PASSWORD_VALIDATION\n): boolean {\n return typeof password === 'string' && validation instanceof RegExp\n ? password.match(validation) !== null\n : false;\n}\n\nexport function validateUserName(userName: any, expectedName: string): boolean {\n return (\n typeof userName === 'string' &&\n userName.split(':')[0] === 'org.couchdb.user' &&\n userName.split(':')[1] === expectedName\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AASA,SAAgB,oBAAoB,MAAuB;CACzD,OAAO,KAAK,WAAW,GAAG;AAC5B;;;;;;AAOA,SAAgB,aAAa,MAAuB;CAClD,IAAI,OAAO,SAAS,UAClB,OAAO;CAGT,IAAI,iBAAyB,KAAK,YAAY;CAE9C,MAAM,WAAoB,oBAAoB,IAAI;CAClD,MAAM,aAAa,KAAK,MAAM,KAAK,CAAC,CAAC,CAAC;CAEtC,IAAI,YAAY,OAAO,eAAe,aACpC,iBAAiB,WAAW,YAAY;;;;;;;;;;;;CAc1C,OAAO,EACL,CAAC,eAAe,MAAM,0BAA0B,KAChD,eAAe,WAAW,GAAG,KAC7B;EAAC;EAAgB;EAAa;CAAa,CAAC,CAAC,SAAS,cAAc;AAExE;;;;;AAMA,SAAgB,gBAAgB,MAAuB;CAGrD,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;MAC1B,IAAI,SAAS,WAAW,GAE7B,OACE,SAAS,EAAE,CAAC,OAAO,OAAO,aAAa,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;CAI5F,OAAO;AACT;;;;;;;;AASA,SAAgB,kBAAkB,UAAoB,MAAwB;CAC5E,OAAO,YAAY,SAAS,MAAM,IAAI;CACtC,MAAM,YAAY,EAAE,GAAG,SAAS;CAEhC,IAAI,CAAC,SAAS,SAAA,YAAmB,GAC/B,UAAU,aAAa,CAAC;CAG1B,IAAI,CAAC,MAAM,QAAQ,SAAA,cAAqB,GACtC,UAAU,eAAe,CAAC;CAI5B,IAAI,CAAC,SAAS,SAAS,WAAW,GAChC,UAAU,cAAc,CAAC;CAG3B,IAAI,CAAC,SAAS,SAAS,OAAO,GAC5B,UAAU,UAAU,CAAC;CAGvB,OAAO;AACT;;;;;;AAOA,SAAgB,SAAS,KAAmB;CAS1C,OAAO,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AACjD;AAEA,SAAgB,iBACd,UACA,aAAqB,6BACZ;CACT,OAAO,OAAO,aAAa,YAAY,sBAAsB,SACzD,SAAS,MAAM,UAAU,MAAM,OAC/B;AACN;AAEA,SAAgB,iBAAiB,UAAe,cAA+B;CAC7E,OACE,OAAO,aAAa,YACpB,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO,sBAC3B,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO;AAE/B"}
|
package/build/warning-utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warning-utils.js","names":[],"sources":["../src/warning-utils.ts"],"sourcesContent":["import warning from 'process-warning';\n\nconst warningInstance = warning();\nconst verdaccioWarning = 'VerdaccioWarning';\nconst verdaccioDeprecation = 'VerdaccioDeprecation';\n\nexport enum Codes {\n VERWAR001 = 'VERWAR001',\n VERWAR002 = 'VERWAR002',\n VERWAR003 = 'VERWAR003',\n VERWAR004 = 'VERWAR004',\n // deprecation warnings\n VERDEP003 = 'VERDEP003',\n VERDEP004 = 'VERDEP004',\n VERWAR006 = 'VERWAR006',\n VERWAR007 = 'VERWAR007',\n}\n\n/* general warnings */\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR001,\n `Verdaccio doesn't need superuser privileges. don't run it under root`\n);\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR002,\n `The configuration property \"logs\" has been deprecated, please rename to \"log\" for future compatibility`\n);\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR003,\n 'rotating-file type is not longer supported, consider use [logrotate] instead'\n);\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR004,\n `invalid address - %s, we expect a port (e.g. \"4873\"), \nhost:port (e.g. \"localhost:4873\") or full url '(e.g. \"http://localhost:4873/\")\nhttps://verdaccio.org/docs/en/configuration#listen-port`\n);\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERWAR006,\n 'the auth plugin method \"add_user\" in the auth plugin is deprecated and will be removed in next major release, rename to \"adduser\"'\n);\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERWAR007,\n `the secret length is too long, it must be 32 characters long, please consider generate a new one \n Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`\n);\n\n/* deprecation warnings */\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERDEP003,\n 'multiple addresses will be deprecated in the next major, only use one'\n);\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERDEP004,\n `JavaScript configuration files are deprecated and will be removed in the next major release, please migrate to YAML (.yaml)\n Learn more at https://verdaccio.org/docs/configuration`\n);\n\nexport function emit(code: string, a?: string, b?: string, c?: string) {\n warningInstance.emit(code, a, b, c);\n}\n"],"mappings":";;;;;;;;AAEA,IAAM,mBAAA,GAAA,gBAAA,
|
|
1
|
+
{"version":3,"file":"warning-utils.js","names":[],"sources":["../src/warning-utils.ts"],"sourcesContent":["import warning from 'process-warning';\n\nconst warningInstance = warning();\nconst verdaccioWarning = 'VerdaccioWarning';\nconst verdaccioDeprecation = 'VerdaccioDeprecation';\n\nexport enum Codes {\n VERWAR001 = 'VERWAR001',\n VERWAR002 = 'VERWAR002',\n VERWAR003 = 'VERWAR003',\n VERWAR004 = 'VERWAR004',\n // deprecation warnings\n VERDEP003 = 'VERDEP003',\n VERDEP004 = 'VERDEP004',\n VERWAR006 = 'VERWAR006',\n VERWAR007 = 'VERWAR007',\n}\n\n/* general warnings */\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR001,\n `Verdaccio doesn't need superuser privileges. don't run it under root`\n);\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR002,\n `The configuration property \"logs\" has been deprecated, please rename to \"log\" for future compatibility`\n);\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR003,\n 'rotating-file type is not longer supported, consider use [logrotate] instead'\n);\n\nwarningInstance.create(\n verdaccioWarning,\n Codes.VERWAR004,\n `invalid address - %s, we expect a port (e.g. \"4873\"), \nhost:port (e.g. \"localhost:4873\") or full url '(e.g. \"http://localhost:4873/\")\nhttps://verdaccio.org/docs/en/configuration#listen-port`\n);\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERWAR006,\n 'the auth plugin method \"add_user\" in the auth plugin is deprecated and will be removed in next major release, rename to \"adduser\"'\n);\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERWAR007,\n `the secret length is too long, it must be 32 characters long, please consider generate a new one \n Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`\n);\n\n/* deprecation warnings */\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERDEP003,\n 'multiple addresses will be deprecated in the next major, only use one'\n);\n\nwarningInstance.create(\n verdaccioDeprecation,\n Codes.VERDEP004,\n `JavaScript configuration files are deprecated and will be removed in the next major release, please migrate to YAML (.yaml)\n Learn more at https://verdaccio.org/docs/configuration`\n);\n\nexport function emit(code: string, a?: string, b?: string, c?: string) {\n warningInstance.emit(code, a, b, c);\n}\n"],"mappings":";;;;;;;;AAEA,IAAM,mBAAA,GAAA,gBAAA,QAAA,CAA0B;AAChC,IAAM,mBAAmB;AACzB,IAAM,uBAAuB;AAE7B,IAAY,QAAL,yBAAA,OAAA;CACL,MAAA,eAAA;CACA,MAAA,eAAA;CACA,MAAA,eAAA;CACA,MAAA,eAAA;CAEA,MAAA,eAAA;CACA,MAAA,eAAA;CACA,MAAA,eAAA;CACA,MAAA,eAAA;;AACF,EAAA,CAAA,CAAA;AAIA,gBAAgB,OACd,kBAAA,aAEA,sEACF;AAEA,gBAAgB,OACd,kBAAA,aAEA,wGACF;AAEA,gBAAgB,OACd,kBAAA,aAEA,8EACF;AAEA,gBAAgB,OACd,kBAAA,aAEA;;wDAGF;AAEA,gBAAgB,OACd,sBAAA,aAEA,uIACF;AAEA,gBAAgB,OACd,sBAAA,aAEA;wEAEF;AAIA,gBAAgB,OACd,sBAAA,aAEA,uEACF;AAEA,gBAAgB,OACd,sBAAA,aAEA;yDAEF;AAEA,SAAgB,KAAK,MAAc,GAAY,GAAY,GAAY;CACrE,gBAAgB,KAAK,MAAM,GAAG,GAAG,CAAC;AACpC"}
|
package/build/warning-utils.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdaccio/core",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.3.0",
|
|
4
4
|
"description": "Verdaccio Core Components",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"enterprise",
|
|
@@ -51,16 +51,17 @@
|
|
|
51
51
|
"ajv": "8.20.0",
|
|
52
52
|
"http-errors": "2.0.1",
|
|
53
53
|
"http-status-codes": "2.3.0",
|
|
54
|
-
"
|
|
54
|
+
"lodash": "4.18.1",
|
|
55
|
+
"minimatch": "10.2.6",
|
|
55
56
|
"process-warning": "1.0.0",
|
|
56
57
|
"semver": "7.8.5"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|
|
59
|
-
"@verdaccio/types": "13.0.
|
|
60
|
+
"@verdaccio/types": "13.0.6",
|
|
60
61
|
"express": "4.22.2",
|
|
61
|
-
"typedoc": "0.28.
|
|
62
|
-
"vite": "8.
|
|
63
|
-
"vitest": "4.1.
|
|
62
|
+
"typedoc": "0.28.20",
|
|
63
|
+
"vite": "8.1.5",
|
|
64
|
+
"vitest": "4.1.10"
|
|
64
65
|
},
|
|
65
66
|
"engines": {
|
|
66
67
|
"node": ">=22"
|