From 0e5bf3437045e12fb4fcdc4d83f372a558fd2ebd Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Mon, 15 Oct 2018 00:45:34 +1100 Subject: [PATCH] Add build cache and path resolution scheme, fix packaging --- .gitignore | 1 + .npmignore | 8 ++++++++ js_template.js | 41 ++++++++++++++++++++++++++++++++++++++ package.json | 11 ++++------ page.jst | 22 +++++++++++--------- page3.jst | 3 +++ test.js | 25 +++++------------------ test/page1.jst | 7 +++++++ test/page2.jst | 3 +++ template.js => visitors.js | 4 ++-- 10 files changed, 87 insertions(+), 38 deletions(-) create mode 100644 js_template.js create mode 100644 page3.jst create mode 100644 test/page1.jst create mode 100644 test/page2.jst rename template.js => visitors.js (99%) diff --git a/.gitignore b/.gitignore index 0a1bfa5..8f1b85f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /dist +/js_template-*.tgz /node_modules /yarn.lock /yarn-error.log diff --git a/.npmignore b/.npmignore index 0e57443..c027963 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,11 @@ .tern-* +/*.jst +/dist/acorn.mjs +/dist/acorn.mjs.map +/dist/bin.js +/env.sh +/js_template-*.tgz /rollup.config.* /src +/test +/test.js diff --git a/js_template.js b/js_template.js new file mode 100644 index 0000000..e2cfda6 --- /dev/null +++ b/js_template.js @@ -0,0 +1,41 @@ +let _acorn = require('./dist/acorn') +let _astring = require('astring') +let _BuildCache = require('build_cache') +let _fs = require('fs') +let _html_escape = require('html-escape') +let _path = require('path') +let _transform = require('./transform') +let _visitors = require('./visitors') +let _util = require('util') + +let _fs_readFile = _util.promisify(_fs.readFile) + +let _build_cache = new _BuildCache() +_build_cache.diag = true +let _js_template = async (_dir, _name) => { + while (_name.charAt(0) === '/') { + _dir = '.' + _name = _name.slice(1) + } + _name = _path.posix.resolve(_dir, _name) + return _build_cache.get( + _name, + async _result => { + let _dir = _path.posix.dirname(_name) + let _req = async _name => _js_template(_dir, _name) + _result.value = eval( + _astring.generate( + _transform.transform( + _visitors, + _acorn.parse( + await _fs_readFile(_name, {encoding: 'utf-8'}) + ) + ), + {indent: ''} + ) + ) + } + ) +} + +module.exports = _js_template diff --git a/package.json b/package.json index 4fd064d..6d7521e 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,8 @@ { - "name": "acorn", - "description": "ECMAScript parser", + "name": "js_template", + "description": "JavaScript template engine", "homepage": "https://github.com/acornjs/acorn", - "main": "dist/acorn.js", - "module": "dist/acorn.mjs", + "main": "js_template.js", "version": "6.0.2", "engines": { "node": ">=0.4.0" @@ -32,10 +31,8 @@ "scripts": { "prepare": "cd ..; npm run build:main && npm run build:bin" }, - "bin": { - "acorn": "./bin/acorn" - }, "dependencies": { + "build_cache": "file:../../build_cache.git/build_cache-1.0.0.tgz", "html-escape": "^2.0.0" } } diff --git a/page.jst b/page.jst index dae02d1..43ebe37 100644 --- a/page.jst +++ b/page.jst @@ -1,12 +1,16 @@ -async _env => html.'cls-1'.cls-2#id-1(lang=_env.lang true=_env.val something-else="\"val\"") { - head {} - body { - `hello -& goodbye -` - script { - for (let i = 0; i < 100; ++i) - console.log(i) +async (_env, _out) => { + html.'cls-1'.cls-2#id-1(lang=_env.lang true=_env.val something-else="\"val\"") { + head {} + body { + `hello + & goodbye + ` + script { + for (let i = 0; i < 100; ++i) + console.log(i) + } + let page1 = await _req('test/page1.jst') + await page1(_env, _out) } } } diff --git a/page3.jst b/page3.jst new file mode 100644 index 0000000..82428c1 --- /dev/null +++ b/page3.jst @@ -0,0 +1,3 @@ +async (_env, _out) => { + 'page3\n' +} diff --git a/test.js b/test.js index 07c2b3a..7dd8406 100644 --- a/test.js +++ b/test.js @@ -1,25 +1,10 @@ -let acorn = require('./dist/acorn') -let assert = require('assert') -let astring = require('astring') -let fs = require('fs') -let template = require('./template') -let transform = require('./transform') -let html_escape = require('html-escape') +let js_template = require('./js_template') ;( async () => { - let _esc = html_escape, page = eval( - astring.generate( - transform.transform( - template, - acorn.parse( - fs.readFileSync('page.jst', {encoding: 'utf-8'}) - ) - ), - {indent: ''} - ) - ) - - console.log(await page({lang: 'en', val: ''})) + let page = await js_template('.', 'page.jst') + out = [] + await page({lang: 'en', val: ''}, out) + console.log(out.join('')) } )() diff --git a/test/page1.jst b/test/page1.jst new file mode 100644 index 0000000..d591f63 --- /dev/null +++ b/test/page1.jst @@ -0,0 +1,7 @@ +async (_env, _out) => { + let page2 = await _req('page2.jst') + let page3 = await _req('/page3.jst') + 'page1\n' + await page2(_env, _out) + await page3(_env, _out) +} diff --git a/test/page2.jst b/test/page2.jst new file mode 100644 index 0000000..78c2fa0 --- /dev/null +++ b/test/page2.jst @@ -0,0 +1,3 @@ +async (_env, _out) => { + 'page2\n' +} diff --git a/template.js b/visitors.js similarity index 99% rename from template.js rename to visitors.js index 2234499..de605db 100644 --- a/template.js +++ b/visitors.js @@ -115,7 +115,7 @@ let html_body = (context, st, c) => { type: 'CallExpression', callee: { type: 'Identifier', - name: '_esc' + name: '_html_escape' }, arguments: [ { @@ -268,7 +268,7 @@ visitors.ExpressionStatement = (node, st, c) => { type: 'CallExpression', callee: { type: 'Identifier', - name: '_esc' + name: '_html_escape' }, arguments: [ c(node.expression, st, 'Expression') -- 2.34.1