jxp 4.1.1 → 4.2.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 (68) hide show
  1. package/.env.sample +14 -0
  2. package/dist/bin/index_audit.d.ts +3 -0
  3. package/dist/bin/index_audit.d.ts.map +1 -0
  4. package/dist/bin/index_audit.js +66 -0
  5. package/dist/bin/index_audit.js.map +1 -0
  6. package/dist/bin/server.d.ts.map +1 -1
  7. package/dist/bin/server.js +6 -1
  8. package/dist/bin/server.js.map +1 -1
  9. package/dist/libs/builtin_models.d.ts +21 -0
  10. package/dist/libs/builtin_models.d.ts.map +1 -0
  11. package/dist/libs/builtin_models.js +125 -0
  12. package/dist/libs/builtin_models.js.map +1 -0
  13. package/dist/libs/docs-auth.d.ts.map +1 -1
  14. package/dist/libs/docs-auth.js +3 -1
  15. package/dist/libs/docs-auth.js.map +1 -1
  16. package/dist/libs/docs.js +32 -2
  17. package/dist/libs/docs.js.map +1 -1
  18. package/dist/libs/groups.js +3 -4
  19. package/dist/libs/groups.js.map +1 -1
  20. package/dist/libs/index_diagnostics.d.ts +144 -0
  21. package/dist/libs/index_diagnostics.d.ts.map +1 -0
  22. package/dist/libs/index_diagnostics.js +671 -0
  23. package/dist/libs/index_diagnostics.js.map +1 -0
  24. package/dist/libs/jxp.d.ts.map +1 -1
  25. package/dist/libs/jxp.js +94 -25
  26. package/dist/libs/jxp.js.map +1 -1
  27. package/dist/libs/load-config.d.ts +2 -0
  28. package/dist/libs/load-config.d.ts.map +1 -1
  29. package/dist/libs/load-config.js +10 -0
  30. package/dist/libs/load-config.js.map +1 -1
  31. package/dist/libs/login.js +3 -8
  32. package/dist/libs/login.js.map +1 -1
  33. package/dist/libs/parse_byte_size.d.ts +10 -0
  34. package/dist/libs/parse_byte_size.d.ts.map +1 -0
  35. package/dist/libs/parse_byte_size.js +80 -0
  36. package/dist/libs/parse_byte_size.js.map +1 -0
  37. package/dist/libs/query_limits.js +99 -13
  38. package/dist/libs/query_limits.js.map +1 -1
  39. package/dist/libs/schema.js +2 -2
  40. package/dist/libs/schema.js.map +1 -1
  41. package/dist/libs/security.js +7 -11
  42. package/dist/libs/security.js.map +1 -1
  43. package/dist/libs/setup.js +3 -4
  44. package/dist/libs/setup.js.map +1 -1
  45. package/dist/libs/startup.d.ts +4 -0
  46. package/dist/libs/startup.d.ts.map +1 -1
  47. package/dist/libs/startup.js +17 -0
  48. package/dist/libs/startup.js.map +1 -1
  49. package/dist/models/indexquerylog_model.d.ts +19 -0
  50. package/dist/models/indexquerylog_model.d.ts.map +1 -0
  51. package/dist/models/indexquerylog_model.js +32 -0
  52. package/dist/models/indexquerylog_model.js.map +1 -0
  53. package/dist/types/jxp-config.d.ts +22 -0
  54. package/dist/types/jxp-config.d.ts.map +1 -1
  55. package/dist/types/schema-fields.d.ts +4 -0
  56. package/dist/types/schema-fields.d.ts.map +1 -1
  57. package/docs/api.md +16 -2
  58. package/docs/changelog.md +66 -1
  59. package/docs/configuration.md +39 -0
  60. package/docs/index.md +1 -0
  61. package/docs/index_diagnostics.md +127 -0
  62. package/docs/schemas.md +3 -1
  63. package/mkdocs.yml +1 -0
  64. package/package.json +18 -7
  65. package/templates/assets/diagnostics.js +352 -0
  66. package/templates/diagnostics.pug +94 -0
  67. package/templates/index.pug +1 -0
  68. package/templates/sidebar.pug +8 -0
