@jsreport/jsreport-core 3.1.1 → 3.3.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 +254 -244
- package/lib/main/migration/resourcesToAssets.js +230 -230
- package/lib/main/migration/xlsxTemplatesToAssets.js +128 -128
- package/lib/main/monitoring.js +92 -91
- package/lib/main/optionsLoad.js +237 -237
- package/lib/main/optionsSchema.js +237 -237
- package/lib/main/profiler.js +13 -1
- package/lib/main/reporter.js +593 -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 +232 -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 +162 -158
- package/lib/worker/render/render.js +202 -201
- package/lib/worker/render/resolveReferences.js +60 -60
- package/lib/worker/reporter.js +197 -191
- package/lib/worker/sandbox/runInSandbox.js +65 -13
- package/lib/worker/sandbox/safeSandbox.js +829 -828
- package/lib/worker/templates.js +80 -78
- package/lib/worker/workerHandler.js +54 -54
- package/package.json +91 -92
- package/test/blobStorage/common.js +21 -21
- package/test/store/common.js +1449 -1449
package/lib/main/logger.js
CHANGED
|
@@ -1,244 +1,254 @@
|
|
|
1
|
-
const path = require('path')
|
|
2
|
-
const omit = require('lodash.omit')
|
|
3
|
-
const { MESSAGE } = require('triple-beam')
|
|
4
|
-
const winston = require('winston')
|
|
5
|
-
const Transport = require('winston-transport')
|
|
6
|
-
const debug = require('debug')('jsreport')
|
|
7
|
-
const createDefaultLoggerFormat = require('./createDefaultLoggerFormat')
|
|
8
|
-
const normalizeMetaFromLogs = require('../shared/normalizeMetaFromLogs')
|
|
9
|
-
|
|
10
|
-
const defaultLoggerFormat = createDefaultLoggerFormat()
|
|
11
|
-
const defaultLoggerFormatWithTimestamp = createDefaultLoggerFormat({ timestamp: true })
|
|
12
|
-
|
|
13
|
-
function createLogger () {
|
|
14
|
-
const logger = winston.createLogger(getConfigurationOptions())
|
|
15
|
-
|
|
16
|
-
logger.on('error', (err) => {
|
|
17
|
-
let dir
|
|
18
|
-
let msg
|
|
19
|
-
|
|
20
|
-
if (err.code === 'ENOENT') {
|
|
21
|
-
dir = path.dirname(err.path)
|
|
22
|
-
|
|
23
|
-
if (dir === '.') {
|
|
24
|
-
msg = 'Error from logger (winston) while trying to use a file to store logs:'
|
|
25
|
-
} else {
|
|
26
|
-
msg = 'Error from logger (winston) while trying to use a file to store logs. If the directory "' + dir + '" does not exist, please create it:'
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// make the error intentionally more visible to get the attention of the user
|
|
30
|
-
console.error('------------------------')
|
|
31
|
-
console.error(msg, err)
|
|
32
|
-
console.error('------------------------')
|
|
33
|
-
}
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
return logger
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function configureLogger (logger, _transports) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
if (
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
this
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
1
|
+
const path = require('path')
|
|
2
|
+
const omit = require('lodash.omit')
|
|
3
|
+
const { MESSAGE } = require('triple-beam')
|
|
4
|
+
const winston = require('winston')
|
|
5
|
+
const Transport = require('winston-transport')
|
|
6
|
+
const debug = require('debug')('jsreport')
|
|
7
|
+
const createDefaultLoggerFormat = require('./createDefaultLoggerFormat')
|
|
8
|
+
const normalizeMetaFromLogs = require('../shared/normalizeMetaFromLogs')
|
|
9
|
+
|
|
10
|
+
const defaultLoggerFormat = createDefaultLoggerFormat()
|
|
11
|
+
const defaultLoggerFormatWithTimestamp = createDefaultLoggerFormat({ timestamp: true })
|
|
12
|
+
|
|
13
|
+
function createLogger () {
|
|
14
|
+
const logger = winston.createLogger(getConfigurationOptions())
|
|
15
|
+
|
|
16
|
+
logger.on('error', (err) => {
|
|
17
|
+
let dir
|
|
18
|
+
let msg
|
|
19
|
+
|
|
20
|
+
if (err.code === 'ENOENT') {
|
|
21
|
+
dir = path.dirname(err.path)
|
|
22
|
+
|
|
23
|
+
if (dir === '.') {
|
|
24
|
+
msg = 'Error from logger (winston) while trying to use a file to store logs:'
|
|
25
|
+
} else {
|
|
26
|
+
msg = 'Error from logger (winston) while trying to use a file to store logs. If the directory "' + dir + '" does not exist, please create it:'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// make the error intentionally more visible to get the attention of the user
|
|
30
|
+
console.error('------------------------')
|
|
31
|
+
console.error(msg, err)
|
|
32
|
+
console.error('------------------------')
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
return logger
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function configureLogger (logger, _transports) {
|
|
40
|
+
const transports = _transports || {}
|
|
41
|
+
const transportFormatMap = new WeakMap()
|
|
42
|
+
|
|
43
|
+
// we ensure we do .format cleanup on options first before checking if the logger
|
|
44
|
+
// is configured or not, this ensure that options are properly cleaned up when
|
|
45
|
+
// configureLogger is called more than once (like when execution cli commands from extensions)
|
|
46
|
+
for (const [, transpOptions] of Object.entries(transports)) {
|
|
47
|
+
if (transpOptions.format != null) {
|
|
48
|
+
transportFormatMap.set(transpOptions, transpOptions.format)
|
|
49
|
+
delete transpOptions.format
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const configuredPreviously = logger.__configured__ === true
|
|
54
|
+
|
|
55
|
+
if (configuredPreviously) {
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const knownTransports = {
|
|
60
|
+
debug: DebugTransport,
|
|
61
|
+
console: winston.transports.Console,
|
|
62
|
+
file: winston.transports.File,
|
|
63
|
+
http: winston.transports.Http
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const knownOptions = ['transport', 'module', 'enabled']
|
|
67
|
+
const transportsToAdd = []
|
|
68
|
+
|
|
69
|
+
for (const [transpName, transpOptions] of Object.entries(transports)) {
|
|
70
|
+
let transportModule
|
|
71
|
+
|
|
72
|
+
if (!transpOptions || typeof transpOptions !== 'object' || Array.isArray(transpOptions)) {
|
|
73
|
+
continue
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (typeof transpOptions.transport !== 'string' || transpOptions.transport === '') {
|
|
77
|
+
throw new Error(`Invalid option for transport object "${
|
|
78
|
+
transpName
|
|
79
|
+
}", option "transport" is not specified or has an incorrect value, must be a string with a valid value. check your "logger" config`)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (typeof transpOptions.level !== 'string' || transpOptions.level === '') {
|
|
83
|
+
throw new Error(`Invalid option for transport object "${
|
|
84
|
+
transpName
|
|
85
|
+
}", option "level" is not specified or has an incorrect value, must be a string with a valid value. check your "logger" config`)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (transpName !== 'debug' && transpOptions.enabled === false) {
|
|
89
|
+
continue
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let originalFormat
|
|
93
|
+
|
|
94
|
+
if (transportFormatMap.has(transpOptions)) {
|
|
95
|
+
originalFormat = transportFormatMap.get(transpOptions)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (
|
|
99
|
+
originalFormat != null &&
|
|
100
|
+
typeof originalFormat.constructor !== 'function'
|
|
101
|
+
) {
|
|
102
|
+
throw new Error(`Invalid option for transport object "${
|
|
103
|
+
transpName
|
|
104
|
+
}", option "format" has an incorrect value, must be an instance of loggerFormat. check your "logger" config`)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const options = Object.assign(omit(transpOptions, knownOptions), {
|
|
108
|
+
name: transpName
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
if (originalFormat != null) {
|
|
112
|
+
options.format = originalFormat
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (knownTransports[transpOptions.transport]) {
|
|
116
|
+
if (transpName === 'debug') {
|
|
117
|
+
options.enabled = transpOptions.enabled !== false
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
transportsToAdd.push({
|
|
121
|
+
TransportClass: knownTransports[transpOptions.transport],
|
|
122
|
+
options
|
|
123
|
+
})
|
|
124
|
+
} else {
|
|
125
|
+
if (transpOptions.module == null) {
|
|
126
|
+
throw new Error(`Invalid option for transport object "${
|
|
127
|
+
transpName
|
|
128
|
+
}", option "transport" has an unknown transport type: "${transpOptions.transport}". check your "logger" config`)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (typeof transpOptions.module !== 'string') {
|
|
132
|
+
throw new Error(`Invalid option for transport object "${
|
|
133
|
+
transpName
|
|
134
|
+
}", option "module" has an incorrect value, must be a string with a module name. check your "logger" config`)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
transportModule = require(transpOptions.module)
|
|
139
|
+
|
|
140
|
+
if (typeof winston.transports[transpOptions.transport] === 'function') {
|
|
141
|
+
transportModule = winston.transports[transpOptions.transport]
|
|
142
|
+
} else if (transportModule && typeof transportModule[transpOptions.transport] === 'function') {
|
|
143
|
+
transportModule = transportModule[transpOptions.transport]
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (typeof transportModule !== 'function') {
|
|
147
|
+
throw new Error(`Invalid option for transport object "${
|
|
148
|
+
transpName
|
|
149
|
+
}", module "${transpOptions.module}" does not export a valid transport. check your "logger" config`)
|
|
150
|
+
}
|
|
151
|
+
} catch (e) {
|
|
152
|
+
if (e.code === 'MODULE_NOT_FOUND') {
|
|
153
|
+
throw new Error(`Invalid option for transport object "${
|
|
154
|
+
transpName
|
|
155
|
+
}", module "${transpOptions.module}" in "module" option could not be found. are you sure that you have installed it?. check your "logger" config'`)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
throw e
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
transportsToAdd.push({
|
|
162
|
+
TransportClass: transportModule,
|
|
163
|
+
options
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
for (const { TransportClass, options } of transportsToAdd) {
|
|
169
|
+
const transportInstance = new TransportClass(options)
|
|
170
|
+
|
|
171
|
+
const existingTransport = logger.transports.find((t) => t.name === transportInstance.name)
|
|
172
|
+
|
|
173
|
+
if (existingTransport) {
|
|
174
|
+
logger.remove(existingTransport)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
logger.add(transportInstance)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
logger.__configured__ = true
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function getConfigurationOptions () {
|
|
184
|
+
const normalizeMeta = winston.format((info) => {
|
|
185
|
+
const { level, message, ...meta } = info
|
|
186
|
+
const newMeta = normalizeMetaFromLogs(level, message, meta)
|
|
187
|
+
|
|
188
|
+
if (newMeta != null) {
|
|
189
|
+
return {
|
|
190
|
+
level,
|
|
191
|
+
message,
|
|
192
|
+
...newMeta
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return info
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
levels: {
|
|
201
|
+
error: 0,
|
|
202
|
+
warn: 1,
|
|
203
|
+
info: 2,
|
|
204
|
+
debug: 3
|
|
205
|
+
},
|
|
206
|
+
format: winston.format.combine(
|
|
207
|
+
normalizeMeta(),
|
|
208
|
+
defaultLoggerFormatWithTimestamp()
|
|
209
|
+
),
|
|
210
|
+
transports: [new DebugTransport()]
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function silentLogs (logger) {
|
|
215
|
+
if (logger.transports.length > 0) {
|
|
216
|
+
// this is the recommended way to modify transports in runtime, as per winston's docs
|
|
217
|
+
for (const transport of logger.transports) {
|
|
218
|
+
transport.silent = true
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
class DebugTransport extends Transport {
|
|
224
|
+
constructor (options = {}) {
|
|
225
|
+
super(options)
|
|
226
|
+
this.name = 'debug'
|
|
227
|
+
this.level = options.level || 'debug'
|
|
228
|
+
|
|
229
|
+
this.format = options.format || winston.format.combine(
|
|
230
|
+
winston.format.colorize(),
|
|
231
|
+
defaultLoggerFormat()
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
this.enabled = options.enabled !== false
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
log (info, callback) {
|
|
238
|
+
if (this.enabled) {
|
|
239
|
+
setImmediate(() => {
|
|
240
|
+
this.emit('logged', info)
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
debug(info[MESSAGE])
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (callback) {
|
|
247
|
+
callback()
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
module.exports.createLogger = createLogger
|
|
253
|
+
module.exports.configureLogger = configureLogger
|
|
254
|
+
module.exports.silentLogs = silentLogs
|