@verdaccio/core 8.2.1 → 8.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/build/auth-utils.js +5 -0
  2. package/build/auth-utils.js.map +1 -1
  3. package/build/auth-utils.mjs +1 -1
  4. package/build/auth-utils.mjs.map +1 -1
  5. package/build/constants.js +6 -0
  6. package/build/constants.mjs +1 -1
  7. package/build/crypto-utils.js +5 -0
  8. package/build/crypto-utils.js.map +1 -1
  9. package/build/crypto-utils.mjs +1 -1
  10. package/build/crypto-utils.mjs.map +1 -1
  11. package/build/error-utils.js +9 -0
  12. package/build/error-utils.js.map +1 -1
  13. package/build/error-utils.mjs +1 -1
  14. package/build/file-utils.js +3 -0
  15. package/build/file-utils.js.map +1 -1
  16. package/build/file-utils.mjs +1 -1
  17. package/build/ip-utils.js +4 -0
  18. package/build/ip-utils.js.map +1 -1
  19. package/build/ip-utils.mjs +1 -1
  20. package/build/ip-utils.mjs.map +1 -1
  21. package/build/pkg-utils.js +5 -0
  22. package/build/pkg-utils.js.map +1 -1
  23. package/build/pkg-utils.mjs +1 -1
  24. package/build/pkg-utils.mjs.map +1 -1
  25. package/build/plugin-utils.js +1 -0
  26. package/build/plugin-utils.mjs +1 -1
  27. package/build/schemes/publish-manifest.js.map +1 -1
  28. package/build/schemes/publish-manifest.mjs.map +1 -1
  29. package/build/schemes/unpublish-manifest.js.map +1 -1
  30. package/build/schemes/unpublish-manifest.mjs.map +1 -1
  31. package/build/search-utils.js +1 -0
  32. package/build/search-utils.mjs +1 -1
  33. package/build/stream-utils.js +2 -0
  34. package/build/stream-utils.js.map +1 -1
  35. package/build/stream-utils.mjs +1 -1
  36. package/build/stream-utils.mjs.map +1 -1
  37. package/build/string-utils.js +1 -0
  38. package/build/string-utils.js.map +1 -1
  39. package/build/string-utils.mjs +1 -1
  40. package/build/string-utils.mjs.map +1 -1
  41. package/build/tarball-utils.js +3 -0
  42. package/build/tarball-utils.js.map +1 -1
  43. package/build/tarball-utils.mjs +1 -1
  44. package/build/tarball-utils.mjs.map +1 -1
  45. package/build/validation-utils.js +9 -0
  46. package/build/validation-utils.js.map +1 -1
  47. package/build/validation-utils.mjs +1 -1
  48. package/build/validation-utils.mjs.map +1 -1
  49. package/build/warning-utils.js +2 -0
  50. package/build/warning-utils.js.map +1 -1
  51. package/build/warning-utils.mjs +1 -1
  52. package/package.json +6 -6
@@ -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
@@ -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,EAAe,KAAK,OAAO,GAClE,OAAO,SAAS;AAItB;AAEA,SAAS,WAAW,KAAqB;CACvC,OAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,EAAE,YAAY;AAChE"}
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"}
@@ -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
@@ -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,EAAe,KAAK,OAAO,GAClE,OAAO,SAAS;AAItB;AAEA,SAAS,WAAW,KAAqB;CACvC,OAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,EAAE,YAAY;AAChE"}
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"}
@@ -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;
@@ -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
@@ -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,YAAkB,2BAA2B;AAC/C;;;;;;;;AASA,SAAgB,YAAY,MAA+B;CAEzD,QAAA,GAAA,YAAA,YAAkB,KAAK,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACpD;AAEA,SAAgB,wBAAwB,SAAS,GAAW;CAC1D,QAAA,GAAA,YAAA,aAAmB,MAAM,EAAE,SAAS,KAAK;AAC3C;;;;;;;AAQA,SAAgB,KAAK,KAAa,UAAU,GAAW;CACrD,OAAO,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,OAAO;AACzD"}
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"}
@@ -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,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACpD;AAEA,SAAgB,wBAAwB,SAAS,GAAW;CAC1D,OAAO,YAAY,MAAM,EAAE,SAAS,KAAK;AAC3C;;;;;;;AAQA,SAAgB,KAAK,KAAa,UAAU,GAAW;CACrD,OAAO,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,OAAO;AACzD"}
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"}
@@ -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
@@ -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,SAAwB,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"}
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"}
@@ -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
@@ -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() {
@@ -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,SAAc,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,OAAY,aAAa;CACzB,OAAO;AACT"}
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"}
@@ -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/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
@@ -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,EACT,IAAI,MAAM,EACV,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"}
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"}
@@ -55,6 +55,6 @@ function isAddressAllowed(address, cidr) {
55
55
  });
