jxp 2.16.0 → 4.0.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 (218) hide show
  1. package/.env.sample +31 -6
  2. package/README.md +27 -13
  3. package/dist/bin/init_db.d.ts +3 -0
  4. package/dist/bin/init_db.d.ts.map +1 -0
  5. package/dist/bin/init_db.js +48 -0
  6. package/dist/bin/init_db.js.map +1 -0
  7. package/dist/bin/server.d.ts +4 -0
  8. package/dist/bin/server.d.ts.map +1 -0
  9. package/dist/bin/server.js +132 -0
  10. package/dist/bin/server.js.map +1 -0
  11. package/dist/bin/setup.d.ts +3 -0
  12. package/dist/bin/setup.d.ts.map +1 -0
  13. package/dist/bin/setup.js +185 -0
  14. package/dist/bin/setup.js.map +1 -0
  15. package/dist/globals.d.ts +14 -0
  16. package/dist/globals.d.ts.map +1 -0
  17. package/dist/globals.js +3 -0
  18. package/dist/globals.js.map +1 -0
  19. package/dist/libs/aggregate_guard.d.ts +5 -0
  20. package/dist/libs/aggregate_guard.d.ts.map +1 -0
  21. package/dist/libs/aggregate_guard.js +58 -0
  22. package/dist/libs/aggregate_guard.js.map +1 -0
  23. package/dist/libs/bulkwrite_guard.d.ts +5 -0
  24. package/dist/libs/bulkwrite_guard.d.ts.map +1 -0
  25. package/dist/libs/bulkwrite_guard.js +44 -0
  26. package/dist/libs/bulkwrite_guard.js.map +1 -0
  27. package/dist/libs/cache.d.ts +2 -0
  28. package/dist/libs/cache.d.ts.map +1 -0
  29. package/dist/libs/cache.js +94 -0
  30. package/dist/libs/cache.js.map +1 -0
  31. package/dist/libs/call_guard.d.ts +3 -0
  32. package/dist/libs/call_guard.d.ts.map +1 -0
  33. package/dist/libs/call_guard.js +17 -0
  34. package/dist/libs/call_guard.js.map +1 -0
  35. package/dist/libs/connection_string.d.ts +3 -0
  36. package/dist/libs/connection_string.d.ts.map +1 -0
  37. package/dist/libs/connection_string.js +4 -0
  38. package/dist/libs/connection_string.js.map +1 -0
  39. package/dist/libs/datamunging.d.ts +2 -0
  40. package/dist/libs/datamunging.d.ts.map +1 -0
  41. package/dist/libs/datamunging.js +320 -0
  42. package/dist/libs/datamunging.js.map +1 -0
  43. package/dist/libs/docs.d.ts +2 -0
  44. package/dist/libs/docs.d.ts.map +1 -0
  45. package/dist/libs/docs.js +307 -0
  46. package/dist/libs/docs.js.map +1 -0
  47. package/dist/libs/groups.d.ts +2 -0
  48. package/dist/libs/groups.d.ts.map +1 -0
  49. package/dist/libs/groups.js +136 -0
  50. package/dist/libs/groups.js.map +1 -0
  51. package/dist/libs/jxp.d.ts +4 -0
  52. package/dist/libs/jxp.d.ts.map +1 -0
  53. package/dist/libs/jxp.js +1157 -0
  54. package/dist/libs/jxp.js.map +1 -0
  55. package/dist/libs/link_index.d.ts +14 -0
  56. package/dist/libs/link_index.d.ts.map +1 -0
  57. package/dist/libs/link_index.js +37 -0
  58. package/dist/libs/link_index.js.map +1 -0
  59. package/dist/libs/load-config.d.ts +16 -0
  60. package/dist/libs/load-config.d.ts.map +1 -0
  61. package/dist/libs/load-config.js +155 -0
  62. package/dist/libs/load-config.js.map +1 -0
  63. package/dist/libs/login.d.ts +2 -0
  64. package/dist/libs/login.d.ts.map +1 -0
  65. package/dist/libs/login.js +244 -0
  66. package/dist/libs/login.js.map +1 -0
  67. package/dist/libs/modeldir.d.ts +5 -0
  68. package/dist/libs/modeldir.d.ts.map +1 -0
  69. package/dist/libs/modeldir.js +15 -0
  70. package/dist/libs/modeldir.js.map +1 -0
  71. package/dist/libs/query_limits.d.ts +2 -0
  72. package/dist/libs/query_limits.d.ts.map +1 -0
  73. package/dist/libs/query_limits.js +84 -0
  74. package/dist/libs/query_limits.js.map +1 -0
  75. package/dist/libs/query_manipulation.d.ts +3 -0
  76. package/dist/libs/query_manipulation.d.ts.map +1 -0
  77. package/{libs → dist/libs}/query_manipulation.js +22 -21
  78. package/dist/libs/query_manipulation.js.map +1 -0
  79. package/dist/libs/query_sanitize.d.ts +5 -0
  80. package/dist/libs/query_sanitize.d.ts.map +1 -0
  81. package/dist/libs/query_sanitize.js +109 -0
  82. package/dist/libs/query_sanitize.js.map +1 -0
  83. package/dist/libs/response_sanitize.d.ts +7 -0
  84. package/dist/libs/response_sanitize.d.ts.map +1 -0
  85. package/dist/libs/response_sanitize.js +57 -0
  86. package/dist/libs/response_sanitize.js.map +1 -0
  87. package/dist/libs/safe_error.d.ts +3 -0
  88. package/dist/libs/safe_error.d.ts.map +1 -0
  89. package/dist/libs/safe_error.js +14 -0
  90. package/dist/libs/safe_error.js.map +1 -0
  91. package/dist/libs/schema.d.ts +14 -0
  92. package/dist/libs/schema.d.ts.map +1 -0
  93. package/dist/libs/schema.js +98 -0
  94. package/dist/libs/schema.js.map +1 -0
  95. package/dist/libs/schema_description.d.ts +3 -0
  96. package/dist/libs/schema_description.d.ts.map +1 -0
  97. package/{libs → dist/libs}/schema_description.js +12 -21
  98. package/dist/libs/schema_description.js.map +1 -0
  99. package/dist/libs/security.d.ts +2 -0
  100. package/dist/libs/security.d.ts.map +1 -0
  101. package/dist/libs/security.js +428 -0
  102. package/dist/libs/security.js.map +1 -0
  103. package/dist/libs/setup.d.ts +2 -0
  104. package/dist/libs/setup.d.ts.map +1 -0
  105. package/dist/libs/setup.js +87 -0
  106. package/dist/libs/setup.js.map +1 -0
  107. package/dist/libs/startup-deprecations.d.ts +2 -0
  108. package/dist/libs/startup-deprecations.d.ts.map +1 -0
  109. package/dist/libs/startup-deprecations.js +21 -0
  110. package/dist/libs/startup-deprecations.js.map +1 -0
  111. package/dist/libs/startup.d.ts +16 -0
  112. package/dist/libs/startup.d.ts.map +1 -0
  113. package/dist/libs/startup.js +63 -0
  114. package/dist/libs/startup.js.map +1 -0
  115. package/dist/libs/ws.d.ts +2 -0
  116. package/dist/libs/ws.d.ts.map +1 -0
  117. package/{libs → dist/libs}/ws.js +114 -73
  118. package/dist/libs/ws.js.map +1 -0
  119. package/dist/models/apikey_model.d.ts +10 -0
  120. package/dist/models/apikey_model.d.ts.map +1 -0
  121. package/dist/models/apikey_model.js +14 -0
  122. package/dist/models/apikey_model.js.map +1 -0
  123. package/dist/models/link_model.d.ts +9 -0
  124. package/dist/models/link_model.d.ts.map +1 -0
  125. package/dist/models/link_model.js +20 -0
  126. package/dist/models/link_model.js.map +1 -0
  127. package/dist/models/refreshtoken_model.d.ts +11 -0
  128. package/dist/models/refreshtoken_model.d.ts.map +1 -0
  129. package/dist/models/refreshtoken_model.js +22 -0
  130. package/dist/models/refreshtoken_model.js.map +1 -0
  131. package/dist/models/test_model.d.ts +24 -0
  132. package/dist/models/test_model.d.ts.map +1 -0
  133. package/dist/models/test_model.js +44 -0
  134. package/dist/models/test_model.js.map +1 -0
  135. package/dist/models/token_model.d.ts +14 -0
  136. package/dist/models/token_model.d.ts.map +1 -0
  137. package/dist/models/token_model.js +25 -0
  138. package/dist/models/token_model.js.map +1 -0
  139. package/dist/models/user_model.d.ts +15 -0
  140. package/dist/models/user_model.d.ts.map +1 -0
  141. package/dist/models/user_model.js +38 -0
  142. package/dist/models/user_model.js.map +1 -0
  143. package/dist/models/usergroups_model.d.ts +9 -0
  144. package/dist/models/usergroups_model.d.ts.map +1 -0
  145. package/dist/models/usergroups_model.js +18 -0
  146. package/dist/models/usergroups_model.js.map +1 -0
  147. package/dist/types/jxp-config.d.ts +134 -0
  148. package/dist/types/jxp-config.d.ts.map +1 -0
  149. package/dist/types/jxp-config.js +3 -0
  150. package/dist/types/jxp-config.js.map +1 -0
  151. package/dist/types/schema-fields.d.ts +43 -0
  152. package/dist/types/schema-fields.d.ts.map +1 -0
  153. package/dist/types/schema-fields.js +3 -0
  154. package/dist/types/schema-fields.js.map +1 -0
  155. package/docs/aggregations.md +40 -21
  156. package/docs/api.md +55 -15
  157. package/docs/authentication.md +60 -37
  158. package/docs/bulk_writes.md +11 -8
  159. package/docs/caching.md +28 -11
  160. package/docs/changelog.md +237 -31
  161. package/docs/configuration.md +99 -118
  162. package/docs/hooks.md +12 -8
  163. package/docs/index.md +17 -17
  164. package/docs/installation.md +23 -18
  165. package/docs/permissions.md +33 -19
  166. package/docs/queries.md +9 -5
  167. package/docs/schemas.md +21 -10
  168. package/docs/special.md +4 -4
  169. package/docs/typescript.md +86 -0
  170. package/docs/websocket.md +99 -1
  171. package/mkdocs.yml +1 -0
  172. package/package.json +121 -69
  173. package/templates/api.pug +32 -0
  174. package/templates/app-server.js +43 -0
  175. package/templates/app.env.sample +8 -0
  176. package/templates/assets/api-console.js +133 -0
  177. package/templates/assets/docs.css +227 -0
  178. package/templates/index.pug +62 -2
  179. package/templates/layout.pug +17 -11
  180. package/templates/md.pug +1 -1
  181. package/templates/model.pug +117 -68
  182. package/templates/navbar.pug +14 -21
  183. package/templates/sidebar.pug +30 -0
  184. package/.env +0 -9
  185. package/.eslintrc.json +0 -20
  186. package/.jshintrc +0 -4
  187. package/.vscode/launch.json +0 -29
  188. package/.vscode/settings.json +0 -3
  189. package/Dockerfile +0 -7
  190. package/bin/init_db.js +0 -54
  191. package/bin/server.js +0 -84
  192. package/bin/setup.js +0 -190
  193. package/config_sample.json +0 -10
  194. package/docker-compose.yml +0 -32
  195. package/libs/cache.js +0 -92
  196. package/libs/connection_string.js +0 -24
  197. package/libs/datamunging.js +0 -335
  198. package/libs/docs.js +0 -162
  199. package/libs/groups.js +0 -133
  200. package/libs/jxp.js +0 -1208
  201. package/libs/login.js +0 -218
  202. package/libs/modeldir.js +0 -14
  203. package/libs/schema.js +0 -99
  204. package/libs/security.js +0 -410
  205. package/libs/setup.js +0 -90
  206. package/models/apikey_model.js +0 -10
  207. package/models/link_model.js +0 -17
  208. package/models/refreshtoken_model.js +0 -20
  209. package/models/test_model.js +0 -50
  210. package/models/token_model.js +0 -23
  211. package/models/user_model.js +0 -38
  212. package/models/usergroups_model.js +0 -15
  213. package/setup.sh +0 -3
  214. package/test/.eslintrc.json +0 -13
  215. package/test/init.js +0 -92
  216. package/test/setup.test.js +0 -62
  217. package/test/test.js +0 -1527
  218. package/test/wstest.js.old +0 -124
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ const glob = require("glob");
3
+ const path = require("path");
4
+ const findModelDir = (dir) => {
5
+ if (dir === "/")
6
+ throw new Error("Model dir not found");
7
+ let result = glob.sync(path.join(dir, "**/user_model.js"));
8
+ if (result.length) {
9
+ return path.dirname(result.pop());
10
+ }
11
+ const found = findModelDir(path.join(dir, "../"));
12
+ return found;
13
+ };
14
+ module.exports = { findModelDir };
15
+ //# sourceMappingURL=modeldir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modeldir.js","sourceRoot":"","sources":["../../src/libs/modeldir.ts"],"names":[],"mappings":";AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7B,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,EAAE;IAC5B,IAAI,GAAG,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC;AACd,CAAC,CAAA;AAED,iBAAS,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query_limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_limits.d.ts","sourceRoot":"","sources":["../../src/libs/query_limits.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const errors = require("restify-errors");
4
+ const DEFAULTS = {
5
+ enabled: true,
6
+ large_collection_threshold: 10000,
7
+ max: 1000,
8
+ default: 100,
9
+ require_limit_always: true,
10
+ skip_count_unless_paginated: true,
11
+ };
12
+ function getLimits(req) {
13
+ const limits = Object.assign({}, DEFAULTS, req.config?.query_limits);
14
+ const modelLimits = req.Model?.schema?.opts?.query_limits;
15
+ if (modelLimits && typeof modelLimits === "object") {
16
+ Object.assign(limits, modelLimits);
17
+ }
18
+ return limits;
19
+ }
20
+ function parseRequestedLimit(req) {
21
+ const n = parseInt(String(req.query.limit ?? ""), 10);
22
+ return Number.isFinite(n) && n > 0 ? n : null;
23
+ }
24
+ function shouldRunCount(req) {
25
+ const limits = getLimits(req);
26
+ if (limits.skip_count_unless_paginated === false)
27
+ return true;
28
+ if (req.query.count === "true" || req.query.count === true)
29
+ return true;
30
+ const page = parseInt(String(req.query.page ?? ""), 10);
31
+ return Number.isFinite(page) && page > 0;
32
+ }
33
+ function enforceListLimit(req, estimatedCount) {
34
+ const limits = getLimits(req);
35
+ if (limits.enabled === false) {
36
+ return parseRequestedLimit(req);
37
+ }
38
+ const requested = parseRequestedLimit(req);
39
+ const isLarge = estimatedCount >= limits.large_collection_threshold;
40
+ if (isLarge && !requested && limits.require_limit_always !== false) {
41
+ throw new errors.BadRequestError(`Collection "${req.modelname}" has ~${estimatedCount} documents. ` +
42
+ `Use ?limit=1..${limits.max} (required). For totals use GET /count/${req.modelname}.`);
43
+ }
44
+ if (requested && requested > limits.max) {
45
+ throw new errors.BadRequestError(`?limit=${requested} exceeds maximum ${limits.max} for "${req.modelname}".`);
46
+ }
47
+ if (requested) {
48
+ return requested;
49
+ }
50
+ if (limits.require_limit_always !== false && limits.default) {
51
+ return limits.default;
52
+ }
53
+ return null;
54
+ }
55
+ function applyListPagination(q, result, req, limit, count, changeUrlParams) {
56
+ if (!limit) {
57
+ return;
58
+ }
59
+ q.limit(limit);
60
+ result.limit = limit;
61
+ const page_count = count >= 0 ? Math.ceil(count / limit) : null;
62
+ if (page_count !== null) {
63
+ result.page_count = page_count;
64
+ }
65
+ let page = parseInt(String(req.query.page ?? ""), 10);
66
+ page = page ? page : 1;
67
+ result.page = page;
68
+ if (page_count !== null && page < page_count) {
69
+ result.next = changeUrlParams(req, "page", page + 1);
70
+ }
71
+ if (page > 1) {
72
+ result.prev = changeUrlParams(req, "page", page - 1);
73
+ q.skip(limit * (page - 1));
74
+ }
75
+ }
76
+ module.exports = {
77
+ getLimits,
78
+ parseRequestedLimit,
79
+ shouldRunCount,
80
+ enforceListLimit,
81
+ applyListPagination,
82
+ DEFAULTS,
83
+ };
84
+ //# sourceMappingURL=query_limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_limits.js","sourceRoot":"","sources":["../../src/libs/query_limits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const fix_query: (query: any) => any;
2
+ export { fix_query };
3
+ //# sourceMappingURL=query_manipulation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_manipulation.d.ts","sourceRoot":"","sources":["../../src/libs/query_manipulation.ts"],"names":[],"mappings":"AAmCA,QAAA,MAAM,SAAS,GAAG,UAAK,QAoBtB,CAAA;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1,7 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fix_query = void 0;
1
4
  const traverse = require("traverse");
