@verdaccio/core 9.0.0-next-9.34 → 9.0.0-next-9.35
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.
|
@@ -29,5 +29,5 @@ export declare function normalizeMetadata(manifest: Manifest, name: string): Man
|
|
|
29
29
|
* @return {Boolean}
|
|
30
30
|
*/
|
|
31
31
|
export declare function isObject(obj: any): boolean;
|
|
32
|
-
export declare function validatePassword(password:
|
|
32
|
+
export declare function validatePassword(password: unknown, validation?: RegExp | string): boolean;
|
|
33
33
|
export declare function validateUserName(userName: any, expectedName: string): boolean;
|
|
@@ -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\nconst scopedPackagePattern = /^(?:@([^/]+?)[/])?([^/]+?)$/;\nconst exclusionList = ['node_modules', 'favicon.ico'];\n\n// encodeURIComponent throws on malformed UTF-16, such as a lone surrogate\nfunction isUrlFriendly(value: string): boolean {\n try {\n return encodeURIComponent(value) === value;\n } catch {\n return false;\n }\n}\n\n/** Package name rules for existing packages; a leading hyphen stays valid. */\nexport function validatePackageName(name: unknown): boolean {\n if (typeof name !== 'string' || !name.length) {\n return false;\n }\n if (name.startsWith('.') || name.startsWith('_') || name.trim() !== name) {\n return false;\n }\n if (exclusionList.includes(name.toLowerCase())) {\n return false;\n }\n if (isUrlFriendly(name)) {\n return true;\n }\n const nameMatch = name.match(scopedPackagePattern);\n if (!nameMatch) {\n return false;\n }\n const [, user, pkg] = nameMatch;\n return user !== undefined && isUrlFriendly(user) && !pkg.startsWith('.') && isUrlFriendly(pkg);\n}\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 // scoped names are checked segment by segment\n if (isPackageNameScoped(name) && name.includes('/')) {\n return validatePackage(name);\n }\n\n const normalizedName: string = name.toLowerCase();\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 if (!isValidPackagePath(name)) {\n return false;\n }\n return validatePackageName(name);\n}\n\nfunction isValidPackagePath(name: string): boolean {\n // Split on every separator (no limit) so trailing or interior slashes are not\n // silently dropped, keeping a single canonical form per package name.\n const nameList = name.split('/');\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n } else if (nameList.length === 2) {\n // scoped package\n return (\n nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1])\n );\n }\n // anything with 3+ segments is never a valid package name\n return false;\n}\n\n/**\n * Validate the package metadata, add additional properties whether are missing within\n * the metadata properties.\n * @param {*} manifest\n * @param {*} name\n * @return {Object} the object with additional properties as dist-tags ad versions\n */\nexport function normalizeMetadata(manifest: Manifest, name: string): Manifest {\n assert.strictEqual(manifest.name, name);\n const _manifest = { ...manifest };\n\n if (!isObject(manifest[DIST_TAGS])) {\n _manifest[DIST_TAGS] = {};\n }\n\n if (!Array.isArray(manifest[MAINTAINERS])) {\n _manifest[MAINTAINERS] = [];\n }\n\n // This may not be needed\n if (!isObject(manifest['versions'])) {\n _manifest['versions'] = {};\n }\n\n if (!isObject(manifest['time'])) {\n _manifest['time'] = {};\n }\n\n return _manifest;\n}\n\n/**\n * Check whether an element is an Object\n * @param {*} obj the element\n * @return {Boolean}\n */\nexport function isObject(obj: any): boolean {\n // if (obj === null || typeof obj === 'undefined' || typeof obj === 'string') {\n // return false;\n // }\n\n // return (\n // (typeof obj === 'object' || typeof obj.prototype === 'undefined') &&\n // Array.isArray(obj) === false\n // );\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function validatePassword(\n password:
|
|
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\nconst scopedPackagePattern = /^(?:@([^/]+?)[/])?([^/]+?)$/;\nconst exclusionList = ['node_modules', 'favicon.ico'];\n\n// encodeURIComponent throws on malformed UTF-16, such as a lone surrogate\nfunction isUrlFriendly(value: string): boolean {\n try {\n return encodeURIComponent(value) === value;\n } catch {\n return false;\n }\n}\n\n/** Package name rules for existing packages; a leading hyphen stays valid. */\nexport function validatePackageName(name: unknown): boolean {\n if (typeof name !== 'string' || !name.length) {\n return false;\n }\n if (name.startsWith('.') || name.startsWith('_') || name.trim() !== name) {\n return false;\n }\n if (exclusionList.includes(name.toLowerCase())) {\n return false;\n }\n if (isUrlFriendly(name)) {\n return true;\n }\n const nameMatch = name.match(scopedPackagePattern);\n if (!nameMatch) {\n return false;\n }\n const [, user, pkg] = nameMatch;\n return user !== undefined && isUrlFriendly(user) && !pkg.startsWith('.') && isUrlFriendly(pkg);\n}\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 // scoped names are checked segment by segment\n if (isPackageNameScoped(name) && name.includes('/')) {\n return validatePackage(name);\n }\n\n const normalizedName: string = name.toLowerCase();\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 if (!isValidPackagePath(name)) {\n return false;\n }\n return validatePackageName(name);\n}\n\nfunction isValidPackagePath(name: string): boolean {\n // Split on every separator (no limit) so trailing or interior slashes are not\n // silently dropped, keeping a single canonical form per package name.\n const nameList = name.split('/');\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n } else if (nameList.length === 2) {\n // scoped package\n return (\n nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1])\n );\n }\n // anything with 3+ segments is never a valid package name\n return false;\n}\n\n/**\n * Validate the package metadata, add additional properties whether are missing within\n * the metadata properties.\n * @param {*} manifest\n * @param {*} name\n * @return {Object} the object with additional properties as dist-tags ad versions\n */\nexport function normalizeMetadata(manifest: Manifest, name: string): Manifest {\n assert.strictEqual(manifest.name, name);\n const _manifest = { ...manifest };\n\n if (!isObject(manifest[DIST_TAGS])) {\n _manifest[DIST_TAGS] = {};\n }\n\n if (!Array.isArray(manifest[MAINTAINERS])) {\n _manifest[MAINTAINERS] = [];\n }\n\n // This may not be needed\n if (!isObject(manifest['versions'])) {\n _manifest['versions'] = {};\n }\n\n if (!isObject(manifest['time'])) {\n _manifest['time'] = {};\n }\n\n return _manifest;\n}\n\n/**\n * Check whether an element is an Object\n * @param {*} obj the element\n * @return {Boolean}\n */\nexport function isObject(obj: any): boolean {\n // if (obj === null || typeof obj === 'undefined' || typeof obj === 'string') {\n // return false;\n // }\n\n // return (\n // (typeof obj === 'object' || typeof obj.prototype === 'undefined') &&\n // Array.isArray(obj) === false\n // );\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function validatePassword(\n password: unknown,\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,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB,CAAC,gBAAgB,aAAa;AAGpD,SAAS,cAAc,OAAwB;CAC7C,IAAI;EACF,OAAO,mBAAmB,KAAK,MAAM;CACvC,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,oBAAoB,MAAwB;CAC1D,IAAI,OAAO,SAAS,YAAY,CAAC,KAAK,QACpC,OAAO;CAET,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,KAAK,KAAK,KAAK,MAAM,MAClE,OAAO;CAET,IAAI,cAAc,SAAS,KAAK,YAAY,CAAC,GAC3C,OAAO;CAET,IAAI,cAAc,IAAI,GACpB,OAAO;CAET,MAAM,YAAY,KAAK,MAAM,oBAAoB;CACjD,IAAI,CAAC,WACH,OAAO;CAET,MAAM,GAAG,MAAM,OAAO;CACtB,OAAO,SAAS,KAAA,KAAa,cAAc,IAAI,KAAK,CAAC,IAAI,WAAW,GAAG,KAAK,cAAc,GAAG;AAC/F;AAEA,SAAgB,oBAAoB,MAAuB;CACzD,OAAO,KAAK,WAAW,GAAG;AAC5B;;;;;;AAOA,SAAgB,aAAa,MAAuB;CAClD,IAAI,OAAO,SAAS,UAClB,OAAO;CAIT,IAAI,oBAAoB,IAAI,KAAK,KAAK,SAAS,GAAG,GAChD,OAAO,gBAAgB,IAAI;CAG7B,MAAM,iBAAyB,KAAK,YAAY;;;;;;;;;;;;CAahD,OAAO,EACL,CAAC,eAAe,MAAM,0BAA0B,KAChD,eAAe,WAAW,GAAG,KAC7B;EAAC;EAAgB;EAAa;CAAa,CAAC,CAAC,SAAS,cAAc;AAExE;;;;;AAMA,SAAgB,gBAAgB,MAAuB;CACrD,IAAI,CAAC,mBAAmB,IAAI,GAC1B,OAAO;CAET,OAAO,oBAAoB,IAAI;AACjC;AAEA,SAAS,mBAAmB,MAAuB;CAGjD,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;MAC1B,IAAI,SAAS,WAAW,GAE7B,OACE,SAAS,EAAE,CAAC,OAAO,OAAO,aAAa,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;CAI5F,OAAO;AACT;;;;;;;;AASA,SAAgB,kBAAkB,UAAoB,MAAwB;CAC5E,YAAA,QAAO,YAAY,SAAS,MAAM,IAAI;CACtC,MAAM,YAAY,EAAE,GAAG,SAAS;CAEhC,IAAI,CAAC,SAAS,SAAA,YAAmB,GAC/B,UAAU,kBAAA,aAAa,CAAC;CAG1B,IAAI,CAAC,MAAM,QAAQ,SAAA,cAAqB,GACtC,UAAU,kBAAA,eAAe,CAAC;CAI5B,IAAI,CAAC,SAAS,SAAS,WAAW,GAChC,UAAU,cAAc,CAAC;CAG3B,IAAI,CAAC,SAAS,SAAS,OAAO,GAC5B,UAAU,UAAU,CAAC;CAGvB,OAAO;AACT;;;;;;AAOA,SAAgB,SAAS,KAAmB;CAS1C,OAAO,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AACjD;AAEA,SAAgB,iBACd,UACA,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,CAAC,CAAC,OAAO,sBAC3B,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO;AAE/B"}
|
|
@@ -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\nconst scopedPackagePattern = /^(?:@([^/]+?)[/])?([^/]+?)$/;\nconst exclusionList = ['node_modules', 'favicon.ico'];\n\n// encodeURIComponent throws on malformed UTF-16, such as a lone surrogate\nfunction isUrlFriendly(value: string): boolean {\n try {\n return encodeURIComponent(value) === value;\n } catch {\n return false;\n }\n}\n\n/** Package name rules for existing packages; a leading hyphen stays valid. */\nexport function validatePackageName(name: unknown): boolean {\n if (typeof name !== 'string' || !name.length) {\n return false;\n }\n if (name.startsWith('.') || name.startsWith('_') || name.trim() !== name) {\n return false;\n }\n if (exclusionList.includes(name.toLowerCase())) {\n return false;\n }\n if (isUrlFriendly(name)) {\n return true;\n }\n const nameMatch = name.match(scopedPackagePattern);\n if (!nameMatch) {\n return false;\n }\n const [, user, pkg] = nameMatch;\n return user !== undefined && isUrlFriendly(user) && !pkg.startsWith('.') && isUrlFriendly(pkg);\n}\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 // scoped names are checked segment by segment\n if (isPackageNameScoped(name) && name.includes('/')) {\n return validatePackage(name);\n }\n\n const normalizedName: string = name.toLowerCase();\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 if (!isValidPackagePath(name)) {\n return false;\n }\n return validatePackageName(name);\n}\n\nfunction isValidPackagePath(name: string): boolean {\n // Split on every separator (no limit) so trailing or interior slashes are not\n // silently dropped, keeping a single canonical form per package name.\n const nameList = name.split('/');\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n } else if (nameList.length === 2) {\n // scoped package\n return (\n nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1])\n );\n }\n // anything with 3+ segments is never a valid package name\n return false;\n}\n\n/**\n * Validate the package metadata, add additional properties whether are missing within\n * the metadata properties.\n * @param {*} manifest\n * @param {*} name\n * @return {Object} the object with additional properties as dist-tags ad versions\n */\nexport function normalizeMetadata(manifest: Manifest, name: string): Manifest {\n assert.strictEqual(manifest.name, name);\n const _manifest = { ...manifest };\n\n if (!isObject(manifest[DIST_TAGS])) {\n _manifest[DIST_TAGS] = {};\n }\n\n if (!Array.isArray(manifest[MAINTAINERS])) {\n _manifest[MAINTAINERS] = [];\n }\n\n // This may not be needed\n if (!isObject(manifest['versions'])) {\n _manifest['versions'] = {};\n }\n\n if (!isObject(manifest['time'])) {\n _manifest['time'] = {};\n }\n\n return _manifest;\n}\n\n/**\n * Check whether an element is an Object\n * @param {*} obj the element\n * @return {Boolean}\n */\nexport function isObject(obj: any): boolean {\n // if (obj === null || typeof obj === 'undefined' || typeof obj === 'string') {\n // return false;\n // }\n\n // return (\n // (typeof obj === 'object' || typeof obj.prototype === 'undefined') &&\n // Array.isArray(obj) === false\n // );\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function validatePassword(\n password:
|
|
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\nconst scopedPackagePattern = /^(?:@([^/]+?)[/])?([^/]+?)$/;\nconst exclusionList = ['node_modules', 'favicon.ico'];\n\n// encodeURIComponent throws on malformed UTF-16, such as a lone surrogate\nfunction isUrlFriendly(value: string): boolean {\n try {\n return encodeURIComponent(value) === value;\n } catch {\n return false;\n }\n}\n\n/** Package name rules for existing packages; a leading hyphen stays valid. */\nexport function validatePackageName(name: unknown): boolean {\n if (typeof name !== 'string' || !name.length) {\n return false;\n }\n if (name.startsWith('.') || name.startsWith('_') || name.trim() !== name) {\n return false;\n }\n if (exclusionList.includes(name.toLowerCase())) {\n return false;\n }\n if (isUrlFriendly(name)) {\n return true;\n }\n const nameMatch = name.match(scopedPackagePattern);\n if (!nameMatch) {\n return false;\n }\n const [, user, pkg] = nameMatch;\n return user !== undefined && isUrlFriendly(user) && !pkg.startsWith('.') && isUrlFriendly(pkg);\n}\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 // scoped names are checked segment by segment\n if (isPackageNameScoped(name) && name.includes('/')) {\n return validatePackage(name);\n }\n\n const normalizedName: string = name.toLowerCase();\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 if (!isValidPackagePath(name)) {\n return false;\n }\n return validatePackageName(name);\n}\n\nfunction isValidPackagePath(name: string): boolean {\n // Split on every separator (no limit) so trailing or interior slashes are not\n // silently dropped, keeping a single canonical form per package name.\n const nameList = name.split('/');\n if (nameList.length === 1) {\n // normal package\n return validateName(nameList[0]);\n } else if (nameList.length === 2) {\n // scoped package\n return (\n nameList[0][0] === '@' && validateName(nameList[0].slice(1)) && validateName(nameList[1])\n );\n }\n // anything with 3+ segments is never a valid package name\n return false;\n}\n\n/**\n * Validate the package metadata, add additional properties whether are missing within\n * the metadata properties.\n * @param {*} manifest\n * @param {*} name\n * @return {Object} the object with additional properties as dist-tags ad versions\n */\nexport function normalizeMetadata(manifest: Manifest, name: string): Manifest {\n assert.strictEqual(manifest.name, name);\n const _manifest = { ...manifest };\n\n if (!isObject(manifest[DIST_TAGS])) {\n _manifest[DIST_TAGS] = {};\n }\n\n if (!Array.isArray(manifest[MAINTAINERS])) {\n _manifest[MAINTAINERS] = [];\n }\n\n // This may not be needed\n if (!isObject(manifest['versions'])) {\n _manifest['versions'] = {};\n }\n\n if (!isObject(manifest['time'])) {\n _manifest['time'] = {};\n }\n\n return _manifest;\n}\n\n/**\n * Check whether an element is an Object\n * @param {*} obj the element\n * @return {Boolean}\n */\nexport function isObject(obj: any): boolean {\n // if (obj === null || typeof obj === 'undefined' || typeof obj === 'string') {\n // return false;\n // }\n\n // return (\n // (typeof obj === 'object' || typeof obj.prototype === 'undefined') &&\n // Array.isArray(obj) === false\n // );\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nexport function validatePassword(\n password: unknown,\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,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB,CAAC,gBAAgB,aAAa;AAGpD,SAAS,cAAc,OAAwB;CAC7C,IAAI;EACF,OAAO,mBAAmB,KAAK,MAAM;CACvC,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,oBAAoB,MAAwB;CAC1D,IAAI,OAAO,SAAS,YAAY,CAAC,KAAK,QACpC,OAAO;CAET,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,KAAK,KAAK,KAAK,MAAM,MAClE,OAAO;CAET,IAAI,cAAc,SAAS,KAAK,YAAY,CAAC,GAC3C,OAAO;CAET,IAAI,cAAc,IAAI,GACpB,OAAO;CAET,MAAM,YAAY,KAAK,MAAM,oBAAoB;CACjD,IAAI,CAAC,WACH,OAAO;CAET,MAAM,GAAG,MAAM,OAAO;CACtB,OAAO,SAAS,KAAA,KAAa,cAAc,IAAI,KAAK,CAAC,IAAI,WAAW,GAAG,KAAK,cAAc,GAAG;AAC/F;AAEA,SAAgB,oBAAoB,MAAuB;CACzD,OAAO,KAAK,WAAW,GAAG;AAC5B;;;;;;AAOA,SAAgB,aAAa,MAAuB;CAClD,IAAI,OAAO,SAAS,UAClB,OAAO;CAIT,IAAI,oBAAoB,IAAI,KAAK,KAAK,SAAS,GAAG,GAChD,OAAO,gBAAgB,IAAI;CAG7B,MAAM,iBAAyB,KAAK,YAAY;;;;;;;;;;;;CAahD,OAAO,EACL,CAAC,eAAe,MAAM,0BAA0B,KAChD,eAAe,WAAW,GAAG,KAC7B;EAAC;EAAgB;EAAa;CAAa,CAAC,CAAC,SAAS,cAAc;AAExE;;;;;AAMA,SAAgB,gBAAgB,MAAuB;CACrD,IAAI,CAAC,mBAAmB,IAAI,GAC1B,OAAO;CAET,OAAO,oBAAoB,IAAI;AACjC;AAEA,SAAS,mBAAmB,MAAuB;CAGjD,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,SAAS,WAAW,GAEtB,OAAO,aAAa,SAAS,EAAE;MAC1B,IAAI,SAAS,WAAW,GAE7B,OACE,SAAS,EAAE,CAAC,OAAO,OAAO,aAAa,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,aAAa,SAAS,EAAE;CAI5F,OAAO;AACT;;;;;;;;AASA,SAAgB,kBAAkB,UAAoB,MAAwB;CAC5E,OAAO,YAAY,SAAS,MAAM,IAAI;CACtC,MAAM,YAAY,EAAE,GAAG,SAAS;CAEhC,IAAI,CAAC,SAAS,SAAA,YAAmB,GAC/B,UAAU,aAAa,CAAC;CAG1B,IAAI,CAAC,MAAM,QAAQ,SAAA,cAAqB,GACtC,UAAU,eAAe,CAAC;CAI5B,IAAI,CAAC,SAAS,SAAS,WAAW,GAChC,UAAU,cAAc,CAAC;CAG3B,IAAI,CAAC,SAAS,SAAS,OAAO,GAC5B,UAAU,UAAU,CAAC;CAGvB,OAAO;AACT;;;;;;AAOA,SAAgB,SAAS,KAAmB;CAS1C,OAAO,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AACjD;AAEA,SAAgB,iBACd,UACA,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,CAAC,CAAC,OAAO,sBAC3B,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO;AAE/B"}
|