@milaboratories/pl-middle-layer 1.46.34 → 1.47.0

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 (55) hide show
  1. package/dist/index.cjs +0 -58
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +0 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/middle_layer/frontend_path.cjs +0 -1
  6. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  7. package/dist/middle_layer/frontend_path.js +0 -1
  8. package/dist/middle_layer/frontend_path.js.map +1 -1
  9. package/dist/middle_layer/middle_layer.cjs +5 -1
  10. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  11. package/dist/middle_layer/middle_layer.d.ts +3 -1
  12. package/dist/middle_layer/middle_layer.d.ts.map +1 -1
  13. package/dist/middle_layer/middle_layer.js +5 -1
  14. package/dist/middle_layer/middle_layer.js.map +1 -1
  15. package/dist/middle_layer/project.cjs +8 -6
  16. package/dist/middle_layer/project.cjs.map +1 -1
  17. package/dist/middle_layer/project.d.ts.map +1 -1
  18. package/dist/middle_layer/project.js +9 -7
  19. package/dist/middle_layer/project.js.map +1 -1
  20. package/dist/middle_layer/project_overview.cjs +2 -2
  21. package/dist/middle_layer/project_overview.cjs.map +1 -1
  22. package/dist/middle_layer/project_overview.js +3 -3
  23. package/dist/middle_layer/project_overview.js.map +1 -1
  24. package/dist/model/index.d.ts +0 -1
  25. package/dist/model/index.d.ts.map +1 -1
  26. package/dist/model/project_helper.cjs +20 -32
  27. package/dist/model/project_helper.cjs.map +1 -1
  28. package/dist/model/project_helper.d.ts +3 -4
  29. package/dist/model/project_helper.d.ts.map +1 -1
  30. package/dist/model/project_helper.js +21 -33
  31. package/dist/model/project_helper.js.map +1 -1
  32. package/dist/mutator/block-pack/frontend.cjs +0 -1
  33. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  34. package/dist/mutator/block-pack/frontend.js +0 -1
  35. package/dist/mutator/block-pack/frontend.js.map +1 -1
  36. package/dist/mutator/project.cjs +28 -35
  37. package/dist/mutator/project.cjs.map +1 -1
  38. package/dist/mutator/project.d.ts.map +1 -1
  39. package/dist/mutator/project.js +29 -36
  40. package/dist/mutator/project.js.map +1 -1
  41. package/package.json +13 -13
  42. package/src/middle_layer/middle_layer.ts +7 -2
  43. package/src/middle_layer/project.ts +12 -7
  44. package/src/middle_layer/project_overview.ts +3 -3
  45. package/src/model/index.ts +0 -1
  46. package/src/model/project_helper.ts +33 -37
  47. package/src/mutator/project-v3.test.ts +9 -9
  48. package/src/mutator/project.ts +50 -74
  49. package/dist/model/block_storage_helper.cjs +0 -210
  50. package/dist/model/block_storage_helper.cjs.map +0 -1
  51. package/dist/model/block_storage_helper.d.ts +0 -98
  52. package/dist/model/block_storage_helper.d.ts.map +0 -1
  53. package/dist/model/block_storage_helper.js +0 -153
  54. package/dist/model/block_storage_helper.js.map +0 -1
  55. package/src/model/block_storage_helper.ts +0 -213
@@ -8,7 +8,7 @@ import Denque from 'denque';
8
8
  import { getPreparedExportTemplateEnvelope, exportContext } from './context_export.js';
9
9
  import { loadTemplate } from './template/template_loading.js';
10
10
  import { notEmpty, canonicalJsonBytes, cachedDeserialize, cachedDecode } from '@milaboratories/ts-helpers';
11
- import { extractConfig, UiError } from '@platforma-sdk/model';
11
+ import { BLOCK_STORAGE_FACADE_VERSION, extractConfig, UiError } from '@platforma-sdk/model';
12
12
  import { getDebugFlags } from '../debug/index.js';
13
13
 
