Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 11 additions & 21 deletions src/dtsCreator.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@ import isThere from 'is-there';
import mkdirp from 'mkdirp';
import camelcase from "camelcase"

import {TokenValidator} from './tokenValidator';
import FileSystemLoader from './fileSystemLoader';
import os from 'os';

let validator = new TokenValidator();

function removeExtension(filePath) {
const ext = path.extname(filePath);
return filePath.replace(new RegExp(ext + '$'), '');
Expand All @@ -28,7 +25,6 @@ class DtsContent {
rInputPath,
rawTokenList,
resultList,
messageList,
EOL
}) {
this.dropExtension = dropExtension;
Expand All @@ -38,7 +34,6 @@ class DtsContent {
this.rInputPath = rInputPath;
this.rawTokenList = rawTokenList;
this.resultList = resultList;
this.messageList = messageList;
this.EOL = EOL;
}

Expand All @@ -47,8 +42,14 @@ class DtsContent {
}

get formatted() {
if(!this.resultList || !this.resultList.length || this.resultList.length === 0) return '';
return this.resultList.join(this.EOL) + this.EOL;
if(!this.resultList || !this.resultList.length) return '';
return [
'declare const styles: {',
...this.resultList.map(line => ' ' + line),
'};',
'export = styles;',
''
].join(os.EOL) + this.EOL;
}

get tokens() {
Expand Down Expand Up @@ -110,22 +111,12 @@ export class DtsCreator {
if(res) {
var tokens = res;
var keys = Object.keys(tokens);
var validKeys = [], invalidKeys = [];
var messageList = [];

var convertKey = this.getConvertKeyMethod(this.camelCase);

keys.forEach(key => {
const convertedKey = convertKey(key);
var ret = validator.validate(convertedKey);
if(ret.isValid) {
validKeys.push(convertedKey);
}else{
messageList.push(ret.message);
}
});

var result = validKeys.map(k => ('export const ' + k + ': string;'));
var result = keys
.map(k => convertKey(k))
.map(k => 'readonly "' + k + '": string;')

var content = new DtsContent({
dropExtension: this.dropExtension,
Expand All @@ -135,7 +126,6 @@ export class DtsCreator {
rInputPath,
rawTokenList: keys,
resultList: result,
messageList,
EOL: this.EOL
});

Expand Down
29 changes: 0 additions & 29 deletions src/tokenValidator.js

This file was deleted.

126 changes: 86 additions & 40 deletions test/dtsCreator.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,38 +12,43 @@ describe('DtsCreator', () => {
it('returns DtsContent instance simple css', done => {
creator.create('test/testStyle.css').then(content => {
assert.equal(content.contents.length, 1);
assert.equal(content.contents[0], "export const myClass: string;")
assert.equal(content.contents[0], 'readonly "myClass": string;');
done();
});
});
it('rejects an error with invalid CSS', done => {
creator.create('test/errorCss.css').then(content => {
assert.fail();
}).catch(err => {
assert.equal(err.name, 'CssSyntaxError');
done();
});
creator
.create('test/errorCss.css')
.then(content => {
assert.fail();
})
.catch(err => {
assert.equal(err.name, 'CssSyntaxError');
done();
});
});
it('returns DtsContent instance from composing css', done => {
creator.create('test/composer.css').then(content => {
assert.equal(content.contents.length, 1);
assert.equal(content.contents[0], "export const root: string;")
assert.equal(content.contents[0], 'readonly "root": string;');
done();
});
})
});
it('returns DtsContent instance from composing css whose has invalid import/composes', done => {
creator.create('test/invalidComposer.scss').then(content => {
assert.equal(content.contents.length, 1);
assert.equal(content.contents[0], "export const myClass: string;")
assert.equal(content.contents[0], 'readonly "myClass": string;');
done();
});
});
it('returns DtsContent instance from the pair of path and contents', done => {
creator.create('test/somePath', `.myClass { color: red }`).then(content => {
assert.equal(content.contents.length, 1);
assert.equal(content.contents[0], "export const myClass: string;")
done();
});
creator
.create('test/somePath', `.myClass { color: red }`)
.then(content => {
assert.equal(content.contents.length, 1);
assert.equal(content.contents[0], 'readonly "myClass": string;');
done();
});
});
});

Expand All @@ -55,15 +60,13 @@ describe('DtsCreator', () => {
});
});
});

});

describe('DtsContent', () => {

describe('#tokens', () => {
it('returns original tokens', done => {
new DtsCreator().create('test/testStyle.css').then(content => {
assert.equal(content.tokens[0], "myClass");
assert.equal(content.tokens[0], 'myClass');
done();
});
});
Expand Down Expand Up @@ -97,51 +100,94 @@ describe('DtsContent', () => {
describe('#formatted', () => {
it('returns formatted .d.ts string', done => {
new DtsCreator().create('test/testStyle.css').then(content => {
assert.equal(content.formatted, "export const myClass: string;" + os.EOL);
assert.equal(
content.formatted,
`\
declare const styles: {
readonly "myClass": string;
};
export = styles;

`
);
done();
});
});

it('returns empty object exportion when the result list has no items', done => {
new DtsCreator().create('test/empty.css').then(content => {
assert.equal(content.formatted, "");
assert.equal(content.formatted, '');
done();
});
});

describe('#camelCase option', () => {
it('camelCase == true: returns camelized tokens for lowercase classes', done => {
new DtsCreator({camelCase: true}).create('test/kebabed.css').then(content => {
assert.equal(content.formatted, "export const myClass: string;" + os.EOL);
done();
});
new DtsCreator({ camelCase: true })
.create('test/kebabed.css')
.then(content => {
assert.equal(
content.formatted,
`\
declare const styles: {
readonly "myClass": string;
};
export = styles;

`
);
done();
});
});

it('camelCase == true: returns camelized tokens for uppercase classes ', done => {
new DtsCreator({camelCase: true}).create('test/kebabedUpperCase.css').then(content => {
assert.equal(content.formatted, "export const myClass: string;" + os.EOL);
done();
});
new DtsCreator({ camelCase: true })
.create('test/kebabedUpperCase.css')
.then(content => {
assert.equal(
content.formatted,
`\
declare const styles: {
readonly "myClass": string;
};
export = styles;

`
);
done();
});
});

it('camelCase == "dashes": returns camelized tokens for dashes only', done => {
new DtsCreator({camelCase: 'dashes'}).create('test/kebabedUpperCase.css').then(content => {
assert.equal(content.formatted, "export const MyClass: string;" + os.EOL);
done();
});
new DtsCreator({ camelCase: 'dashes' })
.create('test/kebabedUpperCase.css')
.then(content => {
assert.equal(
content.formatted,
`\
declare const styles: {
readonly "MyClass": string;
};
export = styles;

`
);
done();
});
});
});

});

describe('#writeFile', () => {
it('writes a file', done => {
new DtsCreator().create('test/testStyle.css').then(content => {
return content.writeFile();
}).then(() => {
done();
});
new DtsCreator()
.create('test/testStyle.css')
.then(content => {
return content.writeFile();
})
.then(() => {
done();
});
});
});

});
});
6 changes: 5 additions & 1 deletion test/testStyle.css.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
export const myClass: string;
declare const styles: {
readonly "myClass": string;
};
export = styles;