@jsreport/jsreport-core 3.1.2-test.2 → 3.2.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/LICENSE +166 -166
- package/README.md +298 -298
- package/index.js +29 -29
- package/lib/main/blobStorage/blobStorage.js +52 -52
- package/lib/main/blobStorage/inMemoryProvider.js +27 -27
- package/lib/main/blobStorage/mainActions.js +24 -24
- package/lib/main/createDefaultLoggerFormat.js +17 -17
- package/lib/main/defaults.js +14 -14
- package/lib/main/extensions/discover.js +20 -20
- package/lib/main/extensions/extensionsManager.js +264 -264
- package/lib/main/extensions/fileUtils.js +56 -56
- package/lib/main/extensions/findVersion.js +49 -49
- package/lib/main/extensions/locationCache.js +103 -103
- package/lib/main/extensions/sorter.js +10 -10
- package/lib/main/extensions/validateMinimalVersion.js +50 -50
- package/lib/main/folders/cascadeFolderRemove.js +25 -25
- package/lib/main/folders/getEntitiesInFolder.js +53 -53
- package/lib/main/folders/index.js +42 -42
- package/lib/main/folders/moveBetweenFolders.js +354 -354
- package/lib/main/folders/validateDuplicatedName.js +107 -107
- package/lib/main/folders/validateReservedName.js +53 -53
- package/lib/main/logger.js +244 -244
- package/lib/main/migration/resourcesToAssets.js +230 -230
- package/lib/main/migration/xlsxTemplatesToAssets.js +128 -128
- package/lib/main/monitoring.js +91 -91
- package/lib/main/optionsLoad.js +237 -237
- package/lib/main/optionsSchema.js +237 -237
- package/lib/main/reporter.js +574 -579
- package/lib/main/schemaValidator.js +252 -252
- package/lib/main/settings.js +154 -154
- package/lib/main/store/checkDuplicatedId.js +27 -27
- package/lib/main/store/collection.js +329 -329
- package/lib/main/store/documentStore.js +469 -469
- package/lib/main/store/mainActions.js +28 -28
- package/lib/main/store/memoryStoreProvider.js +99 -99
- package/lib/main/store/queue.js +48 -48
- package/lib/main/store/referenceUtils.js +251 -251
- package/lib/main/store/setupValidateId.js +43 -43
- package/lib/main/store/setupValidateShortid.js +71 -71
- package/lib/main/store/transaction.js +69 -69
- package/lib/main/store/typeUtils.js +180 -180
- package/lib/main/templates.js +34 -34
- package/lib/main/validateEntityName.js +62 -62
- package/lib/shared/createError.js +36 -36
- package/lib/shared/encryption.js +114 -114
- package/lib/shared/folders/index.js +11 -11
- package/lib/shared/folders/normalizeEntityPath.js +15 -15
- package/lib/shared/folders/resolveEntityFromPath.js +88 -88
- package/lib/shared/folders/resolveEntityPath.js +46 -46
- package/lib/shared/folders/resolveFolderFromPath.js +38 -38
- package/lib/shared/generateRequestId.js +4 -4
- package/lib/shared/listenerCollection.js +169 -169
- package/lib/shared/normalizeMetaFromLogs.js +30 -30
- package/lib/shared/reporter.js +128 -123
- package/lib/shared/request.js +64 -64
- package/lib/shared/tempFilesHandler.js +81 -81
- package/lib/shared/templates.js +82 -82
- package/lib/static/helpers.js +33 -33
- package/lib/worker/blobStorage.js +34 -34
- package/lib/worker/defaultProxyExtend.js +46 -46
- package/lib/worker/documentStore.js +49 -49
- package/lib/worker/extensionsManager.js +17 -17
- package/lib/worker/logger.js +48 -48
- package/lib/worker/render/diff.js +138 -138
- package/lib/worker/render/executeEngine.js +239 -207
- package/lib/worker/render/htmlRecipe.js +10 -10
- package/lib/worker/render/moduleHelper.js +45 -43
- package/lib/worker/render/noneEngine.js +12 -12
- package/lib/worker/render/profiler.js +158 -158
- package/lib/worker/render/render.js +202 -205
- package/lib/worker/render/resolveReferences.js +60 -60
- package/lib/worker/reporter.js +192 -191
- package/lib/worker/sandbox/runInSandbox.js +16 -9
- package/lib/worker/sandbox/safeSandbox.js +828 -828
- package/lib/worker/templates.js +80 -78
- package/lib/worker/workerHandler.js +54 -54
- package/package.json +92 -92
- package/test/blobStorage/common.js +21 -21
- package/test/store/common.js +1449 -1449
package/lib/worker/reporter.js
CHANGED
|
@@ -1,191 +1,192 @@
|
|
|
1
|
-
const ExtensionsManager = require('./extensionsManager')
|
|
2
|
-
const DocumentStore = require('./documentStore')
|
|
3
|
-
const Templates = require('./templates')
|
|
4
|
-
const createLogger = require('./logger')
|
|
5
|
-
const runInSandbox = require('./sandbox/runInSandbox')
|
|
6
|
-
const createNoneEngine = require('./render/noneEngine')
|
|
7
|
-
const htmlRecipe = require('./render/htmlRecipe')
|
|
8
|
-
const defaultProxyExtend = require('./defaultProxyExtend')
|
|
9
|
-
const Reporter = require('../shared/reporter')
|
|
10
|
-
const BlobStorage = require('./blobStorage.js')
|
|
11
|
-
const Render = require('./render/render')
|
|
12
|
-
const Profiler = require('./render/profiler.js')
|
|
13
|
-
|
|
14
|
-
class WorkerReporter extends Reporter {
|
|
15
|
-
constructor (workerData, executeMain) {
|
|
16
|
-
const { options, documentStore, extensionsDefs } = workerData
|
|
17
|
-
|
|
18
|
-
super(options)
|
|
19
|
-
|
|
20
|
-
this._executeMain = executeMain
|
|
21
|
-
this._initialized = false
|
|
22
|
-
this._documentStoreData = documentStore
|
|
23
|
-
this._requestContextMetaConfigCollection = new Map()
|
|
24
|
-
this._proxyRegistrationFns = []
|
|
25
|
-
this.requestModulesCache = new Map()
|
|
26
|
-
this._workerActions = new Map()
|
|
27
|
-
this._registerRenderAction()
|
|
28
|
-
|
|
29
|
-
this.
|
|
30
|
-
this.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
this.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
this.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.addRequestContextMetaConfig('
|
|
58
|
-
this.addRequestContextMetaConfig('
|
|
59
|
-
this.addRequestContextMetaConfig('
|
|
60
|
-
this.addRequestContextMetaConfig('
|
|
61
|
-
this.addRequestContextMetaConfig('
|
|
62
|
-
this.addRequestContextMetaConfig('
|
|
63
|
-
this.addRequestContextMetaConfig('
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
|
|
1
|
+
const ExtensionsManager = require('./extensionsManager')
|
|
2
|
+
const DocumentStore = require('./documentStore')
|
|
3
|
+
const Templates = require('./templates')
|
|
4
|
+
const createLogger = require('./logger')
|
|
5
|
+
const runInSandbox = require('./sandbox/runInSandbox')
|
|
6
|
+
const createNoneEngine = require('./render/noneEngine')
|
|
7
|
+
const htmlRecipe = require('./render/htmlRecipe')
|
|
8
|
+
const defaultProxyExtend = require('./defaultProxyExtend')
|
|
9
|
+
const Reporter = require('../shared/reporter')
|
|
10
|
+
const BlobStorage = require('./blobStorage.js')
|
|
11
|
+
const Render = require('./render/render')
|
|
12
|
+
const Profiler = require('./render/profiler.js')
|
|
13
|
+
|
|
14
|
+
class WorkerReporter extends Reporter {
|
|
15
|
+
constructor (workerData, executeMain) {
|
|
16
|
+
const { options, documentStore, extensionsDefs } = workerData
|
|
17
|
+
|
|
18
|
+
super(options)
|
|
19
|
+
|
|
20
|
+
this._executeMain = executeMain
|
|
21
|
+
this._initialized = false
|
|
22
|
+
this._documentStoreData = documentStore
|
|
23
|
+
this._requestContextMetaConfigCollection = new Map()
|
|
24
|
+
this._proxyRegistrationFns = []
|
|
25
|
+
this.requestModulesCache = new Map()
|
|
26
|
+
this._workerActions = new Map()
|
|
27
|
+
this._registerRenderAction()
|
|
28
|
+
|
|
29
|
+
this.registerHelpersListeners = this.createListenerCollection('registerHelpers')
|
|
30
|
+
this.afterTemplatingEnginesExecutedListeners = this.createListenerCollection('afterTemplatingEnginesExecuted')
|
|
31
|
+
this.validateRenderListeners = this.createListenerCollection('validateRender')
|
|
32
|
+
|
|
33
|
+
this.extensionsManager = ExtensionsManager(this, extensionsDefs)
|
|
34
|
+
|
|
35
|
+
this.extendProxy((proxy, req) => defaultProxyExtend(this)(proxy, req))
|
|
36
|
+
this.beforeMainActionListeners = this.createListenerCollection('beforeMainAction')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async init () {
|
|
40
|
+
if (this._initialized === true) {
|
|
41
|
+
throw new Error('jsreport already initialized. Make sure init is called only once')
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
super.init()
|
|
45
|
+
|
|
46
|
+
Templates(this)
|
|
47
|
+
|
|
48
|
+
this.profiler = Profiler(this)
|
|
49
|
+
this.logger = createLogger(this.profiler)
|
|
50
|
+
|
|
51
|
+
this._render = Render(this)
|
|
52
|
+
await this.extensionsManager.init()
|
|
53
|
+
|
|
54
|
+
this.documentStore = DocumentStore(this._documentStoreData, this.executeMainAction.bind(this))
|
|
55
|
+
this.blobStorage = BlobStorage(this.executeMainAction.bind(this))
|
|
56
|
+
|
|
57
|
+
this.addRequestContextMetaConfig('rootId', { sandboxReadOnly: true })
|
|
58
|
+
this.addRequestContextMetaConfig('id', { sandboxReadOnly: true })
|
|
59
|
+
this.addRequestContextMetaConfig('reportCounter', { sandboxReadOnly: true })
|
|
60
|
+
this.addRequestContextMetaConfig('startTimestamp', { sandboxReadOnly: true })
|
|
61
|
+
this.addRequestContextMetaConfig('logs', { sandboxReadOnly: true })
|
|
62
|
+
this.addRequestContextMetaConfig('isChildRequest', { sandboxReadOnly: true })
|
|
63
|
+
this.addRequestContextMetaConfig('originalInputDataIsEmpty', { sandboxReadOnly: true })
|
|
64
|
+
this.addRequestContextMetaConfig('skipModificationDateUpdate', { sandboxHidden: true })
|
|
65
|
+
|
|
66
|
+
this._runInSandbox = runInSandbox(this)
|
|
67
|
+
|
|
68
|
+
const { compile: compileNone, execute: executeNone } = createNoneEngine()
|
|
69
|
+
|
|
70
|
+
this.extensionsManager.engines.push({
|
|
71
|
+
name: 'none',
|
|
72
|
+
compile: compileNone,
|
|
73
|
+
execute: executeNone
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
this.extensionsManager.recipes.push({
|
|
77
|
+
name: 'html',
|
|
78
|
+
execute: htmlRecipe
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
await this.initializeListeners.fire()
|
|
82
|
+
|
|
83
|
+
this._initialized = true
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @public
|
|
88
|
+
*/
|
|
89
|
+
addRequestContextMetaConfig (property, options) {
|
|
90
|
+
this._requestContextMetaConfigCollection.set(property, options)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @public
|
|
95
|
+
*/
|
|
96
|
+
getRequestContextMetaConfig (property) {
|
|
97
|
+
if (property === undefined) {
|
|
98
|
+
const all = {}
|
|
99
|
+
|
|
100
|
+
for (const [key, value] of this._requestContextMetaConfigCollection.entries()) {
|
|
101
|
+
all[key] = value
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return all
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return this._requestContextMetaConfigCollection.get(property)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
extendProxy (registrationFn) {
|
|
111
|
+
this._proxyRegistrationFns.push(registrationFn)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
createProxy ({ req, runInSandbox, context, getTopLevelFunctions, safeRequire }) {
|
|
115
|
+
const proxyInstance = {}
|
|
116
|
+
for (const fn of this._proxyRegistrationFns) {
|
|
117
|
+
fn(proxyInstance, req, {
|
|
118
|
+
runInSandbox,
|
|
119
|
+
context,
|
|
120
|
+
getTopLevelFunctions,
|
|
121
|
+
safeRequire
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
return proxyInstance
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
render (req, parentReq) {
|
|
128
|
+
return this._render(req, parentReq)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async executeMainAction (actionName, data, req) {
|
|
132
|
+
await this.beforeMainActionListeners.fire(actionName, data, req)
|
|
133
|
+
return this._executeMain(actionName, data, req)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async runInSandbox ({
|
|
137
|
+
manager,
|
|
138
|
+
context,
|
|
139
|
+
userCode,
|
|
140
|
+
executionFn,
|
|
141
|
+
onRequire,
|
|
142
|
+
propertiesConfig,
|
|
143
|
+
currentPath,
|
|
144
|
+
errorLineNumberOffset
|
|
145
|
+
}, req) {
|
|
146
|
+
return this._runInSandbox({
|
|
147
|
+
manager,
|
|
148
|
+
context,
|
|
149
|
+
userCode,
|
|
150
|
+
executionFn,
|
|
151
|
+
onRequire,
|
|
152
|
+
propertiesConfig,
|
|
153
|
+
currentPath,
|
|
154
|
+
errorLineNumberOffset
|
|
155
|
+
}, req)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
registerWorkerAction (actionName, fn) {
|
|
159
|
+
this._workerActions.set(actionName, fn)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async executeWorkerAction (actionName, data, req) {
|
|
163
|
+
const action = this._workerActions.get(actionName)
|
|
164
|
+
if (!action) {
|
|
165
|
+
throw new Error(`Worker action ${actionName} not registered`)
|
|
166
|
+
}
|
|
167
|
+
return action(data, req)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
_registerRenderAction () {
|
|
171
|
+
this.registerWorkerAction('render', async (data, req) => {
|
|
172
|
+
const res = await this.render(req)
|
|
173
|
+
|
|
174
|
+
const sharedBuf = new SharedArrayBuffer(res.content.byteLength)
|
|
175
|
+
const buf = Buffer.from(sharedBuf)
|
|
176
|
+
|
|
177
|
+
res.content.copy(buf)
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
meta: res.meta,
|
|
181
|
+
content: buf
|
|
182
|
+
}
|
|
183
|
+
})
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async close () {
|
|
187
|
+
this.logger.debug('Closing jsreport worker')
|
|
188
|
+
return this.closeListeners.fire()
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
module.exports = WorkerReporter
|
|
@@ -75,15 +75,22 @@ module.exports = (reporter) => {
|
|
|
75
75
|
const functionNames = getTopLevelFunctions(userCode)
|
|
76
76
|
const functionsCode = `return {${functionNames.map(h => `"${h}": ${h}`).join(',')}}`
|
|
77
77
|
const executionCode = `;(async () => { ${userCode}; ${functionsCode} })()
|
|
78
|
-
.then((topLevelFunctions) =>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
78
|
+
.then((topLevelFunctions) => {
|
|
79
|
+
const mergedTopLevelFunctions = { ...topLevelFunctions, ...__topLevelFunctions }
|
|
80
|
+
|
|
81
|
+
// expose top level functions to the sandbox context
|
|
82
|
+
// so helpers can call other helpers (from shared asset helpers, or .registerHelpers call from proxy)
|
|
83
|
+
for (const [topLevelFnName, topLevelFn] of Object.entries(mergedTopLevelFunctions)) {
|
|
84
|
+
this[topLevelFnName] = topLevelFn
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return ${executionFnName}({
|
|
88
|
+
topLevelFunctions: mergedTopLevelFunctions,
|
|
89
|
+
require,
|
|
90
|
+
console,
|
|
91
|
+
context: this
|
|
92
|
+
})
|
|
93
|
+
}).catch(__handleError);`
|
|
87
94
|
|
|
88
95
|
return run(executionCode, {
|
|
89
96
|
filename: 'sandbox.js',
|