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
@@ -1,4 +1,64 @@
1
1
  extends layout
2
2
 
3
- block content
4
- include:markdown-it ../docs/index.md
3
+ block content
4
+ .docs-hero
5
+ h1= name
6
+ p.lead
7
+ | REST API powered by
8
+ a(href="https://jxp.readthedocs.io" target="_blank" rel="noopener") JXP
9
+ | — define Mongoose schemas, get a full API with auth, permissions, and smart queries.
10
+ .d-flex.flex-wrap.gap-2.mt-3
11
+ if first_guide_url
12
+ a.btn.btn-primary(href=first_guide_url) Get started
13
+ a.btn.btn-outline-primary(href="/docs/api") Browse API
14
+ a.btn.btn-outline-secondary(href="/docs/md/api.md") REST reference
15
+
16
+ .row.g-4.mb-4
17
+ .col-md-6
18
+ .card.h-100
19
+ .card-header.fw-semibold Quick start
20
+ .card-body
21
+ p.mb-2 Authenticate with an API key header (optional for exploring docs; required for live calls):
22
+ pre.mb-3
23
+ code.
24
+ curl -H "X-API-Key: YOUR_KEY" \
25
+ "#{base_url}/api/MODEL?limit=5"
26
+ p.mb-0.small.text-muted
27
+ | Set your key in the top bar to use
28
+ strong Try it
29
+ | panels on API resource pages. Keys are stored in the browser only when “Remember” is checked.
30
+ .col-md-6
31
+ .card.h-100
32
+ .card-header.fw-semibold API at a glance
33
+ .card-body
34
+ p.mb-2
35
+ strong= model_list.length
36
+ | resource#{model_list.length !== 1 ? 's' : ''} registered
37
+ if model_list.length
38
+ .d-flex.flex-wrap.gap-1
39
+ each m in model_list.slice(0, 12)
40
+ a.badge.text-bg-light.text-decoration-none(href="/docs/model/" + m)= m
41
+ if model_list.length > 12
42
+ a.badge.text-bg-secondary.text-decoration-none(href="/docs/api") +#{model_list.length - 12} more
43
+ else
44
+ p.text-muted.mb-0 No models loaded yet.
45
+
46
+ h2.h4.mb-3 Features
47
+ .row.g-3.mb-4
48
+ each feature in features
49
+ .col-md-6.col-lg-4
50
+ .card.feature-card
51
+ .card-body
52
+ h3.h6.card-title= feature.title
53
+ p.card-text.small.text-muted.mb-0= feature.description
54
+
55
+ h2.h4.mb-3 Links
56
+ ul.list-unstyled
57
+ li.mb-1
58
+ a(href="https://www.npmjs.com/package/jxp" target="_blank" rel="noopener") JXP on NPM
59
+ li.mb-1
60
+ a(href="https://github.com/WorkSpaceMan/jxp" target="_blank" rel="noopener") GitHub
61
+ li.mb-1
62
+ a(href="https://www.npmjs.com/package/jxp-helper" target="_blank" rel="noopener") jxp-helper client
63
+ li
64
+ a(href="https://jxp.readthedocs.io" target="_blank" rel="noopener") Read the Docs
@@ -1,12 +1,18 @@
1
1
  doctype html
