@milaboratories/pl-middle-layer 1.55.1 → 1.55.3

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 +19 -19
@@ -1,5 +1,4 @@
1
-
2
- //#region \0@oxc-project+runtime@0.114.0/helpers/usingCtx.js
1
+ //#region \0@oxc-project+runtime@0.123.0/helpers/usingCtx.js
3
2
  function _usingCtx() {
4
3
  var r = "function" == typeof SuppressedError ? SuppressedError : function(r, e) {
5
4
  var n = Error();
@@ -54,6 +53,5 @@ function _usingCtx() {
54
53
  }
55
54
  };
56
55
  }
57
-
58
56
  //#endregion
59
- exports._usingCtx = _usingCtx;
57
+ exports._usingCtx = _usingCtx;
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.114.0/helpers/usingCtx.js
1
+ //#region \0@oxc-project+runtime@0.123.0/helpers/usingCtx.js
2
2
  function _usingCtx() {
3
3
  var r = "function" == typeof SuppressedError ? SuppressedError : function(r, e) {
4
4
  var n = Error();
@@ -53,6 +53,5 @@ function _usingCtx() {
53
53
  }
54
54
  };
55
55
  }
56
-
57
56
  //#endregion
58
- export { _usingCtx };
57
+ export { _usingCtx };
@@ -6,16 +6,12 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
8
  var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
- key = keys[i];
12
- if (!__hasOwnProp.call(to, key) && key !== except) {
13
- __defProp(to, key, {
14
- get: ((k) => from[k]).bind(null, key),
15
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
- });
17
- }
18
- }
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
19
15
  }
20
16
  return to;
21
17
  };
@@ -23,7 +19,5 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
19
  value: mod,
24
20
  enumerable: true
25
21
  }) : target, mod));
26
-
27
22
  //#endregion
28
-
29
- exports.__toESM = __toESM;
23
+ exports.__toESM = __toESM;
@@ -1,3 +1,3 @@
1
- const require_registry = require('./registry.cjs');
2
- const require_registry_v2_provider = require('./registry-v2-provider.cjs');
3
- const require_well_known_registries = require('./well_known_registries.cjs');
1
+ require("./registry.cjs");
2
+ require("./registry-v2-provider.cjs");
3
+ require("./well_known_registries.cjs");
@@ -1,3 +1,3 @@
1
- import { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime } from "./registry.js";
2
- import { V2RegistryProvider } from "./registry-v2-provider.js";
3
- import { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry } from "./well_known_registries.js";
1
+ import "./registry.js";
2
+ import "./registry-v2-provider.js";
3
+ import "./well_known_registries.js";
@@ -1,6 +1,5 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
2
  let _platforma_sdk_block_tools = require("@platforma-sdk/block-tools");
3
-
4
3
  //#region src/block_registry/registry-v2-provider.ts
5
4
  var V2RegistryProvider = class {
6
5
  registries = /* @__PURE__ */ new Map();
@@ -15,7 +14,7 @@ var V2RegistryProvider = class {
15
14
  return newRegistry;
16
15
  }
17
16
  };
18
-
19
17
  //#endregion
20
18
  exports.V2RegistryProvider = V2RegistryProvider;
19
+
21
20
  //# sourceMappingURL=registry-v2-provider.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-v2-provider.cjs","names":["RegistryV2Reader"],"sources":["../../src/block_registry/registry-v2-provider.ts"],"sourcesContent":["import { folderReaderByUrl, RegistryV2Reader } from \"@platforma-sdk/block-tools\";\nimport type { Dispatcher } from \"undici\";\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n"],"mappings":";;;;AAGA,IAAa,qBAAb,MAAgC;CAC9B,AAAiB,6BAAa,IAAI,KAA+B;CAEjE,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,AAAO,YAAY,KAA+B;EAChD,MAAM,YAAY,KAAK,WAAW,IAAI,IAAI;AAC1C,MAAI,UAAW,QAAO;EACtB,MAAM,cAAc,IAAIA,8FAAmC,KAAK,KAAK,KAAK,CAAC;AAC3E,OAAK,WAAW,IAAI,KAAK,YAAY;AACrC,SAAO"}
