@webhandle/tripartite-renderer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/determine-template-name.mjs +15 -0
- package/initialize-webhandle-component.mjs +19 -0
- package/package.json +26 -0
- package/setup-tripartite-renderer.mjs +124 -0
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @webhandle/tripartite-renderer
|
|
2
|
+
|
|
3
|
+
Adds tripartite rendering support to webhandle. It addes a rendering engine
|
|
4
|
+
if express is set up and modifies the response to render with tripartite templates
|
|
5
|
+
(if they exist) directly to the response instead of having to buffer the output.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @webhandle/tripartite-renderer
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
Run after express has been configured.
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
import setupTripartiteRenderer from '@webhandle/tripartite-renderer/setup-tripartite-renderer.mjs'
|
|
20
|
+
setupTripartiteRenderer(webhandleInstance)
|
|
21
|
+
```
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default function determineTemplateName(filePath, viewPaths) {
|
|
2
|
+
for(let viewPath of viewPaths) {
|
|
3
|
+
if(filePath.startsWith(viewPath)) {
|
|
4
|
+
let name = filePath.substring(viewPath.length)
|
|
5
|
+
if(name.startsWith('/')) {
|
|
6
|
+
name = name.substring(1)
|
|
7
|
+
}
|
|
8
|
+
if(name.endsWith('.tri')) {
|
|
9
|
+
name = name.substring(0, name.length - 4)
|
|
10
|
+
}
|
|
11
|
+
return name
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return filePath
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import createInitializeWebhandleComponent from "@webhandle/initialize-webhandle-component/create-initialize-webhandle-component.mjs"
|
|
2
|
+
import ComponentManager from "@webhandle/initialize-webhandle-component/component-manager.mjs"
|
|
3
|
+
import setupTripartiteRenderer from "./setup-tripartite-renderer.mjs"
|
|
4
|
+
|
|
5
|
+
let initializeWebhandleComponent = createInitializeWebhandleComponent()
|
|
6
|
+
|
|
7
|
+
initializeWebhandleComponent.componentName = '@webhandle/tripartite-renderer'
|
|
8
|
+
initializeWebhandleComponent.componentDir = import.meta.dirname
|
|
9
|
+
initializeWebhandleComponent.defaultConfig = {}
|
|
10
|
+
initializeWebhandleComponent.staticFilePaths = ['public']
|
|
11
|
+
initializeWebhandleComponent.templatePaths = ['views']
|
|
12
|
+
|
|
13
|
+
initializeWebhandleComponent.setup = async function(webhandle, config) {
|
|
14
|
+
let manager = new ComponentManager()
|
|
15
|
+
setupTripartiteRenderer(webhandle)
|
|
16
|
+
return manager
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default initializeWebhandleComponent
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webhandle/tripartite-renderer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "setup-tripartite-renderer.mjs",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "node test/all.mjs"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [],
|
|
10
|
+
"author": "",
|
|
11
|
+
"license": "ISC",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@webhandle/initialize-webhandle-component": "^1.0.1",
|
|
15
|
+
"file-sink": "^1.0.15",
|
|
16
|
+
"filter-log": "^1.0.13",
|
|
17
|
+
"tripartite": "^1.1.5"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@webhandle/express-5": "^1.0.0"
|
|
21
|
+
}
|
|
22
|
+
, "files": [
|
|
23
|
+
"README.md"
|
|
24
|
+
, "*.mjs"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import filterLog from 'filter-log'
|
|
2
|
+
import tripartite from 'tripartite'
|
|
3
|
+
let log = filterLog('webhandle', { component: 'tripartite render' })
|
|
4
|
+
let tri = tripartite
|
|
5
|
+
import createCachingLoader from '@webhandle/core/lib/loaders/create-caching-loader.mjs'
|
|
6
|
+
import determineTemplateName from './determine-template-name.mjs'
|
|
7
|
+
import createTripartiteFileLoader from "@webhandle/core/lib/loaders/create-tripartite-template-loader.mjs"
|
|
8
|
+
import FileSink from 'file-sink'
|
|
9
|
+
|
|
10
|
+
export default function setupTripartiteRenderer(webhandle) {
|
|
11
|
+
webhandle.tripartiteTemplateLoaders = []
|
|
12
|
+
webhandle.tripartite = tri
|
|
13
|
+
|
|
14
|
+
webhandle.addTemplateDir = function (path, { immutable } = {}) {
|
|
15
|
+
let absPath = webhandle.getAbsolutePathFromProjectRelative(path)
|
|
16
|
+
let sink = new FileSink(absPath)
|
|
17
|
+
let loader = createTripartiteFileLoader(sink)
|
|
18
|
+
|
|
19
|
+
if(immutable === undefined) {
|
|
20
|
+
immutable = !webhandle.development
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if(immutable) {
|
|
24
|
+
loader = createCachingLoader(loader, {})
|
|
25
|
+
}
|
|
26
|
+
this.tripartiteTemplateLoaders.push(loader)
|
|
27
|
+
let info = {
|
|
28
|
+
loader, sink, path: absPath, immutable
|
|
29
|
+
}
|
|
30
|
+
return info
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
webhandle.createScopedTripartite = function () {
|
|
34
|
+
let scoped = tri.createBlank()
|
|
35
|
+
scoped.loaders = this.tripartiteTemplateLoaders.map(loader => createCachingLoader(loader, {}))
|
|
36
|
+
scoped.dataFunctions = Object.assign({}, tri.dataFunctions)
|
|
37
|
+
|
|
38
|
+
if (this.app) {
|
|
39
|
+
let viewPaths = this.app.get('views')
|
|
40
|
+
if(viewPaths && Array.isArray(viewPaths) === false) {
|
|
41
|
+
viewPaths = [viewPaths]
|
|
42
|
+
}
|
|
43
|
+
for (let viewPath of viewPaths) {
|
|
44
|
+
let absPath = webhandle.getAbsolutePathFromProjectRelative(viewPath)
|
|
45
|
+
let sink = new FileSink(absPath)
|
|
46
|
+
let loader = createTripartiteFileLoader(sink)
|
|
47
|
+
scoped.loaders.push(loader)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return scoped
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (webhandle.app && webhandle.app.engine) {
|
|
55
|
+
|
|
56
|
+
// define the template engine
|
|
57
|
+
webhandle.app.engine('tri', async (filePath, options, callback) => {
|
|
58
|
+
let triInstance = webhandle.createScopedTripartite()
|
|
59
|
+
let absViewPaths = webhandle.app.get('views').map(view => webhandle.getAbsolutePathFromProjectRelative(view))
|
|
60
|
+
let name = determineTemplateName(filePath, absViewPaths)
|
|
61
|
+
triInstance.loadTemplate(name, function (template) {
|
|
62
|
+
if (template) {
|
|
63
|
+
let data = options || {}
|
|
64
|
+
template(data, function (err, content) {
|
|
65
|
+
if (err) {
|
|
66
|
+
log.error(err)
|
|
67
|
+
}
|
|
68
|
+
if (callback) {
|
|
69
|
+
return callback(content)
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
if (callback) {
|
|
75
|
+
return callback()
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
// register the template engine
|
|
82
|
+
webhandle.app.set('view engine', 'tri')
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function changeResponseForTripartite(req, res, next) {
|
|
86
|
+
try {
|
|
87
|
+
res.oldInternalRender = res.internalRender
|
|
88
|
+
|
|
89
|
+
let resTri = res.tri = webhandle.createScopedTripartite()
|
|
90
|
+
resTri.dataFunctions.externalResources = res.externalResources
|
|
91
|
+
|
|
92
|
+
res.internalRender = function (name, data, callback, destination) {
|
|
93
|
+
resTri.loadTemplate(name, function (template) {
|
|
94
|
+
if (template) {
|
|
95
|
+
data = data || res.locals
|
|
96
|
+
template(data, destination, function (err) {
|
|
97
|
+
if (err) {
|
|
98
|
+
log.error(err)
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
destination.end()
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
log.error(e)
|
|
105
|
+
}
|
|
106
|
+
if (callback) {
|
|
107
|
+
return callback()
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
} else {
|
|
111
|
+
res.oldInternalRender(name, data, callback)
|
|
112
|
+
}
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
next()
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
log.error(e)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
webhandle.routers.preParmParse.use(changeResponseForTripartite)
|
|
123
|
+
|
|
124
|
+
}
|