@reventlessdev/reventless-core 3.0.0-alpha.254 → 3.0.0-alpha.256

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 (41) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/package.json +8 -8
  3. package/src/admin/Platform_ComponentDefinitionsApi.res +5 -1
  4. package/src/admin/Platform_ComponentDefinitionsApi.res.mjs +5 -1
  5. package/src/components/Api/GraphQL_FragmentGenerator.res +55 -14
  6. package/src/components/Api/GraphQL_FragmentGenerator.res.mjs +43 -12
  7. package/src/components/Api/SchemaType.res +1 -0
  8. package/src/components/Api/SchemaType.res.mjs +4 -0
  9. package/src/components/Api/SuryToJsonSchema.res +41 -0
  10. package/src/components/Api/SuryToJsonSchema.res.mjs +50 -17
  11. package/src/components/StateChangeSlice/StateChangeSlice_Callback.res +2 -2
  12. package/src/plugin/component/Plugin_Structure.res +13 -0
  13. package/src/plugin/component/Plugin_Structure.res.mjs +5 -1
  14. package/src/plugin/lifecycle/PluginsReadModelSpec.res +1 -1
  15. package/src/plugin/lifecycle/PluginsReadModelSpec.res.mjs +1 -1
  16. package/tests/admin/AdminApiSchemaDriftTest.res +1 -0
  17. package/tests/admin/AdminApiSchemaDriftTest.res.mjs +4 -1
  18. package/tests/admin/Platform_ComponentDefinitionsApiTest.res +2 -0
  19. package/tests/admin/Platform_ComponentDefinitionsApiTest.res.mjs +4 -2
  20. package/tests/admin/Platform_PluginStructuresApiTest.res +26 -0
  21. package/tests/admin/Platform_PluginStructuresApiTest.res.mjs +9 -0
  22. package/tests/api/GraphQL_FragmentGeneratorTest.res +47 -0
  23. package/tests/api/GraphQL_FragmentGeneratorTest.res.mjs +32 -0
  24. package/tests/api/SuryToJsonSchemaTest.res +157 -0
  25. package/tests/api/SuryToJsonSchemaTest.res.mjs +81 -0
  26. package/tests/fixtures/plugin-lifecycle/2026-07-22-versionconnected-no-requiredstores.json +1 -1
  27. package/tests/fixtures/plugin-lifecycle/2026-07-22-versionsuperseded-nested-definitions.json +1 -1
  28. package/tests/fixtures/plugin-lifecycle/2026-07-28-versionconnected-requiredstores-only.json +1 -1
  29. package/tests/fixtures/plugin-lifecycle/2026-07-30-versionconnected-declarations-without-annotation.json +1 -1
  30. package/tests/fixtures/plugin-lifecycle/2026-07-30-versiondisconnected-declarations-without-annotation.json +1 -1
  31. package/tests/fixtures/plugin-lifecycle/README.md +12 -0
  32. package/tests/logger/LogFormatTest.res +1 -1
  33. package/tests/logger/LogFormatTest.res.mjs +1 -1
  34. package/tests/plugin/PluginDefinitionRequiredScalarsTest.res +1 -1
  35. package/tests/plugin/PluginDefinitionScalars.res +13 -8
  36. package/tests/plugin/PluginDefinitionScalars.res.mjs +13 -5
  37. package/tests/plugin/PluginStructureTest.res +22 -0
  38. package/tests/plugin/PluginStructureTest.res.mjs +7 -0
  39. package/tests/plugin/StateViewSlice/PsAnnotatedView.res +13 -3
  40. package/tests/plugin/StateViewSlice/PsAnnotatedView.res.mjs +7 -3
  41. package/tests/plugin/pluginDefinitionRequiredScalars.txt +17 -12
