UNPKG

@artilleryio/platform-fargate

Version:
1 lines 8.58 kB
const path=require("path"),fs=require("fs"),A=require("async"),isBuiltinModule=require("is-builtin-module"),detective=require("detective"),depTree=require("dependency-tree"),walkSync=require("walk-sync"),debug=require("debug")("bom"),_=require("lodash"),chalk=require("chalk"),BUILTIN_PLUGINS=require("../plugins").getAllPluginNames(),BUILTIN_ENGINES=require("../plugins").getOfficialEngines(),Table=require("cli-table3");if(require.main===module){require("../create-artillery-log")();const assert=require("assert"),SCRIPT=process.env["SCRIPT"];let EXTRA_FILES=[];process.env.EXTRA_FILES&&(EXTRA_FILES=process.env.EXTRA_FILES.split(",").map(p=>path.resolve(process.cwd(),p))),assert(SCRIPT,"SCRIPT env var pointing to the script file should be set"),artillery.log("SCRIPT = "+SCRIPT),artillery.log("EXTRA_FILES = "+EXTRA_FILES);const absoluteScriptPath=path.resolve(process.cwd(),SCRIPT);artillery.log("absoluteScriptPath = "+absoluteScriptPath),artillery.log("\n\n"),createBOM(absoluteScriptPath,EXTRA_FILES,{},function(err,bom){err?artillery.log(err):prettyPrint(bom)})}function createBOM(absoluteScriptPath,extraFiles,opts,callback){A.waterfall([A.constant(absoluteScriptPath),global.artillery.__util.readScript,global.artillery.__util.parseScript,(scriptData,next)=>next(null,{opts:{scriptData:scriptData,absoluteScriptPath:absoluteScriptPath},localFilePaths:[absoluteScriptPath],npmModules:[]}),getPlugins,getCustomEngines,getCustomJsDependencies,getVariableDataFiles,getFileUploadPluginFiles,getExtraFiles,expandDirectories],function(err,context){if(err)return callback(err,null);context.localFilePaths=context.localFilePaths.concat(extraFiles);let prefix="",packageDescriptionFiles=(prefix=1===context.localFilePaths.length?0===(prefix=context.localFilePaths[0].substring(0,context.localFilePaths[0].length-path.basename(context.localFilePaths[0]).length)).length?context.localFilePaths[0]:prefix:commonPrefix(context.localFilePaths),debug("prefix",prefix),[".npmrc"]);opts.packageJsonPath?packageDescriptionFiles.push(opts.packageJsonPath):packageDescriptionFiles=packageDescriptionFiles.concat(["package.json","package-lock.json","yarn.lock"]);var err=packageDescriptionFiles.map(s=>path.join(prefix,s)),err=(debug(err),err.forEach(function(p){try{fs.statSync(p)&&context.localFilePaths.push(p)}catch(ignoredErr){}}),context.localFilePaths.map(p=>({orig:p,noPrefix:p.substring(prefix.length,p.length)}))),pkgPath=_.find(err,f=>"package.json"===f.noPrefix);return pkgPath?(pkgPath=JSON.parse(fs.readFileSync(pkgPath.orig,"utf8")),pkgPath=[].concat(Object.keys(pkgPath.dependencies||{}),Object.keys(pkgPath.devDependencies||{})),context.pkgDeps=pkgPath,context.npmModules=_.uniq(context.npmModules.concat(pkgPath)).sort()):context.pkgDeps=[],callback(null,{files:_.uniqWith(err,_.isEqual),modules:_.uniq(context.npmModules),pkgDeps:context.pkgDeps})})}function isLocalModule(modName){return modName.startsWith(".")}function getPlugins(context,next){var environmentPlugins=_.reduce(_.get(context,"opts.scriptData.config.environments",{}),function(acc,envSpec,envName){return acc=acc.concat(Object.keys(envSpec.plugins||[]))},[]),environmentPlugins=Object.keys(_.get(context,"opts.scriptData.config.plugins",{})).concat(environmentPlugins),environmentPlugins=_.uniq(environmentPlugins.filter(p=>-1===BUILTIN_PLUGINS.indexOf(p)).map(p=>"artillery-plugin-"+p));return debug(environmentPlugins),context.npmModules=context.npmModules.concat(environmentPlugins),next(null,context)}function getCustomEngines(context,next){var environmentEngines=_.reduce(_.get(context,"opts.scriptData.config.environments",{}),function(acc,envSpec,envName){return acc=acc.concat(Object.keys(envSpec.engines||[]))},[]),environmentEngines=Object.keys(_.get(context,"opts.scriptData.config.engines",{})).concat(environmentEngines),environmentEngines=_.uniq(environmentEngines.filter(p=>-1===BUILTIN_ENGINES.indexOf(p)).map(p=>"artillery-engine-"+p));return context.npmModules=context.npmModules.concat(environmentEngines),next(null,context)}function getCustomJsDependencies(context,next){var tree,allNpmDeps,procPath;return context.opts.scriptData.config&&context.opts.scriptData.config.processor?(procPath=path.resolve(path.dirname(context.opts.absoluteScriptPath),context.opts.scriptData.config.processor),context.localFilePaths.push(procPath),tree=depTree.toList({filename:procPath,directory:path.dirname(context.opts.absoluteScriptPath),filter:path=>-1===path.indexOf("node_modules")}),debug("tree"),debug(tree),allNpmDeps=tree.map(function(filename){return filename=fs.readFileSync(filename),detective(filename).filter(requireString=>!isBuiltinModule(requireString)&&!isLocalModule(requireString)).map(requireString=>requireString.startsWith("@")?requireString.split("/")[0]+"/"+requireString.split("/")[1]:requireString.split("/")[0])}),debug(allNpmDeps),allNpmDeps=allNpmDeps.reduce((acc,deps)=>(deps.forEach(d=>{-1===acc.findIndex(x=>x===d)&&acc.push(d)}),acc),[]),debug(allNpmDeps),procPath=fs.readFileSync(procPath),detective(procPath),context.localFilePaths=context.localFilePaths.concat(tree),context.npmModules=context.npmModules.concat(allNpmDeps),debug("got custom JS dependencies")):debug("no custom JS dependencies"),next(null,context)}function getVariableDataFiles(context,next){function resolvePayloadPaths(obj){let result=[];return obj.payload&&(_.isArray(obj.payload)?obj.payload.forEach(payloadSpec=>{result.push(path.resolve(path.dirname(context.opts.absoluteScriptPath),payloadSpec.path))}):_.isObject(obj.payload)&&result.push(path.resolve(path.dirname(context.opts.absoluteScriptPath),obj.payload.path))),result}return context.localFilePaths=context.localFilePaths.concat(resolvePayloadPaths(context.opts.scriptData.config)),context.opts.scriptData.config.environments=context.opts.scriptData.config.environments||{},Object.keys(context.opts.scriptData.config.environments).forEach(envName=>{envName=context.opts.scriptData.config.environments[envName];context.localFilePaths=context.localFilePaths.concat(resolvePayloadPaths(envName))}),next(null,context)}function getFileUploadPluginFiles(context,next){var absPaths;return context.opts.scriptData.config&&context.opts.scriptData.config.plugins&&context.opts.scriptData.config.plugins["http-file-uploads"]&&context.opts.scriptData.config.plugins["http-file-uploads"].filePaths&&(absPaths=context.opts.scriptData.config.plugins["http-file-uploads"].filePaths.map(p=>path.resolve(path.dirname(context.opts.absoluteScriptPath),p)),context.localFilePaths=context.localFilePaths.concat(absPaths)),next(null,context)}function getExtraFiles(context,next){var absPaths;return context.opts.scriptData.config&&context.opts.scriptData.config.includeFiles&&(absPaths=_.map(context.opts.scriptData.config.includeFiles,p=>{p=path.resolve(path.dirname(context.opts.absoluteScriptPath),p);return debug("includeFile:",p),p}),context.localFilePaths=context.localFilePaths.concat(absPaths)),next(null,context)}function expandDirectories(context,next){debug(context.localFilePaths);var dirs=context.localFilePaths.filter(p=>{let result=!1;try{result=fs.statSync(p).isDirectory()}catch(fsErr){}return result});return context.localFilePaths=context.localFilePaths.filter(p=>{let result=!0;try{result=!fs.statSync(p).isDirectory()}catch(fsErr){}return result}),debug("Dirs to expand"),debug(dirs),dirs.forEach(d=>{var entries=walkSync.entries(d,{directories:!1});debug(entries),context.localFilePaths=context.localFilePaths.concat(entries.map(e=>path.resolve(d,e.relativePath)))}),next(null,context)}function commonPrefix(paths,separator){if(!paths||0===paths.length||0<paths.filter(s=>"string"!=typeof s).length)return"";if(paths.includes("/"))return"/";const sep=separator||path.sep;var separator=paths.map(p=>p.split(sep)),shortestPath=separator.reduce((a,b)=>a.length<b.length?a:b,separator[0]);let furthestIndex=shortestPath.length;for(const p of separator)for(let i=0;i<furthestIndex;i++)if(p[i]!==shortestPath[i]){furthestIndex=i;break}paths=shortestPath.slice(0,furthestIndex).join(sep);return 0<paths.length?paths.endsWith(sep)?paths:paths+sep:""}function prettyPrint(manifest){artillery.logger({showTimestamp:!0}).log("Test bundle prepared..."),artillery.log("Test bundle contents:");var t=new Table({head:["Name","Type","Notes"]});for(const f of manifest.files)t.push([f.noPrefix,"file"]);for(const m of manifest.modules)t.push([m,"package",-1===manifest.pkgDeps.indexOf(m)?"not in package.json":""]);artillery.log(t.toString()),artillery.log()}module.exports={createBOM:createBOM,commonPrefix:commonPrefix,prettyPrint:prettyPrint};