@reventlessdev/reventless-core 3.0.0-alpha.238 → 3.0.0-alpha.240

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 (178) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/package.json +12 -12
  3. package/src/Message.res +11 -11
  4. package/src/Message.res.mjs +15 -14
  5. package/src/Projection.res +2 -2
  6. package/src/Projection.res.mjs +5 -4
  7. package/src/adapter/Monitoring/Monitoring.res +24 -2
  8. package/src/adapter/Monitoring/Monitoring.res.mjs +3 -3
  9. package/src/admin/Platform_AdminApi.res.mjs +3 -3
  10. package/src/admin/Platform_Admin_Structure.res +33 -112
  11. package/src/admin/Platform_Admin_Structure.res.mjs +8 -138
  12. package/src/admin/Platform_ComponentDefinitionsApi.res +2 -1
  13. package/src/admin/Platform_ComponentDefinitionsApi.res.mjs +5 -1
  14. package/src/admin/UiFragmentRegistry/StateChangeSlice/UiFragmentRegistry.res.mjs +12 -12
  15. package/src/admin/UiFragmentRegistry/StateViewSlice/UiFragments.res.mjs +14 -14
  16. package/src/components/Aggregate/Aggregate_Callback.res +2 -2
  17. package/src/components/Aggregate/Aggregate_Callback.res.mjs +4 -4
  18. package/src/components/Api/ApiAllowedStatesHelpers.res.mjs +3 -3
  19. package/src/components/Api/ApiNoApiHelpers.res.mjs +5 -5
  20. package/src/components/Api/ApiTargetStateHelpers.res.mjs +3 -3
  21. package/src/components/Api/GraphQL_FragmentGenerator.res +140 -24
  22. package/src/components/Api/GraphQL_FragmentGenerator.res.mjs +48 -21
  23. package/src/components/Api/GraphQL_SchemaInspector.res +1 -1
  24. package/src/components/Api/GraphQL_SchemaInspector.res.mjs +1 -1
  25. package/src/components/Api/MCP_SchemaGenerator.res +1 -1
  26. package/src/components/Api/MCP_SchemaGenerator.res.mjs +1 -1
  27. package/src/components/Api/SchemaType.res +6 -10
  28. package/src/components/Api/SchemaType.res.mjs +4 -4
  29. package/src/components/Api/StorageRefFields.res +1 -1
  30. package/src/components/Api/StorageRefFields.res.mjs +1 -1
  31. package/src/components/Api/SuryToJsonSchema.res +19 -0
  32. package/src/components/Api/SuryToJsonSchema.res.mjs +10 -5
  33. package/src/components/AutomationSlice/AutomationSlice_Callback.res +3 -4
  34. package/src/components/AutomationSlice/AutomationSlice_Callback.res.mjs +22 -23
  35. package/src/components/CommandTopic/CommandTopic_Callback.res +1 -2
  36. package/src/components/CommandTopic/CommandTopic_Callback.res.mjs +3 -4
  37. package/src/components/CommandTopic/CommandTopic_Helpers.res +1 -1
  38. package/src/components/CommandTopic/CommandTopic_Helpers.res.mjs +3 -3
  39. package/src/components/Counter/Counter.res.mjs +2 -2
  40. package/src/components/Counter/Counter_Callback.res.mjs +4 -4
  41. package/src/components/Counter/Counter_Operations.res.mjs +4 -4
  42. package/src/components/Dcb/Dcb_Builder.res +1 -1
  43. package/src/components/Dcb/Dcb_Builder.res.mjs +8 -6
  44. package/src/components/DcbEventLog/DcbEventLog_Builder.res.mjs +4 -3
  45. package/src/components/EventCollector/EventCollector_Builder.res +1 -1
  46. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res +1 -2
  47. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Callback.res.mjs +11 -12
  48. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Callback.res +3 -4
  49. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Callback.res.mjs +24 -25
  50. package/src/components/SideEffectHandler/SideEffectHandler_Callback.res +1 -1
  51. package/src/components/SideEffectHandler/SideEffectHandler_Callback.res.mjs +3 -3
  52. package/src/components/StateChangeSlice/StateChangeSlice_Callback.res +2 -2
  53. package/src/components/StateChangeSlice/StateChangeSlice_Callback.res.mjs +4 -4
  54. package/src/components/StateViewSlice/StateViewSlice_Builder.res +1 -1
  55. package/src/components/StateViewSlice/StateViewSlice_Builder.res.mjs +3 -3
  56. package/src/plugin/api/PluginBaseFragment.res +12 -29
  57. package/src/plugin/api/PluginBaseFragment.res.mjs +3 -22
  58. package/src/plugin/component/Capability_Inference.res +118 -1
  59. package/src/plugin/component/Capability_Inference.res.mjs +128 -1
  60. package/src/plugin/component/Plugin_Builder.res +9 -2
  61. package/src/plugin/component/Plugin_Builder.res.mjs +5 -2
  62. package/src/plugin/component/Plugin_Helpers.res +11 -11
  63. package/src/plugin/component/Plugin_Helpers.res.mjs +11 -10
  64. package/src/plugin/component/Plugin_Structure.res +458 -296
  65. package/src/plugin/component/Plugin_Structure.res.mjs +259 -182
  66. package/src/plugin/component/Plugin_SubscriptionSchema.res +1 -1
  67. package/src/plugin/component/Plugin_SubscriptionSchema.res.mjs +1 -1
  68. package/src/plugin/component/SchemaWalker.res +11 -11
  69. package/src/plugin/component/SchemaWalker.res.mjs +8 -9
  70. package/src/plugin/connect/PluginExtensionPoint_Plugin.res.mjs +15 -15
  71. package/src/plugin/lifecycle/PluginBehavior.res.mjs +55 -55
  72. package/src/plugin/lifecycle/PluginSpec.res +22 -7
  73. package/src/plugin/lifecycle/PluginSpec.res.mjs +91 -36
  74. package/src/plugin/lifecycle/PluginsReadModelSpec.res +36 -9
  75. package/src/plugin/lifecycle/PluginsReadModelSpec.res.mjs +33 -22
  76. package/src/util/Interstack.res +3 -3
  77. package/src/util/LogFormat.res +1 -2
  78. package/src/util/LogFormat.res.mjs +2 -2
  79. package/tests/IdentityTest.res +6 -7
  80. package/tests/IdentityTest.res.mjs +7 -9
  81. package/tests/adapter/MonitoringTest.res +30 -3
  82. package/tests/adapter/MonitoringTest.res.mjs +31 -12
  83. package/tests/adapter/RuntimeExtensionHookReachTest.res +0 -1
  84. package/tests/adapter/RuntimeExtensionHookReachTest.res.mjs +5 -7
  85. package/tests/admin/Platform_Admin_StructureTest.res +254 -0
  86. package/tests/admin/Platform_Admin_StructureTest.res.mjs +219 -0
  87. package/tests/admin/Platform_BakedManifestTest.res +1 -0
  88. package/tests/admin/Platform_BakedManifestTest.res.mjs +1 -0
  89. package/tests/admin/Platform_ComponentDefinitionsApiTest.res +3 -0
  90. package/tests/admin/Platform_ComponentDefinitionsApiTest.res.mjs +6 -0
  91. package/tests/admin/Platform_PluginStructuresApiTest.res +1 -0
  92. package/tests/admin/Platform_PluginStructuresApiTest.res.mjs +2 -0
  93. package/tests/aggregate/AggregateCacheTest.res +0 -1
  94. package/tests/aggregate/AggregateCacheTest.res.mjs +13 -15
  95. package/tests/aggregate/AggregateConflictTest.res +0 -1
  96. package/tests/aggregate/AggregateConflictTest.res.mjs +7 -9
  97. package/tests/aggregate/AggregateFixtures.res +0 -1
  98. package/tests/aggregate/AggregateFixtures.res.mjs +19 -21
  99. package/tests/aggregate/AggregateSnapshotTest.res +1 -2
  100. package/tests/aggregate/AggregateSnapshotTest.res.mjs +15 -16
  101. package/tests/api/ApiNoApiTest.res.mjs +17 -9
  102. package/tests/api/GraphQL_FragmentGeneratorTest.res +232 -0
  103. package/tests/api/GraphQL_FragmentGeneratorTest.res.mjs +207 -55
  104. package/tests/api/PsInternalFieldsReadModel.res +21 -0
  105. package/tests/api/PsInternalFieldsReadModel.res.mjs +74 -0
  106. package/tests/api/StorageRefFieldsTest.res.mjs +13 -13
  107. package/tests/api/SuryToJsonSchemaTest.res +73 -3
  108. package/tests/api/SuryToJsonSchemaTest.res.mjs +364 -816
  109. package/tests/commandgenerator/CommandGeneratorFixtures.res +0 -1
  110. package/tests/commandgenerator/CommandGeneratorFixtures.res.mjs +19 -21
  111. package/tests/commandgenerator/OwnerStampingTest.res +0 -1
  112. package/tests/commandgenerator/OwnerStampingTest.res.mjs +9 -11
  113. package/tests/commandtopic/CommandTopicCallbackFixtures.res +0 -1
  114. package/tests/commandtopic/CommandTopicCallbackFixtures.res.mjs +7 -9
  115. package/tests/counter/CounterFixtures.res +0 -1
  116. package/tests/counter/CounterFixtures.res.mjs +1 -4
  117. package/tests/dcb/DcbDecodeTest.res.mjs +24 -24
  118. package/tests/dcb/DcbEventLogOperationsTest.res +2 -2
  119. package/tests/dcb/DcbEventLogOperationsTest.res.mjs +3 -3
  120. package/tests/dcb/DcbEventLogSchemaTest.res.mjs +7 -7
  121. package/tests/dcb/DcbFixtures.res +0 -1
  122. package/tests/dcb/DcbFixtures.res.mjs +87 -89
  123. package/tests/dcb/DcbTagTest.res.mjs +6 -6
  124. package/tests/dcb/DcbValidationTest.res.mjs +52 -52
  125. package/tests/eventlog/EventLogFixtures.res +0 -1
  126. package/tests/eventlog/EventLogFixtures.res.mjs +7 -9
  127. package/tests/eventmapper/EventMapperFixtures.res +0 -1
  128. package/tests/eventmapper/EventMapperFixtures.res.mjs +24 -26
  129. package/tests/eventtopic/EventTopicFixtures.res +0 -1
  130. package/tests/eventtopic/EventTopicFixtures.res.mjs +7 -9
  131. package/tests/extensionpoint/ExtensionPointFixtures.res +0 -1
  132. package/tests/extensionpoint/ExtensionPointFixtures.res.mjs +10 -12
  133. package/tests/extensionpoint/ExtensionPointOperationsTest.res +1 -2
  134. package/tests/extensionpoint/ExtensionPointOperationsTest.res.mjs +9 -10
  135. package/tests/logger/LogFormatTest.res +3 -2
  136. package/tests/logger/LogFormatTest.res.mjs +7 -9
  137. package/tests/message/MessageTest.res +2 -2
  138. package/tests/message/MessageTest.res.mjs +8 -7
  139. package/tests/message/MetaEnvelopeTest.res +5 -5
  140. package/tests/message/MetaEnvelopeTest.res.mjs +12 -11
  141. package/tests/plugin/ManifestVisibilityTest.res.mjs +7 -7
  142. package/tests/plugin/PluginDefinitionScalars.res +5 -3
  143. package/tests/plugin/PluginDefinitionScalars.res.mjs +2 -2
  144. package/tests/plugin/PluginLifecycleCorpusTest.res +4 -3
  145. package/tests/plugin/PluginLifecycleCorpusTest.res.mjs +3 -6
  146. package/tests/plugin/PluginSpecExperiment.res +0 -1
  147. package/tests/plugin/PluginSpecExperiment.res.mjs +12 -14
  148. package/tests/plugin/PluginStructureTest.res +292 -2
  149. package/tests/plugin/PluginStructureTest.res.mjs +391 -88
  150. package/tests/plugin/Plugin_EventQuerySchemaTest.res.mjs +3 -3
  151. package/tests/plugin/SchemaWalkerTest.res +0 -1
  152. package/tests/plugin/SchemaWalkerTest.res.mjs +17 -19
  153. package/tests/plugin/StateChangeSlice/PsAttachInvoice.res.mjs +5 -5
  154. package/tests/plugin/StateChangeSlice/PsChangePhoto.res.mjs +8 -8
  155. package/tests/plugin/StateChangeSlice/PsDispatchShipment.res.mjs +5 -5
  156. package/tests/plugin/StateChangeSlice/PsGatedCommands.res.mjs +9 -9
  157. package/tests/plugin/StateChangeSlice/PsPlaceOrder.res.mjs +5 -5
  158. package/tests/plugin/StateChangeSlice/PsReserveStock.res.mjs +8 -8
  159. package/tests/plugin/StateChangeSlice/PsShipOrder.res.mjs +15 -15
  160. package/tests/plugin/StateChangeSlice/PsTypoStore.res +31 -0
  161. package/tests/plugin/StateChangeSlice/PsTypoStore.res.mjs +62 -0
  162. package/tests/plugin/StateChangeSlice/PsUploadAvatar.res.mjs +8 -8
  163. package/tests/plugin/StateChangeSlice/PsUploadImages.res +40 -0
  164. package/tests/plugin/StateChangeSlice/PsUploadImages.res.mjs +66 -0
  165. package/tests/plugin/StateViewSlice/PsAnnotatedView.res.mjs +13 -12
  166. package/tests/plugin/StateViewSlice/PsAvailableProductsView.res.mjs +8 -8
  167. package/tests/plugin/StateViewSlice/PsCategoriesView.res.mjs +6 -6
  168. package/tests/plugin/StateViewSlice/PsCustomersView.res.mjs +10 -10
  169. package/tests/plugin/StateViewSlice/PsGatedView.res.mjs +6 -6
  170. package/tests/plugin/StateViewSlice/PsOrdersView.res.mjs +9 -9
  171. package/tests/plugin/StateViewSlice/PsShipmentsView.res.mjs +11 -10
  172. package/tests/plugin/pluginDefinitionRequiredScalars.txt +15 -0
  173. package/tests/querydb/QueryDbFixtures.res +0 -1
  174. package/tests/querydb/QueryDbFixtures.res.mjs +5 -7
  175. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res +0 -1
  176. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res.mjs +4 -6
  177. package/tests/util/CommandPublisherTest.res +0 -1
  178. package/tests/util/CommandPublisherTest.res.mjs +4 -6
