json-rest-api 1.0.22 → 1.0.24

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 (290) hide show
  1. package/CLAUDE.md +1 -2
  2. package/JSKIT_BACKEND_MIGRATION_TRACKER.txt +180 -0
  3. package/README.md +22 -1
  4. package/SINGLE_VALIDATION_CONTRACT_TODO.txt +172 -0
  5. package/docs/API.md +196 -38
  6. package/docs/COMPARISON.md +2 -2
  7. package/docs/GUIDE/GUIDE_1_Initial_Setup.md +111 -5
  8. package/docs/GUIDE/GUIDE_2_2_Manipulating_And_Searching_Tables.md +5 -1
  9. package/docs/GUIDE/GUIDE_2_7_Pagination_And_Ordering.md +3 -1
  10. package/docs/GUIDE/GUIDE_2_8_Effects_of_PUT_and_PATCH.md +12 -60
  11. package/docs/GUIDE/GUIDE_2_Data_And_Relations.md +2 -2
  12. package/docs/GUIDE/GUIDE_3_Field_Transformations.md +5 -1
  13. package/docs/GUIDE/GUIDE_7_Hooks_Data_Management_And_Plugins.md +2 -0
  14. package/docs/GUIDE/GUIDE_X_Autofiltering.md +355 -0
  15. package/docs/GUIDE/GUIDE_X_Fastify.md +78 -0
  16. package/docs/GUIDE/GUIDE_X_Knex_Schema_And_Migrations.md +370 -0
  17. package/docs/GUIDE/GUIDE_X_Query_Projections.md +159 -0
  18. package/docs/GUIDE/GUIDE_X_Writing_Plugins.md +199 -0
  19. package/docs/GUIDE/index.md +18 -9
  20. package/docs/QUICKSTART.md +5 -1
  21. package/docs/index.md +1 -1
  22. package/index.js +3 -2
  23. package/lib/enhanced-logger.js +1 -1
  24. package/package.json +6 -2
  25. package/plugins/core/bulk-operations-plugin.js +26 -34
  26. package/plugins/core/connectors/express-plugin.js +97 -190
  27. package/plugins/core/connectors/fastify-plugin.js +206 -0
  28. package/plugins/core/connectors/lib/busboy-detector.js +4 -4
  29. package/plugins/core/connectors/lib/connector-core.js +195 -0
  30. package/plugins/core/connectors/lib/transport-http-helpers.js +122 -0
  31. package/plugins/core/connectors/lib/transport-route-schemas.js +92 -0
  32. package/plugins/core/lib/anyapi/schema-utils.js +43 -4
  33. package/plugins/core/lib/anyapi/utils/descriptor-helpers.js +4 -1
  34. package/plugins/core/lib/dbIntrospection.js +1078 -0
  35. package/plugins/core/lib/dbTablesOperations.js +1111 -160
  36. package/plugins/core/lib/querying/knex-cross-table-search.js +0 -7
  37. package/plugins/core/lib/querying/knex-json-api-transformers-querying.js +5 -3
  38. package/plugins/core/lib/querying/knex-process-includes.js +3 -4
  39. package/plugins/core/lib/querying/knex-query-helpers.js +21 -76
  40. package/plugins/core/lib/querying/knex-relationship-includes.js +468 -215
  41. package/plugins/core/lib/querying/query-builder-utils.js +19 -0
  42. package/plugins/core/lib/querying/query-field-sort-helpers.js +135 -0
  43. package/plugins/core/lib/querying/sort-helpers.js +33 -0
  44. package/plugins/core/lib/querying/storage-adapter-utils.js +51 -0
  45. package/plugins/core/lib/querying/url-helpers.js +8 -2
  46. package/plugins/core/lib/querying-writing/compile-schemas.js +20 -5
  47. package/plugins/core/lib/querying-writing/knex-field-helpers.js +83 -14
  48. package/plugins/core/lib/querying-writing/knex-json-api-transformers.js +13 -12
  49. package/plugins/core/lib/querying-writing/query-field-helpers.js +88 -0
  50. package/plugins/core/lib/querying-writing/request-contracts.js +590 -0
  51. package/plugins/core/lib/querying-writing/resource-id-normalization.js +131 -0
  52. package/plugins/core/lib/querying-writing/schema-helpers.js +0 -2
  53. package/plugins/core/lib/querying-writing/simplified-helpers.js +4 -11
  54. package/plugins/core/lib/storage/canonical-storage-mapping.js +133 -0
  55. package/plugins/core/lib/storage/storage-adapter.js +82 -4
  56. package/plugins/core/lib/storage/storage-mapping.js +274 -0
  57. package/plugins/core/lib/writing/many-to-many-manipulations.js +4 -2
  58. package/plugins/core/rest-api-anyapi-knex-plugin.js +531 -312
  59. package/plugins/core/rest-api-autofilter-plugin.js +414 -0
  60. package/plugins/core/rest-api-knex-plugin.js +271 -226
  61. package/plugins/core/rest-api-plugin-hooks/register-relationship-routes.js +10 -5
  62. package/plugins/core/rest-api-plugin-hooks/register-scope-routes.js +12 -6
  63. package/plugins/core/rest-api-plugin-hooks/turn-scope-init-into-vars.js +1 -0
  64. package/plugins/core/rest-api-plugin-methods/apply-query-filters.js +41 -0
  65. package/plugins/core/rest-api-plugin-methods/common.js +148 -92
  66. package/plugins/core/rest-api-plugin-methods/delete-relationship.js +11 -2
  67. package/plugins/core/rest-api-plugin-methods/delete.js +6 -1
  68. package/plugins/core/rest-api-plugin-methods/enrich-attributes.js +6 -1
  69. package/plugins/core/rest-api-plugin-methods/get-related.js +7 -2
  70. package/plugins/core/rest-api-plugin-methods/get-relationship.js +7 -2
  71. package/plugins/core/rest-api-plugin-methods/get.js +29 -14
  72. package/plugins/core/rest-api-plugin-methods/patch-relationship.js +10 -3
  73. package/plugins/core/rest-api-plugin-methods/patch.js +56 -12
  74. package/plugins/core/rest-api-plugin-methods/post-relationship.js +11 -2
  75. package/plugins/core/rest-api-plugin-methods/post.js +21 -8
  76. package/plugins/core/rest-api-plugin-methods/put.js +73 -21
  77. package/plugins/core/rest-api-plugin-methods/query.js +15 -53
  78. package/plugins/core/rest-api-plugin-methods/release.js +0 -2
  79. package/plugins/core/rest-api-plugin.js +6 -0
  80. package/plugins/core/rest-api-positioning-plugin.js +2 -5
  81. package/plugins/core/rest-api-query-projections-plugin.js +130 -0
  82. package/plugins/core/socketio-plugin.js +1 -4
  83. package/plugins/storage/local-storage.js +1 -1
  84. package/plugins/storage/s3-storage.js +5 -2
  85. package/quickTest.js +1 -0
  86. package/scripts/run-docs.js +80 -84
  87. package/test-debug.js +1 -1
  88. package/tests/README.md +7 -0
  89. package/tests/anyapi-basic.test.js +3 -0
  90. package/tests/autofilter.test.js +463 -0
  91. package/tests/custom-id-mysql-returning-fallback.test.js +128 -0
  92. package/tests/custom-id-simplified-post.test.js +75 -0
  93. package/tests/custom-idproperty-relationships.test.js +33 -0
  94. package/tests/db-introspection.test.js +521 -0
  95. package/tests/db-table-operations.test.js +786 -0
  96. package/tests/fastify-plugin.test.js +156 -0
  97. package/tests/field-getters.test.js +1 -2
  98. package/tests/field-setters.test.js +0 -4
  99. package/tests/fixtures/api-configs.js +278 -176
  100. package/tests/helpers/fake-fastify.js +99 -0
  101. package/tests/http-connectors-parity.test.js +235 -0
  102. package/tests/id-normalization.test.js +444 -0
  103. package/tests/logical-id-write-validation.test.js +151 -0
  104. package/tests/pagination-cursor-multifield.test.js +11 -11
  105. package/tests/projected-fields.test.js +319 -0
  106. package/tests/relationships.test.js +3 -3
  107. package/tests/searchschema-knex-behavior.test.js +187 -0
  108. package/tests/searchschema-merge.test.js +21 -69
  109. package/tests/storage-mapping.test.js +259 -0
  110. package/audit/00-charter.md +0 -103
  111. package/audit/01-scope-map.md +0 -84
  112. package/audit/02-coverage-matrix.csv +0 -174
  113. package/audit/03-invariants.md +0 -123
  114. package/audit/04-standards-rubric.md +0 -56
  115. package/audit/05-competitor-rubric.md +0 -77
  116. package/audit/06-findings.md +0 -160
  117. package/audit/07-risk-register.csv +0 -10
  118. package/audit/08-remediation-roadmap.md +0 -177
  119. package/audit/09-signoff-check.md +0 -23
  120. package/audit/10-final-synthesis.md +0 -29
  121. package/audit/evidence/code/all-files-json-rest-api.txt +0 -168
  122. package/audit/evidence/code/all-files-json-rest-schema.txt +0 -12
  123. package/audit/evidence/code/boundary-leak-checks.txt +0 -72
  124. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__bulk-operations-plugin.js.txt +0 -480
  125. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__express-plugin.js.txt +0 -532
  126. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__busboy-detector.js.txt +0 -175
  127. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__formidable-detector.js.txt +0 -138
  128. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__request-helpers.js.txt +0 -222
  129. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__file-handling-plugin.js.txt +0 -342
  130. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__dbTablesOperations.js.txt +0 -304
  131. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__fractional-positioning.js.txt +0 -188
  132. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__compile-schemas.js.txt +0 -336
  133. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__connectors-query-parser.js.txt +0 -165
  134. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-capabilities.js.txt +0 -265
  135. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-value-normalizers.js.txt +0 -369
  136. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__default-data-helpers.js.txt +0 -72
  137. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__field-utils.js.txt +0 -139
  138. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-constants.js.txt +0 -45
  139. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-field-helpers.js.txt +0 -396
  140. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-json-api-transformers.js.txt +0 -162
  141. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__payload-validators.js.txt +0 -1314
  142. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__schema-helpers.js.txt +0 -488
  143. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__scope-validations.js.txt +0 -484
  144. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__simplified-helpers.js.txt +0 -857
  145. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-cross-table-search.js.txt +0 -565
  146. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-json-api-transformers-querying.js.txt +0 -485
  147. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-pagination-helpers.js.txt +0 -560
  148. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-process-includes.js.txt +0 -167
  149. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers-base.js.txt +0 -109
  150. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers.js.txt +0 -1064
  151. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-relationship-includes.js.txt +0 -1983
  152. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-window-queries.js.txt +0 -328
  153. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__url-helpers.js.txt +0 -119
  154. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__storage__storage-adapter.js.txt +0 -160
  155. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__many-to-many-manipulations.js.txt +0 -300
  156. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__relationship-processor.js.txt +0 -245
  157. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-access.js.txt +0 -459
  158. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-cors-plugin.js.txt +0 -237
  159. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-knex-plugin.js.txt +0 -1135
  160. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-multihome-plugin.js.txt +0 -314
  161. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__compile-resource-schemas.js.txt +0 -7
  162. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-relationship-routes.js.txt +0 -71
  163. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-scope-routes.js.txt +0 -102
  164. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__turn-scope-init-into-vars.js.txt +0 -49
  165. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__validate-include-configurations.js.txt +0 -39
  166. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__add-route.js.txt +0 -23
  167. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__check-permissions.js.txt +0 -13
  168. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__common.js.txt +0 -639
  169. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete-relationship.js.txt +0 -117
  170. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete.js.txt +0 -104
  171. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__enrich-attributes.js.txt +0 -199
  172. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-related.js.txt +0 -353
  173. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-relationship.js.txt +0 -61
  174. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get.js.txt +0 -184
  175. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch-relationship.js.txt +0 -55
  176. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch.js.txt +0 -191
  177. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post-relationship.js.txt +0 -110
  178. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post.js.txt +0 -168
  179. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__put.js.txt +0 -253
  180. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__query.js.txt +0 -207
  181. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__release.js.txt +0 -12
  182. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin.js.txt +0 -165
  183. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-positioning-plugin.js.txt +0 -668
  184. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__socketio-plugin.js.txt +0 -621
  185. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__local-storage.js.txt +0 -218
  186. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__s3-storage.js.txt +0 -124
  187. package/audit/evidence/code/critical-pass1/json-rest-schema__src__CorePlugin.js.txt +0 -269
  188. package/audit/evidence/code/critical-pass1/json-rest-schema__src__Schema.js.txt +0 -242
  189. package/audit/evidence/code/critical-pass1/json-rest-schema__src__index.js.txt +0 -77
  190. package/audit/evidence/code/critical-pass1-risk-keywords.txt +0 -238
  191. package/audit/evidence/code/critical-pass1-summary.csv +0 -67
  192. package/audit/evidence/code/critical-pass2-summary.csv +0 -67
  193. package/audit/evidence/code/early-silent-zones-no-test-token.txt +0 -57
  194. package/audit/evidence/code/error-model-signals.txt +0 -98
  195. package/audit/evidence/code/git-files-json-rest-api.txt +0 -171
  196. package/audit/evidence/code/git-files-json-rest-schema.txt +0 -27
  197. package/audit/evidence/code/hook-flow-signals.txt +0 -282
  198. package/audit/evidence/code/idproperty-signals.txt +0 -157
  199. package/audit/evidence/code/import-cycles-non-anyapi.txt +0 -3
  200. package/audit/evidence/code/import-hotspots-non-anyapi.txt +0 -96
  201. package/audit/evidence/code/imports-json-rest-api.txt +0 -354
  202. package/audit/evidence/code/imports-json-rest-schema.txt +0 -15
  203. package/audit/evidence/code/in-scope-files-json-rest-api.txt +0 -160
  204. package/audit/evidence/code/in-scope-files-json-rest-schema.txt +0 -13
  205. package/audit/evidence/code/non-anyapi-core-files.txt +0 -101
  206. package/audit/evidence/code/permission-signals.txt +0 -193
  207. package/audit/evidence/code/query-include-signals.txt +0 -687
  208. package/audit/evidence/code/transaction-signals.txt +0 -28
  209. package/audit/evidence/code/validation-signals.txt +0 -650
  210. package/audit/evidence/code/write-path-signals.txt +0 -61
  211. package/audit/evidence/docs/docs-claims-signals.txt +0 -1075
  212. package/audit/evidence/docs/schema-docs-claims-signals.txt +0 -179
  213. package/audit/evidence/external/corpus-freeze.md +0 -21
  214. package/audit/evidence/external/npm-competitor-metadata.txt +0 -70
  215. package/audit/evidence/external/npm-download-signals.txt +0 -23
  216. package/audit/evidence/external/npm-jsonapi-server.txt +0 -8
  217. package/audit/evidence/external/npm-modern-jsonapi-metadata.txt +0 -38
  218. package/audit/evidence/external/readme-fortune-signals.txt +0 -26
  219. package/audit/evidence/external/readme-fortune.md +0 -165
  220. package/audit/evidence/external/readme-json-api-serializer-signals.txt +0 -80
  221. package/audit/evidence/external/readme-json-api-serializer.md +0 -690
  222. package/audit/evidence/external/readme-jsonapi-serde-server-signals.txt +0 -0
  223. package/audit/evidence/external/readme-jsonapi-serde-server.md +0 -22
  224. package/audit/evidence/external/readme-jsonapi-serializer-signals.txt +0 -63
  225. package/audit/evidence/external/readme-jsonapi-serializer.md +0 -315
  226. package/audit/evidence/external/readme-jsonapi-server-signals.txt +0 -19
  227. package/audit/evidence/external/readme-jsonapi-server.md +0 -104
  228. package/audit/evidence/external/readme-nestjs-json-api-signals.txt +0 -4
  229. package/audit/evidence/external/readme-nestjs-json-api.md +0 -94
  230. package/audit/evidence/external/readme-yaser-json-api-nestjs-signals.txt +0 -47
  231. package/audit/evidence/external/readme-yaser-json-api-nestjs.md +0 -447
  232. package/audit/evidence/external/standard-jsonapi-snippets.txt +0 -84
  233. package/audit/evidence/external/standard-rfc-snippets.txt +0 -168
  234. package/audit/evidence/external/standards-sources.txt +0 -6
  235. package/audit/evidence/runtime/baseline-commits.txt +0 -2
  236. package/audit/evidence/runtime/db-adapter-assumptions.txt +0 -3
  237. package/audit/evidence/runtime/environment.txt +0 -4
  238. package/audit/evidence/runtime/invariant-runtime-mapping.md +0 -38
  239. package/audit/evidence/runtime/probe-patch-relationship-error.exitcode +0 -1
  240. package/audit/evidence/runtime/probe-patch-relationship-error.log +0 -76
  241. package/audit/evidence/runtime/probe-patch-relationship-error.mjs +0 -67
  242. package/audit/evidence/runtime/probe-patch-relationship-referenceerror.exitcode +0 -1
  243. package/audit/evidence/runtime/probe-patch-relationship-referenceerror.log +0 -62
  244. package/audit/evidence/runtime/probe-patch-relationship-referenceerror.mjs +0 -47
  245. package/audit/evidence/runtime/test-exitcodes.txt +0 -4
  246. package/audit/evidence/runtime/test-summary.md +0 -107
  247. package/audit/evidence/runtime/trace-anchors.txt +0 -61
  248. package/audit/evidence/tests/access-multitenancy-test-signals.txt +0 -125
  249. package/audit/evidence/tests/failing-tests-summary.txt +0 -25
  250. package/audit/evidence/tests/npm-test-json-rest-api.exitcode +0 -1
  251. package/audit/evidence/tests/npm-test-json-rest-api.log +0 -5885
  252. package/audit/evidence/tests/npm-test-json-rest-schema.exitcode +0 -1
  253. package/audit/evidence/tests/npm-test-json-rest-schema.log +0 -356
  254. package/audit/evidence/tests/query-include-test-signals.txt +0 -948
  255. package/audit/evidence/tests/relationship-test-signals.txt +0 -223
  256. package/audit/evidence/tests/skipped-tests.txt +0 -10
  257. package/audit/evidence/tests/test-suite-list-non-anyapi.txt +0 -30
  258. package/audit/evidence/tests/test-suite-list.txt +0 -32
  259. package/audit/subsystems/docs-drift.md +0 -49
  260. package/audit/subsystems/pass2-cross-review.md +0 -131
  261. package/audit/subsystems/plugins-access.md +0 -51
  262. package/audit/subsystems/plugins-bulk.md +0 -50
  263. package/audit/subsystems/plugins-cors.md +0 -48
  264. package/audit/subsystems/plugins-file.md +0 -53
  265. package/audit/subsystems/plugins-multihome.md +0 -50
  266. package/audit/subsystems/plugins-positioning.md +0 -54
  267. package/audit/subsystems/plugins-socketio.md +0 -50
  268. package/audit/subsystems/query-engine.md +0 -61
  269. package/audit/subsystems/relationships.md +0 -55
  270. package/audit/subsystems/rest-orchestration.md +0 -66
  271. package/audit/subsystems/schema-core.md +0 -64
  272. package/audit/subsystems/storage-knex.md +0 -57
  273. package/audit/subsystems/tests.md +0 -48
  274. package/audit/subsystems/transport-express.md +0 -55
  275. package/audit/traces/trace-read-get.md +0 -22
  276. package/audit/traces/trace-read-query.md +0 -25
  277. package/audit/traces/trace-relationship-endpoints.md +0 -31
  278. package/audit/traces/trace-write-delete.md +0 -17
  279. package/audit/traces/trace-write-patch.md +0 -26
  280. package/audit/traces/trace-write-post.md +0 -22
  281. package/audit/traces/trace-write-put.md +0 -23
  282. package/docs/GUIDE/GUIDE_4_Authentication_And_Permissions.md +0 -707
  283. package/docs/GUIDE/GUIDE_X_Multihome.md +0 -666
  284. package/plugins/core/lib/querying-writing/payload-validators.js +0 -1314
  285. package/plugins/core/rest-api-access.js +0 -459
  286. package/plugins/core/rest-api-multihome-plugin.js +0 -314
  287. package/tests/multihome.test.js +0 -553
  288. package/tests/multihome.test.js.bak +0 -550
  289. package/tests/ownership-optout.test.js +0 -76
  290. package/tests/rest-api-access.test.js +0 -206