@@ -1 +1 @@
1
- {"event":"VersionDisconnected","data":{"_0":{"dcbEventLog":{"name":"CatalogDcbEventLog","eventTopicArn":"arn:aws:dynamodb:eu-west-1:000000000000:table/CatalogDcbEventLog-925103d/stream/2026-07-14T08:45:33.852"},"extensions":[{"name":"Ordering.Orders.Catalog","extensionPointName":"Ordering.Orders","dcbSources":[]}],"extensionProtocols":[],"extensionPoints":[{"name":"Catalog.Products","commandTopic":"https://sqs.eu-west-1.amazonaws.com/000000000000/CatalogProductsExtPointCmdTopic-1dd983b","eventTopic":"arn:aws:sns:eu-west-1:000000000000:CatalogProductsExtPointEventTopic-5cb0b5e"}],"kind":"Domain","name":"Catalog","apiTarget":"Domain","id":"Catalog@1.0.0-alpha.167","version":"1.0.0-alpha.167","apiSchemaFragment":{"protocol":"graphql","encoded":"{\"types\":[\"type Catalog_Category implements Node {\\n id: ID!\\n categoryId: ID!\\n name: String!\\n archived: Boolean!\\n}\",\"type Catalog_CategoryEdge {\\n node: Catalog_Category!\\n cursor: String!\\n}\",\"type Catalog_CategoryConnection {\\n edges: [Catalog_CategoryEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_CategoryFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"type Catalog_ProductDemand implements Node {\\n id: ID!\\n productId: ID!\\n name: String!\\n categoryId: ID!\\n orderCount: Float!\\n}\",\"type Catalog_ProductDemandEdge {\\n node: Catalog_ProductDemand!\\n cursor: String!\\n}\",\"type Catalog_ProductDemandConnection {\\n edges: [Catalog_ProductDemandEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_ProductDemandFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"type Catalog_Product implements Node {\\n id: ID!\\n productId: ID!\\n name: String!\\n description: String!\\n price: Float!\\n imageUrl: String!\\n categoryId: ID!\\n}\",\"type Catalog_ProductEdge {\\n node: Catalog_Product!\\n cursor: String!\\n}\",\"type Catalog_ProductConnection {\\n edges: [Catalog_ProductEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_ProductFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"enum Catalog_ImportProductAuditStatus {\\n Success\\n Failure\\n}\",\"type Catalog_ImportProductAudit implements Node {\\n id: ID!\\n input: String!\\n status: Catalog_ImportProductAuditStatus!\\n targetIds: [ID!]\\n commandCount: Float\\n error: String\\n receivedAt: String!\\n}\",\"type Catalog_ImportProductAuditEdge {\\n node: Catalog_ImportProductAudit!\\n cursor: String!\\n}\",\"type Catalog_ImportProductAuditConnection {\\n edges: [Catalog_ImportProductAuditEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_ImportProductAuditFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"union CommandResult = CommandAccepted | CommandRejected | CommandPending\",\"type CommandAccepted {\\n msgId: ID!\\n entityId: ID\\n eventCount: Int!\\n}\",\"type CommandRejected {\\n msgId: ID!\\n errorCode: String!\\n errorDetail: String\\n}\",\"type CommandPending {\\n msgId: ID!\\n}\",\"type CatalogEventLogEvent {\\n position: String!\\n eventType: String!\\n payload: AWSJSON!\\n}\",\"type Catalog_CatalogEventRecord {\\n position: String!\\n eventType: String!\\n payload: AWSJSON!\\n tags: [EventTag!]!\\n meta: EventMeta!\\n recordedAt: String!\\n}\",\"type Catalog_CatalogEventRecordEdge {\\n node: Catalog_CatalogEventRecord!\\n cursor: String!\\n}\",\"type Catalog_CatalogEventRecordConnection {\\n edges: [Catalog_CatalogEventRecordEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_CatalogEventHistoryFilter {\\n entityId: ID\\n tagKey: String\\n tagValue: String\\n eventTypes: [String!]\\n user: String\\n timeFrom: String\\n timeTo: String\\n}\",\"type EventMeta {\\n service: String!\\n time: String!\\n user: String\\n msgId: String!\\n correlationId: String!\\n causationId: String\\n}\",\"type EventTag {\\n key: String!\\n value: String!\\n}\"],\"mutations\":[\" Catalog_AddCategory(categoryId: ID!, name: String!): CommandResult!\",\" Catalog_AddProduct(productId: ID!, name: String!, description: String!, price: Float!, imageUrl: String!, categoryId: ID!): CommandResult!\",\" Catalog_ArchiveCategory(categoryId: ID!): CommandResult!\\n @aws_auth(cognito_groups: [\\\"Admin\\\"])\",\" Catalog_ChangeProductDescription(productId: ID!, description: String!): CommandResult!\",\" Catalog_ChangeProductImage(productId: ID!, imageUrl: String!): CommandResult!\",\" Catalog_ChangeProductName(productId: ID!, name: String!): CommandResult!\",\" Catalog_ChangeProductPrice(productId: ID!, price: Float!): CommandResult!\",\" Catalog_RenameCategory(categoryId: ID!, name: String!): CommandResult!\",\" Catalog_ImportProduct(sku: String!, title: String!, desc: String!, unitPrice: Float!, currency: String!, category: String!): CommandResult!\"],\"queries\":[\" Catalog_Category(id: ID!): Catalog_Category\",\" Catalog_CategoriesByIds(ids: [String!]!): [Catalog_Category!]!\",\" Catalog_Categories(filter: Catalog_CategoryFilter, first: Int, after: String, last: Int, before: String): Catalog_CategoryConnection!\",\" Catalog_ProductDemand(id: ID!): Catalog_ProductDemand\",\" Catalog_ProductDemandsByIds(ids: [String!]!): [Catalog_ProductDemand!]!\",\" Catalog_ProductDemands(filter: Catalog_ProductDemandFilter, first: Int, after: String, last: Int, before: String): Catalog_ProductDemandConnection!\",\" Catalog_Product(id: ID!): Catalog_Product\",\" Catalog_ProductsByIds(ids: [String!]!): [Catalog_Product!]!\",\" Catalog_Products(filter: Catalog_ProductFilter, first: Int, after: String, last: Int, before: String): Catalog_ProductConnection!\",\" Catalog_ImportProductAudit(id: ID!): Catalog_ImportProductAudit\",\" Catalog_ImportProductAuditsByIds(ids: [String!]!): [Catalog_ImportProductAudit!]!\",\" Catalog_ImportProductAudits(filter: Catalog_ImportProductAuditFilter, first: Int, after: String, last: Int, before: String): Catalog_ImportProductAuditConnection!\",\" Catalog_CatalogEventHistory(filter: Catalog_CatalogEventHistoryFilter, first: Int, after: String, last: Int, before: String): Catalog_CatalogEventRecordConnection!\"],\"subscriptions\":[\" onCatalog_AddCategory(id: ID): CommandResult\",\" onCatalog_AddProduct(id: ID): CommandResult\",\" onCatalog_ArchiveCategory(id: ID): CommandResult\",\" onCatalog_ChangeProductDescription(id: ID): CommandResult\",\" onCatalog_ChangeProductImage(id: ID): CommandResult\",\" onCatalog_ChangeProductName(id: ID): CommandResult\",\" onCatalog_ChangeProductPrice(id: ID): CommandResult\",\" onCatalog_RenameCategory(id: ID): CommandResult\",\" onCatalog_ImportProduct(id: ID): CommandResult\",\" onCatalogEventLog_eventAppended: CatalogEventLogEvent\"],\"subscriptionSources\":[{\"field\":\"onCatalog_AddCategory\",\"mutations\":[\"Catalog_AddCategory\"]},{\"field\":\"onCatalog_AddProduct\",\"mutations\":[\"Catalog_AddProduct\"]},{\"field\":\"onCatalog_ArchiveCategory\",\"mutations\":[\"Catalog_ArchiveCategory\"]},{\"field\":\"onCatalog_ChangeProductDescription\",\"mutations\":[\"Catalog_ChangeProductDescription\"]},{\"field\":\"onCatalog_ChangeProductImage\",\"mutations\":[\"Catalog_ChangeProductImage\"]},{\"field\":\"onCatalog_ChangeProductName\",\"mutations\":[\"Catalog_ChangeProductName\"]},{\"field\":\"onCatalog_ChangeProductPrice\",\"mutations\":[\"Catalog_ChangeProductPrice\"]},{\"field\":\"onCatalog_RenameCategory\",\"mutations\":[\"Catalog_RenameCategory\"]},{\"field\":\"onCatalog_ImportProduct\",\"mutations\":[\"Catalog_ImportProduct\"]}]}"},"eventCollector":"arn:aws:sqs:eu-west-1:000000000000:CatalogPluginEventColl-fc85d05","structure":{"outboundTranslationSlices":[],"extensions":[{"name":"Ordering.Orders","delegateNames":["RecordProductDemand"],"eventTypes":["Ordering.Orders.ItemOrdered","Ordering.Orders.ItemOrderCancelled"],"commandTypes":[]}],"stateChangeSlices":[{"consistencyRead":null,"chapter":"Category","linkedViews":["Categories"],"producedEventTypes":["Catalog.CategoryAdded"],"name":"AddCategory","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"AddCategory\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","aggregateIdField":"categoryId","mutationField":"Catalog_AddCategory","references":[],"level":"Collection","targetState":null,"apiExposed":true,"name":"AddCategory","allowedStates":null}],"events":[{"name":"CategoryAdded","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"CategoryAdded\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","references":[]}],"consumedEventTypes":[]},{"consistencyRead":"Categories","chapter":"Product","linkedViews":["ProductDemand","Products"],"producedEventTypes":["Catalog.ProductAdded"],"name":"AddProduct","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"AddProduct\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"},\"imageUrl\":{\"type\":\"string\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\",\"description\",\"price\",\"imageUrl\",\"categoryId\"]}","aggregateIdField":"productId","mutationField":"Catalog_AddProduct","references":[{"plugin":null,"entity":"Categories","fieldName":"categoryId"}],"level":"Collection","targetState":null,"apiExposed":true,"name":"AddProduct","allowedStates":null}],"events":[{"name":"ProductAdded","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductAdded\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"},\"imageUrl\":{\"type\":\"string\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\",\"description\",\"price\",\"imageUrl\",\"categoryId\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.CategoryAdded","Catalog.CategoryArchived"]},{"consistencyRead":null,"chapter":"Category","linkedViews":["Categories"],"producedEventTypes":["Catalog.CategoryArchived"],"name":"ArchiveCategory","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ArchiveCategory\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\"]}","aggregateIdField":"categoryId","mutationField":"Catalog_ArchiveCategory","references":[],"level":"Instance","targetState":null,"apiExposed":true,"name":"ArchiveCategory","allowedStates":null}],"events":[{"name":"CategoryArchived","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"CategoryArchived\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\"]}","references":[]}],"consumedEventTypes":[]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductDescriptionChanged"],"name":"ChangeProductDescription","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductDescription\"},\"productId\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"description\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductDescription","references":[],"level":"Instance","targetState":null,"apiExposed":true,"name":"ChangeProductDescription","allowedStates":null}],"events":[{"name":"ProductDescriptionChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductDescriptionChanged\"},\"productId\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"description\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductDescriptionChanged"]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductImageChanged"],"name":"ChangeProductImage","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductImage\"},\"productId\":{\"type\":\"string\"},\"imageUrl\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"imageUrl\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductImage","references":[],"level":"Instance","targetState":null,"apiExposed":true,"name":"ChangeProductImage","allowedStates":null}],"events":[{"name":"ProductImageChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductImageChanged\"},\"productId\":{\"type\":\"string\"},\"imageUrl\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"imageUrl\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductImageChanged"]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductNameChanged"],"name":"ChangeProductName","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductName\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductName","references":[],"level":"Instance","targetState":null,"apiExposed":true,"name":"ChangeProductName","allowedStates":null}],"events":[{"name":"ProductNameChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductNameChanged\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductNameChanged"]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductPriceChanged"],"name":"ChangeProductPrice","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductPrice\"},\"productId\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"price\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductPrice","references":[],"level":"Instance","targetState":null,"apiExposed":true,"name":"ChangeProductPrice","allowedStates":null}],"events":[{"name":"ProductPriceChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductPriceChanged\"},\"productId\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"price\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductPriceChanged"]},{"consistencyRead":"ProductDemand","chapter":"ProductDemand","linkedViews":["ProductDemand"],"producedEventTypes":["Catalog.ProductDemandRecorded","Catalog.ProductDemandRevoked"],"name":"RecordProductDemand","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"RecordDemand\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","aggregateIdField":"productId","mutationField":"","references":[],"level":"Instance","targetState":null,"apiExposed":false,"name":"RecordDemand","allowedStates":null},{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"RevokeDemand\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","aggregateIdField":"productId","mutationField":"","references":[],"level":"Instance","targetState":null,"apiExposed":false,"name":"RevokeDemand","allowedStates":null}],"events":[{"name":"ProductDemandRecorded","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductDemandRecorded\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","references":[]},{"name":"ProductDemandRevoked","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductDemandRevoked\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductDemandRecorded","Catalog.ProductDemandRevoked"]},{"consistencyRead":"Categories","chapter":"Category","linkedViews":["Categories"],"producedEventTypes":["Catalog.CategoryRenamed"],"name":"RenameCategory","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"RenameCategory\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","aggregateIdField":"categoryId","mutationField":"Catalog_RenameCategory","references":[],"level":"Instance","targetState":null,"apiExposed":true,"name":"RenameCategory","allowedStates":null}],"events":[{"name":"CategoryRenamed","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"CategoryRenamed\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","references":[]}],"consumedEventTypes":["Catalog.CategoryAdded","Catalog.CategoryRenamed"]}],"extensionPoints":[{"name":"Catalog.Products","sourceEventTypes":["Catalog.ProductAdded","Catalog.ProductPriceChanged"],"delegateNames":["CatalogDcbEventLog"],"commandTypes":[]}],"readModels":[],"requiredStoreDeclarations":[{"field":"imageUrl","component":"AddProduct","store":"Catalog.productImages"},{"field":"imageUrl","component":"ChangeProductImage","store":"Catalog.productImages"},{"field":"imageUrl","component":"ImportProduct","store":"Catalog.productImages"},{"field":"imageUrl","component":"Products","store":"Catalog.productImages"}],"stateViewSlices":[{"schema":"{\"type\":\"object\",\"properties\":{\"categoryId\":{\"type\":\"string\",\"format\":\"uuid\"},\"name\":{\"type\":\"string\"},\"archived\":{\"type\":\"boolean\"}},\"required\":[\"categoryId\",\"name\",\"archived\"]}","searchableFields":["name"],"chapter":"Category","linkedWriteSide":["AddCategory","ArchiveCategory","RenameCategory"],"labelFieldSource":"convention","statusField":null,"visibility":null,"queryField":"Catalog_Categories","name":"Categories","consumedEventTypes":["Catalog.CategoryAdded","Catalog.CategoryRenamed","Catalog.CategoryArchived"],"labelField":"name"},{"schema":"{\"type\":\"object\",\"properties\":{\"productId\":{\"type\":\"string\",\"format\":\"uuid\"},\"name\":{\"type\":\"string\"},\"categoryId\":{\"type\":\"string\",\"format\":\"uuid\"},\"orderCount\":{\"type\":\"number\"}},\"required\":[\"productId\",\"name\",\"categoryId\",\"orderCount\"]}","searchableFields":["name"],"chapter":"Product","linkedWriteSide":["AddProduct","RecordProductDemand"],"labelFieldSource":"convention","statusField":null,"visibility":null,"queryField":"Catalog_ProductDemands","name":"ProductDemand","consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductDemandRecorded","Catalog.ProductDemandRevoked"],"labelField":"name"},{"schema":"{\"type\":\"object\",\"properties\":{\"productId\":{\"type\":\"string\",\"format\":\"uuid\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"},\"imageUrl\":{\"type\":\"string\",\"x-reventless-semantic\":\"storageRef\",\"x-reventless-semantic-source\":\"type\",\"x-reventless-semantic-target\":{\"store\":\"productImages\"}},\"categoryId\":{\"type\":\"string\",\"format\":\"uuid\"}},\"required\":[\"productId\",\"name\",\"description\",\"price\",\"imageUrl\",\"categoryId\"]}","searchableFields":["name"],"chapter":"Product","linkedWriteSide":["AddProduct","ChangeProductDescription","ChangeProductImage","ChangeProductName","ChangeProductPrice"],"labelFieldSource":"convention","statusField":null,"visibility":null,"queryField":"Catalog_Products","name":"Products","consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductNameChanged","Catalog.ProductDescriptionChanged","Catalog.ProductPriceChanged","Catalog.ProductImageChanged"],"labelField":"name"}],"aggregates":[],"inboundTranslationSlices":[{"name":"ImportProduct","chapter":"Product","targetName":"AddProduct","commandTypes":["Catalog.AddProduct"],"externalSystem":"SupplierFeed"}],"automationSlices":[],"requiredStores":["Catalog.productImages"]}}}}
1
+ {"event":"VersionDisconnected","data":{"_0":{"dcbEventLog":{"name":"CatalogDcbEventLog","eventTopicArn":"arn:aws:dynamodb:eu-west-1:000000000000:table/CatalogDcbEventLog-925103d/stream/2026-07-14T08:45:33.852"},"extensions":[{"name":"Ordering.Orders.Catalog","extensionPointName":"Ordering.Orders","dcbSources":[]}],"extensionProtocols":[],"extensionPoints":[{"name":"Catalog.Products","commandTopic":"https://sqs.eu-west-1.amazonaws.com/000000000000/CatalogProductsExtPointCmdTopic-1dd983b","eventTopic":"arn:aws:sns:eu-west-1:000000000000:CatalogProductsExtPointEventTopic-5cb0b5e"}],"kind":"Domain","name":"Catalog","apiTarget":"Domain","id":"Catalog@1.0.0-alpha.167","version":"1.0.0-alpha.167","apiSchemaFragment":{"protocol":"graphql","encoded":"{\"types\":[\"type Catalog_Category implements Node {\\n id: ID!\\n categoryId: ID!\\n name: String!\\n archived: Boolean!\\n}\",\"type Catalog_CategoryEdge {\\n node: Catalog_Category!\\n cursor: String!\\n}\",\"type Catalog_CategoryConnection {\\n edges: [Catalog_CategoryEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_CategoryFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"type Catalog_ProductDemand implements Node {\\n id: ID!\\n productId: ID!\\n name: String!\\n categoryId: ID!\\n orderCount: Float!\\n}\",\"type Catalog_ProductDemandEdge {\\n node: Catalog_ProductDemand!\\n cursor: String!\\n}\",\"type Catalog_ProductDemandConnection {\\n edges: [Catalog_ProductDemandEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_ProductDemandFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"type Catalog_Product implements Node {\\n id: ID!\\n productId: ID!\\n name: String!\\n description: String!\\n price: Float!\\n imageUrl: String!\\n categoryId: ID!\\n}\",\"type Catalog_ProductEdge {\\n node: Catalog_Product!\\n cursor: String!\\n}\",\"type Catalog_ProductConnection {\\n edges: [Catalog_ProductEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_ProductFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"enum Catalog_ImportProductAuditStatus {\\n Success\\n Failure\\n}\",\"type Catalog_ImportProductAudit implements Node {\\n id: ID!\\n input: String!\\n status: Catalog_ImportProductAuditStatus!\\n targetIds: [ID!]\\n commandCount: Float\\n error: String\\n receivedAt: String!\\n}\",\"type Catalog_ImportProductAuditEdge {\\n node: Catalog_ImportProductAudit!\\n cursor: String!\\n}\",\"type Catalog_ImportProductAuditConnection {\\n edges: [Catalog_ImportProductAuditEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_ImportProductAuditFilter {\\n search: String\\n searchPrefix: String\\n ids: [ID!]\\n}\",\"union CommandResult = CommandAccepted | CommandRejected | CommandPending\",\"type CommandAccepted {\\n msgId: ID!\\n entityId: ID\\n eventCount: Int!\\n}\",\"type CommandRejected {\\n msgId: ID!\\n errorCode: String!\\n errorDetail: String\\n}\",\"type CommandPending {\\n msgId: ID!\\n}\",\"type CatalogEventLogEvent {\\n position: String!\\n eventType: String!\\n payload: AWSJSON!\\n}\",\"type Catalog_CatalogEventRecord {\\n position: String!\\n eventType: String!\\n payload: AWSJSON!\\n tags: [EventTag!]!\\n meta: EventMeta!\\n recordedAt: String!\\n}\",\"type Catalog_CatalogEventRecordEdge {\\n node: Catalog_CatalogEventRecord!\\n cursor: String!\\n}\",\"type Catalog_CatalogEventRecordConnection {\\n edges: [Catalog_CatalogEventRecordEdge!]!\\n pageInfo: PageInfo!\\n}\",\"input Catalog_CatalogEventHistoryFilter {\\n entityId: ID\\n tagKey: String\\n tagValue: String\\n eventTypes: [String!]\\n user: String\\n timeFrom: String\\n timeTo: String\\n}\",\"type EventMeta {\\n service: String!\\n time: String!\\n user: String\\n msgId: String!\\n correlationId: String!\\n causationId: String\\n}\",\"type EventTag {\\n key: String!\\n value: String!\\n}\"],\"mutations\":[\" Catalog_AddCategory(categoryId: ID!, name: String!): CommandResult!\",\" Catalog_AddProduct(productId: ID!, name: String!, description: String!, price: Float!, imageUrl: String!, categoryId: ID!): CommandResult!\",\" Catalog_ArchiveCategory(categoryId: ID!): CommandResult!\\n @aws_auth(cognito_groups: [\\\"Admin\\\"])\",\" Catalog_ChangeProductDescription(productId: ID!, description: String!): CommandResult!\",\" Catalog_ChangeProductImage(productId: ID!, imageUrl: String!): CommandResult!\",\" Catalog_ChangeProductName(productId: ID!, name: String!): CommandResult!\",\" Catalog_ChangeProductPrice(productId: ID!, price: Float!): CommandResult!\",\" Catalog_RenameCategory(categoryId: ID!, name: String!): CommandResult!\",\" Catalog_ImportProduct(sku: String!, title: String!, desc: String!, unitPrice: Float!, currency: String!, category: String!): CommandResult!\"],\"queries\":[\" Catalog_Category(id: ID!): Catalog_Category\",\" Catalog_CategoriesByIds(ids: [String!]!): [Catalog_Category!]!\",\" Catalog_Categories(filter: Catalog_CategoryFilter, first: Int, after: String, last: Int, before: String): Catalog_CategoryConnection!\",\" Catalog_ProductDemand(id: ID!): Catalog_ProductDemand\",\" Catalog_ProductDemandsByIds(ids: [String!]!): [Catalog_ProductDemand!]!\",\" Catalog_ProductDemands(filter: Catalog_ProductDemandFilter, first: Int, after: String, last: Int, before: String): Catalog_ProductDemandConnection!\",\" Catalog_Product(id: ID!): Catalog_Product\",\" Catalog_ProductsByIds(ids: [String!]!): [Catalog_Product!]!\",\" Catalog_Products(filter: Catalog_ProductFilter, first: Int, after: String, last: Int, before: String): Catalog_ProductConnection!\",\" Catalog_ImportProductAudit(id: ID!): Catalog_ImportProductAudit\",\" Catalog_ImportProductAuditsByIds(ids: [String!]!): [Catalog_ImportProductAudit!]!\",\" Catalog_ImportProductAudits(filter: Catalog_ImportProductAuditFilter, first: Int, after: String, last: Int, before: String): Catalog_ImportProductAuditConnection!\",\" Catalog_CatalogEventHistory(filter: Catalog_CatalogEventHistoryFilter, first: Int, after: String, last: Int, before: String): Catalog_CatalogEventRecordConnection!\"],\"subscriptions\":[\" onCatalog_AddCategory(id: ID): CommandResult\",\" onCatalog_AddProduct(id: ID): CommandResult\",\" onCatalog_ArchiveCategory(id: ID): CommandResult\",\" onCatalog_ChangeProductDescription(id: ID): CommandResult\",\" onCatalog_ChangeProductImage(id: ID): CommandResult\",\" onCatalog_ChangeProductName(id: ID): CommandResult\",\" onCatalog_ChangeProductPrice(id: ID): CommandResult\",\" onCatalog_RenameCategory(id: ID): CommandResult\",\" onCatalog_ImportProduct(id: ID): CommandResult\",\" onCatalogEventLog_eventAppended: CatalogEventLogEvent\"],\"subscriptionSources\":[{\"field\":\"onCatalog_AddCategory\",\"mutations\":[\"Catalog_AddCategory\"]},{\"field\":\"onCatalog_AddProduct\",\"mutations\":[\"Catalog_AddProduct\"]},{\"field\":\"onCatalog_ArchiveCategory\",\"mutations\":[\"Catalog_ArchiveCategory\"]},{\"field\":\"onCatalog_ChangeProductDescription\",\"mutations\":[\"Catalog_ChangeProductDescription\"]},{\"field\":\"onCatalog_ChangeProductImage\",\"mutations\":[\"Catalog_ChangeProductImage\"]},{\"field\":\"onCatalog_ChangeProductName\",\"mutations\":[\"Catalog_ChangeProductName\"]},{\"field\":\"onCatalog_ChangeProductPrice\",\"mutations\":[\"Catalog_ChangeProductPrice\"]},{\"field\":\"onCatalog_RenameCategory\",\"mutations\":[\"Catalog_RenameCategory\"]},{\"field\":\"onCatalog_ImportProduct\",\"mutations\":[\"Catalog_ImportProduct\"]}]}"},"eventCollector":"arn:aws:sqs:eu-west-1:000000000000:CatalogPluginEventColl-fc85d05","structure":{"outboundTranslationSlices":[],"extensions":[{"name":"Ordering.Orders","delegateNames":["RecordProductDemand"],"eventTypes":["Ordering.Orders.ItemOrdered","Ordering.Orders.ItemOrderCancelled"],"commandTypes":[]}],"stateChangeSlices":[{"chapter":"Category","linkedViews":["Categories"],"producedEventTypes":["Catalog.CategoryAdded"],"name":"AddCategory","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"AddCategory\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","aggregateIdField":"categoryId","mutationField":"Catalog_AddCategory","references":[],"level":"Collection","apiExposed":true,"name":"AddCategory"}],"events":[{"name":"CategoryAdded","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"CategoryAdded\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","references":[]}],"consumedEventTypes":[]},{"consistencyRead":"Categories","chapter":"Product","linkedViews":["ProductDemand","Products"],"producedEventTypes":["Catalog.ProductAdded"],"name":"AddProduct","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"AddProduct\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"},\"imageUrl\":{\"type\":\"string\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\",\"description\",\"price\",\"imageUrl\",\"categoryId\"]}","aggregateIdField":"productId","mutationField":"Catalog_AddProduct","references":[{"entity":"Categories","fieldName":"categoryId"}],"level":"Collection","apiExposed":true,"name":"AddProduct"}],"events":[{"name":"ProductAdded","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductAdded\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"},\"imageUrl\":{\"type\":\"string\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\",\"description\",\"price\",\"imageUrl\",\"categoryId\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.CategoryAdded","Catalog.CategoryArchived"]},{"chapter":"Category","linkedViews":["Categories"],"producedEventTypes":["Catalog.CategoryArchived"],"name":"ArchiveCategory","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ArchiveCategory\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\"]}","aggregateIdField":"categoryId","mutationField":"Catalog_ArchiveCategory","references":[],"level":"Instance","apiExposed":true,"name":"ArchiveCategory"}],"events":[{"name":"CategoryArchived","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"CategoryArchived\"},\"categoryId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\"]}","references":[]}],"consumedEventTypes":[]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductDescriptionChanged"],"name":"ChangeProductDescription","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductDescription\"},\"productId\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"description\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductDescription","references":[],"level":"Instance","apiExposed":true,"name":"ChangeProductDescription"}],"events":[{"name":"ProductDescriptionChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductDescriptionChanged\"},\"productId\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"description\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductDescriptionChanged"]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductImageChanged"],"name":"ChangeProductImage","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductImage\"},\"productId\":{\"type\":\"string\"},\"imageUrl\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"imageUrl\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductImage","references":[],"level":"Instance","apiExposed":true,"name":"ChangeProductImage"}],"events":[{"name":"ProductImageChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductImageChanged\"},\"productId\":{\"type\":\"string\"},\"imageUrl\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"imageUrl\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductImageChanged"]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductNameChanged"],"name":"ChangeProductName","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductName\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductName","references":[],"level":"Instance","apiExposed":true,"name":"ChangeProductName"}],"events":[{"name":"ProductNameChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductNameChanged\"},\"productId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"name\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductNameChanged"]},{"consistencyRead":"Products","chapter":"Product","linkedViews":["Products"],"producedEventTypes":["Catalog.ProductPriceChanged"],"name":"ChangeProductPrice","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ChangeProductPrice\"},\"productId\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"price\"]}","aggregateIdField":"productId","mutationField":"Catalog_ChangeProductPrice","references":[],"level":"Instance","apiExposed":true,"name":"ChangeProductPrice"}],"events":[{"name":"ProductPriceChanged","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductPriceChanged\"},\"productId\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"price\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductPriceChanged"]},{"consistencyRead":"ProductDemand","chapter":"ProductDemand","linkedViews":["ProductDemand"],"producedEventTypes":["Catalog.ProductDemandRecorded","Catalog.ProductDemandRevoked"],"name":"RecordProductDemand","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"RecordDemand\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","aggregateIdField":"productId","mutationField":"","references":[],"level":"Instance","apiExposed":false,"name":"RecordDemand"},{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"RevokeDemand\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","aggregateIdField":"productId","mutationField":"","references":[],"level":"Instance","apiExposed":false,"name":"RevokeDemand"}],"events":[{"name":"ProductDemandRecorded","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductDemandRecorded\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","references":[]},{"name":"ProductDemandRevoked","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"ProductDemandRevoked\"},\"productId\":{\"type\":\"string\"},\"orderId\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"productId\",\"orderId\"]}","references":[]}],"consumedEventTypes":["Catalog.ProductDemandRecorded","Catalog.ProductDemandRevoked"]},{"consistencyRead":"Categories","chapter":"Category","linkedViews":["Categories"],"producedEventTypes":["Catalog.CategoryRenamed"],"name":"RenameCategory","commands":[{"schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"RenameCategory\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","aggregateIdField":"categoryId","mutationField":"Catalog_RenameCategory","references":[],"level":"Instance","apiExposed":true,"name":"RenameCategory"}],"events":[{"name":"CategoryRenamed","schema":"{\"type\":\"object\",\"properties\":{\"TAG\":{\"type\":\"string\",\"const\":\"CategoryRenamed\"},\"categoryId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"additionalProperties\":true,\"required\":[\"TAG\",\"categoryId\",\"name\"]}","references":[]}],"consumedEventTypes":["Catalog.CategoryAdded","Catalog.CategoryRenamed"]}],"extensionPoints":[{"name":"Catalog.Products","sourceEventTypes":["Catalog.ProductAdded","Catalog.ProductPriceChanged"],"delegateNames":["CatalogDcbEventLog"],"commandTypes":[]}],"readModels":[],"requiredStoreDeclarations":[{"field":"imageUrl","component":"AddProduct","store":"Catalog.productImages"},{"field":"imageUrl","component":"ChangeProductImage","store":"Catalog.productImages"},{"field":"imageUrl","component":"ImportProduct","store":"Catalog.productImages"},{"field":"imageUrl","component":"Products","store":"Catalog.productImages"}],"stateViewSlices":[{"schema":"{\"type\":\"object\",\"properties\":{\"categoryId\":{\"type\":\"string\",\"format\":\"uuid\"},\"name\":{\"type\":\"string\"},\"archived\":{\"type\":\"boolean\"}},\"required\":[\"categoryId\",\"name\",\"archived\"]}","searchableFields":["name"],"chapter":"Category","linkedWriteSide":["AddCategory","ArchiveCategory","RenameCategory"],"labelFieldSource":"convention","queryField":"Catalog_Categories","name":"Categories","consumedEventTypes":["Catalog.CategoryAdded","Catalog.CategoryRenamed","Catalog.CategoryArchived"],"labelField":"name"},{"schema":"{\"type\":\"object\",\"properties\":{\"productId\":{\"type\":\"string\",\"format\":\"uuid\"},\"name\":{\"type\":\"string\"},\"categoryId\":{\"type\":\"string\",\"format\":\"uuid\"},\"orderCount\":{\"type\":\"number\"}},\"required\":[\"productId\",\"name\",\"categoryId\",\"orderCount\"]}","searchableFields":["name"],"chapter":"Product","linkedWriteSide":["AddProduct","RecordProductDemand"],"labelFieldSource":"convention","queryField":"Catalog_ProductDemands","name":"ProductDemand","consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductDemandRecorded","Catalog.ProductDemandRevoked"],"labelField":"name"},{"schema":"{\"type\":\"object\",\"properties\":{\"productId\":{\"type\":\"string\",\"format\":\"uuid\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"price\":{\"type\":\"number\"},\"imageUrl\":{\"type\":\"string\",\"x-reventless-semantic\":\"storageRef\",\"x-reventless-semantic-source\":\"type\",\"x-reventless-semantic-target\":{\"store\":\"productImages\"}},\"categoryId\":{\"type\":\"string\",\"format\":\"uuid\"}},\"required\":[\"productId\",\"name\",\"description\",\"price\",\"imageUrl\",\"categoryId\"]}","searchableFields":["name"],"chapter":"Product","linkedWriteSide":["AddProduct","ChangeProductDescription","ChangeProductImage","ChangeProductName","ChangeProductPrice"],"labelFieldSource":"convention","queryField":"Catalog_Products","name":"Products","consumedEventTypes":["Catalog.ProductAdded","Catalog.ProductNameChanged","Catalog.ProductDescriptionChanged","Catalog.ProductPriceChanged","Catalog.ProductImageChanged"],"labelField":"name"}],"aggregates":[],"inboundTranslationSlices":[{"name":"ImportProduct","chapter":"Product","targetName":"AddProduct","commandTypes":["Catalog.AddProduct"],"externalSystem":"SupplierFeed"}],"automationSlices":[],"requiredStores":["Catalog.productImages"]}}}}
@@ -34,3 +34,15 @@ Each file is the decode-relevant part of the stored row — `{event, data}` —
34
34
  One transformation was applied at extraction: the AWS account id in embedded ARNs and queue URLs
