@platforma-sdk/model 1.53.2 → 1.53.4

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.
@@ -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, createRenderLambda } from './internal';\nimport type { DataModel } from './block_migrations';\nimport type { PlatformaV3 } from './platforma';\nimport type { InferRenderFunctionReturn, RenderFunction } from './render';\nimport { RenderCtx } from './render';\nimport { PlatformaSDKVersion } from './version';\n// Import storage VM integration (side-effect: registers internal callbacks)\nimport './block_storage_vm';\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from './bconfig';\nimport {\n downgradeCfgOrLambda,\n isConfigLambda,\n} from './bconfig';\nimport type { PlatformaExtended } from './platforma';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\ninterface BlockModelV3Config<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\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 args: ConfigRenderLambda<Args> | undefined;\n prerunArgs: ConfigRenderLambda<unknown> | undefined;\n}\n\n/** Options for creating a BlockModelV3 */\nexport interface BlockModelV3Options<Data extends Record<string, unknown>> {\n /** The data model that defines initial data and migrations */\n dataModel: DataModel<Data>;\n /** Rendering mode for the block (default: 'Heavy') */\n renderingMode?: BlockRenderingMode;\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> {\n private constructor(\n private readonly config: BlockModelV3Config<Args, OutputsCfg, Data>,\n ) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model and options.\n *\n * @example\n * const dataModel = DataModel.create<BlockData>(() => ({ numbers: [], labels: [] }));\n * BlockModelV3.create({ dataModel })\n * .args((data) => ({ numbers: data.numbers }))\n * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])\n * .done();\n *\n * @param options Configuration options including required data model\n */\n public static create<Data extends Record<string, unknown>>(\n options: BlockModelV3Options<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n const { dataModel, renderingMode = 'Heavy' } = options;\n\n // Register data model callbacks for VM use (initialData and upgrade)\n dataModel.registerCallbacks();\n\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode,\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 args: undefined,\n prerunArgs: undefined,\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>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true }\n ): BlockModelV3<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & { withStatus: true } },\n Data,\n Href\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>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags\n ): BlockModelV3<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n Data,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: createAndRegisterRenderLambda({ handle: `output#${key}`, lambda: () => cfgOrRf(new RenderCtx()), ...flags }),\n },\n });\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<const Key extends string, const RF extends RenderFunction<Args, Data>>(\n key: Key,\n rf: RF,\n ): BlockModelV3<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n Data,\n Href\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<const Key extends string, const RF extends RenderFunction<Args, Data>>(\n key: Key,\n rf: RF,\n ) {\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>(lambda: (data: Data) => Args): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n args: createAndRegisterRenderLambda<Args>({ handle: 'args', lambda }),\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(fn: (data: Data) => unknown): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n prerunArgs: createAndRegisterRenderLambda({ handle: 'prerunArgs', lambda: fn }),\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>>> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>>({\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda({ handle: 'sections', lambda: () => rf(new RenderCtx()) }, true),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n title: createAndRegisterRenderLambda({ handle: 'title', lambda: () => rf(new RenderCtx()) }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({ handle: 'subtitle', lambda: () => rf(new RenderCtx()) }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n tags: createAndRegisterRenderLambda({ handle: 'tags', lambda: () => rf(new RenderCtx()) }),\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(flags: Partial<BlockCodeKnownFeatureFlags>): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({ handle: 'enrichmentTargets', lambda: lambda }),\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<PlatformaV3<\n Args,\n InferOutputsFromLambdas<OutputsCfg>,\n Data,\n Href\n >> {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<PlatformaV3<\n Args,\n InferOutputsFromLambdas<OutputsCfg>,\n Data,\n Href\n >> {\n if (this.config.args === undefined) throw new Error('Args rendering function not set.');\n\n const apiVersion = 3;\n\n const migrationCount = this.config.dataModel.migrationCount;\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: 2,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n args: this.config.args,\n prerunArgs: this.config.prerunArgs,\n // Reference to __pl_data_initial callback registered by DataModel\n initialData: createRenderLambda({ handle: '__pl_data_initial' }),\n sections: this.config.sections,\n title: this.config.title,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n // Generate migration descriptors (indices for metadata)\n migrations: migrationCount > 0\n ? Array.from({ length: migrationCount }, (_, i) => ({ index: i }))\n : undefined,\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]) => [key, downgradeCfgOrLambda(value)]),\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 return {\n ...getPlatformaInstance({ sdkVersion: PlatformaSDKVersion, apiVersion }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs)\n .map(([key, value]) => [key, {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\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 = { result: ConfigRenderLambda<string>; count: ConfigRenderLambda<number> };\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 = _CreateResult extends BlockModelV3<infer _A, infer _O, infer _S> ? true : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<Equal<\n BlockModelV3Config<_TestArgs, _TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n args: ConfigRenderLambda<_TestArgs> | undefined;\n prerunArgs: ConfigRenderLambda<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 }\n>>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest = BlockModelV3<_TestArgs, {}, _TestData> extends BlockModelV3<_TestArgs, {}, _TestData, '/'> ? true : 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 = _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> } & { b: ConfigRenderLambda<number> };\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 = _FullBuilder extends BlockModelV3<_TestArgs, _TestOutputs, _TestData, '/main'> ? true : false;\ntype _VerifyFullBuilder = Expect<_FullBuilderTest>;\n\n// Test: InferOutputsFromLambdas maps outputs correctly\ntype _InferOutputsTest = InferOutputsFromLambdas<{ myOutput: ConfigRenderLambda<number> }>;\ntype _VerifyInferOutputs = Expect<Equal<\n _InferOutputsTest,\n { myOutput: OutputWithStatus<number> & { __unwrap: true } }\n>>;\n"],"names":["createAndRegisterRenderLambda","RenderCtx","PlatformaSDKVersion","createRenderLambda","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 {\n getPlatformaInstance,\n isInUI,\n createAndRegisterRenderLambda,\n createRenderLambda,\n} from './internal';\nimport type { DataModel } from './block_migrations';\nimport type { PlatformaV3 } from './platforma';\nimport type { InferRenderFunctionReturn, RenderFunction } from './render';\nimport { RenderCtx } from './render';\nimport { PlatformaSDKVersion } from './version';\n// Import storage VM integration (side-effect: registers internal callbacks)\nimport './block_storage_vm';\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from './bconfig';\nimport { downgradeCfgOrLambda, isConfigLambda } from './bconfig';\nimport type { PlatformaExtended } from './platforma';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\ninterface BlockModelV3Config<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\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 args: ConfigRenderLambda<Args> | undefined;\n prerunArgs: ConfigRenderLambda<unknown> | undefined;\n}\n\n/** Options for creating a BlockModelV3 */\nexport interface BlockModelV3Options<Data extends Record<string, unknown>> {\n /** The data model that defines initial data and migrations */\n dataModel: DataModel<Data>;\n /** Rendering mode for the block (default: 'Heavy') */\n renderingMode?: BlockRenderingMode;\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> {\n private constructor(\n private readonly config: BlockModelV3Config<Args, OutputsCfg, Data>,\n ) { }\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags\n = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model and options.\n *\n * @example\n * const Version = defineDataVersions({ V1: DATA_MODEL_DEFAULT_VERSION });\n *\n * type VersionedData = { [Version.V1]: BlockData };\n *\n * const dataModel = new DataModelBuilder<VersionedData>()\n * .from(Version.V1)\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 options Configuration options including required data model\n */\n public static create<Data extends Record<string, unknown>>(\n options: BlockModelV3Options<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n const { dataModel, renderingMode = 'Heavy' } = options;\n\n // Register data model callbacks for VM use (initialData and upgrade)\n dataModel.registerCallbacks();\n\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode,\n dataModel,\n outputs: {},\n // Register default sections callback (returns empty array)\n sections: createAndRegisterRenderLambda(\n { handle: 'sections', lambda: () => [] },\n true,\n ),\n title: undefined,\n subtitle: undefined,\n tags: undefined,\n enrichmentTargets: undefined,\n featureFlags: { ...BlockModelV3.INITIAL_BLOCK_FEATURE_FLAGS },\n args: undefined,\n prerunArgs: undefined,\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<\n const Key extends string,\n const RF extends RenderFunction<Args, Data>,\n >(\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 >;\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<\n const Key extends string,\n const RF extends RenderFunction<Args, Data>,\n >(\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 >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\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()),\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>,\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 > {\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>,\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n args: createAndRegisterRenderLambda<Args>({ handle: 'args', lambda }),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n prerunArgs: createAndRegisterRenderLambda({\n handle: 'prerunArgs',\n lambda: fn,\n }),\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>>> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>>(\n {\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda(\n { handle: 'sections', lambda: () => rf(new RenderCtx()) },\n true,\n ),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n title: createAndRegisterRenderLambda({\n handle: 'title',\n lambda: () => rf(new RenderCtx()),\n }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({\n handle: 'subtitle',\n lambda: () => rf(new RenderCtx()),\n }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n tags: createAndRegisterRenderLambda({\n handle: 'tags',\n lambda: () => rf(new RenderCtx()),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({\n handle: 'enrichmentTargets',\n lambda: lambda,\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<Args, InferOutputsFromLambdas<OutputsCfg>, Data, Href>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<\n PlatformaV3<Args, InferOutputsFromLambdas<OutputsCfg>, Data, Href>\n > {\n if (this.config.args === undefined)\n throw new Error('Args rendering function not set.');\n\n const apiVersion = 3;\n\n const migrationCount = this.config.dataModel.migrationCount;\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: 2,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n args: this.config.args,\n prerunArgs: this.config.prerunArgs,\n // Reference to __pl_data_initial callback registered by DataModel\n initialData: createRenderLambda({ handle: '__pl_data_initial' }),\n sections: this.config.sections,\n title: this.config.title,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n // Generate migration descriptors (indices for metadata)\n migrations:\n migrationCount > 0\n ? Array.from({ length: migrationCount }, (_, i) => ({ index: i }))\n : undefined,\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> = (<T>() => T extends X ? 1 : 2) extends <\n T,\n>() => T extends Y ? 1 : 2\n ? true\n : false;\n\nexport type Merge<A, B> = {\n [K in keyof A | keyof B]: K extends keyof B\n ? B[K]\n : K extends keyof A\n ? A[K]\n : 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<\n Equal<Merge<{ a: 1; b: 1 }, { b: 2; c: 3 }>, { a: 1; b: 2; c: 3 }>\n>;\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 = _CreateResult extends BlockModelV3<\n infer _A,\n infer _O,\n infer _S\n>\n ? true\n : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<\n Equal<\n BlockModelV3Config<_TestArgs, _TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n args: ConfigRenderLambda<_TestArgs> | undefined;\n prerunArgs: ConfigRenderLambda<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 }\n >\n>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest = BlockModelV3<\n _TestArgs,\n {},\n _TestData\n> 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 = _HrefCustomBuilder extends BlockModelV3<\n _TestArgs,\n {},\n _TestData,\n _CustomHref\n>\n ? true\n : 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<\n Equal<keyof _OutputsAccumulation, 'a' | 'b'>\n>;\n\n// Test: Builder with all type parameters specified compiles\ntype _FullBuilder = BlockModelV3<_TestArgs, _TestOutputs, _TestData, '/main'>;\ntype _FullBuilderTest = _FullBuilder extends BlockModelV3<\n _TestArgs,\n _TestOutputs,\n _TestData,\n '/main'\n>\n ? true\n : 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<\n _InferOutputsTest,\n { myOutput: OutputWithStatus<number> & { __unwrap: true } }\n >\n>;\n"],"names":["createAndRegisterRenderLambda","RenderCtx","PlatformaSDKVersion","createRenderLambda","downgradeCfgOrLambda","isInUI","getPlatformaInstance","isConfigLambda"],"mappings":"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"}
@@ -26,7 +26,14 @@ export declare class BlockModelV3<Args, OutputsCfg extends Record<string, Config
26
26
  * Creates a new BlockModelV3 builder with the specified data model and options.
