@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,244 +1,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 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 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