@verdaccio/core 8.0.0-next-8.3 → 8.0.0-next-8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @verdaccio/core
2
2
 
3
+ ## 8.0.0-next-8.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 64a7fc0: chore(core): typing, naming, and docs of parameters
8
+ - 5cbee6f: fix: unpublish a package on storage package
9
+ - a049bba: chore(tests): temp folder naming
10
+
11
+ ## 8.0.0-next-8.4
12
+
13
+ ### Patch Changes
14
+
15
+ - 48aa89f: chore: request header constants
16
+ - 58e0d95: fix(middleware): error 404 when getting scoped tarballs
17
+
3
18
  ## 8.0.0-next-8.3
4
19
 
5
20
  ## 8.0.0-next-8.2
@@ -37,6 +37,10 @@ export declare const HEADERS: {
37
37
  CSP: string;
38
38
  CTO: string;
39
39
  XSS: string;
40
+ CLIENT: string;
41
+ POWERED_BY: string;
42
+ RATELIMIT_LIMIT: string;
43
+ RATELIMIT_REMAINING: string;
40
44
  NONE_MATCH: string;
41
45
  ETAG: string;
42
46
  JSON_CHARSET: string;
@@ -45,6 +49,7 @@ export declare const HEADERS: {
45
49
  TEXT_CHARSET: string;
46
50
  WWW_AUTH: string;
47
51
  GZIP: string;
52
+ HOST: string;
48
53
  };
49
54
  export declare const HTTP_STATUS: {
50
55
  OK: number;
@@ -49,6 +49,10 @@ const HEADERS = exports.HEADERS = {
49
49
  CSP: 'Content-Security-Policy',
50
50
  CTO: 'X-Content-Type-Options',
51
51
  XSS: 'X-XSS-Protection',
52
+ CLIENT: 'X-Client',
53
+ POWERED_BY: 'X-Powered-By',
54
+ RATELIMIT_LIMIT: 'X-RateLimit-Limit',
55
+ RATELIMIT_REMAINING: 'X-RateLimit-Remaining',
52
56
  NONE_MATCH: 'If-None-Match',
53
57
  ETAG: 'ETag',
54
58
  JSON_CHARSET: 'application/json; charset=utf-8',
@@ -56,7 +60,8 @@ const HEADERS = exports.HEADERS = {
56
60
  OCTET_STREAM: 'application/octet-stream; charset=utf-8',
57
61
  TEXT_CHARSET: 'text/plain; charset=utf-8',
58
62
  WWW_AUTH: 'WWW-Authenticate',
59
- GZIP: 'gzip'
63
+ GZIP: 'gzip',
64
+ HOST: 'host'
60
65
  };
61
66
  const HTTP_STATUS = exports.HTTP_STATUS = {
62
67
  OK: _httpStatusCodes.default.OK,
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["_httpStatusCodes","_interopRequireDefault","require","e","__esModule","default","DEFAULT_PASSWORD_VALIDATION","exports","TIME_EXPIRATION_24H","TIME_EXPIRATION_1H","DIST_TAGS","LATEST","USERS","MAINTAINERS","DEFAULT_USER","HEADER_TYPE","CONTENT_ENCODING","CONTENT_TYPE","CONTENT_LENGTH","ACCEPT_ENCODING","AUTHORIZATION","CHARACTER_ENCODING","UTF8","TOKEN_BASIC","TOKEN_BEARER","HEADERS","ACCEPT","USER_AGENT","JSON","TEXT_PLAIN","TEXT_PLAIN_UTF8","TEXT_HTML_UTF8","TEXT_HTML","CACHE_CONTROL","FORWARDED_PROTO","FORWARDED_FOR","FRAMES_OPTIONS","CSP","CTO","XSS","NONE_MATCH","ETAG","JSON_CHARSET","JSON_INSTALL_CHARSET","OCTET_STREAM","TEXT_CHARSET","WWW_AUTH","GZIP","HTTP_STATUS","OK","httpCodes","CREATED","MULTIPLE_CHOICES","NOT_MODIFIED","BAD_REQUEST","UNAUTHORIZED","FORBIDDEN","NOT_FOUND","CONFLICT","NOT_IMPLEMENTED","UNSUPPORTED_MEDIA","UNSUPPORTED_MEDIA_TYPE","BAD_DATA","UNPROCESSABLE_ENTITY","INTERNAL_ERROR","INTERNAL_SERVER_ERROR","SERVICE_UNAVAILABLE","LOOP_DETECTED","CANNOT_HANDLE","ERROR_CODE","token_required","API_MESSAGE","PKG_CREATED","PKG_CHANGED","PKG_REMOVED","PKG_PUBLISHED","TARBALL_UPLOADED","TARBALL_REMOVED","TAG_UPDATED","TAG_REMOVED","TAG_ADDED","LOGGED_OUT","LOG_STATUS_MESSAGE","LOG_VERDACCIO_ERROR","LOG_VERDACCIO_BYTES","ROLES","$ALL","ALL","$AUTH","$ANONYMOUS","DEPRECATED_ALL","DEPRECATED_AUTH","DEPRECATED_ANONYMOUS","PACKAGE_ACCESS","SCOPE","HtpasswdHashAlgorithm","PLUGIN_CATEGORY","AUTHENTICATION","MIDDLEWARE","STORAGE","FILTER","THEME"],"sources":["../src/constants.ts"],"sourcesContent":["import httpCodes from 'http-status-codes';\n\nexport const DEFAULT_PASSWORD_VALIDATION = /.{3}$/;\nexport const TIME_EXPIRATION_24H = '24h';\nexport const TIME_EXPIRATION_1H = '1h';\nexport const DIST_TAGS = 'dist-tags';\nexport const LATEST = 'latest';\nexport const USERS = 'users';\nexport const MAINTAINERS = 'maintainers';\nexport const DEFAULT_USER = 'Anonymous';\n\nexport const HEADER_TYPE = {\n CONTENT_ENCODING: 'content-encoding',\n CONTENT_TYPE: 'content-type',\n CONTENT_LENGTH: 'content-length',\n ACCEPT_ENCODING: 'accept-encoding',\n AUTHORIZATION: 'authorization',\n};\n\nexport const CHARACTER_ENCODING = {\n UTF8: 'utf8',\n};\n\n// @deprecated use Bearer instead\nexport const TOKEN_BASIC = 'Basic';\nexport const TOKEN_BEARER = 'Bearer';\n\nexport const HEADERS = {\n ACCEPT: 'Accept',\n ACCEPT_ENCODING: 'Accept-Encoding',\n USER_AGENT: 'User-Agent',\n JSON: 'application/json',\n CONTENT_TYPE: 'Content-type',\n CONTENT_LENGTH: 'content-length',\n TEXT_PLAIN: 'text/plain',\n TEXT_PLAIN_UTF8: 'text/plain; charset=utf-8',\n TEXT_HTML_UTF8: 'text/html; charset=utf-8',\n TEXT_HTML: 'text/html',\n AUTHORIZATION: 'authorization',\n CACHE_CONTROL: 'Cache-Control',\n // only set with proxy that setup HTTPS\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto\n FORWARDED_PROTO: 'X-Forwarded-Proto',\n FORWARDED_FOR: 'X-Forwarded-For',\n FRAMES_OPTIONS: 'X-Frame-Options',\n CSP: 'Content-Security-Policy',\n CTO: 'X-Content-Type-Options',\n XSS: 'X-XSS-Protection',\n NONE_MATCH: 'If-None-Match',\n ETAG: 'ETag',\n JSON_CHARSET: 'application/json; charset=utf-8',\n JSON_INSTALL_CHARSET: 'application/vnd.npm.install-v1+json; charset=utf-8',\n OCTET_STREAM: 'application/octet-stream; charset=utf-8',\n TEXT_CHARSET: 'text/plain; charset=utf-8',\n WWW_AUTH: 'WWW-Authenticate',\n GZIP: 'gzip',\n};\n\nexport const HTTP_STATUS = {\n OK: httpCodes.OK,\n CREATED: httpCodes.CREATED,\n MULTIPLE_CHOICES: httpCodes.MULTIPLE_CHOICES,\n NOT_MODIFIED: httpCodes.NOT_MODIFIED,\n BAD_REQUEST: httpCodes.BAD_REQUEST,\n UNAUTHORIZED: httpCodes.UNAUTHORIZED,\n FORBIDDEN: httpCodes.FORBIDDEN,\n NOT_FOUND: httpCodes.NOT_FOUND,\n CONFLICT: httpCodes.CONFLICT,\n NOT_IMPLEMENTED: httpCodes.NOT_IMPLEMENTED,\n UNSUPPORTED_MEDIA: httpCodes.UNSUPPORTED_MEDIA_TYPE,\n BAD_DATA: httpCodes.UNPROCESSABLE_ENTITY,\n INTERNAL_ERROR: httpCodes.INTERNAL_SERVER_ERROR,\n SERVICE_UNAVAILABLE: httpCodes.SERVICE_UNAVAILABLE,\n LOOP_DETECTED: 508,\n CANNOT_HANDLE: 590,\n};\n\nexport const ERROR_CODE = {\n token_required: 'token is required',\n};\n\nexport const API_MESSAGE = {\n PKG_CREATED: 'created new package',\n PKG_CHANGED: 'package changed',\n PKG_REMOVED: 'package removed',\n PKG_PUBLISHED: 'package published',\n TARBALL_UPLOADED: 'tarball uploaded successfully',\n TARBALL_REMOVED: 'tarball removed',\n TAG_UPDATED: 'tags updated',\n TAG_REMOVED: 'tag removed',\n TAG_ADDED: 'package tagged',\n OK: 'ok',\n LOGGED_OUT: 'Logged out',\n};\n\nexport const LOG_STATUS_MESSAGE =\n \"@{status}, user: @{user}(@{remoteIP}), req: '@{request.method} @{request.url}'\";\nexport const LOG_VERDACCIO_ERROR = `${LOG_STATUS_MESSAGE}, error: @{!error}`;\nexport const LOG_VERDACCIO_BYTES = `${LOG_STATUS_MESSAGE}, bytes: @{bytes.in}/@{bytes.out}`;\n\nexport const ROLES = {\n $ALL: '$all',\n ALL: 'all',\n $AUTH: '$authenticated',\n $ANONYMOUS: '$anonymous',\n DEPRECATED_ALL: '@all',\n DEPRECATED_AUTH: '@authenticated',\n DEPRECATED_ANONYMOUS: '@anonymous',\n};\n\nexport const PACKAGE_ACCESS = {\n SCOPE: '@*/*',\n ALL: '**',\n};\n\nexport enum HtpasswdHashAlgorithm {\n md5 = 'md5',\n sha1 = 'sha1',\n crypt = 'crypt',\n bcrypt = 'bcrypt',\n}\n\nexport const PLUGIN_CATEGORY = {\n AUTHENTICATION: 'authentication',\n MIDDLEWARE: 'middleware',\n STORAGE: 'storage',\n FILTER: 'filter',\n THEME: 'theme',\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"constants.js","names":["_httpStatusCodes","_interopRequireDefault","require","e","__esModule","default","DEFAULT_PASSWORD_VALIDATION","exports","TIME_EXPIRATION_24H","TIME_EXPIRATION_1H","DIST_TAGS","LATEST","USERS","MAINTAINERS","DEFAULT_USER","HEADER_TYPE","CONTENT_ENCODING","CONTENT_TYPE","CONTENT_LENGTH","ACCEPT_ENCODING","AUTHORIZATION","CHARACTER_ENCODING","UTF8","TOKEN_BASIC","TOKEN_BEARER","HEADERS","ACCEPT","USER_AGENT","JSON","TEXT_PLAIN","TEXT_PLAIN_UTF8","TEXT_HTML_UTF8","TEXT_HTML","CACHE_CONTROL","FORWARDED_PROTO","FORWARDED_FOR","FRAMES_OPTIONS","CSP","CTO","XSS","CLIENT","POWERED_BY","RATELIMIT_LIMIT","RATELIMIT_REMAINING","NONE_MATCH","ETAG","JSON_CHARSET","JSON_INSTALL_CHARSET","OCTET_STREAM","TEXT_CHARSET","WWW_AUTH","GZIP","HOST","HTTP_STATUS","OK","httpCodes","CREATED","MULTIPLE_CHOICES","NOT_MODIFIED","BAD_REQUEST","UNAUTHORIZED","FORBIDDEN","NOT_FOUND","CONFLICT","NOT_IMPLEMENTED","UNSUPPORTED_MEDIA","UNSUPPORTED_MEDIA_TYPE","BAD_DATA","UNPROCESSABLE_ENTITY","INTERNAL_ERROR","INTERNAL_SERVER_ERROR","SERVICE_UNAVAILABLE","LOOP_DETECTED","CANNOT_HANDLE","ERROR_CODE","token_required","API_MESSAGE","PKG_CREATED","PKG_CHANGED","PKG_REMOVED","PKG_PUBLISHED","TARBALL_UPLOADED","TARBALL_REMOVED","TAG_UPDATED","TAG_REMOVED","TAG_ADDED","LOGGED_OUT","LOG_STATUS_MESSAGE","LOG_VERDACCIO_ERROR","LOG_VERDACCIO_BYTES","ROLES","$ALL","ALL","$AUTH","$ANONYMOUS","DEPRECATED_ALL","DEPRECATED_AUTH","DEPRECATED_ANONYMOUS","PACKAGE_ACCESS","SCOPE","HtpasswdHashAlgorithm","PLUGIN_CATEGORY","AUTHENTICATION","MIDDLEWARE","STORAGE","FILTER","THEME"],"sources":["../src/constants.ts"],"sourcesContent":["import httpCodes from 'http-status-codes';\n\nexport const DEFAULT_PASSWORD_VALIDATION = /.{3}$/;\nexport const TIME_EXPIRATION_24H = '24h';\nexport const TIME_EXPIRATION_1H = '1h';\nexport const DIST_TAGS = 'dist-tags';\nexport const LATEST = 'latest';\nexport const USERS = 'users';\nexport const MAINTAINERS = 'maintainers';\nexport const DEFAULT_USER = 'Anonymous';\n\nexport const HEADER_TYPE = {\n CONTENT_ENCODING: 'content-encoding',\n CONTENT_TYPE: 'content-type',\n CONTENT_LENGTH: 'content-length',\n ACCEPT_ENCODING: 'accept-encoding',\n AUTHORIZATION: 'authorization',\n};\n\nexport const CHARACTER_ENCODING = {\n UTF8: 'utf8',\n};\n\n// @deprecated use Bearer instead\nexport const TOKEN_BASIC = 'Basic';\nexport const TOKEN_BEARER = 'Bearer';\n\nexport const HEADERS = {\n ACCEPT: 'Accept',\n ACCEPT_ENCODING: 'Accept-Encoding',\n USER_AGENT: 'User-Agent',\n JSON: 'application/json',\n CONTENT_TYPE: 'Content-type',\n CONTENT_LENGTH: 'content-length',\n TEXT_PLAIN: 'text/plain',\n TEXT_PLAIN_UTF8: 'text/plain; charset=utf-8',\n TEXT_HTML_UTF8: 'text/html; charset=utf-8',\n TEXT_HTML: 'text/html',\n AUTHORIZATION: 'authorization',\n CACHE_CONTROL: 'Cache-Control',\n // only set with proxy that setup HTTPS\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto\n FORWARDED_PROTO: 'X-Forwarded-Proto',\n FORWARDED_FOR: 'X-Forwarded-For',\n FRAMES_OPTIONS: 'X-Frame-Options',\n CSP: 'Content-Security-Policy',\n CTO: 'X-Content-Type-Options',\n XSS: 'X-XSS-Protection',\n CLIENT: 'X-Client',\n POWERED_BY: 'X-Powered-By',\n RATELIMIT_LIMIT: 'X-RateLimit-Limit',\n RATELIMIT_REMAINING: 'X-RateLimit-Remaining',\n NONE_MATCH: 'If-None-Match',\n ETAG: 'ETag',\n JSON_CHARSET: 'application/json; charset=utf-8',\n JSON_INSTALL_CHARSET: 'application/vnd.npm.install-v1+json; charset=utf-8',\n OCTET_STREAM: 'application/octet-stream; charset=utf-8',\n TEXT_CHARSET: 'text/plain; charset=utf-8',\n WWW_AUTH: 'WWW-Authenticate',\n GZIP: 'gzip',\n HOST: 'host',\n};\n\nexport const HTTP_STATUS = {\n OK: httpCodes.OK,\n CREATED: httpCodes.CREATED,\n MULTIPLE_CHOICES: httpCodes.MULTIPLE_CHOICES,\n NOT_MODIFIED: httpCodes.NOT_MODIFIED,\n BAD_REQUEST: httpCodes.BAD_REQUEST,\n UNAUTHORIZED: httpCodes.UNAUTHORIZED,\n FORBIDDEN: httpCodes.FORBIDDEN,\n NOT_FOUND: httpCodes.NOT_FOUND,\n CONFLICT: httpCodes.CONFLICT,\n NOT_IMPLEMENTED: httpCodes.NOT_IMPLEMENTED,\n UNSUPPORTED_MEDIA: httpCodes.UNSUPPORTED_MEDIA_TYPE,\n BAD_DATA: httpCodes.UNPROCESSABLE_ENTITY,\n INTERNAL_ERROR: httpCodes.INTERNAL_SERVER_ERROR,\n SERVICE_UNAVAILABLE: httpCodes.SERVICE_UNAVAILABLE,\n LOOP_DETECTED: 508,\n CANNOT_HANDLE: 590,\n};\n\nexport const ERROR_CODE = {\n token_required: 'token is required',\n};\n\nexport const API_MESSAGE = {\n PKG_CREATED: 'created new package',\n PKG_CHANGED: 'package changed',\n PKG_REMOVED: 'package removed',\n PKG_PUBLISHED: 'package published',\n TARBALL_UPLOADED: 'tarball uploaded successfully',\n TARBALL_REMOVED: 'tarball removed',\n TAG_UPDATED: 'tags updated',\n TAG_REMOVED: 'tag removed',\n TAG_ADDED: 'package tagged',\n OK: 'ok',\n LOGGED_OUT: 'Logged out',\n};\n\nexport const LOG_STATUS_MESSAGE =\n \"@{status}, user: @{user}(@{remoteIP}), req: '@{request.method} @{request.url}'\";\nexport const LOG_VERDACCIO_ERROR = `${LOG_STATUS_MESSAGE}, error: @{!error}`;\nexport const LOG_VERDACCIO_BYTES = `${LOG_STATUS_MESSAGE}, bytes: @{bytes.in}/@{bytes.out}`;\n\nexport const ROLES = {\n $ALL: '$all',\n ALL: 'all',\n $AUTH: '$authenticated',\n $ANONYMOUS: '$anonymous',\n DEPRECATED_ALL: '@all',\n DEPRECATED_AUTH: '@authenticated',\n DEPRECATED_ANONYMOUS: '@anonymous',\n};\n\nexport const PACKAGE_ACCESS = {\n SCOPE: '@*/*',\n ALL: '**',\n};\n\nexport enum HtpasswdHashAlgorithm {\n md5 = 'md5',\n sha1 = 'sha1',\n crypt = 'crypt',\n bcrypt = 'bcrypt',\n}\n\nexport const PLUGIN_CATEGORY = {\n AUTHENTICATION: 'authentication',\n MIDDLEWARE: 'middleware',\n STORAGE: 'storage',\n FILTER: 'filter',\n THEME: 'theme',\n};\n"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA0C,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnC,MAAMG,2BAA2B,GAAAC,OAAA,CAAAD,2BAAA,GAAG,OAAO;AAC3C,MAAME,mBAAmB,GAAAD,OAAA,CAAAC,mBAAA,GAAG,KAAK;AACjC,MAAMC,kBAAkB,GAAAF,OAAA,CAAAE,kBAAA,GAAG,IAAI;AAC/B,MAAMC,SAAS,GAAAH,OAAA,CAAAG,SAAA,GAAG,WAAW;AAC7B,MAAMC,MAAM,GAAAJ,OAAA,CAAAI,MAAA,GAAG,QAAQ;AACvB,MAAMC,KAAK,GAAAL,OAAA,CAAAK,KAAA,GAAG,OAAO;AACrB,MAAMC,WAAW,GAAAN,OAAA,CAAAM,WAAA,GAAG,aAAa;AACjC,MAAMC,YAAY,GAAAP,OAAA,CAAAO,YAAA,GAAG,WAAW;AAEhC,MAAMC,WAAW,GAAAR,OAAA,CAAAQ,WAAA,GAAG;EACzBC,gBAAgB,EAAE,kBAAkB;EACpCC,YAAY,EAAE,cAAc;EAC5BC,cAAc,EAAE,gBAAgB;EAChCC,eAAe,EAAE,iBAAiB;EAClCC,aAAa,EAAE;AACjB,CAAC;AAEM,MAAMC,kBAAkB,GAAAd,OAAA,CAAAc,kBAAA,GAAG;EAChCC,IAAI,EAAE;AACR,CAAC;;AAED;AACO,MAAMC,WAAW,GAAAhB,OAAA,CAAAgB,WAAA,GAAG,OAAO;AAC3B,MAAMC,YAAY,GAAAjB,OAAA,CAAAiB,YAAA,GAAG,QAAQ;AAE7B,MAAMC,OAAO,GAAAlB,OAAA,CAAAkB,OAAA,GAAG;EACrBC,MAAM,EAAE,QAAQ;EAChBP,eAAe,EAAE,iBAAiB;EAClCQ,UAAU,EAAE,YAAY;EACxBC,IAAI,EAAE,kBAAkB;EACxBX,YAAY,EAAE,cAAc;EAC5BC,cAAc,EAAE,gBAAgB;EAChCW,UAAU,EAAE,YAAY;EACxBC,eAAe,EAAE,2BAA2B;EAC5CC,cAAc,EAAE,0BAA0B;EAC1CC,SAAS,EAAE,WAAW;EACtBZ,aAAa,EAAE,eAAe;EAC9Ba,aAAa,EAAE,eAAe;EAC9B;EACA;EACAC,eAAe,EAAE,mBAAmB;EACpCC,aAAa,EAAE,iBAAiB;EAChCC,cAAc,EAAE,iBAAiB;EACjCC,GAAG,EAAE,yBAAyB;EAC9BC,GAAG,EAAE,wBAAwB;EAC7BC,GAAG,EAAE,kBAAkB;EACvBC,MAAM,EAAE,UAAU;EAClBC,UAAU,EAAE,cAAc;EAC1BC,eAAe,EAAE,mBAAmB;EACpCC,mBAAmB,EAAE,uBAAuB;EAC5CC,UAAU,EAAE,eAAe;EAC3BC,IAAI,EAAE,MAAM;EACZC,YAAY,EAAE,iCAAiC;EAC/CC,oBAAoB,EAAE,oDAAoD;EAC1EC,YAAY,EAAE,yCAAyC;EACvDC,YAAY,EAAE,2BAA2B;EACzCC,QAAQ,EAAE,kBAAkB;EAC5BC,IAAI,EAAE,MAAM;EACZC,IAAI,EAAE;AACR,CAAC;AAEM,MAAMC,WAAW,GAAA9C,OAAA,CAAA8C,WAAA,GAAG;EACzBC,EAAE,EAAEC,wBAAS,CAACD,EAAE;EAChBE,OAAO,EAAED,wBAAS,CAACC,OAAO;EAC1BC,gBAAgB,EAAEF,wBAAS,CAACE,gBAAgB;EAC5CC,YAAY,EAAEH,wBAAS,CAACG,YAAY;EACpCC,WAAW,EAAEJ,wBAAS,CAACI,WAAW;EAClCC,YAAY,EAAEL,wBAAS,CAACK,YAAY;EACpCC,SAAS,EAAEN,wBAAS,CAACM,SAAS;EAC9BC,SAAS,EAAEP,wBAAS,CAACO,SAAS;EAC9BC,QAAQ,EAAER,wBAAS,CAACQ,QAAQ;EAC5BC,eAAe,EAAET,wBAAS,CAACS,eAAe;EAC1CC,iBAAiB,EAAEV,wBAAS,CAACW,sBAAsB;EACnDC,QAAQ,EAAEZ,wBAAS,CAACa,oBAAoB;EACxCC,cAAc,EAAEd,wBAAS,CAACe,qBAAqB;EAC/CC,mBAAmB,EAAEhB,wBAAS,CAACgB,mBAAmB;EAClDC,aAAa,EAAE,GAAG;EAClBC,aAAa,EAAE;AACjB,CAAC;AAEM,MAAMC,UAAU,GAAAnE,OAAA,CAAAmE,UAAA,GAAG;EACxBC,cAAc,EAAE;AAClB,CAAC;AAEM,MAAMC,WAAW,GAAArE,OAAA,CAAAqE,WAAA,GAAG;EACzBC,WAAW,EAAE,qBAAqB;EAClCC,WAAW,EAAE,iBAAiB;EAC9BC,WAAW,EAAE,iBAAiB;EAC9BC,aAAa,EAAE,mBAAmB;EAClCC,gBAAgB,EAAE,+BAA+B;EACjDC,eAAe,EAAE,iBAAiB;EAClCC,WAAW,EAAE,cAAc;EAC3BC,WAAW,EAAE,aAAa;EAC1BC,SAAS,EAAE,gBAAgB;EAC3B/B,EAAE,EAAE,IAAI;EACRgC,UAAU,EAAE;AACd,CAAC;AAEM,MAAMC,kBAAkB,GAAAhF,OAAA,CAAAgF,kBAAA,GAC7B,gFAAgF;AAC3E,MAAMC,mBAAmB,GAAAjF,OAAA,CAAAiF,mBAAA,GAAG,GAAGD,kBAAkB,oBAAoB;AACrE,MAAME,mBAAmB,GAAAlF,OAAA,CAAAkF,mBAAA,GAAG,GAAGF,kBAAkB,mCAAmC;AAEpF,MAAMG,KAAK,GAAAnF,OAAA,CAAAmF,KAAA,GAAG;EACnBC,IAAI,EAAE,MAAM;EACZC,GAAG,EAAE,KAAK;EACVC,KAAK,EAAE,gBAAgB;EACvBC,UAAU,EAAE,YAAY;EACxBC,cAAc,EAAE,MAAM;EACtBC,eAAe,EAAE,gBAAgB;EACjCC,oBAAoB,EAAE;AACxB,CAAC;AAEM,MAAMC,cAAc,GAAA3F,OAAA,CAAA2F,cAAA,GAAG;EAC5BC,KAAK,EAAE,MAAM;EACbP,GAAG,EAAE;AACP,CAAC;AAAC,IAEUQ,qBAAqB,GAAA7F,OAAA,CAAA6F,qBAAA,0BAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAAA,OAArBA,qBAAqB;AAAA;AAO1B,MAAMC,eAAe,GAAA9F,OAAA,CAAA8F,eAAA,GAAG;EAC7BC,cAAc,EAAE,gBAAgB;EAChCC,UAAU,EAAE,YAAY;EACxBC,OAAO,EAAE,SAAS;EAClBC,MAAM,EAAE,QAAQ;EAChBC,KAAK,EAAE;AACT,CAAC","ignoreList":[]}
@@ -17,7 +17,7 @@ var _httpErrors = _interopRequireDefault(require("http-errors"));
17
17
  var _constants = require("./constants");
18
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
19
  const API_ERROR = exports.API_ERROR = {
20
- PASSWORD_SHORT: `The provided password does not pass the validation`,
20
+ PASSWORD_SHORT: 'The provided password does not pass the validation',
21
21
  MUST_BE_LOGGED: 'You must be logged in to publish packages.',
22
22
  PLUGIN_ERROR: 'bug in the auth plugin system',
23
23
  CONFIG_BAD_FORMAT: 'config file must be an object',
@@ -1 +1 @@
1
- {"version":3,"file":"error-utils.js","names":["_httpErrors","_interopRequireDefault","require","_constants","e","__esModule","default","API_ERROR","exports","PASSWORD_SHORT","MUST_BE_LOGGED","PLUGIN_ERROR","CONFIG_BAD_FORMAT","BAD_USERNAME_PASSWORD","NO_PACKAGE","PACKAGE_CANNOT_BE_ADDED","BAD_DATA","NOT_ALLOWED","NOT_ALLOWED_PUBLISH","INTERNAL_SERVER_ERROR","UNKNOWN_ERROR","NOT_PACKAGE_UPLINK","UPLINK_OFFLINE_PUBLISH","UPLINK_OFFLINE","NOT_MODIFIED_NO_DATA","CONTENT_MISMATCH","NOT_FILE_UPLINK","MAX_USERS_REACHED","VERSION_NOT_EXIST","NO_SUCH_FILE","UNSUPORTED_REGISTRY_CALL","FILE_NOT_FOUND","REGISTRATION_DISABLED","UNAUTHORIZED_ACCESS","BAD_STATUS_CODE","SERVER_TIME_OUT","PACKAGE_EXIST","BAD_AUTH_HEADER","WEB_DISABLED","DEPRECATED_BASIC_HEADER","BAD_FORMAT_USER_GROUP","RESOURCE_UNAVAILABLE","BAD_PACKAGE_DATA","USERNAME_PASSWORD_REQUIRED","USERNAME_ALREADY_REGISTERED","USERNAME_MISMATCH","SUPPORT_ERRORS","PLUGIN_MISSING_INTERFACE","TFA_DISABLED","STORAGE_NOT_IMPLEMENT","PARAMETERS_NOT_VALID","APP_ERROR","CONFIG_NOT_VALID","PROFILE_ERROR","PASSWORD_VALIDATION","getError","code","message","httpError","createError","getConflict","HTTP_STATUS","CONFLICT","getBadData","customMessage","getBadRequest","BAD_REQUEST","getInternalError","INTERNAL_ERROR","getUnauthorized","UNAUTHORIZED","getForbidden","FORBIDDEN","getServiceUnavailable","SERVICE_UNAVAILABLE","getNotFound","NOT_FOUND","getCode","statusCode"],"sources":["../src/error-utils.ts"],"sourcesContent":["import createError, { HttpError } 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};\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":"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","ignoreList":[]}
1
+ {"version":3,"file":"error-utils.js","names":["_httpErrors","_interopRequireDefault","require","_constants","e","__esModule","default","API_ERROR","exports","PASSWORD_SHORT","MUST_BE_LOGGED","PLUGIN_ERROR","CONFIG_BAD_FORMAT","BAD_USERNAME_PASSWORD","NO_PACKAGE","PACKAGE_CANNOT_BE_ADDED","BAD_DATA","NOT_ALLOWED","NOT_ALLOWED_PUBLISH","INTERNAL_SERVER_ERROR","UNKNOWN_ERROR","NOT_PACKAGE_UPLINK","UPLINK_OFFLINE_PUBLISH","UPLINK_OFFLINE","NOT_MODIFIED_NO_DATA","CONTENT_MISMATCH","NOT_FILE_UPLINK","MAX_USERS_REACHED","VERSION_NOT_EXIST","NO_SUCH_FILE","UNSUPORTED_REGISTRY_CALL","FILE_NOT_FOUND","REGISTRATION_DISABLED","UNAUTHORIZED_ACCESS","BAD_STATUS_CODE","SERVER_TIME_OUT","PACKAGE_EXIST","BAD_AUTH_HEADER","WEB_DISABLED","DEPRECATED_BASIC_HEADER","BAD_FORMAT_USER_GROUP","RESOURCE_UNAVAILABLE","BAD_PACKAGE_DATA","USERNAME_PASSWORD_REQUIRED","USERNAME_ALREADY_REGISTERED","USERNAME_MISMATCH","SUPPORT_ERRORS","PLUGIN_MISSING_INTERFACE","TFA_DISABLED","STORAGE_NOT_IMPLEMENT","PARAMETERS_NOT_VALID","APP_ERROR","CONFIG_NOT_VALID","PROFILE_ERROR","PASSWORD_VALIDATION","getError","code","message","httpError","createError","getConflict","HTTP_STATUS","CONFLICT","getBadData","customMessage","getBadRequest","BAD_REQUEST","getInternalError","INTERNAL_ERROR","getUnauthorized","UNAUTHORIZED","getForbidden","FORBIDDEN","getServiceUnavailable","SERVICE_UNAVAILABLE","getNotFound","NOT_FOUND","getCode","statusCode"],"sources":["../src/error-utils.ts"],"sourcesContent":["import createError, { HttpError } 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};\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":"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","ignoreList":[]}
@@ -24,7 +24,7 @@ const {
24
24
  * @returns string
25
25
  */
26
26
  async function createTempFolder(prefix) {
27
- return await mkdtemp(_path.default.join(_os.default.tmpdir(), prefix));
27
+ return await mkdtemp(_path.default.join(_os.default.tmpdir(), 'verdaccio-' + prefix + '-'));
28
28
  }
29
29
 
30
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","names":["_fs","_interopRequireDefault","require","_os","_path","e","__esModule","default","Files","exports","DatabaseName","mkdir","mkdtemp","fs","promises","createTempFolder","prefix","path","join","os","tmpdir","createTempStorageFolder","folder","tempFolder","storageFolder"],"sources":["../src/file-utils.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nexport const Files = {\n DatabaseName: '.verdaccio-db.json',\n};\n\nconst { mkdir, mkdtemp } = fs.promises ? fs.promises : require('fs/promises');\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(), 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":";;;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,GAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjB,MAAMG,KAAK,GAAAC,OAAA,CAAAD,KAAA,GAAG;EACnBE,YAAY,EAAE;AAChB,CAAC;AAED,MAAM;EAAEC,KAAK;EAAEC;AAAQ,CAAC,GAAGC,WAAE,CAACC,QAAQ,GAAGD,WAAE,CAACC,QAAQ,GAAGZ,OAAO,CAAC,aAAa,CAAC;;AAE7E;AACA;AACA;AACA;AACA;AACO,eAAea,gBAAgBA,CAACC,MAAc,EAAmB;EACtE,OAAO,MAAMJ,OAAO,CAACK,aAAI,CAACC,IAAI,CAACC,WAAE,CAACC,MAAM,CAAC,CAAC,EAAEJ,MAAM,CAAC,CAAC;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeK,uBAAuBA,CAACL,MAAc,EAAEM,MAAM,GAAG,SAAS,EAAmB;EACjG,MAAMC,UAAU,GAAG,MAAMR,gBAAgB,CAACC,MAAM,CAAC;EACjD,MAAMQ,aAAa,GAAGP,aAAI,CAACC,IAAI,CAACK,UAAU,EAAED,MAAM,CAAC;EACnD,MAAMX,KAAK,CAACa,aAAa,CAAC;EAC1B,OAAOA,aAAa;AACtB","ignoreList":[]}
1
+ {"version":3,"file":"file-utils.js","names":["_fs","_interopRequireDefault","require","_os","_path","e","__esModule","default","Files","exports","DatabaseName","mkdir","mkdtemp","fs","promises","createTempFolder","prefix","path","join","os","tmpdir","createTempStorageFolder","folder","tempFolder","storageFolder"],"sources":["../src/file-utils.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nexport const Files = {\n DatabaseName: '.verdaccio-db.json',\n};\n\nconst { mkdir, mkdtemp } = fs.promises ? fs.promises : require('fs/promises');\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":";;;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,GAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjB,MAAMG,KAAK,GAAAC,OAAA,CAAAD,KAAA,GAAG;EACnBE,YAAY,EAAE;AAChB,CAAC;AAED,MAAM;EAAEC,KAAK;EAAEC;AAAQ,CAAC,GAAGC,WAAE,CAACC,QAAQ,GAAGD,WAAE,CAACC,QAAQ,GAAGZ,OAAO,CAAC,aAAa,CAAC;;AAE7E;AACA;AACA;AACA;AACA;AACO,eAAea,gBAAgBA,CAACC,MAAc,EAAmB;EACtE,OAAO,MAAMJ,OAAO,CAACK,aAAI,CAACC,IAAI,CAACC,WAAE,CAACC,MAAM,CAAC,CAAC,EAAE,YAAY,GAAGJ,MAAM,GAAG,GAAG,CAAC,CAAC;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeK,uBAAuBA,CAACL,MAAc,EAAEM,MAAM,GAAG,SAAS,EAAmB;EACjG,MAAMC,UAAU,GAAG,MAAMR,gBAAgB,CAACC,MAAM,CAAC;EACjD,MAAMQ,aAAa,GAAGP,aAAI,CAACC,IAAI,CAACK,UAAU,EAAED,MAAM,CAAC;EACnD,MAAMX,KAAK,CAACa,aAAa,CAAC;EAC1B,OAAOA,aAAa;AACtB","ignoreList":[]}
@@ -3,20 +3,15 @@ import { Express, RequestHandler } from 'express';
3
3
  import { Readable, Writable } from 'stream';
4
4
  import { AllowAccess, Callback, Config, Logger, Manifest, PackageAccess, RemoteUser, Token, TokenFilter } from '@verdaccio/types';
5
5
  import { VerdaccioError, searchUtils } from '.';
6
- export interface AuthPluginPackage {
7
- packageName: string;
8
- packageVersion?: string;
9
- tag?: string;
10
- }
11
6
  export interface PluginOptions {
12
7
  config: Config;
13
8
  logger: Logger;
14
9
  }
15
10
  /**
16
- * The base plugin class, set of utilities for developing
17
- * plugins.
18
- * @alpha
19
- * */
11
+ * Base Plugin Class
12
+ *
13
+ * Set of utilities for developing plugins.
14
+ */
20
15
  export declare class Plugin<PluginConfig> {
21
16
  static version: number;
22
17
  readonly version: number;
@@ -25,38 +20,52 @@ export declare class Plugin<PluginConfig> {
25
20
  constructor(config: PluginConfig, options: PluginOptions);
26
21
  getVersion(): number;
27
22
  }
23
+ /**
24
+ * Storage Handler
25
+ *
26
+ * Used in storage plugin for managing packages and tarballs.
27
+ */
28
28
  export interface StorageHandler {
29
29
  logger: Logger;
30
30
  deletePackage(fileName: string): Promise<void>;
31
31
  removePackage(): Promise<void>;
32
32
  updatePackage(packageName: string, handleUpdate: (manifest: Manifest) => Promise<Manifest>): Promise<Manifest>;
33
- readPackage(name: string): Promise<Manifest>;
34
- savePackage(pkgName: string, value: Manifest): Promise<void>;
35
- readTarball(pkgName: string, { signal }: {
33
+ readPackage(packageName: string): Promise<Manifest>;
34
+ savePackage(packageName: string, manifest: Manifest): Promise<void>;
35
+ readTarball(fileName: string, { signal }: {
36
36
  signal: AbortSignal;
37
37
  }): Promise<Readable>;
38
- createPackage(name: string, manifest: Manifest): Promise<void>;
39
- writeTarball(tarballName: string, { signal }: {
38
+ createPackage(packageName: string, manifest: Manifest): Promise<void>;
39
+ writeTarball(fileName: string, { signal }: {
40
40
  signal: AbortSignal;
41
41
  }): Promise<Writable>;
42
42
  hasTarball(fileName: string): Promise<boolean>;
43
43
  hasPackage(): Promise<boolean>;
44
44
  }
45
+ /**
46
+ * Storage Plugin interface
47
+ *
48
+ * https://verdaccio.org/docs/next/plugin-storage
49
+ */
45
50
  export interface Storage<PluginConfig> extends Plugin<PluginConfig> {
46
- add(name: string): Promise<void>;
47
- remove(name: string): Promise<void>;
48
- get(): Promise<any>;
51
+ add(packageName: string): Promise<void>;
52
+ remove(packageName: string): Promise<void>;
53
+ get(): Promise<string[]>;
49
54
  init(): Promise<void>;
50
55
  getSecret(): Promise<string>;
51
56
  setSecret(secret: string): Promise<any>;
52
- getPackageStorage(packageInfo: string): StorageHandler;
57
+ getPackageStorage(packageName: string): StorageHandler;
53
58
  search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]>;
54
59
  saveToken(token: Token): Promise<any>;
55
60
  deleteToken(user: string, tokenKey: string): Promise<any>;
56
61
  readTokens(filter: TokenFilter): Promise<Token[]>;
57
62
  }
58
63
  /**
59
- * This function allow add additional middleware to the application.
64
+ * Middleware Plugin Interface
65
+ *
66
+ * https://verdaccio.org/docs/next/plugin-middleware
67
+ *
68
+ * This function allow add middleware to the application.
60
69
  *
61
70
  * ```ts
62
71
  * import express, { Request, Response } from 'express';
@@ -71,7 +80,6 @@ export interface Storage<PluginConfig> extends Plugin<PluginConfig> {
71
80
  * }
72
81
  * }
73
82
  *
74
- *
75
83
  * const [plugin] = await asyncLoadPlugin(...);
76
84
  * plugin.register_middlewares(app, auth, storage);
77
85
  * ```
@@ -79,14 +87,21 @@ export interface Storage<PluginConfig> extends Plugin<PluginConfig> {
79
87
  export interface ExpressMiddleware<PluginConfig, Storage, Auth> extends Plugin<PluginConfig> {
80
88
  register_middlewares(app: Express, auth: Auth, storage: Storage): void;
81
89
  }
82
- /**
83
- * dasdsa
84
- */
85
90
  export type AuthCallback = (error: VerdaccioError | null, groups?: string[] | false) => void;
86
91
  export type AuthAccessCallback = (error: VerdaccioError | null, access?: boolean) => void;
87
92
  export type AuthUserCallback = (error: VerdaccioError | null, access?: boolean | string) => void;
88
93
  export type AuthChangePasswordCallback = (error: VerdaccioError | null, access?: boolean) => void;
89
94
  export type AccessCallback = (error: VerdaccioError | null, ok?: boolean) => void;
95
+ export interface AuthPluginPackage {
96
+ packageName: string;
97
+ packageVersion?: string;
98
+ tag?: string;
99
+ }
100
+ /**
101
+ * Authentication Plugin Interface
102
+ *
103
+ * https://verdaccio.org/docs/next/plugin-auth
104
+ */
90
105
  export interface Auth<T> extends Plugin<T> {
91
106
  /**
92
107
  * Handles the authenticated method.
@@ -132,6 +147,11 @@ export interface IBasicAuth {
132
147
  allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;
133
148
  add_user(user: string, password: string, cb: Callback): any;
134
149
  }
150
+ /**
151
+ * Filter Plugin Interface
152
+ *
153
+ * https://verdaccio.org/docs/next/plugin-filter
154
+ */
135
155
  export interface ManifestFilter<T> extends Plugin<T> {
136
- filter_metadata(packageInfo: Manifest): Promise<Manifest>;
156
+ filter_metadata(manifest: Manifest): Promise<Manifest>;
137
157
  }
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Plugin = void 0;
7
7
  /**
8
- * The base plugin class, set of utilities for developing
9
- * plugins.
10
- * @alpha
11
- * */
8
+ * Base Plugin Class
9
+ *
10
+ * Set of utilities for developing plugins.
11
+ */
12
12
  class Plugin {
13
13
  static version = 1;
14
14
  constructor(config, options) {
@@ -21,8 +21,28 @@ class Plugin {
21
21
  }
22
22
  }
23
23
 
24
+ // --- STORAGE PLUGIN ---
25
+
26
+ /**
27
+ * Storage Handler
28
+ *
29
+ * Used in storage plugin for managing packages and tarballs.
30
+ */
31
+
32
+ /**
33
+ * Storage Plugin interface
34
+ *
35
+ * https://verdaccio.org/docs/next/plugin-storage
36
+ */
37
+
38
+ // --- MIDDLEWARE PLUGIN ---
39
+
24
40
  /**
25
- * This function allow add additional middleware to the application.
41
+ * Middleware Plugin Interface
42
+ *
43
+ * https://verdaccio.org/docs/next/plugin-middleware
44
+ *
45
+ * This function allow add middleware to the application.
26
46
  *
27
47
  * ```ts
28
48
  * import express, { Request, Response } from 'express';
@@ -36,15 +56,26 @@ class Plugin {
36
56
  });
37
57
  * }
38
58
  * }
39
- *
40
- *
59
+ *
41
60
  * const [plugin] = await asyncLoadPlugin(...);
42
61
  * plugin.register_middlewares(app, auth, storage);
43
62
  * ```
44
63
  */
45
64
 
65
+ // --- AUTH PLUGIN ---
66
+
46
67
  /**
47
- * dasdsa
68
+ * Authentication Plugin Interface
69
+ *
70
+ * https://verdaccio.org/docs/next/plugin-auth
71
+ */
72
+
73
+ // --- FILTER PLUGIN ---
74
+
75
+ /**
76
+ * Filter Plugin Interface
77
+ *
78
+ * https://verdaccio.org/docs/next/plugin-filter
48
79
  */
49
80
  exports.Plugin = Plugin;
50
81
  //# sourceMappingURL=plugin-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-utils.js","names":["Plugin","version","constructor","config","options","getVersion","exports"],"sources":["../src/plugin-utils.ts"],"sourcesContent":["import { Express, RequestHandler } from 'express';\nimport { Readable, Writable } from 'stream';\n\nimport {\n AllowAccess,\n Callback,\n Config,\n Logger,\n Manifest,\n PackageAccess,\n RemoteUser,\n Token,\n TokenFilter,\n} from '@verdaccio/types';\n\nimport { VerdaccioError, searchUtils } from '.';\n\nexport interface AuthPluginPackage {\n packageName: string;\n packageVersion?: string;\n tag?: string;\n}\nexport interface PluginOptions {\n config: Config;\n logger: Logger;\n}\n\n/**\n * The base plugin class, set of utilities for developing\n * plugins.\n * @alpha\n * */\nexport class Plugin<PluginConfig> {\n static version = 1;\n public readonly version: number;\n public readonly config: PluginConfig | unknown;\n public readonly options: PluginOptions;\n public constructor(config: PluginConfig, options: PluginOptions) {\n this.version = Plugin.version;\n this.config = config;\n this.options = options;\n }\n\n public getVersion() {\n return this.version;\n }\n}\nexport interface StorageHandler {\n logger: Logger;\n deletePackage(fileName: string): Promise<void>;\n removePackage(): Promise<void>;\n // next packages migration (this list is meant to replace the callback parent functions)\n updatePackage(\n packageName: string,\n handleUpdate: (manifest: Manifest) => Promise<Manifest>\n ): Promise<Manifest>;\n readPackage(name: string): Promise<Manifest>;\n savePackage(pkgName: string, value: Manifest): Promise<void>;\n readTarball(pkgName: string, { signal }: { signal: AbortSignal }): Promise<Readable>;\n createPackage(name: string, manifest: Manifest): Promise<void>;\n writeTarball(tarballName: string, { signal }: { signal: AbortSignal }): Promise<Writable>;\n // verify if tarball exist in the storage\n hasTarball(fileName: string): Promise<boolean>;\n // verify if package exist in the storage\n hasPackage(): Promise<boolean>;\n}\n\nexport interface Storage<PluginConfig> extends Plugin<PluginConfig> {\n add(name: string): Promise<void>;\n remove(name: string): Promise<void>;\n get(): Promise<any>;\n init(): Promise<void>;\n getSecret(): Promise<string>;\n setSecret(secret: string): Promise<any>;\n getPackageStorage(packageInfo: string): StorageHandler;\n search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]>;\n saveToken(token: Token): Promise<any>;\n deleteToken(user: string, tokenKey: string): Promise<any>;\n readTokens(filter: TokenFilter): Promise<Token[]>;\n}\n\n/**\n * This function allow add additional middleware to the application.\n *\n * ```ts\n * import express, { Request, Response } from 'express';\n * \n * class Middleware extends Plugin {\n * // instances of auth and storage are injected\n * register_middlewares(app, auth, storage) {\n * const router = express.Router();\n * router.post('/my-endpoint', (req: Request, res: Response): void => {\n res.status(200).end();\n });\n * }\n * }\n * \n * \n * const [plugin] = await asyncLoadPlugin(...);\n * plugin.register_middlewares(app, auth, storage);\n * ```\n */\nexport interface ExpressMiddleware<PluginConfig, Storage, Auth> extends Plugin<PluginConfig> {\n register_middlewares(app: Express, auth: Auth, storage: Storage): void;\n}\n\n/**\n * dasdsa\n */\nexport type AuthCallback = (error: VerdaccioError | null, groups?: string[] | false) => void;\n\nexport type AuthAccessCallback = (error: VerdaccioError | null, access?: boolean) => void;\nexport type AuthUserCallback = (error: VerdaccioError | null, access?: boolean | string) => void;\nexport type AuthChangePasswordCallback = (error: VerdaccioError | null, access?: boolean) => void;\nexport type AccessCallback = (error: VerdaccioError | null, ok?: boolean) => void;\nexport interface Auth<T> extends Plugin<T> {\n /**\n * Handles the authenticated method.\n * ```ts\n * class Auth {\n public authenticate(user: string, password: string, done: AuthCallback): void {\n if (!password) {\n return done(errorUtils.getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));\n }\n // always return an array of users\n return done(null, [user]); \n * }\n * ```\n */\n authenticate(user: string, password: string, cb: AuthCallback): void;\n /**\n * Handles the authenticated method.\n * ```ts\n * class Auth {\n public adduser(user: string, password: string, done: AuthCallback): void {\n if (!password) {\n return done(errorUtils.getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));\n }\n // return boolean\n return done(null, true); \n * }\n * ```\n */\n adduser?(user: string, password: string, cb: AuthUserCallback): void;\n changePassword?(\n user: string,\n password: string,\n newPassword: string,\n cb: AuthChangePasswordCallback\n ): void;\n allow_publish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;\n allow_publish?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;\n allow_access?(user: RemoteUser, pkg: T & PackageAccess, cb: AccessCallback): void;\n allow_access?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AccessCallback): void;\n allow_unpublish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;\n allow_unpublish?(\n user: RemoteUser,\n pkg: AllowAccess & PackageAccess,\n cb: AuthAccessCallback\n ): void;\n apiJWTmiddleware?(helpers: any): RequestHandler;\n}\n\nexport interface IBasicAuth {\n authenticate(user: string, password: string, cb: Callback): void;\n invalidateToken?(token: string): Promise<void>;\n changePassword(user: string, password: string, newPassword: string, cb: Callback): void;\n allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;\n add_user(user: string, password: string, cb: Callback): any;\n}\n\nexport interface ManifestFilter<T> extends Plugin<T> {\n filter_metadata(packageInfo: Manifest): Promise<Manifest>;\n}\n"],"mappings":";;;;;;AA2BA;AACA;AACA;AACA;AACA;AACO,MAAMA,MAAM,CAAe;EAChC,OAAOC,OAAO,GAAG,CAAC;EAIXC,WAAWA,CAACC,MAAoB,EAAEC,OAAsB,EAAE;IAC/D,IAAI,CAACH,OAAO,GAAGD,MAAM,CAACC,OAAO;IAC7B,IAAI,CAACE,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,OAAO,GAAGA,OAAO;EACxB;EAEOC,UAAUA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACJ,OAAO;EACrB;AACF;;AAmCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AAFAK,OAAA,CAAAN,MAAA,GAAAA,MAAA","ignoreList":[]}
1
+ {"version":3,"file":"plugin-utils.js","names":["Plugin","version","constructor","config","options","getVersion","exports"],"sources":["../src/plugin-utils.ts"],"sourcesContent":["import { Express, RequestHandler } from 'express';\nimport { Readable, Writable } from 'stream';\n\nimport {\n AllowAccess,\n Callback,\n Config,\n Logger,\n Manifest,\n PackageAccess,\n RemoteUser,\n Token,\n TokenFilter,\n} from '@verdaccio/types';\n\nimport { VerdaccioError, searchUtils } from '.';\n\nexport interface PluginOptions {\n config: Config;\n logger: Logger;\n}\n\n/**\n * Base Plugin Class\n *\n * Set of utilities for developing plugins.\n */\nexport class Plugin<PluginConfig> {\n static version = 1;\n public readonly version: number;\n public readonly config: PluginConfig | unknown;\n public readonly options: PluginOptions;\n public constructor(config: PluginConfig, options: PluginOptions) {\n this.version = Plugin.version;\n this.config = config;\n this.options = options;\n }\n\n public getVersion() {\n return this.version;\n }\n}\n\n// --- STORAGE PLUGIN ---\n\n/**\n * Storage Handler\n *\n * Used in storage plugin for managing packages and tarballs.\n */\nexport interface StorageHandler {\n logger: Logger;\n deletePackage(fileName: string): Promise<void>;\n removePackage(): Promise<void>;\n // next packages migration (this list is meant to replace the callback parent functions)\n updatePackage(\n packageName: string,\n handleUpdate: (manifest: Manifest) => Promise<Manifest>\n ): Promise<Manifest>;\n readPackage(packageName: string): Promise<Manifest>;\n savePackage(packageName: string, manifest: Manifest): Promise<void>;\n readTarball(fileName: string, { signal }: { signal: AbortSignal }): Promise<Readable>;\n createPackage(packageName: string, manifest: Manifest): Promise<void>;\n writeTarball(fileName: string, { signal }: { signal: AbortSignal }): Promise<Writable>;\n // verify if tarball exist in the storage\n hasTarball(fileName: string): Promise<boolean>;\n // verify if package exist in the storage\n hasPackage(): Promise<boolean>;\n}\n\n/**\n * Storage Plugin interface\n *\n * https://verdaccio.org/docs/next/plugin-storage\n */\nexport interface Storage<PluginConfig> extends Plugin<PluginConfig> {\n add(packageName: string): Promise<void>;\n remove(packageName: string): Promise<void>;\n get(): Promise<string[]>;\n init(): Promise<void>;\n getSecret(): Promise<string>;\n setSecret(secret: string): Promise<any>;\n getPackageStorage(packageName: string): StorageHandler;\n search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]>;\n saveToken(token: Token): Promise<any>;\n deleteToken(user: string, tokenKey: string): Promise<any>;\n readTokens(filter: TokenFilter): Promise<Token[]>;\n}\n\n// --- MIDDLEWARE PLUGIN ---\n\n/**\n * Middleware Plugin Interface\n *\n * https://verdaccio.org/docs/next/plugin-middleware\n *\n * This function allow add middleware to the application.\n *\n * ```ts\n * import express, { Request, Response } from 'express';\n * \n * class Middleware extends Plugin {\n * // instances of auth and storage are injected\n * register_middlewares(app, auth, storage) {\n * const router = express.Router();\n * router.post('/my-endpoint', (req: Request, res: Response): void => {\n res.status(200).end();\n });\n * }\n * }\n *\n * const [plugin] = await asyncLoadPlugin(...);\n * plugin.register_middlewares(app, auth, storage);\n * ```\n */\nexport interface ExpressMiddleware<PluginConfig, Storage, Auth> extends Plugin<PluginConfig> {\n register_middlewares(app: Express, auth: Auth, storage: Storage): void;\n}\n\n// --- AUTH PLUGIN ---\n\nexport type AuthCallback = (error: VerdaccioError | null, groups?: string[] | false) => void;\n\nexport type AuthAccessCallback = (error: VerdaccioError | null, access?: boolean) => void;\nexport type AuthUserCallback = (error: VerdaccioError | null, access?: boolean | string) => void;\nexport type AuthChangePasswordCallback = (error: VerdaccioError | null, access?: boolean) => void;\nexport type AccessCallback = (error: VerdaccioError | null, ok?: boolean) => void;\n\nexport interface AuthPluginPackage {\n packageName: string;\n packageVersion?: string;\n tag?: string;\n}\n\n/**\n * Authentication Plugin Interface\n *\n * https://verdaccio.org/docs/next/plugin-auth\n */\nexport interface Auth<T> extends Plugin<T> {\n /**\n * Handles the authenticated method.\n * ```ts\n * class Auth {\n public authenticate(user: string, password: string, done: AuthCallback): void {\n if (!password) {\n return done(errorUtils.getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));\n }\n // always return an array of users\n return done(null, [user]); \n * }\n * ```\n */\n authenticate(user: string, password: string, cb: AuthCallback): void;\n /**\n * Handles the authenticated method.\n * ```ts\n * class Auth {\n public adduser(user: string, password: string, done: AuthCallback): void {\n if (!password) {\n return done(errorUtils.getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD));\n }\n // return boolean\n return done(null, true); \n * }\n * ```\n */\n adduser?(user: string, password: string, cb: AuthUserCallback): void;\n changePassword?(\n user: string,\n password: string,\n newPassword: string,\n cb: AuthChangePasswordCallback\n ): void;\n allow_publish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;\n allow_publish?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;\n allow_access?(user: RemoteUser, pkg: T & PackageAccess, cb: AccessCallback): void;\n allow_access?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AccessCallback): void;\n allow_unpublish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;\n allow_unpublish?(\n user: RemoteUser,\n pkg: AllowAccess & PackageAccess,\n cb: AuthAccessCallback\n ): void;\n apiJWTmiddleware?(helpers: any): RequestHandler;\n}\n\nexport interface IBasicAuth {\n authenticate(user: string, password: string, cb: Callback): void;\n invalidateToken?(token: string): Promise<void>;\n changePassword(user: string, password: string, newPassword: string, cb: Callback): void;\n allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;\n add_user(user: string, password: string, cb: Callback): any;\n}\n\n// --- FILTER PLUGIN ---\n\n/**\n * Filter Plugin Interface\n *\n * https://verdaccio.org/docs/next/plugin-filter\n */\nexport interface ManifestFilter<T> extends Plugin<T> {\n filter_metadata(manifest: Manifest): Promise<Manifest>;\n}\n"],"mappings":";;;;;;AAsBA;AACA;AACA;AACA;AACA;AACO,MAAMA,MAAM,CAAe;EAChC,OAAOC,OAAO,GAAG,CAAC;EAIXC,WAAWA,CAACC,MAAoB,EAAEC,OAAsB,EAAE;IAC/D,IAAI,CAACH,OAAO,GAAGD,MAAM,CAACC,OAAO;IAC7B,IAAI,CAACE,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,OAAO,GAAGA,OAAO;EACxB;EAEOC,UAAUA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACJ,OAAO;EACrB;AACF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAqBA;AACA;AACA;AACA;AACA;;AAeA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;;AAeA;AACA;AACA;AACA;AACA;;AAyDA;;AAEA;AACA;AACA;AACA;AACA;AAJAK,OAAA,CAAAN,MAAA,GAAAA,MAAA","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Validate if a manifest has the correct structure when a new package
3
+ * is being created. The properties name, versions and _attachments must contain 1 element.
4
+ * @param data a manifest object
5
+ * @returns boolean
6
+ */
7
+ export declare function validateUnPublishSingleVersion(manifest: any): boolean;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.validateUnPublishSingleVersion = validateUnPublishSingleVersion;
7
+ var _ajv = _interopRequireDefault(require("ajv"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ const ajv = new _ajv.default();
10
+ // @ts-ignore
11
+ const schema = {
12
+ type: 'object',
13
+ properties: {
14
+ name: {
15
+ type: 'string'
16
+ },
17
+ versions: {
18
+ type: 'object',
19
+ minProperties: 1
20
+ },
21
+ _rev: {
22
+ type: 'string'
23
+ },
24
+ _id: {
25
+ type: 'string'
26
+ },
27
+ time: {
28
+ type: 'object',
29
+ properties: {
30
+ created: {
31
+ type: 'string'
32
+ },
33
+ modified: {
34
+ type: 'string'
35
+ }
36
+ },
37
+ patternProperties: {
38
+ '^[0-9]+\\.[0-9]+\\.[0-9]+-\\d+$': {
39
+ type: 'string'
40
+ }
41
+ },
42
+ additionalProperties: true
43
+ },
44
+ readme: {
45
+ type: 'string'
46
+ },
47
+ 'dist-tags': {
48
+ type: 'object',
49
+ properties: {
50
+ latest: {
51
+ type: 'string'
52
+ }
53
+ },
54
+ required: ['latest'],
55
+ additionalProperties: true
56
+ }
57
+ },
58
+ required: ['name', 'versions', 'dist-tags', '_rev', '_id', 'readme', 'time'],
59
+ additionalProperties: true
60
+ };
61
+
62
+ // validate is a type guard for MyData - type is inferred from schema type
63
+ const validate = ajv.compile(schema);
64
+
65
+ /**
66
+ * Validate if a manifest has the correct structure when a new package
67
+ * is being created. The properties name, versions and _attachments must contain 1 element.
68
+ * @param data a manifest object
69
+ * @returns boolean
70
+ */
71
+ function validateUnPublishSingleVersion(manifest) {
72
+ if (!manifest) {
73
+ return false;
74
+ }
75
+ return validate(manifest);
76
+ }
77
+ //# sourceMappingURL=unpublish-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpublish-manifest.js","names":["_ajv","_interopRequireDefault","require","e","__esModule","default","ajv","Ajv","schema","type","properties","name","versions","minProperties","_rev","_id","time","created","modified","patternProperties","additionalProperties","readme","latest","required","validate","compile","validateUnPublishSingleVersion","manifest"],"sources":["../../src/schemes/unpublish-manifest.ts"],"sourcesContent":["import Ajv, { JSONSchemaType } 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":";;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA0C,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE1C,MAAMG,GAAG,GAAG,IAAIC,YAAG,CAAC,CAAC;AAmBrB;AACA,MAAMC,MAAgC,GAAG;EACvCC,IAAI,EAAE,QAAQ;EACdC,UAAU,EAAE;IACVC,IAAI,EAAE;MAAEF,IAAI,EAAE;IAAS,CAAC;IACxBG,QAAQ,EAAE;MAAEH,IAAI,EAAE,QAAQ;MAAEI,aAAa,EAAE;IAAE,CAAC;IAC9CC,IAAI,EAAE;MAAEL,IAAI,EAAE;IAAS,CAAC;IACxBM,GAAG,EAAE;MAAEN,IAAI,EAAE;IAAS,CAAC;IACvBO,IAAI,EAAE;MACJP,IAAI,EAAE,QAAQ;MACdC,UAAU,EAAE;QACVO,OAAO,EAAE;UAAER,IAAI,EAAE;QAAS,CAAC;QAC3BS,QAAQ,EAAE;UAAET,IAAI,EAAE;QAAS;MAC7B,CAAC;MACDU,iBAAiB,EAAE;QACjB,iCAAiC,EAAE;UAAEV,IAAI,EAAE;QAAS;MACtD,CAAC;MACDW,oBAAoB,EAAE;IACxB,CAAC;IACDC,MAAM,EAAE;MAAEZ,IAAI,EAAE;IAAS,CAAC;IAC1B,WAAW,EAAE;MACXA,IAAI,EAAE,QAAQ;MACdC,UAAU,EAAE;QACVY,MAAM,EAAE;UAAEb,IAAI,EAAE;QAAS;MAC3B,CAAC;MACDc,QAAQ,EAAE,CAAC,QAAQ,CAAC;MACpBH,oBAAoB,EAAE;IACxB;EACF,CAAC;EACDG,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;EAC5EH,oBAAoB,EAAE;AACxB,CAAC;;AAED;AACA,MAAMI,QAAQ,GAAGlB,GAAG,CAACmB,OAAO,CAACjB,MAAM,CAAC;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACO,SAASkB,8BAA8BA,CAACC,QAAa,EAAE;EAC5D,IAAI,CAACA,QAAQ,EAAE;IACb,OAAO,KAAK;EACd;EACA,OAAOH,QAAQ,CAACG,QAAQ,CAAC;AAC3B","ignoreList":[]}
@@ -1,5 +1,6 @@
1
1
  import { Manifest } from '@verdaccio/types';
2
2
  export { validatePublishSingleVersion } from './schemes/publish-manifest';
3
+ export { validateUnPublishSingleVersion } from './schemes/unpublish-manifest';
3
4
  export declare function isPackageNameScoped(name: string): boolean;
4
5
  /**
5
6
  * From normalize-package-data/lib/fixer.js
@@ -15,10 +15,17 @@ Object.defineProperty(exports, "validatePublishSingleVersion", {
15
15
  return _publishManifest.validatePublishSingleVersion;
16
16
  }
17
17
  });
18
+ Object.defineProperty(exports, "validateUnPublishSingleVersion", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _unpublishManifest.validateUnPublishSingleVersion;
22
+ }
23
+ });
18
24
  exports.validateUserName = validateUserName;
19
25
  var _assert = _interopRequireDefault(require("assert"));
20
26
  var _constants = require("./constants");
21
27
  var _publishManifest = require("./schemes/publish-manifest");
28
+ var _unpublishManifest = require("./schemes/unpublish-manifest");
22
29
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
30
  function isPackageNameScoped(name) {
24
31
  return name.startsWith('@');
@@ -1 +1 @@
1
- {"version":3,"file":"validation-utils.js","names":["_assert","_interopRequireDefault","require","_constants","_publishManifest","e","__esModule","default","isPackageNameScoped","name","startsWith","validateName","normalizedName","toLowerCase","isScoped","scopedName","split","match","includes","validatePackage","nameList","length","slice","normalizeMetadata","manifest","assert","strictEqual","_manifest","isObject","DIST_TAGS","Array","isArray","MAINTAINERS","obj","Object","prototype","toString","call","validatePassword","password","validation","DEFAULT_PASSWORD_VALIDATION","RegExp","validateUserName","userName","expectedName"],"sources":["../src/validation-utils.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { Manifest } from '@verdaccio/types';\n\nimport { DEFAULT_PASSWORD_VALIDATION, DIST_TAGS, MAINTAINERS } from './constants';\n\nexport { validatePublishSingleVersion } from './schemes/publish-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":"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","ignoreList":[]}
1
+ {"version":3,"file":"validation-utils.js","names":["_assert","_interopRequireDefault","require","_constants","_publishManifest","_unpublishManifest","e","__esModule","default","isPackageNameScoped","name","startsWith","validateName","normalizedName","toLowerCase","isScoped","scopedName","split","match","includes","validatePackage","nameList","length","slice","normalizeMetadata","manifest","assert","strictEqual","_manifest","isObject","DIST_TAGS","Array","isArray","MAINTAINERS","obj","Object","prototype","toString","call","validatePassword","password","validation","DEFAULT_PASSWORD_VALIDATION","RegExp","validateUserName","userName","expectedName"],"sources":["../src/validation-utils.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { 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":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/core",
3
- "version": "8.0.0-next-8.3",
3
+ "version": "8.0.0-next-8.5",
4
4
  "description": "core utilities",
5
5
  "keywords": [
6
6
  "private",
@@ -41,7 +41,7 @@
41
41
  "semver": "7.6.3"
42
42
  },
43
43
  "devDependencies": {
44
- "@verdaccio/types": "13.0.0-next-8.1",
44
+ "@verdaccio/types": "13.0.0-next-8.2",
45
45
  "lodash": "4.17.21",
46
46
  "typedoc": "0.23.25",
47
47
  "typedoc-plugin-missing-exports": "latest"
package/src/constants.ts CHANGED
@@ -46,6 +46,10 @@ export const HEADERS = {
46
46
  CSP: 'Content-Security-Policy',
47
47
  CTO: 'X-Content-Type-Options',
48
48
  XSS: 'X-XSS-Protection',
49
+ CLIENT: 'X-Client',
50
+ POWERED_BY: 'X-Powered-By',
51
+ RATELIMIT_LIMIT: 'X-RateLimit-Limit',
52
+ RATELIMIT_REMAINING: 'X-RateLimit-Remaining',
49
53
  NONE_MATCH: 'If-None-Match',
50
54
  ETAG: 'ETag',
51
55
  JSON_CHARSET: 'application/json; charset=utf-8',
@@ -54,6 +58,7 @@ export const HEADERS = {
54
58
  TEXT_CHARSET: 'text/plain; charset=utf-8',
55
59
  WWW_AUTH: 'WWW-Authenticate',
56
60
  GZIP: 'gzip',
61
+ HOST: 'host',
57
62
  };
58
63
 
59
64
  export const HTTP_STATUS = {
@@ -3,7 +3,7 @@ import createError, { HttpError } from 'http-errors';
3
3
  import { HTTP_STATUS } from './constants';
4
4
 
5
5
  export const API_ERROR = {
6
- PASSWORD_SHORT: `The provided password does not pass the validation`,
6
+ PASSWORD_SHORT: 'The provided password does not pass the validation',
7
7
  MUST_BE_LOGGED: 'You must be logged in to publish packages.',
8
8
  PLUGIN_ERROR: 'bug in the auth plugin system',
9
9
  CONFIG_BAD_FORMAT: 'config file must be an object',
package/src/file-utils.ts CHANGED
@@ -14,7 +14,7 @@ const { mkdir, mkdtemp } = fs.promises ? fs.promises : require('fs/promises');
14
14
  * @returns string
15
15
  */
16
16
  export async function createTempFolder(prefix: string): Promise<string> {
17
- return await mkdtemp(path.join(os.tmpdir(), prefix));
17
+ return await mkdtemp(path.join(os.tmpdir(), 'verdaccio-' + prefix + '-'));
18
18
  }
19
19
 
20
20
  /**
@@ -15,21 +15,16 @@ import {
15
15
 
16
16
  import { VerdaccioError, searchUtils } from '.';
17
17
 
18
- export interface AuthPluginPackage {
19
- packageName: string;
20
- packageVersion?: string;
21
- tag?: string;
22
- }
23
18
  export interface PluginOptions {
24
19
  config: Config;
25
20
  logger: Logger;
26
21
  }
27
22
 
28
23
  /**
29
- * The base plugin class, set of utilities for developing
30
- * plugins.
31
- * @alpha
32
- * */
24
+ * Base Plugin Class
25
+ *
26
+ * Set of utilities for developing plugins.
27
+ */
33
28
  export class Plugin<PluginConfig> {
34
29
  static version = 1;
35
30
  public readonly version: number;
@@ -45,6 +40,14 @@ export class Plugin<PluginConfig> {
45
40
  return this.version;
46
41
  }
47
42
  }
43
+
44
+ // --- STORAGE PLUGIN ---
45
+
46
+ /**
47
+ * Storage Handler
48
+ *
49
+ * Used in storage plugin for managing packages and tarballs.
50
+ */
48
51
  export interface StorageHandler {
49
52
  logger: Logger;
50
53
  deletePackage(fileName: string): Promise<void>;
@@ -54,33 +57,44 @@ export interface StorageHandler {
54
57
  packageName: string,
55
58
  handleUpdate: (manifest: Manifest) => Promise<Manifest>
56
59
  ): Promise<Manifest>;
57
- readPackage(name: string): Promise<Manifest>;
58
- savePackage(pkgName: string, value: Manifest): Promise<void>;
59
- readTarball(pkgName: string, { signal }: { signal: AbortSignal }): Promise<Readable>;
60
- createPackage(name: string, manifest: Manifest): Promise<void>;
61
- writeTarball(tarballName: string, { signal }: { signal: AbortSignal }): Promise<Writable>;
60
+ readPackage(packageName: string): Promise<Manifest>;
61
+ savePackage(packageName: string, manifest: Manifest): Promise<void>;
62
+ readTarball(fileName: string, { signal }: { signal: AbortSignal }): Promise<Readable>;
63
+ createPackage(packageName: string, manifest: Manifest): Promise<void>;
64
+ writeTarball(fileName: string, { signal }: { signal: AbortSignal }): Promise<Writable>;
62
65
  // verify if tarball exist in the storage
63
66
  hasTarball(fileName: string): Promise<boolean>;
64
67
  // verify if package exist in the storage
65
68
  hasPackage(): Promise<boolean>;
66
69
  }
67
70
 
71
+ /**
72
+ * Storage Plugin interface
73
+ *
74
+ * https://verdaccio.org/docs/next/plugin-storage
75
+ */
68
76
  export interface Storage<PluginConfig> extends Plugin<PluginConfig> {
69
- add(name: string): Promise<void>;
70
- remove(name: string): Promise<void>;
71
- get(): Promise<any>;
77
+ add(packageName: string): Promise<void>;
78
+ remove(packageName: string): Promise<void>;
79
+ get(): Promise<string[]>;
72
80
  init(): Promise<void>;
73
81
  getSecret(): Promise<string>;
74
82
  setSecret(secret: string): Promise<any>;
75
- getPackageStorage(packageInfo: string): StorageHandler;
83
+ getPackageStorage(packageName: string): StorageHandler;
76
84
  search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]>;
77
85
  saveToken(token: Token): Promise<any>;
78
86
  deleteToken(user: string, tokenKey: string): Promise<any>;
79
87
  readTokens(filter: TokenFilter): Promise<Token[]>;
80
88
  }
81
89
 
90
+ // --- MIDDLEWARE PLUGIN ---
91
+
82
92
  /**
83
- * This function allow add additional middleware to the application.
93
+ * Middleware Plugin Interface
94
+ *
95
+ * https://verdaccio.org/docs/next/plugin-middleware
96
+ *
97
+ * This function allow add middleware to the application.
84
98
  *
85
99
  * ```ts
86
100
  * import express, { Request, Response } from 'express';
@@ -94,8 +108,7 @@ export interface Storage<PluginConfig> extends Plugin<PluginConfig> {
94
108
  });
95
109
  * }
96
110
  * }
97
- *
98
- *
111
+ *
99
112
  * const [plugin] = await asyncLoadPlugin(...);
100
113
  * plugin.register_middlewares(app, auth, storage);
101
114
  * ```
@@ -104,15 +117,26 @@ export interface ExpressMiddleware<PluginConfig, Storage, Auth> extends Plugin<P
104
117
  register_middlewares(app: Express, auth: Auth, storage: Storage): void;
105
118
  }
106
119
 
107
- /**
108
- * dasdsa
109
- */
120
+ // --- AUTH PLUGIN ---
121
+
110
122
  export type AuthCallback = (error: VerdaccioError | null, groups?: string[] | false) => void;
111
123
 
112
124
  export type AuthAccessCallback = (error: VerdaccioError | null, access?: boolean) => void;
113
125
  export type AuthUserCallback = (error: VerdaccioError | null, access?: boolean | string) => void;
114
126
  export type AuthChangePasswordCallback = (error: VerdaccioError | null, access?: boolean) => void;
115
127
  export type AccessCallback = (error: VerdaccioError | null, ok?: boolean) => void;
128
+
129
+ export interface AuthPluginPackage {
130
+ packageName: string;
131
+ packageVersion?: string;
132
+ tag?: string;
133
+ }
134
+
135
+ /**
136
+ * Authentication Plugin Interface
137
+ *
138
+ * https://verdaccio.org/docs/next/plugin-auth
139
+ */
116
140
  export interface Auth<T> extends Plugin<T> {
117
141
  /**
118
142
  * Handles the authenticated method.
@@ -169,6 +193,13 @@ export interface IBasicAuth {
169
193
  add_user(user: string, password: string, cb: Callback): any;
170
194
  }
171
195
 
196
+ // --- FILTER PLUGIN ---
197
+
198
+ /**
199
+ * Filter Plugin Interface
200
+ *
201
+ * https://verdaccio.org/docs/next/plugin-filter
202
+ */
172
203
  export interface ManifestFilter<T> extends Plugin<T> {
173
- filter_metadata(packageInfo: Manifest): Promise<Manifest>;
204
+ filter_metadata(manifest: Manifest): Promise<Manifest>;
174
205
  }
@@ -0,0 +1,69 @@
1
+ import Ajv, { JSONSchemaType } from 'ajv';
2
+
3
+ const ajv = new Ajv();
4
+
5
+ interface Manifest {
6
+ name: string;
7
+ versions: Record<string, unknown>;
8
+ _rev: string;
9
+ _id: string;
10
+ time: {
11
+ created: string;
12
+ modified: string;
13
+ [key: string]: string; // Allows pattern properties such as version numbers
14
+ };
15
+ readme: string;
16
+ 'dist-tags': {
17
+ latest: string;
18
+ [key: string]: unknown; // Allows additional properties
19
+ };
20
+ }
21
+
22
+ // @ts-ignore
23
+ const schema: JSONSchemaType<Manifest> = {
24
+ type: 'object',
25
+ properties: {
26
+ name: { type: 'string' },
27
+ versions: { type: 'object', minProperties: 1 },
28
+ _rev: { type: 'string' },
29
+ _id: { type: 'string' },
30
+ time: {
31
+ type: 'object',
32
+ properties: {
33
+ created: { type: 'string' },
34
+ modified: { type: 'string' },
35
+ },
36
+ patternProperties: {
37
+ '^[0-9]+\\.[0-9]+\\.[0-9]+-\\d+$': { type: 'string' },
38
+ },
39
+ additionalProperties: true,
40
+ },
41
+ readme: { type: 'string' },
42
+ 'dist-tags': {
43
+ type: 'object',
44
+ properties: {
45
+ latest: { type: 'string' },
46
+ },
47
+ required: ['latest'],
48
+ additionalProperties: true,
49
+ },
50
+ },
51
+ required: ['name', 'versions', 'dist-tags', '_rev', '_id', 'readme', 'time'],
52
+ additionalProperties: true,
53
+ };
54
+
55
+ // validate is a type guard for MyData - type is inferred from schema type
56
+ const validate = ajv.compile(schema);
57
+
58
+ /**
59
+ * Validate if a manifest has the correct structure when a new package
60
+ * is being created. The properties name, versions and _attachments must contain 1 element.
61
+ * @param data a manifest object
62
+ * @returns boolean
63
+ */
64
+ export function validateUnPublishSingleVersion(manifest: any) {
65
+ if (!manifest) {
66
+ return false;
67
+ }
68
+ return validate(manifest);
69
+ }
@@ -5,6 +5,7 @@ import { Manifest } from '@verdaccio/types';
5
5
  import { DEFAULT_PASSWORD_VALIDATION, DIST_TAGS, MAINTAINERS } from './constants';
6
6
 
7
7
  export { validatePublishSingleVersion } from './schemes/publish-manifest';
8
+ export { validateUnPublishSingleVersion } from './schemes/unpublish-manifest';
8
9
 
9
10
  export function isPackageNameScoped(name: string): boolean {
10
11
  return name.startsWith('@');
@@ -0,0 +1,61 @@
1
+ import { describe, expect, test } from 'vitest';
2
+
3
+ import { validatePublishSingleVersion } from '../src/schemes/publish-manifest';
4
+
5
+ describe('validatePublishSingleVersion', () => {
6
+ describe('valid cases', () => {
7
+ test('should validate a manifest when name and versions are present, even with extra properties', () => {
8
+ const manifest = {
9
+ name: 'foo-pkg',
10
+ _attachments: { '2': {} },
11
+ versions: { '1': {} },
12
+ something: 'else',
13
+ };
14
+ expect(validatePublishSingleVersion(manifest)).toBe(true);
15
+ });
16
+ });
17
+
18
+ describe('invalid cases', () => {
19
+ test('should invalidate a manifest when name is missing', () => {
20
+ const manifest = {
21
+ _attachments: { '2': {} },
22
+ versions: { '1': {} },
23
+ };
24
+ expect(validatePublishSingleVersion(manifest)).toBe(false);
25
+ });
26
+
27
+ test('should invalidate a manifest when _attachments is missing', () => {
28
+ const manifest = {
29
+ name: 'foo-pkg',
30
+ versions: { '1': {} },
31
+ };
32
+ expect(validatePublishSingleVersion(manifest)).toBe(false);
33
+ });
34
+
35
+ test('should invalidate a manifest when versions is missing', () => {
36
+ const manifest = {
37
+ name: 'foo-pkg',
38
+ _attachments: { '1': {} },
39
+ };
40
+ expect(validatePublishSingleVersion(manifest)).toBe(false);
41
+ });
42
+
43
+ test('should invalidate a manifest when versions contains more than one entry', () => {
44
+ const manifest = {
45
+ name: 'foo-pkg',
46
+ versions: { '1': {}, '2': {} },
47
+ _attachments: { '1': {} },
48
+ };
49
+ expect(validatePublishSingleVersion(manifest)).toBe(false);
50
+ });
51
+
52
+ test('should invalidate a manifest when _attachments contains more than one entry', () => {
53
+ const manifest = {
54
+ name: 'foo-pkg',
55
+ _attachments: { '1': {}, '2': {} },
56
+ versions: { '1': {} },
57
+ };
58
+ expect(validatePublishSingleVersion(manifest)).toBe(false);
59
+ });
60
+ });
61
+ });
@@ -0,0 +1,71 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { validateUnPublishSingleVersion } from '../src/schemes/unpublish-manifest';
4
+
5
+ describe('validatePublishSingleVersion', () => {
6
+ it('should validate a valid manifest correctly', () => {
7
+ const validManifest = {
8
+ name: '@juanpicado/test2',
9
+ versions: {
10
+ '3.0.2-0': {
11
+ name: '@juanpicado/test2',
12
+ },
13
+ },
14
+ _rev: '9-17c706cc377dc959',
15
+ _id: '@juanpicado/test2',
16
+ time: {
17
+ created: '2024-11-02T14:33:06.170Z',
18
+ modified: '2024-11-02T14:33:22.919Z',
19
+ '3.0.2-0': '2024-11-02T14:33:06.208Z',
20
+ '3.0.3-0': '2024-11-02T14:33:19.520Z',
21
+ },
22
+ readme: 'ERROR: No README data found!',
23
+ 'dist-tags': {
24
+ latest: '3.0.3-0',
25
+ },
26
+ };
27
+
28
+ const result = validateUnPublishSingleVersion(validManifest);
29
+ expect(result).toBe(true);
30
+ });
31
+
32
+ it('should invalidate a manifest missing required properties', () => {
33
+ const invalidManifest = {
34
+ name: '@juanpicado/test2',
35
+ versions: {
36
+ '3.0.2-0': {
37
+ name: '@juanpicado/test2',
38
+ },
39
+ },
40
+ };
41
+
42
+ const result = validateUnPublishSingleVersion(invalidManifest);
43
+ expect(result).toBe(false);
44
+ });
45
+
46
+ it('should invalidate a manifest with empty versions object', () => {
47
+ const invalidManifest = {
48
+ name: '@juanpicado/test2',
49
+ versions: {},
50
+ _rev: '9-17c706cc377dc959',
51
+ _id: '@juanpicado/test2',
52
+ time: {
53
+ created: '2024-11-02T14:33:06.170Z',
54
+ modified: '2024-11-02T14:33:22.919Z',
55
+ '3.0.2-0': '2024-11-02T14:33:06.208Z',
56
+ },
57
+ readme: 'ERROR: No README data found!',
58
+ 'dist-tags': {
59
+ latest: '3.0.3-0',
60
+ },
61
+ };
62
+
63
+ const result = validateUnPublishSingleVersion(invalidManifest);
64
+ expect(result).toBe(false);
65
+ });
66
+
67
+ it('should invalidate a null manifest', () => {
68
+ const result = validateUnPublishSingleVersion(null);
69
+ expect(result).toBe(false);
70
+ });
71
+ });
@@ -1,7 +1,6 @@
1
1
  import { describe, expect, test } from 'vitest';
2
2
 
3
3
  import { DEFAULT_PASSWORD_VALIDATION, DIST_TAGS } from '../src/constants';
4
- import { validatePublishSingleVersion } from '../src/schemes/publish-manifest';
5
4
  import {
6
5
  isObject,
7
6
  normalizeMetadata,
@@ -118,65 +117,6 @@ describe('validateName', () => {
118
117
  });
119
118
  });
120
119
 
121
- describe('validatePublishSingleVersion', () => {
122
- test('should be valid', () => {
123
- expect(
124
- validatePublishSingleVersion({
125
- name: 'foo-pkg',
126
- _attachments: { '2': {} },
127
- versions: { '1': {} },
128
- })
129
- ).toBeTruthy();
130
- });
131
-
132
- test('should be invalid if name is missing', () => {
133
- expect(
134
- validatePublishSingleVersion({
135
- _attachments: { '2': {} },
136
- versions: { '1': {} },
137
- })
138
- ).toBeFalsy();
139
- });
140
-
141
- test('should be invalid if _attachments is missing', () => {
142
- expect(
143
- validatePublishSingleVersion({
144
- name: 'foo-pkg',
145
- versions: { '1': {} },
146
- })
147
- ).toBeFalsy();
148
- });
149
-
150
- test('should be invalid if versions is missing', () => {
151
- expect(
152
- validatePublishSingleVersion({
153
- name: 'foo-pkg',
154
- _attachments: { '1': {} },
155
- })
156
- ).toBeFalsy();
157
- });
158
-
159
- test('should be invalid if versions is more than 1', () => {
160
- expect(
161
- validatePublishSingleVersion({
162
- name: 'foo-pkg',
163
- versions: { '1': {}, '2': {} },
164
- _attachments: { '1': {} },
165
- })
166
- ).toBeFalsy();
167
- });
168
-
169
- test('should be invalid if _attachments is more than 1', () => {
170
- expect(
171
- validatePublishSingleVersion({
172
- name: 'foo-pkg',
173
- _attachments: { '1': {}, '2': {} },
174
- versions: { '1': {} },
175
- })
176
- ).toBeFalsy();
177
- });
178
- });
179
-
180
120
  describe('validatePassword', () => {
181
121
  test('should validate password according the length', () => {
182
122
  expect(validatePassword('12345', DEFAULT_PASSWORD_VALIDATION)).toBeTruthy();