@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,128 +1,128 @@
1
- const Request = require('../../shared/request')
2
-
3
- module.exports = async (reporter) => {
4
- if (
5
- reporter.options.migrateXlsxTemplatesToAssets === false ||
6
- reporter.documentStore.collection('xlsxTemplates') == null ||
7
- reporter.documentStore.collection('assets') == null
8
- ) {
9
- return
10
- }
11
-
12
- const migrated = await reporter.settings.findValue('core-migrated-xlsxTemplates')
13
-
14
- if (migrated) {
15
- return
16
- }
17
-
18
- const req = Request({})
19
- await reporter.documentStore.beginTransaction(req)
20
-
21
- try {
22
- const xlsxTemplateIds = await reporter.documentStore.collection('xlsxTemplates').find({}, { _id: 1 }, req)
23
-
24
- if (xlsxTemplateIds.length !== 0) {
25
- reporter.logger.debug('Running migration "xlsxTemplatesToAssets"')
26
- }
27
-
28
- const xlsxTemplateToAssetMap = new Map()
29
-
30
- for (const xlsxTemplateId of xlsxTemplateIds) {
31
- const xlsxTemplate = await reporter.documentStore.collection('xlsxTemplates').findOne({ _id: xlsxTemplateId._id }, req)
32
-
33
- if (!xlsxTemplateToAssetMap.has(xlsxTemplate.shortid)) {
34
- let newAsset
35
- let tryCount = 0
36
-
37
- while (newAsset == null) {
38
- try {
39
- const assetName = `${'_'.repeat(tryCount) + xlsxTemplate.name}.xlsx`
40
-
41
- const assetProps = {
42
- name: assetName,
43
- content: xlsxTemplate.contentRaw,
44
- folder: xlsxTemplate.folder || null
45
- }
46
-
47
- if (xlsxTemplate.readPermissions != null) {
48
- assetProps.readPermissions = xlsxTemplate.readPermissions
49
- }
50
-
51
- if (xlsxTemplate.editPermissions != null) {
52
- assetProps.editPermissions = xlsxTemplate.editPermissions
53
- }
54
-
55
- newAsset = await reporter.documentStore.collection('assets').insert(assetProps, req)
56
- } catch (insertError) {
57
- tryCount++
58
-
59
- if (insertError.code === 'DUPLICATED_ENTITY') {
60
- continue
61
- } else {
62
- throw insertError
63
- }
64
- }
65
- }
66
-
67
- xlsxTemplateToAssetMap.set(xlsxTemplate.shortid, newAsset)
68
- }
69
- }
70
-
71
- const templateIds = await reporter.documentStore.collection('templates').find({}, { _id: 1 }, req)
72
-
73
- for (const templateId of templateIds) {
74
- const template = await reporter.documentStore.collection('templates').findOne({ _id: templateId._id }, req)
75
- let continueUpdate = false
76
-
77
- // handle jsreport-xlsx migration
78
- if (template.xlsxTemplate != null) {
79
- continueUpdate = true
80
-
81
- const xlsxTemplateRef = template.xlsxTemplate
82
-
83
- template.xlsxTemplate = null
84
-
85
- if (xlsxTemplateRef.shortid != null && xlsxTemplateToAssetMap.has(xlsxTemplateRef.shortid)) {
86
- template.xlsx = template.xlsx || {}
87
- template.xlsx.templateAssetShortid = xlsxTemplateToAssetMap.get(xlsxTemplateRef.shortid).shortid
88
- }
89
- }
90
-
91
- // handle jsreport-html-to-xlsx migration
92
- if (template.baseXlsxTemplate != null) {
93
- continueUpdate = true
94
-
95
- const baseXlsxTemplateRef = template.baseXlsxTemplate
96
-
97
- template.baseXlsxTemplate = null
98
-
99
- if (baseXlsxTemplateRef.shortid != null && xlsxTemplateToAssetMap.has(baseXlsxTemplateRef.shortid)) {
100
- template.htmlToXlsx = template.htmlToXlsx || {}
101
- template.htmlToXlsx.templateAssetShortid = xlsxTemplateToAssetMap.get(baseXlsxTemplateRef.shortid).shortid
102
- }
103
- }
104
-
105
- if (continueUpdate) {
106
- await reporter.documentStore.collection('templates').update({ _id: template._id }, { $set: template }, req)
107
- }
108
- }
109
-
110
- for (const xlsxTemplateId of xlsxTemplateIds) {
111
- await reporter.documentStore.collection('xlsxTemplates').remove({ _id: xlsxTemplateId._id }, req)
112
- }
113
-
114
- if (xlsxTemplateIds.length !== 0) {
115
- reporter.logger.debug('Migration "xlsxTemplatesToAssets" finished')
116
- }
117
-
118
- await reporter.documentStore.commitTransaction(req)
119
-
120
- await reporter.settings.addOrSet('core-migrated-xlsxTemplates', true)
121
- } catch (migrationErr) {
122
- await reporter.documentStore.rollbackTransaction(req)
123
-
124
- migrationErr.message = `Migration "xlsxTemplatesToAssets" failed: ${migrationErr.message}`
125
-
126
- throw migrationErr
127
- }
128
- }
1
+ const Request = require('../../shared/request')
2
+
3
+ module.exports = async (reporter) => {
4
+ if (
5
+ reporter.options.migrateXlsxTemplatesToAssets === false ||
6
+ reporter.documentStore.collection('xlsxTemplates') == null ||
7
+ reporter.documentStore.collection('assets') == null
8
+ ) {
9
+ return
10
+ }
11
+
12
+ const migrated = await reporter.settings.findValue('core-migrated-xlsxTemplates')
13
+
14
+ if (migrated) {
15
+ return
16
+ }
17
+
18
+ const req = Request({})
19
+ await reporter.documentStore.beginTransaction(req)
20
+
21
+ try {
22
+ const xlsxTemplateIds = await reporter.documentStore.collection('xlsxTemplates').find({}, { _id: 1 }, req)
23
+
24
+ if (xlsxTemplateIds.length !== 0) {
25
+ reporter.logger.debug('Running migration "xlsxTemplatesToAssets"')
26
+ }
27
+
28
+ const xlsxTemplateToAssetMap = new Map()
29
+
30
+ for (const xlsxTemplateId of xlsxTemplateIds) {
31
+ const xlsxTemplate = await reporter.documentStore.collection('xlsxTemplates').findOne({ _id: xlsxTemplateId._id }, req)
32
+
33
+ if (!xlsxTemplateToAssetMap.has(xlsxTemplate.shortid)) {
34
+ let newAsset
35
+ let tryCount = 0
36
+
37
+ while (newAsset == null) {
38
+ try {
39
+ const assetName = `${'_'.repeat(tryCount) + xlsxTemplate.name}.xlsx`
40
+
41
+ const assetProps = {
42
+ name: assetName,
43
+ content: xlsxTemplate.contentRaw,
44
+ folder: xlsxTemplate.folder || null
45
+ }
46
+
47
+ if (xlsxTemplate.readPermissions != null) {
48
+ assetProps.readPermissions = xlsxTemplate.readPermissions
49
+ }
50
+
51
+ if (xlsxTemplate.editPermissions != null) {
52
+ assetProps.editPermissions = xlsxTemplate.editPermissions
53
+ }
54
+
55
+ newAsset = await reporter.documentStore.collection('assets').insert(assetProps, req)
56
+ } catch (insertError) {
57
+ tryCount++
58
+
59
+ if (insertError.code === 'DUPLICATED_ENTITY') {
60
+ continue
61
+ } else {
62
+ throw insertError
63
+ }
64
+ }
65
+ }
66
+
67
+ xlsxTemplateToAssetMap.set(xlsxTemplate.shortid, newAsset)
68
+ }
69
+ }
70
+
71
+ const templateIds = await reporter.documentStore.collection('templates').find({}, { _id: 1 }, req)
72
+
73
+ for (const templateId of templateIds) {
74
+ const template = await reporter.documentStore.collection('templates').findOne({ _id: templateId._id }, req)
75
+ let continueUpdate = false
76
+
77
+ // handle jsreport-xlsx migration
78
+ if (template.xlsxTemplate != null) {
79
+ continueUpdate = true
80
+
81
+ const xlsxTemplateRef = template.xlsxTemplate
82
+
83
+ template.xlsxTemplate = null
84
+
85
+ if (xlsxTemplateRef.shortid != null && xlsxTemplateToAssetMap.has(xlsxTemplateRef.shortid)) {
86
+ template.xlsx = template.xlsx || {}
87
+ template.xlsx.templateAssetShortid = xlsxTemplateToAssetMap.get(xlsxTemplateRef.shortid).shortid
88
+ }
89
+ }
90
+
91
+ // handle jsreport-html-to-xlsx migration
92
+ if (template.baseXlsxTemplate != null) {
93
+ continueUpdate = true
94
+
95
+ const baseXlsxTemplateRef = template.baseXlsxTemplate
96
+
97
+ template.baseXlsxTemplate = null
98
+
99
+ if (baseXlsxTemplateRef.shortid != null && xlsxTemplateToAssetMap.has(baseXlsxTemplateRef.shortid)) {
100
+ template.htmlToXlsx = template.htmlToXlsx || {}
101
+ template.htmlToXlsx.templateAssetShortid = xlsxTemplateToAssetMap.get(baseXlsxTemplateRef.shortid).shortid
102
+ }
103
+ }
104
+
105
+ if (continueUpdate) {
106
+ await reporter.documentStore.collection('templates').update({ _id: template._id }, { $set: template }, req)
107
+ }
108
+ }
109
+
110
+ for (const xlsxTemplateId of xlsxTemplateIds) {
111
+ await reporter.documentStore.collection('xlsxTemplates').remove({ _id: xlsxTemplateId._id }, req)
112
+ }
113
+
114
+ if (xlsxTemplateIds.length !== 0) {
115
+ reporter.logger.debug('Migration "xlsxTemplatesToAssets" finished')
116
+ }
117
+
118
+ await reporter.documentStore.commitTransaction(req)
119
+
120
+ await reporter.settings.addOrSet('core-migrated-xlsxTemplates', true)
121
+ } catch (migrationErr) {
122
+ await reporter.documentStore.rollbackTransaction(req)
123
+
124
+ migrationErr.message = `Migration "xlsxTemplatesToAssets" failed: ${migrationErr.message}`
125
+
126
+ throw migrationErr
127
+ }
128
+ }
@@ -1,91 +1,92 @@
1
- const os = require('os')
2
-
3
- function cpu () {
4
- // Create function to get CPU information
5
- function cpuAverage () {
6
- // Initialise sum of idle and time of cores and fetch CPU info
7
- let totalIdle = 0; let totalTick = 0
8
- const cpus = os.cpus()
9
-
10
- // Loop through CPU cores
11
- for (let i = 0, len = cpus.length; i < len; i++) {
12
- // Select CPU core
13
- const cpu = cpus[i]
14
-
15
- // Total up the time in the cores tick
16
- for (const type in cpu.times) {
17
- totalTick += cpu.times[type]
18
- }
19
-
20
- // Total up the idle time of the core
21
- totalIdle += cpu.times.idle
22
- }
23
-
24
- // Return the average Idle and Tick times
25
- return { idle: totalIdle / cpus.length, total: totalTick / cpus.length }
26
- }
27
-
28
- // Grab first CPU Measure
29
- const startMeasure = cpuAverage()
30
-
31
- return new Promise((resolve) => {
32
- // Set delay for second Measure
33
- setTimeout(function () {
34
- // Grab second Measure
35
- const endMeasure = cpuAverage()
36
-
37
- // Calculate the difference in idle and total time between the measures
38
- const idleDifference = endMeasure.idle - startMeasure.idle
39
- const totalDifference = endMeasure.total - startMeasure.total
40
-
41
- // Calculate the average percentage CPU usage
42
- const percentageCPU = 100 - ~~(100 * idleDifference / totalDifference)
43
-
44
- // Output result to console
45
- resolve(percentageCPU)
46
- }, 1000)
47
- })
48
- }
49
-
50
- class Monitoring {
51
- constructor (reporter) {
52
- this.reporter = reporter
53
- }
54
-
55
- async execute () {
56
- const monitoring = {
57
- cpu: await cpu(),
58
- freemem: Math.round(os.freemem() / 1024 / 1024),
59
- timestamp: new Date(),
60
- hostname: os.hostname()
61
- }
62
- return this.reporter.documentStore.collection('monitoring').insert(monitoring)
63
- }
64
-
65
- init () {
66
- this._interval = setInterval(() => {
67
- this.execute().catch((e) => this.reporter.logger.warn('unable to persist monitoring info, but no need to worry, we will retry, details:' + e.stack))
68
- }, 60000)
69
- this._interval.unref()
70
- }
71
-
72
- close () {
73
- clearInterval(this._interval)
74
- }
75
- }
76
-
77
- module.exports = (reporter) => {
78
- reporter.documentStore.registerEntityType('MonitoringType', {
79
- cpu: { type: 'Edm.Int32' },
80
- freemem: { type: 'Edm.Int32' },
81
- timestamp: { type: 'Edm.DateTimeOffset', schema: { type: 'null' } },
82
- hostname: { type: 'Edm.String' }
83
- })
84
-
85
- reporter.documentStore.registerEntitySet('monitoring', {
86
- entityType: 'jsreport.MonitoringType',
87
- exportable: false
88
- })
89
-
90
- reporter.monitoring = new Monitoring(reporter)
91
- }
1
+ const os = require('os')
2
+
3
+ function cpu () {
4
+ // Create function to get CPU information
5
+ function cpuAverage () {
6
+ // Initialise sum of idle and time of cores and fetch CPU info
7
+ let totalIdle = 0; let totalTick = 0
8
+ const cpus = os.cpus()
9
+
10
+ // Loop through CPU cores
11
+ for (let i = 0, len = cpus.length; i < len; i++) {
12
+ // Select CPU core
13
+ const cpu = cpus[i]
14
+
15
+ // Total up the time in the cores tick
16
+ for (const type in cpu.times) {
17
+ totalTick += cpu.times[type]
18
+ }
19
+
20
+ // Total up the idle time of the core
21
+ totalIdle += cpu.times.idle
22
+ }
23
+
24
+ // Return the average Idle and Tick times
25
+ return { idle: totalIdle / cpus.length, total: totalTick / cpus.length }
26
+ }
27
+
28
+ // Grab first CPU Measure
29
+ const startMeasure = cpuAverage()
30
+
31
+ return new Promise((resolve) => {
32
+ // Set delay for second Measure
33
+ setTimeout(function () {
34
+ // Grab second Measure
35
+ const endMeasure = cpuAverage()
36
+
37
+ // Calculate the difference in idle and total time between the measures
38
+ const idleDifference = endMeasure.idle - startMeasure.idle
39
+ const totalDifference = endMeasure.total - startMeasure.total
40
+
41
+ // Calculate the average percentage CPU usage
42
+ const percentageCPU = 100 - ~~(100 * idleDifference / totalDifference)
43
+
44
+ // Output result to console
45
+ resolve(percentageCPU)
46
+ }, 1000)
47
+ })
48
+ }
49
+
50
+ class Monitoring {
51
+ constructor (reporter) {
52
+ this.reporter = reporter
53
+ }
54
+
55
+ async execute () {
56
+ const monitoring = {
57
+ cpu: await cpu(),
58
+ freemem: Math.round(os.freemem() / 1024 / 1024),
59
+ timestamp: new Date(),
60
+ hostname: os.hostname()
61
+ }
62
+ return this.reporter.documentStore.collection('monitoring').insert(monitoring)
63
+ }
64
+
65
+ init () {
66
+ this._interval = setInterval(() => {
67
+ this.execute().catch((e) => this.reporter.logger.warn('unable to persist monitoring info, but no need to worry, we will retry, details:' + e.stack))
68
+ }, 60000)
69
+ this._interval.unref()
70
+ }
71
+
72
+ close () {
73
+ clearInterval(this._interval)
74
+ }
75
+ }
76
+
77
+ module.exports = (reporter) => {
78
+ reporter.documentStore.registerEntityType('MonitoringType', {
79
+ cpu: { type: 'Edm.Int32' },
80
+ freemem: { type: 'Edm.Int32' },
81
+ timestamp: { type: 'Edm.DateTimeOffset', schema: { type: 'null' } },
82
+ hostname: { type: 'Edm.String' }
83
+ })
84
+
85
+ reporter.documentStore.registerEntitySet('monitoring', {
86
+ entityType: 'jsreport.MonitoringType',
87
+ exportable: false,
88
+ shared: true
89
+ })
90
+
91
+ reporter.monitoring = new Monitoring(reporter)
92
+ }