35
35
  was replaced with `000000000000`. The corpus asserts *shape*, and the shape of a string does not
36
36
  depend on its contents.
37
+
38
+ A second was applied on 2026-09-04, when `pluginDefinition`'s optionals moved from `T | null` to
39
+ sury's default encoding, where an absent value is an omitted key. Null-valued keys were removed
40
+ from every entry — 18 to 36 per file — and nothing else was touched: the rewrite round-trips each
41
+ file through `JSON.parse`/`stringify` unchanged before it edits, and a key-by-key diff against the
42
+ previous revision reports null removals and no other difference. The two `Offload` fields keep
43
+ their nulls, their codec being unaffected.
44
+
45
+ This is the one edit the rule above permits, and only because it is not a regeneration: no fixture
46
+ was rebuilt from ReScript types, so every generation in the table is still the one it was captured
47
+ at, and each entry still pins exactly the absence it was kept for. What it stops pinning is the
48
+ encoding that was deleted — which no longer exists to be pinned.
@@ -95,7 +95,7 @@ describe("LogFormat", () => {
95
95
  },
96
96
  )
97
97
  let expected1 = `1/2: \x1b[1mHeartbeat\x1b[0m(0): {"command":{"TAG":"Heartbeat","_0":"0.0.0"},"meta":${metaStr},"id":"0"}`
