@milaboratories/pl-middle-layer 1.42.2 → 1.42.4

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 (410) hide show
  1. package/dist/block_registry/index.d.ts +0 -1
  2. package/dist/block_registry/registry-v2-provider.cjs +22 -0
  3. package/dist/block_registry/registry-v2-provider.cjs.map +1 -0
  4. package/dist/block_registry/registry-v2-provider.d.ts +0 -1
  5. package/dist/block_registry/registry-v2-provider.js +20 -0
  6. package/dist/block_registry/registry-v2-provider.js.map +1 -0
  7. package/dist/block_registry/registry.cjs +231 -0
  8. package/dist/block_registry/registry.cjs.map +1 -0
  9. package/dist/block_registry/registry.d.ts +0 -1
  10. package/dist/block_registry/registry.js +227 -0
  11. package/dist/block_registry/registry.js.map +1 -0
  12. package/dist/block_registry/registry.test.d.ts +0 -1
  13. package/dist/block_registry/watcher.cjs +174 -0
  14. package/dist/block_registry/watcher.cjs.map +1 -0
  15. package/dist/block_registry/watcher.d.ts +0 -1
  16. package/dist/block_registry/watcher.js +171 -0
  17. package/dist/block_registry/watcher.js.map +1 -0
  18. package/dist/block_registry/well_known_registries.cjs +19 -0
  19. package/dist/block_registry/well_known_registries.cjs.map +1 -0
  20. package/dist/block_registry/well_known_registries.d.ts +0 -1
  21. package/dist/block_registry/well_known_registries.js +15 -0
  22. package/dist/block_registry/well_known_registries.js.map +1 -0
  23. package/dist/cfg_render/executor.cjs +159 -0
  24. package/dist/cfg_render/executor.cjs.map +1 -0
  25. package/dist/cfg_render/executor.d.ts +0 -1
  26. package/dist/cfg_render/executor.js +156 -0
  27. package/dist/cfg_render/executor.js.map +1 -0
  28. package/dist/cfg_render/executor.test.d.ts +0 -1
  29. package/dist/cfg_render/operation.d.ts +0 -1
  30. package/dist/cfg_render/renderer.cjs +528 -0
  31. package/dist/cfg_render/renderer.cjs.map +1 -0
  32. package/dist/cfg_render/renderer.d.ts +0 -1
  33. package/dist/cfg_render/renderer.js +525 -0
  34. package/dist/cfg_render/renderer.js.map +1 -0
  35. package/dist/cfg_render/traverse.cjs +65 -0
  36. package/dist/cfg_render/traverse.cjs.map +1 -0
  37. package/dist/cfg_render/traverse.d.ts +0 -1
  38. package/dist/cfg_render/traverse.js +63 -0
  39. package/dist/cfg_render/traverse.js.map +1 -0
  40. package/dist/cfg_render/util.cjs +32 -0
  41. package/dist/cfg_render/util.cjs.map +1 -0
  42. package/dist/cfg_render/util.d.ts +0 -1
  43. package/dist/cfg_render/util.js +28 -0
  44. package/dist/cfg_render/util.js.map +1 -0
  45. package/dist/debug/index.cjs +21 -0
  46. package/dist/debug/index.cjs.map +1 -0
  47. package/dist/debug/index.d.ts +0 -1
  48. package/dist/debug/index.js +19 -0
  49. package/dist/debug/index.js.map +1 -0
  50. package/dist/dev_env/index.cjs +59 -0
  51. package/dist/dev_env/index.cjs.map +1 -0
  52. package/dist/dev_env/index.d.ts +0 -1
  53. package/dist/dev_env/index.js +48 -0
  54. package/dist/dev_env/index.js.map +1 -0
  55. package/dist/dev_env/util.cjs +37 -0
  56. package/dist/dev_env/util.cjs.map +1 -0
  57. package/dist/dev_env/util.d.ts +0 -1
  58. package/dist/dev_env/util.js +16 -0
  59. package/dist/dev_env/util.js.map +1 -0
  60. package/dist/index.cjs +74 -0
  61. package/dist/index.cjs.map +1 -0
  62. package/dist/index.d.ts +0 -1
  63. package/dist/index.js +15 -75
  64. package/dist/index.js.map +1 -1
  65. package/dist/js_render/computable_context.cjs +525 -0
  66. package/dist/js_render/computable_context.cjs.map +1 -0
  67. package/dist/js_render/computable_context.d.ts +0 -1
  68. package/dist/js_render/computable_context.js +523 -0
  69. package/dist/js_render/computable_context.js.map +1 -0
  70. package/dist/js_render/context.cjs +229 -0
  71. package/dist/js_render/context.cjs.map +1 -0
  72. package/dist/js_render/context.d.ts +0 -1
  73. package/dist/js_render/context.js +226 -0
  74. package/dist/js_render/context.js.map +1 -0
  75. package/dist/js_render/index.cjs +163 -0
  76. package/dist/js_render/index.cjs.map +1 -0
  77. package/dist/js_render/index.d.ts +0 -1
  78. package/dist/js_render/index.js +160 -0
  79. package/dist/js_render/index.js.map +1 -0
  80. package/dist/middle_layer/active_cfg.cjs +37 -0
  81. package/dist/middle_layer/active_cfg.cjs.map +1 -0
  82. package/dist/middle_layer/active_cfg.d.ts +0 -1
  83. package/dist/middle_layer/active_cfg.js +35 -0
  84. package/dist/middle_layer/active_cfg.js.map +1 -0
  85. package/dist/middle_layer/block.cjs +51 -0
  86. package/dist/middle_layer/block.cjs.map +1 -0
  87. package/dist/middle_layer/block.d.ts +0 -1
  88. package/dist/middle_layer/block.js +48 -0
  89. package/dist/middle_layer/block.js.map +1 -0
  90. package/dist/middle_layer/block_ctx.cjs +87 -0
  91. package/dist/middle_layer/block_ctx.cjs.map +1 -0
  92. package/dist/middle_layer/block_ctx.d.ts +0 -1
  93. package/dist/middle_layer/block_ctx.js +84 -0
  94. package/dist/middle_layer/block_ctx.js.map +1 -0
  95. package/dist/middle_layer/block_ctx_unsafe.cjs +19 -0
  96. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -0
  97. package/dist/middle_layer/block_ctx_unsafe.d.ts +0 -1
  98. package/dist/middle_layer/block_ctx_unsafe.js +16 -0
  99. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -0
  100. package/dist/middle_layer/driver_kit.cjs +42 -0
  101. package/dist/middle_layer/driver_kit.cjs.map +1 -0
  102. package/dist/middle_layer/driver_kit.d.ts +0 -1
  103. package/dist/middle_layer/driver_kit.js +40 -0
  104. package/dist/middle_layer/driver_kit.js.map +1 -0
  105. package/dist/middle_layer/frontend_path.cjs +64 -0
  106. package/dist/middle_layer/frontend_path.cjs.map +1 -0
  107. package/dist/middle_layer/frontend_path.d.ts +0 -1
  108. package/dist/middle_layer/frontend_path.js +62 -0
  109. package/dist/middle_layer/frontend_path.js.map +1 -0
  110. package/dist/middle_layer/index.d.ts +0 -1
  111. package/dist/middle_layer/middle_layer.cjs +226 -0
  112. package/dist/middle_layer/middle_layer.cjs.map +1 -0
  113. package/dist/middle_layer/middle_layer.d.ts +0 -1
  114. package/dist/middle_layer/middle_layer.js +224 -0
  115. package/dist/middle_layer/middle_layer.js.map +1 -0
  116. package/dist/middle_layer/navigation_states.cjs +41 -0
  117. package/dist/middle_layer/navigation_states.cjs.map +1 -0
  118. package/dist/middle_layer/navigation_states.d.ts +0 -1
  119. package/dist/middle_layer/navigation_states.js +39 -0
  120. package/dist/middle_layer/navigation_states.js.map +1 -0
  121. package/dist/middle_layer/ops.cjs +75 -0
  122. package/dist/middle_layer/ops.cjs.map +1 -0
  123. package/dist/middle_layer/ops.d.ts +0 -1
  124. package/dist/middle_layer/ops.js +70 -0
  125. package/dist/middle_layer/ops.js.map +1 -0
  126. package/dist/middle_layer/project.cjs +446 -0
  127. package/dist/middle_layer/project.cjs.map +1 -0
  128. package/dist/middle_layer/project.d.ts +0 -1
  129. package/dist/middle_layer/project.js +444 -0
  130. package/dist/middle_layer/project.js.map +1 -0
  131. package/dist/middle_layer/project_list.cjs +53 -0
  132. package/dist/middle_layer/project_list.cjs.map +1 -0
  133. package/dist/middle_layer/project_list.d.ts +0 -1
  134. package/dist/middle_layer/project_list.js +48 -0
  135. package/dist/middle_layer/project_list.js.map +1 -0
  136. package/dist/middle_layer/project_overview.cjs +225 -0
  137. package/dist/middle_layer/project_overview.cjs.map +1 -0
  138. package/dist/middle_layer/project_overview.d.ts +0 -1
  139. package/dist/middle_layer/project_overview.js +204 -0
  140. package/dist/middle_layer/project_overview.js.map +1 -0
  141. package/dist/middle_layer/project_overview_light.cjs +20 -0
  142. package/dist/middle_layer/project_overview_light.cjs.map +1 -0
  143. package/dist/middle_layer/project_overview_light.d.ts +0 -1
  144. package/dist/middle_layer/project_overview_light.js +18 -0
  145. package/dist/middle_layer/project_overview_light.js.map +1 -0
  146. package/dist/middle_layer/render.cjs +26 -0
  147. package/dist/middle_layer/render.cjs.map +1 -0
  148. package/dist/middle_layer/render.d.ts +0 -1
  149. package/dist/middle_layer/render.js +23 -0
  150. package/dist/middle_layer/render.js.map +1 -0
  151. package/dist/middle_layer/render.test.d.ts +0 -1
  152. package/dist/middle_layer/types.d.ts +0 -1
  153. package/dist/middle_layer/util.cjs +22 -0
  154. package/dist/middle_layer/util.cjs.map +1 -0
  155. package/dist/middle_layer/util.d.ts +0 -1
  156. package/dist/middle_layer/util.js +20 -0
  157. package/dist/middle_layer/util.js.map +1 -0
  158. package/dist/model/args.cjs +62 -0
  159. package/dist/model/args.cjs.map +1 -0
  160. package/dist/model/args.d.ts +0 -1
  161. package/dist/model/args.js +58 -0
  162. package/dist/model/args.js.map +1 -0
  163. package/dist/model/block_pack.d.ts +0 -1
  164. package/dist/model/block_pack_spec.cjs +11 -0
  165. package/dist/model/block_pack_spec.cjs.map +1 -0
  166. package/dist/model/block_pack_spec.d.ts +0 -1
  167. package/dist/model/block_pack_spec.js +8 -0
  168. package/dist/model/block_pack_spec.js.map +1 -0
  169. package/dist/model/frontend.d.ts +0 -1
  170. package/dist/model/index.d.ts +0 -1
  171. package/dist/model/project_helper.cjs +36 -0
  172. package/dist/model/project_helper.cjs.map +1 -0
  173. package/dist/model/project_helper.d.ts +0 -1
  174. package/dist/model/project_helper.js +34 -0
  175. package/dist/model/project_helper.js.map +1 -0
  176. package/dist/model/project_model.cjs +74 -0
  177. package/dist/model/project_model.cjs.map +1 -0
  178. package/dist/model/project_model.d.ts +0 -1
  179. package/dist/model/project_model.js +54 -0
  180. package/dist/model/project_model.js.map +1 -0
  181. package/dist/model/project_model.test.d.ts +0 -1
  182. package/dist/model/project_model_util.cjs +176 -0
  183. package/dist/model/project_model_util.cjs.map +1 -0
  184. package/dist/model/project_model_util.d.ts +0 -1
  185. package/dist/model/project_model_util.js +170 -0
  186. package/dist/model/project_model_util.js.map +1 -0
  187. package/dist/model/project_model_util.test.d.ts +0 -1
  188. package/dist/model/project_model_v1.cjs +9 -0
  189. package/dist/model/project_model_v1.cjs.map +1 -0
  190. package/dist/model/project_model_v1.d.ts +0 -1
  191. package/dist/model/project_model_v1.js +6 -0
  192. package/dist/model/project_model_v1.js.map +1 -0
  193. package/dist/model/template_spec.d.ts +0 -1
  194. package/dist/mutator/block-pack/block_pack.cjs +233 -0
  195. package/dist/mutator/block-pack/block_pack.cjs.map +1 -0
  196. package/dist/mutator/block-pack/block_pack.d.ts +0 -1
  197. package/dist/mutator/block-pack/block_pack.js +227 -0
  198. package/dist/mutator/block-pack/block_pack.js.map +1 -0
  199. package/dist/mutator/block-pack/block_pack.test.d.ts +0 -1
  200. package/dist/mutator/block-pack/frontend.cjs +21 -0
  201. package/dist/mutator/block-pack/frontend.cjs.map +1 -0
  202. package/dist/mutator/block-pack/frontend.d.ts +0 -1
  203. package/dist/mutator/block-pack/frontend.js +19 -0
  204. package/dist/mutator/block-pack/frontend.js.map +1 -0
  205. package/dist/mutator/context_export.cjs +26 -0
  206. package/dist/mutator/context_export.cjs.map +1 -0
  207. package/dist/mutator/context_export.d.ts +2 -3
  208. package/dist/mutator/context_export.js +23 -0
  209. package/dist/mutator/context_export.js.map +1 -0
  210. package/dist/mutator/migration.cjs +57 -0
  211. package/dist/mutator/migration.cjs.map +1 -0
  212. package/dist/mutator/migration.d.ts +0 -1
  213. package/dist/mutator/migration.js +55 -0
  214. package/dist/mutator/migration.js.map +1 -0
  215. package/dist/mutator/project.cjs +997 -0
  216. package/dist/mutator/project.cjs.map +1 -0
  217. package/dist/mutator/project.d.ts +0 -1
  218. package/dist/mutator/project.js +992 -0
  219. package/dist/mutator/project.js.map +1 -0
  220. package/dist/mutator/project.test.d.ts +0 -1
  221. package/dist/mutator/template/direct_template_loader.cjs +146 -0
  222. package/dist/mutator/template/direct_template_loader.cjs.map +1 -0
  223. package/dist/mutator/template/direct_template_loader.d.ts +0 -1
  224. package/dist/mutator/template/direct_template_loader.js +143 -0
  225. package/dist/mutator/template/direct_template_loader.js.map +1 -0
  226. package/dist/mutator/template/direct_template_loader_v3.cjs +139 -0
  227. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -0
  228. package/dist/mutator/template/direct_template_loader_v3.d.ts +0 -1
  229. package/dist/mutator/template/direct_template_loader_v3.js +137 -0
  230. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -0
  231. package/dist/mutator/template/render_block.cjs +43 -0
  232. package/dist/mutator/template/render_block.cjs.map +1 -0
  233. package/dist/mutator/template/render_block.d.ts +0 -1
  234. package/dist/mutator/template/render_block.js +34 -0
  235. package/dist/mutator/template/render_block.js.map +1 -0
  236. package/dist/mutator/template/render_template.cjs +35 -0
  237. package/dist/mutator/template/render_template.cjs.map +1 -0
  238. package/dist/mutator/template/render_template.d.ts +0 -1
  239. package/dist/mutator/template/render_template.js +33 -0
  240. package/dist/mutator/template/render_template.js.map +1 -0
  241. package/dist/mutator/template/template_loading.cjs +71 -0
  242. package/dist/mutator/template/template_loading.cjs.map +1 -0
  243. package/dist/mutator/template/template_loading.d.ts +0 -1
  244. package/dist/mutator/template/template_loading.js +60 -0
  245. package/dist/mutator/template/template_loading.js.map +1 -0
  246. package/dist/mutator/template/template_render.test.d.ts +0 -1
  247. package/dist/network_check/network_check.cjs +267 -0
  248. package/dist/network_check/network_check.cjs.map +1 -0
  249. package/dist/network_check/network_check.d.ts +0 -1
  250. package/dist/network_check/network_check.js +264 -0
  251. package/dist/network_check/network_check.js.map +1 -0
  252. package/dist/network_check/network_check.test.d.ts +0 -1
  253. package/dist/network_check/pings.cjs +107 -0
  254. package/dist/network_check/pings.cjs.map +1 -0
  255. package/dist/network_check/pings.d.ts +0 -1
  256. package/dist/network_check/pings.js +96 -0
  257. package/dist/network_check/pings.js.map +1 -0
  258. package/dist/network_check/template.cjs +318 -0
  259. package/dist/network_check/template.cjs.map +1 -0
  260. package/dist/network_check/template.d.ts +0 -1
  261. package/dist/network_check/template.js +302 -0
  262. package/dist/network_check/template.js.map +1 -0
  263. package/dist/network_check/template.test.d.ts +0 -1
  264. package/dist/network_check/test_utils.d.ts +0 -1
  265. package/dist/node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.45.1_tslib@2.7.0_typescript@5.6.3/node_modules/tslib/tslib.es6.cjs +77 -0
  266. package/dist/node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.45.1_tslib@2.7.0_typescript@5.6.3/node_modules/tslib/tslib.es6.cjs.map +1 -0
  267. package/dist/node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.45.1_tslib@2.7.0_typescript@5.6.3/node_modules/tslib/tslib.es6.js +74 -0
  268. package/dist/node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.45.1_tslib@2.7.0_typescript@5.6.3/node_modules/tslib/tslib.es6.js.map +1 -0
  269. package/dist/pool/data.cjs +298 -0
  270. package/dist/pool/data.cjs.map +1 -0
  271. package/dist/pool/data.d.ts +7 -9
  272. package/dist/pool/data.js +282 -0
  273. package/dist/pool/data.js.map +1 -0
  274. package/dist/pool/driver.cjs +620 -0
  275. package/dist/pool/driver.cjs.map +1 -0
  276. package/dist/pool/driver.d.ts +0 -1
  277. package/dist/pool/driver.js +598 -0
  278. package/dist/pool/driver.js.map +1 -0
  279. package/dist/pool/index.d.ts +0 -1
  280. package/dist/pool/p_object_collection.cjs +87 -0
  281. package/dist/pool/p_object_collection.cjs.map +1 -0
  282. package/dist/pool/p_object_collection.d.ts +0 -1
  283. package/dist/pool/p_object_collection.js +84 -0
  284. package/dist/pool/p_object_collection.js.map +1 -0
  285. package/dist/pool/ref_count_pool.cjs +58 -0
  286. package/dist/pool/ref_count_pool.cjs.map +1 -0
  287. package/dist/pool/ref_count_pool.d.ts +0 -1
  288. package/dist/pool/ref_count_pool.js +56 -0
  289. package/dist/pool/ref_count_pool.js.map +1 -0
  290. package/dist/pool/result_pool.cjs +265 -0
  291. package/dist/pool/result_pool.cjs.map +1 -0
  292. package/dist/pool/result_pool.d.ts +0 -1
  293. package/dist/pool/result_pool.js +263 -0
  294. package/dist/pool/result_pool.js.map +1 -0
  295. package/dist/test/block_packs.d.ts +0 -1
  296. package/dist/test/explicit_templates.d.ts +0 -1
  297. package/dist/test/known_templates.d.ts +0 -1
  298. package/dist/test_env.d.ts +0 -1
  299. package/dist/worker/WorkerManager.cjs +53 -0
  300. package/dist/worker/WorkerManager.cjs.map +1 -0
  301. package/dist/worker/WorkerManager.d.ts +0 -1
  302. package/dist/worker/WorkerManager.js +51 -0
  303. package/dist/worker/WorkerManager.js.map +1 -0
  304. package/dist/worker/worker.cjs +16 -0
  305. package/dist/worker/worker.cjs.map +1 -0
  306. package/dist/worker/worker.d.ts +0 -1
  307. package/dist/worker/worker.js +14 -0
  308. package/dist/worker/worker.js.map +1 -0
  309. package/dist/worker/workerApi.cjs +20 -0
  310. package/dist/worker/workerApi.cjs.map +1 -0
  311. package/dist/worker/workerApi.d.ts +1 -3
  312. package/dist/worker/workerApi.js +18 -0
  313. package/dist/worker/workerApi.js.map +1 -0
  314. package/package.json +25 -33
  315. package/src/cfg_render/executor.test.ts +5 -4
  316. package/src/model/project_model.test.ts +3 -3
  317. package/src/model/project_model_util.test.ts +3 -2
  318. package/src/mutator/block-pack/block_pack.test.ts +5 -4
  319. package/src/mutator/project.test.ts +4 -4
  320. package/src/mutator/template/template_render.test.ts +7 -6
  321. package/src/network_check/network_check.test.ts +1 -0
  322. package/src/network_check/test_utils.ts +2 -0
  323. package/src/worker/WorkerManager.ts +6 -8
  324. package/dist/block_registry/index.d.ts.map +0 -1
  325. package/dist/block_registry/registry-v2-provider.d.ts.map +0 -1
  326. package/dist/block_registry/registry.d.ts.map +0 -1
  327. package/dist/block_registry/registry.test.d.ts.map +0 -1
  328. package/dist/block_registry/watcher.d.ts.map +0 -1
  329. package/dist/block_registry/well_known_registries.d.ts.map +0 -1
  330. package/dist/cfg_render/executor.d.ts.map +0 -1
  331. package/dist/cfg_render/executor.test.d.ts.map +0 -1
  332. package/dist/cfg_render/operation.d.ts.map +0 -1
  333. package/dist/cfg_render/renderer.d.ts.map +0 -1
  334. package/dist/cfg_render/traverse.d.ts.map +0 -1
  335. package/dist/cfg_render/util.d.ts.map +0 -1
  336. package/dist/debug/index.d.ts.map +0 -1
  337. package/dist/dev_env/index.d.ts.map +0 -1
  338. package/dist/dev_env/util.d.ts.map +0 -1
  339. package/dist/index.d.ts.map +0 -1
  340. package/dist/index.mjs +0 -6742
  341. package/dist/index.mjs.map +0 -1
  342. package/dist/js_render/computable_context.d.ts.map +0 -1
  343. package/dist/js_render/context.d.ts.map +0 -1
  344. package/dist/js_render/index.d.ts.map +0 -1
  345. package/dist/middle_layer/active_cfg.d.ts.map +0 -1
  346. package/dist/middle_layer/block.d.ts.map +0 -1
  347. package/dist/middle_layer/block_ctx.d.ts.map +0 -1
  348. package/dist/middle_layer/block_ctx_unsafe.d.ts.map +0 -1
  349. package/dist/middle_layer/driver_kit.d.ts.map +0 -1
  350. package/dist/middle_layer/frontend_path.d.ts.map +0 -1
  351. package/dist/middle_layer/index.d.ts.map +0 -1
  352. package/dist/middle_layer/middle_layer.d.ts.map +0 -1
  353. package/dist/middle_layer/navigation_states.d.ts.map +0 -1
  354. package/dist/middle_layer/ops.d.ts.map +0 -1
  355. package/dist/middle_layer/project.d.ts.map +0 -1
  356. package/dist/middle_layer/project_list.d.ts.map +0 -1
  357. package/dist/middle_layer/project_overview.d.ts.map +0 -1
  358. package/dist/middle_layer/project_overview_light.d.ts.map +0 -1
  359. package/dist/middle_layer/render.d.ts.map +0 -1
  360. package/dist/middle_layer/render.test.d.ts.map +0 -1
  361. package/dist/middle_layer/types.d.ts.map +0 -1
  362. package/dist/middle_layer/util.d.ts.map +0 -1
  363. package/dist/model/args.d.ts.map +0 -1
  364. package/dist/model/block_pack.d.ts.map +0 -1
  365. package/dist/model/block_pack_spec.d.ts.map +0 -1
  366. package/dist/model/frontend.d.ts.map +0 -1
  367. package/dist/model/index.d.ts.map +0 -1
  368. package/dist/model/project_helper.d.ts.map +0 -1
  369. package/dist/model/project_model.d.ts.map +0 -1
  370. package/dist/model/project_model.test.d.ts.map +0 -1
  371. package/dist/model/project_model_util.d.ts.map +0 -1
  372. package/dist/model/project_model_util.test.d.ts.map +0 -1
  373. package/dist/model/project_model_v1.d.ts.map +0 -1
  374. package/dist/model/template_spec.d.ts.map +0 -1
  375. package/dist/mutator/block-pack/block_pack.d.ts.map +0 -1
  376. package/dist/mutator/block-pack/block_pack.test.d.ts.map +0 -1
  377. package/dist/mutator/block-pack/frontend.d.ts.map +0 -1
  378. package/dist/mutator/context_export.d.ts.map +0 -1
  379. package/dist/mutator/migration.d.ts.map +0 -1
  380. package/dist/mutator/project.d.ts.map +0 -1
  381. package/dist/mutator/project.test.d.ts.map +0 -1
  382. package/dist/mutator/template/direct_template_loader.d.ts.map +0 -1
  383. package/dist/mutator/template/direct_template_loader_v3.d.ts.map +0 -1
  384. package/dist/mutator/template/render_block.d.ts.map +0 -1
  385. package/dist/mutator/template/render_template.d.ts.map +0 -1
  386. package/dist/mutator/template/template_loading.d.ts.map +0 -1
  387. package/dist/mutator/template/template_render.test.d.ts.map +0 -1
  388. package/dist/network_check/network_check.d.ts.map +0 -1
  389. package/dist/network_check/network_check.test.d.ts.map +0 -1
  390. package/dist/network_check/pings.d.ts.map +0 -1
  391. package/dist/network_check/template.d.ts.map +0 -1
  392. package/dist/network_check/template.test.d.ts.map +0 -1
  393. package/dist/network_check/test_utils.d.ts.map +0 -1
  394. package/dist/pool/data.d.ts.map +0 -1
  395. package/dist/pool/driver.d.ts.map +0 -1
  396. package/dist/pool/index.d.ts.map +0 -1
  397. package/dist/pool/p_object_collection.d.ts.map +0 -1
  398. package/dist/pool/ref_count_pool.d.ts.map +0 -1
  399. package/dist/pool/result_pool.d.ts.map +0 -1
  400. package/dist/test/block_packs.d.ts.map +0 -1
  401. package/dist/test/explicit_templates.d.ts.map +0 -1
  402. package/dist/test/known_templates.d.ts.map +0 -1
  403. package/dist/test_env.d.ts.map +0 -1
  404. package/dist/worker/WorkerManager.d.ts.map +0 -1
  405. package/dist/worker/worker.d.ts.map +0 -1
  406. package/dist/worker/workerApi.d.ts.map +0 -1
  407. package/dist/worker.js +0 -2
  408. package/dist/worker.js.map +0 -1
  409. package/dist/worker.mjs +0 -20
  410. package/dist/worker.mjs.map +0 -1
