@verdaccio/core 9.0.0-next-9.17 → 9.0.0-next-9.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/build/auth-utils.js.map +1 -1
  2. package/build/auth-utils.mjs.map +1 -1
  3. package/build/constants.js +20 -0
  4. package/build/constants.js.map +1 -1
  5. package/build/constants.mjs +20 -0
  6. package/build/constants.mjs.map +1 -1
  7. package/build/crypto-utils.js.map +1 -1
  8. package/build/crypto-utils.mjs.map +1 -1
  9. package/build/error-utils.js.map +1 -1
  10. package/build/error-utils.mjs.map +1 -1
  11. package/build/file-utils.js.map +1 -1
  12. package/build/file-utils.mjs.map +1 -1
  13. package/build/index.d.ts +2 -1
  14. package/build/index.js +7 -0
  15. package/build/index.mjs +2 -1
  16. package/build/ip-utils.d.ts +18 -0
  17. package/build/ip-utils.js +66 -0
  18. package/build/ip-utils.js.map +1 -0
  19. package/build/ip-utils.mjs +60 -0
  20. package/build/ip-utils.mjs.map +1 -0
  21. package/build/pkg-utils.js.map +1 -1
  22. package/build/pkg-utils.mjs.map +1 -1
  23. package/build/plugin-utils.js.map +1 -1
  24. package/build/plugin-utils.mjs.map +1 -1
  25. package/build/schemes/publish-manifest.js.map +1 -1
  26. package/build/schemes/publish-manifest.mjs.map +1 -1
  27. package/build/schemes/unpublish-manifest.js.map +1 -1
  28. package/build/schemes/unpublish-manifest.mjs.map +1 -1
  29. package/build/stream-utils.js.map +1 -1
  30. package/build/stream-utils.mjs.map +1 -1
  31. package/build/string-utils.js.map +1 -1
  32. package/build/string-utils.mjs.map +1 -1
  33. package/build/tarball-utils.js.map +1 -1
  34. package/build/tarball-utils.mjs.map +1 -1
  35. package/build/validation-utils.d.ts +1 -1
  36. package/build/validation-utils.js +10 -1
  37. package/build/validation-utils.js.map +1 -1
  38. package/build/validation-utils.mjs +10 -1
  39. package/build/validation-utils.mjs.map +1 -1
  40. package/build/warning-utils.js +14 -14
  41. package/build/warning-utils.js.map +1 -1
  42. package/build/warning-utils.mjs +14 -14
  43. package/build/warning-utils.mjs.map +1 -1
  44. package/package.json +6 -6
