jxp 3.0.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 (219) 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 +91 -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 -34
  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 -131
  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 -222
  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/auth.js +0 -190
  216. package/test/init.js +0 -92
  217. package/test/setup.test.js +0 -62
  218. package/test/test.js +0 -1527
  219. package/test/wstest.js.old +0 -124
package/.env.sample CHANGED
@@ -1,6 +1,31 @@
1
- DB_HOST=localhost
2
- DB_USER=root
3
- DB_PASSWORD=password
4
- DB_NAME=jxp
5
- DB_PORT=27017
6
- NODE_DOCKER_PORT=4001
1
+ # Server
2
+ PORT=4001
3
+ NODE_DOCKER_PORT=4001
4
+ API_URL=http://localhost:4001
5
+
6
+ # MongoDB — use MONGO_CONNECTION_STRING or individual MONGODB_* vars
7
+ MONGO_CONNECTION_STRING=mongodb://127.0.0.1:27017/jxp
8
+ # MONGODB_HOST=127.0.0.1
9
+ # MONGODB_PORT=27017
10
+ # MONGODB_NAME=jxp
11
+ # MONGODB_USER=
12
+ # MONGODB_PASSWORD=
13
+ # MONGODB_AUTH_DB=admin
14
+
15
+ # Auth / tokens
16
+ SHARED_SECRET=change-me
17
+ TOKEN_EXPIRY=86400
18
+ REFRESH_TOKEN_EXPIRY=2678400
19
+
20
+ # Paths
21
+ MODEL_DIR=./dist/models
22
+ LOG_FILE=access.log
23
+
24
+ # Optional
25
+ # APIKEY=
26
+ # DEBUG=false
27
+ # CACHE_ENABLED=false
28
+ # CACHE_TTL=300
29
+ # QUERY_LIMITS_MAX=1000
30
+ # QUERY_LIMITS_DEFAULT=100
31
+ # CORS_ORIGINS=http://localhost:3000,http://localhost:4001
package/README.md CHANGED
@@ -22,21 +22,35 @@ JXP is an opinionated RESTful API framework that lets you make an API just by de
22
22
 
23
23
  npm install -g jxp
24
24
  jxp-setup my-app
25
- cd my-ap
25
+ cd my-app
26
26
  npm start
27
27
 
