Skip to content

Commit

Permalink
Different strategy
Browse files Browse the repository at this point in the history
  • Loading branch information
akashdsouza committed Jul 21, 2018
1 parent afa2cae commit 5e48539
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 85 deletions.
2 changes: 1 addition & 1 deletion concat.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ module.exports = class Concat extends Plugin {
this.footer = options.footer;
this.footerFiles = options.footerFiles;
this.separator = (options.separator != null) ? options.separator : '\n';
this.contentLimit = options.contentLimit || 10000;
this.contentLimit = options.contentLimit;
this.inputNode = inputNode;

ensureNoGlob('headerFiles', this.headerFiles);
Expand Down
61 changes: 29 additions & 32 deletions lib/strategies/simple.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,40 @@

const findIndex = require('find-index');
const fs = require('fs');
let baseDir;

function contentMapper(entry) {
if (entry.isFileContentLarge) {
entry.content = fs.readFileSync(baseDir + entry.file, 'utf-8');
}
return entry.content;
}

function notUndefined(content) {
return content !== undefined;
}

class Entry {
constructor(file, contentLimit, baseDir) {
this._content = undefined;
this._contentLimit = contentLimit || 10000;
this._baseDir = baseDir;
this.file = file;
}
get content() {
if (this._content !== undefined) {
return this._content;
}
let content = fs.readFileSync(`${this._baseDir}${this.file}`, 'utf-8');
if (content.length < this._contentLimit) {
this._content = content;
}
return content;
}

set content(value) {
if (value.length < this._contentLimit) {
this._content = value;
}
}
}

class SimpleConcat {
constructor(attrs) {
this.separator = attrs.separator || '';
Expand All @@ -24,7 +45,7 @@ class SimpleConcat {
this.footerFiles = attrs.footerFiles || [];
this.footer = attrs.footer;
this.contentLimit = attrs.contentLimit;
baseDir = attrs.baseDir ? attrs.baseDir + '/' : '';
this.baseDir = attrs.baseDir ? `${attrs.baseDir}/` : '';

// Internally, we represent the concatenation as a series of entries. These
// entries have a 'file' attribute for lookup/sorting and a 'content' property
Expand All @@ -44,14 +65,6 @@ class SimpleConcat {
return findIndex(this._internal, entry => entry.file === file);
}

/**
* Check if the content of the file is too large to be stored in memory
*/
_isContentLarge(content) {
let contentLimit = this.contentLimit;
return contentLimit && content.length > contentLimit;
}

/**
* Updates the contents of a header file.
*/
Expand Down Expand Up @@ -90,17 +103,8 @@ class SimpleConcat {
if (this._handleHeaderOrFooterFile(file, content)) {
return;
}

let entry = {
file: file
};

if (this._isContentLarge(content)) {
entry.content = '';
entry.isFileContentLarge = true;
} else {
entry.content = content;
}

let entry = new Entry(file, this.contentLimit, this.baseDir);

let index = findIndex(this._internal, entry => entry.file > file);
if (index === -1) {
Expand All @@ -121,20 +125,13 @@ class SimpleConcat {
throw new Error('Trying to update ' + file + ' but it has not been read before');
}

if (this._isContentLarge(content)) {
this._internal[index].content = '';
this._internal[index].isFileContentLarge = true;
} else {
this._internal[index].content = content;
}

this._internal[index].content = content;
}

removeFile(file) {
if (this._handleHeaderOrFooterFile(file, undefined)) {
return;
}

let index = this._findIndexOf(file);

if (index === -1) {
Expand Down
137 changes: 85 additions & 52 deletions test/strategies/simple-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,34 @@

const SimpleConcat = require('../../lib/strategies/simple');
const expect = require('chai').expect;
const fixturify = require('fixturify');

const testDir = 'test/strategies';

function writeFixturifySync(obj) {
fixturify.writeSync(testDir, obj);
}

beforeEach(function() {
writeFixturifySync({
'a.js': '//a',
a: {
'a.js': '//a/a',
'b.js': '//a/b'
},
'b.js': '//b',
'c.js': '//c'
});
})

afterEach(function() {
writeFixturifySync({
'a.js': null,
'b.js': null,
'c.js': null,
a: null
});
})

describe('SimpleConcat', function() {
it('is patch based', function() {
Expand All @@ -15,23 +43,28 @@ describe('SimpleConcat', function() {

it('can handle empty input scenarios', function() {
let concat = new SimpleConcat({});
concat.addFile('foo.js', '');
let fileContent = '';
let obj = {
'a.js': fileContent
};
writeFixturifySync(obj);
concat.addFile(`${testDir}/a.js`, fileContent);
expect(concat.result()).to.equal('');
});

it('prepends header to the output', function() {
let concat = new SimpleConcat({
header: 'should be first'
});
concat.addFile('a.js', '//a');
concat.addFile(`${testDir}/a.js`, '//a');
expect(concat.result()).to.equal('should be first//a');
});

it('appends footer to the output', function() {
let concat = new SimpleConcat({
footer: 'should be last'
});
concat.addFile('a.js', '//a');
concat.addFile(`${testDir}/a.js`, '//a');
expect(concat.result()).to.equal('//ashould be last\n');
});

Expand All @@ -40,47 +73,47 @@ describe('SimpleConcat', function() {
header: 'should be first',
footer: 'should be last'
});
concat.addFile('a.js', '//a');
concat.addFile(`${testDir}/a.js`, '//a');
expect(concat.result()).to.equal('should be first//ashould be last\n');
});

describe('addFile', function() {
it('correctly adds files in alphabetical (stable) order', function() {
let concat = new SimpleConcat({});

concat.addFile('a.js', '//a');
concat.addFile('a/b.js', '//a/b');
concat.addFile('a/a.js', '//a/a');
concat.addFile('c.js', '//c');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/a/b.js`, '//a/b');
concat.addFile(`${testDir}/a/a.js`, '//a/a');
concat.addFile(`${testDir}/c.js`, '//c');
concat.addFile(`${testDir}/b.js`, '//b');

expect(concat.result()).to.equal('//a//a/a//a/b//b//c');
});

it('correctly orders headerFiles at the front', function() {
let concat = new SimpleConcat({
headerFiles: ['b.js', 'a/a.js']
headerFiles: [`${testDir}/b.js`, `${testDir}/a/a.js`]
});

concat.addFile('a.js', '//a');
concat.addFile('a/b.js', '//a/b');
concat.addFile('a/a.js', '//a/a');
concat.addFile('c.js', '//c');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/a/b.js`, '//a/b');
concat.addFile(`${testDir}/a/a.js`, '//a/a');
concat.addFile(`${testDir}/c.js`, '//c');
concat.addFile(`${testDir}/b.js`, '//b');

expect(concat.result()).to.equal('//b//a/a//a//a/b//c');
});

it('correctly orders footerFiles at the end', function() {
let concat = new SimpleConcat({
footerFiles: ['b.js', 'a/a.js']
footerFiles: [`${testDir}/b.js`, `${testDir}/a/a.js`]
});

concat.addFile('a.js', '//a');
concat.addFile('a/b.js', '//a/b');
concat.addFile('a/a.js', '//a/a');
concat.addFile('c.js', '//c');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/a/b.js`, '//a/b');
concat.addFile(`${testDir}/a/a.js`, '//a/a');
concat.addFile(`${testDir}/c.js`, '//c');
concat.addFile(`${testDir}/b.js`, '//b');

expect(concat.result()).to.equal('//a//a/b//c//b//a/a');
});
Expand All @@ -90,36 +123,36 @@ describe('SimpleConcat', function() {
it('correctly updates an existing file', function() {
let concat = new SimpleConcat({});

concat.addFile('a.js', '//a');
concat.addFile(`${testDir}/a.js`, '//a');
expect(concat.result()).to.equal('//a');

concat.updateFile('a.js', '//a-modified');
concat.updateFile(`${testDir}/a.js`, '//a-modified');
expect(concat.result()).to.equal('//a-modified');
});

it('correctly updates a header file', function() {
let concat = new SimpleConcat({
headerFiles: [ 'b.js', 'a.js' ]
headerFiles: [`${testDir}/b.js`, `${testDir}/a.js` ]
});

concat.addFile('a.js', '//a');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/b.js`, '//b');
expect(concat.result()).to.equal('//b//a');

concat.updateFile('a.js', '//a-modified');
concat.updateFile(`${testDir}/a.js`, '//a-modified');
expect(concat.result()).to.equal('//b//a-modified');
});

it('correctly updates a footer file', function() {
let concat = new SimpleConcat({
footerFiles: [ 'a.js', 'b.js' ]
footerFiles: [`${testDir}/a.js`, `${testDir}/b.js` ]
});

concat.addFile('a.js', '//a');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/b.js`, '//b');
expect(concat.result()).to.equal('//a//b');

concat.updateFile('a.js', '//a-modified');
concat.updateFile(`${testDir}/a.js`, '//a-modified');
expect(concat.result()).to.equal('//a-modified//b');
});

Expand All @@ -136,52 +169,52 @@ describe('SimpleConcat', function() {
it('correctly removes an existing file', function() {
let concat = new SimpleConcat({});

concat.addFile('a.js', '//a');
concat.addFile('a/b.js', '//a/b');
concat.addFile('a/a.js', '//a/a');
concat.addFile('c.js', '//c');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/a/b.js`, '//a/b');
concat.addFile(`${testDir}/a/a.js`, '//a/a');
concat.addFile(`${testDir}/c.js`, '//c');
concat.addFile(`${testDir}/b.js`, '//b');

expect(concat.result()).to.equal('//a//a/a//a/b//b//c');

concat.removeFile('a/b.js');
concat.removeFile('c.js');
concat.removeFile(`${testDir}/a/b.js`);
concat.removeFile(`${testDir}/c.js`);

expect(concat.result()).to.equal('//a//a/a//b');
});

it('correctly removes a header file', function() {
let concat = new SimpleConcat({
headerFiles: ['b.js', 'a.js']
headerFiles: [`${testDir}/b.js`, `${testDir}/a.js`]
});

concat.addFile('a.js', '//a');
concat.addFile('a/b.js', '//a/b');
concat.addFile('a/a.js', '//a/a');
concat.addFile('c.js', '//c');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/a/b.js`, '//a/b');
concat.addFile(`${testDir}/a/a.js`, '//a/a');
concat.addFile(`${testDir}/c.js`, '//c');
concat.addFile(`${testDir}/b.js`, '//b');

expect(concat.result()).to.equal('//b//a//a/a//a/b//c');

concat.removeFile('b.js');
concat.removeFile(`${testDir}/b.js`);

expect(concat.result()).to.equal('//a//a/a//a/b//c');
});

it('correctly removes a footer file', function() {
let concat = new SimpleConcat({
footerFiles: ['b.js', 'a.js']
footerFiles: [`${testDir}/b.js`, `${testDir}/a.js`]
});

concat.addFile('a.js', '//a');
concat.addFile('a/b.js', '//a/b');
concat.addFile('a/a.js', '//a/a');
concat.addFile('c.js', '//c');
concat.addFile('b.js', '//b');
concat.addFile(`${testDir}/a.js`, '//a');
concat.addFile(`${testDir}/a/b.js`, '//a/b');
concat.addFile(`${testDir}/a/a.js`, '//a/a');
concat.addFile(`${testDir}/c.js`, '//c');
concat.addFile(`${testDir}/b.js`, '//b');

expect(concat.result()).to.equal('//a/a//a/b//c//b//a');

concat.removeFile('b.js');
concat.removeFile(`${testDir}/b.js`);

expect(concat.result()).to.equal('//a/a//a/b//c//a');
});
Expand Down

0 comments on commit 5e48539

Please sign in to comment.