@@ -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 * 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;AAC3D,QAAO,aACJ,OAAO,SAAU,GAAY;AAC5B,MAAI,CAAC,OAAA,QAAO,MAAM,GAAG,KAAK,CACxB,QAAO;AAET,SAAO;GACP,CACD,KAAK,OAAA,QAAO,aAAa,CACzB,IAAI,OAAO;;;;;;;AAQhB,SAAgB,eAAe,SAAyB;AACtD,QACE,OAAA,QAAO,MAAM,QAAQ,IAAI,OAAA,QAAO,OAAO,SAAS,EAAE,mBAAmB,MAAM,CAAC,EAAE,WAAW;;;;;;AAQ7F,SAAgB,UAAU,KAAuB;CAC/C,MAAM,eAAyB,OAAO,KAAK,IAAI,SAAS;AACxD,KAAI,aAAa,SAAS,EACxB,OAAM,MAAM,qCAAqC;CAGnD,MAAM,WAAqB,WAAW,aAAa;AAGnD,QAFmC,IAAA,cAAgB,SAAS,IAAI,kBAAA,WAAW,SAAS,SAAS;;;;;;;AAU/F,SAAgB,eAAe,aAAqB,cAA+C;CACjG,MAAM,kBAAkB,UAAA,QAAK,KAAK,aAAa,cAAc,eAAe;AAC5E,QAAO,KAAK,MAAM,QAAA,QAAG,aAAa,iBAAiB,OAAO,CAAC"}
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 * 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;;;;;;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 +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 * 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;AAC3D,QAAO,aACJ,OAAO,SAAU,GAAY;AAC5B,MAAI,CAAC,OAAO,MAAM,GAAG,KAAK,CACxB,QAAO;AAET,SAAO;GACP,CACD,KAAK,OAAO,aAAa,CACzB,IAAI,OAAO;;;;;;;AAQhB,SAAgB,eAAe,SAAyB;AACtD,QACE,OAAO,MAAM,QAAQ,IAAI,OAAO,OAAO,SAAS,EAAE,mBAAmB,MAAM,CAAC,EAAE,WAAW;;;;;;AAQ7F,SAAgB,UAAU,KAAuB;CAC/C,MAAM,eAAyB,OAAO,KAAK,IAAI,SAAS;AACxD,KAAI,aAAa,SAAS,EACxB,OAAM,MAAM,qCAAqC;CAGnD,MAAM,WAAqB,WAAW,aAAa;AAGnD,QAFmC,IAAA,cAAgB,SAAS,IAAI,WAAW,SAAS,SAAS;;;;;;;AAU/F,SAAgB,eAAe,aAAqB,cAA+C;CACjG,MAAM,kBAAkB,KAAK,KAAK,aAAa,cAAc,eAAe;AAC5E,QAAO,KAAK,MAAM,GAAG,aAAa,iBAAiB,OAAO,CAAC"}
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 * 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;;;;;;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 +1 @@
1
- {"version":3,"file":"plugin-utils.js","names":[],"sources":["../src/plugin-utils.ts"],"sourcesContent":["import type { Express, RequestHandler } from 'express';\nimport type { Readable, Writable } from 'node:stream';\n\nimport type {\n AllowAccess,\n Callback,\n Config,\n Logger,\n Manifest,\n PackageAccess,\n RemoteUser,\n Token,\n TokenFilter,\n} from '@verdaccio/types';\n\nimport type { 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(packageName: string): 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(packageName: string): Promise<boolean>;\n}\n\n/**\n * Storage Plugin interface\n *\n * https://verdaccio.org/docs/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/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/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/plugin-filter\n */\nexport interface ManifestFilter<T> extends Plugin<T> {\n filter_metadata(manifest: Manifest): Promise<Manifest>;\n}\n\n// --- SANITY CHECKS ---\n\n/**\n * Sanity check for authentication plugins.\n * A valid auth plugin must implement at least one of: authenticate, allow_access, allow_publish.\n */\nexport function authSanityCheck(plugin: Auth<unknown>): boolean {\n return (\n typeof plugin.authenticate !== 'undefined' ||\n typeof plugin.allow_access !== 'undefined' ||\n typeof plugin.allow_publish !== 'undefined'\n );\n}\n\n/**\n * Sanity check for storage plugins.\n * A valid storage plugin must implement getPackageStorage.\n */\nexport function storageSanityCheck(plugin: Storage<unknown>): boolean {\n return typeof plugin.getPackageStorage !== 'undefined';\n}\n\n/**\n * Sanity check for middleware plugins.\n * A valid middleware plugin must implement register_middlewares.\n */\nexport function middlewareSanityCheck(\n plugin: ExpressMiddleware<unknown, unknown, unknown>\n): boolean {\n return typeof plugin.register_middlewares !== 'undefined';\n}\n\n/**\n * Sanity check for filter plugins.\n * A valid filter plugin must implement filter_metadata.\n */\nexport function filterSanityCheck(plugin: ManifestFilter<unknown>): boolean {\n return typeof plugin.filter_metadata !== 'undefined';\n}\n"],"mappings":";;;;;;;;;;;;;AA2BA,IAAa,SAAb,MAAa,OAAqB;CAChC,OAAO,UAAU;CACjB;CACA;CACA;CACA,YAAmB,QAAsB,SAAwB;AAC/D,OAAK,UAAU,OAAO;AACtB,OAAK,SAAS;AACd,OAAK,UAAU;;CAGjB,aAAoB;AAClB,SAAO,KAAK;;;;;;;AA6KhB,SAAgB,gBAAgB,QAAgC;AAC9D,QACE,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,kBAAkB;;;;;;AAQpC,SAAgB,mBAAmB,QAAmC;AACpE,QAAO,OAAO,OAAO,sBAAsB;;;;;;AAO7C,SAAgB,sBACd,QACS;AACT,QAAO,OAAO,OAAO,yBAAyB;;;;;;AAOhD,SAAgB,kBAAkB,QAA0C;AAC1E,QAAO,OAAO,OAAO,oBAAoB"}
1
+ {"version":3,"file":"plugin-utils.js","names":[],"sources":["../src/plugin-utils.ts"],"sourcesContent":["import type { Express, RequestHandler } from 'express';\nimport type { Readable, Writable } from 'node:stream';\n\nimport type {\n AllowAccess,\n Callback,\n Config,\n Logger,\n Manifest,\n PackageAccess,\n RemoteUser,\n Token,\n TokenFilter,\n} from '@verdaccio/types';\n\nimport type { 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(packageName: string): 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(packageName: string): Promise<boolean>;\n}\n\n/**\n * Storage Plugin interface\n *\n * https://verdaccio.org/docs/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/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/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/plugin-filter\n */\nexport interface ManifestFilter<T> extends Plugin<T> {\n filter_metadata(manifest: Manifest): Promise<Manifest>;\n}\n\n// --- SANITY CHECKS ---\n\n/**\n * Sanity check for authentication plugins.\n * A valid auth plugin must implement at least one of: authenticate, allow_access, allow_publish.\n */\nexport function authSanityCheck(plugin: Auth<unknown>): boolean {\n return (\n typeof plugin.authenticate !== 'undefined' ||\n typeof plugin.allow_access !== 'undefined' ||\n typeof plugin.allow_publish !== 'undefined'\n );\n}\n\n/**\n * Sanity check for storage plugins.\n * A valid storage plugin must implement getPackageStorage.\n */\nexport function storageSanityCheck(plugin: Storage<unknown>): boolean {\n return typeof plugin.getPackageStorage !== 'undefined';\n}\n\n/**\n * Sanity check for middleware plugins.\n * A valid middleware plugin must implement register_middlewares.\n */\nexport function middlewareSanityCheck(\n plugin: ExpressMiddleware<unknown, unknown, unknown>\n): boolean {\n return typeof plugin.register_middlewares !== 'undefined';\n}\n\n/**\n * Sanity check for filter plugins.\n * A valid filter plugin must implement filter_metadata.\n */\nexport function filterSanityCheck(plugin: ManifestFilter<unknown>): boolean {\n return typeof plugin.filter_metadata !== 'undefined';\n}\n"],"mappings":";;;;;;;;;;;;;AA2BA,IAAa,SAAb,MAAa,OAAqB;CAChC,OAAO,UAAU;CACjB;CACA;CACA;CACA,YAAmB,QAAsB,SAAwB;EAC/D,KAAK,UAAU,OAAO;EACtB,KAAK,SAAS;EACd,KAAK,UAAU;CACjB;CAEA,aAAoB;EAClB,OAAO,KAAK;CACd;AACF;;;;;AA2KA,SAAgB,gBAAgB,QAAgC;CAC9D,OACE,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,kBAAkB;AAEpC;;;;;AAMA,SAAgB,mBAAmB,QAAmC;CACpE,OAAO,OAAO,OAAO,sBAAsB;AAC7C;;;;;AAMA,SAAgB,sBACd,QACS;CACT,OAAO,OAAO,OAAO,yBAAyB;AAChD;;;;;AAMA,SAAgB,kBAAkB,QAA0C;CAC1E,OAAO,OAAO,OAAO,oBAAoB;AAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-utils.mjs","names":[],"sources":["../src/plugin-utils.ts"],"sourcesContent":["import type { Express, RequestHandler } from 'express';\nimport type { Readable, Writable } from 'node:stream';\n\nimport type {\n AllowAccess,\n Callback,\n Config,\n Logger,\n Manifest,\n PackageAccess,\n RemoteUser,\n Token,\n TokenFilter,\n} from '@verdaccio/types';\n\nimport type { 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(packageName: string): 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(packageName: string): Promise<boolean>;\n}\n\n/**\n * Storage Plugin interface\n *\n * https://verdaccio.org/docs/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/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/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/plugin-filter\n */\nexport interface ManifestFilter<T> extends Plugin<T> {\n filter_metadata(manifest: Manifest): Promise<Manifest>;\n}\n\n// --- SANITY CHECKS ---\n\n/**\n * Sanity check for authentication plugins.\n * A valid auth plugin must implement at least one of: authenticate, allow_access, allow_publish.\n */\nexport function authSanityCheck(plugin: Auth<unknown>): boolean {\n return (\n typeof plugin.authenticate !== 'undefined' ||\n typeof plugin.allow_access !== 'undefined' ||\n typeof plugin.allow_publish !== 'undefined'\n );\n}\n\n/**\n * Sanity check for storage plugins.\n * A valid storage plugin must implement getPackageStorage.\n */\nexport function storageSanityCheck(plugin: Storage<unknown>): boolean {\n return typeof plugin.getPackageStorage !== 'undefined';\n}\n\n/**\n * Sanity check for middleware plugins.\n * A valid middleware plugin must implement register_middlewares.\n */\nexport function middlewareSanityCheck(\n plugin: ExpressMiddleware<unknown, unknown, unknown>\n): boolean {\n return typeof plugin.register_middlewares !== 'undefined';\n}\n\n/**\n * Sanity check for filter plugins.\n * A valid filter plugin must implement filter_metadata.\n */\nexport function filterSanityCheck(plugin: ManifestFilter<unknown>): boolean {\n return typeof plugin.filter_metadata !== 'undefined';\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,IAAa,SAAb,MAAa,OAAqB;CAChC,OAAO,UAAU;CACjB;CACA;CACA;CACA,YAAmB,QAAsB,SAAwB;AAC/D,OAAK,UAAU,OAAO;AACtB,OAAK,SAAS;AACd,OAAK,UAAU;;CAGjB,aAAoB;AAClB,SAAO,KAAK;;;;;;;AA6KhB,SAAgB,gBAAgB,QAAgC;AAC9D,QACE,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,kBAAkB;;;;;;AAQpC,SAAgB,mBAAmB,QAAmC;AACpE,QAAO,OAAO,OAAO,sBAAsB;;;;;;AAO7C,SAAgB,sBACd,QACS;AACT,QAAO,OAAO,OAAO,yBAAyB;;;;;;AAOhD,SAAgB,kBAAkB,QAA0C;AAC1E,QAAO,OAAO,OAAO,oBAAoB"}
1
+ {"version":3,"file":"plugin-utils.mjs","names":[],"sources":["../src/plugin-utils.ts"],"sourcesContent":["import type { Express, RequestHandler } from 'express';\nimport type { Readable, Writable } from 'node:stream';\n\nimport type {\n AllowAccess,\n Callback,\n Config,\n Logger,\n Manifest,\n PackageAccess,\n RemoteUser,\n Token,\n TokenFilter,\n} from '@verdaccio/types';\n\nimport type { 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(packageName: string): 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(packageName: string): Promise<boolean>;\n}\n\n/**\n * Storage Plugin interface\n *\n * https://verdaccio.org/docs/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/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/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/plugin-filter\n */\nexport interface ManifestFilter<T> extends Plugin<T> {\n filter_metadata(manifest: Manifest): Promise<Manifest>;\n}\n\n// --- SANITY CHECKS ---\n\n/**\n * Sanity check for authentication plugins.\n * A valid auth plugin must implement at least one of: authenticate, allow_access, allow_publish.\n */\nexport function authSanityCheck(plugin: Auth<unknown>): boolean {\n return (\n typeof plugin.authenticate !== 'undefined' ||\n typeof plugin.allow_access !== 'undefined' ||\n typeof plugin.allow_publish !== 'undefined'\n );\n}\n\n/**\n * Sanity check for storage plugins.\n * A valid storage plugin must implement getPackageStorage.\n */\nexport function storageSanityCheck(plugin: Storage<unknown>): boolean {\n return typeof plugin.getPackageStorage !== 'undefined';\n}\n\n/**\n * Sanity check for middleware plugins.\n * A valid middleware plugin must implement register_middlewares.\n */\nexport function middlewareSanityCheck(\n plugin: ExpressMiddleware<unknown, unknown, unknown>\n): boolean {\n return typeof plugin.register_middlewares !== 'undefined';\n}\n\n/**\n * Sanity check for filter plugins.\n * A valid filter plugin must implement filter_metadata.\n */\nexport function filterSanityCheck(plugin: ManifestFilter<unknown>): boolean {\n return typeof plugin.filter_metadata !== 'undefined';\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,IAAa,SAAb,MAAa,OAAqB;CAChC,OAAO,UAAU;CACjB;CACA;CACA;CACA,YAAmB,QAAsB,SAAwB;EAC/D,KAAK,UAAU,OAAO;EACtB,KAAK,SAAS;EACd,KAAK,UAAU;CACjB;CAEA,aAAoB;EAClB,OAAO,KAAK;CACd;AACF;;;;;AA2KA,SAAgB,gBAAgB,QAAgC;CAC9D,OACE,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,iBAAiB,eAC/B,OAAO,OAAO,kBAAkB;AAEpC;;;;;AAMA,SAAgB,mBAAmB,QAAmC;CACpE,OAAO,OAAO,OAAO,sBAAsB;AAC7C;;;;;AAMA,SAAgB,sBACd,QACS;CACT,OAAO,OAAO,OAAO,yBAAyB;AAChD;;;;;AAMA,SAAgB,kBAAkB,QAA0C;CAC1E,OAAO,OAAO,OAAO,oBAAoB;AAC3C"}
@@ -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,WAtBM,IAAI,IAAA,SAAK,CAsBA,QAZoB;CACvC,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,UAAU;EACxB,UAAU;GAAE,MAAM;GAAU,eAAe;GAAG;EAC9C,cAAc;GAAE,MAAM;GAAU,eAAe;GAAG;EACnD;CACD,UAAU;EAAC;EAAQ;EAAY;EAAe;CAC9C,sBAAsB;CACvB,CAGmC;;;;;;;AAQpC,SAAgB,6BAA6B,UAAe;AAC1D,KAAI,CAAC,SACH,QAAO;AAET,QAAO,SAAS,SAAS"}
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 +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,WAtBM,IAAI,KAAK,CAsBA,QAZoB;CACvC,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,UAAU;EACxB,UAAU;GAAE,MAAM;GAAU,eAAe;GAAG;EAC9C,cAAc;GAAE,MAAM;GAAU,eAAe;GAAG;EACnD;CACD,UAAU;EAAC;EAAQ;EAAY;EAAe;CAC9C,sBAAsB;CACvB,CAGmC;;;;;;;AAQpC,SAAgB,6BAA6B,UAAe;AAC1D,KAAI,CAAC,SACH,QAAO;AAET,QAAO,SAAS,SAAS"}
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 +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,WArDM,IAAI,IAAA,SAAK,CAqDA,QAjCoB;CACvC,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,UAAU;EACxB,UAAU;GAAE,MAAM;GAAU,eAAe;GAAG;EAC9C,MAAM,EAAE,MAAM,UAAU;EACxB,KAAK,EAAE,MAAM,UAAU;EACvB,MAAM;GACJ,MAAM;GACN,YAAY;IACV,SAAS,EAAE,MAAM,UAAU;IAC3B,UAAU,EAAE,MAAM,UAAU;IAC7B;GACD,mBAAmB,EACjB,mCAAmC,EAAE,MAAM,UAAU,EACtD;GACD,sBAAsB;GACvB;EACD,QAAQ,EAAE,MAAM,UAAU;EAC1B,aAAa;GACX,MAAM;GACN,YAAY,EACV,QAAQ,EAAE,MAAM,UAAU,EAC3B;GACD,UAAU,CAAC,SAAS;GACpB,sBAAsB;GACvB;EACF;CACD,UAAU;EAAC;EAAQ;EAAY;EAAa;EAAQ;EAAO;EAAU;EAAO;CAC5E,sBAAsB;CACvB,CAGmC;;;;;;;AAQpC,SAAgB,+BAA+B,UAAe;AAC5D,KAAI,CAAC,SACH,QAAO;AAET,QAAO,SAAS,SAAS"}
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 +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,WArDM,IAAI,KAAK,CAqDA,QAjCoB;CACvC,MAAM;CACN,YAAY;EACV,MAAM,EAAE,MAAM,UAAU;EACxB,UAAU;GAAE,MAAM;GAAU,eAAe;GAAG;EAC9C,MAAM,EAAE,MAAM,UAAU;EACxB,KAAK,EAAE,MAAM,UAAU;EACvB,MAAM;GACJ,MAAM;GACN,YAAY;IACV,SAAS,EAAE,MAAM,UAAU;IAC3B,UAAU,EAAE,MAAM,UAAU;IAC7B;GACD,mBAAmB,EACjB,mCAAmC,EAAE,MAAM,UAAU,EACtD;GACD,sBAAsB;GACvB;EACD,QAAQ,EAAE,MAAM,UAAU;EAC1B,aAAa;GACX,MAAM;GACN,YAAY,EACV,QAAQ,EAAE,MAAM,UAAU,EAC3B;GACD,UAAU,CAAC,SAAS;GACpB,sBAAsB;GACvB;EACF;CACD,UAAU;EAAC;EAAQ;EAAY;EAAa;EAAQ;EAAO;EAAU;EAAO;CAC5E,sBAAsB;CACvB,CAGmC;;;;;;;AAQpC,SAAgB,+BAA+B,UAAe;AAC5D,KAAI,CAAC,SACH,QAAO;AAET,QAAO,SAAS,SAAS"}
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 +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,EAAE;AAC3B,YAAW,MAAM,SAAS,OACxB,QAAO,KAAK,OAAO,KAAK,MAAM,CAAC;AAIjC,QAFe,OAAO,OAAO,OAAO,CACjB,SAAS,QAAQ;;;;;AAOtC,IAAM,gCAAgC;AACpC,QAAO,IAAI,YAAA,UAAU;EACnB,YAAY;EACZ,YAAY,OAAO,UAAU,aAAa;AACxC,YAAS,MAAM,KAAK,UAAU,MAAM,CAAC;;EAExC,CAAC"}
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 +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,EAAE;AAC3B,YAAW,MAAM,SAAS,OACxB,QAAO,KAAK,OAAO,KAAK,MAAM,CAAC;AAIjC,QAFe,OAAO,OAAO,OAAO,CACjB,SAAS,QAAQ;;;;;AAOtC,IAAM,gCAAgC;AACpC,QAAO,IAAI,UAAU;EACnB,YAAY;EACZ,YAAY,OAAO,UAAU,aAAa;AACxC,YAAS,MAAM,KAAK,UAAU,MAAM,CAAC;;EAExC,CAAC"}
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 +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;AACxF,KAAI,OAAO,gBAAgB,SACzB,QAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,IAAI;AAEpC,KAAI,MAAM,UAAU,EAElB,QADc,MAAM,GAAG,MAAM,IAAI,CACpB;CAGf,MAAM,CAAC,UAAU,MACd,QAAQ,KAAK,SAAiB;EAC7B,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAI,MAAM,SAAS,GAAG;GACpB,MAAM,CAAC,QAAQ,KAAK;GACpB,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI;AAC9B,OAAI,KAAK,CAAC,OAAO,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;QAE5C,KAAI,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;AAEzB,SAAO;IACN,EAAE,CAAQ,CACZ,KAAK,SAAU,GAAa,GAAa;AACxC,SAAO,EAAE,KAAK,EAAE;GAChB;AACJ,QAAO,OAAO"}
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 +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;AACxF,KAAI,OAAO,gBAAgB,SACzB,QAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,IAAI;AAEpC,KAAI,MAAM,UAAU,EAElB,QADc,MAAM,GAAG,MAAM,IAAI,CACpB;CAGf,MAAM,CAAC,UAAU,MACd,QAAQ,KAAK,SAAiB;EAC7B,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAI,MAAM,SAAS,GAAG;GACpB,MAAM,CAAC,QAAQ,KAAK;GACpB,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI;AAC9B,OAAI,KAAK,CAAC,OAAO,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;QAE5C,KAAI,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;AAEzB,SAAO;IACN,EAAE,CAAQ,CACZ,KAAK,SAAU,GAAa,GAAa;AACxC,SAAO,EAAE,KAAK,EAAE;GAChB;AACJ,QAAO,OAAO"}
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 +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,GAAG,CAAC,MAAM,2BAA2B;AAE/E,QAAO,WAAW,OAAO,OAAO,KAAK,KAAA;;;;;;;;;AAUvC,SAAgB,sBAAsB,KAAqB;AAEzD,QADkB,IAAI,SAAA,IAAI,IAAI,CACb,SAAS,QAAQ,SAAS,GAAG;;;;;;;;;;;AAYhD,SAAgB,0BAA0B,MAAc,SAAyB;AAC/E,KAAI,KAAK,SAAS,IAAI,CACpB,QAAO,GAAG,KAAK,MAAM,IAAI,CAAC,GAAG,GAAG,QAAQ;KAExC,QAAO,GAAG,KAAK,GAAG,QAAQ"}
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 +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,GAAG,CAAC,MAAM,2BAA2B;AAE/E,QAAO,WAAW,OAAO,OAAO,KAAK,KAAA;;;;;;;;;AAUvC,SAAgB,sBAAsB,KAAqB;AAEzD,QADkB,IAAI,IAAI,IAAI,CACb,SAAS,QAAQ,SAAS,GAAG;;;;;;;;;;;AAYhD,SAAgB,0BAA0B,MAAc,SAAyB;AAC/E,KAAI,KAAK,SAAS,IAAI,CACpB,QAAO,GAAG,KAAK,MAAM,IAAI,CAAC,GAAG,GAAG,QAAQ;KAExC,QAAO,GAAG,KAAK,GAAG,QAAQ"}
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"}
@@ -27,5 +27,5 @@ export declare function normalizeMetadata(manifest: Manifest, name: string): Man
27
27
  * @return {Boolean}
28
28
  */
29
29
  export declare function isObject(obj: any): boolean;
30
- export declare function validatePassword(password: string, validation?: RegExp): boolean;
30
+ export declare function validatePassword(password: string, validation?: RegExp | string): boolean;
31
31
  export declare function validateUserName(userName: any, expectedName: string): boolean;
@@ -81,7 +81,16 @@ function isObject(obj) {
81
81
  return Object.prototype.toString.call(obj) === "[object Object]";
82
82
  }
83
83
  function validatePassword(password, validation = require_constants.DEFAULT_PASSWORD_VALIDATION) {
84
- return typeof password === "string" && validation instanceof RegExp ? password.match(validation) !== null : false;
84
+ if (typeof password !== "string") return false;
85
+ let regex;
86
+ if (validation instanceof RegExp) regex = validation;
87
+ else if (typeof validation === "string") try {
88
+ regex = new RegExp(validation);
89
+ } catch {
90
+ return false;
91
+ }
92
+ else return false;
93
+ return password.match(regex) !== null;
85
94
  }
86
95
  function validateUserName(userName, expectedName) {
87
96
  return typeof userName === "string" && userName.split(":")[0] === "org.couchdb.user" && userName.split(":")[1] === expectedName;
@@ -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;AACzD,QAAO,KAAK,WAAW,IAAI;;;;;;;AAQ7B,SAAgB,aAAa,MAAuB;AAClD,KAAI,OAAO,SAAS,SAClB,QAAO;CAGT,IAAI,iBAAyB,KAAK,aAAa;CAE/C,MAAM,WAAoB,oBAAoB,KAAK;CACnD,MAAM,aAAa,KAAK,MAAM,KAAK,EAAE,CAAC;AAEtC,KAAI,YAAY,OAAO,eAAe,YACpC,kBAAiB,WAAW,aAAa;;;;;;;;;;;;AAc3C,QAAO,EACL,CAAC,eAAe,MAAM,2BAA2B,IACjD,eAAe,WAAW,IAAI,IAC9B;EAAC;EAAgB;EAAa;EAAc,CAAC,SAAS,eAAe;;;;;;AAQzE,SAAgB,gBAAgB,MAAuB;CACrD,MAAM,WAAW,KAAK,MAAM,KAAK,EAAE;AACnC,KAAI,SAAS,WAAW,EAEtB,QAAO,aAAa,SAAS,GAAG;AAGlC,QAAO,SAAS,GAAG,OAAO,OAAO,aAAa,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,aAAa,SAAS,GAAG;;;;;;;;;AAUlG,SAAgB,kBAAkB,UAAoB,MAAwB;AAC5E,aAAA,QAAO,YAAY,SAAS,MAAM,KAAK;CACvC,MAAM,YAAY,EAAE,GAAG,UAAU;AAEjC,KAAI,CAAC,SAAS,SAAA,aAAoB,CAChC,WAAU,kBAAA,aAAa,EAAE;AAG3B,KAAI,CAAC,MAAM,QAAQ,SAAA,eAAsB,CACvC,WAAU,kBAAA,eAAe,EAAE;AAI7B,KAAI,CAAC,SAAS,SAAS,YAAY,CACjC,WAAU,cAAc,EAAE;AAG5B,KAAI,CAAC,SAAS,SAAS,QAAQ,CAC7B,WAAU,UAAU,EAAE;AAGxB,QAAO;;;;;;;AAQT,SAAgB,SAAS,KAAmB;AAS1C,QAAO,OAAO,UAAU,SAAS,KAAK,IAAI,KAAK;;AAGjD,SAAgB,iBACd,UACA,aAAqB,kBAAA,6BACZ;AACT,QAAO,OAAO,aAAa,YAAY,sBAAsB,SACzD,SAAS,MAAM,WAAW,KAAK,OAC/B;;AAGN,SAAgB,iBAAiB,UAAe,cAA+B;AAC7E,QACE,OAAO,aAAa,YACpB,SAAS,MAAM,IAAI,CAAC,OAAO,sBAC3B,SAAS,MAAM,IAAI,CAAC,OAAO"}
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 | string = DEFAULT_PASSWORD_VALIDATION\n): boolean {\n if (typeof password !== 'string') {\n return false;\n }\n\n let regex: RegExp;\n if (validation instanceof RegExp) {\n regex = validation;\n } else if (typeof validation === 'string') {\n // YAML config loads `passwordValidationRegex` as a plain string,\n // so coerce it into a RegExp here. Invalid patterns fall back to false.\n try {\n regex = new RegExp(validation);\n } catch {\n return false;\n }\n } else {\n return false;\n }\n\n return password.match(regex) !== null;\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,aAA8B,kBAAA,6BACrB;CACT,IAAI,OAAO,aAAa,UACtB,OAAO;CAGT,IAAI;CACJ,IAAI,sBAAsB,QACxB,QAAQ;MACH,IAAI,OAAO,eAAe,UAG/B,IAAI;EACF,QAAQ,IAAI,OAAO,UAAU;CAC/B,QAAQ;EACN,OAAO;CACT;MAEA,OAAO;CAGT,OAAO,SAAS,MAAM,KAAK,MAAM;AACnC;AAEA,SAAgB,iBAAiB,UAAe,cAA+B;CAC7E,OACE,OAAO,aAAa,YACpB,SAAS,MAAM,GAAG,EAAE,OAAO,sBAC3B,SAAS,MAAM,GAAG,EAAE,OAAO;AAE/B"}
@@ -80,7 +80,16 @@ function isObject(obj) {
80
80
  return Object.prototype.toString.call(obj) === "[object Object]";
81
81
  }
82
82
  function validatePassword(password, validation = DEFAULT_PASSWORD_VALIDATION) {
83
- return typeof password === "string" && validation instanceof RegExp ? password.match(validation) !== null : false;
83
+ if (typeof password !== "string") return false;
84
+ let regex;
85
+ if (validation instanceof RegExp) regex = validation;
86
+ else if (typeof validation === "string") try {
87
+ regex = new RegExp(validation);
88
+ } catch {
89
+ return false;
90
+ }
91
+ else return false;
92
+ return password.match(regex) !== null;
84
93
  }
85
94
  function validateUserName(userName, expectedName) {
86
95
  return typeof userName === "string" && userName.split(":")[0] === "org.couchdb.user" && userName.split(":")[1] === expectedName;
@@ -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;AACzD,QAAO,KAAK,WAAW,IAAI;;;;;;;AAQ7B,SAAgB,aAAa,MAAuB;AAClD,KAAI,OAAO,SAAS,SAClB,QAAO;CAGT,IAAI,iBAAyB,KAAK,aAAa;CAE/C,MAAM,WAAoB,oBAAoB,KAAK;CACnD,MAAM,aAAa,KAAK,MAAM,KAAK,EAAE,CAAC;AAEtC,KAAI,YAAY,OAAO,eAAe,YACpC,kBAAiB,WAAW,aAAa;;;;;;;;;;;;AAc3C,QAAO,EACL,CAAC,eAAe,MAAM,2BAA2B,IACjD,eAAe,WAAW,IAAI,IAC9B;EAAC;EAAgB;EAAa;EAAc,CAAC,SAAS,eAAe;;;;;;AAQzE,SAAgB,gBAAgB,MAAuB;CACrD,MAAM,WAAW,KAAK,MAAM,KAAK,EAAE;AACnC,KAAI,SAAS,WAAW,EAEtB,QAAO,aAAa,SAAS,GAAG;AAGlC,QAAO,SAAS,GAAG,OAAO,OAAO,aAAa,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,aAAa,SAAS,GAAG;;;;;;;;;AAUlG,SAAgB,kBAAkB,UAAoB,MAAwB;AAC5E,QAAO,YAAY,SAAS,MAAM,KAAK;CACvC,MAAM,YAAY,EAAE,GAAG,UAAU;AAEjC,KAAI,CAAC,SAAS,SAAA,aAAoB,CAChC,WAAU,aAAa,EAAE;AAG3B,KAAI,CAAC,MAAM,QAAQ,SAAA,eAAsB,CACvC,WAAU,eAAe,EAAE;AAI7B,KAAI,CAAC,SAAS,SAAS,YAAY,CACjC,WAAU,cAAc,EAAE;AAG5B,KAAI,CAAC,SAAS,SAAS,QAAQ,CAC7B,WAAU,UAAU,EAAE;AAGxB,QAAO;;;;;;;AAQT,SAAgB,SAAS,KAAmB;AAS1C,QAAO,OAAO,UAAU,SAAS,KAAK,IAAI,KAAK;;AAGjD,SAAgB,iBACd,UACA,aAAqB,6BACZ;AACT,QAAO,OAAO,aAAa,YAAY,sBAAsB,SACzD,SAAS,MAAM,WAAW,KAAK,OAC/B;;AAGN,SAAgB,iBAAiB,UAAe,cAA+B;AAC7E,QACE,OAAO,aAAa,YACpB,SAAS,MAAM,IAAI,CAAC,OAAO,sBAC3B,SAAS,MAAM,IAAI,CAAC,OAAO"}
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 | string = DEFAULT_PASSWORD_VALIDATION\n): boolean {\n if (typeof password !== 'string') {\n return false;\n }\n\n let regex: RegExp;\n if (validation instanceof RegExp) {\n regex = validation;\n } else if (typeof validation === 'string') {\n // YAML config loads `passwordValidationRegex` as a plain string,\n // so coerce it into a RegExp here. Invalid patterns fall back to false.\n try {\n regex = new RegExp(validation);\n } catch {\n return false;\n }\n } else {\n return false;\n }\n\n return password.match(regex) !== null;\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,aAA8B,6BACrB;CACT,IAAI,OAAO,aAAa,UACtB,OAAO;CAGT,IAAI;CACJ,IAAI,sBAAsB,QACxB,QAAQ;MACH,IAAI,OAAO,eAAe,UAG/B,IAAI;EACF,QAAQ,IAAI,OAAO,UAAU;CAC/B,QAAQ;EACN,OAAO;CACT;MAEA,OAAO;CAGT,OAAO,SAAS,MAAM,KAAK,MAAM;AACnC;AAEA,SAAgB,iBAAiB,UAAe,cAA+B;CAC7E,OACE,OAAO,aAAa,YACpB,SAAS,MAAM,GAAG,EAAE,OAAO,sBAC3B,SAAS,MAAM,GAAG,EAAE,OAAO;AAE/B"}
@@ -19,39 +19,39 @@ var Codes = /* @__PURE__ */ function(Codes) {
19
19
  return Codes;
20
20
  }({});
21
21
  var warnings = {};
22
- warnings[Codes.VERWAR001] = createWarning({
22
+ warnings["VERWAR001"] = createWarning({
23
23
  name: verdaccioWarning,
24
- code: Codes.VERWAR001,
24
+ code: "VERWAR001",
25
25
  message: `Verdaccio doesn't need superuser privileges. don't run it under root`
26
26
  });
27
- warnings[Codes.VERWAR002] = createWarning({
27
+ warnings["VERWAR002"] = createWarning({
28
28
  name: verdaccioWarning,
29
- code: Codes.VERWAR002,
29
+ code: "VERWAR002",
30
30
  message: `The configuration property "logs" has been deprecated, please rename to "log" for future compatibility`
31
31
  });
32
- warnings[Codes.VERWAR003] = createWarning({
32
+ warnings["VERWAR003"] = createWarning({
33
33
  name: verdaccioWarning,
34
- code: Codes.VERWAR003,
34
+ code: "VERWAR003",
35
35
  message: "rotating-file type is not longer supported, consider use [logrotate] instead"
36
36
  });
37
- warnings[Codes.VERWAR004] = createWarning({
37
+ warnings["VERWAR004"] = createWarning({
38
38
  name: verdaccioWarning,
39
- code: Codes.VERWAR004,
39
+ code: "VERWAR004",
40
40
  message: `invalid address - %s, we expect a port (e.g. "4873"),
41
41
  host:port (e.g. "localhost:4873") or full url '(e.g. "http://localhost:4873/")
42
42
  https://verdaccio.org/docs/configuration#listen-port`
43
43
  });
44
- warnings[Codes.VERWAR006] = createDeprecation({
45
- code: Codes.VERWAR006,
44
+ warnings["VERWAR006"] = createDeprecation({
45
+ code: "VERWAR006",
46
46
  message: "the auth plugin method \"add_user\" in the auth plugin is deprecated and will be removed in next major release, rename to \"adduser\""
47
47
  });
48
- warnings[Codes.VERWAR007] = createDeprecation({
49
- code: Codes.VERWAR007,
48
+ warnings["VERWAR007"] = createDeprecation({
49
+ code: "VERWAR007",
50
50
  message: `the secret length is too long, it must be 32 characters long, please consider generate a new one
51
51
  Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`
52
52
  });
53
- warnings[Codes.VERDEP003] = createDeprecation({
54
- code: Codes.VERDEP003,
53
+ warnings["VERDEP003"] = createDeprecation({
54
+ code: "VERDEP003",
55
55
  message: "multiple addresses will be deprecated in the next major, only use one"
56
56
  });
57
57
  function emit(code, a, b, c) {
@@ -1 +1 @@
1
- {"version":3,"file":"warning-utils.js","names":[],"sources":["../src/warning-utils.ts"],"sourcesContent":["import processWarning from 'process-warning';\n\nconst { createDeprecation, createWarning } = processWarning;\n\nconst verdaccioWarning = 'VerdaccioWarning';\n\nexport enum Codes {\n VERWAR001 = 'VERWAR001',\n VERWAR002 = 'VERWAR002',\n VERWAR003 = 'VERWAR003',\n VERWAR004 = 'VERWAR004',\n // deprecation warnings\n VERDEP003 = 'VERDEP003',\n VERWAR006 = 'VERWAR006',\n VERWAR007 = 'VERWAR007',\n}\n\n/* general warnings */\n\nconst warnings: Record<string, (a?: any, b?: any, c?: any) => void> = {};\n\nwarnings[Codes.VERWAR001] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR001,\n message: `Verdaccio doesn't need superuser privileges. don't run it under root`,\n});\n\nwarnings[Codes.VERWAR002] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR002,\n message: `The configuration property \"logs\" has been deprecated, please rename to \"log\" for future compatibility`,\n});\n\nwarnings[Codes.VERWAR003] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR003,\n message: 'rotating-file type is not longer supported, consider use [logrotate] instead',\n});\n\nwarnings[Codes.VERWAR004] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR004,\n message: `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/configuration#listen-port`,\n});\n\nwarnings[Codes.VERWAR006] = createDeprecation({\n code: Codes.VERWAR006,\n message:\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\nwarnings[Codes.VERWAR007] = createDeprecation({\n code: Codes.VERWAR007,\n message: `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\nwarnings[Codes.VERDEP003] = createDeprecation({\n code: Codes.VERDEP003,\n message: 'multiple addresses will be deprecated in the next major, only use one',\n});\n\nexport function emit(code: string, a?: string, b?: string, c?: string) {\n const warning = warnings[code];\n if (warning) {\n warning(a, b, c);\n }\n}\n"],"mappings":";;;;;;;;AAEA,IAAM,EAAE,mBAAmB,kBAAkB,gBAAA;AAE7C,IAAM,mBAAmB;AAEzB,IAAY,QAAL,yBAAA,OAAA;AACL,OAAA,eAAA;AACA,OAAA,eAAA;AACA,OAAA,eAAA;AACA,OAAA,eAAA;AAEA,OAAA,eAAA;AACA,OAAA,eAAA;AACA,OAAA,eAAA;;KACD;AAID,IAAM,WAAgE,EAAE;AAExE,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;;;CAGV,CAAC;AAEF,SAAS,MAAM,aAAa,kBAAkB;CAC5C,MAAM,MAAM;CACZ,SACE;CACH,CAAC;AAEF,SAAS,MAAM,aAAa,kBAAkB;CAC5C,MAAM,MAAM;CACZ,SAAS;;CAEV,CAAC;AAIF,SAAS,MAAM,aAAa,kBAAkB;CAC5C,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAgB,KAAK,MAAc,GAAY,GAAY,GAAY;CACrE,MAAM,UAAU,SAAS;AACzB,KAAI,QACF,SAAQ,GAAG,GAAG,EAAE"}
1
+ {"version":3,"file":"warning-utils.js","names":[],"sources":["../src/warning-utils.ts"],"sourcesContent":["import processWarning from 'process-warning';\n\nconst { createDeprecation, createWarning } = processWarning;\n\nconst verdaccioWarning = 'VerdaccioWarning';\n\nexport enum Codes {\n VERWAR001 = 'VERWAR001',\n VERWAR002 = 'VERWAR002',\n VERWAR003 = 'VERWAR003',\n VERWAR004 = 'VERWAR004',\n // deprecation warnings\n VERDEP003 = 'VERDEP003',\n VERWAR006 = 'VERWAR006',\n VERWAR007 = 'VERWAR007',\n}\n\n/* general warnings */\n\nconst warnings: Record<string, (a?: any, b?: any, c?: any) => void> = {};\n\nwarnings[Codes.VERWAR001] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR001,\n message: `Verdaccio doesn't need superuser privileges. don't run it under root`,\n});\n\nwarnings[Codes.VERWAR002] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR002,\n message: `The configuration property \"logs\" has been deprecated, please rename to \"log\" for future compatibility`,\n});\n\nwarnings[Codes.VERWAR003] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR003,\n message: 'rotating-file type is not longer supported, consider use [logrotate] instead',\n});\n\nwarnings[Codes.VERWAR004] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR004,\n message: `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/configuration#listen-port`,\n});\n\nwarnings[Codes.VERWAR006] = createDeprecation({\n code: Codes.VERWAR006,\n message:\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\nwarnings[Codes.VERWAR007] = createDeprecation({\n code: Codes.VERWAR007,\n message: `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\nwarnings[Codes.VERDEP003] = createDeprecation({\n code: Codes.VERDEP003,\n message: 'multiple addresses will be deprecated in the next major, only use one',\n});\n\nexport function emit(code: string, a?: string, b?: string, c?: string) {\n const warning = warnings[code];\n if (warning) {\n warning(a, b, c);\n }\n}\n"],"mappings":";;;;;;;;AAEA,IAAM,EAAE,mBAAmB,kBAAkB,gBAAA;AAE7C,IAAM,mBAAmB;AAEzB,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;;AACF,EAAA,CAAA,CAAA;AAIA,IAAM,WAAgE,CAAC;AAEvE,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;;;AAGX,CAAC;AAED,SAAA,eAA4B,kBAAkB;CAC5C,MAAA;CACA,SACE;AACJ,CAAC;AAED,SAAA,eAA4B,kBAAkB;CAC5C,MAAA;CACA,SAAS;;AAEX,CAAC;AAID,SAAA,eAA4B,kBAAkB;CAC5C,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAgB,KAAK,MAAc,GAAY,GAAY,GAAY;CACrE,MAAM,UAAU,SAAS;CACzB,IAAI,SACF,QAAQ,GAAG,GAAG,CAAC;AAEnB"}
@@ -18,39 +18,39 @@ var Codes = /* @__PURE__ */ function(Codes) {
18
18
  return Codes;
19
19
  }({});
20
20
  var warnings = {};
21
- warnings[Codes.VERWAR001] = createWarning({
21
+ warnings["VERWAR001"] = createWarning({
22
22
  name: verdaccioWarning,
23
- code: Codes.VERWAR001,
23
+ code: "VERWAR001",
24
24
  message: `Verdaccio doesn't need superuser privileges. don't run it under root`
25
25
  });
26
- warnings[Codes.VERWAR002] = createWarning({
26
+ warnings["VERWAR002"] = createWarning({
27
27
  name: verdaccioWarning,
28
- code: Codes.VERWAR002,
28
+ code: "VERWAR002",
29
29
  message: `The configuration property "logs" has been deprecated, please rename to "log" for future compatibility`
30
30
  });
31
- warnings[Codes.VERWAR003] = createWarning({
31
+ warnings["VERWAR003"] = createWarning({
32
32
  name: verdaccioWarning,
33
- code: Codes.VERWAR003,
33
+ code: "VERWAR003",
34
34
  message: "rotating-file type is not longer supported, consider use [logrotate] instead"
35
35
  });
36
- warnings[Codes.VERWAR004] = createWarning({
36
+ warnings["VERWAR004"] = createWarning({
37
37
  name: verdaccioWarning,
38
- code: Codes.VERWAR004,
38
+ code: "VERWAR004",
39
39
  message: `invalid address - %s, we expect a port (e.g. "4873"),
40
40
  host:port (e.g. "localhost:4873") or full url '(e.g. "http://localhost:4873/")
41
41
  https://verdaccio.org/docs/configuration#listen-port`
42
42
  });
43
- warnings[Codes.VERWAR006] = createDeprecation({
44
- code: Codes.VERWAR006,
43
+ warnings["VERWAR006"] = createDeprecation({
44
+ code: "VERWAR006",
45
45
  message: "the auth plugin method \"add_user\" in the auth plugin is deprecated and will be removed in next major release, rename to \"adduser\""
46
46
  });
47
- warnings[Codes.VERWAR007] = createDeprecation({
48
- code: Codes.VERWAR007,
47
+ warnings["VERWAR007"] = createDeprecation({
48
+ code: "VERWAR007",
49
49
  message: `the secret length is too long, it must be 32 characters long, please consider generate a new one
50
50
  Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`
51
51
  });
52
- warnings[Codes.VERDEP003] = createDeprecation({
53
- code: Codes.VERDEP003,
52
+ warnings["VERDEP003"] = createDeprecation({
53
+ code: "VERDEP003",
54
54
  message: "multiple addresses will be deprecated in the next major, only use one"
55
55
  });
56
56
  function emit(code, a, b, c) {
@@ -1 +1 @@
1
- {"version":3,"file":"warning-utils.mjs","names":[],"sources":["../src/warning-utils.ts"],"sourcesContent":["import processWarning from 'process-warning';\n\nconst { createDeprecation, createWarning } = processWarning;\n\nconst verdaccioWarning = 'VerdaccioWarning';\n\nexport enum Codes {\n VERWAR001 = 'VERWAR001',\n VERWAR002 = 'VERWAR002',\n VERWAR003 = 'VERWAR003',\n VERWAR004 = 'VERWAR004',\n // deprecation warnings\n VERDEP003 = 'VERDEP003',\n VERWAR006 = 'VERWAR006',\n VERWAR007 = 'VERWAR007',\n}\n\n/* general warnings */\n\nconst warnings: Record<string, (a?: any, b?: any, c?: any) => void> = {};\n\nwarnings[Codes.VERWAR001] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR001,\n message: `Verdaccio doesn't need superuser privileges. don't run it under root`,\n});\n\nwarnings[Codes.VERWAR002] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR002,\n message: `The configuration property \"logs\" has been deprecated, please rename to \"log\" for future compatibility`,\n});\n\nwarnings[Codes.VERWAR003] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR003,\n message: 'rotating-file type is not longer supported, consider use [logrotate] instead',\n});\n\nwarnings[Codes.VERWAR004] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR004,\n message: `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/configuration#listen-port`,\n});\n\nwarnings[Codes.VERWAR006] = createDeprecation({\n code: Codes.VERWAR006,\n message:\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\nwarnings[Codes.VERWAR007] = createDeprecation({\n code: Codes.VERWAR007,\n message: `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\nwarnings[Codes.VERDEP003] = createDeprecation({\n code: Codes.VERDEP003,\n message: 'multiple addresses will be deprecated in the next major, only use one',\n});\n\nexport function emit(code: string, a?: string, b?: string, c?: string) {\n const warning = warnings[code];\n if (warning) {\n warning(a, b, c);\n }\n}\n"],"mappings":";;;;;;;AAEA,IAAM,EAAE,mBAAmB,kBAAkB;AAE7C,IAAM,mBAAmB;AAEzB,IAAY,QAAL,yBAAA,OAAA;AACL,OAAA,eAAA;AACA,OAAA,eAAA;AACA,OAAA,eAAA;AACA,OAAA,eAAA;AAEA,OAAA,eAAA;AACA,OAAA,eAAA;AACA,OAAA,eAAA;;KACD;AAID,IAAM,WAAgE,EAAE;AAExE,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAS,MAAM,aAAa,cAAc;CACxC,MAAM;CACN,MAAM,MAAM;CACZ,SAAS;;;CAGV,CAAC;AAEF,SAAS,MAAM,aAAa,kBAAkB;CAC5C,MAAM,MAAM;CACZ,SACE;CACH,CAAC;AAEF,SAAS,MAAM,aAAa,kBAAkB;CAC5C,MAAM,MAAM;CACZ,SAAS;;CAEV,CAAC;AAIF,SAAS,MAAM,aAAa,kBAAkB;CAC5C,MAAM,MAAM;CACZ,SAAS;CACV,CAAC;AAEF,SAAgB,KAAK,MAAc,GAAY,GAAY,GAAY;CACrE,MAAM,UAAU,SAAS;AACzB,KAAI,QACF,SAAQ,GAAG,GAAG,EAAE"}
1
+ {"version":3,"file":"warning-utils.mjs","names":[],"sources":["../src/warning-utils.ts"],"sourcesContent":["import processWarning from 'process-warning';\n\nconst { createDeprecation, createWarning } = processWarning;\n\nconst verdaccioWarning = 'VerdaccioWarning';\n\nexport enum Codes {\n VERWAR001 = 'VERWAR001',\n VERWAR002 = 'VERWAR002',\n VERWAR003 = 'VERWAR003',\n VERWAR004 = 'VERWAR004',\n // deprecation warnings\n VERDEP003 = 'VERDEP003',\n VERWAR006 = 'VERWAR006',\n VERWAR007 = 'VERWAR007',\n}\n\n/* general warnings */\n\nconst warnings: Record<string, (a?: any, b?: any, c?: any) => void> = {};\n\nwarnings[Codes.VERWAR001] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR001,\n message: `Verdaccio doesn't need superuser privileges. don't run it under root`,\n});\n\nwarnings[Codes.VERWAR002] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR002,\n message: `The configuration property \"logs\" has been deprecated, please rename to \"log\" for future compatibility`,\n});\n\nwarnings[Codes.VERWAR003] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR003,\n message: 'rotating-file type is not longer supported, consider use [logrotate] instead',\n});\n\nwarnings[Codes.VERWAR004] = createWarning({\n name: verdaccioWarning,\n code: Codes.VERWAR004,\n message: `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/configuration#listen-port`,\n});\n\nwarnings[Codes.VERWAR006] = createDeprecation({\n code: Codes.VERWAR006,\n message:\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\nwarnings[Codes.VERWAR007] = createDeprecation({\n code: Codes.VERWAR007,\n message: `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\nwarnings[Codes.VERDEP003] = createDeprecation({\n code: Codes.VERDEP003,\n message: 'multiple addresses will be deprecated in the next major, only use one',\n});\n\nexport function emit(code: string, a?: string, b?: string, c?: string) {\n const warning = warnings[code];\n if (warning) {\n warning(a, b, c);\n }\n}\n"],"mappings":";;;;;;;AAEA,IAAM,EAAE,mBAAmB,kBAAkB;AAE7C,IAAM,mBAAmB;AAEzB,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;;AACF,EAAA,CAAA,CAAA;AAIA,IAAM,WAAgE,CAAC;AAEvE,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAA,eAA4B,cAAc;CACxC,MAAM;CACN,MAAA;CACA,SAAS;;;AAGX,CAAC;AAED,SAAA,eAA4B,kBAAkB;CAC5C,MAAA;CACA,SACE;AACJ,CAAC;AAED,SAAA,eAA4B,kBAAkB;CAC5C,MAAA;CACA,SAAS;;AAEX,CAAC;AAID,SAAA,eAA4B,kBAAkB;CAC5C,MAAA;CACA,SAAS;AACX,CAAC;AAED,SAAgB,KAAK,MAAc,GAAY,GAAY,GAAY;CACrE,MAAM,UAAU,SAAS;CACzB,IAAI,SACF,QAAQ,GAAG,GAAG,CAAC;AAEnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/core",
3
- "version": "9.0.0-next-9.17",
3
+ "version": "9.0.0-next-9.18",
4
4
  "description": "Verdaccio Core Components",
5
5
  "keywords": [
6
6
  "private",
@@ -33,19 +33,19 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "ajv": "8.18.0",
36
+ "ajv": "8.20.0",
37
37
  "http-errors": "2.0.1",
38
38
  "http-status-codes": "2.3.0",
39
- "minimatch": "9.0.7",
39
+ "minimatch": "10.2.5",
40
40
  "process-warning": "5.0.0",
41
41
  "sanitize-filename": "1.6.3",
42
- "semver": "7.7.4"
42
+ "semver": "7.8.1"
43
43
  },
44
44
  "devDependencies": {
45
- "@verdaccio/types": "14.0.0-next-9.8",
45
+ "@verdaccio/types": "14.0.0-next-9.9",
46
46
  "express": "5.2.1",
47
47
  "typedoc": "0.28.14",
48
- "vitest": "4.1.0"
48
+ "vitest": "4.1.7"
49
49
  },
50
50
  "funding": {
51
51
  "type": "opencollective",