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