expressa 2.0.16 → 2.0.18

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 (208) hide show
  1. package/.circleci/config.yml +21 -21
  2. package/.eslintrc.json +29 -29
  3. package/LICENSE +21 -21
  4. package/README.md +137 -137
  5. package/auth/index.js +76 -76
  6. package/auth/jwt.js +31 -31
  7. package/controllers/collections.js +260 -258
  8. package/controllers/install.js +105 -105
  9. package/controllers/status.js +43 -43
  10. package/controllers/users.js +52 -52
  11. package/cypress/fixtures/example.json +4 -4
  12. package/cypress/integration/0_install_spec.js +8 -8
  13. package/cypress/integration/custom_collections.js +28 -28
  14. package/cypress/integration/home.js +9 -9
  15. package/cypress/integration/settings.js +34 -34
  16. package/cypress/integration/users.js +61 -61
  17. package/cypress/plugins/index.js +17 -17
  18. package/cypress/screenshots/users.js/User Management -- Can log in as non-admin, but cannot create users (failed).png +0 -0
  19. package/cypress/support/commands.js +54 -54
  20. package/cypress/support/index.js +20 -20
  21. package/cypress/support/util.js +10 -10
  22. package/cypress.json +4 -4
  23. package/db/cached.js +40 -40
  24. package/db/file.js +112 -112
  25. package/db/memory.js +79 -79
  26. package/db/mongo.js +86 -86
  27. package/db/postgres.js +93 -93
  28. package/doc/authentication.md +38 -38
  29. package/doc/automatic-fields.md +12 -12
  30. package/doc/blogexample.md +16 -16
  31. package/doc/custom-endpoints.md +20 -20
  32. package/doc/database.md +23 -23
  33. package/doc/development.md +33 -33
  34. package/doc/listeners.md +103 -103
  35. package/doc/modules.md +8 -8
  36. package/doc/permissions.md +14 -14
  37. package/doc/relationships.md +65 -65
  38. package/doc/testing.md +47 -47
  39. package/doc/uploading-files.md +53 -53
  40. package/index.js +297 -297
  41. package/listeners.js +65 -65
  42. package/listeners_collection_permissions.js +29 -29
  43. package/listeners_users.js +96 -96
  44. package/listeners_validation.js +43 -43
  45. package/middleware/logging.js +30 -30
  46. package/middleware/permissions.js +41 -41
  47. package/modules/access_keys/access_keys.js +32 -32
  48. package/modules/admin/.babelrc +20 -12
  49. package/modules/admin/.editorconfig +14 -14
  50. package/modules/admin/.eslintignore +5 -5
  51. package/modules/admin/.eslintrc.js +197 -197
  52. package/modules/admin/.postcssrc.js +10 -10
  53. package/modules/admin/.travis.yml +5 -5
  54. package/modules/admin/LICENSE +21 -21
  55. package/modules/admin/README.md +88 -88
  56. package/modules/admin/build/build.js +45 -45
  57. package/modules/admin/build/check-versions.js +64 -64
  58. package/modules/admin/build/utils.js +108 -108
  59. package/modules/admin/build/vue-loader.conf.js +5 -5
  60. package/modules/admin/build/webpack.base.conf.js +112 -108
  61. package/modules/admin/build/webpack.dev.conf.js +95 -95
  62. package/modules/admin/build/webpack.prod.conf.js +112 -171
  63. package/modules/admin/config/dev.env.js +8 -8
  64. package/modules/admin/config/index.js +86 -86
  65. package/modules/admin/config/prod.env.js +5 -5
  66. package/modules/admin/dist/favicon.ico +0 -0
  67. package/modules/admin/dist/index.html +1 -0
  68. package/modules/admin/dist/index.html.gz +0 -0
  69. package/modules/admin/dist/static/css/app.9dd57eea.css +1 -0
  70. package/modules/admin/dist/static/css/app.9dd57eea.css.gz +0 -0
  71. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css +1 -0
  72. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css.gz +0 -0
  73. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css +1 -0
  74. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css.gz +0 -0
  75. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css +1 -0
  76. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css.gz +0 -0
  77. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css +1 -0
  78. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css.gz +0 -0
  79. package/modules/admin/dist/static/css/chunk-7291.13514e45.css +0 -0
  80. package/modules/admin/dist/static/css/chunk-7291.13514e45.css.gz +0 -0
  81. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css +1 -0
  82. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css.gz +0 -0
  83. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css +1 -0
  84. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css.gz +0 -0
  85. package/modules/admin/dist/static/css/chunk-b423.5f239333.css +0 -0
  86. package/modules/admin/dist/static/css/chunk-b423.5f239333.css.gz +0 -0
  87. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css +1 -0
  88. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css.gz +0 -0
  89. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css +1 -0
  90. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css.gz +0 -0
  91. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css +1 -0
  92. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css.gz +0 -0
  93. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css +1 -0
  94. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css.gz +0 -0
  95. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css +14 -0
  96. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css.gz +0 -0
  97. package/modules/admin/dist/static/fonts/element-icons.6f0a763.ttf +0 -0
  98. package/modules/admin/dist/static/img/404.a57b6f3.png +0 -0
  99. package/modules/admin/dist/static/js/app.e9461593.js +1 -0
  100. package/modules/admin/dist/static/js/app.e9461593.js.gz +0 -0
  101. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js +2 -0
  102. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt +13 -0
  103. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt.gz +0 -0
  104. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.gz +0 -0
  105. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js +1 -0
  106. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js.gz +0 -0
  107. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js +1 -0
  108. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js.gz +0 -0
  109. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js +1 -0
  110. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js.gz +0 -0
  111. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js +1 -0
  112. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js.gz +0 -0
  113. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js +1 -0
  114. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js.gz +0 -0
  115. package/modules/admin/dist/static/js/chunk-7291.590524e9.js +1 -0
  116. package/modules/admin/dist/static/js/chunk-7291.590524e9.js.gz +0 -0
  117. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js +1 -0
  118. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js.gz +0 -0
  119. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js +1 -0
  120. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js.gz +0 -0
  121. package/modules/admin/dist/static/js/chunk-b423.387c504c.js +1 -0
  122. package/modules/admin/dist/static/js/chunk-b423.387c504c.js.gz +0 -0
  123. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js +1 -0
  124. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js.gz +0 -0
  125. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js +1 -0
  126. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js.gz +0 -0
  127. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js +1 -0
  128. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js.gz +0 -0
  129. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js +1 -0
  130. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js.gz +0 -0
  131. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js +1 -0
  132. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js.gz +0 -0
  133. package/modules/admin/dist/static/js/chunk-libs.06c38828.js +2 -0
  134. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt +126 -0
  135. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt.gz +0 -0
  136. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.gz +0 -0
  137. package/modules/admin/index.html +16 -16
  138. package/modules/admin/package.json +101 -98
  139. package/modules/admin/src/App.vue +11 -11
  140. package/modules/admin/src/api/login.js +26 -26
  141. package/modules/admin/src/api/table.js +9 -9
  142. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  143. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  144. package/modules/admin/src/components/JSONEditor.vue +180 -180
  145. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  146. package/modules/admin/src/icons/index.js +9 -9
  147. package/modules/admin/src/icons/svgo.yml +22 -22
  148. package/modules/admin/src/main.js +42 -41
  149. package/modules/admin/src/permission.js +49 -49
  150. package/modules/admin/src/router/index.js +200 -200
  151. package/modules/admin/src/store/getters.js +11 -11
  152. package/modules/admin/src/store/index.js +17 -17
  153. package/modules/admin/src/store/modules/app.js +43 -43
  154. package/modules/admin/src/store/modules/user.js +104 -104
  155. package/modules/admin/src/styles/element-ui.scss +29 -29
  156. package/modules/admin/src/styles/index.scss +78 -78
  157. package/modules/admin/src/styles/mixin.scss +27 -27
  158. package/modules/admin/src/styles/sidebar.scss +133 -133
  159. package/modules/admin/src/styles/transition.scss +46 -46
  160. package/modules/admin/src/styles/variables.scss +4 -4
  161. package/modules/admin/src/utils/auth.js +15 -15
  162. package/modules/admin/src/utils/index.js +74 -74
  163. package/modules/admin/src/utils/request.js +48 -48
  164. package/modules/admin/src/utils/validate.js +31 -31
  165. package/modules/admin/src/views/404.vue +235 -235
  166. package/modules/admin/src/views/Dev.vue +33 -33
  167. package/modules/admin/src/views/EditDocument.vue +116 -116
  168. package/modules/admin/src/views/Endpoints.vue +279 -279
  169. package/modules/admin/src/views/Home.vue +84 -84
  170. package/modules/admin/src/views/Install.vue +79 -79
  171. package/modules/admin/src/views/ListDocuments.vue +72 -72
  172. package/modules/admin/src/views/ListDocuments2.vue +462 -462
  173. package/modules/admin/src/views/ManageListeners.vue +67 -67
  174. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  175. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  176. package/modules/admin/src/views/ViewRequest.vue +77 -77
  177. package/modules/admin/src/views/form/index.vue +91 -91
  178. package/modules/admin/src/views/layout/Layout.vue +69 -69
  179. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  180. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  181. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  182. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  183. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  184. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  185. package/modules/admin/src/views/layout/components/index.js +3 -3
  186. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  187. package/modules/admin/src/views/login/index.vue +195 -195
  188. package/modules/admin/src/views/tree/index.vue +77 -77
  189. package/modules/collections/collections.js +39 -39
  190. package/modules/core/core.js +197 -197
  191. package/modules/logging/logging.js +88 -88
  192. package/modules/permissions/permissions.js +106 -106
  193. package/package.json +59 -59
  194. package/scripts/expressa +12 -12
  195. package/scripts/run_cypress_tests.sh +5 -5
  196. package/scripts/run_db_tests.sh +8 -8
  197. package/test/0-install.js +96 -96
  198. package/test/collections.js +431 -431
  199. package/test/collections.querying.js +288 -289
  200. package/test/db.js +258 -258
  201. package/test/db.strings.js +73 -73
  202. package/test/db.updating.js +144 -144
  203. package/test/logging.js +29 -29
  204. package/test/test.js +93 -94
  205. package/test/testserver.js +17 -17
  206. package/test/testutils.js +136 -136
  207. package/test/users.js +425 -425
  208. package/util.js +522 -522
