@milaboratories/pl-middle-layer 1.45.5 → 1.46.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.
- package/dist/index.cjs +58 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/js_render/computable_context.cjs +37 -7
- package/dist/js_render/computable_context.cjs.map +1 -1
- package/dist/js_render/computable_context.d.ts.map +1 -1
- package/dist/js_render/computable_context.js +37 -7
- package/dist/js_render/computable_context.js.map +1 -1
- package/dist/js_render/context.cjs +12 -4
- package/dist/js_render/context.cjs.map +1 -1
- package/dist/js_render/context.d.ts +9 -0
- package/dist/js_render/context.d.ts.map +1 -1
- package/dist/js_render/context.js +12 -4
- package/dist/js_render/context.js.map +1 -1
- package/dist/js_render/index.cjs +1 -1
- package/dist/js_render/index.cjs.map +1 -1
- package/dist/js_render/index.js +1 -1
- package/dist/js_render/index.js.map +1 -1
- package/dist/middle_layer/block.cjs +7 -8
- package/dist/middle_layer/block.cjs.map +1 -1
- package/dist/middle_layer/block.d.ts +4 -4
- package/dist/middle_layer/block.d.ts.map +1 -1
- package/dist/middle_layer/block.js +7 -8
- package/dist/middle_layer/block.js.map +1 -1
- package/dist/middle_layer/block_ctx.cjs +67 -13
- package/dist/middle_layer/block_ctx.cjs.map +1 -1
- package/dist/middle_layer/block_ctx.d.ts +4 -7
- package/dist/middle_layer/block_ctx.d.ts.map +1 -1
- package/dist/middle_layer/block_ctx.js +68 -14
- package/dist/middle_layer/block_ctx.js.map +1 -1
- package/dist/middle_layer/block_ctx_unsafe.cjs +10 -3
- package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
- package/dist/middle_layer/block_ctx_unsafe.d.ts +1 -1
- package/dist/middle_layer/block_ctx_unsafe.d.ts.map +1 -1
- package/dist/middle_layer/block_ctx_unsafe.js +10 -3
- package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
- package/dist/middle_layer/frontend_path.cjs +1 -0
- package/dist/middle_layer/frontend_path.cjs.map +1 -1
- package/dist/middle_layer/frontend_path.js +1 -0
- package/dist/middle_layer/frontend_path.js.map +1 -1
- package/dist/middle_layer/middle_layer.cjs +1 -0
- package/dist/middle_layer/middle_layer.cjs.map +1 -1
- package/dist/middle_layer/middle_layer.d.ts +1 -1
- package/dist/middle_layer/middle_layer.d.ts.map +1 -1
- package/dist/middle_layer/middle_layer.js +1 -0
- package/dist/middle_layer/middle_layer.js.map +1 -1
- package/dist/middle_layer/project.cjs +75 -28
- package/dist/middle_layer/project.cjs.map +1 -1
- package/dist/middle_layer/project.d.ts +34 -7
- package/dist/middle_layer/project.d.ts.map +1 -1
- package/dist/middle_layer/project.js +76 -29
- package/dist/middle_layer/project.js.map +1 -1
- package/dist/middle_layer/project_overview.cjs +32 -11
- package/dist/middle_layer/project_overview.cjs.map +1 -1
- package/dist/middle_layer/project_overview.d.ts.map +1 -1
- package/dist/middle_layer/project_overview.js +32 -11
- package/dist/middle_layer/project_overview.js.map +1 -1
- package/dist/middle_layer/render.cjs +1 -1
- package/dist/middle_layer/render.cjs.map +1 -1
- package/dist/middle_layer/render.js +1 -1
- package/dist/middle_layer/render.js.map +1 -1
- package/dist/middle_layer/render.test.d.ts.map +1 -1
- package/dist/model/block_storage_helper.cjs +210 -0
- package/dist/model/block_storage_helper.cjs.map +1 -0
- package/dist/model/block_storage_helper.d.ts +98 -0
- package/dist/model/block_storage_helper.d.ts.map +1 -0
- package/dist/model/block_storage_helper.js +153 -0
- package/dist/model/block_storage_helper.js.map +1 -0
- package/dist/model/index.d.ts +2 -1
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/project_helper.cjs +177 -0
- package/dist/model/project_helper.cjs.map +1 -1
- package/dist/model/project_helper.d.ts +110 -1
- package/dist/model/project_helper.d.ts.map +1 -1
- package/dist/model/project_helper.js +178 -1
- package/dist/model/project_helper.js.map +1 -1
- package/dist/model/project_model.cjs +6 -3
- package/dist/model/project_model.cjs.map +1 -1
- package/dist/model/project_model.d.ts +3 -2
- package/dist/model/project_model.d.ts.map +1 -1
- package/dist/model/project_model.js +6 -4
- package/dist/model/project_model.js.map +1 -1
- package/dist/mutator/block-pack/block_pack.cjs +1 -2
- package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
- package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
- package/dist/mutator/block-pack/block_pack.js +1 -2
- package/dist/mutator/block-pack/block_pack.js.map +1 -1
- package/dist/mutator/block-pack/frontend.cjs +1 -0
- package/dist/mutator/block-pack/frontend.cjs.map +1 -1
- package/dist/mutator/block-pack/frontend.js +1 -0
- package/dist/mutator/block-pack/frontend.js.map +1 -1
- package/dist/mutator/migration.cjs +64 -3
- package/dist/mutator/migration.cjs.map +1 -1
- package/dist/mutator/migration.d.ts.map +1 -1
- package/dist/mutator/migration.js +66 -5
- package/dist/mutator/migration.js.map +1 -1
- package/dist/mutator/project-v3.test.d.ts +2 -0
- package/dist/mutator/project-v3.test.d.ts.map +1 -0
- package/dist/mutator/project.cjs +282 -41
- package/dist/mutator/project.cjs.map +1 -1
- package/dist/mutator/project.d.ts +77 -12
- package/dist/mutator/project.d.ts.map +1 -1
- package/dist/mutator/project.js +283 -42
- package/dist/mutator/project.js.map +1 -1
- package/dist/pool/result_pool.cjs +9 -6
- package/dist/pool/result_pool.cjs.map +1 -1
- package/dist/pool/result_pool.d.ts.map +1 -1
- package/dist/pool/result_pool.js +9 -6
- package/dist/pool/result_pool.js.map +1 -1
- package/package.json +17 -17
- package/src/js_render/computable_context.ts +37 -7
- package/src/js_render/context.ts +12 -5
- package/src/js_render/index.ts +1 -1
- package/src/middle_layer/block.ts +13 -14
- package/src/middle_layer/block_ctx.ts +70 -23
- package/src/middle_layer/block_ctx_unsafe.ts +11 -4
- package/src/middle_layer/middle_layer.ts +2 -1
- package/src/middle_layer/project.ts +86 -40
- package/src/middle_layer/project_overview.ts +44 -20
- package/src/middle_layer/render.test.ts +1 -1
- package/src/middle_layer/render.ts +1 -1
- package/src/model/block_storage_helper.ts +213 -0
- package/src/model/index.ts +2 -1
- package/src/model/project_helper.ts +249 -1
- package/src/model/project_model.ts +9 -5
- package/src/mutator/block-pack/block_pack.ts +1 -2
- package/src/mutator/migration.ts +79 -6
- package/src/mutator/project-v3.test.ts +280 -0
- package/src/mutator/project.test.ts +27 -27
- package/src/mutator/project.ts +351 -68
- 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
|
-
|
|
35
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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
|
-
|
|
64
|
-
|
|
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
|
|
104
|
-
.get(projectFieldName('block2', '
|
|
105
|
-
expect(Buffer.from(
|
|
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
|
|
108
|
-
.get(projectFieldName('block3', '
|
|
109
|
-
expect(Buffer.from(
|
|
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
|
|
122
|
-
expect(
|
|
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
|
-
|
|
191
|
-
|
|
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
|
-
|
|
199
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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
|
);
|