UNPKG

4.74 kBJavaScriptView Raw
1"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const child_process=require("child_process"),events=require("events"),fs=require("fs-extra"),js_yaml_1=require("js-yaml"),lodash_1=require("lodash"),loremIpsum=require("lorem-ipsum"),path=require("path"),power_assert_1=require("power-assert"),rimraf=require("rimraf"),format=require("string-template"),util_chdir_1=require("util.chdir"),util_constants_1=require("util.constants"),util_filelist_1=require("util.filelist"),util_join_1=require("util.join"),util_toolbox_1=require("util.toolbox"),util_wait_1=require("util.wait"),uuid=require("uuid"),walk=require("klaw-sync"),pkg=require(util_join_1.join(process.cwd(),"package.json")),tempDirectories=new Set;class Fixture extends events.EventEmitter{constructor(a,b={}){if(super(),this._basedir="",this._dir="",this._data=[],this._files=[],this._json="",this._jsonObj={},this._loremIpsum="",this._name="",this._obj={},this._pattern="",this._src="",this._yaml="",this._yamlObj={},Object.prototype.hasOwnProperty.call(pkg,"fixture")||(pkg.fixture={}),this._opts=Object.assign({dataFile:"data.list",fixtureDirectory:"./__tests__/fixtures",jsonFile:"obj.json",script:"fixture.js",templateDataData:{DIR:""},loremIpsum:{},pattern:{chevrons:[],columns:80,repeat:1},yamlFile:"obj.yaml"},pkg.fixture,b),"undefined"==typeof this._opts.templateData&&(this._opts.templateData={}),this._name=a||"tmpdir",this._basedir=b.basedir||this.setBaseDirectory(),this._loremIpsum=loremIpsum(this._opts.loremIpsum),this.patternGenerator(),fs.existsSync(this.basedir)||fs.mkdirs(this.basedir),this._dir=util_join_1.join(this.basedir,uuid.v4()),fs.existsSync(this.dir)||fs.mkdirsSync(this.dir),tempDirectories.add(this.dir),"tmpdir"===this.name||"loremIpsum"===this.name||"pattern"===this.name)return this;if(this._src=path.resolve(util_join_1.join(this._opts.fixtureDirectory||"./__tests__/fixtures",this.name)),!fs.existsSync(this.src))throw new Error(`Invalid fixture name given: ${a}`);fs.copySync(this.src,this.dir),this._opts.templateData.DIR=util_join_1.join(this.dir),this._files=walk(this.dir,{nodir:!0}),this.files.forEach(a=>{let b=fs.readFileSync(a.path);b=format(b.toString(),this._opts.templateData),fs.writeFileSync(a.path,b),a.path===util_join_1.join(this.dir,this._opts.jsonFile||"obj.json")&&(this._json=b,this._obj=this._jsonObj=JSON.parse(b)),a.path===util_join_1.join(this.dir,this._opts.yamlFile||"obj.yaml")&&(this._yaml=b,this._yamlObj=js_yaml_1.load(b)),a.path===util_join_1.join(this.dir,this._opts.dataFile||"data.list")&&(this._data=util_filelist_1.getFileList(a.path))},this),util_chdir_1.pushd(this.dir);const c=util_join_1.join(this.dir,b.script||"fixture.js");fs.existsSync(c)&&(child_process.execSync(`node ${c}`),fs.removeSync(c)),util_chdir_1.popd(),this.emit("loaded")}static cleanup(a=util_toolbox_1.nil){const b=new util_wait_1.Semaphore(30);tempDirectories.forEach(c=>{fs.existsSync(c)&&(b.increment(),rimraf(c,c=>{c&&a(c,null),b.decrement()}))}),b.wait().then(()=>{a(null,Array.from(tempDirectories))}).catch(b=>{a(new Error(b),[""])})}patternGenerator(){var a=String.fromCharCode;const b=this._opts.pattern;if(0>=b.chevrons.length)for(let c=97;122>=c;c++)b.chevrons.push(a(c));for(let a=0;a<b.repeat;a++)for(const a of b.chevrons)this._pattern+=lodash_1.repeat(a,b.columns),this._pattern+=util_constants_1.nl}read(a){if(a=util_join_1.join(this.dir,a),fs.existsSync(a))return fs.readFileSync(a,util_toolbox_1.encoding);throw new Error(`Invalid file in fixture read: ${a}`)}setBaseDirectory(){let a="";return a=process.env.TMP?process.env.TMP:process.env.TEMP?process.env.TEMP:util_join_1.join("~/",".tmp"),util_join_1.join(a,"unit-test-data",path.sep)}toString(){const a={opts:this._opts,basedir:this.basedir,dir:this.dir,files:this.files,obj:this.obj,data:this.data,src:this.src};return JSON.stringify(a,null,2)}get basedir(){return util_join_1.normalize(this._basedir)}set basedir(a){this._basedir=a}get data(){return this._data}get dir(){return util_join_1.normalize(this._dir)}get files(){return this._files}get json(){return this._json}get jsonObj(){return this._jsonObj}get loremIpsum(){return this._loremIpsum}get name(){return this._name}get obj(){return this._obj}get pattern(){return this._pattern}get src(){return util_join_1.normalize(this._src)}get yaml(){return this._yaml}get yamlObj(){return this._yamlObj}}exports.Fixture=Fixture;function cleanup(a=null){a=Object.assign({done:null,message:""},a||{}),a.message&&console.log(`final cleanup: ${a.message}`),Fixture.cleanup((b,c)=>{if(b)throw new Error(`Failure cleaning up after test: ${b.message}`);c.forEach(a=>{power_assert_1.default(!fs.existsSync(a))}),a.done?a.done():util_toolbox_1.nil()})}exports.cleanup=cleanup,exports.default=Fixture;
\No newline at end of file