var DecompressZip=require("decompress-zip"),semver=require("semver"),path=require("path"),temp=require("temp"),fs=require("fs-extra"),performNpmInstallIfRequired=require("./npm-installer").performNpmInstallIfRequired;temp.track();var Errors={NOT_FOUND_ERR:"NOT_FOUND_ERR",INVALID_ZIP_FILE:"INVALID_ZIP_FILE",INVALID_PACKAGE_JSON:"INVALID_PACKAGE_JSON",MISSING_PACKAGE_NAME:"MISSING_PACKAGE_NAME",BAD_PACKAGE_NAME:"BAD_PACKAGE_NAME",MISSING_PACKAGE_VERSION:"MISSING_PACKAGE_VERSION",INVALID_VERSION_NUMBER:"INVALID_VERSION_NUMBER",MISSING_MAIN:"MISSING_MAIN",MISSING_PACKAGE_JSON:"MISSING_PACKAGE_JSON",INVALID_BRACKETS_VERSION:"INVALID_BRACKETS_VERSION",DISALLOWED_WORDS:"DISALLOWED_WORDS"},ignoredFolders=["__MACOSX"];function validateName(name){return!!/^[a-z0-9][a-z0-9._\-]*$/.exec(name)}var _personRegex=/^([^<\(]+)(?:\s+<([^>]+)>)?(?:\s+\(([^\)]+)\))?$/;function parsePersonString(obj){if("string"==typeof obj){var parts=_personRegex.exec(obj);if(!parts)return{name:obj};var result={name:parts[1]};return parts[2]&&(result.email=parts[2]),parts[3]&&(result.url=parts[3]),result}return obj}function containsWords(wordlist,str){var i,matches=[];for(i=0;i0&&errors.push([Errors.DISALLOWED_WORDS,field,words.toString(),path])}),callback(null,errors,metadata)}}):(options.requirePackageJSON&&errors.push([Errors.MISSING_PACKAGE_JSON,path]),callback(null,errors,null))}function extractAndValidateFiles(zipPath,extractDir,options,callback){var unzipper=new DecompressZip(zipPath);unzipper.on("error",function(err){callback(null,{errors:[[Errors.INVALID_ZIP_FILE,zipPath,err]]})}),unzipper.on("extract",function(log){findCommonPrefix(extractDir,function(err,commonPrefix){if(err)callback(err,null);else{var packageJSON=path.join(extractDir,commonPrefix,"package.json");validatePackageJSON(zipPath,packageJSON,options,function(err,errors,metadata){if(err)callback(err,null);else{var mainJS=path.join(extractDir,commonPrefix,"main.js"),isTheme;metadata&&metadata.theme||fs.existsSync(mainJS)||errors.push([Errors.MISSING_MAIN,zipPath,mainJS]);var npmOptions=["--production"];options.proxy&&npmOptions.push("--proxy "+options.proxy),process.platform.startsWith("win")&&(npmOptions.push("--arch=ia32"),npmOptions.push("--npm_config_arch=ia32"),npmOptions.push("--npm_config_target_arch=ia32")),performNpmInstallIfRequired(npmOptions,{errors:errors,metadata:metadata,commonPrefix:commonPrefix,extractDir:extractDir},callback)}})}})}),unzipper.extract({path:extractDir,filter:function(file){return"SymbolicLink"!==file.type}})}function validate(path,options,callback){options=options||{},fs.exists(path,function(doesExist){doesExist?temp.mkdir("bracketsPackage_",function _tempDirCreated(err,extractDir){err?callback(err,null):extractAndValidateFiles(path,extractDir,options,callback)}):callback(null,{errors:[[Errors.NOT_FOUND_ERR,path]]})})}exports._parsePersonString=parsePersonString,exports.errors=Errors,exports.validate=validate;