@jsreport/jsreport-core 3.1.2-test.2 → 3.2.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 (79) 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 +244 -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 +91 -91
  26. package/lib/main/optionsLoad.js +237 -237
  27. package/lib/main/optionsSchema.js +237 -237
  28. package/lib/main/reporter.js +574 -579
  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 -169
  53. package/lib/shared/normalizeMetaFromLogs.js +30 -30
  54. package/lib/shared/reporter.js +128 -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 +239 -207
  66. package/lib/worker/render/htmlRecipe.js +10 -10
  67. package/lib/worker/render/moduleHelper.js +45 -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 +202 -205
  71. package/lib/worker/render/resolveReferences.js +60 -60
  72. package/lib/worker/reporter.js +192 -191
  73. package/lib/worker/sandbox/runInSandbox.js +16 -9
  74. package/lib/worker/sandbox/safeSandbox.js +828 -828
  75. package/lib/worker/templates.js +80 -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,78 +1,80 @@
1
- const extend = require('node.extend.without.arrays')
2
-
3
- module.exports = (reporter) => {
4
- reporter.addRequestContextMetaConfig('currentFolderPath', { sandboxReadOnly: true })
5
-
6
- reporter.beforeRenderListeners.add('templates', async (req, res) => {
7
- if (
8
- !req.template._id &&
9
- !req.template.shortid &&
10
- !req.template.name
11
- ) {
12
- if (req.template.content == null) {
13
- throw reporter.createError('Template must contains _id, name, shortid or content attribute', {
14
- weak: true,
15
- statusCode: 400
16
- })
17
- }
18
-
19
- reporter.logger.info(
20
- `Rendering anonymous template { recipe: ${req.template.recipe}, engine: ${req.template.engine} }`,
21
- req
22
- )
23
-
24
- return
25
- }
26
-
27
- const template = req.context.resolvedTemplate
28
-
29
- if (!template && !req.template.content) {
30
- throw reporter.createError(`Unable to find specified template or user does not have permissions to read it: ${
31
- (req.template._id || req.template.shortid || req.template.name)
32
- }`, {
33
- weak: true,
34
- statusCode: 404
35
- })
36
- }
37
-
38
- // store a copy to prevent side-effects
39
- req.template = template ? extend(true, {}, template, req.template) : req.template
40
- req.template.content = req.template.content || ''
41
-
42
- reporter.logger.info(
43
- `Rendering template { name: ${req.template.name}, recipe: ${req.template.recipe}, engine: ${req.template.engine}, preview: ${(req.options.preview || false)} }`,
44
- req
45
- )
46
-
47
- if (!req.options.reportName && req.template.name) {
48
- res.meta.reportName = req.template.name
49
- }
50
-
51
- req.context.currentFolderPath = await resolveCurrentPath(reporter, req)
52
- })
53
- }
54
-
55
- async function resolveCurrentPath (reporter, req) {
56
- if (!req.template) {
57
- return null
58
- }
59
-
60
- const pathFragments = []
61
- let currentFolder = req.template.folder
62
-
63
- if (currentFolder) {
64
- currentFolder = await reporter.documentStore.collection('folders').findOne({ shortid: currentFolder.shortid }, req)
65
- }
66
-
67
- while (currentFolder) {
68
- pathFragments.push(currentFolder.name)
69
-
70
- if (!currentFolder.folder) {
71
- currentFolder = null
72
- } else {
73
- currentFolder = await reporter.documentStore.collection('folders').findOne({ shortid: currentFolder.folder.shortid }, req)
74
- }
75
- }
76
-
77
- return '/' + pathFragments.reverse().join('/')
78
- }
1
+ const extend = require('node.extend.without.arrays')
2
+ const omit = require('lodash.omit')
3
+
4
+ module.exports = (reporter) => {
5
+ reporter.addRequestContextMetaConfig('currentFolderPath', { sandboxReadOnly: true })
6
+
7
+ reporter.beforeRenderListeners.add('templates', async (req, res) => {
8
+ if (
9
+ !req.template._id &&
10
+ !req.template.shortid &&
11
+ !req.template.name
12
+ ) {
13
+ if (req.template.content == null) {
14
+ throw reporter.createError('Template must contains _id, name, shortid or content attribute', {
15
+ weak: true,
16
+ statusCode: 400
17
+ })
18
+ }
19
+
20
+ reporter.logger.info(
21
+ `Rendering anonymous template { recipe: ${req.template.recipe}, engine: ${req.template.engine} }`,
22
+ req
23
+ )
24
+
25
+ return
26
+ }
27
+
28
+ const template = req.context.resolvedTemplate
29
+
30
+ if (!template && !req.template.content) {
31
+ throw reporter.createError(`Unable to find specified template or user does not have permissions to read it: ${
32
+ (req.template._id || req.template.shortid || req.template.name)
33
+ }`, {
34
+ weak: true,
35
+ statusCode: 404
36
+ })
37
+ }
38
+
39
+ // store a copy to prevent side-effects, we ignore name from the req.template because it can be path "/path/to/template"
40
+ // and we want that req.template.name be always the real template name
41
+ req.template = template ? extend(true, {}, template, omit(req.template, ['name'])) : req.template
42
+ req.template.content = req.template.content || ''
43
+
44
+ reporter.logger.info(
45
+ `Rendering template { name: ${req.template.name}, recipe: ${req.template.recipe}, engine: ${req.template.engine}, preview: ${(req.options.preview || false)} }`,
46
+ req
47
+ )
48
+
49
+ if (!req.options.reportName && req.template.name) {
50
+ res.meta.reportName = req.template.name
51
+ }
52
+
53
+ req.context.currentFolderPath = await resolveCurrentPath(reporter, req)
54
+ })
55
+ }
56
+
57
+ async function resolveCurrentPath (reporter, req) {
58
+ if (!req.template) {
59
+ return null
60
+ }
61
+
62
+ const pathFragments = []
63
+ let currentFolder = req.template.folder
64
+
65
+ if (currentFolder) {
66
+ currentFolder = await reporter.documentStore.collection('folders').findOne({ shortid: currentFolder.shortid }, req)
67
+ }
68
+
69
+ while (currentFolder) {
70
+ pathFragments.push(currentFolder.name)
71
+
72
+ if (!currentFolder.folder) {
73
+ currentFolder = null
74
+ } else {
75
+ currentFolder = await reporter.documentStore.collection('folders').findOne({ shortid: currentFolder.folder.shortid }, req)
76
+ }
77
+ }
78
+
79
+ return '/' + pathFragments.reverse().join('/')
80
+ }
@@ -1,54 +1,54 @@
1
- const WorkerReporter = require('./reporter')
2
- const omit = require('lodash.omit')
3
-
4
- module.exports = (userInitData, { executeMain, convertUint8ArrayToBuffer }) => {
5
- const reporter = new WorkerReporter(userInitData, async (actionName, data, req) => {
6
- const actionRes = await executeMain({
7
- actionName,
8
- data
9
- })
10
- convertUint8ArrayToBuffer(actionRes)
11
- return actionRes
12
- })
13
- let parsedReq
14
- return {
15
- init: () => {
16
- return reporter.init()
17
- },
18
-
19
- close: () => {
20
- return reporter.close()
21
- },
22
-
23
- execute: ({ actionName, data, req }) => {
24
- // we need to convert back arrays to buffer because transfer to/from thread converts buffers to array
25
- convertUint8ArrayToBuffer(data)
26
- convertUint8ArrayToBuffer(req)
27
-
28
- if (actionName === 'parse') {
29
- try {
30
- parsedReq = {
31
- ...JSON.parse(req.rawContent),
32
- context: req.context
33
- }
34
-
35
- return omit(parsedReq, 'data')
36
- } catch (e) {
37
- e.message = 'Invalid request json: ' + e.message
38
- e.weak = true
39
- throw e
40
- }
41
- }
42
-
43
- if (parsedReq) {
44
- if (parsedReq.context.rootId === req.context.rootId) {
45
- req.data = parsedReq.data
46
- }
47
-
48
- parsedReq = null
49
- }
50
-
51
- return reporter.executeWorkerAction(actionName, data, req)
52
- }
53
- }
54
- }
1
+ const WorkerReporter = require('./reporter')
2
+ const omit = require('lodash.omit')
3
+
4
+ module.exports = (userInitData, { executeMain, convertUint8ArrayToBuffer }) => {
5
+ const reporter = new WorkerReporter(userInitData, async (actionName, data, req) => {
6
+ const actionRes = await executeMain({
7
+ actionName,
8
+ data
9
+ })
10
+ convertUint8ArrayToBuffer(actionRes)
11
+ return actionRes
12
+ })
13
+ let parsedReq
14
+ return {
15
+ init: () => {
16
+ return reporter.init()
17
+ },
18
+
19
+ close: () => {
20
+ return reporter.close()
21
+ },
22
+
23
+ execute: ({ actionName, data, req }) => {
24
+ // we need to convert back arrays to buffer because transfer to/from thread converts buffers to array
25
+ convertUint8ArrayToBuffer(data)
26
+ convertUint8ArrayToBuffer(req)
27
+
28
+ if (actionName === 'parse') {
29
+ try {
30
+ parsedReq = {
31
+ ...JSON.parse(req.rawContent),
32
+ context: req.context
33
+ }
34
+
35
+ return omit(parsedReq, 'data')
36
+ } catch (e) {
37
+ e.message = 'Invalid request json: ' + e.message
38
+ e.weak = true
39
+ throw e
40
+ }
41
+ }
42
+
43
+ if (parsedReq) {
44
+ if (parsedReq.context.rootId === req.context.rootId) {
45
+ req.data = parsedReq.data
46
+ }
47
+
48
+ parsedReq = null
49
+ }
50
+
51
+ return reporter.executeWorkerAction(actionName, data, req)
52
+ }
53
+ }
54
+ }
package/package.json CHANGED
@@ -1,92 +1,92 @@
1
- {
2
- "name": "@jsreport/jsreport-core",
3
- "version": "3.1.2-test.2",
4
- "description": "javascript based business reporting",
5
- "keywords": [
6
- "report",
7
- "business",
8
- "javascript"
9
- ],
10
- "homepage": "https://github.com/jsreport/jsreport/tree/master/packages/jsreport-core",
11
- "repository": {
12
- "type": "git",
13
- "url": "git+ssh://git@github.com/jsreport/jsreport.git"
14
- },
15
- "license": "LGPL",
16
- "author": {
17
- "name": "Jan Blaha",
18
- "email": "jan.blaha@hotmail.com"
19
- },
20
- "main": "index.js",
21
- "files": [
22
- "lib",
23
- "index.js",
24
- "test/store/common.js",
25
- "test/blobStorage/common.js"
26
- ],
27
- "scripts": {
28
- "test": "mocha --timeout 5000 --recursive test --exit && standard",
29
- "test:watch": "mocha --watch --recursive test"
30
- },
31
- "dependencies": {
32
- "@babel/code-frame": "7.12.13",
33
- "@babel/parser": "7.14.4",
34
- "@babel/traverse": "7.12.9",
35
- "@jsreport/advanced-workers": "1.1.0",
36
- "@jsreport/mingo": "2.4.1",
37
- "ajv": "6.12.6",
38
- "app-root-path": "2.0.1",
39
- "async-replace": "1.0.1",
40
- "camelcase": "5.0.0",
41
- "debug": "4.3.2",
42
- "decamelize": "2.0.0",
43
- "deepmerge": "2.1.0",
44
- "diff": "3.5.0",
45
- "diff-match-patch": "1.0.5",
46
- "enhanced-resolve": "5.8.3",
47
- "has-own-deep": "1.1.0",
48
- "isbinaryfile": "4.0.0",
49
- "listener-collection": "1.2.0",
50
- "lodash.get": "4.4.2",
51
- "lodash.groupby": "4.6.0",
52
- "lodash.omit": "4.5.0",
53
- "lodash.set": "4.3.2",
54
- "lru-cache": "4.1.1",
55
- "ms": "2.1.3",
56
- "nanoid": "3.1.16",
57
- "nconf": "0.10.0",
58
- "node.extend.without.arrays": "1.1.6",
59
- "reap2": "1.0.1",
60
- "semver": "7.3.5",
61
- "serializator": "1.0.2",
62
- "stack-trace": "0.0.10",
63
- "triple-beam": "1.3.0",
64
- "unset-value": "1.0.0",
65
- "uuid": "8.3.2",
66
- "v8-compile-cache": "*",
67
- "vm2": "3.9.5",
68
- "winston": "3.3.3",
69
- "winston-transport": "4.4.0"
70
- },
71
- "devDependencies": {
72
- "mocha": "8.2.1",
73
- "should": "13.2.3",
74
- "standard": "16.0.3",
75
- "std-mocks": "1.0.1",
76
- "winston-loggly-bulk": "3.2.1"
77
- },
78
- "engines": {
79
- "node": ">=16.11"
80
- },
81
- "maintainers": [
82
- {
83
- "name": "pofider",
84
- "email": "jan.blaha@hotmail.com"
85
- }
86
- ],
87
- "standard": {
88
- "env": {
89
- "mocha": true
90
- }
91
- }
92
- }
1
+ {
2
+ "name": "@jsreport/jsreport-core",
3
+ "version": "3.2.0",
4
+ "description": "javascript based business reporting",
5
+ "keywords": [
6
+ "report",
7
+ "business",
8
+ "javascript"
9
+ ],
10
+ "homepage": "https://github.com/jsreport/jsreport/tree/master/packages/jsreport-core",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+ssh://git@github.com/jsreport/jsreport.git"
14
+ },
15
+ "license": "LGPL",
16
+ "author": {
17
+ "name": "Jan Blaha",
18
+ "email": "jan.blaha@hotmail.com"
19
+ },
20
+ "main": "index.js",
21
+ "files": [
22
+ "lib",
23
+ "index.js",
24
+ "test/store/common.js",
25
+ "test/blobStorage/common.js"
26
+ ],
27
+ "scripts": {
28
+ "test": "mocha --timeout 5000 --recursive test --exit && standard",
29
+ "test:watch": "mocha --watch --recursive test"
30
+ },
31
+ "dependencies": {
32
+ "@babel/code-frame": "7.12.13",
33
+ "@babel/parser": "7.14.4",
34
+ "@babel/traverse": "7.12.9",
35
+ "@jsreport/advanced-workers": "1.2.0",
36
+ "@jsreport/mingo": "2.4.1",
37
+ "ajv": "6.12.6",
38
+ "app-root-path": "2.0.1",
39
+ "async-replace": "1.0.1",
40
+ "camelcase": "5.0.0",
41
+ "debug": "4.3.2",
42
+ "decamelize": "2.0.0",
43
+ "deepmerge": "2.1.0",
44
+ "diff": "3.5.0",
45
+ "diff-match-patch": "1.0.5",
46
+ "enhanced-resolve": "5.8.3",
47
+ "has-own-deep": "1.1.0",
48
+ "isbinaryfile": "4.0.0",
49
+ "listener-collection": "1.2.0",
50
+ "lodash.get": "4.4.2",
51
+ "lodash.groupby": "4.6.0",
52
+ "lodash.omit": "4.5.0",
53
+ "lodash.set": "4.3.2",
54
+ "lru-cache": "4.1.1",
55
+ "ms": "2.1.3",
56
+ "nanoid": "3.1.16",
57
+ "nconf": "0.10.0",
58
+ "node.extend.without.arrays": "1.1.6",
59
+ "reap2": "1.0.1",
60
+ "semver": "7.3.5",
61
+ "serializator": "1.0.2",
62
+ "stack-trace": "0.0.10",
63
+ "triple-beam": "1.3.0",
64
+ "unset-value": "1.0.0",
65
+ "uuid": "8.3.2",
66
+ "v8-compile-cache": "*",
67
+ "vm2": "3.9.5",
68
+ "winston": "3.3.3",
69
+ "winston-transport": "4.4.0"
70
+ },
71
+ "devDependencies": {
72
+ "mocha": "8.2.1",
73
+ "should": "13.2.3",
74
+ "standard": "16.0.4",
75
+ "std-mocks": "1.0.1",
76
+ "winston-loggly-bulk": "3.2.1"
77
+ },
78
+ "engines": {
79
+ "node": ">=16.11"
80
+ },
81
+ "maintainers": [
82
+ {
83
+ "name": "pofider",
84
+ "email": "jan.blaha@hotmail.com"
85
+ }
86
+ ],
87
+ "standard": {
88
+ "env": {
89
+ "mocha": true
90
+ }
91
+ }
92
+ }
@@ -1,21 +1,21 @@
1
- module.exports = (storage) => {
2
- it('write and read', async () => {
3
- await storage().write('foo', Buffer.from('hula'))
4
-
5
- const content = await storage().read('foo')
6
- content.toString().should.be.eql('hula')
7
- })
8
-
9
- it('write remove read should fail', async () => {
10
- await storage().write('foo', Buffer.from('hula'))
11
- await storage().remove('foo')
12
-
13
- return storage().read('foo').should.be.rejected()
14
- })
15
-
16
- it('should work with folders and paths', async () => {
17
- await storage().write('foldera/folderb/myblob.txt', Buffer.from('hula'))
18
- const buf = await storage().read('foldera/folderb/myblob.txt')
19
- buf.toString().should.be.eql('hula')
20
- })
21
- }
1
+ module.exports = (storage) => {
2
+ it('write and read', async () => {
3
+ await storage().write('foo', Buffer.from('hula'))
4
+
5
+ const content = await storage().read('foo')
6
+ content.toString().should.be.eql('hula')
7
+ })
8
+
9
+ it('write remove read should fail', async () => {
10
+ await storage().write('foo', Buffer.from('hula'))
11
+ await storage().remove('foo')
12
+
13
+ return storage().read('foo').should.be.rejected()
14
+ })
15
+
16
+ it('should work with folders and paths', async () => {
17
+ await storage().write('foldera/folderb/myblob.txt', Buffer.from('hula'))
18
+ const buf = await storage().read('foldera/folderb/myblob.txt')
19
+ buf.toString().should.be.eql('hula')
20
+ })
21
+ }