package/test/testutils.js CHANGED
@@ -1,136 +1,136 @@
1
- const fs = require('fs')
2
-
3
- const expressa = require('../')
4
- const request = require('supertest')
5
- const util = require('../util')
6
-
7
- // See https://stackoverflow.com/questions/18052762/remove-directory-which-is-not-empty
8
- const deleteFolderRecursive = function(path) {
9
- if (fs.existsSync(path)) {
10
- fs.readdirSync(path).forEach(function(file) {
11
- const curPath = path + '/' + file
12
- if (fs.lstatSync(curPath).isDirectory()) { // recurse
13
- deleteFolderRecursive(curPath)
14
- } else { // delete file
15
- fs.unlinkSync(curPath)
16
- }
17
- })
18
- fs.rmdirSync(path)
19
- }
20
- }
21
-
22
- deleteFolderRecursive('testdata')
23
- fs.mkdirSync('testdata')
24
-
25
- exports.api = expressa.api({
26
- file_storage_path: 'testdata'
27
- })
28
- const express = require('express')
29
- const randomstring = require('randomstring')
30
- exports.app = express()
31
- exports.app.use(exports.api)
32
-
33
- const tokens = {
34
- admin: ''
35
- }
36
-
37
- exports.setAdminToken = function(token) {
38
- tokens.admin = token
39
- }
40
-
41
- exports.getUserWithPermissions = async function(api, permissions) {
42
- const service = request(exports.app)
43
- if (typeof permissions === 'string') {
44
- permissions = [permissions]
45
- }
46
- permissions = permissions || []
47
- const permissionsMap = {}
48
- permissions.forEach(function (permission) {
49
- permissionsMap[permission] = true
50
- })
51
-
52
- const randId = randomstring.generate(12)
53
- const roleName = 'role' + randId
54
- const role = {
55
- _id: roleName,
56
- permissions: permissionsMap
57
- }
58
-
59
- const roleRes = await service.post('/role')
60
- .set('x-access-token', tokens.admin)
61
- .send(role)
62
- .expect(200)
63
-
64
- const user = {
65
- email: 'test' + randId + '@example.com',
66
- password: '123',
67
- }
68
- const registerRes = await service.post('/users/register')
69
- .send(user)
70
- .expect(200)
71
-
72
- const updateRes = await service.post(`/users/${registerRes.body.id}/update`)
73
- .send({ $push: { roles: roleName } })
74
- .set('x-access-token', tokens.admin)
75
- .expect(200)
76
-
77
- const loginRes = await service.post('/users/login')
78
- .send(user)
79
- .expect(200)
80
-
81
- user._id = loginRes.body.uid
82
- return loginRes.body.token
83
- }
84
-
85
- exports.getAccessKeyForUserWithPermissions = async function(api, permissions) {
86
- const service = request(exports.app)
87
- if (typeof permissions === 'string') {
88
- permissions = [permissions]
89
- }
90
- permissions = permissions || []
91
- const permissionsMap = {}
92
- permissions.forEach(function (permission) {
93
- permissionsMap[permission] = true
94
- })
95
-
96
- const randId = randomstring.generate(12)
97
- const roleName = 'role' + randId
98
- const role = {
99
- _id: roleName,
100
- permissions: permissionsMap
101
- }
102
-
103
- const roleRes = await service.post('/role')
104
- .set('x-access-token', tokens.admin)
105
- .send(role)
106
- .expect(200)
107
-
108
- const user = {
109
- email: 'test' + randId + '@example.com',
110
- password: '123',
111
- }
112
- const registerRes = await service.post('/users/register')
113
- .send(user)
114
- .expect(200)
115
-
116
- const updateRes = await service.post(`/users/${registerRes.body.id}/update`)
117
- .send({ $push: { roles: roleName } })
118
- .set('x-access-token', tokens.admin)
119
- .expect(200)
120
-
121
- let accessKey = randomstring.generate(8)
122
- await exports.api.db.access_keys.create({
123
- user_collection: 'users',
124
- user_id: registerRes.body.id,
125
- key: accessKey,
126
- expires_at: '2032-01-01T00:00:00'
127
- })
128
-
129
- return accessKey
130
- }
131
-
132
- exports.clone = util.clone
133
- exports.sleep = function sleep(ms) {
134
- return new Promise(resolve => setTimeout(resolve, ms))
135
- }
136
- exports.generateDocumentId = util.generateDocumentId
1
+ const fs = require('fs')
2
+
3
+ const expressa = require('../')
4
+ const request = require('supertest')
5
+ const util = require('../util')
6
+
7
+ // See https://stackoverflow.com/questions/18052762/remove-directory-which-is-not-empty
8
+ const deleteFolderRecursive = function(path) {
9
+ if (fs.existsSync(path)) {
10
+ fs.readdirSync(path).forEach(function(file) {
11
+ const curPath = path + '/' + file
12
+ if (fs.lstatSync(curPath).isDirectory()) { // recurse
13
+ deleteFolderRecursive(curPath)
14
+ } else { // delete file
15
+ fs.unlinkSync(curPath)
16
+ }
17
+ })
18
+ fs.rmdirSync(path)
19
+ }
20
+ }
21
+
22
+ deleteFolderRecursive('testdata')
23
+ fs.mkdirSync('testdata')
24
+
25
+ exports.api = expressa.api({
26
+ file_storage_path: 'testdata'
27
+ })
28
+ const express = require('express')
29
+ const randomstring = require('randomstring')
30
+ exports.app = express()
31
+ exports.app.use(exports.api)
32
+
33
+ const tokens = {
34
+ admin: ''
35
+ }
36
+
37
+ exports.setAdminToken = function(token) {
38
+ tokens.admin = token
39
+ }
40
+
41
+ exports.getUserWithPermissions = async function(api, permissions) {
42
+ const service = request(exports.app)
43
+ if (typeof permissions === 'string') {
44
+ permissions = [permissions]
45
+ }
46
+ permissions = permissions || []
47
+ const permissionsMap = {}
48
+ permissions.forEach(function (permission) {
49
+ permissionsMap[permission] = true
50
+ })
51
+
52
+ const randId = randomstring.generate(12)
53
+ const roleName = 'role' + randId
54
+ const role = {
55
+ _id: roleName,
56
+ permissions: permissionsMap
57
+ }
58
+
59
+ const roleRes = await service.post('/role')
60
+ .set('x-access-token', tokens.admin)
61
+ .send(role)
62
+ .expect(200)
63
+
64
+ const user = {
65
+ email: 'test' + randId + '@example.com',
66
+ password: '123',
67
+ }
68
+ const registerRes = await service.post('/users/register')
69
+ .send(user)
70
+ .expect(200)
71
+
72
+ const updateRes = await service.post(`/users/${registerRes.body.id}/update`)
73
+ .send({ $push: { roles: roleName } })
74
+ .set('x-access-token', tokens.admin)
75
+ .expect(200)
76
+
77
+ const loginRes = await service.post('/users/login')
78
+ .send(user)
79
+ .expect(200)
80
+
81
+ user._id = loginRes.body.uid
82
+ return loginRes.body.token
83
+ }
84
+
85
+ exports.getAccessKeyForUserWithPermissions = async function(api, permissions) {
86
+ const service = request(exports.app)
87
+ if (typeof permissions === 'string') {
88
+ permissions = [permissions]
89
+ }
90
+ permissions = permissions || []
91
+ const permissionsMap = {}
92
+ permissions.forEach(function (permission) {
93
+ permissionsMap[permission] = true
94
+ })
95
+
96
+ const randId = randomstring.generate(12)
97
+ const roleName = 'role' + randId
98
+ const role = {
99
+ _id: roleName,
100
+ permissions: permissionsMap
101
+ }
102
+
103
+ const roleRes = await service.post('/role')
104
+ .set('x-access-token', tokens.admin)
105
+ .send(role)
106
+ .expect(200)
107
+
108
+ const user = {
109
+ email: 'test' + randId + '@example.com',
110
+ password: '123',
111
+ }
112
+ const registerRes = await service.post('/users/register')
113
+ .send(user)
114
+ .expect(200)
115
+
116
+ const updateRes = await service.post(`/users/${registerRes.body.id}/update`)
117
+ .send({ $push: { roles: roleName } })
118
+ .set('x-access-token', tokens.admin)
119
+ .expect(200)
120
+
121
+ const accessKey = randomstring.generate(8)
122
+ await exports.api.db.access_keys.create({
123
+ user_collection: 'users',
124
+ user_id: registerRes.body.id,
125
+ key: accessKey,
126
+ expires_at: '2032-01-01T00:00:00'
127
+ })
128
+
129
+ return accessKey
130
+ }
131
+
132
+ exports.clone = util.clone
133
+ exports.sleep = function sleep(ms) {
134
+ return new Promise(resolve => setTimeout(resolve, ms))
135
+ }
136
+ exports.generateDocumentId = util.generateDocumentId