@milaboratories/pl-middle-layer 1.34.22 → 1.35.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.
@@ -1 +1 @@
1
- {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/middle_layer/block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACX,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAI9F,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;AAE1F,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,WAAW,EACzB,OAAO,EAAE,MAAM,GACd,UAAU,CAAC,mBAAmB,CAAC,CAAC;AACnC,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,WAAW,EACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,GAClB,mBAAmB,CAAC;AAqBvB,wBAAgB,YAAY,CAC1B,YAAY,EAAE,WAAW,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,sBAAsB,GAC1B,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAiB3E"}
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/middle_layer/block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACX,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAK9F,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;AAE1F,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,WAAW,EACzB,OAAO,EAAE,MAAM,GACd,UAAU,CAAC,mBAAmB,CAAC,CAAC;AACnC,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,WAAW,EACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,GAClB,mBAAmB,CAAC;AAqBvB,wBAAgB,YAAY,CAC1B,YAAY,EAAE,WAAW,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,sBAAsB,GAC1B,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAiB3E"}
@@ -1 +1 @@
1
- {"version":3,"file":"project_overview.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project_overview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAgB1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,uCAAuC,CAAC;AAK/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA0B5D,sEAAsE;AACtE,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,gBAAgB,EAAE,gBAAgB,EAClC,GAAG,EAAE,sBAAsB,GAC1B,uBAAuB,CAAC,eAAe,CAAC,CA2M1C"}
1
+ {"version":3,"file":"project_overview.d.ts","sourceRoot":"","sources":["../../src/middle_layer/project_overview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAgB1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,uCAAuC,CAAC;AAK/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAkC5D,sEAAsE;AACtE,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,gBAAgB,EAAE,gBAAgB,EAClC,GAAG,EAAE,sBAAsB,GAC1B,uBAAuB,CAAC,eAAe,CAAC,CA6M1C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.34.22",
3
+ "version": "1.35.0",
4
4
  "description": "Pl Middle Layer",
5
5
  "engines": {
6
6
  "node": ">=20.16.0"
@@ -31,22 +31,23 @@
31
31
  "utility-types": "^3.11.0",
32
32
  "yaml": "^2.7.0",
33
33
  "zod": "~3.23.8",
34
+ "remeda": "^2.21.2",
34
35
  "@milaboratories/pl-http": "^1.1.2",
35
- "@milaboratories/computable": "^2.4.3",
36
- "@platforma-sdk/block-tools": "^2.5.38",
37
36
  "@milaboratories/resolve-helper": "^1.1.0",
38
- "@milaboratories/pl-client": "^2.8.0",
39
- "@milaboratories/pl-drivers": "^1.5.46",
37
+ "@milaboratories/computable": "^2.4.4",
38
+ "@platforma-sdk/block-tools": "^2.5.39",
39
+ "@milaboratories/pl-client": "^2.8.1",
40
+ "@milaboratories/pl-drivers": "^1.5.47",
40
41
  "@milaboratories/pl-model-common": "^1.13.7",
41
42
  "@milaboratories/pl-model-middle-layer": "^1.7.25",
43
+ "@milaboratories/pl-tree": "^1.5.6",
42
44
  "@milaboratories/pl-model-backend": "^1.1.0",
43
- "@milaboratories/pl-tree": "^1.5.5",
44
45
  "@platforma-sdk/model": "^1.29.17",
45
- "@milaboratories/ts-helpers": "^1.1.5",
46
+ "@milaboratories/ts-helpers": "^1.1.6",
46
47
  "@platforma-sdk/workflow-tengo": "4.1.2",
47
- "@milaboratories/pl-config": "^1.4.6",
48
- "@milaboratories/pl-deployments": "^2.0.0",
49
- "@milaboratories/pl-errors": "^1.0.6"
48
+ "@milaboratories/pl-errors": "^1.0.7",
49
+ "@milaboratories/pl-config": "^1.4.7",
50
+ "@milaboratories/pl-deployments": "^2.0.1"
50
51
  },
51
52
  "devDependencies": {
52
53
  "semver": "^7.6.3",
@@ -59,8 +60,8 @@
59
60
  "jest": "^29.7.0",
60
61
  "@jest/globals": "^29.7.0",
61
62
  "ts-jest": "^29.2.6",
62
- "@milaboratories/platforma-build-configs": "1.0.3",
63
- "@milaboratories/eslint-config": "^1.0.4"
63
+ "@milaboratories/eslint-config": "^1.0.4",
64
+ "@milaboratories/platforma-build-configs": "1.0.3"
64
65
  },
65
66
  "scripts": {
66
67
  "type-check": "tsc --noEmit --composite false",
@@ -15,6 +15,7 @@ import { getBlockPackInfo } from './util';
15
15
  import type { AuthorMarker, BlockStateInternal } from '@milaboratories/pl-model-middle-layer';
16
16
  import { computableFromCfgOrRF } from './render';
17
17
  import { resourceIdToString } from '@milaboratories/pl-client';
18
+ import { deepFreeze } from '@milaboratories/ts-helpers';
18
19
 
19
20
  export type BlockArgsAndUiState = Omit<BlockStateInternal, 'outputs' | 'navigationState'>;
20
21
 
@@ -42,8 +43,8 @@ export function blockArgsAndUiState(
42
43
  const uiState = ctx.uiState(cCtx);
43
44
  return {
44
45
  author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(blockId)),
45
- args: JSON.parse(ctx.args(cCtx)),
46
- ui: uiState !== undefined ? JSON.parse(uiState) : undefined,
46
+ args: deepFreeze(JSON.parse(ctx.args(cCtx))),
47
+ ui: uiState !== undefined ? deepFreeze(JSON.parse(uiState)) : undefined,
47
48
  };
48
49
  }
49
50
 
@@ -30,9 +30,10 @@ import { computableFromCfgOrRF } from './render';
30
30
  import type { NavigationStates } from './navigation_states';
31
31
  import { getBlockPackInfo } from './util';
32
32
  import { resourceIdToString } from '@milaboratories/pl-client';
33
+ import * as R from 'remeda';
33
34
 
34
35
  type BlockInfo = {
35
- currentArguments: unknown;
36
+ currentArguments: Record<string, unknown>;
36
37
  prod?: ProdState;
37
38
  };
38
39
 
@@ -50,9 +51,16 @@ type ProdState = {
50
51
  stale: boolean;
51
52
 
52
53
  /** Arguments current production was rendered with. */
53
- arguments: unknown;
54
+ arguments: Record<string, unknown>;
54
55
  };
55
56
 
57
+ function argsEquals(a: Record<string, unknown> | undefined, b: Record<string, unknown> | undefined): boolean {
58
+ if (a === b) return true;
59
+ if (a === undefined || b === undefined) return false;
60
+ const clean = R.omitBy<Record<string, unknown>>((_, key) => key.startsWith('__'));
61
+ return R.isDeepEqual(clean(a), clean(b));
62
+ }
63
+
56
64
  /** Returns derived general project state form the project resource */
57
65
  export function projectOverview(
58
66
  prjEntry: PlTreeEntry,
@@ -79,6 +87,7 @@ export function projectOverview(
79
87
  assertFieldType: 'Dynamic',
80
88
  errorIfFieldNotSet: true,
81
89
  });
90
+ const currentArguments = cInputs.getDataAsJson() as Record<string, unknown>;
82
91
 
83
92
  let prod: ProdState | undefined = undefined;
84
93
 
@@ -88,6 +97,7 @@ export function projectOverview(
88
97
  stableIfNotFound: true,
89
98
  });
90
99
  if (rInputs !== undefined) {
100
+ const prodArgs = rInputs.getDataAsJson() as Record<string, unknown>;
91
101
  const result = prj.getField({
92
102
  field: projectFieldName(id, 'prodOutput'),
93
103
  assertFieldType: 'Dynamic',
@@ -99,8 +109,8 @@ export function projectOverview(
99
109
  errorIfFieldNotFound: true,
100
110
  });
101
111
  prod = {
102
- arguments: rInputs.getDataAsJson(),
103
- stale: cInputs.id !== rInputs.id,
112
+ arguments: prodArgs,
113
+ stale: !argsEquals(currentArguments, prodArgs),
104
114
  outputError:
105
115
  result.error !== undefined
106
116
  || ctx.error !== undefined
@@ -117,7 +127,7 @@ export function projectOverview(
117
127
  };
118
128
  }
119
129
 
120
- infos.set(id, { currentArguments: cInputs.getDataAsJson(), prod });
130
+ infos.set(id, { currentArguments, prod });
121
131
  }
122
132
 
123
133
  const currentGraph = productionGraph(structure, (id) => infos.get(id)!.currentArguments);
@@ -61,7 +61,7 @@ import {
61
61
  import Denque from 'denque';
62
62
  import { exportContext, getPreparedExportTemplateEnvelope } from './context_export';
63
63
  import { loadTemplate } from './template/template_loading';
64
-
64
+ import { deepFreeze } from '@milaboratories/ts-helpers';
65
65
  type FieldStatus = 'NotReady' | 'Ready' | 'Error';
66
66
 
67
67
  interface BlockFieldState {
@@ -133,7 +133,7 @@ class BlockInfo {
133
133
 
134
134
  private readonly currentInputsC = cached(
135
135
  () => this.fields.currentArgs!.modCount,
136
- () => JSON.parse(Buffer.from(this.fields.currentArgs!.value!).toString()) as unknown,
136
+ () => deepFreeze(JSON.parse(Buffer.from(this.fields.currentArgs!.value!).toString())) as unknown,
137
137
  );
138
138
 
139
139
  private readonly actualProductionInputsC = cached(
@@ -141,7 +141,7 @@ class BlockInfo {
141
141
  () => {
142
142
  const bin = this.fields.prodArgs?.value;
143
143
  if (bin === undefined) return undefined;
144
- return JSON.parse(Buffer.from(bin).toString()) as unknown;
144
+ return deepFreeze(JSON.parse(Buffer.from(bin).toString())) as unknown;
145
145
  },
146
146
  );
147
147