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.
- package/.env.sample +31 -6
- package/README.md +27 -13
- package/dist/bin/init_db.d.ts +3 -0
- package/dist/bin/init_db.d.ts.map +1 -0
- package/dist/bin/init_db.js +48 -0
- package/dist/bin/init_db.js.map +1 -0
- package/dist/bin/server.d.ts +4 -0
- package/dist/bin/server.d.ts.map +1 -0
- package/dist/bin/server.js +132 -0
- package/dist/bin/server.js.map +1 -0
- package/dist/bin/setup.d.ts +3 -0
- package/dist/bin/setup.d.ts.map +1 -0
- package/dist/bin/setup.js +185 -0
- package/dist/bin/setup.js.map +1 -0
- package/dist/globals.d.ts +14 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +3 -0
- package/dist/globals.js.map +1 -0
- package/dist/libs/aggregate_guard.d.ts +5 -0
- package/dist/libs/aggregate_guard.d.ts.map +1 -0
- package/dist/libs/aggregate_guard.js +58 -0
- package/dist/libs/aggregate_guard.js.map +1 -0
- package/dist/libs/bulkwrite_guard.d.ts +5 -0
- package/dist/libs/bulkwrite_guard.d.ts.map +1 -0
- package/dist/libs/bulkwrite_guard.js +44 -0
- package/dist/libs/bulkwrite_guard.js.map +1 -0
- package/dist/libs/cache.d.ts +2 -0
- package/dist/libs/cache.d.ts.map +1 -0
- package/dist/libs/cache.js +94 -0
- package/dist/libs/cache.js.map +1 -0
- package/dist/libs/call_guard.d.ts +3 -0
- package/dist/libs/call_guard.d.ts.map +1 -0
- package/dist/libs/call_guard.js +17 -0
- package/dist/libs/call_guard.js.map +1 -0
- package/dist/libs/connection_string.d.ts +3 -0
- package/dist/libs/connection_string.d.ts.map +1 -0
- package/dist/libs/connection_string.js +4 -0
- package/dist/libs/connection_string.js.map +1 -0
- package/dist/libs/datamunging.d.ts +2 -0
- package/dist/libs/datamunging.d.ts.map +1 -0
- package/dist/libs/datamunging.js +320 -0
- package/dist/libs/datamunging.js.map +1 -0
- package/dist/libs/docs.d.ts +2 -0
- package/dist/libs/docs.d.ts.map +1 -0
- package/dist/libs/docs.js +307 -0
- package/dist/libs/docs.js.map +1 -0
- package/dist/libs/groups.d.ts +2 -0
- package/dist/libs/groups.d.ts.map +1 -0
- package/dist/libs/groups.js +136 -0
- package/dist/libs/groups.js.map +1 -0
- package/dist/libs/jxp.d.ts +4 -0
- package/dist/libs/jxp.d.ts.map +1 -0
- package/dist/libs/jxp.js +1157 -0
- package/dist/libs/jxp.js.map +1 -0
- package/dist/libs/link_index.d.ts +14 -0
- package/dist/libs/link_index.d.ts.map +1 -0
- package/dist/libs/link_index.js +37 -0
- package/dist/libs/link_index.js.map +1 -0
- package/dist/libs/load-config.d.ts +16 -0
- package/dist/libs/load-config.d.ts.map +1 -0
- package/dist/libs/load-config.js +155 -0
- package/dist/libs/load-config.js.map +1 -0
- package/dist/libs/login.d.ts +2 -0
- package/dist/libs/login.d.ts.map +1 -0
- package/dist/libs/login.js +244 -0
- package/dist/libs/login.js.map +1 -0
- package/dist/libs/modeldir.d.ts +5 -0
- package/dist/libs/modeldir.d.ts.map +1 -0
- package/dist/libs/modeldir.js +15 -0
- package/dist/libs/modeldir.js.map +1 -0
- package/dist/libs/query_limits.d.ts +2 -0
- package/dist/libs/query_limits.d.ts.map +1 -0
- package/dist/libs/query_limits.js +84 -0
- package/dist/libs/query_limits.js.map +1 -0
- package/dist/libs/query_manipulation.d.ts +3 -0
- package/dist/libs/query_manipulation.d.ts.map +1 -0
- package/{libs → dist/libs}/query_manipulation.js +22 -21
- package/dist/libs/query_manipulation.js.map +1 -0
- package/dist/libs/query_sanitize.d.ts +5 -0
- package/dist/libs/query_sanitize.d.ts.map +1 -0
- package/dist/libs/query_sanitize.js +109 -0
- package/dist/libs/query_sanitize.js.map +1 -0
- package/dist/libs/response_sanitize.d.ts +7 -0
- package/dist/libs/response_sanitize.d.ts.map +1 -0
- package/dist/libs/response_sanitize.js +57 -0
- package/dist/libs/response_sanitize.js.map +1 -0
- package/dist/libs/safe_error.d.ts +3 -0
- package/dist/libs/safe_error.d.ts.map +1 -0
- package/dist/libs/safe_error.js +14 -0
- package/dist/libs/safe_error.js.map +1 -0
- package/dist/libs/schema.d.ts +14 -0
- package/dist/libs/schema.d.ts.map +1 -0
- package/dist/libs/schema.js +98 -0
- package/dist/libs/schema.js.map +1 -0
- package/dist/libs/schema_description.d.ts +3 -0
- package/dist/libs/schema_description.d.ts.map +1 -0
- package/{libs → dist/libs}/schema_description.js +12 -21
- package/dist/libs/schema_description.js.map +1 -0
- package/dist/libs/security.d.ts +2 -0
- package/dist/libs/security.d.ts.map +1 -0
- package/dist/libs/security.js +428 -0
- package/dist/libs/security.js.map +1 -0
- package/dist/libs/setup.d.ts +2 -0
- package/dist/libs/setup.d.ts.map +1 -0
- package/dist/libs/setup.js +87 -0
- package/dist/libs/setup.js.map +1 -0
- package/dist/libs/startup-deprecations.d.ts +2 -0
- package/dist/libs/startup-deprecations.d.ts.map +1 -0
- package/dist/libs/startup-deprecations.js +21 -0
- package/dist/libs/startup-deprecations.js.map +1 -0
- package/dist/libs/startup.d.ts +16 -0
- package/dist/libs/startup.d.ts.map +1 -0
- package/dist/libs/startup.js +63 -0
- package/dist/libs/startup.js.map +1 -0
- package/dist/libs/ws.d.ts +2 -0
- package/dist/libs/ws.d.ts.map +1 -0
- package/{libs → dist/libs}/ws.js +114 -73
- package/dist/libs/ws.js.map +1 -0
- package/dist/models/apikey_model.d.ts +10 -0
- package/dist/models/apikey_model.d.ts.map +1 -0
- package/dist/models/apikey_model.js +14 -0
- package/dist/models/apikey_model.js.map +1 -0
- package/dist/models/link_model.d.ts +9 -0
- package/dist/models/link_model.d.ts.map +1 -0
- package/dist/models/link_model.js +20 -0
- package/dist/models/link_model.js.map +1 -0
- package/dist/models/refreshtoken_model.d.ts +11 -0
- package/dist/models/refreshtoken_model.d.ts.map +1 -0
- package/dist/models/refreshtoken_model.js +22 -0
- package/dist/models/refreshtoken_model.js.map +1 -0
- package/dist/models/test_model.d.ts +24 -0
- package/dist/models/test_model.d.ts.map +1 -0
- package/dist/models/test_model.js +44 -0
- package/dist/models/test_model.js.map +1 -0
- package/dist/models/token_model.d.ts +14 -0
- package/dist/models/token_model.d.ts.map +1 -0
- package/dist/models/token_model.js +25 -0
- package/dist/models/token_model.js.map +1 -0
- package/dist/models/user_model.d.ts +15 -0
- package/dist/models/user_model.d.ts.map +1 -0
- package/dist/models/user_model.js +38 -0
- package/dist/models/user_model.js.map +1 -0
- package/dist/models/usergroups_model.d.ts +9 -0
- package/dist/models/usergroups_model.d.ts.map +1 -0
- package/dist/models/usergroups_model.js +18 -0
- package/dist/models/usergroups_model.js.map +1 -0
- package/dist/types/jxp-config.d.ts +134 -0
- package/dist/types/jxp-config.d.ts.map +1 -0
- package/dist/types/jxp-config.js +3 -0
- package/dist/types/jxp-config.js.map +1 -0
- package/dist/types/schema-fields.d.ts +43 -0
- package/dist/types/schema-fields.d.ts.map +1 -0
- package/dist/types/schema-fields.js +3 -0
- package/dist/types/schema-fields.js.map +1 -0
- package/docs/aggregations.md +40 -21
- package/docs/api.md +55 -15
- package/docs/authentication.md +60 -37
- package/docs/bulk_writes.md +11 -8
- package/docs/caching.md +28 -11
- package/docs/changelog.md +237 -31
- package/docs/configuration.md +99 -118
- package/docs/hooks.md +12 -8
- package/docs/index.md +17 -17
- package/docs/installation.md +23 -18
- package/docs/permissions.md +33 -19
- package/docs/queries.md +9 -5
- package/docs/schemas.md +21 -10
- package/docs/special.md +4 -4
- package/docs/typescript.md +86 -0
- package/docs/websocket.md +99 -1
- package/mkdocs.yml +1 -0
- package/package.json +121 -69
- package/templates/api.pug +32 -0
- package/templates/app-server.js +43 -0
- package/templates/app.env.sample +8 -0
- package/templates/assets/api-console.js +133 -0
- package/templates/assets/docs.css +227 -0
- package/templates/index.pug +62 -2
- package/templates/layout.pug +17 -11
- package/templates/md.pug +1 -1
- package/templates/model.pug +117 -68
- package/templates/navbar.pug +14 -21
- package/templates/sidebar.pug +30 -0
- package/.env +0 -9
- package/.eslintrc.json +0 -20
- package/.jshintrc +0 -4
- package/.vscode/launch.json +0 -29
- package/.vscode/settings.json +0 -3
- package/Dockerfile +0 -7
- package/bin/init_db.js +0 -54
- package/bin/server.js +0 -84
- package/bin/setup.js +0 -190
- package/config_sample.json +0 -10
- package/docker-compose.yml +0 -32
- package/libs/cache.js +0 -92
- package/libs/connection_string.js +0 -24
- package/libs/datamunging.js +0 -335
- package/libs/docs.js +0 -162
- package/libs/groups.js +0 -133
- package/libs/jxp.js +0 -1208
- package/libs/login.js +0 -218
- package/libs/modeldir.js +0 -14
- package/libs/schema.js +0 -99
- package/libs/security.js +0 -410
- package/libs/setup.js +0 -90
- package/models/apikey_model.js +0 -10
- package/models/link_model.js +0 -17
- package/models/refreshtoken_model.js +0 -20
- package/models/test_model.js +0 -50
- package/models/token_model.js +0 -23
- package/models/user_model.js +0 -38
- package/models/usergroups_model.js +0 -15
- package/setup.sh +0 -3
- package/test/.eslintrc.json +0 -13
- package/test/init.js +0 -92
- package/test/setup.test.js +0 -62
- package/test/test.js +0 -1527
- package/test/wstest.js.old +0 -124
package/templates/index.pug
CHANGED
|
@@ -1,4 +1,64 @@
|
|
|
1
1
|
extends layout
|
|
2
2
|
|
|
3
|
-
block content
|
|
4
|
-
|
|
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
|
package/templates/layout.pug
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
doctype html
|
|
2
|
-
html
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
package/templates/model.pug
CHANGED
|
@@ -1,75 +1,124 @@
|
|
|
1
1
|
extends layout
|
|
2
2
|
|
|
3
3
|
block content
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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}
|
package/templates/navbar.pug
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
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
package/.vscode/launch.json
DELETED
|
@@ -1,29 +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
|
-
"999999",
|
|
23
|
-
"--colors",
|
|
24
|
-
"${workspaceFolder}/test"
|
|
25
|
-
],
|
|
26
|
-
"internalConsoleOptions": "openOnSessionStart"
|
|
27
|
-
}
|
|
28
|
-
]
|
|
29
|
-
}
|
package/.vscode/settings.json
DELETED
package/Dockerfile
DELETED
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,84 +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
|
-
|
|
61
|
-
const connection_string = require("../libs/connection_string");
|
|
62
|
-
console.log(`Connecting to ${connection_string}`);
|
|
63
|
-
mongoose.connect(connection_string, mongo_options);
|
|
64
|
-
|
|
65
|
-
const db = mongoose.connection;
|
|
66
|
-
|
|
67
|
-
// mongodb error
|
|
68
|
-
db.on('error', console.error.bind(console, 'connection error:'));
|
|
69
|
-
|
|
70
|
-
// mongodb connection open
|
|
71
|
-
db.once('open', () => {
|
|
72
|
-
console.log(`Connected to Mongo at: ${new Date()}`);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
var server = new JXP(config);
|
|
76
|
-
|
|
77
|
-
let port = process.env.NODE_DOCKER_PORT || process.env.PORT || config.port || 4001;
|
|
78
|
-
if (process.env.NODE_ENV === "test") port = 4005;
|
|
79
|
-
server.listen(port, function() {
|
|
80
|
-
console.log('%s listening at %s', `${pkg.name} v${pkg.version}`, server.url);
|
|
81
|
-
console.log(`Mongoose version ${mongoose.version}`);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
module.exports = server; // For testing
|