@milaboratories/pl-middle-layer 1.45.5 → 1.46.1

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 (132) hide show
  1. package/dist/index.cjs +58 -0
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/js_render/computable_context.cjs +37 -7
  6. package/dist/js_render/computable_context.cjs.map +1 -1
  7. package/dist/js_render/computable_context.d.ts.map +1 -1
  8. package/dist/js_render/computable_context.js +37 -7
  9. package/dist/js_render/computable_context.js.map +1 -1
  10. package/dist/js_render/context.cjs +12 -4
  11. package/dist/js_render/context.cjs.map +1 -1
  12. package/dist/js_render/context.d.ts +9 -0
  13. package/dist/js_render/context.d.ts.map +1 -1
  14. package/dist/js_render/context.js +12 -4
  15. package/dist/js_render/context.js.map +1 -1
  16. package/dist/js_render/index.cjs +1 -1
  17. package/dist/js_render/index.cjs.map +1 -1
  18. package/dist/js_render/index.js +1 -1
  19. package/dist/js_render/index.js.map +1 -1
  20. package/dist/middle_layer/block.cjs +7 -8
  21. package/dist/middle_layer/block.cjs.map +1 -1
  22. package/dist/middle_layer/block.d.ts +4 -4
  23. package/dist/middle_layer/block.d.ts.map +1 -1
  24. package/dist/middle_layer/block.js +7 -8
  25. package/dist/middle_layer/block.js.map +1 -1
  26. package/dist/middle_layer/block_ctx.cjs +67 -13
  27. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  28. package/dist/middle_layer/block_ctx.d.ts +4 -7
  29. package/dist/middle_layer/block_ctx.d.ts.map +1 -1
  30. package/dist/middle_layer/block_ctx.js +68 -14
  31. package/dist/middle_layer/block_ctx.js.map +1 -1
  32. package/dist/middle_layer/block_ctx_unsafe.cjs +10 -3
  33. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  34. package/dist/middle_layer/block_ctx_unsafe.d.ts +1 -1
  35. package/dist/middle_layer/block_ctx_unsafe.d.ts.map +1 -1
  36. package/dist/middle_layer/block_ctx_unsafe.js +10 -3
  37. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  38. package/dist/middle_layer/frontend_path.cjs +1 -0
  39. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  40. package/dist/middle_layer/frontend_path.js +1 -0
  41. package/dist/middle_layer/frontend_path.js.map +1 -1
  42. package/dist/middle_layer/middle_layer.cjs +1 -0
  43. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  44. package/dist/middle_layer/middle_layer.d.ts +1 -1
  45. package/dist/middle_layer/middle_layer.d.ts.map +1 -1
  46. package/dist/middle_layer/middle_layer.js +1 -0
  47. package/dist/middle_layer/middle_layer.js.map +1 -1
  48. package/dist/middle_layer/project.cjs +75 -28
  49. package/dist/middle_layer/project.cjs.map +1 -1
  50. package/dist/middle_layer/project.d.ts +34 -7
  51. package/dist/middle_layer/project.d.ts.map +1 -1
  52. package/dist/middle_layer/project.js +76 -29
  53. package/dist/middle_layer/project.js.map +1 -1
  54. package/dist/middle_layer/project_overview.cjs +32 -11
  55. package/dist/middle_layer/project_overview.cjs.map +1 -1
  56. package/dist/middle_layer/project_overview.d.ts.map +1 -1
  57. package/dist/middle_layer/project_overview.js +32 -11
  58. package/dist/middle_layer/project_overview.js.map +1 -1
  59. package/dist/middle_layer/render.cjs +1 -1
  60. package/dist/middle_layer/render.cjs.map +1 -1
  61. package/dist/middle_layer/render.js +1 -1
  62. package/dist/middle_layer/render.js.map +1 -1
  63. package/dist/middle_layer/render.test.d.ts.map +1 -1
  64. package/dist/model/block_storage_helper.cjs +210 -0
  65. package/dist/model/block_storage_helper.cjs.map +1 -0
  66. package/dist/model/block_storage_helper.d.ts +98 -0
  67. package/dist/model/block_storage_helper.d.ts.map +1 -0
  68. package/dist/model/block_storage_helper.js +153 -0
  69. package/dist/model/block_storage_helper.js.map +1 -0
  70. package/dist/model/index.d.ts +2 -1
  71. package/dist/model/index.d.ts.map +1 -1
  72. package/dist/model/project_helper.cjs +177 -0
  73. package/dist/model/project_helper.cjs.map +1 -1
  74. package/dist/model/project_helper.d.ts +110 -1
  75. package/dist/model/project_helper.d.ts.map +1 -1
  76. package/dist/model/project_helper.js +178 -1
  77. package/dist/model/project_helper.js.map +1 -1
  78. package/dist/model/project_model.cjs +6 -3
  79. package/dist/model/project_model.cjs.map +1 -1
  80. package/dist/model/project_model.d.ts +3 -2
  81. package/dist/model/project_model.d.ts.map +1 -1
  82. package/dist/model/project_model.js +6 -4
  83. package/dist/model/project_model.js.map +1 -1
  84. package/dist/mutator/block-pack/block_pack.cjs +1 -2
  85. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  86. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
  87. package/dist/mutator/block-pack/block_pack.js +1 -2
  88. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  89. package/dist/mutator/block-pack/frontend.cjs +1 -0
  90. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  91. package/dist/mutator/block-pack/frontend.js +1 -0
  92. package/dist/mutator/block-pack/frontend.js.map +1 -1
  93. package/dist/mutator/migration.cjs +64 -3
  94. package/dist/mutator/migration.cjs.map +1 -1
  95. package/dist/mutator/migration.d.ts.map +1 -1
  96. package/dist/mutator/migration.js +66 -5
  97. package/dist/mutator/migration.js.map +1 -1
  98. package/dist/mutator/project-v3.test.d.ts +2 -0
  99. package/dist/mutator/project-v3.test.d.ts.map +1 -0
  100. package/dist/mutator/project.cjs +282 -41
  101. package/dist/mutator/project.cjs.map +1 -1
  102. package/dist/mutator/project.d.ts +77 -12
  103. package/dist/mutator/project.d.ts.map +1 -1
  104. package/dist/mutator/project.js +283 -42
  105. package/dist/mutator/project.js.map +1 -1
  106. package/dist/pool/result_pool.cjs +9 -6
  107. package/dist/pool/result_pool.cjs.map +1 -1
  108. package/dist/pool/result_pool.d.ts.map +1 -1
  109. package/dist/pool/result_pool.js +9 -6
  110. package/dist/pool/result_pool.js.map +1 -1
  111. package/package.json +15 -15
  112. package/src/js_render/computable_context.ts +37 -7
  113. package/src/js_render/context.ts +12 -5
  114. package/src/js_render/index.ts +1 -1
  115. package/src/middle_layer/block.ts +13 -14
  116. package/src/middle_layer/block_ctx.ts +70 -23
  117. package/src/middle_layer/block_ctx_unsafe.ts +11 -4
  118. package/src/middle_layer/middle_layer.ts +2 -1
  119. package/src/middle_layer/project.ts +86 -40
  120. package/src/middle_layer/project_overview.ts +44 -20
  121. package/src/middle_layer/render.test.ts +1 -1
  122. package/src/middle_layer/render.ts +1 -1
  123. package/src/model/block_storage_helper.ts +213 -0
  124. package/src/model/index.ts +2 -1
  125. package/src/model/project_helper.ts +249 -1
  126. package/src/model/project_model.ts +9 -5
  127. package/src/mutator/block-pack/block_pack.ts +1 -2
  128. package/src/mutator/migration.ts +79 -6
  129. package/src/mutator/project-v3.test.ts +280 -0
  130. package/src/mutator/project.test.ts +27 -27
  131. package/src/mutator/project.ts +351 -68
  132. package/src/pool/result_pool.ts +11 -4