@@ -0,0 +1,997 @@
1
+ 'use strict';
2
+
3
+ var plClient = require('@milaboratories/pl-client');
4
+ var render_block = require('./template/render_block.cjs');
5
+ var project_model = require('../model/project_model.cjs');
6
+ var block_pack = require('./block-pack/block_pack.cjs');
7
+ var project_model_util = require('../model/project_model_util.cjs');
8
+ var plModelMiddleLayer = require('@milaboratories/pl-model-middle-layer');
9
+ var Denque = require('denque');
10
+ var context_export = require('./context_export.cjs');
11
+ var template_loading = require('./template/template_loading.cjs');
12
+ var tsHelpers = require('@milaboratories/ts-helpers');
13
+ var model = require('@platforma-sdk/model');
14
+ var index = require('../debug/index.cjs');
15
+
16
+ function cached(modIdCb, valueCb) {
17
+ let initialized = false;
18
+ let lastModId = undefined;
19
+ let value = undefined;
20
+ return () => {
21
+ if (!initialized) {
22
+ initialized = true;
23
+ lastModId = modIdCb();
24
+ value = valueCb();
25
+ return value;
26
+ }
27
+ const currentModId = modIdCb();
28
+ if (lastModId !== currentModId) {
29
+ lastModId = currentModId;
30
+ value = valueCb();
31
+ }
32
+ return valueCb();
33
+ };
34
+ }
35
+ class BlockInfo {
36
+ id;
37
+ fields;
38
+ config;
39
+ source;
40
+ constructor(id, fields, config, source) {
41
+ this.id = id;
42
+ this.fields = fields;
43
+ this.config = config;
44
+ this.source = source;
45
+ }
46
+ check() {
47
+ // state assertions
48
+ if ((this.fields.prodOutput === undefined) !== (this.fields.prodCtx === undefined))
49
+ throw new Error('inconsistent prod fields');
50
+ if ((this.fields.stagingOutput === undefined) !== (this.fields.stagingCtx === undefined))
51
+ throw new Error('inconsistent stage fields');
52
+ if ((this.fields.prodOutputPrevious === undefined)
53
+ !== (this.fields.prodCtxPrevious === undefined))
54
+ throw new Error('inconsistent prod cache fields');
55
+ if ((this.fields.stagingOutputPrevious === undefined)
56
+ !== (this.fields.stagingCtxPrevious === undefined))
57
+ throw new Error('inconsistent stage cache fields');
58
+ if (this.fields.blockPack === undefined)
59
+ throw new Error('no block pack field');
60
+ if (this.fields.currentArgs === undefined)
61
+ throw new Error('no current args field');
62
+ }
63
+ currentArgsC = cached(() => this.fields.currentArgs.modCount, () => tsHelpers.cachedDeserialize(this.fields.currentArgs.value));
64
+ prodArgsC = cached(() => this.fields.prodArgs?.modCount, () => {
65
+ const bin = this.fields.prodArgs?.value;
66
+ if (bin === undefined)
67
+ return undefined;
68
+ return tsHelpers.cachedDeserialize(bin);
69
+ });
70
+ get currentArgs() {
71
+ return this.currentArgsC();
72
+ }
73
+ get stagingRendered() {
74
+ return this.fields.stagingCtx !== undefined;
75
+ }
76
+ get productionRendered() {
77
+ return this.fields.prodCtx !== undefined;
78
+ }
79
+ get productionHasErrors() {
80
+ return this.fields.prodUiCtx?.status === 'Error';
81
+ }
82
+ productionStaleC = cached(() => `${this.fields.currentArgs.modCount}_${this.fields.prodArgs?.modCount}`, () => this.fields.prodArgs === undefined
83
+ || Buffer.compare(this.fields.currentArgs.value, this.fields.prodArgs.value) !== 0);
84
+ // get productionStale(): boolean {
85
+ // return this.productionRendered && this.productionStaleC() && ;
86
+ // }
87
+ get requireProductionRendering() {
88
+ return !this.productionRendered || this.productionStaleC() || this.productionHasErrors;
89
+ }
90
+ get prodArgs() {
91
+ return this.prodArgsC();
92
+ }
93
+ getTemplate(tx) {
94
+ return tx.getFutureFieldValue(plClient.Pl.unwrapHolder(tx, this.fields.blockPack.ref), block_pack.BlockPackTemplateField, 'Input');
95
+ }
96
+ }
97
+ const NoNewBlocks = (blockId) => {
98
+ throw new Error(`No new block info for ${blockId}`);
99
+ };
100
+ class ProjectMutator {
101
+ rid;
102
+ tx;
103
+ author;
104
+ schema;
105
+ lastModified;
106
+ meta;
107
+ struct;
108
+ renderingState;
109
+ blocksInLimbo;
110
+ blockInfos;
111
+ ctxExportTplHolder;
112
+ projectHelper;
113
+ globalModCount = 0;
114
+ fieldsChanged = false;
115
+ //
116
+ // Change trackers
117
+ //
118
+ lastModifiedChanged = false;
119
+ structureChanged = false;
120
+ metaChanged = false;
121
+ renderingStateChanged = false;
122
+ /** Set blocks will be assigned current mutator author marker on save */
123
+ blocksWithChangedInputs = new Set();
124
+ constructor(rid, tx, author, schema, lastModified, meta, struct, renderingState, blocksInLimbo, blockInfos, ctxExportTplHolder, projectHelper) {
125
+ this.rid = rid;
126
+ this.tx = tx;
127
+ this.author = author;
128
+ this.schema = schema;
129
+ this.lastModified = lastModified;
130
+ this.meta = meta;
131
+ this.struct = struct;
132
+ this.renderingState = renderingState;
133
+ this.blocksInLimbo = blocksInLimbo;
134
+ this.blockInfos = blockInfos;
135
+ this.ctxExportTplHolder = ctxExportTplHolder;
136
+ this.projectHelper = projectHelper;
137
+ }
138
+ fixProblemsAndMigrate() {
139
+ // Fixing problems introduced by old code
140
+ this.blockInfos.forEach((blockInfo) => {
141
+ if (blockInfo.fields.prodArgs === undefined
142
+ || blockInfo.fields.prodOutput === undefined
143
+ || blockInfo.fields.prodCtx === undefined)
144
+ this.deleteBlockFields(blockInfo.id, 'prodArgs', 'prodOutput', 'prodCtx');
145
+ });
146
+ // Migration for addition of block settings field
147
+ let initialBlockSettings;
148
+ this.blockInfos.forEach((blockInfo) => {
149
+ if (blockInfo.fields.blockSettings === undefined) {
150
+ if (initialBlockSettings === undefined)
151
+ initialBlockSettings = this.createJsonFieldValue(plModelMiddleLayer.InitialBlockSettings);
152
+ this.setBlockFieldObj(blockInfo.id, 'blockSettings', initialBlockSettings);
153
+ }
154
+ });
155
+ }
156
+ get wasModified() {
157
+ return (this.lastModifiedChanged
158
+ || this.structureChanged
159
+ || this.fieldsChanged
160
+ || this.metaChanged
161
+ || this.renderingStateChanged);
162
+ }
163
+ get structure() {
164
+ // clone
165
+ return JSON.parse(JSON.stringify(this.struct));
166
+ }
167
+ //
168
+ // Graph calculation
169
+ //
170
+ stagingGraph = undefined;
171
+ pendingProductionGraph = undefined;
172
+ actualProductionGraph = undefined;
173
+ getStagingGraph() {
174
+ if (this.stagingGraph === undefined)
175
+ this.stagingGraph = project_model_util.stagingGraph(this.struct);
176
+ return this.stagingGraph;
177
+ }
178
+ getProductionGraphBlockInfo(blockId, prod) {
179
+ const bInfo = this.getBlockInfo(blockId);
180
+ let argsField;
181
+ let args;
182
+ if (prod) {
183
+ if (bInfo.fields.prodArgs === undefined)
184
+ return undefined;
185
+ argsField = bInfo.fields.prodArgs;
186
+ args = bInfo.prodArgs;
187
+ }
188
+ else {
189
+ argsField = tsHelpers.notEmpty(bInfo.fields.currentArgs);
190
+ args = bInfo.currentArgs;
191
+ }
192
+ const blockPackField = tsHelpers.notEmpty(bInfo.fields.blockPack);
193
+ if (plClient.isResourceId(argsField.ref) && plClient.isResourceId(blockPackField.ref))
194
+ return {
195
+ args,
196
+ enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args, { argsRid: argsField.ref, blockPackRid: blockPackField.ref }),
197
+ };
198
+ else
199
+ return {
200
+ args,
201
+ enrichmentTargets: this.projectHelper.getEnrichmentTargets(() => bInfo.config, () => args),
202
+ };
203
+ }
204
+ getPendingProductionGraph() {
205
+ if (this.pendingProductionGraph === undefined)
206
+ this.pendingProductionGraph = project_model_util.productionGraph(this.struct, (blockId) => this.getProductionGraphBlockInfo(blockId, false));
207
+ return this.pendingProductionGraph;
208
+ }
209
+ getActualProductionGraph() {
210
+ if (this.actualProductionGraph === undefined)
211
+ this.actualProductionGraph = project_model_util.productionGraph(this.struct, (blockId) => this.getProductionGraphBlockInfo(blockId, true));
212
+ return this.actualProductionGraph;
213
+ }
214
+ //
215
+ // Generic helpers to interact with project state
216
+ //
217
+ getBlockInfo(blockId) {
218
+ const info = this.blockInfos.get(blockId);
219
+ if (info === undefined)
220
+ throw new Error(`No such block: ${blockId}`);
221
+ return info;
222
+ }
223
+ createJsonFieldValueByContent(content) {
224
+ const value = Buffer.from(content);
225
+ const ref = this.tx.createValue(plClient.Pl.JsonObject, value);
226
+ return { ref, value, status: 'Ready' };
227
+ }
228
+ createJsonFieldValue(obj) {
229
+ return this.createJsonFieldValueByContent(JSON.stringify(obj));
230
+ }
231
+ getBlock(blockId) {
232
+ for (const block of project_model_util.allBlocks(this.struct))
233
+ if (block.id === blockId)
234
+ return block;
235
+ throw new Error('block not found');
236
+ }
237
+ setBlockFieldObj(blockId, fieldName, state) {
238
+ const fid = plClient.field(this.rid, project_model.projectFieldName(blockId, fieldName));
239
+ if (state.ref === undefined)
240
+ throw new Error('Can\'t set value with empty ref');
241
+ if (this.getBlockInfo(blockId).fields[fieldName] === undefined)
242
+ this.tx.createField(fid, 'Dynamic', state.ref);
243
+ else
244
+ this.tx.setField(fid, state.ref);
245
+ this.getBlockInfo(blockId).fields[fieldName] = {
246
+ modCount: this.globalModCount++,
247
+ ...state,
248
+ };
249
+ this.fieldsChanged = true;
250
+ }
251
+ setBlockField(blockId, fieldName, ref, status, value) {
252
+ this.setBlockFieldObj(blockId, fieldName, { ref, status, value });
253
+ }
254
+ deleteBlockFields(blockId, ...fieldNames) {
255
+ let deleted = false;
256
+ const info = this.getBlockInfo(blockId);
257
+ for (const fieldName of fieldNames) {
258
+ const fields = info.fields;
259
+ if (!(fieldName in fields))
260
+ continue;
261
+ this.tx.removeField(plClient.field(this.rid, project_model.projectFieldName(blockId, fieldName)));
262
+ delete fields[fieldName];
263
+ this.fieldsChanged = true;
264
+ deleted = true;
265
+ }
266
+ return deleted;
267
+ }
268
+ updateLastModified() {
269
+ this.lastModified = Date.now();
270
+ this.lastModifiedChanged = true;
271
+ }
272
+ //
273
+ // Main project actions
274
+ //
275
+ resetStagingRefreshTimestamp() {
276
+ this.renderingState.stagingRefreshTimestamp = Date.now();
277
+ this.renderingStateChanged = true;
278
+ }
279
+ resetStaging(blockId) {
280
+ const fields = this.getBlockInfo(blockId).fields;
281
+ if (fields.stagingOutput?.status === 'Ready'
282
+ && fields.stagingCtx?.status === 'Ready'
283
+ && fields.stagingUiCtx?.status === 'Ready') {
284
+ this.setBlockFieldObj(blockId, 'stagingOutputPrevious', fields.stagingOutput);
285
+ this.setBlockFieldObj(blockId, 'stagingCtxPrevious', fields.stagingCtx);
286
+ this.setBlockFieldObj(blockId, 'stagingUiCtxPrevious', fields.stagingUiCtx);
287
+ }
288
+ if (this.deleteBlockFields(blockId, 'stagingOutput', 'stagingCtx', 'stagingUiCtx'))
289
+ this.resetStagingRefreshTimestamp();
290
+ }
291
+ resetProduction(blockId) {
292
+ const fields = this.getBlockInfo(blockId).fields;
293
+ if (fields.prodOutput?.status === 'Ready'
294
+ && fields.prodCtx?.status === 'Ready'
295
+ && fields.prodUiCtx?.status === 'Ready') {
296
+ this.setBlockFieldObj(blockId, 'prodOutputPrevious', fields.prodOutput);
297
+ this.setBlockFieldObj(blockId, 'prodCtxPrevious', fields.prodCtx);
298
+ this.setBlockFieldObj(blockId, 'prodUiCtxPrevious', fields.prodUiCtx);
299
+ }
300
+ this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');
301
+ }
302
+ /** Running blocks are reset, already computed moved to limbo. Returns if
303
+ * either of the actions were actually performed.
304
+ * This method ensures the block is left in a consistent state that passes check() constraints. */
305
+ resetOrLimboProduction(blockId) {
306
+ const fields = this.getBlockInfo(blockId).fields;
307
+ // Check if we can safely move to limbo (both core production fields are ready)
308
+ if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {
309
+ if (this.blocksInLimbo.has(blockId))
310
+ // we are already in limbo
311
+ return false;
312
+ // limbo - keep the ready production results but clean up cache
313
+ this.blocksInLimbo.add(blockId);
314
+ this.renderingStateChanged = true;
315
+ // doing some gc - clean up previous cache fields
316
+ this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');
317
+ return true;
318
+ }
319
+ else {
320
+ // reset - clean up any partial/inconsistent production stat
321
+ return this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs', 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');
322
+ }
323
+ }
324
+ /** Optimally sets inputs for multiple blocks in one go */
325
+ setStates(requests) {
326
+ const changedArgs = [];
327
+ let somethingChanged = false;
328
+ for (const req of requests) {
329
+ const info = this.getBlockInfo(req.blockId);
330
+ let blockChanged = false;
331
+ for (const stateKey of ['args', 'uiState']) {
332
+ if (!(stateKey in req))
333
+ continue;
334
+ const statePart = req[stateKey];
335
+ if (statePart === undefined || statePart === null)
336
+ throw new Error(`Can't set ${stateKey} to null or undefined, please omit the key if you don't want to change it`);
337
+ const fieldName = stateKey === 'args' ? 'currentArgs' : 'uiState';
338
+ let data;
339
+ let gzipped = false;
340
+ if (stateKey === 'args') {
341
+ // don't gzip args, workflow code can't uncompress gzip yet
342
+ data = tsHelpers.canonicalJsonBytes(statePart);
343
+ }
344
+ else {
345
+ const { data: binary, isGzipped } = tsHelpers.canonicalJsonGzBytes(statePart);
346
+ data = binary;
347
+ gzipped = isGzipped;
348
+ }
349
+ if (Buffer.compare(info.fields[fieldName].value, data) === 0)
350
+ continue;
351
+ console.log('setting', fieldName, gzipped, data.length);
352
+ const statePartRef = this.tx.createValue(gzipped ? plClient.Pl.JsonGzObject : plClient.Pl.JsonObject, data);
353
+ this.setBlockField(req.blockId, fieldName, statePartRef, 'Ready', data);
354
+ blockChanged = true;
355
+ if (stateKey === 'args')
356
+ changedArgs.push(req.blockId);
357
+ }
358
+ if (blockChanged) {
359
+ // will be assigned our author marker
360
+ this.blocksWithChangedInputs.add(req.blockId);
361
+ somethingChanged = true;
362
+ }
363
+ }
364
+ // resetting staging outputs for all downstream blocks
365
+ this.getStagingGraph().traverse('downstream', changedArgs, ({ id }) => this.resetStaging(id));
366
+ if (somethingChanged)
367
+ this.updateLastModified();
368
+ }
369
+ setBlockSettings(blockId, newValue) {
370
+ this.setBlockFieldObj(blockId, 'blockSettings', this.createJsonFieldValue(newValue));
371
+ this.updateLastModified();
372
+ }
373
+ createProdCtx(upstream) {
374
+ const upstreamContexts = [];
375
+ upstream.forEach((id) => {
376
+ const info = this.getBlockInfo(id);
377
+ if (info.fields['prodCtx']?.ref === undefined)
378
+ throw new Error('One of the upstreams staging is not rendered.');
379
+ upstreamContexts.push(plClient.Pl.unwrapHolder(this.tx, info.fields['prodCtx'].ref));
380
+ });
381
+ return render_block.createBContextFromUpstreams(this.tx, upstreamContexts);
382
+ }
383
+ createStagingCtx(upstream) {
384
+ const upstreamContexts = [];
385
+ upstream.forEach((id) => {
386
+ const info = this.getBlockInfo(id);
387
+ if (info.fields['stagingCtx']?.ref === undefined)
388
+ throw new Error('One of the upstreams staging is not rendered.');
389
+ upstreamContexts.push(plClient.Pl.unwrapHolder(this.tx, info.fields['stagingCtx'].ref));
390
+ if (info.fields['prodCtx']?.ref !== undefined)
391
+ upstreamContexts.push(plClient.Pl.unwrapHolder(this.tx, info.fields['prodCtx'].ref));
392
+ });
393
+ return render_block.createBContextFromUpstreams(this.tx, upstreamContexts);
394
+ }
395
+ exportCtx(ctx) {
396
+ return context_export.exportContext(this.tx, plClient.Pl.unwrapHolder(this.tx, this.ctxExportTplHolder), ctx);
397
+ }
398
+ renderStagingFor(blockId) {
399
+ this.resetStaging(blockId);
400
+ const info = this.getBlockInfo(blockId);
401
+ const ctx = this.createStagingCtx(this.getStagingGraph().nodes.get(blockId).upstream);
402
+ if (this.getBlock(blockId).renderingMode !== 'Heavy')
403
+ throw new Error('not supported yet');
404
+ const tpl = info.getTemplate(this.tx);
405
+ const results = render_block.createRenderHeavyBlock(this.tx, tpl, {
406
+ args: info.fields.currentArgs.ref,
407
+ blockId: this.tx.createValue(plClient.Pl.JsonString, JSON.stringify(blockId)),
408
+ isProduction: this.tx.createValue(plClient.Pl.JsonBool, JSON.stringify(false)),
409
+ context: ctx,
410
+ });
411
+ this.setBlockField(blockId, 'stagingCtx', plClient.Pl.wrapInEphHolder(this.tx, results.context), 'NotReady');
412
+ this.setBlockField(blockId, 'stagingUiCtx', this.exportCtx(results.context), 'NotReady');
413
+ this.setBlockField(blockId, 'stagingOutput', results.result, 'NotReady');
414
+ }
415
+ renderProductionFor(blockId) {
416
+ this.resetProduction(blockId);
417
+ const info = this.getBlockInfo(blockId);
418
+ const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId).upstream);
419
+ if (this.getBlock(blockId).renderingMode === 'Light')
420
+ throw new Error('Can\'t render production for light block.');
421
+ const tpl = info.getTemplate(this.tx);
422
+ const results = render_block.createRenderHeavyBlock(this.tx, tpl, {
423
+ args: info.fields.currentArgs.ref,
424
+ blockId: this.tx.createValue(plClient.Pl.JsonString, JSON.stringify(blockId)),
425
+ isProduction: this.tx.createValue(plClient.Pl.JsonBool, JSON.stringify(true)),
426
+ context: ctx,
427
+ });
428
+ this.setBlockField(blockId, 'prodCtx', plClient.Pl.wrapInEphHolder(this.tx, results.context), 'NotReady');
429
+ this.setBlockField(blockId, 'prodUiCtx', this.exportCtx(results.context), 'NotReady');
430
+ this.setBlockField(blockId, 'prodOutput', results.result, 'NotReady');
431
+ // saving inputs for which we rendered the production
432
+ this.setBlockFieldObj(blockId, 'prodArgs', info.fields.currentArgs);
433
+ // removing block from limbo as we juts rendered fresh production for it
434
+ if (this.blocksInLimbo.delete(blockId))
435
+ this.renderingStateChanged = true;
436
+ }
437
+ //
438
+ // Structure changes
439
+ //
440
+ initializeNewBlock(blockId, spec) {
441
+ const info = new BlockInfo(blockId, {}, model.extractConfig(spec.blockPack.config), spec.blockPack.source);
442
+ this.blockInfos.set(blockId, info);
443
+ // block pack
444
+ const bp = block_pack.createBlockPack(this.tx, spec.blockPack);
445
+ this.setBlockField(blockId, 'blockPack', plClient.Pl.wrapInHolder(this.tx, bp), 'NotReady');
446
+ // settings
447
+ this.setBlockFieldObj(blockId, 'blockSettings', this.createJsonFieldValue(plModelMiddleLayer.InitialBlockSettings));
448
+ // args
449
+ this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));
450
+ // uiState
451
+ this.setBlockFieldObj(blockId, 'uiState', this.createJsonFieldValueByContent(spec.uiState ?? '{}'));
452
+ // checking structure
453
+ info.check();
454
+ }
455
+ getFieldNamesToDuplicate(blockId) {
456
+ const fields = this.getBlockInfo(blockId).fields;
457
+ const diff = (setA, setB) => new Set([...setA].filter((x) => !setB.has(x)));
458
+ // Check if we can safely move to limbo (both core production fields are ready)
459
+ if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {
460
+ if (this.blocksInLimbo.has(blockId))
461
+ // we are already in limbo
462
+ return project_model.FieldsToDuplicate;
463
+ return diff(project_model.FieldsToDuplicate, new Set([
464
+ 'prodOutputPrevious',
465
+ 'prodCtxPrevious',
466
+ 'prodUiCtxPrevious',
467
+ ]));
468
+ }
469
+ else {
470
+ return diff(project_model.FieldsToDuplicate, new Set([
471
+ 'prodOutput',
472
+ 'prodCtx',
473
+ 'prodUiCtx',
474
+ 'prodArgs',
475
+ 'prodOutputPrevious',
476
+ 'prodCtxPrevious',
477
+ 'prodUiCtxPrevious',
478
+ ]));
479
+ }
480
+ }
481
+ initializeBlockDuplicate(blockId, originalBlockInfo) {
482
+ const info = new BlockInfo(blockId, {}, originalBlockInfo.config, originalBlockInfo.source);
483
+ this.blockInfos.set(blockId, info);
484
+ const fieldNamesToDuplicate = this.getFieldNamesToDuplicate(blockId);
485
+ // Copy all fields from original block to new block by sharing references
486
+ for (const [fieldName, fieldState] of Object.entries(originalBlockInfo.fields)) {
487
+ if (fieldNamesToDuplicate.has(fieldName) && fieldState && fieldState.ref) {
488
+ this.setBlockFieldObj(blockId, fieldName, {
489
+ ref: fieldState.ref,
490
+ status: fieldState.status,
491
+ value: fieldState.value,
492
+ });
493
+ }
494
+ }
495
+ this.resetOrLimboProduction(blockId);
496
+ info.check();
497
+ }
498
+ /** Very generic method, better check for more specialized case-specific methods first. */
499
+ updateStructure(newStructure, newBlockInitializer = NoNewBlocks) {
500
+ const currentStagingGraph = this.getStagingGraph();
501
+ const currentActualProductionGraph = this.getActualProductionGraph();
502
+ const newStagingGraph = project_model_util.stagingGraph(newStructure);
503
+ const stagingDiff = project_model_util.graphDiff(currentStagingGraph, newStagingGraph);
504
+ // removing blocks
505
+ for (const blockId of stagingDiff.onlyInA) {
506
+ const { fields } = this.getBlockInfo(blockId);
507
+ this.deleteBlockFields(blockId, ...Object.keys(fields));
508
+ this.blockInfos.delete(blockId);
509
+ if (this.blocksInLimbo.delete(blockId))
510
+ this.renderingStateChanged = true;
511
+ }
512
+ // creating new blocks
513
+ for (const blockId of stagingDiff.onlyInB) {
514
+ newBlockInitializer(blockId);
515
+ }
516
+ // resetting stagings affected by topology change
517
+ for (const blockId of stagingDiff.different)
518
+ this.resetStaging(blockId);
519
+ // new actual production graph without new blocks
520
+ const newActualProductionGraph = project_model_util.productionGraph(newStructure, (blockId) => this.getProductionGraphBlockInfo(blockId, true));
521
+ const prodDiff = project_model_util.graphDiff(currentActualProductionGraph, newActualProductionGraph);
522
+ // applying changes due to topology change in production to affected nodes and
523
+ // all their downstreams
524
+ currentActualProductionGraph.traverse('downstream', [...prodDiff.different], (node) => {
525
+ this.resetOrLimboProduction(node.id);
526
+ });
527
+ if (stagingDiff.onlyInB.size > 0
528
+ || stagingDiff.onlyInA.size > 0
529
+ || stagingDiff.different.size > 0)
530
+ this.resetStagingRefreshTimestamp();
531
+ this.struct = newStructure;
532
+ this.structureChanged = true;
533
+ this.stagingGraph = undefined;
534
+ this.pendingProductionGraph = undefined;
535
+ this.actualProductionGraph = undefined;
536
+ this.updateLastModified();
537
+ }
538
+ //
539
+ // Structure change helpers
540
+ //
541
+ addBlock(block, spec, before) {
542
+ const newStruct = this.structure; // copy current structure
543
+ if (before === undefined) {
544
+ // adding as a very last block
545
+ newStruct.groups[newStruct.groups.length - 1].blocks.push(block);
546
+ }
547
+ else {
548
+ let done = false;
549
+ for (const group of newStruct.groups) {
550
+ const idx = group.blocks.findIndex((b) => b.id === before);
551
+ if (idx < 0)
552
+ continue;
553
+ group.blocks.splice(idx, 0, block);
554
+ done = true;
555
+ break;
556
+ }
557
+ if (!done)
558
+ throw new Error(`Can't find element with id: ${before}`);
559
+ }
560
+ this.updateStructure(newStruct, (blockId) => {
561
+ if (blockId !== block.id)
562
+ throw new Error('Unexpected');
563
+ this.initializeNewBlock(blockId, spec);
564
+ });
565
+ }
566
+ /**
567
+ * Duplicates an existing block by copying all its fields and structure.
568
+ * This method creates a deep copy of the block at the mutator level.
569
+ *
570
+ * @param originalBlockId id of the block to duplicate
571
+ * @param newBlockId id for the new duplicated block
572
+ * @param after id of the block to insert new block after
573
+ */
574
+ duplicateBlock(originalBlockId, newBlockId, after) {
575
+ // Get the original block from structure
576
+ const originalBlock = this.getBlock(originalBlockId);
577
+ const originalBlockInfo = this.getBlockInfo(originalBlockId);
578
+ // Create new block in structure
579
+ const newBlock = {
580
+ id: newBlockId,
581
+ label: originalBlock.label,
582
+ renderingMode: originalBlock.renderingMode,
583
+ };
584
+ // Add the new block to structure
585
+ const newStruct = this.structure; // copy current structure
586
+ if (after === undefined) {
587
+ // adding as a very last block
588
+ newStruct.groups[newStruct.groups.length - 1].blocks.push(newBlock);
589
+ }
590
+ else {
591
+ let done = false;
592
+ for (const group of newStruct.groups) {
593
+ const idx = group.blocks.findIndex((b) => b.id === after);
594
+ if (idx < 0)
595
+ continue;
596
+ group.blocks.splice(idx + 1, 0, newBlock);
597
+ done = true;
598
+ break;
599
+ }
600
+ if (!done)
601
+ throw new Error(`Can't find element with id: ${after}`);
602
+ }
603
+ this.updateStructure(newStruct, (blockId) => {
604
+ if (blockId !== newBlockId)
605
+ throw new Error('Unexpected');
606
+ this.initializeBlockDuplicate(blockId, originalBlockInfo);
607
+ });
608
+ }
609
+ deleteBlock(blockId) {
610
+ const newStruct = this.structure; // copy current structure
611
+ let done = false;
612
+ for (const group of newStruct.groups) {
613
+ const idx = group.blocks.findIndex((b) => b.id === blockId);
614
+ if (idx < 0)
615
+ continue;
616
+ group.blocks.splice(idx, 1);
617
+ done = true;
618
+ break;
619
+ }
620
+ if (!done)
621
+ throw new Error(`Can't find element with id: ${blockId}`);
622
+ this.updateStructure(newStruct);
623
+ }
624
+ //
625
+ // Block-pack migration
626
+ //
627
+ migrateBlockPack(blockId, spec, newArgsAndUiState) {
628
+ const info = this.getBlockInfo(blockId);
629
+ this.setBlockField(blockId, 'blockPack', plClient.Pl.wrapInHolder(this.tx, block_pack.createBlockPack(this.tx, spec)), 'NotReady');
630
+ if (newArgsAndUiState !== undefined) {
631
+ // this will also reset all downstream stagings
632
+ this.setStates([{ blockId, args: newArgsAndUiState.args, uiState: newArgsAndUiState.uiState }]);
633
+ }
634
+ else {
635
+ // resetting staging outputs for all downstream blocks
636
+ this.getStagingGraph().traverse('downstream', [blockId], ({ id }) => this.resetStaging(id));
637
+ }
638
+ // also reset or limbo all downstream productions
639
+ if (info.productionRendered)
640
+ this.getActualProductionGraph().traverse('downstream', [blockId], ({ id }) => this.resetOrLimboProduction(id));
641
+ this.updateLastModified();
642
+ }
643
+ //
644
+ // Render
645
+ //
646
+ renderProduction(blockIds, addUpstreams = false) {
647
+ const blockIdsSet = new Set(blockIds);
648
+ const prodGraph = this.getPendingProductionGraph();
649
+ if (addUpstreams)
650
+ // adding all upstreams automatically
651
+ prodGraph.traverse('upstream', blockIds, (node) => {
652
+ blockIdsSet.add(node.id);
653
+ });
654
+ else // checking that targets contain all upstreams
655
+ for (const blockId of blockIdsSet) {
656
+ const node = prodGraph.nodes.get(blockId);
657
+ if (node === undefined)
658
+ throw new Error(`Can't find block with id: ${blockId}`);
659
+ for (const upstream of node.upstream)
660
+ if (!blockIdsSet.has(upstream))
661
+ throw new Error('Can\'t render blocks not including all upstreams.');
662
+ }
663
+ // traversing in topological order and rendering target blocks
664
+ const rendered = new Set();
665
+ for (const block of project_model_util.allBlocks(this.structure)) {
666
+ if (!blockIdsSet.has(block.id))
667
+ continue;
668
+ let render = this.getBlockInfo(block.id).requireProductionRendering || this.blocksInLimbo.has(block.id);
669
+ if (!render)
670
+ for (const upstream of prodGraph.nodes.get(block.id).upstream)
671
+ if (rendered.has(upstream)) {
672
+ render = true;
673
+ break;
674
+ }
675
+ if (render) {
676
+ this.renderProductionFor(block.id);
677
+ rendered.add(block.id);
678
+ }
679
+ }
680
+ const renderedArray = [...rendered];
681
+ // sending to limbo all downstream blocks
682
+ prodGraph.traverse('downstream', renderedArray, (node) => {
683
+ if (rendered.has(node.id))
684
+ // don't send to limbo blocks that were just rendered
685
+ return;
686
+ this.resetOrLimboProduction(node.id);
687
+ });
688
+ // resetting staging outputs for all downstream blocks
689
+ this.getStagingGraph().traverse('downstream', renderedArray, ({ id }) => {
690
+ // don't reset staging of the first rendered block
691
+ if (renderedArray[0] !== id)
692
+ this.resetStaging(id);
693
+ });
694
+ if (rendered.size > 0)
695
+ this.updateLastModified();
696
+ return rendered;
697
+ }
698
+ /** Stops running blocks from the list and modify states of other blocks
699
+ * accordingly */
700
+ stopProduction(...blockIds) {
701
+ const activeProdGraph = this.getActualProductionGraph();
702
+ // we will stop all blocks listed in request and all their downstreams
703
+ const queue = new Denque(blockIds);
704
+ const queued = new Set(blockIds);
705
+ const stopped = [];
706
+ while (!queue.isEmpty()) {
707
+ const blockId = queue.shift();
708
+ const fields = this.getBlockInfo(blockId).fields;
709
+ if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready')
710
+ // skipping finished blocks
711
+ continue;
712
+ if (this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs')) {
713
+ // was actually stopped
714
+ stopped.push(blockId);
715
+ // will try to stop all its downstreams
716
+ for (const downstream of activeProdGraph.traverseIdsExcludingRoots('downstream', blockId)) {
717
+ if (queued.has(downstream))
718
+ continue;
719
+ queue.push(downstream);
720
+ queued.add(downstream);
721
+ }
722
+ }
723
+ }
724
+ // blocks under stopped blocks, but still having results, goes to limbo
725
+ for (const blockId of activeProdGraph.traverseIdsExcludingRoots('downstream', ...stopped))
726
+ this.resetOrLimboProduction(blockId);
727
+ }
728
+ traverseWithStagingLag(cb) {
729
+ const lags = new Map();
730
+ const stagingGraph = this.getStagingGraph();
731
+ stagingGraph.nodes.forEach((node) => {
732
+ const info = this.getBlockInfo(node.id);
733
+ let lag = info.stagingRendered ? 0 : 1;
734
+ node.upstream.forEach((upstream) => {
735
+ const upstreamLag = lags.get(upstream);
736
+ if (upstreamLag === 0)
737
+ return;
738
+ lag = Math.max(upstreamLag + 1, lag);
739
+ });
740
+ cb(node.id, lag);
741
+ lags.set(node.id, lag);
742
+ });
743
+ }
744
+ /** @param stagingRenderingRate rate in blocks per second */
745
+ refreshStagings(stagingRenderingRate) {
746
+ const elapsed = Date.now() - this.renderingState.stagingRefreshTimestamp;
747
+ const lagThreshold = stagingRenderingRate === undefined
748
+ ? undefined
749
+ : 1 + Math.max(0, (elapsed * stagingRenderingRate) / 1000);
750
+ let rendered = 0;
751
+ this.traverseWithStagingLag((blockId, lag) => {
752
+ if (lag === 0)
753
+ // meaning staging already rendered
754
+ return;
755
+ if (lagThreshold === undefined || lag <= lagThreshold) {
756
+ this.renderStagingFor(blockId);
757
+ rendered++;
758
+ }
759
+ });
760
+ if (rendered > 0)
761
+ this.resetStagingRefreshTimestamp();
762
+ }
763
+ //
764
+ // Meta
765
+ //
766
+ /** Updates project metadata */
767
+ setMeta(meta) {
768
+ this.meta = meta;
769
+ this.metaChanged = true;
770
+ this.updateLastModified();
771
+ }
772
+ //
773
+ // Maintenance
774
+ //
775
+ /** @param stagingRenderingRate rate in blocks per second */
776
+ doRefresh(stagingRenderingRate) {
777
+ this.refreshStagings(stagingRenderingRate);
778
+ this.blockInfos.forEach((blockInfo) => {
779
+ if (blockInfo.fields.prodCtx?.status === 'Ready'
780
+ && blockInfo.fields.prodOutput?.status === 'Ready')
781
+ this.deleteBlockFields(blockInfo.id, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');
782
+ if (blockInfo.fields.stagingCtx?.status === 'Ready'
783
+ && blockInfo.fields.stagingOutput?.status === 'Ready')
784
+ this.deleteBlockFields(blockInfo.id, 'stagingOutputPrevious', 'stagingCtxPrevious', 'stagingUiCtxPrevious');
785
+ });
786
+ }
787
+ assignAuthorMarkers() {
788
+ const markerStr = this.author ? JSON.stringify(this.author) : undefined;
789
+ for (const blockId of this.blocksWithChangedInputs)
790
+ if (markerStr === undefined)
791
+ this.tx.deleteKValue(this.rid, project_model.blockArgsAuthorKey(blockId));
792
+ else
793
+ this.tx.setKValue(this.rid, project_model.blockArgsAuthorKey(blockId), markerStr);
794
+ if (this.metaChanged || this.structureChanged) {
795
+ if (markerStr === undefined)
796
+ this.tx.deleteKValue(this.rid, project_model.ProjectStructureAuthorKey);
797
+ else
798
+ this.tx.setKValue(this.rid, project_model.ProjectStructureAuthorKey, markerStr);
799
+ }
800
+ }
801
+ save() {
802
+ if (!this.wasModified)
803
+ return;
804
+ if (this.lastModifiedChanged)
805
+ this.tx.setKValue(this.rid, project_model.ProjectLastModifiedTimestamp, JSON.stringify(this.lastModified));
806
+ if (this.structureChanged)
807
+ this.tx.setKValue(this.rid, project_model.ProjectStructureKey, JSON.stringify(this.struct));
808
+ if (this.renderingStateChanged)
809
+ this.tx.setKValue(this.rid, project_model.BlockRenderingStateKey, JSON.stringify({
810
+ ...this.renderingState,
811
+ blocksInLimbo: [...this.blocksInLimbo],
812
+ }));
813
+ if (this.metaChanged)
814
+ this.tx.setKValue(this.rid, project_model.ProjectMetaKey, JSON.stringify(this.meta));
815
+ this.assignAuthorMarkers();
816
+ }
817
+ static async load(projectHelper, tx, rid, author) {
818
+ //
819
+ // Sending initial requests to read project state (start of round-trip #1)
820
+ //
821
+ const fullResourceStateP = tx.getResourceData(rid, true);
822
+ const schemaP = tx.getKValueJson(rid, project_model.SchemaVersionKey);
823
+ const lastModifiedP = tx.getKValueJson(rid, project_model.ProjectLastModifiedTimestamp);
824
+ const metaP = tx.getKValueJson(rid, project_model.ProjectMetaKey);
825
+ const structureP = tx.getKValueJson(rid, project_model.ProjectStructureKey);
826
+ const renderingStateP = tx.getKValueJson(rid, project_model.BlockRenderingStateKey);
827
+ const fullResourceState = await fullResourceStateP;
828
+ // loading field information
829
+ const blockInfoStates = new Map();
830
+ for (const f of fullResourceState.fields) {
831
+ const projectField = project_model.parseProjectField(f.name);
832
+ // processing only fields with known structure
833
+ if (projectField === undefined)
834
+ continue;
835
+ let info = blockInfoStates.get(projectField.blockId);
836
+ if (info === undefined) {
837
+ info = {
838
+ id: projectField.blockId,
839
+ fields: {},
840
+ };
841
+ blockInfoStates.set(projectField.blockId, info);
842
+ }
843
+ info.fields[projectField.fieldName] = plClient.isNullResourceId(f.value)
844
+ ? { modCount: 0 }
845
+ : { modCount: 0, ref: f.value };
846
+ }
847
+ //
848
+ // Roundtrip #1 not yet finished, but as soon as field list is received,
849
+ // we can start sending requests to read states of referenced resources
850
+ // (start of round-trip #2)
851
+ //
852
+ const blockFieldRequests = [];
853
+ blockInfoStates.forEach((info) => {
854
+ const fields = info.fields;
855
+ for (const [fName, state] of Object.entries(fields)) {
856
+ if (state.ref === undefined)
857
+ continue;
858
+ if (!plClient.isResource(state.ref) || plClient.isResourceRef(state.ref))
859
+ throw new Error('unexpected behaviour');
860
+ const fieldName = fName;
861
+ blockFieldRequests.push([
862
+ info, fieldName,
863
+ state, tx.getResourceData(state.ref, fieldName == 'blockPack')
864
+ ]);
865
+ }
866
+ });
867
+ // loading jsons
868
+ const [schema, lastModified, meta, structure, { stagingRefreshTimestamp, blocksInLimbo },] = await Promise.all([
869
+ schemaP,
870
+ lastModifiedP,
871
+ metaP,
872
+ structureP,
873
+ renderingStateP,
874
+ ]);
875
+ // Checking schema version of the project
876
+ if (schema !== project_model.SchemaVersionCurrent) {
877
+ if (Number(schema) < Number(project_model.SchemaVersionCurrent))
878
+ throw new model.UiError(`Can't perform this action on this project because it has older schema. Try (re)loading the project to update it.`);
879
+ else
880
+ throw new model.UiError(`Can't perform this action on this project because it has newer schema. Upgrade your desktop app to the latest version.`);
881
+ }
882
+ //
883
+ // <- at this point we have all the responses from round-trip #1
884
+ //
885
+ //
886
+ // Receiving responses from round-trip #2 and sending requests to read block pack descriptions
887
+ // (start of round-trip #3)
888
+ //
889
+ const blockPackRequests = [];
890
+ for (const [info, fieldName, state, response] of blockFieldRequests) {
891
+ const result = await response;
892
+ state.value = result.data;
893
+ if (plClient.isNotNullResourceId(result.error))
894
+ state.status = 'Error';
895
+ else if (result.resourceReady || plClient.isNotNullResourceId(result.originalResourceId))
896
+ state.status = 'Ready';
897
+ else
898
+ state.status = 'NotReady';
899
+ // For block pack we need to traverse the ref field from the resource data
900
+ if (fieldName === 'blockPack') {
901
+ const refField = result.fields.find((f) => f.name === plClient.Pl.HolderRefField);
902
+ if (refField === undefined)
903
+ throw new Error('Block pack ref field is missing');
904
+ blockPackRequests.push([info, tx.getResourceData(plClient.ensureResourceIdNotNull(refField.value), false)]);
905
+ }
906
+ }
907
+ //
908
+ // <- at this point we have all the responses from round-trip #2
909
+ //
910
+ for (const [info, response] of blockPackRequests) {
911
+ const result = await response;
912
+ const bpInfo = tsHelpers.cachedDeserialize(tsHelpers.notEmpty(result.data));
913
+ info.blockConfig = model.extractConfig(bpInfo.config);
914
+ info.blockPack = bpInfo.source;
915
+ }
916
+ //
917
+ // <- at this point we have all the responses from round-trip #3
918
+ //
919
+ // loading ctx export template to check if we already have cached materialized template in our project
920
+ const ctxExportTplEnvelope = await context_export.getPreparedExportTemplateEnvelope();
921
+ // expected field name
922
+ const ctxExportTplCacheFieldName = project_model.getServiceTemplateField(ctxExportTplEnvelope.hash);
923
+ const ctxExportTplField = fullResourceState.fields.find((f) => f.name === ctxExportTplCacheFieldName);
924
+ let ctxExportTplHolder;
925
+ if (ctxExportTplField !== undefined)
926
+ ctxExportTplHolder = plClient.ensureResourceIdNotNull(ctxExportTplField.value);
927
+ else {
928
+ ctxExportTplHolder = plClient.Pl.wrapInHolder(tx, template_loading.loadTemplate(tx, ctxExportTplEnvelope.spec));
929
+ tx.createField(plClient.field(rid, project_model.getServiceTemplateField(ctxExportTplEnvelope.hash)), 'Dynamic', ctxExportTplHolder);
930
+ }
931
+ const renderingState = { stagingRefreshTimestamp };
932
+ const blocksInLimboSet = new Set(blocksInLimbo);
933
+ const blockInfos = new Map();
934
+ blockInfoStates.forEach(({ id, fields, blockConfig, blockPack }) => blockInfos.set(id, new BlockInfo(id, fields, tsHelpers.notEmpty(blockConfig), tsHelpers.notEmpty(blockPack))));
935
+ // check consistency of project state
936
+ const blockInStruct = new Set();
937
+ for (const b of project_model_util.allBlocks(structure)) {
938
+ if (!blockInfos.has(b.id))
939
+ throw new Error(`Inconsistent project structure: no inputs for ${b.id}`);
940
+ blockInStruct.add(b.id);
941
+ }
942
+ blockInfos.forEach((info) => {
943
+ if (!blockInStruct.has(info.id))
944
+ throw new Error(`Inconsistent project structure: no structure entry for ${info.id}`);
945
+ // checking structure
946
+ info.check();
947
+ });
948
+ const prj = new ProjectMutator(rid, tx, author, schema, lastModified, meta, structure, renderingState, blocksInLimboSet, blockInfos, ctxExportTplHolder, projectHelper);
949
+ prj.fixProblemsAndMigrate();
950
+ return prj;
951
+ }
952
+ }
953
+ async function createProject(tx, meta = project_model.InitialBlockMeta) {
954
+ const prj = tx.createEphemeral(project_model.ProjectResourceType);
955
+ tx.lock(prj);
956
+ const ts = String(Date.now());
957
+ tx.setKValue(prj, project_model.SchemaVersionKey, JSON.stringify(project_model.SchemaVersionCurrent));
958
+ tx.setKValue(prj, project_model.ProjectCreatedTimestamp, ts);
959
+ tx.setKValue(prj, project_model.ProjectLastModifiedTimestamp, ts);
960
+ tx.setKValue(prj, project_model.ProjectMetaKey, JSON.stringify(meta));
961
+ tx.setKValue(prj, project_model.ProjectStructureKey, JSON.stringify(project_model.InitialBlockStructure));
962
+ tx.setKValue(prj, project_model.BlockRenderingStateKey, JSON.stringify(project_model.InitialProjectRenderingState));
963
+ const ctxExportTplEnvelope = await context_export.getPreparedExportTemplateEnvelope();
964
+ tx.createField(plClient.field(prj, project_model.getServiceTemplateField(ctxExportTplEnvelope.hash)), 'Dynamic', plClient.Pl.wrapInHolder(tx, template_loading.loadTemplate(tx, ctxExportTplEnvelope.spec)));
965
+ return prj;
966
+ }
967
+ async function withProject(projectHelper, txOrPl, rid, cb) {
968
+ return withProjectAuthored(projectHelper, txOrPl, rid, undefined, cb);
969
+ }
970
+ async function withProjectAuthored(projectHelper, txOrPl, rid, author, cb, ops = {}) {
971
+ if (txOrPl instanceof plClient.PlClient) {
972
+ return await txOrPl.withWriteTx('ProjectAction', async (tx) => {
973
+ const mut = await ProjectMutator.load(projectHelper, tx, rid, author);
974
+ const result = await cb(mut);
975
+ if (!mut.wasModified)
976
+ // skipping save and commit altogether if no modifications were actually made
977
+ return result;
978
+ mut.save();
979
+ await tx.commit();
980
+ if (index.getDebugFlags().logProjectMutationStat)
981
+ console.log(JSON.stringify(tx.stat));
982
+ return result;
983
+ }, ops);
984
+ }
985
+ else {
986
+ const mut = await ProjectMutator.load(projectHelper, txOrPl, rid, author);
987
+ const result = await cb(mut);
988
+ mut.save();
989
+ return result;
990
+ }
991
+ }
992
+
993
+ exports.ProjectMutator = ProjectMutator;
994
+ exports.createProject = createProject;
995
+ exports.withProject = withProject;
996
+ exports.withProjectAuthored = withProjectAuthored;
997
+ //# sourceMappingURL=project.cjs.map