@@ -208,7 +208,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
208
208
  let foundRelationship = null
209
209
  let relationshipType = null
210
210
  let relationshipField = null
211
- let relationshipDef = null
212
211
 
213
212
  if (currentRelationships) {
214
213
  for (const [relName, relDef] of Object.entries(currentRelationships)) {
@@ -222,7 +221,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
222
221
  foundRelationship = targetScope
223
222
  relationshipType = 'hasManyPolymorphic'
224
223
  relationshipField = { typeField, idField, via: relDef.via }
225
- relationshipDef = relDef
226
224
  log.trace('[BUILD-JOIN] Found polymorphic hasMany relationship:', {
227
225
  relName, targetScope, via: relDef.via, typeField, idField
228
226
  })
@@ -238,7 +236,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
238
236
  foreignKey: relDef.foreignKey,
239
237
  otherKey: relDef.otherKey
240
238
  }
241
- relationshipDef = relDef
242
239
  log.trace('[BUILD-JOIN] Found many-to-many relationship:', {
243
240
  relName,
244
241
  targetScope,
@@ -256,7 +253,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
256
253
  log.error('[BUILD-JOIN] Missing foreignKey in hasMany relationship:', { relName, currentScope })
257
254
  throw new Error(`Missing foreignKey in hasMany relationship '${relName}' for scope '${currentScope}'`)
258
255
  }
259
- relationshipDef = relDef
260
256
  log.trace('[BUILD-JOIN] Found hasMany relationship:', { relName, targetScope, foreignKey: relationshipField })
261
257
  break
262
258
  }
@@ -269,7 +265,6 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
269
265
  foundRelationship = targetScope
270
266
  relationshipType = 'belongsTo'
271
267
  relationshipField = fieldName
272
- relationshipDef = fieldDef
273
268
  log.trace('[BUILD-JOIN] Found belongsTo relationship:', { fieldName, targetScope })
274
269
  break
275
270
  }
