@jsreport/jsreport-core 3.0.1 → 3.1.2-test.2

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 (79) 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/reporter.js +579 -578
  29. package/lib/main/schemaValidator.js +252 -252
  30. package/lib/main/settings.js +154 -154
  31. package/lib/main/store/checkDuplicatedId.js +27 -27
  32. package/lib/main/store/collection.js +329 -329
  33. package/lib/main/store/documentStore.js +469 -469
  34. package/lib/main/store/mainActions.js +28 -28
  35. package/lib/main/store/memoryStoreProvider.js +99 -99
  36. package/lib/main/store/queue.js +48 -48
  37. package/lib/main/store/referenceUtils.js +251 -251
  38. package/lib/main/store/setupValidateId.js +43 -43
  39. package/lib/main/store/setupValidateShortid.js +71 -71
  40. package/lib/main/store/transaction.js +69 -69
  41. package/lib/main/store/typeUtils.js +180 -180
  42. package/lib/main/templates.js +34 -34
  43. package/lib/main/validateEntityName.js +62 -62
  44. package/lib/shared/createError.js +36 -36
  45. package/lib/shared/encryption.js +114 -114
  46. package/lib/shared/folders/index.js +11 -11
  47. package/lib/shared/folders/normalizeEntityPath.js +15 -15
  48. package/lib/shared/folders/resolveEntityFromPath.js +88 -88
  49. package/lib/shared/folders/resolveEntityPath.js +46 -46
  50. package/lib/shared/folders/resolveFolderFromPath.js +38 -38
  51. package/lib/shared/generateRequestId.js +4 -4
  52. package/lib/shared/listenerCollection.js +169 -0
  53. package/lib/shared/normalizeMetaFromLogs.js +30 -30
  54. package/lib/shared/reporter.js +123 -123
  55. package/lib/shared/request.js +64 -64
  56. package/lib/shared/tempFilesHandler.js +81 -81
  57. package/lib/shared/templates.js +82 -82
  58. package/lib/static/helpers.js +33 -33
  59. package/lib/worker/blobStorage.js +34 -34
  60. package/lib/worker/defaultProxyExtend.js +46 -46
  61. package/lib/worker/documentStore.js +49 -49
  62. package/lib/worker/extensionsManager.js +17 -17
  63. package/lib/worker/logger.js +48 -48
  64. package/lib/worker/render/diff.js +138 -138
  65. package/lib/worker/render/executeEngine.js +207 -200
  66. package/lib/worker/render/htmlRecipe.js +10 -10
  67. package/lib/worker/render/moduleHelper.js +43 -43
  68. package/lib/worker/render/noneEngine.js +12 -12
  69. package/lib/worker/render/profiler.js +158 -158
  70. package/lib/worker/render/render.js +205 -209
  71. package/lib/worker/render/resolveReferences.js +60 -60
  72. package/lib/worker/reporter.js +191 -187
  73. package/lib/worker/sandbox/runInSandbox.js +13 -4
  74. package/lib/worker/sandbox/safeSandbox.js +828 -822
  75. package/lib/worker/templates.js +78 -78
  76. package/lib/worker/workerHandler.js +54 -54
  77. package/package.json +92 -92
  78. package/test/blobStorage/common.js +21 -21
  79. package/test/store/common.js +1449 -1449