56
56
  }
57
57
  //#endregion
58
- export { ip_utils_exports };
58
+ export { ip_utils_exports, isAddressAllowed, isIPv4InCIDR, normalizeAddress, parseIPv4 };
59
59
 
60
60
  //# sourceMappingURL=ip-utils.mjs.map
@@ -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,EACT,IAAI,MAAM,EACV,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"}
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"}
@@ -67,11 +67,16 @@ function getPackageJson(packagePath, relativePath) {
67
67
  return JSON.parse(node_fs.default.readFileSync(packageJsonPath, "utf8"));
68
68
  }
69
69
  //#endregion
70
+ exports.getLatest = getLatest;
71
+ exports.getPackageJson = getPackageJson;
72
+ exports.mergeVersions = mergeVersions;
70
73
  Object.defineProperty(exports, "pkg_utils_exports", {
71
74
  enumerable: true,
72
75
  get: function() {
73
76
  return pkg_utils_exports;
74
77
  }
75
78
  });
79
+ exports.semverSanitize = semverSanitize;
80
+ exports.semverSort = semverSort;
76
81
 
77
82
  //# sourceMappingURL=pkg-utils.js.map
@@ -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":";;;;;;;;;;;;;;;;;;;;AAYA,SAAgB,WAAW,cAAkC;CAC3D,OAAO,aACJ,OAAO,SAAU,GAAY;EAC5B,IAAI,CAAC,OAAA,QAAO,MAAM,GAAG,IAAI,GACvB,OAAO;EAET,OAAO;CACT,CAAC,EACA,KAAK,OAAA,QAAO,YAAY,EACxB,IAAI,MAAM;AACf;;;;;;AAOA,SAAgB,eAAe,SAAyB;CACtD,OACE,OAAA,QAAO,MAAM,OAAO,KAAK,OAAA,QAAO,OAAO,SAAS,EAAE,mBAAmB,KAAK,CAAC,GAAG,WAAW;AAE7F;;;;;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,cAAgB,SAAS,IAAI,kBAAA,WAAW,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,aAAiB,OAAO,SAAA,aAAoB,IAAI;EAClD,IAAI,CAAC,MAAA,aAAiB,MAAM,OAAA,QAAO,IAAI,MAAA,aAAiB,IAAI,SAAA,aAAoB,EAAE,GAChF,MAAM,kBAAA,WAAW,KAAK,SAAS,kBAAA,WAAW;EAE5C,IAAI,MAAM,YAAY,MAAA,aAAiB,OAAO,SAAA,aAAoB,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"}
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":";;;;;;;;;;;;;;;;;;;;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,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"}
@@ -64,6 +64,6 @@ function getPackageJson(packagePath, relativePath) {
64
64
  return JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
65
65
  }
66
66
  //#endregion
67
- export { pkg_utils_exports };
67
+ export { getLatest, getPackageJson, mergeVersions, pkg_utils_exports, semverSanitize, semverSort };
68
68
 
69
69
  //# sourceMappingURL=pkg-utils.mjs.map
@@ -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":";;;;;;;;;;;;;;;;;AAYA,SAAgB,WAAW,cAAkC;CAC3D,OAAO,aACJ,OAAO,SAAU,GAAY;EAC5B,IAAI,CAAC,OAAO,MAAM,GAAG,IAAI,GACvB,OAAO;EAET,OAAO;CACT,CAAC,EACA,KAAK,OAAO,YAAY,EACxB,IAAI,MAAM;AACf;;;;;;AAOA,SAAgB,eAAe,SAAyB;CACtD,OACE,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,SAAS,EAAE,mBAAmB,KAAK,CAAC,GAAG,WAAW;AAE7F;;;;;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,cAAgB,SAAS,IAAI,WAAW,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,aAAiB,OAAO,SAAA,aAAoB,IAAI;EAClD,IAAI,CAAC,MAAA,aAAiB,MAAM,OAAO,IAAI,MAAA,aAAiB,IAAI,SAAA,aAAoB,EAAE,GAChF,MAAM,WAAW,KAAK,SAAS,WAAW;EAE5C,IAAI,MAAM,YAAY,MAAA,aAAiB,OAAO,SAAA,aAAoB,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"}
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":";;;;;;;;;;;;;;;;;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,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"}
@@ -20,6 +20,7 @@ var Plugin = class Plugin {
20
20
  }
