@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
@@ -5,6 +5,7 @@ import { ProjectHelper } from "../model/project_helper.js";
5
5
  import { BlockConfig } from "@platforma-sdk/model";
6
6
  import { AuthorMarker, BlockPackSpec, BlockSettings, ProjectMeta } from "@milaboratories/pl-model-middle-layer";
7
7
  import { MiLogger } from "@milaboratories/ts-helpers";
8
+ import { ArgsIssue } from "@milaboratories/pl-model-common";
8
9
  import { AnyRef, AnyResourceRef, PlClient, PlTransaction, ResourceRef, SignedResourceId } from "@milaboratories/pl-client";
9
10
  /**
10
11
  * Duplicates an existing project resource within a transaction.
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","names":[],"sources":["../../src/mutator/project.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;wBAklEsB,iBACpB,IAAI,eACJ,WAAW,kBACX;EAAY;;;;;;;;AAOZ,gBAAgB,gBACf,QAAQ"}
1
+ {"version":3,"file":"project.d.ts","names":[],"sources":["../../src/mutator/project.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;wBA2oEsB,iBACpB,IAAI,eACJ,WAAW,kBACX;EAAY;;;;;;;;AAOZ,gBAAgB,gBACf,QAAQ"}
@@ -5,6 +5,7 @@ import { allBlocks, graphDiff, productionGraph, stagingGraph } from "../model/pr
5
5
  import { exportProjectAsTemplateV1 } from "../model/template_serializer.js";
6
6
  import { BlockPackTemplateField, createBlockPack } from "./block-pack/block_pack.js";
7
7
  import { exportContext, getPreparedExportTemplateEnvelope } from "./context_export.js";
8
+ import { argsErrorsFieldChange, argsErrorsOfBlock, derivedArgsValue } from "../model/args_derivation.js";
8
9
  import { getDebugFlags } from "../debug/index.js";
9
10
  import { BLOCK_STORAGE_FACADE_VERSION, UiError, extractConfig } from "@platforma-sdk/model";
10
11
  import { InitialBlockSettings, normalizeProjectMeta } from "@milaboratories/pl-model-middle-layer";
@@ -115,6 +116,18 @@ var BlockInfo = class {
115
116
  get currentPrerunArgs() {
116
117
  return this.currentPrerunArgsC();
117
118
  }
119
+ argsErrorsC = cached(() => `${this.fields.inputsValid?.modCount}:${this.fields.currentArgs?.modCount}`, () => argsErrorsOfBlock({
120
+ modelAPIVersion: this.config.modelAPIVersion,
121
+ inputsValid: this.fields.inputsValid,
122
+ currentArgs: this.currentArgs
123
+ }));
124
+ /**
125
+ * The errors the block's `argsIssues()` found in its current args. A block whose model API
126
+ * version has no args issues, or that has no current args, has none.
127
+ */
128
+ get argsErrors() {
129
+ return this.argsErrorsC();
130
+ }
118
131
  get stagingRendered() {
119
132
  return this.fields.stagingCtx !== void 0;
120
133
  }
@@ -398,6 +411,26 @@ var ProjectMutator = class ProjectMutator {
398
411
  }
399
412
  return deleted;
400
413
  }
