diff --git a/package.json b/package.json index c8886e47..318e444a 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "typescript": "^3.6.4", "vinyl": "~2.0.1", "vinyl-fs": "^3.0.2", + "vue-template-compiler": "^2.6.11", "yamljs": "^0.3.0" }, "optionalDependencies": {}, diff --git a/src/lexers/vue-lexer.js b/src/lexers/vue-lexer.js new file mode 100644 index 00000000..de682ec7 --- /dev/null +++ b/src/lexers/vue-lexer.js @@ -0,0 +1,25 @@ +import BaseLexer from './base-lexer' +import JavascriptLexer from './javascript-lexer.js' + +export default class VueLexer extends BaseLexer { + constructor(options = {}) { + super(options) + + this.functions = options.functions || ['$t'] + } + + extract(content, filename) { + let keys = [] + + const Lexer = new JavascriptLexer() + Lexer.on('warning', warning => this.emit('warning', warning)) + keys = keys.concat(Lexer.extract(content)) + + const compiledTemplate = require('vue-template-compiler').compile(content).render + const Lexer2 = new JavascriptLexer({ functions: this.functions }) + Lexer2.on('warning', warning => this.emit('warning', warning)) + keys = keys.concat(Lexer2.extract(compiledTemplate)) + + return keys + } +} diff --git a/src/parser.js b/src/parser.js index 4ac79cb0..736fdb9d 100644 --- a/src/parser.js +++ b/src/parser.js @@ -4,6 +4,7 @@ import HandlebarsLexer from './lexers/handlebars-lexer' import HTMLLexer from './lexers/html-lexer' import JavascriptLexer from './lexers/javascript-lexer' import JsxLexer from './lexers/jsx-lexer' +import VueLexer from './lexers/vue-lexer' const lexers = { hbs: ['HandlebarsLexer'], @@ -18,6 +19,8 @@ const lexers = { jsx: ['JsxLexer'], tsx: ['JsxLexer'], + vue: ['VueLexer'], + default: ['JavascriptLexer'] } @@ -25,7 +28,8 @@ const lexersMap = { HandlebarsLexer, HTMLLexer, JavascriptLexer, - JsxLexer + JsxLexer, + VueLexer } export default class Parser extends EventEmitter { diff --git a/test/lexers/vue-lexer.test.js b/test/lexers/vue-lexer.test.js new file mode 100644 index 00000000..9681f1e4 --- /dev/null +++ b/test/lexers/vue-lexer.test.js @@ -0,0 +1,44 @@ +import { assert } from 'chai' +import VueLexer from '../../src/lexers/vue-lexer' + +describe('VueLexer', () => { + it('extracts keys from template & js', (done) => { + const Lexer = new VueLexer() + const content = + "