@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 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
+ }