velocious 1.0.659 → 1.0.660

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.659",
6
+ "version": "1.0.660",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -10,7 +10,7 @@ import {frontendModelResourceClassFromDefinition, frontendModelResourceConfigura
10
10
  import {createOfflineGrantFromBootstrap, verifyOfflineGrant} from "./sync/offline-grant.js"
11
11
  import {serverChangeFeedStoreForConfiguration} from "./sync/server-change-feed.js"
12
12
  import {mutationIdempotencyKey, verifySignedMutation} from "./sync/device-identity.js"
13
- import {FrontendModelQueryError, normalizeGroup as normalizeQueryGroup, normalizeJoins as normalizeQueryJoins, normalizePluck as normalizeQueryPluck, normalizePreload as normalizeQueryPreload, normalizeSearchOperator as normalizeQuerySearchOperator, normalizeSort as normalizeQuerySort} from "./frontend-models/query.js"
13
+ import {assertFrontendModelIndexPayload, FrontendModelQueryError, normalizeGroup as normalizeQueryGroup, normalizeJoins as normalizeQueryJoins, normalizePluck as normalizeQueryPluck, normalizePreload as normalizeQueryPreload, normalizeSearchOperator as normalizeQuerySearchOperator, normalizeSort as normalizeQuerySort} from "./frontend-models/query.js"
14
14
  import {assignSafeProperty, deserializeFrontendModelTransportValue, isBackendModelInstance, serializeFrontendModelTransportValue} from "./frontend-models/transport-serialization.js"
15
15
  import {requestDetails} from "./error-reporting/request-details.js"
16
16
  import RoutesResolver from "./routes/resolver.js"
@@ -4455,14 +4455,27 @@ export default class FrontendModelController extends Controller {
4455
4455
  }
4456
4456
 
4457
4457
  try {
4458
+ let indexPayload = {}
4459
+
4460
+ if (commandType === "index") {
4461
+ try {
4462
+ indexPayload = assertFrontendModelIndexPayload(payload)
4463
+ } catch (error) {
4464
+ throwFrontendModelQueryErrorForParserError(error)
4465
+ }
4466
+ }
4467
+
4458
4468
  const requestContext = captureFrontendModelRemoteRequestContext(requestEntry?.requestContext)
4459
4469
  let responsePayload
4460
4470
 
4461
4471
  if (isBuiltInCommand) {
4472
+ const commandPayload = commandType === "index"
4473
+ ? indexPayload
4474
+ : (payload && typeof payload === "object" ? payload : {})
4462
4475
  const commandParams = mergeFrontendModelRemoteRequestContext(
4463
4476
  requestContext,
4464
4477
  {
4465
- ...(payload && typeof payload === "object" ? payload : {}),
4478
+ ...commandPayload,
4466
4479
  model
4467
4480
  }
4468
4481
  )
@@ -118,6 +118,28 @@ export class FrontendModelQueryError extends Error {
118
118
  }
119
119
  }
120
120
 
121
+ const FRONTEND_MODEL_INDEX_PAYLOAD_KEYS = new Set([
122
+ "abilities",
123
+ "count",
124
+ "distinct",
125
+ "group",
126
+ "joins",
127
+ "limit",
128
+ "offset",
129
+ "page",
130
+ "perPage",
131
+ "pluck",
132
+ "preload",
133
+ "queryData",
134
+ "ransack",
135
+ "searches",
136
+ "select",
137
+ "selectsExtra",
138
+ "sort",
139
+ "where",
140
+ "withCount"
141
+ ])
142
+
121
143
  /**
122
144
  * Builds a query descriptor error.
123
145
  * @param {string} message - Error message.
@@ -127,6 +149,27 @@ function frontendModelQueryError(message) {
127
149
  return new FrontendModelQueryError(message)
128
150
  }
129
151
 
152
+ /**
153
+ * Asserts the raw payload accepted by a shared frontend-model index command.
154
+ * @param {ReturnType<typeof JSON.parse>} payload - Raw index payload.
155
+ * @returns {Record<string, ReturnType<typeof JSON.parse>>} - Valid index payload.
156
+ */
157
+ export function assertFrontendModelIndexPayload(payload) {
158
+ if (payload == null) return {}
159
+
160
+ if (!isPlainObject(payload)) {
161
+ throw frontendModelQueryError("Expected frontend-model index payload to be a plain object")
162
+ }
163
+
164
+ for (const payloadKey of Object.keys(payload)) {
165
+ if (!FRONTEND_MODEL_INDEX_PAYLOAD_KEYS.has(payloadKey)) {
166
+ throw frontendModelQueryError(`Unknown frontend-model index payload key "${payloadKey}"`)
167
+ }
168
+ }
169
+
170
+ return payload
171
+ }
172
+
130
173
  /**
131
174
  * Runs the normalizePreload helper.
132
175
  * @param {import("../database/query/index.js").NestedPreloadRecord | string | Array<string | import("../database/query/index.js").NestedPreloadRecord> | boolean | undefined | null} preload - Preload shorthand.