@platforma-sdk/model 1.58.5 → 1.58.11
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/_virtual/_rolldown/runtime.cjs +43 -0
- package/dist/_virtual/_rolldown/runtime.js +18 -0
- package/dist/annotations/converter.cjs +15 -20
- package/dist/annotations/converter.cjs.map +1 -1
- package/dist/annotations/converter.d.ts +6 -2
- package/dist/annotations/converter.js +14 -18
- package/dist/annotations/converter.js.map +1 -1
- package/dist/annotations/index.cjs +1 -0
- package/dist/annotations/index.d.ts +2 -3
- package/dist/annotations/index.js +1 -0
- package/dist/annotations/types.d.ts +21 -16
- package/dist/bconfig/index.cjs +2 -0
- package/dist/bconfig/index.d.ts +5 -6
- package/dist/bconfig/index.js +2 -0
- package/dist/bconfig/lambdas.d.ts +52 -52
- package/dist/bconfig/normalization.cjs +13 -18
- package/dist/bconfig/normalization.cjs.map +1 -1
- package/dist/bconfig/normalization.d.ts +10 -6
- package/dist/bconfig/normalization.js +12 -16
- package/dist/bconfig/normalization.js.map +1 -1
- package/dist/bconfig/types.cjs +4 -3
- package/dist/bconfig/types.cjs.map +1 -1
- package/dist/bconfig/types.d.ts +10 -5
- package/dist/bconfig/types.js +4 -2
- package/dist/bconfig/types.js.map +1 -1
- package/dist/bconfig/util.d.ts +7 -4
- package/dist/bconfig/v3.d.ts +10 -6
- package/dist/block_api_v1.d.ts +62 -58
- package/dist/block_api_v2.d.ts +51 -47
- package/dist/block_api_v3.d.ts +33 -29
- package/dist/block_migrations.cjs +481 -413
- package/dist/block_migrations.cjs.map +1 -1
- package/dist/block_migrations.d.ts +258 -204
- package/dist/block_migrations.js +482 -408
- package/dist/block_migrations.js.map +1 -1
- package/dist/block_model.cjs +312 -343
- package/dist/block_model.cjs.map +1 -1
- package/dist/block_model.d.ts +143 -147
- package/dist/block_model.js +312 -341
- package/dist/block_model.js.map +1 -1
- package/dist/block_model_legacy.cjs +231 -255
- package/dist/block_model_legacy.cjs.map +1 -1
- package/dist/block_model_legacy.d.ts +108 -106
- package/dist/block_model_legacy.js +231 -253
- package/dist/block_model_legacy.js.map +1 -1
- package/dist/block_state_patch.d.ts +10 -10
- package/dist/block_state_util.cjs +15 -19
- package/dist/block_state_util.cjs.map +1 -1
- package/dist/block_state_util.d.ts +14 -13
- package/dist/block_state_util.js +15 -18
- package/dist/block_state_util.js.map +1 -1
- package/dist/block_storage.cjs +233 -238
- package/dist/block_storage.cjs.map +1 -1
- package/dist/block_storage.d.ts +62 -78
- package/dist/block_storage.js +234 -237
- package/dist/block_storage.js.map +1 -1
- package/dist/block_storage_callbacks.cjs +156 -195
- package/dist/block_storage_callbacks.cjs.map +1 -1
- package/dist/block_storage_callbacks.js +156 -192
- package/dist/block_storage_callbacks.js.map +1 -1
- package/dist/block_storage_facade.cjs +29 -85
- package/dist/block_storage_facade.cjs.map +1 -1
- package/dist/block_storage_facade.d.ts +83 -126
- package/dist/block_storage_facade.js +29 -83
- package/dist/block_storage_facade.js.map +1 -1
- package/dist/components/PFrameForGraphs.cjs +26 -24
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts +12 -7
- package/dist/components/PFrameForGraphs.js +25 -22
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/components/PlAnnotations/filter.d.ts +62 -79
- package/dist/components/PlAnnotations/filters_ui.cjs +135 -171
- package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
- package/dist/components/PlAnnotations/filters_ui.d.ts +48 -46
- package/dist/components/PlAnnotations/filters_ui.js +135 -170
- package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
- package/dist/components/PlAnnotations/index.d.ts +2 -3
- package/dist/components/PlDataTable/index.cjs +2 -0
- package/dist/components/PlDataTable/index.d.ts +3 -5
- package/dist/components/PlDataTable/index.js +2 -0
- package/dist/components/PlDataTable/labels.cjs +59 -81
- package/dist/components/PlDataTable/labels.cjs.map +1 -1
- package/dist/components/PlDataTable/labels.js +58 -79
- package/dist/components/PlDataTable/labels.js.map +1 -1
- package/dist/components/PlDataTable/state-migration.cjs +186 -144
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +85 -82
- package/dist/components/PlDataTable/state-migration.js +185 -142
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/table.cjs +172 -194
- package/dist/components/PlDataTable/table.cjs.map +1 -1
- package/dist/components/PlDataTable/table.d.ts +16 -12
- package/dist/components/PlDataTable/table.js +171 -192
- package/dist/components/PlDataTable/table.js.map +1 -1
- package/dist/components/PlDataTable/v4.d.ts +84 -119
- package/dist/components/PlDataTable/v5.d.ts +80 -103
- package/dist/components/PlMultiSequenceAlignment.cjs +27 -29
- package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.d.ts +36 -27
- package/dist/components/PlMultiSequenceAlignment.js +26 -27
- package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
- package/dist/components/PlSelectionModel.cjs +7 -6
- package/dist/components/PlSelectionModel.cjs.map +1 -1
- package/dist/components/PlSelectionModel.d.ts +10 -8
- package/dist/components/PlSelectionModel.js +7 -5
- package/dist/components/PlSelectionModel.js.map +1 -1
- package/dist/components/index.cjs +8 -0
- package/dist/components/index.d.ts +11 -6
- package/dist/components/index.js +8 -0
- package/dist/config/actions.cjs +138 -171
- package/dist/config/actions.cjs.map +1 -1
- package/dist/config/actions.d.ts +47 -47
- package/dist/config/actions.js +146 -178
- package/dist/config/actions.js.map +1 -1
- package/dist/config/actions_kinds.d.ts +114 -121
- package/dist/config/index.cjs +1 -0
- package/dist/config/index.d.ts +6 -7
- package/dist/config/index.js +1 -0
- package/dist/config/model.d.ts +131 -127
- package/dist/config/model_meta.d.ts +4 -1
- package/dist/config/type_engine.d.ts +22 -21
- package/dist/config/type_util.d.ts +12 -10
- package/dist/env_value.cjs +5 -6
- package/dist/env_value.cjs.map +1 -1
- package/dist/env_value.d.ts +4 -1
- package/dist/env_value.js +5 -5
- package/dist/env_value.js.map +1 -1
- package/dist/filters/converters/filterToQuery.cjs +273 -239
- package/dist/filters/converters/filterToQuery.cjs.map +1 -1
- package/dist/filters/converters/filterToQuery.d.ts +6 -2
- package/dist/filters/converters/filterToQuery.js +272 -237
- package/dist/filters/converters/filterToQuery.js.map +1 -1
- package/dist/filters/converters/filterUiToExpressionImpl.cjs +56 -85
- package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -1
- package/dist/filters/converters/filterUiToExpressionImpl.d.ts +8 -4
- package/dist/filters/converters/filterUiToExpressionImpl.js +55 -83
- package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -1
- package/dist/filters/converters/index.cjs +2 -0
- package/dist/filters/converters/index.d.ts +2 -3
- package/dist/filters/converters/index.js +2 -0
- package/dist/filters/distill.cjs +59 -60
- package/dist/filters/distill.cjs.map +1 -1
- package/dist/filters/distill.d.ts +6 -3
- package/dist/filters/distill.js +58 -58
- package/dist/filters/distill.js.map +1 -1
- package/dist/filters/index.cjs +4 -0
- package/dist/filters/index.d.ts +5 -4
- package/dist/filters/index.js +4 -0
- package/dist/filters/traverse.cjs +31 -40
- package/dist/filters/traverse.cjs.map +1 -1
- package/dist/filters/traverse.js +31 -39
- package/dist/filters/traverse.js.map +1 -1
- package/dist/filters/types.d.ts +10 -7
- package/dist/index.cjs +193 -187
- package/dist/index.d.ts +61 -28
- package/dist/index.js +49 -41
- package/dist/internal.cjs +48 -62
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.js +49 -60
- package/dist/internal.js.map +1 -1
- package/dist/package.cjs +12 -0
- package/dist/package.cjs.map +1 -0
- package/dist/package.js +6 -0
- package/dist/package.js.map +1 -0
- package/dist/pframe.cjs +32 -37
- package/dist/pframe.cjs.map +1 -1
- package/dist/pframe.d.ts +14 -10
- package/dist/pframe.js +32 -35
- package/dist/pframe.js.map +1 -1
- package/dist/pframe_utils/axes.cjs +81 -114
- package/dist/pframe_utils/axes.cjs.map +1 -1
- package/dist/pframe_utils/axes.d.ts +10 -13
- package/dist/pframe_utils/axes.js +80 -112
- package/dist/pframe_utils/axes.js.map +1 -1
- package/dist/pframe_utils/columns.cjs +61 -81
- package/dist/pframe_utils/columns.cjs.map +1 -1
- package/dist/pframe_utils/columns.d.ts +15 -6
- package/dist/pframe_utils/columns.js +60 -79
- package/dist/pframe_utils/columns.js.map +1 -1
- package/dist/pframe_utils/index.cjs +232 -253
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.d.ts +39 -35
- package/dist/pframe_utils/index.js +231 -251
- package/dist/pframe_utils/index.js.map +1 -1
- package/dist/platforma.d.ts +48 -46
- package/dist/plugin_handle.cjs +6 -14
- package/dist/plugin_handle.cjs.map +1 -1
- package/dist/plugin_handle.d.ts +20 -25
- package/dist/plugin_handle.js +6 -13
- package/dist/plugin_handle.js.map +1 -1
- package/dist/plugin_model.cjs +364 -163
- package/dist/plugin_model.cjs.map +1 -1
- package/dist/plugin_model.d.ts +280 -129
- package/dist/plugin_model.js +362 -163
- package/dist/plugin_model.js.map +1 -1
- package/dist/raw_globals.cjs +10 -22
- package/dist/raw_globals.cjs.map +1 -1
- package/dist/raw_globals.d.ts +8 -5
- package/dist/raw_globals.js +10 -20
- package/dist/raw_globals.js.map +1 -1
- package/dist/ref_util.cjs +14 -13
- package/dist/ref_util.cjs.map +1 -1
- package/dist/ref_util.d.ts +18 -12
- package/dist/ref_util.js +14 -11
- package/dist/ref_util.js.map +1 -1
- package/dist/render/accessor.cjs +213 -226
- package/dist/render/accessor.cjs.map +1 -1
- package/dist/render/accessor.d.ts +115 -120
- package/dist/render/accessor.js +212 -224
- package/dist/render/accessor.js.map +1 -1
- package/dist/render/api.cjs +478 -580
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +207 -209
- package/dist/render/api.js +476 -578
- package/dist/render/api.js.map +1 -1
- package/dist/render/future.cjs +28 -32
- package/dist/render/future.cjs.map +1 -1
- package/dist/render/future.d.ts +15 -11
- package/dist/render/future.js +28 -30
- package/dist/render/future.js.map +1 -1
- package/dist/render/index.cjs +8 -0
- package/dist/render/index.d.ts +10 -8
- package/dist/render/index.js +8 -0
- package/dist/render/internal.cjs +33 -29
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +78 -72
- package/dist/render/internal.js +29 -26
- package/dist/render/internal.js.map +1 -1
- package/dist/render/traversal_ops.d.ts +42 -43
- package/dist/render/util/axis_filtering.cjs +63 -86
- package/dist/render/util/axis_filtering.cjs.map +1 -1
- package/dist/render/util/axis_filtering.d.ts +10 -7
- package/dist/render/util/axis_filtering.js +63 -85
- package/dist/render/util/axis_filtering.js.map +1 -1
- package/dist/render/util/column_collection.cjs +266 -321
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +47 -47
- package/dist/render/util/column_collection.js +264 -319
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.cjs +4 -0
- package/dist/render/util/index.d.ts +4 -5
- package/dist/render/util/index.js +4 -0
- package/dist/render/util/label.cjs +129 -163
- package/dist/render/util/label.cjs.map +1 -1
- package/dist/render/util/label.d.ts +45 -46
- package/dist/render/util/label.js +128 -161
- package/dist/render/util/label.js.map +1 -1
- package/dist/render/util/pcolumn_data.cjs +315 -375
- package/dist/render/util/pcolumn_data.cjs.map +1 -1
- package/dist/render/util/pcolumn_data.d.ts +33 -32
- package/dist/render/util/pcolumn_data.js +314 -373
- package/dist/render/util/pcolumn_data.js.map +1 -1
- package/dist/render/util/pframe_upgraders.cjs +37 -42
- package/dist/render/util/pframe_upgraders.cjs.map +1 -1
- package/dist/render/util/pframe_upgraders.js +37 -41
- package/dist/render/util/pframe_upgraders.js.map +1 -1
- package/dist/render/util/split_selectors.d.ts +13 -9
- package/dist/version.cjs +6 -8
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.ts +7 -4
- package/dist/version.js +5 -5
- package/dist/version.js.map +1 -1
- package/package.json +15 -9
- package/src/block_migrations.test.ts +184 -14
- package/src/block_migrations.ts +185 -30
- package/src/block_model.ts +111 -66
- package/src/block_storage.test.ts +147 -3
- package/src/block_storage.ts +43 -8
- package/src/block_storage_callbacks.ts +9 -4
- package/src/env_value.ts +0 -2
- package/src/index.ts +12 -11
- package/src/internal.ts +0 -1
- package/src/platforma.ts +4 -4
- package/src/plugin_handle.ts +1 -1
- package/src/plugin_model.test.ts +217 -21
- package/src/plugin_model.ts +450 -55
- package/src/raw_globals.ts +0 -1
- package/dist/annotations/converter.d.ts.map +0 -1
- package/dist/annotations/index.d.ts.map +0 -1
- package/dist/annotations/types.d.ts.map +0 -1
- package/dist/bconfig/index.d.ts.map +0 -1
- package/dist/bconfig/lambdas.d.ts.map +0 -1
- package/dist/bconfig/normalization.d.ts.map +0 -1
- package/dist/bconfig/types.d.ts.map +0 -1
- package/dist/bconfig/util.d.ts.map +0 -1
- package/dist/bconfig/v3.d.ts.map +0 -1
- package/dist/block_api_v1.d.ts.map +0 -1
- package/dist/block_api_v2.d.ts.map +0 -1
- package/dist/block_api_v3.d.ts.map +0 -1
- package/dist/block_migrations.d.ts.map +0 -1
- package/dist/block_model.d.ts.map +0 -1
- package/dist/block_model_legacy.d.ts.map +0 -1
- package/dist/block_state_patch.d.ts.map +0 -1
- package/dist/block_state_util.d.ts.map +0 -1
- package/dist/block_storage.d.ts.map +0 -1
- package/dist/block_storage_callbacks.d.ts +0 -115
- package/dist/block_storage_callbacks.d.ts.map +0 -1
- package/dist/block_storage_facade.d.ts.map +0 -1
- package/dist/components/PFrameForGraphs.d.ts.map +0 -1
- package/dist/components/PlAnnotations/filter.d.ts.map +0 -1
- package/dist/components/PlAnnotations/filters_ui.d.ts.map +0 -1
- package/dist/components/PlAnnotations/index.d.ts.map +0 -1
- package/dist/components/PlAnnotations/types.d.ts +0 -3
- package/dist/components/PlAnnotations/types.d.ts.map +0 -1
- package/dist/components/PlDataTable/index.d.ts.map +0 -1
- package/dist/components/PlDataTable/labels.d.ts +0 -7
- package/dist/components/PlDataTable/labels.d.ts.map +0 -1
- package/dist/components/PlDataTable/state-migration.d.ts.map +0 -1
- package/dist/components/PlDataTable/table.d.ts.map +0 -1
- package/dist/components/PlDataTable/v4.d.ts.map +0 -1
- package/dist/components/PlDataTable/v5.d.ts.map +0 -1
- package/dist/components/PlMultiSequenceAlignment.d.ts.map +0 -1
- package/dist/components/PlSelectionModel.d.ts.map +0 -1
- package/dist/components/index.d.ts.map +0 -1
- package/dist/config/actions.d.ts.map +0 -1
- package/dist/config/actions_kinds.d.ts.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/model.d.ts.map +0 -1
- package/dist/config/model_meta.d.ts.map +0 -1
- package/dist/config/type_engine.d.ts.map +0 -1
- package/dist/config/type_util.d.ts.map +0 -1
- package/dist/env_value.d.ts.map +0 -1
- package/dist/filters/converters/filterToQuery.d.ts.map +0 -1
- package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +0 -1
- package/dist/filters/converters/index.d.ts.map +0 -1
- package/dist/filters/distill.d.ts.map +0 -1
- package/dist/filters/index.d.ts.map +0 -1
- package/dist/filters/traverse.d.ts +0 -27
- package/dist/filters/traverse.d.ts.map +0 -1
- package/dist/filters/types.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal.d.ts +0 -36
- package/dist/internal.d.ts.map +0 -1
- package/dist/package.json.cjs +0 -6
- package/dist/package.json.cjs.map +0 -1
- package/dist/package.json.js +0 -4
- package/dist/package.json.js.map +0 -1
- package/dist/pframe.d.ts.map +0 -1
- package/dist/pframe_utils/axes.d.ts.map +0 -1
- package/dist/pframe_utils/columns.d.ts.map +0 -1
- package/dist/pframe_utils/index.d.ts.map +0 -1
- package/dist/pframe_utils/querySpec.d.ts +0 -2
- package/dist/pframe_utils/querySpec.d.ts.map +0 -1
- package/dist/platforma.d.ts.map +0 -1
- package/dist/plugin_handle.d.ts.map +0 -1
- package/dist/plugin_model.d.ts.map +0 -1
- package/dist/raw_globals.d.ts.map +0 -1
- package/dist/ref_util.d.ts.map +0 -1
- package/dist/render/accessor.d.ts.map +0 -1
- package/dist/render/api.d.ts.map +0 -1
- package/dist/render/future.d.ts.map +0 -1
- package/dist/render/index.d.ts.map +0 -1
- package/dist/render/internal.d.ts.map +0 -1
- package/dist/render/traversal_ops.d.ts.map +0 -1
- package/dist/render/util/axis_filtering.d.ts.map +0 -1
- package/dist/render/util/column_collection.d.ts.map +0 -1
- package/dist/render/util/index.d.ts.map +0 -1
- package/dist/render/util/label.d.ts.map +0 -1
- package/dist/render/util/pcolumn_data.d.ts.map +0 -1
- package/dist/render/util/pframe_upgraders.d.ts +0 -3
- package/dist/render/util/pframe_upgraders.d.ts.map +0 -1
- package/dist/render/util/split_selectors.d.ts.map +0 -1
- package/dist/version.d.ts.map +0 -1
package/src/plugin_model.ts
CHANGED
|
@@ -8,21 +8,319 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import type { BlockCodeKnownFeatureFlags } from "@milaboratories/pl-model-common";
|
|
11
|
-
import
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
type DataModel,
|
|
13
|
+
DataModelBuilder,
|
|
14
|
+
type DataRecoverFn,
|
|
15
|
+
type DataVersioned,
|
|
16
|
+
type TransferTarget,
|
|
17
|
+
} from "./block_migrations";
|
|
18
|
+
import { type PluginName, DATA_MODEL_LEGACY_VERSION } from "./block_storage";
|
|
13
19
|
import type { PluginFactoryLike } from "./plugin_handle";
|
|
14
20
|
import type { PluginRenderCtx } from "./render";
|
|
15
21
|
|
|
16
22
|
/** Symbol for internal builder creation method */
|
|
17
23
|
const FROM_BUILDER = Symbol("fromBuilder");
|
|
18
24
|
|
|
25
|
+
/** Symbol for internal plugin model creation — not accessible to external consumers */
|
|
26
|
+
export const CREATE_PLUGIN_MODEL = Symbol("createPluginModel");
|
|
27
|
+
|
|
28
|
+
/** Sentinel for PluginInstance without transferAt — no transfer possible. */
|
|
29
|
+
const NO_TRANSFER_VERSION = "";
|
|
30
|
+
|
|
19
31
|
export type PluginData = Record<string, unknown>;
|
|
20
32
|
export type PluginParams = undefined | Record<string, unknown>;
|
|
21
33
|
export type PluginOutputs = Record<string, unknown>;
|
|
22
34
|
export type PluginConfig = undefined | Record<string, unknown>;
|
|
23
35
|
|
|
24
36
|
/**
|
|
25
|
-
*
|
|
37
|
+
* Plugin data model with typed migration chain and config-aware initialization.
|
|
38
|
+
*
|
|
39
|
+
* @typeParam Data - Current (latest) plugin data type
|
|
40
|
+
* @typeParam Versions - Map of version keys to their data types (accumulated by the chain)
|
|
41
|
+
* @typeParam Config - Config type passed to init function (undefined if none)
|
|
42
|
+
*/
|
|
43
|
+
export class PluginDataModel<
|
|
44
|
+
Data extends PluginData,
|
|
45
|
+
Versions extends Record<string, unknown> = {},
|
|
46
|
+
Config = undefined,
|
|
47
|
+
> {
|
|
48
|
+
readonly dataModel: DataModel<Data>;
|
|
49
|
+
private readonly configInitFn: (config?: Config) => Data;
|
|
50
|
+
|
|
51
|
+
/** @internal Phantom field to anchor the Versions type parameter. */
|
|
52
|
+
declare readonly __versions?: Versions;
|
|
53
|
+
|
|
54
|
+
private constructor(dataModel: DataModel<Data>, configInitFn: (config?: Config) => Data) {
|
|
55
|
+
this.dataModel = dataModel;
|
|
56
|
+
this.configInitFn = configInitFn;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @internal */
|
|
60
|
+
static [FROM_BUILDER]<Data extends PluginData, Versions extends Record<string, unknown>, Config>(
|
|
61
|
+
dataModel: DataModel<Data>,
|
|
62
|
+
configInitFn: (config?: Config) => Data,
|
|
63
|
+
): PluginDataModel<Data, Versions, Config> {
|
|
64
|
+
return new PluginDataModel<Data, Versions, Config>(dataModel, configInitFn);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Create fresh data with optional config. */
|
|
68
|
+
getDefaultData(config?: Config): DataVersioned<Data> {
|
|
69
|
+
const data = this.configInitFn(config);
|
|
70
|
+
return { version: this.dataModel.version, data };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Internal state for plugin data model chain. */
|
|
75
|
+
type PluginChainState = {
|
|
76
|
+
initialVersion: string;
|
|
77
|
+
migrations: Array<{ toVersion: string; fn: (data: unknown) => unknown }>;
|
|
78
|
+
recoverFn?: (version: string, data: unknown) => unknown;
|
|
79
|
+
recoverAtIndex?: number;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Builder for creating PluginDataModel with type-safe migrations.
|
|
84
|
+
* Mirrors DataModelBuilder — same .from(), .migrate(), .recover(), .init() chain.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* const pluginData = new PluginDataModelBuilder()
|
|
88
|
+
* .from<TableData>("v1")
|
|
89
|
+
* .migrate<FilteredTableData>("v2", (v1) => ({ ...v1, filters: [] }))
|
|
90
|
+
* .init<TableConfig>((config?) => ({
|
|
91
|
+
* state: createDefaultState(config?.ops),
|
|
92
|
+
* filters: [],
|
|
93
|
+
* }));
|
|
94
|
+
*/
|
|
95
|
+
export class PluginDataModelBuilder {
|
|
96
|
+
from<Data extends PluginData, const V extends string>(
|
|
97
|
+
version: V,
|
|
98
|
+
): PluginDataModelInitialChain<Data, Record<V, Data>> {
|
|
99
|
+
return PluginDataModelInitialChain[FROM_BUILDER]<Data, Record<V, Data>>({
|
|
100
|
+
initialVersion: version,
|
|
101
|
+
migrations: [],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Chain returned by .migrate(). Supports .migrate(), .recover(), .init().
|
|
108
|
+
* No .upgradeLegacy() — that is only available on the initial chain.
|
|
109
|
+
*/
|
|
110
|
+
export class PluginDataModelChain<
|
|
111
|
+
Data extends PluginData,
|
|
112
|
+
Versions extends Record<string, unknown>,
|
|
113
|
+
> {
|
|
114
|
+
protected constructor(protected readonly state: PluginChainState) {}
|
|
115
|
+
|
|
116
|
+
/** @internal */
|
|
117
|
+
static [FROM_BUILDER]<Data extends PluginData, Versions extends Record<string, unknown>>(
|
|
118
|
+
state: PluginChainState,
|
|
119
|
+
): PluginDataModelChain<Data, Versions> {
|
|
120
|
+
return new PluginDataModelChain(state);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Add a migration step transforming data from the current version to the next.
|
|
125
|
+
*/
|
|
126
|
+
migrate<Next extends PluginData, const NextV extends string>(
|
|
127
|
+
version: NextV,
|
|
128
|
+
fn: (current: Data) => Next,
|
|
129
|
+
): PluginDataModelChain<Next, Versions & Record<NextV, Next>> {
|
|
130
|
+
return PluginDataModelChain[FROM_BUILDER]<Next, Versions & Record<NextV, Next>>({
|
|
131
|
+
...this.state,
|
|
132
|
+
migrations: [
|
|
133
|
+
...this.state.migrations,
|
|
134
|
+
{ toVersion: version, fn: fn as (data: unknown) => unknown },
|
|
135
|
+
],
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Set a recovery handler for unknown or legacy versions.
|
|
141
|
+
* Can only be called once — the returned chain has no recover() method.
|
|
142
|
+
*/
|
|
143
|
+
recover(fn: DataRecoverFn<Data>): PluginDataModelWithRecover<Data, Versions> {
|
|
144
|
+
return PluginDataModelWithRecover[FROM_BUILDER]<Data, Versions>({
|
|
145
|
+
...this.state,
|
|
146
|
+
recoverFn: fn as (version: string, data: unknown) => unknown,
|
|
147
|
+
recoverAtIndex: this.state.migrations.length,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Finalize the PluginDataModel. */
|
|
152
|
+
init<Config = undefined>(fn: (config?: Config) => Data): PluginDataModel<Data, Versions, Config> {
|
|
153
|
+
return buildPluginDataModel(this.state, fn);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Initial chain returned by new PluginDataModelBuilder().from().
|
|
159
|
+
* Extends PluginDataModelChain with .upgradeLegacy() — available only before
|
|
160
|
+
* any .migrate() calls, matching the block's DataModelInitialChain pattern.
|
|
161
|
+
*/
|
|
162
|
+
export class PluginDataModelInitialChain<
|
|
163
|
+
Data extends PluginData,
|
|
164
|
+
Versions extends Record<string, unknown>,
|
|
165
|
+
> extends PluginDataModelChain<Data, Versions> {
|
|
166
|
+
/** @internal */
|
|
167
|
+
static override [FROM_BUILDER]<Data extends PluginData, Versions extends Record<string, unknown>>(
|
|
168
|
+
state: PluginChainState,
|
|
169
|
+
): PluginDataModelInitialChain<Data, Versions> {
|
|
170
|
+
return new PluginDataModelInitialChain(state);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Handle data from a previous plugin type occupying this slot.
|
|
175
|
+
* Prepends a migration from DATA_MODEL_LEGACY_VERSION to the initial version.
|
|
176
|
+
* When a plugin type changes, the old data arrives with DATA_MODEL_LEGACY_VERSION —
|
|
177
|
+
* this function transforms it into the initial version, then the normal chain runs.
|
|
178
|
+
*
|
|
179
|
+
* Must be called right after .from() — not available after .migrate().
|
|
180
|
+
* Mutually exclusive with recover().
|
|
181
|
+
*
|
|
182
|
+
* @param fn - Transform from old plugin's raw data to this plugin's initial data type
|
|
183
|
+
*/
|
|
184
|
+
upgradeLegacy(fn: (data: unknown) => Data): PluginDataModelWithRecover<Data, Versions> {
|
|
185
|
+
return PluginDataModelWithRecover[FROM_BUILDER]<Data, Versions>({
|
|
186
|
+
...this.state,
|
|
187
|
+
migrations: [
|
|
188
|
+
{ toVersion: this.state.initialVersion, fn: fn as (data: unknown) => unknown },
|
|
189
|
+
...this.state.migrations,
|
|
190
|
+
],
|
|
191
|
+
initialVersion: DATA_MODEL_LEGACY_VERSION,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Chain after .recover() — supports .migrate(), .init(). No second recover().
|
|
198
|
+
*/
|
|
199
|
+
export class PluginDataModelWithRecover<
|
|
200
|
+
Data extends PluginData,
|
|
201
|
+
Versions extends Record<string, unknown>,
|
|
202
|
+
> {
|
|
203
|
+
private constructor(private readonly state: PluginChainState) {}
|
|
204
|
+
|
|
205
|
+
/** @internal */
|
|
206
|
+
static [FROM_BUILDER]<Data extends PluginData, Versions extends Record<string, unknown>>(
|
|
207
|
+
state: PluginChainState,
|
|
208
|
+
): PluginDataModelWithRecover<Data, Versions> {
|
|
209
|
+
return new PluginDataModelWithRecover(state);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
migrate<Next extends PluginData, const NextV extends string>(
|
|
213
|
+
version: NextV,
|
|
214
|
+
fn: (current: Data) => Next,
|
|
215
|
+
): PluginDataModelWithRecover<Next, Versions & Record<NextV, Next>> {
|
|
216
|
+
return PluginDataModelWithRecover[FROM_BUILDER]<Next, Versions & Record<NextV, Next>>({
|
|
217
|
+
...this.state,
|
|
218
|
+
migrations: [
|
|
219
|
+
...this.state.migrations,
|
|
220
|
+
{ toVersion: version, fn: fn as (data: unknown) => unknown },
|
|
221
|
+
],
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
init<Config = undefined>(fn: (config?: Config) => Data): PluginDataModel<Data, Versions, Config> {
|
|
226
|
+
return buildPluginDataModel(this.state, fn);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Builds a PluginDataModel by replaying the stored chain state through DataModelBuilder.
|
|
232
|
+
* @internal
|
|
233
|
+
*/
|
|
234
|
+
function buildPluginDataModel<
|
|
235
|
+
Data extends PluginData,
|
|
236
|
+
Versions extends Record<string, unknown>,
|
|
237
|
+
Config,
|
|
238
|
+
>(
|
|
239
|
+
state: PluginChainState,
|
|
240
|
+
configInitFn: (config?: Config) => Data,
|
|
241
|
+
): PluginDataModel<Data, Versions, Config> {
|
|
242
|
+
// Build inner DataModel by replaying migrations through DataModelBuilder chain.
|
|
243
|
+
// Uses `any` internally — type safety is maintained by the public chain types.
|
|
244
|
+
let chain: any = new DataModelBuilder().from(state.initialVersion);
|
|
245
|
+
|
|
246
|
+
for (let i = 0; i < state.migrations.length; i++) {
|
|
247
|
+
if (state.recoverFn !== undefined && state.recoverAtIndex === i) {
|
|
248
|
+
chain = chain.recover(state.recoverFn);
|
|
249
|
+
}
|
|
250
|
+
chain = chain.migrate(state.migrations[i].toVersion, state.migrations[i].fn);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// If recover was placed at or after the last migration
|
|
254
|
+
if (state.recoverFn !== undefined && state.recoverAtIndex === state.migrations.length) {
|
|
255
|
+
chain = chain.recover(state.recoverFn);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const dataModel: DataModel<Data> = chain.init(() => configInitFn());
|
|
259
|
+
|
|
260
|
+
return PluginDataModel[FROM_BUILDER]<Data, Versions, Config>(dataModel, configInitFn);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* A named plugin instance created by `factory.create({ pluginId, ... })`.
|
|
265
|
+
* Passed to both `.transfer()` (on migration chain) and `.plugin()` (on BlockModelV3).
|
|
266
|
+
* Implements TransferTarget so the migration chain can accept it.
|
|
267
|
+
*
|
|
268
|
+
* @typeParam Id - Plugin instance ID literal type
|
|
269
|
+
* @typeParam Data - Plugin data type
|
|
270
|
+
* @typeParam Params - Plugin params type
|
|
271
|
+
* @typeParam Outputs - Plugin outputs type
|
|
272
|
+
* @typeParam TransferData - Type of data entering the plugin via transfer (never if no transfer)
|
|
273
|
+
*/
|
|
274
|
+
export class PluginInstance<
|
|
275
|
+
Id extends string = string,
|
|
276
|
+
Data extends PluginData = PluginData,
|
|
277
|
+
Params extends PluginParams = undefined,
|
|
278
|
+
Outputs extends PluginOutputs = PluginOutputs,
|
|
279
|
+
TransferData = never,
|
|
280
|
+
> implements TransferTarget<Id, TransferData> {
|
|
281
|
+
readonly id: Id;
|
|
282
|
+
readonly transferVersion: string;
|
|
283
|
+
/** @internal */
|
|
284
|
+
readonly __transferBrand?: TransferData;
|
|
285
|
+
private readonly factory: PluginModelFactory<Data, Params, Outputs, any, any>;
|
|
286
|
+
private readonly config: any;
|
|
287
|
+
|
|
288
|
+
private constructor(
|
|
289
|
+
id: Id,
|
|
290
|
+
factory: PluginModelFactory<Data, Params, Outputs, any, any>,
|
|
291
|
+
transferVersion: string,
|
|
292
|
+
config?: any,
|
|
293
|
+
) {
|
|
294
|
+
this.id = id;
|
|
295
|
+
this.factory = factory;
|
|
296
|
+
this.transferVersion = transferVersion;
|
|
297
|
+
this.config = config;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/** @internal */
|
|
301
|
+
static [FROM_BUILDER]<
|
|
302
|
+
Id extends string,
|
|
303
|
+
Data extends PluginData,
|
|
304
|
+
Params extends PluginParams,
|
|
305
|
+
Outputs extends PluginOutputs,
|
|
306
|
+
TransferData,
|
|
307
|
+
>(
|
|
308
|
+
id: Id,
|
|
309
|
+
factory: PluginModelFactory<Data, Params, Outputs, any, any>,
|
|
310
|
+
transferVersion: string,
|
|
311
|
+
config?: any,
|
|
312
|
+
): PluginInstance<Id, Data, Params, Outputs, TransferData> {
|
|
313
|
+
return new PluginInstance(id, factory, transferVersion, config);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/** @internal Create a PluginModel from this instance. Used by BlockModelV3.plugin(). */
|
|
317
|
+
[CREATE_PLUGIN_MODEL](): PluginModel<Data, Params, Outputs> {
|
|
318
|
+
return this.factory[CREATE_PLUGIN_MODEL](this.config);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Configured plugin instance returned by PluginModelFactory[CREATE_PLUGIN_MODEL]().
|
|
26
324
|
* Contains the plugin's name, data model, and output definitions.
|
|
27
325
|
*/
|
|
28
326
|
export class PluginModel<
|
|
@@ -40,6 +338,8 @@ export class PluginModel<
|
|
|
40
338
|
};
|
|
41
339
|
/** Feature flags declared by this plugin */
|
|
42
340
|
readonly featureFlags?: BlockCodeKnownFeatureFlags;
|
|
341
|
+
/** Create fresh default data. Config (if any) is captured at creation time. */
|
|
342
|
+
readonly getDefaultData: () => DataVersioned<Data>;
|
|
43
343
|
|
|
44
344
|
private constructor(options: {
|
|
45
345
|
name: PluginName;
|
|
@@ -48,11 +348,13 @@ export class PluginModel<
|
|
|
48
348
|
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
49
349
|
};
|
|
50
350
|
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
351
|
+
getDefaultData: () => DataVersioned<Data>;
|
|
51
352
|
}) {
|
|
52
353
|
this.name = options.name;
|
|
53
354
|
this.dataModel = options.dataModel;
|
|
54
355
|
this.outputs = options.outputs;
|
|
55
356
|
this.featureFlags = options.featureFlags;
|
|
357
|
+
this.getDefaultData = options.getDefaultData;
|
|
56
358
|
}
|
|
57
359
|
|
|
58
360
|
/**
|
|
@@ -71,37 +373,74 @@ export class PluginModel<
|
|
|
71
373
|
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
72
374
|
};
|
|
73
375
|
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
376
|
+
getDefaultData: () => DataVersioned<Data>;
|
|
74
377
|
}): PluginModel<Data, Params, Outputs> {
|
|
75
378
|
return new PluginModel<Data, Params, Outputs>(options);
|
|
76
379
|
}
|
|
77
380
|
|
|
78
381
|
/**
|
|
79
|
-
* Creates a new PluginModelBuilder
|
|
80
|
-
*
|
|
81
|
-
* @param options.name - Globally unique plugin name
|
|
82
|
-
* @param options.data - Factory function that creates the data model from config
|
|
83
|
-
* @returns PluginModelBuilder for chaining output definitions
|
|
382
|
+
* Creates a new PluginModelBuilder with a PluginDataModel (supports transfer / config).
|
|
84
383
|
*
|
|
85
384
|
* @example
|
|
86
|
-
* const
|
|
385
|
+
* const pluginData = new PluginDataModelBuilder().from<TableData>("v1")
|
|
386
|
+
* .migrate<FilteredTableData>("v2", (v1) => ({ ...v1, filters: [] }))
|
|
387
|
+
* .init<TableConfig>((config?) => ({
|
|
388
|
+
* state: createDefaultState(config?.ops),
|
|
389
|
+
* filters: [],
|
|
390
|
+
* }));
|
|
391
|
+
*
|
|
392
|
+
* const myPlugin = PluginModel.define({
|
|
393
|
+
* name: 'myPlugin' as PluginName,
|
|
394
|
+
* data: pluginData,
|
|
395
|
+
* }).build();
|
|
396
|
+
*/
|
|
397
|
+
static define<
|
|
398
|
+
Data extends PluginData,
|
|
399
|
+
Params extends PluginParams = undefined,
|
|
400
|
+
Versions extends Record<string, unknown> = {},
|
|
401
|
+
Config extends PluginConfig = undefined,
|
|
402
|
+
>(options: {
|
|
403
|
+
name: PluginName;
|
|
404
|
+
data: PluginDataModel<Data, Versions, Config>;
|
|
405
|
+
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
406
|
+
}): PluginModelBuilder<Data, Params, {}, Config, Versions>;
|
|
407
|
+
/**
|
|
408
|
+
* Creates a new PluginModelBuilder with a data model factory function (backward compatible).
|
|
87
409
|
*
|
|
410
|
+
* @example
|
|
88
411
|
* const myPlugin = PluginModel.define({
|
|
89
412
|
* name: 'myPlugin' as PluginName,
|
|
90
413
|
* data: (cfg) => dataModelChain.init(() => ({ value: cfg.defaultValue })),
|
|
91
|
-
* })
|
|
92
|
-
* .output('computed', (ctx) => ctx.data.value * ctx.params.multiplier)
|
|
93
|
-
* .build();
|
|
414
|
+
* }).build();
|
|
94
415
|
*/
|
|
95
416
|
static define<
|
|
96
417
|
Data extends PluginData,
|
|
97
|
-
Params extends PluginParams,
|
|
98
|
-
Config extends PluginConfig,
|
|
418
|
+
Params extends PluginParams = undefined,
|
|
419
|
+
Config extends PluginConfig = undefined,
|
|
99
420
|
>(options: {
|
|
100
421
|
name: PluginName;
|
|
101
422
|
data: (config?: Config) => DataModel<Data>;
|
|
102
423
|
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
103
|
-
}): PluginModelBuilder<Data, Params, {}, Config
|
|
104
|
-
|
|
424
|
+
}): PluginModelBuilder<Data, Params, {}, Config, {}>;
|
|
425
|
+
static define(options: {
|
|
426
|
+
name: PluginName;
|
|
427
|
+
data: PluginDataModel<any, any, any> | ((config?: any) => DataModel<any>);
|
|
428
|
+
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
429
|
+
}): PluginModelBuilder {
|
|
430
|
+
if (options.data instanceof PluginDataModel) {
|
|
431
|
+
const pdm = options.data;
|
|
432
|
+
return PluginModelBuilder[FROM_BUILDER]({
|
|
433
|
+
name: options.name,
|
|
434
|
+
dataFn: () => pdm.dataModel,
|
|
435
|
+
getDefaultDataFn: (config: any) => pdm.getDefaultData(config),
|
|
436
|
+
featureFlags: options.featureFlags,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
return PluginModelBuilder[FROM_BUILDER]({
|
|
440
|
+
name: options.name,
|
|
441
|
+
dataFn: options.data,
|
|
442
|
+
featureFlags: options.featureFlags,
|
|
443
|
+
});
|
|
105
444
|
}
|
|
106
445
|
}
|
|
107
446
|
|
|
@@ -111,13 +450,26 @@ export interface PluginFactory<
|
|
|
111
450
|
Params extends PluginParams = undefined,
|
|
112
451
|
Outputs extends PluginOutputs = PluginOutputs,
|
|
113
452
|
Config extends PluginConfig = undefined,
|
|
114
|
-
|
|
115
|
-
|
|
453
|
+
Versions extends Record<string, unknown> = {},
|
|
454
|
+
> extends PluginFactoryLike<Data, Params, Outputs> {
|
|
455
|
+
/** Create a named plugin instance, optionally with transfer at a specific version. */
|
|
456
|
+
create<const Id extends string, const V extends string & keyof Versions = never>(options: {
|
|
457
|
+
pluginId: Id;
|
|
458
|
+
transferAt?: V;
|
|
459
|
+
config?: Config;
|
|
460
|
+
}): PluginInstance<Id, Data, Params, Outputs, Versions[V]>;
|
|
461
|
+
|
|
116
462
|
/**
|
|
117
463
|
* @internal Phantom field for structural type extraction.
|
|
118
464
|
* Enables InferFactoryData/InferFactoryOutputs to work via PluginFactoryLike.
|
|
119
465
|
*/
|
|
120
|
-
readonly __types?: {
|
|
466
|
+
readonly __types?: {
|
|
467
|
+
data: Data;
|
|
468
|
+
params: Params;
|
|
469
|
+
outputs: Outputs;
|
|
470
|
+
config: Config;
|
|
471
|
+
versions: Versions;
|
|
472
|
+
};
|
|
121
473
|
}
|
|
122
474
|
|
|
123
475
|
class PluginModelFactory<
|
|
@@ -125,35 +477,77 @@ class PluginModelFactory<
|
|
|
125
477
|
Params extends PluginParams = undefined,
|
|
126
478
|
Outputs extends PluginOutputs = PluginOutputs,
|
|
127
479
|
Config extends PluginConfig = undefined,
|
|
128
|
-
|
|
480
|
+
Versions extends Record<string, unknown> = {},
|
|
481
|
+
> implements PluginFactory<Data, Params, Outputs, Config, Versions> {
|
|
129
482
|
private readonly name: PluginName;
|
|
130
|
-
private readonly
|
|
131
|
-
private readonly
|
|
483
|
+
private readonly dataFn: (config?: Config) => DataModel<Data>;
|
|
484
|
+
private readonly getDefaultDataFn?: (config?: Config) => DataVersioned<Data>;
|
|
485
|
+
readonly outputs: {
|
|
132
486
|
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
133
487
|
};
|
|
134
488
|
private readonly featureFlags?: BlockCodeKnownFeatureFlags;
|
|
135
489
|
|
|
136
|
-
constructor(options: {
|
|
490
|
+
private constructor(options: {
|
|
137
491
|
name: PluginName;
|
|
138
|
-
|
|
492
|
+
dataFn: (config?: Config) => DataModel<Data>;
|
|
493
|
+
getDefaultDataFn?: (config?: Config) => DataVersioned<Data>;
|
|
139
494
|
outputs: {
|
|
140
495
|
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
141
496
|
};
|
|
142
497
|
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
143
498
|
}) {
|
|
144
499
|
this.name = options.name;
|
|
145
|
-
this.
|
|
500
|
+
this.dataFn = options.dataFn;
|
|
501
|
+
this.getDefaultDataFn = options.getDefaultDataFn;
|
|
146
502
|
this.outputs = options.outputs;
|
|
147
503
|
this.featureFlags = options.featureFlags;
|
|
148
504
|
}
|
|
149
505
|
|
|
150
|
-
/**
|
|
151
|
-
|
|
506
|
+
/** @internal */
|
|
507
|
+
static [FROM_BUILDER]<
|
|
508
|
+
Data extends PluginData,
|
|
509
|
+
Params extends PluginParams,
|
|
510
|
+
Outputs extends PluginOutputs,
|
|
511
|
+
Config extends PluginConfig,
|
|
512
|
+
Versions extends Record<string, unknown>,
|
|
513
|
+
>(options: {
|
|
514
|
+
name: PluginName;
|
|
515
|
+
dataFn: (config?: Config) => DataModel<Data>;
|
|
516
|
+
getDefaultDataFn?: (config?: Config) => DataVersioned<Data>;
|
|
517
|
+
outputs: {
|
|
518
|
+
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
519
|
+
};
|
|
520
|
+
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
521
|
+
}): PluginModelFactory<Data, Params, Outputs, Config, Versions> {
|
|
522
|
+
return new PluginModelFactory(options);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
create<const Id extends string, const V extends string & keyof Versions = never>(options: {
|
|
526
|
+
pluginId: Id;
|
|
527
|
+
transferAt?: V;
|
|
528
|
+
config?: Config;
|
|
529
|
+
}): PluginInstance<Id, Data, Params, Outputs, Versions[V]> {
|
|
530
|
+
const transferVersion = options.transferAt ?? NO_TRANSFER_VERSION;
|
|
531
|
+
return PluginInstance[FROM_BUILDER]<Id, Data, Params, Outputs, Versions[V]>(
|
|
532
|
+
options.pluginId as Id,
|
|
533
|
+
this as any,
|
|
534
|
+
transferVersion,
|
|
535
|
+
options.config,
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/** @internal Create a PluginModel from config. Config is captured in getDefaultData closure. */
|
|
540
|
+
[CREATE_PLUGIN_MODEL](config?: Config): PluginModel<Data, Params, Outputs> {
|
|
541
|
+
const dataModel = this.dataFn(config);
|
|
542
|
+
const getDefaultDataFn = this.getDefaultDataFn;
|
|
152
543
|
return PluginModel[FROM_BUILDER]<Data, Params, Outputs>({
|
|
153
544
|
name: this.name,
|
|
154
|
-
dataModel
|
|
545
|
+
dataModel,
|
|
155
546
|
outputs: this.outputs,
|
|
156
547
|
featureFlags: this.featureFlags,
|
|
548
|
+
getDefaultData: getDefaultDataFn
|
|
549
|
+
? () => getDefaultDataFn(config)
|
|
550
|
+
: () => dataModel.getDefaultData(),
|
|
157
551
|
});
|
|
158
552
|
}
|
|
159
553
|
}
|
|
@@ -167,15 +561,12 @@ class PluginModelFactory<
|
|
|
167
561
|
* @typeParam Params - Params derived from block's RenderCtx (optional)
|
|
168
562
|
* @typeParam Config - Static configuration passed to plugin factory (optional)
|
|
169
563
|
* @typeParam Outputs - Accumulated output types
|
|
564
|
+
* @typeParam Versions - Version map from PluginDataModel (empty for function-based data)
|
|
170
565
|
*
|
|
171
566
|
* @example
|
|
172
|
-
* const
|
|
173
|
-
*
|
|
174
|
-
* const dataTable = PluginModel.define<TableData, TableParams, TableConfig>({
|
|
567
|
+
* const dataTable = PluginModel.define({
|
|
175
568
|
* name: 'dataTable' as PluginName,
|
|
176
|
-
* data:
|
|
177
|
-
* return dataModelChain.init(() => ({ state: createInitialState(cfg.ops) }));
|
|
178
|
-
* },
|
|
569
|
+
* data: pluginDataModel,
|
|
179
570
|
* })
|
|
180
571
|
* .output('model', (ctx) => createTableModel(ctx))
|
|
181
572
|
* .build();
|
|
@@ -185,9 +576,11 @@ class PluginModelBuilder<
|
|
|
185
576
|
Params extends PluginParams = undefined,
|
|
186
577
|
Outputs extends PluginOutputs = PluginOutputs,
|
|
187
578
|
Config extends PluginConfig = undefined,
|
|
579
|
+
Versions extends Record<string, unknown> = {},
|
|
188
580
|
> {
|
|
189
581
|
private readonly name: PluginName;
|
|
190
|
-
private readonly
|
|
582
|
+
private readonly dataFn: (config?: Config) => DataModel<Data>;
|
|
583
|
+
private readonly getDefaultDataFn?: (config?: Config) => DataVersioned<Data>;
|
|
191
584
|
private readonly outputs: {
|
|
192
585
|
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
193
586
|
};
|
|
@@ -195,14 +588,16 @@ class PluginModelBuilder<
|
|
|
195
588
|
|
|
196
589
|
private constructor(options: {
|
|
197
590
|
name: PluginName;
|
|
198
|
-
|
|
591
|
+
dataFn: (config?: Config) => DataModel<Data>;
|
|
592
|
+
getDefaultDataFn?: (config?: Config) => DataVersioned<Data>;
|
|
199
593
|
outputs?: {
|
|
200
594
|
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
201
595
|
};
|
|
202
596
|
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
203
597
|
}) {
|
|
204
598
|
this.name = options.name;
|
|
205
|
-
this.
|
|
599
|
+
this.dataFn = options.dataFn;
|
|
600
|
+
this.getDefaultDataFn = options.getDefaultDataFn;
|
|
206
601
|
this.outputs =
|
|
207
602
|
options.outputs ??
|
|
208
603
|
({} as {
|
|
@@ -211,24 +606,22 @@ class PluginModelBuilder<
|
|
|
211
606
|
this.featureFlags = options.featureFlags;
|
|
212
607
|
}
|
|
213
608
|
|
|
214
|
-
/**
|
|
215
|
-
* Internal method for creating PluginModelBuilder.
|
|
216
|
-
* Uses Symbol key to prevent external access.
|
|
217
|
-
* @internal
|
|
218
|
-
*/
|
|
609
|
+
/** @internal */
|
|
219
610
|
static [FROM_BUILDER]<
|
|
220
611
|
Data extends PluginData,
|
|
221
612
|
Params extends PluginParams,
|
|
222
613
|
Outputs extends PluginOutputs,
|
|
223
614
|
Config extends PluginConfig,
|
|
615
|
+
Versions extends Record<string, unknown> = {},
|
|
224
616
|
>(options: {
|
|
225
617
|
name: PluginName;
|
|
226
|
-
|
|
618
|
+
dataFn: (config?: Config) => DataModel<Data>;
|
|
619
|
+
getDefaultDataFn?: (config?: Config) => DataVersioned<Data>;
|
|
227
620
|
outputs?: {
|
|
228
621
|
[K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];
|
|
229
622
|
};
|
|
230
623
|
featureFlags?: BlockCodeKnownFeatureFlags;
|
|
231
|
-
}): PluginModelBuilder<Data, Params, Outputs, Config> {
|
|
624
|
+
}): PluginModelBuilder<Data, Params, Outputs, Config, Versions> {
|
|
232
625
|
return new PluginModelBuilder(options);
|
|
233
626
|
}
|
|
234
627
|
|
|
@@ -246,10 +639,11 @@ class PluginModelBuilder<
|
|
|
246
639
|
output<const Key extends string, T>(
|
|
247
640
|
key: Key,
|
|
248
641
|
fn: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => T,
|
|
249
|
-
): PluginModelBuilder<Data, Params, Outputs & { [K in Key]: T }, Config> {
|
|
250
|
-
return new PluginModelBuilder<Data, Params, Outputs & { [K in Key]: T }, Config>({
|
|
642
|
+
): PluginModelBuilder<Data, Params, Outputs & { [K in Key]: T }, Config, Versions> {
|
|
643
|
+
return new PluginModelBuilder<Data, Params, Outputs & { [K in Key]: T }, Config, Versions>({
|
|
251
644
|
name: this.name,
|
|
252
|
-
|
|
645
|
+
dataFn: this.dataFn,
|
|
646
|
+
getDefaultDataFn: this.getDefaultDataFn,
|
|
253
647
|
featureFlags: this.featureFlags,
|
|
254
648
|
outputs: {
|
|
255
649
|
...this.outputs,
|
|
@@ -263,22 +657,23 @@ class PluginModelBuilder<
|
|
|
263
657
|
}
|
|
264
658
|
|
|
265
659
|
/**
|
|
266
|
-
* Finalizes the plugin definition and returns a
|
|
660
|
+
* Finalizes the plugin definition and returns a PluginFactory.
|
|
267
661
|
*
|
|
268
|
-
* @returns
|
|
662
|
+
* @returns Plugin factory that creates named plugin instances via .create()
|
|
269
663
|
*
|
|
270
664
|
* @example
|
|
271
|
-
* const myPlugin =
|
|
665
|
+
* const myPlugin = PluginModel.define({ ... })
|
|
272
666
|
* .output('value', (ctx) => ctx.data.value)
|
|
273
667
|
* .build();
|
|
274
668
|
*
|
|
275
|
-
* //
|
|
276
|
-
* const
|
|
669
|
+
* // Create a named instance:
|
|
670
|
+
* const table = myPlugin.create({ pluginId: 'mainTable', config: { ... } });
|
|
277
671
|
*/
|
|
278
|
-
build(): PluginFactory<Data, Params, Outputs, Config> {
|
|
279
|
-
return
|
|
672
|
+
build(): PluginFactory<Data, Params, Outputs, Config, Versions> {
|
|
673
|
+
return PluginModelFactory[FROM_BUILDER]<Data, Params, Outputs, Config, Versions>({
|
|
280
674
|
name: this.name,
|
|
281
|
-
|
|
675
|
+
dataFn: this.dataFn,
|
|
676
|
+
getDefaultDataFn: this.getDefaultDataFn,
|
|
282
677
|
outputs: this.outputs,
|
|
283
678
|
featureFlags: this.featureFlags,
|
|
284
679
|
});
|
package/src/raw_globals.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { OutputWithStatus } from "@milaboratories/pl-model-common";
|
|
2
|
-
import {} from "./global";
|
|
3
2
|
import { getPlatformaInstance } from "./internal";
|
|
4
3
|
import type { Platforma, PlatformaApiVersion } from "./platforma";
|
|
5
4
|
import { PlatformaSDKVersion } from "./version";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../src/annotations/converter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5D,wBAAgB,mCAAmC,CACjD,aAAa,EAAE,YAAY,EAAE,GAC5B,cAAc,EAAE,CAqBlB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/annotations/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
|