UNPKG

1.77 kBJavaScriptView Raw
1var render = require('./lib/render')
2var requireView = require('./lib/require')
3var parse = require('./lib/parse')
4var dump = require('./lib/dump')
5var getLocals = require('./lib/get_locals')
6var resolve = require('resolve')
7var caller = require('resolve/lib/caller')
8var path = require('path')
9
10module.exports = function(view, opts){
11 // opts: cache
12
13 if (isPackageRequire(view)){
14 view = resolve.sync(view, { basedir: path.dirname(caller()) })
15 }
16
17 view = getView(view, opts)
18
19 var func = function(context){
20 context = context || {}
21 context.views = view.views
22 context.locals = getLocals(view)
23 return render(view.c, context)
24 }
25
26 func.getCompiledView = function(){
27 return view
28 }
29
30 func.stringify = function(root){
31 return dump(view, root || process.cwd())
32 }
33
34 func.getExternal = function(){
35 var externalRequires = []
36 addExt(view, externalRequires)
37 return externalRequires
38 }
39
40 func.addView = function(name, v){
41 view.views = view.views || {}
42 view.views[name] = getView(v)
43 }
44
45 return func
46}
47
48function addExt(template, externalRefs, processed){
49 processed = processed || []
50 processed.push(template)
51
52 Object.keys(template.views).forEach(function(key){
53 var view = template.views[key]
54 if (view.require){
55 if (!~externalRefs.indexOf(view.require)){
56 externalRefs.push(view.require)
57 }
58 } else if (!~processed.indexOf(view)) {
59 // avoid circular
60 addExt(view, externalRefs, processed)
61 }
62 })
63}
64
65function getView(view, opts){
66 if (typeof view == 'string'){
67 view = requireView(view, opts)
68 } else if (view.parse) {
69 view = parse(view.parse)
70 }
71 return view
72}
73
74
75function isPackageRequire(file){
76 return typeof file === 'string' && !!/^[^\/\\]/.exec(file)
77}
\No newline at end of file