14
14
  function cached(modIdCb, valueCb) {
@@ -402,7 +402,7 @@ class ProjectMutator {
402
402
  resetToInitialStorage(blockId) {
403
403
  const info = this.getBlockInfo(blockId);
404
404
  const blockConfig = info.config;
405
- if (blockConfig.modelAPIVersion !== 2) {
405
+ if (blockConfig.modelAPIVersion !== BLOCK_STORAGE_FACADE_VERSION) {
406
406
  throw new Error("resetToInitialStorage is only supported for model API version 2");
407
407
  }
408
408
  // Get initial storage from VM
@@ -437,7 +437,7 @@ class ProjectMutator {
437
437
  // Derive args from storage using the block's config.args() callback
438
438
  let args;
439
439
  let prerunArgs;
440
- if (req.modelAPIVersion === 2) {
440
+ if (req.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION) {
441
441
  const currentStorageJson = info.blockStorageJson;
442
442
  if (currentStorageJson === undefined) {
443
443
  throw new Error(`Block ${req.blockId} has no blockStorage - this should not happen`);
@@ -827,62 +827,55 @@ class ProjectMutator {
827
827
  migrateBlockPack(blockId, spec, newClearState) {
828
828
  const info = this.getBlockInfo(blockId);
829
829
  const newConfig = extractConfig(spec.config);
830
- this.setBlockField(blockId, "blockPack", Pl.wrapInHolder(this.tx, createBlockPack(this.tx, spec)), "NotReady");
830
+ const persistBlockPack = () => {
831
+ this.setBlockField(blockId, "blockPack", Pl.wrapInHolder(this.tx, createBlockPack(this.tx, spec)), "NotReady");
832
+ };
833
+ const applyStorageAndDeriveArgs = (storageJson) => {
834
+ persistBlockPack();
835
+ this.setBlockStorageRaw(blockId, storageJson);
836
+ const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
837
+ if (!deriveArgsResult.error) {
838
+ this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
839
+ const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, storageJson);
840
+ if (prerunArgs !== undefined) {
841
+ this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
842
+ }
843
+ }
844
+ };
831
845
  if (newClearState !== undefined) {
832
846
  // State is being reset - no migration needed
833
- const supportsStorageFromVM = newConfig.modelAPIVersion === 2;
847
+ const supportsStorageFromVM = newConfig.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION;
834
848
  if (supportsStorageFromVM) {
835
849
  // V2+: Get initial storage directly from VM and derive args from it
836
850
  const initialStorageJson = this.projectHelper.getInitialStorageInVM(newConfig);
837
- this.setBlockStorageRaw(blockId, initialStorageJson);
838
- // Derive args from storage - only set currentArgs if derivation succeeds
839
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, initialStorageJson);
840
- if (!deriveArgsResult.error) {
841
- this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
842
- // Derive prerunArgs from storage
843
- const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, initialStorageJson);
844
- if (prerunArgs !== undefined) {
845
- this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
846
- }
847
- }
851
+ applyStorageAndDeriveArgs(initialStorageJson);
848
852
  this.blocksWithChangedInputs.add(blockId);
849
853
  this.updateLastModified();
850
854
  }
851
855
  else {
852
856
  // V1: Use setStates with legacy state format
857
+ persistBlockPack();
853
858
  this.setStates([{ modelAPIVersion: 1, blockId, state: newClearState.state }]);
854
859
  }
855
860
  }
856
861
  else {
857
862
  // State is being preserved - run migrations if needed via VM
858
863
  // Only Model API v2 blocks support migrations
859
- const supportsStateMigrations = newConfig.modelAPIVersion === 2;
864
+ const supportsStateMigrations = newConfig.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION;
860
865
  if (supportsStateMigrations) {
861
866
  const currentStorageJson = info.blockStorageJson;
867
+ // Attempt migration BEFORE persisting block pack — on failure,
868
+ // block stays on old version (no inconsistent new-code/old-storage state)
862
869
  const migrationResult = this.projectHelper.migrateStorageInVM(newConfig, currentStorageJson);
863
870
  if (migrationResult.error !== undefined) {
864
- console.error(`[migrateBlockPack] Block ${blockId} migration error: ${migrationResult.error}`);
865
- }
866
- else {
867
- console.log(`[migrateBlockPack] Block ${blockId}: ${migrationResult.info}`);
868
- if (migrationResult.warn) {
869
- console.warn(`[migrateBlockPack] Block ${blockId} migration warning: ${migrationResult.warn}`);
870
- }
871
- this.setBlockStorageRaw(blockId, migrationResult.newStorageJson);
872
- // Re-derive currentArgs from migrated storage (new block code + migrated data)
873
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, migrationResult.newStorageJson);
874
- if (!deriveArgsResult.error) {
875
- this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
876
- }
877
- // Derive prerunArgs from the migrated storage so staging can re-render
878
- const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, migrationResult.newStorageJson);
879
- if (prerunArgs !== undefined) {
880
- this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
881
- }
871
+ throw new Error(`[migrateBlockPack] Block ${blockId} migration failed: ${migrationResult.error}`);
882
872
  }
873
+ console.log(`[migrateBlockPack] Block ${blockId}: ${migrationResult.info}`);
874
+ applyStorageAndDeriveArgs(migrationResult.newStorageJson);
883
875
  }
884
876
  else {
885
- // Legacy blocks (modelAPIVersion 1): prerunArgs = currentArgs
877
+ // Legacy blocks (modelAPIVersion 1): persist block pack, set prerunArgs = currentArgs
878
+ persistBlockPack();
886
879
  if (info.fields.currentArgs !== undefined) {
887
880
  this.setBlockFieldObj(blockId, "currentPrerunArgs", info.fields.currentArgs);
888
881
  }