@webiny/tasks 6.3.0 → 6.4.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/context.js +36 -42
  2. package/context.js.map +1 -1
  3. package/crud/TaskLogPrivateModel.js +33 -27
  4. package/crud/TaskLogPrivateModel.js.map +1 -1
  5. package/crud/TaskPrivateModel.js +48 -39
  6. package/crud/TaskPrivateModel.js.map +1 -1
  7. package/crud/cleanupTaskSubtree.js +55 -69
  8. package/crud/cleanupTaskSubtree.js.map +1 -1
  9. package/crud/crud.tasks.js +289 -352
  10. package/crud/crud.tasks.js.map +1 -1
  11. package/crud/definition.tasks.js +13 -16
  12. package/crud/definition.tasks.js.map +1 -1
  13. package/crud/service.tasks.js +119 -155
  14. package/crud/service.tasks.js.map +1 -1
  15. package/decorators/RunnableTaskDecorator.js +61 -77
  16. package/decorators/RunnableTaskDecorator.js.map +1 -1
  17. package/decorators/SelfCleaningTaskDecorator.js +75 -89
  18. package/decorators/SelfCleaningTaskDecorator.js.map +1 -1
  19. package/domain/errors.js +35 -39
  20. package/domain/errors.js.map +1 -1
  21. package/events/TaskAfterCreateEvent.js +8 -5
  22. package/events/TaskAfterCreateEvent.js.map +1 -1
  23. package/events/TaskAfterDeleteEvent.js +8 -5
  24. package/events/TaskAfterDeleteEvent.js.map +1 -1
  25. package/events/TaskAfterUpdateEvent.js +8 -5
  26. package/events/TaskAfterUpdateEvent.js.map +1 -1
  27. package/events/TaskBeforeCreateEvent.js +8 -5
  28. package/events/TaskBeforeCreateEvent.js.map +1 -1
  29. package/events/TaskBeforeDeleteEvent.js +8 -5
  30. package/events/TaskBeforeDeleteEvent.js.map +1 -1
  31. package/events/TaskBeforeUpdateEvent.js +8 -5
  32. package/events/TaskBeforeUpdateEvent.js.map +1 -1
  33. package/events/abstractions.js +7 -36
  34. package/events/abstractions.js.map +1 -1
  35. package/events/index.js +0 -2
  36. package/features/AbortTask/AbortTaskUseCase.js +9 -8
  37. package/features/AbortTask/AbortTaskUseCase.js.map +1 -1
  38. package/features/AbortTask/abstractions.js +2 -1
  39. package/features/AbortTask/abstractions.js.map +1 -1
  40. package/features/AbortTask/feature.js +6 -5
  41. package/features/AbortTask/feature.js.map +1 -1
  42. package/features/AbortTask/index.js +0 -2
  43. package/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js +8 -7
  44. package/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js.map +1 -1
  45. package/features/CleanupTaskSubtree/abstractions.js +2 -1
  46. package/features/CleanupTaskSubtree/abstractions.js.map +1 -1
  47. package/features/CleanupTaskSubtree/index.js +0 -2
  48. package/features/GetTask/GetTaskUseCase.js +8 -7
  49. package/features/GetTask/GetTaskUseCase.js.map +1 -1
  50. package/features/GetTask/abstractions.js +2 -1
  51. package/features/GetTask/abstractions.js.map +1 -1
  52. package/features/GetTask/feature.js +6 -5
  53. package/features/GetTask/feature.js.map +1 -1
  54. package/features/GetTask/index.js +0 -2
  55. package/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +18 -16
  56. package/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +1 -1
  57. package/features/GetTaskDefinition/abstractions.js +2 -1
  58. package/features/GetTaskDefinition/abstractions.js.map +1 -1
  59. package/features/GetTaskDefinition/feature.js +6 -5
  60. package/features/GetTaskDefinition/feature.js.map +1 -1
  61. package/features/GetTaskDefinition/index.js +0 -2
  62. package/features/ListTaskDefinitions/ListTaskDefinitionsUseCase.js +18 -12
  63. package/features/ListTaskDefinitions/ListTaskDefinitionsUseCase.js.map +1 -1
  64. package/features/ListTaskDefinitions/abstractions.js +2 -1
  65. package/features/ListTaskDefinitions/abstractions.js.map +1 -1
  66. package/features/ListTaskDefinitions/feature.js +6 -5
  67. package/features/ListTaskDefinitions/feature.js.map +1 -1
  68. package/features/ListTaskDefinitions/index.js +0 -2
  69. package/features/ListTasks/ListTasksUseCase.js +8 -7
  70. package/features/ListTasks/ListTasksUseCase.js.map +1 -1
  71. package/features/ListTasks/abstractions.js +2 -1
  72. package/features/ListTasks/abstractions.js.map +1 -1
  73. package/features/ListTasks/feature.js +6 -5
  74. package/features/ListTasks/feature.js.map +1 -1
  75. package/features/ListTasks/index.js +0 -2
  76. package/features/TaskController/TaskController.js +60 -60
  77. package/features/TaskController/TaskController.js.map +1 -1
  78. package/features/TaskController/augmentation.js +0 -3
  79. package/features/TaskController/index.js +0 -5
  80. package/features/TaskExecutionContext/TaskExecutionContext.js +38 -45
  81. package/features/TaskExecutionContext/TaskExecutionContext.js.map +1 -1
  82. package/features/TaskExecutionContext/abstractions.js +2 -10
  83. package/features/TaskExecutionContext/abstractions.js.map +1 -1
  84. package/features/TaskExecutionContext/feature.js +6 -5
  85. package/features/TaskExecutionContext/feature.js.map +1 -1
  86. package/features/TaskExecutionContext/index.js +0 -2
  87. package/features/TriggerTask/TriggerTaskUseCase.js +9 -8
  88. package/features/TriggerTask/TriggerTaskUseCase.js.map +1 -1
  89. package/features/TriggerTask/abstractions.js +2 -1
  90. package/features/TriggerTask/abstractions.js.map +1 -1
  91. package/features/TriggerTask/feature.js +6 -5
  92. package/features/TriggerTask/feature.js.map +1 -1
  93. package/features/TriggerTask/index.js +0 -2
  94. package/global.js +0 -2
  95. package/graphql/checkPermissions.js +16 -35
  96. package/graphql/checkPermissions.js.map +1 -1
  97. package/graphql/index.js +154 -187
  98. package/graphql/index.js.map +1 -1
  99. package/graphql/utils.js +15 -14
  100. package/graphql/utils.js.map +1 -1
  101. package/handler/index.js +46 -53
  102. package/handler/index.js.map +1 -1
  103. package/handler/register.js +7 -15
  104. package/handler/register.js.map +1 -1
  105. package/handler/types.js +0 -3
  106. package/index.js +2 -4
  107. package/package.json +17 -17
  108. package/plugins/TaskServicePlugin.js +9 -6
  109. package/plugins/TaskServicePlugin.js.map +1 -1
  110. package/plugins/index.js +0 -2
  111. package/response/DatabaseResponse.js +113 -132
  112. package/response/DatabaseResponse.js.map +1 -1
  113. package/response/Response.js +78 -96
  114. package/response/Response.js.map +1 -1
  115. package/response/ResponseAbortedResult.js +8 -7
  116. package/response/ResponseAbortedResult.js.map +1 -1
  117. package/response/ResponseContinueResult.js +12 -14
  118. package/response/ResponseContinueResult.js.map +1 -1
  119. package/response/ResponseDoneResult.js +10 -9
  120. package/response/ResponseDoneResult.js.map +1 -1
  121. package/response/ResponseErrorResult.js +9 -8
  122. package/response/ResponseErrorResult.js.map +1 -1
  123. package/response/TaskResponse.js +44 -64
  124. package/response/TaskResponse.js.map +1 -1
  125. package/response/abstractions/Response.js +0 -3
  126. package/response/abstractions/ResponseAbortedResult.js +0 -3
  127. package/response/abstractions/ResponseBaseResult.js +0 -3
  128. package/response/abstractions/ResponseContinueResult.js +0 -3
  129. package/response/abstractions/ResponseDoneResult.js +0 -3
  130. package/response/abstractions/ResponseErrorResult.js +0 -3
  131. package/response/abstractions/TaskResponse.js +0 -3
  132. package/response/abstractions/index.js +0 -2
  133. package/response/index.js +0 -2
  134. package/runner/TaskControl.js +150 -221
  135. package/runner/TaskControl.js.map +1 -1
  136. package/runner/TaskEventValidation.js +12 -13
  137. package/runner/TaskEventValidation.js.map +1 -1
  138. package/runner/TaskManager.js +68 -106
  139. package/runner/TaskManager.js.map +1 -1
  140. package/runner/TaskManagerStore.js +90 -139
  141. package/runner/TaskManagerStore.js.map +1 -1
  142. package/runner/TaskRunner.js +45 -65
  143. package/runner/TaskRunner.js.map +1 -1
  144. package/runner/abstractions/TaskControl.js +0 -3
  145. package/runner/abstractions/TaskEventValidation.js +0 -3
  146. package/runner/abstractions/TaskManager.js +0 -3
  147. package/runner/abstractions/TaskManagerStore.js +0 -3
  148. package/runner/abstractions/TaskRunner.js +0 -3
  149. package/runner/abstractions/index.js +0 -2
  150. package/runner/index.js +0 -2
  151. package/service/EventBridgeEventTransportPlugin.js +43 -42
  152. package/service/EventBridgeEventTransportPlugin.js.map +1 -1
  153. package/service/StepFunctionServicePlugin.js +65 -66
  154. package/service/StepFunctionServicePlugin.js.map +1 -1
  155. package/service/createService.js +10 -13
  156. package/service/createService.js.map +1 -1
  157. package/service/index.js +7 -5
  158. package/service/index.js.map +1 -1
  159. package/tasks/testingRunTask.js +11 -10
  160. package/tasks/testingRunTask.js.map +1 -1
  161. package/types.js +12 -12
  162. package/types.js.map +1 -1
  163. package/utils/ObjectUpdater.js +25 -31
  164. package/utils/ObjectUpdater.js.map +1 -1
  165. package/utils/getErrorProperties.js +5 -4
  166. package/utils/getErrorProperties.js.map +1 -1
  167. package/utils/getObjectProperties.js +8 -15
  168. package/utils/getObjectProperties.js.map +1 -1
  169. package/utils/index.js +0 -2
  170. package/utils/normalizeSelfCleanup.js +13 -12
  171. package/utils/normalizeSelfCleanup.js.map +1 -1
  172. package/events/index.js.map +0 -1
  173. package/features/AbortTask/index.js.map +0 -1
  174. package/features/CleanupTaskSubtree/index.js.map +0 -1
  175. package/features/GetTask/index.js.map +0 -1
  176. package/features/GetTaskDefinition/index.js.map +0 -1
  177. package/features/ListTaskDefinitions/index.js.map +0 -1
  178. package/features/ListTasks/index.js.map +0 -1
  179. package/features/TaskController/augmentation.js.map +0 -1
  180. package/features/TaskController/index.js.map +0 -1
  181. package/features/TaskExecutionContext/index.js.map +0 -1
  182. package/features/TriggerTask/index.js.map +0 -1
  183. package/global.js.map +0 -1
  184. package/handler/types.js.map +0 -1
  185. package/index.js.map +0 -1
  186. package/plugins/index.js.map +0 -1
  187. package/response/abstractions/Response.js.map +0 -1
  188. package/response/abstractions/ResponseAbortedResult.js.map +0 -1
  189. package/response/abstractions/ResponseBaseResult.js.map +0 -1
  190. package/response/abstractions/ResponseContinueResult.js.map +0 -1
  191. package/response/abstractions/ResponseDoneResult.js.map +0 -1
  192. package/response/abstractions/ResponseErrorResult.js.map +0 -1
  193. package/response/abstractions/TaskResponse.js.map +0 -1
  194. package/response/abstractions/index.js.map +0 -1
  195. package/response/index.js.map +0 -1
  196. package/runner/abstractions/TaskControl.js.map +0 -1
  197. package/runner/abstractions/TaskEventValidation.js.map +0 -1
  198. package/runner/abstractions/TaskManager.js.map +0 -1
  199. package/runner/abstractions/TaskManagerStore.js.map +0 -1
  200. package/runner/abstractions/TaskRunner.js.map +0 -1
  201. package/runner/abstractions/index.js.map +0 -1
  202. package/runner/index.js.map +0 -1
  203. package/utils/index.js.map +0 -1