@@ -1 +1 @@
1
- {"version":3,"file":"startup.js","sourceRoot":"","sources":["../../src/libs/startup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../../src/libs/startup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Types } from "mongoose";
2
+ export interface IIndexQueryLog {
3
+ _id?: Types.ObjectId;
4
+ model_name: string;
5
+ op: string;
6
+ filter_summary: string;
7
+ severity: "alert" | "warn";
8
+ reason?: string;
9
+ stage?: string;
10
+ total_docs_examined?: number;
11
+ n_returned?: number;
12
+ total_keys_examined?: number;
13
+ millis?: number;
14
+ observed_at?: Date;
15
+ createdAt?: Date;
16
+ }
17
+ declare const IndexQueryLog: import("mongoose").Model<IIndexQueryLog, {}, {}, {}, any>;
18
+ export default IndexQueryLog;
19
+ //# sourceMappingURL=indexquerylog_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexquerylog_model.d.ts","sourceRoot":"","sources":["../../src/models/indexquerylog_model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC9B,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;CACjB;AAgCD,QAAA,MAAM,aAAa,2DAAwE,CAAC;AAC5F,eAAe,aAAa,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = __importDefault(require("../libs/schema"));
7
+ const load_config_1 = require("../libs/load-config");
8
+ const IndexQueryLogSchema = new schema_1.default({
9
+ model_name: { type: String, required: true, index: true },
10
+ op: { type: String, required: true },
11
+ filter_summary: { type: String, default: "{}" },
12
+ severity: { type: String, required: true, index: true },
13
+ reason: String,
14
+ stage: String,
15
+ total_docs_examined: Number,
16
+ n_returned: Number,
17
+ total_keys_examined: Number,
18
+ millis: Number,
19
+ observed_at: { type: Date, default: Date.now, index: true },
20
+ }, {
21
+ internal: true,
22
+ perms: {
23
+ admin: "crud",
24
+ owner: "",
25
+ user: "",
26
+ },
27
+ });
28
+ IndexQueryLogSchema.index({ observed_at: 1 }, { expireAfterSeconds: (0, load_config_1.getIndexQueryLogRetentionSeconds)() });
29
+ IndexQueryLogSchema.index({ model_name: 1, severity: 1, observed_at: -1 });
30
+ const IndexQueryLog = schema_1.default.model("IndexQueryLog", IndexQueryLogSchema);
31
+ exports.default = IndexQueryLog;
32
+ //# sourceMappingURL=indexquerylog_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexquerylog_model.js","sourceRoot":"","sources":["../../src/models/indexquerylog_model.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuC;AACvC,qDAAuE;AAmBvE,MAAM,mBAAmB,GAAG,IAAI,gBAAS,CACxC;IACC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IACzD,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACpC,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/C,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IACvD,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,MAAM;IACb,mBAAmB,EAAE,MAAM;IAC3B,UAAU,EAAE,MAAM;IAClB,mBAAmB,EAAE,MAAM;IAC3B,MAAM,EAAE,MAAM;IACd,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE;CAC3D,EACD;IACC,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,EAAE;KACR;CACD,CACD,CAAC;AAEF,mBAAmB,CAAC,KAAK,CACxB,EAAE,WAAW,EAAE,CAAC,EAAE,EAClB,EAAE,kBAAkB,EAAE,IAAA,8CAAgC,GAAE,EAAE,CAC1D,CAAC;AACF,mBAAmB,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAE3E,MAAM,aAAa,GAAG,gBAAS,CAAC,KAAK,CAAiB,eAAe,EAAE,mBAAmB,CAAC,CAAC;AAC5F,kBAAe,aAAa,CAAC"}
@@ -13,6 +13,10 @@ export interface JXPQueryLimits {
13
13
  require_limit_always?: boolean;
14
14
  /** Skip countDocuments unless ?page= or ?count=true */
15
15
  skip_count_unless_paginated?: boolean;
16
+ /** Max JSON/CSV response size (`10mb`, `512kb`, `10M`, or bytes as number); `0` disables */
17
+ max_response_size?: string | number;
18
+ /** @deprecated Use `max_response_size` (string or number) */
19
+ max_response_bytes?: string | number;
16
20
  }
17
21
  export interface JXPSecurityConfig {
18
22
  strip_fields?: string[];
@@ -40,6 +44,23 @@ export interface JXPCacheConfig {
40
44
  debug?: boolean;
41
45
  ttl?: number;
42
46
  }
47
+ export interface JXPQueryMonitorConfig {
48
+ enabled?: boolean;
49
+ /** 0–1; dev default 1.0, production default 0.02 */
50
+ sample_rate?: number;
51
+ min_docs_examined?: number;
52
+ docs_examined_ratio?: number;
53
+ small_collection_threshold?: number;
54
+ buffer_size?: number;
55
+ }
56
+ export interface JXPIndexDiagnosticsConfig {
57
+ enabled?: boolean;
58
+ query_monitor?: JXPQueryMonitorConfig;
59
+ }
60
+ export interface ResolvedIndexDiagnosticsConfig {
61
+ enabled: boolean;
62
+ query_monitor: Required<JXPQueryMonitorConfig>;
63
+ }
43
64
  export interface JXPOAuthProviderConfig {
44
65
  auth_uri: string;
45
66
  token_uri: string;
@@ -75,6 +96,7 @@ export interface JXPConfig {
75
96
  smtp_password?: string;
76
97
  smtp_from?: string;
77
98
  cache?: JXPCacheConfig;
99
+ index_diagnostics?: JXPIndexDiagnosticsConfig;
78
100
  docs?: JXPDocsConfig;
79
101
  login_rate_limit?: LoginRateLimitConfig;
80
102
  cache_timeout?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"jxp-config.d.ts","sourceRoot":"","sources":["../../src/types/jxp-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jxp-config.d.ts","sourceRoot":"","sources":["../../src/types/jxp-config.ts"],"names":[],"mappings":"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"}
@@ -25,11 +25,15 @@ export interface JXPSchemaOptions {
25
25
  enabled?: boolean;
26
26
  large_collection_threshold?: number;
27
27
  max?: number;
28
+ max_response_size?: string | number;
29
+ max_response_bytes?: string | number;
28
30
  };
29
31
  /** Static method names exposed via GET/POST /call/:modelname/:method_name */
30
32
  callable_statics?: string[];
31
33
  /** Opt out of HTTP advanced endpoints per model (default: query/aggregate on, bulkwrite off) */
32
34
  advanced_queries?: JXPAdvancedQueries;
35
+ /** Framework model — hidden from docs API browser model list */
36
+ internal?: boolean;
33
37
  [key: string]: unknown;
34
38
  }
35
39
  export type JXPDefinition = Record<string, JXPFieldDefinition | JXPFieldDefinition[] | SchemaDefinitionProperty<unknown> | SchemaDefinitionProperty<unknown>[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema-fields.d.ts","sourceRoot":"","sources":["../../src/types/schema-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAClC,YAAY,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,0BAA0B,CAAC,EAAE,MAAM,CAAC;QACpC,GAAG,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CACjC,MAAM,EACJ,kBAAkB,GAClB,kBAAkB,EAAE,GACpB,wBAAwB,CAAC,OAAO,CAAC,GACjC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CACrC,CAAC;AAEF,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"schema-fields.d.ts","sourceRoot":"","sources":["../../src/types/schema-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAClC,YAAY,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,0BAA0B,CAAC,EAAE,MAAM,CAAC;QACpC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACpC,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACrC,CAAC;IACF,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CACjC,MAAM,EACJ,kBAAkB,GAClB,kBAAkB,EAAE,GACpB,wBAAwB,CAAC,OAAO,CAAC,GACjC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CACrC,CAAC;AAEF,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB"}
package/docs/api.md CHANGED
@@ -98,13 +98,26 @@ When `query_limits.enabled` is true (default), list and query endpoints apply **
98
98
 
99
99
  #### Large collections (explicit limit)
100
100
 
101
- For collections with at least **10,000** documents (by default), you must pass an explicit `?limit=` between 1 and the maximum. Omitting `limit` on a large collection returns **400 Bad Request** (the default limit does not satisfy this rule).
101
+ For collections with at least **10,000** documents (by default), you must pass an explicit `?limit=` between 1 and the maximum when listing **without** a filter. Omitting `limit` on an unfiltered large collection returns **400 Bad Request**.
102
+
103
+ **Filter exemption:** If the client narrows the query, the default limit applies instead:
104
+
105
+ - **GET** — non-empty `?filter[...]` (or other filter query params)
106
+ - **POST `/query`** — non-empty JSON `query` object in the body (not `{}`)
107
+
108
+ Filtered large-collection requests use the default limit, include pagination metadata (`count`, `page_count`, `next` when applicable), and may set **`has_more: true`** when the page is full but the total count was not computed.
109
+
110
+ **Limit cap:** If `?limit=` exceeds the configured maximum (default **1000**), the effective limit is capped to `max`. The response includes **`limit_capped: true`** and pagination links when more pages exist.
102
111
 
103
112
  Use `GET /count/<model>` for totals. Add **`?count=true`** (or **`?page=`**) when you need `count` / `page_count` in the list response without paginating.
104
113
 
114
+ #### Response size limit
115
+
116
+ List, query, and CSV responses are rejected with **413 Request Entity Too Large** when the serialized payload exceeds **`max_response_size`** (default **`10mb`**). Accepts human-friendly sizes (`10mb`, `512kb`, `10M`, etc.) or a byte count as a number. Reduce `?limit=`, use `?fields=`, or paginate. Set `max_response_size: 0` or `"0"` to disable.
117
+
105
118
  #### Totals in list responses
106
119
 
107
- By default, list responses **omit** `count` unless you pass **`?count=true`** or **`?page=`**, to avoid expensive `countDocuments` on every request.
120
+ By default, list responses **omit** `count` unless you pass **`?count=true`** or **`?page=`**, to avoid expensive `countDocuments` on every request. Counts are also computed when a filtered large-collection request uses the default limit, or when the client limit was capped to `max`.
108
121
 
109
122
  Configure globally when starting JXP:
110
123
 
@@ -115,6 +128,7 @@ query_limits: {
115
128
  max: 1000,
116
129
  default: 100,
117
130
  skip_count_unless_paginated: true,
131
+ max_response_size: "10mb",
118
132
  }
119
133
  ```
120
134
 
package/docs/changelog.md CHANGED
@@ -2,6 +2,71 @@
2
2
 
3
3
  Notable changes to [JXP](https://github.com/WorkSpaceMan/jxp).
4
4
 
5
+ ## v4.2.0 — 2026-05-26
6
+
7
+ Query limit improvements, index diagnostics (audit CLI, admin API, docs UI, query monitor), built-in framework models, and MongoDB version in the startup banner.
8
+
9
+ ### Index diagnostics
10
+
11
+ #### Added
12
+
13
+ - **Index audit** — Compare Mongoose schema indexes to MongoDB (`diffIndexes` / `syncIndexes`) across all loaded models. CLI: `npm run indexes` or **`jxp-indexes`** (`--json`, `--unused`, `--sync --confirm DROP_EXTRA_INDEXES`).
14
+ - **Admin HTTP API** — `GET /diagnostics/indexes`, `GET /diagnostics/queries`, `POST /diagnostics/indexes/sync` (admin auth).
15
+ - **Docs UI** — **`/docs/diagnostics`** (same sign-in as `/docs/api`): refresh audit, browse query log, sync indexes.
16
+ - **Query monitor** — Samples read ops (`find`, `findOne`, `count`, etc.), runs `explain('executionStats')` on a clone (async), flags **alert** / **warn** plans. Dev on by default (`QUERY_INDEX_MONITOR=true`); production via `INDEX_DIAGNOSTICS_ENABLED=true` and `QUERY_INDEX_SAMPLE_RATE`.
17
+ - **`IndexQueryLog` model** — Built-in MongoDB store with TTL (`INDEX_QUERY_LOG_RETENTION_DAYS`, default 30). In-memory ring buffer fallback. Log collection excluded from monitoring (no feedback loop).
18
+ - **`index_diagnostics` config** — `JXP({ index_diagnostics: { enabled, query_monitor: { … } } })`; call `registerQueryIndexMonitor()` before models load (sample `server.ts` does this inside `JXP()`).
19
+ - **Package exports** — `jxp/libs/index_diagnostics`, `jxp-indexes` bin.
20
+
21
+ See [Index diagnostics](index_diagnostics.md).
22
+
23
+ ### Built-in models
24
+
25
+ #### Added
26
+
27
+ - **Package models** — When a slug is missing from `MODEL_DIR`, JXP loads from `dist/models` in the npm package: `user`, `apikey`, `token`, `refreshtoken`, `usergroups`, `indexquerylog`. App files always win.
28
+ - **`JXP_BUILTIN_MODELS`** — `default` (all), comma list, or `none` to disable.
29
+ - **`internal: true`** — Schema option to hide a model from the docs API browser model list.
30
+ - **`jxp/libs/builtin_models`** — `loadAllModels`, `getJxpPackageRoot`, registry helpers.
31
+
32
+ #### Changed
33
+
34
+ - **`security` / `login` / `groups` / `setup`** — Resolve auth models from the pre-loaded registry instead of `require` per file from `MODEL_DIR`.
35
+ - **Docs browser** — API overview lists **public** models only (built-ins with `internal: true` hidden).
36
+ - **Schema link preload** — Side-effect `require` only (no `.default` read) to avoid circular load issues (e.g. User → User).
37
+
38
+ ### Startup
39
+
40
+ #### Added
41
+
42
+ - **MongoDB server version** — Fetched via `buildInfo` on connect and shown in the ready banner (`mongoVersion` in startup context).
43
+
44
+ ### Query limits
45
+
46
+ #### Added
47
+
48
+ - **Filter exemption** — Large collections (≥ `large_collection_threshold` docs) no longer require explicit `?limit=` when the client passes a non-empty **`?filter`** (GET/CSV) or a non-empty **`query`** object (POST `/query`). The default limit applies with pagination metadata.
49
+ - **Response size limit** — `query_limits.max_response_size` (default **`10mb`**; env `QUERY_LIMITS_MAX_RESPONSE_SIZE`). Human-friendly sizes (`10mb`, `512kb`, `10M`) via the [`bytes`](https://www.npmjs.com/package/bytes) package. List, POST `/query`, and CSV exports return **413** when the serialized payload exceeds the limit. Numeric `max_response_bytes` remains supported for backward compatibility.
50
+ - **`limit_capped`** — Present when the client `?limit=` was reduced to `max`.
51
+ - **`has_more`** — Set when a full page was returned but total count is unknown (optimistic pagination).
52
+
53
+ #### Changed
54
+
55
+ - **`?limit=` above `max`** — Capped to `max` with pagination (was **400 Bad Request**).
56
+ - **`shouldRunCount`** — Also runs when filter exemption or limit cap applies, so `count` / `next` are available for protected large responses.
57
+ - **`query_limits.enforceListLimit`** — Returns `{ limit, limitCapped, filterExemption }`; logs **413** via `response_size` context.
58
+
59
+ #### Migration
60
+
61
+ | Scenario | v4.1.x | v4.2.0 |
62
+ |----------|--------|--------|
63
+ | Large collection, no filter, no `?limit=` | 400 | 400 (unchanged) |
64
+ | Large collection + `?filter` / POST body `query` | 400 | 200 with default limit + pagination |
65
+ | `?limit=` > max | 400 | 200 capped to `max`, `limit_capped: true` |
66
+ | Response > 10 MiB | (no limit) | 413 |
67
+
68
+ ---
69
+
5
70
  ## v4.1.1 — 2026-05-25
6
71
 
7
72
  Bulk write authorization fixes (admins no longer need per-model opt-in) and structured request error logging for security guards (query limits, filters, aggregate, bulkwrite, auth).
@@ -37,7 +102,7 @@ Unexpected errors (non-4xx) still log a stack trace; expected `BadRequest` / `Fo
37
102
 
38
103
  #### Wired into
39
104
 
40
- - **`query_limits.enforceListLimit`** — missing limit on large collections, limit over max
105
+ - **`query_limits.enforceListLimit`** — missing limit on large unfiltered collections; **`response_size`** — payload over `max_response_bytes`
41
106
  - **Filter parsing and `query_sanitize`** — denied operators, depth, regex
42
107
  - **POST `/query` and `/aggregate`** — model opt-in middleware, pipeline stage guard, invalid body
43
108
  - **POST `/bulkwrite`** — opt-in, `bulkAuth`, validation, Mongo errors
@@ -87,6 +87,18 @@ When enabled, JXP uses an in-process cache ([node-cache](https://www.npmjs.com/p
87
87
 
88
88
  See [Caching](caching.md) for details.
89
89
 
90
+ ## Index diagnostics
91
+
92
+ ```
93
+ INDEX_DIAGNOSTICS_ENABLED=false
94
+ QUERY_INDEX_MONITOR=true
95
+ QUERY_INDEX_SAMPLE_RATE=1.0
96
+ ```
97
+
98
+ Admin endpoints (require admin login): `GET /diagnostics/indexes`, `GET /diagnostics/queries`, `POST /diagnostics/indexes/sync`. CLI: `npm run indexes` or `jxp-indexes`.
99
+
100
+ See [Index diagnostics](index_diagnostics.md).
101
+
90
102
  ## Query limits
91
103
 
92
104
  ```
@@ -95,6 +107,7 @@ QUERY_LIMITS_LARGE_COLLECTION_THRESHOLD=10000
95
107
  QUERY_LIMITS_MAX=1000
96
108
  QUERY_LIMITS_DEFAULT=100
97
109
  QUERY_LIMITS_SKIP_COUNT_UNLESS_PAGINATED=true
110
+ QUERY_LIMITS_MAX_RESPONSE_SIZE=10mb
98
111
  CORS_ORIGINS=http://localhost:3000,http://localhost:4001
99
112
  ```
100
113
 
@@ -112,6 +125,32 @@ JXP discovers models by scanning `MODEL_DIR` for `*_model.js`. You can also pass
112
125
 
113
126
  Relative `model_dir` paths resolve from `process.cwd()` (typical for npm scripts), not from the server script path.
114
127
 
128
+ ### Built-in models
129
+
130
+ JXP ships framework models in the npm package (`dist/models`). If a slug is **missing** from your `MODEL_DIR`, JXP loads the built-in automatically (your app always wins when you provide the same `{slug}_model.js`):
131
+
132
+ | Slug | Purpose |
133
+ |------|---------|
134
+ | `user` | Users / login |
135
+ | `apikey` | API keys |
136
+ | `token` | Access tokens |
137
+ | `refreshtoken` | Refresh tokens |
138
+ | `usergroups` | Group membership |
139
+ | `indexquerylog` | Index diagnostics query log ([Index diagnostics](index_diagnostics.md)) |
140
+
141
+ Optional:
142
+
143
+ ```
144
+ # default — load all built-ins when missing
145
+ # JXP_BUILTIN_MODELS=default
146
+
147
+ # comma list, or none to disable
148
+ # JXP_BUILTIN_MODELS=user,apikey,token
149
+ # JXP_BUILTIN_MODELS=none
150
+ ```
151
+
152
+ Schemas can set `internal: true` in schema options to hide a model from the docs API browser list (see [Schemas](schemas.md)).
153
+
115
154
  ## Programmatic config
116
155
 
117
156
  Apps typically build an options object and pass it to `JXP()`:
package/docs/index.md CHANGED
@@ -17,6 +17,7 @@ JXP 4 requires **Node.js 22+**, ships as compiled TypeScript, and uses environme
17
17
  * Hooks for business logic
18
18
  * Stateless and easy to deploy
19
19
  * WebSocket change subscriptions
20
+ * [Index diagnostics](index_diagnostics.md) — schema vs DB indexes and optional query monitoring
20
21
 
21
22
  ## Links
22
23
 
@@ -0,0 +1,127 @@
1
+ # Index diagnostics and query monitoring
2
+
3
+ JXP can compare **Mongoose schema indexes** to indexes in MongoDB, optionally sync them, and (when enabled) sample read queries with `explain('executionStats')` to flag likely unindexed or inefficient access patterns.
4
+
5
+ ## Index audit (schema vs database)
6
+
7
+ Mongoose provides `Model.diffIndexes()` and `Model.syncIndexes()`. JXP wraps these for all loaded models.
8
+
9
+ ### CLI
10
+
11
+ ```bash
12
+ npm run indexes
13
+ # or
14
+ npx jxp-indexes
15
+ ```
16
+
17
+ | Flag | Description |
18
+ |------|-------------|
19
+ | `--json` | Machine-readable report |
20
+ | `--unused` | Include `$indexStats` hints for indexes with zero ops |
21
+ | `--sync` | Apply `syncIndexes()` (create missing, drop extras) |
22
+ | `--confirm DROP_EXTRA_INDEXES` | Required with `--sync` |
23
+
24
+ Example:
25
+
26
+ ```bash
27
+ npm run indexes -- --json
28
+ npm run indexes -- --sync --confirm DROP_EXTRA_INDEXES
29
+ ```
30
+
31
+ Exit code `1` when any collection has missing or extra indexes (audit mode only).
32
+
33
+ Requires `MODEL_DIR` and Mongo connection env vars (same as the API server).
34
+
35
+ ### Web UI
36
+
37
+ Open **`/docs/diagnostics`** in the API docs browser (same sign-in as `/docs/api`). The page lets admins:
38
+
39
+ - Refresh the index audit and view missing/extra indexes per collection
40
+ - Browse the query log (from MongoDB when the `IndexQueryLog` model is loaded)
41
+ - Sync indexes after typing `DROP_EXTRA_INDEXES`
42
+
43
+ Use an **admin** API key in the docs top bar.
44
+
45
+ ### Admin HTTP API
46
+
47
+ Admin authentication required (`security.admin_only`).
48
+
49
+ | Method | Path | Description |
50
+ |--------|------|-------------|
51
+ | GET | `/diagnostics/indexes` | Audit report (`?refresh=true`, `?unused=true`) |
52
+ | GET | `/diagnostics/queries` | Recent query monitor entries + config |
53
+ | POST | `/diagnostics/indexes/sync` | Body `{ "confirm": "DROP_EXTRA_INDEXES" }` |
54
+
55
+ ## Query monitor
56
+
57
+ MongoDB does not emit “missing index” events. When the monitor is enabled, JXP samples read operations (`find`, `findOne`, `count`, `countDocuments`, `distinct`), runs `explain('executionStats')` on a **clone** of the query (async, non-blocking), and records **alert** / **warn** entries.
58
+
59
+ ### Where queries are stored
60
+
61
+ | Layer | Purpose |
62
+ |-------|---------|
63
+ | **`IndexQueryLog` model** (MongoDB) | Primary store — one document per flagged query. Auto-loaded from the jxp package (`indexquerylog_model.js`). TTL via `INDEX_QUERY_LOG_RETENTION_DAYS` (default 30). |
64
+ | **In-memory ring buffer** | Fast fallback when the model is unavailable; also used for recent samples before persistence. Size: `QUERY_INDEX_BUFFER_SIZE`. |
65
+
66
+ The `IndexQueryLog` collection is excluded from query monitoring (reads/writes to the log do not create new log entries). Explain runs use `query.clone().explain()` with an internal flag so Mongoose post hooks do not treat the explain as another sampled query (no monitor loop). The model is a **built-in** — you do not need `indexquerylog_model.js` in your app's `MODEL_DIR` unless you want to override it (see [Configuration — Built-in models](configuration.md#built-in-models)). Admins can also list logs via `GET /api/indexquerylog` with normal JXP filters.
67
+
68
+ Query monitor is enabled in development by default (`QUERY_INDEX_MONITOR=true`). In production, set `INDEX_DIAGNOSTICS_ENABLED=true` and tune `QUERY_INDEX_SAMPLE_RATE` (e.g. `0.02`).
69
+
70
+ **Heuristics (approximate):**
71
+
72
+ - **alert** — `COLLSCAN` (or nested collection scan) with high `totalDocsExamined` vs `nReturned`
73
+ - **warn** — index used but many more documents examined than returned
74
+ - **ignore** — small collections (below threshold), or benign plans
75
+
76
+ `explain` with `executionStats` executes the query again — use sampling in production.
77
+
78
+ ### Environment variables
79
+
80
+ | Variable | Default (dev) | Default (production) |
81
+ |----------|---------------|----------------------|
82
+ | `INDEX_DIAGNOSTICS_ENABLED` | off | off (master enable for prod) |
83
+ | `QUERY_INDEX_MONITOR` | `true` | `false` |
84
+ | `QUERY_INDEX_SAMPLE_RATE` | `1.0` | `0.02` |
85
+ | `QUERY_INDEX_MIN_DOCS_EXAMINED` | `20` | `100` |
86
+ | `QUERY_INDEX_DOCS_EXAMINED_RATIO` | `5` | `10` |
87
+ | `QUERY_INDEX_SMALL_COLLECTION_THRESHOLD` | `500` | `1000` |
88
+ | `QUERY_INDEX_BUFFER_SIZE` | `200` | `200` |
89
+ | `INDEX_QUERY_LOG_RETENTION_DAYS` | `30` | `30` |
90
+
91
+ In production, set `INDEX_DIAGNOSTICS_ENABLED=true` (and tune sample rate) to enable monitoring.
92
+
93
+ ### Config object
94
+
95
+ ```javascript
96
+ JXP({
97
+ index_diagnostics: {
98
+ enabled: true,
99
+ query_monitor: {
100
+ enabled: true,
101
+ sample_rate: 0.05,
102
+ min_docs_examined: 100,
103
+ },
104
+ },
105
+ });
106
+ ```
107
+
108
+ Register the monitor **before** models load (the sample `server.ts` calls `registerQueryIndexMonitor()` before `JXP()`).
109
+
110
+ ## Programmatic use
111
+
112
+ ```javascript
113
+ const {
114
+ auditAllModels,
115
+ syncAllModels,
116
+ loadModelsFromDir,
117
+ classifyExplain,
118
+ } = require("jxp/libs/index_diagnostics");
119
+ ```
120
+
121
+ ## Complementary tools
122
+
123
+ - MongoDB [Profiler](https://www.mongodb.com/docs/manual/tutorial/manage-the-database-profiler/) and Compass — slow query analysis
124
+ - Atlas Performance Advisor — index suggestions (Atlas)
125
+ - `db.collection.explain()` — manual plan inspection
126
+
127
+ JXP diagnostics do not replace these; they integrate index drift checks into your JXP app workflow.
package/docs/schemas.md CHANGED
@@ -10,7 +10,9 @@ The schemas are based on Mongoose, so anything you can do with a [Mongoose schem
10
10
 
11
11
  ## Defining a schema
12
12
 
13
- Schemas are loaded from `MODEL_DIR` (default `./dist/models` on the sample server). Each file is named `<name>_model.js`. Each schema represents a collection in Mongo, with the Mongo collection name being the plural of the schema name. Eg. the data for `user_model.js` is stored in the `users` collection in Mongo.
13
+ Schemas are loaded from `MODEL_DIR` (default `./dist/models` on the sample server). Each file is named `<name>_model.js`. JXP also ships **built-in** models (auth, `indexquerylog`, etc.) from the package when your app does not define them see [Configuration Built-in models](configuration.md#built-in-models). Set `internal: true` on schema options to hide a model from the docs API browser.
14
+
15
+ Each schema represents a collection in Mongo, with the Mongo collection name being the plural of the schema name. Eg. the data for `user_model.js` is stored in the `users` collection in Mongo.
14
16
 
15
17
  A typical schema looks like `test_model.js` in your model directory:
16
18
  ```javascript
package/mkdocs.yml CHANGED
@@ -13,6 +13,7 @@ nav:
13
13
  - Bulk Writes: bulk_writes.md
14
14
  - Queries: queries.md
15
15
  - Caching: caching.md
16
+ - Index diagnostics: index_diagnostics.md
16
17
  - Websocket: websocket.md
17
18
  - Special Features: special.md
18
19
  - Changelog: changelog.md
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jxp",
3
3
  "description": "An opinionated RESTful API library based on Mongoose and Restify. Make an API by just writing Mongoose models.",
4
- "version": "4.1.1",
4
+ "version": "4.2.0",
5
5
  "private": false,
6
6
  "main": "dist/libs/jxp.js",
7
7
  "types": "dist/libs/jxp.d.ts",
@@ -39,6 +39,14 @@
39
39
  },
40
40
  "./types/jxp-config": {
41
41
  "types": "./dist/types/jxp-config.d.ts"
42
+ },
43
+ "./libs/index_diagnostics": {
44
+ "types": "./dist/libs/index_diagnostics.d.ts",
45
+ "default": "./dist/libs/index_diagnostics.js"
46
+ },
47
+ "./libs/builtin_models": {
48
+ "types": "./dist/libs/builtin_models.d.ts",
49
+ "default": "./dist/libs/builtin_models.js"
42
50
  }
43
51
  },
44
52
  "scripts": {
@@ -47,13 +55,15 @@
47
55
  "prepare": "node -e \"require('fs').existsSync('src')&&require('child_process').execSync('npm run build',{stdio:'inherit'})\"",
48
56
  "start": "node dist/bin/server.js",
49
57
  "dev": "nodemon --watch src --ext ts --exec 'npm run build && node dist/bin/server.js'",
50
- "test": "npm run build && mocha --require test/env.js test/bulkwrite_guard.test.js test/request_log.test.js test/test.js --timeout 1000 -b --exit",
51
- "setup": "node dist/bin/setup.js"
58
+ "test": "npm run build && mocha --require test/env.js test/builtin_models.test.js test/bulkwrite_guard.test.js test/index_diagnostics.test.js test/parse_byte_size.test.js test/query_limits.test.js test/request_log.test.js test/test.js --timeout 1000 -b --exit",
59
+ "setup": "node dist/bin/setup.js",
60
+ "indexes": "node dist/bin/index_audit.js"
52
61
  },
53
62
  "bin": {
54
63
  "jxp": "dist/bin/setup.js",
55
64
  "jxp-setup": "dist/bin/setup.js",
56
- "jxp-add-admin": "dist/bin/init_db.js"
65
+ "jxp-add-admin": "dist/bin/init_db.js",
66
+ "jxp-indexes": "dist/bin/index_audit.js"
57
67
  },
58
68
  "repository": {
59
69
  "type": "git",
@@ -70,15 +80,16 @@
70
80
  "url": "https://github.com/WorkSpaceMan/jxp/issues"
71
81
  },
72
82
  "dependencies": {
83
+ "@json2csv/plainjs": "^7.0.6",
73
84
  "bcryptjs": "^3.0.2",
85
+ "bytes": "^3.1.2",
74
86
  "commander": "^13.1.0",
75
87
  "dotenv": "^16.5.0",
76
88
  "glob": "11.1.0",
77
89
  "js-yaml": "4.1.1",
78
- "@json2csv/plainjs": "^7.0.6",
79
90
  "jsonwebtoken": "^9.0.2",
80
- "markdown-it": "^14.1.1",
81
91
  "jxp-helper": "^1.4.3",
92
+ "markdown-it": "^14.1.1",
82
93
  "moment": "^2.30.1",
83
94
  "mongoose": "6.13.9",
84
95
  "mongoose-friendly": "^0.1.4",
@@ -96,9 +107,9 @@
96
107
  "ws": "^8.18.1"
97
108
  },
98
109
  "devDependencies": {
99
- "@types/markdown-it": "^14.1.2",
100
110
  "@types/bcryptjs": "^2.4.6",
101
111
  "@types/jsonwebtoken": "^9.0.9",
112
+ "@types/markdown-it": "^14.1.2",
102
113
  "@types/morgan": "^1.9.9",
103
114
  "@types/node": "^22.15.21",
104
115
  "@types/underscore": "^1.13.0",