@@ -0,0 +1,280 @@
1
+ import { field, poll, TestHelpers, toGlobalResourceId } from '@milaboratories/pl-client';
2
+ import { getQuickJS } from 'quickjs-emscripten';
3
+ import { expect, test } from 'vitest';
4
+ import { outputRef } from '../model/args';
5
+ import { ProjectHelper } from '../model/project_helper';
6
+ import {
7
+ BlockRenderingStateKey,
8
+ projectFieldName,
9
+ ProjectRenderingState
10
+ } from '../model/project_model';
11
+ import {
12
+ TestBPPreparer
13
+ } from '../test/block_packs';
14
+ import { createProject, ProjectMutator } from './project';
15
+ import type { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';
16
+ import path from 'node:path';
17
+
18
+ // V3 block specs - using dev-v2 type with local folders
19
+ // These blocks use the new unified state format (state instead of args+uiState)
20
+ const BPSpecEnterV3: BlockPackSpec = {
21
+ type: 'dev-v2',
22
+ // Navigate from lib/node/pl-middle-layer/src/mutator to etc/blocks/enter-numbers-v3/block
23
+ folder: path.resolve(__dirname, '../../../../../etc/blocks/enter-numbers-v3/block'),
24
+ };
25
+
26
+ const BPSpecSumV3: BlockPackSpec = {
27
+ type: 'dev-v2',
28
+ folder: path.resolve(__dirname, '../../../../../etc/blocks/sum-numbers-v3/block'),
29
+ };
30
+
31
+ test('v3 blocks: basic test with unified state', async () => {
32
+ const quickJs = await getQuickJS();
33
+
34
+ await TestHelpers.withTempRoot(async (pl) => {
35
+ const prj = await pl.withWriteTx('CreatingProject', async (tx) => {
36
+ const prjRef = await createProject(tx);
37
+ tx.createField(field(tx.clientRoot, 'prj'), 'Dynamic', prjRef);
38
+ await tx.commit();
39
+ return await toGlobalResourceId(prjRef);
40
+ });
41
+
42
+ // Add enter-numbers-v3 block with storageMode: 'fromModel'
43
+ // Initial storage comes from VM, then we set desired state via setStates
44
+ await pl.withWriteTx('AddEnterNumbersV3Block', async (tx) => {
45
+ const mut = await ProjectMutator.load(new ProjectHelper(quickJs), tx, prj);
46
+ mut.addBlock(
47
+ { id: 'enter1', label: 'Enter Numbers V3', renderingMode: 'Heavy' },
48
+ {
49
+ storageMode: 'fromModel',
50
+ blockPack: await TestBPPreparer.prepare(BPSpecEnterV3)
51
+ }
52
+ );
53
+ // Set initial test data
54
+ mut.setStates([{
55
+ modelAPIVersion: 2,
56
+ blockId: 'enter1',
57
+ payload: {
58
+ operation: 'update-data',
59
+ value: { numbers: [1, 2, 3] }
60
+ }
61
+ }]);
62
+ mut.save();
63
+ await tx.commit();
64
+ });
65
+
66
+ // Verify blockStorage was saved
67
+ await poll(pl, async (tx) => {
68
+ const prjR = await tx.get(prj);
69
+ const blockStorage = await prjR.get(projectFieldName('enter1', 'blockStorage'));
70
+ const stateData = Buffer.from(blockStorage.data.data!).toString();
71
+ expect(JSON.parse(stateData).__data).toStrictEqual({ numbers: [1, 2, 3] });
72
+ });
73
+
74
+ // Add second enter-numbers-v3 block
75
+ await pl.withWriteTx('AddEnterNumbersV3Block2', async (tx) => {
76
+ const mut = await ProjectMutator.load(new ProjectHelper(quickJs), tx, prj);
77
+ mut.addBlock(
78
+ { id: 'enter2', label: 'Enter Numbers V3 #2', renderingMode: 'Heavy' },
79
+ {
80
+ storageMode: 'fromModel',
81
+ blockPack: await TestBPPreparer.prepare(BPSpecEnterV3)
82
+ }
83
+ );
84
+ mut.setStates([{
85
+ modelAPIVersion: 2,
86
+ blockId: 'enter2',
87
+ payload: {
88
+ operation: 'update-data',
89
+ value: { numbers: [4, 5, 6] }
90
+ }
91
+ }]);
92
+ mut.doRefresh();
93
+ mut.save();
94
+ await tx.commit();
95
+ });
96
+
97
+ // Add sum-numbers-v3 block that references both enter blocks
98
+ await pl.withWriteTx('AddSumNumbersV3Block', async (tx) => {
99
+ const mut = await ProjectMutator.load(new ProjectHelper(quickJs), tx, prj);
100
+ mut.addBlock(
101
+ { id: 'sum1', label: 'Sum Numbers V3', renderingMode: 'Heavy' },
102
+ {
103
+ storageMode: 'fromModel',
104
+ blockPack: await TestBPPreparer.prepare(BPSpecSumV3)
105
+ }
106
+ );
107
+ // Set sources to reference upstream blocks
108
+ mut.setStates([{
109
+ modelAPIVersion: 2,
110
+ blockId: 'sum1',
111
+ payload: {
112
+ operation: 'update-data',
113
+ value: { sources: [outputRef('enter1', 'numbers'), outputRef('enter2', 'numbers')] }
114
+ }
115
+ }]);
116
+ mut.doRefresh();
117
+ mut.save();
118
+ await tx.commit();
119
+ });
120
+
121
+ // Wait for staging outputs
122
+ await poll(pl, async (tx) => {
123
+ const prjR = await tx.get(prj);
124
+ const stagingOutput = await prjR
125
+ .get(projectFieldName('enter1', 'stagingOutput'))
126
+ .then((r) => r.final());
127
+ const all = await stagingOutput.getAllFinal();
128
+ // V3 enter-numbers-v3 block has prerun with numbersCount output
129
+ expect(Object.keys(all)).toContain('numbersCount');
130
+ });
131
+
132
+ // Render production for all blocks
133
+ await pl.withWriteTx('RenderProduction', async (tx) => {
134
+ const mut = await ProjectMutator.load(new ProjectHelper(quickJs), tx, prj);
135
+ mut.renderProduction(['enter1', 'enter2', 'sum1']);
136
+ mut.doRefresh();
137
+ mut.save();
138
+ await tx.commit();
139
+ });
140
+
141
+ // Verify production outputs
142
+ await poll(pl, async (tx) => {
143
+ const prjR = await tx.get(prj);
144
+ const prodOutput = await prjR
145
+ .get(projectFieldName('sum1', 'prodOutput'))
146
+ .then((r) => r.final());
147
+ const all = await prodOutput.getAllFinal();
148
+ expect(Object.keys(all)).toContain('sum');
149
+
150
+ const sumValue = await prodOutput.get('sum');
151
+ const sum = JSON.parse(Buffer.from(sumValue.data.data!).toString());
152
+ // [1,2,3] + [4,5,6] = 21
153
+ expect(sum).toBe(21);
154
+ });
155
+ });
156
+ });
157
+
158
+ test('v3 blocks: prerunArgs skip test', async () => {
159
+ const quickJs = await getQuickJS();
160
+
161
+ await TestHelpers.withTempRoot(async (pl) => {
162
+ const prj = await pl.withWriteTx('CreatingProject', async (tx) => {
163
+ const prjRef = await createProject(tx);
164
+ tx.createField(field(tx.clientRoot, 'prj'), 'Dynamic', prjRef);
165
+ await tx.commit();
166
+ return await toGlobalResourceId(prjRef);
167
+ });
168
+
169
+ // Add enter-numbers-v3 block
170
+ await pl.withWriteTx('AddEnterNumbersV3Block', async (tx) => {
171
+ const mut = await ProjectMutator.load(new ProjectHelper(quickJs), tx, prj);
172
+ mut.addBlock(
173
+ { id: 'enter1', label: 'Enter Numbers V3', renderingMode: 'Heavy' },
174
+ {
175
+ storageMode: 'fromModel',
176
+ blockPack: await TestBPPreparer.prepare(BPSpecEnterV3)
177
+ }
178
+ );
179
+ // Set initial state: [3, 1, 2] - has one even number (2)
180
+ mut.setStates([{
181
+ modelAPIVersion: 2,
182
+ blockId: 'enter1',
183
+ payload: {
184
+ operation: 'update-data',
185
+ value: { numbers: [3, 1, 2] }
186
+ }
187
+ }]);
188
+ mut.doRefresh();
189
+ mut.save();
190
+ await tx.commit();
191
+ });
192
+
193
+ // Wait for initial staging
194
+ await poll(pl, async (tx) => {
195
+ const prjR = await tx.get(prj);
196
+ const stagingOutput = await prjR
197
+ .get(projectFieldName('enter1', 'stagingOutput'))
198
+ .then((r) => r.final());
199
+ const all = await stagingOutput.getAllFinal();
200
+ expect(Object.keys(all)).toContain('numbersCount');
201
+ // Should count even numbers: [2] -> count = 1
202
+ const countValue = await stagingOutput.get('numbersCount');
203
+ const count = JSON.parse(Buffer.from(countValue.data.data!).toString());
204
+ expect(count).toBe(1);
205
+ });
206
+
207
+ // Change state: [3, 1, 2] -> [5, 1, 2]
208
+ // prerunArgs (evenNumbers) stays [2], so staging should be SKIPPED
209
+ await pl.withWriteTx('ChangeState_SamePrerunArgs', async (tx) => {
210
+ const mut = await ProjectMutator.load(new ProjectHelper(quickJs), tx, prj);
211
+ mut.setStates([{
212
+ modelAPIVersion: 2,
213
+ blockId: 'enter1',
214
+ payload: {
215
+ operation: 'update-data',
216
+ value: { numbers: [5, 1, 2] } // Changed odd numbers only
217
+ }
218
+ }]);
219
+ mut.doRefresh();
220
+ mut.save();
221
+ await tx.commit();
222
+ });
223
+
224
+ // Staging should still have numbersCount = 1
225
+ await poll(pl, async (tx) => {
226
+ const prjR = await tx.get(prj);
227
+ const stagingOutput = await prjR
228
+ .get(projectFieldName('enter1', 'stagingOutput'))
229
+ .then((r) => r.final());
230
+ const countValue = await stagingOutput.get('numbersCount');
231
+ const count = JSON.parse(Buffer.from(countValue.data.data!).toString());
232
+ expect(count).toBe(1); // Still 1 (only [2] is even)
233
+ });
234
+
235
+ // Change state: [5, 1, 2] -> [5, 1, 4]
236
+ // prerunArgs (evenNumbers) changes from [2] to [4], so staging should RUN
237
+ await pl.withWriteTx('ChangeState_DifferentPrerunArgs', async (tx) => {
238
+ const mut = await ProjectMutator.load(new ProjectHelper(quickJs), tx, prj);
239
+ mut.setStates([{
240
+ modelAPIVersion: 2,
241
+ blockId: 'enter1',
242
+ payload: {
243
+ operation: 'update-data',
244
+ value: { numbers: [5, 1, 4] } // Changed even number from 2 to 4
245
+ }
246
+ }]);
247
+ mut.doRefresh();
248
+ mut.save();
249
+ await tx.commit();
250
+ });
251
+
252
+ // Wait for new staging
253
+ await poll(pl, async (tx) => {
254
+ const prjR = await tx.get(prj);
255
+ const stagingOutput = await prjR
256
+ .get(projectFieldName('enter1', 'stagingOutput'))
257
+ .then((r) => r.final());
258
+ const countValue = await stagingOutput.get('numbersCount');
259
+ const count = JSON.parse(Buffer.from(countValue.data.data!).toString());
260
+ expect(count).toBe(1); // Still 1 (only [4] is even)
261
+ });
262
+
263
+ // Verify prerunArgsJson output contains evenNumbers, not numbers
264
+ await poll(pl, async (tx) => {
265
+ const prjR = await tx.get(prj);
266
+ const stagingOutput = await prjR
267
+ .get(projectFieldName('enter1', 'stagingOutput'))
268
+ .then((r) => r.final());
269
+
270
+ const prerunArgsValue = await stagingOutput.get('prerunArgsJson');
271
+ const prerunArgs = JSON.parse(Buffer.from(prerunArgsValue.data.data!).toString());
272
+
273
+ // Should have evenNumbers, NOT numbers
274
+ expect(prerunArgs).toHaveProperty('evenNumbers');
275
+ expect(prerunArgs.evenNumbers).toStrictEqual([4]);
276
+ expect(prerunArgs).not.toHaveProperty('numbers');
277
+ });
278
+ });
279
+ });
280
+
@@ -31,8 +31,8 @@ test('simple test #1', async () => {
31
31
  mut.addBlock(
32
32
  { id: 'block1', label: 'Block1', renderingMode: 'Heavy' },
33
33
  {
34
- args: JSON.stringify({ numbers: [1, 2, 3] }),
35
- uiState: "{}",
34
+ storageMode: 'legacy',
35
+ legacyState: JSON.stringify({ args: { numbers: [1, 2, 3] } }),
36
36
  blockPack: await TestBPPreparer.prepare(BPSpecEnterV041NotPrepared)
37
37
  }
38
38
  );
@@ -45,8 +45,8 @@ test('simple test #1', async () => {
45
45
  mut.addBlock(
46
46
  { id: 'block2', label: 'Block2', renderingMode: 'Heavy' },
47
47
  {
48
- args: JSON.stringify({ numbers: [3, 4, 5] }),
49
- uiState: "{}",
48
+ storageMode: 'legacy',
49
+ legacyState: JSON.stringify({ args: { numbers: [3, 4, 5] } }),
50
50
  blockPack: await TestBPPreparer.prepare(BPSpecEnterV041NotPrepared)
51
51
  }
52
52
  );
@@ -60,18 +60,20 @@ test('simple test #1', async () => {
60
60
  mut.addBlock(
61
61
  { id: 'block3', label: 'Block3', renderingMode: 'Heavy' },
62
62
  {
63
- args: JSON.stringify({
64
- sources: [outputRef('block1', 'column'), outputRef('block2', 'column')]
63
+ storageMode: 'legacy',
64
+ legacyState: JSON.stringify({
65
+ args: { sources: [outputRef('block1', 'column'), outputRef('block2', 'column')] },
66
+ uiState: {"some":2}
65
67
  }),
66
- uiState: "{}",
67
68
  blockPack: await TestBPPreparer.prepare(BPSpecSumV042NotPrepared)
68
69
  }
69
70
  );
70
71
  const rendered = mut.renderProduction(['block3'], true);
71
72
  expect([...rendered]).toEqual(['block3']);
73
+ // setStates requires complete unified state (not partial updates)
72
74
  mut.setStates([
73
- { blockId: 'block2', uiState: {"some":1} },
74
- { blockId: 'block3', uiState: {"some":2} }
75
+ { modelAPIVersion: 1, blockId: 'block2', state: { args: { numbers: [3, 4, 5] }, uiState: {"some":1} } },
76
+ { modelAPIVersion: 1, blockId: 'block3', state: { args: { sources: [outputRef('block1', 'column'), outputRef('block2', 'column')] }, uiState: {"some":2} } }
75
77
  ]);
76
78
  mut.doRefresh();
77
79
  mut.save();
@@ -86,7 +88,6 @@ test('simple test #1', async () => {
86
88
  const all = await outputs.getAllFinal();
87
89
  expect(new Set(Object.keys(all))).toEqual(new Set(['sum', 'dependsOnBlocks']));
88
90
  const v = await outputs.get('sum');
89
- console.log(Buffer.from(v.data.data!).toString());
90
91
  });
91
92
 
92
93
  await poll(pl, async (tx) => {
@@ -100,13 +101,15 @@ test('simple test #1', async () => {
100
101
 
101
102
  await poll(pl, async (tx) => {
102
103
  const prjR = await tx.get(prj);
103
- const uiStateB2 = await prjR
104
- .get(projectFieldName('block2', 'uiState'));
105
- expect(Buffer.from(uiStateB2.data.data!).toString()).toEqual('{"some":1}');
104
+ const blockStorageB2 = await prjR
105
+ .get(projectFieldName('block2', 'blockStorage'));
106
+ expect(Buffer.from(blockStorageB2.data.data!).toString()).toEqual('{"args":{"numbers":[3,4,5]},"uiState":{"some":1}}');
106
107
 
107
- const uiStateB3 = await prjR
108
- .get(projectFieldName('block3', 'uiState'));
109
- expect(Buffer.from(uiStateB3.data.data!).toString()).toEqual('{"some":2}');
108
+ const blockStorageB3 = await prjR
109
+ .get(projectFieldName('block3', 'blockStorage'));
110
+ expect(JSON.parse(Buffer.from(blockStorageB3.data.data!).toString()).uiState).toStrictEqual({
111
+ some: 2
112
+ });
110
113
  });
111
114
 
112
115
  await pl.withWriteTx('DeleteBlock2', async (tx) => {
@@ -118,8 +121,8 @@ test('simple test #1', async () => {
118
121
 
119
122
  await poll(pl, async (tx) => {
120
123
  const prjR = await tx.get(prj);
121
- const uiState = prjR.data.fields.find((f) => f.name === projectFieldName('block2', 'uiState'));
122
- expect(uiState).toBeUndefined();
124
+ const blockStorage = prjR.data.fields.find((f) => f.name === projectFieldName('block2', 'blockStorage'));
125
+ expect(blockStorage).toBeUndefined();
123
126
  });
124
127
 
125
128
  await poll(pl, async (tx) => {
@@ -164,7 +167,6 @@ test('simple test #1', async () => {
164
167
  .then((r) => r.final());
165
168
  const v = await outputs.get('sum');
166
169
  // there should be an error here telling that one of the upstream blocks not found
167
- // console.log(Buffer.from(v.data.data!).toString());
168
170
  const renderingState = await prjR.getKValueObj<ProjectRenderingState>(BlockRenderingStateKey);
169
171
  expect(renderingState.blocksInLimbo).not.toContain('block3');
170
172
  });
@@ -187,26 +189,24 @@ test('simple test #2 with bp migration', async () => {
187
189
  mut.addBlock(
188
190
  { id: 'block1', label: 'Block1', renderingMode: 'Heavy' },
189
191
  {
190
- args: JSON.stringify({ numbers: [1, 2, 3] }),
191
- uiState: "{}",
192
+ storageMode: 'legacy',
193
+ legacyState: JSON.stringify({ args: { numbers: [1, 2, 3] } }),
192
194
  blockPack: await TestBPPreparer.prepare(BPSpecEnterV041NotPrepared)
193
195
  }
194
196
  );
195
197
  mut.addBlock(
196
198
  { id: 'block2', label: 'Block2', renderingMode: 'Heavy' },
197
199
  {
198
- args: JSON.stringify({ numbers: [3, 4, 5] }),
199
- uiState: "{}",
200
+ storageMode: 'legacy',
201
+ legacyState: JSON.stringify({ args: { numbers: [3, 4, 5] } }),
200
202
  blockPack: await TestBPPreparer.prepare(BPSpecEnterV041NotPrepared)
201
203
  }
202
204
  );
203
205
  mut.addBlock(
204
206
  { id: 'block3', label: 'Block3', renderingMode: 'Heavy' },
205
207
  {
206
- args: JSON.stringify({
207
- sources: [outputRef('block1', 'column'), outputRef('block2', 'column')]
208
- }),
209
- uiState: "{}",
208
+ storageMode: 'legacy',
209
+ legacyState: JSON.stringify({ args: { sources: [outputRef('block1', 'column'), outputRef('block2', 'column')] }, uiState: {"some":2} }),
210
210
  blockPack: await TestBPPreparer.prepare(BPSpecSumV042NotPrepared)
211
211
  }
212
212
  );