@milaboratories/pl-middle-layer 1.74.18 → 1.75.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 (60) hide show
  1. package/dist/middle_layer/block.cjs.map +1 -1
  2. package/dist/middle_layer/block.js.map +1 -1
  3. package/dist/middle_layer/build_stamp.cjs +1 -1
  4. package/dist/middle_layer/build_stamp.js +1 -1
  5. package/dist/middle_layer/column_links.cjs +106 -0
  6. package/dist/middle_layer/column_links.cjs.map +1 -0
  7. package/dist/middle_layer/column_links.js +104 -0
  8. package/dist/middle_layer/column_links.js.map +1 -0
  9. package/dist/middle_layer/middle_layer.cjs +1 -0
  10. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  11. package/dist/middle_layer/middle_layer.js +1 -0
  12. package/dist/middle_layer/middle_layer.js.map +1 -1
  13. package/dist/middle_layer/project.cjs +45 -19
  14. package/dist/middle_layer/project.cjs.map +1 -1
  15. package/dist/middle_layer/project.d.ts.map +1 -1
  16. package/dist/middle_layer/project.js +46 -20
  17. package/dist/middle_layer/project.js.map +1 -1
  18. package/dist/middle_layer/project_overview.cjs +56 -24
  19. package/dist/middle_layer/project_overview.cjs.map +1 -1
  20. package/dist/middle_layer/project_overview.js +55 -25
  21. package/dist/middle_layer/project_overview.js.map +1 -1
  22. package/dist/model/args_derivation.cjs +153 -0
  23. package/dist/model/args_derivation.cjs.map +1 -0
  24. package/dist/model/args_derivation.d.ts +21 -0
  25. package/dist/model/args_derivation.d.ts.map +1 -0
  26. package/dist/model/args_derivation.js +148 -0
  27. package/dist/model/args_derivation.js.map +1 -0
  28. package/dist/model/project_helper.cjs +34 -8
  29. package/dist/model/project_helper.cjs.map +1 -1
  30. package/dist/model/project_helper.d.ts +18 -5
  31. package/dist/model/project_helper.d.ts.map +1 -1
  32. package/dist/model/project_helper.js +34 -8
  33. package/dist/model/project_helper.js.map +1 -1
  34. package/dist/model/project_model.cjs +1 -0
  35. package/dist/model/project_model.cjs.map +1 -1
  36. package/dist/model/project_model.d.ts +1 -1
  37. package/dist/model/project_model.js +1 -0
  38. package/dist/model/project_model.js.map +1 -1
  39. package/dist/mutator/project.cjs +54 -8
  40. package/dist/mutator/project.cjs.map +1 -1
  41. package/dist/mutator/project.d.ts +1 -0
  42. package/dist/mutator/project.d.ts.map +1 -1
  43. package/dist/mutator/project.js +54 -8
  44. package/dist/mutator/project.js.map +1 -1
  45. package/package.json +16 -16
  46. package/src/middle_layer/block.ts +4 -1
  47. package/src/middle_layer/column_links.test.ts +350 -0
  48. package/src/middle_layer/column_links.ts +152 -0
  49. package/src/middle_layer/middle_layer.ts +2 -0
  50. package/src/middle_layer/project.ts +39 -5
  51. package/src/middle_layer/project_overview.test.ts +200 -0
  52. package/src/middle_layer/project_overview.ts +82 -28
  53. package/src/model/args.test.ts +39 -1
  54. package/src/model/args_derivation.test.ts +326 -0
  55. package/src/model/args_derivation.ts +194 -0
  56. package/src/model/project_helper.ts +55 -25
  57. package/src/model/project_model.ts +2 -0
  58. package/src/mutator/project-v3.test.ts +105 -1
  59. package/src/mutator/project.ts +81 -24
  60. package/src/test/fake_project.ts +222 -0
@@ -6,6 +6,7 @@ const require_project_model_util = require("../model/project_model_util.cjs");
6
6
  const require_template_serializer = require("../model/template_serializer.cjs");
7
7
  const require_block_pack = require("./block-pack/block_pack.cjs");
8
8
  const require_context_export = require("./context_export.cjs");
9
+ const require_args_derivation = require("../model/args_derivation.cjs");
9
10
  const require_index = require("../debug/index.cjs");
10
11
  let _platforma_sdk_model = require("@platforma-sdk/model");
11
12
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
@@ -117,6 +118,18 @@ var BlockInfo = class {
117
118
  get currentPrerunArgs() {
118
119
  return this.currentPrerunArgsC();
119
120
  }
121
+ argsErrorsC = cached(() => `${this.fields.inputsValid?.modCount}:${this.fields.currentArgs?.modCount}`, () => require_args_derivation.argsErrorsOfBlock({
122
+ modelAPIVersion: this.config.modelAPIVersion,
123
+ inputsValid: this.fields.inputsValid,
124
+ currentArgs: this.currentArgs
125
+ }));
126
+ /**
127
+ * The errors the block's `argsIssues()` found in its current args. A block whose model API
128
+ * version has no args issues, or that has no current args, has none.
129
+ */
130
+ get argsErrors() {
131
+ return this.argsErrorsC();
132
+ }
120
133
  get stagingRendered() {
121
134
  return this.fields.stagingCtx !== void 0;
122
135
  }
@@ -400,6 +413,26 @@ var ProjectMutator = class ProjectMutator {
400
413
  }
401
414
  return deleted;
402
415
  }
