@milaboratories/pl-middle-layer 1.55.1 → 1.55.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.114.0 → _@oxc-project_runtime@0.123.0}/helpers/usingCtx.cjs +2 -4
  2. package/dist/_virtual/{_@oxc-project_runtime@0.114.0 → _@oxc-project_runtime@0.123.0}/helpers/usingCtx.js +2 -3
  3. package/dist/_virtual/_rolldown/runtime.cjs +7 -13
  4. package/dist/block_registry/index.cjs +3 -3
  5. package/dist/block_registry/index.js +3 -3
  6. package/dist/block_registry/registry-v2-provider.cjs +2 -3
  7. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  8. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -0
  9. package/dist/block_registry/registry-v2-provider.js +1 -2
  10. package/dist/block_registry/registry-v2-provider.js.map +1 -1
  11. package/dist/block_registry/registry.cjs +3 -4
  12. package/dist/block_registry/registry.cjs.map +1 -1
  13. package/dist/block_registry/registry.d.ts.map +1 -0
  14. package/dist/block_registry/registry.js +1 -2
  15. package/dist/block_registry/registry.js.map +1 -1
  16. package/dist/block_registry/watcher.cjs +3 -4
  17. package/dist/block_registry/watcher.cjs.map +1 -1
  18. package/dist/block_registry/watcher.d.ts.map +1 -0
  19. package/dist/block_registry/watcher.js +1 -2
  20. package/dist/block_registry/watcher.js.map +1 -1
  21. package/dist/block_registry/well_known_registries.cjs +1 -2
  22. package/dist/block_registry/well_known_registries.cjs.map +1 -1
  23. package/dist/block_registry/well_known_registries.d.ts.map +1 -0
  24. package/dist/block_registry/well_known_registries.js +1 -1
  25. package/dist/cfg_render/executor.cjs +4 -5
  26. package/dist/cfg_render/executor.cjs.map +1 -1
  27. package/dist/cfg_render/executor.js +1 -2
  28. package/dist/cfg_render/executor.js.map +1 -1
  29. package/dist/cfg_render/renderer.cjs +4 -5
  30. package/dist/cfg_render/renderer.cjs.map +1 -1
  31. package/dist/cfg_render/renderer.js +1 -2
  32. package/dist/cfg_render/renderer.js.map +1 -1
  33. package/dist/cfg_render/traverse.cjs +2 -3
  34. package/dist/cfg_render/traverse.cjs.map +1 -1
  35. package/dist/cfg_render/traverse.js +1 -2
  36. package/dist/cfg_render/traverse.js.map +1 -1
  37. package/dist/cfg_render/util.cjs +2 -3
  38. package/dist/cfg_render/util.cjs.map +1 -1
  39. package/dist/cfg_render/util.js +1 -2
  40. package/dist/cfg_render/util.js.map +1 -1
  41. package/dist/debug/index.cjs +1 -2
  42. package/dist/debug/index.cjs.map +1 -1
  43. package/dist/debug/index.js +1 -1
  44. package/dist/debug/index.js.map +1 -1
  45. package/dist/dev_env/index.cjs +3 -4
  46. package/dist/dev_env/index.cjs.map +1 -1
  47. package/dist/dev_env/index.js +1 -2
  48. package/dist/dev_env/index.js.map +1 -1
  49. package/dist/dev_env/util.cjs +2 -3
  50. package/dist/dev_env/util.cjs.map +1 -1
  51. package/dist/dev_env/util.js +1 -2
  52. package/dist/dev_env/util.js.map +1 -1
  53. package/dist/index.cjs +48 -44
  54. package/dist/index.d.ts +0 -3
  55. package/dist/index.js +5 -10
  56. package/dist/js_render/computable_context.cjs +5 -6
  57. package/dist/js_render/computable_context.cjs.map +1 -1
  58. package/dist/js_render/computable_context.js +2 -3
  59. package/dist/js_render/computable_context.js.map +1 -1
  60. package/dist/js_render/context.cjs +3 -4
  61. package/dist/js_render/context.cjs.map +1 -1
  62. package/dist/js_render/context.js +1 -2
  63. package/dist/js_render/context.js.map +1 -1
  64. package/dist/js_render/index.cjs +4 -5
  65. package/dist/js_render/index.cjs.map +1 -1
  66. package/dist/js_render/index.js +1 -2
  67. package/dist/js_render/index.js.map +1 -1
  68. package/dist/js_render/service_injectors.cjs +3 -4
  69. package/dist/js_render/service_injectors.cjs.map +1 -1
  70. package/dist/js_render/service_injectors.js +2 -3
  71. package/dist/js_render/service_injectors.js.map +1 -1
  72. package/dist/middle_layer/active_cfg.cjs +7 -8
  73. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  74. package/dist/middle_layer/active_cfg.js +1 -2
  75. package/dist/middle_layer/active_cfg.js.map +1 -1
  76. package/dist/middle_layer/block.cjs +8 -9
  77. package/dist/middle_layer/block.cjs.map +1 -1
  78. package/dist/middle_layer/block.js +1 -2
  79. package/dist/middle_layer/block.js.map +1 -1
  80. package/dist/middle_layer/block_ctx.cjs +5 -6
  81. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  82. package/dist/middle_layer/block_ctx.js +1 -2
  83. package/dist/middle_layer/block_ctx.js.map +1 -1
  84. package/dist/middle_layer/block_ctx_unsafe.cjs +1 -2
  85. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  86. package/dist/middle_layer/block_ctx_unsafe.js +1 -1
  87. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  88. package/dist/middle_layer/driver_kit.cjs +5 -6
  89. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  90. package/dist/middle_layer/driver_kit.d.ts +0 -1
  91. package/dist/middle_layer/driver_kit.d.ts.map +1 -0
  92. package/dist/middle_layer/driver_kit.js +1 -2
  93. package/dist/middle_layer/driver_kit.js.map +1 -1
  94. package/dist/middle_layer/frontend_path.cjs +6 -7
  95. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  96. package/dist/middle_layer/frontend_path.js +1 -2
  97. package/dist/middle_layer/frontend_path.js.map +1 -1
  98. package/dist/middle_layer/index.cjs +5 -5
  99. package/dist/middle_layer/index.js +5 -5
  100. package/dist/middle_layer/middle_layer.cjs +15 -16
  101. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  102. package/dist/middle_layer/middle_layer.d.ts +0 -2
  103. package/dist/middle_layer/middle_layer.d.ts.map +1 -0
  104. package/dist/middle_layer/middle_layer.js +1 -2
  105. package/dist/middle_layer/middle_layer.js.map +1 -1
  106. package/dist/middle_layer/navigation_states.cjs +2 -3
  107. package/dist/middle_layer/navigation_states.cjs.map +1 -1
  108. package/dist/middle_layer/navigation_states.js +1 -2
  109. package/dist/middle_layer/navigation_states.js.map +1 -1
  110. package/dist/middle_layer/ops.cjs +5 -7
  111. package/dist/middle_layer/ops.cjs.map +1 -1
  112. package/dist/middle_layer/ops.d.ts +0 -1
  113. package/dist/middle_layer/ops.d.ts.map +1 -0
  114. package/dist/middle_layer/ops.js +1 -2
  115. package/dist/middle_layer/ops.js.map +1 -1
  116. package/dist/middle_layer/project.cjs +12 -13
  117. package/dist/middle_layer/project.cjs.map +1 -1
  118. package/dist/middle_layer/project.d.ts +0 -1
  119. package/dist/middle_layer/project.d.ts.map +1 -0
  120. package/dist/middle_layer/project.js +1 -2
  121. package/dist/middle_layer/project.js.map +1 -1
  122. package/dist/middle_layer/project_list.cjs +3 -4
  123. package/dist/middle_layer/project_list.cjs.map +1 -1
  124. package/dist/middle_layer/project_list.d.ts +0 -4
  125. package/dist/middle_layer/project_list.d.ts.map +1 -0
  126. package/dist/middle_layer/project_list.js +1 -2
  127. package/dist/middle_layer/project_list.js.map +1 -1
  128. package/dist/middle_layer/project_overview.cjs +9 -10
  129. package/dist/middle_layer/project_overview.cjs.map +1 -1
  130. package/dist/middle_layer/project_overview.js +1 -2
  131. package/dist/middle_layer/project_overview.js.map +1 -1
  132. package/dist/middle_layer/project_overview_light.cjs +4 -5
  133. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  134. package/dist/middle_layer/project_overview_light.js +1 -2
  135. package/dist/middle_layer/project_overview_light.js.map +1 -1
  136. package/dist/middle_layer/render.cjs +5 -6
  137. package/dist/middle_layer/render.cjs.map +1 -1
  138. package/dist/middle_layer/render.js +1 -2
  139. package/dist/middle_layer/render.js.map +1 -1
  140. package/dist/middle_layer/types.d.ts.map +1 -0
  141. package/dist/middle_layer/util.cjs +4 -5
  142. package/dist/middle_layer/util.cjs.map +1 -1
  143. package/dist/middle_layer/util.js +1 -2
  144. package/dist/middle_layer/util.js.map +1 -1
  145. package/dist/model/args.cjs +2 -3
  146. package/dist/model/args.cjs.map +1 -1
  147. package/dist/model/args.js +1 -2
  148. package/dist/model/args.js.map +1 -1
  149. package/dist/model/block_pack_spec.cjs +1 -2
  150. package/dist/model/block_pack_spec.cjs.map +1 -1
  151. package/dist/model/block_pack_spec.d.ts.map +1 -0
  152. package/dist/model/block_pack_spec.js +1 -1
  153. package/dist/model/frontend.d.ts.map +1 -0
  154. package/dist/model/project_helper.cjs +3 -4
  155. package/dist/model/project_helper.cjs.map +1 -1
  156. package/dist/model/project_helper.d.ts.map +1 -0
  157. package/dist/model/project_helper.js +1 -2
  158. package/dist/model/project_helper.js.map +1 -1
  159. package/dist/model/project_model.cjs +1 -6
  160. package/dist/model/project_model.cjs.map +1 -1
  161. package/dist/model/project_model.d.ts +0 -1
  162. package/dist/model/project_model.d.ts.map +1 -0
  163. package/dist/model/project_model.js +2 -4
  164. package/dist/model/project_model.js.map +1 -1
  165. package/dist/model/project_model_util.cjs +2 -3
  166. package/dist/model/project_model_util.cjs.map +1 -1
  167. package/dist/model/project_model_util.js +1 -2
  168. package/dist/model/project_model_util.js.map +1 -1
  169. package/dist/model/project_model_v1.cjs +1 -5
  170. package/dist/model/project_model_v1.cjs.map +1 -1
  171. package/dist/model/project_model_v1.js +2 -4
  172. package/dist/model/project_model_v1.js.map +1 -1
  173. package/dist/model/template_spec.d.ts.map +1 -0
  174. package/dist/mutator/block-pack/block_pack.cjs +9 -10
  175. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  176. package/dist/mutator/block-pack/block_pack.d.ts +0 -1
  177. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -0
  178. package/dist/mutator/block-pack/block_pack.js +2 -3
  179. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  180. package/dist/mutator/block-pack/frontend.cjs +3 -4
  181. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  182. package/dist/mutator/block-pack/frontend.js +1 -2
  183. package/dist/mutator/block-pack/frontend.js.map +1 -1
  184. package/dist/mutator/context_export.cjs +4 -5
  185. package/dist/mutator/context_export.cjs.map +1 -1
  186. package/dist/mutator/context_export.js +1 -2
  187. package/dist/mutator/context_export.js.map +1 -1
  188. package/dist/mutator/migration.cjs +13 -14
  189. package/dist/mutator/migration.cjs.map +1 -1
  190. package/dist/mutator/migration.js +11 -12
  191. package/dist/mutator/migration.js.map +1 -1
  192. package/dist/mutator/project.cjs +13 -14
  193. package/dist/mutator/project.cjs.map +1 -1
  194. package/dist/mutator/project.d.ts +0 -3
  195. package/dist/mutator/project.d.ts.map +1 -0
  196. package/dist/mutator/project.js +6 -7
  197. package/dist/mutator/project.js.map +1 -1
  198. package/dist/mutator/template/direct_template_loader.cjs +3 -4
  199. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  200. package/dist/mutator/template/direct_template_loader.js +1 -2
  201. package/dist/mutator/template/direct_template_loader.js.map +1 -1
  202. package/dist/mutator/template/direct_template_loader_v3.cjs +2 -3
  203. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  204. package/dist/mutator/template/direct_template_loader_v3.js +1 -2
  205. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -1
  206. package/dist/mutator/template/render_block.cjs +4 -6
  207. package/dist/mutator/template/render_block.cjs.map +1 -1
  208. package/dist/mutator/template/render_block.js +2 -4
  209. package/dist/mutator/template/render_block.js.map +1 -1
  210. package/dist/mutator/template/render_template.cjs +2 -3
  211. package/dist/mutator/template/render_template.cjs.map +1 -1
  212. package/dist/mutator/template/render_template.d.ts.map +1 -0
  213. package/dist/mutator/template/render_template.js +1 -2
  214. package/dist/mutator/template/render_template.js.map +1 -1
  215. package/dist/mutator/template/template_cache.cjs +6 -10
  216. package/dist/mutator/template/template_cache.cjs.map +1 -1
  217. package/dist/mutator/template/template_cache.d.ts +2 -3
  218. package/dist/mutator/template/template_cache.d.ts.map +1 -0
  219. package/dist/mutator/template/template_cache.js +4 -8
  220. package/dist/mutator/template/template_cache.js.map +1 -1
  221. package/dist/mutator/template/template_loading.cjs +3 -4
  222. package/dist/mutator/template/template_loading.cjs.map +1 -1
  223. package/dist/mutator/template/template_loading.d.ts.map +1 -0
  224. package/dist/mutator/template/template_loading.js +1 -2
  225. package/dist/mutator/template/template_loading.js.map +1 -1
  226. package/dist/network_check/network_check.cjs +4 -5
  227. package/dist/network_check/network_check.cjs.map +1 -1
  228. package/dist/network_check/network_check.d.ts.map +1 -0
  229. package/dist/network_check/network_check.js +1 -2
  230. package/dist/network_check/network_check.js.map +1 -1
  231. package/dist/network_check/pings.cjs +2 -3
  232. package/dist/network_check/pings.cjs.map +1 -1
  233. package/dist/network_check/pings.js +1 -2
  234. package/dist/network_check/pings.js.map +1 -1
  235. package/dist/network_check/template.cjs +4 -5
  236. package/dist/network_check/template.cjs.map +1 -1
  237. package/dist/network_check/template.js +1 -2
  238. package/dist/network_check/template.js.map +1 -1
  239. package/dist/pool/data.cjs +2 -3
  240. package/dist/pool/data.cjs.map +1 -1
  241. package/dist/pool/data.d.ts +0 -1
  242. package/dist/pool/data.d.ts.map +1 -0
  243. package/dist/pool/data.js +1 -2
  244. package/dist/pool/data.js.map +1 -1
  245. package/dist/pool/driver.cjs +3 -4
  246. package/dist/pool/driver.cjs.map +1 -1
  247. package/dist/pool/driver.d.ts +0 -1
  248. package/dist/pool/driver.d.ts.map +1 -0
  249. package/dist/pool/driver.js +1 -2
  250. package/dist/pool/driver.js.map +1 -1
  251. package/dist/pool/index.cjs +2 -2
  252. package/dist/pool/index.d.ts +1 -2
  253. package/dist/pool/index.js +2 -2
  254. package/dist/pool/p_object_collection.cjs +3 -4
  255. package/dist/pool/p_object_collection.cjs.map +1 -1
  256. package/dist/pool/p_object_collection.d.ts.map +1 -0
  257. package/dist/pool/p_object_collection.js +1 -2
  258. package/dist/pool/p_object_collection.js.map +1 -1
  259. package/dist/pool/result_pool.cjs +7 -8
  260. package/dist/pool/result_pool.cjs.map +1 -1
  261. package/dist/pool/result_pool.d.ts +1 -3
  262. package/dist/pool/result_pool.js +1 -2
  263. package/dist/pool/result_pool.js.map +1 -1
  264. package/dist/service_factories.cjs +2 -3
  265. package/dist/service_factories.cjs.map +1 -1
  266. package/dist/service_factories.js +1 -2
  267. package/dist/service_factories.js.map +1 -1
  268. package/dist/worker/WorkerManager.cjs +2 -3
  269. package/dist/worker/WorkerManager.cjs.map +1 -1
  270. package/dist/worker/WorkerManager.js +1 -2
  271. package/dist/worker/WorkerManager.js.map +1 -1
  272. package/dist/worker/worker.cjs +3 -4
  273. package/dist/worker/worker.cjs.map +1 -1
  274. package/dist/worker/worker.js +1 -2
  275. package/dist/worker/worker.js.map +1 -1
  276. package/dist/worker/workerApi.cjs +2 -3
  277. package/dist/worker/workerApi.cjs.map +1 -1
  278. package/dist/worker/workerApi.js +1 -2
  279. package/dist/worker/workerApi.js.map +1 -1
  280. package/package.json +19 -19