21
21
  };
22
22
  //#endregion
23
+ exports.Plugin = Plugin;
23
24
  Object.defineProperty(exports, "plugin_utils_exports", {
24
25
  enumerable: true,
25
26
  get: function() {
@@ -21,6 +21,6 @@ var Plugin = class Plugin {
21
21
  }
22
22
  };
23
23
  //#endregion
24
- export { plugin_utils_exports };
24
+ export { Plugin, plugin_utils_exports };
25
25
 
26
26
  //# sourceMappingURL=plugin-utils.mjs.map
@@ -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,EAAI,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
+ {"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,EAAI,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
+ {"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,EAAI,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
+ {"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,EAAI,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
+ {"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"}
@@ -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() {
@@ -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
@@ -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,EAAO,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"}
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"}
@@ -25,6 +25,6 @@ var transformObjectToString = () => {
25
25
  });
26
26
  };
27
27
  //#endregion
28
- export { stream_utils_exports };
28
+ export { readableToString, stream_utils_exports, transformObjectToString };
29
29
 
30
30
  //# sourceMappingURL=stream-utils.mjs.map
@@ -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,EAAO,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"}
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"}
@@ -25,6 +25,7 @@ function getByQualityPriorityValue(headerValue) {
25
25
  return header[0];
26
26
  }
27
27
  //#endregion
28
+ exports.getByQualityPriorityValue = getByQualityPriorityValue;
28
29
  Object.defineProperty(exports, "string_utils_exports", {
29
30
  enumerable: true,
30
31
  get: function() {
@@ -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,GAAG,MAAM,GACtB,EAAM;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,EACX,KAAK,SAAU,GAAa,GAAa;EACxC,OAAO,EAAE,KAAK,EAAE;CAClB,CAAC;CACH,OAAO,OAAO;AAChB"}
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"}
@@ -26,6 +26,6 @@ function getByQualityPriorityValue(headerValue) {
26
26
  return header[0];
27
27
  }
28
28
  //#endregion
29
- export { string_utils_exports };
29
+ export { getByQualityPriorityValue, string_utils_exports };
30
30
 
31
31
  //# sourceMappingURL=string-utils.mjs.map
@@ -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,GAAG,MAAM,GACtB,EAAM;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,EACX,KAAK,SAAU,GAAa,GAAa;EACxC,OAAO,EAAE,KAAK,EAAE;CAClB,CAAC;CACH,OAAO,OAAO;AAChB"}
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"}
@@ -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,EAAE,MAAM,0BAA0B;CAE9E,OAAO,WAAW,OAAO,OAAO,KAAK,KAAA;AACvC;;;;;;;;AASA,SAAgB,sBAAsB,KAAqB;CAEzD,OAAO,IADe,SAAA,IAAI,GACnB,EAAU,SAAS,QAAQ,SAAS,EAAE;AAC/C;;;;;;;;;;AAWA,SAAgB,0BAA0B,MAAc,SAAyB;CAC/E,IAAI,KAAK,SAAS,GAAG,GACnB,OAAO,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,GAAG,QAAQ;MAExC,OAAO,GAAG,KAAK,GAAG,QAAQ;AAE9B"}
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"}
@@ -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,EAAE,MAAM,0BAA0B;CAE9E,OAAO,WAAW,OAAO,OAAO,KAAK,KAAA;AACvC;;;;;;;;AASA,SAAgB,sBAAsB,KAAqB;CAEzD,OAAO,IADe,IAAI,GACnB,EAAU,SAAS,QAAQ,SAAS,EAAE;AAC/C;;;;;;;;;;AAWA,SAAgB,0BAA0B,MAAc,SAAyB;CAC/E,IAAI,KAAK,SAAS,GAAG,GACnB,OAAO,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,GAAG,QAAQ;MAExC,OAAO,GAAG,KAAK,GAAG,QAAQ;AAE9B"}
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"}
@@ -87,6 +87,15 @@ function validateUserName(userName, expectedName) {
87
87
  return typeof userName === "string" && userName.split(":")[0] === "org.couchdb.user" && userName.split(":")[1] === expectedName;
88
88
  }
89
89
  //#endregion
90
+ exports.isObject = isObject;
91
+ exports.isPackageNameScoped = isPackageNameScoped;
92
+ exports.normalizeMetadata = normalizeMetadata;
93
+ exports.validateName = validateName;
94
+ exports.validatePackage = validatePackage;
95
+ exports.validatePassword = validatePassword;
96
+ exports.validatePublishSingleVersion = require_publish_manifest.validatePublishSingleVersion;
97
+ exports.validateUnPublishSingleVersion = require_unpublish_manifest.validateUnPublishSingleVersion;
98
+ exports.validateUserName = validateUserName;
90
99
  Object.defineProperty(exports, "validation_utils_exports", {
91
100
  enumerable: true,
92
101
  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('/', 2);\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n }\n // scoped package\n return nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1]);\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,EAAE;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,EAAE,SAAS,cAAc;AAExE;;;;;AAMA,SAAgB,gBAAgB,MAAuB;CACrD,MAAM,WAAW,KAAK,MAAM,KAAK,CAAC;CAClC,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;CAGjC,OAAO,SAAS,GAAG,OAAO,OAAO,aAAa,SAAS,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;AACjG;;;;;;;;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,EAAE,OAAO,sBAC3B,SAAS,MAAM,GAAG,EAAE,OAAO;AAE/B"}
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('/', 2);\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n }\n // scoped package\n return nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1]);\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;CACrD,MAAM,WAAW,KAAK,MAAM,KAAK,CAAC;CAClC,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;CAGjC,OAAO,SAAS,EAAE,CAAC,OAAO,OAAO,aAAa,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;AACjG;;;;;;;;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"}
@@ -86,6 +86,6 @@ function validateUserName(userName, expectedName) {
86
86
  return typeof userName === "string" && userName.split(":")[0] === "org.couchdb.user" && userName.split(":")[1] === expectedName;
87
87
  }
88
88
  //#endregion
89
- export { validation_utils_exports };
89
+ export { isObject, isPackageNameScoped, normalizeMetadata, validateName, validatePackage, validatePassword, validatePublishSingleVersion, validateUnPublishSingleVersion, validateUserName, validation_utils_exports };
90
90
 
91
91
  //# 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('/', 2);\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n }\n // scoped package\n return nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1]);\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,EAAE;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,EAAE,SAAS,cAAc;AAExE;;;;;AAMA,SAAgB,gBAAgB,MAAuB;CACrD,MAAM,WAAW,KAAK,MAAM,KAAK,CAAC;CAClC,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;CAGjC,OAAO,SAAS,GAAG,OAAO,OAAO,aAAa,SAAS,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;AACjG;;;;;;;;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,EAAE,OAAO,sBAC3B,SAAS,MAAM,GAAG,EAAE,OAAO;AAE/B"}
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('/', 2);\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n }\n // scoped package\n return nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1]);\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;CACrD,MAAM,WAAW,KAAK,MAAM,KAAK,CAAC;CAClC,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;CAGjC,OAAO,SAAS,EAAE,CAAC,OAAO,OAAO,aAAa,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;AACjG;;;;;;;;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"}
@@ -36,6 +36,8 @@ function emit(code, a, b, c) {
36
36
  warningInstance.emit(code, a, b, c);
37
37
  }
38
38
  //#endregion
39
+ exports.Codes = Codes;
40
+ exports.emit = emit;
39
41
  Object.defineProperty(exports, "warning_utils_exports", {
40
42
  enumerable: true,
41
43
  get: function() {
@@ -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,SAA0B;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"}
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"}
@@ -35,6 +35,6 @@ function emit(code, a, b, c) {
35
35
  warningInstance.emit(code, a, b, c);
36
36
  }
37
37
  //#endregion
38
- export { warning_utils_exports };
38
+ export { Codes, emit, warning_utils_exports };
39
39
 
40
40
  //# sourceMappingURL=warning-utils.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/core",
3
- "version": "8.2.1",
3
+ "version": "8.2.2",
4
4
  "description": "Verdaccio Core Components",
5
5
  "keywords": [
6
6
  "enterprise",
@@ -51,16 +51,16 @@
51
51
  "ajv": "8.20.0",
52
52
  "http-errors": "2.0.1",
53
53
  "http-status-codes": "2.3.0",
54
- "minimatch": "10.2.5",
54
+ "minimatch": "10.2.6",
55
55
  "process-warning": "1.0.0",
56
56
  "semver": "7.8.5"
57
57
  },
58
58
  "devDependencies": {
59
- "@verdaccio/types": "13.0.5",
59
+ "@verdaccio/types": "13.0.6",
60
60
  "express": "4.22.2",
61
- "typedoc": "0.28.14",
62
- "vite": "8.0.16",
63
- "vitest": "4.1.2"
61
+ "typedoc": "0.28.20",
62
+ "vite": "8.1.5",
63
+ "vitest": "4.1.10"
64
64
  },
65
65
  "engines": {
66
66
  "node": ">=22"