416
+ /**
417
+ * Brings the block's `inputsValid` field in line with what its args derivation found: the run
418
+ * errors of its args, none when it may run with them, and no field when it has no args.
419
+ */
420
+ setArgsErrors(blockId, derivedArgs) {
421
+ this.applyArgsErrorsChange(blockId, require_args_derivation.argsErrorsFieldChange(this.getBlockInfo(blockId).fields.inputsValid, derivedArgs));
422
+ }
423
+ applyArgsErrorsChange(blockId, change) {
424
+ switch (change.type) {
425
+ case "keep": return;
426
+ case "delete":
427
+ this.deleteBlockFields(blockId, "inputsValid");
428
+ return;
429
+ case "write": {
430
+ const ref = this.tx.createValue(_milaboratories_pl_client.Pl.JsonObject, change.data);
431
+ this.setBlockField(blockId, "inputsValid", ref, "Ready", change.data);
432
+ return;
433
+ }
434
+ }
435
+ }
403
436
  updateLastModified() {
404
437
  this.lastModified = Date.now();
405
438
  this.lastModifiedChanged = true;
@@ -489,9 +522,11 @@ var ProjectMutator = class ProjectMutator {
489
522
  const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, initialStorageJson);
490
523
  if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
491
524
  else this.deleteBlockFields(blockId, "currentPrerunArgs");
492
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
493
- if (!deriveArgsResult.error && deriveArgsResult.value !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
525
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
526
+ const args = require_args_derivation.derivedArgsValue(derivedArgs);
527
+ if (args !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
494
528
  else this.deleteBlockFields(blockId, "currentArgs");
529
+ this.setArgsErrors(blockId, derivedArgs);
495
530
  }
496
531
  /** Optimally sets inputs for multiple blocks in one go */
497
532
  setStates(requests) {
@@ -510,8 +545,9 @@ var ProjectMutator = class ProjectMutator {
510
545
  const updatedStorageJson = this.projectHelper.applyStorageUpdateInVM(blockConfig, currentStorageJson, req.payload);
511
546
  this.setBlockFieldObj(req.blockId, "blockStorage", this.createGzJsonFieldValueFromContent(updatedStorageJson));
512
547
  prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, updatedStorageJson);
513
- const derivedArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
514
- args = derivedArgsResult.error ? void 0 : derivedArgsResult.value;
548
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
549
+ args = require_args_derivation.derivedArgsValue(derivedArgs);
550
+ this.setArgsErrors(req.blockId, derivedArgs);
515
551
  } else {
516
552
  this.setBlockFieldObj(req.blockId, "blockStorage", this.createGzJsonFieldValue(req.state));
517
553
  if (req.state !== null && typeof req.state === "object" && "args" in req.state) args = req.state.args;
@@ -626,6 +662,11 @@ var ProjectMutator = class ProjectMutator {
626
662
  this.resetProduction(blockId);
627
663
  const info = this.getBlockInfo(blockId);
628
664
  if (info.fields.currentArgs === void 0) throw new Error(`Can't render production for block ${blockId}: currentArgs not set`);
665
+ const argsErrors = info.argsErrors;
666
+ if (argsErrors.length > 0) {
667
+ const messages = argsErrors.map(({ message }) => message).join("; ");
668
+ throw new Error(`Can't render production for block ${blockId}: ${messages}`);
669
+ }
629
670
  const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId).upstream);
630
671
  if (this.getBlock(blockId).renderingMode === "Light") throw new Error("Can't render production for light block.");
631
672
  const tpl = info.getTemplate(this.tx);
@@ -654,8 +695,9 @@ var ProjectMutator = class ProjectMutator {
654
695
  if (spec.storageMode === "fromModel") {
655
696
  storageToWrite = spec.initialStorage ?? this.projectHelper.getInitialStorageInVM(blockConfig);
656
697
  prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, storageToWrite);
657
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
658
- args = deriveArgsResult.error ? void 0 : deriveArgsResult.value;
698
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
699
+ args = require_args_derivation.derivedArgsValue(derivedArgs);
700
+ this.setArgsErrors(blockId, derivedArgs);
659
701
  } else if (spec.storageMode === "legacy") {
660
702
  args = JSON.parse(spec.legacyState).args;
661
703
  if (args === void 0) throw new Error("args is undefined in legacyState");
@@ -810,9 +852,11 @@ var ProjectMutator = class ProjectMutator {
810
852
  const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, storageJson);
811
853
  if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
812
854
  else this.deleteBlockFields(blockId, "currentPrerunArgs");
813
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
814
- if (!deriveArgsResult.error && deriveArgsResult.value !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
855
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
856
+ const args = require_args_derivation.derivedArgsValue(derivedArgs);
857
+ if (args !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
815
858
  else this.deleteBlockFields(blockId, "currentArgs");
859
+ this.setArgsErrors(blockId, derivedArgs);
816
860
  };
817
861
  if (newClearState !== void 0) {
818
862
  if (newConfig.modelAPIVersion === _platforma_sdk_model.BLOCK_STORAGE_FACADE_VERSION) {
@@ -821,6 +865,7 @@ var ProjectMutator = class ProjectMutator {
821
865
  this.updateLastModified();
822
866
  } else {
823
867
  persistBlockPack();
868
+ this.deleteBlockFields(blockId, "inputsValid");
824
869
  this.setStates([{
825
870
  modelAPIVersion: 1,
826
871
  blockId,
@@ -836,6 +881,7 @@ var ProjectMutator = class ProjectMutator {
836
881
  applyStorageAndDeriveArgs(migrationResult.newStorageJson);
837
882
  } else {
838
883
  persistBlockPack();
884
+ this.deleteBlockFields(blockId, "inputsValid");
839
885
  if (info.fields.currentArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", info.fields.currentArgs);
840
886
  }
841
887
  this.blocksWithChangedInputs.add(blockId);