@jsreport/jsreport-core 3.0.0 → 3.1.2-test.1

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.
Files changed (80) hide show
  1. package/LICENSE +166 -166
  2. package/README.md +298 -284
  3. package/index.js +29 -27
  4. package/lib/main/blobStorage/blobStorage.js +52 -47
  5. package/lib/main/blobStorage/inMemoryProvider.js +27 -27
  6. package/lib/main/blobStorage/mainActions.js +24 -24
  7. package/lib/main/createDefaultLoggerFormat.js +17 -17
  8. package/lib/main/defaults.js +14 -14
  9. package/lib/main/extensions/discover.js +20 -20
  10. package/lib/main/extensions/extensionsManager.js +264 -265
  11. package/lib/main/extensions/fileUtils.js +56 -55
  12. package/lib/main/extensions/findVersion.js +49 -53
  13. package/lib/main/extensions/locationCache.js +103 -97
  14. package/lib/main/extensions/sorter.js +10 -10
  15. package/lib/main/extensions/validateMinimalVersion.js +50 -50
  16. package/lib/main/folders/cascadeFolderRemove.js +25 -25
  17. package/lib/main/folders/getEntitiesInFolder.js +53 -53
  18. package/lib/main/folders/index.js +42 -42
  19. package/lib/main/folders/moveBetweenFolders.js +354 -354
  20. package/lib/main/folders/validateDuplicatedName.js +107 -107
  21. package/lib/main/folders/validateReservedName.js +53 -53
  22. package/lib/main/logger.js +244 -244
  23. package/lib/main/migration/resourcesToAssets.js +230 -210
  24. package/lib/main/migration/xlsxTemplatesToAssets.js +128 -118
  25. package/lib/main/monitoring.js +91 -91
  26. package/lib/main/optionsLoad.js +237 -237
  27. package/lib/main/optionsSchema.js +237 -237
  28. package/lib/main/profiler.js +2 -1
  29. package/lib/main/reporter.js +575 -578
  30. package/lib/main/schemaValidator.js +252 -252
  31. package/lib/main/settings.js +154 -154
  32. package/lib/main/store/checkDuplicatedId.js +27 -27
  33. package/lib/main/store/collection.js +329 -329
  34. package/lib/main/store/documentStore.js +469 -469
  35. package/lib/main/store/mainActions.js +28 -28
  36. package/lib/main/store/memoryStoreProvider.js +99 -99
  37. package/lib/main/store/queue.js +48 -48
  38. package/lib/main/store/referenceUtils.js +251 -251
  39. package/lib/main/store/setupValidateId.js +43 -43
  40. package/lib/main/store/setupValidateShortid.js +71 -71
  41. package/lib/main/store/transaction.js +69 -69
  42. package/lib/main/store/typeUtils.js +180 -180
  43. package/lib/main/templates.js +34 -34
  44. package/lib/main/validateEntityName.js +62 -62
  45. package/lib/shared/createError.js +36 -36
  46. package/lib/shared/encryption.js +114 -114
  47. package/lib/shared/folders/index.js +11 -11
  48. package/lib/shared/folders/normalizeEntityPath.js +15 -15
  49. package/lib/shared/folders/resolveEntityFromPath.js +88 -88
  50. package/lib/shared/folders/resolveEntityPath.js +46 -46
  51. package/lib/shared/folders/resolveFolderFromPath.js +38 -38
  52. package/lib/shared/generateRequestId.js +4 -4
  53. package/lib/shared/listenerCollection.js +169 -0
  54. package/lib/shared/normalizeMetaFromLogs.js +30 -30
  55. package/lib/shared/reporter.js +128 -123
  56. package/lib/shared/request.js +64 -64
  57. package/lib/shared/tempFilesHandler.js +81 -81
  58. package/lib/shared/templates.js +82 -82
  59. package/lib/static/helpers.js +33 -33
  60. package/lib/worker/blobStorage.js +34 -34
  61. package/lib/worker/defaultProxyExtend.js +46 -46
  62. package/lib/worker/documentStore.js +49 -49
  63. package/lib/worker/extensionsManager.js +17 -17
  64. package/lib/worker/logger.js +48 -48
  65. package/lib/worker/render/diff.js +138 -138
  66. package/lib/worker/render/executeEngine.js +227 -190
  67. package/lib/worker/render/htmlRecipe.js +10 -10
  68. package/lib/worker/render/moduleHelper.js +45 -43
  69. package/lib/worker/render/noneEngine.js +12 -12
  70. package/lib/worker/render/profiler.js +158 -158
  71. package/lib/worker/render/render.js +213 -209
  72. package/lib/worker/render/resolveReferences.js +60 -60
  73. package/lib/worker/reporter.js +192 -187
  74. package/lib/worker/sandbox/runInSandbox.js +13 -4
  75. package/lib/worker/sandbox/safeSandbox.js +828 -822
  76. package/lib/worker/templates.js +78 -78
  77. package/lib/worker/workerHandler.js +54 -54
  78. package/package.json +92 -92
  79. package/test/blobStorage/common.js +21 -21
  80. package/test/store/common.js +1449 -1449