2
- html
3
- head
4
- title= title
5
- link(rel='stylesheet', href='https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css')
6
- body
7
- include navbar
8
- .container
9
- block content
10
- script(src="https://code.jquery.com/jquery-3.5.1.min.js")
11
- script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js")
12
- block javascripts
2
+ html(lang="en")
3
+ head
4
+ meta(charset="utf-8")
5
+ meta(name="viewport" content="width=device-width, initial-scale=1")
6
+ title= title
7
+ link(rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" crossorigin="anonymous")
8
+ link(rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css")
9
+ link(rel="stylesheet" href="/docs/assets/docs.css")
10
+ body.docs-body
11
+ include navbar
12
+ .docs-shell
13
+ include sidebar
14
+ main.docs-main
15
+ block content
16
+ script(src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous")
17
+ script(src="/docs/assets/api-console.js" defer)
18
+ block javascripts
package/templates/md.pug CHANGED
@@ -1,5 +1,5 @@
1
1
  extends layout
2
2
 
3
3
  block content
4
+ article.docs-content
4
5
  != md_contents
5
-
@@ -1,75 +1,124 @@
1
1
  extends layout
2
2
 
3
3
  block content
4
- h1= "Model " + model.collection.name
5
- hr
6
- h2 Permissions
7
- if perms
8
- table.table
9
- thead
10
- tr
11
- th User Group
12
- th Create?
13
- th Read?
14
- th Update?
15
- th Delete?
16
- tbody
17
- each value, key in perms
18
- tr
19
- td= key
20
- td= value.includes("c") ? "x" : ""
21
- td= value.includes("r") ? "x" : ""
22
- td= value.includes("u") ? "x" : ""
23
- td= value.includes("d") ? "x" : ""
24
- else
25
- .alert.alert-warning No permissions defined for this model, it will not be accessible through the API
4
+ nav.mb-3(aria-label="breadcrumb")
5
+ ol.breadcrumb
6
+ li.breadcrumb-item
7
+ a(href="/docs/api") API
8
+ li.breadcrumb-item.active(aria-current="page")= model_slug
26
9
 
27
- hr
28
- h2 Fields
29
- table.table
10
+ h1.mb-1= model_slug
11
+ p.text-muted
12
+ | Collection:
13
+ code= collection_name
14
+ | ·
15
+ a(href="/docs/md/api.md") Query & filter docs
16
+
17
+ h2.h4.mt-4.mb-3 Endpoints
18
+ p.small.text-muted.mb-3
19
+ | Optional
20
+ code X-API-Key
21
+ | in the top bar.
22
+ span.text-warning Keys in the browser are for development only.
23
+
24
+ .accordion#apiEndpointsAccordion
25
+ each endpoint, idx in endpoints
26
+ .accordion-item
27
+ h2.accordion-header(id="heading-" + idx)
28
+ button.accordion-button(class=(idx === 0 ? '' : 'collapsed') type="button" data-bs-toggle="collapse" data-bs-target="#collapse-" + idx aria-expanded=(idx === 0 ? 'true' : 'false') aria-controls="collapse-" + idx)
29
+ span.badge.method-badge.me-2(class='method-' + endpoint.method.toLowerCase())= endpoint.method
30
+ span.endpoint-path= endpoint.path
31
+ .accordion-collapse.collapse(class=(idx === 0 ? 'show' : '') id="collapse-" + idx aria-labelledby="heading-" + idx data-bs-parent="#apiEndpointsAccordion")
32
+ .accordion-body
33
+ p.mb-2= endpoint.description
34
+ if endpoint.queryHint
35
+ p.small.text-muted= endpoint.queryHint
36
+ .api-try-panel(data-method=endpoint.method data-default-path=endpoint.path)
37
+ .mb-2
38
+ label.form-label.small.fw-semibold Request URL
39
+ .input-group.input-group-sm
40
+ span.input-group-text= endpoint.method
41
+ input.form-control.api-path-input(type="text" value=endpoint.path)
42
+ if endpoint.hasBody
43
+ .mb-2
44
+ label.form-label.small.fw-semibold JSON body
45
+ textarea.form-control.api-body-input.font-monospace(rows="4" placeholder='{"field": "value"}') {}
46
+ button.btn.btn-primary.btn-sm.api-send-btn(type="button")
47
+ i.bi.bi-play-fill.me-1
48
+ | Send request
49
+ .api-response.empty(role="status") Response will appear here…
50
+ .api-response-meta
51
+
52
+ hr.my-4
53
+
54
+ h2.h4 Permissions
55
+ if perms
56
+ .table-responsive
57
+ table.table.table-striped.table-sm
30
58
  thead
31
- tr
32
- th Name
33
- th Type
34
- th Link
35
- th Maps To
36
- th Default
37
- th Indexed?
38
- th Unique?
39
- th Required?
59
+ tr
60
+ th User Group
61
+ th Create
62
+ th Read
63
+ th Update
64
+ th Delete
40
65
  tbody
41
- each fieldname in fields
42
- - let field = safeFields[fieldname]
43
- if (field.path)
44
- tr
45
- td= field.path
46
- td
47
- if field.arrayType
48
- | Array of #{field.arrayType}
49
- else
50
- = field.instance
51
- td= field.options.link
52
- td= field.options.map_to
53
- td= field.defaultValue
54
- td= (field.options.index) ? "x" : ""
55
- td= (field.options.unique) ? "x" : ""
56
- td= field.isRequired ? "x" : ""
57
- hr
58
- h2 Field Details
59
- each fieldname in fields
60
- - let field = safeFields[fieldname]
61
- if field
62
- .field-details
63
- h3= field.path
64
- pre.pre= JSON.stringify(field, null, 2)
65
- if field.schema
66
- h4 Nested Schema
67
- ul
68
- each nestedField in field.schema
69
- li #{nestedField.path}: #{nestedField.type}
70
- if field.validators && field.validators.length
71
- h4 Validators
72
- ul
73
- each validator in field.validators
74
- li #{validator.type}: #{validator.message}
66
+ each value, key in perms
67
+ tr
68
+ td= key
69
+ td= value.includes("c") ? "✓" : ""
70
+ td= value.includes("r") ? "✓" : ""
71
+ td= value.includes("u") ? "✓" : ""
72
+ td= value.includes("d") ? "✓" : ""
73
+ else
74
+ .alert.alert-warning No permissions defined — this resource may not be accessible via the API.
75
+
76
+ h2.h4.mt-4 Fields
77
+ .table-responsive
78
+ table.table.table-striped.table-sm
79
+ thead
80
+ tr
81
+ th Name
82
+ th Type
83
+ th Link
84
+ th Maps To
85
+ th Default
86
+ th Indexed
87
+ th Unique
88
+ th Required
89
+ tbody
90
+ each fieldname in fields
91
+ - let field = safeFields[fieldname]
92
+ if field && field.path
93
+ tr
94
+ td
95
+ code= field.path
96
+ td
97
+ if field.arrayType
98
+ span.badge.text-bg-info Array of #{field.arrayType}
99
+ else
100
+ span.badge.text-bg-light.text-dark= field.instance
101
+ td= field.options.link || ''
102
+ td= field.options.map_to || ''
103
+ td.small= field.defaultValue != null ? field.defaultValue : ''
104
+ td= field.options.index ? "✓" : ""
105
+ td= field.options.unique ? "✓" : ""
106
+ td= field.isRequired ? "✓" : ""
75
107
 
108
+ h2.h4.mt-4 Field details
109
+ each fieldname in fields
110
+ - let field = safeFields[fieldname]
111
+ if field
112
+ .field-details.mb-3
113
+ h3.h6= field.path
114
+ pre.pre.small.bg-light.p-2.rounded= JSON.stringify(field, null, 2)
115
+ if field.schema
116
+ h4.h6 Nested schema
117
+ ul.small
118
+ each nestedField in field.schema
119
+ li #{nestedField.path}: #{nestedField.type}
120
+ if field.validators && field.validators.length
121
+ h4.h6 Validators
122
+ ul.small
123
+ each validator in field.validators
124
+ li #{validator.type}: #{validator.message}
@@ -1,21 +1,14 @@
1
- nav.navbar.navbar-expand-lg.navbar-light
2
- a.navbar-brand(href="/")
3
- h1= name
4
- button.navbar-toggler(type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation")
5
- span.navbar-toggler-icon
6
- #navbarSupportedContent.collapse.navbar-collapse
7
- ul.navbar-nav.mr-auto
8
- li.nav-item.dropdown(class=models)
9
- a#navbarDropdown.nav-link.dropdown-toggle(href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false") Model Reference
10
- .dropdown-menu(aria-labelledby="navbarDropdown")
11
- each model_name in model_list
12
- a.dropdown-item.btn(href="/docs/model/" + model_name)= model_name
13
- li.nav-item.dropdown(class=documentation)
14
- a#navbarDropdown.nav-link.dropdown-toggle(href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false") Guides
15
- .dropdown-menu(aria-labelledby="navbarDropdown")
16
- each nav of guide_nav
17
- a.dropdown-item.btn(href="/docs/md/" + Object.values(nav)[0])= Object.keys(nav)[0]
18
- = "v" + version
19
- //- form.form-inline.my-2.my-lg-0(method="GET" action="/search")
20
- //- input.form-control.mr-sm-2(name="query" type="search" placeholder="Search" aria-label="Search" value=query)
21
- //- button.btn.btn-outline-success.my-2.my-sm-0(type="submit") Search
1
+ header.docs-topbar.navbar.navbar-expand-lg.sticky-top
2
+ .container-fluid.px-3
3
+ button.btn.btn-outline-secondary.btn-sm.d-lg-none.me-2(type="button" data-bs-toggle="offcanvas" data-bs-target="#docsSidebarOffcanvas" aria-controls="docsSidebarOffcanvas" aria-label="Open navigation")
4
+ i.bi.bi-list
5
+ a.docs-brand.navbar-brand.mb-0(href="/")= name
6
+ span.badge.bg-secondary.ms-2.align-self-center v#{version}
7
+ .ms-auto.d-flex.align-items-center.gap-2.flex-wrap
8
+ .docs-api-key-wrap
9
+ label.visually-hidden(for="docs-api-key") API Key
10
+ input#docs-api-key.form-control.form-control-sm(type="password" placeholder="X-API-Key (optional)" autocomplete="off")
11
+ .form-check.form-check-inline.mb-0.docs-security-note
12
+ input#docs-remember-key.form-check-input(type="checkbox")
13
+ label.form-check-label(for="docs-remember-key") Remember
14
+ span.docs-security-note.text-muted.d-none.d-md-inline Dev only
@@ -0,0 +1,30 @@
1
+ nav.docs-sidebar#docsSidebarDesktop(aria-label="Documentation navigation")
2
+ .docs-sidebar-section
3
+ .docs-sidebar-title Guides
4
+ each nav in guide_nav
5
+ - const label = Object.keys(nav)[0]
6
+ - const file = Object.values(nav)[0]
7
+ a.docs-nav-link(href="/docs/md/" + file class=(active_guide === file ? 'active' : ''))= label
8
+ .docs-sidebar-section
9
+ .docs-sidebar-title API
10
+ a.docs-nav-link(href="/docs/api" class=(active_section === 'api' && !active_model ? 'active' : '')) Overview
11
+ each model_name in model_list
12
+ a.docs-nav-link(href="/docs/model/" + model_name class=(active_model === model_name ? 'active' : ''))= model_name
13
+
14
+ //- Mobile offcanvas (same links)
15
+ .offcanvas.offcanvas-start#docsSidebarOffcanvas(tabindex="-1" aria-labelledby="docsSidebarOffcanvasLabel")
16
+ .offcanvas-header
17
+ h5.offcanvas-title#docsSidebarOffcanvasLabel Navigation
18
+ button.btn-close(type="button" data-bs-dismiss="offcanvas" aria-label="Close")
19
+ .offcanvas-body.p-0
20
+ .docs-sidebar-section
21
+ .docs-sidebar-title Guides
22
+ each nav in guide_nav
23
+ - const label = Object.keys(nav)[0]
24
+ - const file = Object.values(nav)[0]
25
+ a.docs-nav-link(href="/docs/md/" + file class=(active_guide === file ? 'active' : ''))= label
26
+ .docs-sidebar-section
27
+ .docs-sidebar-title API
28
+ a.docs-nav-link(href="/docs/api" class=(active_section === 'api' && !active_model ? 'active' : '')) Overview
29
+ each model_name in model_list
30
+ a.docs-nav-link(href="/docs/model/" + model_name class=(active_model === model_name ? 'active' : ''))= model_name
package/.env DELETED
@@ -1,9 +0,0 @@
1
- MONGODB_HOST=127.0.0.1
2
- MONGODB_PORT=27017
3
- MONGODB_NAME=dev
4
- MONGODB_AUTH_DB=admin
5
- MONGODB_USER=
6
- MONGODB_PASS=
7
-
8
- NODE_LOCAL_PORT=4001
9
- NODE_DOCKER_PORT=4001
package/.eslintrc.json DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "env": {
3
- "browser": true,
4
- "commonjs": true,
5
- "es6": true,
6
- "node": true
7
- },
8
- "extends": "eslint:recommended",
9
- "globals": {
10
- "Atomics": "readonly",
11
- "SharedArrayBuffer": "readonly"
12
- },
13
- "parserOptions": {
14
- "sourceType": "module",
15
- "ecmaVersion": 2018
16
- },
17
- "rules": {
18
- "no-console": "off"
19
- }
20
- }
package/.jshintrc DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "node": true,
3
- "esversion": 6
4
- }
@@ -1,34 +0,0 @@
1
- {
2
- // Use IntelliSense to learn about possible attributes.
3
- // Hover to view descriptions of existing attributes.
4
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
- "version": "0.2.0",
6
- "configurations": [
7
- {
8
- "type": "node",
9
- "request": "launch",
10
- "name": "Launch Program",
11
- "program": "${workspaceFolder}/bin/server.js"
12
- },
13
- {
14
- "type": "node",
15
- "request": "launch",
16
- "name": "Mocha Tests",
17
- "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
18
- "args": [
19
- "-u",
20
- "tdd",
21
- "--timeout",
22
- "30000",
23
- "--colors",
24
- "--exit",
25
- "--bail",
26
- "${workspaceFolder}/test"
27
- ],
28
- "internalConsoleOptions": "openOnSessionStart",
29
- "env": {
30
- "NODE_ENV": "test"
31
- }
32
- }
33
- ]
34
- }
@@ -1,3 +0,0 @@
1
- {
2
- "restructuredtext.confPath": "${workspaceFolder}/docs"
3
- }
package/Dockerfile DELETED
@@ -1,7 +0,0 @@
1
- FROM node:17
2
-
3
- WORKDIR /jxp
4
- COPY package.json .
5
- RUN yarn install
6
- COPY . .
7
- CMD npm start
package/bin/init_db.js DELETED
@@ -1,54 +0,0 @@
1
- #! /usr/bin/env node
2
- var program = require("commander");
3
- var readline = require('readline-sync');
4
- var mongoose = require("mongoose");
5
- var security = require("../libs/security");
6
- var User = require("../models/user_model");
7
-
8
- var pkg = require('../package.json');
9
-
10
- var version = pkg.version;
11
-
12
- program
13
- .version(version)
14
- .usage('[options] [dir]')
15
- .option('-v, --version', 'JXP version')
16
- .option("-c, --config <config.js>", "Use config file")
17
- .option("-e, --email <user>", "Admin user email")
18
- .option("-p, --password <password>", "Admin password")
19
- .option("-u, --username <name>", "Admin user name")
20
- .parse(process.argv);
21
-
22
- function main() {
23
- var config = require("config");
24
- var email = program.email || readline.question("Admin user email: ");
25
- var password = program.password || readline.question("Admin user password: ");
26
- var name = program.username || readline.question("Admin user name (Admin): ", { defaultInput: "Admin" });
27
- config.mongo = config.mongo || { server: "localhost", db: "jxp" };
28
- //DB connection
29
- mongoose.connect('mongodb://' + config.mongo.server + '/' + config.mongo.db, function(err) {
30
- if (err) {
31
- console.log("Database connection error", err);
32
- }
33
- }, {
34
- db: {
35
- safe:true
36
- },
37
- }); // connect to our database
38
- var user = new User();
39
- user.email = email;
40
- user.password = security.encPassword(password);
41
- user.name = name;
42
- user.admin = true;
43
- user.save((err) => {
44
- if (err) {
45
- console.log("Error:", err.message);
46
- return process.exit(1);
47
- } else {
48
- console.log("Created admin user", name, "<" + email + ">");
49
- return process.exit(0);
50
- }
51
- });
52
- }
53
-
54
- main();
package/bin/server.js DELETED
@@ -1,131 +0,0 @@
1
- /*
2
- =================
3
- JXP - Express API
4
- =================
5
-
6
- Documentation:
7
- https://jxp.readthedocs.io/en/latest/
8
-
9
- */
10
-
11
- const mongoose = require("mongoose");
12
- const JXP = require("../libs/jxp");
13
- const config = require("config");
14
- require("dotenv").config();
15
- const pkg = require("../package.json");
16
-
17
- config.callbacks = {
18
- // Examples:
19
- // post: function(modelname, item, user) {
20
- // console.log("Post callback");
21
- // },
22
- // put: function(modelname, item, user) {
23
- // console.log("Put callback");
24
- // },
25
- // delete: function(modelname, item, user, opts) {
26
- // console.log("Delete callback");
27
- // }
28
-
29
- post: function () { },
30
- put: function () { },
31
- delete: function () { }
32
- };
33
-
34
- config.pre_hooks = {
35
- login: (req, res, next) => {
36
- next();
37
- },
38
- get: (req, res, next) => {
39
- next();
40
- },
41
- getOne: (req, res, next) => {
42
- next();
43
- },
44
- post: (req, res, next) => {
45
- next();
46
- },
47
- put: (req, res, next) => {
48
- next();
49
- },
50
- delete: (req, res, next) => {
51
- next();
52
- },
53
- };
54
-
55
- // ES6 promises
56
- mongoose.Promise = Promise;
57
- if (!config.mongo) config.mongo = {};
58
- if (!config.mongo.options) config.mongo.options = {};
59
- const mongo_options = Object.assign(config.mongo.options, {
60
- useNewUrlParser: true,
61
- useUnifiedTopology: true,
62
- serverSelectionTimeoutMS: 10000,
63
- socketTimeoutMS: 45000,
64
- maxPoolSize: process.env.NODE_ENV === 'test' ? 20 : 50,
65
- minPoolSize: process.env.NODE_ENV === 'test' ? 5 : 10,
66
- maxIdleTimeMS: 30000,
67
- connectTimeoutMS: 10000,
68
- heartbeatFrequencyMS: 10000,
69
- retryWrites: true,
70
- retryReads: true
71
- });
72
-
73
- const connection_string = require("../libs/connection_string");
74
- console.log(`Connecting to ${connection_string}`);
75
- mongoose.connect(connection_string, mongo_options);
76
-
77
- const db = mongoose.connection;
78
-
79
- // mongodb error
80
- db.on('error', (err) => {
81
- console.error('MongoDB connection error:', err);
82
- if (err.name === 'MongoNetworkError') {
83
- // Handle network errors
84
- console.error('Network error occurred. Attempting to reconnect...');
85
- }
86
- });
87
-
88
- // mongodb connection open
89
- db.once('open', () => {
90
- console.log(`Connected to Mongo at: ${new Date()}`);
91
- console.log('Connection pool size:', mongoose.connection.base.connections.length);
92
- });
93
-
94
- mongoose.connection.on('connected', () => {
95
- console.log('Mongoose connected');
96
- console.log('Connection pool size:', mongoose.connection.base.connections.length);
97
- });
98
-
99
- mongoose.connection.on('disconnected', () => {
100
- console.log('Mongoose disconnected');
101
- // Attempt to reconnect after a delay
102
- setTimeout(() => {
103
- mongoose.connect(connection_string, mongo_options).catch(err => {
104
- console.error('Failed to reconnect to MongoDB:', err);
105
- });
106
- }, 5000);
107
- });
108
-
109
- mongoose.connection.on('error', (err) => {
110
- console.error('Mongoose connection error:', err);
111
- });
112
-
113
- // Monitor connection pool
114
- setInterval(() => {
115
- const poolSize = mongoose.connection.base.connections.length;
116
- const maxPoolSize = mongo_options.maxPoolSize;
117
- if (poolSize > maxPoolSize * 0.8) {
118
- console.warn(`Connection pool is at ${Math.round((poolSize / maxPoolSize) * 100)}% capacity`);
119
- }
120
- }, 30000);
121
-
122
- var server = new JXP(config);
123
-
124
- let port = process.env.NODE_DOCKER_PORT || process.env.PORT || config.port || 4001;
125
- if (process.env.NODE_ENV === "test") port = 4005;
126
- server.listen(port, function () {
127
- console.log('%s listening at %s', `${pkg.name} v${pkg.version}`, server.url);
128
- console.log(`Mongoose version ${mongoose.version}`);
129
- });
130
-
131
- module.exports = server; // For testing