27
27
  *
28
28
  * @example
29
- * const dataModel = DataModel.create<BlockData>(() => ({ numbers: [], labels: [] }));
29
+ * const Version = defineDataVersions({ V1: DATA_MODEL_DEFAULT_VERSION });
30
+ *
31
+ * type VersionedData = { [Version.V1]: BlockData };
32
+ *
33
+ * const dataModel = new DataModelBuilder<VersionedData>()
34
+ * .from(Version.V1)
35
+ * .init(() => ({ numbers: [], labels: [] }));
36
+ *
30
37
  * BlockModelV3.create({ dataModel })
31
38
  * .args((data) => ({ numbers: data.numbers }))
32
39
  * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])
@@ -124,7 +131,7 @@ export declare class BlockModelV3<Args, OutputsCfg extends Record<string, Config
124
131
  _done(): PlatformaExtended<PlatformaV3<Args, InferOutputsFromLambdas<OutputsCfg>, Data, Href>>;
125
132
  }
126
133
  export type Expect<T extends true> = T;
127
- export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;
134
+ export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;
128
135
  export type Merge<A, B> = {
129
136
  [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;
130
137
  };
@@ -1 +1 @@
1
- {"version":3,"file":"block_model.d.ts","sourceRoot":"","sources":["../src/block_model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,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;AAI1E,OAAO,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,kBAAkB,EAClB,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,KAAK,oBAAoB,GAAG,SAAS,YAAY,EAAE,CAAC;AAEpD,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAoBlC,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,8DAA8D;IAC9D,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3B,sDAAsD;IACtD,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAED;;;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;IAG7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IADzB,OAAO;IAIP,gBAAuB,2BAA2B,EAAE,0BAA0B,CAI5E;IAEF;;;;;;;;;;;OAWG;WACW,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,OAAO,EAAE,mBAAmB,CAAC,IAAI,CAAC,GACjC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC;IAsB/B;;;;;;;SAOK;IACE,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,EACjF,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,uBAAuB,GAAG;QAAE,UAAU,EAAE,IAAI,CAAA;KAAE,GACpD,YAAY,CACb,IAAI,EACF,UAAU,GAAG;SAAG,CAAC,IAAI,GAAG,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,GAAG;YAAE,UAAU,EAAE,IAAI,CAAA;SAAE;KAAE,EACrG,IAAI,EACJ,IAAI,CACP;IACD;;;;;;;SAOK;IACE,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,EACjF,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,KAAK,CAAC,EAAE,uBAAuB,GAC9B,YAAY,CACb,IAAI,EACJ,UAAU,GAAG;SAAG,CAAC,IAAI,GAAG,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;KAAE,EAC9E,IAAI,EACJ,IAAI,CACL;IAeD,mEAAmE;IAC5D,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,EAC1F,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,GACL,YAAY,CACX,IAAI,EACN,UAAU,GAAG;SAAG,CAAC,IAAI,GAAG,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;KAAE,EAC9E,IAAI,EACJ,IAAI,CACH;IAIH,oEAAoE;IAC7D,gBAAgB,CAAC,KAAK,CAAC,GAAG,SAAS,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,EAC3F,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,sCApDY,CAAC;oBAA4E,IAAI;;IAyDrG;;;;;;;;;;;;OAYG;IACI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAO3F;;;;;;;;;;;;;;;;;;;OAmBG;IACI,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAO1F,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,CAAC;IAQ3E,8GAA8G;IACvG,KAAK,CACV,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,GACrC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAOtC,QAAQ,CACb,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,GACrC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAOtC,IAAI,CACT,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GACvC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAO7C,qDAAqD;IAC9C,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAO/G;;;OAGG;IACI,QAAQ,CACb,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,EAAE,GAC9B,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAO7C;;gEAE4D;IACrD,IAAI,IAAI,iBAAiB,CAAC,WAAW,CAC1C,IAAI,EACJ,uBAAuB,CAAC,UAAU,CAAC,EACnC,IAAI,EACJ,IAAI,CACL,CAAC;IAMK,KAAK,IAAI,iBAAiB,CAAC,WAAW,CAC3C,IAAI,EACJ,uBAAuB,CAAC,UAAU,CAAC,EACnC,IAAI,EACJ,IAAI,CACL,CAAC;CAuDH;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,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAEvF,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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"}
@@ -26,7 +26,14 @@ class BlockModelV3 {
26
26
  * Creates a new BlockModelV3 builder with the specified data model and options.
27
27
  *
28
28
  * @example
29
- * const dataModel = DataModel.create<BlockData>(() => ({ numbers: [], labels: [] }));
29
+ * const Version = defineDataVersions({ V1: DATA_MODEL_DEFAULT_VERSION });
30
+ *
31
+ * type VersionedData = { [Version.V1]: BlockData };
32
+ *
33
+ * const dataModel = new DataModelBuilder<VersionedData>()
34
+ * .from(Version.V1)
35
+ * .init(() => ({ numbers: [], labels: [] }));
36
+ *
30
37
  * BlockModelV3.create({ dataModel })
31
38
  * .args((data) => ({ numbers: data.numbers }))
32
39
  * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])
@@ -58,7 +65,11 @@ class BlockModelV3 {
58
65
  ...this.config,
59
66
  outputs: {
60
67
  ...this.config.outputs,
61
- [key]: createAndRegisterRenderLambda({ handle: `output#${key}`, lambda: () => cfgOrRf(new RenderCtx()), ...flags }),
68
+ [key]: createAndRegisterRenderLambda({
69
+ handle: `output#${key}`,
70
+ lambda: () => cfgOrRf(new RenderCtx()),
71
+ ...flags,
72
+ }),
62
73
  },
63
74
  });
