@platforma-sdk/model 1.53.11 → 1.53.13
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/annotations/converter.cjs +11 -11
- package/dist/annotations/converter.cjs.map +1 -1
- package/dist/annotations/converter.d.ts +1 -1
- package/dist/annotations/converter.d.ts.map +1 -1
- package/dist/annotations/converter.js +11 -11
- package/dist/annotations/converter.js.map +1 -1
- package/dist/annotations/index.d.ts +2 -2
- package/dist/annotations/types.d.ts +4 -4
- package/dist/bconfig/index.d.ts +5 -5
- package/dist/bconfig/lambdas.d.ts +7 -7
- package/dist/bconfig/lambdas.d.ts.map +1 -1
- package/dist/bconfig/normalization.cjs.map +1 -1
- package/dist/bconfig/normalization.d.ts +3 -3
- package/dist/bconfig/normalization.js.map +1 -1
- package/dist/bconfig/types.cjs.map +1 -1
- package/dist/bconfig/types.d.ts +2 -2
- package/dist/bconfig/types.d.ts.map +1 -1
- package/dist/bconfig/types.js.map +1 -1
- package/dist/bconfig/util.d.ts +4 -4
- package/dist/bconfig/v3.d.ts +3 -3
- package/dist/block_api_v1.d.ts +2 -2
- package/dist/block_api_v1.d.ts.map +1 -1
- package/dist/block_api_v2.d.ts +2 -2
- package/dist/block_api_v2.d.ts.map +1 -1
- package/dist/block_api_v3.d.ts +3 -3
- package/dist/block_migrations.cjs +10 -10
- package/dist/block_migrations.cjs.map +1 -1
- package/dist/block_migrations.d.ts.map +1 -1
- package/dist/block_migrations.js +10 -10
- package/dist/block_migrations.js.map +1 -1
- package/dist/block_model.cjs +11 -11
- package/dist/block_model.cjs.map +1 -1
- package/dist/block_model.d.ts +8 -8
- package/dist/block_model.d.ts.map +1 -1
- package/dist/block_model.js +11 -11
- package/dist/block_model.js.map +1 -1
- package/dist/block_state_patch.d.ts +2 -2
- package/dist/block_state_util.cjs +1 -1
- package/dist/block_state_util.cjs.map +1 -1
- package/dist/block_state_util.d.ts +3 -3
- package/dist/block_state_util.js +1 -1
- package/dist/block_state_util.js.map +1 -1
- package/dist/block_storage.cjs +10 -10
- package/dist/block_storage.cjs.map +1 -1
- package/dist/block_storage.d.ts +2 -2
- package/dist/block_storage.d.ts.map +1 -1
- package/dist/block_storage.js +10 -10
- package/dist/block_storage.js.map +1 -1
- package/dist/block_storage_vm.cjs +22 -22
- package/dist/block_storage_vm.cjs.map +1 -1
- package/dist/block_storage_vm.d.ts +1 -1
- package/dist/block_storage_vm.d.ts.map +1 -1
- package/dist/block_storage_vm.js +22 -22
- package/dist/block_storage_vm.js.map +1 -1
- package/dist/builder.cjs +32 -23
- package/dist/builder.cjs.map +1 -1
- package/dist/builder.d.ts +7 -7
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +32 -23
- package/dist/builder.js.map +1 -1
- package/dist/components/PFrameForGraphs.cjs +7 -6
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts +4 -4
- package/dist/components/PFrameForGraphs.d.ts.map +1 -1
- package/dist/components/PFrameForGraphs.js +7 -6
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/components/PlAnnotations/filter.d.ts +14 -14
- package/dist/components/PlAnnotations/filter.d.ts.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.cjs +46 -46
- package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.d.ts +10 -34
- package/dist/components/PlAnnotations/filters_ui.d.ts.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.js +46 -46
- package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
- package/dist/components/PlAnnotations/index.d.ts +2 -2
- package/dist/components/PlAnnotations/types.d.ts +2 -2
- package/dist/components/PlDataTable.cjs +19 -20
- package/dist/components/PlDataTable.cjs.map +1 -1
- package/dist/components/PlDataTable.d.ts +27 -27
- package/dist/components/PlDataTable.d.ts.map +1 -1
- package/dist/components/PlDataTable.js +19 -20
- package/dist/components/PlDataTable.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.cjs +2 -2
- package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.d.ts +6 -6
- package/dist/components/PlMultiSequenceAlignment.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.js +2 -2
- package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
- package/dist/components/PlSelectionModel.cjs.map +1 -1
- package/dist/components/PlSelectionModel.d.ts +1 -1
- package/dist/components/PlSelectionModel.js.map +1 -1
- package/dist/components/index.d.ts +5 -5
- package/dist/config/actions.cjs +39 -39
- package/dist/config/actions.cjs.map +1 -1
- package/dist/config/actions.d.ts +9 -9
- package/dist/config/actions.d.ts.map +1 -1
- package/dist/config/actions.js +39 -39
- package/dist/config/actions.js.map +1 -1
- package/dist/config/actions_kinds.d.ts +30 -30
- package/dist/config/actions_kinds.d.ts.map +1 -1
- package/dist/config/index.d.ts +6 -6
- package/dist/config/model.d.ts +28 -28
- package/dist/config/model_meta.d.ts +1 -1
- package/dist/config/type_engine.d.ts +3 -3
- package/dist/config/type_util.d.ts +2 -2
- package/dist/env_value.cjs +1 -1
- package/dist/env_value.cjs.map +1 -1
- package/dist/env_value.js +1 -1
- package/dist/env_value.js.map +1 -1
- package/dist/filters/converter.cjs +36 -32
- package/dist/filters/converter.cjs.map +1 -1
- package/dist/filters/converter.d.ts +2 -2
- package/dist/filters/converter.d.ts.map +1 -1
- package/dist/filters/converter.js +36 -32
- package/dist/filters/converter.js.map +1 -1
- package/dist/filters/index.d.ts +2 -2
- package/dist/filters/types.d.ts +33 -33
- package/dist/filters/types.d.ts.map +1 -1
- package/dist/index.d.ts +24 -24
- package/dist/internal.cjs +7 -7
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.ts +4 -4
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +7 -7
- package/dist/internal.js.map +1 -1
- package/dist/package.json.cjs +1 -1
- package/dist/package.json.js +1 -1
- package/dist/pframe.cjs +1 -1
- package/dist/pframe.cjs.map +1 -1
- package/dist/pframe.d.ts +1 -1
- package/dist/pframe.js +1 -1
- package/dist/pframe.js.map +1 -1
- package/dist/pframe_utils/columns.cjs +23 -15
- package/dist/pframe_utils/columns.cjs.map +1 -1
- package/dist/pframe_utils/columns.d.ts +3 -3
- package/dist/pframe_utils/columns.d.ts.map +1 -1
- package/dist/pframe_utils/columns.js +23 -15
- package/dist/pframe_utils/columns.js.map +1 -1
- package/dist/pframe_utils/index.cjs +25 -25
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.d.ts +3 -3
- package/dist/pframe_utils/index.d.ts.map +1 -1
- package/dist/pframe_utils/index.js +25 -25
- package/dist/pframe_utils/index.js.map +1 -1
- package/dist/platforma.d.ts +7 -7
- package/dist/platforma.d.ts.map +1 -1
- package/dist/raw_globals.cjs +4 -1
- package/dist/raw_globals.cjs.map +1 -1
- package/dist/raw_globals.d.ts +2 -2
- package/dist/raw_globals.d.ts.map +1 -1
- package/dist/raw_globals.js +4 -1
- package/dist/raw_globals.js.map +1 -1
- package/dist/ref_util.cjs +4 -4
- package/dist/ref_util.cjs.map +1 -1
- package/dist/ref_util.d.ts +1 -1
- package/dist/ref_util.js +4 -4
- package/dist/ref_util.js.map +1 -1
- package/dist/render/accessor.cjs +24 -24
- package/dist/render/accessor.cjs.map +1 -1
- package/dist/render/accessor.d.ts +10 -10
- package/dist/render/accessor.d.ts.map +1 -1
- package/dist/render/accessor.js +24 -24
- package/dist/render/accessor.js.map +1 -1
- package/dist/render/api.cjs +23 -23
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +11 -11
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +23 -23
- package/dist/render/api.js.map +1 -1
- package/dist/render/future.cjs.map +1 -1
- package/dist/render/future.d.ts +1 -1
- package/dist/render/future.js.map +1 -1
- package/dist/render/index.d.ts +6 -6
- package/dist/render/internal.cjs +4 -4
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +7 -7
- package/dist/render/internal.d.ts.map +1 -1
- package/dist/render/internal.js +4 -4
- package/dist/render/internal.js.map +1 -1
- package/dist/render/traversal_ops.d.ts +1 -1
- package/dist/render/util/axis_filtering.cjs +48 -44
- package/dist/render/util/axis_filtering.cjs.map +1 -1
- package/dist/render/util/axis_filtering.d.ts +2 -2
- package/dist/render/util/axis_filtering.js +48 -44
- package/dist/render/util/axis_filtering.js.map +1 -1
- package/dist/render/util/column_collection.cjs +42 -35
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +4 -4
- package/dist/render/util/column_collection.d.ts.map +1 -1
- package/dist/render/util/column_collection.js +42 -35
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.d.ts +4 -4
- package/dist/render/util/label.cjs +15 -21
- package/dist/render/util/label.cjs.map +1 -1
- package/dist/render/util/label.d.ts +2 -2
- package/dist/render/util/label.d.ts.map +1 -1
- package/dist/render/util/label.js +15 -21
- package/dist/render/util/label.js.map +1 -1
- package/dist/render/util/pcolumn_data.cjs +56 -54
- package/dist/render/util/pcolumn_data.cjs.map +1 -1
- package/dist/render/util/pcolumn_data.d.ts +5 -5
- package/dist/render/util/pcolumn_data.d.ts.map +1 -1
- package/dist/render/util/pcolumn_data.js +56 -54
- package/dist/render/util/pcolumn_data.js.map +1 -1
- package/dist/render/util/pframe_upgraders.cjs +6 -6
- package/dist/render/util/pframe_upgraders.cjs.map +1 -1
- package/dist/render/util/pframe_upgraders.d.ts +1 -1
- package/dist/render/util/pframe_upgraders.d.ts.map +1 -1
- package/dist/render/util/pframe_upgraders.js +6 -6
- package/dist/render/util/pframe_upgraders.js.map +1 -1
- package/dist/render/util/split_selectors.d.ts +1 -1
- package/dist/render/util/split_selectors.d.ts.map +1 -1
- package/dist/sdk_info.cjs.map +1 -1
- package/dist/sdk_info.js.map +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +24 -22
- package/src/annotations/converter.test.ts +98 -101
- package/src/annotations/converter.ts +21 -17
- package/src/annotations/index.ts +2 -2
- package/src/annotations/types.ts +4 -4
- package/src/bconfig/index.ts +5 -5
- package/src/bconfig/lambdas.ts +10 -12
- package/src/bconfig/normalization.ts +5 -5
- package/src/bconfig/types.ts +3 -5
- package/src/bconfig/util.ts +3 -3
- package/src/bconfig/v3.ts +3 -3
- package/src/block_api_v1.ts +7 -3
- package/src/block_api_v2.ts +7 -3
- package/src/block_api_v3.ts +3 -3
- package/src/block_migrations.test.ts +66 -67
- package/src/block_migrations.ts +16 -16
- package/src/block_model.ts +76 -140
- package/src/block_state_patch.ts +2 -2
- package/src/block_state_util.ts +4 -4
- package/src/block_storage.test.ts +106 -99
- package/src/block_storage.ts +22 -25
- package/src/block_storage_vm.ts +41 -35
- package/src/builder.ts +107 -95
- package/src/components/PFrameForGraphs.test.ts +261 -255
- package/src/components/PFrameForGraphs.ts +35 -22
- package/src/components/PlAnnotations/filter.ts +21 -15
- package/src/components/PlAnnotations/filters_ui.test.ts +230 -73
- package/src/components/PlAnnotations/filters_ui.ts +138 -105
- package/src/components/PlAnnotations/index.ts +2 -2
- package/src/components/PlAnnotations/types.ts +2 -2
- package/src/components/PlDataTable.ts +177 -164
- package/src/components/PlMultiSequenceAlignment.ts +11 -18
- package/src/components/PlSelectionModel.ts +1 -1
- package/src/components/index.ts +5 -5
- package/src/config/actions.ts +64 -59
- package/src/config/actions_kinds.ts +38 -34
- package/src/config/index.ts +6 -6
- package/src/config/model.ts +28 -28
- package/src/config/model_meta.ts +1 -1
- package/src/config/type_engine.ts +3 -3
- package/src/config/type_util.ts +2 -2
- package/src/env_value.ts +2 -2
- package/src/filters/converter.test.ts +185 -144
- package/src/filters/converter.ts +47 -35
- package/src/filters/index.ts +2 -2
- package/src/filters/types.ts +44 -39
- package/src/global.d.ts +1 -1
- package/src/index.ts +24 -24
- package/src/internal.ts +27 -17
- package/src/pframe.ts +3 -3
- package/src/pframe_utils/columns.ts +81 -31
- package/src/pframe_utils/index.ts +65 -43
- package/src/platforma.ts +44 -21
- package/src/raw_globals.ts +13 -7
- package/src/ref_util.ts +6 -6
- package/src/render/accessor.ts +43 -44
- package/src/render/api.ts +102 -78
- package/src/render/future.ts +2 -2
- package/src/render/index.ts +6 -6
- package/src/render/internal.ts +11 -12
- package/src/render/traversal_ops.ts +1 -1
- package/src/render/util/axis_filtering.ts +67 -52
- package/src/render/util/column_collection.ts +171 -91
- package/src/render/util/index.ts +4 -4
- package/src/render/util/label.test.ts +139 -139
- package/src/render/util/label.ts +42 -33
- package/src/render/util/pcolumn_data.ts +111 -75
- package/src/render/util/pframe_upgraders.ts +24 -13
- package/src/render/util/split_selectors.ts +6 -1
- package/src/sdk_info.ts +1 -1
- package/src/typing.test.ts +56 -56
- package/src/version.ts +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect, it } from
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
2
|
import {
|
|
3
3
|
BLOCK_STORAGE_KEY,
|
|
4
4
|
BLOCK_STORAGE_SCHEMA_VERSION,
|
|
@@ -18,63 +18,65 @@ import {
|
|
|
18
18
|
updateStorageData,
|
|
19
19
|
updateStorageDataVersion,
|
|
20
20
|
updateStorage,
|
|
21
|
-
} from
|
|
21
|
+
} from "./block_storage";
|
|
22
22
|
|
|
23
|
-
describe(
|
|
24
|
-
describe(
|
|
25
|
-
it(
|
|
26
|
-
expect(typeof BLOCK_STORAGE_KEY).toBe(
|
|
27
|
-
expect(BLOCK_STORAGE_KEY).toBe(
|
|
23
|
+
describe("BlockStorage", () => {
|
|
24
|
+
describe("BLOCK_STORAGE_KEY and BLOCK_STORAGE_SCHEMA_VERSION", () => {
|
|
25
|
+
it("should have correct key constant", () => {
|
|
26
|
+
expect(typeof BLOCK_STORAGE_KEY).toBe("string");
|
|
27
|
+
expect(BLOCK_STORAGE_KEY).toBe("__pl_a7f3e2b9__");
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
-
it(
|
|
31
|
-
expect(BLOCK_STORAGE_SCHEMA_VERSION).toBe(
|
|
30
|
+
it("should have correct schema version", () => {
|
|
31
|
+
expect(BLOCK_STORAGE_SCHEMA_VERSION).toBe("v1");
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
describe(
|
|
36
|
-
it(
|
|
35
|
+
describe("isBlockStorage", () => {
|
|
36
|
+
it("should return true for valid BlockStorage with discriminator", () => {
|
|
37
37
|
const storage = createBlockStorage({});
|
|
38
38
|
expect(isBlockStorage(storage)).toBe(true);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
it(
|
|
42
|
-
const storage = setPluginData(createBlockStorage({ foo:
|
|
41
|
+
it("should return true for BlockStorage with plugin data", () => {
|
|
42
|
+
const storage = setPluginData(createBlockStorage({ foo: "bar" }), "test", { data: 123 });
|
|
43
43
|
expect(isBlockStorage(storage)).toBe(true);
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
it(
|
|
46
|
+
it("should return false for null", () => {
|
|
47
47
|
expect(isBlockStorage(null)).toBe(false);
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
-
it(
|
|
50
|
+
it("should return false for undefined", () => {
|
|
51
51
|
expect(isBlockStorage(undefined)).toBe(false);
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
-
it(
|
|
54
|
+
it("should return false for primitive values", () => {
|
|
55
55
|
expect(isBlockStorage(42)).toBe(false);
|
|
56
|
-
expect(isBlockStorage(
|
|
56
|
+
expect(isBlockStorage("string")).toBe(false);
|
|
57
57
|
expect(isBlockStorage(true)).toBe(false);
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
-
it(
|
|
61
|
-
expect(isBlockStorage({ __dataVersion:
|
|
60
|
+
it("should return false for objects without discriminator", () => {
|
|
61
|
+
expect(isBlockStorage({ __dataVersion: "v1", __data: {} })).toBe(false);
|
|
62
62
|
});
|
|
63
63
|
|
|
64
|
-
it(
|
|
65
|
-
expect(
|
|
64
|
+
it("should return false for objects with wrong discriminator value", () => {
|
|
65
|
+
expect(
|
|
66
|
+
isBlockStorage({ [BLOCK_STORAGE_KEY]: "wrong", __dataVersion: "v1", __data: {} }),
|
|
67
|
+
).toBe(false);
|
|
66
68
|
});
|
|
67
69
|
});
|
|
68
70
|
|
|
69
|
-
describe(
|
|
70
|
-
it(
|
|
71
|
+
describe("createBlockStorage", () => {
|
|
72
|
+
it("should create storage with discriminator key and default values", () => {
|
|
71
73
|
const storage = createBlockStorage();
|
|
72
74
|
expect(storage[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
73
75
|
expect(storage.__dataVersion).toBe(DATA_MODEL_DEFAULT_VERSION);
|
|
74
76
|
expect(storage.__data).toEqual({});
|
|
75
77
|
});
|
|
76
78
|
|
|
77
|
-
it(
|
|
79
|
+
it("should create storage with custom initial data", () => {
|
|
78
80
|
const data = { numbers: [1, 2, 3] };
|
|
79
81
|
const storage = createBlockStorage(data);
|
|
80
82
|
expect(storage[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
@@ -82,37 +84,37 @@ describe('BlockStorage', () => {
|
|
|
82
84
|
expect(storage.__data).toEqual(data);
|
|
83
85
|
});
|
|
84
86
|
|
|
85
|
-
it(
|
|
86
|
-
const storage = createBlockStorage({ foo:
|
|
87
|
+
it("should create storage with custom version", () => {
|
|
88
|
+
const storage = createBlockStorage({ foo: "bar" }, "v5");
|
|
87
89
|
expect(storage[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
88
|
-
expect(storage.__dataVersion).toBe(
|
|
89
|
-
expect(storage.__data).toEqual({ foo:
|
|
90
|
+
expect(storage.__dataVersion).toBe("v5");
|
|
91
|
+
expect(storage.__data).toEqual({ foo: "bar" });
|
|
90
92
|
});
|
|
91
93
|
});
|
|
92
94
|
|
|
93
|
-
describe(
|
|
94
|
-
it(
|
|
95
|
-
const storage = createBlockStorage({ data:
|
|
95
|
+
describe("normalizeBlockStorage", () => {
|
|
96
|
+
it("should return BlockStorage as-is", () => {
|
|
97
|
+
const storage = createBlockStorage({ data: "test" }, "v2");
|
|
96
98
|
const normalized = normalizeBlockStorage(storage);
|
|
97
99
|
expect(normalized).toEqual(storage);
|
|
98
100
|
});
|
|
99
101
|
|
|
100
|
-
it(
|
|
101
|
-
const legacyData = { numbers: [1, 2, 3], name:
|
|
102
|
+
it("should wrap legacy data in BlockStorage structure", () => {
|
|
103
|
+
const legacyData = { numbers: [1, 2, 3], name: "test" };
|
|
102
104
|
const normalized = normalizeBlockStorage(legacyData);
|
|
103
105
|
expect(normalized[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
104
106
|
expect(normalized.__dataVersion).toBe(DATA_MODEL_DEFAULT_VERSION);
|
|
105
107
|
expect(normalized.__data).toEqual(legacyData);
|
|
106
108
|
});
|
|
107
109
|
|
|
108
|
-
it(
|
|
109
|
-
const normalized = normalizeBlockStorage(
|
|
110
|
+
it("should wrap primitive legacy data", () => {
|
|
111
|
+
const normalized = normalizeBlockStorage("simple string");
|
|
110
112
|
expect(normalized[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
111
113
|
expect(normalized.__dataVersion).toBe(DATA_MODEL_DEFAULT_VERSION);
|
|
112
|
-
expect(normalized.__data).toBe(
|
|
114
|
+
expect(normalized.__data).toBe("simple string");
|
|
113
115
|
});
|
|
114
116
|
|
|
115
|
-
it(
|
|
117
|
+
it("should wrap null legacy data", () => {
|
|
116
118
|
const normalized = normalizeBlockStorage(null);
|
|
117
119
|
expect(normalized[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
118
120
|
expect(normalized.__dataVersion).toBe(DATA_MODEL_DEFAULT_VERSION);
|
|
@@ -120,117 +122,120 @@ describe('BlockStorage', () => {
|
|
|
120
122
|
});
|
|
121
123
|
});
|
|
122
124
|
|
|
123
|
-
describe(
|
|
124
|
-
const storage = createBlockStorage({ count: 42 },
|
|
125
|
+
describe("Data access functions", () => {
|
|
126
|
+
const storage = createBlockStorage({ count: 42 }, "v3");
|
|
125
127
|
|
|
126
|
-
it(
|
|
128
|
+
it("getStorageData should return the data", () => {
|
|
127
129
|
expect(getStorageData(storage)).toEqual({ count: 42 });
|
|
128
130
|
});
|
|
129
131
|
|
|
130
|
-
it(
|
|
131
|
-
expect(getStorageDataVersion(storage)).toBe(
|
|
132
|
+
it("getStorageDataVersion should return the version", () => {
|
|
133
|
+
expect(getStorageDataVersion(storage)).toBe("v3");
|
|
132
134
|
});
|
|
133
135
|
|
|
134
|
-
it(
|
|
135
|
-
const newStorage = updateStorageData(storage, {
|
|
136
|
+
it("updateStorageData should return new storage with updated data", () => {
|
|
137
|
+
const newStorage = updateStorageData(storage, {
|
|
138
|
+
operation: "update-data",
|
|
139
|
+
value: { count: 100 },
|
|
140
|
+
});
|
|
136
141
|
expect(newStorage.__data).toEqual({ count: 100 });
|
|
137
|
-
expect(newStorage.__dataVersion).toBe(
|
|
142
|
+
expect(newStorage.__dataVersion).toBe("v3");
|
|
138
143
|
expect(newStorage[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
139
144
|
// Original should be unchanged
|
|
140
145
|
expect(storage.__data).toEqual({ count: 42 });
|
|
141
146
|
});
|
|
142
147
|
|
|
143
|
-
it(
|
|
144
|
-
const newStorage = updateStorageDataVersion(storage,
|
|
145
|
-
expect(newStorage.__dataVersion).toBe(
|
|
148
|
+
it("updateStorageDataVersion should return new storage with updated version", () => {
|
|
149
|
+
const newStorage = updateStorageDataVersion(storage, "v5");
|
|
150
|
+
expect(newStorage.__dataVersion).toBe("v5");
|
|
146
151
|
expect(newStorage.__data).toEqual({ count: 42 });
|
|
147
152
|
expect(newStorage[BLOCK_STORAGE_KEY]).toBe(BLOCK_STORAGE_SCHEMA_VERSION);
|
|
148
153
|
// Original should be unchanged
|
|
149
|
-
expect(storage.__dataVersion).toBe(
|
|
154
|
+
expect(storage.__dataVersion).toBe("v3");
|
|
150
155
|
});
|
|
151
156
|
});
|
|
152
157
|
|
|
153
|
-
describe(
|
|
158
|
+
describe("Plugin data functions", () => {
|
|
154
159
|
const baseStorage = createBlockStorage({});
|
|
155
160
|
|
|
156
|
-
it(
|
|
157
|
-
const storage = setPluginData(baseStorage,
|
|
158
|
-
expect(storage[
|
|
161
|
+
it("setPluginData should add plugin data", () => {
|
|
162
|
+
const storage = setPluginData(baseStorage, "table", { columns: ["a", "b"] });
|
|
163
|
+
expect(storage["@plugin/table"]).toEqual({ columns: ["a", "b"] });
|
|
159
164
|
});
|
|
160
165
|
|
|
161
|
-
it(
|
|
162
|
-
const storage = setPluginData(baseStorage,
|
|
163
|
-
expect(getPluginData(storage,
|
|
166
|
+
it("getPluginData should retrieve plugin data", () => {
|
|
167
|
+
const storage = setPluginData(baseStorage, "chart", { type: "bar" });
|
|
168
|
+
expect(getPluginData(storage, "chart")).toEqual({ type: "bar" });
|
|
164
169
|
});
|
|
165
170
|
|
|
166
|
-
it(
|
|
167
|
-
expect(getPluginData(baseStorage,
|
|
171
|
+
it("getPluginData should return undefined for missing plugin", () => {
|
|
172
|
+
expect(getPluginData(baseStorage, "nonexistent")).toBeUndefined();
|
|
168
173
|
});
|
|
169
174
|
|
|
170
|
-
it(
|
|
171
|
-
let storage = setPluginData(baseStorage,
|
|
172
|
-
storage = setPluginData(storage,
|
|
173
|
-
const result = removePluginData(storage,
|
|
174
|
-
expect(result[
|
|
175
|
-
expect(result[
|
|
175
|
+
it("removePluginData should remove plugin data", () => {
|
|
176
|
+
let storage = setPluginData(baseStorage, "toRemove", { data: "test" });
|
|
177
|
+
storage = setPluginData(storage, "toKeep", { other: "data" });
|
|
178
|
+
const result = removePluginData(storage, "toRemove");
|
|
179
|
+
expect(result["@plugin/toRemove"]).toBeUndefined();
|
|
180
|
+
expect(result["@plugin/toKeep"]).toEqual({ other: "data" });
|
|
176
181
|
});
|
|
177
182
|
|
|
178
|
-
it(
|
|
183
|
+
it("getPluginNames should return all plugin names", () => {
|
|
179
184
|
let storage = createBlockStorage({});
|
|
180
|
-
storage = setPluginData(storage,
|
|
181
|
-
storage = setPluginData(storage,
|
|
182
|
-
storage = setPluginData(storage,
|
|
185
|
+
storage = setPluginData(storage, "alpha", {});
|
|
186
|
+
storage = setPluginData(storage, "beta", {});
|
|
187
|
+
storage = setPluginData(storage, "gamma", {});
|
|
183
188
|
const names = getPluginNames(storage);
|
|
184
|
-
expect(names.sort()).toEqual([
|
|
189
|
+
expect(names.sort()).toEqual(["alpha", "beta", "gamma"]);
|
|
185
190
|
});
|
|
186
191
|
|
|
187
|
-
it(
|
|
192
|
+
it("getPluginNames should return empty array when no plugins", () => {
|
|
188
193
|
expect(getPluginNames(baseStorage)).toEqual([]);
|
|
189
194
|
});
|
|
190
195
|
});
|
|
191
196
|
|
|
192
|
-
describe(
|
|
193
|
-
const storage = createBlockStorage(
|
|
197
|
+
describe("Generic storage access", () => {
|
|
198
|
+
const storage = createBlockStorage("hello", "v2");
|
|
194
199
|
|
|
195
|
-
it(
|
|
196
|
-
expect(getFromStorage(storage,
|
|
200
|
+
it("getFromStorage should get __data", () => {
|
|
201
|
+
expect(getFromStorage(storage, "__data")).toBe("hello");
|
|
197
202
|
});
|
|
198
203
|
|
|
199
|
-
it(
|
|
200
|
-
expect(getFromStorage(storage,
|
|
204
|
+
it("getFromStorage should get __dataVersion", () => {
|
|
205
|
+
expect(getFromStorage(storage, "__dataVersion")).toBe("v2");
|
|
201
206
|
});
|
|
202
207
|
|
|
203
|
-
it(
|
|
204
|
-
const updated = updateStorage(storage,
|
|
205
|
-
expect(updated.__data).toBe(
|
|
206
|
-
expect(storage.__data).toBe(
|
|
208
|
+
it("updateStorage should update any key", () => {
|
|
209
|
+
const updated = updateStorage(storage, "__data", "world");
|
|
210
|
+
expect(updated.__data).toBe("world");
|
|
211
|
+
expect(storage.__data).toBe("hello"); // immutable
|
|
207
212
|
});
|
|
208
213
|
});
|
|
209
214
|
|
|
210
|
-
describe(
|
|
211
|
-
describe(
|
|
212
|
-
it(
|
|
213
|
-
const storage = createBlockStorage(
|
|
214
|
-
const result = defaultBlockStorageHandlers.transformStateForStorage(storage,
|
|
215
|
-
expect(result.__data).toBe(
|
|
215
|
+
describe("BlockStorageHandlers", () => {
|
|
216
|
+
describe("defaultBlockStorageHandlers", () => {
|
|
217
|
+
it("transformStateForStorage should replace data", () => {
|
|
218
|
+
const storage = createBlockStorage("old");
|
|
219
|
+
const result = defaultBlockStorageHandlers.transformStateForStorage(storage, "new");
|
|
220
|
+
expect(result.__data).toBe("new");
|
|
216
221
|
expect(result.__dataVersion).toBe(DATA_MODEL_DEFAULT_VERSION);
|
|
217
222
|
});
|
|
218
223
|
|
|
219
|
-
it(
|
|
220
|
-
const storage = createBlockStorage({ data:
|
|
221
|
-
expect(defaultBlockStorageHandlers.deriveStateForArgs(storage)).toEqual({ data:
|
|
224
|
+
it("deriveStateForArgs should return data directly", () => {
|
|
225
|
+
const storage = createBlockStorage({ data: "test" });
|
|
226
|
+
expect(defaultBlockStorageHandlers.deriveStateForArgs(storage)).toEqual({ data: "test" });
|
|
222
227
|
});
|
|
223
228
|
|
|
224
|
-
it(
|
|
225
|
-
const storage = createBlockStorage({ data:
|
|
226
|
-
const result = defaultBlockStorageHandlers.migrateStorage(storage,
|
|
227
|
-
expect(result.__dataVersion).toBe(
|
|
228
|
-
expect(result.__data).toEqual({ data:
|
|
229
|
+
it("migrateStorage should update version only", () => {
|
|
230
|
+
const storage = createBlockStorage({ data: "test" });
|
|
231
|
+
const result = defaultBlockStorageHandlers.migrateStorage(storage, "v1", "v3");
|
|
232
|
+
expect(result.__dataVersion).toBe("v3");
|
|
233
|
+
expect(result.__data).toEqual({ data: "test" });
|
|
229
234
|
});
|
|
230
235
|
});
|
|
231
236
|
|
|
232
|
-
describe(
|
|
233
|
-
it(
|
|
237
|
+
describe("mergeBlockStorageHandlers", () => {
|
|
238
|
+
it("should return defaults when no custom handlers provided", () => {
|
|
234
239
|
const handlers = mergeBlockStorageHandlers();
|
|
235
240
|
expect(handlers.transformStateForStorage).toBe(
|
|
236
241
|
defaultBlockStorageHandlers.transformStateForStorage,
|
|
@@ -239,8 +244,11 @@ describe('BlockStorage', () => {
|
|
|
239
244
|
expect(handlers.migrateStorage).toBe(defaultBlockStorageHandlers.migrateStorage);
|
|
240
245
|
});
|
|
241
246
|
|
|
242
|
-
it(
|
|
243
|
-
const customTransform = <T>(
|
|
247
|
+
it("should override with custom handlers", () => {
|
|
248
|
+
const customTransform = <T>(
|
|
249
|
+
storage: ReturnType<typeof createBlockStorage<T>>,
|
|
250
|
+
data: T,
|
|
251
|
+
) => ({
|
|
244
252
|
...storage,
|
|
245
253
|
__data: data,
|
|
246
254
|
__dataVersion: `${storage.__dataVersion}-next`,
|
|
@@ -256,4 +264,3 @@ describe('BlockStorage', () => {
|
|
|
256
264
|
});
|
|
257
265
|
});
|
|
258
266
|
});
|
|
259
|
-
|
package/src/block_storage.ts
CHANGED
|
@@ -17,24 +17,24 @@
|
|
|
17
17
|
* Discriminator key for BlockStorage format detection.
|
|
18
18
|
* This unique hash-based key identifies data as BlockStorage vs legacy formats.
|
|
19
19
|
*/
|
|
20
|
-
export const BLOCK_STORAGE_KEY =
|
|
20
|
+
export const BLOCK_STORAGE_KEY = "__pl_a7f3e2b9__";
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Current BlockStorage schema version.
|
|
24
24
|
* Increment this when the storage structure itself changes (not block state migrations).
|
|
25
25
|
*/
|
|
26
|
-
export const BLOCK_STORAGE_SCHEMA_VERSION =
|
|
26
|
+
export const BLOCK_STORAGE_SCHEMA_VERSION = "v1";
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* Default data version for new blocks without migrations.
|
|
30
30
|
* Unique identifier ensures blocks are created via DataModel API.
|
|
31
31
|
*/
|
|
32
|
-
export const DATA_MODEL_DEFAULT_VERSION =
|
|
32
|
+
export const DATA_MODEL_DEFAULT_VERSION = "__pl_v1_d4e8f2a1__";
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
35
|
* Type for valid schema versions
|
|
36
36
|
*/
|
|
37
|
-
export type BlockStorageSchemaVersion =
|
|
37
|
+
export type BlockStorageSchemaVersion = "v1"; // Add 'v2', 'v3', etc. as schema evolves
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Plugin key type - keys starting with `@plugin/` are reserved for plugin data
|
|
@@ -65,11 +65,11 @@ export type BlockStorage<TState = unknown> = {
|
|
|
65
65
|
* Checks for the discriminator key and valid schema version.
|
|
66
66
|
*/
|
|
67
67
|
export function isBlockStorage(value: unknown): value is BlockStorage {
|
|
68
|
-
if (value === null || typeof value !==
|
|
68
|
+
if (value === null || typeof value !== "object") return false;
|
|
69
69
|
const obj = value as Record<string, unknown>;
|
|
70
70
|
const schemaVersion = obj[BLOCK_STORAGE_KEY];
|
|
71
71
|
// Currently only 'v1' is valid, but this allows future versions
|
|
72
|
-
return schemaVersion ===
|
|
72
|
+
return schemaVersion === "v1"; // Add more versions as schema evolves
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
// =============================================================================
|
|
@@ -108,9 +108,10 @@ export function normalizeBlockStorage<TState = unknown>(raw: unknown): BlockStor
|
|
|
108
108
|
return {
|
|
109
109
|
...storage,
|
|
110
110
|
// Fix for early released version where __dataVersion was a number
|
|
111
|
-
__dataVersion:
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
__dataVersion:
|
|
112
|
+
typeof storage.__dataVersion === "number"
|
|
113
|
+
? DATA_MODEL_DEFAULT_VERSION
|
|
114
|
+
: storage.__dataVersion,
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
117
|
// Legacy format: raw is the state directly
|
|
@@ -142,16 +143,14 @@ export function getStorageData<TState>(storage: BlockStorage<TState>): TState {
|
|
|
142
143
|
* @param rawStorage - Raw storage data from middle layer (may be any format)
|
|
143
144
|
* @returns The extracted data value, or undefined if storage is undefined/null
|
|
144
145
|
*/
|
|
145
|
-
export function deriveDataFromStorage<TData = unknown>(
|
|
146
|
-
rawStorage: unknown,
|
|
147
|
-
): TData {
|
|
146
|
+
export function deriveDataFromStorage<TData = unknown>(rawStorage: unknown): TData {
|
|
148
147
|
// Normalize to BlockStorage format (handles legacy formats too)
|
|
149
148
|
const storage = normalizeBlockStorage<TData>(rawStorage);
|
|
150
149
|
return getStorageData(storage);
|
|
151
150
|
}
|
|
152
151
|
|
|
153
152
|
/** Payload for storage mutation operations. SDK defines specific operations. */
|
|
154
|
-
export type MutateStoragePayload<T = unknown> = { operation:
|
|
153
|
+
export type MutateStoragePayload<T = unknown> = { operation: "update-data"; value: T };
|
|
155
154
|
|
|
156
155
|
/**
|
|
157
156
|
* Updates the data in BlockStorage (immutable)
|
|
@@ -165,7 +164,7 @@ export function updateStorageData<TValue = unknown>(
|
|
|
165
164
|
payload: MutateStoragePayload<TValue>,
|
|
166
165
|
): BlockStorage<TValue> {
|
|
167
166
|
switch (payload.operation) {
|
|
168
|
-
case
|
|
167
|
+
case "update-data":
|
|
169
168
|
return { ...storage, __data: payload.value };
|
|
170
169
|
default:
|
|
171
170
|
throw new Error(`Unknown storage operation: ${(payload as { operation: string }).operation}`);
|
|
@@ -267,8 +266,8 @@ export function removePluginData<TState>(
|
|
|
267
266
|
*/
|
|
268
267
|
export function getPluginNames(storage: BlockStorage): string[] {
|
|
269
268
|
return Object.keys(storage)
|
|
270
|
-
.filter((key): key is PluginKey => key.startsWith(
|
|
271
|
-
.map((key) => key.slice(
|
|
269
|
+
.filter((key): key is PluginKey => key.startsWith("@plugin/"))
|
|
270
|
+
.map((key) => key.slice("@plugin/".length));
|
|
272
271
|
}
|
|
273
272
|
|
|
274
273
|
// =============================================================================
|
|
@@ -282,10 +281,10 @@ export function getPluginNames(storage: BlockStorage): string[] {
|
|
|
282
281
|
* @param key - The key to retrieve
|
|
283
282
|
* @returns The value at the given key
|
|
284
283
|
*/
|
|
285
|
-
export function getFromStorage<
|
|
286
|
-
TState
|
|
287
|
-
K
|
|
288
|
-
|
|
284
|
+
export function getFromStorage<TState, K extends keyof BlockStorage<TState>>(
|
|
285
|
+
storage: BlockStorage<TState>,
|
|
286
|
+
key: K,
|
|
287
|
+
): BlockStorage<TState>[K] {
|
|
289
288
|
return storage[key];
|
|
290
289
|
}
|
|
291
290
|
|
|
@@ -297,10 +296,7 @@ export function getFromStorage<
|
|
|
297
296
|
* @param value - The new value
|
|
298
297
|
* @returns A new BlockStorage with the updated value
|
|
299
298
|
*/
|
|
300
|
-
export function updateStorage<
|
|
301
|
-
TState,
|
|
302
|
-
K extends keyof BlockStorage<TState>,
|
|
303
|
-
>(
|
|
299
|
+
export function updateStorage<TState, K extends keyof BlockStorage<TState>>(
|
|
304
300
|
storage: BlockStorage<TState>,
|
|
305
301
|
key: K,
|
|
306
302
|
value: BlockStorage<TState>[K],
|
|
@@ -362,7 +358,8 @@ export const defaultBlockStorageHandlers: Required<BlockStorageHandlers<unknown>
|
|
|
362
358
|
transformStateForStorage: <TState>(
|
|
363
359
|
storage: BlockStorage<TState>,
|
|
364
360
|
newState: TState,
|
|
365
|
-
): BlockStorage<TState> =>
|
|
361
|
+
): BlockStorage<TState> =>
|
|
362
|
+
updateStorageData(storage, { operation: "update-data", value: newState }),
|
|
366
363
|
|
|
367
364
|
deriveStateForArgs: <TState>(storage: BlockStorage<TState>): TState => getStorageData(storage),
|
|
368
365
|
|