@platforma-sdk/model 1.56.0 → 1.57.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.
@@ -64,8 +64,8 @@ class BlockModelV3 {
64
64
  outputs: {
65
65
  ...this.config.outputs,
66
66
  [key]: internal.createAndRegisterRenderLambda({
67
- handle: `output#${key}`,
68
- lambda: () => cfgOrRf(new api.RenderCtx()),
67
+ handle: `block-output#${key}`,
68
+ lambda: () => cfgOrRf(new api.BlockRenderCtx()),
69
69
  ...flags,
70
70
  }),
71
71
  },
@@ -129,7 +129,7 @@ class BlockModelV3 {
129
129
  return new BlockModelV3({
130
130
  ...this.config,
131
131
  // Replace the default sections callback with the user-provided one
132
- sections: internal.createAndRegisterRenderLambda({ handle: "sections", lambda: () => rf(new api.RenderCtx()) }, true),
132
+ sections: internal.createAndRegisterRenderLambda({ handle: "sections", lambda: () => rf(new api.BlockRenderCtx()) }, true),
133
133
  });
134
134
  }
135
135
  /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */
@@ -138,7 +138,7 @@ class BlockModelV3 {
138
138
  ...this.config,
139
139
  title: internal.createAndRegisterRenderLambda({
140
140
  handle: "title",
141
- lambda: () => rf(new api.RenderCtx()),
141
+ lambda: () => rf(new api.BlockRenderCtx()),
142
142
  }),
143
143
  });
144
144
  }
@@ -147,7 +147,7 @@ class BlockModelV3 {
147
147
  ...this.config,
148
148
  subtitle: internal.createAndRegisterRenderLambda({
149
149
  handle: "subtitle",
150
- lambda: () => rf(new api.RenderCtx()),
150
+ lambda: () => rf(new api.BlockRenderCtx()),
151
151
  }),
152
152
  });
153
153
  }
@@ -156,7 +156,7 @@ class BlockModelV3 {
156
156
  ...this.config,
157
157
  tags: internal.createAndRegisterRenderLambda({
158
158
  handle: "tags",
159
- lambda: () => rf(new api.RenderCtx()),
159
+ lambda: () => rf(new api.BlockRenderCtx()),
160
160
  }),
161
161
  });
162
162
  }
@@ -256,6 +256,25 @@ class BlockModelV3 {
256
256
  [block_storage_facade.BlockStorageFacadeCallbacks.ArgsDerive]: (storageJson) => block_storage_callbacks.deriveArgsFromStorage(storageJson, argsFunction),
257
257
  [block_storage_facade.BlockStorageFacadeCallbacks.PrerunArgsDerive]: (storageJson) => block_storage_callbacks.derivePrerunArgsFromStorage(storageJson, argsFunction, prerunArgsFunction),
258
258
  });