414
+ /**
415
+ * Brings the block's `inputsValid` field in line with what its args derivation found: the run
416
+ * errors of its args, none when it may run with them, and no field when it has no args.
417
+ */
418
+ setArgsErrors(blockId, derivedArgs) {
419
+ this.applyArgsErrorsChange(blockId, argsErrorsFieldChange(this.getBlockInfo(blockId).fields.inputsValid, derivedArgs));
420
+ }
421
+ applyArgsErrorsChange(blockId, change) {
422
+ switch (change.type) {
423
+ case "keep": return;
424
+ case "delete":
425
+ this.deleteBlockFields(blockId, "inputsValid");
426
+ return;
427
+ case "write": {
428
+ const ref = this.tx.createValue(Pl.JsonObject, change.data);
429
+ this.setBlockField(blockId, "inputsValid", ref, "Ready", change.data);
430
+ return;
431
+ }
432
+ }
433
+ }
401
434
  updateLastModified() {
402
435
  this.lastModified = Date.now();
403
436
  this.lastModifiedChanged = true;
@@ -487,9 +520,11 @@ var ProjectMutator = class ProjectMutator {
487
520
  const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, initialStorageJson);
488
521
  if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
489
522
  else this.deleteBlockFields(blockId, "currentPrerunArgs");
490
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
491
- if (!deriveArgsResult.error && deriveArgsResult.value !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
523
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, initialStorageJson);
524
+ const args = derivedArgsValue(derivedArgs);
525
+ if (args !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
492
526
  else this.deleteBlockFields(blockId, "currentArgs");
527
+ this.setArgsErrors(blockId, derivedArgs);
493
528
  }
494
529
  /** Optimally sets inputs for multiple blocks in one go */
495
530
  setStates(requests) {
@@ -508,8 +543,9 @@ var ProjectMutator = class ProjectMutator {
508
543
  const updatedStorageJson = this.projectHelper.applyStorageUpdateInVM(blockConfig, currentStorageJson, req.payload);
509
544
  this.setBlockFieldObj(req.blockId, "blockStorage", this.createGzJsonFieldValueFromContent(updatedStorageJson));
510
545
  prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, updatedStorageJson);
511
- const derivedArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
512
- args = derivedArgsResult.error ? void 0 : derivedArgsResult.value;
546
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, updatedStorageJson);
547
+ args = derivedArgsValue(derivedArgs);
548
+ this.setArgsErrors(req.blockId, derivedArgs);
513
549
  } else {
514
550
  this.setBlockFieldObj(req.blockId, "blockStorage", this.createGzJsonFieldValue(req.state));
515
551
  if (req.state !== null && typeof req.state === "object" && "args" in req.state) args = req.state.args;
@@ -624,6 +660,11 @@ var ProjectMutator = class ProjectMutator {
624
660
  this.resetProduction(blockId);
625
661
  const info = this.getBlockInfo(blockId);
626
662
  if (info.fields.currentArgs === void 0) throw new Error(`Can't render production for block ${blockId}: currentArgs not set`);
663
+ const argsErrors = info.argsErrors;
664
+ if (argsErrors.length > 0) {
665
+ const messages = argsErrors.map(({ message }) => message).join("; ");
666
+ throw new Error(`Can't render production for block ${blockId}: ${messages}`);
667
+ }
627
668
  const ctx = this.createProdCtx(this.getPendingProductionGraph().nodes.get(blockId).upstream);
628
669
  if (this.getBlock(blockId).renderingMode === "Light") throw new Error("Can't render production for light block.");
629
670
  const tpl = info.getTemplate(this.tx);
@@ -652,8 +693,9 @@ var ProjectMutator = class ProjectMutator {
652
693
  if (spec.storageMode === "fromModel") {
653
694
  storageToWrite = spec.initialStorage ?? this.projectHelper.getInitialStorageInVM(blockConfig);
654
695
  prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(blockConfig, storageToWrite);
655
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
656
- args = deriveArgsResult.error ? void 0 : deriveArgsResult.value;
696
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(blockConfig, storageToWrite);
697
+ args = derivedArgsValue(derivedArgs);
698
+ this.setArgsErrors(blockId, derivedArgs);
657
699
  } else if (spec.storageMode === "legacy") {
658
700
  args = JSON.parse(spec.legacyState).args;
659
701
  if (args === void 0) throw new Error("args is undefined in legacyState");
@@ -808,9 +850,11 @@ var ProjectMutator = class ProjectMutator {
808
850
  const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, storageJson);
809
851
  if (prerunArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
810
852
  else this.deleteBlockFields(blockId, "currentPrerunArgs");
811
- const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
812
- if (!deriveArgsResult.error && deriveArgsResult.value !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
853
+ const derivedArgs = this.projectHelper.deriveArgsFromStorage(newConfig, storageJson);
854
+ const args = derivedArgsValue(derivedArgs);
855
+ if (args !== void 0) this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(args));
813
856
  else this.deleteBlockFields(blockId, "currentArgs");
857
+ this.setArgsErrors(blockId, derivedArgs);
814
858
  };
815
859
  if (newClearState !== void 0) {
816
860
  if (newConfig.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION) {
@@ -819,6 +863,7 @@ var ProjectMutator = class ProjectMutator {
819
863
  this.updateLastModified();
820
864
  } else {
821
865
  persistBlockPack();
866
+ this.deleteBlockFields(blockId, "inputsValid");
822
867
  this.setStates([{
823
868
  modelAPIVersion: 1,
824
869
  blockId,
@@ -834,6 +879,7 @@ var ProjectMutator = class ProjectMutator {
834
879
  applyStorageAndDeriveArgs(migrationResult.newStorageJson);
835
880
  } else {
836
881
  persistBlockPack();
882
+ this.deleteBlockFields(blockId, "inputsValid");
837
883
  if (info.fields.currentArgs !== void 0) this.setBlockFieldObj(blockId, "currentPrerunArgs", info.fields.currentArgs);
838
884
  }
839
885
  this.blocksWithChangedInputs.add(blockId);