@milaboratories/pl-middle-layer 1.55.0 → 1.55.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.114.0 → _@oxc-project_runtime@0.123.0}/helpers/usingCtx.cjs +2 -4
  2. package/dist/_virtual/{_@oxc-project_runtime@0.114.0 → _@oxc-project_runtime@0.123.0}/helpers/usingCtx.js +2 -3
  3. package/dist/_virtual/_rolldown/runtime.cjs +7 -13
  4. package/dist/block_registry/index.cjs +3 -3
  5. package/dist/block_registry/index.js +3 -3
  6. package/dist/block_registry/registry-v2-provider.cjs +2 -3
  7. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  8. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -0
  9. package/dist/block_registry/registry-v2-provider.js +1 -2
  10. package/dist/block_registry/registry-v2-provider.js.map +1 -1
  11. package/dist/block_registry/registry.cjs +3 -4
  12. package/dist/block_registry/registry.cjs.map +1 -1
  13. package/dist/block_registry/registry.d.ts.map +1 -0
  14. package/dist/block_registry/registry.js +1 -2
  15. package/dist/block_registry/registry.js.map +1 -1
  16. package/dist/block_registry/watcher.cjs +3 -4
  17. package/dist/block_registry/watcher.cjs.map +1 -1
  18. package/dist/block_registry/watcher.d.ts.map +1 -0
  19. package/dist/block_registry/watcher.js +1 -2
  20. package/dist/block_registry/watcher.js.map +1 -1
  21. package/dist/block_registry/well_known_registries.cjs +1 -2
  22. package/dist/block_registry/well_known_registries.cjs.map +1 -1
  23. package/dist/block_registry/well_known_registries.d.ts.map +1 -0
  24. package/dist/block_registry/well_known_registries.js +1 -1
  25. package/dist/cfg_render/executor.cjs +4 -5
  26. package/dist/cfg_render/executor.cjs.map +1 -1
  27. package/dist/cfg_render/executor.js +1 -2
  28. package/dist/cfg_render/executor.js.map +1 -1
  29. package/dist/cfg_render/renderer.cjs +4 -5
  30. package/dist/cfg_render/renderer.cjs.map +1 -1
  31. package/dist/cfg_render/renderer.js +1 -2
  32. package/dist/cfg_render/renderer.js.map +1 -1
  33. package/dist/cfg_render/traverse.cjs +2 -3
  34. package/dist/cfg_render/traverse.cjs.map +1 -1
  35. package/dist/cfg_render/traverse.js +1 -2
  36. package/dist/cfg_render/traverse.js.map +1 -1
  37. package/dist/cfg_render/util.cjs +2 -3
  38. package/dist/cfg_render/util.cjs.map +1 -1
  39. package/dist/cfg_render/util.js +1 -2
  40. package/dist/cfg_render/util.js.map +1 -1
  41. package/dist/debug/index.cjs +1 -2
  42. package/dist/debug/index.cjs.map +1 -1
  43. package/dist/debug/index.js +1 -1
  44. package/dist/debug/index.js.map +1 -1
  45. package/dist/dev_env/index.cjs +3 -4
  46. package/dist/dev_env/index.cjs.map +1 -1
  47. package/dist/dev_env/index.js +1 -2
  48. package/dist/dev_env/index.js.map +1 -1
  49. package/dist/dev_env/util.cjs +2 -3
  50. package/dist/dev_env/util.cjs.map +1 -1
  51. package/dist/dev_env/util.js +1 -2
  52. package/dist/dev_env/util.js.map +1 -1
  53. package/dist/index.cjs +48 -44
  54. package/dist/index.d.ts +0 -3
  55. package/dist/index.js +5 -10
  56. package/dist/js_render/computable_context.cjs +5 -6
  57. package/dist/js_render/computable_context.cjs.map +1 -1
  58. package/dist/js_render/computable_context.js +2 -3
  59. package/dist/js_render/computable_context.js.map +1 -1
  60. package/dist/js_render/context.cjs +3 -4
  61. package/dist/js_render/context.cjs.map +1 -1
  62. package/dist/js_render/context.js +1 -2
  63. package/dist/js_render/context.js.map +1 -1
  64. package/dist/js_render/index.cjs +4 -5
  65. package/dist/js_render/index.cjs.map +1 -1
  66. package/dist/js_render/index.js +1 -2
  67. package/dist/js_render/index.js.map +1 -1
  68. package/dist/js_render/service_injectors.cjs +3 -4
  69. package/dist/js_render/service_injectors.cjs.map +1 -1
  70. package/dist/js_render/service_injectors.js +2 -3
  71. package/dist/js_render/service_injectors.js.map +1 -1
  72. package/dist/middle_layer/active_cfg.cjs +7 -8
  73. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  74. package/dist/middle_layer/active_cfg.js +1 -2
  75. package/dist/middle_layer/active_cfg.js.map +1 -1
  76. package/dist/middle_layer/block.cjs +8 -9
  77. package/dist/middle_layer/block.cjs.map +1 -1
  78. package/dist/middle_layer/block.js +1 -2
  79. package/dist/middle_layer/block.js.map +1 -1
  80. package/dist/middle_layer/block_ctx.cjs +5 -6
  81. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  82. package/dist/middle_layer/block_ctx.js +1 -2
  83. package/dist/middle_layer/block_ctx.js.map +1 -1
  84. package/dist/middle_layer/block_ctx_unsafe.cjs +1 -2
  85. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  86. package/dist/middle_layer/block_ctx_unsafe.js +1 -1
  87. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  88. package/dist/middle_layer/driver_kit.cjs +5 -6
  89. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  90. package/dist/middle_layer/driver_kit.d.ts +0 -1
  91. package/dist/middle_layer/driver_kit.d.ts.map +1 -0
  92. package/dist/middle_layer/driver_kit.js +1 -2
  93. package/dist/middle_layer/driver_kit.js.map +1 -1
  94. package/dist/middle_layer/frontend_path.cjs +6 -7
  95. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  96. package/dist/middle_layer/frontend_path.js +1 -2
  97. package/dist/middle_layer/frontend_path.js.map +1 -1
  98. package/dist/middle_layer/index.cjs +5 -5
  99. package/dist/middle_layer/index.js +5 -5
  100. package/dist/middle_layer/middle_layer.cjs +15 -16
  101. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  102. package/dist/middle_layer/middle_layer.d.ts +0 -2
  103. package/dist/middle_layer/middle_layer.d.ts.map +1 -0
  104. package/dist/middle_layer/middle_layer.js +1 -2
  105. package/dist/middle_layer/middle_layer.js.map +1 -1
  106. package/dist/middle_layer/navigation_states.cjs +2 -3
  107. package/dist/middle_layer/navigation_states.cjs.map +1 -1
  108. package/dist/middle_layer/navigation_states.js +1 -2
  109. package/dist/middle_layer/navigation_states.js.map +1 -1
  110. package/dist/middle_layer/ops.cjs +5 -7
  111. package/dist/middle_layer/ops.cjs.map +1 -1
  112. package/dist/middle_layer/ops.d.ts +0 -1
  113. package/dist/middle_layer/ops.d.ts.map +1 -0
  114. package/dist/middle_layer/ops.js +1 -2
  115. package/dist/middle_layer/ops.js.map +1 -1
  116. package/dist/middle_layer/project.cjs +12 -13
  117. package/dist/middle_layer/project.cjs.map +1 -1
  118. package/dist/middle_layer/project.d.ts +0 -1
  119. package/dist/middle_layer/project.d.ts.map +1 -0
  120. package/dist/middle_layer/project.js +1 -2
  121. package/dist/middle_layer/project.js.map +1 -1
  122. package/dist/middle_layer/project_list.cjs +3 -4
  123. package/dist/middle_layer/project_list.cjs.map +1 -1
  124. package/dist/middle_layer/project_list.d.ts +0 -4
  125. package/dist/middle_layer/project_list.d.ts.map +1 -0
  126. package/dist/middle_layer/project_list.js +1 -2
  127. package/dist/middle_layer/project_list.js.map +1 -1
  128. package/dist/middle_layer/project_overview.cjs +9 -10
  129. package/dist/middle_layer/project_overview.cjs.map +1 -1
  130. package/dist/middle_layer/project_overview.js +1 -2
  131. package/dist/middle_layer/project_overview.js.map +1 -1
  132. package/dist/middle_layer/project_overview_light.cjs +4 -5
  133. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  134. package/dist/middle_layer/project_overview_light.js +1 -2
  135. package/dist/middle_layer/project_overview_light.js.map +1 -1
  136. package/dist/middle_layer/render.cjs +5 -6
  137. package/dist/middle_layer/render.cjs.map +1 -1
  138. package/dist/middle_layer/render.js +1 -2
  139. package/dist/middle_layer/render.js.map +1 -1
  140. package/dist/middle_layer/types.d.ts.map +1 -0
  141. package/dist/middle_layer/util.cjs +4 -5
  142. package/dist/middle_layer/util.cjs.map +1 -1
  143. package/dist/middle_layer/util.js +1 -2
  144. package/dist/middle_layer/util.js.map +1 -1
  145. package/dist/model/args.cjs +2 -3
  146. package/dist/model/args.cjs.map +1 -1
  147. package/dist/model/args.js +1 -2
  148. package/dist/model/args.js.map +1 -1
  149. package/dist/model/block_pack_spec.cjs +1 -2
  150. package/dist/model/block_pack_spec.cjs.map +1 -1
  151. package/dist/model/block_pack_spec.d.ts.map +1 -0
  152. package/dist/model/block_pack_spec.js +1 -1
  153. package/dist/model/frontend.d.ts.map +1 -0
  154. package/dist/model/project_helper.cjs +3 -4
  155. package/dist/model/project_helper.cjs.map +1 -1
  156. package/dist/model/project_helper.d.ts.map +1 -0
  157. package/dist/model/project_helper.js +1 -2
  158. package/dist/model/project_helper.js.map +1 -1
  159. package/dist/model/project_model.cjs +1 -6
  160. package/dist/model/project_model.cjs.map +1 -1
  161. package/dist/model/project_model.d.ts +0 -1
  162. package/dist/model/project_model.d.ts.map +1 -0
  163. package/dist/model/project_model.js +2 -4
  164. package/dist/model/project_model.js.map +1 -1
  165. package/dist/model/project_model_util.cjs +2 -3
  166. package/dist/model/project_model_util.cjs.map +1 -1
  167. package/dist/model/project_model_util.js +1 -2
  168. package/dist/model/project_model_util.js.map +1 -1
  169. package/dist/model/project_model_v1.cjs +1 -5
  170. package/dist/model/project_model_v1.cjs.map +1 -1
  171. package/dist/model/project_model_v1.js +2 -4
  172. package/dist/model/project_model_v1.js.map +1 -1
  173. package/dist/model/template_spec.d.ts.map +1 -0
  174. package/dist/mutator/block-pack/block_pack.cjs +9 -10
  175. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  176. package/dist/mutator/block-pack/block_pack.d.ts +0 -1
  177. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -0
  178. package/dist/mutator/block-pack/block_pack.js +2 -3
  179. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  180. package/dist/mutator/block-pack/frontend.cjs +3 -4
  181. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  182. package/dist/mutator/block-pack/frontend.js +1 -2
  183. package/dist/mutator/block-pack/frontend.js.map +1 -1
  184. package/dist/mutator/context_export.cjs +4 -5
  185. package/dist/mutator/context_export.cjs.map +1 -1
  186. package/dist/mutator/context_export.js +1 -2
  187. package/dist/mutator/context_export.js.map +1 -1
  188. package/dist/mutator/migration.cjs +13 -14
  189. package/dist/mutator/migration.cjs.map +1 -1
  190. package/dist/mutator/migration.js +11 -12
  191. package/dist/mutator/migration.js.map +1 -1
  192. package/dist/mutator/project.cjs +13 -14
  193. package/dist/mutator/project.cjs.map +1 -1
  194. package/dist/mutator/project.d.ts +0 -3
  195. package/dist/mutator/project.d.ts.map +1 -0
  196. package/dist/mutator/project.js +6 -7
  197. package/dist/mutator/project.js.map +1 -1
  198. package/dist/mutator/template/direct_template_loader.cjs +3 -4
  199. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  200. package/dist/mutator/template/direct_template_loader.js +1 -2
  201. package/dist/mutator/template/direct_template_loader.js.map +1 -1
  202. package/dist/mutator/template/direct_template_loader_v3.cjs +2 -3
  203. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  204. package/dist/mutator/template/direct_template_loader_v3.js +1 -2
  205. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -1
  206. package/dist/mutator/template/render_block.cjs +4 -6
  207. package/dist/mutator/template/render_block.cjs.map +1 -1
  208. package/dist/mutator/template/render_block.js +2 -4
  209. package/dist/mutator/template/render_block.js.map +1 -1
  210. package/dist/mutator/template/render_template.cjs +2 -3
  211. package/dist/mutator/template/render_template.cjs.map +1 -1
  212. package/dist/mutator/template/render_template.d.ts.map +1 -0
  213. package/dist/mutator/template/render_template.js +1 -2
  214. package/dist/mutator/template/render_template.js.map +1 -1
  215. package/dist/mutator/template/template_cache.cjs +6 -10
  216. package/dist/mutator/template/template_cache.cjs.map +1 -1
  217. package/dist/mutator/template/template_cache.d.ts +2 -3
  218. package/dist/mutator/template/template_cache.d.ts.map +1 -0
  219. package/dist/mutator/template/template_cache.js +4 -8
  220. package/dist/mutator/template/template_cache.js.map +1 -1
  221. package/dist/mutator/template/template_loading.cjs +3 -4
  222. package/dist/mutator/template/template_loading.cjs.map +1 -1
  223. package/dist/mutator/template/template_loading.d.ts.map +1 -0
  224. package/dist/mutator/template/template_loading.js +1 -2
  225. package/dist/mutator/template/template_loading.js.map +1 -1
  226. package/dist/network_check/network_check.cjs +4 -5
  227. package/dist/network_check/network_check.cjs.map +1 -1
  228. package/dist/network_check/network_check.d.ts.map +1 -0
  229. package/dist/network_check/network_check.js +1 -2
  230. package/dist/network_check/network_check.js.map +1 -1
  231. package/dist/network_check/pings.cjs +2 -3
  232. package/dist/network_check/pings.cjs.map +1 -1
  233. package/dist/network_check/pings.js +1 -2
  234. package/dist/network_check/pings.js.map +1 -1
  235. package/dist/network_check/template.cjs +4 -5
  236. package/dist/network_check/template.cjs.map +1 -1
  237. package/dist/network_check/template.js +1 -2
  238. package/dist/network_check/template.js.map +1 -1
  239. package/dist/pool/data.cjs +2 -3
  240. package/dist/pool/data.cjs.map +1 -1
  241. package/dist/pool/data.d.ts +0 -1
  242. package/dist/pool/data.d.ts.map +1 -0
  243. package/dist/pool/data.js +1 -2
  244. package/dist/pool/data.js.map +1 -1
  245. package/dist/pool/driver.cjs +3 -4
  246. package/dist/pool/driver.cjs.map +1 -1
  247. package/dist/pool/driver.d.ts +0 -1
  248. package/dist/pool/driver.d.ts.map +1 -0
  249. package/dist/pool/driver.js +1 -2
  250. package/dist/pool/driver.js.map +1 -1
  251. package/dist/pool/index.cjs +2 -2
  252. package/dist/pool/index.d.ts +1 -2
  253. package/dist/pool/index.js +2 -2
  254. package/dist/pool/p_object_collection.cjs +3 -4
  255. package/dist/pool/p_object_collection.cjs.map +1 -1
  256. package/dist/pool/p_object_collection.d.ts.map +1 -0
  257. package/dist/pool/p_object_collection.js +1 -2
  258. package/dist/pool/p_object_collection.js.map +1 -1
  259. package/dist/pool/result_pool.cjs +7 -8
  260. package/dist/pool/result_pool.cjs.map +1 -1
  261. package/dist/pool/result_pool.d.ts +1 -3
  262. package/dist/pool/result_pool.js +1 -2
  263. package/dist/pool/result_pool.js.map +1 -1
  264. package/dist/service_factories.cjs +2 -3
  265. package/dist/service_factories.cjs.map +1 -1
  266. package/dist/service_factories.js +1 -2
  267. package/dist/service_factories.js.map +1 -1
  268. package/dist/worker/WorkerManager.cjs +2 -3
  269. package/dist/worker/WorkerManager.cjs.map +1 -1
  270. package/dist/worker/WorkerManager.js +1 -2
  271. package/dist/worker/WorkerManager.js.map +1 -1
  272. package/dist/worker/worker.cjs +3 -4
  273. package/dist/worker/worker.cjs.map +1 -1
  274. package/dist/worker/worker.js +1 -2
  275. package/dist/worker/worker.js.map +1 -1
  276. package/dist/worker/workerApi.cjs +2 -3
  277. package/dist/worker/workerApi.cjs.map +1 -1
  278. package/dist/worker/workerApi.js +1 -2
  279. package/dist/worker/workerApi.js.map +1 -1
  280. package/package.json +13 -13