259
+ // Register plugin input and output lambdas
260
+ const pluginOutputs = {};
261
+ for (const [pluginId, { model, inputs }] of Object.entries(plugins)) {
262
+ // Wrap plugin param lambdas: close over BlockRenderCtx creation
263
+ const wrappedInputs = {};
264
+ for (const [paramKey, paramFn] of Object.entries(inputs)) {
265
+ wrappedInputs[paramKey] = () => paramFn(new api.BlockRenderCtx());
266
+ }
267
+ // Register plugin outputs (in config pack, evaluated by middle layer)
268
+ const outputs = model.outputs;
269
+ for (const [outputKey, outputFn] of Object.entries(outputs)) {
270
+ const key = `plugin-output#${pluginId}#${outputKey}`;
271
+ pluginOutputs[key] = internal.createAndRegisterRenderLambda({
272
+ handle: key,
273
+ lambda: () => outputFn(new api.PluginRenderCtx(pluginId, wrappedInputs)),
274
+ });
275
+ }
276
+ }
277
+ const allOutputs = { ...this.config.outputs, ...pluginOutputs };
259
278
  const blockConfig = {
260
279
  v4: {
261
280
  configVersion: 4,
@@ -266,7 +285,7 @@ class BlockModelV3 {
266
285
  title: this.config.title,
267
286
  subtitle: this.config.subtitle,
268
287
  tags: this.config.tags,
269
- outputs: this.config.outputs,
288
+ outputs: allOutputs,
270
289
  enrichmentTargets: this.config.enrichmentTargets,
271
290
  featureFlags: this.config.featureFlags,
272
291
  blockLifecycleCallbacks: { ...block_storage_facade.BlockStorageFacadeHandles },
@@ -292,7 +311,7 @@ class BlockModelV3 {
292
311
  apiVersion,
293
312
  }),
294
313
  blockModelInfo: {
295
- outputs: Object.fromEntries(Object.entries(this.config.outputs).map(([key, value]) => [
314
+ outputs: Object.fromEntries(Object.entries(allOutputs).map(([key, value]) => [
296
315
  key,
297
316
  {
298
317
  withStatus: Boolean(types.isConfigLambda(value) && value.withStatus),
@@ -1 +1 @@
1
- {"version":3,"file":"block_model.cjs","sources":["../src/block_model.ts"],"sourcesContent":["import type {\n BlockRenderingMode,\n BlockSection,\n OutputWithStatus,\n PlRef,\n BlockCodeKnownFeatureFlags,\n BlockConfigContainer,\n} from \"@milaboratories/pl-model-common\";\nimport { getPlatformaInstance, isInUI, createAndRegisterRenderLambda } from \"./internal\";\nimport type { DataModel } from \"./block_migrations\";\nimport type { PlatformaV3 } from \"./platforma\";\nimport type { InferRenderFunctionReturn, RenderFunction } from \"./render\";\nimport { RenderCtx } from \"./render\";\nimport type { PluginModel } from \"./plugin_model\";\nimport type { RenderCtxBase } from \"./render\";\nimport { PlatformaSDKVersion } from \"./version\";\nimport {\n applyStorageUpdate,\n getStorageDebugView,\n migrateStorage,\n createInitialStorage,\n deriveArgsFromStorage,\n derivePrerunArgsFromStorage,\n} from \"./block_storage_callbacks\";\nimport { type PluginName } from \"./block_storage\";\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from \"./bconfig\";\nimport { downgradeCfgOrLambda, isConfigLambda } from \"./bconfig\";\nimport type { PlatformaExtended } from \"./platforma\";\nimport {\n BLOCK_STORAGE_FACADE_VERSION,\n BlockStorageFacadeCallbacks,\n BlockStorageFacadeHandles,\n registerFacadeCallbacks,\n} from \"./block_storage_facade\";\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\n/**\n * Per-property lambdas for deriving plugin params from block render context.\n * Each property is a function that receives the block's RenderCtxBase and returns the param value.\n */\nexport type ParamsInput<Params, BArgs = unknown, BData = unknown> = {\n [K in keyof Params]: (ctx: RenderCtxBase<BArgs, BData>) => Params[K];\n};\n\n/**\n * Type-erased version of ParamsInput for internal storage.\n */\ntype ParamsInputErased = Record<string, (ctx: RenderCtxBase) => unknown>;\n\n/**\n * Registered plugin: model + param derivation lambdas.\n * Type parameters are carried by PluginModel generic.\n */\nexport type PluginInstance<Data = unknown, Params = unknown, Outputs = unknown> = {\n readonly model: PluginModel<Data, Params, Outputs>;\n readonly inputs: ParamsInputErased;\n};\n\ninterface BlockModelV3Config<\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\n Plugins extends Record<string, PluginInstance> = {},\n> {\n renderingMode: BlockRenderingMode;\n dataModel: DataModel<Data>;\n outputs: OutputsCfg;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n plugins: Plugins;\n}\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module.\n * API version is 3 (for UI) and 2 (for model) */\nexport class BlockModelV3<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data extends Record<string, unknown> = Record<string, unknown>,\n Href extends `/${string}` = \"/\",\n Plugins extends Record<string, PluginInstance> = {},\n> {\n private constructor(private readonly config: BlockModelV3Config<OutputsCfg, Data, Plugins>) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n requiresCreatePTable: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model.\n *\n * @example\n * const dataModel = new DataModelBuilder()\n * .from<BlockData>(DATA_MODEL_DEFAULT_VERSION)\n * .init(() => ({ numbers: [], labels: [] }));\n *\n * BlockModelV3.create(dataModel)\n * .args((data) => ({ numbers: data.numbers }))\n * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])\n * .done();\n *\n * @param dataModel The data model that defines initial data and migrations\n */\n public static create<Data extends Record<string, unknown>>(\n dataModel: DataModel<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode: \"Heavy\",\n dataModel,\n outputs: {},\n // Register default sections callback (returns empty array)\n sections: createAndRegisterRenderLambda({ handle: \"sections\", lambda: () => [] }, true),\n title: undefined,\n subtitle: undefined,\n tags: undefined,\n enrichmentTargets: undefined,\n featureFlags: { ...BlockModelV3.INITIAL_BLOCK_FEATURE_FLAGS },\n argsFunction: undefined,\n prerunArgsFunction: undefined,\n plugins: {},\n });\n }\n\n /**\n * Add output cell wrapped with additional status information to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true },\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & {\n withStatus: true;\n };\n },\n Data,\n Href,\n Plugins\n >;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data, unknown>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: createAndRegisterRenderLambda({\n handle: `output#${key}`,\n lambda: () => cfgOrRf(new RenderCtx<Args, Data>()),\n ...flags,\n }),\n },\n });\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(\n key: Key,\n rf: RF,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Shortcut for {@link output} with withStatus flag set to true. */\n public outputWithStatus<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { withStatus: true });\n }\n\n /**\n * Sets a function to derive block args from data.\n * This is called during setData to compute the args that will be used for block execution.\n *\n * @example\n * .args<BlockArgs>((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .args<BlockArgs>((data) => {\n * if (data.numbers.length === 0) throw new Error('Numbers required'); // block not ready\n * return { numbers: data.numbers };\n * })\n */\n public args<Args>(\n lambda: (data: Data) => Args,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n argsFunction: lambda as (data: unknown) => unknown,\n });\n }\n\n /**\n * Sets a function to derive pre-run args from data (optional).\n * This is called during setData to compute the args that will be used for staging/pre-run phase.\n *\n * If not defined, defaults to using the args() function result.\n * If defined, uses its return value for the staging / prerun phase.\n *\n * The staging / prerun phase runs only if currentPrerunArgs differs from the executed\n * version of prerunArgs (same comparison logic as currentArgs vs prodArgs).\n *\n * @example\n * .prerunArgs((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .prerunArgs((data) => {\n * // Return undefined to skip staging for this block\n * if (!data.isReady) return undefined;\n * return { numbers: data.numbers };\n * })\n */\n public prerunArgs(\n fn: (data: Data) => unknown,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n prerunArgsFunction: fn as (data: unknown) => unknown,\n });\n }\n\n /** Sets the lambda to generate list of sections in the left block overviews panel. */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, Data, Ret>,\n >(rf: RF): BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins>({\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda(\n { handle: \"sections\", lambda: () => rf(new RenderCtx<Args, Data>()) },\n true,\n ),\n });\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n title: createAndRegisterRenderLambda({\n handle: \"title\",\n lambda: () => rf(new RenderCtx<Args, Data>()),\n }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({\n handle: \"subtitle\",\n lambda: () => rf(new RenderCtx<Args, Data>()),\n }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n tags: createAndRegisterRenderLambda({\n handle: \"tags\",\n lambda: () => rf(new RenderCtx<Args, Data>()),\n }),\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(\n flags: Partial<BlockCodeKnownFeatureFlags>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n featureFlags: { ...this.config.featureFlags, ...flags },\n });\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(\n lambda: (args: Args) => PlRef[],\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({\n handle: \"enrichmentTargets\",\n lambda: lambda,\n }),\n });\n }\n\n /**\n * Registers a plugin instance with the block.\n *\n * Plugins are UI components with their own model logic and persistent state.\n * Each plugin must have a unique pluginId within the block.\n *\n * @param pluginId - Unique identifier for this plugin instance within the block\n * @param plugin - Configured PluginModel instance (created via factory.create(config))\n * @param params - Per-property lambdas deriving plugin params from block RenderCtx\n *\n * @example\n * .plugin('mainTable', dataTablePlugin.create({ defaultOps: {...} }), {\n * columns: (ctx) => ctx.outputs?.resolve(\"data\")?.getPColumns(),\n * sourceId: (ctx) => ctx.data.selectedSource,\n * })\n */\n public plugin<const PluginId extends string, PluginData, PluginParams, PluginOutputs>(\n pluginId: PluginId,\n plugin: PluginModel<PluginData, PluginParams, PluginOutputs>,\n params?: ParamsInput<PluginParams, Args, Data>,\n ): BlockModelV3<\n Args,\n OutputsCfg,\n Data,\n Href,\n Plugins & { [K in PluginId]: PluginInstance<PluginData, PluginParams, PluginOutputs> }\n > {\n // Validate pluginId uniqueness\n if (pluginId in this.config.plugins) {\n throw new Error(`Plugin '${pluginId}' already registered`);\n }\n\n const instance: PluginInstance<PluginData, PluginParams, PluginOutputs> = {\n model: plugin,\n inputs: (params ?? {}) as ParamsInputErased,\n };\n\n return new BlockModelV3({\n ...this.config,\n plugins: {\n ...this.config.plugins,\n [pluginId]: instance,\n },\n });\n }\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block data, and\n * other features provided by the platforma to the block. */\n public done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n if (this.config.argsFunction === undefined) throw new Error(\"Args rendering function not set.\");\n\n const apiVersion = 3;\n\n // Build plugin registry\n const { plugins } = this.config;\n const pluginRegistry: Record<string, PluginName> = {};\n for (const [pluginId, { model }] of Object.entries(plugins)) {\n pluginRegistry[pluginId] = model.name;\n }\n\n const { dataModel, argsFunction, prerunArgsFunction } = this.config;\n\n function getPlugin(pluginId: string): PluginInstance {\n const plugin = plugins[pluginId];\n if (!plugin) throw new Error(`Plugin model not found for '${pluginId}'`);\n return plugin;\n }\n\n // Register ALL facade callbacks here, with dependencies captured via closures\n registerFacadeCallbacks({\n [BlockStorageFacadeCallbacks.StorageApplyUpdate]: applyStorageUpdate,\n [BlockStorageFacadeCallbacks.StorageDebugView]: getStorageDebugView,\n [BlockStorageFacadeCallbacks.StorageMigrate]: (currentStorageJson) =>\n migrateStorage(currentStorageJson, {\n migrateBlockData: (v) => dataModel.migrate(v),\n getPluginRegistry: () => pluginRegistry,\n migratePluginData: (pluginId, v) => getPlugin(pluginId).model.dataModel.migrate(v),\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.StorageInitial]: () =>\n createInitialStorage({\n getDefaultBlockData: () => dataModel.getDefaultData(),\n getPluginRegistry: () => pluginRegistry,\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.ArgsDerive]: (storageJson) =>\n deriveArgsFromStorage(storageJson, argsFunction),\n [BlockStorageFacadeCallbacks.PrerunArgsDerive]: (storageJson) =>\n derivePrerunArgsFromStorage(storageJson, argsFunction, prerunArgsFunction),\n });\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n title: this.config.title,\n subtitle: this.config.subtitle,\n tags: this.config.tags,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n blockLifecycleCallbacks: { ...BlockStorageFacadeHandles },\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n downgradeCfgOrLambda(value),\n ]),\n ),\n };\n\n globalThis.platformaApiVersion = apiVersion;\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config: blockConfig } as any;\n // normal operation inside the UI\n else\n return {\n ...getPlatformaInstance({\n sdkVersion: PlatformaSDKVersion,\n apiVersion,\n }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\n },\n ]),\n ),\n },\n } as any;\n }\n}\n\n// Type tests for BlockModelV3\n\nexport type Expect<T extends true> = T;\n\nexport type Equal<X, Y> =\n (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;\n\nexport type Merge<A, B> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;\n};\n\n// Helper types for testing\ntype _TestArgs = { inputFile: string; threshold: number };\ntype _TestData = { selectedTab: string };\ntype _TestOutputs = {\n result: ConfigRenderLambda<string>;\n count: ConfigRenderLambda<number>;\n};\n\n// Test: Merge type works correctly\ntype _MergeTest1 = Expect<Equal<Merge<{ a: 1 }, { b: 2 }>, { a: 1; b: 2 }>>;\ntype _MergeTest2 = Expect<Equal<Merge<{ a: 1 }, { a: 2 }>, { a: 2 }>>;\ntype _MergeTest3 = Expect<Equal<Merge<{ a: 1; b: 1 }, { b: 2; c: 3 }>, { a: 1; b: 2; c: 3 }>>;\n\n// Test: create() returns a BlockModelV3 instance\n// Note: Due to function overloads, ReturnType uses the last overload signature.\n// We verify the structure is correct using a simpler assignability test.\ntype _CreateResult = ReturnType<typeof BlockModelV3.create>;\ntype _CreateIsBlockModelV3 =\n _CreateResult extends BlockModelV3<infer _A, infer _O, infer _S> ? true : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<\n Equal<\n BlockModelV3Config<_TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n dataModel: DataModel<_TestData>;\n outputs: _TestOutputs;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n plugins: {};\n }\n >\n>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest =\n BlockModelV3<_TestArgs, {}, _TestData> extends BlockModelV3<_TestArgs, {}, _TestData, \"/\">\n ? true\n : false;\ntype _VerifyHrefDefault = Expect<_HrefDefaultTest>;\n\n// Test: Custom Href can be specified\ntype _CustomHref = \"/settings\" | \"/main\";\ntype _HrefCustomBuilder = BlockModelV3<_TestArgs, {}, _TestData, _CustomHref>;\ntype _HrefCustomTest =\n _HrefCustomBuilder extends BlockModelV3<_TestArgs, {}, _TestData, _CustomHref> ? true : false;\ntype _VerifyHrefCustom = Expect<_HrefCustomTest>;\n\n// Test: Output type accumulation with & intersection\ntype _OutputsAccumulation = { a: ConfigRenderLambda<string> } & {\n b: ConfigRenderLambda<number>;\n};\ntype _VerifyOutputsHaveKeys = Expect<Equal<keyof _OutputsAccumulation, \"a\" | \"b\">>;\n\n// Test: Builder with all type parameters specified compiles\ntype _FullBuilder = BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\">;\ntype _FullBuilderTest =\n _FullBuilder extends BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\"> ? true : false;\ntype _VerifyFullBuilder = Expect<_FullBuilderTest>;\n\n// Test: InferOutputsFromLambdas maps outputs correctly\ntype _InferOutputsTest = InferOutputsFromLambdas<{\n myOutput: ConfigRenderLambda<number>;\n}>;\ntype _VerifyInferOutputs = Expect<\n Equal<_InferOutputsTest, { myOutput: OutputWithStatus<number> & { __unwrap: true } }>\n>;\n"],"names":["BLOCK_STORAGE_FACADE_VERSION","createAndRegisterRenderLambda","RenderCtx","registerFacadeCallbacks","BlockStorageFacadeCallbacks","applyStorageUpdate","getStorageDebugView","migrateStorage","createInitialStorage","deriveArgsFromStorage","derivePrerunArgsFromStorage","PlatformaSDKVersion","BlockStorageFacadeHandles","downgradeCfgOrLambda","isInUI","getPlatformaInstance","isConfigLambda"],"mappings":"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"}
1
+ {"version":3,"file":"block_model.cjs","sources":["../src/block_model.ts"],"sourcesContent":["import type {\n BlockRenderingMode,\n BlockSection,\n OutputWithStatus,\n PlRef,\n BlockCodeKnownFeatureFlags,\n BlockConfigContainer,\n} from \"@milaboratories/pl-model-common\";\nimport { getPlatformaInstance, isInUI, createAndRegisterRenderLambda } from \"./internal\";\nimport type { DataModel } from \"./block_migrations\";\nimport type { PlatformaV3 } from \"./platforma\";\nimport type { InferRenderFunctionReturn, RenderFunction } from \"./render\";\nimport { BlockRenderCtx, PluginRenderCtx } from \"./render\";\nimport type { PluginModel } from \"./plugin_model\";\nimport type { RenderCtxBase } from \"./render\";\nimport { PlatformaSDKVersion } from \"./version\";\nimport {\n applyStorageUpdate,\n getStorageDebugView,\n migrateStorage,\n createInitialStorage,\n deriveArgsFromStorage,\n derivePrerunArgsFromStorage,\n} from \"./block_storage_callbacks\";\nimport { type PluginName } from \"./block_storage\";\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from \"./bconfig\";\nimport { downgradeCfgOrLambda, isConfigLambda } from \"./bconfig\";\nimport type { PlatformaExtended } from \"./platforma\";\nimport {\n BLOCK_STORAGE_FACADE_VERSION,\n BlockStorageFacadeCallbacks,\n BlockStorageFacadeHandles,\n registerFacadeCallbacks,\n} from \"./block_storage_facade\";\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\n/**\n * Per-property lambdas for deriving plugin params from block render context.\n * Each property is a function that receives the block's RenderCtxBase and returns the param value.\n */\nexport type ParamsInput<Params, BArgs = unknown, BData = unknown> = {\n [K in keyof Params]: (ctx: RenderCtxBase<BArgs, BData>) => Params[K];\n};\n\n/**\n * Type-erased version of ParamsInput for internal storage.\n */\ntype ParamsInputErased = Record<string, (ctx: RenderCtxBase) => unknown>;\n\n/**\n * Registered plugin: model + param derivation lambdas.\n * Type parameters are carried by PluginModel generic.\n */\nexport type PluginInstance<Data = unknown, Params = unknown, Outputs = unknown> = {\n readonly model: PluginModel<Data, Params, Outputs>;\n readonly inputs: ParamsInputErased;\n};\n\ninterface BlockModelV3Config<\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\n Plugins extends Record<string, PluginInstance> = {},\n> {\n renderingMode: BlockRenderingMode;\n dataModel: DataModel<Data>;\n outputs: OutputsCfg;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n plugins: Plugins;\n}\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module.\n * API version is 3 (for UI) and 2 (for model) */\nexport class BlockModelV3<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data extends Record<string, unknown> = Record<string, unknown>,\n Href extends `/${string}` = \"/\",\n Plugins extends Record<string, PluginInstance> = {},\n> {\n private constructor(private readonly config: BlockModelV3Config<OutputsCfg, Data, Plugins>) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n requiresCreatePTable: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model.\n *\n * @example\n * const dataModel = new DataModelBuilder()\n * .from<BlockData>(DATA_MODEL_DEFAULT_VERSION)\n * .init(() => ({ numbers: [], labels: [] }));\n *\n * BlockModelV3.create(dataModel)\n * .args((data) => ({ numbers: data.numbers }))\n * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])\n * .done();\n *\n * @param dataModel The data model that defines initial data and migrations\n */\n public static create<Data extends Record<string, unknown>>(\n dataModel: DataModel<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode: \"Heavy\",\n dataModel,\n outputs: {},\n // Register default sections callback (returns empty array)\n sections: createAndRegisterRenderLambda({ handle: \"sections\", lambda: () => [] }, true),\n title: undefined,\n subtitle: undefined,\n tags: undefined,\n enrichmentTargets: undefined,\n featureFlags: { ...BlockModelV3.INITIAL_BLOCK_FEATURE_FLAGS },\n argsFunction: undefined,\n prerunArgsFunction: undefined,\n plugins: {},\n });\n }\n\n /**\n * Add output cell wrapped with additional status information to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true },\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & {\n withStatus: true;\n };\n },\n Data,\n Href,\n Plugins\n >;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data, unknown>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: createAndRegisterRenderLambda({\n handle: `block-output#${key}`,\n lambda: () => cfgOrRf(new BlockRenderCtx<Args, Data>()),\n ...flags,\n }),\n },\n });\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(\n key: Key,\n rf: RF,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Shortcut for {@link output} with withStatus flag set to true. */\n public outputWithStatus<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { withStatus: true });\n }\n\n /**\n * Sets a function to derive block args from data.\n * This is called during setData to compute the args that will be used for block execution.\n *\n * @example\n * .args<BlockArgs>((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .args<BlockArgs>((data) => {\n * if (data.numbers.length === 0) throw new Error('Numbers required'); // block not ready\n * return { numbers: data.numbers };\n * })\n */\n public args<Args>(\n lambda: (data: Data) => Args,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n argsFunction: lambda as (data: unknown) => unknown,\n });\n }\n\n /**\n * Sets a function to derive pre-run args from data (optional).\n * This is called during setData to compute the args that will be used for staging/pre-run phase.\n *\n * If not defined, defaults to using the args() function result.\n * If defined, uses its return value for the staging / prerun phase.\n *\n * The staging / prerun phase runs only if currentPrerunArgs differs from the executed\n * version of prerunArgs (same comparison logic as currentArgs vs prodArgs).\n *\n * @example\n * .prerunArgs((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .prerunArgs((data) => {\n * // Return undefined to skip staging for this block\n * if (!data.isReady) return undefined;\n * return { numbers: data.numbers };\n * })\n */\n public prerunArgs(\n fn: (data: Data) => unknown,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n prerunArgsFunction: fn as (data: unknown) => unknown,\n });\n }\n\n /** Sets the lambda to generate list of sections in the left block overviews panel. */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, Data, Ret>,\n >(rf: RF): BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins>({\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda(\n { handle: \"sections\", lambda: () => rf(new BlockRenderCtx<Args, Data>()) },\n true,\n ),\n });\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n title: createAndRegisterRenderLambda({\n handle: \"title\",\n lambda: () => rf(new BlockRenderCtx<Args, Data>()),\n }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({\n handle: \"subtitle\",\n lambda: () => rf(new BlockRenderCtx<Args, Data>()),\n }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n tags: createAndRegisterRenderLambda({\n handle: \"tags\",\n lambda: () => rf(new BlockRenderCtx<Args, Data>()),\n }),\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(\n flags: Partial<BlockCodeKnownFeatureFlags>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n featureFlags: { ...this.config.featureFlags, ...flags },\n });\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(\n lambda: (args: Args) => PlRef[],\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({\n handle: \"enrichmentTargets\",\n lambda: lambda,\n }),\n });\n }\n\n /**\n * Registers a plugin instance with the block.\n *\n * Plugins are UI components with their own model logic and persistent state.\n * Each plugin must have a unique pluginId within the block.\n *\n * @param pluginId - Unique identifier for this plugin instance within the block\n * @param plugin - Configured PluginModel instance (created via factory.create(config))\n * @param params - Per-property lambdas deriving plugin params from block RenderCtx\n *\n * @example\n * .plugin('mainTable', dataTablePlugin.create({ defaultOps: {...} }), {\n * columns: (ctx) => ctx.outputs?.resolve(\"data\")?.getPColumns(),\n * sourceId: (ctx) => ctx.data.selectedSource,\n * })\n */\n public plugin<const PluginId extends string, PluginData, PluginParams, PluginOutputs>(\n pluginId: PluginId,\n plugin: PluginModel<PluginData, PluginParams, PluginOutputs>,\n params?: ParamsInput<PluginParams, Args, Data>,\n ): BlockModelV3<\n Args,\n OutputsCfg,\n Data,\n Href,\n Plugins & { [K in PluginId]: PluginInstance<PluginData, PluginParams, PluginOutputs> }\n > {\n // Validate pluginId uniqueness\n if (pluginId in this.config.plugins) {\n throw new Error(`Plugin '${pluginId}' already registered`);\n }\n\n const instance: PluginInstance<PluginData, PluginParams, PluginOutputs> = {\n model: plugin,\n inputs: (params ?? {}) as ParamsInputErased,\n };\n\n return new BlockModelV3({\n ...this.config,\n plugins: {\n ...this.config.plugins,\n [pluginId]: instance,\n },\n });\n }\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block data, and\n * other features provided by the platforma to the block. */\n public done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n if (this.config.argsFunction === undefined) throw new Error(\"Args rendering function not set.\");\n\n const apiVersion = 3;\n\n // Build plugin registry\n const { plugins } = this.config;\n const pluginRegistry: Record<string, PluginName> = {};\n for (const [pluginId, { model }] of Object.entries(plugins)) {\n pluginRegistry[pluginId] = model.name;\n }\n\n const { dataModel, argsFunction, prerunArgsFunction } = this.config;\n\n function getPlugin(pluginId: string): PluginInstance {\n const plugin = plugins[pluginId];\n if (!plugin) throw new Error(`Plugin model not found for '${pluginId}'`);\n return plugin;\n }\n\n // Register ALL facade callbacks here, with dependencies captured via closures\n registerFacadeCallbacks({\n [BlockStorageFacadeCallbacks.StorageApplyUpdate]: applyStorageUpdate,\n [BlockStorageFacadeCallbacks.StorageDebugView]: getStorageDebugView,\n [BlockStorageFacadeCallbacks.StorageMigrate]: (currentStorageJson) =>\n migrateStorage(currentStorageJson, {\n migrateBlockData: (v) => dataModel.migrate(v),\n getPluginRegistry: () => pluginRegistry,\n migratePluginData: (pluginId, v) => getPlugin(pluginId).model.dataModel.migrate(v),\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.StorageInitial]: () =>\n createInitialStorage({\n getDefaultBlockData: () => dataModel.getDefaultData(),\n getPluginRegistry: () => pluginRegistry,\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.ArgsDerive]: (storageJson) =>\n deriveArgsFromStorage(storageJson, argsFunction),\n [BlockStorageFacadeCallbacks.PrerunArgsDerive]: (storageJson) =>\n derivePrerunArgsFromStorage(storageJson, argsFunction, prerunArgsFunction),\n });\n\n // Register plugin input and output lambdas\n const pluginOutputs: Record<string, ConfigRenderLambda> = {};\n for (const [pluginId, { model, inputs }] of Object.entries(plugins)) {\n // Wrap plugin param lambdas: close over BlockRenderCtx creation\n const wrappedInputs: Record<string, () => unknown> = {};\n for (const [paramKey, paramFn] of Object.entries(inputs)) {\n wrappedInputs[paramKey] = () => paramFn(new BlockRenderCtx());\n }\n\n // Register plugin outputs (in config pack, evaluated by middle layer)\n const outputs = model.outputs as Record<string, (ctx: PluginRenderCtx) => unknown>;\n for (const [outputKey, outputFn] of Object.entries(outputs)) {\n const key = `plugin-output#${pluginId}#${outputKey}`;\n pluginOutputs[key] = createAndRegisterRenderLambda({\n handle: key,\n lambda: () => outputFn(new PluginRenderCtx(pluginId, wrappedInputs)),\n });\n }\n }\n const allOutputs = { ...this.config.outputs, ...pluginOutputs };\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n title: this.config.title,\n subtitle: this.config.subtitle,\n tags: this.config.tags,\n outputs: allOutputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n blockLifecycleCallbacks: { ...BlockStorageFacadeHandles },\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n downgradeCfgOrLambda(value),\n ]),\n ),\n };\n\n globalThis.platformaApiVersion = apiVersion;\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config: blockConfig } as any;\n // normal operation inside the UI\n else\n return {\n ...getPlatformaInstance({\n sdkVersion: PlatformaSDKVersion,\n apiVersion,\n }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(allOutputs).map(([key, value]) => [\n key,\n {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\n },\n ]),\n ),\n },\n } as any;\n }\n}\n\n// Type tests for BlockModelV3\n\nexport type Expect<T extends true> = T;\n\nexport type Equal<X, Y> =\n (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;\n\nexport type Merge<A, B> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;\n};\n\n// Helper types for testing\ntype _TestArgs = { inputFile: string; threshold: number };\ntype _TestData = { selectedTab: string };\ntype _TestOutputs = {\n result: ConfigRenderLambda<string>;\n count: ConfigRenderLambda<number>;\n};\n\n// Test: Merge type works correctly\ntype _MergeTest1 = Expect<Equal<Merge<{ a: 1 }, { b: 2 }>, { a: 1; b: 2 }>>;\ntype _MergeTest2 = Expect<Equal<Merge<{ a: 1 }, { a: 2 }>, { a: 2 }>>;\ntype _MergeTest3 = Expect<Equal<Merge<{ a: 1; b: 1 }, { b: 2; c: 3 }>, { a: 1; b: 2; c: 3 }>>;\n\n// Test: create() returns a BlockModelV3 instance\n// Note: Due to function overloads, ReturnType uses the last overload signature.\n// We verify the structure is correct using a simpler assignability test.\ntype _CreateResult = ReturnType<typeof BlockModelV3.create>;\ntype _CreateIsBlockModelV3 =\n _CreateResult extends BlockModelV3<infer _A, infer _O, infer _S> ? true : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<\n Equal<\n BlockModelV3Config<_TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n dataModel: DataModel<_TestData>;\n outputs: _TestOutputs;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n plugins: {};\n }\n >\n>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest =\n BlockModelV3<_TestArgs, {}, _TestData> extends BlockModelV3<_TestArgs, {}, _TestData, \"/\">\n ? true\n : false;\ntype _VerifyHrefDefault = Expect<_HrefDefaultTest>;\n\n// Test: Custom Href can be specified\ntype _CustomHref = \"/settings\" | \"/main\";\ntype _HrefCustomBuilder = BlockModelV3<_TestArgs, {}, _TestData, _CustomHref>;\ntype _HrefCustomTest =\n _HrefCustomBuilder extends BlockModelV3<_TestArgs, {}, _TestData, _CustomHref> ? true : false;\ntype _VerifyHrefCustom = Expect<_HrefCustomTest>;\n\n// Test: Output type accumulation with & intersection\ntype _OutputsAccumulation = { a: ConfigRenderLambda<string> } & {\n b: ConfigRenderLambda<number>;\n};\ntype _VerifyOutputsHaveKeys = Expect<Equal<keyof _OutputsAccumulation, \"a\" | \"b\">>;\n\n// Test: Builder with all type parameters specified compiles\ntype _FullBuilder = BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\">;\ntype _FullBuilderTest =\n _FullBuilder extends BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\"> ? true : false;\ntype _VerifyFullBuilder = Expect<_FullBuilderTest>;\n\n// Test: InferOutputsFromLambdas maps outputs correctly\ntype _InferOutputsTest = InferOutputsFromLambdas<{\n myOutput: ConfigRenderLambda<number>;\n}>;\ntype _VerifyInferOutputs = Expect<\n Equal<_InferOutputsTest, { myOutput: OutputWithStatus<number> & { __unwrap: true } }>\n>;\n"],"names":["BLOCK_STORAGE_FACADE_VERSION","createAndRegisterRenderLambda","BlockRenderCtx","registerFacadeCallbacks","BlockStorageFacadeCallbacks","applyStorageUpdate","getStorageDebugView","migrateStorage","createInitialStorage","deriveArgsFromStorage","derivePrerunArgsFromStorage","PluginRenderCtx","PlatformaSDKVersion","BlockStorageFacadeHandles","downgradeCfgOrLambda","isInUI","getPlatformaInstance","isConfigLambda"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"block_model.d.ts","sourceRoot":"","sources":["../src/block_model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EAEZ,KAAK,EACL,0BAA0B,EAE3B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAW9C,OAAO,KAAK,EACV,kBAAkB,EAClB,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQrD,KAAK,oBAAoB,GAAG,SAAS,YAAY,EAAE,CAAC;AAEpD,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,IAAI;KACjE,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;CACrE,CAAC;AAEF;;GAEG;AACH,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,IAAI,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI;IAChF,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC,CAAC;AAqBF;;;iDAGiD;AACjD,qBAAa,YAAY,CACvB,IAAI,EACJ,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACrD,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,GAAG,EAC/B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAA3C,OAAO;IAEP,gBAAuB,2BAA2B,EAAE,0BAA0B,CAK5E;IAEF;;;;;;;;;;;;;;OAcG;WACW,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,GACzB,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC;IAkB/B;;;;;;;SAOK;IACE,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAC1F,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,uBAAuB,GAAG;QAAE,UAAU,EAAE,IAAI,CAAA;KAAE,GACpD,YAAY,CACb,IAAI,EACJ,UAAU,GAAG;SACV,CAAC,IAAI,GAAG,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,GAAG;YAC9D,UAAU,EAAE,IAAI,CAAC;SAClB;KACF,EACD,IAAI,EACJ,IAAI,EACJ,OAAO,CACR;IACD;;;;;;;SAOK;IACE,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAC1F,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,KAAK,CAAC,EAAE,uBAAuB,GAC9B,YAAY,CACb,IAAI,EACJ,UAAU,GAAG;SACV,CAAC,IAAI,GAAG,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;KAC9D,EACD,IAAI,EACJ,IAAI,EACJ,OAAO,CACR;IAmBD,mEAAmE;IAC5D,eAAe,CACpB,KAAK,CAAC,GAAG,SAAS,MAAM,EACxB,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAEpD,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,GACL,YAAY,CACb,IAAI,EACJ,UAAU,GAAG;SACV,CAAC,IAAI,GAAG,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;KAC9D,EACD,IAAI,EACJ,IAAI,EACJ,OAAO,CACR;IAID,oEAAoE;IAC7D,gBAAgB,CACrB,KAAK,CAAC,GAAG,SAAS,MAAM,EACxB,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EACpD,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,sCAtEb,CAAC;oBACY,IAAI;;IAyEtB;;;;;;;;;;;;OAYG;IACI,IAAI,CAAC,IAAI,EACd,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAC3B,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAOtD;;;;;;;;;;;;;;;;;;;OAmBG;IACI,UAAU,CACf,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GAC1B,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAOtD,sFAAsF;IAC/E,QAAQ,CACb,KAAK,CAAC,GAAG,SAAS,oBAAoB,EACtC,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAChD,EAAE,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;IAWpF,8GAA8G;IACvG,KAAK,CACV,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,GACrC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAU/C,QAAQ,CACb,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,GACrC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAU/C,IAAI,CACT,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GACvC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAUtD,qDAAqD;IAC9C,gBAAgB,CACrB,KAAK,EAAE,OAAO,CAAC,0BAA0B,CAAC,GACzC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAOtD;;;OAGG;IACI,QAAQ,CACb,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,EAAE,GAC9B,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAUtD;;;;;;;;;;;;;;;OAeG;IACI,MAAM,CAAC,KAAK,CAAC,QAAQ,SAAS,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAClF,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,EAC5D,MAAM,CAAC,EAAE,WAAW,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,GAC7C,YAAY,CACb,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,IAAI,EACJ,OAAO,GAAG;SAAG,CAAC,IAAI,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC;KAAE,CACvF;IAoBD;;gEAE4D;IACrD,IAAI,IAAI,iBAAiB,CAC9B,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,uBAAuB,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAC5E;IAMM,KAAK,IAAI,iBAAiB,CAC/B,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,uBAAuB,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAC5E;CA+FF;AAID,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;AAEvC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,IACpB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAErF,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CACtF,CAAC"}
1
+ {"version":3,"file":"block_model.d.ts","sourceRoot":"","sources":["../src/block_model.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { createAndRegisterRenderLambda, isInUI, getPlatformaInstance } from './internal.js';
2
- import { RenderCtx } from './render/api.js';
2
+ import { BlockRenderCtx, PluginRenderCtx } from './render/api.js';
3
3
  import '@milaboratories/pl-model-common';
4
4
  import './render/util/label.js';
5
5
  import 'canonicalize';
@@ -62,8 +62,8 @@ class BlockModelV3 {
62
62
  outputs: {
63
63
  ...this.config.outputs,
64
64
  [key]: createAndRegisterRenderLambda({
65
- handle: `output#${key}`,
66
- lambda: () => cfgOrRf(new RenderCtx()),
65
+ handle: `block-output#${key}`,
66
+ lambda: () => cfgOrRf(new BlockRenderCtx()),
67
67
  ...flags,
68
68
  }),
69
69
  },
@@ -127,7 +127,7 @@ class BlockModelV3 {
127
127
  return new BlockModelV3({
128
128
  ...this.config,
129
129
  // Replace the default sections callback with the user-provided one
130
- sections: createAndRegisterRenderLambda({ handle: "sections", lambda: () => rf(new RenderCtx()) }, true),
130
+ sections: createAndRegisterRenderLambda({ handle: "sections", lambda: () => rf(new BlockRenderCtx()) }, true),
131
131
  });
132
132
  }
133
133
  /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */
@@ -136,7 +136,7 @@ class BlockModelV3 {
136
136
  ...this.config,
137
137
  title: createAndRegisterRenderLambda({
138
138
  handle: "title",
139
- lambda: () => rf(new RenderCtx()),
139
+ lambda: () => rf(new BlockRenderCtx()),
140
140
  }),
141
141
  });
142
142
  }
@@ -145,7 +145,7 @@ class BlockModelV3 {
145
145
  ...this.config,
146
146
  subtitle: createAndRegisterRenderLambda({
147
147
  handle: "subtitle",
148
- lambda: () => rf(new RenderCtx()),
148
+ lambda: () => rf(new BlockRenderCtx()),
149
149
  }),
150
150
  });
151
151
  }
@@ -154,7 +154,7 @@ class BlockModelV3 {
154
154
  ...this.config,
155
155
  tags: createAndRegisterRenderLambda({
156
156
  handle: "tags",
157
- lambda: () => rf(new RenderCtx()),
157
+ lambda: () => rf(new BlockRenderCtx()),
158
158
  }),
159
159
  });
160
160
  }
@@ -254,6 +254,25 @@ class BlockModelV3 {
254
254
  [BlockStorageFacadeCallbacks.ArgsDerive]: (storageJson) => deriveArgsFromStorage(storageJson, argsFunction),
255
255
  [BlockStorageFacadeCallbacks.PrerunArgsDerive]: (storageJson) => derivePrerunArgsFromStorage(storageJson, argsFunction, prerunArgsFunction),
256
256
  });
257
+ // Register plugin input and output lambdas
258
+ const pluginOutputs = {};
259
+ for (const [pluginId, { model, inputs }] of Object.entries(plugins)) {
260
+ // Wrap plugin param lambdas: close over BlockRenderCtx creation
261
+ const wrappedInputs = {};
262
+ for (const [paramKey, paramFn] of Object.entries(inputs)) {
263
+ wrappedInputs[paramKey] = () => paramFn(new BlockRenderCtx());
264
+ }
265
+ // Register plugin outputs (in config pack, evaluated by middle layer)
266
+ const outputs = model.outputs;
267
+ for (const [outputKey, outputFn] of Object.entries(outputs)) {
268
+ const key = `plugin-output#${pluginId}#${outputKey}`;
269
+ pluginOutputs[key] = createAndRegisterRenderLambda({
270
+ handle: key,
271
+ lambda: () => outputFn(new PluginRenderCtx(pluginId, wrappedInputs)),
272
+ });
273
+ }
274
+ }
275
+ const allOutputs = { ...this.config.outputs, ...pluginOutputs };
257
276
  const blockConfig = {
258
277
  v4: {
259
278
  configVersion: 4,
@@ -264,7 +283,7 @@ class BlockModelV3 {
264
283
  title: this.config.title,
265
284
  subtitle: this.config.subtitle,
266
285
  tags: this.config.tags,
267
- outputs: this.config.outputs,
286
+ outputs: allOutputs,
268
287
  enrichmentTargets: this.config.enrichmentTargets,
269
288
  featureFlags: this.config.featureFlags,
270
289
  blockLifecycleCallbacks: { ...BlockStorageFacadeHandles },
@@ -290,7 +309,7 @@ class BlockModelV3 {
290
309
  apiVersion,
291
310
  }),
292
311
  blockModelInfo: {
293
- outputs: Object.fromEntries(Object.entries(this.config.outputs).map(([key, value]) => [
312
+ outputs: Object.fromEntries(Object.entries(allOutputs).map(([key, value]) => [
294
313
  key,
295
314
  {
296
315
  withStatus: Boolean(isConfigLambda(value) && value.withStatus),
@@ -1 +1 @@
1
- {"version":3,"file":"block_model.js","sources":["../src/block_model.ts"],"sourcesContent":["import type {\n BlockRenderingMode,\n BlockSection,\n OutputWithStatus,\n PlRef,\n BlockCodeKnownFeatureFlags,\n BlockConfigContainer,\n} from \"@milaboratories/pl-model-common\";\nimport { getPlatformaInstance, isInUI, createAndRegisterRenderLambda } from \"./internal\";\nimport type { DataModel } from \"./block_migrations\";\nimport type { PlatformaV3 } from \"./platforma\";\nimport type { InferRenderFunctionReturn, RenderFunction } from \"./render\";\nimport { RenderCtx } from \"./render\";\nimport type { PluginModel } from \"./plugin_model\";\nimport type { RenderCtxBase } from \"./render\";\nimport { PlatformaSDKVersion } from \"./version\";\nimport {\n applyStorageUpdate,\n getStorageDebugView,\n migrateStorage,\n createInitialStorage,\n deriveArgsFromStorage,\n derivePrerunArgsFromStorage,\n} from \"./block_storage_callbacks\";\nimport { type PluginName } from \"./block_storage\";\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from \"./bconfig\";\nimport { downgradeCfgOrLambda, isConfigLambda } from \"./bconfig\";\nimport type { PlatformaExtended } from \"./platforma\";\nimport {\n BLOCK_STORAGE_FACADE_VERSION,\n BlockStorageFacadeCallbacks,\n BlockStorageFacadeHandles,\n registerFacadeCallbacks,\n} from \"./block_storage_facade\";\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\n/**\n * Per-property lambdas for deriving plugin params from block render context.\n * Each property is a function that receives the block's RenderCtxBase and returns the param value.\n */\nexport type ParamsInput<Params, BArgs = unknown, BData = unknown> = {\n [K in keyof Params]: (ctx: RenderCtxBase<BArgs, BData>) => Params[K];\n};\n\n/**\n * Type-erased version of ParamsInput for internal storage.\n */\ntype ParamsInputErased = Record<string, (ctx: RenderCtxBase) => unknown>;\n\n/**\n * Registered plugin: model + param derivation lambdas.\n * Type parameters are carried by PluginModel generic.\n */\nexport type PluginInstance<Data = unknown, Params = unknown, Outputs = unknown> = {\n readonly model: PluginModel<Data, Params, Outputs>;\n readonly inputs: ParamsInputErased;\n};\n\ninterface BlockModelV3Config<\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\n Plugins extends Record<string, PluginInstance> = {},\n> {\n renderingMode: BlockRenderingMode;\n dataModel: DataModel<Data>;\n outputs: OutputsCfg;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n plugins: Plugins;\n}\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module.\n * API version is 3 (for UI) and 2 (for model) */\nexport class BlockModelV3<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data extends Record<string, unknown> = Record<string, unknown>,\n Href extends `/${string}` = \"/\",\n Plugins extends Record<string, PluginInstance> = {},\n> {\n private constructor(private readonly config: BlockModelV3Config<OutputsCfg, Data, Plugins>) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n requiresCreatePTable: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model.\n *\n * @example\n * const dataModel = new DataModelBuilder()\n * .from<BlockData>(DATA_MODEL_DEFAULT_VERSION)\n * .init(() => ({ numbers: [], labels: [] }));\n *\n * BlockModelV3.create(dataModel)\n * .args((data) => ({ numbers: data.numbers }))\n * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])\n * .done();\n *\n * @param dataModel The data model that defines initial data and migrations\n */\n public static create<Data extends Record<string, unknown>>(\n dataModel: DataModel<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode: \"Heavy\",\n dataModel,\n outputs: {},\n // Register default sections callback (returns empty array)\n sections: createAndRegisterRenderLambda({ handle: \"sections\", lambda: () => [] }, true),\n title: undefined,\n subtitle: undefined,\n tags: undefined,\n enrichmentTargets: undefined,\n featureFlags: { ...BlockModelV3.INITIAL_BLOCK_FEATURE_FLAGS },\n argsFunction: undefined,\n prerunArgsFunction: undefined,\n plugins: {},\n });\n }\n\n /**\n * Add output cell wrapped with additional status information to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true },\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & {\n withStatus: true;\n };\n },\n Data,\n Href,\n Plugins\n >;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data, unknown>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: createAndRegisterRenderLambda({\n handle: `output#${key}`,\n lambda: () => cfgOrRf(new RenderCtx<Args, Data>()),\n ...flags,\n }),\n },\n });\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(\n key: Key,\n rf: RF,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Shortcut for {@link output} with withStatus flag set to true. */\n public outputWithStatus<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { withStatus: true });\n }\n\n /**\n * Sets a function to derive block args from data.\n * This is called during setData to compute the args that will be used for block execution.\n *\n * @example\n * .args<BlockArgs>((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .args<BlockArgs>((data) => {\n * if (data.numbers.length === 0) throw new Error('Numbers required'); // block not ready\n * return { numbers: data.numbers };\n * })\n */\n public args<Args>(\n lambda: (data: Data) => Args,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n argsFunction: lambda as (data: unknown) => unknown,\n });\n }\n\n /**\n * Sets a function to derive pre-run args from data (optional).\n * This is called during setData to compute the args that will be used for staging/pre-run phase.\n *\n * If not defined, defaults to using the args() function result.\n * If defined, uses its return value for the staging / prerun phase.\n *\n * The staging / prerun phase runs only if currentPrerunArgs differs from the executed\n * version of prerunArgs (same comparison logic as currentArgs vs prodArgs).\n *\n * @example\n * .prerunArgs((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .prerunArgs((data) => {\n * // Return undefined to skip staging for this block\n * if (!data.isReady) return undefined;\n * return { numbers: data.numbers };\n * })\n */\n public prerunArgs(\n fn: (data: Data) => unknown,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n prerunArgsFunction: fn as (data: unknown) => unknown,\n });\n }\n\n /** Sets the lambda to generate list of sections in the left block overviews panel. */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, Data, Ret>,\n >(rf: RF): BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins>({\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda(\n { handle: \"sections\", lambda: () => rf(new RenderCtx<Args, Data>()) },\n true,\n ),\n });\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n title: createAndRegisterRenderLambda({\n handle: \"title\",\n lambda: () => rf(new RenderCtx<Args, Data>()),\n }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({\n handle: \"subtitle\",\n lambda: () => rf(new RenderCtx<Args, Data>()),\n }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n tags: createAndRegisterRenderLambda({\n handle: \"tags\",\n lambda: () => rf(new RenderCtx<Args, Data>()),\n }),\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(\n flags: Partial<BlockCodeKnownFeatureFlags>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n featureFlags: { ...this.config.featureFlags, ...flags },\n });\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(\n lambda: (args: Args) => PlRef[],\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({\n handle: \"enrichmentTargets\",\n lambda: lambda,\n }),\n });\n }\n\n /**\n * Registers a plugin instance with the block.\n *\n * Plugins are UI components with their own model logic and persistent state.\n * Each plugin must have a unique pluginId within the block.\n *\n * @param pluginId - Unique identifier for this plugin instance within the block\n * @param plugin - Configured PluginModel instance (created via factory.create(config))\n * @param params - Per-property lambdas deriving plugin params from block RenderCtx\n *\n * @example\n * .plugin('mainTable', dataTablePlugin.create({ defaultOps: {...} }), {\n * columns: (ctx) => ctx.outputs?.resolve(\"data\")?.getPColumns(),\n * sourceId: (ctx) => ctx.data.selectedSource,\n * })\n */\n public plugin<const PluginId extends string, PluginData, PluginParams, PluginOutputs>(\n pluginId: PluginId,\n plugin: PluginModel<PluginData, PluginParams, PluginOutputs>,\n params?: ParamsInput<PluginParams, Args, Data>,\n ): BlockModelV3<\n Args,\n OutputsCfg,\n Data,\n Href,\n Plugins & { [K in PluginId]: PluginInstance<PluginData, PluginParams, PluginOutputs> }\n > {\n // Validate pluginId uniqueness\n if (pluginId in this.config.plugins) {\n throw new Error(`Plugin '${pluginId}' already registered`);\n }\n\n const instance: PluginInstance<PluginData, PluginParams, PluginOutputs> = {\n model: plugin,\n inputs: (params ?? {}) as ParamsInputErased,\n };\n\n return new BlockModelV3({\n ...this.config,\n plugins: {\n ...this.config.plugins,\n [pluginId]: instance,\n },\n });\n }\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block data, and\n * other features provided by the platforma to the block. */\n public done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n if (this.config.argsFunction === undefined) throw new Error(\"Args rendering function not set.\");\n\n const apiVersion = 3;\n\n // Build plugin registry\n const { plugins } = this.config;\n const pluginRegistry: Record<string, PluginName> = {};\n for (const [pluginId, { model }] of Object.entries(plugins)) {\n pluginRegistry[pluginId] = model.name;\n }\n\n const { dataModel, argsFunction, prerunArgsFunction } = this.config;\n\n function getPlugin(pluginId: string): PluginInstance {\n const plugin = plugins[pluginId];\n if (!plugin) throw new Error(`Plugin model not found for '${pluginId}'`);\n return plugin;\n }\n\n // Register ALL facade callbacks here, with dependencies captured via closures\n registerFacadeCallbacks({\n [BlockStorageFacadeCallbacks.StorageApplyUpdate]: applyStorageUpdate,\n [BlockStorageFacadeCallbacks.StorageDebugView]: getStorageDebugView,\n [BlockStorageFacadeCallbacks.StorageMigrate]: (currentStorageJson) =>\n migrateStorage(currentStorageJson, {\n migrateBlockData: (v) => dataModel.migrate(v),\n getPluginRegistry: () => pluginRegistry,\n migratePluginData: (pluginId, v) => getPlugin(pluginId).model.dataModel.migrate(v),\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.StorageInitial]: () =>\n createInitialStorage({\n getDefaultBlockData: () => dataModel.getDefaultData(),\n getPluginRegistry: () => pluginRegistry,\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.ArgsDerive]: (storageJson) =>\n deriveArgsFromStorage(storageJson, argsFunction),\n [BlockStorageFacadeCallbacks.PrerunArgsDerive]: (storageJson) =>\n derivePrerunArgsFromStorage(storageJson, argsFunction, prerunArgsFunction),\n });\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n title: this.config.title,\n subtitle: this.config.subtitle,\n tags: this.config.tags,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n blockLifecycleCallbacks: { ...BlockStorageFacadeHandles },\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n downgradeCfgOrLambda(value),\n ]),\n ),\n };\n\n globalThis.platformaApiVersion = apiVersion;\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config: blockConfig } as any;\n // normal operation inside the UI\n else\n return {\n ...getPlatformaInstance({\n sdkVersion: PlatformaSDKVersion,\n apiVersion,\n }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\n },\n ]),\n ),\n },\n } as any;\n }\n}\n\n// Type tests for BlockModelV3\n\nexport type Expect<T extends true> = T;\n\nexport type Equal<X, Y> =\n (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;\n\nexport type Merge<A, B> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;\n};\n\n// Helper types for testing\ntype _TestArgs = { inputFile: string; threshold: number };\ntype _TestData = { selectedTab: string };\ntype _TestOutputs = {\n result: ConfigRenderLambda<string>;\n count: ConfigRenderLambda<number>;\n};\n\n// Test: Merge type works correctly\ntype _MergeTest1 = Expect<Equal<Merge<{ a: 1 }, { b: 2 }>, { a: 1; b: 2 }>>;\ntype _MergeTest2 = Expect<Equal<Merge<{ a: 1 }, { a: 2 }>, { a: 2 }>>;\ntype _MergeTest3 = Expect<Equal<Merge<{ a: 1; b: 1 }, { b: 2; c: 3 }>, { a: 1; b: 2; c: 3 }>>;\n\n// Test: create() returns a BlockModelV3 instance\n// Note: Due to function overloads, ReturnType uses the last overload signature.\n// We verify the structure is correct using a simpler assignability test.\ntype _CreateResult = ReturnType<typeof BlockModelV3.create>;\ntype _CreateIsBlockModelV3 =\n _CreateResult extends BlockModelV3<infer _A, infer _O, infer _S> ? true : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<\n Equal<\n BlockModelV3Config<_TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n dataModel: DataModel<_TestData>;\n outputs: _TestOutputs;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n plugins: {};\n }\n >\n>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest =\n BlockModelV3<_TestArgs, {}, _TestData> extends BlockModelV3<_TestArgs, {}, _TestData, \"/\">\n ? true\n : false;\ntype _VerifyHrefDefault = Expect<_HrefDefaultTest>;\n\n// Test: Custom Href can be specified\ntype _CustomHref = \"/settings\" | \"/main\";\ntype _HrefCustomBuilder = BlockModelV3<_TestArgs, {}, _TestData, _CustomHref>;\ntype _HrefCustomTest =\n _HrefCustomBuilder extends BlockModelV3<_TestArgs, {}, _TestData, _CustomHref> ? true : false;\ntype _VerifyHrefCustom = Expect<_HrefCustomTest>;\n\n// Test: Output type accumulation with & intersection\ntype _OutputsAccumulation = { a: ConfigRenderLambda<string> } & {\n b: ConfigRenderLambda<number>;\n};\ntype _VerifyOutputsHaveKeys = Expect<Equal<keyof _OutputsAccumulation, \"a\" | \"b\">>;\n\n// Test: Builder with all type parameters specified compiles\ntype _FullBuilder = BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\">;\ntype _FullBuilderTest =\n _FullBuilder extends BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\"> ? true : false;\ntype _VerifyFullBuilder = Expect<_FullBuilderTest>;\n\n// Test: InferOutputsFromLambdas maps outputs correctly\ntype _InferOutputsTest = InferOutputsFromLambdas<{\n myOutput: ConfigRenderLambda<number>;\n}>;\ntype _VerifyInferOutputs = Expect<\n Equal<_InferOutputsTest, { myOutput: OutputWithStatus<number> & { __unwrap: true } }>\n>;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block_model.js","sources":["../src/block_model.ts"],"sourcesContent":["import type {\n BlockRenderingMode,\n BlockSection,\n OutputWithStatus,\n PlRef,\n BlockCodeKnownFeatureFlags,\n BlockConfigContainer,\n} from \"@milaboratories/pl-model-common\";\nimport { getPlatformaInstance, isInUI, createAndRegisterRenderLambda } from \"./internal\";\nimport type { DataModel } from \"./block_migrations\";\nimport type { PlatformaV3 } from \"./platforma\";\nimport type { InferRenderFunctionReturn, RenderFunction } from \"./render\";\nimport { BlockRenderCtx, PluginRenderCtx } from \"./render\";\nimport type { PluginModel } from \"./plugin_model\";\nimport type { RenderCtxBase } from \"./render\";\nimport { PlatformaSDKVersion } from \"./version\";\nimport {\n applyStorageUpdate,\n getStorageDebugView,\n migrateStorage,\n createInitialStorage,\n deriveArgsFromStorage,\n derivePrerunArgsFromStorage,\n} from \"./block_storage_callbacks\";\nimport { type PluginName } from \"./block_storage\";\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from \"./bconfig\";\nimport { downgradeCfgOrLambda, isConfigLambda } from \"./bconfig\";\nimport type { PlatformaExtended } from \"./platforma\";\nimport {\n BLOCK_STORAGE_FACADE_VERSION,\n BlockStorageFacadeCallbacks,\n BlockStorageFacadeHandles,\n registerFacadeCallbacks,\n} from \"./block_storage_facade\";\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\n/**\n * Per-property lambdas for deriving plugin params from block render context.\n * Each property is a function that receives the block's RenderCtxBase and returns the param value.\n */\nexport type ParamsInput<Params, BArgs = unknown, BData = unknown> = {\n [K in keyof Params]: (ctx: RenderCtxBase<BArgs, BData>) => Params[K];\n};\n\n/**\n * Type-erased version of ParamsInput for internal storage.\n */\ntype ParamsInputErased = Record<string, (ctx: RenderCtxBase) => unknown>;\n\n/**\n * Registered plugin: model + param derivation lambdas.\n * Type parameters are carried by PluginModel generic.\n */\nexport type PluginInstance<Data = unknown, Params = unknown, Outputs = unknown> = {\n readonly model: PluginModel<Data, Params, Outputs>;\n readonly inputs: ParamsInputErased;\n};\n\ninterface BlockModelV3Config<\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\n Plugins extends Record<string, PluginInstance> = {},\n> {\n renderingMode: BlockRenderingMode;\n dataModel: DataModel<Data>;\n outputs: OutputsCfg;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n plugins: Plugins;\n}\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module.\n * API version is 3 (for UI) and 2 (for model) */\nexport class BlockModelV3<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data extends Record<string, unknown> = Record<string, unknown>,\n Href extends `/${string}` = \"/\",\n Plugins extends Record<string, PluginInstance> = {},\n> {\n private constructor(private readonly config: BlockModelV3Config<OutputsCfg, Data, Plugins>) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n requiresCreatePTable: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model.\n *\n * @example\n * const dataModel = new DataModelBuilder()\n * .from<BlockData>(DATA_MODEL_DEFAULT_VERSION)\n * .init(() => ({ numbers: [], labels: [] }));\n *\n * BlockModelV3.create(dataModel)\n * .args((data) => ({ numbers: data.numbers }))\n * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])\n * .done();\n *\n * @param dataModel The data model that defines initial data and migrations\n */\n public static create<Data extends Record<string, unknown>>(\n dataModel: DataModel<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode: \"Heavy\",\n dataModel,\n outputs: {},\n // Register default sections callback (returns empty array)\n sections: createAndRegisterRenderLambda({ handle: \"sections\", lambda: () => [] }, true),\n title: undefined,\n subtitle: undefined,\n tags: undefined,\n enrichmentTargets: undefined,\n featureFlags: { ...BlockModelV3.INITIAL_BLOCK_FEATURE_FLAGS },\n argsFunction: undefined,\n prerunArgsFunction: undefined,\n plugins: {},\n });\n }\n\n /**\n * Add output cell wrapped with additional status information to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true },\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & {\n withStatus: true;\n };\n },\n Data,\n Href,\n Plugins\n >;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunction<Args, Data, unknown>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data, unknown>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: createAndRegisterRenderLambda({\n handle: `block-output#${key}`,\n lambda: () => cfgOrRf(new BlockRenderCtx<Args, Data>()),\n ...flags,\n }),\n },\n });\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(\n key: Key,\n rf: RF,\n ): BlockModelV3<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>>;\n },\n Data,\n Href,\n Plugins\n > {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Shortcut for {@link output} with withStatus flag set to true. */\n public outputWithStatus<\n const Key extends string,\n const RF extends RenderFunction<Args, Data, unknown>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { withStatus: true });\n }\n\n /**\n * Sets a function to derive block args from data.\n * This is called during setData to compute the args that will be used for block execution.\n *\n * @example\n * .args<BlockArgs>((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .args<BlockArgs>((data) => {\n * if (data.numbers.length === 0) throw new Error('Numbers required'); // block not ready\n * return { numbers: data.numbers };\n * })\n */\n public args<Args>(\n lambda: (data: Data) => Args,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n argsFunction: lambda as (data: unknown) => unknown,\n });\n }\n\n /**\n * Sets a function to derive pre-run args from data (optional).\n * This is called during setData to compute the args that will be used for staging/pre-run phase.\n *\n * If not defined, defaults to using the args() function result.\n * If defined, uses its return value for the staging / prerun phase.\n *\n * The staging / prerun phase runs only if currentPrerunArgs differs from the executed\n * version of prerunArgs (same comparison logic as currentArgs vs prodArgs).\n *\n * @example\n * .prerunArgs((data) => ({ numbers: data.numbers }))\n *\n * @example\n * .prerunArgs((data) => {\n * // Return undefined to skip staging for this block\n * if (!data.isReady) return undefined;\n * return { numbers: data.numbers };\n * })\n */\n public prerunArgs(\n fn: (data: Data) => unknown,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n prerunArgsFunction: fn as (data: unknown) => unknown,\n });\n }\n\n /** Sets the lambda to generate list of sections in the left block overviews panel. */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunction<Args, Data, Ret>,\n >(rf: RF): BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>, Plugins>({\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda(\n { handle: \"sections\", lambda: () => rf(new BlockRenderCtx<Args, Data>()) },\n true,\n ),\n });\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n title: createAndRegisterRenderLambda({\n handle: \"title\",\n lambda: () => rf(new BlockRenderCtx<Args, Data>()),\n }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({\n handle: \"subtitle\",\n lambda: () => rf(new BlockRenderCtx<Args, Data>()),\n }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n tags: createAndRegisterRenderLambda({\n handle: \"tags\",\n lambda: () => rf(new BlockRenderCtx<Args, Data>()),\n }),\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(\n flags: Partial<BlockCodeKnownFeatureFlags>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n featureFlags: { ...this.config.featureFlags, ...flags },\n });\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(\n lambda: (args: Args) => PlRef[],\n ): BlockModelV3<Args, OutputsCfg, Data, Href, Plugins> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href, Plugins>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({\n handle: \"enrichmentTargets\",\n lambda: lambda,\n }),\n });\n }\n\n /**\n * Registers a plugin instance with the block.\n *\n * Plugins are UI components with their own model logic and persistent state.\n * Each plugin must have a unique pluginId within the block.\n *\n * @param pluginId - Unique identifier for this plugin instance within the block\n * @param plugin - Configured PluginModel instance (created via factory.create(config))\n * @param params - Per-property lambdas deriving plugin params from block RenderCtx\n *\n * @example\n * .plugin('mainTable', dataTablePlugin.create({ defaultOps: {...} }), {\n * columns: (ctx) => ctx.outputs?.resolve(\"data\")?.getPColumns(),\n * sourceId: (ctx) => ctx.data.selectedSource,\n * })\n */\n public plugin<const PluginId extends string, PluginData, PluginParams, PluginOutputs>(\n pluginId: PluginId,\n plugin: PluginModel<PluginData, PluginParams, PluginOutputs>,\n params?: ParamsInput<PluginParams, Args, Data>,\n ): BlockModelV3<\n Args,\n OutputsCfg,\n Data,\n Href,\n Plugins & { [K in PluginId]: PluginInstance<PluginData, PluginParams, PluginOutputs> }\n > {\n // Validate pluginId uniqueness\n if (pluginId in this.config.plugins) {\n throw new Error(`Plugin '${pluginId}' already registered`);\n }\n\n const instance: PluginInstance<PluginData, PluginParams, PluginOutputs> = {\n model: plugin,\n inputs: (params ?? {}) as ParamsInputErased,\n };\n\n return new BlockModelV3({\n ...this.config,\n plugins: {\n ...this.config.plugins,\n [pluginId]: instance,\n },\n });\n }\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block data, and\n * other features provided by the platforma to the block. */\n public done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<\n PlatformaV3<Data, Args, InferOutputsFromLambdas<OutputsCfg>, Href, Plugins>\n > {\n if (this.config.argsFunction === undefined) throw new Error(\"Args rendering function not set.\");\n\n const apiVersion = 3;\n\n // Build plugin registry\n const { plugins } = this.config;\n const pluginRegistry: Record<string, PluginName> = {};\n for (const [pluginId, { model }] of Object.entries(plugins)) {\n pluginRegistry[pluginId] = model.name;\n }\n\n const { dataModel, argsFunction, prerunArgsFunction } = this.config;\n\n function getPlugin(pluginId: string): PluginInstance {\n const plugin = plugins[pluginId];\n if (!plugin) throw new Error(`Plugin model not found for '${pluginId}'`);\n return plugin;\n }\n\n // Register ALL facade callbacks here, with dependencies captured via closures\n registerFacadeCallbacks({\n [BlockStorageFacadeCallbacks.StorageApplyUpdate]: applyStorageUpdate,\n [BlockStorageFacadeCallbacks.StorageDebugView]: getStorageDebugView,\n [BlockStorageFacadeCallbacks.StorageMigrate]: (currentStorageJson) =>\n migrateStorage(currentStorageJson, {\n migrateBlockData: (v) => dataModel.migrate(v),\n getPluginRegistry: () => pluginRegistry,\n migratePluginData: (pluginId, v) => getPlugin(pluginId).model.dataModel.migrate(v),\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.StorageInitial]: () =>\n createInitialStorage({\n getDefaultBlockData: () => dataModel.getDefaultData(),\n getPluginRegistry: () => pluginRegistry,\n createPluginData: (pluginId) => getPlugin(pluginId).model.dataModel.getDefaultData(),\n }),\n [BlockStorageFacadeCallbacks.ArgsDerive]: (storageJson) =>\n deriveArgsFromStorage(storageJson, argsFunction),\n [BlockStorageFacadeCallbacks.PrerunArgsDerive]: (storageJson) =>\n derivePrerunArgsFromStorage(storageJson, argsFunction, prerunArgsFunction),\n });\n\n // Register plugin input and output lambdas\n const pluginOutputs: Record<string, ConfigRenderLambda> = {};\n for (const [pluginId, { model, inputs }] of Object.entries(plugins)) {\n // Wrap plugin param lambdas: close over BlockRenderCtx creation\n const wrappedInputs: Record<string, () => unknown> = {};\n for (const [paramKey, paramFn] of Object.entries(inputs)) {\n wrappedInputs[paramKey] = () => paramFn(new BlockRenderCtx());\n }\n\n // Register plugin outputs (in config pack, evaluated by middle layer)\n const outputs = model.outputs as Record<string, (ctx: PluginRenderCtx) => unknown>;\n for (const [outputKey, outputFn] of Object.entries(outputs)) {\n const key = `plugin-output#${pluginId}#${outputKey}`;\n pluginOutputs[key] = createAndRegisterRenderLambda({\n handle: key,\n lambda: () => outputFn(new PluginRenderCtx(pluginId, wrappedInputs)),\n });\n }\n }\n const allOutputs = { ...this.config.outputs, ...pluginOutputs };\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: BLOCK_STORAGE_FACADE_VERSION,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n title: this.config.title,\n subtitle: this.config.subtitle,\n tags: this.config.tags,\n outputs: allOutputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n blockLifecycleCallbacks: { ...BlockStorageFacadeHandles },\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n sections: this.config.sections,\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n downgradeCfgOrLambda(value),\n ]),\n ),\n };\n\n globalThis.platformaApiVersion = apiVersion;\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config: blockConfig } as any;\n // normal operation inside the UI\n else\n return {\n ...getPlatformaInstance({\n sdkVersion: PlatformaSDKVersion,\n apiVersion,\n }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(allOutputs).map(([key, value]) => [\n key,\n {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\n },\n ]),\n ),\n },\n } as any;\n }\n}\n\n// Type tests for BlockModelV3\n\nexport type Expect<T extends true> = T;\n\nexport type Equal<X, Y> =\n (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;\n\nexport type Merge<A, B> = {\n [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;\n};\n\n// Helper types for testing\ntype _TestArgs = { inputFile: string; threshold: number };\ntype _TestData = { selectedTab: string };\ntype _TestOutputs = {\n result: ConfigRenderLambda<string>;\n count: ConfigRenderLambda<number>;\n};\n\n// Test: Merge type works correctly\ntype _MergeTest1 = Expect<Equal<Merge<{ a: 1 }, { b: 2 }>, { a: 1; b: 2 }>>;\ntype _MergeTest2 = Expect<Equal<Merge<{ a: 1 }, { a: 2 }>, { a: 2 }>>;\ntype _MergeTest3 = Expect<Equal<Merge<{ a: 1; b: 1 }, { b: 2; c: 3 }>, { a: 1; b: 2; c: 3 }>>;\n\n// Test: create() returns a BlockModelV3 instance\n// Note: Due to function overloads, ReturnType uses the last overload signature.\n// We verify the structure is correct using a simpler assignability test.\ntype _CreateResult = ReturnType<typeof BlockModelV3.create>;\ntype _CreateIsBlockModelV3 =\n _CreateResult extends BlockModelV3<infer _A, infer _O, infer _S> ? true : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<\n Equal<\n BlockModelV3Config<_TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n argsFunction: ((data: unknown) => unknown) | undefined;\n prerunArgsFunction: ((data: unknown) => unknown) | undefined;\n dataModel: DataModel<_TestData>;\n outputs: _TestOutputs;\n sections: ConfigRenderLambda;\n title: ConfigRenderLambda | undefined;\n subtitle: ConfigRenderLambda | undefined;\n tags: ConfigRenderLambda | undefined;\n enrichmentTargets: ConfigRenderLambda | undefined;\n featureFlags: BlockCodeKnownFeatureFlags;\n plugins: {};\n }\n >\n>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest =\n BlockModelV3<_TestArgs, {}, _TestData> extends BlockModelV3<_TestArgs, {}, _TestData, \"/\">\n ? true\n : false;\ntype _VerifyHrefDefault = Expect<_HrefDefaultTest>;\n\n// Test: Custom Href can be specified\ntype _CustomHref = \"/settings\" | \"/main\";\ntype _HrefCustomBuilder = BlockModelV3<_TestArgs, {}, _TestData, _CustomHref>;\ntype _HrefCustomTest =\n _HrefCustomBuilder extends BlockModelV3<_TestArgs, {}, _TestData, _CustomHref> ? true : false;\ntype _VerifyHrefCustom = Expect<_HrefCustomTest>;\n\n// Test: Output type accumulation with & intersection\ntype _OutputsAccumulation = { a: ConfigRenderLambda<string> } & {\n b: ConfigRenderLambda<number>;\n};\ntype _VerifyOutputsHaveKeys = Expect<Equal<keyof _OutputsAccumulation, \"a\" | \"b\">>;\n\n// Test: Builder with all type parameters specified compiles\ntype _FullBuilder = BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\">;\ntype _FullBuilderTest =\n _FullBuilder extends BlockModelV3<_TestArgs, _TestOutputs, _TestData, \"/main\"> ? true : false;\ntype _VerifyFullBuilder = Expect<_FullBuilderTest>;\n\n// Test: InferOutputsFromLambdas maps outputs correctly\ntype _InferOutputsTest = InferOutputsFromLambdas<{\n myOutput: ConfigRenderLambda<number>;\n}>;\ntype _VerifyInferOutputs = Expect<\n Equal<_InferOutputsTest, { myOutput: OutputWithStatus<number> & { __unwrap: true } }>\n>;\n"],"names":[],"mappings":"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"}
@@ -247,16 +247,19 @@ function migrateBlockStorage(storage, config) {
247
247
  };
248
248
  }
249
249
  /**
250
- * Gets plugin-specific data from BlockStorage (for UI)
250
+ * Gets plugin-specific data from block storage.
251
+ * Accepts raw storage (any format) and normalizes internally.
251
252
  *
252
- * @param storage - The BlockStorage instance
253
+ * @param rawStorage - Raw block storage (may be legacy format or BlockStorage)
253
254
  * @param pluginId - The plugin instance id
254
- * @returns The plugin data or undefined if not set
255
+ * @returns The plugin data
256
+ * @throws If pluginId is not found in storage
255
257
  */
256
- function getPluginData(storage, pluginId) {
258
+ function getPluginData(rawStorage, pluginId) {
259
+ const storage = normalizeBlockStorage(rawStorage);
257
260
  const pluginEntry = storage.__plugins?.[pluginId];
258
261
  if (!pluginEntry)
259
- return undefined;
262
+ throw new Error(`Plugin '${pluginId}' not found in block storage`);
260
263
  return pluginEntry.__data;
261
264
  }
262
265