@@ -65,9 +65,7 @@ let conventionalLabelNames = [
65
65
  "displayname"
66
66
  ];
67
67
 
68
- function shapeOfItem(entityName, item) {
69
- return SchemaType$ReventlessCore.fromSury(entityName, item.location, item.schema);
70
- }
68
+ let shapeOfField = SchemaType$ReventlessCore.fromSury;
71
69
 
72
70
  function lifecycleFieldFromStateSchema(entityName, stateSchema) {
73
71
  let spec = StateAnnotations$Reventless.getSpec(stateSchema);
@@ -75,13 +73,11 @@ function lifecycleFieldFromStateSchema(entityName, stateSchema) {
75
73
  if (annotated !== undefined) {
76
74
  return annotated;
77
75
  } else if (stateSchema.type === "object") {
78
- return Stdlib_Option.map(stateSchema.items.find(item => {
79
- if (item.location === "lifecycle") {
80
- return isLifecycleShape(shapeOfItem(entityName, item));
81
- } else {
82
- return false;
76
+ return Stdlib_Option.flatMap(stateSchema.properties["lifecycle"], schema => {
77
+ if (isLifecycleShape(SchemaType$ReventlessCore.fromSury(entityName, "lifecycle", schema))) {
78
+ return "lifecycle";
83
79
  }
84
- }), item => item.location);
80
+ });
85
81
  } else {
86
82
  return;
87
83
  }
@@ -102,14 +98,18 @@ function retiredValuesFromStateSchema(stateSchema) {
102
98
  return Stdlib_Option.flatMap(retiredFromStateSchema(stateSchema), r => r.values);
103
99
  }
104
100
 
101
+ function namedWhenRetiredFromStateSchema(stateSchema) {
102
+ return Stdlib_Option.mapOr(retiredFromStateSchema(stateSchema), false, r => r.namedWhenRetired);
103
+ }
104
+
105
105
  function checkRetiredValue(entityName, stateSchema) {
106
106
  let match = retiredFromStateSchema(stateSchema);
107
107
  if (match === undefined) {
108
- return;
108
+ return "NotDeclared";
109
109
  }
110
110
  let values = match.values;
111
111
  if (values === undefined) {
112
- return;
112
+ return "NotDeclared";
113
113
  }
114
114
  let field = match.field;
115
115
  let named = values.join(", ");
@@ -118,8 +118,8 @@ function checkRetiredValue(entityName, stateSchema) {
118
118
  log.warn("Plugin_Structure", undefined, entityName + `: @retired(` + named + `) is on "` + field + `", which is not this record's lifecycle field` + Stdlib_Option.getOr(Stdlib_Option.map(lifecycle, f => ` (that is "` + f + `")`), " (it declares none)") + `. A retirement state no command's @transition can name loses the command filtering the state form exists for.`);
119
119
  }
120
120
  let declared;
121
- declared = stateSchema.type === "object" ? Stdlib_Option.getOr(Stdlib_Option.map(stateSchema.items.find(item => item.location === field), item => {
122
- let match = shapeOfItem(entityName, item);
121
+ declared = stateSchema.type === "object" ? Stdlib_Option.getOr(Stdlib_Option.map(stateSchema.properties[field], schema => {
122
+ let match = SchemaType$ReventlessCore.fromSury(entityName, field, schema);
123
123
  if (typeof match !== "object") {
124
124
  return [];
125
125
  }
@@ -139,17 +139,33 @@ function checkRetiredValue(entityName, stateSchema) {
139
139
  return [];
140
140
  }
141
141
  }), []) : [];
142
- if (declared.length !== 0) {
143
- values.filter(v => !declared.includes(v)).forEach(v => log.warn("Plugin_Structure", undefined, entityName + `: @retired(` + v + `) names a state "` + field + `" does not declare — known values: ` + declared.join(", ") + `.`));
144
- return;
142
+ if (declared.length === 0) {
143
+ return {
144
+ TAG: "Unchecked",
145
+ _0: entityName + `: @retired(` + named + `) is on "` + field + `", whose shape carries no cases to check the names against.`
146
+ };
147
+ } else {
148
+ return {
149
+ TAG: "Checked",
150
+ _0: values.filter(v => !declared.includes(v)).map(v => entityName + `: @retired(` + v + `) names a state "` + field + `" does not declare — known values: ` + declared.join(", ") + `.`)
151
+ };
152
+ }
153
+ }
154
+
155
+ function reportRetiredStates(pluginName, failures, unchecked) {
156
+ if (unchecked.length !== 0) {
157
+ log.warn("Plugin_Structure", undefined, pluginName + `: ` + unchecked.length.toString() + ` @retired declaration(s) could not be checked.\n` + unchecked.join("\n"));
158
+ }
159
+ if (failures.length !== 0) {
160
+ return Stdlib_JsError.throwWithMessage(pluginName + `: @retired names states that do not exist.\n` + failures.join("\n"));
145
161
  }
146
162
  }
147
163
 
148
164
  function lifecycleStatesFromStateSchema(entityName, stateSchema) {
149
165
  return Stdlib_Option.flatMap(lifecycleFieldFromStateSchema(entityName, stateSchema), field => {
150
166
  if (stateSchema.type === "object") {
151
- return Stdlib_Option.map(stateSchema.items.find(item => item.location === field), item => {
152
- let match = shapeOfItem(entityName, item);
167
+ return Stdlib_Option.map(stateSchema.properties[field], schema => {
168
+ let match = SchemaType$ReventlessCore.fromSury(entityName, field, schema);
153
169
  if (typeof match !== "object") {
154
170
  return [];
155
171
  }
@@ -215,29 +231,17 @@ function lifecycleTopologyFindings(writables, lifecycleStatesByView) {
215
231
  Object.entries(lifecycleStatesByView).forEach(param => {
216
232
  let states = param[1];
217
233
  let view = param[0];
218
- let edges = Stdlib_Array.reduce(writables, [], (acc, w) => {
234
+ let reachable = Stdlib_Array.reduce(writables, [], (acc, w) => {
219
235
  if (w.linkedViews.includes(view)) {
220
- return acc.concat(Stdlib_Array.reduce(w.commands, [], (inner, cmd) => {
221
- let match = cmd.allowedStates;
222
- let match$1 = cmd.targetState;
223
- if (match !== undefined && match$1 !== undefined) {
224
- return inner.concat(match.map(from => [
225
- from,
226
- match$1
227
- ]));
228
- } else {
229
- return inner;
230
- }
231
- }));
236
+ return acc.concat(Stdlib_Array.filterMap(w.commands, cmd => cmd.targetState));
232
237
  } else {
233
238
  return acc;
234
239
  }
235
240
  });
236
- if (edges.length === 0) {
241
+ if (reachable.length === 0) {
237
242
  return;
238
243
  }
239
244
  let initial = states[0];
240
- let reachable = edges.map(param => param[1]);
241
245
  states.forEach(state => {
242
246
  if (!reachable.includes(state) && Primitive_object.notequal(state, initial)) {
243
247
  findings.push([
@@ -278,29 +282,30 @@ function labelFieldsFromStateSchema(entityName, stateSchema) {
278
282
  };
279
283
  }
280
284
  let candidates;
281
- candidates = stateSchema.type === "object" ? stateSchema.items.filter(item => {
282
- if (item.location !== "TAG" && item.location !== "id") {
283
- return isLabelShape(shapeOfItem(entityName, item));
285
+ candidates = stateSchema.type === "object" ? Object.entries(stateSchema.properties).filter(param => {
286
+ let name = param[0];
287
+ if (name !== "TAG" && name !== "id") {
288
+ return isLabelShape(SchemaType$ReventlessCore.fromSury(entityName, name, param[1]));
284
289
  } else {
285
290
  return false;
286
291
  }
287
292
  }) : [];
288
- let conventional = candidates.find(item => {
289
- let lower = item.location.toLowerCase();
293
+ let conventional = candidates.find(param => {
294
+ let lower = param[0].toLowerCase();
290
295
  return conventionalLabelNames.some(n => n === lower);
291
296
  });
292
297
  let picked = conventional !== undefined ? [
293
- conventional,
298
+ conventional[0],
294
299
  "Convention"
295
- ] : Stdlib_Option.map(candidates[0], item => [
296
- item,
300
+ ] : Stdlib_Option.map(candidates[0], param => [
301
+ param[0],
297
302
  "Position"
298
303
  ]);
299
304
  if (picked !== undefined) {
300
- let item = picked[0];
305
+ let name = picked[0];
301
306
  return {
302
- field: item.location,
303
- searchableFields: [item.location],
307
+ field: name,
308
+ searchableFields: [name],
304
309
  source: picked[1]
305
310
  };
306
311
  }
@@ -357,7 +362,7 @@ function toEventDef(v) {
357
362
  }
358
363
 
359
364
  function extractEventDefs(eventSchema) {
360
- if (eventSchema.type === "union") {
365
+ if (eventSchema.type === "anyOf") {
361
366
  return Stdlib_Array.filterMap(eventSchema.anyOf, toEventDef);
362
367
  } else {
363
368
  return Stdlib_Option.mapOr(toEventDef(eventSchema), [], def => [def]);
@@ -372,19 +377,8 @@ function extractErrorDefs(errorSchema) {
372
377
  }));
373
378
  }
374
379
 
375
- function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChangeSlicesOpt, automationSlicesOpt, outboundTranslationSlicesOpt, inboundTranslationSlicesOpt, extensionsOpt, extensionPointsOpt, componentChaptersOpt) {
376
- let aggregates = aggregatesOpt !== undefined ? aggregatesOpt : [];
377
- let readModels = readModelsOpt !== undefined ? readModelsOpt : [];
378
- let stateViewSlices = stateViewSlicesOpt !== undefined ? stateViewSlicesOpt : [];
379
- let stateChangeSlices = stateChangeSlicesOpt !== undefined ? stateChangeSlicesOpt : [];
380
- let automationSlices = automationSlicesOpt !== undefined ? automationSlicesOpt : [];
381
- let outboundTranslationSlices = outboundTranslationSlicesOpt !== undefined ? outboundTranslationSlicesOpt : [];
382
- let inboundTranslationSlices = inboundTranslationSlicesOpt !== undefined ? inboundTranslationSlicesOpt : [];
383
- let extensions = extensionsOpt !== undefined ? extensionsOpt : [];
384
- let extensionPoints = extensionPointsOpt !== undefined ? extensionPointsOpt : [];
385
- let componentChapters = componentChaptersOpt !== undefined ? componentChaptersOpt : ({});
386
- let qualify = (prefix, names) => names.map(n => prefix + "." + n);
387
- let isCreateCommandName = name => [
380
+ function isCreateCommandName(name) {
381
+ return [
388
382
  "Add",
389
383
  "Create",
390
384
  "Register",
@@ -394,135 +388,193 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
394
388
  "Start",
395
389
  "Place"
396
390
  ].some(p => name.startsWith(p));
397
- let commandLevelAndId = (isAggregate, variantName, properties) => {
398
- if (isAggregate) {
399
- if (isCreateCommandName(variantName)) {
400
- return [
401
- "Collection",
402
- undefined
403
- ];
404
- } else {
405
- return [
406
- "Instance",
407
- undefined
408
- ];
409
- }
410
- }
411
- let taggedFields = Object.entries(properties).filter(param => {
412
- let fieldSchema = param[1];
413
- if (param[0] !== "TAG") {
414
- if (DcbTag$Reventless.isTagged(fieldSchema)) {
415
- return true;
416
- } else {
417
- return DcbTag$Reventless.isTaggedArray(fieldSchema);
418
- }
419
- } else {
420
- return false;
421
- }
422
- });
423
- let taggedField = Stdlib_Option.orElse(taggedFields.find(param => DcbTag$Reventless.isPartitionTag(param[1])), taggedFields[0]);
424
- if (taggedField === undefined) {
425
- return [
426
- "Collection",
427
- undefined
428
- ];
429
- }
430
- let fieldName = taggedField[0];
391
+ }
392
+
393
+ function commandLevelAndId(isAggregate, variantName, properties) {
394
+ if (isAggregate) {
431
395
  if (isCreateCommandName(variantName)) {
432
396
  return [
433
397
  "Collection",
434
- fieldName
398
+ undefined
435
399
  ];
436
400
  } else {
437
401
  return [
438
402
  "Instance",
439
- fieldName
403
+ undefined
440
404
  ];
441
405
  }
442
- };
443
- let accessKeysFor = rule => {
444
- if (typeof rule !== "object") {
445
- return;
406
+ }
407
+ let taggedFields = Object.entries(properties).filter(param => {
408
+ let fieldSchema = param[1];
409
+ if (param[0] !== "TAG") {
410
+ if (DcbTag$Reventless.isTagged(fieldSchema)) {
411
+ return true;
412
+ } else {
413
+ return DcbTag$Reventless.isTaggedArray(fieldSchema);
414
+ }
415
+ } else {
416
+ return false;
446
417
  }
447
- let groups = rule._0;
448
- if (groups.length !== 0) {
449
- return groups;
418
+ });
419
+ let taggedField = Stdlib_Option.orElse(taggedFields.find(param => DcbTag$Reventless.isPartitionTag(param[1])), taggedFields[0]);
420
+ if (taggedField === undefined) {
421
+ return [
422
+ "Collection",
423
+ undefined
424
+ ];
425
+ }
426
+ let fieldName = taggedField[0];
427
+ if (isCreateCommandName(variantName)) {
428
+ return [
429
+ "Collection",
430
+ fieldName
431
+ ];
432
+ } else {
433
+ return [
434
+ "Instance",
435
+ fieldName
436
+ ];
437
+ }
438
+ }
439
+
440
+ function accessKeysFor(rule) {
441
+ if (typeof rule !== "object") {
442
+ return;
443
+ }
444
+ let groups = rule._0;
445
+ if (groups.length !== 0) {
446
+ return groups;
447
+ }
448
+ }
449
+
450
+ function annotateArgTypes(schema, argTypes) {
451
+ Stdlib_Option.forEach(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(schema), o => o["properties"]), Stdlib_JSON.Decode.object), props => {
452
+ Object.entries(props).forEach(param => {
453
+ let match = argTypes[param[0]];
454
+ let match$1 = Stdlib_JSON.Decode.object(param[1]);
455
+ if (match !== undefined && match$1 !== undefined) {
456
+ match$1["x-reventless-graphql-type"] = match;
457
+ return;
458
+ }
459
+ });
460
+ });
461
+ return schema;
462
+ }
463
+
464
+ function toCommandDef(isAggregate, mutationFieldFor, parentSchema, commandAuthorization, v) {
465
+ let mkDef = (variantName, properties) => {
466
+ let match = commandLevelAndId(isAggregate, variantName, properties);
467
+ let references = extractReferences(properties);
468
+ let allowedStates = ApiAllowedStatesHelpers$ReventlessCore.getAllowedStates(parentSchema, variantName);
469
+ let targetState = ApiTargetStateHelpers$ReventlessCore.getTargetState(parentSchema, variantName);
470
+ let apiExposed = false;
471
+ if (!ApiNoApiHelpers$ReventlessCore.isNoApi(parentSchema)) {
472
+ let excluded = ApiNoApiHelpers$ReventlessCore.getExcludedVariants(parentSchema);
473
+ apiExposed = excluded !== undefined ? !excluded.has(variantName) : true;
450
474
  }
475
+ let syntheticCommand = DcbTag$Reventless.isVariantPayloadBearing(parentSchema, variantName) ? ({
476
+ TAG: variantName
477
+ }) : variantName;
478
+ let requiredAccess = accessKeysFor(commandAuthorization(syntheticCommand));
479
+ let mutationField = apiExposed ? mutationFieldFor(variantName) : "";
480
+ let jsonSchema = SuryToJsonSchema$ReventlessCore.deriveObjectSchema(v);
481
+ let annotatedSchema = apiExposed ? Stdlib_Option.mapOr(GraphQL_FragmentGenerator$ReventlessCore.mutationArgTypes(mutationField, v), jsonSchema, __x => annotateArgTypes(jsonSchema, __x)) : jsonSchema;
482
+ return {
483
+ name: variantName,
484
+ schema: JSON.stringify(annotatedSchema),
485
+ level: match[0],
486
+ aggregateIdField: match[1],
487
+ mutationField: mutationField,
488
+ references: references,
489
+ allowedStates: allowedStates,
490
+ targetState: targetState,
491
+ apiExposed: apiExposed,
492
+ requiredAccess: requiredAccess,
493
+ ownerField: Owner$Reventless.fieldNamesOfProperties(properties)[0]
494
+ };
451
495
  };
452
- let toCommandDef = (isAggregate, mutationFieldFor, parentSchema, commandAuthorization, v) => {
453
- let mkDef = (variantName, properties) => {
454
- let match = commandLevelAndId(isAggregate, variantName, properties);
455
- let references = extractReferences(properties);
456
- let allowedStates = ApiAllowedStatesHelpers$ReventlessCore.getAllowedStates(parentSchema, variantName);
457
- let targetState = ApiTargetStateHelpers$ReventlessCore.getTargetState(parentSchema, variantName);
458
- let apiExposed = false;
459
- if (!ApiNoApiHelpers$ReventlessCore.isNoApi(parentSchema)) {
460
- let excluded = ApiNoApiHelpers$ReventlessCore.getExcludedVariants(parentSchema);
461
- apiExposed = excluded !== undefined ? !excluded.has(variantName) : true;
496
+ switch (v.type) {
497
+ case "string" :
498
+ let variantName = v.const;
499
+ if (variantName !== undefined) {
500
+ return mkDef(variantName, {});
501
+ } else {
502
+ return;
462
503
  }
463
- let syntheticCommand = DcbTag$Reventless.isVariantPayloadBearing(parentSchema, variantName) ? ({
464
- TAG: variantName
465
- }) : variantName;
466
- let requiredAccess = accessKeysFor(commandAuthorization(syntheticCommand));
467
- let mutationField = apiExposed ? mutationFieldFor(variantName) : "";
468
- let jsonSchema = SuryToJsonSchema$ReventlessCore.deriveObjectSchema(v);
469
- let annotatedSchema = apiExposed ? Stdlib_Option.mapOr(GraphQL_FragmentGenerator$ReventlessCore.mutationArgTypes(mutationField, v), jsonSchema, __x => {
470
- Stdlib_Option.forEach(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(jsonSchema), o => o["properties"]), Stdlib_JSON.Decode.object), props => {
471
- Object.entries(props).forEach(param => {
472
- let match = __x[param[0]];
473
- let match$1 = Stdlib_JSON.Decode.object(param[1]);
474
- if (match !== undefined && match$1 !== undefined) {
475
- match$1["x-reventless-graphql-type"] = match;
476
- return;
477
- }
478
- });
479
- });
480
- return jsonSchema;
481
- }) : jsonSchema;
482
- return {
483
- name: variantName,
484
- schema: JSON.stringify(annotatedSchema),
485
- level: match[0],
486
- aggregateIdField: match[1],
487
- mutationField: mutationField,
488
- references: references,
489
- allowedStates: allowedStates,
490
- targetState: targetState,
491
- apiExposed: apiExposed,
492
- requiredAccess: requiredAccess,
493
- ownerField: Owner$Reventless.fieldNamesOfProperties(properties)[0]
494
- };
495
- };
496
- switch (v.type) {
497
- case "string" :
498
- let variantName = v.const;
499
- if (variantName !== undefined) {
500
- return mkDef(variantName, {});
501
- } else {
504
+ case "object" :
505
+ let properties = v.properties;
506
+ return Stdlib_Option.flatMap(properties["TAG"], tagSchema => {
507
+ if (tagSchema.type !== "string") {
502
508
  return;
503
509
  }
504
- case "object" :
505
- let properties = v.properties;
506
- return Stdlib_Option.flatMap(properties["TAG"], tagSchema => {
507
- if (tagSchema.type !== "string") {
508
- return;
509
- }
510
- let variantName = tagSchema.const;
511
- if (variantName !== undefined) {
512
- return mkDef(variantName, properties);
513
- }
514
- });
515
- default:
516
- return;
517
- }
518
- };
519
- let extractCommandDefs = (isAggregate, mutationFieldFor, commandAuthorization, commandSchema) => {
520
- if (commandSchema.type === "union") {
521
- return Stdlib_Array.filterMap(commandSchema.anyOf, v => toCommandDef(isAggregate, mutationFieldFor, commandSchema, commandAuthorization, v));
522
- } else {
523
- return Stdlib_Option.mapOr(toCommandDef(isAggregate, mutationFieldFor, commandSchema, commandAuthorization, commandSchema), [], def => [def]);
524
- }
510
+ let variantName = tagSchema.const;
511
+ if (variantName !== undefined) {
512
+ return mkDef(variantName, properties);
513
+ }
514
+ });
515
+ default:
516
+ return;
517
+ }
518
+ }
519
+
520
+ function extractCommandDefs(isAggregate, mutationFieldFor, commandAuthorization, commandSchema) {
521
+ if (commandSchema.type === "anyOf") {
522
+ return Stdlib_Array.filterMap(commandSchema.anyOf, v => toCommandDef(isAggregate, mutationFieldFor, commandSchema, commandAuthorization, v));
523
+ } else {
524
+ return Stdlib_Option.mapOr(toCommandDef(isAggregate, mutationFieldFor, commandSchema, commandAuthorization, commandSchema), [], def => [def]);
525
+ }
526
+ }
527
+
528
+ function visibilityTag(v) {
529
+ if (v === "Public") {
530
+ return;
531
+ } else {
532
+ return "Internal";
533
+ }
534
+ }
535
+
536
+ function queryableDefFromSpec(plugin, name, stateSchema, authorization, visibilityOpt, consumedEventTypesOpt, linkedWriteSideOpt, chapter) {
537
+ let visibility = visibilityOpt !== undefined ? visibilityOpt : "Public";
538
+ let consumedEventTypes = consumedEventTypesOpt !== undefined ? consumedEventTypesOpt : [];
539
+ let linkedWriteSide = linkedWriteSideOpt !== undefined ? linkedWriteSideOpt : [];
540
+ let qf = Api_Naming$ReventlessCore.queryFieldNamesForReadModel(plugin, name, undefined);
541
+ let label = labelFieldsFromStateSchema(name, stateSchema);
542
+ let keyField = GraphQL_FragmentGenerator$ReventlessCore.resolveKeyField(name, stateSchema);
543
+ return {
544
+ name: name,
545
+ queryField: qf.listFieldName,
546
+ schema: JSON.stringify(SuryToJsonSchema$ReventlessCore.deriveObjectSchema(stateSchema)),
547
+ consumedEventTypes: consumedEventTypes,
548
+ linkedWriteSide: linkedWriteSide,
549
+ labelField: label.field,
550
+ searchableFields: label.searchableFields,
551
+ labelFieldSource: labelFieldSourceToString(label.source),
552
+ lifecycleField: lifecycleFieldFromStateSchema(name, stateSchema),
553
+ ownerField: Owner$Reventless.fieldNames(stateSchema)[0],
554
+ retiredField: retiredFieldFromStateSchema(stateSchema),
555
+ retiredValues: retiredValuesFromStateSchema(stateSchema),
556
+ namedWhenRetired: namedWhenRetiredFromStateSchema(stateSchema),
557
+ visibility: visibilityTag(visibility),
558
+ chapter: chapter,
559
+ singleQueryField: qf.singleFieldName,
560
+ idField: Stdlib_Option.map(keyField, param => param[0]),
561
+ idFieldSource: Stdlib_Option.map(keyField, param => param[1]),
562
+ requiredAccess: accessKeysFor(authorization)
525
563
  };
564
+ }
565
+
566
+ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChangeSlicesOpt, automationSlicesOpt, outboundTranslationSlicesOpt, inboundTranslationSlicesOpt, extensionsOpt, extensionPointsOpt, componentChaptersOpt) {
567
+ let aggregates = aggregatesOpt !== undefined ? aggregatesOpt : [];
568
+ let readModels = readModelsOpt !== undefined ? readModelsOpt : [];
569
+ let stateViewSlices = stateViewSlicesOpt !== undefined ? stateViewSlicesOpt : [];
570
+ let stateChangeSlices = stateChangeSlicesOpt !== undefined ? stateChangeSlicesOpt : [];
571
+ let automationSlices = automationSlicesOpt !== undefined ? automationSlicesOpt : [];
572
+ let outboundTranslationSlices = outboundTranslationSlicesOpt !== undefined ? outboundTranslationSlicesOpt : [];
573
+ let inboundTranslationSlices = inboundTranslationSlicesOpt !== undefined ? inboundTranslationSlicesOpt : [];
574
+ let extensions = extensionsOpt !== undefined ? extensionsOpt : [];
575
+ let extensionPoints = extensionPointsOpt !== undefined ? extensionPointsOpt : [];
576
+ let componentChapters = componentChaptersOpt !== undefined ? componentChaptersOpt : ({});
577
+ let qualify = (prefix, names) => names.map(n => prefix + "." + n);
526
578
  let scsProduced = stateChangeSlices.map(SCS => [
527
579
  SCS.Spec.name,
528
580
  qualify(name, DcbTag$Reventless.extractVariantNames(SCS.Spec.eventSchema))
@@ -670,7 +722,7 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
670
722
  return [];
671
723
  }
672
724
  };
673
- if (schema.type === "union") {
725
+ if (schema.type === "anyOf") {
674
726
  return schema.anyOf.flatMap(fromVariant);
675
727
  } else {
676
728
  return fromVariant(schema);
@@ -688,16 +740,13 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
688
740
  }
689
741
  });
690
742
  let requiredStores = Belt_SetString.toArray(Belt_SetString.fromArray(requiredStoreDeclarations.map(d => d.store)));
743
+ let found = Capability_Inference$ReventlessCore.collisions(requiredStoreDeclarations);
744
+ if (found.length !== 0) {
745
+ Stdlib_JsError.throwWithMessage(name + `: two declared object stores look like one store misspelled.\n` + found.map(Capability_Inference$ReventlessCore.collisionMessage).join("\n"));
746
+ }
691
747
  storeDeclarationSites.forEach(param => {
692
748
  Capability_Inference$ReventlessCore.scanSchema(param[0], param[1]).forEach(w => log.warn("Plugin_Structure", undefined, Capability_Inference$ReventlessCore.message(w)));
693
749
  });
694
- let visibilityTag = v => {
695
- if (v === "Public") {
696
- return;
697
- } else {
698
- return "Internal";
699
- }
700
- };
701
750
  let lifecycleStatesByView = {};
702
751
  let recordLifecycle = (entityName, stateSchema) => {
703
752
  let states = lifecycleStatesFromStateSchema(entityName, stateSchema);
@@ -706,13 +755,28 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
706
755
  return;
707
756
  }
708
757
  };
758
+ let retiredFailures = [];
759
+ let retiredUnchecked = [];
760
+ let recordRetired = (entityName, stateSchema) => {
761
+ let why = checkRetiredValue(entityName, stateSchema);
762
+ if (typeof why !== "object") {
763
+ return;
764
+ }
765
+ if (why.TAG === "Unchecked") {
766
+ retiredUnchecked.push(why._0);
767
+ return;
768
+ }
769
+ why._0.forEach(f => {
770
+ retiredFailures.push(f);
771
+ });
772
+ };
709
773
  let readModelDefs = readModels.map(R => {
710
774
  let qf = Api_Naming$ReventlessCore.queryFieldNamesForReadModel(name, R.Spec.name, undefined);
711
775
  let stateSchema = R.Spec.stateSchema;
712
776
  let label = labelFieldsFromStateSchema(R.Spec.name, stateSchema);
713
777
  let keyField = GraphQL_FragmentGenerator$ReventlessCore.resolveKeyField(R.Spec.name, stateSchema);
714
778
  let consumed = qualify(name, R.consumedEventNames);
715
- checkRetiredValue(R.Spec.name, stateSchema);
779
+ recordRetired(R.Spec.name, stateSchema);
716
780
  recordLifecycle(R.Spec.name, stateSchema);
717
781
  return {
718
782
  name: R.Spec.name,
@@ -727,6 +791,7 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
727
791
  ownerField: Owner$Reventless.fieldNames(stateSchema)[0],
728
792
  retiredField: retiredFieldFromStateSchema(stateSchema),
729
793
  retiredValues: retiredValuesFromStateSchema(stateSchema),
794
+ namedWhenRetired: namedWhenRetiredFromStateSchema(stateSchema),
730
795
  visibility: visibilityTag(R.Spec.visibility),
731
796
  chapter: componentChapters[R.Spec.name],
732
797
  singleQueryField: qf.singleFieldName,
@@ -742,7 +807,7 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
742
807
  let stateSchema = SVS.Spec.stateSchema;
743
808
  let label = labelFieldsFromStateSchema(SVS.Spec.name, stateSchema);
744
809
  let keyField = GraphQL_FragmentGenerator$ReventlessCore.resolveKeyField(SVS.Spec.name, stateSchema);
745
- checkRetiredValue(SVS.Spec.name, stateSchema);
810
+ recordRetired(SVS.Spec.name, stateSchema);
746
811
  recordLifecycle(SVS.Spec.name, stateSchema);
747
812
  return {
748
813
  name: SVS.Spec.name,
@@ -757,6 +822,7 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
757
822
  ownerField: Owner$Reventless.fieldNames(stateSchema)[0],
758
823
  retiredField: retiredFieldFromStateSchema(stateSchema),
759
824
  retiredValues: retiredValuesFromStateSchema(stateSchema),
825
+ namedWhenRetired: namedWhenRetiredFromStateSchema(stateSchema),
760
826
  visibility: visibilityTag(SVS.Spec.visibility),
761
827
  chapter: componentChapters[SVS.Spec.name],
762
828
  singleQueryField: qf.singleFieldName,
@@ -858,6 +924,7 @@ function make(name, aggregatesOpt, readModelsOpt, stateViewSlicesOpt, stateChang
858
924
  });
859
925
  checkDeclaredTransitions(name, stateChangeDefs.concat(aggregateDefs), lifecycleStatesByView);
860
926
  checkLifecycleTopology(name, stateChangeDefs.concat(aggregateDefs), lifecycleStatesByView);
927
+ reportRetiredStates(name, retiredFailures, retiredUnchecked);
861
928
  return {
862
929
  readModels: readModelDefs,
863
930
  stateViewSlices: stateViewDefs,
@@ -878,12 +945,14 @@ export {
878
945
  isLabelShape,
879
946
  isLifecycleShape,
880
947
  conventionalLabelNames,
881
- shapeOfItem,
948
+ shapeOfField,
882
949
  lifecycleFieldFromStateSchema,
883
950
  retiredFromStateSchema,
884
951
  retiredFieldFromStateSchema,
885
952
  retiredValuesFromStateSchema,
953
+ namedWhenRetiredFromStateSchema,
886
954
  checkRetiredValue,
955
+ reportRetiredStates,
887
956
  lifecycleStatesFromStateSchema,
888
957
  checkDeclaredTransitions,
889
958
  lifecycleTopologyFindings,
@@ -894,6 +963,14 @@ export {
894
963
  toEventDef,
895
964
  extractEventDefs,
896
965
  extractErrorDefs,
966
+ isCreateCommandName,
967
+ commandLevelAndId,
968
+ accessKeysFor,
969
+ annotateArgTypes,
970
+ toCommandDef,
971
+ extractCommandDefs,
972
+ visibilityTag,
973
+ queryableDefFromSpec,
897
974
  make,
898
975
  }
899
976
  /* log Not a pure module */
@@ -44,7 +44,7 @@ let sourceCFields = (
44
44
  mutationEntries->Array.forEach(entry => {
45
45
  let schema = entry.commandSchema
46
46
  switch schema {
47
- | Union({anyOf}) =>
47
+ | AnyOf({anyOf}) =>
48
48
  anyOf->Array.forEachWithIndex((_, i) => {
49
49
  let fieldName = entry.fieldNames->Array.get(i)->Option.getOr("")
50
50
  if fieldName->String.length > 0 {
@@ -26,7 +26,7 @@ function sourceCFields(mutationEntries) {
26
26
  } else {
27
27
  return;
28
28
  }
29
- case "union" :
29
+ case "anyOf" :
30
30
  schema.anyOf.forEach((param, i) => {
31
31
  let fieldName = Stdlib_Option.getOr(entry.fieldNames[i], "");
32
32
  if (fieldName.length > 0) {