json-rest-api 1.0.20 → 1.0.22

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 (173) hide show
  1. package/audit/00-charter.md +103 -0
  2. package/audit/01-scope-map.md +84 -0
  3. package/audit/02-coverage-matrix.csv +174 -0
  4. package/audit/03-invariants.md +123 -0
  5. package/audit/04-standards-rubric.md +56 -0
  6. package/audit/05-competitor-rubric.md +77 -0
  7. package/audit/06-findings.md +160 -0
  8. package/audit/07-risk-register.csv +10 -0
  9. package/audit/08-remediation-roadmap.md +177 -0
  10. package/audit/09-signoff-check.md +23 -0
  11. package/audit/10-final-synthesis.md +29 -0
  12. package/audit/evidence/code/all-files-json-rest-api.txt +168 -0
  13. package/audit/evidence/code/all-files-json-rest-schema.txt +12 -0
  14. package/audit/evidence/code/boundary-leak-checks.txt +72 -0
  15. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__bulk-operations-plugin.js.txt +480 -0
  16. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__express-plugin.js.txt +532 -0
  17. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__busboy-detector.js.txt +175 -0
  18. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__formidable-detector.js.txt +138 -0
  19. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__request-helpers.js.txt +222 -0
  20. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__file-handling-plugin.js.txt +342 -0
  21. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__dbTablesOperations.js.txt +304 -0
  22. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__fractional-positioning.js.txt +188 -0
  23. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__compile-schemas.js.txt +336 -0
  24. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__connectors-query-parser.js.txt +165 -0
  25. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-capabilities.js.txt +265 -0
  26. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-value-normalizers.js.txt +369 -0
  27. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__default-data-helpers.js.txt +72 -0
  28. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__field-utils.js.txt +139 -0
  29. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-constants.js.txt +45 -0
  30. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-field-helpers.js.txt +396 -0
  31. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-json-api-transformers.js.txt +162 -0
  32. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__payload-validators.js.txt +1314 -0
  33. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__schema-helpers.js.txt +488 -0
  34. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__scope-validations.js.txt +484 -0
  35. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__simplified-helpers.js.txt +857 -0
  36. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-cross-table-search.js.txt +565 -0
  37. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-json-api-transformers-querying.js.txt +485 -0
  38. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-pagination-helpers.js.txt +560 -0
  39. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-process-includes.js.txt +167 -0
  40. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers-base.js.txt +109 -0
  41. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers.js.txt +1064 -0
  42. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-relationship-includes.js.txt +1983 -0
  43. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-window-queries.js.txt +328 -0
  44. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__url-helpers.js.txt +119 -0
  45. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__storage__storage-adapter.js.txt +160 -0
  46. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__many-to-many-manipulations.js.txt +300 -0
  47. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__relationship-processor.js.txt +245 -0
  48. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-access.js.txt +459 -0
  49. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-cors-plugin.js.txt +237 -0
  50. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-knex-plugin.js.txt +1135 -0
  51. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-multihome-plugin.js.txt +314 -0
  52. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__compile-resource-schemas.js.txt +7 -0
  53. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-relationship-routes.js.txt +71 -0
  54. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-scope-routes.js.txt +102 -0
  55. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__turn-scope-init-into-vars.js.txt +49 -0
  56. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__validate-include-configurations.js.txt +39 -0
  57. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__add-route.js.txt +23 -0
  58. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__check-permissions.js.txt +13 -0
  59. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__common.js.txt +639 -0
  60. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete-relationship.js.txt +117 -0
  61. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete.js.txt +104 -0
  62. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__enrich-attributes.js.txt +199 -0
  63. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-related.js.txt +353 -0
  64. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-relationship.js.txt +61 -0
  65. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get.js.txt +184 -0
  66. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch-relationship.js.txt +55 -0
  67. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch.js.txt +191 -0
  68. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post-relationship.js.txt +110 -0
  69. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post.js.txt +168 -0
  70. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__put.js.txt +253 -0
  71. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__query.js.txt +207 -0
  72. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__release.js.txt +12 -0
  73. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin.js.txt +165 -0
  74. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-positioning-plugin.js.txt +668 -0
  75. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__socketio-plugin.js.txt +621 -0
  76. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__local-storage.js.txt +218 -0
  77. package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__s3-storage.js.txt +124 -0
  78. package/audit/evidence/code/critical-pass1/json-rest-schema__src__CorePlugin.js.txt +269 -0
  79. package/audit/evidence/code/critical-pass1/json-rest-schema__src__Schema.js.txt +242 -0
  80. package/audit/evidence/code/critical-pass1/json-rest-schema__src__index.js.txt +77 -0
  81. package/audit/evidence/code/critical-pass1-risk-keywords.txt +238 -0
  82. package/audit/evidence/code/critical-pass1-summary.csv +67 -0
  83. package/audit/evidence/code/critical-pass2-summary.csv +67 -0
  84. package/audit/evidence/code/early-silent-zones-no-test-token.txt +57 -0
  85. package/audit/evidence/code/error-model-signals.txt +98 -0
  86. package/audit/evidence/code/git-files-json-rest-api.txt +171 -0
  87. package/audit/evidence/code/git-files-json-rest-schema.txt +27 -0
  88. package/audit/evidence/code/hook-flow-signals.txt +282 -0
  89. package/audit/evidence/code/idproperty-signals.txt +157 -0
  90. package/audit/evidence/code/import-cycles-non-anyapi.txt +3 -0
  91. package/audit/evidence/code/import-hotspots-non-anyapi.txt +96 -0
  92. package/audit/evidence/code/imports-json-rest-api.txt +354 -0
  93. package/audit/evidence/code/imports-json-rest-schema.txt +15 -0
  94. package/audit/evidence/code/in-scope-files-json-rest-api.txt +160 -0
  95. package/audit/evidence/code/in-scope-files-json-rest-schema.txt +13 -0
  96. package/audit/evidence/code/non-anyapi-core-files.txt +101 -0
  97. package/audit/evidence/code/permission-signals.txt +193 -0
  98. package/audit/evidence/code/query-include-signals.txt +687 -0
  99. package/audit/evidence/code/transaction-signals.txt +28 -0
  100. package/audit/evidence/code/validation-signals.txt +650 -0
  101. package/audit/evidence/code/write-path-signals.txt +61 -0
  102. package/audit/evidence/docs/docs-claims-signals.txt +1075 -0
  103. package/audit/evidence/docs/schema-docs-claims-signals.txt +179 -0
  104. package/audit/evidence/external/corpus-freeze.md +21 -0
  105. package/audit/evidence/external/npm-competitor-metadata.txt +70 -0
  106. package/audit/evidence/external/npm-download-signals.txt +23 -0
  107. package/audit/evidence/external/npm-jsonapi-server.txt +8 -0
  108. package/audit/evidence/external/npm-modern-jsonapi-metadata.txt +38 -0
  109. package/audit/evidence/external/readme-fortune-signals.txt +26 -0
  110. package/audit/evidence/external/readme-fortune.md +165 -0
  111. package/audit/evidence/external/readme-json-api-serializer-signals.txt +80 -0
  112. package/audit/evidence/external/readme-json-api-serializer.md +690 -0
  113. package/audit/evidence/external/readme-jsonapi-serde-server-signals.txt +0 -0
  114. package/audit/evidence/external/readme-jsonapi-serde-server.md +22 -0
  115. package/audit/evidence/external/readme-jsonapi-serializer-signals.txt +63 -0
  116. package/audit/evidence/external/readme-jsonapi-serializer.md +315 -0
  117. package/audit/evidence/external/readme-jsonapi-server-signals.txt +19 -0
  118. package/audit/evidence/external/readme-jsonapi-server.md +104 -0
  119. package/audit/evidence/external/readme-nestjs-json-api-signals.txt +4 -0
  120. package/audit/evidence/external/readme-nestjs-json-api.md +94 -0
  121. package/audit/evidence/external/readme-yaser-json-api-nestjs-signals.txt +47 -0
  122. package/audit/evidence/external/readme-yaser-json-api-nestjs.md +447 -0
  123. package/audit/evidence/external/standard-jsonapi-snippets.txt +84 -0
  124. package/audit/evidence/external/standard-rfc-snippets.txt +168 -0
  125. package/audit/evidence/external/standards-sources.txt +6 -0
  126. package/audit/evidence/runtime/baseline-commits.txt +2 -0
  127. package/audit/evidence/runtime/db-adapter-assumptions.txt +3 -0
  128. package/audit/evidence/runtime/environment.txt +4 -0
  129. package/audit/evidence/runtime/invariant-runtime-mapping.md +38 -0
  130. package/audit/evidence/runtime/probe-patch-relationship-error.exitcode +1 -0
  131. package/audit/evidence/runtime/probe-patch-relationship-error.log +76 -0
  132. package/audit/evidence/runtime/probe-patch-relationship-error.mjs +67 -0
  133. package/audit/evidence/runtime/probe-patch-relationship-referenceerror.exitcode +1 -0
  134. package/audit/evidence/runtime/probe-patch-relationship-referenceerror.log +62 -0
  135. package/audit/evidence/runtime/probe-patch-relationship-referenceerror.mjs +47 -0
  136. package/audit/evidence/runtime/test-exitcodes.txt +4 -0
  137. package/audit/evidence/runtime/test-summary.md +107 -0
  138. package/audit/evidence/runtime/trace-anchors.txt +61 -0
  139. package/audit/evidence/tests/access-multitenancy-test-signals.txt +125 -0
  140. package/audit/evidence/tests/failing-tests-summary.txt +25 -0
  141. package/audit/evidence/tests/npm-test-json-rest-api.exitcode +1 -0
  142. package/audit/evidence/tests/npm-test-json-rest-api.log +5885 -0
  143. package/audit/evidence/tests/npm-test-json-rest-schema.exitcode +1 -0
  144. package/audit/evidence/tests/npm-test-json-rest-schema.log +356 -0
  145. package/audit/evidence/tests/query-include-test-signals.txt +948 -0
  146. package/audit/evidence/tests/relationship-test-signals.txt +223 -0
  147. package/audit/evidence/tests/skipped-tests.txt +10 -0
  148. package/audit/evidence/tests/test-suite-list-non-anyapi.txt +30 -0
  149. package/audit/evidence/tests/test-suite-list.txt +32 -0
  150. package/audit/subsystems/docs-drift.md +49 -0
  151. package/audit/subsystems/pass2-cross-review.md +131 -0
  152. package/audit/subsystems/plugins-access.md +51 -0
  153. package/audit/subsystems/plugins-bulk.md +50 -0
  154. package/audit/subsystems/plugins-cors.md +48 -0
  155. package/audit/subsystems/plugins-file.md +53 -0
  156. package/audit/subsystems/plugins-multihome.md +50 -0
  157. package/audit/subsystems/plugins-positioning.md +54 -0
  158. package/audit/subsystems/plugins-socketio.md +50 -0
  159. package/audit/subsystems/query-engine.md +61 -0
  160. package/audit/subsystems/relationships.md +55 -0
  161. package/audit/subsystems/rest-orchestration.md +66 -0
  162. package/audit/subsystems/schema-core.md +64 -0
  163. package/audit/subsystems/storage-knex.md +57 -0
  164. package/audit/subsystems/tests.md +48 -0
  165. package/audit/subsystems/transport-express.md +55 -0
  166. package/audit/traces/trace-read-get.md +22 -0
  167. package/audit/traces/trace-read-query.md +25 -0
  168. package/audit/traces/trace-relationship-endpoints.md +31 -0
  169. package/audit/traces/trace-write-delete.md +17 -0
  170. package/audit/traces/trace-write-patch.md +26 -0
  171. package/audit/traces/trace-write-post.md +22 -0
  172. package/audit/traces/trace-write-put.md +23 -0
  173. package/package.json +5 -5