@@ -1,11 +1,10 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_project_model = require('../model/project_model.cjs');
3
- const require_project_model_util = require('../model/project_model_util.cjs');
4
- const require_project_model_v1 = require('../model/project_model_v1.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_project_model = require("../model/project_model.cjs");
3
+ const require_project_model_util = require("../model/project_model_util.cjs");
4
+ const require_project_model_v1 = require("../model/project_model_v1.cjs");
5
5
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
6
6
  let _milaboratories_pl_client = require("@milaboratories/pl-client");
7
7
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
8
-
9
8
  //#region src/mutator/migration.ts
10
9
  /**
11
10
  * Migrates the project to the latest schema version.
@@ -16,18 +15,18 @@ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common")
16
15
  async function applyProjectMigrations(pl, rid) {
17
16
  await pl.withWriteTx("ProjectMigration", async (tx) => {
18
17
  let schemaVersion = await tx.getKValueJson(rid, require_project_model.SchemaVersionKey);
19
- if (schemaVersion === require_project_model.SchemaVersionCurrent) return;
20
- if (schemaVersion === require_project_model_v1.SchemaVersionV1) {
18
+ if (schemaVersion === "4") return;
19
+ if (schemaVersion === "1") {
21
20
  await migrateV1ToV2(tx, rid);
22
- schemaVersion = require_project_model.SchemaVersionV2;
21
+ schemaVersion = "2";
23
22
  }
24
- if (schemaVersion === require_project_model.SchemaVersionV2) {
23
+ if (schemaVersion === "2") {
25
24
  await migrateV2ToV3(tx, rid);
26
- schemaVersion = require_project_model.SchemaVersionV3;
25
+ schemaVersion = "3";
27
26
  }
28
- if (schemaVersion === require_project_model.SchemaVersionV3) schemaVersion = require_project_model.SchemaVersionCurrent;
29
- if (schemaVersion !== require_project_model.SchemaVersionCurrent) throw new _milaboratories_pl_model_common.UiError(`This project was created with a newer version of Platforma. Please update to the latest version to open it.`);
30
- tx.setKValue(rid, require_project_model.SchemaVersionKey, JSON.stringify(require_project_model.SchemaVersionCurrent));
27
+ if (schemaVersion === "3") schemaVersion = "4";
28
+ if (schemaVersion !== "4") throw new _milaboratories_pl_model_common.UiError(`This project was created with a newer version of Platforma. Please update to the latest version to open it.`);
29
+ tx.setKValue(rid, require_project_model.SchemaVersionKey, JSON.stringify("4"));
31
30
  await tx.commit();
32
31
  });
33
32
  }
@@ -97,7 +96,7 @@ async function migrateV2ToV3(tx, rid) {
97
96
  }
98
97
  }
99
98
  }
100
-
101
99
  //#endregion
102
100
  exports.applyProjectMigrations = applyProjectMigrations;
101
+
103
102
  //# sourceMappingURL=migration.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"migration.cjs","names":["SchemaVersionKey","SchemaVersionCurrent","SchemaVersionV1","SchemaVersionV2","SchemaVersionV3","UiError","ProjectStructureKey","allBlocks","BlockFrontendStateKeyPrefixV1","projectFieldName"],"sources":["../../src/mutator/migration.ts"],"sourcesContent":["import { UiError } from \"@milaboratories/pl-model-common\";\nimport type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n SchemaVersionV3,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n schemaVersion = SchemaVersionV3;\n }\n\n if (schemaVersion === SchemaVersionV3) {\n // V3 → V4: production context chain + staging re-render.\n // The actual chain building and staging reset happens in fixProblemsAndMigrate()\n // (called from ProjectMutator.load). This migration step just bumps the schema\n // to prevent older clients from operating on the new project structure.\n schemaVersion = SchemaVersionCurrent;\n }\n\n if (schemaVersion !== SchemaVersionCurrent) {\n throw new UiError(\n `This project was created with a newer version of Platforma. Please update to the latest version to open it.`,\n );\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n\n // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)\n if (currentArgsRid) {\n const prerunArgsR = tx.createJsonGzValue(args);\n const prerunArgsF = field(rid, projectFieldName(block.id, \"currentPrerunArgs\"));\n tx.createField(prerunArgsF, \"Dynamic\", prerunArgsR);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,eAAsB,uBAAuB,IAAc,KAAiB;AAC1E,OAAM,GAAG,YAAY,oBAAoB,OAAO,OAAO;EACrD,IAAI,gBAAgB,MAAM,GAAG,cAAsB,KAAKA,uCAAiB;AACzE,MAAI,kBAAkBC,2CAAsB;AAG5C,MAAI,kBAAkBC,0CAAiB;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAgBC;;AAGlB,MAAI,kBAAkBA,uCAAiB;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAgBC;;AAGlB,MAAI,kBAAkBA,sCAKpB,iBAAgBH;AAGlB,MAAI,kBAAkBA,2CACpB,OAAM,IAAII,wCACR,8GACD;AAGH,KAAG,UAAU,KAAKL,wCAAkB,KAAK,UAAUC,2CAAqB,CAAC;AACzE,QAAM,GAAG,QAAQ;GACjB;;;;;;;;;;;AAYJ,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,SAAS,MAAM,QAAQ,IAAI,CAC3C,GAAG,cAAgC,KAAKK,0CAAoB,EAC5D,GAAG,cAAc,IAAI,CACtB,CAAC;CACF,MAAM,QAAQ,IAAI,IAAwB,MAAM,KAAK,OAAO,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;AAChF,MAAK,MAAM,SAASC,qCAAU,UAAU,EAAE;EACxC,MAAM,QAAQC,yDAAgC,MAAM;EACpD,MAAM,UAAU,MAAM,IAAI,MAAM;EAChC,MAAM,YAAY,4DAA4B,QAAQ,GAAG,EAAE;EAC3D,MAAM,WAAW,GAAG,kBAAkB,UAAU;EAChD,MAAM,gDAAiB,KAAKC,uCAAiB,MAAM,IAAI,eAAe,CAAC;AACvE,KAAG,YAAY,UAAU,WAAW,SAAS;AAC7C,KAAG,aAAa,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;AAqB/B,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,qBAAqB,MAAM,QAAQ,IAAI,CACvD,GAAG,cAAgC,KAAKH,0CAAoB,EAC5D,GAAG,gBAAgB,KAAK,KAAK,CAC9B,CAAC;CAGF,MAAM,2BAAW,IAAI,KAAyB;AAC9C,MAAK,MAAM,KAAK,kBAAkB,OAChC,KAAI,iDAAkB,EAAE,MAAM,CAC5B,UAAS,IAAI,EAAE,MAAM,EAAE,MAAM;AAIjC,MAAK,MAAM,SAASC,qCAAU,UAAU,EAAE;EAExC,MAAM,mBAAmBE,uCAAiB,MAAM,IAAI,UAAuC;EAC3F,MAAM,uBAAuBA,uCAAiB,MAAM,IAAI,cAAc;EAEtE,MAAM,aAAa,SAAS,IAAI,iBAAiB;EACjD,MAAM,iBAAiB,SAAS,IAAI,qBAAqB;EAGzD,MAAM,CAAC,aAAa,mBAAmB,MAAM,QAAQ,IAAI,CACvD,aAAa,GAAG,gBAAgB,YAAY,MAAM,GAAG,QAAQ,QAAQ,OAAU,EAC/E,iBAAiB,GAAG,gBAAgB,gBAAgB,MAAM,GAAG,QAAQ,QAAQ,OAAU,CACxF,CAAC;EAGF,MAAM,UAAU,aAAa,yDAAyB,YAAY,KAAK,GAAG,EAAE;EAC5E,MAAM,OAAO,iBAAiB,yDAAyB,gBAAgB,KAAK,GAAG,EAAE;EAGjF,MAAM,eAAe;GACnB;GACA;GACD;EAED,MAAM,wBAAwBA,uCAAiB,MAAM,IAAI,eAAe;EAGxE,MAAM,SAAS,GAAG,kBAAkB,aAAa;EACjD,MAAM,8CAAe,KAAK,sBAAsB;AAChD,KAAG,YAAY,QAAQ,WAAW,OAAO;AAGzC,MAAI,gBAAgB;GAClB,MAAM,cAAc,GAAG,kBAAkB,KAAK;GAC9C,MAAM,mDAAoB,KAAKA,uCAAiB,MAAM,IAAI,oBAAoB,CAAC;AAC/E,MAAG,YAAY,aAAa,WAAW,YAAY"}
1
+ {"version":3,"file":"migration.cjs","names":["SchemaVersionKey","UiError","ProjectStructureKey","allBlocks","BlockFrontendStateKeyPrefixV1","projectFieldName"],"sources":["../../src/mutator/migration.ts"],"sourcesContent":["import { UiError } from \"@milaboratories/pl-model-common\";\nimport type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n SchemaVersionV3,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n schemaVersion = SchemaVersionV3;\n }\n\n if (schemaVersion === SchemaVersionV3) {\n // V3 → V4: production context chain + staging re-render.\n // The actual chain building and staging reset happens in fixProblemsAndMigrate()\n // (called from ProjectMutator.load). This migration step just bumps the schema\n // to prevent older clients from operating on the new project structure.\n schemaVersion = SchemaVersionCurrent;\n }\n\n if (schemaVersion !== SchemaVersionCurrent) {\n throw new UiError(\n `This project was created with a newer version of Platforma. Please update to the latest version to open it.`,\n );\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n\n // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)\n if (currentArgsRid) {\n const prerunArgsR = tx.createJsonGzValue(args);\n const prerunArgsF = field(rid, projectFieldName(block.id, \"currentPrerunArgs\"));\n tx.createField(prerunArgsF, \"Dynamic\", prerunArgsR);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAsBA,eAAsB,uBAAuB,IAAc,KAAiB;AAC1E,OAAM,GAAG,YAAY,oBAAoB,OAAO,OAAO;EACrD,IAAI,gBAAgB,MAAM,GAAG,cAAsB,KAAKA,sBAAAA,iBAAiB;AACzE,MAAI,kBAAA,IAAwC;AAG5C,MAAI,kBAAA,KAAmC;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAA;;AAGF,MAAI,kBAAA,KAAmC;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAA;;AAGF,MAAI,kBAAA,IAKF,iBAAA;AAGF,MAAI,kBAAA,IACF,OAAM,IAAIC,gCAAAA,QACR,8GACD;AAGH,KAAG,UAAU,KAAKD,sBAAAA,kBAAkB,KAAK,UAAA,IAA+B,CAAC;AACzE,QAAM,GAAG,QAAQ;GACjB;;;;;;;;;;;AAYJ,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,SAAS,MAAM,QAAQ,IAAI,CAC3C,GAAG,cAAgC,KAAKE,sBAAAA,oBAAoB,EAC5D,GAAG,cAAc,IAAI,CACtB,CAAC;CACF,MAAM,QAAQ,IAAI,IAAwB,MAAM,KAAK,OAAO,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;AAChF,MAAK,MAAM,SAASC,2BAAAA,UAAU,UAAU,EAAE;EACxC,MAAM,QAAQC,yBAAAA,gCAAgC,MAAM;EACpD,MAAM,UAAU,MAAM,IAAI,MAAM;EAChC,MAAM,YAAY,WAAA,GAAA,2BAAA,mBAA4B,QAAQ,GAAG,EAAE;EAC3D,MAAM,WAAW,GAAG,kBAAkB,UAAU;EAChD,MAAM,YAAA,GAAA,0BAAA,OAAiB,KAAKC,sBAAAA,iBAAiB,MAAM,IAAI,eAAe,CAAC;AACvE,KAAG,YAAY,UAAU,WAAW,SAAS;AAC7C,KAAG,aAAa,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;AAqB/B,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,qBAAqB,MAAM,QAAQ,IAAI,CACvD,GAAG,cAAgC,KAAKH,sBAAAA,oBAAoB,EAC5D,GAAG,gBAAgB,KAAK,KAAK,CAC9B,CAAC;CAGF,MAAM,2BAAW,IAAI,KAAyB;AAC9C,MAAK,MAAM,KAAK,kBAAkB,OAChC,KAAI,EAAA,GAAA,0BAAA,kBAAkB,EAAE,MAAM,CAC5B,UAAS,IAAI,EAAE,MAAM,EAAE,MAAM;AAIjC,MAAK,MAAM,SAASC,2BAAAA,UAAU,UAAU,EAAE;EAExC,MAAM,mBAAmBE,sBAAAA,iBAAiB,MAAM,IAAI,UAAuC;EAC3F,MAAM,uBAAuBA,sBAAAA,iBAAiB,MAAM,IAAI,cAAc;EAEtE,MAAM,aAAa,SAAS,IAAI,iBAAiB;EACjD,MAAM,iBAAiB,SAAS,IAAI,qBAAqB;EAGzD,MAAM,CAAC,aAAa,mBAAmB,MAAM,QAAQ,IAAI,CACvD,aAAa,GAAG,gBAAgB,YAAY,MAAM,GAAG,QAAQ,QAAQ,KAAA,EAAU,EAC/E,iBAAiB,GAAG,gBAAgB,gBAAgB,MAAM,GAAG,QAAQ,QAAQ,KAAA,EAAU,CACxF,CAAC;EAGF,MAAM,UAAU,aAAa,QAAA,GAAA,2BAAA,mBAAyB,YAAY,KAAK,GAAG,EAAE;EAC5E,MAAM,OAAO,iBAAiB,QAAA,GAAA,2BAAA,mBAAyB,gBAAgB,KAAK,GAAG,EAAE;EAGjF,MAAM,eAAe;GACnB;GACA;GACD;EAED,MAAM,wBAAwBA,sBAAAA,iBAAiB,MAAM,IAAI,eAAe;EAGxE,MAAM,SAAS,GAAG,kBAAkB,aAAa;EACjD,MAAM,UAAA,GAAA,0BAAA,OAAe,KAAK,sBAAsB;AAChD,KAAG,YAAY,QAAQ,WAAW,OAAO;AAGzC,MAAI,gBAAgB;GAClB,MAAM,cAAc,GAAG,kBAAkB,KAAK;GAC9C,MAAM,eAAA,GAAA,0BAAA,OAAoB,KAAKA,sBAAAA,iBAAiB,MAAM,IAAI,oBAAoB,CAAC;AAC/E,MAAG,YAAY,aAAa,WAAW,YAAY"}
@@ -1,10 +1,9 @@
1
- import { ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey, SchemaVersionV2, SchemaVersionV3, projectFieldName } from "../model/project_model.js";
1
+ import { ProjectStructureKey, SchemaVersionKey, projectFieldName } from "../model/project_model.js";
2
2
  import { allBlocks } from "../model/project_model_util.js";
3
- import { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from "../model/project_model_v1.js";
3
+ import { BlockFrontendStateKeyPrefixV1 } from "../model/project_model_v1.js";
4
4
  import { cachedDeserialize } from "@milaboratories/ts-helpers";
5
5
  import { field, isNullResourceId } from "@milaboratories/pl-client";
6
6
  import { UiError } from "@milaboratories/pl-model-common";
7
-
8
7
  //#region src/mutator/migration.ts
9
8
  /**
10
9
  * Migrates the project to the latest schema version.
@@ -15,18 +14,18 @@ import { UiError } from "@milaboratories/pl-model-common";
15
14
  async function applyProjectMigrations(pl, rid) {
16
15
  await pl.withWriteTx("ProjectMigration", async (tx) => {
17
16
  let schemaVersion = await tx.getKValueJson(rid, SchemaVersionKey);
18
- if (schemaVersion === SchemaVersionCurrent) return;
19
- if (schemaVersion === SchemaVersionV1) {
17
+ if (schemaVersion === "4") return;
18
+ if (schemaVersion === "1") {
20
19
  await migrateV1ToV2(tx, rid);
21
- schemaVersion = SchemaVersionV2;
20
+ schemaVersion = "2";
22
21
  }
23
- if (schemaVersion === SchemaVersionV2) {
22
+ if (schemaVersion === "2") {
24
23
  await migrateV2ToV3(tx, rid);
25
- schemaVersion = SchemaVersionV3;
24
+ schemaVersion = "3";
26
25
  }
27
- if (schemaVersion === SchemaVersionV3) schemaVersion = SchemaVersionCurrent;
28
- if (schemaVersion !== SchemaVersionCurrent) throw new UiError(`This project was created with a newer version of Platforma. Please update to the latest version to open it.`);
29
- tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));
26
+ if (schemaVersion === "3") schemaVersion = "4";
27
+ if (schemaVersion !== "4") throw new UiError(`This project was created with a newer version of Platforma. Please update to the latest version to open it.`);
28
+ tx.setKValue(rid, SchemaVersionKey, JSON.stringify("4"));
30
29
  await tx.commit();
31
30
  });
32
31
  }
@@ -96,7 +95,7 @@ async function migrateV2ToV3(tx, rid) {
96
95
  }
97
96
  }
98
97
  }
99
-
100
98
  //#endregion
101
99
  export { applyProjectMigrations };
100
+
102
101
  //# sourceMappingURL=migration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migration.js","names":[],"sources":["../../src/mutator/migration.ts"],"sourcesContent":["import { UiError } from \"@milaboratories/pl-model-common\";\nimport type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n SchemaVersionV3,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n schemaVersion = SchemaVersionV3;\n }\n\n if (schemaVersion === SchemaVersionV3) {\n // V3 → V4: production context chain + staging re-render.\n // The actual chain building and staging reset happens in fixProblemsAndMigrate()\n // (called from ProjectMutator.load). This migration step just bumps the schema\n // to prevent older clients from operating on the new project structure.\n schemaVersion = SchemaVersionCurrent;\n }\n\n if (schemaVersion !== SchemaVersionCurrent) {\n throw new UiError(\n `This project was created with a newer version of Platforma. Please update to the latest version to open it.`,\n );\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n\n // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)\n if (currentArgsRid) {\n const prerunArgsR = tx.createJsonGzValue(args);\n const prerunArgsF = field(rid, projectFieldName(block.id, \"currentPrerunArgs\"));\n tx.createField(prerunArgsF, \"Dynamic\", prerunArgsR);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAsBA,eAAsB,uBAAuB,IAAc,KAAiB;AAC1E,OAAM,GAAG,YAAY,oBAAoB,OAAO,OAAO;EACrD,IAAI,gBAAgB,MAAM,GAAG,cAAsB,KAAK,iBAAiB;AACzE,MAAI,kBAAkB,qBAAsB;AAG5C,MAAI,kBAAkB,iBAAiB;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAgB;;AAGlB,MAAI,kBAAkB,iBAAiB;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAgB;;AAGlB,MAAI,kBAAkB,gBAKpB,iBAAgB;AAGlB,MAAI,kBAAkB,qBACpB,OAAM,IAAI,QACR,8GACD;AAGH,KAAG,UAAU,KAAK,kBAAkB,KAAK,UAAU,qBAAqB,CAAC;AACzE,QAAM,GAAG,QAAQ;GACjB;;;;;;;;;;;AAYJ,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,SAAS,MAAM,QAAQ,IAAI,CAC3C,GAAG,cAAgC,KAAK,oBAAoB,EAC5D,GAAG,cAAc,IAAI,CACtB,CAAC;CACF,MAAM,QAAQ,IAAI,IAAwB,MAAM,KAAK,OAAO,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;AAChF,MAAK,MAAM,SAAS,UAAU,UAAU,EAAE;EACxC,MAAM,QAAQ,gCAAgC,MAAM;EACpD,MAAM,UAAU,MAAM,IAAI,MAAM;EAChC,MAAM,YAAY,UAAU,kBAAkB,QAAQ,GAAG,EAAE;EAC3D,MAAM,WAAW,GAAG,kBAAkB,UAAU;EAChD,MAAM,WAAW,MAAM,KAAK,iBAAiB,MAAM,IAAI,eAAe,CAAC;AACvE,KAAG,YAAY,UAAU,WAAW,SAAS;AAC7C,KAAG,aAAa,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;AAqB/B,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,qBAAqB,MAAM,QAAQ,IAAI,CACvD,GAAG,cAAgC,KAAK,oBAAoB,EAC5D,GAAG,gBAAgB,KAAK,KAAK,CAC9B,CAAC;CAGF,MAAM,2BAAW,IAAI,KAAyB;AAC9C,MAAK,MAAM,KAAK,kBAAkB,OAChC,KAAI,CAAC,iBAAiB,EAAE,MAAM,CAC5B,UAAS,IAAI,EAAE,MAAM,EAAE,MAAM;AAIjC,MAAK,MAAM,SAAS,UAAU,UAAU,EAAE;EAExC,MAAM,mBAAmB,iBAAiB,MAAM,IAAI,UAAuC;EAC3F,MAAM,uBAAuB,iBAAiB,MAAM,IAAI,cAAc;EAEtE,MAAM,aAAa,SAAS,IAAI,iBAAiB;EACjD,MAAM,iBAAiB,SAAS,IAAI,qBAAqB;EAGzD,MAAM,CAAC,aAAa,mBAAmB,MAAM,QAAQ,IAAI,CACvD,aAAa,GAAG,gBAAgB,YAAY,MAAM,GAAG,QAAQ,QAAQ,OAAU,EAC/E,iBAAiB,GAAG,gBAAgB,gBAAgB,MAAM,GAAG,QAAQ,QAAQ,OAAU,CACxF,CAAC;EAGF,MAAM,UAAU,aAAa,OAAO,kBAAkB,YAAY,KAAK,GAAG,EAAE;EAC5E,MAAM,OAAO,iBAAiB,OAAO,kBAAkB,gBAAgB,KAAK,GAAG,EAAE;EAGjF,MAAM,eAAe;GACnB;GACA;GACD;EAED,MAAM,wBAAwB,iBAAiB,MAAM,IAAI,eAAe;EAGxE,MAAM,SAAS,GAAG,kBAAkB,aAAa;EACjD,MAAM,SAAS,MAAM,KAAK,sBAAsB;AAChD,KAAG,YAAY,QAAQ,WAAW,OAAO;AAGzC,MAAI,gBAAgB;GAClB,MAAM,cAAc,GAAG,kBAAkB,KAAK;GAC9C,MAAM,cAAc,MAAM,KAAK,iBAAiB,MAAM,IAAI,oBAAoB,CAAC;AAC/E,MAAG,YAAY,aAAa,WAAW,YAAY"}
1
+ {"version":3,"file":"migration.js","names":[],"sources":["../../src/mutator/migration.ts"],"sourcesContent":["import { UiError } from \"@milaboratories/pl-model-common\";\nimport type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n SchemaVersionV3,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n schemaVersion = SchemaVersionV3;\n }\n\n if (schemaVersion === SchemaVersionV3) {\n // V3 → V4: production context chain + staging re-render.\n // The actual chain building and staging reset happens in fixProblemsAndMigrate()\n // (called from ProjectMutator.load). This migration step just bumps the schema\n // to prevent older clients from operating on the new project structure.\n schemaVersion = SchemaVersionCurrent;\n }\n\n if (schemaVersion !== SchemaVersionCurrent) {\n throw new UiError(\n `This project was created with a newer version of Platforma. Please update to the latest version to open it.`,\n );\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n\n // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)\n if (currentArgsRid) {\n const prerunArgsR = tx.createJsonGzValue(args);\n const prerunArgsF = field(rid, projectFieldName(block.id, \"currentPrerunArgs\"));\n tx.createField(prerunArgsF, \"Dynamic\", prerunArgsR);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAsBA,eAAsB,uBAAuB,IAAc,KAAiB;AAC1E,OAAM,GAAG,YAAY,oBAAoB,OAAO,OAAO;EACrD,IAAI,gBAAgB,MAAM,GAAG,cAAsB,KAAK,iBAAiB;AACzE,MAAI,kBAAA,IAAwC;AAG5C,MAAI,kBAAA,KAAmC;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAA;;AAGF,MAAI,kBAAA,KAAmC;AACrC,SAAM,cAAc,IAAI,IAAI;AAC5B,mBAAA;;AAGF,MAAI,kBAAA,IAKF,iBAAA;AAGF,MAAI,kBAAA,IACF,OAAM,IAAI,QACR,8GACD;AAGH,KAAG,UAAU,KAAK,kBAAkB,KAAK,UAAA,IAA+B,CAAC;AACzE,QAAM,GAAG,QAAQ;GACjB;;;;;;;;;;;AAYJ,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,SAAS,MAAM,QAAQ,IAAI,CAC3C,GAAG,cAAgC,KAAK,oBAAoB,EAC5D,GAAG,cAAc,IAAI,CACtB,CAAC;CACF,MAAM,QAAQ,IAAI,IAAwB,MAAM,KAAK,OAAO,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;AAChF,MAAK,MAAM,SAAS,UAAU,UAAU,EAAE;EACxC,MAAM,QAAQ,gCAAgC,MAAM;EACpD,MAAM,UAAU,MAAM,IAAI,MAAM;EAChC,MAAM,YAAY,UAAU,kBAAkB,QAAQ,GAAG,EAAE;EAC3D,MAAM,WAAW,GAAG,kBAAkB,UAAU;EAChD,MAAM,WAAW,MAAM,KAAK,iBAAiB,MAAM,IAAI,eAAe,CAAC;AACvE,KAAG,YAAY,UAAU,WAAW,SAAS;AAC7C,KAAG,aAAa,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;AAqB/B,eAAe,cAAc,IAAmB,KAAiB;CAC/D,MAAM,CAAC,WAAW,qBAAqB,MAAM,QAAQ,IAAI,CACvD,GAAG,cAAgC,KAAK,oBAAoB,EAC5D,GAAG,gBAAgB,KAAK,KAAK,CAC9B,CAAC;CAGF,MAAM,2BAAW,IAAI,KAAyB;AAC9C,MAAK,MAAM,KAAK,kBAAkB,OAChC,KAAI,CAAC,iBAAiB,EAAE,MAAM,CAC5B,UAAS,IAAI,EAAE,MAAM,EAAE,MAAM;AAIjC,MAAK,MAAM,SAAS,UAAU,UAAU,EAAE;EAExC,MAAM,mBAAmB,iBAAiB,MAAM,IAAI,UAAuC;EAC3F,MAAM,uBAAuB,iBAAiB,MAAM,IAAI,cAAc;EAEtE,MAAM,aAAa,SAAS,IAAI,iBAAiB;EACjD,MAAM,iBAAiB,SAAS,IAAI,qBAAqB;EAGzD,MAAM,CAAC,aAAa,mBAAmB,MAAM,QAAQ,IAAI,CACvD,aAAa,GAAG,gBAAgB,YAAY,MAAM,GAAG,QAAQ,QAAQ,KAAA,EAAU,EAC/E,iBAAiB,GAAG,gBAAgB,gBAAgB,MAAM,GAAG,QAAQ,QAAQ,KAAA,EAAU,CACxF,CAAC;EAGF,MAAM,UAAU,aAAa,OAAO,kBAAkB,YAAY,KAAK,GAAG,EAAE;EAC5E,MAAM,OAAO,iBAAiB,OAAO,kBAAkB,gBAAgB,KAAK,GAAG,EAAE;EAGjF,MAAM,eAAe;GACnB;GACA;GACD;EAED,MAAM,wBAAwB,iBAAiB,MAAM,IAAI,eAAe;EAGxE,MAAM,SAAS,GAAG,kBAAkB,aAAa;EACjD,MAAM,SAAS,MAAM,KAAK,sBAAsB;AAChD,KAAG,YAAY,QAAQ,WAAW,OAAO;AAGzC,MAAI,gBAAgB;GAClB,MAAM,cAAc,GAAG,kBAAkB,KAAK;GAC9C,MAAM,cAAc,MAAM,KAAK,iBAAiB,MAAM,IAAI,oBAAoB,CAAC;AAC/E,MAAG,YAAY,aAAa,WAAW,YAAY"}
@@ -1,11 +1,11 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_project_model = require('../model/project_model.cjs');
3
- const require_render_block = require('./template/render_block.cjs');
4
- const require_template_loading = require('./template/template_loading.cjs');
5
- const require_block_pack = require('./block-pack/block_pack.cjs');
6
- const require_project_model_util = require('../model/project_model_util.cjs');
7
- const require_context_export = require('./context_export.cjs');
8
- const require_index = require('../debug/index.cjs');
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_project_model = require("../model/project_model.cjs");
3
+ const require_render_block = require("./template/render_block.cjs");
4
+ const require_template_loading = require("./template/template_loading.cjs");
5
+ const require_block_pack = require("./block-pack/block_pack.cjs");
6
+ const require_project_model_util = require("../model/project_model_util.cjs");
7
+ const require_context_export = require("./context_export.cjs");
8
+ const require_index = require("../debug/index.cjs");
9
9
  let _platforma_sdk_model = require("@platforma-sdk/model");
10
10
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
11
11
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
@@ -13,7 +13,6 @@ let _milaboratories_pl_client = require("@milaboratories/pl-client");
13
13
  let denque = require("denque");
14
14
  denque = require_runtime.__toESM(denque);
15
15
  let node_zlib = require("node:zlib");
16
-
17
16
  //#region src/mutator/project.ts
18
17
  function cached(modIdCb, valueCb) {
19
18
  let initialized = false;
@@ -920,7 +919,7 @@ var ProjectMutator = class ProjectMutator {
920
919
  structureP,
921
920
  renderingStateP
922
921
  ]);
923
- if (schema !== require_project_model.SchemaVersionCurrent) if (Number(schema) < Number(require_project_model.SchemaVersionCurrent)) throw new _platforma_sdk_model.UiError(`Can't perform this action on this project because it has older schema. Try (re)loading the project to update it.`);
922
+ if (schema !== "4") if (Number(schema) < 4) throw new _platforma_sdk_model.UiError(`Can't perform this action on this project because it has older schema. Try (re)loading the project to update it.`);
924
923
  else throw new _platforma_sdk_model.UiError(`Can't perform this action on this project because it has newer schema. Upgrade your desktop app to the latest version.`);
925
924
  const blockPackRequests = [];
926
925
  for (const [info, fieldName, state, response] of blockFieldRequests) {
@@ -970,7 +969,7 @@ async function createProject(tx, meta = require_project_model.InitialBlockMeta)
970
969
  const prj = tx.createEphemeral(require_project_model.ProjectResourceType);
971
970
  tx.lock(prj);
972
971
  const ts = String(Date.now());
973
- tx.setKValue(prj, require_project_model.SchemaVersionKey, JSON.stringify(require_project_model.SchemaVersionCurrent));
972
+ tx.setKValue(prj, require_project_model.SchemaVersionKey, JSON.stringify("4"));
974
973
  tx.setKValue(prj, require_project_model.ProjectCreatedTimestamp, ts);
975
974
  tx.setKValue(prj, require_project_model.ProjectLastModifiedTimestamp, ts);
976
975
  tx.setKValue(prj, require_project_model.ProjectMetaKey, JSON.stringify(meta));
@@ -999,7 +998,7 @@ async function duplicateProject(tx, sourceRid, options) {
999
998
  const sourceKVs = await sourceKVsP;
1000
999
  const schemaKV = sourceKVs.find((kv) => kv.key === require_project_model.SchemaVersionKey);
1001
1000
  const schema = schemaKV ? JSON.parse(schemaKV.value) : void 0;
1002
- if (schema !== require_project_model.SchemaVersionCurrent && schema !== require_project_model.SchemaVersionV3) throw new _platforma_sdk_model.UiError(`Cannot duplicate project with schema version ${schema ?? "unknown"}. Only schema versions ${require_project_model.SchemaVersionV3} and ${require_project_model.SchemaVersionCurrent} are supported. Try opening the project first to trigger migration.`);
1001
+ if (schema !== "4" && schema !== "3") throw new _platforma_sdk_model.UiError(`Cannot duplicate project with schema version ${schema ?? "unknown"}. Only schema versions 3 and 4 are supported. Try opening the project first to trigger migration.`);
1003
1002
  const newPrj = tx.createEphemeral(require_project_model.ProjectResourceType);
1004
1003
  tx.lock(newPrj);
1005
1004
  const ts = String(Date.now());
@@ -1012,7 +1011,7 @@ async function duplicateProject(tx, sourceRid, options) {
1012
1011
  for (const { key, value } of sourceKVs) {
1013
1012
  if (kvSkipKeys.has(key)) continue;
1014
1013
  if (kvSkipPrefixes.some((prefix) => key.startsWith(prefix))) continue;
1015
- if (key === require_project_model.ProjectMetaKey && options?.label !== void 0) {
1014
+ if (key === "ProjectMeta" && options?.label !== void 0) {
1016
1015
  const meta = JSON.parse(value);
1017
1016
  tx.setKValue(newPrj, key, JSON.stringify({
1018
1017
  ...meta,
@@ -1050,10 +1049,10 @@ async function withProjectAuthored(projectHelper, txOrPl, rid, author, cb, ops =
1050
1049
  return result;
1051
1050
  }
1052
1051
  }
1053
-
1054
1052
  //#endregion
1055
1053
  exports.createProject = createProject;
1056
1054
  exports.duplicateProject = duplicateProject;
1057
1055
  exports.withProject = withProject;
1058
1056
  exports.withProjectAuthored = withProjectAuthored;
1057
+
1059
1058
  //# sourceMappingURL=project.cjs.map