28
- ## Documentation
29
-
30
- * [Installation](https://jxp.readthedocs.io/en/v2.0.0/installation)
31
- * [Configuration](https://jxp.readthedocs.io/en/v2.0.0/configuration)
32
- * [Authentication](https://jxp.readthedocs.io/en/v2.0.0/authentication)
33
- * [Schemas](https://jxp.readthedocs.io/en/v2.0.0/schemas)
34
- * [Restful API](https://jxp.readthedocs.io/en/v2.0.0/api)
35
- * [Roles and Permissions](https://jxp.readthedocs.io/en/v2.0.0/permissions)
36
- * [Hooks](https://jxp.readthedocs.io/en/v2.0.0/hooks)
37
- * [Special Features](https://jxp.readthedocs.io/en/v2.0.0/special)
38
- * [Changelog](https://jxp.readthedocs.io/en/v2.0.0/changelog)
28
+ Requires **Node.js 22+**.
39
29
 
40
30
  ## Installing from source
41
31
 
42
- `npm i --legacy-peer-deps`
32
+ ```bash
33
+ npm i --legacy-peer-deps
34
+ npm run build # compiles TypeScript (runs on git clone install when src/ is present)
35
+ npm start # sample server at dist/bin/server.js
36
+ ```
37
+
38
+ Requires **Node.js 22+** and MongoDB for the sample server and integration tests.
39
+
40
+ ## TypeScript
41
+
42
+ JXP 4 is implemented in TypeScript. See [docs/typescript.md](docs/typescript.md) for building from source, consuming types in JavaScript apps, and authoring typed models.
43
+
44
+ ## Documentation
45
+
46
+ * [TypeScript / v4 migration](docs/typescript.md)
47
+ * [Installation](https://jxp.readthedocs.io/en/latest/installation/)
48
+ * [Configuration](https://jxp.readthedocs.io/en/latest/configuration/)
49
+ * [Authentication](https://jxp.readthedocs.io/en/latest/authentication/)
50
+ * [Schemas](https://jxp.readthedocs.io/en/latest/schemas/)
51
+ * [Restful API](https://jxp.readthedocs.io/en/latest/api/)
52
+ * [Roles and Permissions](https://jxp.readthedocs.io/en/latest/permissions/)
53
+ * [Hooks](https://jxp.readthedocs.io/en/latest/hooks/)
54
+ * [Special Features](https://jxp.readthedocs.io/en/latest/special/)
55
+ * [Changelog](https://jxp.readthedocs.io/en/latest/changelog/)
56
+ * [Full docs](https://jxp.readthedocs.io/en/latest/)
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=init_db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init_db.d.ts","sourceRoot":"","sources":["../../src/bin/init_db.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ #! /usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const program = require("commander");
5
+ const readline = require("readline-sync");
6
+ const mongoose = require("mongoose");
7
+ const path = require("path");
8
+ const security = require("../libs/security");
9
+ const { getMongoConnectionString, loadEnv } = require("../libs/load-config");
10
+ const schemaModule = require("../libs/schema");
11
+ global.JXPSchema = schemaModule.default || schemaModule;
12
+ loadEnv();
13
+ const modelDir = process.env.MODEL_DIR || path.resolve(process.cwd(), "dist/models");
14
+ const User = require(path.join(modelDir, "user_model"));
15
+ const UserModel = User.default || User;
16
+ const pkg = require("../../package.json");
17
+ program
18
+ .version(pkg.version)
19
+ .usage("[options] [dir]")
20
+ .option("-v, --version", "JXP version")
21
+ .option("-e, --email <user>", "Admin user email")
22
+ .option("-p, --password <password>", "Admin password")
23
+ .option("-u, --username <name>", "Admin user name")
24
+ .parse();
25
+ const opts = program.opts();
26
+ async function main() {
27
+ const email = opts.email || readline.question("Admin user email: ");
28
+ const password = opts.password || readline.question("Admin user password: ");
29
+ const name = opts.username ||
30
+ readline.question("Admin user name (Admin): ", { defaultInput: "Admin" });
31
+ await mongoose.connect(getMongoConnectionString());
32
+ const user = new UserModel();
33
+ user.email = email;
34
+ user.password = security.encPassword(password);
35
+ user.name = name;
36
+ user.admin = true;
37
+ try {
38
+ await user.save();
39
+ console.log("Created admin user", name, "<" + email + ">");
40
+ process.exit(0);
41
+ }
42
+ catch (err) {
43
+ console.log("Error:", err.message);
44
+ process.exit(1);
45
+ }
46
+ }
47
+ main();
48
+ //# sourceMappingURL=init_db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init_db.js","sourceRoot":"","sources":["../../src/bin/init_db.ts"],"names":[],"mappings":";;;AACA,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC7C,MAAM,EAAE,wBAAwB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE7E,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC/C,MAAM,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC;AAExD,OAAO,EAAE,CAAC;AACV,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;AACrF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AACxD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;AAEvC,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,OAAO;KACL,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,KAAK,CAAC,iBAAiB,CAAC;KACxB,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;KAChD,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC;KACrD,MAAM,CAAC,uBAAuB,EAAE,iBAAiB,CAAC;KAClD,KAAK,EAAE,CAAC;AAEV,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;AAE5B,KAAK,UAAU,IAAI;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAC7E,MAAM,IAAI,GACT,IAAI,CAAC,QAAQ;QACb,QAAQ,CAAC,QAAQ,CAAC,2BAA2B,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IAE3E,MAAM,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import "../libs/startup-deprecations";
2
+ declare const server: any;
3
+ export = server;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":"AAUA,OAAO,8BAA8B,CAAC;AAgHtC,QAAA,MAAM,MAAM,KAAiB,CAAC;AAoB9B,SAAS,MAAM,CAAC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /*
3
+ =================
4
+ JXP - Express API
5
+ =================
6
+
7
+ Documentation:
8
+ https://jxp.readthedocs.io/en/latest/
9
+
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ require("../libs/startup-deprecations");
15
+ const path_1 = __importDefault(require("path"));
16
+ const mongoose_1 = __importDefault(require("mongoose"));
17
+ const JXP = require("../libs/jxp");
18
+ const load_config_1 = require("../libs/load-config");
19
+ const startup_1 = require("../libs/startup");
20
+ const package_json_1 = __importDefault(require("../../package.json"));
21
+ const apiconfig = (0, load_config_1.loadJxpConfig)();
22
+ apiconfig.quiet_startup = true;
23
+ apiconfig.callbacks = {
24
+ post: function () { },
25
+ put: function () { },
26
+ delete: function () { },
27
+ };
28
+ apiconfig.pre_hooks = {
29
+ login: (_req, _res, next) => {
30
+ next();
31
+ },
32
+ get: (_req, _res, next) => {
33
+ next();
34
+ },
35
+ getOne: (_req, _res, next) => {
36
+ next();
37
+ },
38
+ post: (_req, _res, next) => {
39
+ next();
40
+ },
41
+ put: (_req, _res, next) => {
42
+ next();
43
+ },
44
+ delete: (_req, _res, next) => {
45
+ next();
46
+ },
47
+ };
48
+ mongoose_1.default.Promise = Promise;
49
+ mongoose_1.default.set("strictQuery", true);
50
+ if (!apiconfig.mongo)
51
+ apiconfig.mongo = {};
52
+ if (!apiconfig.mongo.options)
53
+ apiconfig.mongo.options = {};
54
+ const mongo_options = Object.assign(apiconfig.mongo.options, {
55
+ useNewUrlParser: true,
56
+ useUnifiedTopology: true,
57
+ serverSelectionTimeoutMS: 10000,
58
+ socketTimeoutMS: 45000,
59
+ maxPoolSize: process.env.NODE_ENV === "test" ? 20 : 50,
60
+ minPoolSize: process.env.NODE_ENV === "test" ? 5 : 10,
61
+ maxIdleTimeMS: 30000,
62
+ connectTimeoutMS: 10000,
63
+ heartbeatFrequencyMS: 10000,
64
+ retryWrites: true,
65
+ retryReads: true,
66
+ });
67
+ const connection_string = (0, load_config_1.getMongoConnectionString)();
68
+ const startupCtx = {
69
+ name: package_json_1.default.name,
70
+ version: package_json_1.default.version,
71
+ mongoUri: connection_string,
72
+ accessLog: path_1.default.resolve(apiconfig.log || "access.log"),
73
+ maxPoolSize: mongo_options.maxPoolSize,
74
+ };
75
+ (0, startup_1.printBanner)(startupCtx);
76
+ (0, startup_1.printBooting)(startupCtx);
77
+ mongoose_1.default.connect(connection_string, mongo_options);
78
+ const db = mongoose_1.default.connection;
79
+ let mongoConnectedAt = null;
80
+ let httpUrl = null;
81
+ let readyPrinted = false;
82
+ db.on("error", (err) => {
83
+ console.error("MongoDB connection error:", err);
84
+ if (err.name === "MongoNetworkError") {
85
+ console.error("Network error occurred. Attempting to reconnect...");
86
+ }
87
+ });
88
+ db.once("open", () => {
89
+ mongoConnectedAt = new Date();
90
+ maybePrintReady();
91
+ });
92
+ mongoose_1.default.connection.on("disconnected", () => {
93
+ console.log("Mongoose disconnected");
94
+ setTimeout(() => {
95
+ Promise.resolve(mongoose_1.default.connect(connection_string, mongo_options)).catch((err) => {
96
+ console.error("Failed to reconnect to MongoDB:", err);
97
+ });
98
+ }, 5000);
99
+ });
100
+ mongoose_1.default.connection.on("error", (err) => {
101
+ console.error("Mongoose connection error:", err);
102
+ });
103
+ setInterval(() => {
104
+ const client = mongoose_1.default.connection.getClient?.();
105
+ const pool = client?.topology?.s
106
+ ?.pool?.totalConnectionCount ?? 0;
107
+ const maxPoolSize = mongo_options.maxPoolSize;
108
+ if (pool > 0 && pool > maxPoolSize * 0.8) {
109
+ console.warn(`Connection pool is at ${Math.round((pool / maxPoolSize) * 100)}% capacity`);
110
+ }
111
+ }, 30000);
112
+ const server = JXP(apiconfig);
113
+ let port = process.env.NODE_DOCKER_PORT || process.env.PORT || String(apiconfig.port || 4001);
114
+ if (process.env.NODE_ENV === "test")
115
+ port = "4005";
116
+ server.listen(parseInt(String(port), 10), function () {
117
+ httpUrl = server.url;
118
+ maybePrintReady();
119
+ });
120
+ function maybePrintReady() {
121
+ if (readyPrinted || !mongoConnectedAt || !httpUrl)
122
+ return;
123
+ readyPrinted = true;
124
+ (0, startup_1.printReady)({
125
+ ...startupCtx,
126
+ url: httpUrl,
127
+ mongooseVersion: mongoose_1.default.version,
128
+ mongoConnectedAt,
129
+ });
130
+ }
131
+ module.exports = server;
132
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/bin/setup.ts"],"names":[],"mappings":""}
@@ -0,0 +1,185 @@
1
+ #! /usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const program = require("commander");
8
+ const path = require("path");
9
+ const readline = require('readline-sync');
10
+ const fs = require("fs");
11
+ const crypto_1 = __importDefault(require("crypto"));
12
+ const execSync = require('child_process').execSync;
13
+ const mongoose = require("mongoose");
14
+ const security = require("../libs/security");
15
+ const schemaModule = require("../libs/schema");
16
+ global.JXPSchema = schemaModule.default || schemaModule;
17
+ const userMod = require(path.join(__dirname, "../models/user_model"));
18
+ const User = userMod.default || userMod;
19
+ const pkg = require('../package.json');
20
+ const version = pkg.version;
21
+ program
22
+ .version(version)
23
+ .usage('[options] [dir]')
24
+ .option('-v, --version', 'JXP version')
25
+ .parse(process.argv);
26
+ async function main() {
27
+ try {
28
+ const models = ["apikey", "test", "token", "user", "usergroups", "link", "refreshtoken"];
29
+ const destination_path = program.args.shift() || '.';
30
+ // Get some defaults
31
+ let default_author_name = "Me";
32
+ let default_author_email = "me@example.com";
33
+ let default_app_description = "A JXP installation";
34
+ let default_license = "MIT";
35
+ let default_version = "0.0.1";
36
+ try {
37
+ default_author_name = execSync('git config --global user.name', { encoding: 'utf-8' }).trim();
38
+ default_author_email = execSync('git config --global user.email', { encoding: 'utf-8' }).trim();
39
+ }
40
+ catch (err) {
41
+ // Nothing to see here
42
+ }
43
+ let default_app_author = `${default_author_name} <${default_author_email}>`;
44
+ // Ask the basics
45
+ let default_app_name = path.basename(path.resolve(destination_path));
46
+ const app_name = readline.question(`App name (${default_app_name}): `, { defaultInput: default_app_name });
47
+ const app_description = readline.question(`App description (${default_app_description}): `, { defaultInput: default_app_description });
48
+ const app_license = readline.question(`Licence (${default_license}): `, { defaultInput: default_license });
49
+ const app_author = readline.question(`Author (${default_app_author}): `, { defaultInput: default_app_author });
50
+ const app_version = readline.question(`Version (${default_version}): `, { defaultInput: default_version });
51
+ var opts = {};
52
+ // Config setup
53
+ // opts.email = readline.question("Admin email address: ");
54
+ // opts.password = readline.question("Admin password: ", { hideEchoBack: true });
55
+ opts.port = readline.question("Port (2001): ", { defaultInput: "2001" });
56
+ opts.url = readline.question("URL (http://localhost:" + opts.port + "): ", { defaultInput: "http://localhost:" + opts.port });
57
+ const default_connection_string = `mongodb://localhost/${app_name}?retryWrites=true&w=majority`;
58
+ opts.connection_string = readline.question(`Mongo connection string (${default_connection_string}): `, { defaultInput: default_connection_string });
59
+ const email = readline.question(`Admin user email (${default_author_email}): `);
60
+ const name = readline.question(`Admin user name (${default_author_name}): `, { defaultInput: "Admin" });
61
+ const random_password = crypto_1.default.randomBytes(12).toString('base64');
62
+ const password = readline.question(`Admin user password (${random_password}): `, { hideEchoBack: true, defaultInput: random_password });
63
+ opts.shared_secret = crypto_1.default.randomBytes(20).toString('hex');
64
+ const package_data = {
65
+ "name": app_name,
66
+ "version": app_version,
67
+ "description": app_description,
68
+ "main": "bin/server.js",
69
+ "scripts": {
70
+ "test": "echo \"Error: no test specified\" && exit 1",
71
+ "start": "node bin/server.js"
72
+ },
73
+ "dependencies": {
74
+ "jxp": "^4.0.0",
75
+ "dotenv": "^16.4.7",
76
+ "mongoose": "6.13.9"
77
+ },
78
+ "author": app_author,
79
+ "license": app_license
80
+ };
81
+ await fs.promises.mkdir(destination_path, { recursive: true, mode: 0o755 });
82
+ write(path.join(destination_path, "package.json"), JSON.stringify(package_data, null, "\t"));
83
+ await mkdir(path.join(destination_path, "bin"));
84
+ await mkdir(path.join(destination_path, "models"));
85
+ await mkdir(path.join(destination_path, "logs"));
86
+ await cp_replace("../../templates/app.env.sample", path.join(destination_path, ".env"), opts, "{", "}");
87
+ await cp("../../templates/app-server.js", path.join(destination_path, "bin/server.js"));
88
+ for (let model of models) {
89
+ await cp("../models/" + model + "_model.js", path.join(destination_path, "models/" + model + "_model.js"));
90
+ }
91
+ console.log();
92
+ console.log("Installing dependencies...");
93
+ console.log();
94
+ execSync(`cd ${destination_path} && npm install`);
95
+ console.log();
96
+ console.log("Setting up your admin user...");
97
+ console.log();
98
+ try {
99
+ process.env.MONGO_CONNECTION_STRING = opts.connection_string;
100
+ mongoose.connect(opts.connection_string, function (err) {
101
+ if (err) {
102
+ throw (err);
103
+ }
104
+ }, {
105
+ db: {
106
+ safe: true
107
+ },
108
+ });
109
+ }
110
+ catch (err) {
111
+ console.log("WARNING: We had a problem talking to the database");
112
+ console.error(err);
113
+ return process.exit(1);
114
+ }
115
+ var user = new User();
116
+ user.email = email;
117
+ user.password = security.encPassword(password);
118
+ user.name = name;
119
+ user.admin = true;
120
+ user.save((err) => {
121
+ if (err) {
122
+ console.log("Error saving user");
123
+ console.error(err.message);
124
+ return process.exit(1);
125
+ }
126
+ else {
127
+ console.log("Created admin user", name, "<" + email + ">");
128
+ }
129
+ });
130
+ process.chdir(destination_path);
131
+ console.log("Congratulations! Your JXP server is ready to go. Happy API'ing...");
132
+ console.log("Next steps:");
133
+ console.log("0. Change to your directory");
134
+ console.log(` cd ${destination_path}`);
135
+ console.log("1. Start your server");
136
+ console.log(" npm start");
137
+ console.log("2. Connect to your server");
138
+ console.log(` ${opts.url}`);
139
+ return process.exit(0);
140
+ }
141
+ catch (err) {
142
+ console.log("Error:", err.message);
143
+ return process.exit(1);
144
+ }
145
+ }
146
+ /**
147
+ * Copy from to replacing text as we go
148
+ *
149
+ */
150
+ function cp_replace(from, to, opts, startEnclosure = "", endEnclosure = "") {
151
+ startEnclosure = startEnclosure || "";
152
+ endEnclosure = endEnclosure || "";
153
+ from = path.join(__dirname, from);
154
+ var s = fs.readFileSync(from, "utf-8");
155
+ for (var i in opts) {
156
+ console.log(startEnclosure + i + endEnclosure, opts[i]);
157
+ s = s.replace(startEnclosure + i + endEnclosure, opts[i]);
158
+ }
159
+ write(to, s);
160
+ }
161
+ /**
162
+ * Copy from to
163
+ *
164
+ * @param {String} from
165
+ * @param {String} to
166
+ */
167
+ function cp(from, to) {
168
+ from = path.join(__dirname, from);
169
+ write(to, fs.readFileSync(from, 'utf-8'));
170
+ }
171
+ function write(filePath, str, mode) {
172
+ fs.writeFileSync(filePath, str, mode !== undefined ? { mode } : undefined);
173
+ console.log(' \x1b[36mcreate\x1b[0m : ' + filePath);
174
+ }
175
+ /**
176
+ * Mkdir -p.
177
+ *
178
+ * @param {String} path
179
+ * @return {Promise}
180
+ */
181
+ function mkdir(path) {
182
+ return fs.promises.mkdir(path, { recursive: true, mode: 0o755 });
183
+ }
184
+ main();
185
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/bin/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type JXPSchemaClass from "./libs/schema";
2
+ import type { Schema } from "mongoose";
3
+ import type JXPHelper from "jxp-helper";
4
+ declare global {
5
+ var JXPSchema: typeof JXPSchemaClass;
6
+ var ObjectId: typeof Schema.Types.ObjectId;
7
+ var Mixed: typeof Schema.Types.Mixed;
8
+ var jxphelper: InstanceType<typeof JXPHelper> | undefined;
9
+ var apikey: string | undefined;
10
+ var server: string | undefined;
11
+ var model_dir: string | undefined;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=globals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AAExC,OAAO,CAAC,MAAM,CAAC;IAEd,IAAI,SAAS,EAAE,OAAO,cAAc,CAAC;IAErC,IAAI,QAAQ,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAE3C,IAAI,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IAErC,IAAI,SAAS,EAAE,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,SAAS,CAAC;IAE1D,IAAI,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B,IAAI,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B,IAAI,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,OAAO,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=globals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export declare function validatePipeline(pipeline: unknown[], options?: {
2
+ aggregate_stages_allow?: string[];
3
+ isAdmin?: boolean;
4
+ }): void;
5
+ //# sourceMappingURL=aggregate_guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate_guard.d.ts","sourceRoot":"","sources":["../../src/libs/aggregate_guard.ts"],"names":[],"mappings":"AAmCA,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,IAAI,CAkBN"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePipeline = validatePipeline;
4
+ const errors = require("restify-errors");
5
+ const DEFAULT_ALLOWED_STAGES = new Set([
6
+ "$match",
7
+ "$group",
8
+ "$lookup",
9
+ "$project",
10
+ "$sort",
11
+ "$limit",
12
+ "$skip",
13
+ "$unwind",
14
+ "$addFields",
15
+ "$set",
16
+ "$count",
17
+ "$facet",
18
+ "$bucket",
19
+ "$bucketAuto",
20
+ "$sample",
21
+ "$replaceRoot",
22
+ "$replaceWith",
23
+ "$redact",
24
+ ]);
25
+ const ADMIN_ONLY_STAGES = new Set(["$out", "$merge", "$function"]);
26
+ function getAllowedStages(custom) {
27
+ if (!custom || !custom.length)
28
+ return DEFAULT_ALLOWED_STAGES;
29
+ return new Set(custom);
30
+ }
31
+ function stageKeys(stage) {
32
+ if (!stage || typeof stage !== "object" || Array.isArray(stage))
33
+ return [];
34
+ return Object.keys(stage).filter((k) => k.startsWith("$"));
35
+ }
36
+ function validatePipeline(pipeline, options) {
37
+ if (!Array.isArray(pipeline)) {
38
+ throw new errors.BadRequestError("Aggregation pipeline must be an array");
39
+ }
40
+ const allowed = getAllowedStages(options?.aggregate_stages_allow);
41
+ const isAdmin = options?.isAdmin === true;
42
+ for (const stage of pipeline) {
43
+ const keys = stageKeys(stage);
44
+ for (const key of keys) {
45
+ if (ADMIN_ONLY_STAGES.has(key) && !isAdmin) {
46
+ throw new errors.ForbiddenError(`Aggregation stage ${key} requires admin`);
47
+ }
48
+ if (!allowed.has(key) && !ADMIN_ONLY_STAGES.has(key)) {
49
+ throw new errors.BadRequestError(`Aggregation stage ${key} is not allowed`);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ module.exports = {
55
+ validatePipeline,
56
+ DEFAULT_ALLOWED_STAGES: [...DEFAULT_ALLOWED_STAGES],
57
+ };
58
+ //# sourceMappingURL=aggregate_guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate_guard.js","sourceRoot":"","sources":["../../src/libs/aggregate_guard.ts"],"names":[],"mappings":";;AAmCA,4CAqBC;AAxDD,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEzC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACtC,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,UAAU;IACV,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,aAAa;IACb,SAAS;IACT,cAAc;IACd,cAAc;IACd,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAEnE,SAAS,gBAAgB,CAAC,MAAiB;IAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,sBAAsB,CAAC;IAC7D,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAChC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,OAAO,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,SAAgB,gBAAgB,CAC/B,QAAmB,EACnB,OAAkE;IAElE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,uCAAuC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE1C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,qBAAqB,GAAG,iBAAiB,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,CAAC,CAAC;YAC7E,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,OAAO,GAAG;IAChB,gBAAgB;IAChB,sBAAsB,EAAE,CAAC,GAAG,sBAAsB,CAAC;CACnD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function validateBulkOps(ops: unknown[], options?: {
2
+ bulk_operations_allow?: string[];
3
+ isAdmin?: boolean;
4
+ }): void;
5
+ //# sourceMappingURL=bulkwrite_guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulkwrite_guard.d.ts","sourceRoot":"","sources":["../../src/libs/bulkwrite_guard.ts"],"names":[],"mappings":"AAgBA,wBAAgB,eAAe,CAC9B,GAAG,EAAE,OAAO,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/D,IAAI,CAuBN"}