@milaboratories/pl-middle-layer 1.64.37 → 1.64.39

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 (247) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.cjs +2 -2
  2. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.js +2 -2
  3. package/dist/block_registry/index.cjs +11 -3
  4. package/dist/block_registry/index.d.ts +3 -2
  5. package/dist/block_registry/index.js +4 -3
  6. package/dist/block_registry/registry-v2-provider.cjs +1 -1
  7. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  8. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -1
  9. package/dist/block_registry/registry-v2-provider.js +1 -0
  10. package/dist/block_registry/registry-v2-provider.js.map +1 -1
  11. package/dist/block_registry/registry.cjs +20 -3
  12. package/dist/block_registry/registry.cjs.map +1 -1
  13. package/dist/block_registry/registry.d.ts +7 -1
  14. package/dist/block_registry/registry.d.ts.map +1 -1
  15. package/dist/block_registry/registry.js +17 -1
  16. package/dist/block_registry/registry.js.map +1 -1
  17. package/dist/block_registry/watcher.cjs +21 -2
  18. package/dist/block_registry/watcher.cjs.map +1 -1
  19. package/dist/block_registry/watcher.d.ts +1 -1
  20. package/dist/block_registry/watcher.d.ts.map +1 -1
  21. package/dist/block_registry/watcher.js +21 -3
  22. package/dist/block_registry/watcher.js.map +1 -1
  23. package/dist/block_registry/well_known_registries.cjs.map +1 -1
  24. package/dist/block_registry/well_known_registries.d.ts.map +1 -1
  25. package/dist/block_registry/well_known_registries.js.map +1 -1
  26. package/dist/cfg_render/executor.cjs +2 -2
  27. package/dist/cfg_render/executor.cjs.map +1 -1
  28. package/dist/cfg_render/executor.js.map +1 -1
  29. package/dist/cfg_render/renderer.cjs +0 -1
  30. package/dist/cfg_render/renderer.cjs.map +1 -1
  31. package/dist/cfg_render/renderer.js.map +1 -1
  32. package/dist/cfg_render/traverse.cjs +0 -1
  33. package/dist/cfg_render/traverse.cjs.map +1 -1
  34. package/dist/cfg_render/traverse.js.map +1 -1
  35. package/dist/cfg_render/util.cjs.map +1 -1
  36. package/dist/cfg_render/util.js.map +1 -1
  37. package/dist/debug/index.cjs +1 -0
  38. package/dist/debug/index.cjs.map +1 -1
  39. package/dist/debug/index.js +1 -1
  40. package/dist/debug/index.js.map +1 -1
  41. package/dist/dev_env/index.cjs +9 -1
  42. package/dist/dev_env/index.cjs.map +1 -1
  43. package/dist/dev_env/index.js +1 -1
  44. package/dist/dev_env/index.js.map +1 -1
  45. package/dist/dev_env/util.cjs +1 -1
  46. package/dist/dev_env/util.cjs.map +1 -1
  47. package/dist/dev_env/util.js.map +1 -1
  48. package/dist/index.cjs +2 -0
  49. package/dist/index.d.ts +3 -3
  50. package/dist/index.js +3 -3
  51. package/dist/js_render/computable_context.cjs +8 -5
  52. package/dist/js_render/computable_context.cjs.map +1 -1
  53. package/dist/js_render/computable_context.js +5 -1
  54. package/dist/js_render/computable_context.js.map +1 -1
  55. package/dist/js_render/context.cjs +4 -1
  56. package/dist/js_render/context.cjs.map +1 -1
  57. package/dist/js_render/context.js +4 -1
  58. package/dist/js_render/context.js.map +1 -1
  59. package/dist/js_render/index.cjs +0 -1
  60. package/dist/js_render/index.cjs.map +1 -1
  61. package/dist/js_render/index.js.map +1 -1
  62. package/dist/js_render/service_injectors.cjs +2 -3
  63. package/dist/js_render/service_injectors.cjs.map +1 -1
  64. package/dist/js_render/service_injectors.js +1 -1
  65. package/dist/js_render/service_injectors.js.map +1 -1
  66. package/dist/middle_layer/active_cfg.cjs +0 -1
  67. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  68. package/dist/middle_layer/active_cfg.js.map +1 -1
  69. package/dist/middle_layer/block.cjs +0 -1
  70. package/dist/middle_layer/block.cjs.map +1 -1
  71. package/dist/middle_layer/block.js.map +1 -1
  72. package/dist/middle_layer/block_ctx.cjs +0 -1
  73. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  74. package/dist/middle_layer/block_ctx.js.map +1 -1
  75. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  76. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  77. package/dist/middle_layer/driver_kit.cjs +0 -1
  78. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  79. package/dist/middle_layer/driver_kit.js.map +1 -1
  80. package/dist/middle_layer/frontend_path.cjs +5 -1
  81. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  82. package/dist/middle_layer/frontend_path.js +6 -1
  83. package/dist/middle_layer/frontend_path.js.map +1 -1
  84. package/dist/middle_layer/index.cjs +13 -5
  85. package/dist/middle_layer/index.d.ts +2 -1
  86. package/dist/middle_layer/index.js +6 -5
  87. package/dist/middle_layer/middle_layer.cjs +7 -1
  88. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  89. package/dist/middle_layer/middle_layer.d.ts.map +1 -1
  90. package/dist/middle_layer/middle_layer.js +7 -0
  91. package/dist/middle_layer/middle_layer.js.map +1 -1
  92. package/dist/middle_layer/navigation_states.cjs +0 -1
  93. package/dist/middle_layer/navigation_states.cjs.map +1 -1
  94. package/dist/middle_layer/navigation_states.js.map +1 -1
  95. package/dist/middle_layer/ops.cjs +1 -1
  96. package/dist/middle_layer/ops.cjs.map +1 -1
  97. package/dist/middle_layer/ops.d.ts.map +1 -1
  98. package/dist/middle_layer/ops.js.map +1 -1
  99. package/dist/middle_layer/project.cjs +9 -2
  100. package/dist/middle_layer/project.cjs.map +1 -1
  101. package/dist/middle_layer/project.d.ts.map +1 -1
  102. package/dist/middle_layer/project.js +5 -1
  103. package/dist/middle_layer/project.js.map +1 -1
  104. package/dist/middle_layer/project_list.cjs +2 -1
  105. package/dist/middle_layer/project_list.cjs.map +1 -1
  106. package/dist/middle_layer/project_list.js +1 -1
  107. package/dist/middle_layer/project_list.js.map +1 -1
  108. package/dist/middle_layer/project_overview.cjs +0 -1
  109. package/dist/middle_layer/project_overview.cjs.map +1 -1
  110. package/dist/middle_layer/project_overview.js.map +1 -1
  111. package/dist/middle_layer/project_overview_light.cjs +0 -1
  112. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  113. package/dist/middle_layer/project_overview_light.js.map +1 -1
  114. package/dist/middle_layer/render.cjs +0 -1
  115. package/dist/middle_layer/render.cjs.map +1 -1
  116. package/dist/middle_layer/render.js.map +1 -1
  117. package/dist/middle_layer/types.d.ts.map +1 -1
  118. package/dist/middle_layer/util.cjs +0 -1
  119. package/dist/middle_layer/util.cjs.map +1 -1
  120. package/dist/middle_layer/util.js.map +1 -1
  121. package/dist/model/args.cjs +1 -1
  122. package/dist/model/args.cjs.map +1 -1
  123. package/dist/model/args.js +1 -1
  124. package/dist/model/args.js.map +1 -1
  125. package/dist/model/block_pack_spec.cjs +5 -0
  126. package/dist/model/block_pack_spec.cjs.map +1 -1
  127. package/dist/model/block_pack_spec.d.ts +19 -2
  128. package/dist/model/block_pack_spec.d.ts.map +1 -1
  129. package/dist/model/block_pack_spec.js +5 -1
  130. package/dist/model/block_pack_spec.js.map +1 -1
  131. package/dist/model/frontend.d.ts.map +1 -1
  132. package/dist/model/index.d.ts +2 -1
  133. package/dist/model/project_helper.cjs +2 -1
  134. package/dist/model/project_helper.cjs.map +1 -1
  135. package/dist/model/project_helper.d.ts +1 -1
  136. package/dist/model/project_helper.d.ts.map +1 -1
  137. package/dist/model/project_helper.js +2 -0
  138. package/dist/model/project_helper.js.map +1 -1
  139. package/dist/model/project_model.cjs +2 -1
  140. package/dist/model/project_model.cjs.map +1 -1
  141. package/dist/model/project_model.d.ts.map +1 -1
  142. package/dist/model/project_model.js +2 -2
  143. package/dist/model/project_model.js.map +1 -1
  144. package/dist/model/project_model_util.cjs +4 -3
  145. package/dist/model/project_model_util.cjs.map +1 -1
  146. package/dist/model/project_model_util.js +4 -4
  147. package/dist/model/project_model_util.js.map +1 -1
  148. package/dist/model/template_spec.d.ts.map +1 -1
  149. package/dist/mutator/block-pack/block_pack.cjs +41 -4
  150. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  151. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
  152. package/dist/mutator/block-pack/block_pack.js +40 -4
  153. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  154. package/dist/mutator/block-pack/frontend.cjs +5 -1
  155. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  156. package/dist/mutator/block-pack/frontend.js +6 -1
  157. package/dist/mutator/block-pack/frontend.js.map +1 -1
  158. package/dist/mutator/block-pack/required_capabilities.cjs +0 -1
  159. package/dist/mutator/block-pack/required_capabilities.cjs.map +1 -1
  160. package/dist/mutator/block-pack/required_capabilities.js.map +1 -1
  161. package/dist/mutator/context_export.cjs +0 -1
  162. package/dist/mutator/context_export.cjs.map +1 -1
  163. package/dist/mutator/context_export.js.map +1 -1
  164. package/dist/mutator/migration.cjs +0 -1
  165. package/dist/mutator/migration.cjs.map +1 -1
  166. package/dist/mutator/migration.js.map +1 -1
  167. package/dist/mutator/project.cjs +22 -4
  168. package/dist/mutator/project.cjs.map +1 -1
  169. package/dist/mutator/project.js +21 -4
  170. package/dist/mutator/project.js.map +1 -1
  171. package/dist/mutator/template/direct_template_loader.cjs +0 -1
  172. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  173. package/dist/mutator/template/direct_template_loader.js.map +1 -1
  174. package/dist/mutator/template/direct_template_loader_v3.cjs +0 -1
  175. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  176. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -1
  177. package/dist/mutator/template/render_block.cjs +4 -1
  178. package/dist/mutator/template/render_block.cjs.map +1 -1
  179. package/dist/mutator/template/render_block.js +1 -1
  180. package/dist/mutator/template/render_block.js.map +1 -1
  181. package/dist/mutator/template/render_template.cjs +0 -1
  182. package/dist/mutator/template/render_template.cjs.map +1 -1
  183. package/dist/mutator/template/render_template.d.ts.map +1 -1
  184. package/dist/mutator/template/render_template.js.map +1 -1
  185. package/dist/mutator/template/template_cache.cjs +6 -3
  186. package/dist/mutator/template/template_cache.cjs.map +1 -1
  187. package/dist/mutator/template/template_cache.d.ts +1 -2
  188. package/dist/mutator/template/template_cache.d.ts.map +1 -1
  189. package/dist/mutator/template/template_cache.js +6 -2
  190. package/dist/mutator/template/template_cache.js.map +1 -1
  191. package/dist/mutator/template/template_loading.cjs +1 -1
  192. package/dist/mutator/template/template_loading.cjs.map +1 -1
  193. package/dist/mutator/template/template_loading.d.ts.map +1 -1
  194. package/dist/mutator/template/template_loading.js.map +1 -1
  195. package/dist/network_check/network_check.cjs +0 -1
  196. package/dist/network_check/network_check.cjs.map +1 -1
  197. package/dist/network_check/network_check.d.ts.map +1 -1
  198. package/dist/network_check/network_check.js.map +1 -1
  199. package/dist/network_check/pings.cjs +3 -1
  200. package/dist/network_check/pings.cjs.map +1 -1
  201. package/dist/network_check/pings.js +1 -1
  202. package/dist/network_check/pings.js.map +1 -1
  203. package/dist/network_check/template.cjs +10 -3
  204. package/dist/network_check/template.cjs.map +1 -1
  205. package/dist/network_check/template.js +1 -1
  206. package/dist/network_check/template.js.map +1 -1
  207. package/dist/pool/data.cjs +12 -1
  208. package/dist/pool/data.cjs.map +1 -1
  209. package/dist/pool/data.d.ts.map +1 -1
  210. package/dist/pool/data.js +3 -1
  211. package/dist/pool/data.js.map +1 -1
  212. package/dist/pool/driver.cjs +8 -1
  213. package/dist/pool/driver.cjs.map +1 -1
  214. package/dist/pool/driver.d.ts.map +1 -1
  215. package/dist/pool/driver.js +7 -0
  216. package/dist/pool/driver.js.map +1 -1
  217. package/dist/pool/index.cjs +5 -2
  218. package/dist/pool/index.d.ts +2 -1
  219. package/dist/pool/index.js +3 -2
  220. package/dist/pool/p_object_collection.cjs +1 -1
  221. package/dist/pool/p_object_collection.cjs.map +1 -1
  222. package/dist/pool/p_object_collection.js.map +1 -1
  223. package/dist/pool/result_pool.cjs +2 -1
  224. package/dist/pool/result_pool.cjs.map +1 -1
  225. package/dist/pool/result_pool.js +2 -0
  226. package/dist/pool/result_pool.js.map +1 -1
  227. package/dist/service_factories.cjs +0 -1
  228. package/dist/service_factories.cjs.map +1 -1
  229. package/dist/service_factories.js.map +1 -1
  230. package/dist/worker/WorkerManager.cjs +3 -2
  231. package/dist/worker/WorkerManager.cjs.map +1 -1
  232. package/dist/worker/WorkerManager.js +2 -1
  233. package/dist/worker/WorkerManager.js.map +1 -1
  234. package/dist/worker/worker.cjs +0 -1
  235. package/dist/worker/worker.cjs.map +1 -1
  236. package/dist/worker/worker.js.map +1 -1
  237. package/dist/worker/workerApi.cjs +0 -1
  238. package/dist/worker/workerApi.cjs.map +1 -1
  239. package/dist/worker/workerApi.js.map +1 -1
  240. package/package.json +15 -15
  241. package/src/block_registry/registry.ts +19 -0
  242. package/src/block_registry/watcher.ts +25 -2
  243. package/src/middle_layer/frontend_path.ts +22 -2
  244. package/src/model/block_pack_spec.ts +24 -1
  245. package/src/mutator/block-pack/block_pack.ts +61 -2
  246. package/src/mutator/block-pack/frontend.ts +20 -2
  247. package/src/mutator/template/template_cache.ts +10 -2
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.123.0/helpers/usingCtx.js
1
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/usingCtx.js
2
2
  function _usingCtx() {
3
3
  var r = "function" == typeof SuppressedError ? SuppressedError : function(r, e) {
4
4
  var n = Error();
@@ -54,4 +54,4 @@ function _usingCtx() {
54
54
  };
55
55
  }
56
56
  //#endregion
57
- exports._usingCtx = _usingCtx;
57
+ exports.default = _usingCtx;
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.123.0/helpers/usingCtx.js
1
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/usingCtx.js
2
2
  function _usingCtx() {
3
3
  var r = "function" == typeof SuppressedError ? SuppressedError : function(r, e) {
4
4
  var n = Error();
@@ -54,4 +54,4 @@ function _usingCtx() {
54
54
  };
55
55
  }
56
56
  //#endregion
57
- export { _usingCtx };
57
+ export { _usingCtx as default };
@@ -1,3 +1,11 @@
1
- require("./registry.cjs");
2
- require("./registry-v2-provider.cjs");
3
- require("./well_known_registries.cjs");
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");
4
+ exports.BlockPackRegistry = require_registry.BlockPackRegistry;
5
+ exports.CentralBlockRegistry = require_well_known_registries.CentralBlockRegistry;
6
+ exports.V1CentralDevSnapshotRegistry = require_well_known_registries.V1CentralDevSnapshotRegistry;
7
+ exports.V1CentralRegistry = require_well_known_registries.V1CentralRegistry;
8
+ exports.V2RegistryProvider = require_registry_v2_provider.V2RegistryProvider;
9
+ exports.getDevV1PacketMtime = require_registry.getDevV1PacketMtime;
10
+ exports.getDevV2PacketMtime = require_registry.getDevV2PacketMtime;
11
+ exports.getFromPackV2Mtime = require_registry.getFromPackV2Mtime;
@@ -1,3 +1,4 @@
1
1
  import { V2RegistryProvider } from "./registry-v2-provider.js";
2
- import { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime } from "./registry.js";
3
- import { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry } from "./well_known_registries.js";
2
+ import { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime } from "./registry.js";
3
+ import { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry } from "./well_known_registries.js";
4
+ export { BlockPackRegistry, CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime };
@@ -1,3 +1,4 @@
1
- import "./registry.js";
2
- import "./registry-v2-provider.js";
3
- import "./well_known_registries.js";
1
+ import { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime } from "./registry.js";
2
+ import { V2RegistryProvider } from "./registry-v2-provider.js";
3
+ import { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry } from "./well_known_registries.js";
4
+ export { BlockPackRegistry, CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime };
@@ -1,7 +1,7 @@
1
- require("../_virtual/_rolldown/runtime.cjs");
2
1
  let _platforma_sdk_block_tools = require("@platforma-sdk/block-tools");
3
2
  //#region src/block_registry/registry-v2-provider.ts
4
3
  var V2RegistryProvider = class {
4
+ http;
5
5
  registries = /* @__PURE__ */ new Map();
6
6
  constructor(http) {
7
7
  this.http = http;
@@ -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,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"}
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;CAGD;CAF7B,6BAA8B,IAAI,IAA8B;CAEhE,YAAY,MAAmC;EAAlB,KAAA,OAAA;CAAmB;CAEhD,YAAmB,KAA+B;EAChD,MAAM,YAAY,KAAK,WAAW,IAAI,GAAG;EACzC,IAAI,WAAW,OAAO;EACtB,MAAM,cAAc,IAAIA,2BAAAA,kBAAAA,GAAAA,2BAAAA,kBAAAA,CAAmC,KAAK,KAAK,IAAI,CAAC;EAC1E,KAAK,WAAW,IAAI,KAAK,WAAW;EACpC,OAAO;CACT;AACF"}
@@ -1 +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
+ {"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,gBAAgB;AAAA"}
@@ -1,6 +1,7 @@
1
1
  import { RegistryV2Reader, folderReaderByUrl } from "@platforma-sdk/block-tools";
2
2
  //#region src/block_registry/registry-v2-provider.ts
3
3
  var V2RegistryProvider = class {
4
+ http;
4
5
  registries = /* @__PURE__ */ new Map();
5
6
  constructor(http) {
6
7
  this.http = http;
@@ -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,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
+ {"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;CAGD;CAF7B,6BAA8B,IAAI,IAA8B;CAEhE,YAAY,MAAmC;EAAlB,KAAA,OAAA;CAAmB;CAEhD,YAAmB,KAA+B;EAChD,MAAM,YAAY,KAAK,WAAW,IAAI,GAAG;EACzC,IAAI,WAAW,OAAO;EACtB,MAAM,cAAc,IAAI,iBAAiB,kBAAkB,KAAK,KAAK,IAAI,CAAC;EAC1E,KAAK,WAAW,IAAI,KAAK,WAAW;EACpC,OAAO;CACT;AACF"}
@@ -5,11 +5,11 @@ let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-mi
5
5
  let undici = require("undici");
6
6
  let _platforma_sdk_block_tools = require("@platforma-sdk/block-tools");
7
7
  let node_fs = require("node:fs");
8
- node_fs = require_runtime.__toESM(node_fs);
8
+ node_fs = require_runtime.__toESM(node_fs, 1);
9
9
  let node_path = require("node:path");
10
- node_path = require_runtime.__toESM(node_path);
10
+ node_path = require_runtime.__toESM(node_path, 1);
11
11
  let yaml = require("yaml");
12
- yaml = require_runtime.__toESM(yaml);
12
+ yaml = require_runtime.__toESM(yaml, 1);
13
13
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
14
14
  //#region src/block_registry/registry.ts
15
15
  async function getFileContent(path) {
@@ -42,7 +42,23 @@ async function getDevV2PacketMtime(description) {
42
42
  const modelStats = await node_fs.default.promises.stat(description.components.model.file, { bigint: true });
43
43
  return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();
44
44
  }
45
+ /** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else
46
+ * stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`
47
+ * prepare (which bakes the result into the spec) and the update watcher (which
48
+ * recomputes it to diff against the stored value) — divergence makes the block
49
+ * flap perpetually "update available". */
50
+ async function getFromPackV2Mtime(packDir, uiTgzPath) {
51
+ try {
52
+ const manifestPath = node_path.default.join(packDir, "manifest.json");
53
+ const raw = JSON.parse(await node_fs.default.promises.readFile(manifestPath, { encoding: "utf-8" }));
54
+ if (typeof raw.timestamp === "number") return String(raw.timestamp);
55
+ } catch {}
56
+ return (await node_fs.default.promises.stat(uiTgzPath, { bigint: true })).mtimeNs.toString();
57
+ }
45
58
  var BlockPackRegistry = class {
59
+ v2Provider;
60
+ registries;
61
+ http;
46
62
  constructor(v2Provider, registries, http) {
47
63
  this.v2Provider = v2Provider;
48
64
  this.registries = registries;
@@ -205,5 +221,6 @@ var BlockPackRegistry = class {
205
221
  exports.BlockPackRegistry = BlockPackRegistry;
206
222
  exports.getDevV1PacketMtime = getDevV1PacketMtime;
207
223
  exports.getDevV2PacketMtime = getDevV2PacketMtime;
224
+ exports.getFromPackV2Mtime = getFromPackV2Mtime;
208
225
 
209
226
  //# sourceMappingURL=registry.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.cjs","names":["fs","LegacyDevBlockPackFiles","path","RegistryV1","AnyChannel","StableChannel","YAML","deriveRequiredCapabilities"],"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 { embedBlockPackMetaAbsoluteBytes, 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 { deriveRequiredCapabilities } from \"../mutator/block-pack/required_capabilities\";\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(\n regEntry: RegistryEntry,\n options?: { signal?: AbortSignal },\n ): 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(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {\n ...httpOptions,\n signal: options?.signal,\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 (\n await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })\n ).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 meta = await embedBlockPackMetaAbsoluteBytes(v2Description.meta);\n\n // `tryLoadPackDescription` reads `package.json#block.meta` —\n // the dev SOURCE meta the developer wrote.\n // `requiredCapabilities` is a PACK-TIME artifact written by\n // `block-tools pack` into `block-pack/manifest.json`.\n // So for any dev block, the source meta never carries the field.\n //\n // To surface the gate at listing time without requiring the\n // developer to re-pack on every workflow change, derive from\n // the compiled workflow bytes directly.\n if (meta.requiredCapabilities === undefined) {\n const workflowBytes = await fs.promises.readFile(\n v2Description.components.workflow.main.file,\n );\n const derived = deriveRequiredCapabilities(workflowBytes);\n if (derived !== undefined) meta.requiredCapabilities = derived;\n }\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n 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(options?: { signal?: AbortSignal }): 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, options)));\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","deriveRequiredCapabilities"],"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 { embedBlockPackMetaAbsoluteBytes, 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 { deriveRequiredCapabilities } from \"../mutator/block-pack/required_capabilities\";\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\n/** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else\n * stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`\n * prepare (which bakes the result into the spec) and the update watcher (which\n * recomputes it to diff against the stored value) — divergence makes the block\n * flap perpetually \"update available\". */\nexport async function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string> {\n try {\n const manifestPath = path.join(packDir, \"manifest.json\");\n const raw = JSON.parse(await fs.promises.readFile(manifestPath, { encoding: \"utf-8\" })) as {\n timestamp?: unknown;\n };\n if (typeof raw.timestamp === \"number\") return String(raw.timestamp);\n } catch {\n // fall through to stat\n }\n const stat = await fs.promises.stat(uiTgzPath, { bigint: true });\n return stat.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(\n regEntry: RegistryEntry,\n options?: { signal?: AbortSignal },\n ): 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(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {\n ...httpOptions,\n signal: options?.signal,\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 (\n await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })\n ).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 meta = await embedBlockPackMetaAbsoluteBytes(v2Description.meta);\n\n // `tryLoadPackDescription` reads `package.json#block.meta` —\n // the dev SOURCE meta the developer wrote.\n // `requiredCapabilities` is a PACK-TIME artifact written by\n // `block-tools pack` into `block-pack/manifest.json`.\n // So for any dev block, the source meta never carries the field.\n //\n // To surface the gate at listing time without requiring the\n // developer to re-pack on every workflow change, derive from\n // the compiled workflow bytes directly.\n if (meta.requiredCapabilities === undefined) {\n const workflowBytes = await fs.promises.readFile(\n v2Description.components.workflow.main.file,\n );\n const derived = deriveRequiredCapabilities(workflowBytes);\n if (derived !== undefined) meta.requiredCapabilities = derived;\n }\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n 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(options?: { signal?: AbortSignal }): 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, options)));\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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"}
@@ -6,6 +6,12 @@ import { BlockPackDescriptionAbsolute } from "@platforma-sdk/block-tools";
6
6
  //#region src/block_registry/registry.d.ts
7
7
  declare function getDevV1PacketMtime(devPath: string): Promise<string>;
8
8
  declare function getDevV2PacketMtime(description: BlockPackDescriptionAbsolute): Promise<string>;
9
+ /** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else
10
+ * stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`
11
+ * prepare (which bakes the result into the spec) and the update watcher (which
12
+ * recomputes it to diff against the stored value) — divergence makes the block
13
+ * flap perpetually "update available". */
14
+ declare function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string>;
9
15
  declare class BlockPackRegistry {
10
16
  private readonly v2Provider;
11
17
  private readonly registries;
@@ -18,5 +24,5 @@ declare class BlockPackRegistry {
18
24
  getOverview(registryId: string, blockId: BlockPackId, channel: string): Promise<SingleBlockPackOverview>;
19
25
  }
20
26
  //#endregion
21
- export { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime };
27
+ export { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime };
22
28
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;iBA4CsB,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;EA4LD,cAAA,CAAe,OAAA;IAAY,MAAA,GAAS,WAAA;EAAA,IAAgB,OAAA,CAAQ,gBAAA;EAU5D,WAAA,CACX,UAAA,UACA,OAAA,EAAS,WAAA,EACT,OAAA,WACC,OAAA,CAAQ,uBAAA;AAAA"}
1
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;iBA4CsB,mBAAA,CAAoB,OAAA,WAAkB,OAAO;AAAA,iBAW7C,mBAAA,CACpB,WAAA,EAAa,4BAAA,GACZ,OAAO;AAbV;;;;AAAmE;AAAnE,iBA0BsB,kBAAA,CAAmB,OAAA,UAAiB,SAAA,WAAoB,OAAO;AAAA,cAcxE,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;EA4LD,cAAA,CAAe,OAAA;IAAY,MAAA,GAAS,WAAA;EAAA,IAAgB,OAAA,CAAQ,gBAAA;EAU5D,WAAA,CACX,UAAA,UACA,OAAA,EAAS,WAAA,EACT,OAAA,WACC,OAAA,CAAQ,uBAAA;AAAA"}
@@ -38,7 +38,23 @@ async function getDevV2PacketMtime(description) {
38
38
  const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });
39
39
  return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();
40
40
  }
41
+ /** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else
42
+ * stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`
43
+ * prepare (which bakes the result into the spec) and the update watcher (which
44
+ * recomputes it to diff against the stored value) — divergence makes the block
45
+ * flap perpetually "update available". */
46
+ async function getFromPackV2Mtime(packDir, uiTgzPath) {
47
+ try {
48
+ const manifestPath = path.join(packDir, "manifest.json");
49
+ const raw = JSON.parse(await fs.promises.readFile(manifestPath, { encoding: "utf-8" }));
50
+ if (typeof raw.timestamp === "number") return String(raw.timestamp);
51
+ } catch {}
52
+ return (await fs.promises.stat(uiTgzPath, { bigint: true })).mtimeNs.toString();
53
+ }
41
54
  var BlockPackRegistry = class {
55
+ v2Provider;
56
+ registries;
57
+ http;
42
58
  constructor(v2Provider, registries, http) {
43
59
  this.v2Provider = v2Provider;
44
60
  this.registries = registries;
@@ -198,6 +214,6 @@ var BlockPackRegistry = class {
198
214
  }
199
215
  };
200
216
  //#endregion
201
- export { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime };
217
+ export { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime };
202
218
 
203
219
  //# 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 { embedBlockPackMetaAbsoluteBytes, 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 { deriveRequiredCapabilities } from \"../mutator/block-pack/required_capabilities\";\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(\n regEntry: RegistryEntry,\n options?: { signal?: AbortSignal },\n ): 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(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {\n ...httpOptions,\n signal: options?.signal,\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 (\n await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })\n ).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 meta = await embedBlockPackMetaAbsoluteBytes(v2Description.meta);\n\n // `tryLoadPackDescription` reads `package.json#block.meta` —\n // the dev SOURCE meta the developer wrote.\n // `requiredCapabilities` is a PACK-TIME artifact written by\n // `block-tools pack` into `block-pack/manifest.json`.\n // So for any dev block, the source meta never carries the field.\n //\n // To surface the gate at listing time without requiring the\n // developer to re-pack on every workflow change, derive from\n // the compiled workflow bytes directly.\n if (meta.requiredCapabilities === undefined) {\n const workflowBytes = await fs.promises.readFile(\n v2Description.components.workflow.main.file,\n );\n const derived = deriveRequiredCapabilities(workflowBytes);\n if (derived !== undefined) meta.requiredCapabilities = derived;\n }\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n 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(options?: { signal?: AbortSignal }): 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, options)));\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 { embedBlockPackMetaAbsoluteBytes, 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 { deriveRequiredCapabilities } from \"../mutator/block-pack/required_capabilities\";\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\n/** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else\n * stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`\n * prepare (which bakes the result into the spec) and the update watcher (which\n * recomputes it to diff against the stored value) — divergence makes the block\n * flap perpetually \"update available\". */\nexport async function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string> {\n try {\n const manifestPath = path.join(packDir, \"manifest.json\");\n const raw = JSON.parse(await fs.promises.readFile(manifestPath, { encoding: \"utf-8\" })) as {\n timestamp?: unknown;\n };\n if (typeof raw.timestamp === \"number\") return String(raw.timestamp);\n } catch {\n // fall through to stat\n }\n const stat = await fs.promises.stat(uiTgzPath, { bigint: true });\n return stat.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(\n regEntry: RegistryEntry,\n options?: { signal?: AbortSignal },\n ): 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(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {\n ...httpOptions,\n signal: options?.signal,\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 (\n await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })\n ).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 meta = await embedBlockPackMetaAbsoluteBytes(v2Description.meta);\n\n // `tryLoadPackDescription` reads `package.json#block.meta` —\n // the dev SOURCE meta the developer wrote.\n // `requiredCapabilities` is a PACK-TIME artifact written by\n // `block-tools pack` into `block-pack/manifest.json`.\n // So for any dev block, the source meta never carries the field.\n //\n // To surface the gate at listing time without requiring the\n // developer to re-pack on every workflow change, derive from\n // the compiled workflow bytes directly.\n if (meta.requiredCapabilities === undefined) {\n const workflowBytes = await fs.promises.readFile(\n v2Description.components.workflow.main.file,\n );\n const derived = deriveRequiredCapabilities(workflowBytes);\n if (derived !== undefined) meta.requiredCapabilities = derived;\n }\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n 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(options?: { signal?: AbortSignal }): 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, options)));\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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"}
@@ -3,14 +3,16 @@ 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");
6
+ let node_url = require("node:url");
6
7
  let canonicalize = require("canonicalize");
7
- canonicalize = require_runtime.__toESM(canonicalize);
8
+ canonicalize = require_runtime.__toESM(canonicalize, 1);
8
9
  let semver = require("semver");
9
- semver = require_runtime.__toESM(semver);
10
+ semver = require_runtime.__toESM(semver, 1);
10
11
  //#region src/block_registry/watcher.ts
11
12
  const DefaultBlockUpdateWatcherOps = { minDelay: 1500 };
12
13
  const NoUpdatesKey = "__no_updates__";
13
14
  var BlockUpdateWatcher = class extends _milaboratories_computable.PollComputablePool {
15
+ registryProvider;
14
16
  http;
15
17
  preferredUpdateChannel;
16
18
  constructor(registryProvider, logger, ops = {}) {
@@ -26,6 +28,7 @@ var BlockUpdateWatcher = class extends _milaboratories_computable.PollComputable
26
28
  switch (req.currentSpec.type) {
27
29
  case "dev-v1": return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;
28
30
  case "dev-v2": return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;
31
+ case "from-pack-v2": return `from_pack_v2_${req.currentSpec.packUrl}_${req.currentSpec.mtime}`;
29
32
  case "from-registry-v2": return `from_registry_v2_${(0, canonicalize.default)(req)}`;
30
33
  default: return NoUpdatesKey;
31
34
  }
@@ -64,6 +67,21 @@ var BlockUpdateWatcher = class extends _milaboratories_computable.PollComputable
64
67
  this.logger.warn(err);
65
68
  return { suggestions: [] };
66
69
  }
70
+ case "from-pack-v2": try {
71
+ const packDir = (0, node_url.fileURLToPath)(cSpec.packUrl);
72
+ const mtime = await require_registry.getFromPackV2Mtime(packDir, (await (0, _platforma_sdk_block_tools.loadPackDescriptionFromManifest)(packDir)).components.ui.folder);
73
+ if (mtime === cSpec.mtime) return { suggestions: [] };
74
+ else return {
75
+ mainSuggestion: {
76
+ ...cSpec,
77
+ mtime
78
+ },
79
+ suggestions: []
80
+ };
81
+ } catch (err) {
82
+ this.logger.warn(err);
83
+ return { suggestions: [] };
84
+ }
67
85
  case "from-registry-v2": try {
68
86
  const { versionLock, skipVersion } = req.settings;
69
87
  if (versionLock === "patch") return { suggestions: [] };
@@ -140,5 +158,6 @@ var BlockUpdateWatcher = class extends _milaboratories_computable.PollComputable
140
158
  };
141
159
  //#endregion
142
160
  exports.BlockUpdateWatcher = BlockUpdateWatcher;
161
+ exports.DefaultBlockUpdateWatcherOps = DefaultBlockUpdateWatcherOps;
143
162
 
144
163
  //# 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":";;;;;;;;;;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"}
1
+ {"version":3,"file":"watcher.cjs","names":["PollComputablePool","getDevV1PacketMtime","getDevV2PacketMtime","getFromPackV2Mtime","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, getFromPackV2Mtime } from \"./registry\";\nimport {\n loadPackDescriptionFromManifest,\n tryLoadPackDescription,\n} from \"@platforma-sdk/block-tools\";\nimport { fileURLToPath } from \"node:url\";\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-pack-v2\":\n return `from_pack_v2_${req.currentSpec.packUrl}_${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-pack-v2\": {\n try {\n // Match block_pack.ts prepare exactly: convert the file: URL at this\n // edge, load the same description, feed the same inputs to the shared\n // mtime helper — so the recomputed value is byte-identical to what\n // prepare baked into cSpec.mtime.\n const packDir = fileURLToPath(cSpec.packUrl);\n const description = await loadPackDescriptionFromManifest(packDir);\n const mtime = await getFromPackV2Mtime(packDir, description.components.ui.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 \"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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"}
@@ -27,5 +27,5 @@ declare class BlockUpdateWatcher extends PollComputablePool<CheckForUpdateReques
27
27
  protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean;
28
28
  }
29
29
  //#endregion
30
- export { BlockUpdateWatcher };
30
+ export { BlockUpdateWatcher, BlockUpdateWatcherOps, CheckForUpdateRequest, CheckForUpdateResponse };
31
31
  //# sourceMappingURL=watcher.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/block_registry/watcher.ts"],"mappings":";;;;;;;KA6BY,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,KAGb,sBAAA;EACV,WAAA,EAAa,iBAAA;EACb,cAAA,GAAiB,aAAa;AAAA;AAAA,cAGnB,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,UAeN,SAAA,CAAU,GAAA,EAAK,qBAAA,GAAwB,OAAA,CAAQ,sBAAA;EAAA,UAgIrD,YAAA,CAAa,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,sBAAA;AAAA"}
@@ -1,13 +1,15 @@
1
- import { getDevV1PacketMtime, getDevV2PacketMtime } from "./registry.js";
1
+ import { getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime } from "./registry.js";
2
2
  import { AnyChannel, StableChannel, blockPackIdToString } from "@milaboratories/pl-model-middle-layer";
3
- import { tryLoadPackDescription } from "@platforma-sdk/block-tools";
3
+ import { loadPackDescriptionFromManifest, tryLoadPackDescription } from "@platforma-sdk/block-tools";
4
4
  import { PollComputablePool } from "@milaboratories/computable";
5
+ import { fileURLToPath } from "node:url";
5
6
  import canonicalize from "canonicalize";
6
7
  import * as semver from "semver";
7
8
  //#region src/block_registry/watcher.ts
8
9
  const DefaultBlockUpdateWatcherOps = { minDelay: 1500 };
9
10
  const NoUpdatesKey = "__no_updates__";
10
11
  var BlockUpdateWatcher = class extends PollComputablePool {
12
+ registryProvider;
11
13
  http;
12
14
  preferredUpdateChannel;
13
15
  constructor(registryProvider, logger, ops = {}) {
@@ -23,6 +25,7 @@ var BlockUpdateWatcher = class extends PollComputablePool {
23
25
  switch (req.currentSpec.type) {
24
26
  case "dev-v1": return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;
25
27
  case "dev-v2": return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;
28
+ case "from-pack-v2": return `from_pack_v2_${req.currentSpec.packUrl}_${req.currentSpec.mtime}`;
26
29
  case "from-registry-v2": return `from_registry_v2_${canonicalize(req)}`;
27
30
  default: return NoUpdatesKey;
28
31
  }
@@ -61,6 +64,21 @@ var BlockUpdateWatcher = class extends PollComputablePool {
61
64
  this.logger.warn(err);
62
65
  return { suggestions: [] };
63
66
  }
67
+ case "from-pack-v2": try {
68
+ const packDir = fileURLToPath(cSpec.packUrl);
69
+ const mtime = await getFromPackV2Mtime(packDir, (await loadPackDescriptionFromManifest(packDir)).components.ui.folder);
70
+ if (mtime === cSpec.mtime) return { suggestions: [] };
71
+ else return {
72
+ mainSuggestion: {
73
+ ...cSpec,
74
+ mtime
75
+ },
76
+ suggestions: []
77
+ };
78
+ } catch (err) {
79
+ this.logger.warn(err);
80
+ return { suggestions: [] };
81
+ }
64
82
  case "from-registry-v2": try {
65
83
  const { versionLock, skipVersion } = req.settings;
66
84
  if (versionLock === "patch") return { suggestions: [] };
@@ -136,6 +154,6 @@ var BlockUpdateWatcher = class extends PollComputablePool {
136
154
  }
137
155
  };
138
156
  //#endregion
139
- export { BlockUpdateWatcher };
157
+ export { BlockUpdateWatcher, DefaultBlockUpdateWatcherOps };
140
158
 
141
159
  //# 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, getFromPackV2Mtime } from \"./registry\";\nimport {\n loadPackDescriptionFromManifest,\n tryLoadPackDescription,\n} from \"@platforma-sdk/block-tools\";\nimport { fileURLToPath } from \"node:url\";\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-pack-v2\":\n return `from_pack_v2_${req.currentSpec.packUrl}_${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-pack-v2\": {\n try {\n // Match block_pack.ts prepare exactly: convert the file: URL at this\n // edge, load the same description, feed the same inputs to the shared\n // mtime helper — so the recomputed value is byte-identical to what\n // prepare baked into cSpec.mtime.\n const packDir = fileURLToPath(cSpec.packUrl);\n const description = await loadPackDescriptionFromManifest(packDir);\n const mtime = await getFromPackV2Mtime(packDir, description.components.ui.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 \"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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"}