plugins/core/rest-api-plugin-methods/patch.js:2:import { validatePatchPayload } from '../lib/querying-writing/payload-validators.js'
plugins/core/rest-api-plugin-methods/patch.js:8:  validateResourceAttributesBeforeWrite,
plugins/core/rest-api-plugin-methods/patch.js:9:  validateRelationshipAccess,
plugins/core/rest-api-plugin-methods/patch.js:11:  validatePivotResource,
plugins/core/rest-api-plugin-methods/patch.js:42:    const { schema, schemaStructure, schemaRelationships } = await setupCommonRequest({
plugins/core/rest-api-plugin-methods/patch.js:58:    // Validate PATCH payload to ensure the partial update actually contains changes.
plugins/core/rest-api-plugin-methods/patch.js:64:    validatePatchPayload(context.inputRecord, scopes)
plugins/core/rest-api-plugin-methods/patch.js:66:    // Validate that user has read access to all related resources
plugins/core/rest-api-plugin-methods/patch.js:68:    await validateRelationshipAccess(context, context.inputRecord, helpers, runHooks, api)
plugins/core/rest-api-plugin-methods/patch.js:78:    await validateResourceAttributesBeforeWrite({
plugins/core/rest-api-plugin-methods/patch.js:80:      schema,
plugins/core/rest-api-plugin-methods/patch.js:123:        context.schemaInfo,
plugins/core/rest-api-plugin-methods/patch.js:154:      validatePivotResource(scopes, relDef, relName)
plugins/core/rest-api-plugin-methods/patch.js:172:      schemaStructure,
plugins/core/rest-api-plugin-methods/patch.js:173:      schemaRelationships,
plugins/core/rest-api-plugin-methods/put.js:2:import { validatePutPayload } from '../lib/querying-writing/payload-validators.js'
plugins/core/rest-api-plugin-methods/put.js:8:  validateResourceAttributesBeforeWrite,
plugins/core/rest-api-plugin-methods/put.js:9:  validateRelationshipAccess,
plugins/core/rest-api-plugin-methods/put.js:11:  validatePivotResource,
plugins/core/rest-api-plugin-methods/put.js:41:    const { schema, schemaStructure, schemaRelationships } = await setupCommonRequest({
plugins/core/rest-api-plugin-methods/put.js:57:    // Validate PUT payload to ensure it's a complete resource replacement operation.
plugins/core/rest-api-plugin-methods/put.js:59:    // It validates that data.id matches the URL parameter, prevents 'included' array (which is
plugins/core/rest-api-plugin-methods/put.js:60:    // read-only), and ensures the payload represents a complete replacement. Any fields not
plugins/core/rest-api-plugin-methods/put.js:63:    validatePutPayload(context.inputRecord, scopes)
plugins/core/rest-api-plugin-methods/put.js:65:    // Validate that user has read access to all related resources
plugins/core/rest-api-plugin-methods/put.js:67:    await validateRelationshipAccess(context, context.inputRecord, helpers, runHooks, api)
plugins/core/rest-api-plugin-methods/put.js:77:    await validateResourceAttributesBeforeWrite({
plugins/core/rest-api-plugin-methods/put.js:79:      schema,
plugins/core/rest-api-plugin-methods/put.js:116:    for (const [relName, relDef] of Object.entries(schemaRelationships || {})) {
plugins/core/rest-api-plugin-methods/put.js:129:    // Also check schema fields for belongsTo relationships
plugins/core/rest-api-plugin-methods/put.js:130:    for (const [fieldName, fieldDef] of Object.entries(schemaStructure)) {
plugins/core/rest-api-plugin-methods/put.js:183:        context.schemaInfo,
plugins/core/rest-api-plugin-methods/put.js:212:      await validatePivotResource(scopes, relDef, relName)
plugins/core/rest-api-plugin-methods/put.js:234:      schemaStructure,
plugins/core/rest-api-plugin-methods/put.js:235:      schemaRelationships,
plugins/core/rest-api-plugin-methods/post.js:1:import { validatePostPayload } from '../lib/querying-writing/payload-validators.js'
plugins/core/rest-api-plugin-methods/post.js:6:  validateResourceAttributesBeforeWrite,
plugins/core/rest-api-plugin-methods/post.js:7:  validateRelationshipAccess,
plugins/core/rest-api-plugin-methods/post.js:9:  validatePivotResource,
plugins/core/rest-api-plugin-methods/post.js:38:    const { schema, schemaStructure, schemaRelationships } = await setupCommonRequest({
plugins/core/rest-api-plugin-methods/post.js:53:    // Validate POST payload to ensure it follows JSON:API format and references valid resources.
plugins/core/rest-api-plugin-methods/post.js:54:    // This checks the payload has required 'data' object with 'type' and 'attributes', validates
plugins/core/rest-api-plugin-methods/post.js:58:    validatePostPayload(context.inputRecord, scopes)
plugins/core/rest-api-plugin-methods/post.js:60:    // Validate that user has read access to all related resources
plugins/core/rest-api-plugin-methods/post.js:62:    await validateRelationshipAccess(context, context.inputRecord, helpers, runHooks, api)
plugins/core/rest-api-plugin-methods/post.js:80:    await validateResourceAttributesBeforeWrite({
plugins/core/rest-api-plugin-methods/post.js:82:      schema,
plugins/core/rest-api-plugin-methods/post.js:110:        context.schemaInfo,
plugins/core/rest-api-plugin-methods/post.js:139:      // Validate pivot resource exists
plugins/core/rest-api-plugin-methods/post.js:140:      validatePivotResource(scopes, relDef, relName)
plugins/core/rest-api-plugin-methods/post.js:149:      schemaStructure,
plugins/core/rest-api-plugin-methods/post.js:150:      schemaRelationships,
plugins/core/lib/querying-writing/payload-validators.js:1:import { RestApiValidationError, RestApiPayloadError } from '../../../../lib/rest-api-errors.js'
plugins/core/lib/querying-writing/payload-validators.js:4: * Validates that include paths don't exceed maximum depth
plugins/core/lib/querying-writing/payload-validators.js:6: * @param {string[]} includes - Array of include paths to validate
plugins/core/lib/querying-writing/payload-validators.js:13: * validateIncludeDepth(['author', 'comments.author'], 3);
plugins/core/lib/querying-writing/payload-validators.js:18: * validateIncludeDepth(['author.company.employees.manager'], 3);
plugins/core/lib/querying-writing/payload-validators.js:24:function validateIncludeDepth (includes, maxDepth) {
plugins/core/lib/querying-writing/payload-validators.js:31:      continue // Let other validators handle type errors
plugins/core/lib/querying-writing/payload-validators.js:52: * Validates a JSON:API resource identifier object
plugins/core/lib/querying-writing/payload-validators.js:54: * @param {Object} identifier - Resource identifier to validate
plugins/core/lib/querying-writing/payload-validators.js:58: * @throws {RestApiPayloadError|RestApiValidationError} If validation fails
plugins/core/lib/querying-writing/payload-validators.js:62: * validateResourceIdentifier(
plugins/core/lib/querying-writing/payload-validators.js:71: * validateResourceIdentifier(
plugins/core/lib/querying-writing/payload-validators.js:76: * // Throws: RestApiPayloadError
plugins/core/lib/querying-writing/payload-validators.js:81: * validateResourceIdentifier(
plugins/core/lib/querying-writing/payload-validators.js:91: * - validateRelationship to check relationship data
plugins/core/lib/querying-writing/payload-validators.js:92: * - validatePostPayload to validate included resources
plugins/core/lib/querying-writing/payload-validators.js:97: * - Validates resource types exist in the system
plugins/core/lib/querying-writing/payload-validators.js:102:function validateResourceIdentifier (identifier, context, scopes = null) {
plugins/core/lib/querying-writing/payload-validators.js:104:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:111:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:129:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:136:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:144: * Validates a relationship object in JSON:API format
plugins/core/lib/querying-writing/payload-validators.js:146: * @param {Object} relationship - Relationship object to validate
plugins/core/lib/querying-writing/payload-validators.js:150: * @throws {RestApiPayloadError} If validation fails
plugins/core/lib/querying-writing/payload-validators.js:154: * validateRelationship(
plugins/core/lib/querying-writing/payload-validators.js:163: * validateRelationship(
plugins/core/lib/querying-writing/payload-validators.js:177: * validateRelationship(
plugins/core/lib/querying-writing/payload-validators.js:186: * validateRelationship(
plugins/core/lib/querying-writing/payload-validators.js:191: * // Throws: RestApiPayloadError
plugins/core/lib/querying-writing/payload-validators.js:196: * - validatePostPayload for new resource relationships
plugins/core/lib/querying-writing/payload-validators.js:197: * - validatePutPayload for relationship replacement
plugins/core/lib/querying-writing/payload-validators.js:198: * - validatePatchPayload for relationship updates
plugins/core/lib/querying-writing/payload-validators.js:202: * - Validates both to-one and to-many relationships
plugins/core/lib/querying-writing/payload-validators.js:204: * - Validates each resource identifier in arrays
plugins/core/lib/querying-writing/payload-validators.js:208:function validateRelationship (relationship, relationshipName, scopes = null) {
plugins/core/lib/querying-writing/payload-validators.js:210:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:217:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:232:    validateResourceIdentifier(data, `Relationship '${relationshipName}'`, scopes)
plugins/core/lib/querying-writing/payload-validators.js:242:    validateResourceIdentifier(identifier, `Relationship '${relationshipName}[${index}]'`, scopes)
plugins/core/lib/querying-writing/payload-validators.js:247: * Validates query parameters for GET requests (single resource retrieval)
plugins/core/lib/querying-writing/payload-validators.js:253: * @param {Object} [params.queryParams.fields] - Sparse fieldsets by resource type
plugins/core/lib/querying-writing/payload-validators.js:256: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
plugins/core/lib/querying-writing/payload-validators.js:260: * validateGetPayload({
plugins/core/lib/querying-writing/payload-validators.js:267: * validateGetPayload({
plugins/core/lib/querying-writing/payload-validators.js:276: * // Input: GET with sparse fieldsets
plugins/core/lib/querying-writing/payload-validators.js:277: * validateGetPayload({
plugins/core/lib/querying-writing/payload-validators.js:291: * validateGetPayload({
plugins/core/lib/querying-writing/payload-validators.js:299: * validateGetPayload({
plugins/core/lib/querying-writing/payload-validators.js:307: * // Throws: RestApiPayloadError
plugins/core/lib/querying-writing/payload-validators.js:313: * - Validates parameters before passing to storage layer
plugins/core/lib/querying-writing/payload-validators.js:317: * - Validates JSON:API query parameter structure
plugins/core/lib/querying-writing/payload-validators.js:324: * 2. Validates required ID parameter
plugins/core/lib/querying-writing/payload-validators.js:325: * 3. If queryParams exist, validates each type
plugins/core/lib/querying-writing/payload-validators.js:326: * 4. Validates include paths don't exceed depth limit
plugins/core/lib/querying-writing/payload-validators.js:329:export function validateGetPayload (params, maxIncludeDepth = 3) {
plugins/core/lib/querying-writing/payload-validators.js:331:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:337:  // Validate ID
plugins/core/lib/querying-writing/payload-validators.js:352:  // Validate queryParams if present
plugins/core/lib/querying-writing/payload-validators.js:355:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:363:    // Validate include
plugins/core/lib/querying-writing/payload-validators.js:366:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:374:          throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:381:      // Validate include depth
plugins/core/lib/querying-writing/payload-validators.js:382:      validateIncludeDepth(include, maxIncludeDepth)
plugins/core/lib/querying-writing/payload-validators.js:385:    // Validate fields
plugins/core/lib/querying-writing/payload-validators.js:388:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:396:          throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:409: * Validates query parameters for collection requests (query/list operations)
plugins/core/lib/querying-writing/payload-validators.js:414: * @param {Object} [params.queryParams.fields] - Sparse fieldsets by resource type
plugins/core/lib/querying-writing/payload-validators.js:421: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
plugins/core/lib/querying-writing/payload-validators.js:425: * validateQueryPayload({}, ['title', 'createdAt']);
plugins/core/lib/querying-writing/payload-validators.js:430: * validateQueryPayload({
plugins/core/lib/querying-writing/payload-validators.js:444: * validateQueryPayload({
plugins/core/lib/querying-writing/payload-validators.js:452: * validateQueryPayload({
plugins/core/lib/querying-writing/payload-validators.js:461: * validateQueryPayload({
plugins/core/lib/querying-writing/payload-validators.js:481: * validateQueryPayload({
plugins/core/lib/querying-writing/payload-validators.js:492: * - Validates collection request parameters
plugins/core/lib/querying-writing/payload-validators.js:495: * - Validates all JSON:API query parameters for collections
plugins/core/lib/querying-writing/payload-validators.js:499: * - Validates include depth limits
plugins/core/lib/querying-writing/payload-validators.js:502: * 1. Validates params object structure
plugins/core/lib/querying-writing/payload-validators.js:503: * 2. For each query parameter type, validates format
plugins/core/lib/querying-writing/payload-validators.js:505: * 4. Validates pagination parameters are numbers/strings
plugins/core/lib/querying-writing/payload-validators.js:508:export function validateQueryPayload (params, sortableFields = [], maxIncludeDepth = 3) {
plugins/core/lib/querying-writing/payload-validators.js:510:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:519:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:527:    // Validate include
plugins/core/lib/querying-writing/payload-validators.js:530:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:538:          throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:545:      // Validate include depth
plugins/core/lib/querying-writing/payload-validators.js:546:      validateIncludeDepth(include, maxIncludeDepth)
plugins/core/lib/querying-writing/payload-validators.js:549:    // Validate fields
plugins/core/lib/querying-writing/payload-validators.js:552:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:560:          throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:568:    // Validate filters
plugins/core/lib/querying-writing/payload-validators.js:571:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:578:    // Validate sort
plugins/core/lib/querying-writing/payload-validators.js:581:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:589:          throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:606:    // Validate page
plugins/core/lib/querying-writing/payload-validators.js:609:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:617:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:624:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:631:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:638:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:650: * Validates a JSON:API document for POST requests (resource creation)
plugins/core/lib/querying-writing/payload-validators.js:652: * @param {Object} inputRecord - JSON:API document to validate
plugins/core/lib/querying-writing/payload-validators.js:661: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
plugins/core/lib/querying-writing/payload-validators.js:665: * validatePostPayload({
plugins/core/lib/querying-writing/payload-validators.js:678: * validatePostPayload({
plugins/core/lib/querying-writing/payload-validators.js:697: * // Output: true (validates each relationship)
plugins/core/lib/querying-writing/payload-validators.js:701: * validatePostPayload({
plugins/core/lib/querying-writing/payload-validators.js:714: * validatePostPayload({
plugins/core/lib/querying-writing/payload-validators.js:735: * // Output: true (included resources validated)
plugins/core/lib/querying-writing/payload-validators.js:739: * validatePostPayload({
plugins/core/lib/querying-writing/payload-validators.js:744: * // Throws: RestApiPayloadError
plugins/core/lib/querying-writing/payload-validators.js:750: * - Validates complete document structure
plugins/core/lib/querying-writing/payload-validators.js:754: * - Validates resource types exist in system
plugins/core/lib/querying-writing/payload-validators.js:756: * - Validates included resources have required fields
plugins/core/lib/querying-writing/payload-validators.js:760: * 1. Validates document has required 'data' property
plugins/core/lib/querying-writing/payload-validators.js:762: * 3. Validates attributes object if present
plugins/core/lib/querying-writing/payload-validators.js:763: * 4. Validates each relationship if present
plugins/core/lib/querying-writing/payload-validators.js:764: * 5. Validates included resources array if present
plugins/core/lib/querying-writing/payload-validators.js:767:export function validatePostPayload (inputRecord, scopes = null) {
plugins/core/lib/querying-writing/payload-validators.js:769:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:775:  // Validate required 'data' property
plugins/core/lib/querying-writing/payload-validators.js:777:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:785:  // Validate primary data
plugins/core/lib/querying-writing/payload-validators.js:787:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:794:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:810:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:816:  // Validate attributes if present
plugins/core/lib/querying-writing/payload-validators.js:819:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:826:  // Validate relationships if present
plugins/core/lib/querying-writing/payload-validators.js:829:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:836:      validateRelationship(relationship, relName, scopes)
plugins/core/lib/querying-writing/payload-validators.js:840:  // Validate included resources if present
plugins/core/lib/querying-writing/payload-validators.js:843:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:851:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:858:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:873:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:880:        throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:888:          throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:901: * Validates a JSON:API document for PUT requests (full resource replacement)
plugins/core/lib/querying-writing/payload-validators.js:903: * @param {Object} inputRecord - JSON:API document to validate
plugins/core/lib/querying-writing/payload-validators.js:911: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
plugins/core/lib/querying-writing/payload-validators.js:915: * validatePutPayload({
plugins/core/lib/querying-writing/payload-validators.js:930: * validatePutPayload({
plugins/core/lib/querying-writing/payload-validators.js:959: * validatePutPayload({
plugins/core/lib/querying-writing/payload-validators.js:965: * // Throws: RestApiPayloadError
plugins/core/lib/querying-writing/payload-validators.js:970: * validatePutPayload({
plugins/core/lib/querying-writing/payload-validators.js:980: * // Throws: RestApiPayloadError
plugins/core/lib/querying-writing/payload-validators.js:996: * 1. Validates document structure with data property
plugins/core/lib/querying-writing/payload-validators.js:998: * 3. Validates resource type exists in scopes
plugins/core/lib/querying-writing/payload-validators.js:1000: * 5. Validates attributes and relationships if present
plugins/core/lib/querying-writing/payload-validators.js:1003:export function validatePutPayload (inputRecord, scopes = null) {
plugins/core/lib/querying-writing/payload-validators.js:1005:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1011:  // Validate required 'data' property
plugins/core/lib/querying-writing/payload-validators.js:1013:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1023:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1029:  // Validate primary data
plugins/core/lib/querying-writing/payload-validators.js:1031:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1038:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1054:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1068:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1074:  // Validate attributes if present
plugins/core/lib/querying-writing/payload-validators.js:1077:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1084:  // Validate relationships if present
plugins/core/lib/querying-writing/payload-validators.js:1087:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1094:      validateRelationship(relationship, relName, scopes)
plugins/core/lib/querying-writing/payload-validators.js:1102: * Validates a JSON:API document for PATCH requests (partial resource updates)
plugins/core/lib/querying-writing/payload-validators.js:1104: * @param {Object} inputRecord - JSON:API document to validate
plugins/core/lib/querying-writing/payload-validators.js:1112: * @throws {RestApiValidationError|RestApiPayloadError} If validation fails
plugins/core/lib/querying-writing/payload-validators.js:1116: * validatePatchPayload({
plugins/core/lib/querying-writing/payload-validators.js:1130: * validatePatchPayload({
plugins/core/lib/querying-writing/payload-validators.js:1145: * validatePatchPayload({
plugins/core/lib/querying-writing/payload-validators.js:1161: * validatePatchPayload({
plugins/core/lib/querying-writing/payload-validators.js:1179: * validatePatchPayload({
plugins/core/lib/querying-writing/payload-validators.js:1202: * 1. Validates document structure with data property
plugins/core/lib/querying-writing/payload-validators.js:1204: * 3. Validates resource type exists in scopes
plugins/core/lib/querying-writing/payload-validators.js:1207: * 6. Validates each if present
plugins/core/lib/querying-writing/payload-validators.js:1210:export function validatePatchPayload (inputRecord, scopes = null) {
plugins/core/lib/querying-writing/payload-validators.js:1212:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1218:  // Validate required 'data' property
plugins/core/lib/querying-writing/payload-validators.js:1220:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1230:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1236:  // Validate primary data
plugins/core/lib/querying-writing/payload-validators.js:1238:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1245:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1261:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1275:    throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1289:  // Validate attributes if present
plugins/core/lib/querying-writing/payload-validators.js:1292:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1299:  // Validate relationships if present
plugins/core/lib/querying-writing/payload-validators.js:1302:      throw new RestApiPayloadError(
plugins/core/lib/querying-writing/payload-validators.js:1309:      validateRelationship(relationship, relName, scopes)
plugins/core/lib/querying-writing/field-utils.js:2: * Extracts all foreign key fields from a schema definition
plugins/core/lib/querying-writing/field-utils.js:4: * @param {Object} schema - The schema definition (Schema object or plain object)
plugins/core/lib/querying-writing/field-utils.js:8: * // Input: Schema with belongsTo relationships
plugins/core/lib/querying-writing/field-utils.js:9: * const schema = {
plugins/core/lib/querying-writing/field-utils.js:17: * const foreignKeys = getForeignKeyFields(schema);
plugins/core/lib/querying-writing/field-utils.js:23: * // Input: Works with compiled Schema objects too
plugins/core/lib/querying-writing/field-utils.js:24: * const schemaObject = {
plugins/core/lib/querying-writing/field-utils.js:31: * const foreignKeys = getForeignKeyFields(schemaObject);
plugins/core/lib/querying-writing/field-utils.js:49: * 1. Accepts schema in either format (plain or with structure property)
plugins/core/lib/querying-writing/field-utils.js:54:export const getForeignKeyFields = (schema) => {
plugins/core/lib/querying-writing/field-utils.js:56:  if (!schema) return foreignKeys
plugins/core/lib/querying-writing/field-utils.js:58:  // Handle both Schema objects and plain objects
plugins/core/lib/querying-writing/field-utils.js:59:  const schemaStructure = schema.structure || schema
plugins/core/lib/querying-writing/field-utils.js:61:  Object.entries(schemaStructure).forEach(([field, def]) => {
plugins/core/lib/querying-writing/field-utils.js:70: * Filters hidden fields from attributes based on schema rules.
plugins/core/lib/querying-writing/field-utils.js:73: * based on the schema definition and requested fields. It ensures that
plugins/core/lib/querying-writing/field-utils.js:77: * @param {Object} schema - The schema object with structure property
plugins/core/lib/querying-writing/field-utils.js:88: * const schema = {
plugins/core/lib/querying-writing/field-utils.js:96: * const filtered = filterHiddenFields(attributes, schema, null);
plugins/core/lib/querying-writing/field-utils.js:101: * const filtered = filterHiddenFields(attributes, schema, 'name,internal_id');
plugins/core/lib/querying-writing/field-utils.js:106:export const filterHiddenFields = (attributes, schema, requestedFields) => {
plugins/core/lib/querying-writing/field-utils.js:109:  // Parse requested fields if it's a string (from query params)
plugins/core/lib/querying-writing/field-utils.js:120:    const fieldDef = schema.structure?.[field]
plugins/core/lib/querying-writing/field-utils.js:128:    // via sparse fieldsets like ?fields[products]=name,cost
plugins/core/lib/querying-writing/database-value-normalizers.js:2: * Normalizes a date value to appropriate format based on field type
plugins/core/lib/querying-writing/database-value-normalizers.js:10: * normalizeDateValue(new Date('2024-01-15T10:30:00Z'), 'dateTime');
plugins/core/lib/querying-writing/database-value-normalizers.js:15: * normalizeDateValue('2024-01-15 10:30:00', 'dateTime');
plugins/core/lib/querying-writing/database-value-normalizers.js:16: * // Output: Date object parsed as UTC (2024-01-15T10:30:00Z)
plugins/core/lib/querying-writing/database-value-normalizers.js:20: * normalizeDateValue('2024-01-15', 'date');
plugins/core/lib/querying-writing/database-value-normalizers.js:25: * normalizeDateValue('14:30:45', 'time');
plugins/core/lib/querying-writing/database-value-normalizers.js:30: * normalizeDateValue(new Date('2024-01-15T14:30:45Z'), 'time');
plugins/core/lib/querying-writing/database-value-normalizers.js:35: * - normalizeAttributes to process individual field values
plugins/core/lib/querying-writing/database-value-normalizers.js:51:function normalizeDateValue (value, type) {
plugins/core/lib/querying-writing/database-value-normalizers.js:67:    // Try to parse and extract time
plugins/core/lib/querying-writing/database-value-normalizers.js:111:  // Try to parse any other format
plugins/core/lib/querying-writing/database-value-normalizers.js:124: * Normalizes database values in an attributes object
plugins/core/lib/querying-writing/database-value-normalizers.js:126: * @param {Object} attributes - The attributes object to normalize
plugins/core/lib/querying-writing/database-value-normalizers.js:127: * @param {Object} schemaStructure - The schema structure defining field types
plugins/core/lib/querying-writing/database-value-normalizers.js:128: * @returns {Object} The normalized attributes object
plugins/core/lib/querying-writing/database-value-normalizers.js:140: * const schema = {
plugins/core/lib/querying-writing/database-value-normalizers.js:147: * const normalized = normalizeAttributes(attributes, schema);
plugins/core/lib/querying-writing/database-value-normalizers.js:167: * const normalized = normalizeAttributes(attributes, {
plugins/core/lib/querying-writing/database-value-normalizers.js:184: * - normalizeRecordAttributes for each record's attributes
plugins/core/lib/querying-writing/database-value-normalizers.js:189: * - Normalizes date formats from different databases
plugins/core/lib/querying-writing/database-value-normalizers.js:195: * 2. Iterates through each field with schema definition
plugins/core/lib/querying-writing/database-value-normalizers.js:196: * 3. Normalizes booleans: 1/0 or '1'/'0' to true/false
plugins/core/lib/querying-writing/database-value-normalizers.js:197: * 4. Normalizes dates using normalizeDateValue
plugins/core/lib/querying-writing/database-value-normalizers.js:198: * 5. Returns new object with normalized values
plugins/core/lib/querying-writing/database-value-normalizers.js:200:export function normalizeAttributes (attributes, schemaStructure) {
plugins/core/lib/querying-writing/database-value-normalizers.js:201:  if (!attributes || !schemaStructure) {
plugins/core/lib/querying-writing/database-value-normalizers.js:205:  const normalized = { ...attributes }
plugins/core/lib/querying-writing/database-value-normalizers.js:209:    const fieldDef = schemaStructure[fieldName]
plugins/core/lib/querying-writing/database-value-normalizers.js:214:    // Normalize boolean values
plugins/core/lib/querying-writing/database-value-normalizers.js:217:        normalized[fieldName] = true
plugins/core/lib/querying-writing/database-value-normalizers.js:219:        normalized[fieldName] = false
plugins/core/lib/querying-writing/database-value-normalizers.js:224:    // Normalize date/dateTime/time values
plugins/core/lib/querying-writing/database-value-normalizers.js:226:      normalized[fieldName] = normalizeDateValue(value, fieldDef.type)
plugins/core/lib/querying-writing/database-value-normalizers.js:230:  return normalized
plugins/core/lib/querying-writing/database-value-normalizers.js:234: * Normalizes all records in a JSON:API response
plugins/core/lib/querying-writing/database-value-normalizers.js:237: * @param {Object} scopes - All available scopes for schema lookup
plugins/core/lib/querying-writing/database-value-normalizers.js:238: * @returns {Object} The response with normalized values
plugins/core/lib/querying-writing/database-value-normalizers.js:263: * const normalized = normalizeRecordAttributes(response, scopes);
plugins/core/lib/querying-writing/database-value-normalizers.js:265: * // Output: All booleans and dates normalized
plugins/core/lib/querying-writing/database-value-normalizers.js:304: * // Each record in the array is normalized
plugins/core/lib/querying-writing/database-value-normalizers.js:315: * - Uses schema definitions to determine field types
plugins/core/lib/querying-writing/database-value-normalizers.js:319: * 2. For each record, looks up its schema by type
plugins/core/lib/querying-writing/database-value-normalizers.js:320: * 3. Calls normalizeAttributes with schema structure
plugins/core/lib/querying-writing/database-value-normalizers.js:322: * 5. Returns complete response with normalized values
plugins/core/lib/querying-writing/database-value-normalizers.js:324:export function normalizeRecordAttributes (record, scopes) {
plugins/core/lib/querying-writing/database-value-normalizers.js:329:  // Normalize main data records
plugins/core/lib/querying-writing/database-value-normalizers.js:335:        if (scope?.vars?.schemaInfo?.schemaStructure && entry.attributes) {
plugins/core/lib/querying-writing/database-value-normalizers.js:336:          entry.attributes = normalizeAttributes(
plugins/core/lib/querying-writing/database-value-normalizers.js:338:            scope.vars.schemaInfo.schemaStructure
plugins/core/lib/querying-writing/database-value-normalizers.js:346:      if (scope?.vars?.schemaInfo?.schemaStructure && entry.attributes) {
plugins/core/lib/querying-writing/database-value-normalizers.js:347:        entry.attributes = normalizeAttributes(
plugins/core/lib/querying-writing/database-value-normalizers.js:349:          scope.vars.schemaInfo.schemaStructure
plugins/core/lib/querying-writing/database-value-normalizers.js:355:  // Normalize included records
plugins/core/lib/querying-writing/database-value-normalizers.js:359:      if (scope?.vars?.schemaInfo?.schemaStructure && entry.attributes) {
plugins/core/lib/querying-writing/database-value-normalizers.js:360:        entry.attributes = normalizeAttributes(
plugins/core/lib/querying-writing/database-value-normalizers.js:362:          scope.vars.schemaInfo.schemaStructure
plugins/core/lib/querying-writing/knex-field-helpers.js:5: * @param {Object} schemaInfo - Schema info with computed fields and structure
plugins/core/lib/querying-writing/knex-field-helpers.js:10: * const schemaInfo = {
plugins/core/lib/querying-writing/knex-field-helpers.js:12: *   schemaStructure: { price: { type: 'number' } }
plugins/core/lib/querying-writing/knex-field-helpers.js:14: * isNonDatabaseField('profit_margin', schemaInfo);
plugins/core/lib/querying-writing/knex-field-helpers.js:19: * const schemaInfo = {
plugins/core/lib/querying-writing/knex-field-helpers.js:21: *   schemaStructure: {
plugins/core/lib/querying-writing/knex-field-helpers.js:25: * isNonDatabaseField('temp_password', schemaInfo);
plugins/core/lib/querying-writing/knex-field-helpers.js:39:export const isNonDatabaseField = (fieldName, schemaInfo) => {
plugins/core/lib/querying-writing/knex-field-helpers.js:40:  const { computed = {}, schemaStructure = {} } = schemaInfo
plugins/core/lib/querying-writing/knex-field-helpers.js:42:  const fieldDef = schemaStructure[fieldName]
plugins/core/lib/querying-writing/knex-field-helpers.js:47: * Builds the field selection list for database queries with sparse fieldset support
plugins/core/lib/querying-writing/knex-field-helpers.js:49: * @param {Object} scope - Resource scope with schema information
plugins/core/lib/querying-writing/knex-field-helpers.js:51: * @param {Object} deps.context - Request context with queryParams and schemaInfo
plugins/core/lib/querying-writing/knex-field-helpers.js:55: * // Input: Basic sparse fieldset request
plugins/core/lib/querying-writing/knex-field-helpers.js:60: *     schemaInfo: { idProperty: 'id', ...  }
plugins/core/lib/querying-writing/knex-field-helpers.js:76: * const schemaInfo = {
plugins/core/lib/querying-writing/knex-field-helpers.js:83: *   schemaStructure: {
plugins/core/lib/querying-writing/knex-field-helpers.js:104: * // Input: No sparse fieldsets (returns all visible fields)
plugins/core/lib/querying-writing/knex-field-helpers.js:108: *     schemaInfo: { ... }
plugins/core/lib/querying-writing/knex-field-helpers.js:127: * - Implements JSON:API sparse fieldsets specification
plugins/core/lib/querying-writing/knex-field-helpers.js:135: * 2. Parses requested fields from query string
plugins/core/lib/querying-writing/knex-field-helpers.js:136: * 3. Validates requested fields exist in schema
plugins/core/lib/querying-writing/knex-field-helpers.js:148:      schemaInfo: { schemaInstance, computed: computedFields = {}, schemaStructure }
plugins/core/lib/querying-writing/knex-field-helpers.js:156:  const idProperty = context.schemaInfo.idProperty
plugins/core/lib/querying-writing/knex-field-helpers.js:166:  // Handle both Schema objects and plain objects
plugins/core/lib/querying-writing/knex-field-helpers.js:167:  if (!schemaStructure) {
plugins/core/lib/querying-writing/knex-field-helpers.js:168:    schemaStructure = schemaInstance?.structure || schemaInstance || {}
plugins/core/lib/querying-writing/knex-field-helpers.js:171:  // Get computed fields and virtual fields from schema
plugins/core/lib/querying-writing/knex-field-helpers.js:174:  // Find fields marked as virtual in the schema
plugins/core/lib/querying-writing/knex-field-helpers.js:176:  Object.entries(schemaStructure).forEach(([fieldName, fieldDef]) => {
plugins/core/lib/querying-writing/knex-field-helpers.js:184:  // Parse requested fields
plugins/core/lib/querying-writing/knex-field-helpers.js:194:    // Sparse fieldsets requested - only select specified fields
plugins/core/lib/querying-writing/knex-field-helpers.js:202:      const fieldDef = schemaStructure[field]
plugins/core/lib/querying-writing/knex-field-helpers.js:203:      if (!fieldDef) throw new Error(`Unknown sparse field '${field}' requested for '${scopeName}'`)
plugins/core/lib/querying-writing/knex-field-helpers.js:224:          const depFieldDef = schemaStructure[dep]
plugins/core/lib/querying-writing/knex-field-helpers.js:240:      Object.entries(schemaStructure).forEach(([field, fieldDef]) => {
plugins/core/lib/querying-writing/knex-field-helpers.js:253:    // No sparse fieldsets - return all visible fields
plugins/core/lib/querying-writing/knex-field-helpers.js:255:    Object.entries(schemaStructure).forEach(([field, fieldDef]) => {
plugins/core/lib/querying-writing/knex-field-helpers.js:273:    // When no sparse fieldsets, we compute all computed fields
plugins/core/lib/querying-writing/knex-field-helpers.js:280:          const depFieldDef = schemaStructure[dep]
plugins/core/lib/querying-writing/knex-field-helpers.js:295:  Object.entries(schemaStructure).forEach(([field, fieldDef]) => {
plugins/core/lib/querying-writing/knex-field-helpers.js:303:    const relationships = scope.vars.schemaInfo.schemaRelationships
plugins/core/lib/querying-writing/knex-field-helpers.js:328: * Determines which computed fields to calculate based on sparse fieldsets
plugins/core/lib/querying-writing/knex-field-helpers.js:332: * @param {Object} computedFields - Computed field definitions from schema
plugins/core/lib/querying-writing/knex-field-helpers.js:336: * // Input: No sparse fieldsets (calculate all computed fields)
plugins/core/lib/querying-writing/knex-field-helpers.js:345: * // Input: Sparse fieldsets with some computed fields
plugins/core/lib/querying-writing/knex-field-helpers.js:355: * // Input: Sparse fieldsets with no computed fields
plugins/core/lib/querying-writing/knex-field-helpers.js:370: * - Supports JSON:API sparse fieldsets for computed fields
plugins/core/lib/querying-writing/knex-field-helpers.js:374: * 1. Checks if sparse fieldsets are specified
plugins/core/lib/querying-writing/knex-field-helpers.js:377: * 4. Normalizes string input to array format
plugins/core/lib/querying-writing/knex-field-helpers.js:385:    // No sparse fieldsets - return all computed fields
plugins/core/lib/querying-writing/knex-field-helpers.js:389:  // Parse requested fields if it's a string
plugins/core/lib/querying-writing/connectors-query-parser.js:2: * Parses URL query strings into JSON:API compliant parameter objects
plugins/core/lib/querying-writing/connectors-query-parser.js:5: * @returns {object} Parsed query parameters in JSON:API format
plugins/core/lib/querying-writing/connectors-query-parser.js:9: * const query = parseJsonApiQuery('include=author&sort=-created_at');
plugins/core/lib/querying-writing/connectors-query-parser.js:11: * // Output: Parsed into arrays
plugins/core/lib/querying-writing/connectors-query-parser.js:22: * const query = parseJsonApiQuery('filter[status]=published&filter[author_id]=123');
plugins/core/lib/querying-writing/connectors-query-parser.js:37: * // Input: Sparse fieldsets
plugins/core/lib/querying-writing/connectors-query-parser.js:38: * const query = parseJsonApiQuery('fields[articles]=title,body&fields[users]=name');
plugins/core/lib/querying-writing/connectors-query-parser.js:54: * const query = parseJsonApiQuery('page[size]=20&page[number]=3&page[cursor]=abc123');
plugins/core/lib/querying-writing/connectors-query-parser.js:71: * const query = parseJsonApiQuery(
plugins/core/lib/querying-writing/connectors-query-parser.js:94: * - express-plugin parses req.query with this
plugins/core/lib/querying-writing/connectors-query-parser.js:95: * - http-plugin parses URL query strings with this
plugins/core/lib/querying-writing/connectors-query-parser.js:96: * - websocket-plugin parses message query parameters with this
plugins/core/lib/querying-writing/connectors-query-parser.js:111: * 6. Returns normalized structure for REST API
plugins/core/lib/querying-writing/connectors-query-parser.js:113:export function parseJsonApiQuery (queryString) {
plugins/core/lib/querying-writing/connectors-query-parser.js:135:      // Parse include (comma-separated string to array)
plugins/core/lib/querying-writing/connectors-query-parser.js:138:      // Parse sort (comma-separated string to array)
plugins/core/lib/querying-writing/connectors-query-parser.js:141:      // Parse filter[key] = value into filters: { key: value }
plugins/core/lib/querying-writing/connectors-query-parser.js:147:      // Parse fields[type] = fields into fields: { type: "field1,field2" }
plugins/core/lib/querying-writing/connectors-query-parser.js:154:      // Parse page[size] = 10 into page: { size: 10 }
plugins/core/lib/querying-writing/connectors-query-parser.js:158:        result.page[pageKey] = isNaN(value) ? value : parseInt(value, 10)
plugins/core/lib/querying-writing/schema-helpers.js:2: * Schema processing utilities for search and field dependencies
plugins/core/lib/querying-writing/schema-helpers.js:7: * - Generating search schemas from various configuration sources
plugins/core/lib/querying-writing/schema-helpers.js:15: * Marks all fields in a searchSchema as indexed for database optimization
plugins/core/lib/querying-writing/schema-helpers.js:17: * @param {Object} searchSchema - Search schema object to process
plugins/core/lib/querying-writing/schema-helpers.js:18: * @returns {void} Modifies the searchSchema in-place
plugins/core/lib/querying-writing/schema-helpers.js:22: * const searchSchema = {
plugins/core/lib/querying-writing/schema-helpers.js:27: * ensureSearchFieldsAreIndexed(searchSchema);
plugins/core/lib/querying-writing/schema-helpers.js:38: * const searchSchema = {
plugins/core/lib/querying-writing/schema-helpers.js:50: * ensureSearchFieldsAreIndexed(searchSchema);
plugins/core/lib/querying-writing/schema-helpers.js:60: * const searchSchema = {
plugins/core/lib/querying-writing/schema-helpers.js:64: * ensureSearchFieldsAreIndexed(searchSchema);
plugins/core/lib/querying-writing/schema-helpers.js:75: * - Applied to all searchSchema fields before storage setup
plugins/core/lib/querying-writing/schema-helpers.js:84: * 1. Receives searchSchema object (or null)
plugins/core/lib/querying-writing/schema-helpers.js:89:export function ensureSearchFieldsAreIndexed (searchSchema) {
plugins/core/lib/querying-writing/schema-helpers.js:90:  if (!searchSchema) return
plugins/core/lib/querying-writing/schema-helpers.js:92:  Object.keys(searchSchema).forEach(fieldName => {
plugins/core/lib/querying-writing/schema-helpers.js:93:    const fieldDef = searchSchema[fieldName]
plugins/core/lib/querying-writing/schema-helpers.js:102: * Generates complete searchSchema by merging schema search definitions with explicit searchSchema
plugins/core/lib/querying-writing/schema-helpers.js:104: * @param {Object} schema - Main resource schema with optional 'search' properties
plugins/core/lib/querying-writing/schema-helpers.js:105: * @param {Object} explicitSearchSchema - Optional explicit searchSchema to merge
plugins/core/lib/querying-writing/schema-helpers.js:106: * @returns {Object|null} Merged searchSchema or null if no search fields
plugins/core/lib/querying-writing/schema-helpers.js:110: * // Input: Simple search fields in schema
plugins/core/lib/querying-writing/schema-helpers.js:111: * const schema = {
plugins/core/lib/querying-writing/schema-helpers.js:116: * const result = generateSearchSchemaFromSchema(schema, null);
plugins/core/lib/querying-writing/schema-helpers.js:118: * // Output: Generated search schema
plugins/core/lib/querying-writing/schema-helpers.js:126: * const schema = {
plugins/core/lib/querying-writing/schema-helpers.js:135: * const result = generateSearchSchemaFromSchema(schema, null);
plugins/core/lib/querying-writing/schema-helpers.js:152: * // Input: Merging with explicit searchSchema
plugins/core/lib/querying-writing/schema-helpers.js:153: * const schema = {
plugins/core/lib/querying-writing/schema-helpers.js:156: * const explicitSearchSchema = {
plugins/core/lib/querying-writing/schema-helpers.js:160: * const result = generateSearchSchemaFromSchema(schema, explicitSearchSchema);
plugins/core/lib/querying-writing/schema-helpers.js:166: * //   name: { type: 'string' }                           // From schema (no operator set)
plugins/core/lib/querying-writing/schema-helpers.js:170: * // Input: Explicit searchSchema takes precedence
plugins/core/lib/querying-writing/schema-helpers.js:171: * const schema = {
plugins/core/lib/querying-writing/schema-helpers.js:174: * const explicitSearchSchema = {
plugins/core/lib/querying-writing/schema-helpers.js:177: * const result = generateSearchSchemaFromSchema(schema, explicitSearchSchema);
plugins/core/lib/querying-writing/schema-helpers.js:178: * // Output: Explicit searchSchema wins
plugins/core/lib/querying-writing/schema-helpers.js:185: * const schema = {
plugins/core/lib/querying-writing/schema-helpers.js:214: * - Generates searchSchema from various sources
plugins/core/lib/querying-writing/schema-helpers.js:220: * - Merges search:true fields with explicit searchSchema
plugins/core/lib/querying-writing/schema-helpers.js:221: * - Explicit searchSchema always takes precedence
plugins/core/lib/querying-writing/schema-helpers.js:225: * 1. Starts with explicit searchSchema (if any)
plugins/core/lib/querying-writing/schema-helpers.js:226: * 2. Processes schema fields with 'search' property
plugins/core/lib/querying-writing/schema-helpers.js:227: * 3. Skips fields already in explicit searchSchema (no conflicts)
plugins/core/lib/querying-writing/schema-helpers.js:230: * 6. Returns merged searchSchema or null
plugins/core/lib/querying-writing/schema-helpers.js:232:export const generateSearchSchemaFromSchema = (schema, explicitSearchSchema) => {
plugins/core/lib/querying-writing/schema-helpers.js:233:  // Start with explicit searchSchema or empty object
plugins/core/lib/querying-writing/schema-helpers.js:234:  const searchSchema = explicitSearchSchema ? { ...explicitSearchSchema } : {}
plugins/core/lib/querying-writing/schema-helpers.js:236:  if (!schema) {
plugins/core/lib/querying-writing/schema-helpers.js:237:    return Object.keys(searchSchema).length > 0 ? searchSchema : null
plugins/core/lib/querying-writing/schema-helpers.js:240:  // Process schema fields with 'search' property
plugins/core/lib/querying-writing/schema-helpers.js:241:  Object.entries(schema).forEach(([fieldName, fieldDef]) => {
plugins/core/lib/querying-writing/schema-helpers.js:249:        // Check if field already exists in explicit searchSchema
plugins/core/lib/querying-writing/schema-helpers.js:250:        if (searchSchema[searchFieldName]) {
plugins/core/lib/querying-writing/schema-helpers.js:251:          // Skip - explicit searchSchema takes precedence
plugins/core/lib/querying-writing/schema-helpers.js:252:          // This allows searchSchema to override fields marked with search:true
plugins/core/lib/querying-writing/schema-helpers.js:270:        searchSchema[searchFieldName] = searchEntry
plugins/core/lib/querying-writing/schema-helpers.js:280:            // Check if filter already exists in explicit searchSchema
plugins/core/lib/querying-writing/schema-helpers.js:281:            if (searchSchema[filterName]) {
plugins/core/lib/querying-writing/schema-helpers.js:282:              // Skip - explicit searchSchema takes precedence
plugins/core/lib/querying-writing/schema-helpers.js:286:            searchSchema[filterName] = {
plugins/core/lib/querying-writing/schema-helpers.js:296:          // Check if field already exists in explicit searchSchema
plugins/core/lib/querying-writing/schema-helpers.js:297:          if (searchSchema[searchFieldName]) {
plugins/core/lib/querying-writing/schema-helpers.js:298:            // Skip - explicit searchSchema takes precedence
plugins/core/lib/querying-writing/schema-helpers.js:315:          searchSchema[searchFieldName] = searchEntry
plugins/core/lib/querying-writing/schema-helpers.js:322:  if (schema._virtual?.search) {
plugins/core/lib/querying-writing/schema-helpers.js:323:    Object.entries(schema._virtual.search).forEach(([filterName, filterDef]) => {
plugins/core/lib/querying-writing/schema-helpers.js:324:      // Check if filter already exists in explicit searchSchema
plugins/core/lib/querying-writing/schema-helpers.js:325:      if (searchSchema[filterName]) {
plugins/core/lib/querying-writing/schema-helpers.js:326:        // Skip - explicit searchSchema takes precedence
plugins/core/lib/querying-writing/schema-helpers.js:330:      searchSchema[filterName] = filterDef
plugins/core/lib/querying-writing/schema-helpers.js:334:  return Object.keys(searchSchema).length > 0 ? searchSchema : null
plugins/core/lib/querying-writing/schema-helpers.js:375: * - Validates all dependencies exist
plugins/core/lib/querying-writing/schema-helpers.js:457: * - Schema processing for getter/setter ordering
plugins/core/lib/querying-writing/schema-helpers.js:463: * - Validates dependency graph is acyclic
plugins/core/lib/querying-writing/knex-constants.js:21:// Schema handling helpers
plugins/core/lib/querying-writing/knex-constants.js:22:export const getSchemaStructure = (schema) => schema?.structure || schema || {}
plugins/core/lib/querying-writing/knex-constants.js:23:export const getIdProperty = (schemaInfo) => schemaInfo?.idProperty || 'id'
plugins/core/lib/querying-writing/knex-json-api-transformers.js:2:import { getSchemaStructure } from './knex-constants.js'
plugins/core/lib/querying-writing/knex-json-api-transformers.js:7: * @param {Object} scope - Resource scope with schema and relationship info
plugins/core/lib/querying-writing/knex-json-api-transformers.js:52: * // With schema defining polymorphic relationship:
plugins/core/lib/querying-writing/knex-json-api-transformers.js:87: * 2. Scans schema for belongsTo field definitions
plugins/core/lib/querying-writing/knex-json-api-transformers.js:98:  // Extract schema info from scope
plugins/core/lib/querying-writing/knex-json-api-transformers.js:101:      schemaInfo: { schemaInstance, schemaRelationships: relationships, idProperty }
plugins/core/lib/querying-writing/knex-json-api-transformers.js:107:  // Get schema structure
plugins/core/lib/querying-writing/knex-json-api-transformers.js:108:  const schemaStructure = getSchemaStructure(schemaInstance)
plugins/core/lib/querying-writing/knex-json-api-transformers.js:113:  // Process regular belongsTo relationships from schema
plugins/core/lib/querying-writing/knex-json-api-transformers.js:114:  for (const [fieldName, fieldDef] of Object.entries(schemaStructure)) {
plugins/core/lib/querying-writing/scope-validations.js:2: * Scope configuration validators for relationship definitions
plugins/core/lib/querying-writing/scope-validations.js:5: * These validators run at scope registration time to ensure:
plugins/core/lib/querying-writing/scope-validations.js:13: * Validates all relationships in a scope configuration
plugins/core/lib/querying-writing/scope-validations.js:22: * validateRelationships({
plugins/core/lib/querying-writing/scope-validations.js:26: *       schema: {
plugins/core/lib/querying-writing/scope-validations.js:47: * validateRelaationships({
plugins/core/lib/querying-writing/scope-validations.js:70: * validateRelationships({
plugins/core/lib/querying-writing/scope-validations.js:91: * validateRelationships({
plugins/core/lib/querying-writing/scope-validations.js:95: *       schema: {
plugins/core/lib/querying-writing/scope-validations.js:130: * - Validates polymorphic relationship structure
plugins/core/lib/querying-writing/scope-validations.js:132: * - Validates hasMany/manyToMany foreign keys
plugins/core/lib/querying-writing/scope-validations.js:138: * 3. Validates polymorphic: types, typeField, idField
plugins/core/lib/querying-writing/scope-validations.js:139: * 4. Validates hasMany: foreignKey (unless via)
plugins/core/lib/querying-writing/scope-validations.js:140: * 5. Validates manyToMany: through, foreignKey, otherKey
plugins/core/lib/querying-writing/scope-validations.js:143:export function validateRelationships ({ context, scopes }) {
plugins/core/lib/querying-writing/scope-validations.js:149:      const validation = validatePolymorphicRelationship(relDef, scopeName, scopes)
plugins/core/lib/querying-writing/scope-validations.js:157:    // Validate based on relationship type
plugins/core/lib/querying-writing/scope-validations.js:159:      const validation = validateHasManyRelationship(relDef, relName, scopeName)
plugins/core/lib/querying-writing/scope-validations.js:168:      const validation = validateHasOneRelationship(relDef, relName, scopeName)
plugins/core/lib/querying-writing/scope-validations.js:177:      const validation = validateManyToManyRelationship(relDef, relName, scopeName)
plugins/core/lib/querying-writing/scope-validations.js:188: * Validates a polymorphic relationship definition
plugins/core/lib/querying-writing/scope-validations.js:204: * validatePolymorphicRelationship(relDef, 'comments', scopes);
plugins/core/lib/querying-writing/scope-validations.js:216: * validatePolymorphicRelationship(relDef, 'comments', scopes);
plugins/core/lib/querying-writing/scope-validations.js:231: * validatePolymorphicRelationship(relDef, 'attachments', scopes);
plugins/core/lib/querying-writing/scope-validations.js:239:const validatePolymorphicRelationship = (relDef, scopeName, scopes) => {
plugins/core/lib/querying-writing/scope-validations.js:242:  // 2. Validate required properties: types, typeField, idField
plugins/core/lib/querying-writing/scope-validations.js:245:  // 5. Check that typeField and idField exist in the schema
plugins/core/lib/querying-writing/scope-validations.js:290: * Validates a hasMany relationship definition
plugins/core/lib/querying-writing/scope-validations.js:304: * validateHasManyRelationship(relDef, 'posts', 'users');
plugins/core/lib/querying-writing/scope-validations.js:314: * validateHasManyRelationship(relDef, 'posts', 'users');
plugins/core/lib/querying-writing/scope-validations.js:327: * validateHasManyRelationship(relDef, 'comments', 'posts');
plugins/core/lib/querying-writing/scope-validations.js:332:const validateHasManyRelationship = (relDef, relName, scopeName) => {
plugins/core/lib/querying-writing/scope-validations.js:333:  // Validate target is specified
plugins/core/lib/querying-writing/scope-validations.js:365: * Validates a hasOne relationship definition
plugins/core/lib/querying-writing/scope-validations.js:379: * validateHasOneRelationship(relDef, 'profile', 'users');
plugins/core/lib/querying-writing/scope-validations.js:384:const validateHasOneRelationship = (relDef, relName, scopeName) => {
plugins/core/lib/querying-writing/scope-validations.js:385:  // Validate target is specified
plugins/core/lib/querying-writing/scope-validations.js:411: * Validates a manyToMany relationship definition
plugins/core/lib/querying-writing/scope-validations.js:426: * validateManyToManyRelationship(relDef, 'tags', 'articles');
plugins/core/lib/querying-writing/scope-validations.js:437: * validateManyToManyRelationship(relDef, 'tags', 'articles');
plugins/core/lib/querying-writing/scope-validations.js:445:const validateManyToManyRelationship = (relDef, relName, scopeName) => {
plugins/core/lib/querying-writing/compile-schemas.js:1:import { createSchema } from 'json-rest-schema'
plugins/core/lib/querying-writing/compile-schemas.js:2:import { ensureSearchFieldsAreIndexed, generateSearchSchemaFromSchema, sortFieldsByDependencies } from './schema-helpers.js'
plugins/core/lib/querying-writing/compile-schemas.js:5: * Compiles and enriches schemas for a resource scope
plugins/core/lib/querying-writing/compile-schemas.js:7: * @param {Object} scope - Scope containing raw schema options
plugins/core/lib/querying-writing/compile-schemas.js:12: * // Input: Raw schema with computed field
plugins/core/lib/querying-writing/compile-schemas.js:24: * await compileSchemas(scope, deps);
plugins/core/lib/querying-writing/compile-schemas.js:26: * // Output in scope.vars.schemaInfo:
plugins/core/lib/querying-writing/compile-schemas.js:28: * //   schema: Schema {},           // json-rest-schema instance
plugins/core/lib/querying-writing/compile-schemas.js:29: * //   schemaStructure: {
plugins/core/lib/querying-writing/compile-schemas.js:41: * // Input: Schema with search fields
plugins/core/lib/querying-writing/compile-schemas.js:48: * // Output: Auto-generated searchSchema
plugins/core/lib/querying-writing/compile-schemas.js:49: * // searchSchemaObject contains:
plugins/core/lib/querying-writing/compile-schemas.js:60: * const pivotSchema = {
plugins/core/lib/querying-writing/compile-schemas.js:67: * // schemaStructure will have:
plugins/core/lib/querying-writing/compile-schemas.js:76: * // Input: Schema with dependent getters
plugins/core/lib/querying-writing/compile-schemas.js:77: * const schema = {
plugins/core/lib/querying-writing/compile-schemas.js:108: * - Generates search schemas from field markers
plugins/core/lib/querying-writing/compile-schemas.js:109: * - Validates getter/setter dependencies
plugins/core/lib/querying-writing/compile-schemas.js:110: * - Provides hooks for schema enrichment
plugins/core/lib/querying-writing/compile-schemas.js:117: * 4. Runs schema:enrich hook for plugins
plugins/core/lib/querying-writing/compile-schemas.js:118: * 5. Creates json-rest-schema validation instance
plugins/core/lib/querying-writing/compile-schemas.js:119: * 6. Generates searchSchema from search:true fields
plugins/core/lib/querying-writing/compile-schemas.js:120: * 7. Runs searchSchema:enrich hook
plugins/core/lib/querying-writing/compile-schemas.js:122: * 9. Caches all results in scope.vars.schemaInfo
plugins/core/lib/querying-writing/compile-schemas.js:124:export async function compileSchemas (scope, deps) {
plugins/core/lib/querying-writing/compile-schemas.js:129:  // Get raw schema
plugins/core/lib/querying-writing/compile-schemas.js:130:  const rawFields = scope.scopeOptions?.schema || {}
plugins/core/lib/querying-writing/compile-schemas.js:132:  // Extract computed fields from schema and build enriched schema
plugins/core/lib/querying-writing/compile-schemas.js:141:      // Validate computed field
plugins/core/lib/querying-writing/compile-schemas.js:150:      // Don't include computed fields in the validation schema
plugins/core/lib/querying-writing/compile-schemas.js:183:  // Hook: schema:enrich
plugins/core/lib/querying-writing/compile-schemas.js:184:  const schemaContext = {
plugins/core/lib/querying-writing/compile-schemas.js:190:  await runHooks('schema:enrich', schemaContext)
plugins/core/lib/querying-writing/compile-schemas.js:192:  // Create schema object
plugins/core/lib/querying-writing/compile-schemas.js:193:  const schemaObject = createSchema(schemaContext.fields)
plugins/core/lib/querying-writing/compile-schemas.js:195:  // Generate searchSchema by merging explicit searchSchema with fields marked search:true.
plugins/core/lib/querying-writing/compile-schemas.js:197:  // in the main schema, or provide an explicit searchSchema with more control over filtering.
plugins/core/lib/querying-writing/compile-schemas.js:198:  // The explicit searchSchema takes precedence when there are conflicts - it can override
plugins/core/lib/querying-writing/compile-schemas.js:200:  // searchSchema will be added automatically.
plugins/core/lib/querying-writing/compile-schemas.js:202:  // while searchSchema can specify filterOperator: 'contains' or complex join configurations.
plugins/core/lib/querying-writing/compile-schemas.js:203:  const rawSearchFields = generateSearchSchemaFromSchema(
plugins/core/lib/querying-writing/compile-schemas.js:204:    schemaContext.fields,
plugins/core/lib/querying-writing/compile-schemas.js:205:    scope.scopeOptions.searchSchema
plugins/core/lib/querying-writing/compile-schemas.js:217:    // Hook: searchSchema:enrich
plugins/core/lib/querying-writing/compile-schemas.js:218:    const searchSchemaContext = {
plugins/core/lib/querying-writing/compile-schemas.js:219:      fields: schemaContext.fields,       // Mutable
plugins/core/lib/querying-writing/compile-schemas.js:220:      originalFields: rawSearchFields,    // Read-only enriched schema
plugins/core/lib/querying-writing/compile-schemas.js:223:    await runHooks('searchSchema:enrich', searchSchemaContext)
plugins/core/lib/querying-writing/compile-schemas.js:225:    // Create searchSchema object
plugins/core/lib/querying-writing/compile-schemas.js:226:    var searchSchemaObject = createSchema(rawSearchFields)
plugins/core/lib/querying-writing/compile-schemas.js:228:    var searchSchemaObject = createSchema({})
plugins/core/lib/querying-writing/compile-schemas.js:231:  // Build schemaRelationships including polymorphic fields from schema
plugins/core/lib/querying-writing/compile-schemas.js:232:  const schemaRelationships = { ...(scope.scopeOptions.relationships || {}) }
plugins/core/lib/querying-writing/compile-schemas.js:234:  // Validate belongsTo fields
plugins/core/lib/querying-writing/compile-schemas.js:235:  for (const [fieldName, fieldDef] of Object.entries(schemaContext.fields)) {
plugins/core/lib/querying-writing/compile-schemas.js:236:    // Validate that belongsTo fields have 'as' property
plugins/core/lib/querying-writing/compile-schemas.js:240:        'The \'as\' property defines the relationship name used in JSON:API payloads. ' +
plugins/core/lib/querying-writing/compile-schemas.js:246:  // Extract and validate getter definitions
plugins/core/lib/querying-writing/compile-schemas.js:250:  for (const [fieldName, fieldDef] of Object.entries(schemaContext.fields)) {
plugins/core/lib/querying-writing/compile-schemas.js:259:      // Validate dependencies exist
plugins/core/lib/querying-writing/compile-schemas.js:262:          if (!schemaContext.fields[dep]) {
plugins/core/lib/querying-writing/compile-schemas.js:264:              `Field '${fieldName}' in resource '${scopeName}' has getter dependency '${dep}' that does not exist in schema`
plugins/core/lib/querying-writing/compile-schemas.js:282:  // Extract and validate setter definitions
plugins/core/lib/querying-writing/compile-schemas.js:286:  for (const [fieldName, fieldDef] of Object.entries(schemaContext.fields)) {
plugins/core/lib/querying-writing/compile-schemas.js:295:      // Validate dependencies exist
plugins/core/lib/querying-writing/compile-schemas.js:298:          if (!schemaContext.fields[dep]) {
plugins/core/lib/querying-writing/compile-schemas.js:300:              `Field '${fieldName}' in resource '${scopeName}' has setter dependency '${dep}' that does not exist in schema`
plugins/core/lib/querying-writing/compile-schemas.js:319:  scope.vars.schemaInfo = {
plugins/core/lib/querying-writing/compile-schemas.js:321:    schemaInstance: schemaObject,
plugins/core/lib/querying-writing/compile-schemas.js:322:    schemaStructure: schemaObject.structure,
plugins/core/lib/querying-writing/compile-schemas.js:324:    searchSchemaInstance: searchSchemaObject,
plugins/core/lib/querying-writing/compile-schemas.js:325:    searchSchemaStructure: searchSchemaObject.structure,
plugins/core/lib/querying-writing/compile-schemas.js:328:    schemaRelationships,
plugins/core/lib/querying-writing/simplified-helpers.js:22: * @param {Object} deps.context.schemaStructure - Schema with field definitions
plugins/core/lib/querying-writing/simplified-helpers.js:23: * @param {Object} deps.context.schemaRelationships - Relationship configurations
plugins/core/lib/querying-writing/simplified-helpers.js:35: *   { context: { scopeName: 'articles', schemaStructure: schema } }
plugins/core/lib/querying-writing/simplified-helpers.js:52: * const schema = {
plugins/core/lib/querying-writing/simplified-helpers.js:204: * 3. Processes belongsTo relationships from schema
plugins/core/lib/querying-writing/simplified-helpers.js:214:  const schema = deps.context.schemaStructure
plugins/core/lib/querying-writing/simplified-helpers.js:215:  const relationships = deps.context.schemaRelationships
plugins/core/lib/querying-writing/simplified-helpers.js:229:  // 1. Process belongsTo relationships (from schema fields)
plugins/core/lib/querying-writing/simplified-helpers.js:230:  // Iterate through the schema structure to find belongsTo fields
plugins/core/lib/querying-writing/simplified-helpers.js:231:  for (const [fieldName, fieldDef] of Object.entries(schema)) {
plugins/core/lib/querying-writing/simplified-helpers.js:291:      // (though typically they are defined in schema.belongsTo)
plugins/core/lib/querying-writing/simplified-helpers.js:341: * @param {Object} deps.context.schemaStructure - Schema for mapping relationships
plugins/core/lib/querying-writing/simplified-helpers.js:342: * @param {Object} deps.context.schemaRelationships - Relationship configurations
plugins/core/lib/querying-writing/simplified-helpers.js:360: *   { context: { schemaStructure: schema } }
plugins/core/lib/querying-writing/simplified-helpers.js:372: * const schema = {
plugins/core/lib/querying-writing/simplified-helpers.js:500:  const schema = deps.context.schemaStructure
plugins/core/lib/querying-writing/simplified-helpers.js:501:  const relationships = deps.context.schemaRelationships
plugins/core/lib/querying-writing/simplified-helpers.js:511:        { context: { schemaStructure: schema, schemaRelationships: relationships, scopes } }
plugins/core/lib/querying-writing/simplified-helpers.js:534:    { context: { schemaStructure: schema, schemaRelationships: relationships, scopes } }
plugins/core/lib/querying-writing/simplified-helpers.js:545: * @param {Object} deps.context.schemaStructure - Resource schema
plugins/core/lib/querying-writing/simplified-helpers.js:546: * @param {Object} deps.context.schemaRelationships - Relationship configs
plugins/core/lib/querying-writing/simplified-helpers.js:568: * const schema = {
plugins/core/lib/querying-writing/simplified-helpers.js:576: *   { context: { schemaStructure: schema } }
plugins/core/lib/querying-writing/simplified-helpers.js:762:  const schema = deps.context.schemaStructure
plugins/core/lib/querying-writing/simplified-helpers.js:763:  const relationships = deps.context.schemaRelationships
plugins/core/lib/querying-writing/simplified-helpers.js:779:      // Find schema field for this belongsTo relationship
plugins/core/lib/querying-writing/simplified-helpers.js:780:      const schemaEntry = Object.entries(schema).find(([_, def]) => def.as === relName)
plugins/core/lib/querying-writing/simplified-helpers.js:782:      if (schemaEntry) {
plugins/core/lib/querying-writing/simplified-helpers.js:783:        const [fieldName, fieldDef] = schemaEntry
plugins/core/lib/querying-writing/simplified-helpers.js:818:                    schemaStructure: scopes?.[item.type]?.vars?.schemaInfo?.schema || {},
plugins/core/lib/querying-writing/simplified-helpers.js:819:                    schemaRelationships: scopes?.[item.type]?.vars?.schemaInfo?.schemaRelationships || {},
plugins/core/lib/querying-writing/simplified-helpers.js:839:                  schemaStructure: scopes?.[nestedData.type]?.vars?.schemaInfo?.schema || {},
plugins/core/lib/querying-writing/simplified-helpers.js:840:                  schemaRelationships: scopes?.[nestedData.type]?.vars?.schemaInfo?.schemaRelationships || {},
plugins/core/lib/querying-writing/database-capabilities.js:2: * Parses database version string to comparable format
plugins/core/lib/querying-writing/database-capabilities.js:5: * @returns {Object|null} Parsed version with major, minor, patch
plugins/core/lib/querying-writing/database-capabilities.js:9: * parseVersion("8.0.33");
plugins/core/lib/querying-writing/database-capabilities.js:14: * parseVersion("14.5 (Ubuntu 14.5-1.pgdg20.04+1)");
plugins/core/lib/querying-writing/database-capabilities.js:19: * parseVersion("10.6.12-MariaDB");
plugins/core/lib/querying-writing/database-capabilities.js:22:const parseVersion = (versionString) => {
plugins/core/lib/querying-writing/database-capabilities.js:32:    major: parseInt(match[1]),
plugins/core/lib/querying-writing/database-capabilities.js:33:    minor: parseInt(match[2]),
plugins/core/lib/querying-writing/database-capabilities.js:34:    patch: match[3] ? parseInt(match[3]) : 0
plugins/core/lib/querying-writing/database-capabilities.js:66: * - buildWindowedIncludeQuery to validate before using window functions
plugins/core/lib/querying-writing/database-capabilities.js:77: * 3. Parses version and compares against known thresholds
plugins/core/lib/querying-writing/database-capabilities.js:105:          const mysqlVersion = parseVersion(row.version)
plugins/core/lib/querying-writing/database-capabilities.js:119:          const parsed = parseVersion(sqliteVersion)
plugins/core/lib/querying-writing/database-capabilities.js:120:          return parsed && (parsed.major > 3 || (parsed.major === 3 && parsed.minor >= 25))
plugins/core/lib/querying-writing/database-capabilities.js:141:              const mariaVersion = parseVersion(version)