@@ -282,9 +277,7 @@ export const buildJoinChain = async (scopes, log, fromScopeName, targetPath, sea
282
277
  )
283
278
  }
284
279
 
285
- const sourceSchema = scopes[currentScope].vars.schemaInfo.schemaInstance
286
280
  const sourceTableName = scopes[currentScope].vars.schemaInfo.tableName
287
- const targetSchemaInstance = scopes[targetScope].vars.schemaInfo.schemaInstance
288
281
  const targetTableName = scopes[targetScope].vars.schemaInfo.tableName
289
282
 
290
283
  if (relationshipType === 'manyToMany') {
@@ -1,6 +1,7 @@
1
1
  import { getForeignKeyFields as getForeignKeyFieldsFromUtils } from '../querying-writing/field-utils.js'
2
2
  import { RELATIONSHIPS_KEY, RELATIONSHIP_METADATA_KEY, ROW_NUMBER_KEY, COMPUTED_DEPENDENCIES_KEY, getSchemaStructure } from '../querying-writing/knex-constants.js'
3
3
  import { getUrlPrefix, buildResourceUrl, buildRelationshipUrl } from './url-helpers.js'
4
+ import { translateRecordFromStorage } from '../storage/storage-mapping.js'
4
5
 
5
6
  /**
6
7
  * Transforms a flat database record into JSON:API resource format
@@ -75,14 +76,16 @@ import { getUrlPrefix, buildResourceUrl, buildRelationshipUrl } from './url-help
75
76
  const toJsonApi = (scope, record, deps) => {
76
77
  if (!record) return null
77
78
 
78
- const schemaInstance = scope.vars.schemaInfo.schemaInstance
79
+ const schemaInfo = scope.vars.schemaInfo
80
+ const schemaInstance = schemaInfo.schemaInstance
81
+ const logicalRecord = translateRecordFromStorage(record, schemaInfo)
79
82
 
80
83
  const { context } = deps
81
84
  const scopeName = context.scopeName
82
85
  const idProperty = context.schemaInfo?.idProperty || 'id'
83
86
  const polymorphicFields = context.polymorphicFields || new Set()
84
87
 
85
- const { id, ...allAttributes } = record
88
+ const { id, ...allAttributes } = logicalRecord
86
89
 
87
90
  const foreignKeys = schemaInstance ? getForeignKeyFieldsFromUtils(schemaInstance) : new Set()
88
91
 
@@ -436,7 +439,6 @@ export const buildJsonApiResponse = async (scope, records, included = [], isSing
436
439
  return jsonApiRecord
437
440
  })
438
441
 
439
- const urlPrefix = context.urlPrefix || scope.vars.transport?.mountPath || ''
440
442
  const normalizedData = isSingle ? processedRecords[0] : processedRecords
441
443
 
442
444
  if (normalizedData) {
@@ -111,7 +111,6 @@ export const processIncludes = async (scope, records, deps) => {
111
111
 
112
112
  const db = context.transaction || knex
113
113
  const queryParams = context.queryParams
114
- const idProperty = context.schemaInfo.idProperty
115
114
 
116
115
  if (!queryParams.include) {
117
116
  return []
@@ -124,15 +123,15 @@ export const processIncludes = async (scope, records, deps) => {
124
123
  records,
125
124
  scopeName,
126
125
  includeParam: queryParams.include,
127
- fields: queryParams.fields || {},
128
- idProperty
126
+ fields: queryParams.fields || {}
129
127
  },
130
128
  {
131
129
  context: {
132
130
  scopes,
133
131
  log,
134
132
  knex: db,
135
- capabilities: api?.knex?.capabilities
133
+ capabilities: api?.knex?.capabilities,
134
+ requestContext: context
136
135
  }
137
136
  }
138
137
  )
@@ -1,12 +1,11 @@
1
1
  import { analyzeRequiredIndexes, buildJoinChain } from './knex-cross-table-search.js'
2
+ import { createStorageAdapterUtilities } from './storage-adapter-utils.js'
2
3
 
3
4
  // Resolve operator with sensible defaults for fields declared in searchSchema.
4
5
  // - If filterOperator is provided, use it as-is
5
- // - If field type is string and no operator provided, default to 'like' (contains)
6
- // - Otherwise default to '='
6
+ // - If no operator is provided, default to '='
7
7
  export function resolveSearchOperator (fieldDef) {
8
8
  if (fieldDef && fieldDef.filterOperator) return String(fieldDef.filterOperator)
9
- if (fieldDef && fieldDef.type === 'string') return 'like'
10
9
  return '='
11
10
  }
12
11
 
@@ -74,58 +73,6 @@ export function applyWhereForOperator ({ builder, columnRef, operator, value, kn
74
73
  builder[method](columnRef, operator || '=', firstVal)
75
74
  }
76
75
 
77
- const createAdapterUtilities = (hookParams, { getStorageAdapter } = {}) => {
78
- const context = hookParams.context || {}
79
- const storageCache = new Map()
80
-
81
- const fetchStorageAdapter = (scopeName) => {
82
- if (!scopeName) return null
83
- if (storageCache.has(scopeName)) return storageCache.get(scopeName)
84
-
85
- let adapter = null
86
- if (scopeName === context?.knexQuery?.scopeName) {
87
- adapter = context.storageAdapter ||
88
- context.knexQuery?.storageAdapter ||
89
- (typeof getStorageAdapter === 'function' ? getStorageAdapter(scopeName) : null)
90
- if (adapter && !context.storageAdapter) {
91
- context.storageAdapter = adapter
92
- }
93
- } else {
94
- adapter = typeof getStorageAdapter === 'function' ? getStorageAdapter(scopeName) : null
95
- }
96
-
97
- storageCache.set(scopeName, adapter)
98
- return adapter
99
- }
100
-
101
- const defaultAliasForScope = (scopeName) => {
102
- if (scopeName === context?.knexQuery?.scopeName) {
103
- return context.knexQuery?.tableName || scopeName
104
- }
105
- return scopeName
106
- }
107
-
108
- const translateColumn = (scopeName, field, alias = defaultAliasForScope(scopeName)) => {
109
- const adapter = fetchStorageAdapter(scopeName)
110
- const translated = adapter?.translateColumn?.(field) ?? field
111
- if (!alias) return translated
112
- return `${alias}.${translated}`
113
- }
114
-
115
- const translateFilterValue = (scopeName, field, value) => {
116
- const adapter = fetchStorageAdapter(scopeName)
117
- if (!adapter?.translateFilterValue) return value
118
- return adapter.translateFilterValue(field, value)
119
- }
120
-
121
- return {
122
- fetchStorageAdapter,
123
- defaultAliasForScope,
124
- translateColumn,
125
- translateFilterValue,
126
- }
127
- }
128
-
129
76
  /**
130
77
  * Processes filters that target polymorphic relationships where a single relationship can point to different types of resources
131
78
  *
@@ -201,7 +148,7 @@ const createAdapterUtilities = (hookParams, { getStorageAdapter } = {}) => {
201
148
  */
202
149
  export const polymorphicFiltersHook = async (hookParams, dependencies) => {
203
150
  const { log, scopes, knex } = dependencies
204
- const adapterUtils = createAdapterUtilities(hookParams, dependencies)
151
+ const adapterUtils = createStorageAdapterUtilities(hookParams, dependencies)
205
152
 
206
153
  // Extract context
207
154
  const scopeName = hookParams.context?.knexQuery?.scopeName
@@ -209,13 +156,13 @@ export const polymorphicFiltersHook = async (hookParams, dependencies) => {
209
156
  const query = hookParams.context?.knexQuery?.query
210
157
  const db = hookParams.context?.knexQuery?.db || knex
211
158
 
212
- const schemaInfo = scopes[scopeName].vars.schemaInfo
213
- const tableAlias = adapterUtils.defaultAliasForScope(scopeName)
214
-
215
- if (!filters) {
159
+ if (!scopeName || !filters || !scopes[scopeName]) {
216
160
  return
217
161
  }
218
162
 
163
+ const schemaInfo = scopes[scopeName].vars.schemaInfo
164
+ const tableAlias = adapterUtils.defaultAliasForScope(scopeName)
165
+
219
166
  // Step 1: Identify polymorphic searches
220
167
  const polymorphicSearches = new Map()
221
168
  const polymorphicJoins = new Map()
@@ -244,7 +191,7 @@ export const polymorphicFiltersHook = async (hookParams, dependencies) => {
244
191
  // Step 2: Build polymorphic JOINs
245
192
  log.trace('[POLYMORPHIC-SEARCH] Building JOINs for polymorphic searches')
246
193
 
247
- for (const [filterKey, searchInfo] of polymorphicSearches) {
194
+ for (const [, searchInfo] of polymorphicSearches) {
248
195
  const { fieldDef, polymorphicField } = searchInfo
249
196
 
250
197
  // Get the relationship definition
@@ -525,7 +472,7 @@ export const polymorphicFiltersHook = async (hookParams, dependencies) => {
525
472
  */
526
473
  export const crossTableFiltersHook = async (hookParams, dependencies) => {
527
474
  const { log, scopes, knex } = dependencies
528
- const adapterUtils = createAdapterUtilities(hookParams, dependencies)
475
+ const adapterUtils = createStorageAdapterUtilities(hookParams, dependencies)
529
476
 
530
477
  // Extract context
531
478
  const scopeName = hookParams.context?.knexQuery?.scopeName
@@ -533,16 +480,15 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
533
480
  const query = hookParams.context?.knexQuery?.query
534
481
  const db = hookParams.context?.knexQuery?.db || knex
535
482
 
483
+ if (!scopeName || !filters || !scopes[scopeName]) {
484
+ return
485
+ }
486
+
536
487
  const schemaInfo = scopes[scopeName].vars.schemaInfo
537
- const tableName = schemaInfo.tableName
538
488
  const tableAlias = adapterUtils.defaultAliasForScope(scopeName)
539
489
  const aliasScopeMap = new Map()
540
490
  aliasScopeMap.set(tableAlias, scopeName)
541
491
 
542
- if (!filters) {
543
- return
544
- }
545
-
546
492
  // Step 1: Analyze indexes
547
493
  const requiredIndexes = analyzeRequiredIndexes(scopes, log, scopeName, schemaInfo)
548
494
  if (requiredIndexes.length > 0) {
@@ -783,7 +729,7 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
783
729
  fieldDef.applyFilter.call(this, this, filterValue)
784
730
  break
785
731
 
786
- default:
732
+ default: {
787
733
  const targetField = fieldDef.actualField || filterKey
788
734
  const columnRef = resolveFieldColumn(targetField)
789
735
  const operator = resolveSearchOperator(fieldDef)
@@ -791,6 +737,7 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
791
737
  applyWhereForOperator({ builder: this, columnRef, operator, value: normalized, knex })
792
738
  break
793
739
  }
740
+ }
794
741
  }
795
742
  })
796
743
  }
@@ -938,13 +885,15 @@ export const crossTableFiltersHook = async (hookParams, dependencies) => {
938
885
  */
939
886
  export const basicFiltersHook = async (hookParams, dependencies) => {
940
887
  const { log, scopes, knex } = dependencies
941
- const adapterUtils = createAdapterUtilities(hookParams, dependencies)
888
+ const adapterUtils = createStorageAdapterUtilities(hookParams, dependencies)
942
889
 
943
890
  // Extract context
944
891
  const scopeName = hookParams.context?.knexQuery?.scopeName
945
892
  const filters = hookParams.context?.knexQuery?.filters
946
893
  const query = hookParams.context?.knexQuery?.query
947
- const db = hookParams.context?.knexQuery?.db || knex
894
+ if (!scopeName || !filters || !scopes[scopeName]) {
895
+ return
896
+ }
948
897
 
949
898
  const schemaInfo = scopes[scopeName].vars.schemaInfo
950
899
  const tableName = schemaInfo.tableName
@@ -958,11 +907,6 @@ export const basicFiltersHook = async (hookParams, dependencies) => {
958
907
  tableName
959
908
  })
960
909
 
961
- if (!filters) {
962
- log.trace('[DEBUG basicFiltersHook] Returning early - no filters')
963
- return
964
- }
965
-
966
910
  // Check if we have any JOINs applied (to know if we need to qualify fields)
967
911
  // Instead of relying on hasJoins flag, always qualify fields for safety
968
912
  const qualifyField = (field) => adapterUtils.translateColumn(scopeName, field, tableAlias)
@@ -1047,7 +991,7 @@ export const basicFiltersHook = async (hookParams, dependencies) => {
1047
991
  fieldDef.applyFilter.call(this, this, filterValue)
1048
992
  break
1049
993
 
1050
- default:
994
+ default: {
1051
995
  // Standard filtering
1052
996
  const actualField = fieldDef.actualField || filterKey
1053
997
  // Always qualify field names
@@ -1059,6 +1003,7 @@ export const basicFiltersHook = async (hookParams, dependencies) => {
1059
1003
  applyWhereForOperator({ builder: this, columnRef: dbField, operator, value: normalized, knex })
1060
1004
  break
1061
1005
  }
1006
+ }
1062
1007
  }
1063
1008
  })
1064
1009
  }