'use strict';

var require$$0 = require('module');

var lib;
var hasRequiredLib;
function requireLib() {
  if (hasRequiredLib) return lib;
  hasRequiredLib = 1;
  const {
    builtinModules: builtins
  } = require$$0;
  var scopedPackagePattern = new RegExp('^(?:@([^/]+?)[/])?([^/]+?)$');
  var exclusionList = ['node_modules', 'favicon.ico'];
  function validate(name) {
    var warnings = [];
    var errors = [];
    if (name === null) {
      errors.push('name cannot be null');
      return done(warnings, errors);
    }
    if (name === undefined) {
      errors.push('name cannot be undefined');
      return done(warnings, errors);
    }
    if (typeof name !== 'string') {
      errors.push('name must be a string');
      return done(warnings, errors);
    }
    if (!name.length) {
      errors.push('name length must be greater than zero');
    }
    if (name.startsWith('.')) {
      errors.push('name cannot start with a period');
    }
    if (name.match(/^_/)) {
      errors.push('name cannot start with an underscore');
    }
    if (name.trim() !== name) {
      errors.push('name cannot contain leading or trailing spaces');
    }

    // No funny business
    exclusionList.forEach(function (excludedName) {
      if (name.toLowerCase() === excludedName) {
        errors.push(excludedName + ' is not a valid package name');
      }
    });

    // Generate warnings for stuff that used to be allowed

    // core module names like http, events, util, etc
    if (builtins.includes(name.toLowerCase())) {
      warnings.push(name + ' is a core module name');
    }
    if (name.length > 214) {
      warnings.push('name can no longer contain more than 214 characters');
    }

    // mIxeD CaSe nAMEs
    if (name.toLowerCase() !== name) {
      warnings.push('name can no longer contain capital letters');
    }
    if (/[~'!()*]/.test(name.split('/').slice(-1)[0])) {
      warnings.push('name can no longer contain special characters ("~\'!()*")');
    }
    if (encodeURIComponent(name) !== name) {
      // Maybe it's a scoped package name, like @user/package
      var nameMatch = name.match(scopedPackagePattern);
      if (nameMatch) {
        var user = nameMatch[1];
        var pkg = nameMatch[2];
        if (pkg.startsWith('.')) {
          errors.push('name cannot start with a period');
        }
        if (encodeURIComponent(user) === user && encodeURIComponent(pkg) === pkg) {
          return done(warnings, errors);
        }
      }
      errors.push('name can only contain URL-friendly characters');
    }
    return done(warnings, errors);
  }
  var done = function (warnings, errors) {
    var result = {
      validForNewPackages: errors.length === 0 && warnings.length === 0,
      validForOldPackages: errors.length === 0,
      warnings: warnings,
      errors: errors
    };
    if (!result.warnings.length) {
      delete result.warnings;
    }
    if (!result.errors.length) {
      delete result.errors;
    }
    return result;
  };
  lib = validate;
  return lib;
}

var validateNpmPackageName;
var hasRequiredValidateNpmPackageName;
function requireValidateNpmPackageName() {
  if (hasRequiredValidateNpmPackageName) return validateNpmPackageName;
  hasRequiredValidateNpmPackageName = 1;
  validateNpmPackageName = requireLib();
  return validateNpmPackageName;
}

var validateNpmPackageNameExports = requireValidateNpmPackageName();

module.exports = validateNpmPackageNameExports;