@@ -0,0 +1,650 @@
1
+ plugins/core/rest-api-plugin-methods/patch.js:2:import { validatePatchPayload } from '../lib/querying-writing/payload-validators.js'
2
+ plugins/core/rest-api-plugin-methods/patch.js:8: validateResourceAttributesBeforeWrite,
3
+ plugins/core/rest-api-plugin-methods/patch.js:9: validateRelationshipAccess,
4
+ plugins/core/rest-api-plugin-methods/patch.js:11: validatePivotResource,
5
+ plugins/core/rest-api-plugin-methods/patch.js:42: const { schema, schemaStructure, schemaRelationships } = await setupCommonRequest({
6
+ plugins/core/rest-api-plugin-methods/patch.js:58: // Validate PATCH payload to ensure the partial update actually contains changes.
7
+ plugins/core/rest-api-plugin-methods/patch.js:64: validatePatchPayload(context.inputRecord, scopes)
8
+ plugins/core/rest-api-plugin-methods/patch.js:66: // Validate that user has read access to all related resources
9
+ plugins/core/rest-api-plugin-methods/patch.js:68: await validateRelationshipAccess(context, context.inputRecord, helpers, runHooks, api)
10
+ plugins/core/rest-api-plugin-methods/patch.js:78: await validateResourceAttributesBeforeWrite({
11
+ plugins/core/rest-api-plugin-methods/patch.js:80: schema,
12
+ plugins/core/rest-api-plugin-methods/patch.js:123: context.schemaInfo,
13
+ plugins/core/rest-api-plugin-methods/patch.js:154: validatePivotResource(scopes, relDef, relName)
14
+ plugins/core/rest-api-plugin-methods/patch.js:172: schemaStructure,
15
+ plugins/core/rest-api-plugin-methods/patch.js:173: schemaRelationships,
16
+ plugins/core/rest-api-plugin-methods/put.js:2:import { validatePutPayload } from '../lib/querying-writing/payload-validators.js'
17
+ plugins/core/rest-api-plugin-methods/put.js:8: validateResourceAttributesBeforeWrite,
18
+ plugins/core/rest-api-plugin-methods/put.js:9: validateRelationshipAccess,
19
+ plugins/core/rest-api-plugin-methods/put.js:11: validatePivotResource,
20
+ plugins/core/rest-api-plugin-methods/put.js:41: const { schema, schemaStructure, schemaRelationships } = await setupCommonRequest({
21
+ plugins/core/rest-api-plugin-methods/put.js:57: // Validate PUT payload to ensure it's a complete resource replacement operation.
22
+ plugins/core/rest-api-plugin-methods/put.js:59: // It validates that data.id matches the URL parameter, prevents 'included' array (which is
23
+ plugins/core/rest-api-plugin-methods/put.js:60: // read-only), and ensures the payload represents a complete replacement. Any fields not
24
+ plugins/core/rest-api-plugin-methods/put.js:63: validatePutPayload(context.inputRecord, scopes)
25
+ plugins/core/rest-api-plugin-methods/put.js:65: // Validate that user has read access to all related resources
26
+ plugins/core/rest-api-plugin-methods/put.js:67: await validateRelationshipAccess(context, context.inputRecord, helpers, runHooks, api)
27
+ plugins/core/rest-api-plugin-methods/put.js:77: await validateResourceAttributesBeforeWrite({
28
+ plugins/core/rest-api-plugin-methods/put.js:79: schema,
29
+ plugins/core/rest-api-plugin-methods/put.js:116: for (const [relName, relDef] of Object.entries(schemaRelationships || {})) {
30
+ plugins/core/rest-api-plugin-methods/put.js:129: // Also check schema fields for belongsTo relationships
31
+ plugins/core/rest-api-plugin-methods/put.js:130: for (const [fieldName, fieldDef] of Object.entries(schemaStructure)) {
32
+ plugins/core/rest-api-plugin-methods/put.js:183: context.schemaInfo,
33
+ plugins/core/rest-api-plugin-methods/put.js:212: await validatePivotResource(scopes, relDef, relName)
34
+ plugins/core/rest-api-plugin-methods/put.js:234: schemaStructure,
35
+ plugins/core/rest-api-plugin-methods/put.js:235: schemaRelationships,
36
+ plugins/core/rest-api-plugin-methods/post.js:1:import { validatePostPayload } from '../lib/querying-writing/payload-validators.js'
37
+ plugins/core/rest-api-plugin-methods/post.js:6: validateResourceAttributesBeforeWrite,
38
+ plugins/core/rest-api-plugin-methods/post.js:7: validateRelationshipAccess,
39
+ plugins/core/rest-api-plugin-methods/post.js:9: validatePivotResource,
40
+ plugins/core/rest-api-plugin-methods/post.js:38: const { schema, schemaStructure, schemaRelationships } = await setupCommonRequest({
41
+ plugins/core/rest-api-plugin-methods/post.js:53: // Validate POST payload to ensure it follows JSON:API format and references valid resources.
42
+ plugins/core/rest-api-plugin-methods/post.js:54: // This checks the payload has required 'data' object with 'type' and 'attributes', validates
43
+ plugins/core/rest-api-plugin-methods/post.js:58: validatePostPayload(context.inputRecord, scopes)
44
+ plugins/core/rest-api-plugin-methods/post.js:60: // Validate that user has read access to all related resources
45
+ plugins/core/rest-api-plugin-methods/post.js:62: await validateRelationshipAccess(context, context.inputRecord, helpers, runHooks, api)
46
+ plugins/core/rest-api-plugin-methods/post.js:80: await validateResourceAttributesBeforeWrite({
47
+ plugins/core/rest-api-plugin-methods/post.js:82: schema,
48
+ plugins/core/rest-api-plugin-methods/post.js:110: context.schemaInfo,
49
+ plugins/core/rest-api-plugin-methods/post.js:139: // Validate pivot resource exists
50
+ plugins/core/rest-api-plugin-methods/post.js:140: validatePivotResource(scopes, relDef, relName)
51
+ plugins/core/rest-api-plugin-methods/post.js:149: schemaStructure,
52
+ plugins/core/rest-api-plugin-methods/post.js:150: schemaRelationships,
53
+ plugins/core/lib/querying-writing/payload-validators.js:1:import { RestApiValidationError, RestApiPayloadError } from '../../../../lib/rest-api-errors.js'
54
+ plugins/core/lib/querying-writing/payload-validators.js:4: * Validates that include paths don't exceed maximum depth
55
+ plugins/core/lib/querying-writing/payload-validators.js:6: * @param {string[]} includes - Array of include paths to validate
56
+ plugins/core/lib/querying-writing/payload-validators.js:13: * validateIncludeDepth(['author', 'comments.author'], 3);
57
+ plugins/core/lib/querying-writing/payload-validators.js:18: * validateIncludeDepth(['author.company.employees.manager'], 3);
58
+ plugins/core/lib/querying-writing/payload-validators.js:24:function validateIncludeDepth (includes, maxDepth) {
59
+ plugins/core/lib/querying-writing/payload-validators.js:31: continue // Let other validators handle type errors
60
+ plugins/core/lib/querying-writing/payload-validators.js:52: * Validates a JSON:API resource identifier object
61
+ plugins/core/lib/querying-writing/payload-validators.js:54: * @param {Object} identifier - Resource identifier to validate
62
+ plugins/core/lib/querying-writing/payload-validators.js:58: * @throws {RestApiPayloadError|RestApiValidationError} If validation fails
63
+ plugins/core/lib/querying-writing/payload-validators.js:62: * validateResourceIdentifier(
64
+ plugins/core/lib/querying-writing/payload-validators.js:71: * validateResourceIdentifier(
65
+ plugins/core/lib/querying-writing/payload-validators.js:76: * // Throws: RestApiPayloadError
66
+ plugins/core/lib/querying-writing/payload-validators.js:81: * validateResourceIdentifier(
67
+ plugins/core/lib/querying-writing/payload-validators.js:91: * - validateRelationship to check relationship data
68
+ plugins/core/lib/querying-writing/payload-validators.js:92: * - validatePostPayload to validate included resources
69
+ plugins/core/lib/querying-writing/payload-validators.js:97: * - Validates resource types exist in the system
70
+ plugins/core/lib/querying-writing/payload-validators.js:102:function validateResourceIdentifier (identifier, context, scopes = null) {
71
+ plugins/core/lib/querying-writing/payload-validators.js:104: throw new RestApiPayloadError(
72
+ plugins/core/lib/querying-writing/payload-validators.js:111: throw new RestApiPayloadError(
73
+ plugins/core/lib/querying-writing/payload-validators.js:129: throw new RestApiPayloadError(
74
+ plugins/core/lib/querying-writing/payload-validators.js:136: throw new RestApiPayloadError(
75
+ plugins/core/lib/querying-writing/payload-validators.js:144: * Validates a relationship object in JSON:API format
76
+ plugins/core/lib/querying-writing/payload-validators.js:146: * @param {Object} relationship - Relationship object to validate
77
+ plugins/core/lib/querying-writing/payload-validators.js:150: * @throws {RestApiPayloadError} If validation fails
78
+ plugins/core/lib/querying-writing/payload-validators.js:154: * validateRelationship(
79
+ plugins/core/lib/querying-writing/payload-validators.js:163: * validateRelationship(
80
+ plugins/core/lib/querying-writing/payload-validators.js:177: * validateRelationship(
81
+ plugins/core/lib/querying-writing/payload-validators.js:186: * validateRelationship(
82
+ plugins/core/lib/querying-writing/payload-validators.js:191: * // Throws: RestApiPayloadError
83
+ plugins/core/lib/querying-writing/payload-validators.js:196: * - validatePostPayload for new resource relationships
84
+ plugins/core/lib/querying-writing/payload-validators.js:197: * - validatePutPayload for relationship replacement
85
+ plugins/core/lib/querying-writing/payload-validators.js:198: * - validatePatchPayload for relationship updates
86
+ plugins/core/lib/querying-writing/payload-validators.js:202: * - Validates both to-one and to-many relationships
87
+ plugins/core/lib/querying-writing/payload-validators.js:204: * - Validates each resource identifier in arrays
88
+ plugins/core/lib/querying-writing/payload-validators.js:208:function validateRelationship (relationship, relationshipName, scopes = null) {
89
+ plugins/core/lib/querying-writing/payload-validators.js:210: throw new RestApiPayloadError(
90
+ plugins/core/lib/querying-writing/payload-validators.js:217: throw new RestApiPayloadError(
91
+ plugins/core/lib/querying-writing/payload-validators.js:232: validateResourceIdentifier(data, `Relationship '${relationshipName}'`, scopes)
92
+ plugins/core/lib/querying-writing/payload-validators.js:242: validateResourceIdentifier(identifier, `Relationship '${relationshipName}[${index}]'`, scopes)
93
+ plugins/core/lib/querying-writing/payload-validators.js:247: * Validates query parameters for GET requests (single resource retrieval)
94
+ plugins/core/lib/querying-writing/payload-validators.js:253: * @param {Object} [params.queryParams.fields] - Sparse fieldsets by resource type
95
+ plugins/core/lib/querying-writing/payload-validators.js:256: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
96
+ plugins/core/lib/querying-writing/payload-validators.js:260: * validateGetPayload({
97
+ plugins/core/lib/querying-writing/payload-validators.js:267: * validateGetPayload({
98
+ plugins/core/lib/querying-writing/payload-validators.js:276: * // Input: GET with sparse fieldsets
99
+ plugins/core/lib/querying-writing/payload-validators.js:277: * validateGetPayload({
100
+ plugins/core/lib/querying-writing/payload-validators.js:291: * validateGetPayload({
101
+ plugins/core/lib/querying-writing/payload-validators.js:299: * validateGetPayload({
102
+ plugins/core/lib/querying-writing/payload-validators.js:307: * // Throws: RestApiPayloadError
103
+ plugins/core/lib/querying-writing/payload-validators.js:313: * - Validates parameters before passing to storage layer
104
+ plugins/core/lib/querying-writing/payload-validators.js:317: * - Validates JSON:API query parameter structure
105
+ plugins/core/lib/querying-writing/payload-validators.js:324: * 2. Validates required ID parameter
106
+ plugins/core/lib/querying-writing/payload-validators.js:325: * 3. If queryParams exist, validates each type
107
+ plugins/core/lib/querying-writing/payload-validators.js:326: * 4. Validates include paths don't exceed depth limit
108
+ plugins/core/lib/querying-writing/payload-validators.js:329:export function validateGetPayload (params, maxIncludeDepth = 3) {
109
+ plugins/core/lib/querying-writing/payload-validators.js:331: throw new RestApiPayloadError(
110
+ plugins/core/lib/querying-writing/payload-validators.js:337: // Validate ID
111
+ plugins/core/lib/querying-writing/payload-validators.js:352: // Validate queryParams if present
112
+ plugins/core/lib/querying-writing/payload-validators.js:355: throw new RestApiPayloadError(
113
+ plugins/core/lib/querying-writing/payload-validators.js:363: // Validate include
114
+ plugins/core/lib/querying-writing/payload-validators.js:366: throw new RestApiPayloadError(
115
+ plugins/core/lib/querying-writing/payload-validators.js:374: throw new RestApiPayloadError(
116
+ plugins/core/lib/querying-writing/payload-validators.js:381: // Validate include depth
117
+ plugins/core/lib/querying-writing/payload-validators.js:382: validateIncludeDepth(include, maxIncludeDepth)
118
+ plugins/core/lib/querying-writing/payload-validators.js:385: // Validate fields
119
+ plugins/core/lib/querying-writing/payload-validators.js:388: throw new RestApiPayloadError(
120
+ plugins/core/lib/querying-writing/payload-validators.js:396: throw new RestApiPayloadError(
121
+ plugins/core/lib/querying-writing/payload-validators.js:409: * Validates query parameters for collection requests (query/list operations)
122
+ plugins/core/lib/querying-writing/payload-validators.js:414: * @param {Object} [params.queryParams.fields] - Sparse fieldsets by resource type
123
+ plugins/core/lib/querying-writing/payload-validators.js:421: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
124
+ plugins/core/lib/querying-writing/payload-validators.js:425: * validateQueryPayload({}, ['title', 'createdAt']);
125
+ plugins/core/lib/querying-writing/payload-validators.js:430: * validateQueryPayload({
126
+ plugins/core/lib/querying-writing/payload-validators.js:444: * validateQueryPayload({
127
+ plugins/core/lib/querying-writing/payload-validators.js:452: * validateQueryPayload({
128
+ plugins/core/lib/querying-writing/payload-validators.js:461: * validateQueryPayload({
129
+ plugins/core/lib/querying-writing/payload-validators.js:481: * validateQueryPayload({
130
+ plugins/core/lib/querying-writing/payload-validators.js:492: * - Validates collection request parameters
131
+ plugins/core/lib/querying-writing/payload-validators.js:495: * - Validates all JSON:API query parameters for collections
132
+ plugins/core/lib/querying-writing/payload-validators.js:499: * - Validates include depth limits
133
+ plugins/core/lib/querying-writing/payload-validators.js:502: * 1. Validates params object structure
134
+ plugins/core/lib/querying-writing/payload-validators.js:503: * 2. For each query parameter type, validates format
135
+ plugins/core/lib/querying-writing/payload-validators.js:505: * 4. Validates pagination parameters are numbers/strings
136
+ plugins/core/lib/querying-writing/payload-validators.js:508:export function validateQueryPayload (params, sortableFields = [], maxIncludeDepth = 3) {
137
+ plugins/core/lib/querying-writing/payload-validators.js:510: throw new RestApiPayloadError(
138
+ plugins/core/lib/querying-writing/payload-validators.js:519: throw new RestApiPayloadError(
139
+ plugins/core/lib/querying-writing/payload-validators.js:527: // Validate include
140
+ plugins/core/lib/querying-writing/payload-validators.js:530: throw new RestApiPayloadError(
141
+ plugins/core/lib/querying-writing/payload-validators.js:538: throw new RestApiPayloadError(
142
+ plugins/core/lib/querying-writing/payload-validators.js:545: // Validate include depth
143
+ plugins/core/lib/querying-writing/payload-validators.js:546: validateIncludeDepth(include, maxIncludeDepth)
144
+ plugins/core/lib/querying-writing/payload-validators.js:549: // Validate fields
145
+ plugins/core/lib/querying-writing/payload-validators.js:552: throw new RestApiPayloadError(
146
+ plugins/core/lib/querying-writing/payload-validators.js:560: throw new RestApiPayloadError(
147
+ plugins/core/lib/querying-writing/payload-validators.js:568: // Validate filters
148
+ plugins/core/lib/querying-writing/payload-validators.js:571: throw new RestApiPayloadError(
149
+ plugins/core/lib/querying-writing/payload-validators.js:578: // Validate sort
150
+ plugins/core/lib/querying-writing/payload-validators.js:581: throw new RestApiPayloadError(
151
+ plugins/core/lib/querying-writing/payload-validators.js:589: throw new RestApiPayloadError(
152
+ plugins/core/lib/querying-writing/payload-validators.js:606: // Validate page
153
+ plugins/core/lib/querying-writing/payload-validators.js:609: throw new RestApiPayloadError(
154
+ plugins/core/lib/querying-writing/payload-validators.js:617: throw new RestApiPayloadError(
155
+ plugins/core/lib/querying-writing/payload-validators.js:624: throw new RestApiPayloadError(
156
+ plugins/core/lib/querying-writing/payload-validators.js:631: throw new RestApiPayloadError(
157
+ plugins/core/lib/querying-writing/payload-validators.js:638: throw new RestApiPayloadError(
158
+ plugins/core/lib/querying-writing/payload-validators.js:650: * Validates a JSON:API document for POST requests (resource creation)
159
+ plugins/core/lib/querying-writing/payload-validators.js:652: * @param {Object} inputRecord - JSON:API document to validate
160
+ plugins/core/lib/querying-writing/payload-validators.js:661: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
161
+ plugins/core/lib/querying-writing/payload-validators.js:665: * validatePostPayload({
162
+ plugins/core/lib/querying-writing/payload-validators.js:678: * validatePostPayload({
163
+ plugins/core/lib/querying-writing/payload-validators.js:697: * // Output: true (validates each relationship)
164
+ plugins/core/lib/querying-writing/payload-validators.js:701: * validatePostPayload({
165
+ plugins/core/lib/querying-writing/payload-validators.js:714: * validatePostPayload({
166
+ plugins/core/lib/querying-writing/payload-validators.js:735: * // Output: true (included resources validated)
167
+ plugins/core/lib/querying-writing/payload-validators.js:739: * validatePostPayload({
168
+ plugins/core/lib/querying-writing/payload-validators.js:744: * // Throws: RestApiPayloadError
169
+ plugins/core/lib/querying-writing/payload-validators.js:750: * - Validates complete document structure
170
+ plugins/core/lib/querying-writing/payload-validators.js:754: * - Validates resource types exist in system
171
+ plugins/core/lib/querying-writing/payload-validators.js:756: * - Validates included resources have required fields
172
+ plugins/core/lib/querying-writing/payload-validators.js:760: * 1. Validates document has required 'data' property
173
+ plugins/core/lib/querying-writing/payload-validators.js:762: * 3. Validates attributes object if present
174
+ plugins/core/lib/querying-writing/payload-validators.js:763: * 4. Validates each relationship if present
175
+ plugins/core/lib/querying-writing/payload-validators.js:764: * 5. Validates included resources array if present
176
+ plugins/core/lib/querying-writing/payload-validators.js:767:export function validatePostPayload (inputRecord, scopes = null) {
177
+ plugins/core/lib/querying-writing/payload-validators.js:769: throw new RestApiPayloadError(
178
+ plugins/core/lib/querying-writing/payload-validators.js:775: // Validate required 'data' property
179
+ plugins/core/lib/querying-writing/payload-validators.js:777: throw new RestApiPayloadError(
180
+ plugins/core/lib/querying-writing/payload-validators.js:785: // Validate primary data
181
+ plugins/core/lib/querying-writing/payload-validators.js:787: throw new RestApiPayloadError(
182
+ plugins/core/lib/querying-writing/payload-validators.js:794: throw new RestApiPayloadError(
183
+ plugins/core/lib/querying-writing/payload-validators.js:810: throw new RestApiPayloadError(
184
+ plugins/core/lib/querying-writing/payload-validators.js:816: // Validate attributes if present
185
+ plugins/core/lib/querying-writing/payload-validators.js:819: throw new RestApiPayloadError(
186
+ plugins/core/lib/querying-writing/payload-validators.js:826: // Validate relationships if present
187
+ plugins/core/lib/querying-writing/payload-validators.js:829: throw new RestApiPayloadError(
188
+ plugins/core/lib/querying-writing/payload-validators.js:836: validateRelationship(relationship, relName, scopes)
189
+ plugins/core/lib/querying-writing/payload-validators.js:840: // Validate included resources if present
190
+ plugins/core/lib/querying-writing/payload-validators.js:843: throw new RestApiPayloadError(
191
+ plugins/core/lib/querying-writing/payload-validators.js:851: throw new RestApiPayloadError(
192
+ plugins/core/lib/querying-writing/payload-validators.js:858: throw new RestApiPayloadError(
193
+ plugins/core/lib/querying-writing/payload-validators.js:873: throw new RestApiPayloadError(
194
+ plugins/core/lib/querying-writing/payload-validators.js:880: throw new RestApiPayloadError(
195
+ plugins/core/lib/querying-writing/payload-validators.js:888: throw new RestApiPayloadError(
196
+ plugins/core/lib/querying-writing/payload-validators.js:901: * Validates a JSON:API document for PUT requests (full resource replacement)
197
+ plugins/core/lib/querying-writing/payload-validators.js:903: * @param {Object} inputRecord - JSON:API document to validate
198
+ plugins/core/lib/querying-writing/payload-validators.js:911: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
199
+ plugins/core/lib/querying-writing/payload-validators.js:915: * validatePutPayload({
200
+ plugins/core/lib/querying-writing/payload-validators.js:930: * validatePutPayload({
201
+ plugins/core/lib/querying-writing/payload-validators.js:959: * validatePutPayload({
202
+ plugins/core/lib/querying-writing/payload-validators.js:965: * // Throws: RestApiPayloadError
203
+ plugins/core/lib/querying-writing/payload-validators.js:970: * validatePutPayload({
204
+ plugins/core/lib/querying-writing/payload-validators.js:980: * // Throws: RestApiPayloadError
205
+ plugins/core/lib/querying-writing/payload-validators.js:996: * 1. Validates document structure with data property
206
+ plugins/core/lib/querying-writing/payload-validators.js:998: * 3. Validates resource type exists in scopes
207
+ plugins/core/lib/querying-writing/payload-validators.js:1000: * 5. Validates attributes and relationships if present
208
+ plugins/core/lib/querying-writing/payload-validators.js:1003:export function validatePutPayload (inputRecord, scopes = null) {
209
+ plugins/core/lib/querying-writing/payload-validators.js:1005: throw new RestApiPayloadError(
210
+ plugins/core/lib/querying-writing/payload-validators.js:1011: // Validate required 'data' property
211
+ plugins/core/lib/querying-writing/payload-validators.js:1013: throw new RestApiPayloadError(
212
+ plugins/core/lib/querying-writing/payload-validators.js:1023: throw new RestApiPayloadError(
213
+ plugins/core/lib/querying-writing/payload-validators.js:1029: // Validate primary data
214
+ plugins/core/lib/querying-writing/payload-validators.js:1031: throw new RestApiPayloadError(
215
+ plugins/core/lib/querying-writing/payload-validators.js:1038: throw new RestApiPayloadError(
216
+ plugins/core/lib/querying-writing/payload-validators.js:1054: throw new RestApiPayloadError(
217
+ plugins/core/lib/querying-writing/payload-validators.js:1068: throw new RestApiPayloadError(
218
+ plugins/core/lib/querying-writing/payload-validators.js:1074: // Validate attributes if present
219
+ plugins/core/lib/querying-writing/payload-validators.js:1077: throw new RestApiPayloadError(
220
+ plugins/core/lib/querying-writing/payload-validators.js:1084: // Validate relationships if present
221
+ plugins/core/lib/querying-writing/payload-validators.js:1087: throw new RestApiPayloadError(
222
+ plugins/core/lib/querying-writing/payload-validators.js:1094: validateRelationship(relationship, relName, scopes)
223
+ plugins/core/lib/querying-writing/payload-validators.js:1102: * Validates a JSON:API document for PATCH requests (partial resource updates)
224
+ plugins/core/lib/querying-writing/payload-validators.js:1104: * @param {Object} inputRecord - JSON:API document to validate
225
+ plugins/core/lib/querying-writing/payload-validators.js:1112: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
226
+ plugins/core/lib/querying-writing/payload-validators.js:1116: * validatePatchPayload({
227
+ plugins/core/lib/querying-writing/payload-validators.js:1130: * validatePatchPayload({
228
+ plugins/core/lib/querying-writing/payload-validators.js:1145: * validatePatchPayload({
229
+ plugins/core/lib/querying-writing/payload-validators.js:1161: * validatePatchPayload({
230
+ plugins/core/lib/querying-writing/payload-validators.js:1179: * validatePatchPayload({
231
+ plugins/core/lib/querying-writing/payload-validators.js:1202: * 1. Validates document structure with data property
232
+ plugins/core/lib/querying-writing/payload-validators.js:1204: * 3. Validates resource type exists in scopes
233
+ plugins/core/lib/querying-writing/payload-validators.js:1207: * 6. Validates each if present
234
+ plugins/core/lib/querying-writing/payload-validators.js:1210:export function validatePatchPayload (inputRecord, scopes = null) {
235
+ plugins/core/lib/querying-writing/payload-validators.js:1212: throw new RestApiPayloadError(
236
+ plugins/core/lib/querying-writing/payload-validators.js:1218: // Validate required 'data' property
237
+ plugins/core/lib/querying-writing/payload-validators.js:1220: throw new RestApiPayloadError(
238
+ plugins/core/lib/querying-writing/payload-validators.js:1230: throw new RestApiPayloadError(
239
+ plugins/core/lib/querying-writing/payload-validators.js:1236: // Validate primary data
240
+ plugins/core/lib/querying-writing/payload-validators.js:1238: throw new RestApiPayloadError(
241
+ plugins/core/lib/querying-writing/payload-validators.js:1245: throw new RestApiPayloadError(
242
+ plugins/core/lib/querying-writing/payload-validators.js:1261: throw new RestApiPayloadError(
243
+ plugins/core/lib/querying-writing/payload-validators.js:1275: throw new RestApiPayloadError(
244
+ plugins/core/lib/querying-writing/payload-validators.js:1289: // Validate attributes if present
245
+ plugins/core/lib/querying-writing/payload-validators.js:1292: throw new RestApiPayloadError(
246
+ plugins/core/lib/querying-writing/payload-validators.js:1299: // Validate relationships if present
247
+ plugins/core/lib/querying-writing/payload-validators.js:1302: throw new RestApiPayloadError(
248
+ plugins/core/lib/querying-writing/payload-validators.js:1309: validateRelationship(relationship, relName, scopes)
249
+ plugins/core/lib/querying-writing/field-utils.js:2: * Extracts all foreign key fields from a schema definition
250
+ plugins/core/lib/querying-writing/field-utils.js:4: * @param {Object} schema - The schema definition (Schema object or plain object)
251
+ plugins/core/lib/querying-writing/field-utils.js:8: * // Input: Schema with belongsTo relationships
252
+ plugins/core/lib/querying-writing/field-utils.js:9: * const schema = {
253
+ plugins/core/lib/querying-writing/field-utils.js:17: * const foreignKeys = getForeignKeyFields(schema);
254
+ plugins/core/lib/querying-writing/field-utils.js:23: * // Input: Works with compiled Schema objects too
255
+ plugins/core/lib/querying-writing/field-utils.js:24: * const schemaObject = {
256
+ plugins/core/lib/querying-writing/field-utils.js:31: * const foreignKeys = getForeignKeyFields(schemaObject);
257
+ plugins/core/lib/querying-writing/field-utils.js:49: * 1. Accepts schema in either format (plain or with structure property)
258
+ plugins/core/lib/querying-writing/field-utils.js:54:export const getForeignKeyFields = (schema) => {
259
+ plugins/core/lib/querying-writing/field-utils.js:56: if (!schema) return foreignKeys
260
+ plugins/core/lib/querying-writing/field-utils.js:58: // Handle both Schema objects and plain objects
261
+ plugins/core/lib/querying-writing/field-utils.js:59: const schemaStructure = schema.structure || schema
262
+ plugins/core/lib/querying-writing/field-utils.js:61: Object.entries(schemaStructure).forEach(([field, def]) => {
263
+ plugins/core/lib/querying-writing/field-utils.js:70: * Filters hidden fields from attributes based on schema rules.
264
+ plugins/core/lib/querying-writing/field-utils.js:73: * based on the schema definition and requested fields. It ensures that
265
+ plugins/core/lib/querying-writing/field-utils.js:77: * @param {Object} schema - The schema object with structure property
266
+ plugins/core/lib/querying-writing/field-utils.js:88: * const schema = {
267
+ plugins/core/lib/querying-writing/field-utils.js:96: * const filtered = filterHiddenFields(attributes, schema, null);
268
+ plugins/core/lib/querying-writing/field-utils.js:101: * const filtered = filterHiddenFields(attributes, schema, 'name,internal_id');
269
+ plugins/core/lib/querying-writing/field-utils.js:106:export const filterHiddenFields = (attributes, schema, requestedFields) => {
270
+ plugins/core/lib/querying-writing/field-utils.js:109: // Parse requested fields if it's a string (from query params)
271
+ plugins/core/lib/querying-writing/field-utils.js:120: const fieldDef = schema.structure?.[field]
272
+ plugins/core/lib/querying-writing/field-utils.js:128: // via sparse fieldsets like ?fields[products]=name,cost
273
+ plugins/core/lib/querying-writing/database-value-normalizers.js:2: * Normalizes a date value to appropriate format based on field type
274
+ plugins/core/lib/querying-writing/database-value-normalizers.js:10: * normalizeDateValue(new Date('2024-01-15T10:30:00Z'), 'dateTime');
275
+ plugins/core/lib/querying-writing/database-value-normalizers.js:15: * normalizeDateValue('2024-01-15 10:30:00', 'dateTime');
276
+ plugins/core/lib/querying-writing/database-value-normalizers.js:16: * // Output: Date object parsed as UTC (2024-01-15T10:30:00Z)
277
+ plugins/core/lib/querying-writing/database-value-normalizers.js:20: * normalizeDateValue('2024-01-15', 'date');
278
+ plugins/core/lib/querying-writing/database-value-normalizers.js:25: * normalizeDateValue('14:30:45', 'time');
279
+ plugins/core/lib/querying-writing/database-value-normalizers.js:30: * normalizeDateValue(new Date('2024-01-15T14:30:45Z'), 'time');
280
+ plugins/core/lib/querying-writing/database-value-normalizers.js:35: * - normalizeAttributes to process individual field values
281
+ plugins/core/lib/querying-writing/database-value-normalizers.js:51:function normalizeDateValue (value, type) {
282
+ plugins/core/lib/querying-writing/database-value-normalizers.js:67: // Try to parse and extract time
283
+ plugins/core/lib/querying-writing/database-value-normalizers.js:111: // Try to parse any other format
284
+ plugins/core/lib/querying-writing/database-value-normalizers.js:124: * Normalizes database values in an attributes object
285
+ plugins/core/lib/querying-writing/database-value-normalizers.js:126: * @param {Object} attributes - The attributes object to normalize
286
+ plugins/core/lib/querying-writing/database-value-normalizers.js:127: * @param {Object} schemaStructure - The schema structure defining field types
287
+ plugins/core/lib/querying-writing/database-value-normalizers.js:128: * @returns {Object} The normalized attributes object
288
+ plugins/core/lib/querying-writing/database-value-normalizers.js:140: * const schema = {
289
+ plugins/core/lib/querying-writing/database-value-normalizers.js:147: * const normalized = normalizeAttributes(attributes, schema);
290
+ plugins/core/lib/querying-writing/database-value-normalizers.js:167: * const normalized = normalizeAttributes(attributes, {
291
+ plugins/core/lib/querying-writing/database-value-normalizers.js:184: * - normalizeRecordAttributes for each record's attributes
292
+ plugins/core/lib/querying-writing/database-value-normalizers.js:189: * - Normalizes date formats from different databases
293
+ plugins/core/lib/querying-writing/database-value-normalizers.js:195: * 2. Iterates through each field with schema definition
294
+ plugins/core/lib/querying-writing/database-value-normalizers.js:196: * 3. Normalizes booleans: 1/0 or '1'/'0' to true/false
295
+ plugins/core/lib/querying-writing/database-value-normalizers.js:197: * 4. Normalizes dates using normalizeDateValue
296
+ plugins/core/lib/querying-writing/database-value-normalizers.js:198: * 5. Returns new object with normalized values
297
+ plugins/core/lib/querying-writing/database-value-normalizers.js:200:export function normalizeAttributes (attributes, schemaStructure) {
298
+ plugins/core/lib/querying-writing/database-value-normalizers.js:201: if (!attributes || !schemaStructure) {
299
+ plugins/core/lib/querying-writing/database-value-normalizers.js:205: const normalized = { ...attributes }
300
+ plugins/core/lib/querying-writing/database-value-normalizers.js:209: const fieldDef = schemaStructure[fieldName]
301
+ plugins/core/lib/querying-writing/database-value-normalizers.js:214: // Normalize boolean values
302
+ plugins/core/lib/querying-writing/database-value-normalizers.js:217: normalized[fieldName] = true
303
+ plugins/core/lib/querying-writing/database-value-normalizers.js:219: normalized[fieldName] = false
304
+ plugins/core/lib/querying-writing/database-value-normalizers.js:224: // Normalize date/dateTime/time values
305
+ plugins/core/lib/querying-writing/database-value-normalizers.js:226: normalized[fieldName] = normalizeDateValue(value, fieldDef.type)
306
+ plugins/core/lib/querying-writing/database-value-normalizers.js:230: return normalized
307
+ plugins/core/lib/querying-writing/database-value-normalizers.js:234: * Normalizes all records in a JSON:API response
308
+ plugins/core/lib/querying-writing/database-value-normalizers.js:237: * @param {Object} scopes - All available scopes for schema lookup
309
+ plugins/core/lib/querying-writing/database-value-normalizers.js:238: * @returns {Object} The response with normalized values
310
+ plugins/core/lib/querying-writing/database-value-normalizers.js:263: * const normalized = normalizeRecordAttributes(response, scopes);
311
+ plugins/core/lib/querying-writing/database-value-normalizers.js:265: * // Output: All booleans and dates normalized
312
+ plugins/core/lib/querying-writing/database-value-normalizers.js:304: * // Each record in the array is normalized
313
+ plugins/core/lib/querying-writing/database-value-normalizers.js:315: * - Uses schema definitions to determine field types
314
+ plugins/core/lib/querying-writing/database-value-normalizers.js:319: * 2. For each record, looks up its schema by type
315
+ plugins/core/lib/querying-writing/database-value-normalizers.js:320: * 3. Calls normalizeAttributes with schema structure
316
+ plugins/core/lib/querying-writing/database-value-normalizers.js:322: * 5. Returns complete response with normalized values
317
+ plugins/core/lib/querying-writing/database-value-normalizers.js:324:export function normalizeRecordAttributes (record, scopes) {
318
+ plugins/core/lib/querying-writing/database-value-normalizers.js:329: // Normalize main data records
319
+ plugins/core/lib/querying-writing/database-value-normalizers.js:335: if (scope?.vars?.schemaInfo?.schemaStructure && entry.attributes) {
320
+ plugins/core/lib/querying-writing/database-value-normalizers.js:336: entry.attributes = normalizeAttributes(
321
+ plugins/core/lib/querying-writing/database-value-normalizers.js:338: scope.vars.schemaInfo.schemaStructure
322
+ plugins/core/lib/querying-writing/database-value-normalizers.js:346: if (scope?.vars?.schemaInfo?.schemaStructure && entry.attributes) {
323
+ plugins/core/lib/querying-writing/database-value-normalizers.js:347: entry.attributes = normalizeAttributes(
324
+ plugins/core/lib/querying-writing/database-value-normalizers.js:349: scope.vars.schemaInfo.schemaStructure
325
+ plugins/core/lib/querying-writing/database-value-normalizers.js:355: // Normalize included records
326
+ plugins/core/lib/querying-writing/database-value-normalizers.js:359: if (scope?.vars?.schemaInfo?.schemaStructure && entry.attributes) {
327
+ plugins/core/lib/querying-writing/database-value-normalizers.js:360: entry.attributes = normalizeAttributes(
328
+ plugins/core/lib/querying-writing/database-value-normalizers.js:362: scope.vars.schemaInfo.schemaStructure
329
+ plugins/core/lib/querying-writing/knex-field-helpers.js:5: * @param {Object} schemaInfo - Schema info with computed fields and structure
330
+ plugins/core/lib/querying-writing/knex-field-helpers.js:10: * const schemaInfo = {
331
+ plugins/core/lib/querying-writing/knex-field-helpers.js:12: * schemaStructure: { price: { type: 'number' } }
332
+ plugins/core/lib/querying-writing/knex-field-helpers.js:14: * isNonDatabaseField('profit_margin', schemaInfo);
333
+ plugins/core/lib/querying-writing/knex-field-helpers.js:19: * const schemaInfo = {
334
+ plugins/core/lib/querying-writing/knex-field-helpers.js:21: * schemaStructure: {
335
+ plugins/core/lib/querying-writing/knex-field-helpers.js:25: * isNonDatabaseField('temp_password', schemaInfo);
336
+ plugins/core/lib/querying-writing/knex-field-helpers.js:39:export const isNonDatabaseField = (fieldName, schemaInfo) => {
337
+ plugins/core/lib/querying-writing/knex-field-helpers.js:40: const { computed = {}, schemaStructure = {} } = schemaInfo
338
+ plugins/core/lib/querying-writing/knex-field-helpers.js:42: const fieldDef = schemaStructure[fieldName]
339
+ plugins/core/lib/querying-writing/knex-field-helpers.js:47: * Builds the field selection list for database queries with sparse fieldset support
340
+ plugins/core/lib/querying-writing/knex-field-helpers.js:49: * @param {Object} scope - Resource scope with schema information
341
+ plugins/core/lib/querying-writing/knex-field-helpers.js:51: * @param {Object} deps.context - Request context with queryParams and schemaInfo
342
+ plugins/core/lib/querying-writing/knex-field-helpers.js:55: * // Input: Basic sparse fieldset request
343
+ plugins/core/lib/querying-writing/knex-field-helpers.js:60: * schemaInfo: { idProperty: 'id', ... }
344
+ plugins/core/lib/querying-writing/knex-field-helpers.js:76: * const schemaInfo = {
345
+ plugins/core/lib/querying-writing/knex-field-helpers.js:83: * schemaStructure: {
346
+ plugins/core/lib/querying-writing/knex-field-helpers.js:104: * // Input: No sparse fieldsets (returns all visible fields)
347
+ plugins/core/lib/querying-writing/knex-field-helpers.js:108: * schemaInfo: { ... }
348
+ plugins/core/lib/querying-writing/knex-field-helpers.js:127: * - Implements JSON:API sparse fieldsets specification
349
+ plugins/core/lib/querying-writing/knex-field-helpers.js:135: * 2. Parses requested fields from query string
350
+ plugins/core/lib/querying-writing/knex-field-helpers.js:136: * 3. Validates requested fields exist in schema
351
+ plugins/core/lib/querying-writing/knex-field-helpers.js:148: schemaInfo: { schemaInstance, computed: computedFields = {}, schemaStructure }
352
+ plugins/core/lib/querying-writing/knex-field-helpers.js:156: const idProperty = context.schemaInfo.idProperty
353
+ plugins/core/lib/querying-writing/knex-field-helpers.js:166: // Handle both Schema objects and plain objects
354
+ plugins/core/lib/querying-writing/knex-field-helpers.js:167: if (!schemaStructure) {
355
+ plugins/core/lib/querying-writing/knex-field-helpers.js:168: schemaStructure = schemaInstance?.structure || schemaInstance || {}
356
+ plugins/core/lib/querying-writing/knex-field-helpers.js:171: // Get computed fields and virtual fields from schema
357
+ plugins/core/lib/querying-writing/knex-field-helpers.js:174: // Find fields marked as virtual in the schema
358
+ plugins/core/lib/querying-writing/knex-field-helpers.js:176: Object.entries(schemaStructure).forEach(([fieldName, fieldDef]) => {
359
+ plugins/core/lib/querying-writing/knex-field-helpers.js:184: // Parse requested fields
360
+ plugins/core/lib/querying-writing/knex-field-helpers.js:194: // Sparse fieldsets requested - only select specified fields
361
+ plugins/core/lib/querying-writing/knex-field-helpers.js:202: const fieldDef = schemaStructure[field]
362
+ plugins/core/lib/querying-writing/knex-field-helpers.js:203: if (!fieldDef) throw new Error(`Unknown sparse field '${field}' requested for '${scopeName}'`)
363
+ plugins/core/lib/querying-writing/knex-field-helpers.js:224: const depFieldDef = schemaStructure[dep]
364
+ plugins/core/lib/querying-writing/knex-field-helpers.js:240: Object.entries(schemaStructure).forEach(([field, fieldDef]) => {
365
+ plugins/core/lib/querying-writing/knex-field-helpers.js:253: // No sparse fieldsets - return all visible fields
366
+ plugins/core/lib/querying-writing/knex-field-helpers.js:255: Object.entries(schemaStructure).forEach(([field, fieldDef]) => {
367
+ plugins/core/lib/querying-writing/knex-field-helpers.js:273: // When no sparse fieldsets, we compute all computed fields
368
+ plugins/core/lib/querying-writing/knex-field-helpers.js:280: const depFieldDef = schemaStructure[dep]
369
+ plugins/core/lib/querying-writing/knex-field-helpers.js:295: Object.entries(schemaStructure).forEach(([field, fieldDef]) => {
370
+ plugins/core/lib/querying-writing/knex-field-helpers.js:303: const relationships = scope.vars.schemaInfo.schemaRelationships
371
+ plugins/core/lib/querying-writing/knex-field-helpers.js:328: * Determines which computed fields to calculate based on sparse fieldsets
372
+ plugins/core/lib/querying-writing/knex-field-helpers.js:332: * @param {Object} computedFields - Computed field definitions from schema
373
+ plugins/core/lib/querying-writing/knex-field-helpers.js:336: * // Input: No sparse fieldsets (calculate all computed fields)
374
+ plugins/core/lib/querying-writing/knex-field-helpers.js:345: * // Input: Sparse fieldsets with some computed fields
375
+ plugins/core/lib/querying-writing/knex-field-helpers.js:355: * // Input: Sparse fieldsets with no computed fields
376
+ plugins/core/lib/querying-writing/knex-field-helpers.js:370: * - Supports JSON:API sparse fieldsets for computed fields
377
+ plugins/core/lib/querying-writing/knex-field-helpers.js:374: * 1. Checks if sparse fieldsets are specified
378
+ plugins/core/lib/querying-writing/knex-field-helpers.js:377: * 4. Normalizes string input to array format
379
+ plugins/core/lib/querying-writing/knex-field-helpers.js:385: // No sparse fieldsets - return all computed fields
380
+ plugins/core/lib/querying-writing/knex-field-helpers.js:389: // Parse requested fields if it's a string
381
+ plugins/core/lib/querying-writing/connectors-query-parser.js:2: * Parses URL query strings into JSON:API compliant parameter objects
382
+ plugins/core/lib/querying-writing/connectors-query-parser.js:5: * @returns {object} Parsed query parameters in JSON:API format
383
+ plugins/core/lib/querying-writing/connectors-query-parser.js:9: * const query = parseJsonApiQuery('include=author&sort=-created_at');
384
+ plugins/core/lib/querying-writing/connectors-query-parser.js:11: * // Output: Parsed into arrays
385
+ plugins/core/lib/querying-writing/connectors-query-parser.js:22: * const query = parseJsonApiQuery('filter[status]=published&filter[author_id]=123');
386
+ plugins/core/lib/querying-writing/connectors-query-parser.js:37: * // Input: Sparse fieldsets
387
+ plugins/core/lib/querying-writing/connectors-query-parser.js:38: * const query = parseJsonApiQuery('fields[articles]=title,body&fields[users]=name');
388
+ plugins/core/lib/querying-writing/connectors-query-parser.js:54: * const query = parseJsonApiQuery('page[size]=20&page[number]=3&page[cursor]=abc123');
389
+ plugins/core/lib/querying-writing/connectors-query-parser.js:71: * const query = parseJsonApiQuery(
390
+ plugins/core/lib/querying-writing/connectors-query-parser.js:94: * - express-plugin parses req.query with this
391
+ plugins/core/lib/querying-writing/connectors-query-parser.js:95: * - http-plugin parses URL query strings with this
392
+ plugins/core/lib/querying-writing/connectors-query-parser.js:96: * - websocket-plugin parses message query parameters with this
393
+ plugins/core/lib/querying-writing/connectors-query-parser.js:111: * 6. Returns normalized structure for REST API
394
+ plugins/core/lib/querying-writing/connectors-query-parser.js:113:export function parseJsonApiQuery (queryString) {
395
+ plugins/core/lib/querying-writing/connectors-query-parser.js:135: // Parse include (comma-separated string to array)
396
+ plugins/core/lib/querying-writing/connectors-query-parser.js:138: // Parse sort (comma-separated string to array)
397
+ plugins/core/lib/querying-writing/connectors-query-parser.js:141: // Parse filter[key] = value into filters: { key: value }
398
+ plugins/core/lib/querying-writing/connectors-query-parser.js:147: // Parse fields[type] = fields into fields: { type: "field1,field2" }
399
+ plugins/core/lib/querying-writing/connectors-query-parser.js:154: // Parse page[size] = 10 into page: { size: 10 }
400
+ plugins/core/lib/querying-writing/connectors-query-parser.js:158: result.page[pageKey] = isNaN(value) ? value : parseInt(value, 10)
401
+ plugins/core/lib/querying-writing/schema-helpers.js:2: * Schema processing utilities for search and field dependencies
402
+ plugins/core/lib/querying-writing/schema-helpers.js:7: * - Generating search schemas from various configuration sources
403
+ plugins/core/lib/querying-writing/schema-helpers.js:15: * Marks all fields in a searchSchema as indexed for database optimization
404
+ plugins/core/lib/querying-writing/schema-helpers.js:17: * @param {Object} searchSchema - Search schema object to process
405
+ plugins/core/lib/querying-writing/schema-helpers.js:18: * @returns {void} Modifies the searchSchema in-place
406
+ plugins/core/lib/querying-writing/schema-helpers.js:22: * const searchSchema = {
407
+ plugins/core/lib/querying-writing/schema-helpers.js:27: * ensureSearchFieldsAreIndexed(searchSchema);
408
+ plugins/core/lib/querying-writing/schema-helpers.js:38: * const searchSchema = {
409
+ plugins/core/lib/querying-writing/schema-helpers.js:50: * ensureSearchFieldsAreIndexed(searchSchema);
410
+ plugins/core/lib/querying-writing/schema-helpers.js:60: * const searchSchema = {
411
+ plugins/core/lib/querying-writing/schema-helpers.js:64: * ensureSearchFieldsAreIndexed(searchSchema);
412
+ plugins/core/lib/querying-writing/schema-helpers.js:75: * - Applied to all searchSchema fields before storage setup
413
+ plugins/core/lib/querying-writing/schema-helpers.js:84: * 1. Receives searchSchema object (or null)
414
+ plugins/core/lib/querying-writing/schema-helpers.js:89:export function ensureSearchFieldsAreIndexed (searchSchema) {
415
+ plugins/core/lib/querying-writing/schema-helpers.js:90: if (!searchSchema) return
416
+ plugins/core/lib/querying-writing/schema-helpers.js:92: Object.keys(searchSchema).forEach(fieldName => {
417
+ plugins/core/lib/querying-writing/schema-helpers.js:93: const fieldDef = searchSchema[fieldName]
418
+ plugins/core/lib/querying-writing/schema-helpers.js:102: * Generates complete searchSchema by merging schema search definitions with explicit searchSchema
419
+ plugins/core/lib/querying-writing/schema-helpers.js:104: * @param {Object} schema - Main resource schema with optional 'search' properties
420
+ plugins/core/lib/querying-writing/schema-helpers.js:105: * @param {Object} explicitSearchSchema - Optional explicit searchSchema to merge
421
+ plugins/core/lib/querying-writing/schema-helpers.js:106: * @returns {Object|null} Merged searchSchema or null if no search fields
422
+ plugins/core/lib/querying-writing/schema-helpers.js:110: * // Input: Simple search fields in schema
423
+ plugins/core/lib/querying-writing/schema-helpers.js:111: * const schema = {
424
+ plugins/core/lib/querying-writing/schema-helpers.js:116: * const result = generateSearchSchemaFromSchema(schema, null);
425
+ plugins/core/lib/querying-writing/schema-helpers.js:118: * // Output: Generated search schema
426
+ plugins/core/lib/querying-writing/schema-helpers.js:126: * const schema = {
427
+ plugins/core/lib/querying-writing/schema-helpers.js:135: * const result = generateSearchSchemaFromSchema(schema, null);
428
+ plugins/core/lib/querying-writing/schema-helpers.js:152: * // Input: Merging with explicit searchSchema
429
+ plugins/core/lib/querying-writing/schema-helpers.js:153: * const schema = {
430
+ plugins/core/lib/querying-writing/schema-helpers.js:156: * const explicitSearchSchema = {
431
+ plugins/core/lib/querying-writing/schema-helpers.js:160: * const result = generateSearchSchemaFromSchema(schema, explicitSearchSchema);
432
+ plugins/core/lib/querying-writing/schema-helpers.js:166: * // name: { type: 'string' } // From schema (no operator set)
433
+ plugins/core/lib/querying-writing/schema-helpers.js:170: * // Input: Explicit searchSchema takes precedence
434
+ plugins/core/lib/querying-writing/schema-helpers.js:171: * const schema = {
435
+ plugins/core/lib/querying-writing/schema-helpers.js:174: * const explicitSearchSchema = {
436
+ plugins/core/lib/querying-writing/schema-helpers.js:177: * const result = generateSearchSchemaFromSchema(schema, explicitSearchSchema);
437
+ plugins/core/lib/querying-writing/schema-helpers.js:178: * // Output: Explicit searchSchema wins
438
+ plugins/core/lib/querying-writing/schema-helpers.js:185: * const schema = {
439
+ plugins/core/lib/querying-writing/schema-helpers.js:214: * - Generates searchSchema from various sources
440
+ plugins/core/lib/querying-writing/schema-helpers.js:220: * - Merges search:true fields with explicit searchSchema
441
+ plugins/core/lib/querying-writing/schema-helpers.js:221: * - Explicit searchSchema always takes precedence
442
+ plugins/core/lib/querying-writing/schema-helpers.js:225: * 1. Starts with explicit searchSchema (if any)
443
+ plugins/core/lib/querying-writing/schema-helpers.js:226: * 2. Processes schema fields with 'search' property
444
+ plugins/core/lib/querying-writing/schema-helpers.js:227: * 3. Skips fields already in explicit searchSchema (no conflicts)
445
+ plugins/core/lib/querying-writing/schema-helpers.js:230: * 6. Returns merged searchSchema or null
446
+ plugins/core/lib/querying-writing/schema-helpers.js:232:export const generateSearchSchemaFromSchema = (schema, explicitSearchSchema) => {
447
+ plugins/core/lib/querying-writing/schema-helpers.js:233: // Start with explicit searchSchema or empty object
448
+ plugins/core/lib/querying-writing/schema-helpers.js:234: const searchSchema = explicitSearchSchema ? { ...explicitSearchSchema } : {}
449
+ plugins/core/lib/querying-writing/schema-helpers.js:236: if (!schema) {
450
+ plugins/core/lib/querying-writing/schema-helpers.js:237: return Object.keys(searchSchema).length > 0 ? searchSchema : null
451
+ plugins/core/lib/querying-writing/schema-helpers.js:240: // Process schema fields with 'search' property
452
+ plugins/core/lib/querying-writing/schema-helpers.js:241: Object.entries(schema).forEach(([fieldName, fieldDef]) => {
453
+ plugins/core/lib/querying-writing/schema-helpers.js:249: // Check if field already exists in explicit searchSchema
454
+ plugins/core/lib/querying-writing/schema-helpers.js:250: if (searchSchema[searchFieldName]) {
455
+ plugins/core/lib/querying-writing/schema-helpers.js:251: // Skip - explicit searchSchema takes precedence
456
+ plugins/core/lib/querying-writing/schema-helpers.js:252: // This allows searchSchema to override fields marked with search:true
457
+ plugins/core/lib/querying-writing/schema-helpers.js:270: searchSchema[searchFieldName] = searchEntry
458
+ plugins/core/lib/querying-writing/schema-helpers.js:280: // Check if filter already exists in explicit searchSchema
459
+ plugins/core/lib/querying-writing/schema-helpers.js:281: if (searchSchema[filterName]) {
460
+ plugins/core/lib/querying-writing/schema-helpers.js:282: // Skip - explicit searchSchema takes precedence
461
+ plugins/core/lib/querying-writing/schema-helpers.js:286: searchSchema[filterName] = {
462
+ plugins/core/lib/querying-writing/schema-helpers.js:296: // Check if field already exists in explicit searchSchema
463
+ plugins/core/lib/querying-writing/schema-helpers.js:297: if (searchSchema[searchFieldName]) {
464
+ plugins/core/lib/querying-writing/schema-helpers.js:298: // Skip - explicit searchSchema takes precedence
465
+ plugins/core/lib/querying-writing/schema-helpers.js:315: searchSchema[searchFieldName] = searchEntry
466
+ plugins/core/lib/querying-writing/schema-helpers.js:322: if (schema._virtual?.search) {
467
+ plugins/core/lib/querying-writing/schema-helpers.js:323: Object.entries(schema._virtual.search).forEach(([filterName, filterDef]) => {
468
+ plugins/core/lib/querying-writing/schema-helpers.js:324: // Check if filter already exists in explicit searchSchema
469
+ plugins/core/lib/querying-writing/schema-helpers.js:325: if (searchSchema[filterName]) {
470
+ plugins/core/lib/querying-writing/schema-helpers.js:326: // Skip - explicit searchSchema takes precedence
471
+ plugins/core/lib/querying-writing/schema-helpers.js:330: searchSchema[filterName] = filterDef
472
+ plugins/core/lib/querying-writing/schema-helpers.js:334: return Object.keys(searchSchema).length > 0 ? searchSchema : null
473
+ plugins/core/lib/querying-writing/schema-helpers.js:375: * - Validates all dependencies exist
474
+ plugins/core/lib/querying-writing/schema-helpers.js:457: * - Schema processing for getter/setter ordering
475
+ plugins/core/lib/querying-writing/schema-helpers.js:463: * - Validates dependency graph is acyclic
476
+ plugins/core/lib/querying-writing/knex-constants.js:21:// Schema handling helpers
477
+ plugins/core/lib/querying-writing/knex-constants.js:22:export const getSchemaStructure = (schema) => schema?.structure || schema || {}
478
+ plugins/core/lib/querying-writing/knex-constants.js:23:export const getIdProperty = (schemaInfo) => schemaInfo?.idProperty || 'id'
479
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:2:import { getSchemaStructure } from './knex-constants.js'
480
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:7: * @param {Object} scope - Resource scope with schema and relationship info
481
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:52: * // With schema defining polymorphic relationship:
482
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:87: * 2. Scans schema for belongsTo field definitions
483
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:98: // Extract schema info from scope
484
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:101: schemaInfo: { schemaInstance, schemaRelationships: relationships, idProperty }
485
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:107: // Get schema structure
486
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:108: const schemaStructure = getSchemaStructure(schemaInstance)
487
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:113: // Process regular belongsTo relationships from schema
488
+ plugins/core/lib/querying-writing/knex-json-api-transformers.js:114: for (const [fieldName, fieldDef] of Object.entries(schemaStructure)) {
489
+ plugins/core/lib/querying-writing/scope-validations.js:2: * Scope configuration validators for relationship definitions
490
+ plugins/core/lib/querying-writing/scope-validations.js:5: * These validators run at scope registration time to ensure:
491
+ plugins/core/lib/querying-writing/scope-validations.js:13: * Validates all relationships in a scope configuration
492
+ plugins/core/lib/querying-writing/scope-validations.js:22: * validateRelationships({
493
+ plugins/core/lib/querying-writing/scope-validations.js:26: * schema: {
494
+ plugins/core/lib/querying-writing/scope-validations.js:47: * validateRelaationships({
495
+ plugins/core/lib/querying-writing/scope-validations.js:70: * validateRelationships({
496
+ plugins/core/lib/querying-writing/scope-validations.js:91: * validateRelationships({
497
+ plugins/core/lib/querying-writing/scope-validations.js:95: * schema: {
498
+ plugins/core/lib/querying-writing/scope-validations.js:130: * - Validates polymorphic relationship structure
499
+ plugins/core/lib/querying-writing/scope-validations.js:132: * - Validates hasMany/manyToMany foreign keys
500
+ plugins/core/lib/querying-writing/scope-validations.js:138: * 3. Validates polymorphic: types, typeField, idField
501
+ plugins/core/lib/querying-writing/scope-validations.js:139: * 4. Validates hasMany: foreignKey (unless via)
502
+ plugins/core/lib/querying-writing/scope-validations.js:140: * 5. Validates manyToMany: through, foreignKey, otherKey
503
+ plugins/core/lib/querying-writing/scope-validations.js:143:export function validateRelationships ({ context, scopes }) {
504
+ plugins/core/lib/querying-writing/scope-validations.js:149: const validation = validatePolymorphicRelationship(relDef, scopeName, scopes)
505
+ plugins/core/lib/querying-writing/scope-validations.js:157: // Validate based on relationship type
506
+ plugins/core/lib/querying-writing/scope-validations.js:159: const validation = validateHasManyRelationship(relDef, relName, scopeName)
507
+ plugins/core/lib/querying-writing/scope-validations.js:168: const validation = validateHasOneRelationship(relDef, relName, scopeName)
508
+ plugins/core/lib/querying-writing/scope-validations.js:177: const validation = validateManyToManyRelationship(relDef, relName, scopeName)
509
+ plugins/core/lib/querying-writing/scope-validations.js:188: * Validates a polymorphic relationship definition
510
+ plugins/core/lib/querying-writing/scope-validations.js:204: * validatePolymorphicRelationship(relDef, 'comments', scopes);
511
+ plugins/core/lib/querying-writing/scope-validations.js:216: * validatePolymorphicRelationship(relDef, 'comments', scopes);
512
+ plugins/core/lib/querying-writing/scope-validations.js:231: * validatePolymorphicRelationship(relDef, 'attachments', scopes);
513
+ plugins/core/lib/querying-writing/scope-validations.js:239:const validatePolymorphicRelationship = (relDef, scopeName, scopes) => {
514
+ plugins/core/lib/querying-writing/scope-validations.js:242: // 2. Validate required properties: types, typeField, idField
515
+ plugins/core/lib/querying-writing/scope-validations.js:245: // 5. Check that typeField and idField exist in the schema
516
+ plugins/core/lib/querying-writing/scope-validations.js:290: * Validates a hasMany relationship definition
517
+ plugins/core/lib/querying-writing/scope-validations.js:304: * validateHasManyRelationship(relDef, 'posts', 'users');
518
+ plugins/core/lib/querying-writing/scope-validations.js:314: * validateHasManyRelationship(relDef, 'posts', 'users');
519
+ plugins/core/lib/querying-writing/scope-validations.js:327: * validateHasManyRelationship(relDef, 'comments', 'posts');
520
+ plugins/core/lib/querying-writing/scope-validations.js:332:const validateHasManyRelationship = (relDef, relName, scopeName) => {
521
+ plugins/core/lib/querying-writing/scope-validations.js:333: // Validate target is specified
522
+ plugins/core/lib/querying-writing/scope-validations.js:365: * Validates a hasOne relationship definition
523
+ plugins/core/lib/querying-writing/scope-validations.js:379: * validateHasOneRelationship(relDef, 'profile', 'users');
524
+ plugins/core/lib/querying-writing/scope-validations.js:384:const validateHasOneRelationship = (relDef, relName, scopeName) => {
525
+ plugins/core/lib/querying-writing/scope-validations.js:385: // Validate target is specified
526
+ plugins/core/lib/querying-writing/scope-validations.js:411: * Validates a manyToMany relationship definition
527
+ plugins/core/lib/querying-writing/scope-validations.js:426: * validateManyToManyRelationship(relDef, 'tags', 'articles');
528
+ plugins/core/lib/querying-writing/scope-validations.js:437: * validateManyToManyRelationship(relDef, 'tags', 'articles');
529
+ plugins/core/lib/querying-writing/scope-validations.js:445:const validateManyToManyRelationship = (relDef, relName, scopeName) => {
530
+ plugins/core/lib/querying-writing/compile-schemas.js:1:import { createSchema } from 'json-rest-schema'
531
+ plugins/core/lib/querying-writing/compile-schemas.js:2:import { ensureSearchFieldsAreIndexed, generateSearchSchemaFromSchema, sortFieldsByDependencies } from './schema-helpers.js'
532
+ plugins/core/lib/querying-writing/compile-schemas.js:5: * Compiles and enriches schemas for a resource scope
533
+ plugins/core/lib/querying-writing/compile-schemas.js:7: * @param {Object} scope - Scope containing raw schema options
534
+ plugins/core/lib/querying-writing/compile-schemas.js:12: * // Input: Raw schema with computed field
535
+ plugins/core/lib/querying-writing/compile-schemas.js:24: * await compileSchemas(scope, deps);
536
+ plugins/core/lib/querying-writing/compile-schemas.js:26: * // Output in scope.vars.schemaInfo:
537
+ plugins/core/lib/querying-writing/compile-schemas.js:28: * // schema: Schema {}, // json-rest-schema instance
538
+ plugins/core/lib/querying-writing/compile-schemas.js:29: * // schemaStructure: {
539
+ plugins/core/lib/querying-writing/compile-schemas.js:41: * // Input: Schema with search fields
540
+ plugins/core/lib/querying-writing/compile-schemas.js:48: * // Output: Auto-generated searchSchema
541
+ plugins/core/lib/querying-writing/compile-schemas.js:49: * // searchSchemaObject contains:
542
+ plugins/core/lib/querying-writing/compile-schemas.js:60: * const pivotSchema = {
543
+ plugins/core/lib/querying-writing/compile-schemas.js:67: * // schemaStructure will have:
544
+ plugins/core/lib/querying-writing/compile-schemas.js:76: * // Input: Schema with dependent getters
545
+ plugins/core/lib/querying-writing/compile-schemas.js:77: * const schema = {
546
+ plugins/core/lib/querying-writing/compile-schemas.js:108: * - Generates search schemas from field markers
547
+ plugins/core/lib/querying-writing/compile-schemas.js:109: * - Validates getter/setter dependencies
548
+ plugins/core/lib/querying-writing/compile-schemas.js:110: * - Provides hooks for schema enrichment
549
+ plugins/core/lib/querying-writing/compile-schemas.js:117: * 4. Runs schema:enrich hook for plugins
550
+ plugins/core/lib/querying-writing/compile-schemas.js:118: * 5. Creates json-rest-schema validation instance
551
+ plugins/core/lib/querying-writing/compile-schemas.js:119: * 6. Generates searchSchema from search:true fields
552
+ plugins/core/lib/querying-writing/compile-schemas.js:120: * 7. Runs searchSchema:enrich hook
553
+ plugins/core/lib/querying-writing/compile-schemas.js:122: * 9. Caches all results in scope.vars.schemaInfo
554
+ plugins/core/lib/querying-writing/compile-schemas.js:124:export async function compileSchemas (scope, deps) {
555
+ plugins/core/lib/querying-writing/compile-schemas.js:129: // Get raw schema
556
+ plugins/core/lib/querying-writing/compile-schemas.js:130: const rawFields = scope.scopeOptions?.schema || {}
557
+ plugins/core/lib/querying-writing/compile-schemas.js:132: // Extract computed fields from schema and build enriched schema
558
+ plugins/core/lib/querying-writing/compile-schemas.js:141: // Validate computed field
559
+ plugins/core/lib/querying-writing/compile-schemas.js:150: // Don't include computed fields in the validation schema
560
+ plugins/core/lib/querying-writing/compile-schemas.js:183: // Hook: schema:enrich
561
+ plugins/core/lib/querying-writing/compile-schemas.js:184: const schemaContext = {
562
+ plugins/core/lib/querying-writing/compile-schemas.js:190: await runHooks('schema:enrich', schemaContext)
563
+ plugins/core/lib/querying-writing/compile-schemas.js:192: // Create schema object
564
+ plugins/core/lib/querying-writing/compile-schemas.js:193: const schemaObject = createSchema(schemaContext.fields)
565
+ plugins/core/lib/querying-writing/compile-schemas.js:195: // Generate searchSchema by merging explicit searchSchema with fields marked search:true.
566
+ plugins/core/lib/querying-writing/compile-schemas.js:197: // in the main schema, or provide an explicit searchSchema with more control over filtering.
567
+ plugins/core/lib/querying-writing/compile-schemas.js:198: // The explicit searchSchema takes precedence when there are conflicts - it can override
568
+ plugins/core/lib/querying-writing/compile-schemas.js:200: // searchSchema will be added automatically.
569
+ plugins/core/lib/querying-writing/compile-schemas.js:202: // while searchSchema can specify filterOperator: 'contains' or complex join configurations.
570
+ plugins/core/lib/querying-writing/compile-schemas.js:203: const rawSearchFields = generateSearchSchemaFromSchema(
571
+ plugins/core/lib/querying-writing/compile-schemas.js:204: schemaContext.fields,
572
+ plugins/core/lib/querying-writing/compile-schemas.js:205: scope.scopeOptions.searchSchema
573
+ plugins/core/lib/querying-writing/compile-schemas.js:217: // Hook: searchSchema:enrich
574
+ plugins/core/lib/querying-writing/compile-schemas.js:218: const searchSchemaContext = {
575
+ plugins/core/lib/querying-writing/compile-schemas.js:219: fields: schemaContext.fields, // Mutable
576
+ plugins/core/lib/querying-writing/compile-schemas.js:220: originalFields: rawSearchFields, // Read-only enriched schema
577
+ plugins/core/lib/querying-writing/compile-schemas.js:223: await runHooks('searchSchema:enrich', searchSchemaContext)
578
+ plugins/core/lib/querying-writing/compile-schemas.js:225: // Create searchSchema object
579
+ plugins/core/lib/querying-writing/compile-schemas.js:226: var searchSchemaObject = createSchema(rawSearchFields)
580
+ plugins/core/lib/querying-writing/compile-schemas.js:228: var searchSchemaObject = createSchema({})
581
+ plugins/core/lib/querying-writing/compile-schemas.js:231: // Build schemaRelationships including polymorphic fields from schema
582
+ plugins/core/lib/querying-writing/compile-schemas.js:232: const schemaRelationships = { ...(scope.scopeOptions.relationships || {}) }
583
+ plugins/core/lib/querying-writing/compile-schemas.js:234: // Validate belongsTo fields
584
+ plugins/core/lib/querying-writing/compile-schemas.js:235: for (const [fieldName, fieldDef] of Object.entries(schemaContext.fields)) {
585
+ plugins/core/lib/querying-writing/compile-schemas.js:236: // Validate that belongsTo fields have 'as' property
586
+ plugins/core/lib/querying-writing/compile-schemas.js:240: 'The \'as\' property defines the relationship name used in JSON:API payloads. ' +
587
+ plugins/core/lib/querying-writing/compile-schemas.js:246: // Extract and validate getter definitions
588
+ plugins/core/lib/querying-writing/compile-schemas.js:250: for (const [fieldName, fieldDef] of Object.entries(schemaContext.fields)) {
589
+ plugins/core/lib/querying-writing/compile-schemas.js:259: // Validate dependencies exist
590
+ plugins/core/lib/querying-writing/compile-schemas.js:262: if (!schemaContext.fields[dep]) {
591
+ plugins/core/lib/querying-writing/compile-schemas.js:264: `Field '${fieldName}' in resource '${scopeName}' has getter dependency '${dep}' that does not exist in schema`
592
+ plugins/core/lib/querying-writing/compile-schemas.js:282: // Extract and validate setter definitions
593
+ plugins/core/lib/querying-writing/compile-schemas.js:286: for (const [fieldName, fieldDef] of Object.entries(schemaContext.fields)) {
594
+ plugins/core/lib/querying-writing/compile-schemas.js:295: // Validate dependencies exist
595
+ plugins/core/lib/querying-writing/compile-schemas.js:298: if (!schemaContext.fields[dep]) {
596
+ plugins/core/lib/querying-writing/compile-schemas.js:300: `Field '${fieldName}' in resource '${scopeName}' has setter dependency '${dep}' that does not exist in schema`
597
+ plugins/core/lib/querying-writing/compile-schemas.js:319: scope.vars.schemaInfo = {
598
+ plugins/core/lib/querying-writing/compile-schemas.js:321: schemaInstance: schemaObject,
599
+ plugins/core/lib/querying-writing/compile-schemas.js:322: schemaStructure: schemaObject.structure,
600
+ plugins/core/lib/querying-writing/compile-schemas.js:324: searchSchemaInstance: searchSchemaObject,
601
+ plugins/core/lib/querying-writing/compile-schemas.js:325: searchSchemaStructure: searchSchemaObject.structure,
602
+ plugins/core/lib/querying-writing/compile-schemas.js:328: schemaRelationships,
603
+ plugins/core/lib/querying-writing/simplified-helpers.js:22: * @param {Object} deps.context.schemaStructure - Schema with field definitions
604
+ plugins/core/lib/querying-writing/simplified-helpers.js:23: * @param {Object} deps.context.schemaRelationships - Relationship configurations
605
+ plugins/core/lib/querying-writing/simplified-helpers.js:35: * { context: { scopeName: 'articles', schemaStructure: schema } }
606
+ plugins/core/lib/querying-writing/simplified-helpers.js:52: * const schema = {
607
+ plugins/core/lib/querying-writing/simplified-helpers.js:204: * 3. Processes belongsTo relationships from schema
608
+ plugins/core/lib/querying-writing/simplified-helpers.js:214: const schema = deps.context.schemaStructure
609
+ plugins/core/lib/querying-writing/simplified-helpers.js:215: const relationships = deps.context.schemaRelationships
610
+ plugins/core/lib/querying-writing/simplified-helpers.js:229: // 1. Process belongsTo relationships (from schema fields)
611
+ plugins/core/lib/querying-writing/simplified-helpers.js:230: // Iterate through the schema structure to find belongsTo fields
612
+ plugins/core/lib/querying-writing/simplified-helpers.js:231: for (const [fieldName, fieldDef] of Object.entries(schema)) {
613
+ plugins/core/lib/querying-writing/simplified-helpers.js:291: // (though typically they are defined in schema.belongsTo)
614
+ plugins/core/lib/querying-writing/simplified-helpers.js:341: * @param {Object} deps.context.schemaStructure - Schema for mapping relationships
615
+ plugins/core/lib/querying-writing/simplified-helpers.js:342: * @param {Object} deps.context.schemaRelationships - Relationship configurations
616
+ plugins/core/lib/querying-writing/simplified-helpers.js:360: * { context: { schemaStructure: schema } }
617
+ plugins/core/lib/querying-writing/simplified-helpers.js:372: * const schema = {
618
+ plugins/core/lib/querying-writing/simplified-helpers.js:500: const schema = deps.context.schemaStructure
619
+ plugins/core/lib/querying-writing/simplified-helpers.js:501: const relationships = deps.context.schemaRelationships
620
+ plugins/core/lib/querying-writing/simplified-helpers.js:511: { context: { schemaStructure: schema, schemaRelationships: relationships, scopes } }
621
+ plugins/core/lib/querying-writing/simplified-helpers.js:534: { context: { schemaStructure: schema, schemaRelationships: relationships, scopes } }
622
+ plugins/core/lib/querying-writing/simplified-helpers.js:545: * @param {Object} deps.context.schemaStructure - Resource schema
623
+ plugins/core/lib/querying-writing/simplified-helpers.js:546: * @param {Object} deps.context.schemaRelationships - Relationship configs
624
+ plugins/core/lib/querying-writing/simplified-helpers.js:568: * const schema = {
625
+ plugins/core/lib/querying-writing/simplified-helpers.js:576: * { context: { schemaStructure: schema } }
626
+ plugins/core/lib/querying-writing/simplified-helpers.js:762: const schema = deps.context.schemaStructure
627
+ plugins/core/lib/querying-writing/simplified-helpers.js:763: const relationships = deps.context.schemaRelationships
628
+ plugins/core/lib/querying-writing/simplified-helpers.js:779: // Find schema field for this belongsTo relationship
629
+ plugins/core/lib/querying-writing/simplified-helpers.js:780: const schemaEntry = Object.entries(schema).find(([_, def]) => def.as === relName)
630
+ plugins/core/lib/querying-writing/simplified-helpers.js:782: if (schemaEntry) {
631
+ plugins/core/lib/querying-writing/simplified-helpers.js:783: const [fieldName, fieldDef] = schemaEntry
632
+ plugins/core/lib/querying-writing/simplified-helpers.js:818: schemaStructure: scopes?.[item.type]?.vars?.schemaInfo?.schema || {},
633
+ plugins/core/lib/querying-writing/simplified-helpers.js:819: schemaRelationships: scopes?.[item.type]?.vars?.schemaInfo?.schemaRelationships || {},
634
+ plugins/core/lib/querying-writing/simplified-helpers.js:839: schemaStructure: scopes?.[nestedData.type]?.vars?.schemaInfo?.schema || {},
635
+ plugins/core/lib/querying-writing/simplified-helpers.js:840: schemaRelationships: scopes?.[nestedData.type]?.vars?.schemaInfo?.schemaRelationships || {},
636
+ plugins/core/lib/querying-writing/database-capabilities.js:2: * Parses database version string to comparable format
637
+ plugins/core/lib/querying-writing/database-capabilities.js:5: * @returns {Object|null} Parsed version with major, minor, patch
638
+ plugins/core/lib/querying-writing/database-capabilities.js:9: * parseVersion("8.0.33");
639
+ plugins/core/lib/querying-writing/database-capabilities.js:14: * parseVersion("14.5 (Ubuntu 14.5-1.pgdg20.04+1)");
640
+ plugins/core/lib/querying-writing/database-capabilities.js:19: * parseVersion("10.6.12-MariaDB");
641
+ plugins/core/lib/querying-writing/database-capabilities.js:22:const parseVersion = (versionString) => {
642
+ plugins/core/lib/querying-writing/database-capabilities.js:32: major: parseInt(match[1]),
643
+ plugins/core/lib/querying-writing/database-capabilities.js:33: minor: parseInt(match[2]),
644
+ plugins/core/lib/querying-writing/database-capabilities.js:34: patch: match[3] ? parseInt(match[3]) : 0
645
+ plugins/core/lib/querying-writing/database-capabilities.js:66: * - buildWindowedIncludeQuery to validate before using window functions
646
+ plugins/core/lib/querying-writing/database-capabilities.js:77: * 3. Parses version and compares against known thresholds
647
+ plugins/core/lib/querying-writing/database-capabilities.js:105: const mysqlVersion = parseVersion(row.version)
648
+ plugins/core/lib/querying-writing/database-capabilities.js:119: const parsed = parseVersion(sqliteVersion)
649
+ plugins/core/lib/querying-writing/database-capabilities.js:120: return parsed && (parsed.major > 3 || (parsed.major === 3 && parsed.minor >= 25))
650
+ plugins/core/lib/querying-writing/database-capabilities.js:141: const mariaVersion = parseVersion(version)