@reventlessdev/reventless-spec 3.0.0-alpha.82 → 3.0.0-alpha.84

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/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 3.0.0-alpha.84 (2026-07-29)
7
+
8
+ ### Features
9
+
10
+ * **plugin:** why a read model is named by that field ([699ef8e](https://github.com/ReventlessDev/reventless-core/commit/699ef8e72f1b1d82fb04672739e5e4a8db61ae9a))
11
+
12
+
13
+ # 3.0.0-alpha.83 (2026-07-28)
14
+
15
+ ### Features
16
+
17
+ * **platform:** provision object stores from the fields that declare them ([b5e2a1e](https://github.com/ReventlessDev/reventless-core/commit/b5e2a1ec88099941c113e4963f9c4b346b96b0d6))
18
+
19
+
6
20
  # 3.0.0-alpha.82 (2026-07-28)
7
21
 
8
22
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-spec",
3
- "version": "3.0.0-alpha.82",
3
+ "version": "3.0.0-alpha.84",
4
4
  "description": "Specifications for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {
@@ -218,6 +218,26 @@ type queryableDef = {
218
218
  */
219
219
  searchableFields: array<string>,
220
220
  /**
221
+ Which rung of the `labelField` ladder produced it, so a consumer with a name
222
+ rule of its own can tell a declaration from a guess before ranking the two:
223
+
224
+ - `"annotation"` — a `@displayName` spec. The author said which field names the
225
+ record; nothing a client infers locally outranks it.
226
+ - `"convention"` — a field literally named `name`/`title`/`label`/`displayName`.
227
+ A guess, and the one guess a client can independently arrive at.
228
+ - `"position"` — the first candidate in declaration order. A guess, and a fact
229
+ only this side knows; a client's own conventional-name rule is the better
230
+ answer where the two differ.
231
+ - `"fallback"` — no candidate at all, so `labelField` is `"id"`. The state
232
+ saying it has no human-readable field.
233
+
234
+ `None` means not stated — defs persisted before this field existed, and
235
+ hand-rolled defs that decline to say. Distinct from `Some("fallback")`, which
236
+ is this side stating that it looked. js_nullable for the same JSON-safety
237
+ reason as `statusField`.
238
+ */
239
+ labelFieldSource: @s.matches(stringOptionSchema) option<string>,
240
+ /**
221
241
  Name of the state field whose value identifies the row's lifecycle status, used
222
242
  by AutoUI together with `commandDef.allowedStates` to filter the per-row command
223
243
  menu. Resolution order (codegen): (1) field annotated `@status`; (2) a field
@@ -374,6 +394,21 @@ type pluginStructure = {
374
394
  // read as []). js_nullable keeps it JSON-safe inside union variant payloads.
375
395
  extensionPoints: @s.matches(extensionPointDefArrayOptionSchema)
376
396
  option<array<extensionPointDef>>,
397
+ /**
398
+ The object stores this plugin's fields declare they need, deduplicated and
399
+ fully qualified as `{plugin}.{store}`.
400
+
401
+ A field typed as a storage ref states a *requirement*: the deployment needs
402
+ that store to exist. Collecting the requirement here is what lets it be read
403
+ without re-walking every component's schema — the same reason
404
+ `producedEventTypes` is carried rather than recomputed.
405
+
406
+ Qualified even for the common same-plugin case, so one entry has one shape
407
+ and the string is directly the store's identity. Optional and js_nullable for
408
+ the same reason as `extensionPoints`: definitions persisted before this field
409
+ existed still decode (absent → None, read as []).
410
+ */
411
+ requiredStores: @s.matches(stringArrayOptionSchema) option<array<string>>,
377
412
  }
378
413
 
379
414
  let pluginStructureOptionSchema = _jsNullable(pluginStructureSchema, ())
@@ -114,6 +114,7 @@ let queryableDefSchema = S.schema(s => ({
114
114
  linkedWriteSide: s.m(S.array(S.string)),
115
115
  labelField: s.m(S.string),
116
116
  searchableFields: s.m(S.array(S.string)),
117
+ labelFieldSource: s.m(stringOptionSchema),
117
118
  statusField: s.m(stringOptionSchema),
118
119
  visibility: s.m(stringOptionSchema),
119
120
  chapter: s.m(stringOptionSchema)
@@ -186,7 +187,8 @@ let pluginStructureSchema = S.schema(s => ({
186
187
  outboundTranslationSlices: s.m(S.array(outboundTranslationSliceDefSchema)),
187
188
  inboundTranslationSlices: s.m(S.array(inboundTranslationSliceDefSchema)),
188
189
  extensions: s.m(S.array(extensionDefSchema)),
189
- extensionPoints: s.m(extensionPointDefArrayOptionSchema)
190
+ extensionPoints: s.m(extensionPointDefArrayOptionSchema),
191
+ requiredStores: s.m(stringArrayOptionSchema)
190
192
  }));
191
193
 
192
194
  let pluginStructureOptionSchema = SuryResMjs.js_nullable(pluginStructureSchema);