@@ -1,5 +1,4 @@
1
- const require_args = require('./args.cjs');
2
-
1
+ const require_args = require("./args.cjs");
3
2
  //#region src/model/project_model_util.ts
4
3
  function allBlocks(structure) {
5
4
  return { *[Symbol.iterator]() {
@@ -128,10 +127,10 @@ function graphDiff(a, b) {
128
127
  different
129
128
  };
130
129
  }
131
-
132
130
  //#endregion
133
131
  exports.allBlocks = allBlocks;
134
132
  exports.graphDiff = graphDiff;
135
133
  exports.productionGraph = productionGraph;
136
134
  exports.stagingGraph = stagingGraph;
135
+
137
136
  //# sourceMappingURL=project_model_util.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"project_model_util.cjs","names":["inferAllReferencedBlocks"],"sources":["../../src/model/project_model_util.ts"],"sourcesContent":["import type { Block, ProjectStructure } from \"./project_model\";\nimport type { Optional, Writable } from \"utility-types\";\nimport { inferAllReferencedBlocks } from \"./args\";\nimport type { PlRef } from \"@milaboratories/pl-model-common\";\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n },\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Upstreams, calculated accounting for potential indirect block dependencies */\n readonly upstream: Set<string>;\n /** Direct upstream, listed in block args */\n readonly directUpstream: Set<string>;\n /** Downstreams, calculated accounting for potential indirect block dependencies */\n readonly downstream: Set<string>;\n /** Downstream blocks enriching current block's outputs */\n readonly enrichments: Set<string>;\n /** Direct downstreams listing our block in it's args */\n readonly directDownstream: Set<string>;\n /** Upstream blocks that current block may enrich with its exports */\n readonly enrichmentTargets: Set<string>;\n}\n\nexport type BlockGraphDirection =\n | \"upstream\"\n | \"downstream\"\n | \"directUpstream\"\n | \"directDownstream\"\n | \"enrichments\"\n | \"enrichmentTargets\";\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(direction: BlockGraphDirection, ...rootBlockIds: string[]): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: BlockGraphDirection,\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void,\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n const nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction].forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, BlockGraphDirection>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false,\n };\n result.set(id, current);\n if (previous === undefined) {\n current.directUpstream = current.upstream = new Set<string>();\n current.enrichments = current.enrichmentTargets = new Set<string>();\n } else {\n current.directUpstream = current.upstream = new Set<string>([previous.id]);\n previous.directDownstream = previous.downstream = new Set<string>([current.id]);\n previous.enrichments = previous.enrichmentTargets = new Set<string>();\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.directDownstream = previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport type ProductionGraphBlockInfo = {\n args: unknown;\n enrichmentTargets: PlRef[] | undefined;\n};\n\nexport function productionGraph(\n structure: ProjectStructure,\n infoProvider: (blockId: string) => ProductionGraphBlockInfo | undefined,\n): BlockGraph {\n const resultMap = new Map<string, BlockGraphNode>();\n // result graph is constructed to be able to perform traversal on incomplete graph\n // to calculate potentialUpstreams\n const resultGraph = new BlockGraph(resultMap);\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const allAbove = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const info = infoProvider(id);\n\n // skipping those blocks for which we don't have args\n if (info === undefined) continue;\n\n const references = inferAllReferencedBlocks(info.args, allAbove);\n\n // The algorithm here adds all downstream blocks of direct upstreams as potential upstreams.\n // They may produce additional columns, anchored in our direct upstream, those columns might be needed by the workflow.\n const potentialUpstreams = new Set([\n ...references.upstreams,\n ...resultGraph.traverseIds(\"enrichments\", ...references.upstreamsRequiringEnrichments),\n ]);\n\n // To minimize complexity of the graph, we leave only the closest upstreams, removing all their transitive dependencies,\n // relying on the traversal mechanisms in BContexts and on UI level to connect our block with all upstreams\n const upstreams = new Set<string>();\n for (const { id: pId } of allBlocks(structure)) {\n if (pId === id) break; // stopping on current block\n if (potentialUpstreams.has(pId)) {\n upstreams.add(pId);\n for (const transitiveUpstream of resultGraph.traverseIdsExcludingRoots(\"upstream\", pId))\n upstreams.delete(transitiveUpstream);\n }\n }\n\n // default assumption is that all direct upstreams are enrichment targets\n const enrichmentTargets =\n info.enrichmentTargets === undefined\n ? new Set(references.upstreams)\n : new Set(info.enrichmentTargets.map((t) => t.blockId));\n\n const node: BlockGraphNode = {\n id,\n missingReferences: references.missingReferences,\n upstream: upstreams,\n directUpstream: references.upstreams,\n enrichmentTargets,\n downstream: new Set<string>(), // will be populated from downstream blocks\n directDownstream: new Set<string>(), // will be populated from downstream blocks\n enrichments: new Set<string>(), // will be populated from downstream blocks\n };\n resultMap.set(id, node);\n references.upstreams.forEach((dep) => resultMap.get(dep)!.directDownstream.add(id));\n upstreams.forEach((dep) => resultMap.get(dep)!.downstream.add(id));\n enrichmentTargets.forEach((dep) => resultMap.get(dep)?.enrichments.add(id));\n allAbove.add(id);\n }\n\n return resultGraph;\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"project_model_util.cjs","names":["inferAllReferencedBlocks"],"sources":["../../src/model/project_model_util.ts"],"sourcesContent":["import type { Block, ProjectStructure } from \"./project_model\";\nimport type { Optional, Writable } from \"utility-types\";\nimport { inferAllReferencedBlocks } from \"./args\";\nimport type { PlRef } from \"@milaboratories/pl-model-common\";\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n },\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Upstreams, calculated accounting for potential indirect block dependencies */\n readonly upstream: Set<string>;\n /** Direct upstream, listed in block args */\n readonly directUpstream: Set<string>;\n /** Downstreams, calculated accounting for potential indirect block dependencies */\n readonly downstream: Set<string>;\n /** Downstream blocks enriching current block's outputs */\n readonly enrichments: Set<string>;\n /** Direct downstreams listing our block in it's args */\n readonly directDownstream: Set<string>;\n /** Upstream blocks that current block may enrich with its exports */\n readonly enrichmentTargets: Set<string>;\n}\n\nexport type BlockGraphDirection =\n | \"upstream\"\n | \"downstream\"\n | \"directUpstream\"\n | \"directDownstream\"\n | \"enrichments\"\n | \"enrichmentTargets\";\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(direction: BlockGraphDirection, ...rootBlockIds: string[]): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: BlockGraphDirection,\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void,\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n const nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction].forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, BlockGraphDirection>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false,\n };\n result.set(id, current);\n if (previous === undefined) {\n current.directUpstream = current.upstream = new Set<string>();\n current.enrichments = current.enrichmentTargets = new Set<string>();\n } else {\n current.directUpstream = current.upstream = new Set<string>([previous.id]);\n previous.directDownstream = previous.downstream = new Set<string>([current.id]);\n previous.enrichments = previous.enrichmentTargets = new Set<string>();\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.directDownstream = previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport type ProductionGraphBlockInfo = {\n args: unknown;\n enrichmentTargets: PlRef[] | undefined;\n};\n\nexport function productionGraph(\n structure: ProjectStructure,\n infoProvider: (blockId: string) => ProductionGraphBlockInfo | undefined,\n): BlockGraph {\n const resultMap = new Map<string, BlockGraphNode>();\n // result graph is constructed to be able to perform traversal on incomplete graph\n // to calculate potentialUpstreams\n const resultGraph = new BlockGraph(resultMap);\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const allAbove = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const info = infoProvider(id);\n\n // skipping those blocks for which we don't have args\n if (info === undefined) continue;\n\n const references = inferAllReferencedBlocks(info.args, allAbove);\n\n // The algorithm here adds all downstream blocks of direct upstreams as potential upstreams.\n // They may produce additional columns, anchored in our direct upstream, those columns might be needed by the workflow.\n const potentialUpstreams = new Set([\n ...references.upstreams,\n ...resultGraph.traverseIds(\"enrichments\", ...references.upstreamsRequiringEnrichments),\n ]);\n\n // To minimize complexity of the graph, we leave only the closest upstreams, removing all their transitive dependencies,\n // relying on the traversal mechanisms in BContexts and on UI level to connect our block with all upstreams\n const upstreams = new Set<string>();\n for (const { id: pId } of allBlocks(structure)) {\n if (pId === id) break; // stopping on current block\n if (potentialUpstreams.has(pId)) {\n upstreams.add(pId);\n for (const transitiveUpstream of resultGraph.traverseIdsExcludingRoots(\"upstream\", pId))\n upstreams.delete(transitiveUpstream);\n }\n }\n\n // default assumption is that all direct upstreams are enrichment targets\n const enrichmentTargets =\n info.enrichmentTargets === undefined\n ? new Set(references.upstreams)\n : new Set(info.enrichmentTargets.map((t) => t.blockId));\n\n const node: BlockGraphNode = {\n id,\n missingReferences: references.missingReferences,\n upstream: upstreams,\n directUpstream: references.upstreams,\n enrichmentTargets,\n downstream: new Set<string>(), // will be populated from downstream blocks\n directDownstream: new Set<string>(), // will be populated from downstream blocks\n enrichments: new Set<string>(), // will be populated from downstream blocks\n };\n resultMap.set(id, node);\n references.upstreams.forEach((dep) => resultMap.get(dep)!.directDownstream.add(id));\n upstreams.forEach((dep) => resultMap.get(dep)!.downstream.add(id));\n enrichmentTargets.forEach((dep) => resultMap.get(dep)?.enrichments.add(id));\n allAbove.add(id);\n }\n\n return resultGraph;\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { inferAllReferencedBlocks } from "./args.js";
2
-
3
2
  //#region src/model/project_model_util.ts
4
3
  function allBlocks(structure) {
5
4
  return { *[Symbol.iterator]() {
@@ -128,7 +127,7 @@ function graphDiff(a, b) {
128
127
  different
129
128
  };
130
129
  }
131
-
132
130
  //#endregion
133
131
  export { allBlocks, graphDiff, productionGraph, stagingGraph };
132
+
134
133
  //# sourceMappingURL=project_model_util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project_model_util.js","names":[],"sources":["../../src/model/project_model_util.ts"],"sourcesContent":["import type { Block, ProjectStructure } from \"./project_model\";\nimport type { Optional, Writable } from \"utility-types\";\nimport { inferAllReferencedBlocks } from \"./args\";\nimport type { PlRef } from \"@milaboratories/pl-model-common\";\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n },\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Upstreams, calculated accounting for potential indirect block dependencies */\n readonly upstream: Set<string>;\n /** Direct upstream, listed in block args */\n readonly directUpstream: Set<string>;\n /** Downstreams, calculated accounting for potential indirect block dependencies */\n readonly downstream: Set<string>;\n /** Downstream blocks enriching current block's outputs */\n readonly enrichments: Set<string>;\n /** Direct downstreams listing our block in it's args */\n readonly directDownstream: Set<string>;\n /** Upstream blocks that current block may enrich with its exports */\n readonly enrichmentTargets: Set<string>;\n}\n\nexport type BlockGraphDirection =\n | \"upstream\"\n | \"downstream\"\n | \"directUpstream\"\n | \"directDownstream\"\n | \"enrichments\"\n | \"enrichmentTargets\";\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(direction: BlockGraphDirection, ...rootBlockIds: string[]): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: BlockGraphDirection,\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void,\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n const nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction].forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, BlockGraphDirection>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false,\n };\n result.set(id, current);\n if (previous === undefined) {\n current.directUpstream = current.upstream = new Set<string>();\n current.enrichments = current.enrichmentTargets = new Set<string>();\n } else {\n current.directUpstream = current.upstream = new Set<string>([previous.id]);\n previous.directDownstream = previous.downstream = new Set<string>([current.id]);\n previous.enrichments = previous.enrichmentTargets = new Set<string>();\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.directDownstream = previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport type ProductionGraphBlockInfo = {\n args: unknown;\n enrichmentTargets: PlRef[] | undefined;\n};\n\nexport function productionGraph(\n structure: ProjectStructure,\n infoProvider: (blockId: string) => ProductionGraphBlockInfo | undefined,\n): BlockGraph {\n const resultMap = new Map<string, BlockGraphNode>();\n // result graph is constructed to be able to perform traversal on incomplete graph\n // to calculate potentialUpstreams\n const resultGraph = new BlockGraph(resultMap);\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const allAbove = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const info = infoProvider(id);\n\n // skipping those blocks for which we don't have args\n if (info === undefined) continue;\n\n const references = inferAllReferencedBlocks(info.args, allAbove);\n\n // The algorithm here adds all downstream blocks of direct upstreams as potential upstreams.\n // They may produce additional columns, anchored in our direct upstream, those columns might be needed by the workflow.\n const potentialUpstreams = new Set([\n ...references.upstreams,\n ...resultGraph.traverseIds(\"enrichments\", ...references.upstreamsRequiringEnrichments),\n ]);\n\n // To minimize complexity of the graph, we leave only the closest upstreams, removing all their transitive dependencies,\n // relying on the traversal mechanisms in BContexts and on UI level to connect our block with all upstreams\n const upstreams = new Set<string>();\n for (const { id: pId } of allBlocks(structure)) {\n if (pId === id) break; // stopping on current block\n if (potentialUpstreams.has(pId)) {\n upstreams.add(pId);\n for (const transitiveUpstream of resultGraph.traverseIdsExcludingRoots(\"upstream\", pId))\n upstreams.delete(transitiveUpstream);\n }\n }\n\n // default assumption is that all direct upstreams are enrichment targets\n const enrichmentTargets =\n info.enrichmentTargets === undefined\n ? new Set(references.upstreams)\n : new Set(info.enrichmentTargets.map((t) => t.blockId));\n\n const node: BlockGraphNode = {\n id,\n missingReferences: references.missingReferences,\n upstream: upstreams,\n directUpstream: references.upstreams,\n enrichmentTargets,\n downstream: new Set<string>(), // will be populated from downstream blocks\n directDownstream: new Set<string>(), // will be populated from downstream blocks\n enrichments: new Set<string>(), // will be populated from downstream blocks\n };\n resultMap.set(id, node);\n references.upstreams.forEach((dep) => resultMap.get(dep)!.directDownstream.add(id));\n upstreams.forEach((dep) => resultMap.get(dep)!.downstream.add(id));\n enrichmentTargets.forEach((dep) => resultMap.get(dep)?.enrichments.add(id));\n allAbove.add(id);\n }\n\n return resultGraph;\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"project_model_util.js","names":[],"sources":["../../src/model/project_model_util.ts"],"sourcesContent":["import type { Block, ProjectStructure } from \"./project_model\";\nimport type { Optional, Writable } from \"utility-types\";\nimport { inferAllReferencedBlocks } from \"./args\";\nimport type { PlRef } from \"@milaboratories/pl-model-common\";\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n },\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Upstreams, calculated accounting for potential indirect block dependencies */\n readonly upstream: Set<string>;\n /** Direct upstream, listed in block args */\n readonly directUpstream: Set<string>;\n /** Downstreams, calculated accounting for potential indirect block dependencies */\n readonly downstream: Set<string>;\n /** Downstream blocks enriching current block's outputs */\n readonly enrichments: Set<string>;\n /** Direct downstreams listing our block in it's args */\n readonly directDownstream: Set<string>;\n /** Upstream blocks that current block may enrich with its exports */\n readonly enrichmentTargets: Set<string>;\n}\n\nexport type BlockGraphDirection =\n | \"upstream\"\n | \"downstream\"\n | \"directUpstream\"\n | \"directDownstream\"\n | \"enrichments\"\n | \"enrichmentTargets\";\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(direction: BlockGraphDirection, ...rootBlockIds: string[]): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: BlockGraphDirection,\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: BlockGraphDirection,\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void,\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n const nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction].forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, BlockGraphDirection>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false,\n };\n result.set(id, current);\n if (previous === undefined) {\n current.directUpstream = current.upstream = new Set<string>();\n current.enrichments = current.enrichmentTargets = new Set<string>();\n } else {\n current.directUpstream = current.upstream = new Set<string>([previous.id]);\n previous.directDownstream = previous.downstream = new Set<string>([current.id]);\n previous.enrichments = previous.enrichmentTargets = new Set<string>();\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.directDownstream = previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport type ProductionGraphBlockInfo = {\n args: unknown;\n enrichmentTargets: PlRef[] | undefined;\n};\n\nexport function productionGraph(\n structure: ProjectStructure,\n infoProvider: (blockId: string) => ProductionGraphBlockInfo | undefined,\n): BlockGraph {\n const resultMap = new Map<string, BlockGraphNode>();\n // result graph is constructed to be able to perform traversal on incomplete graph\n // to calculate potentialUpstreams\n const resultGraph = new BlockGraph(resultMap);\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const allAbove = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const info = infoProvider(id);\n\n // skipping those blocks for which we don't have args\n if (info === undefined) continue;\n\n const references = inferAllReferencedBlocks(info.args, allAbove);\n\n // The algorithm here adds all downstream blocks of direct upstreams as potential upstreams.\n // They may produce additional columns, anchored in our direct upstream, those columns might be needed by the workflow.\n const potentialUpstreams = new Set([\n ...references.upstreams,\n ...resultGraph.traverseIds(\"enrichments\", ...references.upstreamsRequiringEnrichments),\n ]);\n\n // To minimize complexity of the graph, we leave only the closest upstreams, removing all their transitive dependencies,\n // relying on the traversal mechanisms in BContexts and on UI level to connect our block with all upstreams\n const upstreams = new Set<string>();\n for (const { id: pId } of allBlocks(structure)) {\n if (pId === id) break; // stopping on current block\n if (potentialUpstreams.has(pId)) {\n upstreams.add(pId);\n for (const transitiveUpstream of resultGraph.traverseIdsExcludingRoots(\"upstream\", pId))\n upstreams.delete(transitiveUpstream);\n }\n }\n\n // default assumption is that all direct upstreams are enrichment targets\n const enrichmentTargets =\n info.enrichmentTargets === undefined\n ? new Set(references.upstreams)\n : new Set(info.enrichmentTargets.map((t) => t.blockId));\n\n const node: BlockGraphNode = {\n id,\n missingReferences: references.missingReferences,\n upstream: upstreams,\n directUpstream: references.upstreams,\n enrichmentTargets,\n downstream: new Set<string>(), // will be populated from downstream blocks\n directDownstream: new Set<string>(), // will be populated from downstream blocks\n enrichments: new Set<string>(), // will be populated from downstream blocks\n };\n resultMap.set(id, node);\n references.upstreams.forEach((dep) => resultMap.get(dep)!.directDownstream.add(id));\n upstreams.forEach((dep) => resultMap.get(dep)!.downstream.add(id));\n enrichmentTargets.forEach((dep) => resultMap.get(dep)?.enrichments.add(id));\n allAbove.add(id);\n }\n\n return resultGraph;\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n"],"mappings":"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"}
@@ -1,10 +1,6 @@
1
-
2
1
  //#region src/model/project_model_v1.ts
3
- /** Uses KV for uiState compared to V2 */
4
- const SchemaVersionV1 = "1";
5
2
  const BlockFrontendStateKeyPrefixV1 = "BlockFrontendState/";
6
-
7
3
  //#endregion
8
4
  exports.BlockFrontendStateKeyPrefixV1 = BlockFrontendStateKeyPrefixV1;
9
- exports.SchemaVersionV1 = SchemaVersionV1;
5
+
10
6
  //# sourceMappingURL=project_model_v1.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"project_model_v1.cjs","names":[],"sources":["../../src/model/project_model_v1.ts"],"sourcesContent":["/** Uses KV for uiState compared to V2 */\nexport const SchemaVersionV1 = \"1\";\n\nexport const BlockFrontendStateKeyPrefixV1 = \"BlockFrontendState/\";\nexport const BlockFrontendStateKeyPatternV1 = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKeyV1(blockId: string): string {\n return `${BlockFrontendStateKeyPrefixV1}${blockId}`;\n}\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKeyV1(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPatternV1);\n if (match === null) return undefined;\n return match.groups![\"blockid\"];\n}\n"],"mappings":";;;AACA,MAAa,kBAAkB;AAE/B,MAAa,gCAAgC"}
1
+ {"version":3,"file":"project_model_v1.cjs","names":[],"sources":["../../src/model/project_model_v1.ts"],"sourcesContent":["/** Uses KV for uiState compared to V2 */\nexport const SchemaVersionV1 = \"1\";\n\nexport const BlockFrontendStateKeyPrefixV1 = \"BlockFrontendState/\";\nexport const BlockFrontendStateKeyPatternV1 = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKeyV1(blockId: string): string {\n return `${BlockFrontendStateKeyPrefixV1}${blockId}`;\n}\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKeyV1(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPatternV1);\n if (match === null) return undefined;\n return match.groups![\"blockid\"];\n}\n"],"mappings":";AAGA,MAAa,gCAAgC"}
@@ -1,8 +1,6 @@
1
1
  //#region src/model/project_model_v1.ts
2
- /** Uses KV for uiState compared to V2 */
3
- const SchemaVersionV1 = "1";
4
2
  const BlockFrontendStateKeyPrefixV1 = "BlockFrontendState/";
5
-
6
3
  //#endregion
7
- export { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 };
4
+ export { BlockFrontendStateKeyPrefixV1 };
5
+
8
6
  //# sourceMappingURL=project_model_v1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project_model_v1.js","names":[],"sources":["../../src/model/project_model_v1.ts"],"sourcesContent":["/** Uses KV for uiState compared to V2 */\nexport const SchemaVersionV1 = \"1\";\n\nexport const BlockFrontendStateKeyPrefixV1 = \"BlockFrontendState/\";\nexport const BlockFrontendStateKeyPatternV1 = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKeyV1(blockId: string): string {\n return `${BlockFrontendStateKeyPrefixV1}${blockId}`;\n}\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKeyV1(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPatternV1);\n if (match === null) return undefined;\n return match.groups![\"blockid\"];\n}\n"],"mappings":";;AACA,MAAa,kBAAkB;AAE/B,MAAa,gCAAgC"}
1
+ {"version":3,"file":"project_model_v1.js","names":[],"sources":["../../src/model/project_model_v1.ts"],"sourcesContent":["/** Uses KV for uiState compared to V2 */\nexport const SchemaVersionV1 = \"1\";\n\nexport const BlockFrontendStateKeyPrefixV1 = \"BlockFrontendState/\";\nexport const BlockFrontendStateKeyPatternV1 = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKeyV1(blockId: string): string {\n return `${BlockFrontendStateKeyPrefixV1}${blockId}`;\n}\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKeyV1(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPatternV1);\n if (match === null) return undefined;\n return match.groups![\"blockid\"];\n}\n"],"mappings":";AAGA,MAAa,gCAAgC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template_spec.d.ts","names":[],"sources":["../../src/model/template_spec.ts"],"mappings":";;;;UAGiB,oBAAA;EAAA,SACN,IAAA;EACT,QAAA;EACA,IAAA;AAAA;AAAA,UAGe,gBAAA;EAAA,SACN,IAAA;EACT,OAAA,EAAS,UAAA;AAAA;AAAA,UAGM,gBAAA;EAAA,SACN,IAAA;EACT,IAAA,EAAM,YAAA,GAAe,kBAAA;AAAA;AAAA,UAGN,cAAA;EAAA,SACN,IAAA;EAAA,SACA,UAAA,EAAY,UAAA;AAAA;AAAA,UAGN,gBAAA;EAAA,SACN,IAAA;EACT,IAAA;AAAA;AAAA,KAGU,oBAAA,GACR,oBAAA,GACA,gBAAA,GACA,gBAAA,GACA,cAAA;AAAA,KACQ,eAAA,GAAkB,oBAAA,GAAuB,gBAAA"}
@@ -1,11 +1,11 @@
1
- const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
- const require_index = require('../../dev_env/index.cjs');
3
- const require_registry = require('../../block_registry/registry.cjs');
4
- require('../../block_registry/index.cjs');
5
- const require_template_loading = require('../template/template_loading.cjs');
6
- const require_frontend = require('./frontend.cjs');
7
- const require_WorkerManager = require('../../worker/WorkerManager.cjs');
8
- const require_usingCtx = require('../../_virtual/_@oxc-project_runtime@0.114.0/helpers/usingCtx.cjs');
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
2
+ const require_index = require("../../dev_env/index.cjs");
3
+ const require_registry = require("../../block_registry/registry.cjs");
4
+ require("../../block_registry/index.cjs");
5
+ const require_template_loading = require("../template/template_loading.cjs");
6
+ const require_frontend = require("./frontend.cjs");
7
+ const require_WorkerManager = require("../../worker/WorkerManager.cjs");
8
+ const require_usingCtx = require("../../_virtual/_@oxc-project_runtime@0.123.0/helpers/usingCtx.cjs");
9
9
  let _platforma_sdk_model = require("@platforma-sdk/model");
10
10
  let undici = require("undici");
11
11
  let _platforma_sdk_block_tools = require("@platforma-sdk/block-tools");
@@ -17,7 +17,6 @@ let lru_cache = require("lru-cache");
17
17
  let canonicalize = require("canonicalize");
18
18
  canonicalize = require_runtime.__toESM(canonicalize);
19
19
  let zod = require("zod");
20
-
21
20
  //#region src/mutator/block-pack/block_pack.ts
22
21
  const BlockPackCustomType = {
23
22
  name: "BlockPackCustom",
@@ -229,10 +228,10 @@ function createBlockPack(tx, spec) {
229
228
  default: return (0, _milaboratories_ts_helpers.assertNever)(spec.type);
230
229
  }
231
230
  }
232
-
233
231
  //#endregion
234
232
  exports.BlockPackFrontendField = BlockPackFrontendField;
235
233
  exports.BlockPackPreparer = BlockPackPreparer;
236
234
  exports.BlockPackTemplateField = BlockPackTemplateField;
237
235
  exports.createBlockPack = createBlockPack;
236
+
238
237
  //# sourceMappingURL=block_pack.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"block_pack.cjs","names":["z","Code","LRUCache","resolveDevPacket","fs","RegistryV1","WorkerManager","getDevV2PacketMtime","loadTemplate","createFrontend"],"sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from \"@milaboratories/pl-client\";\nimport { field } from \"@milaboratories/pl-client\";\nimport { loadTemplate } from \"../template/template_loading\";\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from \"../../model\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport type { Branded } from \"@milaboratories/pl-model-common\";\nimport fs from \"node:fs\";\nimport type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport { createFrontend } from \"./frontend\";\nimport type { BlockConfigContainer } from \"@platforma-sdk/model\";\nimport { Code } from \"@platforma-sdk/model\";\nimport { loadPackDescription, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport type { BlockPackInfo } from \"../../model/block_pack\";\nimport { resolveDevPacket } from \"../../dev_env\";\nimport { getDevV2PacketMtime } from \"../../block_registry\";\nimport type { V2RegistryProvider } from \"../../block_registry/registry-v2-provider\";\nimport { LRUCache } from \"lru-cache\";\nimport canonicalize from \"canonicalize\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport { WorkerManager } from \"../../worker/WorkerManager\";\nimport { z } from \"zod\";\n\ntype PreparedCacheKey = Branded<string, \"PreparedCacheKey\">;\n\nexport const BlockPackCustomType: ResourceType = { name: \"BlockPackCustom\", version: \"1\" };\nexport const BlockPackTemplateField = \"template\";\nexport const BlockPackFrontendField = \"frontend\";\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith(\"/\")) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error(\"Invalid config content\");\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error(\"parseStringConfig:No code bundle\");\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString(\"utf8\"));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n /** Cache of prepared block packs for registry specs (immutable by version). */\n private readonly preparedCache = new LRUCache<PreparedCacheKey, BlockPackSpecPrepared>({\n max: 50,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case \"explicit\":\n return spec.config;\n\n case \"prepared\":\n return spec.config;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: \"utf-8\" });\n return JSON.parse(configContent);\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n });\n return parseStringConfig(configContent);\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString(\"utf8\"));\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n /** Returns a stable cache key for registry specs (immutable by version). Dev specs return undefined. */\n private specKey(spec: BlockPackSpecAny): PreparedCacheKey | undefined {\n switch (spec.type) {\n case \"from-registry-v1\":\n return `v1:${spec.registryUrl}:${spec.id.organization}:${spec.id.name}:${spec.id.version}` as PreparedCacheKey;\n case \"from-registry-v2\":\n return `v2:${spec.registryUrl}:${canonicalize(spec.id)}` as PreparedCacheKey;\n default:\n return undefined; // dev, explicit, prepared — not cacheable\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === \"prepared\") {\n return spec;\n }\n\n // Check prepare cache for registry specs\n const key = this.specKey(spec);\n if (key) {\n const cached = this.preparedCache.get(key);\n if (cached) return cached;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n const result: BlockPackSpecPrepared = {\n ...explicit,\n type: \"prepared\",\n template: {\n type: \"prepared\",\n data: await workerManager.process(\"parseTemplate\", explicit.template.content),\n },\n };\n\n if (key) {\n this.preparedCache.set(key, result);\n }\n\n return result;\n }\n\n private async prepareWithoutUnpacking(\n spec: BlockPackExplicit | BlockPackSpec,\n ): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case \"explicit\":\n return spec;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(await fs.promises.readFile(devPaths.config, \"utf-8\"));\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: workflowContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(\n Buffer.from(configResponse).toString(\"utf8\"),\n ) as BlockConfigContainer;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"url\",\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: \"url\",\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), \"Input\", loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), \"Input\", createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case \"prepared\":\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"block_pack.cjs","names":["z","Code","LRUCache","resolveDevPacket","fs","RegistryV1","WorkerManager","getDevV2PacketMtime","loadTemplate","createFrontend"],"sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from \"@milaboratories/pl-client\";\nimport { field } from \"@milaboratories/pl-client\";\nimport { loadTemplate } from \"../template/template_loading\";\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from \"../../model\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport type { Branded } from \"@milaboratories/pl-model-common\";\nimport fs from \"node:fs\";\nimport type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport { createFrontend } from \"./frontend\";\nimport type { BlockConfigContainer } from \"@platforma-sdk/model\";\nimport { Code } from \"@platforma-sdk/model\";\nimport { loadPackDescription, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport type { BlockPackInfo } from \"../../model/block_pack\";\nimport { resolveDevPacket } from \"../../dev_env\";\nimport { getDevV2PacketMtime } from \"../../block_registry\";\nimport type { V2RegistryProvider } from \"../../block_registry/registry-v2-provider\";\nimport { LRUCache } from \"lru-cache\";\nimport canonicalize from \"canonicalize\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport { WorkerManager } from \"../../worker/WorkerManager\";\nimport { z } from \"zod\";\n\ntype PreparedCacheKey = Branded<string, \"PreparedCacheKey\">;\n\nexport const BlockPackCustomType: ResourceType = { name: \"BlockPackCustom\", version: \"1\" };\nexport const BlockPackTemplateField = \"template\";\nexport const BlockPackFrontendField = \"frontend\";\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith(\"/\")) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error(\"Invalid config content\");\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error(\"parseStringConfig:No code bundle\");\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString(\"utf8\"));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n /** Cache of prepared block packs for registry specs (immutable by version). */\n private readonly preparedCache = new LRUCache<PreparedCacheKey, BlockPackSpecPrepared>({\n max: 50,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case \"explicit\":\n return spec.config;\n\n case \"prepared\":\n return spec.config;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: \"utf-8\" });\n return JSON.parse(configContent);\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n });\n return parseStringConfig(configContent);\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString(\"utf8\"));\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n /** Returns a stable cache key for registry specs (immutable by version). Dev specs return undefined. */\n private specKey(spec: BlockPackSpecAny): PreparedCacheKey | undefined {\n switch (spec.type) {\n case \"from-registry-v1\":\n return `v1:${spec.registryUrl}:${spec.id.organization}:${spec.id.name}:${spec.id.version}` as PreparedCacheKey;\n case \"from-registry-v2\":\n return `v2:${spec.registryUrl}:${canonicalize(spec.id)}` as PreparedCacheKey;\n default:\n return undefined; // dev, explicit, prepared — not cacheable\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === \"prepared\") {\n return spec;\n }\n\n // Check prepare cache for registry specs\n const key = this.specKey(spec);\n if (key) {\n const cached = this.preparedCache.get(key);\n if (cached) return cached;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n const result: BlockPackSpecPrepared = {\n ...explicit,\n type: \"prepared\",\n template: {\n type: \"prepared\",\n data: await workerManager.process(\"parseTemplate\", explicit.template.content),\n },\n };\n\n if (key) {\n this.preparedCache.set(key, result);\n }\n\n return result;\n }\n\n private async prepareWithoutUnpacking(\n spec: BlockPackExplicit | BlockPackSpec,\n ): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case \"explicit\":\n return spec;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(await fs.promises.readFile(devPaths.config, \"utf-8\"));\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: workflowContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(\n Buffer.from(configResponse).toString(\"utf8\"),\n ) as BlockConfigContainer;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"url\",\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: \"url\",\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), \"Input\", loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), \"Input\", createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case \"prepared\":\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { V2RegistryProvider } from "../../block_registry/registry-v2-provider.js";
2
2
  import { BlockPackSpecAny, BlockPackSpecPrepared } from "../../model/block_pack_spec.js";
3
- import "../../model/index.js";
4
3
  import { BlockConfigContainer } from "@platforma-sdk/model";
5
4
  import { Dispatcher } from "undici";
6
5
  import { Signer } from "@milaboratories/ts-helpers";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_pack.d.ts","names":[],"sources":["../../../src/mutator/block-pack/block_pack.ts"],"mappings":";;;;;;;;cAsDa,iBAAA;EAAA,iBAEQ,kBAAA;EAAA,iBACA,MAAA;EAAA,iBACA,IAAA;cAFA,kBAAA,EAAoB,kBAAA,EACpB,MAAA,EAAQ,MAAA,EACR,IAAA,GAAO,UAAA;EAAA,iBAGT,kBAAA;EAe0B;EAAA,iBAJ1B,aAAA;EAIJ,uBAAA,CAAwB,IAAA,EAAM,gBAAA,GAAmB,OAAA,CAAQ,oBAAA;EAqD3C;EAAA,QAXnB,OAAA;EAWK,OAAA,CAAQ,IAAA,EAAM,gBAAA,GAAmB,OAAA,CAAQ,qBAAA;EAAA,QAgCxC,uBAAA;AAAA"}
@@ -4,7 +4,7 @@ import "../../block_registry/index.js";
4
4
  import { loadTemplate } from "../template/template_loading.js";
5
5
  import { createFrontend } from "./frontend.js";
6
6
  import { WorkerManager } from "../../worker/WorkerManager.js";
7
- import { _usingCtx } from "../../_virtual/_@oxc-project_runtime@0.114.0/helpers/usingCtx.js";
7
+ import { _usingCtx } from "../../_virtual/_@oxc-project_runtime@0.123.0/helpers/usingCtx.js";
8
8
  import { Code } from "@platforma-sdk/model";
9
9
  import { request } from "undici";
10
10
  import { RegistryV1, loadPackDescription } from "@platforma-sdk/block-tools";
@@ -14,7 +14,6 @@ import { field } from "@milaboratories/pl-client";
14
14
  import { LRUCache } from "lru-cache";
15
15
  import canonicalize from "canonicalize";
16
16
  import { z } from "zod";
17
-
18
17
  //#region src/mutator/block-pack/block_pack.ts
19
18
  const BlockPackCustomType = {
20
19
  name: "BlockPackCustom",
@@ -226,7 +225,7 @@ function createBlockPack(tx, spec) {
226
225
  default: return assertNever(spec.type);
227
226
  }
228
227
  }
229
-
230
228
  //#endregion
231
229
  export { BlockPackFrontendField, BlockPackPreparer, BlockPackTemplateField, createBlockPack };
230
+
232
231
  //# sourceMappingURL=block_pack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"block_pack.js","names":[],"sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from \"@milaboratories/pl-client\";\nimport { field } from \"@milaboratories/pl-client\";\nimport { loadTemplate } from \"../template/template_loading\";\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from \"../../model\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport type { Branded } from \"@milaboratories/pl-model-common\";\nimport fs from \"node:fs\";\nimport type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport { createFrontend } from \"./frontend\";\nimport type { BlockConfigContainer } from \"@platforma-sdk/model\";\nimport { Code } from \"@platforma-sdk/model\";\nimport { loadPackDescription, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport type { BlockPackInfo } from \"../../model/block_pack\";\nimport { resolveDevPacket } from \"../../dev_env\";\nimport { getDevV2PacketMtime } from \"../../block_registry\";\nimport type { V2RegistryProvider } from \"../../block_registry/registry-v2-provider\";\nimport { LRUCache } from \"lru-cache\";\nimport canonicalize from \"canonicalize\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport { WorkerManager } from \"../../worker/WorkerManager\";\nimport { z } from \"zod\";\n\ntype PreparedCacheKey = Branded<string, \"PreparedCacheKey\">;\n\nexport const BlockPackCustomType: ResourceType = { name: \"BlockPackCustom\", version: \"1\" };\nexport const BlockPackTemplateField = \"template\";\nexport const BlockPackFrontendField = \"frontend\";\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith(\"/\")) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error(\"Invalid config content\");\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error(\"parseStringConfig:No code bundle\");\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString(\"utf8\"));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n /** Cache of prepared block packs for registry specs (immutable by version). */\n private readonly preparedCache = new LRUCache<PreparedCacheKey, BlockPackSpecPrepared>({\n max: 50,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case \"explicit\":\n return spec.config;\n\n case \"prepared\":\n return spec.config;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: \"utf-8\" });\n return JSON.parse(configContent);\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n });\n return parseStringConfig(configContent);\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString(\"utf8\"));\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n /** Returns a stable cache key for registry specs (immutable by version). Dev specs return undefined. */\n private specKey(spec: BlockPackSpecAny): PreparedCacheKey | undefined {\n switch (spec.type) {\n case \"from-registry-v1\":\n return `v1:${spec.registryUrl}:${spec.id.organization}:${spec.id.name}:${spec.id.version}` as PreparedCacheKey;\n case \"from-registry-v2\":\n return `v2:${spec.registryUrl}:${canonicalize(spec.id)}` as PreparedCacheKey;\n default:\n return undefined; // dev, explicit, prepared — not cacheable\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === \"prepared\") {\n return spec;\n }\n\n // Check prepare cache for registry specs\n const key = this.specKey(spec);\n if (key) {\n const cached = this.preparedCache.get(key);\n if (cached) return cached;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n const result: BlockPackSpecPrepared = {\n ...explicit,\n type: \"prepared\",\n template: {\n type: \"prepared\",\n data: await workerManager.process(\"parseTemplate\", explicit.template.content),\n },\n };\n\n if (key) {\n this.preparedCache.set(key, result);\n }\n\n return result;\n }\n\n private async prepareWithoutUnpacking(\n spec: BlockPackExplicit | BlockPackSpec,\n ): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case \"explicit\":\n return spec;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(await fs.promises.readFile(devPaths.config, \"utf-8\"));\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: workflowContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(\n Buffer.from(configResponse).toString(\"utf8\"),\n ) as BlockConfigContainer;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"url\",\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: \"url\",\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), \"Input\", loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), \"Input\", createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case \"prepared\":\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"block_pack.js","names":[],"sources":["../../../src/mutator/block-pack/block_pack.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction, ResourceType } from \"@milaboratories/pl-client\";\nimport { field } from \"@milaboratories/pl-client\";\nimport { loadTemplate } from \"../template/template_loading\";\nimport type { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from \"../../model\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport type { Branded } from \"@milaboratories/pl-model-common\";\nimport fs from \"node:fs\";\nimport type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport { createFrontend } from \"./frontend\";\nimport type { BlockConfigContainer } from \"@platforma-sdk/model\";\nimport { Code } from \"@platforma-sdk/model\";\nimport { loadPackDescription, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport type { BlockPackInfo } from \"../../model/block_pack\";\nimport { resolveDevPacket } from \"../../dev_env\";\nimport { getDevV2PacketMtime } from \"../../block_registry\";\nimport type { V2RegistryProvider } from \"../../block_registry/registry-v2-provider\";\nimport { LRUCache } from \"lru-cache\";\nimport canonicalize from \"canonicalize\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport { WorkerManager } from \"../../worker/WorkerManager\";\nimport { z } from \"zod\";\n\ntype PreparedCacheKey = Branded<string, \"PreparedCacheKey\">;\n\nexport const BlockPackCustomType: ResourceType = { name: \"BlockPackCustom\", version: \"1\" };\nexport const BlockPackTemplateField = \"template\";\nexport const BlockPackFrontendField = \"frontend\";\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith(\"/\")) return str;\n else return `${str}/`;\n}\n\nfunction parseStringConfig(configContent: string): BlockConfigContainer {\n const res = z.record(z.string(), z.unknown()).safeParse(JSON.parse(configContent));\n\n if (!res.success) {\n throw new Error(\"Invalid config content\");\n }\n\n if (!Code.safeParse(res.data.code).success) {\n throw new Error(\"parseStringConfig:No code bundle\");\n }\n\n return res.data as BlockConfigContainer;\n}\n\nfunction parseBufferConfig(buffer: ArrayBuffer): BlockConfigContainer {\n return parseStringConfig(Buffer.from(buffer).toString(\"utf8\"));\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher,\n ) {}\n\n private readonly remoteContentCache = new LRUCache<string, ArrayBuffer>({\n max: 500,\n maxSize: 128 * 1024 * 1024,\n fetchMethod: async (key) => {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n return await (await request(key, httpOptions)).body.arrayBuffer();\n },\n sizeCalculation: (value) => value.byteLength,\n });\n\n /** Cache of prepared block packs for registry specs (immutable by version). */\n private readonly preparedCache = new LRUCache<PreparedCacheKey, BlockPackSpecPrepared>({\n max: 50,\n });\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case \"explicit\":\n return spec.config;\n\n case \"prepared\":\n return spec.config;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: \"utf-8\" });\n return JSON.parse(configContent);\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n });\n return parseStringConfig(configContent);\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n return JSON.parse(Buffer.from(configResponse).toString(\"utf8\"));\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const configResponse = await this.remoteContentCache.forceFetch(components.model.url);\n return parseBufferConfig(configResponse);\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n /** Returns a stable cache key for registry specs (immutable by version). Dev specs return undefined. */\n private specKey(spec: BlockPackSpecAny): PreparedCacheKey | undefined {\n switch (spec.type) {\n case \"from-registry-v1\":\n return `v1:${spec.registryUrl}:${spec.id.organization}:${spec.id.name}:${spec.id.version}` as PreparedCacheKey;\n case \"from-registry-v2\":\n return `v2:${spec.registryUrl}:${canonicalize(spec.id)}` as PreparedCacheKey;\n default:\n return undefined; // dev, explicit, prepared — not cacheable\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n if (spec.type === \"prepared\") {\n return spec;\n }\n\n // Check prepare cache for registry specs\n const key = this.specKey(spec);\n if (key) {\n const cached = this.preparedCache.get(key);\n if (cached) return cached;\n }\n\n const explicit = await this.prepareWithoutUnpacking(spec);\n\n await using workerManager = new WorkerManager();\n\n const result: BlockPackSpecPrepared = {\n ...explicit,\n type: \"prepared\",\n template: {\n type: \"prepared\",\n data: await workerManager.process(\"parseTemplate\", explicit.template.content),\n },\n };\n\n if (key) {\n this.preparedCache.set(key, result);\n }\n\n return result;\n }\n\n private async prepareWithoutUnpacking(\n spec: BlockPackExplicit | BlockPackSpec,\n ): Promise<BlockPackExplicit> {\n switch (spec.type) {\n case \"explicit\":\n return spec;\n\n case \"dev-v1\": {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(await fs.promises.readFile(devPaths.config, \"utf-8\"));\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source: spec,\n };\n }\n\n case \"dev-v2\": {\n const description = await loadPackDescription(spec.folder);\n const config = parseStringConfig(\n await fs.promises.readFile(description.components.model.file, {\n encoding: \"utf-8\",\n }),\n );\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file,\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: workflowContent,\n },\n config,\n frontend: {\n type: \"local\",\n path: frontendPath,\n signature: this.signer.sign(frontendPath),\n },\n source,\n };\n }\n\n case \"from-registry-v1\": {\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await this.remoteContentCache.forceFetch(templateUrl);\n const templateContent = new Uint8Array(templateResponse);\n\n // config\n const configResponse = await this.remoteContentCache.forceFetch(`${urlPrefix}/config.json`);\n const config = JSON.parse(\n Buffer.from(configResponse).toString(\"utf8\"),\n ) as BlockConfigContainer;\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: templateContent,\n },\n config,\n frontend: {\n type: \"url\",\n url: `${urlPrefix}/frontend.tgz`,\n },\n source: spec,\n };\n }\n\n case \"from-registry-v2\": {\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n parseBufferConfig(await this.remoteContentCache.forceFetch(components.model.url));\n const getWorkflow = async () =>\n await this.remoteContentCache.forceFetch(components.workflow.main.url);\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: \"explicit\",\n template: {\n type: \"explicit\",\n content: Buffer.from(workflow),\n },\n config: model,\n frontend: {\n type: \"url\",\n url: components.ui.url,\n },\n source: spec,\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), \"Input\", loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), \"Input\", createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case \"prepared\":\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
- const require_block_pack_spec = require('../../model/block_pack_spec.cjs');
1
+ require("../../_virtual/_rolldown/runtime.cjs");
2
+ const require_block_pack_spec = require("../../model/block_pack_spec.cjs");
3
3
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
4
-
5
4
  //#region src/mutator/block-pack/frontend.ts
6
5
  function createFrontend(tx, spec) {
7
6
  switch (spec.type) {
@@ -13,7 +12,7 @@ function createFrontend(tx, spec) {
13
12
  default: return (0, _milaboratories_ts_helpers.assertNever)(spec);
14
13
  }
15
14
  }
16
-
17
15
  //#endregion
18
16
  exports.createFrontend = createFrontend;
17
+
19
18
  //# sourceMappingURL=frontend.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontend.cjs","names":["FrontendFromUrlResourceType","FrontendFromFolderResourceType"],"sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData, FrontendSpec } from \"../../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../../model\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case \"url\":\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case \"local\":\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"mappings":";;;;;AAKA,SAAgB,eAAe,IAAmB,MAAoC;AACpF,SAAQ,KAAK,MAAb;EACE,KAAK,MACH,QAAO,GAAG,YACRA,qDACA,KAAK,UAAU,EAAE,KAAK,KAAK,KAAK,CAAwB,CACzD;EACH,KAAK,QACH,QAAO,GAAG,YACRC,wDACA,KAAK,UAAU;GACb,MAAM,KAAK;GACX,WAAW,KAAK;GACjB,CAA2B,CAC7B;EACH,QACE,oDAAmB,KAAK"}
1
+ {"version":3,"file":"frontend.cjs","names":["FrontendFromUrlResourceType","FrontendFromFolderResourceType"],"sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData, FrontendSpec } from \"../../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../../model\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case \"url\":\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case \"local\":\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"mappings":";;;;AAKA,SAAgB,eAAe,IAAmB,MAAoC;AACpF,SAAQ,KAAK,MAAb;EACE,KAAK,MACH,QAAO,GAAG,YACRA,wBAAAA,6BACA,KAAK,UAAU,EAAE,KAAK,KAAK,KAAK,CAAwB,CACzD;EACH,KAAK,QACH,QAAO,GAAG,YACRC,wBAAAA,gCACA,KAAK,UAAU;GACb,MAAM,KAAK;GACX,WAAW,KAAK;GACjB,CAA2B,CAC7B;EACH,QACE,SAAA,GAAA,2BAAA,aAAmB,KAAK"}
@@ -1,6 +1,5 @@
1
1
  import { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from "../../model/block_pack_spec.js";
2
2
  import { assertNever } from "@milaboratories/ts-helpers";
3
-
4
3
  //#region src/mutator/block-pack/frontend.ts
5
4
  function createFrontend(tx, spec) {
6
5
  switch (spec.type) {
@@ -12,7 +11,7 @@ function createFrontend(tx, spec) {
12
11
  default: return assertNever(spec);
13
12
  }
14
13
  }
15
-
16
14
  //#endregion
17
15
  export { createFrontend };
16
+
18
17
  //# sourceMappingURL=frontend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontend.js","names":[],"sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData, FrontendSpec } from \"../../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../../model\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case \"url\":\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case \"local\":\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"mappings":";;;;AAKA,SAAgB,eAAe,IAAmB,MAAoC;AACpF,SAAQ,KAAK,MAAb;EACE,KAAK,MACH,QAAO,GAAG,YACR,6BACA,KAAK,UAAU,EAAE,KAAK,KAAK,KAAK,CAAwB,CACzD;EACH,KAAK,QACH,QAAO,GAAG,YACR,gCACA,KAAK,UAAU;GACb,MAAM,KAAK;GACX,WAAW,KAAK;GACjB,CAA2B,CAC7B;EACH,QACE,QAAO,YAAY,KAAK"}
1
+ {"version":3,"file":"frontend.js","names":[],"sources":["../../../src/mutator/block-pack/frontend.ts"],"sourcesContent":["import type { AnyResourceRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData, FrontendSpec } from \"../../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../../model\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case \"url\":\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData),\n );\n case \"local\":\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature,\n } as FrontendFromFolderData),\n );\n default:\n return assertNever(spec);\n }\n}\n"],"mappings":";;;AAKA,SAAgB,eAAe,IAAmB,MAAoC;AACpF,SAAQ,KAAK,MAAb;EACE,KAAK,MACH,QAAO,GAAG,YACR,6BACA,KAAK,UAAU,EAAE,KAAK,KAAK,KAAK,CAAwB,CACzD;EACH,KAAK,QACH,QAAO,GAAG,YACR,gCACA,KAAK,UAAU;GACb,MAAM,KAAK;GACX,WAAW,KAAK;GACjB,CAA2B,CAC7B;EACH,QACE,QAAO,YAAY,KAAK"}
@@ -1,9 +1,8 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_render_template = require('./template/render_template.cjs');
3
- const require_template_loading = require('./template/template_loading.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_render_template = require("./template/render_template.cjs");
3
+ const require_template_loading = require("./template/template_loading.cjs");
4
4
  let node_crypto = require("node:crypto");
5
5
  let _platforma_sdk_workflow_tengo = require("@platforma-sdk/workflow-tengo");
6
-
7
6
  //#region src/mutator/context_export.ts
8
7
  let preparedTemplateEnvelop;
9
8
  async function getPreparedExportTemplateEnvelope() {
@@ -20,8 +19,8 @@ async function getPreparedExportTemplateEnvelope() {
20
19
  function exportContext(tx, exportTpl, ctx) {
21
20
  return require_render_template.createRenderTemplate(tx, exportTpl, true, { pf: ctx }, ["result"]).result;
22
21
  }
23
-
24
22
  //#endregion
25
23
  exports.exportContext = exportContext;
26
24
  exports.getPreparedExportTemplateEnvelope = getPreparedExportTemplateEnvelope;
25
+
27
26
  //# sourceMappingURL=context_export.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"context_export.cjs","names":["prepareTemplateSpec","SdkTemplates","createRenderTemplate"],"sources":["../../src/mutator/context_export.ts"],"sourcesContent":["import type { AnyRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport { createRenderTemplate } from \"./template/render_template\";\nimport { prepareTemplateSpec } from \"./template/template_loading\";\nimport type { TemplateSpecPrepared } from \"../model/template_spec\";\nimport { createHash } from \"node:crypto\";\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from \"@platforma-sdk/workflow-tengo\";\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(\n SdkTemplates[\"pframes.export-pframe-for-ui\"],\n );\n if (preparedTemplate.type !== \"explicit\") throw new Error(\"Unexpected prepared template type.\");\n const hash = createHash(\"sha256\").update(preparedTemplate.content).digest(\"hex\");\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, [\"result\"]).result;\n}\n"],"mappings":";;;;;;;AAgBA,IAAI;AAEJ,eAAsB,oCAA8D;AAClF,KAAI,4BAA4B,QAAW;EAEzC,MAAM,mBAAmB,MAAMA,6CAC7BC,wCAAa,gCACd;AACD,MAAI,iBAAiB,SAAS,WAAY,OAAM,IAAI,MAAM,qCAAqC;AAE/F,4BAA0B;GAAE,MAAM;GAAkB,kCAD5B,SAAS,CAAC,OAAO,iBAAiB,QAAQ,CAAC,OAAO,MAAM;GACtB;;AAG5D,QAAO;;AAGT,SAAgB,cAAc,IAAmB,WAAmB,KAAa;AAC/E,QAAOC,6CAAqB,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"context_export.cjs","names":["prepareTemplateSpec","SdkTemplates","createRenderTemplate"],"sources":["../../src/mutator/context_export.ts"],"sourcesContent":["import type { AnyRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport { createRenderTemplate } from \"./template/render_template\";\nimport { prepareTemplateSpec } from \"./template/template_loading\";\nimport type { TemplateSpecPrepared } from \"../model/template_spec\";\nimport { createHash } from \"node:crypto\";\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from \"@platforma-sdk/workflow-tengo\";\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(\n SdkTemplates[\"pframes.export-pframe-for-ui\"],\n );\n if (preparedTemplate.type !== \"explicit\") throw new Error(\"Unexpected prepared template type.\");\n const hash = createHash(\"sha256\").update(preparedTemplate.content).digest(\"hex\");\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, [\"result\"]).result;\n}\n"],"mappings":";;;;;;AAgBA,IAAI;AAEJ,eAAsB,oCAA8D;AAClF,KAAI,4BAA4B,KAAA,GAAW;EAEzC,MAAM,mBAAmB,MAAMA,yBAAAA,oBAC7BC,8BAAAA,UAAa,gCACd;AACD,MAAI,iBAAiB,SAAS,WAAY,OAAM,IAAI,MAAM,qCAAqC;AAE/F,4BAA0B;GAAE,MAAM;GAAkB,OAAA,GAAA,YAAA,YAD5B,SAAS,CAAC,OAAO,iBAAiB,QAAQ,CAAC,OAAO,MAAM;GACtB;;AAG5D,QAAO;;AAGT,SAAgB,cAAc,IAAmB,WAAmB,KAAa;AAC/E,QAAOC,wBAAAA,qBAAqB,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC"}
@@ -2,7 +2,6 @@ import { createRenderTemplate } from "./template/render_template.js";
2
2
  import { prepareTemplateSpec } from "./template/template_loading.js";
3
3
  import { createHash } from "node:crypto";
4
4
  import { Templates } from "@platforma-sdk/workflow-tengo";
5
-
6
5
  //#region src/mutator/context_export.ts
7
6
  let preparedTemplateEnvelop;
8
7
  async function getPreparedExportTemplateEnvelope() {
@@ -19,7 +18,7 @@ async function getPreparedExportTemplateEnvelope() {
19
18
  function exportContext(tx, exportTpl, ctx) {
20
19
  return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, ["result"]).result;
21
20
  }
22
-
23
21
  //#endregion
24
22
  export { exportContext, getPreparedExportTemplateEnvelope };
23
+
25
24
  //# sourceMappingURL=context_export.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context_export.js","names":["SdkTemplates"],"sources":["../../src/mutator/context_export.ts"],"sourcesContent":["import type { AnyRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport { createRenderTemplate } from \"./template/render_template\";\nimport { prepareTemplateSpec } from \"./template/template_loading\";\nimport type { TemplateSpecPrepared } from \"../model/template_spec\";\nimport { createHash } from \"node:crypto\";\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from \"@platforma-sdk/workflow-tengo\";\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(\n SdkTemplates[\"pframes.export-pframe-for-ui\"],\n );\n if (preparedTemplate.type !== \"explicit\") throw new Error(\"Unexpected prepared template type.\");\n const hash = createHash(\"sha256\").update(preparedTemplate.content).digest(\"hex\");\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, [\"result\"]).result;\n}\n"],"mappings":";;;;;;AAgBA,IAAI;AAEJ,eAAsB,oCAA8D;AAClF,KAAI,4BAA4B,QAAW;EAEzC,MAAM,mBAAmB,MAAM,oBAC7BA,UAAa,gCACd;AACD,MAAI,iBAAiB,SAAS,WAAY,OAAM,IAAI,MAAM,qCAAqC;AAE/F,4BAA0B;GAAE,MAAM;GAAkB,MADvC,WAAW,SAAS,CAAC,OAAO,iBAAiB,QAAQ,CAAC,OAAO,MAAM;GACtB;;AAG5D,QAAO;;AAGT,SAAgB,cAAc,IAAmB,WAAmB,KAAa;AAC/E,QAAO,qBAAqB,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"context_export.js","names":["SdkTemplates"],"sources":["../../src/mutator/context_export.ts"],"sourcesContent":["import type { AnyRef, PlTransaction } from \"@milaboratories/pl-client\";\nimport { createRenderTemplate } from \"./template/render_template\";\nimport { prepareTemplateSpec } from \"./template/template_loading\";\nimport type { TemplateSpecPrepared } from \"../model/template_spec\";\nimport { createHash } from \"node:crypto\";\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from \"@platforma-sdk/workflow-tengo\";\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(\n SdkTemplates[\"pframes.export-pframe-for-ui\"],\n );\n if (preparedTemplate.type !== \"explicit\") throw new Error(\"Unexpected prepared template type.\");\n const hash = createHash(\"sha256\").update(preparedTemplate.content).digest(\"hex\");\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, [\"result\"]).result;\n}\n"],"mappings":";;;;;AAgBA,IAAI;AAEJ,eAAsB,oCAA8D;AAClF,KAAI,4BAA4B,KAAA,GAAW;EAEzC,MAAM,mBAAmB,MAAM,oBAC7BA,UAAa,gCACd;AACD,MAAI,iBAAiB,SAAS,WAAY,OAAM,IAAI,MAAM,qCAAqC;AAE/F,4BAA0B;GAAE,MAAM;GAAkB,MADvC,WAAW,SAAS,CAAC,OAAO,iBAAiB,QAAQ,CAAC,OAAO,MAAM;GACtB;;AAG5D,QAAO;;AAGT,SAAgB,cAAc,IAAmB,WAAmB,KAAa;AAC/E,QAAO,qBAAqB,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC"}