@contember/engine-actions 2.1.0-alpha.9 → 2.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +47 -0
- package/dist/development/index.cjs +54 -24
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +54 -24
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +24 -11
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.js +24 -11
- package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +1 -1
- package/dist/development/src/ListenerStoreProvider.cjs.map +1 -1
- package/dist/development/src/ListenerStoreProvider.js.map +1 -1
- package/dist/development/src/authorization/ActionsAuthorizationActions.cjs +2 -0
- package/dist/development/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
- package/dist/development/src/authorization/ActionsAuthorizationActions.js +2 -0
- package/dist/development/src/authorization/ActionsAuthorizationActions.js.map +1 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.js.map +1 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs +16 -14
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.js +16 -14
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
- package/dist/development/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/EventDispatcher.js.map +1 -1
- package/dist/development/src/dispatch/EventsRepository.cjs +33 -15
- package/dist/development/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/development/src/dispatch/EventsRepository.js +33 -15
- package/dist/development/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/development/src/dispatch/LazyDispatchWorker.cjs +67 -0
- package/dist/development/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
- package/dist/development/src/dispatch/LazyDispatchWorker.js +67 -0
- package/dist/development/src/dispatch/LazyDispatchWorker.js.map +1 -0
- package/dist/development/src/dispatch/ProjectDispatcher.cjs +3 -3
- package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/ProjectDispatcher.js +2 -2
- package/dist/development/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.js.map +1 -1
- package/dist/development/src/dispatch/WebhookFetcher.cjs.map +1 -1
- package/dist/development/src/dispatch/WebhookFetcher.js.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs +6 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.js +6 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.cjs +8 -11
- package/dist/development/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.js +8 -11
- package/dist/development/src/graphql/http/ActionsContextResolver.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs +6 -3
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js +6 -3
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs +7 -2
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.js +8 -3
- package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
- package/dist/development/src/graphql/schema/actions.graphql.cjs +18 -4
- package/dist/development/src/graphql/schema/actions.graphql.cjs.map +1 -1
- package/dist/development/src/graphql/schema/actions.graphql.js +18 -4
- package/dist/development/src/graphql/schema/actions.graphql.js.map +1 -1
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.cjs.map +1 -1
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -1
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
- package/dist/development/src/migrations/index.cjs +3 -1
- package/dist/development/src/migrations/index.cjs.map +1 -1
- package/dist/development/src/migrations/index.js +3 -1
- package/dist/development/src/migrations/index.js.map +1 -1
- package/dist/development/src/migrations/snapshot.cjs +5 -2
- package/dist/development/src/migrations/snapshot.cjs.map +1 -1
- package/dist/development/src/migrations/snapshot.js +5 -2
- package/dist/development/src/migrations/snapshot.js.map +1 -1
- package/dist/development/src/model/EventByIdQuery.cjs +17 -0
- package/dist/development/src/model/EventByIdQuery.cjs.map +1 -0
- package/dist/development/src/model/EventByIdQuery.js +17 -0
- package/dist/development/src/model/EventByIdQuery.js.map +1 -0
- package/dist/development/src/model/EventsInProcessingQuery.cjs.map +1 -1
- package/dist/development/src/model/EventsInProcessingQuery.js.map +1 -1
- package/dist/development/src/model/EventsToProcessQuery.cjs.map +1 -1
- package/dist/development/src/model/EventsToProcessQuery.js.map +1 -1
- package/dist/development/src/model/EventsToProcessSpecification.cjs.map +1 -1
- package/dist/development/src/model/EventsToProcessSpecification.js.map +1 -1
- package/dist/development/src/model/FailedEventsQuery.cjs.map +1 -1
- package/dist/development/src/model/FailedEventsQuery.js.map +1 -1
- package/dist/development/src/model/SetVariableCommand.cjs.map +1 -1
- package/dist/development/src/model/SetVariableCommand.js.map +1 -1
- package/dist/development/src/model/VariablesManager.cjs.map +1 -1
- package/dist/development/src/model/VariablesManager.js.map +1 -1
- package/dist/development/src/model/VariablesQuery.cjs.map +1 -1
- package/dist/development/src/model/VariablesQuery.js.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.cjs +17 -14
- package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.js +17 -14
- package/dist/development/src/triggers/TriggerHandler.js.map +1 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersFactory.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersFactory.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersStore.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +45 -16
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.js +45 -16
- package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadManager.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs +36 -20
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.js +36 -20
- package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/development/src/utils/assertNever.cjs.map +1 -1
- package/dist/development/src/utils/assertNever.js.map +1 -1
- package/dist/development/src/utils/map.cjs.map +1 -1
- package/dist/development/src/utils/map.js.map +1 -1
- package/dist/development/src/utils/notifyChannel.cjs +9 -0
- package/dist/development/src/utils/notifyChannel.cjs.map +1 -0
- package/dist/development/src/utils/notifyChannel.js +9 -0
- package/dist/development/src/utils/notifyChannel.js.map +1 -0
- package/dist/production/index.cjs +54 -24
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +54 -24
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +24 -11
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.js +24 -11
- package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +1 -1
- package/dist/production/src/ListenerStoreProvider.cjs.map +1 -1
- package/dist/production/src/ListenerStoreProvider.js.map +1 -1
- package/dist/production/src/authorization/ActionsAuthorizationActions.cjs +2 -0
- package/dist/production/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
- package/dist/production/src/authorization/ActionsAuthorizationActions.js +2 -0
- package/dist/production/src/authorization/ActionsAuthorizationActions.js.map +1 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.js.map +1 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs +16 -14
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.js +16 -14
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
- package/dist/production/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/EventDispatcher.js.map +1 -1
- package/dist/production/src/dispatch/EventsRepository.cjs +33 -15
- package/dist/production/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/production/src/dispatch/EventsRepository.js +33 -15
- package/dist/production/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/production/src/dispatch/LazyDispatchWorker.cjs +67 -0
- package/dist/production/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
- package/dist/production/src/dispatch/LazyDispatchWorker.js +67 -0
- package/dist/production/src/dispatch/LazyDispatchWorker.js.map +1 -0
- package/dist/production/src/dispatch/ProjectDispatcher.cjs +3 -3
- package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/ProjectDispatcher.js +2 -2
- package/dist/production/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.js.map +1 -1
- package/dist/production/src/dispatch/WebhookFetcher.cjs.map +1 -1
- package/dist/production/src/dispatch/WebhookFetcher.js.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs +6 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.js +6 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.cjs +8 -11
- package/dist/production/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.js +8 -11
- package/dist/production/src/graphql/http/ActionsContextResolver.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs +6 -3
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js +6 -3
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs +7 -2
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.js +8 -3
- package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
- package/dist/production/src/graphql/schema/actions.graphql.cjs +18 -4
- package/dist/production/src/graphql/schema/actions.graphql.cjs.map +1 -1
- package/dist/production/src/graphql/schema/actions.graphql.js +18 -4
- package/dist/production/src/graphql/schema/actions.graphql.js.map +1 -1
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.cjs.map +1 -1
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -1
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
- package/dist/production/src/migrations/index.cjs +3 -1
- package/dist/production/src/migrations/index.cjs.map +1 -1
- package/dist/production/src/migrations/index.js +3 -1
- package/dist/production/src/migrations/index.js.map +1 -1
- package/dist/production/src/migrations/snapshot.cjs +5 -2
- package/dist/production/src/migrations/snapshot.cjs.map +1 -1
- package/dist/production/src/migrations/snapshot.js +5 -2
- package/dist/production/src/migrations/snapshot.js.map +1 -1
- package/dist/production/src/model/EventByIdQuery.cjs +17 -0
- package/dist/production/src/model/EventByIdQuery.cjs.map +1 -0
- package/dist/production/src/model/EventByIdQuery.js +17 -0
- package/dist/production/src/model/EventByIdQuery.js.map +1 -0
- package/dist/production/src/model/EventsInProcessingQuery.cjs.map +1 -1
- package/dist/production/src/model/EventsInProcessingQuery.js.map +1 -1
- package/dist/production/src/model/EventsToProcessQuery.cjs.map +1 -1
- package/dist/production/src/model/EventsToProcessQuery.js.map +1 -1
- package/dist/production/src/model/EventsToProcessSpecification.cjs.map +1 -1
- package/dist/production/src/model/EventsToProcessSpecification.js.map +1 -1
- package/dist/production/src/model/FailedEventsQuery.cjs.map +1 -1
- package/dist/production/src/model/FailedEventsQuery.js.map +1 -1
- package/dist/production/src/model/SetVariableCommand.cjs.map +1 -1
- package/dist/production/src/model/SetVariableCommand.js.map +1 -1
- package/dist/production/src/model/VariablesManager.cjs.map +1 -1
- package/dist/production/src/model/VariablesManager.js.map +1 -1
- package/dist/production/src/model/VariablesQuery.cjs.map +1 -1
- package/dist/production/src/model/VariablesQuery.js.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.cjs +17 -14
- package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.js +17 -14
- package/dist/production/src/triggers/TriggerHandler.js.map +1 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersFactory.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersFactory.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersStore.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +45 -16
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.js +45 -16
- package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadManager.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs +36 -20
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.js +36 -20
- package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/production/src/utils/assertNever.cjs.map +1 -1
- package/dist/production/src/utils/assertNever.js.map +1 -1
- package/dist/production/src/utils/map.cjs.map +1 -1
- package/dist/production/src/utils/map.js.map +1 -1
- package/dist/production/src/utils/notifyChannel.cjs +9 -0
- package/dist/production/src/utils/notifyChannel.cjs.map +1 -0
- package/dist/production/src/utils/notifyChannel.js +9 -0
- package/dist/production/src/utils/notifyChannel.js.map +1 -0
- package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts +2 -0
- package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ActionsExecutionContainerHookFactory.d.ts.map +1 -1
- package/dist/types/authorization/ActionsAuthorizationActions.d.ts +10 -0
- package/dist/types/authorization/ActionsAuthorizationActions.d.ts.map +1 -1
- package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -1
- package/dist/types/dispatch/EventDispatcher.d.ts.map +1 -1
- package/dist/types/dispatch/EventsRepository.d.ts +2 -1
- package/dist/types/dispatch/EventsRepository.d.ts.map +1 -1
- package/dist/types/dispatch/LazyDispatchWorker.d.ts +11 -0
- package/dist/types/dispatch/LazyDispatchWorker.d.ts.map +1 -0
- package/dist/types/dispatch/ProjectDispatcher.d.ts.map +1 -1
- package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
- package/dist/types/dispatch/types.d.ts +1 -1
- package/dist/types/dispatch/types.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsContextResolver.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/ActionsContext.d.ts +3 -0
- package/dist/types/graphql/resolvers/ActionsContext.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts +4 -2
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts +11 -0
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts.map +1 -0
- package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts +11 -0
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts.map +1 -0
- package/dist/types/graphql/resolvers/mutation/index.d.ts +2 -0
- package/dist/types/graphql/resolvers/mutation/index.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +3 -0
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -1
- package/dist/types/graphql/schema/actions.graphql.d.ts.map +1 -1
- package/dist/types/graphql/schema/index.d.ts +45 -2
- package/dist/types/graphql/schema/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/migrations/2023-03-10-145000-actions-variables.d.ts.map +1 -1
- package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts +3 -0
- package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts.map +1 -0
- package/dist/types/migrations/index.d.ts.map +1 -1
- package/dist/types/migrations/snapshot.d.ts.map +1 -1
- package/dist/types/model/EventByIdQuery.d.ts +8 -0
- package/dist/types/model/EventByIdQuery.d.ts.map +1 -0
- package/dist/types/model/EventsToProcessSpecification.d.ts.map +1 -1
- package/dist/types/model/SetVariableCommand.d.ts.map +1 -1
- package/dist/types/model/types.d.ts +3 -0
- package/dist/types/model/types.d.ts.map +1 -1
- package/dist/types/triggers/TriggerHandler.d.ts.map +1 -1
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +11 -3
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListeners.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListenersBuilder.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListenersStore.d.ts +2 -2
- package/dist/types/triggers/TriggerListenersStore.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadManager.d.ts +2 -1
- package/dist/types/triggers/TriggerPayloadManager.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadPersister.d.ts +9 -4
- package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/utils/notifyChannel.d.ts +4 -0
- package/dist/types/utils/notifyChannel.d.ts.map +1 -0
- package/graphql.codegen.yml +2 -2
- package/package.json +26 -21
- package/src/ActionsExecutionContainerHookFactory.ts +27 -11
- package/src/authorization/ActionsAuthorizationActions.ts +2 -0
- package/src/dispatch/DispatchWorkerSupervisor.ts +17 -16
- package/src/dispatch/EventDispatcher.ts +0 -2
- package/src/dispatch/EventsRepository.ts +63 -43
- package/src/dispatch/LazyDispatchWorker.ts +72 -0
- package/src/dispatch/ProjectDispatcher.ts +6 -11
- package/src/dispatch/WebhookTargetHandler.ts +18 -9
- package/src/dispatch/types.ts +1 -2
- package/src/graphql/http/ActionsApiMiddlewareFactory.ts +7 -5
- package/src/graphql/http/ActionsContextResolver.ts +1 -2
- package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +0 -1
- package/src/graphql/http/ActionsWebsocketControllerFactory.ts +7 -5
- package/src/graphql/resolvers/ActionsContext.ts +1 -0
- package/src/graphql/resolvers/ResolversFactory.ts +9 -2
- package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +22 -0
- package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +0 -1
- package/src/graphql/resolvers/mutation/StopEventMutationResolver.ts +19 -0
- package/src/graphql/resolvers/mutation/index.ts +2 -0
- package/src/graphql/resolvers/query/EventsQueryResolver.ts +15 -8
- package/src/graphql/resolvers/query/VariablesQueryResolver.ts +0 -1
- package/src/graphql/schema/actions.graphql.ts +18 -4
- package/src/graphql/schema/index.ts +84 -30
- package/src/index.ts +66 -35
- package/src/migrations/2023-03-10-145000-actions-variables.ts +1 -1
- package/src/migrations/2025-05-28-160000-action-event-user.ts +16 -0
- package/src/migrations/index.ts +2 -0
- package/src/migrations/snapshot.ts +6 -3
- package/src/model/EventByIdQuery.ts +21 -0
- package/src/model/EventsToProcessSpecification.ts +9 -8
- package/src/model/SetVariableCommand.ts +0 -1
- package/src/model/types.ts +3 -0
- package/src/triggers/TriggerHandler.ts +16 -15
- package/src/triggers/TriggerIndirectChangesFetcher.ts +62 -3
- package/src/triggers/TriggerListeners.ts +1 -8
- package/src/triggers/TriggerListenersBuilder.ts +3 -6
- package/src/triggers/TriggerListenersStore.ts +2 -2
- package/src/triggers/TriggerPayloadBuilder.ts +43 -13
- package/src/triggers/TriggerPayloadManager.ts +2 -4
- package/src/triggers/TriggerPayloadPersister.ts +28 -10
- package/src/utils/notifyChannel.ts +6 -0
- package/tests/cases/unit/generator.test.ts +133 -136
- package/tests/cases/unit/lazyDispatchWorker.test.ts +226 -0
- package/tests/cases/unit/webhookHandler.test.ts +47 -35
- package/vitest.config.ts +0 -3
|
@@ -47,27 +47,27 @@ class TriggerHandler {
|
|
|
47
47
|
}
|
|
48
48
|
async directUpdateHandler(event) {
|
|
49
49
|
const updateListeners = this.listenersStore.getUpdateListeners(event.entity.name);
|
|
50
|
-
updateListeners.map((listener) => {
|
|
50
|
+
await Promise.all(updateListeners.map((listener) => {
|
|
51
51
|
if (event.data.some((it) => listener.fields.has(it.fieldName) && it.value !== it.old)) {
|
|
52
|
-
this.payloadManager.add({
|
|
52
|
+
return this.payloadManager.add({
|
|
53
53
|
listener,
|
|
54
54
|
entity: event.entity,
|
|
55
55
|
primary: event.id,
|
|
56
56
|
cause: event
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
-
});
|
|
59
|
+
}));
|
|
60
60
|
}
|
|
61
61
|
async directCreateHandler(event) {
|
|
62
62
|
const createListeners = this.listenersStore.getCreateListener(event.entity.name);
|
|
63
|
-
createListeners.map((listener) => {
|
|
64
|
-
this.payloadManager.add({
|
|
63
|
+
await Promise.all(createListeners.map((listener) => {
|
|
64
|
+
return this.payloadManager.add({
|
|
65
65
|
listener,
|
|
66
66
|
entity: event.entity,
|
|
67
67
|
primary: event.id,
|
|
68
68
|
cause: event
|
|
69
69
|
});
|
|
70
|
-
});
|
|
70
|
+
}));
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
73
|
* Collect affected triggers after entity was created or before it was deleted.
|
|
@@ -75,9 +75,11 @@ class TriggerHandler {
|
|
|
75
75
|
*/
|
|
76
76
|
async indirectChangesEntityHandler(event) {
|
|
77
77
|
const indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name);
|
|
78
|
-
const promises = indirectEntityListeners.map(
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
const promises = indirectEntityListeners.map(
|
|
79
|
+
(listener) => this.collectDeepChanges(event, listener, {
|
|
80
|
+
[event.entity.primary]: { eq: event.id }
|
|
81
|
+
})
|
|
82
|
+
);
|
|
81
83
|
await Promise.all(promises);
|
|
82
84
|
}
|
|
83
85
|
async indirectChangesRelationHandler(event) {
|
|
@@ -110,14 +112,15 @@ class TriggerHandler {
|
|
|
110
112
|
}
|
|
111
113
|
async collectDeepChanges(cause, listener, where) {
|
|
112
114
|
const result = await this.changesFetcher.fetch(listener, where);
|
|
113
|
-
|
|
114
|
-
this.payloadManager.add({
|
|
115
|
+
await Promise.all(result.map((row) => {
|
|
116
|
+
return this.payloadManager.add({
|
|
115
117
|
listener,
|
|
116
118
|
entity: listener.rootEntity,
|
|
117
|
-
primary: row,
|
|
118
|
-
cause
|
|
119
|
+
primary: row.id,
|
|
120
|
+
cause,
|
|
121
|
+
nodes: row.nodes
|
|
119
122
|
});
|
|
120
|
-
}
|
|
123
|
+
}));
|
|
121
124
|
}
|
|
122
125
|
}
|
|
123
126
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerHandler.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\
|
|
1
|
+
{"version":3,"file":"TriggerHandler.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tawait Promise.all(updateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\treturn this.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t}))\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tawait Promise.all(createListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener =>\n\t\t\tthis.collectDeepChanges(event, listener, {\n\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t})\n\t\t)\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tawait Promise.all(result.map(row => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row.id,\n\t\t\t\tcause,\n\t\t\t\tnodes: row.nodes,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const Database = require("@contember/database");
|
|
4
|
+
const schemaUtils = require("@contember/schema-utils");
|
|
4
5
|
class TriggerIndirectChangesFetcher {
|
|
5
|
-
constructor(mapper, whereBuilder, pathFactory) {
|
|
6
|
+
constructor(model, mapper, whereBuilder, joinBuilder, pathFactory) {
|
|
7
|
+
this.model = model;
|
|
6
8
|
this.mapper = mapper;
|
|
7
9
|
this.whereBuilder = whereBuilder;
|
|
10
|
+
this.joinBuilder = joinBuilder;
|
|
8
11
|
this.pathFactory = pathFactory;
|
|
9
12
|
}
|
|
10
13
|
async fetch(listener, where) {
|
|
14
|
+
if (listener.trigger.withNodes) {
|
|
15
|
+
return this.fetchWithNodes(listener, where);
|
|
16
|
+
}
|
|
11
17
|
for (let i = listener.path.length - 1; i >= 0; i--) {
|
|
12
18
|
where = { [listener.path[i]]: where };
|
|
13
19
|
}
|
|
14
20
|
const qb = Database.SelectBuilder.create().from(listener.rootEntity.tableName, "root_").select(["root_", listener.rootEntity.primaryColumn], "id");
|
|
15
21
|
const path = this.pathFactory.create([]);
|
|
16
22
|
const qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where);
|
|
17
|
-
return
|
|
23
|
+
return await qbWithWhere.getResult(this.mapper.db);
|
|
24
|
+
}
|
|
25
|
+
async fetchWithNodes(listener, where) {
|
|
26
|
+
const basePath = this.pathFactory.create([]);
|
|
27
|
+
let path = basePath;
|
|
28
|
+
let entity = listener.rootEntity;
|
|
29
|
+
let qb = Database.SelectBuilder.create().from(entity.tableName, path.alias).select([path.alias, entity.primaryColumn], path.for(entity.primary).alias);
|
|
30
|
+
for (let i = 0; i < listener.path.length; i++) {
|
|
31
|
+
const relationName = listener.path[i];
|
|
32
|
+
path = path.for(relationName);
|
|
33
|
+
const targetEntity = schemaUtils.getTargetEntity(this.model, entity, relationName);
|
|
34
|
+
if (!targetEntity) {
|
|
35
|
+
throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`);
|
|
36
|
+
}
|
|
37
|
+
qb = this.joinBuilder.join(qb, path, entity, relationName);
|
|
38
|
+
entity = targetEntity;
|
|
39
|
+
qb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias);
|
|
40
|
+
}
|
|
41
|
+
const qbWithWhere = this.whereBuilder.build(qb, entity, path, where);
|
|
42
|
+
const result = await qbWithWhere.getResult(this.mapper.db);
|
|
43
|
+
return result.map((row) => {
|
|
44
|
+
const nodes = [];
|
|
45
|
+
let entity2 = listener.rootEntity;
|
|
46
|
+
let path2 = basePath;
|
|
47
|
+
const id = row[path2.for(entity2.primary).alias];
|
|
48
|
+
for (let i = 0; i < listener.path.length; i++) {
|
|
49
|
+
const relationName = listener.path[i];
|
|
50
|
+
const targetEntity = schemaUtils.getTargetEntity(this.model, entity2, relationName);
|
|
51
|
+
if (!targetEntity) {
|
|
52
|
+
throw new Error(`Target entity for relation ${entity2.name}::${relationName} not found`);
|
|
53
|
+
}
|
|
54
|
+
path2 = path2.for(relationName);
|
|
55
|
+
nodes.push({ relation: relationName, entity: targetEntity.name, id: row[path2.for(targetEntity.primary).alias] });
|
|
56
|
+
entity2 = targetEntity;
|
|
57
|
+
}
|
|
58
|
+
return { id, nodes };
|
|
59
|
+
});
|
|
18
60
|
}
|
|
19
61
|
}
|
|
20
62
|
exports.TriggerIndirectChangesFetcher = TriggerIndirectChangesFetcher;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerIndirectChangesFetcher.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { Input } from '@contember/schema'\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<
|
|
1
|
+
{"version":3,"file":"TriggerIndirectChangesFetcher.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["SelectBuilder","getTargetEntity","entity","path"],"mappings":";;;;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,MACZ,UACA,OAC+C;AAC/C,QAAI,SAAS,QAAQ,WAAW;AAC/B,aAAO,KAAK,eAAe,UAAU,KAAK;AAAA,IAC3C;AAEA,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAA;AAAA,IAC/B;AACA,UAAM,KAAKA,SAAAA,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EACnD;AAAA,EAEA,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AACtB,QAAI,KAAKA,uBAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,YAAM,eAAe,SAAS,KAAK,CAAC;AACpC,aAAO,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAeC,YAAAA,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MACvF;AACA,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEzD,eAAS;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAC9F;AAEA,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAEzD,WAAO,OAAO,IAAI,CAAA,QAAO;AACxB,YAAM,QAA8C,CAAA;AACpD,UAAIC,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,cAAM,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAeD,YAAAA,gBAAgB,KAAK,OAAOC,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QACvF;AACAC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MACV;AACA,aAAO,EAAE,IAAI,MAAA;AAAA,IACd,CAAC;AAAA,EACF;AACD;;"}
|
|
@@ -1,18 +1,60 @@
|
|
|
1
1
|
import { SelectBuilder } from "@contember/database";
|
|
2
|
+
import { getTargetEntity } from "@contember/schema-utils";
|
|
2
3
|
class TriggerIndirectChangesFetcher {
|
|
3
|
-
constructor(mapper, whereBuilder, pathFactory) {
|
|
4
|
+
constructor(model, mapper, whereBuilder, joinBuilder, pathFactory) {
|
|
5
|
+
this.model = model;
|
|
4
6
|
this.mapper = mapper;
|
|
5
7
|
this.whereBuilder = whereBuilder;
|
|
8
|
+
this.joinBuilder = joinBuilder;
|
|
6
9
|
this.pathFactory = pathFactory;
|
|
7
10
|
}
|
|
8
11
|
async fetch(listener, where) {
|
|
12
|
+
if (listener.trigger.withNodes) {
|
|
13
|
+
return this.fetchWithNodes(listener, where);
|
|
14
|
+
}
|
|
9
15
|
for (let i = listener.path.length - 1; i >= 0; i--) {
|
|
10
16
|
where = { [listener.path[i]]: where };
|
|
11
17
|
}
|
|
12
18
|
const qb = SelectBuilder.create().from(listener.rootEntity.tableName, "root_").select(["root_", listener.rootEntity.primaryColumn], "id");
|
|
13
19
|
const path = this.pathFactory.create([]);
|
|
14
20
|
const qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where);
|
|
15
|
-
return
|
|
21
|
+
return await qbWithWhere.getResult(this.mapper.db);
|
|
22
|
+
}
|
|
23
|
+
async fetchWithNodes(listener, where) {
|
|
24
|
+
const basePath = this.pathFactory.create([]);
|
|
25
|
+
let path = basePath;
|
|
26
|
+
let entity = listener.rootEntity;
|
|
27
|
+
let qb = SelectBuilder.create().from(entity.tableName, path.alias).select([path.alias, entity.primaryColumn], path.for(entity.primary).alias);
|
|
28
|
+
for (let i = 0; i < listener.path.length; i++) {
|
|
29
|
+
const relationName = listener.path[i];
|
|
30
|
+
path = path.for(relationName);
|
|
31
|
+
const targetEntity = getTargetEntity(this.model, entity, relationName);
|
|
32
|
+
if (!targetEntity) {
|
|
33
|
+
throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`);
|
|
34
|
+
}
|
|
35
|
+
qb = this.joinBuilder.join(qb, path, entity, relationName);
|
|
36
|
+
entity = targetEntity;
|
|
37
|
+
qb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias);
|
|
38
|
+
}
|
|
39
|
+
const qbWithWhere = this.whereBuilder.build(qb, entity, path, where);
|
|
40
|
+
const result = await qbWithWhere.getResult(this.mapper.db);
|
|
41
|
+
return result.map((row) => {
|
|
42
|
+
const nodes = [];
|
|
43
|
+
let entity2 = listener.rootEntity;
|
|
44
|
+
let path2 = basePath;
|
|
45
|
+
const id = row[path2.for(entity2.primary).alias];
|
|
46
|
+
for (let i = 0; i < listener.path.length; i++) {
|
|
47
|
+
const relationName = listener.path[i];
|
|
48
|
+
const targetEntity = getTargetEntity(this.model, entity2, relationName);
|
|
49
|
+
if (!targetEntity) {
|
|
50
|
+
throw new Error(`Target entity for relation ${entity2.name}::${relationName} not found`);
|
|
51
|
+
}
|
|
52
|
+
path2 = path2.for(relationName);
|
|
53
|
+
nodes.push({ relation: relationName, entity: targetEntity.name, id: row[path2.for(targetEntity.primary).alias] });
|
|
54
|
+
entity2 = targetEntity;
|
|
55
|
+
}
|
|
56
|
+
return { id, nodes };
|
|
57
|
+
});
|
|
16
58
|
}
|
|
17
59
|
}
|
|
18
60
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerIndirectChangesFetcher.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { Input } from '@contember/schema'\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<
|
|
1
|
+
{"version":3,"file":"TriggerIndirectChangesFetcher.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["entity","path"],"mappings":";;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,MACZ,UACA,OAC+C;AAC/C,QAAI,SAAS,QAAQ,WAAW;AAC/B,aAAO,KAAK,eAAe,UAAU,KAAK;AAAA,IAC3C;AAEA,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAA;AAAA,IAC/B;AACA,UAAM,KAAK,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EACnD;AAAA,EAEA,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AACtB,QAAI,KAAK,cAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,YAAM,eAAe,SAAS,KAAK,CAAC;AACpC,aAAO,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAe,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MACvF;AACA,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEzD,eAAS;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAC9F;AAEA,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAEzD,WAAO,OAAO,IAAI,CAAA,QAAO;AACxB,YAAM,QAA8C,CAAA;AACpD,UAAIA,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,cAAM,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAe,gBAAgB,KAAK,OAAOA,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QACvF;AACAC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MACV;AACA,aAAO,EAAE,IAAI,MAAA;AAAA,IACd,CAAC;AAAA,EACF;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerListenersBuilder.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class TriggerListenerBuilder {\n\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never\n\t>\n\t(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["ImplementationException","getEntity","acceptFieldVisitor","entity","TriggerListenersStore","mapGetOrPut"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TriggerListenersBuilder.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class TriggerListenerBuilder {\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t;((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,\n\t>(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["ImplementationException","getEntity","acceptFieldVisitor","entity","TriggerListenersStore","mapGetOrPut"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerListenersBuilder.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class TriggerListenerBuilder {\n\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never\n\t>\n\t(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["entity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TriggerListenersBuilder.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class TriggerListenerBuilder {\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t;((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,\n\t>(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["entity"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerListenersFactory.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":["TriggerListenerBuilder"],"mappings":";;;AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"TriggerListenersFactory.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":["TriggerListenerBuilder"],"mappings":";;;AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEO,SAAgC;AACtC,UAAM,UAAU,IAAIA,wBAAAA,uBAAuB,KAAK,OAAO,KAAK;AAC5D,eAAW,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClE,cAAQ,IAAI,OAAO;AAAA,IACpB;AAEA,WAAO,QAAQ,YAAA;AAAA,EAChB;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerListenersFactory.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"TriggerListenersFactory.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEO,SAAgC;AACtC,UAAM,UAAU,IAAI,uBAAuB,KAAK,OAAO,KAAK;AAC5D,eAAW,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClE,cAAQ,IAAI,OAAO;AAAA,IACpB;AAEA,WAAO,QAAQ,YAAA;AAAA,EAChB;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerListenersStore.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.
|
|
1
|
+
{"version":3,"file":"TriggerListenersStore.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":";;AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAElB;AAAA,EAEO,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC5D;AAAA,EAEO,qBAAqB,YAAoB,cAA0C;AACzF,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAA;AAAA,EAC/E;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerListenersStore.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.
|
|
1
|
+
{"version":3,"file":"TriggerListenersStore.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":"AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAElB;AAAA,EAEO,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC5D;AAAA,EAEO,qBAAqB,YAAoB,cAA0C;AACzF,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAA;AAAA,EAC/E;AACD;"}
|
|
@@ -17,7 +17,10 @@ class TriggerPayloadBuilder {
|
|
|
17
17
|
const selections = await this.fetchSelection(filteredEvents);
|
|
18
18
|
const triggerType = filteredEvents[0].listener.trigger.type;
|
|
19
19
|
if (triggerType === "basic") {
|
|
20
|
-
return filteredEvents.map((it) => ({
|
|
20
|
+
return filteredEvents.map((it) => ({
|
|
21
|
+
trigger: it.listener.trigger.name,
|
|
22
|
+
...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary])
|
|
23
|
+
}));
|
|
21
24
|
}
|
|
22
25
|
if (triggerType === "watch") {
|
|
23
26
|
return this.buildWatchEventPayloads(filteredEvents, selections);
|
|
@@ -27,9 +30,13 @@ class TriggerPayloadBuilder {
|
|
|
27
30
|
async preprocessEvent(event) {
|
|
28
31
|
if (event.listener.type === "delete" && event.listener.trigger.selection) {
|
|
29
32
|
const input = this.convertSelectionNode(event.listener.trigger.selection);
|
|
30
|
-
const selection = await this.mapper.selectUnique(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
const selection = await this.mapper.selectUnique(
|
|
34
|
+
event.entity,
|
|
35
|
+
input.withArg("by", {
|
|
36
|
+
[event.entity.primary]: event.primary
|
|
37
|
+
}),
|
|
38
|
+
[]
|
|
39
|
+
);
|
|
33
40
|
return { ...event, selection };
|
|
34
41
|
}
|
|
35
42
|
return event;
|
|
@@ -43,13 +50,24 @@ class TriggerPayloadBuilder {
|
|
|
43
50
|
}
|
|
44
51
|
const payloads = [];
|
|
45
52
|
for (const eventsByPrimary of Object.values(byPrimary)) {
|
|
53
|
+
const baseEvents = [];
|
|
54
|
+
const existingEvents = /* @__PURE__ */ new Set();
|
|
55
|
+
for (const event of eventsByPrimary.events) {
|
|
56
|
+
const baseEvent = this.buildBaseEventPayloads(event);
|
|
57
|
+
const stringRepresentation = JSON.stringify(baseEvent);
|
|
58
|
+
if (existingEvents.has(stringRepresentation)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
existingEvents.add(stringRepresentation);
|
|
62
|
+
baseEvents.push(baseEvent);
|
|
63
|
+
}
|
|
46
64
|
payloads.push({
|
|
47
65
|
operation: "watch",
|
|
48
66
|
trigger: events[0].listener.trigger.name,
|
|
49
67
|
entity: events[0].entity.name,
|
|
50
68
|
id: eventsByPrimary.primary,
|
|
51
69
|
selection: eventsByPrimary.events.find((it) => it.selection)?.selection ?? selections[eventsByPrimary.primary],
|
|
52
|
-
events:
|
|
70
|
+
events: baseEvents
|
|
53
71
|
});
|
|
54
72
|
}
|
|
55
73
|
return payloads;
|
|
@@ -63,7 +81,8 @@ class TriggerPayloadBuilder {
|
|
|
63
81
|
id: event.cause.id,
|
|
64
82
|
selection,
|
|
65
83
|
values: Object.fromEntries(event.cause.data.map((it) => [it.fieldName, it.value])),
|
|
66
|
-
path: "path" in event.listener ? event.listener.path : void 0
|
|
84
|
+
path: "path" in event.listener ? event.listener.path : void 0,
|
|
85
|
+
nodes: event.nodes
|
|
67
86
|
};
|
|
68
87
|
case "AfterUpdateEvent":
|
|
69
88
|
case "BeforeUpdateEvent":
|
|
@@ -78,7 +97,8 @@ class TriggerPayloadBuilder {
|
|
|
78
97
|
selection,
|
|
79
98
|
values: Object.fromEntries(event.cause.data.map((it) => [it.fieldName, it.value])),
|
|
80
99
|
path: "path" in event.listener ? event.listener.path : void 0,
|
|
81
|
-
old: Object.fromEntries(afterEvent.data.map((it) => [it.fieldName, it.old]))
|
|
100
|
+
old: Object.fromEntries(afterEvent.data.map((it) => [it.fieldName, it.old])),
|
|
101
|
+
nodes: event.nodes
|
|
82
102
|
};
|
|
83
103
|
case "BeforeDeleteEvent":
|
|
84
104
|
return {
|
|
@@ -86,7 +106,8 @@ class TriggerPayloadBuilder {
|
|
|
86
106
|
entity: event.cause.entity.name,
|
|
87
107
|
id: event.cause.id,
|
|
88
108
|
selection,
|
|
89
|
-
path: "path" in event.listener ? event.listener.path : void 0
|
|
109
|
+
path: "path" in event.listener ? event.listener.path : void 0,
|
|
110
|
+
nodes: event.nodes
|
|
90
111
|
};
|
|
91
112
|
case "AfterJunctionUpdateEvent":
|
|
92
113
|
if (event.listener.type !== "junction") {
|
|
@@ -99,7 +120,8 @@ class TriggerPayloadBuilder {
|
|
|
99
120
|
relation: event.listener.context.relation.name,
|
|
100
121
|
id,
|
|
101
122
|
inverseId,
|
|
102
|
-
path: "path" in event.listener ? event.listener.path : void 0
|
|
123
|
+
path: "path" in event.listener ? event.listener.path : void 0,
|
|
124
|
+
nodes: event.nodes
|
|
103
125
|
};
|
|
104
126
|
default:
|
|
105
127
|
assertNever.assertNever(event.cause, (it) => it.type);
|
|
@@ -121,13 +143,20 @@ class TriggerPayloadBuilder {
|
|
|
121
143
|
return await this.mapper.selectAssoc(entity, input, [], entity.primary);
|
|
122
144
|
}
|
|
123
145
|
convertSelectionNode(node, nodeName = "root", path = []) {
|
|
124
|
-
return new engineContentApi.ObjectNode(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
146
|
+
return new engineContentApi.ObjectNode(
|
|
147
|
+
nodeName,
|
|
148
|
+
nodeName,
|
|
149
|
+
node.map((it) => {
|
|
150
|
+
const [field, args, selection] = Array.isArray(it) ? it : [it, void 0, void 0];
|
|
151
|
+
if (selection === void 0 || selection.length === 0) {
|
|
152
|
+
return new engineContentApi.FieldNode(field, field, {});
|
|
153
|
+
}
|
|
154
|
+
return this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args);
|
|
155
|
+
}),
|
|
156
|
+
{},
|
|
157
|
+
{},
|
|
158
|
+
path
|
|
159
|
+
);
|
|
131
160
|
}
|
|
132
161
|
}
|
|
133
162
|
exports.TriggerPayloadBuilder = TriggerPayloadBuilder;
|