From 74de6ef97423117e75f85c50ef8f5b2d3acdb2da Mon Sep 17 00:00:00 2001 From: Timur Khazamov Date: Mon, 19 Nov 2018 21:22:43 +0500 Subject: [PATCH] Classes as object props types --- src/dtsCreator.js | 32 ++++------ src/tokenValidator.js | 29 --------- test/dtsCreator.spec.js | 126 +++++++++++++++++++++++++++------------- test/testStyle.css.d.ts | 6 +- 4 files changed, 102 insertions(+), 91 deletions(-) delete mode 100644 src/tokenValidator.js diff --git a/src/dtsCreator.js b/src/dtsCreator.js index 7fa2fad5..2914a5f8 100644 --- a/src/dtsCreator.js +++ b/src/dtsCreator.js @@ -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 + '$'), ''); @@ -28,7 +25,6 @@ class DtsContent { rInputPath, rawTokenList, resultList, - messageList, EOL }) { this.dropExtension = dropExtension; @@ -38,7 +34,6 @@ class DtsContent { this.rInputPath = rInputPath; this.rawTokenList = rawTokenList; this.resultList = resultList; - this.messageList = messageList; this.EOL = EOL; } @@ -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() { @@ -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, @@ -135,7 +126,6 @@ export class DtsCreator { rInputPath, rawTokenList: keys, resultList: result, - messageList, EOL: this.EOL }); diff --git a/src/tokenValidator.js b/src/tokenValidator.js deleted file mode 100644 index 8a273a12..00000000 --- a/src/tokenValidator.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -let RESERVED_WORDS = ['break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof', 'new', 'null', 'return', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'var', 'void', 'while', 'with', 'as', 'implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static', 'yield']; - -export class TokenValidator { - validate(key) { - if(!key) { - return { - isValid: false, - message: 'empty token' - }; - } - if(!/^[$_a-zA-ZÀ-ÿ][0-9a-zA-ZÀ-ÿ$_]*$/.test(key)) { - return { - isValid: false, - message: key + ' is not valid TypeScript variable name.' - }; - } - if(RESERVED_WORDS.some(w => w === key)) { - return { - isValid: false, - message: key + ' is TypeScript reserved word.' - }; - } - return { - isValid: true - }; - } -} diff --git a/test/dtsCreator.spec.js b/test/dtsCreator.spec.js index de189be8..51b812c9 100644 --- a/test/dtsCreator.spec.js +++ b/test/dtsCreator.spec.js @@ -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(); + }); }); }); @@ -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(); }); }); @@ -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(); + }); }); }); - -}); +}); \ No newline at end of file diff --git a/test/testStyle.css.d.ts b/test/testStyle.css.d.ts index 774a92b8..f4989445 100644 --- a/test/testStyle.css.d.ts +++ b/test/testStyle.css.d.ts @@ -1 +1,5 @@ -export const myClass: string; +declare const styles: { + readonly "myClass": string; +}; +export = styles; +