@@ -1,190 +1,227 @@
1
- /*!
2
- * Copyright(c) 2018 Jan Blaha
3
- *
4
- * Child process script rendering html from template content, helpers and input data.
5
- * This script runs in the extra process because of multitenancy and security requirements, errors like infinite loop
6
- * should not affect other reports being rendered at the same time
7
- */
8
- const LRU = require('lru-cache')
9
- const { nanoid } = require('nanoid')
10
-
11
- module.exports = (reporter) => {
12
- const cache = LRU(reporter.options.sandbox.cache || { max: 100 })
13
- reporter.templatingEngines = { cache }
14
-
15
- return async (engine, req) => {
16
- const executionFnParsedParamsMap = new Map()
17
-
18
- reporter.extendProxy((proxy, req, {
19
- runInSandbox,
20
- context,
21
- getTopLevelFunctions
22
- }) => {
23
- proxy.templatingEngines = {
24
- evaluate: async ({ engine, content, helpers, data }, { entity, entitySet }) => {
25
- const engineImpl = reporter.extensionsManager.engines.find((e) => e.name === engine)
26
-
27
- if (!engine) {
28
- throw reporter.createError(`Engine '${engine}' not found. If this is a custom engine make sure it's properly installed from npm`, {
29
- statusCode: 400
30
- })
31
- }
32
-
33
- const res = await executeEngine({
34
- engine: engineImpl,
35
- content,
36
- helpers,
37
- systemHelpers: req.context.systemHelpers,
38
- data
39
- }, { executionFnParsedParamsMap, handleErrors: false, entity, entitySet }, req)
40
- return res.content
41
- }
42
- }
43
- })
44
-
45
- req.data.__appDirectory = reporter.options.appDirectory
46
- req.data.__rootDirectory = reporter.options.rootDirectory
47
- req.data.__parentModuleDirectory = reporter.options.parentModuleDirectory
48
-
49
- return executeEngine({
50
- engine,
51
- content: req.template.content,
52
- helpers: req.template.helpers,
53
- systemHelpers: req.context.systemHelpers,
54
- data: req.data
55
- }, {
56
- executionFnParsedParamsMap,
57
- handleErrors: true,
58
- entity: req.template,
59
- entitySet: 'templates'
60
- }, req)
61
- }
62
-
63
- async function executeEngine ({ engine, content, helpers, systemHelpers, data }, { executionFnParsedParamsMap, handleErrors, entity, entitySet }, req) {
64
- const joinedHelpers = systemHelpers + '\n' + helpers
65
- const executionFnParsedParamsKey = `entity:${entity.shortid || 'anonymous'}:helpers:${joinedHelpers}`
66
-
67
- const executionFn = async ({ require, console, topLevelFunctions }) => {
68
- if (entitySet !== 'templates') {
69
- const jsreport = require('jsreport-proxy')
70
- const entityPath = await jsreport.folders.resolveEntityPath(entity, entitySet)
71
- jsreport.currentPath = entityPath.substring(0, entityPath.lastIndexOf('/'))
72
- }
73
-
74
- const asyncResultMap = new Map()
75
- executionFnParsedParamsMap.set(executionFnParsedParamsKey, { require, console, topLevelFunctions })
76
-
77
- const key = `template:${content}:${engine.name}`
78
-
79
- if (!cache.has(key)) {
80
- try {
81
- cache.set(key, engine.compile(content, { require }))
82
- } catch (e) {
83
- e.property = 'content'
84
- throw e
85
- }
86
- }
87
-
88
- const compiledTemplate = cache.get(key)
89
-
90
- const wrappedTopLevelFunctions = {}
91
-
92
- for (const h of Object.keys(topLevelFunctions)) {
93
- wrappedTopLevelFunctions[h] = wrapHelperForAsyncSupport(topLevelFunctions[h], asyncResultMap)
94
- }
95
-
96
- let contentResult = await engine.execute(compiledTemplate, wrappedTopLevelFunctions, data, { require })
97
- const resolvedResultsMap = new Map()
98
- while (asyncResultMap.size > 0) {
99
- await Promise.all([...asyncResultMap.keys()].map(async (k) => {
100
- resolvedResultsMap.set(k, `${await asyncResultMap.get(k)}`)
101
- asyncResultMap.delete(k)
102
- }))
103
- }
104
-
105
- while (contentResult.includes('{#asyncHelperResult')) {
106
- contentResult = contentResult.replace(/{#asyncHelperResult ([^{}]+)}/g, (str, p1) => {
107
- const asyncResultId = p1
108
- return `${resolvedResultsMap.get(asyncResultId)}`
109
- })
110
- }
111
-
112
- return {
113
- content: contentResult
114
- }
115
- }
116
-
117
- if (executionFnParsedParamsMap.has(executionFnParsedParamsKey)) {
118
- const { require, console, topLevelFunctions } = executionFnParsedParamsMap.get(executionFnParsedParamsKey)
119
-
120
- return executionFn({ require, console, topLevelFunctions })
121
- }
122
-
123
- if (reporter.options.sandbox.cache && reporter.options.sandbox.cache.enabled === false) {
124
- cache.reset()
125
- }
126
-
127
- try {
128
- return await reporter.runInSandbox({
129
- context: {
130
- ...(engine.createContext ? engine.createContext() : {})
131
- },
132
- userCode: joinedHelpers,
133
- executionFn,
134
- errorLineNumberOffset: systemHelpers.split('\n').length,
135
- onRequire: (moduleName, { context }) => {
136
- if (engine.onRequire) {
137
- return engine.onRequire(moduleName, { context })
138
- }
139
- }
140
- }, req)
141
- } catch (e) {
142
- if (!handleErrors) {
143
- throw e
144
- }
145
-
146
- const nestedErrorWithEntity = e.entity != null
147
-
148
- const templatePath = req.template._id ? await reporter.folders.resolveEntityPath(req.template, 'templates', req) : 'anonymous'
149
- if (templatePath !== 'anonymous' && !nestedErrorWithEntity) {
150
- const templateFound = await reporter.folders.resolveEntityFromPath(templatePath, 'templates', req)
151
- if (templateFound != null) {
152
- e.entity = {
153
- shortid: templateFound.entity.shortid,
154
- name: templateFound.entity.name,
155
- content
156
- }
157
- }
158
- }
159
-
160
- e.message = `Error when evaluating engine ${engine.name} for template ${templatePath}\n` + e.message
161
-
162
- if (!nestedErrorWithEntity && e.property !== 'content') {
163
- e.property = 'helpers'
164
- }
165
-
166
- if (nestedErrorWithEntity) {
167
- // errors from nested assets evals needs an unwrap for some reason
168
- e.entity = { ...e.entity }
169
- }
170
-
171
- throw e
172
- }
173
- }
174
-
175
- function wrapHelperForAsyncSupport (fn, asyncResultMap) {
176
- return function (...args) {
177
- // important to call the helper with the current this to preserve the same behaviour
178
- const fnResult = fn.call(this, ...args)
179
-
180
- if (fnResult == null || typeof fnResult.then !== 'function') {
181
- return fnResult
182
- }
183
-
184
- const asyncResultId = nanoid(7)
185
- asyncResultMap.set(asyncResultId, fnResult)
186
-
187
- return `{#asyncHelperResult ${asyncResultId}}`
188
- }
189
- }
190
- }
1
+ /*!
2
+ * Copyright(c) 2018 Jan Blaha
3
+ *
4
+ * Child process script rendering html from template content, helpers and input data.
5
+ * This script runs in the extra process because of multitenancy and security requirements, errors like infinite loop
6
+ * should not affect other reports being rendered at the same time
7
+ */
8
+ const LRU = require('lru-cache')
9
+ const { nanoid } = require('nanoid')
10
+
11
+ module.exports = (reporter) => {
12
+ const cache = LRU(reporter.options.sandbox.cache || { max: 100 })
13
+
14
+ reporter.templatingEngines = { cache }
15
+
16
+ const executionFnParsedParamsMap = new Map()
17
+
18
+ const templatingEnginesEvaluate = async (mainCall, { engine, content, helpers, data }, { entity, entitySet }, req) => {
19
+ const engineImpl = reporter.extensionsManager.engines.find((e) => e.name === engine)
20
+
21
+ if (!engine) {
22
+ throw reporter.createError(`Engine '${engine}' not found. If this is a custom engine make sure it's properly installed from npm`, {
23
+ statusCode: 400
24
+ })
25
+ }
26
+
27
+ if (mainCall) {
28
+ executionFnParsedParamsMap.set(req.context.id, new Map())
29
+ }
30
+
31
+ try {
32
+ const res = await executeEngine({
33
+ engine: engineImpl,
34
+ content,
35
+ helpers,
36
+ systemHelpers: req.context.systemHelpers,
37
+ data
38
+ }, { handleErrors: false, entity, entitySet }, req)
39
+
40
+ return res.content
41
+ } finally {
42
+ if (mainCall) {
43
+ executionFnParsedParamsMap.delete(req.context.id)
44
+ }
45
+ }
46
+ }
47
+
48
+ reporter.templatingEngines.evaluate = (executionInfo, entityInfo, req) => templatingEnginesEvaluate(true, executionInfo, entityInfo, req)
49
+
50
+ reporter.extendProxy((proxy, req, {
51
+ runInSandbox,
52
+ context,
53
+ getTopLevelFunctions
54
+ }) => {
55
+ proxy.templatingEngines = {
56
+ evaluate: async (executionInfo, entityInfo) => {
57
+ return templatingEnginesEvaluate(false, executionInfo, entityInfo, req)
58
+ }
59
+ }
60
+ })
61
+
62
+ return async (engine, req) => {
63
+ executionFnParsedParamsMap.set(req.context.id, new Map())
64
+ req.data.__appDirectory = reporter.options.appDirectory
65
+ req.data.__rootDirectory = reporter.options.rootDirectory
66
+ req.data.__parentModuleDirectory = reporter.options.parentModuleDirectory
67
+
68
+ try {
69
+ return await executeEngine({
70
+ engine,
71
+ content: req.template.content,
72
+ helpers: req.template.helpers,
73
+ systemHelpers: req.context.systemHelpers,
74
+ data: req.data
75
+ }, {
76
+ handleErrors: true,
77
+ entity: req.template,
78
+ entitySet: 'templates'
79
+ }, req)
80
+ } finally {
81
+ executionFnParsedParamsMap.delete(req.context.id)
82
+ }
83
+ }
84
+
85
+ async function executeEngine ({ engine, content, helpers, systemHelpers, data }, { handleErrors, entity, entitySet }, req) {
86
+ let entityPath
87
+
88
+ if (entity._id) {
89
+ entityPath = await reporter.folders.resolveEntityPath(entity, entitySet, req)
90
+ entityPath = entityPath.substring(0, entityPath.lastIndexOf('/'))
91
+ }
92
+
93
+ const joinedHelpers = systemHelpers + '\n' + (helpers || '')
94
+ const executionFnParsedParamsKey = `entity:${entity.shortid || 'anonymous'}:helpers:${joinedHelpers}`
95
+
96
+ const executionFn = async ({ require, console, topLevelFunctions }) => {
97
+ // cached components dont call runInSandbox but share the proxy, we get to it here
98
+ if (entitySet !== 'templates') {
99
+ const jsreport = require('jsreport-proxy')
100
+ jsreport.currentPath = entityPath
101
+ }
102
+
103
+ const asyncResultMap = new Map()
104
+ executionFnParsedParamsMap.get(req.context.id).get(executionFnParsedParamsKey).resolve({ require, console, topLevelFunctions })
105
+ const key = `template:${content}:${engine.name}`
106
+
107
+ if (!cache.has(key)) {
108
+ try {
109
+ cache.set(key, engine.compile(content, { require }))
110
+ } catch (e) {
111
+ e.property = 'content'
112
+ throw e
113
+ }
114
+ }
115
+
116
+ const compiledTemplate = cache.get(key)
117
+
118
+ const wrappedTopLevelFunctions = {}
119
+
120
+ for (const h of Object.keys(topLevelFunctions)) {
121
+ wrappedTopLevelFunctions[h] = wrapHelperForAsyncSupport(topLevelFunctions[h], asyncResultMap)
122
+ }
123
+
124
+ let contentResult = await engine.execute(compiledTemplate, wrappedTopLevelFunctions, data, { require })
125
+ const resolvedResultsMap = new Map()
126
+ while (asyncResultMap.size > 0) {
127
+ await Promise.all([...asyncResultMap.keys()].map(async (k) => {
128
+ resolvedResultsMap.set(k, `${await asyncResultMap.get(k)}`)
129
+ asyncResultMap.delete(k)
130
+ }))
131
+ }
132
+
133
+ while (contentResult.includes('{#asyncHelperResult')) {
134
+ contentResult = contentResult.replace(/{#asyncHelperResult ([^{}]+)}/g, (str, p1) => {
135
+ const asyncResultId = p1
136
+ return `${resolvedResultsMap.get(asyncResultId)}`
137
+ })
138
+ }
139
+
140
+ return {
141
+ content: contentResult
142
+ }
143
+ }
144
+
145
+ // executionFnParsedParamsMap is there to cache parsed components helpers to speed up longer loops
146
+ // we store there for the particular request and component a promise and only the first component gets compiled
147
+ if (executionFnParsedParamsMap.get(req.context.id).has(executionFnParsedParamsKey)) {
148
+ const { require, console, topLevelFunctions } = await (executionFnParsedParamsMap.get(req.context.id).get(executionFnParsedParamsKey).promise)
149
+
150
+ return executionFn({ require, console, topLevelFunctions })
151
+ } else {
152
+ const awaiter = {}
153
+ awaiter.promise = new Promise((resolve) => {
154
+ awaiter.resolve = resolve
155
+ })
156
+ executionFnParsedParamsMap.get(req.context.id).set(executionFnParsedParamsKey, awaiter)
157
+ }
158
+
159
+ if (reporter.options.sandbox.cache && reporter.options.sandbox.cache.enabled === false) {
160
+ cache.reset()
161
+ }
162
+
163
+ try {
164
+ return await reporter.runInSandbox({
165
+ context: {
166
+ ...(engine.createContext ? engine.createContext() : {})
167
+ },
168
+ userCode: joinedHelpers,
169
+ executionFn,
170
+ currentPath: entityPath,
171
+ errorLineNumberOffset: systemHelpers.split('\n').length,
172
+ onRequire: (moduleName, { context }) => {
173
+ if (engine.onRequire) {
174
+ return engine.onRequire(moduleName, { context })
175
+ }
176
+ }
177
+ }, req)
178
+ } catch (e) {
179
+ if (!handleErrors) {
180
+ throw e
181
+ }
182
+
183
+ const nestedErrorWithEntity = e.entity != null
184
+
185
+ const templatePath = req.template._id ? await reporter.folders.resolveEntityPath(req.template, 'templates', req) : 'anonymous'
186
+ if (templatePath !== 'anonymous' && !nestedErrorWithEntity) {
187
+ const templateFound = await reporter.folders.resolveEntityFromPath(templatePath, 'templates', req)
188
+ if (templateFound != null) {
189
+ e.entity = {
190
+ shortid: templateFound.entity.shortid,
191
+ name: templateFound.entity.name,
192
+ content
193
+ }
194
+ }
195
+ }
196
+
197
+ e.message = `Error when evaluating engine ${engine.name} for template ${templatePath}\n` + e.message
198
+
199
+ if (!nestedErrorWithEntity && e.property !== 'content') {
200
+ e.property = 'helpers'
201
+ }
202
+
203
+ if (nestedErrorWithEntity) {
204
+ // errors from nested assets evals needs an unwrap for some reason
205
+ e.entity = { ...e.entity }
206
+ }
207
+
208
+ throw e
209
+ }
210
+ }
211
+
212
+ function wrapHelperForAsyncSupport (fn, asyncResultMap) {
213
+ return function (...args) {
214
+ // important to call the helper with the current this to preserve the same behaviour
215
+ const fnResult = fn.call(this, ...args)
216
+
217
+ if (fnResult == null || typeof fnResult.then !== 'function') {
218
+ return fnResult
219
+ }
220
+
221
+ const asyncResultId = nanoid(7)
222
+ asyncResultMap.set(asyncResultId, fnResult)
223
+
224
+ return `{#asyncHelperResult ${asyncResultId}}`
225
+ }
226
+ }
227
+ }
@@ -1,10 +1,10 @@
1
- /*!
2
- * Copyright(c) 2016 Jan Blaha
3
- *
4
- * Recipe running no document transformations. Just adds html response headers
5
- */
6
-
7
- module.exports = function (req, res) {
8
- res.meta.contentType = 'text/html'
9
- res.meta.fileExtension = 'html'
10
- }
1
+ /*!
2
+ * Copyright(c) 2016 Jan Blaha
3
+ *
4
+ * Recipe running no document transformations. Just adds html response headers
5
+ */
6
+
7
+ module.exports = function (req, res) {
8
+ res.meta.contentType = 'text/html'
9
+ res.meta.fileExtension = 'html'
10
+ }
@@ -1,43 +1,45 @@
1
- const fs = require('fs').promises
2
- const path = require('path')
3
-
4
- module.exports = (reporter) => {
5
- let helpersScript
6
- reporter.beforeRenderListeners.add('core-helpers', async (req) => {
7
- if (!helpersScript) {
8
- helpersScript = await fs.readFile(path.join(__dirname, '../../static/helpers.js'), 'utf8')
9
- }
10
- req.context.systemHelpers += helpersScript + '\n'
11
- })
12
-
13
- reporter.extendProxy((proxy, req, { safeRequire }) => {
14
- proxy.module = async (module) => {
15
- if (!reporter.options.allowLocalFilesAccess && reporter.options.sandbox.allowedModules !== '*') {
16
- if (reporter.options.sandbox.allowedModules.indexOf(module) === -1) {
17
- throw reporter.createError(`require of module ${module} was rejected. Either set allowLocalFilesAccess=true or sandbox.allowLocalModules='*' or sandbox.allowLocalModules=['${module}'] `, { status: 400 })
18
- }
19
- }
20
-
21
- const resolve = require('enhanced-resolve')
22
-
23
- const moduleResolve = resolve.create({
24
- extensions: ['.js', '.json']
25
- })
26
-
27
- const modulePath = await new Promise((resolve, reject) => {
28
- moduleResolve(reporter.options.rootDirectory, module, (err, result) => {
29
- if (err) {
30
- err.message = `module read error. ${err.message}`
31
- return reject(err)
32
- }
33
-
34
- resolve(result)
35
- })
36
- })
37
-
38
- const buf = await fs.readFile(modulePath)
39
-
40
- return buf.toString()
41
- }
42
- })
43
- }
1
+ const fs = require('fs').promises
2
+ const path = require('path')
3
+
4
+ module.exports = (reporter) => {
5
+ let helpersScript
6
+
7
+ reporter.registerHelpersListeners.add('core-helpers', (req) => {
8
+ return helpersScript
9
+ })
10
+
11
+ reporter.initializeListeners.add('core-helpers', async () => {
12
+ helpersScript = await fs.readFile(path.join(__dirname, '../../static/helpers.js'), 'utf8')
13
+ })
14
+
15
+ reporter.extendProxy((proxy, req, { safeRequire }) => {
16
+ proxy.module = async (module) => {
17
+ if (!reporter.options.allowLocalFilesAccess && reporter.options.sandbox.allowedModules !== '*') {
18
+ if (reporter.options.sandbox.allowedModules.indexOf(module) === -1) {
19
+ throw reporter.createError(`require of module ${module} was rejected. Either set allowLocalFilesAccess=true or sandbox.allowLocalModules='*' or sandbox.allowLocalModules=['${module}'] `, { status: 400 })
20
+ }
21
+ }
22
+
23
+ const resolve = require('enhanced-resolve')
24
+
25
+ const moduleResolve = resolve.create({
26
+ extensions: ['.js', '.json']
27
+ })
28
+
29
+ const modulePath = await new Promise((resolve, reject) => {
30
+ moduleResolve(reporter.options.rootDirectory, module, (err, result) => {
31
+ if (err) {
32
+ err.message = `module read error. ${err.message}`
33
+ return reject(err)
34
+ }
35
+
36
+ resolve(result)
37
+ })
38
+ })
39
+
40
+ const buf = await fs.readFile(modulePath)
41
+
42
+ return buf.toString()
43
+ }
44
+ })
45
+ }
@@ -1,12 +1,12 @@
1
- /*!
2
- * Copyright(c) 2018 Jan Blaha
3
- *
4
- * Engine running not templating engine compilation or rendering. Just return input html
5
- */
6
-
7
- module.exports = () => {
8
- return {
9
- compile: (html) => html,
10
- execute: (html) => html
11
- }
12
- }
1
+ /*!
2
+ * Copyright(c) 2018 Jan Blaha
3
+ *
4
+ * Engine running not templating engine compilation or rendering. Just return input html
5
+ */
6
+
7
+ module.exports = () => {
8
+ return {
9
+ compile: (html) => html,
10
+ execute: (html) => html
11
+ }
12
+ }