64
75
  }
@@ -112,7 +123,10 @@ class BlockModelV3 {
112
123
  prerunArgs(fn) {
113
124
  return new BlockModelV3({
114
125
  ...this.config,
115
- prerunArgs: createAndRegisterRenderLambda({ handle: 'prerunArgs', lambda: fn }),
126
+ prerunArgs: createAndRegisterRenderLambda({
127
+ handle: 'prerunArgs',
128
+ lambda: fn,
129
+ }),
116
130
  });
117
131
  }
118
132
  /** Sets the lambda to generate list of sections in the left block overviews panel. */
@@ -127,19 +141,28 @@ class BlockModelV3 {
127
141
  title(rf) {
128
142
  return new BlockModelV3({
129
143
  ...this.config,
130
- title: createAndRegisterRenderLambda({ handle: 'title', lambda: () => rf(new RenderCtx()) }),
144
+ title: createAndRegisterRenderLambda({
145
+ handle: 'title',
146
+ lambda: () => rf(new RenderCtx()),
147
+ }),
131
148
  });
132
149
  }
133
150
  subtitle(rf) {
134
151
  return new BlockModelV3({
135
152
  ...this.config,
136
- subtitle: createAndRegisterRenderLambda({ handle: 'subtitle', lambda: () => rf(new RenderCtx()) }),
153
+ subtitle: createAndRegisterRenderLambda({
154
+ handle: 'subtitle',
155
+ lambda: () => rf(new RenderCtx()),
156
+ }),
137
157
  });
138
158
  }
139
159
  tags(rf) {
140
160
  return new BlockModelV3({
141
161
  ...this.config,
142
- tags: createAndRegisterRenderLambda({ handle: 'tags', lambda: () => rf(new RenderCtx()) }),
162
+ tags: createAndRegisterRenderLambda({
163
+ handle: 'tags',
164
+ lambda: () => rf(new RenderCtx()),
165
+ }),
143
166
  });
144
167
  }
145
168
  /** Sets or overrides feature flags for the block. */
@@ -156,7 +179,10 @@ class BlockModelV3 {
156
179
  enriches(lambda) {
157
180
  return new BlockModelV3({
158
181
  ...this.config,
159
- enrichmentTargets: createAndRegisterRenderLambda({ handle: 'enrichmentTargets', lambda: lambda }),
182
+ enrichmentTargets: createAndRegisterRenderLambda({
183
+ handle: 'enrichmentTargets',
184
+ lambda: lambda,
185
+ }),
160
186
  });
161
187
  }
162
188
  /** Renders all provided block settings into a pre-configured platforma API
@@ -196,7 +222,10 @@ class BlockModelV3 {
196
222
  sdkVersion: PlatformaSDKVersion,
197
223
  renderingMode: this.config.renderingMode,
198
224
  sections: this.config.sections,
199
- outputs: Object.fromEntries(Object.entries(this.config.outputs).map(([key, value]) => [key, downgradeCfgOrLambda(value)])),
225
+ outputs: Object.fromEntries(Object.entries(this.config.outputs).map(([key, value]) => [
226
+ key,
227
+ downgradeCfgOrLambda(value),
228
+ ])),
200
229
  };
201
230
  globalThis.platformaApiVersion = apiVersion;
202
231
  if (!isInUI())
@@ -205,12 +234,17 @@ class BlockModelV3 {
205
234
  // normal operation inside the UI
206
235
  else
207
236
  return {
208
- ...getPlatformaInstance({ sdkVersion: PlatformaSDKVersion, apiVersion }),
237
+ ...getPlatformaInstance({
238
+ sdkVersion: PlatformaSDKVersion,
239
+ apiVersion,
240
+ }),
209
241
  blockModelInfo: {
210
- outputs: Object.fromEntries(Object.entries(this.config.outputs)
211
- .map(([key, value]) => [key, {
242
+ outputs: Object.fromEntries(Object.entries(this.config.outputs).map(([key, value]) => [
243
+ key,
244
+ {
212
245
  withStatus: Boolean(isConfigLambda(value) && value.withStatus),
213
- }])),
246
+ },
247
+ ])),
214
248
  },
215
249
  };
216
250
  }
@@ -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, createRenderLambda } from './internal';\nimport type { DataModel } from './block_migrations';\nimport type { PlatformaV3 } from './platforma';\nimport type { InferRenderFunctionReturn, RenderFunction } from './render';\nimport { RenderCtx } from './render';\nimport { PlatformaSDKVersion } from './version';\n// Import storage VM integration (side-effect: registers internal callbacks)\nimport './block_storage_vm';\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from './bconfig';\nimport {\n downgradeCfgOrLambda,\n isConfigLambda,\n} from './bconfig';\nimport type { PlatformaExtended } from './platforma';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\ninterface BlockModelV3Config<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\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 args: ConfigRenderLambda<Args> | undefined;\n prerunArgs: ConfigRenderLambda<unknown> | undefined;\n}\n\n/** Options for creating a BlockModelV3 */\nexport interface BlockModelV3Options<Data extends Record<string, unknown>> {\n /** The data model that defines initial data and migrations */\n dataModel: DataModel<Data>;\n /** Rendering mode for the block (default: 'Heavy') */\n renderingMode?: BlockRenderingMode;\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> {\n private constructor(\n private readonly config: BlockModelV3Config<Args, OutputsCfg, Data>,\n ) {}\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model and options.\n *\n * @example\n * const dataModel = DataModel.create<BlockData>(() => ({ numbers: [], labels: [] }));\n * BlockModelV3.create({ dataModel })\n * .args((data) => ({ numbers: data.numbers }))\n * .sections(() => [{ type: 'link', href: '/', label: 'Main' }])\n * .done();\n *\n * @param options Configuration options including required data model\n */\n public static create<Data extends Record<string, unknown>>(\n options: BlockModelV3Options<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n const { dataModel, renderingMode = 'Heavy' } = options;\n\n // Register data model callbacks for VM use (initialData and upgrade)\n dataModel.registerCallbacks();\n\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode,\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 args: undefined,\n prerunArgs: undefined,\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>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true }\n ): BlockModelV3<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & { withStatus: true } },\n Data,\n Href\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>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags\n ): BlockModelV3<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n Data,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: createAndRegisterRenderLambda({ handle: `output#${key}`, lambda: () => cfgOrRf(new RenderCtx()), ...flags }),\n },\n });\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<const Key extends string, const RF extends RenderFunction<Args, Data>>(\n key: Key,\n rf: RF,\n ): BlockModelV3<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n Data,\n Href\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<const Key extends string, const RF extends RenderFunction<Args, Data>>(\n key: Key,\n rf: RF,\n ) {\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>(lambda: (data: Data) => Args): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n args: createAndRegisterRenderLambda<Args>({ handle: 'args', lambda }),\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(fn: (data: Data) => unknown): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n prerunArgs: createAndRegisterRenderLambda({ handle: 'prerunArgs', lambda: fn }),\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>>> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>>({\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda({ handle: 'sections', lambda: () => rf(new RenderCtx()) }, true),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n title: createAndRegisterRenderLambda({ handle: 'title', lambda: () => rf(new RenderCtx()) }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({ handle: 'subtitle', lambda: () => rf(new RenderCtx()) }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n tags: createAndRegisterRenderLambda({ handle: 'tags', lambda: () => rf(new RenderCtx()) }),\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(flags: Partial<BlockCodeKnownFeatureFlags>): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({ handle: 'enrichmentTargets', lambda: lambda }),\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<PlatformaV3<\n Args,\n InferOutputsFromLambdas<OutputsCfg>,\n Data,\n Href\n >> {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<PlatformaV3<\n Args,\n InferOutputsFromLambdas<OutputsCfg>,\n Data,\n Href\n >> {\n if (this.config.args === undefined) throw new Error('Args rendering function not set.');\n\n const apiVersion = 3;\n\n const migrationCount = this.config.dataModel.migrationCount;\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: 2,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n args: this.config.args,\n prerunArgs: this.config.prerunArgs,\n // Reference to __pl_data_initial callback registered by DataModel\n initialData: createRenderLambda({ handle: '__pl_data_initial' }),\n sections: this.config.sections,\n title: this.config.title,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n // Generate migration descriptors (indices for metadata)\n migrations: migrationCount > 0\n ? Array.from({ length: migrationCount }, (_, i) => ({ index: i }))\n : undefined,\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]) => [key, downgradeCfgOrLambda(value)]),\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 return {\n ...getPlatformaInstance({ sdkVersion: PlatformaSDKVersion, apiVersion }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs)\n .map(([key, value]) => [key, {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\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 = { result: ConfigRenderLambda<string>; count: ConfigRenderLambda<number> };\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 = _CreateResult extends BlockModelV3<infer _A, infer _O, infer _S> ? true : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<Equal<\n BlockModelV3Config<_TestArgs, _TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n args: ConfigRenderLambda<_TestArgs> | undefined;\n prerunArgs: ConfigRenderLambda<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 }\n>>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest = BlockModelV3<_TestArgs, {}, _TestData> extends BlockModelV3<_TestArgs, {}, _TestData, '/'> ? true : 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 = _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> } & { b: ConfigRenderLambda<number> };\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 = _FullBuilder extends BlockModelV3<_TestArgs, _TestOutputs, _TestData, '/main'> ? true : false;\ntype _VerifyFullBuilder = Expect<_FullBuilderTest>;\n\n// Test: InferOutputsFromLambdas maps outputs correctly\ntype _InferOutputsTest = InferOutputsFromLambdas<{ myOutput: ConfigRenderLambda<number> }>;\ntype _VerifyInferOutputs = Expect<Equal<\n _InferOutputsTest,\n { 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 {\n getPlatformaInstance,\n isInUI,\n createAndRegisterRenderLambda,\n createRenderLambda,\n} from './internal';\nimport type { DataModel } from './block_migrations';\nimport type { PlatformaV3 } from './platforma';\nimport type { InferRenderFunctionReturn, RenderFunction } from './render';\nimport { RenderCtx } from './render';\nimport { PlatformaSDKVersion } from './version';\n// Import storage VM integration (side-effect: registers internal callbacks)\nimport './block_storage_vm';\nimport type {\n ConfigRenderLambda,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromLambdas,\n} from './bconfig';\nimport { downgradeCfgOrLambda, isConfigLambda } from './bconfig';\nimport type { PlatformaExtended } from './platforma';\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype NoOb = Record<string, never>;\n\ninterface BlockModelV3Config<\n Args,\n OutputsCfg extends Record<string, ConfigRenderLambda>,\n Data,\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 args: ConfigRenderLambda<Args> | undefined;\n prerunArgs: ConfigRenderLambda<unknown> | undefined;\n}\n\n/** Options for creating a BlockModelV3 */\nexport interface BlockModelV3Options<Data extends Record<string, unknown>> {\n /** The data model that defines initial data and migrations */\n dataModel: DataModel<Data>;\n /** Rendering mode for the block (default: 'Heavy') */\n renderingMode?: BlockRenderingMode;\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> {\n private constructor(\n private readonly config: BlockModelV3Config<Args, OutputsCfg, Data>,\n ) { }\n\n public static readonly INITIAL_BLOCK_FEATURE_FLAGS: BlockCodeKnownFeatureFlags\n = {\n supportsLazyState: true,\n requiresUIAPIVersion: 3,\n requiresModelAPIVersion: 2,\n };\n\n /**\n * Creates a new BlockModelV3 builder with the specified data model and options.\n *\n * @example\n * const Version = defineDataVersions({ V1: DATA_MODEL_DEFAULT_VERSION });\n *\n * type VersionedData = { [Version.V1]: BlockData };\n *\n * const dataModel = new DataModelBuilder<VersionedData>()\n * .from(Version.V1)\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 options Configuration options including required data model\n */\n public static create<Data extends Record<string, unknown>>(\n options: BlockModelV3Options<Data>,\n ): BlockModelV3<NoOb, {}, Data> {\n const { dataModel, renderingMode = 'Heavy' } = options;\n\n // Register data model callbacks for VM use (initialData and upgrade)\n dataModel.registerCallbacks();\n\n return new BlockModelV3<NoOb, {}, Data>({\n renderingMode,\n dataModel,\n outputs: {},\n // Register default sections callback (returns empty array)\n sections: createAndRegisterRenderLambda(\n { handle: 'sections', lambda: () => [] },\n true,\n ),\n title: undefined,\n subtitle: undefined,\n tags: undefined,\n enrichmentTargets: undefined,\n featureFlags: { ...BlockModelV3.INITIAL_BLOCK_FEATURE_FLAGS },\n args: undefined,\n prerunArgs: undefined,\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<\n const Key extends string,\n const RF extends RenderFunction<Args, Data>,\n >(\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 >;\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<\n const Key extends string,\n const RF extends RenderFunction<Args, Data>,\n >(\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 >;\n public output(\n key: string,\n cfgOrRf: RenderFunction<Args, Data>,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\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()),\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>,\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 > {\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>,\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n args: createAndRegisterRenderLambda<Args>({ handle: 'args', lambda }),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n prerunArgs: createAndRegisterRenderLambda({\n handle: 'prerunArgs',\n lambda: fn,\n }),\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>>> {\n return new BlockModelV3<Args, OutputsCfg, Data, DeriveHref<ReturnType<RF>>>(\n {\n ...this.config,\n // Replace the default sections callback with the user-provided one\n sections: createAndRegisterRenderLambda(\n { handle: 'sections', lambda: () => rf(new RenderCtx()) },\n true,\n ),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n title: createAndRegisterRenderLambda({\n handle: 'title',\n lambda: () => rf(new RenderCtx()),\n }),\n });\n }\n\n public subtitle(\n rf: RenderFunction<Args, Data, string>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n subtitle: createAndRegisterRenderLambda({\n handle: 'subtitle',\n lambda: () => rf(new RenderCtx()),\n }),\n });\n }\n\n public tags(\n rf: RenderFunction<Args, Data, string[]>,\n ): BlockModelV3<Args, OutputsCfg, Data, Href> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n tags: createAndRegisterRenderLambda({\n handle: 'tags',\n lambda: () => rf(new RenderCtx()),\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\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> {\n return new BlockModelV3<Args, OutputsCfg, Data, Href>({\n ...this.config,\n enrichmentTargets: createAndRegisterRenderLambda({\n handle: 'enrichmentTargets',\n lambda: lambda,\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<Args, InferOutputsFromLambdas<OutputsCfg>, Data, Href>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n })._done();\n }\n\n public _done(): PlatformaExtended<\n PlatformaV3<Args, InferOutputsFromLambdas<OutputsCfg>, Data, Href>\n > {\n if (this.config.args === undefined)\n throw new Error('Args rendering function not set.');\n\n const apiVersion = 3;\n\n const migrationCount = this.config.dataModel.migrationCount;\n\n const blockConfig: BlockConfigContainer = {\n v4: {\n configVersion: 4,\n modelAPIVersion: 2,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n args: this.config.args,\n prerunArgs: this.config.prerunArgs,\n // Reference to __pl_data_initial callback registered by DataModel\n initialData: createRenderLambda({ handle: '__pl_data_initial' }),\n sections: this.config.sections,\n title: this.config.title,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n // Generate migration descriptors (indices for metadata)\n migrations:\n migrationCount > 0\n ? Array.from({ length: migrationCount }, (_, i) => ({ index: i }))\n : undefined,\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> = (<T>() => T extends X ? 1 : 2) extends <\n T,\n>() => T extends Y ? 1 : 2\n ? true\n : false;\n\nexport type Merge<A, B> = {\n [K in keyof A | keyof B]: K extends keyof B\n ? B[K]\n : K extends keyof A\n ? A[K]\n : 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<\n Equal<Merge<{ a: 1; b: 1 }, { b: 2; c: 3 }>, { a: 1; b: 2; c: 3 }>\n>;\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 = _CreateResult extends BlockModelV3<\n infer _A,\n infer _O,\n infer _S\n>\n ? true\n : false;\ntype _CreateTest = Expect<_CreateIsBlockModelV3>;\n\n// Test: BlockModelV3Config interface structure\ntype _ConfigTest = Expect<\n Equal<\n BlockModelV3Config<_TestArgs, _TestOutputs, _TestData>,\n {\n renderingMode: BlockRenderingMode;\n args: ConfigRenderLambda<_TestArgs> | undefined;\n prerunArgs: ConfigRenderLambda<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 }\n >\n>;\n\n// Test: Default Href is '/'\ntype _HrefDefaultTest = BlockModelV3<\n _TestArgs,\n {},\n _TestData\n> 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 = _HrefCustomBuilder extends BlockModelV3<\n _TestArgs,\n {},\n _TestData,\n _CustomHref\n>\n ? true\n : 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<\n Equal<keyof _OutputsAccumulation, 'a' | 'b'>\n>;\n\n// Test: Builder with all type parameters specified compiles\ntype _FullBuilder = BlockModelV3<_TestArgs, _TestOutputs, _TestData, '/main'>;\ntype _FullBuilderTest = _FullBuilder extends BlockModelV3<\n _TestArgs,\n _TestOutputs,\n _TestData,\n '/main'\n>\n ? true\n : 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<\n _InferOutputsTest,\n { myOutput: OutputWithStatus<number> & { __unwrap: true } }\n >\n>;\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.53.2";
3
+ var version = "1.53.4";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.map
@@ -1,4 +1,4 @@
1
- var version = "1.53.2";
1
+ var version = "1.53.4";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=package.json.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.53.2",
3
+ "version": "1.53.4",
4
4
  "description": "Platforma.bio SDK / Block Model",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -23,9 +23,9 @@
23
23
  "canonicalize": "~2.1.0",
24
24
  "es-toolkit": "^1.39.10",
25
25
  "zod": "~3.23.8",
26
- "@milaboratories/ptabler-expression-js": "1.1.11",
27
- "@milaboratories/pl-error-like": "1.12.5",
28
- "@milaboratories/pl-model-common": "1.24.1"
26
+ "@milaboratories/ptabler-expression-js": "1.1.12",
27
+ "@milaboratories/pl-model-common": "1.24.2",
28
+ "@milaboratories/pl-error-like": "1.12.5"
29
29
  },
30
30
  "devDependencies": {
31
31
  "typescript": "~5.6.3",
@@ -33,9 +33,9 @@
33
33
  "@vitest/coverage-istanbul": "^4.0.16",
34
34
  "fast-json-patch": "^3.1.1",
35
35
  "@milaboratories/helpers": "1.13.0",
36
+ "@milaboratories/eslint-config": "1.0.5",
36
37
  "@milaboratories/build-configs": "1.4.0",
37
38
  "@milaboratories/ts-builder": "1.2.4",
38
- "@milaboratories/eslint-config": "1.0.5",
39
39
  "@milaboratories/ts-configs": "1.2.0"
40
40
  },
41
41
  "scripts": {
@@ -1,5 +1,5 @@
1
1
  import { tryRegisterCallback } from './internal';
2
- import { createBlockStorage, DATA_MODEL_DEFAULT_VERSION } from './block_storage';
2
+ import { createBlockStorage } from './block_storage';
3
3
 
4
4
  export type DataVersionKey = string;
5
5
  export type DataVersionMap = Record<string, unknown>;
@@ -148,7 +148,9 @@ class DataModelBuilderWithRecover<
148
148
  init<S extends VersionedData[CurrentVersion]>(
149
149
  initialData: DataCreateFn<S>,
150
150
  // Compile-time check: S must have exactly the same keys as VersionedData[CurrentVersion]
151
- ..._noExtraKeys: Exclude<keyof S, keyof VersionedData[CurrentVersion]> extends never ? [] : [never]
151
+ ..._noExtraKeys: Exclude<keyof S, keyof VersionedData[CurrentVersion]> extends never
152
+ ? []
153
+ : [never]
152
154
  ): DataModel<VersionedData[CurrentVersion]> {
153
155
  return DataModel[FROM_BUILDER]<VersionedData[CurrentVersion]>({
154
156
  versionChain: this.versionChain,
@@ -176,7 +178,10 @@ class DataModelBuilderWithRecover<
176
178
  class DataModelMigrationChain<
177
179
  VersionedData extends DataVersionMap,
178
180
  CurrentVersion extends keyof VersionedData & string,
179
- RemainingVersions extends keyof VersionedData & string = Exclude<keyof VersionedData & string, CurrentVersion>,
181
+ RemainingVersions extends keyof VersionedData & string = Exclude<
182
+ keyof VersionedData & string,
183
+ CurrentVersion
184
+ >,
180
185
  > {
181
186
  private readonly versionChain: DataVersionKey[];
182
187
  private readonly migrationSteps: MigrationStep[];
@@ -218,8 +223,16 @@ class DataModelMigrationChain<
218
223
  throw new Error(`Duplicate version '${nextVersion}' in migration chain`);
219
224
  }
220
225
  const fromVersion = this.versionChain[this.versionChain.length - 1];
221
- const step: MigrationStep = { fromVersion, toVersion: nextVersion, migrate: fn as (data: unknown) => unknown };
222
- return new DataModelMigrationChain<VersionedData, NextVersion, Exclude<RemainingVersions, NextVersion>>({
226
+ const step: MigrationStep = {
227
+ fromVersion,
228
+ toVersion: nextVersion,
229
+ migrate: fn as (data: unknown) => unknown,
230
+ };
231
+ return new DataModelMigrationChain<
232
+ VersionedData,
233
+ NextVersion,
234
+ Exclude<RemainingVersions, NextVersion>
235
+ >({
223
236
  versionChain: [...this.versionChain, nextVersion],
224
237
  steps: [...this.migrationSteps, step],
225
238
  });
@@ -276,7 +289,9 @@ class DataModelMigrationChain<
276
289
  this: DataModelMigrationChain<VersionedData, CurrentVersion, never>,
277
290
  initialData: DataCreateFn<S>,
278
291
  // Compile-time check: S must have exactly the same keys as VersionedData[CurrentVersion]
279
- ..._noExtraKeys: Exclude<keyof S, keyof VersionedData[CurrentVersion]> extends never ? [] : [never]
292
+ ..._noExtraKeys: Exclude<keyof S, keyof VersionedData[CurrentVersion]> extends never
293
+ ? []
294
+ : [never]
280
295
  ): DataModel<VersionedData[CurrentVersion]> {
281
296
  return DataModel[FROM_BUILDER]<VersionedData[CurrentVersion]>({
282
297
  versionChain: this.versionChain,
@@ -322,7 +337,11 @@ export class DataModelBuilder<VersionedData extends DataVersionMap> {
322
337
  */
323
338
  from<InitialVersion extends keyof VersionedData & string>(
324
339
  initialVersion: InitialVersion,
325
- ): DataModelMigrationChain<VersionedData, InitialVersion, Exclude<keyof VersionedData & string, InitialVersion>> {
340
+ ): DataModelMigrationChain<
341
+ VersionedData,
342
+ InitialVersion,
343
+ Exclude<keyof VersionedData & string, InitialVersion>
344
+ > {
326
345
  return new DataModelMigrationChain<
327
346
  VersionedData,
328
347
  InitialVersion,
@@ -335,19 +354,21 @@ export class DataModelBuilder<VersionedData extends DataVersionMap> {
335
354
  * DataModel defines the block's data structure, initial values, and migrations.
336
355
  * Used by BlockModelV3 to manage data state.
337
356
  *
338
- * Two ways to create a DataModel:
357
+ * Use `new DataModelBuilder<VersionedData>()` to create a DataModel:
339
358
  *
340
- * 1. **Simple (no migrations)** - Use `DataModel.create()`:
359
+ * **Simple (no migrations):**
341
360
  * @example
342
- * const dataModel = DataModel.create<BlockData>(() => ({
343
- * numbers: [],
344
- * labels: [],
345
- * }));
361
+ * const Version = defineDataVersions({ V1: DATA_MODEL_DEFAULT_VERSION });
362
+ * type VersionedData = { [Version.V1]: BlockData };
346
363
  *
347
- * 2. **With migrations** - Use `new DataModelBuilder<VersionedData>()`:
364
+ * const dataModel = new DataModelBuilder<VersionedData>()
365
+ * .from(Version.V1)
366
+ * .init(() => ({ numbers: [], labels: [] }));
367
+ *
368
+ * **With migrations:**
348
369
  * @example
349
370
  * const Version = defineDataVersions({
350
- * V1: 'v1',
371
+ * V1: DATA_MODEL_DEFAULT_VERSION,
351
372
  * V2: 'v2',
352
373
  * V3: 'v3',
353
374
  * });
@@ -396,31 +417,6 @@ export class DataModel<State> {
396
417
  this.recoverFn = recoverFn;
397
418
  }
398
419
 
399
- /**
400
- * Create a DataModel with just initial data (no migrations).
401
- *
402
- * Use this for simple blocks that don't need version migrations.
403
- * The version will be set to an internal default value.
404
- *
405
- * @typeParam S - The state type
406
- * @param initialData - Factory function returning initial state
407
- * @param version - Optional custom version key (defaults to internal version)
408
- * @returns Finalized DataModel instance
409
- *
410
- * @example
411
- * const dataModel = DataModel.create<BlockData>(() => ({
412
- * numbers: [],
413
- * labels: [],
414
- * }));
415
- */
416
- static create<S>(initialData: () => S, version: DataVersionKey = DATA_MODEL_DEFAULT_VERSION): DataModel<S> {
417
- return new DataModel<S>({
418
- versionChain: [version],
419
- steps: [],
420
- initialDataFn: initialData,
421
- });
422
- }
423
-
424
420
  /**
425
421
  * Internal method for creating DataModel from builder.
426
422
  * Uses Symbol key to prevent external access.
@@ -522,7 +518,9 @@ export class DataModel<State> {
522
518
  */
523
519
  registerCallbacks(): void {
524
520
  tryRegisterCallback('__pl_data_initial', () => this.initialDataFn());
525
- tryRegisterCallback('__pl_data_upgrade', (versioned: DataVersioned<unknown>) => this.migrate(versioned));
521
+ tryRegisterCallback('__pl_data_upgrade', (versioned: DataVersioned<unknown>) =>
522
+ this.migrate(versioned),
523
+ );
526
524
  tryRegisterCallback('__pl_storage_initial', () => {
527
525
  const { version, data } = this.getDefaultData();
528
526
  const storage = createBlockStorage(data, version);