2
5
  const ObjectId = require("mongoose").Types.ObjectId;
3
6
  const moment = require("moment");
4
-
5
7
  const relative_date = (offset, offset_unit, startof_unit, endof_unit) => {
6
8
  const m = moment();
7
9
  if (offset) {
@@ -9,14 +11,17 @@ const relative_date = (offset, offset_unit, startof_unit, endof_unit) => {
9
11
  if (offset > 0) {
10
12
  if (offset_unit) {
11
13
  m.add(offset, offset_unit);
12
- } else {
13
- m.add(offset)
14
14
  }
15
- } else {
15
+ else {
16
+ m.add(offset);
17
+ }
18
+ }
19
+ else {
16
20
  if (offset_unit) {
17
21
  m.subtract(Math.abs(offset), offset_unit);
18
- } else {
19
- m.subtract(Math.abs(offset))
22
+ }
23
+ else {
24
+ m.subtract(Math.abs(offset));
20
25
  }
21
26
  }
22
27
  }
@@ -27,34 +32,30 @@ const relative_date = (offset, offset_unit, startof_unit, endof_unit) => {
27
32
  m.endOf(endof_unit);
28
33
  }
29
34
  return m.toDate();
30
- }
31
-
35
+ };
32
36
  const fix_params = s => {
33
- return s.split(",").map(i => r = i.trim().replace(/\"/g, "")).map(i => (i === "null") ? null : i);
34
- }
35
-
37
+ return s.split(",").map(i => i.trim().replace(/\"/g, "")).map(i => (i === "null") ? null : i);
38
+ };
36
39
  const fix_query = query => {
37
- const cleaned = traverse(query).map(function(val) {
38
- const date_parts = /^(new Date\(\")([\d\.\-\+zZT\:]*)(\"\))/g.exec(val);
40
+ const cleaned = traverse(query).map(function (val) {
41
+ const date_parts = /^(new Date\(\")([\d\.\-\+zZT\:]*)(\"\))/g.exec(String(val));
39
42
  if (date_parts) {
40
43
  const newval = new Date(date_parts[2]);
41
44
  this.update(newval, true);
42
45
  }
43
- const objectid_parts = /^(ObjectId\(\")([a-zA-Z\d]*)(\"\))/g.exec(val);
46
+ const objectid_parts = /^(ObjectId\(\")([a-zA-Z\d]*)(\"\))/g.exec(String(val));
44
47
  if (objectid_parts) {
45
48
  const newval = ObjectId(objectid_parts[2]);
46
49
  this.update(newval, true);
47
50
  }
48
- const startof_parts = /^(relative_date\()(.*)(\))/g.exec(val);
51
+ const startof_parts = /^(relative_date\()(.*)(\))/g.exec(String(val));
49
52
  if (startof_parts) {
50
53
  const params = fix_params(startof_parts[2]);
51
54
  const newval = relative_date.apply(null, params);
52
55
  this.update(newval, true);
53
56
  }
54
- })
57
+ });
55
58
  return cleaned;
56
- }
57
-
58
- module.exports = {
59
- fix_query
60
- }
59
+ };
60
+ exports.fix_query = fix_query;
61
+ //# sourceMappingURL=query_manipulation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_manipulation.js","sourceRoot":"","sources":["../../src/libs/query_manipulation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function sanitizeFilter(filter: unknown, options?: {
2
+ filter_operators_deny?: string[];
3
+ }): Record<string, unknown>;
4
+ export declare function parseSearchObject(search: unknown): Record<string, RegExp>;
5
+ //# sourceMappingURL=query_sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_sanitize.d.ts","sourceRoot":"","sources":["../../src/libs/query_sanitize.ts"],"names":[],"mappings":"AA6EA,wBAAgB,cAAc,CAC7B,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBzE"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeFilter = sanitizeFilter;
4
+ exports.parseSearchObject = parseSearchObject;
5
+ const errors = require("restify-errors");
6
+ const DEFAULT_DENY_OPERATORS = new Set([
7
+ "$where",
8
+ "$function",
9
+ "$accumulator",
10
+ "$expr",
11
+ "$jsonSchema",
12
+ ]);
13
+ const MAX_REGEX_LENGTH = 256;
14
+ const NESTED_QUANTIFIER = /(\*|\?|\+|\{)\s*(\*|\?|\+|\{)/;
15
+ function getDenySet(custom) {
16
+ if (!custom || !custom.length)
17
+ return DEFAULT_DENY_OPERATORS;
18
+ return new Set([...DEFAULT_DENY_OPERATORS, ...custom]);
19
+ }
20
+ function validateRegex(pattern) {
21
+ if (pattern.length > MAX_REGEX_LENGTH) {
22
+ throw new errors.BadRequestError("Regex pattern too long");
23
+ }
24
+ if (NESTED_QUANTIFIER.test(pattern)) {
25
+ throw new errors.BadRequestError("Regex pattern not allowed");
26
+ }
27
+ }
28
+ function sanitizeRegexValue(value) {
29
+ if (value instanceof RegExp) {
30
+ validateRegex(value.source);
31
+ return;
32
+ }
33
+ if (typeof value === "string") {
34
+ validateRegex(value);
35
+ return;
36
+ }
37
+ if (value && typeof value === "object") {
38
+ const o = value;
39
+ if (typeof o.$regex === "string") {
40
+ validateRegex(o.$regex);
41
+ }
42
+ }
43
+ }
44
+ function walkQuery(obj, deny, depth = 0) {
45
+ const MAX_DEPTH = 20;
46
+ if (depth > MAX_DEPTH) {
47
+ throw new errors.BadRequestError("Query nesting too deep");
48
+ }
49
+ if (obj === null || obj === undefined)
50
+ return;
51
+ if (obj instanceof RegExp) {
52
+ validateRegex(obj.source);
53
+ return;
54
+ }
55
+ if (Array.isArray(obj)) {
56
+ for (const item of obj) {
57
+ walkQuery(item, deny, depth + 1);
58
+ }
59
+ return;
60
+ }
61
+ if (typeof obj !== "object")
62
+ return;
63
+ for (const key of Object.keys(obj)) {
64
+ if (key.startsWith("$") && deny.has(key)) {
65
+ throw new errors.BadRequestError(`Operator ${key} is not allowed`);
66
+ }
67
+ if (key === "$regex") {
68
+ sanitizeRegexValue(obj[key]);
69
+ }
70
+ const val = obj[key];
71
+ if (val instanceof RegExp) {
72
+ validateRegex(val.source);
73
+ }
74
+ walkQuery(val, deny, depth + 1);
75
+ }
76
+ }
77
+ function sanitizeFilter(filter, options) {
78
+ if (!filter || typeof filter !== "object" || Array.isArray(filter)) {
79
+ return filter || {};
80
+ }
81
+ const deny = getDenySet(options?.filter_operators_deny);
82
+ walkQuery(filter, deny);
83
+ return filter;
84
+ }
85
+ function parseSearchObject(search) {
86
+ const result = {};
87
+ if (!search)
88
+ return result;
89
+ if (typeof search === "string") {
90
+ return result;
91
+ }
92
+ if (typeof search !== "object" || Array.isArray(search)) {
93
+ return result;
94
+ }
95
+ for (const i in search) {
96
+ const val = search[i];
97
+ if (typeof val === "string") {
98
+ validateRegex(val);
99
+ result[i] = new RegExp(val, "i");
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ module.exports = {
105
+ sanitizeFilter,
106
+ parseSearchObject,
107
+ DEFAULT_DENY_OPERATORS: [...DEFAULT_DENY_OPERATORS],
108
+ };
109
+ //# sourceMappingURL=query_sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_sanitize.js","sourceRoot":"","sources":["../../src/libs/query_sanitize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function sanitizeDocument(doc: unknown, stripFields?: string[]): Record<string, unknown>;
2
+ export declare function sanitizeListResult(result: {
3
+ data?: unknown[];
4
+ [key: string]: unknown;
5
+ }, stripFields?: string[]): void;
6
+ export declare function sanitizeResponse(result: unknown, stripFields?: string[]): unknown;
7
+ //# sourceMappingURL=response_sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response_sanitize.d.ts","sourceRoot":"","sources":["../../src/libs/response_sanitize.ts"],"names":[],"mappings":"AAuBA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK9F;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EACpD,WAAW,CAAC,EAAE,MAAM,EAAE,GACpB,IAAI,CAGN;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CASjF"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeDocument = sanitizeDocument;
4
+ exports.sanitizeListResult = sanitizeListResult;
5
+ exports.sanitizeResponse = sanitizeResponse;
6
+ const DEFAULT_STRIP_FIELDS = ["password"];
7
+ function stripFromObject(obj, fields) {
8
+ for (const key of Object.keys(obj)) {
9
+ if (fields.has(key)) {
10
+ delete obj[key];
11
+ }
12
+ else if (obj[key] && typeof obj[key] === "object" && !Array.isArray(obj[key]) && !(obj[key] instanceof Date)) {
13
+ stripFromObject(obj[key], fields);
14
+ }
15
+ }
16
+ }
17
+ function docToPlain(doc) {
18
+ if (!doc || typeof doc !== "object")
19
+ return {};
20
+ if (typeof doc.toObject === "function") {
21
+ return doc.toObject();
22
+ }
23
+ if (typeof doc._doc !== "undefined") {
24
+ return { ...doc._doc };
25
+ }
26
+ return { ...doc };
27
+ }
28
+ function sanitizeDocument(doc, stripFields) {
29
+ const fields = new Set(stripFields ?? DEFAULT_STRIP_FIELDS);
30
+ const plain = docToPlain(doc);
31
+ stripFromObject(plain, fields);
32
+ return plain;
33
+ }
34
+ function sanitizeListResult(result, stripFields) {
35
+ if (!result.data || !Array.isArray(result.data))
36
+ return;
37
+ result.data = result.data.map((row) => sanitizeDocument(row, stripFields));
38
+ }
39
+ function sanitizeResponse(result, stripFields) {
40
+ if (!result || typeof result !== "object")
41
+ return result;
42
+ const r = result;
43
+ if (Array.isArray(r.data)) {
44
+ sanitizeListResult(r, stripFields);
45
+ }
46
+ else if (r.data) {
47
+ r.data = sanitizeDocument(r.data, stripFields);
48
+ }
49
+ return result;
50
+ }
51
+ module.exports = {
52
+ DEFAULT_STRIP_FIELDS,
53
+ sanitizeDocument,
54
+ sanitizeListResult,
55
+ sanitizeResponse,
56
+ };
57
+ //# sourceMappingURL=response_sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response_sanitize.js","sourceRoot":"","sources":["../../src/libs/response_sanitize.ts"],"names":[],"mappings":";;AAuBA,4CAKC;AAED,gDAMC;AAED,4CASC;AA/CD,MAAM,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC;AAE1C,SAAS,eAAe,CAAC,GAA4B,EAAE,MAAmB;IACzE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YAChH,eAAe,CAAC,GAAG,CAAC,GAAG,CAA4B,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC/B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,IAAI,OAAQ,GAAoD,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC1F,OAAQ,GAAmD,CAAC,QAAQ,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,OAAQ,GAA0C,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC7E,OAAO,EAAE,GAAI,GAAyC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,GAAI,GAA+B,EAAE,CAAC;AAChD,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAY,EAAE,WAAsB;IACpE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,oBAAoB,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9B,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAgB,kBAAkB,CACjC,MAAoD,EACpD,WAAsB;IAEtB,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO;IACxD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAe,EAAE,WAAsB;IACvE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IACzD,MAAM,CAAC,GAAG,MAA4B,CAAC;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,kBAAkB,CAAC,CAAwB,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;SAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAClB,CAAuB,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,OAAO,GAAG;IAChB,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;CAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Log full error server-side; return a safe client message for 500s. */
2
+ export declare function safeErrorMessage(err: unknown): string;
3
+ //# sourceMappingURL=safe_error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe_error.d.ts","sourceRoot":"","sources":["../../src/libs/safe_error.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQrD"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeErrorMessage = safeErrorMessage;
4
+ /** Log full error server-side; return a safe client message for 500s. */
5
+ function safeErrorMessage(err) {
6
+ if (err && typeof err === "object" && "message" in err && typeof err.message === "string") {
7
+ const msg = err.message;
8
+ if (msg.length > 0 && msg.length < 200 && !msg.includes(" at ")) {
9
+ return msg;
10
+ }
11
+ }
12
+ return "An internal error occurred";
13
+ }
14
+ //# sourceMappingURL=safe_error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe_error.js","sourceRoot":"","sources":["../../src/libs/safe_error.ts"],"names":[],"mappings":";;AACA,4CAQC;AATD,yEAAyE;AACzE,SAAgB,gBAAgB,CAAC,GAAY;IAC5C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,SAAS,IAAI,GAAG,IAAI,OAAQ,GAAa,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACtG,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,CAAC;QACnC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO,GAAG,CAAC;QACZ,CAAC;IACF,CAAC;IACD,OAAO,4BAA4B,CAAC;AACrC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import mongoose, { type Model } from "mongoose";
2
+ import type { JXPDefinition, JXPSchemaOptions } from "../types/schema-fields";
3
+ declare class JXPSchema extends mongoose.Schema {
4
+ opts: JXPSchemaOptions;
5
+ definition: JXPDefinition;
6
+ constructor(definition: JXPDefinition, opts?: JXPSchemaOptions);
7
+ setPerms(): void;
8
+ generateLinks(): void;
9
+ static Types: typeof mongoose.Schema.Types;
10
+ static model: <T>(name: string, schema?: JXPSchema, collection?: string) => Model<T>;
11
+ }
12
+ export type { JXPSchema };
13
+ export default JXPSchema;
14
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/libs/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAE,KAAK,KAAK,EAAyB,MAAM,UAAU,CAAC;AAKvE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA8B9E,cAAM,SAAU,SAAQ,QAAQ,CAAC,MAAM;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,aAAa,CAAC;gBAEtB,UAAU,EAAE,aAAa,EAAE,IAAI,GAAE,gBAAqB;IAkClE,QAAQ,IAAI,IAAI;IAgBhB,aAAa,IAAI,IAAI;IA2BrB,MAAM,CAAC,KAAK,+BAAyB;IACrC,MAAM,CAAC,KAAK,EAAoC,CAAC,CAAC,EACjD,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,SAAS,EAClB,UAAU,CAAC,EAAE,MAAM,KACf,KAAK,CAAC,CAAC,CAAC,CAAC;CACd;AAED,YAAY,EAAE,SAAS,EAAE,CAAC;AAC1B,eAAe,SAAS,CAAC"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const mongoose_1 = __importDefault(require("mongoose"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const JXPHelper = require("jxp-helper");
9
+ const modeldir = require("./modeldir");
10
+ const load_config_1 = require("./load-config");
11
+ // Set some global types for JS model files using /* global ObjectId Mixed */
12
+ global.ObjectId = mongoose_1.default.Schema.Types.ObjectId;
13
+ global.Mixed = mongoose_1.default.Schema.Types.Mixed;
14
+ function resolveModelDir(dir) {
15
+ if (path_1.default.isAbsolute(dir))
16
+ return dir;
17
+ return path_1.default.resolve(process.cwd(), dir);
18
+ }
19
+ function getModelDir() {
20
+ const fromEnv = (0, load_config_1.getModelDirFromEnv)();
21
+ if (fromEnv)
22
+ return resolveModelDir(fromEnv);
23
+ return modeldir.findModelDir(path_1.default.dirname(process.argv[1] ?? "."));
24
+ }
25
+ const getModelFileFromRef = (ref) => {
26
+ return path_1.default.join(getModelDir(), `${String(ref).toLowerCase()}_model`);
27
+ };
28
+ class JXPSchema extends mongoose_1.default.Schema {
29
+ constructor(definition, opts = {}) {
30
+ opts = Object.assign({
31
+ timestamps: true,
32
+ toJSON: { virtuals: true },
33
+ toObject: { virtuals: true },
34
+ }, opts);
35
+ definition = Object.assign({
36
+ _deleted: { type: Boolean, default: false, index: true },
37
+ _owner_id: { type: global.ObjectId, link: "User", map_to: "_owner", index: true },
38
+ _updated_by_id: { type: global.ObjectId, link: "User", map_to: "_updated_by", index: true },
39
+ }, definition);
40
+ if (!global.jxphelper) {
41
+ const jxp_settings = {};
42
+ if (global.apikey)
43
+ jxp_settings.apikey = global.apikey;
44
+ if (global.server)
45
+ jxp_settings.server = global.server;
46
+ if (jxp_settings.apikey && jxp_settings.server) {
47
+ global.jxphelper = new JXPHelper(jxp_settings);
48
+ }
49
+ }
50
+ super(definition, opts);
51
+ this.opts = opts;
52
+ this.definition = definition;
53
+ this.index({ createdAt: -1 });
54
+ this.index({ updatedAt: -1 });
55
+ this.setPerms();
56
+ this.generateLinks();
57
+ }
58
+ setPerms() {
59
+ // JXP stores permission strings on the schema for runtime auth checks
60
+ this.set("_perms", Object.assign({
61
+ admin: "",
62
+ owner: "",
63
+ user: "",
64
+ all: "",
65
+ }, this.opts.perms));
66
+ }
67
+ generateLinks() {
68
+ const loaded_files = [];
69
+ for (const key of Object.keys(this.definition)) {
70
+ let def = this.definition[key];
71
+ let is_array = false;
72
+ if (Array.isArray(def) && def[0]) {
73
+ def = def[0];
74
+ is_array = true;
75
+ }
76
+ if (!def || typeof def !== "object" || !("link" in def) || !def.link)
77
+ continue;
78
+ const virtual_name = def.map_to || def.virtual || String(def.link).toLowerCase();
79
+ if (!loaded_files.includes(def.link)) {
80
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
81
+ const linked = require(getModelFileFromRef(def.link));
82
+ void (linked.default || linked);
83
+ loaded_files.push(def.link);
84
+ }
85
+ this.virtual(virtual_name, {
86
+ ref: def.link,
87
+ localField: key,
88
+ foreignField: "_id",
89
+ justOne: def.justOne ?? !is_array,
90
+ options: Object.assign({}, def.options),
91
+ });
92
+ }
93
+ }
94
+ static Types = mongoose_1.default.Schema.Types;
95
+ static model = mongoose_1.default.model.bind(mongoose_1.default);
96
+ }
97
+ exports.default = JXPSchema;
98
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/libs/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const getModelFileContents: (model_dir: any) => Promise<unknown>;
2
+ export = getModelFileContents;
3
+ //# sourceMappingURL=schema_description.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_description.d.ts","sourceRoot":"","sources":["../../src/libs/schema_description.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,oBAAoB,GAAI,cAAS,qBAmFtC,CAAA;AAED,SAAS,oBAAoB,CAAC"}