@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,78 +1,78 @@
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
+
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,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.0.1",
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.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,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
+ }