98
- let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"apiTarget":null,"structure":null,"dcbEventLog":null,"kind":"Domain"}},"meta":${metaStr},"id":"1"}`
98
+ let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"structure":null,"kind":"Domain"}},"meta":${metaStr},"id":"1"}`
99
99
  expect(commandJsonsToLogMessages(arr))->toEqual([expected1, expected2])
100
100
  },
101
101
  )
@@ -94,7 +94,7 @@ globalThis.describe("LogFormat", () => {
94
94
  commandJson: Message$ReventlessCore.encode(command, PluginSpec$ReventlessCore.commandSchema)
95
95
  }));
96
96
  let expected1 = `1/2: \x1b[1mHeartbeat\x1b[0m(0): {"command":{"TAG":"Heartbeat","_0":"0.0.0"},"meta":` + metaStr + `,"id":"0"}`;
97
- let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"apiTarget":null,"structure":null,"dcbEventLog":null,"kind":"Domain"}},"meta":` + metaStr + `,"id":"1"}`;
97
+ let expected2 = `2/2: \x1b[1mConnect\x1b[0m(1): {"command":{"TAG":"Connect","_0":{"id":"id","name":"testName","version":"testVersion","extensionPoints":[{"name":"testExtensionPoint","commandTopic":"testCommandTopic","eventTopic":"testEventTopic"}],"extensions":[{"name":"testExtension","extensionPointName":"testExtensionPoint","dcbSources":[]}],"eventCollector":"testEventCollector","extensionProtocols":[],"apiSchemaFragment":null,"structure":null,"kind":"Domain"}},"meta":` + metaStr + `,"id":"1"}`;
98
98
  globalThis.expect(LogFormat$ReventlessCore.commandJsonsToLogMessages(arr)).toEqual([
99
99
  expected1,
100
100
  expected2
@@ -8,7 +8,7 @@
8
8
  // original two-day freeze go unnoticed, so the guard belongs here instead: in CI, at
9
9
  // the moment the field is declared.
10
10
  //
11
- // Adding a `js_nullable` / array / enum / object field leaves this list untouched.
11
+ // Adding an optional / array / enum / object field leaves this list untouched.
12
12
  // Adding a bare required scalar changes it, and the diff is the conversation.
13
13
 
14
14
  open JestGlobals
@@ -10,15 +10,16 @@
10
10
  // A scalar is "bare required" when `Message.fillMissingDefaults` could not supply
11
11
  // a value for it from the schema alone. Everything else it CAN supply is skipped:
12
12
  //
13
- // `T | null` union → null (the `js_nullable` shape the rule asks for)
13
+ // optional union → absent (the `option` shape the rule asks for —
14
+ // `T | undefined`, or legacy `T | null`)
14
15
  // const / enum union → the literal
15
16
  // array → []
16
17
  // object → {} filled recursively
17
18
  //
18
- // A scalar arm of a nullable union is therefore not reported — but object and
19
- // array arms are still descended, nullable or not: when an old payload happens to
20
- // carry a nullable parent, a scalar added inside it still has to be invented.
21
- // `requiredStoreDeclarations[].annotation`, a required string inside a nullable
19
+ // A scalar arm of an optional union is therefore not reported — but object and
20
+ // array arms are still descended, optional or not: when an old payload happens to
21
+ // carry an optional parent, a scalar added inside it still has to be invented.
22
+ // `requiredStoreDeclarations[].annotation`, a required string inside an optional
22
23
  // array, is exactly that case and is how a plugin's registration once froze.
23
24
 
24
25
  let scalarName = (schema: S.t<unknown>): option<string> =>
@@ -58,16 +59,20 @@ let collect = (root: S.t<'a>): array<string> => {
58
59
  | Number({const: ?Some(_)})
59
60
  | Boolean({const: ?Some(_)})
60
61
  | BigInt({const: ?Some(_)})
62
+ | Undefined(_)
61
63
  | Null(_) => true
62
64
  | _ => false
63
65
  }
64
66
  )
65
67
  if !isEnum {
66
- let nullable = has.null->Option.getOr(false)
68
+ // Either optional encoding: the healer leaves an absent `T | undefined`
69
+ // alone and writes `null` for a `T | null`, so neither invents a scalar.
70
+ let optional =
71
+ has.null->Option.getOr(false) || has.undefined->Option.getOr(false)
67
72
  anyOf->Array.forEach(member =>
68
73
  switch member {
69
- | Null(_) => ()
70
- | _ if nullable && isScalar(member) => ()
74
+ | Undefined(_) | Null(_) => ()
75
+ | _ if optional && isScalar(member) => ()
71
76
  | _ => walk(member, path)
72
77
  }
73
78
  )
@@ -66,6 +66,7 @@ function collect(root) {
66
66
  return;
67
67
  }
68
68
  case "anyOf" :
69
+ let has = schema.has;
69
70
  let anyOf = schema.anyOf;
70
71
  let isEnum = anyOf.every(member => {
71
72
  switch (member.type) {
@@ -75,6 +76,7 @@ function collect(root) {
75
76
  case "boolean" :
76
77
  return member.const !== undefined;
77
78
  case "null" :
79
+ case "undefined" :
78
80
  return true;
79
81
  default:
80
82
  return false;
@@ -83,12 +85,18 @@ function collect(root) {
83
85
  if (isEnum) {
84
86
  return;
85
87
  }
86
- let nullable = Stdlib_Option.getOr(schema.has.null, false);
88
+ let optional = Stdlib_Option.getOr(has.null, false) || Stdlib_Option.getOr(has.undefined, false);
87
89
  anyOf.forEach(member => {
88
- if (member.type === "null" || nullable && Stdlib_Option.isSome(scalarName(member))) {
89
- return;
90
- } else {
91
- return walk(member, path);
90
+ switch (member.type) {
91
+ case "null" :
92
+ case "undefined" :
93
+ return;
94
+ default:
95
+ if (optional && Stdlib_Option.isSome(scalarName(member))) {
96
+ return;
97
+ } else {
98
+ return walk(member, path);
99
+ }
92
100
  }
93
101
  });
94
102
  return;
@@ -1300,6 +1300,28 @@ describe("Plugin_Structure.make — Phase 2 graph fields", () => {
1300
1300
  )->toBe(Some("currency"))
1301
1301
  })
1302
1302
 
1303
+ testSync("@sensitive flows through the PPX to x-reventless-sensitive", () => {
1304
+ expect(
1305
+ annotatedSchema
1306
+ ->getPropertyOf("contact")
1307
+ ->Option.flatMap(s => getProperty(s, "x-reventless-sensitive"))
1308
+ ->Option.flatMap(JSON.Decode.bool),
1309
+ )->toBe(Some(true))
1310
+ })
1311
+
1312
+ // The case the marker exists for. A renderer composes from an event payload,
1313
+ // and the annotation path `deriveObjectSchema` reads for state is
1314
+ // state-only — so a marker that lived there would be absent exactly where
1315
+ // the value is about to be interpolated into a message.
1316
+ testSync("@sensitive reaches an event variant's payload, not only state", () =>
1317
+ expect(
1318
+ Reventless.Sensitive.variantFieldNames(
1319
+ PsAnnotatedView.consumedEventSchema->S.castToUnknown,
1320
+ ~variant="ItemRecorded",
1321
+ ),
1322
+ )->toEqual(["contact"])
1323
+ )
1324
+
1303
1325
  testSync("@metric flows through the PPX to x-reventless-metric {aggregate,label}", () => {
1304
1326
  let metricObj =
1305
1327
  annotatedSchema
@@ -11,6 +11,7 @@ import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/component
11
11
  import * as DateTime$Reventless from "@reventlessdev/reventless-spec/src/types/DateTime.res.mjs";
12
12
  import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
13
13
  import * as Reference$Reventless from "@reventlessdev/reventless-spec/src/components/Reference.res.mjs";
14
+ import * as Sensitive$Reventless from "@reventlessdev/reventless-spec/src/components/Sensitive.res.mjs";
14
15
  import * as StorageRef$Reventless from "@reventlessdev/reventless-spec/src/semantic/StorageRef.res.mjs";
15
16
  import * as Api_Naming$ReventlessCore from "../../src/components/Api/Api_Naming.res.mjs";
16
17
  import * as PsShipOrder$ReventlessCore from "./StateChangeSlice/PsShipOrder.res.mjs";
@@ -1444,6 +1445,12 @@ globalThis.describe("Plugin_Structure.make — Phase 2 graph fields", () => {
1444
1445
  globalThis.test("@semantic(\"currency\") flows through the PPX to x-reventless-semantic", () => {
1445
1446
  globalThis.expect(Stdlib_Option.flatMap(Stdlib_Option.flatMap(getPropertyOf(annotatedSchema, "total"), s => getProperty(s, "x-reventless-semantic")), Stdlib_JSON.Decode.string)).toBe("currency");
1446
1447
  });
1448
+ globalThis.test("@sensitive flows through the PPX to x-reventless-sensitive", () => {
1449
+ globalThis.expect(Stdlib_Option.flatMap(Stdlib_Option.flatMap(getPropertyOf(annotatedSchema, "contact"), s => getProperty(s, "x-reventless-sensitive")), Stdlib_JSON.Decode.bool)).toBe(true);
1450
+ });
1451
+ globalThis.test("@sensitive reaches an event variant's payload, not only state", () => {
1452
+ globalThis.expect(Sensitive$Reventless.variantFieldNames(PsAnnotatedView$ReventlessCore.consumedEventSchema, "ItemRecorded")).toEqual(["contact"]);
1453
+ });
1447
1454
  globalThis.test("@metric flows through the PPX to x-reventless-metric {aggregate,label}", () => {
1448
1455
  let metricObj = Stdlib_Option.flatMap(getPropertyOf(annotatedSchema, "total"), s => getProperty(s, "x-reventless-metric"));
1449
1456
  globalThis.expect([
@@ -7,7 +7,16 @@
7
7
 
8
8
  @schema
9
9
  type consumedEvent =
10
- | ItemRecorded({itemId: string, ownerId: string, version: string, name: string, total: float})
10
+ | ItemRecorded({
11
+ itemId: string,
12
+ ownerId: string,
13
+ version: string,
14
+ name: string,
15
+ total: float,
16
+ // On the event, not just the state: a renderer composes from an event
17
+ // payload, so this is the case the marker has to reach.
18
+ @sensitive contact: string,
19
+ })
11
20
 
12
21
  @live(false)
13
22
  @schema
@@ -17,10 +26,11 @@ type state = {
17
26
  @index("byOwner") ownerId: string,
18
27
  name: string,
19
28
  @semantic("currency") @metric({aggregate: "sum", label: "Revenue"}) total: float,
29
+ @sensitive contact: string,
20
30
  }
21
31
 
22
32
  let project = ({event}: Reventless.StateViewSlice.consumed<consumedEvent>) =>
23
33
  switch event {
24
- | ItemRecorded({itemId, ownerId, version, name, total}) =>
25
- [Set(itemId, {itemId, ownerId, version, name, total})]
34
+ | ItemRecorded({itemId, ownerId, version, name, total, contact}) =>
35
+ [Set(itemId, {itemId, ownerId, version, name, total, contact})]
26
36
  }
@@ -3,6 +3,7 @@
3
3
  import * as Sury from "sury";
4
4
  import * as DcbTag$Reventless from "@reventlessdev/reventless-spec/src/components/DcbTag.res.mjs";
5
5
  import * as ReadModel$Reventless from "@reventlessdev/reventless-spec/src/components/ReadModel.res.mjs";
6
+ import * as Sensitive$Reventless from "@reventlessdev/reventless-spec/src/components/Sensitive.res.mjs";
6
7
  import * as StateAnnotations$Reventless from "@reventlessdev/reventless-spec/src/components/StateAnnotations.res.mjs";
7
8
 
8
9
  let consumedEventSchema = Sury.$schema(s => ({
@@ -11,7 +12,8 @@ let consumedEventSchema = Sury.$schema(s => ({
11
12
  ownerId: s.m(DcbTag$Reventless.string),
12
13
  version: s.m(Sury.string),
13
14
  name: s.m(Sury.string),
14
- total: s.m(Sury.float)
15
+ total: s.m(Sury.float),
16
+ contact: s.m(Sensitive$Reventless.string)
15
17
  }));
16
18
 
17
19
  let stateSchema = Sury.$schema(s => ({
@@ -19,7 +21,8 @@ let stateSchema = Sury.$schema(s => ({
19
21
  version: s.m(Sury.string),
20
22
  ownerId: s.m(Sury.string),
21
23
  name: s.m(Sury.string),
22
- total: s.m(Sury.float)
24
+ total: s.m(Sury.float),
25
+ contact: s.m(Sensitive$Reventless.string)
23
26
  }));
24
27
 
25
28
  function project(param) {
@@ -33,7 +36,8 @@ function project(param) {
33
36
  version: event.version,
34
37
  ownerId: event.ownerId,
35
38
  name: event.name,
36
- total: event.total
39
+ total: event.total,
40
+ contact: event.contact
37
41
  }
38
42
  }];
39
43
  }
@@ -6,20 +6,19 @@
6
6
  # one means every message stored before it decodes with a value this framework invented
7
7
  # (`""` / `0` / `false`), reported at runtime as a warning and nowhere else.
8
8
  #
9
- # So a diff here is a design decision, not a chore. If your new field can be absent, give
10
- # it the `js_nullable` (`T | null`) shape and this list does not change. If it genuinely
11
- # must be a required scalar, add the line and accept that older payloads carry a fabricated
12
- # value for it.
9
+ # So a diff here is a design decision, not a chore. If your new field can be absent, make
10
+ # it `option` and this list does not change. If it genuinely must be a required scalar, add
11
+ # the line and accept that older payloads carry a fabricated value for it.
13
12
  #
14
13
  # Regenerate ONLY after making that call — never to make a red build green.
15
14
  # See docs/analysis/plugin-definition-schema-evolution-wedge.md.
16
15
  #
17
- # A `js_nullable` (`T | null`) scalar is NOT listed: absent heals to null, which is the
18
- # shape the rule asks for. A scalar nested inside a nullable object or array IS listed —
16
+ # An optional scalar is NOT listed: absent stays absent and decodes to `None`, which is the
17
+ # shape the rule asks for. A scalar nested inside an optional object or array IS listed —
19
18
  # when an old payload carries the parent, the new field still has to be invented. That is
20
- # how requiredStoreDeclarations[].annotation, a required string inside a nullable array,
19
+ # how requiredStoreDeclarations[].annotation, a required string inside an optional array,
21
20
  # froze a plugin's registration for two days; it is absent from this list because it has
22
- # since been made `js_nullable`.
21
+ # since been made optional.
23
22
  #
24
23
  # The `.$offload.*` lines are the reference arm of an `@offload` field. They are not new
25
24
  # fields — they have been persisted since `@offload` existed. They appear here because the
@@ -94,6 +93,12 @@
94
93
  .structure.inboundTranslationSlices[].name: string
95
94
  .structure.inboundTranslationSlices[].targetName: string
96
95
  .structure.outboundTranslationSlices[].consumedEventTypes[]: string
96
+ # `consumedSources` is itself optional and is NEW, so no persisted payload
97
+ # carries the array: a stored structure heals to `None` and this line is never
98
+ # reached — the same call `traitDeclarations` made below. Required inside it
99
+ # because a source name is a topic key the slice subscribes to, and a fabricated
100
+ # `""` would name a topic that does not exist rather than saying nothing.
101
+ .structure.outboundTranslationSlices[].consumedSources[]: string
97
102
  .structure.outboundTranslationSlices[].inboundCommandTypes[]: string
98
103
  .structure.outboundTranslationSlices[].name: string
99
104
  .structure.readModels[].consumedEventTypes[]: string
@@ -105,15 +110,15 @@
105
110
  .structure.readModels[].retiredValues[]: string
106
111
  .structure.readModels[].schema: string
107
112
  .structure.readModels[].searchableFields[]: string
108
- # `requiredCapabilities` is itself `js_nullable` and is NEW, so no persisted payload
109
- # carries the array: a stored structure heals to null and these two are never reached.
113
+ # `requiredCapabilities` is itself optional and is NEW, so no persisted payload
114
+ # carries the array: a stored structure heals to `None` and these two are never reached.
110
115
  # Required inside it because a declaration naming no capability, or no declaring
111
116
  # component, is not a declaration — the same call `requiredStoreDeclarations` made for
112
117
  # `store`/`component`/`field`.
113
118
  .structure.requiredCapabilities[].capability: string
114
119
  .structure.requiredCapabilities[].component: string
115
- # `traitDeclarations` is itself `js_nullable` and is NEW, so no persisted payload
116
- # carries the array: a stored structure heals to null and these four are never
120
+ # `traitDeclarations` is itself optional and is NEW, so no persisted payload
121
+ # carries the array: a stored structure heals to `None` and these four are never
117
122
  # reached. Required inside it for the same reason the two above are — a graft
118
123
  # naming no trait, no version, no posture or no component is not a record of a
119
124
  # graft, and a fabricated `""` here would read as "grafted from nothing", which is