package/context.js CHANGED
@@ -14,49 +14,43 @@ import { GetTaskDefinitionFeature } from "./features/GetTaskDefinition/feature.j
14
14
  import { ListTaskDefinitionsFeature } from "./features/ListTaskDefinitions/feature.js";
15
15
  import { CleanupTaskSubtreeUseCase, CleanupTaskSubtreeUseCaseImpl } from "./features/CleanupTaskSubtree/index.js";
16
16
  import { TestingRunTaskDefinition } from "./tasks/testingRunTask.js";
17
- const createTasksCrud = () => {
18
- const plugin = new ContextPlugin(async context => {
19
- // Register the private models
20
- context.container.register(TaskPrivateModel);
21
- context.container.register(TaskLogPrivateModel);
22
-
23
- // Register the RunnableTaskDecorator to wrap all TaskDefinition instances
24
- context.container.registerDecorator(RunnableTaskDecorator);
25
- context.container.registerDecorator(SelfCleaningTaskDecorator);
26
-
27
- // Register task definition use cases
28
- GetTaskDefinitionFeature.register(context.container);
29
- ListTaskDefinitionsFeature.register(context.container);
30
- context.tasks = {
31
- ...createDefinitionCrud(context),
32
- ...createTaskCrud(context),
33
- ...createServiceCrud(context)
34
- };
35
-
36
- // The cleanup use case is a thin wrapper around `context.tasks.cleanupTaskSubtree`,
37
- // so it must register AFTER the CRUD is wired onto the context.
38
- context.container.registerInstance(CleanupTaskSubtreeUseCase, new CleanupTaskSubtreeUseCaseImpl(context));
39
- });
40
- plugin.name = "tasks.context";
41
- return plugin;
42
- };
43
- const createTasksContext = () => {
44
- return [...createServicePlugins(), createTasksCrud()];
17
+ import { createRegisterExtensionPlugin } from "@webiny/handler";
18
+ const createTasksCrud = ()=>{
19
+ const tasksCrudPlugin = new ContextPlugin(async (context)=>{
20
+ context.container.registerDecorator(RunnableTaskDecorator);
21
+ context.container.registerDecorator(SelfCleaningTaskDecorator);
22
+ GetTaskDefinitionFeature.register(context.container);
23
+ ListTaskDefinitionsFeature.register(context.container);
24
+ context.tasks = {
25
+ ...createDefinitionCrud(context),
26
+ ...createTaskCrud(context),
27
+ ...createServiceCrud(context)
28
+ };
29
+ context.container.registerInstance(CleanupTaskSubtreeUseCase, new CleanupTaskSubtreeUseCaseImpl(context));
30
+ });
31
+ tasksCrudPlugin.name = "tasks.context";
32
+ return tasksCrudPlugin;
45
33
  };
46
- export const createBackgroundTaskContext = () => {
47
- return [...createTasksContext(), new ContextPlugin(context => {
48
- // Register legacy tasks context via a new abstraction
49
- context.container.registerInstance(TaskService, context.tasks);
50
-
51
- // Register TaskExecutionContext EARLY (singleton, empty)
52
- TaskExecutionContextFeature.register(context.container);
53
-
54
- // Register TaskController (depends on TaskExecutionContext)
55
- context.container.register(TaskController);
56
-
57
- // Register a test task
58
- context.container.register(TestingRunTaskDefinition);
59
- })];
34
+ const createTasksContext = ()=>{
35
+ const modelsPlugin = createRegisterExtensionPlugin((context)=>{
36
+ context.container.register(TaskPrivateModel);
37
+ context.container.register(TaskLogPrivateModel);
38
+ });
39
+ return [
40
+ ...createServicePlugins(),
41
+ createTasksCrud(),
42
+ modelsPlugin
43
+ ];
60
44
  };
45
+ const createBackgroundTaskContext = ()=>[
46
+ ...createTasksContext(),
47
+ new ContextPlugin((context)=>{
48
+ context.container.registerInstance(TaskService, context.tasks);
49
+ TaskExecutionContextFeature.register(context.container);
50
+ context.container.register(TaskController);
51
+ context.container.register(TestingRunTaskDefinition);
52
+ })
53
+ ];
54
+ export { createBackgroundTaskContext };
61
55
 
62
56
  //# sourceMappingURL=context.js.map
package/context.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["ContextPlugin","TaskService","RunnableTaskDecorator","SelfCleaningTaskDecorator","TaskController","TaskPrivateModel","TaskLogPrivateModel","createDefinitionCrud","createServiceCrud","createTaskCrud","createServicePlugins","TaskExecutionContextFeature","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","TestingRunTaskDefinition","createTasksCrud","plugin","context","container","register","registerDecorator","tasks","registerInstance","name","createTasksContext","createBackgroundTaskContext"],"sources":["context.ts"],"sourcesContent":["import type { Plugin } from \"@webiny/plugins\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { RunnableTaskDecorator } from \"./decorators/RunnableTaskDecorator.js\";\nimport { SelfCleaningTaskDecorator } from \"./decorators/SelfCleaningTaskDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport type { Context } from \"~/types.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"~/crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { createServicePlugins } from \"~/service/index.js\";\nimport { TaskExecutionContextFeature } from \"~/features/TaskExecutionContext/feature.js\";\nimport { GetTaskDefinitionFeature } from \"~/features/GetTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"~/features/ListTaskDefinitions/feature.js\";\nimport {\n CleanupTaskSubtreeUseCase,\n CleanupTaskSubtreeUseCaseImpl\n} from \"~/features/CleanupTaskSubtree/index.js\";\nimport { TestingRunTaskDefinition } from \"~/tasks/testingRunTask.js\";\n\nconst createTasksCrud = () => {\n const plugin = new ContextPlugin<Context>(async context => {\n // Register the private models\n context.container.register(TaskPrivateModel);\n context.container.register(TaskLogPrivateModel);\n\n // Register the RunnableTaskDecorator to wrap all TaskDefinition instances\n context.container.registerDecorator(RunnableTaskDecorator);\n context.container.registerDecorator(SelfCleaningTaskDecorator);\n\n // Register task definition use cases\n GetTaskDefinitionFeature.register(context.container);\n ListTaskDefinitionsFeature.register(context.container);\n\n context.tasks = {\n ...createDefinitionCrud(context),\n ...createTaskCrud(context),\n ...createServiceCrud(context)\n };\n\n // The cleanup use case is a thin wrapper around `context.tasks.cleanupTaskSubtree`,\n // so it must register AFTER the CRUD is wired onto the context.\n context.container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(context)\n );\n });\n\n plugin.name = \"tasks.context\";\n\n return plugin;\n};\n\nconst createTasksContext = (): Plugin[] => {\n return [...createServicePlugins(), createTasksCrud()];\n};\n\nexport const createBackgroundTaskContext = (): Plugin[] => {\n return [\n ...createTasksContext(),\n new ContextPlugin<Context>(context => {\n // Register legacy tasks context via a new abstraction\n context.container.registerInstance(TaskService, context.tasks);\n\n // Register TaskExecutionContext EARLY (singleton, empty)\n TaskExecutionContextFeature.register(context.container);\n\n // Register TaskController (depends on TaskExecutionContext)\n context.container.register(TaskController);\n\n // Register a test task\n context.container.register(TestingRunTaskDefinition);\n })\n ];\n};\n"],"mappings":"AACA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,WAAW,QAAQ,qDAAqD;AACjF,SAASC,qBAAqB;AAC9B,SAASC,yBAAyB;AAClC,SAASC,cAAc;AAEvB,SAASC,gBAAgB;AACzB,SAASC,mBAAmB;AAC5B,SAASC,oBAAoB;AAC7B,SAASC,iBAAiB;AAC1B,SAASC,cAAc;AACvB,SAASC,oBAAoB;AAC7B,SAASC,2BAA2B;AACpC,SAASC,wBAAwB;AACjC,SAASC,0BAA0B;AACnC,SACIC,yBAAyB,EACzBC,6BAA6B;AAEjC,SAASC,wBAAwB;AAEjC,MAAMC,eAAe,GAAGA,CAAA,KAAM;EAC1B,MAAMC,MAAM,GAAG,IAAIlB,aAAa,CAAU,MAAMmB,OAAO,IAAI;IACvD;IACAA,OAAO,CAACC,SAAS,CAACC,QAAQ,CAAChB,gBAAgB,CAAC;IAC5Cc,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACf,mBAAmB,CAAC;;IAE/C;IACAa,OAAO,CAACC,SAAS,CAACE,iBAAiB,CAACpB,qBAAqB,CAAC;IAC1DiB,OAAO,CAACC,SAAS,CAACE,iBAAiB,CAACnB,yBAAyB,CAAC;;IAE9D;IACAS,wBAAwB,CAACS,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;IACpDP,0BAA0B,CAACQ,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;IAEtDD,OAAO,CAACI,KAAK,GAAG;MACZ,GAAGhB,oBAAoB,CAACY,OAAO,CAAC;MAChC,GAAGV,cAAc,CAACU,OAAO,CAAC;MAC1B,GAAGX,iBAAiB,CAACW,OAAO;IAChC,CAAC;;IAED;IACA;IACAA,OAAO,CAACC,SAAS,CAACI,gBAAgB,CAC9BV,yBAAyB,EACzB,IAAIC,6BAA6B,CAACI,OAAO,CAC7C,CAAC;EACL,CAAC,CAAC;EAEFD,MAAM,CAACO,IAAI,GAAG,eAAe;EAE7B,OAAOP,MAAM;AACjB,CAAC;AAED,MAAMQ,kBAAkB,GAAGA,CAAA,KAAgB;EACvC,OAAO,CAAC,GAAGhB,oBAAoB,CAAC,CAAC,EAAEO,eAAe,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,MAAMU,2BAA2B,GAAGA,CAAA,KAAgB;EACvD,OAAO,CACH,GAAGD,kBAAkB,CAAC,CAAC,EACvB,IAAI1B,aAAa,CAAUmB,OAAO,IAAI;IAClC;IACAA,OAAO,CAACC,SAAS,CAACI,gBAAgB,CAACvB,WAAW,EAAEkB,OAAO,CAACI,KAAK,CAAC;;IAE9D;IACAZ,2BAA2B,CAACU,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;;IAEvD;IACAD,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACjB,cAAc,CAAC;;IAE1C;IACAe,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACL,wBAAwB,CAAC;EACxD,CAAC,CAAC,CACL;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"context.js","sources":["../src/context.ts"],"sourcesContent":["import type { Plugin } from \"@webiny/plugins\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { RunnableTaskDecorator } from \"./decorators/RunnableTaskDecorator.js\";\nimport { SelfCleaningTaskDecorator } from \"./decorators/SelfCleaningTaskDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport type { Context } from \"~/types.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"~/crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { createServicePlugins } from \"~/service/index.js\";\nimport { TaskExecutionContextFeature } from \"~/features/TaskExecutionContext/feature.js\";\nimport { GetTaskDefinitionFeature } from \"~/features/GetTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"~/features/ListTaskDefinitions/feature.js\";\nimport {\n CleanupTaskSubtreeUseCase,\n CleanupTaskSubtreeUseCaseImpl\n} from \"~/features/CleanupTaskSubtree/index.js\";\nimport { TestingRunTaskDefinition } from \"~/tasks/testingRunTask.js\";\nimport { createRegisterExtensionPlugin } from \"@webiny/handler\";\n\nconst createTasksCrud = () => {\n const tasksCrudPlugin = new ContextPlugin<Context>(async context => {\n // Register the RunnableTaskDecorator to wrap all TaskDefinition instances\n context.container.registerDecorator(RunnableTaskDecorator);\n context.container.registerDecorator(SelfCleaningTaskDecorator);\n\n // Register task definition use cases\n GetTaskDefinitionFeature.register(context.container);\n ListTaskDefinitionsFeature.register(context.container);\n\n context.tasks = {\n ...createDefinitionCrud(context),\n ...createTaskCrud(context),\n ...createServiceCrud(context)\n };\n\n // The cleanup use case is a thin wrapper around `context.tasks.cleanupTaskSubtree`,\n // so it must register AFTER the CRUD is wired onto the context.\n context.container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(context)\n );\n });\n\n tasksCrudPlugin.name = \"tasks.context\";\n\n return tasksCrudPlugin;\n};\n\nconst createTasksContext = (): Plugin[] => {\n const modelsPlugin = createRegisterExtensionPlugin(context => {\n context.container.register(TaskPrivateModel);\n context.container.register(TaskLogPrivateModel);\n });\n\n return [...createServicePlugins(), createTasksCrud(), modelsPlugin];\n};\n\nexport const createBackgroundTaskContext = (): Plugin[] => {\n return [\n ...createTasksContext(),\n new ContextPlugin<Context>(context => {\n // Register legacy tasks context via a new abstraction\n context.container.registerInstance(TaskService, context.tasks);\n\n // Register TaskExecutionContext EARLY (singleton, empty)\n TaskExecutionContextFeature.register(context.container);\n\n // Register TaskController (depends on TaskExecutionContext)\n context.container.register(TaskController);\n\n // Register a test task\n context.container.register(TestingRunTaskDefinition);\n })\n ];\n};\n"],"names":["createTasksCrud","tasksCrudPlugin","ContextPlugin","context","RunnableTaskDecorator","SelfCleaningTaskDecorator","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","createDefinitionCrud","createTaskCrud","createServiceCrud","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","createTasksContext","modelsPlugin","createRegisterExtensionPlugin","TaskPrivateModel","TaskLogPrivateModel","createServicePlugins","createBackgroundTaskContext","TaskService","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition"],"mappings":";;;;;;;;;;;;;;;;;AAuBA,MAAMA,kBAAkB;IACpB,MAAMC,kBAAkB,IAAIC,cAAuB,OAAMC;QAErDA,QAAQ,SAAS,CAAC,iBAAiB,CAACC;QACpCD,QAAQ,SAAS,CAAC,iBAAiB,CAACE;QAGpCC,yBAAyB,QAAQ,CAACH,QAAQ,SAAS;QACnDI,2BAA2B,QAAQ,CAACJ,QAAQ,SAAS;QAErDA,QAAQ,KAAK,GAAG;YACZ,GAAGK,qBAAqBL,QAAQ;YAChC,GAAGM,eAAeN,QAAQ;YAC1B,GAAGO,kBAAkBP,QAAQ;QACjC;QAIAA,QAAQ,SAAS,CAAC,gBAAgB,CAC9BQ,2BACA,IAAIC,8BAA8BT;IAE1C;IAEAF,gBAAgB,IAAI,GAAG;IAEvB,OAAOA;AACX;AAEA,MAAMY,qBAAqB;IACvB,MAAMC,eAAeC,8BAA8BZ,CAAAA;QAC/CA,QAAQ,SAAS,CAAC,QAAQ,CAACa;QAC3Bb,QAAQ,SAAS,CAAC,QAAQ,CAACc;IAC/B;IAEA,OAAO;WAAIC;QAAwBlB;QAAmBc;KAAa;AACvE;AAEO,MAAMK,8BAA8B,IAChC;WACAN;QACH,IAAIX,cAAuBC,CAAAA;YAEvBA,QAAQ,SAAS,CAAC,gBAAgB,CAACiB,aAAajB,QAAQ,KAAK;YAG7DkB,4BAA4B,QAAQ,CAAClB,QAAQ,SAAS;YAGtDA,QAAQ,SAAS,CAAC,QAAQ,CAACmB;YAG3BnB,QAAQ,SAAS,CAAC,QAAQ,CAACoB;QAC/B;KACH"}
@@ -1,34 +1,40 @@
1
1
  import { ModelFactory } from "@webiny/api-headless-cms/features/modelBuilder/index.js";