1
+ {"version":3,"file":"registry-v2-provider.cjs","names":["RegistryV2Reader"],"sources":["../../src/block_registry/registry-v2-provider.ts"],"sourcesContent":["import { folderReaderByUrl, RegistryV2Reader } from \"@platforma-sdk/block-tools\";\nimport type { Dispatcher } from \"undici\";\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n"],"mappings":";;;AAGA,IAAa,qBAAb,MAAgC;CAC9B,6BAA8B,IAAI,KAA+B;CAEjE,YAAY,MAAmC;AAAlB,OAAA,OAAA;;CAE7B,YAAmB,KAA+B;EAChD,MAAM,YAAY,KAAK,WAAW,IAAI,IAAI;AAC1C,MAAI,UAAW,QAAO;EACtB,MAAM,cAAc,IAAIA,2BAAAA,kBAAAA,GAAAA,2BAAAA,mBAAmC,KAAK,KAAK,KAAK,CAAC;AAC3E,OAAK,WAAW,IAAI,KAAK,YAAY;AACrC,SAAO"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-v2-provider.d.ts","names":[],"sources":["../../src/block_registry/registry-v2-provider.ts"],"mappings":";;;;cAGa,kBAAA;EAAA,iBAGkB,IAAA;EAAA,iBAFZ,UAAA;cAEY,IAAA,EAAM,UAAA;EAE5B,WAAA,CAAY,GAAA,WAAc,gBAAA;AAAA"}
@@ -1,5 +1,4 @@
1
1
  import { RegistryV2Reader, folderReaderByUrl } from "@platforma-sdk/block-tools";
2
-
3
2
  //#region src/block_registry/registry-v2-provider.ts
4
3
  var V2RegistryProvider = class {
5
4
  registries = /* @__PURE__ */ new Map();
@@ -14,7 +13,7 @@ var V2RegistryProvider = class {
14
13
  return newRegistry;
15
14
  }
16
15
  };
17
-
18
16
  //#endregion
19
17
  export { V2RegistryProvider };
18
+
20
19
  //# sourceMappingURL=registry-v2-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-v2-provider.js","names":[],"sources":["../../src/block_registry/registry-v2-provider.ts"],"sourcesContent":["import { folderReaderByUrl, RegistryV2Reader } from \"@platforma-sdk/block-tools\";\nimport type { Dispatcher } from \"undici\";\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n"],"mappings":";;;AAGA,IAAa,qBAAb,MAAgC;CAC9B,AAAiB,6BAAa,IAAI,KAA+B;CAEjE,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,AAAO,YAAY,KAA+B;EAChD,MAAM,YAAY,KAAK,WAAW,IAAI,IAAI;AAC1C,MAAI,UAAW,QAAO;EACtB,MAAM,cAAc,IAAI,iBAAiB,kBAAkB,KAAK,KAAK,KAAK,CAAC;AAC3E,OAAK,WAAW,IAAI,KAAK,YAAY;AACrC,SAAO"}
1
+ {"version":3,"file":"registry-v2-provider.js","names":[],"sources":["../../src/block_registry/registry-v2-provider.ts"],"sourcesContent":["import { folderReaderByUrl, RegistryV2Reader } from \"@platforma-sdk/block-tools\";\nimport type { Dispatcher } from \"undici\";\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n"],"mappings":";;AAGA,IAAa,qBAAb,MAAgC;CAC9B,6BAA8B,IAAI,KAA+B;CAEjE,YAAY,MAAmC;AAAlB,OAAA,OAAA;;CAE7B,YAAmB,KAA+B;EAChD,MAAM,YAAY,KAAK,WAAW,IAAI,IAAI;AAC1C,MAAI,UAAW,QAAO;EACtB,MAAM,cAAc,IAAI,iBAAiB,kBAAkB,KAAK,KAAK,KAAK,CAAC;AAC3E,OAAK,WAAW,IAAI,KAAK,YAAY;AACrC,SAAO"}
@@ -1,5 +1,5 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_index = require('../dev_env/index.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_index = require("../dev_env/index.cjs");
3
3
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
4
4
  let undici = require("undici");
5
5
  let _platforma_sdk_block_tools = require("@platforma-sdk/block-tools");
@@ -10,7 +10,6 @@ node_path = require_runtime.__toESM(node_path);
10
10
  let yaml = require("yaml");
11
11
  yaml = require_runtime.__toESM(yaml);
12
12
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
13
-
14
13
  //#region src/block_registry/registry.ts
15
14
  async function getFileContent(path) {
16
15
  try {
@@ -193,9 +192,9 @@ var BlockPackRegistry = class {
193
192
  return await this.v2Provider.getRegistry(regSpec.url).getSpecificOverview(blockId, channel);
194
193
  }
195
194
  };
196
-
197
195
  //#endregion
198
196
  exports.BlockPackRegistry = BlockPackRegistry;
199
197
  exports.getDevV1PacketMtime = getDevV1PacketMtime;
200
198
  exports.getDevV2PacketMtime = getDevV2PacketMtime;
199
+
201
200
  //# sourceMappingURL=registry.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.cjs","names":["fs","LegacyDevBlockPackFiles","path","RegistryV1","AnyChannel","StableChannel","YAML","BlockPackMetaEmbedAbsoluteBytes"],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.cjs","names":["fs","LegacyDevBlockPackFiles","path","RegistryV1","AnyChannel","StableChannel","YAML","BlockPackMetaEmbedAbsoluteBytes"],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;iBA2CsB,mBAAA,CAAoB,OAAA,WAAkB,OAAA;AAAA,iBAWtC,mBAAA,CACpB,WAAA,EAAa,4BAAA,GACZ,OAAA;AAAA,cAQU,iBAAA;EAAA,iBAEQ,UAAA;EAAA,iBACA,UAAA;EAAA,iBACA,IAAA;cAFA,UAAA,EAAY,kBAAA,EACZ,UAAA,EAAY,aAAA,IACZ,IAAA,GAAO,UAAA;EAAA,QAGZ,kBAAA;EAoKD,cAAA,CAAA,GAAkB,OAAA,CAAQ,gBAAA;EAU1B,WAAA,CACX,UAAA,UACA,OAAA,EAAS,WAAA,EACT,OAAA,WACC,OAAA,CAAQ,uBAAA;AAAA"}
@@ -6,7 +6,6 @@ import fs from "node:fs";
6
6
  import path from "node:path";
7
7
  import YAML from "yaml";
8
8
  import { assertNever } from "@milaboratories/ts-helpers";
9
-
10
9
  //#region src/block_registry/registry.ts
11
10
  async function getFileContent(path) {
12
11
  try {
@@ -189,7 +188,7 @@ var BlockPackRegistry = class {
189
188
  return await this.v2Provider.getRegistry(regSpec.url).getSpecificOverview(blockId, channel);
190
189
  }
191
190
  };
192
-
193
191
  //#endregion
194
192
  export { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime };
193
+
195
194
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_registry = require('./registry.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_registry = require("./registry.cjs");
3
3
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
4
4
  let _platforma_sdk_block_tools = require("@platforma-sdk/block-tools");
5
5
  let _milaboratories_computable = require("@milaboratories/computable");
@@ -7,7 +7,6 @@ let canonicalize = require("canonicalize");
7
7
  canonicalize = require_runtime.__toESM(canonicalize);
8
8
  let semver = require("semver");
9
9
  semver = require_runtime.__toESM(semver);
10
-
11
10
  //#region src/block_registry/watcher.ts
12
11
  const DefaultBlockUpdateWatcherOps = { minDelay: 1500 };
13
12
  const NoUpdatesKey = "__no_updates__";
@@ -139,7 +138,7 @@ var BlockUpdateWatcher = class extends _milaboratories_computable.PollComputable
139
138
  return (0, canonicalize.default)(res1) === (0, canonicalize.default)(res2);
140
139
  }
141
140
  };
142
-
143
141
  //#endregion
144
142
  exports.BlockUpdateWatcher = BlockUpdateWatcher;
143
+
145
144
  //# sourceMappingURL=watcher.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.cjs","names":["PollComputablePool","getDevV1PacketMtime","getDevV2PacketMtime","StableChannel","AnyChannel"],"sources":["../../src/block_registry/watcher.ts"],"sourcesContent":["import type { PollPoolOps } from \"@milaboratories/computable\";\nimport { PollComputablePool } from \"@milaboratories/computable\";\nimport type {\n BlockPackFromRegistryV2,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport {\n AnyChannel,\n blockPackIdToString,\n StableChannel,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport type { Dispatcher } from \"undici\";\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from \"./registry\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport * as semver from \"semver\";\nimport canonicalize from \"canonicalize\";\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500,\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = \"__no_updates__\";\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {},\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case \"dev-v1\":\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"dev-v2\":\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"from-registry-v2\":\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case \"dev-v1\": {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"dev-v2\": {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"from-registry-v2\": {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === \"patch\") return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`,\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case \"major\":\n vMainSuggestion = vSuggestions.find((v) => v.type !== \"major\")?.update;\n break;\n case \"minor\":\n vMainSuggestion = vSuggestions.find((v) => v.type === \"patch\")?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } },\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion },\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"watcher.cjs","names":["PollComputablePool","getDevV1PacketMtime","getDevV2PacketMtime","StableChannel","AnyChannel"],"sources":["../../src/block_registry/watcher.ts"],"sourcesContent":["import type { PollPoolOps } from \"@milaboratories/computable\";\nimport { PollComputablePool } from \"@milaboratories/computable\";\nimport type {\n BlockPackFromRegistryV2,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport {\n AnyChannel,\n blockPackIdToString,\n StableChannel,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport type { Dispatcher } from \"undici\";\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from \"./registry\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport * as semver from \"semver\";\nimport canonicalize from \"canonicalize\";\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500,\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = \"__no_updates__\";\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {},\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case \"dev-v1\":\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"dev-v2\":\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"from-registry-v2\":\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case \"dev-v1\": {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"dev-v2\": {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"from-registry-v2\": {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === \"patch\") return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`,\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case \"major\":\n vMainSuggestion = vSuggestions.find((v) => v.type !== \"major\")?.update;\n break;\n case \"minor\":\n vMainSuggestion = vSuggestions.find((v) => v.type === \"patch\")?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } },\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion },\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n"],"mappings":";;;;;;;;;;AAqBA,MAAa,+BAA4C,EACvD,UAAU,MACX;AAOD,MAAM,eAAe;AAYrB,IAAa,qBAAb,cAAwCA,2BAAAA,mBAGtC;CACA;CACA;CAEA,YACE,kBACA,QACA,MAA6B,EAAE,EAC/B;AACA,QAAM;GAAE,GAAG;GAAK,GAAG;GAA8B,EAAE,OAAO;AAJzC,OAAA,mBAAA;AAKjB,OAAK,OAAO,IAAI;AAChB,OAAK,yBAAyB,IAAI;;CAGpC,OAAiB,KAAoC;AACnD,UAAQ,IAAI,YAAY,MAAxB;GACE,KAAK,SACH,QAAO,SAAS,IAAI,YAAY,OAAO,GAAG,IAAI,YAAY;GAC5D,KAAK,SACH,QAAO,SAAS,IAAI,YAAY,OAAO,GAAG,IAAI,YAAY;GAC5D,KAAK,mBACH,QAAO,qBAAA,GAAA,aAAA,SAAiC,IAAI;GAC9C,QACE,QAAO;;;CAIb,MAAgB,UAAU,KAA6D;AACrF,MAAI;GACF,MAAM,QAAQ,IAAI;AAClB,WAAQ,MAAM,MAAd;IACE,KAAK,SACH,KAAI;KACF,MAAM,QAAQ,MAAMC,iBAAAA,oBAAoB,MAAM,OAAO;AACrD,SAAI,UAAU,MAAM,MAAO,QAAO,EAAE,aAAa,EAAE,EAAE;SAChD,QAAO;MAAE,gBAAgB;OAAE,GAAG;OAAO;OAAO;MAAE,aAAa,EAAE;MAAE;aAC7D,KAAc;AACrB,UAAK,OAAO,KAAK,IAAI;AACrB,YAAO,EAAE,aAAa,EAAE,EAAE;;IAI9B,KAAK,SACH,KAAI;KACF,MAAM,cAAc,OAAA,GAAA,2BAAA,wBAA6B,MAAM,QAAQ,KAAK,OAAO;AAC3E,SAAI,gBAAgB,KAAA,EAAW,QAAO,EAAE,aAAa,EAAE,EAAE;KACzD,MAAM,QAAQ,MAAMC,iBAAAA,oBAAoB,YAAY;AACpD,SAAI,UAAU,MAAM,MAAO,QAAO,EAAE,aAAa,EAAE,EAAE;SAChD,QAAO;MAAE,gBAAgB;OAAE,GAAG;OAAc;OAAO;MAAE,aAAa,EAAE;MAAE;aACpE,KAAc;AACrB,UAAK,OAAO,KAAK,IAAI;AACrB,YAAO,EAAE,aAAa,EAAE,EAAE;;IAI9B,KAAK,mBACH,KAAI;KACF,MAAM,EAAE,aAAa,gBAAgB,IAAI;AACzC,SAAI,gBAAgB,QAAS,QAAO,EAAE,aAAa,EAAE,EAAE;KACvD,MAAM,WAAW,KAAK,iBAAiB,YAAY,MAAM,YAAY;KACrE,IAAI,UAA8B,KAAK;AAEvC,SAAI,YAAY,KAAA,EACd,KAAI,MAAM,YAAY,KAAA,EAEpB,KADW,MAAM,SAAS,kBAAkB,MAAM,IAAIC,sCAAAA,cAAc,CAC5D,WAAUA,sCAAAA;UACb;AAGH,UADW,MAAM,SAAS,kBAAkB,MAAM,IAAIC,sCAAAA,WAAW,KACtD,KAAA,GAAW;AACpB,YAAK,OAAO,MACV,gCAAA,GAAA,sCAAA,qBAAmD,MAAM,GAAG,GAC7D;AACD,cAAO,EAAE,aAAa,EAAE,EAAE;;AAE5B,gBAAUA,sCAAAA;;SAEP,WAAU,MAAM;KAGzB,MAAM,eAAe,MAAM,SAAS,qBAAqB,MAAM,IAAI,QAAQ;AAC3E,SAAI,iBAAiB,KAAA,KAAa,aAAa,WAAW,EAAG,QAAO,EAAE,aAAa,EAAE,EAAE;AAGvF,kBAAa,SAAS;KAEtB,IAAI,kBAAsC,KAAA;AAC1C,aAAQ,aAAR;MACE,KAAK,KAAA;AACH,yBAAkB,aAAa,GAAG;AAClC;MACF,KAAK;AACH,yBAAkB,aAAa,MAAM,MAAM,EAAE,SAAS,QAAQ,EAAE;AAChE;MACF,KAAK;AACH,yBAAkB,aAAa,MAAM,MAAM,EAAE,SAAS,QAAQ,EAAE;AAChE;;KAGJ,MAAM,cAAiC,aAAa,KAAK,EAAE,MAAM,cAAc;MAC7E;MACA,QAAQ;OAAE,GAAG;OAAO,IAAI;QAAE,GAAG,MAAM;QAAI,SAAS;QAAQ;OAAE;MAC3D,EAAE;AAEH,SAAI,oBAAoB,KAAA,EAAW,QAAO,EAAE,aAAa;AACzD,SAAI,gBAAgB,KAAA,KAAa,OAAO,IAAI,iBAAiB,YAAY,CACvE,QAAO,EAAE,aAAa;KAExB,MAAM,iBAA0C;MAC9C,GAAG;MACH,IAAI;OAAE,GAAG,MAAM;OAAI,SAAS;OAAiB;MAC9C;AAGD,MAAM,YAAY;AAChB,UAAI;AACF,aAAM,SAAS,cAAc,eAAe,GAAG;eACxC,GAAY;AACnB,YAAK,OAAO,KAAK,EAAE;;SAEnB;AAEJ,YAAO;MAAE;MAAa;MAAgB;aAC/B,KAAc;AACrB,UAAK,OAAO,KAAK,IAAI;AACrB,YAAO,EAAE,aAAa,EAAE,EAAE;;IAI9B,QACE,QAAO,EAAE,aAAa,EAAE,EAAE;;WAEvB,GAAY;AACnB,QAAK,OAAO,KAAK,EAAE;AACnB,UAAO,EAAE,aAAa,EAAE,EAAE;;;CAI9B,aAAuB,MAA8B,MAAuC;AAC1F,UAAA,GAAA,aAAA,SAAoB,KAAK,MAAA,GAAA,aAAA,SAAkB,KAAK"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/block_registry/watcher.ts"],"mappings":";;;;;;;KAyBY,qBAAA,GAAwB,OAAA,CAAQ,WAAA;EAAA,SACjC,IAAA,GAAO,UAAA;EAAA,SACP,sBAAA;AAAA;AAAA,KAKC,qBAAA;EACV,WAAA,EAAa,aAAA;EACb,QAAA,EAAU,aAAA;AAAA;AAAA,KAGA,sBAAA;EACV,WAAA,EAAa,iBAAA;EACb,cAAA,GAAiB,aAAA;AAAA;AAAA,cAGN,kBAAA,SAA2B,kBAAA,CACtC,qBAAA,EACA,sBAAA;EAAA,iBAMmB,gBAAA;EAAA,iBAJF,IAAA;EAAA,iBACA,sBAAA;cAGE,gBAAA,EAAkB,kBAAA,EACnC,MAAA,EAAQ,QAAA,EACR,GAAA,GAAK,qBAAA;EAAA,UAOG,MAAA,CAAO,GAAA,EAAK,qBAAA;EAAA,UAaN,SAAA,CAAU,GAAA,EAAK,qBAAA,GAAwB,OAAA,CAAQ,sBAAA;EAAA,UA+GrD,YAAA,CAAa,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,sBAAA;AAAA"}
@@ -4,7 +4,6 @@ import { tryLoadPackDescription } from "@platforma-sdk/block-tools";
4
4
  import { PollComputablePool } from "@milaboratories/computable";
5
5
  import canonicalize from "canonicalize";
6
6
  import * as semver from "semver";
7
-
8
7
  //#region src/block_registry/watcher.ts
9
8
  const DefaultBlockUpdateWatcherOps = { minDelay: 1500 };
10
9
  const NoUpdatesKey = "__no_updates__";
@@ -136,7 +135,7 @@ var BlockUpdateWatcher = class extends PollComputablePool {
136
135
  return canonicalize(res1) === canonicalize(res2);
137
136
  }
138
137
  };
139
-
140
138
  //#endregion
141
139
  export { BlockUpdateWatcher };
140
+
142
141
  //# sourceMappingURL=watcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.js","names":[],"sources":["../../src/block_registry/watcher.ts"],"sourcesContent":["import type { PollPoolOps } from \"@milaboratories/computable\";\nimport { PollComputablePool } from \"@milaboratories/computable\";\nimport type {\n BlockPackFromRegistryV2,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport {\n AnyChannel,\n blockPackIdToString,\n StableChannel,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport type { Dispatcher } from \"undici\";\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from \"./registry\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport * as semver from \"semver\";\nimport canonicalize from \"canonicalize\";\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500,\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = \"__no_updates__\";\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {},\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case \"dev-v1\":\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"dev-v2\":\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"from-registry-v2\":\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case \"dev-v1\": {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"dev-v2\": {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"from-registry-v2\": {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === \"patch\") return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`,\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case \"major\":\n vMainSuggestion = vSuggestions.find((v) => v.type !== \"major\")?.update;\n break;\n case \"minor\":\n vMainSuggestion = vSuggestions.find((v) => v.type === \"patch\")?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } },\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion },\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"watcher.js","names":[],"sources":["../../src/block_registry/watcher.ts"],"sourcesContent":["import type { PollPoolOps } from \"@milaboratories/computable\";\nimport { PollComputablePool } from \"@milaboratories/computable\";\nimport type {\n BlockPackFromRegistryV2,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport {\n AnyChannel,\n blockPackIdToString,\n StableChannel,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport type { Dispatcher } from \"undici\";\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from \"./registry\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { MiLogger } from \"@milaboratories/ts-helpers\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport * as semver from \"semver\";\nimport canonicalize from \"canonicalize\";\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500,\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = \"__no_updates__\";\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {},\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case \"dev-v1\":\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"dev-v2\":\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case \"from-registry-v2\":\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case \"dev-v1\": {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"dev-v2\": {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case \"from-registry-v2\": {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === \"patch\") return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`,\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case \"major\":\n vMainSuggestion = vSuggestions.find((v) => v.type !== \"major\")?.update;\n break;\n case \"minor\":\n vMainSuggestion = vSuggestions.find((v) => v.type === \"patch\")?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } },\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion },\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
-
2
1
  //#region src/block_registry/well_known_registries.ts
3
2
  const CentralBlockRegistry = {
4
3
  type: "remote-v2",
@@ -12,9 +11,9 @@ const V1CentralDevSnapshotRegistry = {
12
11
  type: "remote-v1",
13
12
  url: "https://block.registry.platforma.bio/dev"
14
13
  };
15
-
16
14
  //#endregion
17
15
  exports.CentralBlockRegistry = CentralBlockRegistry;
18
16
  exports.V1CentralDevSnapshotRegistry = V1CentralDevSnapshotRegistry;
19
17
  exports.V1CentralRegistry = V1CentralRegistry;
18
+
20
19
  //# sourceMappingURL=well_known_registries.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"well_known_registries.cjs","names":[],"sources":["../../src/block_registry/well_known_registries.ts"],"sourcesContent":["import type { RegistrySpec } from \"@milaboratories/pl-model-middle-layer\";\n\nexport const CentralBlockRegistry: RegistrySpec = {\n type: \"remote-v2\",\n url: \"https://blocks.pl-open.science/\",\n};\n\nexport const V1CentralRegistry: RegistrySpec = {\n type: \"remote-v1\",\n url: \"https://block.registry.platforma.bio/releases\",\n};\n\nexport const V1CentralDevSnapshotRegistry: RegistrySpec = {\n type: \"remote-v1\",\n url: \"https://block.registry.platforma.bio/dev\",\n};\n"],"mappings":";;AAEA,MAAa,uBAAqC;CAChD,MAAM;CACN,KAAK;CACN;AAED,MAAa,oBAAkC;CAC7C,MAAM;CACN,KAAK;CACN;AAED,MAAa,+BAA6C;CACxD,MAAM;CACN,KAAK;CACN"}
1
+ {"version":3,"file":"well_known_registries.cjs","names":[],"sources":["../../src/block_registry/well_known_registries.ts"],"sourcesContent":["import type { RegistrySpec } from \"@milaboratories/pl-model-middle-layer\";\n\nexport const CentralBlockRegistry: RegistrySpec = {\n type: \"remote-v2\",\n url: \"https://blocks.pl-open.science/\",\n};\n\nexport const V1CentralRegistry: RegistrySpec = {\n type: \"remote-v1\",\n url: \"https://block.registry.platforma.bio/releases\",\n};\n\nexport const V1CentralDevSnapshotRegistry: RegistrySpec = {\n type: \"remote-v1\",\n url: \"https://block.registry.platforma.bio/dev\",\n};\n"],"mappings":";AAEA,MAAa,uBAAqC;CAChD,MAAM;CACN,KAAK;CACN;AAED,MAAa,oBAAkC;CAC7C,MAAM;CACN,KAAK;CACN;AAED,MAAa,+BAA6C;CACxD,MAAM;CACN,KAAK;CACN"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"well_known_registries.d.ts","names":[],"sources":["../../src/block_registry/well_known_registries.ts"],"mappings":";;;cAEa,oBAAA,EAAsB,YAAA;AAAA,cAKtB,iBAAA,EAAmB,YAAA;AAAA,cAKnB,4BAAA,EAA8B,YAAA"}
@@ -11,7 +11,7 @@ const V1CentralDevSnapshotRegistry = {
11
11
  type: "remote-v1",
12
12
  url: "https://block.registry.platforma.bio/dev"
13
13
  };
14
-
15
14
  //#endregion
16
15
  export { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry };
16
+
17
17
  //# sourceMappingURL=well_known_registries.js.map
@@ -1,13 +1,12 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_renderer = require('./renderer.cjs');
3
- const require_block_ctx_unsafe = require('../middle_layer/block_ctx_unsafe.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_renderer = require("./renderer.cjs");
3
+ const require_block_ctx_unsafe = require("../middle_layer/block_ctx_unsafe.cjs");
4
4
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
5
5
  let _milaboratories_computable = require("@milaboratories/computable");
6
6
  let canonicalize = require("canonicalize");
7
7
  canonicalize = require_runtime.__toESM(canonicalize);
8
8
  let denque = require("denque");
9
9
  denque = require_runtime.__toESM(denque);
10
-
11
10
  //#region src/cfg_render/executor.ts
12
11
  /** Special address of operation, see below. */
13
12
  const ReturnOpKey = Symbol();
@@ -151,8 +150,8 @@ function computableFromCfgUnsafe(drivers, ctx, cfg, ops = {}) {
151
150
  key
152
151
  });
153
152
  }
154
-
155
153
  //#endregion
156
154
  exports.computableFromCfg = computableFromCfg;
157
155
  exports.computableFromCfgUnsafe = computableFromCfgUnsafe;
156
+
158
157
  //# sourceMappingURL=executor.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"executor.cjs","names":["Denque","toCfgContext","NonKeyCtxFields","Computable","renderCfg","resOp"],"sources":["../../src/cfg_render/executor.ts"],"sourcesContent":["import type {\n ArgumentKey,\n ArgumentValues,\n ExecutionEnvironment,\n Operation,\n Subroutine,\n} from \"./operation\";\nimport Denque from \"denque\";\nimport { assertNever, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { ComputableCtx, ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { Cfg } from \"@platforma-sdk/model\";\nimport { renderCfg, resOp } from \"./renderer\";\nimport canonicalize from \"canonicalize\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport type { MiddleLayerDriverKit } from \"../middle_layer/driver_kit\";\nimport { NonKeyCtxFields, toCfgContext } from \"../middle_layer/block_ctx_unsafe\";\n\n/** Addresses pending subroutines inside the stack */\ntype SubroutineKey = symbol;\n\n/** Represents destination of the result of an operation. I.e. when sequence of\n * subroutine invocations, and computables terminates with result, this object\n * determines to which argument of which pending subroutine it should be delivered.\n * See special value for delivery of the final \"return\" result. */\ntype Destination = {\n op: SubroutineKey;\n arg: ArgumentKey;\n};\n\n/** Special address of operation, see below. */\nconst ReturnOpKey: unique symbol = Symbol();\n/** The same, but for the argument part of destination, see below. */\nconst ReturnArgKey = \"return\";\n\n/** Special destination, telling the executor that corresponding result should\n * be exposed as a final result, and execution terminate at this point. */\nconst ReturnDestination = { op: ReturnOpKey, arg: ReturnArgKey } as Destination;\n\nfunction isReturnDestination(destination: Destination): boolean {\n return destination.op == ReturnOpKey && destination.arg == ReturnArgKey;\n}\n\n/** Queued operation, used inside the executor */\ntype QueuedOperation = {\n operation: Operation;\n destination: Destination;\n};\n\n/** Queued computation, returned by the first round of config execution. Such\n * computables should be returned in the intermediate representation of the\n * enclosing computable, and after they are resolved and passed to the\n * postprocessing routine, should be injected into the execution stack to\n * finalize the computation. */\ntype ScheduledComputable = {\n destination: Destination;\n computable: Computable<unknown>;\n};\n\n/** This is what ScheduledComputable transforms from intermediate\n * representation to post-processing. */\ntype MaterializedComputable = {\n destination: Destination;\n computable: unknown;\n};\n\n/** Main entry inside the execution stack. */\ntype PendingSubroutine = {\n subroutine: Subroutine;\n destination: Destination;\n argCounter: number;\n args: ArgumentValues;\n};\n\n/** Execution stack. The closest concept that this object along with enclosed\n * {@link PendingSubroutine}s represent is a Continuation.\n * https://en.wikipedia.org/wiki/Continuation */\ntype ExecutionStack = {\n result?: unknown;\n pendingSubroutines: Map<SubroutineKey, PendingSubroutine>;\n};\n\n/** Returns initial stack value. */\nfunction zeroStack(): ExecutionStack {\n return { pendingSubroutines: new Map<SubroutineKey, PendingSubroutine>() };\n}\n\n/** Implements main executor mechanism.\n * @param env to be passed to while executing operations\n * @param stack execution stack to continue execution from\n * @param operations operations to initiate the execution process\n * @param allowComputables if false, scheduling of async computables will result in error\n * */\nfunction execute(\n env: ExecutionEnvironment,\n stack: ExecutionStack,\n operations: QueuedOperation[],\n allowComputables: boolean,\n): ScheduledComputable[] {\n const operationQueue = new Denque<QueuedOperation>(operations);\n\n /** Returns false if final result is set as result of this operation,\n * true if we should continue processing. */\n const deliverResult = (destination: Destination, result: unknown): boolean => {\n if (isReturnDestination(destination)) {\n stack.result = result;\n return false;\n }\n\n const pending = notEmpty(stack.pendingSubroutines.get(destination.op));\n if (destination.arg in pending.args) throw new Error(\"argument already set\");\n pending.args[destination.arg] = result;\n pending.argCounter--;\n if (pending.argCounter === 0) {\n stack.pendingSubroutines.delete(destination.op);\n operationQueue.push({\n destination: pending.destination,\n operation: pending.subroutine(pending.args),\n });\n }\n\n return true;\n };\n\n // computables, scheduled during computation, are aggregated in this array,\n // and returned from the function in the end\n const computables: ScheduledComputable[] = [];\n\n // each loop = execution of a single queued operation\n mainLoop: while (operationQueue.length > 0) {\n const op = operationQueue.shift()!;\n const action = op.operation(env);\n switch (action.type) {\n case \"ReturnResult\":\n if (!deliverResult(op.destination, action.result)) break mainLoop; // this terminates execution\n break; // switch\n\n case \"ScheduleSubroutine\":\n {\n const newOpKey = Symbol();\n\n const argRequests = Object.entries(action.args);\n const initialArgCounter = argRequests.length;\n\n if (initialArgCounter === 0)\n // if no pending arguments\n operationQueue.push({\n destination: op.destination,\n operation: action.subroutine({}),\n });\n else {\n for (const [arg, operation] of argRequests)\n operationQueue.push({\n destination: { op: newOpKey, arg },\n operation,\n });\n\n stack.pendingSubroutines.set(newOpKey, {\n argCounter: initialArgCounter,\n args: {},\n subroutine: action.subroutine,\n destination: op.destination,\n });\n }\n }\n break;\n\n case \"ScheduleComputable\":\n if (!allowComputables)\n throw new Error(\"asynchronous operations are forbidden in this context\");\n computables.push({\n destination: op.destination,\n computable: action.computable,\n });\n break;\n\n default:\n assertNever(action);\n }\n }\n\n return computables;\n}\n\n//\n// Computable\n//\n\n/** Main method to render configurations */\nexport function computableFromCfg(\n drivers: MiddleLayerDriverKit,\n bCtx: BlockContextAny,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n return computableFromCfgUnsafe(drivers, toCfgContext(bCtx), cfg, ops);\n}\n\nexport function computableFromCfgUnsafe(\n drivers: MiddleLayerDriverKit,\n ctx: Record<string, unknown>,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n const key =\n `${ctx.blockId}#` +\n canonicalize({\n ctx: Object.fromEntries(\n Object.entries(ctx).filter(([k]) => NonKeyCtxFields.indexOf(k) === -1),\n ),\n cfg: cfg,\n })!;\n return Computable.makeRaw(\n (c) => {\n const env: ExecutionEnvironment = { drivers, cCtx: c };\n const stack = zeroStack();\n const computables = execute(\n env,\n stack,\n [\n {\n destination: ReturnDestination,\n operation: renderCfg(ctx, cfg),\n },\n ],\n true,\n );\n return {\n ir: computables,\n postprocessValue(value: MaterializedComputable[]): unknown {\n const resolvedOps: QueuedOperation[] = [];\n for (const mc of value)\n resolvedOps.push({ destination: mc.destination, operation: resOp(mc.computable) });\n const postEnv: ExecutionEnvironment = {\n drivers,\n get cCtx(): ComputableCtx {\n throw new Error(\"asynchronous operations are forbidden in this context\");\n },\n };\n\n // Post process can be called several times, that's why it must be a side-effect-free function.\n // But `execute` modifies a stack, so we have to defensively copy it here.\n const copyOfPendingSubrotines = new Map<SubroutineKey, PendingSubroutine>();\n for (const [key, value] of stack.pendingSubroutines)\n copyOfPendingSubrotines.set(key, { ...value, args: { ...value.args } });\n const copiedStack: ExecutionStack = {\n result: stack.result,\n pendingSubroutines: copyOfPendingSubrotines,\n };\n execute(postEnv, copiedStack, resolvedOps, false);\n if (!(\"result\" in copiedStack))\n throw new Error(\"illegal cfg rendering stack state, no result\");\n return copiedStack.result;\n },\n };\n },\n { ...ops, key },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"executor.cjs","names":["Denque","toCfgContext","NonKeyCtxFields","Computable","renderCfg","resOp"],"sources":["../../src/cfg_render/executor.ts"],"sourcesContent":["import type {\n ArgumentKey,\n ArgumentValues,\n ExecutionEnvironment,\n Operation,\n Subroutine,\n} from \"./operation\";\nimport Denque from \"denque\";\nimport { assertNever, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { ComputableCtx, ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { Cfg } from \"@platforma-sdk/model\";\nimport { renderCfg, resOp } from \"./renderer\";\nimport canonicalize from \"canonicalize\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport type { MiddleLayerDriverKit } from \"../middle_layer/driver_kit\";\nimport { NonKeyCtxFields, toCfgContext } from \"../middle_layer/block_ctx_unsafe\";\n\n/** Addresses pending subroutines inside the stack */\ntype SubroutineKey = symbol;\n\n/** Represents destination of the result of an operation. I.e. when sequence of\n * subroutine invocations, and computables terminates with result, this object\n * determines to which argument of which pending subroutine it should be delivered.\n * See special value for delivery of the final \"return\" result. */\ntype Destination = {\n op: SubroutineKey;\n arg: ArgumentKey;\n};\n\n/** Special address of operation, see below. */\nconst ReturnOpKey: unique symbol = Symbol();\n/** The same, but for the argument part of destination, see below. */\nconst ReturnArgKey = \"return\";\n\n/** Special destination, telling the executor that corresponding result should\n * be exposed as a final result, and execution terminate at this point. */\nconst ReturnDestination = { op: ReturnOpKey, arg: ReturnArgKey } as Destination;\n\nfunction isReturnDestination(destination: Destination): boolean {\n return destination.op == ReturnOpKey && destination.arg == ReturnArgKey;\n}\n\n/** Queued operation, used inside the executor */\ntype QueuedOperation = {\n operation: Operation;\n destination: Destination;\n};\n\n/** Queued computation, returned by the first round of config execution. Such\n * computables should be returned in the intermediate representation of the\n * enclosing computable, and after they are resolved and passed to the\n * postprocessing routine, should be injected into the execution stack to\n * finalize the computation. */\ntype ScheduledComputable = {\n destination: Destination;\n computable: Computable<unknown>;\n};\n\n/** This is what ScheduledComputable transforms from intermediate\n * representation to post-processing. */\ntype MaterializedComputable = {\n destination: Destination;\n computable: unknown;\n};\n\n/** Main entry inside the execution stack. */\ntype PendingSubroutine = {\n subroutine: Subroutine;\n destination: Destination;\n argCounter: number;\n args: ArgumentValues;\n};\n\n/** Execution stack. The closest concept that this object along with enclosed\n * {@link PendingSubroutine}s represent is a Continuation.\n * https://en.wikipedia.org/wiki/Continuation */\ntype ExecutionStack = {\n result?: unknown;\n pendingSubroutines: Map<SubroutineKey, PendingSubroutine>;\n};\n\n/** Returns initial stack value. */\nfunction zeroStack(): ExecutionStack {\n return { pendingSubroutines: new Map<SubroutineKey, PendingSubroutine>() };\n}\n\n/** Implements main executor mechanism.\n * @param env to be passed to while executing operations\n * @param stack execution stack to continue execution from\n * @param operations operations to initiate the execution process\n * @param allowComputables if false, scheduling of async computables will result in error\n * */\nfunction execute(\n env: ExecutionEnvironment,\n stack: ExecutionStack,\n operations: QueuedOperation[],\n allowComputables: boolean,\n): ScheduledComputable[] {\n const operationQueue = new Denque<QueuedOperation>(operations);\n\n /** Returns false if final result is set as result of this operation,\n * true if we should continue processing. */\n const deliverResult = (destination: Destination, result: unknown): boolean => {\n if (isReturnDestination(destination)) {\n stack.result = result;\n return false;\n }\n\n const pending = notEmpty(stack.pendingSubroutines.get(destination.op));\n if (destination.arg in pending.args) throw new Error(\"argument already set\");\n pending.args[destination.arg] = result;\n pending.argCounter--;\n if (pending.argCounter === 0) {\n stack.pendingSubroutines.delete(destination.op);\n operationQueue.push({\n destination: pending.destination,\n operation: pending.subroutine(pending.args),\n });\n }\n\n return true;\n };\n\n // computables, scheduled during computation, are aggregated in this array,\n // and returned from the function in the end\n const computables: ScheduledComputable[] = [];\n\n // each loop = execution of a single queued operation\n mainLoop: while (operationQueue.length > 0) {\n const op = operationQueue.shift()!;\n const action = op.operation(env);\n switch (action.type) {\n case \"ReturnResult\":\n if (!deliverResult(op.destination, action.result)) break mainLoop; // this terminates execution\n break; // switch\n\n case \"ScheduleSubroutine\":\n {\n const newOpKey = Symbol();\n\n const argRequests = Object.entries(action.args);\n const initialArgCounter = argRequests.length;\n\n if (initialArgCounter === 0)\n // if no pending arguments\n operationQueue.push({\n destination: op.destination,\n operation: action.subroutine({}),\n });\n else {\n for (const [arg, operation] of argRequests)\n operationQueue.push({\n destination: { op: newOpKey, arg },\n operation,\n });\n\n stack.pendingSubroutines.set(newOpKey, {\n argCounter: initialArgCounter,\n args: {},\n subroutine: action.subroutine,\n destination: op.destination,\n });\n }\n }\n break;\n\n case \"ScheduleComputable\":\n if (!allowComputables)\n throw new Error(\"asynchronous operations are forbidden in this context\");\n computables.push({\n destination: op.destination,\n computable: action.computable,\n });\n break;\n\n default:\n assertNever(action);\n }\n }\n\n return computables;\n}\n\n//\n// Computable\n//\n\n/** Main method to render configurations */\nexport function computableFromCfg(\n drivers: MiddleLayerDriverKit,\n bCtx: BlockContextAny,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n return computableFromCfgUnsafe(drivers, toCfgContext(bCtx), cfg, ops);\n}\n\nexport function computableFromCfgUnsafe(\n drivers: MiddleLayerDriverKit,\n ctx: Record<string, unknown>,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n const key =\n `${ctx.blockId}#` +\n canonicalize({\n ctx: Object.fromEntries(\n Object.entries(ctx).filter(([k]) => NonKeyCtxFields.indexOf(k) === -1),\n ),\n cfg: cfg,\n })!;\n return Computable.makeRaw(\n (c) => {\n const env: ExecutionEnvironment = { drivers, cCtx: c };\n const stack = zeroStack();\n const computables = execute(\n env,\n stack,\n [\n {\n destination: ReturnDestination,\n operation: renderCfg(ctx, cfg),\n },\n ],\n true,\n );\n return {\n ir: computables,\n postprocessValue(value: MaterializedComputable[]): unknown {\n const resolvedOps: QueuedOperation[] = [];\n for (const mc of value)\n resolvedOps.push({ destination: mc.destination, operation: resOp(mc.computable) });\n const postEnv: ExecutionEnvironment = {\n drivers,\n get cCtx(): ComputableCtx {\n throw new Error(\"asynchronous operations are forbidden in this context\");\n },\n };\n\n // Post process can be called several times, that's why it must be a side-effect-free function.\n // But `execute` modifies a stack, so we have to defensively copy it here.\n const copyOfPendingSubrotines = new Map<SubroutineKey, PendingSubroutine>();\n for (const [key, value] of stack.pendingSubroutines)\n copyOfPendingSubrotines.set(key, { ...value, args: { ...value.args } });\n const copiedStack: ExecutionStack = {\n result: stack.result,\n pendingSubroutines: copyOfPendingSubrotines,\n };\n execute(postEnv, copiedStack, resolvedOps, false);\n if (!(\"result\" in copiedStack))\n throw new Error(\"illegal cfg rendering stack state, no result\");\n return copiedStack.result;\n },\n };\n },\n { ...ops, key },\n );\n}\n"],"mappings":"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"}