Add build cache and path resolution scheme, fix packaging
authorNick Downing <downing.nick@gmail.com>
Sun, 14 Oct 2018 13:45:34 +0000 (00:45 +1100)
committerNick Downing <nick@ndcode.org>
Tue, 30 Oct 2018 07:54:35 +0000 (18:54 +1100)
.gitignore
.npmignore
js_template.js [new file with mode: 0644]
package.json
page.jst
page3.jst [new file with mode: 0644]
test.js
test/page1.jst [new file with mode: 0644]
test/page2.jst [new file with mode: 0644]
visitors.js [moved from template.js with 99% similarity]

index 0a1bfa5..8f1b85f 100644 (file)
@@ -1,4 +1,5 @@
 /dist
+/js_template-*.tgz
 /node_modules
 /yarn.lock
 /yarn-error.log
index 0e57443..c027963 100644 (file)
@@ -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 (file)
index 0000000..e2cfda6
--- /dev/null
@@ -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
index 4fd064d..6d7521e 100644 (file)
@@ -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"
   "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"
   }
 }
index dae02d1..43ebe37 100644 (file)
--- 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 (file)
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 (file)
--- 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: '<html>'}))
+    let page = await js_template('.', 'page.jst')
+    out = []
+    await page({lang: 'en', val: '<html>'}, out)
+    console.log(out.join(''))
   }
 )()
diff --git a/test/page1.jst b/test/page1.jst
new file mode 100644 (file)
index 0000000..d591f63
--- /dev/null
@@ -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 (file)
index 0000000..78c2fa0
--- /dev/null
@@ -0,0 +1,3 @@
+async (_env, _out) => {
+  'page2\n'
+}
similarity index 99%
rename from template.js
rename to visitors.js
index 2234499..de605db 100644 (file)
@@ -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')