2
2
  import { TaskLogItemType } from "../types.js";
3
- export const WEBINY_TASK_LOG_MODEL_ID = "wbyTaskLog";
3
+ const WEBINY_TASK_LOG_MODEL_ID = "wbyTaskLog";
4
4
  class TaskLogPrivateModelImpl {
5
- async execute(builder) {
6
- return [builder.private({
7
- modelId: WEBINY_TASK_LOG_MODEL_ID,
8
- name: "Webiny Task Log"
9
- }).fields(fields => ({
10
- executionName: fields.text().label("Execution Name"),
11
- task: fields.text().label("Task").required("Task is required."),
12
- iteration: fields.number().label("Iteration").required("Iteration is required."),
13
- items: fields.object().label("Items").list().required("Items is required.").fields(fields => ({
14
- message: fields.text().label("Message").required("Message is required."),
15
- createdOn: fields.datetime().label("Created On").required("Created On is required."),
16
- type: fields.text().label("Type").required("Type is required.").predefinedValues([{
17
- value: TaskLogItemType.INFO,
18
- label: "Info"
19
- }, {
20
- value: TaskLogItemType.ERROR,
21
- label: "Error"
22
- }]),
23
- data: fields.json().label("Data"),
24
- error: fields.json().label("Error")
25
- }))
26
- }))];
27
- }
5
+ async execute(builder) {
6
+ return [
7
+ builder.private({
8
+ modelId: WEBINY_TASK_LOG_MODEL_ID,
9
+ name: "Webiny Task Log"
10
+ }).fields((fields)=>({
11
+ executionName: fields.text().label("Execution Name"),
12
+ task: fields.text().label("Task").required("Task is required."),
13
+ iteration: fields.number().label("Iteration").required("Iteration is required."),
14
+ items: fields.object().label("Items").list().required("Items is required.").fields((fields)=>({
15
+ message: fields.text().label("Message").required("Message is required."),
16
+ createdOn: fields.datetime().label("Created On").required("Created On is required."),
17
+ type: fields.text().label("Type").required("Type is required.").predefinedValues([
18
+ {
19
+ value: TaskLogItemType.INFO,
20
+ label: "Info"
21
+ },
22
+ {
23
+ value: TaskLogItemType.ERROR,
24
+ label: "Error"
25
+ }
26
+ ]),
27
+ data: fields.json().label("Data"),
28
+ error: fields.json().label("Error")
29
+ }))
30
+ }))
31
+ ];
32
+ }
28
33
  }