@@ -1,252 +1,252 @@
1
- const extend = require('node.extend.without.arrays')
2
- const set = require('lodash.set')
3
- const hasOwn = require('has-own-deep')
4
- const unsetValue = require('unset-value')
5
- const ms = require('ms')
6
- const Ajv = require('ajv')
7
-
8
- const validatorCollection = new WeakMap()
9
-
10
- class SchemaValidator {
11
- constructor (_options = {}) {
12
- const options = Object.assign({
13
- rootSchema: null
14
- }, _options)
15
-
16
- this.schemaVersion = 'http://json-schema.org/draft-07/schema#'
17
-
18
- const validator = new Ajv({
19
- useDefaults: true,
20
- coerceTypes: true,
21
- format: 'full'
22
- })
23
-
24
- const stringDateFormatValidate = validator.compile({ type: 'string', format: 'date-time' })
25
-
26
- validator.addKeyword('$jsreport-constantOrArray', {
27
- type: 'string',
28
- modifying: true,
29
- compile: (sch) => {
30
- if (!Array.isArray(sch)) {
31
- throw new Error('$jsreport-constantOrArray json schema keyword should contain an array')
32
- }
33
-
34
- return (data, dataPath, parentData, parentDataProperty) => {
35
- if (sch.indexOf(data) !== -1) {
36
- parentData[parentDataProperty] = data
37
- return true
38
- }
39
-
40
- parentData[parentDataProperty] = data.split(',')
41
- return true
42
- }
43
- }
44
- })
45
-
46
- validator.addKeyword('$jsreport-stringToDate', {
47
- modifying: true,
48
- compile: (sch) => {
49
- if (sch !== true) {
50
- return () => true
51
- }
52
-
53
- return (data, dataPath, parentData, parentDataProperty) => {
54
- if (!stringDateFormatValidate(data)) {
55
- return false
56
- }
57
-
58
- const newData = new Date(data)
59
-
60
- // tests that date instance is not invalid
61
- if (Object.prototype.toString.call(newData) !== '[object Date]') {
62
- return false
63
- }
64
-
65
- parentData[parentDataProperty] = newData
66
-
67
- return true
68
- }
69
- }
70
- })
71
-
72
- validator.addKeyword('$jsreport-acceptsDate', {
73
- compile: (sch) => {
74
- if (sch !== true) {
75
- return () => true
76
- }
77
-
78
- return (data) => {
79
- return Boolean(
80
- data &&
81
- Object.prototype.toString.call(data) === '[object Date]' &&
82
- !isNaN(data)
83
- )
84
- }
85
- }
86
- })
87
-
88
- validator.addKeyword('$jsreport-acceptsBuffer', {
89
- compile: (sch) => {
90
- if (sch !== true) {
91
- return () => true
92
- }
93
-
94
- return (data) => {
95
- return Buffer.isBuffer(data)
96
- }
97
- }
98
- })
99
-
100
- validator.addKeyword('$jsreport-acceptsDuration', {
101
- modifying: true,
102
- compile: (sch) => {
103
- if (sch !== true) {
104
- return () => true
105
- }
106
-
107
- return (data, dataPath, parentData, parentDataProperty) => {
108
- if (typeof data !== 'string' && typeof data !== 'number') {
109
- return false
110
- }
111
-
112
- if (typeof data === 'number') {
113
- return true
114
- }
115
-
116
- const newData = ms(data)
117
-
118
- if (newData == null) {
119
- return false
120
- }
121
-
122
- parentData[parentDataProperty] = newData
123
-
124
- return true
125
- }
126
- }
127
- })
128
-
129
- let rootValidate
130
-
131
- if (options.rootSchema != null) {
132
- rootValidate = validator.compile(addDefaultsAndValidateRootSchema(
133
- validator,
134
- options.rootSchema,
135
- this.schemaVersion
136
- ))
137
-
138
- this.setRootSchema = (schema) => {
139
- rootValidate = validator.compile(addDefaultsAndValidateRootSchema(
140
- validator,
141
- schema,
142
- this.schemaVersion
143
- ))
144
- }
145
-
146
- this.getRootSchema = () => rootValidate && rootValidate.schema
147
-
148
- this.validateRoot = (data, { rootPrefix = '', ignore = [] } = {}) => {
149
- let validateFn
150
-
151
- if (ignore.length > 0) {
152
- const newRootSchema = extend(true, {}, this.getRootSchema())
153
-
154
- ignore.forEach((prop) => {
155
- if (hasOwn(newRootSchema, prop)) {
156
- set(newRootSchema, prop, true)
157
- unsetValue(newRootSchema, prop)
158
- }
159
- })
160
-
161
- validateFn = validator.compile(newRootSchema)
162
- } else {
163
- validateFn = rootValidate
164
- }
165
-
166
- return runSchemaValidation(validator, validateFn, data, rootPrefix)
167
- }
168
- }
169
-
170
- validatorCollection.set(this, validator)
171
- }
172
-
173
- addSchema (name, _schema, replace = false) {
174
- const validator = validatorCollection.get(this)
175
- let schema = _schema
176
-
177
- if (typeof schema === 'object' && !Array.isArray(schema) && schema.$schema == null) {
178
- schema = Object.assign({}, schema, { $schema: this.schemaVersion })
179
- }
180
-
181
- if (replace === true && validator.getSchema(name) != null) {
182
- validator.removeSchema(name)
183
- }
184
-
185
- validator.addSchema(schema, name)
186
- }
187
-
188
- // after validate, data will be coerced (modified) with value types
189
- // that match the schema
190
- validate (name, data, { rootPrefix = '' } = {}) {
191
- const validator = validatorCollection.get(this)
192
- const schemaValidate = validator.getSchema(name)
193
-
194
- if (schemaValidate == null) {
195
- throw new Error(`schema ${name} is not registered in validator`)
196
- }
197
-
198
- return runSchemaValidation(validator, schemaValidate, data, rootPrefix)
199
- }
200
-
201
- getSchema (name) {
202
- const validator = validatorCollection.get(this)
203
- const schemaValidate = validator.getSchema(name)
204
- return schemaValidate ? schemaValidate.schema : undefined
205
- }
206
- }
207
-
208
- function addDefaultsAndValidateRootSchema (validator, _rootSchema, schemaVersion) {
209
- let rootSchema = _rootSchema
210
-
211
- if (
212
- typeof schema === 'object' &&
213
- !Array.isArray(rootSchema) &&
214
- rootSchema.$schema == null
215
- ) {
216
- rootSchema = Object.assign({}, rootSchema, { $schema: schemaVersion })
217
- }
218
-
219
- const schemaValid = validator.validateSchema(rootSchema)
220
-
221
- if (!schemaValid) {
222
- throw new Error(`root schema is not valid. errors: ${
223
- validator.errorsText(validator.errors, { dataVar: 'rootSchema' })
224
- }`)
225
- }
226
-
227
- return rootSchema
228
- }
229
-
230
- function runSchemaValidation (validator, schemaValidate, data, rootPrefix) {
231
- const valid = schemaValidate(data)
232
- const result = { valid }
233
-
234
- if (!valid) {
235
- result.errors = schemaValidate.errors.map((err) => {
236
- if (err.keyword === 'enum' && err.params && Array.isArray(err.params.allowedValues)) {
237
- // ajv errorsText does not put allowed values in message, we need to add it manually
238
- err.message += `. allowed values: [${err.params.allowedValues.map(v => JSON.stringify(v)).join(', ')}]`
239
- }
240
-
241
- return err
242
- })
243
-
244
- result.fullErrorMessage = `schema validation errors: ${
245
- validator.errorsText(result.errors, { dataVar: rootPrefix })
246
- }`
247
- }
248
-
249
- return result
250
- }
251
-
252
- module.exports = SchemaValidator
1
+ const extend = require('node.extend.without.arrays')
2
+ const set = require('lodash.set')
3
+ const hasOwn = require('has-own-deep')
4
+ const unsetValue = require('unset-value')
5
+ const ms = require('ms')
6
+ const Ajv = require('ajv')
7
+
8
+ const validatorCollection = new WeakMap()
9
+
10
+ class SchemaValidator {
11
+ constructor (_options = {}) {
12
+ const options = Object.assign({
13
+ rootSchema: null
14
+ }, _options)
15
+
16
+ this.schemaVersion = 'http://json-schema.org/draft-07/schema#'
17
+
18
+ const validator = new Ajv({
19
+ useDefaults: true,
20
+ coerceTypes: true,
21
+ format: 'full'
22
+ })
23
+
24
+ const stringDateFormatValidate = validator.compile({ type: 'string', format: 'date-time' })
25
+
26
+ validator.addKeyword('$jsreport-constantOrArray', {
27
+ type: 'string',
28
+ modifying: true,
29
+ compile: (sch) => {
30
+ if (!Array.isArray(sch)) {
31
+ throw new Error('$jsreport-constantOrArray json schema keyword should contain an array')
32
+ }
33
+
34
+ return (data, dataPath, parentData, parentDataProperty) => {
35
+ if (sch.indexOf(data) !== -1) {
36
+ parentData[parentDataProperty] = data
37
+ return true
38
+ }
39
+
40
+ parentData[parentDataProperty] = data.split(',')
41
+ return true
42
+ }
43
+ }
44
+ })
45
+
46
+ validator.addKeyword('$jsreport-stringToDate', {
47
+ modifying: true,
48
+ compile: (sch) => {
49
+ if (sch !== true) {
50
+ return () => true
51
+ }
52
+
53
+ return (data, dataPath, parentData, parentDataProperty) => {
54
+ if (!stringDateFormatValidate(data)) {
55
+ return false
56
+ }
57
+
58
+ const newData = new Date(data)
59
+
60
+ // tests that date instance is not invalid
61
+ if (Object.prototype.toString.call(newData) !== '[object Date]') {
62
+ return false
63
+ }
64
+
65
+ parentData[parentDataProperty] = newData
66
+
67
+ return true
68
+ }
69
+ }
70
+ })
71
+
72
+ validator.addKeyword('$jsreport-acceptsDate', {
73
+ compile: (sch) => {
74
+ if (sch !== true) {
75
+ return () => true
76
+ }
77
+
78
+ return (data) => {
79
+ return Boolean(
80
+ data &&
81
+ Object.prototype.toString.call(data) === '[object Date]' &&
82
+ !isNaN(data)
83
+ )
84
+ }
85
+ }
86
+ })
87
+
88
+ validator.addKeyword('$jsreport-acceptsBuffer', {
89
+ compile: (sch) => {
90
+ if (sch !== true) {
91
+ return () => true
92
+ }
93
+
94
+ return (data) => {
95
+ return Buffer.isBuffer(data)
96
+ }
97
+ }
98
+ })
99
+
100
+ validator.addKeyword('$jsreport-acceptsDuration', {
101
+ modifying: true,
102
+ compile: (sch) => {
103
+ if (sch !== true) {
104
+ return () => true
105
+ }
106
+
107
+ return (data, dataPath, parentData, parentDataProperty) => {
108
+ if (typeof data !== 'string' && typeof data !== 'number') {
109
+ return false
110
+ }
111
+
112
+ if (typeof data === 'number') {
113
+ return true
114
+ }
115
+
116
+ const newData = ms(data)
117
+
118
+ if (newData == null) {
119
+ return false
120
+ }
121
+
122
+ parentData[parentDataProperty] = newData
123
+
124
+ return true
125
+ }
126
+ }
127
+ })
128
+
129
+ let rootValidate
130
+
131
+ if (options.rootSchema != null) {
132
+ rootValidate = validator.compile(addDefaultsAndValidateRootSchema(
133
+ validator,
134
+ options.rootSchema,
135
+ this.schemaVersion
136
+ ))
137
+
138
+ this.setRootSchema = (schema) => {
139
+ rootValidate = validator.compile(addDefaultsAndValidateRootSchema(
140
+ validator,
141
+ schema,
142
+ this.schemaVersion
143
+ ))
144
+ }
145
+
146
+ this.getRootSchema = () => rootValidate && rootValidate.schema
147
+
148
+ this.validateRoot = (data, { rootPrefix = '', ignore = [] } = {}) => {
149
+ let validateFn
150
+
151
+ if (ignore.length > 0) {
152
+ const newRootSchema = extend(true, {}, this.getRootSchema())
153
+
154
+ ignore.forEach((prop) => {
155
+ if (hasOwn(newRootSchema, prop)) {
156
+ set(newRootSchema, prop, true)
157
+ unsetValue(newRootSchema, prop)
158
+ }
159
+ })
160
+
161
+ validateFn = validator.compile(newRootSchema)
162
+ } else {
163
+ validateFn = rootValidate
164
+ }
165
+
166
+ return runSchemaValidation(validator, validateFn, data, rootPrefix)
167
+ }
168
+ }
169
+
170
+ validatorCollection.set(this, validator)
171
+ }
172
+
173
+ addSchema (name, _schema, replace = false) {
174
+ const validator = validatorCollection.get(this)
175
+ let schema = _schema
176
+
177
+ if (typeof schema === 'object' && !Array.isArray(schema) && schema.$schema == null) {
178
+ schema = Object.assign({}, schema, { $schema: this.schemaVersion })
179
+ }
180
+
181
+ if (replace === true && validator.getSchema(name) != null) {
182
+ validator.removeSchema(name)
183
+ }
184
+
185
+ validator.addSchema(schema, name)
186
+ }
187
+
188
+ // after validate, data will be coerced (modified) with value types
189
+ // that match the schema
190
+ validate (name, data, { rootPrefix = '' } = {}) {
191
+ const validator = validatorCollection.get(this)
192
+ const schemaValidate = validator.getSchema(name)
193
+
194
+ if (schemaValidate == null) {
195
+ throw new Error(`schema ${name} is not registered in validator`)
196
+ }
197
+
198
+ return runSchemaValidation(validator, schemaValidate, data, rootPrefix)
199
+ }
200
+
201
+ getSchema (name) {
202
+ const validator = validatorCollection.get(this)
203
+ const schemaValidate = validator.getSchema(name)
204
+ return schemaValidate ? schemaValidate.schema : undefined
205
+ }
206
+ }
207
+
208
+ function addDefaultsAndValidateRootSchema (validator, _rootSchema, schemaVersion) {
209
+ let rootSchema = _rootSchema
210
+
211
+ if (
212
+ typeof schema === 'object' &&
213
+ !Array.isArray(rootSchema) &&
214
+ rootSchema.$schema == null
215
+ ) {
216
+ rootSchema = Object.assign({}, rootSchema, { $schema: schemaVersion })
217
+ }
218
+
219
+ const schemaValid = validator.validateSchema(rootSchema)
220
+
221
+ if (!schemaValid) {
222
+ throw new Error(`root schema is not valid. errors: ${
223
+ validator.errorsText(validator.errors, { dataVar: 'rootSchema' })
224
+ }`)
225
+ }
226
+
227
+ return rootSchema
228
+ }
229
+
230
+ function runSchemaValidation (validator, schemaValidate, data, rootPrefix) {
231
+ const valid = schemaValidate(data)
232
+ const result = { valid }
233
+
234
+ if (!valid) {
235
+ result.errors = schemaValidate.errors.map((err) => {
236
+ if (err.keyword === 'enum' && err.params && Array.isArray(err.params.allowedValues)) {
237
+ // ajv errorsText does not put allowed values in message, we need to add it manually
238
+ err.message += `. allowed values: [${err.params.allowedValues.map(v => JSON.stringify(v)).join(', ')}]`
239
+ }
240
+
241
+ return err
242
+ })
243
+
244
+ result.fullErrorMessage = `schema validation errors: ${
245
+ validator.errorsText(result.errors, { dataVar: rootPrefix })
246
+ }`
247
+ }
248
+
249
+ return result
250
+ }
251
+
252
+ module.exports = SchemaValidator