29
- export const TaskLogPrivateModel = ModelFactory.createImplementation({
30
- implementation: TaskLogPrivateModelImpl,
31
- dependencies: []
34
+ const TaskLogPrivateModel = ModelFactory.createImplementation({
35
+ implementation: TaskLogPrivateModelImpl,
36
+ dependencies: []
32
37
  });
38
+ export { TaskLogPrivateModel, WEBINY_TASK_LOG_MODEL_ID };
33
39
 
34
40
  //# sourceMappingURL=TaskLogPrivateModel.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ModelFactory","TaskLogItemType","WEBINY_TASK_LOG_MODEL_ID","TaskLogPrivateModelImpl","execute","builder","private","modelId","name","fields","executionName","text","label","task","required","iteration","number","items","object","list","message","createdOn","datetime","type","predefinedValues","value","INFO","ERROR","data","json","error","TaskLogPrivateModel","createImplementation","implementation","dependencies"],"sources":["TaskLogPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskLogItemType } from \"~/types.js\";\n\nexport const WEBINY_TASK_LOG_MODEL_ID = \"wbyTaskLog\";\n\nclass TaskLogPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_LOG_MODEL_ID,\n name: \"Webiny Task Log\"\n })\n .fields(fields => ({\n executionName: fields.text().label(\"Execution Name\"),\n task: fields.text().label(\"Task\").required(\"Task is required.\"),\n iteration: fields\n .number()\n .label(\"Iteration\")\n .required(\"Iteration is required.\"),\n items: fields\n .object()\n .label(\"Items\")\n .list()\n .required(\"Items is required.\")\n .fields(fields => ({\n message: fields\n .text()\n .label(\"Message\")\n .required(\"Message is required.\"),\n createdOn: fields\n .datetime()\n .label(\"Created On\")\n .required(\"Created On is required.\"),\n type: fields\n .text()\n .label(\"Type\")\n .required(\"Type is required.\")\n .predefinedValues([\n {\n value: TaskLogItemType.INFO,\n label: \"Info\"\n },\n {\n value: TaskLogItemType.ERROR,\n label: \"Error\"\n }\n ]),\n data: fields.json().label(\"Data\"),\n error: fields.json().label(\"Error\")\n }))\n }))\n ];\n }\n}\n\nexport const TaskLogPrivateModel = ModelFactory.createImplementation({\n implementation: TaskLogPrivateModelImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,yDAAyD;AACtF,SAASC,eAAe;AAExB,OAAO,MAAMC,wBAAwB,GAAG,YAAY;AAEpD,MAAMC,uBAAuB,CAAmC;EAC5D,MAAaC,OAAOA,CAACC,OAA6B,EAAE;IAChD,OAAO,CACHA,OAAO,CACFC,OAAO,CAAC;MACLC,OAAO,EAAEL,wBAAwB;MACjCM,IAAI,EAAE;IACV,CAAC,CAAC,CACDC,MAAM,CAACA,MAAM,KAAK;MACfC,aAAa,EAAED,MAAM,CAACE,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,gBAAgB,CAAC;MACpDC,IAAI,EAAEJ,MAAM,CAACE,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAACE,QAAQ,CAAC,mBAAmB,CAAC;MAC/DC,SAAS,EAAEN,MAAM,CACZO,MAAM,CAAC,CAAC,CACRJ,KAAK,CAAC,WAAW,CAAC,CAClBE,QAAQ,CAAC,wBAAwB,CAAC;MACvCG,KAAK,EAAER,MAAM,CACRS,MAAM,CAAC,CAAC,CACRN,KAAK,CAAC,OAAO,CAAC,CACdO,IAAI,CAAC,CAAC,CACNL,QAAQ,CAAC,oBAAoB,CAAC,CAC9BL,MAAM,CAACA,MAAM,KAAK;QACfW,OAAO,EAAEX,MAAM,CACVE,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,SAAS,CAAC,CAChBE,QAAQ,CAAC,sBAAsB,CAAC;QACrCO,SAAS,EAAEZ,MAAM,CACZa,QAAQ,CAAC,CAAC,CACVV,KAAK,CAAC,YAAY,CAAC,CACnBE,QAAQ,CAAC,yBAAyB,CAAC;QACxCS,IAAI,EAAEd,MAAM,CACPE,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,MAAM,CAAC,CACbE,QAAQ,CAAC,mBAAmB,CAAC,CAC7BU,gBAAgB,CAAC,CACd;UACIC,KAAK,EAAExB,eAAe,CAACyB,IAAI;UAC3Bd,KAAK,EAAE;QACX,CAAC,EACD;UACIa,KAAK,EAAExB,eAAe,CAAC0B,KAAK;UAC5Bf,KAAK,EAAE;QACX,CAAC,CACJ,CAAC;QACNgB,IAAI,EAAEnB,MAAM,CAACoB,IAAI,CAAC,CAAC,CAACjB,KAAK,CAAC,MAAM,CAAC;QACjCkB,KAAK,EAAErB,MAAM,CAACoB,IAAI,CAAC,CAAC,CAACjB,KAAK,CAAC,OAAO;MACtC,CAAC,CAAC;IACV,CAAC,CAAC,CAAC,CACV;EACL;AACJ;AAEA,OAAO,MAAMmB,mBAAmB,GAAG/B,YAAY,CAACgC,oBAAoB,CAAC;EACjEC,cAAc,EAAE9B,uBAAuB;EACvC+B,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"crud/TaskLogPrivateModel.js","sources":["../../src/crud/TaskLogPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskLogItemType } from \"~/types.js\";\n\nexport const WEBINY_TASK_LOG_MODEL_ID = \"wbyTaskLog\";\n\nclass TaskLogPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_LOG_MODEL_ID,\n name: \"Webiny Task Log\"\n })\n .fields(fields => ({\n executionName: fields.text().label(\"Execution Name\"),\n task: fields.text().label(\"Task\").required(\"Task is required.\"),\n iteration: fields\n .number()\n .label(\"Iteration\")\n .required(\"Iteration is required.\"),\n items: fields\n .object()\n .label(\"Items\")\n .list()\n .required(\"Items is required.\")\n .fields(fields => ({\n message: fields\n .text()\n .label(\"Message\")\n .required(\"Message is required.\"),\n createdOn: fields\n .datetime()\n .label(\"Created On\")\n .required(\"Created On is required.\"),\n type: fields\n .text()\n .label(\"Type\")\n .required(\"Type is required.\")\n .predefinedValues([\n {\n value: TaskLogItemType.INFO,\n label: \"Info\"\n },\n {\n value: TaskLogItemType.ERROR,\n label: \"Error\"\n }\n ]),\n data: fields.json().label(\"Data\"),\n error: fields.json().label(\"Error\")\n }))\n }))\n ];\n }\n}\n\nexport const TaskLogPrivateModel = ModelFactory.createImplementation({\n implementation: TaskLogPrivateModelImpl,\n dependencies: []\n});\n"],"names":["WEBINY_TASK_LOG_MODEL_ID","TaskLogPrivateModelImpl","builder","fields","TaskLogItemType","TaskLogPrivateModel","ModelFactory"],"mappings":";;AAGO,MAAMA,2BAA2B;AAExC,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASF;gBACT,MAAM;YACV,GACC,MAAM,CAACG,CAAAA,SAAW;oBACf,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACnC,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC;oBAC3C,WAAWA,OACN,MAAM,GACN,KAAK,CAAC,aACN,QAAQ,CAAC;oBACd,OAAOA,OACF,MAAM,GACN,KAAK,CAAC,SACN,IAAI,GACJ,QAAQ,CAAC,sBACT,MAAM,CAACA,CAAAA,SAAW;4BACf,SAASA,OACJ,IAAI,GACJ,KAAK,CAAC,WACN,QAAQ,CAAC;4BACd,WAAWA,OACN,QAAQ,GACR,KAAK,CAAC,cACN,QAAQ,CAAC;4BACd,MAAMA,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,qBACT,gBAAgB,CAAC;gCACd;oCACI,OAAOC,gBAAgB,IAAI;oCAC3B,OAAO;gCACX;gCACA;oCACI,OAAOA,gBAAgB,KAAK;oCAC5B,OAAO;gCACX;6BACH;4BACL,MAAMD,OAAO,IAAI,GAAG,KAAK,CAAC;4BAC1B,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;wBAC/B;gBACR;SACP;IACL;AACJ;AAEO,MAAME,sBAAsBC,aAAa,oBAAoB,CAAC;IACjE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
@@ -1,46 +1,55 @@
1
1
  import { ModelFactory } from "@webiny/api-headless-cms/features/modelBuilder/index.js";
2
2
  import { TaskDataStatus } from "../types.js";
3
- export const WEBINY_TASK_MODEL_ID = "wbyTask";
3
+ const WEBINY_TASK_MODEL_ID = "wbyTask";
4
4
  class TaskPrivateModelImpl {
5
- async execute(builder) {
6
- return [builder.private({
7
- modelId: WEBINY_TASK_MODEL_ID,
8
- name: "Webiny Task"
9
- }).fields(fields => ({
10
- name: fields.text().label("Name").required("Name is required."),
11
- definitionId: fields.text().label("Definition ID").required("Definition ID is required."),
12
- parentId: fields.text().label("Parent ID"),
13
- executionName: fields.text().label("Execution Name"),
14
- iterations: fields.number().label("Iterations"),
15
- input: fields.json().label("Input"),
16
- output: fields.json().label("Output"),
17
- taskStatus: fields.text().label("Status").predefinedValues([{
18
- value: TaskDataStatus.PENDING,
19
- label: "Pending"
20
- }, {
21
- value: TaskDataStatus.RUNNING,
22
- label: "Running"
23
- }, {
24
- value: TaskDataStatus.FAILED,
25
- label: "Failed"
26
- }, {
27
- value: TaskDataStatus.SUCCESS,
28
- label: "Success"
29
- }, {
30
- value: TaskDataStatus.ABORTED,
31
- label: "Aborted"
32
- }]).settings({
33
- defaultValue: TaskDataStatus.PENDING
34
- }),
35
- startedOn: fields.datetime().label("Started On"),
36
- finishedOn: fields.datetime().label("Finished On"),
37
- eventResponse: fields.json().label("Event Response")
38
- }))];
39
- }
5
+ async execute(builder) {
6
+ return [
7
+ builder.private({
8
+ modelId: WEBINY_TASK_MODEL_ID,
9
+ name: "Webiny Task"
10
+ }).fields((fields)=>({
11
+ name: fields.text().label("Name").required("Name is required."),
12
+ definitionId: fields.text().label("Definition ID").required("Definition ID is required."),
13
+ parentId: fields.text().label("Parent ID"),
14
+ executionName: fields.text().label("Execution Name"),
15
+ iterations: fields.number().label("Iterations"),
16
+ input: fields.json().label("Input"),
17
+ output: fields.json().label("Output"),
18
+ taskStatus: fields.text().label("Status").predefinedValues([
19
+ {
20
+ value: TaskDataStatus.PENDING,
21
+ label: "Pending"
22
+ },
23
+ {
24
+ value: TaskDataStatus.RUNNING,
25
+ label: "Running"
26
+ },
27
+ {
28
+ value: TaskDataStatus.FAILED,
29
+ label: "Failed"
30
+ },
31
+ {
32
+ value: TaskDataStatus.SUCCESS,
33
+ label: "Success"
34
+ },
35
+ {
36
+ value: TaskDataStatus.ABORTED,
37
+ label: "Aborted"
38
+ }
39
+ ]).settings({
40
+ defaultValue: TaskDataStatus.PENDING
41
+ }),
42
+ startedOn: fields.datetime().label("Started On"),
43
+ finishedOn: fields.datetime().label("Finished On"),
44
+ eventResponse: fields.json().label("Event Response")
45
+ }))
46
+ ];
47
+ }
40
48
  }
41
- export const TaskPrivateModel = ModelFactory.createImplementation({
42
- implementation: TaskPrivateModelImpl,
43
- dependencies: []
49
+ const TaskPrivateModel = ModelFactory.createImplementation({
50
+ implementation: TaskPrivateModelImpl,
51
+ dependencies: []
44
52
  });
53
+ export { TaskPrivateModel, WEBINY_TASK_MODEL_ID };
45
54
 
46
55
  //# sourceMappingURL=TaskPrivateModel.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ModelFactory","TaskDataStatus","WEBINY_TASK_MODEL_ID","TaskPrivateModelImpl","execute","builder","private","modelId","name","fields","text","label","required","definitionId","parentId","executionName","iterations","number","input","json","output","taskStatus","predefinedValues","value","PENDING","RUNNING","FAILED","SUCCESS","ABORTED","settings","defaultValue","startedOn","datetime","finishedOn","eventResponse","TaskPrivateModel","createImplementation","implementation","dependencies"],"sources":["TaskPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskDataStatus } from \"~/types.js\";\n\nexport const WEBINY_TASK_MODEL_ID = \"wbyTask\";\n\nclass TaskPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_MODEL_ID,\n name: \"Webiny Task\"\n })\n .fields(fields => ({\n name: fields.text().label(\"Name\").required(\"Name is required.\"),\n definitionId: fields\n .text()\n .label(\"Definition ID\")\n .required(\"Definition ID is required.\"),\n parentId: fields.text().label(\"Parent ID\"),\n executionName: fields.text().label(\"Execution Name\"),\n iterations: fields.number().label(\"Iterations\"),\n input: fields.json().label(\"Input\"),\n output: fields.json().label(\"Output\"),\n taskStatus: fields\n .text()\n .label(\"Status\")\n .predefinedValues([\n {\n value: TaskDataStatus.PENDING,\n label: \"Pending\"\n },\n {\n value: TaskDataStatus.RUNNING,\n label: \"Running\"\n },\n {\n value: TaskDataStatus.FAILED,\n label: \"Failed\"\n },\n {\n value: TaskDataStatus.SUCCESS,\n label: \"Success\"\n },\n {\n value: TaskDataStatus.ABORTED,\n label: \"Aborted\"\n }\n ])\n .settings({ defaultValue: TaskDataStatus.PENDING }),\n startedOn: fields.datetime().label(\"Started On\"),\n finishedOn: fields.datetime().label(\"Finished On\"),\n eventResponse: fields.json().label(\"Event Response\")\n }))\n ];\n }\n}\n\nexport const TaskPrivateModel = ModelFactory.createImplementation({\n implementation: TaskPrivateModelImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,yDAAyD;AACtF,SAASC,cAAc;AAEvB,OAAO,MAAMC,oBAAoB,GAAG,SAAS;AAE7C,MAAMC,oBAAoB,CAAmC;EACzD,MAAaC,OAAOA,CAACC,OAA6B,EAAE;IAChD,OAAO,CACHA,OAAO,CACFC,OAAO,CAAC;MACLC,OAAO,EAAEL,oBAAoB;MAC7BM,IAAI,EAAE;IACV,CAAC,CAAC,CACDC,MAAM,CAACA,MAAM,KAAK;MACfD,IAAI,EAAEC,MAAM,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAACC,QAAQ,CAAC,mBAAmB,CAAC;MAC/DC,YAAY,EAAEJ,MAAM,CACfC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,eAAe,CAAC,CACtBC,QAAQ,CAAC,4BAA4B,CAAC;MAC3CE,QAAQ,EAAEL,MAAM,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,WAAW,CAAC;MAC1CI,aAAa,EAAEN,MAAM,CAACC,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,gBAAgB,CAAC;MACpDK,UAAU,EAAEP,MAAM,CAACQ,MAAM,CAAC,CAAC,CAACN,KAAK,CAAC,YAAY,CAAC;MAC/CO,KAAK,EAAET,MAAM,CAACU,IAAI,CAAC,CAAC,CAACR,KAAK,CAAC,OAAO,CAAC;MACnCS,MAAM,EAAEX,MAAM,CAACU,IAAI,CAAC,CAAC,CAACR,KAAK,CAAC,QAAQ,CAAC;MACrCU,UAAU,EAAEZ,MAAM,CACbC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,QAAQ,CAAC,CACfW,gBAAgB,CAAC,CACd;QACIC,KAAK,EAAEtB,cAAc,CAACuB,OAAO;QAC7Bb,KAAK,EAAE;MACX,CAAC,EACD;QACIY,KAAK,EAAEtB,cAAc,CAACwB,OAAO;QAC7Bd,KAAK,EAAE;MACX,CAAC,EACD;QACIY,KAAK,EAAEtB,cAAc,CAACyB,MAAM;QAC5Bf,KAAK,EAAE;MACX,CAAC,EACD;QACIY,KAAK,EAAEtB,cAAc,CAAC0B,OAAO;QAC7BhB,KAAK,EAAE;MACX,CAAC,EACD;QACIY,KAAK,EAAEtB,cAAc,CAAC2B,OAAO;QAC7BjB,KAAK,EAAE;MACX,CAAC,CACJ,CAAC,CACDkB,QAAQ,CAAC;QAAEC,YAAY,EAAE7B,cAAc,CAACuB;MAAQ,CAAC,CAAC;MACvDO,SAAS,EAAEtB,MAAM,CAACuB,QAAQ,CAAC,CAAC,CAACrB,KAAK,CAAC,YAAY,CAAC;MAChDsB,UAAU,EAAExB,MAAM,CAACuB,QAAQ,CAAC,CAAC,CAACrB,KAAK,CAAC,aAAa,CAAC;MAClDuB,aAAa,EAAEzB,MAAM,CAACU,IAAI,CAAC,CAAC,CAACR,KAAK,CAAC,gBAAgB;IACvD,CAAC,CAAC,CAAC,CACV;EACL;AACJ;AAEA,OAAO,MAAMwB,gBAAgB,GAAGnC,YAAY,CAACoC,oBAAoB,CAAC;EAC9DC,cAAc,EAAElC,oBAAoB;EACpCmC,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"crud/TaskPrivateModel.js","sources":["../../src/crud/TaskPrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { TaskDataStatus } from \"~/types.js\";\n\nexport const WEBINY_TASK_MODEL_ID = \"wbyTask\";\n\nclass TaskPrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: WEBINY_TASK_MODEL_ID,\n name: \"Webiny Task\"\n })\n .fields(fields => ({\n name: fields.text().label(\"Name\").required(\"Name is required.\"),\n definitionId: fields\n .text()\n .label(\"Definition ID\")\n .required(\"Definition ID is required.\"),\n parentId: fields.text().label(\"Parent ID\"),\n executionName: fields.text().label(\"Execution Name\"),\n iterations: fields.number().label(\"Iterations\"),\n input: fields.json().label(\"Input\"),\n output: fields.json().label(\"Output\"),\n taskStatus: fields\n .text()\n .label(\"Status\")\n .predefinedValues([\n {\n value: TaskDataStatus.PENDING,\n label: \"Pending\"\n },\n {\n value: TaskDataStatus.RUNNING,\n label: \"Running\"\n },\n {\n value: TaskDataStatus.FAILED,\n label: \"Failed\"\n },\n {\n value: TaskDataStatus.SUCCESS,\n label: \"Success\"\n },\n {\n value: TaskDataStatus.ABORTED,\n label: \"Aborted\"\n }\n ])\n .settings({ defaultValue: TaskDataStatus.PENDING }),\n startedOn: fields.datetime().label(\"Started On\"),\n finishedOn: fields.datetime().label(\"Finished On\"),\n eventResponse: fields.json().label(\"Event Response\")\n }))\n ];\n }\n}\n\nexport const TaskPrivateModel = ModelFactory.createImplementation({\n implementation: TaskPrivateModelImpl,\n dependencies: []\n});\n"],"names":["WEBINY_TASK_MODEL_ID","TaskPrivateModelImpl","builder","fields","TaskDataStatus","TaskPrivateModel","ModelFactory"],"mappings":";;AAGO,MAAMA,uBAAuB;AAEpC,MAAMC;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASF;gBACT,MAAM;YACV,GACC,MAAM,CAACG,CAAAA,SAAW;oBACf,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC;oBAC3C,cAAcA,OACT,IAAI,GACJ,KAAK,CAAC,iBACN,QAAQ,CAAC;oBACd,UAAUA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC9B,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;oBACnC,YAAYA,OAAO,MAAM,GAAG,KAAK,CAAC;oBAClC,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC3B,QAAQA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC5B,YAAYA,OACP,IAAI,GACJ,KAAK,CAAC,UACN,gBAAgB,CAAC;wBACd;4BACI,OAAOC,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,MAAM;4BAC5B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;wBACA;4BACI,OAAOA,eAAe,OAAO;4BAC7B,OAAO;wBACX;qBACH,EACA,QAAQ,CAAC;wBAAE,cAAcA,eAAe,OAAO;oBAAC;oBACrD,WAAWD,OAAO,QAAQ,GAAG,KAAK,CAAC;oBACnC,YAAYA,OAAO,QAAQ,GAAG,KAAK,CAAC;oBACpC,eAAeA,OAAO,IAAI,GAAG,KAAK,CAAC;gBACvC;SACP;IACL;AACJ;AAEO,MAAME,mBAAmBC,aAAa,oBAAoB,CAAC;IAC9D,gBAAgBL;IAChB,cAAc,EAAE;AACpB"}
@@ -1,76 +1,62 @@
1
- /**
2
- * Recursively deletes the task identified by `rootId`, all its descendants, and
3
- * their logs (when the owning definition has databaseLogs=true). Bottom-up,
4
- * best-effort: per-record errors are logged and swallowed, the function never
5
- * throws.
6
- */
7
- export const createCleanupTaskSubtree = context => {
8
- const listChildren = async parentId => {
9
- const {
10
- items
11
- } = await context.tasks.listTasks({
12
- where: {
13
- parentId
14
- }
15
- });
16
- return items;
17
- };
18
- const collectSubtree = async rootId => {
19
- const root = await context.tasks.getTask(rootId);
20
- if (!root) {
21
- return [];
22
- }
23
- const order = [root];
24
- const seen = new Set([root.id]);
25
- let i = 0;
26
- while (i < order.length) {
27
- const current = order[i++];
28
- const kids = await listChildren(current.id);
29
- for (const kid of kids) {
30
- if (seen.has(kid.id)) {
31
- continue;
1
+ const createCleanupTaskSubtree = (context)=>{
2
+ const listChildren = async (parentId)=>{
3
+ const { items } = await context.tasks.listTasks({
4
+ where: {
5
+ parentId
6
+ }
7
+ });
8
+ return items;
9
+ };
10
+ const collectSubtree = async (rootId)=>{
11
+ const root = await context.tasks.getTask(rootId);
12
+ if (!root) return [];
13
+ const order = [
14
+ root
15
+ ];
16
+ const seen = new Set([
17
+ root.id
18
+ ]);
19
+ let i = 0;
20
+ while(i < order.length){
21
+ const current = order[i++];
22
+ const kids = await listChildren(current.id);
23
+ for (const kid of kids)if (!seen.has(kid.id)) {
24
+ seen.add(kid.id);
25
+ order.push(kid);
26
+ }
32
27
  }
33
- seen.add(kid.id);
34
- order.push(kid);
35
- }
36
- }
37
- return order.reverse();
38
- };
39
- const deleteTaskLogs = async task => {
40
- const definition = context.tasks.getDefinition(task.definitionId);
41
- if (!definition || definition.databaseLogs !== true) {
42
- return;
43
- }
44
- try {
45
- const {
46
- items
47
- } = await context.tasks.listLogs({
48
- where: {
49
- task: task.id
50
- }
51
- });
52
- for (const log of items) {
28
+ return order.reverse();
29
+ };
30
+ const deleteTaskLogs = async (task)=>{
31
+ const definition = context.tasks.getDefinition(task.definitionId);
32
+ if (!definition || true !== definition.databaseLogs) return;
53
33
  try {
54
- await context.tasks.deleteLog(log.id);
34
+ const { items } = await context.tasks.listLogs({
35
+ where: {
36
+ task: task.id
37
+ }
38
+ });
39
+ for (const log of items)try {
40
+ await context.tasks.deleteLog(log.id);
41
+ } catch (ex) {
42
+ console.warn(`cleanupTaskSubtree: failed to delete log "${log.id}" for task "${task.id}": ${ex.message}`);
43
+ }
55
44
  } catch (ex) {
56
- console.warn(`cleanupTaskSubtree: failed to delete log "${log.id}" for task "${task.id}": ${ex.message}`);
45
+ console.warn(`cleanupTaskSubtree: failed to list logs for task "${task.id}": ${ex.message}`);
46
+ }
47
+ };
48
+ return async (rootId)=>{
49
+ const ordered = await collectSubtree(rootId);
50
+ for (const task of ordered){
51
+ await deleteTaskLogs(task);
52
+ try {
53
+ await context.tasks.deleteTask(task.id);
54
+ } catch (ex) {
55
+ console.warn(`cleanupTaskSubtree: failed to delete task "${task.id}": ${ex.message}`);
56
+ }
57
57
  }
58
- }
59
- } catch (ex) {
60
- console.warn(`cleanupTaskSubtree: failed to list logs for task "${task.id}": ${ex.message}`);
61
- }
62
- };
63
- return async rootId => {
64
- const ordered = await collectSubtree(rootId);
65
- for (const task of ordered) {
66
- await deleteTaskLogs(task);
67
- try {
68
- await context.tasks.deleteTask(task.id);
69
- } catch (ex) {
70
- console.warn(`cleanupTaskSubtree: failed to delete task "${task.id}": ${ex.message}`);
71
- }
72
- }
73
- };
58
+ };
74
59
  };
60
+ export { createCleanupTaskSubtree };
75
61
 
76
62
  //# sourceMappingURL=cleanupTaskSubtree.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createCleanupTaskSubtree","context","listChildren","parentId","items","tasks","listTasks","where","collectSubtree","rootId","root","getTask","order","seen","Set","id","i","length","current","kids","kid","has","add","push","reverse","deleteTaskLogs","task","definition","getDefinition","definitionId","databaseLogs","listLogs","log","deleteLog","ex","console","warn","message","ordered","deleteTask"],"sources":["cleanupTaskSubtree.ts"],"sourcesContent":["import type { Context, ITask } from \"~/types.js\";\n\n/**\n * Recursively deletes the task identified by `rootId`, all its descendants, and\n * their logs (when the owning definition has databaseLogs=true). Bottom-up,\n * best-effort: per-record errors are logged and swallowed, the function never\n * throws.\n */\nexport const createCleanupTaskSubtree = (context: Context) => {\n const listChildren = async (parentId: string): Promise<ITask[]> => {\n const { items } = await context.tasks.listTasks({\n where: { parentId }\n });\n return items;\n };\n\n const collectSubtree = async (rootId: string): Promise<ITask[]> => {\n const root = await context.tasks.getTask(rootId);\n if (!root) {\n return [];\n }\n const order: ITask[] = [root];\n const seen = new Set<string>([root.id]);\n let i = 0;\n while (i < order.length) {\n const current = order[i++];\n const kids = await listChildren(current.id);\n for (const kid of kids) {\n if (seen.has(kid.id)) {\n continue;\n }\n seen.add(kid.id);\n order.push(kid);\n }\n }\n return order.reverse();\n };\n\n const deleteTaskLogs = async (task: ITask): Promise<void> => {\n const definition = context.tasks.getDefinition(task.definitionId);\n if (!definition || definition.databaseLogs !== true) {\n return;\n }\n try {\n const { items } = await context.tasks.listLogs({\n where: { task: task.id }\n });\n for (const log of items) {\n try {\n await context.tasks.deleteLog(log.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete log \"${log.id}\" for task \"${task.id}\": ${ex.message}`\n );\n }\n }\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to list logs for task \"${task.id}\": ${ex.message}`\n );\n }\n };\n\n return async (rootId: string): Promise<void> => {\n const ordered = await collectSubtree(rootId);\n for (const task of ordered) {\n await deleteTaskLogs(task);\n try {\n await context.tasks.deleteTask(task.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete task \"${task.id}\": ${ex.message}`\n );\n }\n }\n };\n};\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,wBAAwB,GAAIC,OAAgB,IAAK;EAC1D,MAAMC,YAAY,GAAG,MAAOC,QAAgB,IAAuB;IAC/D,MAAM;MAAEC;IAAM,CAAC,GAAG,MAAMH,OAAO,CAACI,KAAK,CAACC,SAAS,CAAC;MAC5CC,KAAK,EAAE;QAAEJ;MAAS;IACtB,CAAC,CAAC;IACF,OAAOC,KAAK;EAChB,CAAC;EAED,MAAMI,cAAc,GAAG,MAAOC,MAAc,IAAuB;IAC/D,MAAMC,IAAI,GAAG,MAAMT,OAAO,CAACI,KAAK,CAACM,OAAO,CAACF,MAAM,CAAC;IAChD,IAAI,CAACC,IAAI,EAAE;MACP,OAAO,EAAE;IACb;IACA,MAAME,KAAc,GAAG,CAACF,IAAI,CAAC;IAC7B,MAAMG,IAAI,GAAG,IAAIC,GAAG,CAAS,CAACJ,IAAI,CAACK,EAAE,CAAC,CAAC;IACvC,IAAIC,CAAC,GAAG,CAAC;IACT,OAAOA,CAAC,GAAGJ,KAAK,CAACK,MAAM,EAAE;MACrB,MAAMC,OAAO,GAAGN,KAAK,CAACI,CAAC,EAAE,CAAC;MAC1B,MAAMG,IAAI,GAAG,MAAMjB,YAAY,CAACgB,OAAO,CAACH,EAAE,CAAC;MAC3C,KAAK,MAAMK,GAAG,IAAID,IAAI,EAAE;QACpB,IAAIN,IAAI,CAACQ,GAAG,CAACD,GAAG,CAACL,EAAE,CAAC,EAAE;UAClB;QACJ;QACAF,IAAI,CAACS,GAAG,CAACF,GAAG,CAACL,EAAE,CAAC;QAChBH,KAAK,CAACW,IAAI,CAACH,GAAG,CAAC;MACnB;IACJ;IACA,OAAOR,KAAK,CAACY,OAAO,CAAC,CAAC;EAC1B,CAAC;EAED,MAAMC,cAAc,GAAG,MAAOC,IAAW,IAAoB;IACzD,MAAMC,UAAU,GAAG1B,OAAO,CAACI,KAAK,CAACuB,aAAa,CAACF,IAAI,CAACG,YAAY,CAAC;IACjE,IAAI,CAACF,UAAU,IAAIA,UAAU,CAACG,YAAY,KAAK,IAAI,EAAE;MACjD;IACJ;IACA,IAAI;MACA,MAAM;QAAE1B;MAAM,CAAC,GAAG,MAAMH,OAAO,CAACI,KAAK,CAAC0B,QAAQ,CAAC;QAC3CxB,KAAK,EAAE;UAAEmB,IAAI,EAAEA,IAAI,CAACX;QAAG;MAC3B,CAAC,CAAC;MACF,KAAK,MAAMiB,GAAG,IAAI5B,KAAK,EAAE;QACrB,IAAI;UACA,MAAMH,OAAO,CAACI,KAAK,CAAC4B,SAAS,CAACD,GAAG,CAACjB,EAAE,CAAC;QACzC,CAAC,CAAC,OAAOmB,EAAO,EAAE;UACdC,OAAO,CAACC,IAAI,CACR,6CAA6CJ,GAAG,CAACjB,EAAE,eAAeW,IAAI,CAACX,EAAE,MAAMmB,EAAE,CAACG,OAAO,EAC7F,CAAC;QACL;MACJ;IACJ,CAAC,CAAC,OAAOH,EAAO,EAAE;MACdC,OAAO,CAACC,IAAI,CACR,qDAAqDV,IAAI,CAACX,EAAE,MAAMmB,EAAE,CAACG,OAAO,EAChF,CAAC;IACL;EACJ,CAAC;EAED,OAAO,MAAO5B,MAAc,IAAoB;IAC5C,MAAM6B,OAAO,GAAG,MAAM9B,cAAc,CAACC,MAAM,CAAC;IAC5C,KAAK,MAAMiB,IAAI,IAAIY,OAAO,EAAE;MACxB,MAAMb,cAAc,CAACC,IAAI,CAAC;MAC1B,IAAI;QACA,MAAMzB,OAAO,CAACI,KAAK,CAACkC,UAAU,CAACb,IAAI,CAACX,EAAE,CAAC;MAC3C,CAAC,CAAC,OAAOmB,EAAO,EAAE;QACdC,OAAO,CAACC,IAAI,CACR,8CAA8CV,IAAI,CAACX,EAAE,MAAMmB,EAAE,CAACG,OAAO,EACzE,CAAC;MACL;IACJ;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"crud/cleanupTaskSubtree.js","sources":["../../src/crud/cleanupTaskSubtree.ts"],"sourcesContent":["import type { Context, ITask } from \"~/types.js\";\n\n/**\n * Recursively deletes the task identified by `rootId`, all its descendants, and\n * their logs (when the owning definition has databaseLogs=true). Bottom-up,\n * best-effort: per-record errors are logged and swallowed, the function never\n * throws.\n */\nexport const createCleanupTaskSubtree = (context: Context) => {\n const listChildren = async (parentId: string): Promise<ITask[]> => {\n const { items } = await context.tasks.listTasks({\n where: { parentId }\n });\n return items;\n };\n\n const collectSubtree = async (rootId: string): Promise<ITask[]> => {\n const root = await context.tasks.getTask(rootId);\n if (!root) {\n return [];\n }\n const order: ITask[] = [root];\n const seen = new Set<string>([root.id]);\n let i = 0;\n while (i < order.length) {\n const current = order[i++];\n const kids = await listChildren(current.id);\n for (const kid of kids) {\n if (seen.has(kid.id)) {\n continue;\n }\n seen.add(kid.id);\n order.push(kid);\n }\n }\n return order.reverse();\n };\n\n const deleteTaskLogs = async (task: ITask): Promise<void> => {\n const definition = context.tasks.getDefinition(task.definitionId);\n if (!definition || definition.databaseLogs !== true) {\n return;\n }\n try {\n const { items } = await context.tasks.listLogs({\n where: { task: task.id }\n });\n for (const log of items) {\n try {\n await context.tasks.deleteLog(log.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete log \"${log.id}\" for task \"${task.id}\": ${ex.message}`\n );\n }\n }\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to list logs for task \"${task.id}\": ${ex.message}`\n );\n }\n };\n\n return async (rootId: string): Promise<void> => {\n const ordered = await collectSubtree(rootId);\n for (const task of ordered) {\n await deleteTaskLogs(task);\n try {\n await context.tasks.deleteTask(task.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete task \"${task.id}\": ${ex.message}`\n );\n }\n }\n };\n};\n"],"names":["createCleanupTaskSubtree","context","listChildren","parentId","items","collectSubtree","rootId","root","order","seen","Set","i","current","kids","kid","deleteTaskLogs","task","definition","log","ex","console","ordered"],"mappings":"AAQO,MAAMA,2BAA2B,CAACC;IACrC,MAAMC,eAAe,OAAOC;QACxB,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAMH,QAAQ,KAAK,CAAC,SAAS,CAAC;YAC5C,OAAO;gBAAEE;YAAS;QACtB;QACA,OAAOC;IACX;IAEA,MAAMC,iBAAiB,OAAOC;QAC1B,MAAMC,OAAO,MAAMN,QAAQ,KAAK,CAAC,OAAO,CAACK;QACzC,IAAI,CAACC,MACD,OAAO,EAAE;QAEb,MAAMC,QAAiB;YAACD;SAAK;QAC7B,MAAME,OAAO,IAAIC,IAAY;YAACH,KAAK,EAAE;SAAC;QACtC,IAAII,IAAI;QACR,MAAOA,IAAIH,MAAM,MAAM,CAAE;YACrB,MAAMI,UAAUJ,KAAK,CAACG,IAAI;YAC1B,MAAME,OAAO,MAAMX,aAAaU,QAAQ,EAAE;YAC1C,KAAK,MAAME,OAAOD,KACd,KAAIJ,KAAK,GAAG,CAACK,IAAI,EAAE;gBAGnBL,KAAK,GAAG,CAACK,IAAI,EAAE;gBACfN,MAAM,IAAI,CAACM;;QAEnB;QACA,OAAON,MAAM,OAAO;IACxB;IAEA,MAAMO,iBAAiB,OAAOC;QAC1B,MAAMC,aAAahB,QAAQ,KAAK,CAAC,aAAa,CAACe,KAAK,YAAY;QAChE,IAAI,CAACC,cAAcA,AAA4B,SAA5BA,WAAW,YAAY,EACtC;QAEJ,IAAI;YACA,MAAM,EAAEb,KAAK,EAAE,GAAG,MAAMH,QAAQ,KAAK,CAAC,QAAQ,CAAC;gBAC3C,OAAO;oBAAE,MAAMe,KAAK,EAAE;gBAAC;YAC3B;YACA,KAAK,MAAME,OAAOd,MACd,IAAI;gBACA,MAAMH,QAAQ,KAAK,CAAC,SAAS,CAACiB,IAAI,EAAE;YACxC,EAAE,OAAOC,IAAS;gBACdC,QAAQ,IAAI,CACR,CAAC,0CAA0C,EAAEF,IAAI,EAAE,CAAC,YAAY,EAAEF,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;YAEnG;QAER,EAAE,OAAOA,IAAS;YACdC,QAAQ,IAAI,CACR,CAAC,kDAAkD,EAAEJ,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;QAEtF;IACJ;IAEA,OAAO,OAAOb;QACV,MAAMe,UAAU,MAAMhB,eAAeC;QACrC,KAAK,MAAMU,QAAQK,QAAS;YACxB,MAAMN,eAAeC;YACrB,IAAI;gBACA,MAAMf,QAAQ,KAAK,CAAC,UAAU,CAACe,KAAK,EAAE;YAC1C,EAAE,OAAOG,IAAS;gBACdC,QAAQ,IAAI,CACR,CAAC,2CAA2C,EAAEJ,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;YAE/E;QACJ;IACJ;AACJ"}