@milaboratories/pl-model-common 1.21.9 → 1.22.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.
@@ -1 +1 @@
1
- {"version":3,"file":"block_config.cjs","sources":["../../src/bmodel/block_config.ts"],"sourcesContent":["// TODO BroadActiveHandleDescriptor must be removed\n\nimport type { BlockCodeFeatureFlags } from '../flags';\nimport type { BlockCodeWithInfo, Code } from './code';\nimport type { BlockRenderingMode } from './types';\n\n/**\n * BroadActiveHandleDescriptor = TypedConfigOrConfigLambda,\n * NarrowActiveHandleDescriptor = ConfigRenderLambda\n */\nexport type BlockConfigV3Generic<\n Args = unknown,\n UiState = unknown,\n BroadActiveHandleDescriptor = unknown,\n NarrowActiveHandleDescriptor extends BroadActiveHandleDescriptor = BroadActiveHandleDescriptor,\n Outputs extends Record<string, BroadActiveHandleDescriptor> = Record<string, BroadActiveHandleDescriptor>,\n> = {\n /** SDK version used by the block */\n readonly sdkVersion: string;\n\n /** Main rendering mode for the block */\n readonly renderingMode: BlockRenderingMode;\n\n /** Initial value for the args when block is added to the project */\n readonly initialArgs: Args;\n\n /** Initial value for the args when block is added to the project */\n readonly initialUiState: UiState;\n\n /**\n * Config to determine whether the block can be executed with current\n * arguments.\n *\n * Optional to support earlier SDK version configs.\n * */\n readonly inputsValid: BroadActiveHandleDescriptor;\n\n /** Configuration to derive list of section for the left overview panel */\n readonly sections: BroadActiveHandleDescriptor;\n\n /** Lambda to derive block title */\n readonly title?: NarrowActiveHandleDescriptor;\n\n /**\n * Lambda returning list of upstream blocks this block enriches with its exports,\n * influences dependency graph construction\n * */\n readonly enrichmentTargets?: NarrowActiveHandleDescriptor;\n\n /** Configuration for the output cells */\n readonly outputs: Outputs;\n\n /** Config code bundle */\n readonly code?: Code;\n\n /** Feature flags for the block Model and UI code. */\n readonly featureFlags?: BlockCodeFeatureFlags;\n};\n\nexport type BlockConfigGeneric = BlockConfigV3Generic;\n\nexport function extractCodeWithInfo(cfg: BlockConfigV3Generic): BlockCodeWithInfo {\n if (cfg.code === undefined) throw new Error('No code bundle');\n return {\n code: cfg.code,\n sdkVersion: cfg.sdkVersion,\n featureFlags: cfg.featureFlags,\n };\n}\n"],"names":[],"mappings":";;AAAA;AA6DM,SAAU,mBAAmB,CAAC,GAAyB,EAAA;AAC3D,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC;IAC7D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;KAC/B;AACH;;;;"}
1
+ {"version":3,"file":"block_config.cjs","sources":["../../src/bmodel/block_config.ts"],"sourcesContent":["// TODO BroadActiveHandleDescriptor must be removed\n\nimport type { BlockCodeFeatureFlags } from '../flags';\nimport type { BlockCodeWithInfo, Code } from './code';\nimport type { BlockRenderingMode } from './types';\n\n/**\n * BroadActiveHandleDescriptor = TypedConfigOrConfigLambda,\n * NarrowActiveHandleDescriptor = ConfigRenderLambda\n */\nexport type BlockConfigV3Generic<\n Args = unknown,\n UiState = unknown,\n BroadActiveHandleDescriptor = unknown,\n NarrowActiveHandleDescriptor extends BroadActiveHandleDescriptor = BroadActiveHandleDescriptor,\n Outputs extends Record<string, BroadActiveHandleDescriptor> = Record<string, BroadActiveHandleDescriptor>,\n> = {\n /** SDK version used by the block */\n readonly sdkVersion: string;\n\n /** Main rendering mode for the block */\n readonly renderingMode: BlockRenderingMode;\n\n /** Initial value for the args when block is added to the project */\n readonly initialArgs: Args;\n\n /** Initial value for the args when block is added to the project */\n readonly initialUiState: UiState;\n\n /**\n * Config to determine whether the block can be executed with current\n * arguments.\n *\n * Optional to support earlier SDK version configs.\n */\n readonly inputsValid: BroadActiveHandleDescriptor;\n\n /** Configuration to derive list of section for the left overview panel */\n readonly sections: BroadActiveHandleDescriptor;\n\n /** Lambda to derive block title */\n readonly title?: NarrowActiveHandleDescriptor;\n\n /** Lambda to derive block subtitle, shown below the title */\n readonly subtitle?: NarrowActiveHandleDescriptor;\n\n /** Lambda returning array of tags for search functionality */\n readonly tags?: BroadActiveHandleDescriptor;\n\n /**\n * Lambda returning list of upstream blocks this block enriches with its exports,\n * influences dependency graph construction\n */\n readonly enrichmentTargets?: NarrowActiveHandleDescriptor;\n\n /** Configuration for the output cells */\n readonly outputs: Outputs;\n\n /** Config code bundle */\n readonly code?: Code;\n\n /** Feature flags for the block Model and UI code. */\n readonly featureFlags?: BlockCodeFeatureFlags;\n};\n\nexport type BlockConfigGeneric = BlockConfigV3Generic;\n\nexport function extractCodeWithInfo(cfg: BlockConfigV3Generic): BlockCodeWithInfo {\n if (cfg.code === undefined) throw new Error('No code bundle');\n return {\n code: cfg.code,\n sdkVersion: cfg.sdkVersion,\n featureFlags: cfg.featureFlags,\n };\n}\n"],"names":[],"mappings":";;AAAA;AAmEM,SAAU,mBAAmB,CAAC,GAAyB,EAAA;AAC3D,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC;IAC7D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;KAC/B;AACH;;;;"}
@@ -19,16 +19,20 @@ export type BlockConfigV3Generic<Args = unknown, UiState = unknown, BroadActiveH
19
19
  * arguments.
20
20
  *
21
21
  * Optional to support earlier SDK version configs.
22
- * */
22
+ */
23
23
  readonly inputsValid: BroadActiveHandleDescriptor;
24
24
  /** Configuration to derive list of section for the left overview panel */
25
25
  readonly sections: BroadActiveHandleDescriptor;
26
26
  /** Lambda to derive block title */
27
27
  readonly title?: NarrowActiveHandleDescriptor;
28
+ /** Lambda to derive block subtitle, shown below the title */
29
+ readonly subtitle?: NarrowActiveHandleDescriptor;
30
+ /** Lambda returning array of tags for search functionality */
31
+ readonly tags?: BroadActiveHandleDescriptor;
28
32
  /**
29
33
  * Lambda returning list of upstream blocks this block enriches with its exports,
30
34
  * influences dependency graph construction
31
- * */
35
+ */
32
36
  readonly enrichmentTargets?: NarrowActiveHandleDescriptor;
33
37
  /** Configuration for the output cells */
34
38
  readonly outputs: Outputs;
@@ -1 +1 @@
1
- {"version":3,"file":"block_config.d.ts","sourceRoot":"","sources":["../../src/bmodel/block_config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,oBAAoB,CAC9B,IAAI,GAAG,OAAO,EACd,OAAO,GAAG,OAAO,EACjB,2BAA2B,GAAG,OAAO,EACrC,4BAA4B,SAAS,2BAA2B,GAAG,2BAA2B,EAC9F,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,IACvG;IACF,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,wCAAwC;IACxC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAC;IAE3C,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAE3B,oEAAoE;IACpE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEjC;;;;;SAKK;IACL,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAElD,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAE/C,mCAAmC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAC;IAE9C;;;SAGK;IACL,QAAQ,CAAC,iBAAiB,CAAC,EAAE,4BAA4B,CAAC;IAE1D,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAErB,qDAAqD;IACrD,QAAQ,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEtD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB,CAOhF"}
1
+ {"version":3,"file":"block_config.d.ts","sourceRoot":"","sources":["../../src/bmodel/block_config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,oBAAoB,CAC9B,IAAI,GAAG,OAAO,EACd,OAAO,GAAG,OAAO,EACjB,2BAA2B,GAAG,OAAO,EACrC,4BAA4B,SAAS,2BAA2B,GAAG,2BAA2B,EAC9F,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,IACvG;IACF,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,wCAAwC;IACxC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAC;IAE3C,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAE3B,oEAAoE;IACpE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEjC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAElD,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAE/C,mCAAmC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAC;IAE9C,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IAEjD,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,2BAA2B,CAAC;IAE5C;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,4BAA4B,CAAC;IAE1D,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAErB,qDAAqD;IACrD,QAAQ,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEtD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB,CAOhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"block_config.js","sources":["../../src/bmodel/block_config.ts"],"sourcesContent":["// TODO BroadActiveHandleDescriptor must be removed\n\nimport type { BlockCodeFeatureFlags } from '../flags';\nimport type { BlockCodeWithInfo, Code } from './code';\nimport type { BlockRenderingMode } from './types';\n\n/**\n * BroadActiveHandleDescriptor = TypedConfigOrConfigLambda,\n * NarrowActiveHandleDescriptor = ConfigRenderLambda\n */\nexport type BlockConfigV3Generic<\n Args = unknown,\n UiState = unknown,\n BroadActiveHandleDescriptor = unknown,\n NarrowActiveHandleDescriptor extends BroadActiveHandleDescriptor = BroadActiveHandleDescriptor,\n Outputs extends Record<string, BroadActiveHandleDescriptor> = Record<string, BroadActiveHandleDescriptor>,\n> = {\n /** SDK version used by the block */\n readonly sdkVersion: string;\n\n /** Main rendering mode for the block */\n readonly renderingMode: BlockRenderingMode;\n\n /** Initial value for the args when block is added to the project */\n readonly initialArgs: Args;\n\n /** Initial value for the args when block is added to the project */\n readonly initialUiState: UiState;\n\n /**\n * Config to determine whether the block can be executed with current\n * arguments.\n *\n * Optional to support earlier SDK version configs.\n * */\n readonly inputsValid: BroadActiveHandleDescriptor;\n\n /** Configuration to derive list of section for the left overview panel */\n readonly sections: BroadActiveHandleDescriptor;\n\n /** Lambda to derive block title */\n readonly title?: NarrowActiveHandleDescriptor;\n\n /**\n * Lambda returning list of upstream blocks this block enriches with its exports,\n * influences dependency graph construction\n * */\n readonly enrichmentTargets?: NarrowActiveHandleDescriptor;\n\n /** Configuration for the output cells */\n readonly outputs: Outputs;\n\n /** Config code bundle */\n readonly code?: Code;\n\n /** Feature flags for the block Model and UI code. */\n readonly featureFlags?: BlockCodeFeatureFlags;\n};\n\nexport type BlockConfigGeneric = BlockConfigV3Generic;\n\nexport function extractCodeWithInfo(cfg: BlockConfigV3Generic): BlockCodeWithInfo {\n if (cfg.code === undefined) throw new Error('No code bundle');\n return {\n code: cfg.code,\n sdkVersion: cfg.sdkVersion,\n featureFlags: cfg.featureFlags,\n };\n}\n"],"names":[],"mappings":"AAAA;AA6DM,SAAU,mBAAmB,CAAC,GAAyB,EAAA;AAC3D,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC;IAC7D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;KAC/B;AACH;;;;"}
1
+ {"version":3,"file":"block_config.js","sources":["../../src/bmodel/block_config.ts"],"sourcesContent":["// TODO BroadActiveHandleDescriptor must be removed\n\nimport type { BlockCodeFeatureFlags } from '../flags';\nimport type { BlockCodeWithInfo, Code } from './code';\nimport type { BlockRenderingMode } from './types';\n\n/**\n * BroadActiveHandleDescriptor = TypedConfigOrConfigLambda,\n * NarrowActiveHandleDescriptor = ConfigRenderLambda\n */\nexport type BlockConfigV3Generic<\n Args = unknown,\n UiState = unknown,\n BroadActiveHandleDescriptor = unknown,\n NarrowActiveHandleDescriptor extends BroadActiveHandleDescriptor = BroadActiveHandleDescriptor,\n Outputs extends Record<string, BroadActiveHandleDescriptor> = Record<string, BroadActiveHandleDescriptor>,\n> = {\n /** SDK version used by the block */\n readonly sdkVersion: string;\n\n /** Main rendering mode for the block */\n readonly renderingMode: BlockRenderingMode;\n\n /** Initial value for the args when block is added to the project */\n readonly initialArgs: Args;\n\n /** Initial value for the args when block is added to the project */\n readonly initialUiState: UiState;\n\n /**\n * Config to determine whether the block can be executed with current\n * arguments.\n *\n * Optional to support earlier SDK version configs.\n */\n readonly inputsValid: BroadActiveHandleDescriptor;\n\n /** Configuration to derive list of section for the left overview panel */\n readonly sections: BroadActiveHandleDescriptor;\n\n /** Lambda to derive block title */\n readonly title?: NarrowActiveHandleDescriptor;\n\n /** Lambda to derive block subtitle, shown below the title */\n readonly subtitle?: NarrowActiveHandleDescriptor;\n\n /** Lambda returning array of tags for search functionality */\n readonly tags?: BroadActiveHandleDescriptor;\n\n /**\n * Lambda returning list of upstream blocks this block enriches with its exports,\n * influences dependency graph construction\n */\n readonly enrichmentTargets?: NarrowActiveHandleDescriptor;\n\n /** Configuration for the output cells */\n readonly outputs: Outputs;\n\n /** Config code bundle */\n readonly code?: Code;\n\n /** Feature flags for the block Model and UI code. */\n readonly featureFlags?: BlockCodeFeatureFlags;\n};\n\nexport type BlockConfigGeneric = BlockConfigV3Generic;\n\nexport function extractCodeWithInfo(cfg: BlockConfigV3Generic): BlockCodeWithInfo {\n if (cfg.code === undefined) throw new Error('No code bundle');\n return {\n code: cfg.code,\n sdkVersion: cfg.sdkVersion,\n featureFlags: cfg.featureFlags,\n };\n}\n"],"names":[],"mappings":"AAAA;AAmEM,SAAU,mBAAmB,CAAC,GAAyB,EAAA;AAC3D,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC;IAC7D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;KAC/B;AACH;;;;"}
@@ -16,7 +16,7 @@ function upgradeCfgOrLambda(data) {
16
16
  function extractConfigGeneric(cfg) {
17
17
  if (cfg.v3 !== undefined) {
18
18
  // version 3
19
- const { initialArgs, initialUiState, inputsValid, outputs, renderingMode, sdkVersion, featureFlags, sections, title, enrichmentTargets, } = cfg.v3;
19
+ const { initialArgs, initialUiState, inputsValid, outputs, renderingMode, sdkVersion, featureFlags, sections, title, subtitle, tags, enrichmentTargets, } = cfg.v3;
20
20
  const { code } = cfg;
21
21
  return {
22
22
  initialArgs,
@@ -28,6 +28,8 @@ function extractConfigGeneric(cfg) {
28
28
  featureFlags,
29
29
  sections,
30
30
  title,
31
+ subtitle,
32
+ tags,
31
33
  code,
32
34
  enrichmentTargets,
33
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"normalization.cjs","sources":["../../src/bmodel/normalization.ts"],"sourcesContent":["import type { BlockConfigGeneric } from './block_config';\nimport type { BlockConfigContainer } from './container';\n\nfunction upgradeCfgOrLambda(data: unknown): unknown;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined\n): unknown | undefined;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined,\n): unknown | undefined {\n if (data === undefined) return undefined;\n if (typeof data === 'string') return { __renderLambda: true, handle: data, retentive: false };\n return data;\n}\n\n/**\n * Takes universal config, and converts it into latest config structure.\n *\n * **Important**: This operation is not meant to be executed recusively.\n * In no circumstance result of this function should be persisted!\n * */\nexport function extractConfigGeneric(cfg: BlockConfigContainer): BlockConfigGeneric {\n if (cfg.v3 !== undefined) {\n // version 3\n const {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n enrichmentTargets,\n } = cfg.v3;\n const { code } = cfg;\n return {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n code,\n enrichmentTargets,\n };\n } else if (cfg.inputsValid !== undefined) {\n // version 2\n const { sdkVersion, renderingMode, outputs, inputsValid, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n sdkVersion === undefined\n || renderingMode === undefined\n || outputs === undefined\n || inputsValid === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v2. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion,\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(inputsValid),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else if (cfg.renderingMode !== undefined) {\n // version 1\n const { sdkVersion, canRun, renderingMode, outputs, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n renderingMode === undefined\n || outputs === undefined\n || canRun === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v1. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion: sdkVersion ?? 'unknown',\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(canRun),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else {\n const { sdkVersion } = cfg;\n const fields = Object.keys(cfg);\n throw new Error(\n `Config format not supported: SDK = ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"normalization.cjs","sources":["../../src/bmodel/normalization.ts"],"sourcesContent":["import type { BlockConfigGeneric } from './block_config';\nimport type { BlockConfigContainer } from './container';\n\nfunction upgradeCfgOrLambda(data: unknown): unknown;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined\n): unknown | undefined;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined,\n): unknown | undefined {\n if (data === undefined) return undefined;\n if (typeof data === 'string') return { __renderLambda: true, handle: data, retentive: false };\n return data;\n}\n\n/**\n * Takes universal config, and converts it into latest config structure.\n *\n * **Important**: This operation is not meant to be executed recusively.\n * In no circumstance result of this function should be persisted!\n * */\nexport function extractConfigGeneric(cfg: BlockConfigContainer): BlockConfigGeneric {\n if (cfg.v3 !== undefined) {\n // version 3\n const {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n subtitle,\n tags,\n enrichmentTargets,\n } = cfg.v3;\n const { code } = cfg;\n return {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n subtitle,\n tags,\n code,\n enrichmentTargets,\n };\n } else if (cfg.inputsValid !== undefined) {\n // version 2\n const { sdkVersion, renderingMode, outputs, inputsValid, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n sdkVersion === undefined\n || renderingMode === undefined\n || outputs === undefined\n || inputsValid === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v2. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion,\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(inputsValid),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else if (cfg.renderingMode !== undefined) {\n // version 1\n const { sdkVersion, canRun, renderingMode, outputs, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n renderingMode === undefined\n || outputs === undefined\n || canRun === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v1. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion: sdkVersion ?? 'unknown',\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(canRun),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else {\n const { sdkVersion } = cfg;\n const fields = Object.keys(cfg);\n throw new Error(\n `Config format not supported: SDK = ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"normalization.d.ts","sourceRoot":"","sources":["../../src/bmodel/normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAcxD;;;;;KAKK;AACL,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,GAAG,kBAAkB,CAyFlF"}
1
+ {"version":3,"file":"normalization.d.ts","sourceRoot":"","sources":["../../src/bmodel/normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAcxD;;;;;KAKK;AACL,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,GAAG,kBAAkB,CA6FlF"}
@@ -14,7 +14,7 @@ function upgradeCfgOrLambda(data) {
14
14
  function extractConfigGeneric(cfg) {
15
15
  if (cfg.v3 !== undefined) {
16
16
  // version 3
17
- const { initialArgs, initialUiState, inputsValid, outputs, renderingMode, sdkVersion, featureFlags, sections, title, enrichmentTargets, } = cfg.v3;
17
+ const { initialArgs, initialUiState, inputsValid, outputs, renderingMode, sdkVersion, featureFlags, sections, title, subtitle, tags, enrichmentTargets, } = cfg.v3;
18
18
  const { code } = cfg;
19
19
  return {
20
20
  initialArgs,
@@ -26,6 +26,8 @@ function extractConfigGeneric(cfg) {
26
26
  featureFlags,
27
27
  sections,
28
28
  title,
29
+ subtitle,
30
+ tags,
29
31
  code,
30
32
  enrichmentTargets,
31
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"normalization.js","sources":["../../src/bmodel/normalization.ts"],"sourcesContent":["import type { BlockConfigGeneric } from './block_config';\nimport type { BlockConfigContainer } from './container';\n\nfunction upgradeCfgOrLambda(data: unknown): unknown;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined\n): unknown | undefined;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined,\n): unknown | undefined {\n if (data === undefined) return undefined;\n if (typeof data === 'string') return { __renderLambda: true, handle: data, retentive: false };\n return data;\n}\n\n/**\n * Takes universal config, and converts it into latest config structure.\n *\n * **Important**: This operation is not meant to be executed recusively.\n * In no circumstance result of this function should be persisted!\n * */\nexport function extractConfigGeneric(cfg: BlockConfigContainer): BlockConfigGeneric {\n if (cfg.v3 !== undefined) {\n // version 3\n const {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n enrichmentTargets,\n } = cfg.v3;\n const { code } = cfg;\n return {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n code,\n enrichmentTargets,\n };\n } else if (cfg.inputsValid !== undefined) {\n // version 2\n const { sdkVersion, renderingMode, outputs, inputsValid, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n sdkVersion === undefined\n || renderingMode === undefined\n || outputs === undefined\n || inputsValid === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v2. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion,\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(inputsValid),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else if (cfg.renderingMode !== undefined) {\n // version 1\n const { sdkVersion, canRun, renderingMode, outputs, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n renderingMode === undefined\n || outputs === undefined\n || canRun === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v1. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion: sdkVersion ?? 'unknown',\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(canRun),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else {\n const { sdkVersion } = cfg;\n const fields = Object.keys(cfg);\n throw new Error(\n `Config format not supported: SDK = ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"normalization.js","sources":["../../src/bmodel/normalization.ts"],"sourcesContent":["import type { BlockConfigGeneric } from './block_config';\nimport type { BlockConfigContainer } from './container';\n\nfunction upgradeCfgOrLambda(data: unknown): unknown;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined\n): unknown | undefined;\nfunction upgradeCfgOrLambda(\n data: unknown | undefined,\n): unknown | undefined {\n if (data === undefined) return undefined;\n if (typeof data === 'string') return { __renderLambda: true, handle: data, retentive: false };\n return data;\n}\n\n/**\n * Takes universal config, and converts it into latest config structure.\n *\n * **Important**: This operation is not meant to be executed recusively.\n * In no circumstance result of this function should be persisted!\n * */\nexport function extractConfigGeneric(cfg: BlockConfigContainer): BlockConfigGeneric {\n if (cfg.v3 !== undefined) {\n // version 3\n const {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n subtitle,\n tags,\n enrichmentTargets,\n } = cfg.v3;\n const { code } = cfg;\n return {\n initialArgs,\n initialUiState,\n inputsValid,\n outputs,\n renderingMode,\n sdkVersion,\n featureFlags,\n sections,\n title,\n subtitle,\n tags,\n code,\n enrichmentTargets,\n };\n } else if (cfg.inputsValid !== undefined) {\n // version 2\n const { sdkVersion, renderingMode, outputs, inputsValid, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n sdkVersion === undefined\n || renderingMode === undefined\n || outputs === undefined\n || inputsValid === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v2. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion,\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(inputsValid),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else if (cfg.renderingMode !== undefined) {\n // version 1\n const { sdkVersion, canRun, renderingMode, outputs, sections, initialArgs, code } = cfg;\n const fields = Object.keys(cfg);\n if (\n renderingMode === undefined\n || outputs === undefined\n || canRun === undefined\n || sections === undefined\n || initialArgs === undefined\n )\n throw new Error(\n `Malformed config v1. SDK version ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n return {\n sdkVersion: sdkVersion ?? 'unknown',\n renderingMode,\n initialArgs,\n outputs: Object.fromEntries(\n Object.entries(outputs).map(([key, value]) => [key, upgradeCfgOrLambda(value)]),\n ),\n inputsValid: upgradeCfgOrLambda(canRun),\n sections: upgradeCfgOrLambda(sections),\n initialUiState: undefined,\n code,\n };\n } else {\n const { sdkVersion } = cfg;\n const fields = Object.keys(cfg);\n throw new Error(\n `Config format not supported: SDK = ${sdkVersion}; Fields = ${fields.join(', ')}`,\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -151,11 +151,26 @@ class LinkerMap {
151
151
  return axes;
152
152
  }
153
153
  /** Get all axes that can be connected to sourceAxes by linkers */
154
- getReachableByLinkersAxesFromAxes(sourceAxes) {
155
- const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
154
+ getReachableByLinkersAxesFromAxesNormalized(sourceAxes, matchAxisIdFn) {
155
+ let startKeys = [];
156
+ if (matchAxisIdFn) {
157
+ const sourceAxisIdsGrouped = sourceAxes.map((axis) => spec.getArrayFromAxisTree(spec.getAxesTree(axis)).map(spec.getAxisId));
158
+ for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {
159
+ const matched = this.keyAxesIds.find((keyIds) => keyIds.every((linkerKeyAxisId) => sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId))));
160
+ if (matched) {
161
+ startKeys.push(json.canonicalizeJson(matched));
162
+ }
163
+ }
164
+ }
165
+ else {
166
+ startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
167
+ }
156
168
  const availableKeys = this.searchAvailableAxesKeys(startKeys);
157
169
  return this.getAxesListFromKeysList([...availableKeys]);
158
170
  }
171
+ getReachableByLinkersAxesFromAxes(sourceAxes, matchAxisIdFn) {
172
+ return this.getReachableByLinkersAxesFromAxesNormalized(spec.getNormalizedAxesList(sourceAxes), matchAxisIdFn);
173
+ }
159
174
  static getLinkerKeyFromAxisSpec(axis) {
160
175
  return json.canonicalizeJson(spec.getArrayFromAxisTree(spec.getAxesTree(axis)).map(spec.getAxisId));
161
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"linker_columns.cjs","sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import {\n canonicalizeJson,\n parseJson,\n type CanonicalizedJson,\n} from '../../json';\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from './spec/spec';\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter((l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn))) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(right).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n result.get(keyRight)?.linkWith.set(keyLeft, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map((id: LinkerKey) => this.data.get(id)!.linkWith.get(previous[id])!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce((shortestPath, path) => (shortestPath.length && shortestPath.length < path.length) || !path.length ? shortestPath : path,\n [] as PColumnIdAndSpec[])\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys.flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) => getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [canonicalizeJson(getAxisId(axis)), axis])),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxes(sourceAxes: AxisSpecNormalized[]): AxisSpec[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0: return [];\n case 1: return [[axesSpec[0]]];\n default: break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) => new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(`malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`);\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n };\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))));\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"names":["parseJson","readAnnotationJson","Annotation","getNormalizedAxesList","getArrayFromAxisTree","getAxesTree","canonicalizeJson","getAxisId","spec"],"mappings":"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"}
1
+ {"version":3,"file":"linker_columns.cjs","sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import {\n canonicalizeJson,\n parseJson,\n type CanonicalizedJson,\n} from '../../json';\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from './spec/spec';\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter((l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn))) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(right).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n result.get(keyRight)?.linkWith.set(keyLeft, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map((id: LinkerKey) => this.data.get(id)!.linkWith.get(previous[id])!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce((shortestPath, path) => (shortestPath.length && shortestPath.length < path.length) || !path.length ? shortestPath : path,\n [] as PColumnIdAndSpec[])\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys.flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) => getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [canonicalizeJson(getAxisId(axis)), axis])),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) => getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find(\n (keyIds: AxisId[]) => keyIds.every(\n (linkerKeyAxisId) => sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(getNormalizedAxesList(sourceAxes), matchAxisIdFn);\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0: return [];\n case 1: return [[axesSpec[0]]];\n default: break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) => new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(`malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`);\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n };\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))));\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"names":["parseJson","readAnnotationJson","Annotation","getNormalizedAxesList","getArrayFromAxisTree","getAxesTree","canonicalizeJson","getAxisId","spec"],"mappings":"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"}
@@ -31,7 +31,8 @@ export declare class LinkerMap implements LinkersData {
31
31
  /** Get axes of target axes that are impossible to be linked to source axes with current linker map */
32
32
  getNonLinkableAxes(sourceAxes: AxisSpecNormalized[], targetAxes: AxisSpecNormalized[]): AxisSpecNormalized[];
33
33
  /** Get all axes that can be connected to sourceAxes by linkers */
34
- getReachableByLinkersAxesFromAxes(sourceAxes: AxisSpecNormalized[]): AxisSpec[];
34
+ getReachableByLinkersAxesFromAxesNormalized(sourceAxes: AxisSpecNormalized[], matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean): AxisSpecNormalized[];
35
+ getReachableByLinkersAxesFromAxes(sourceAxes: AxisSpec[], matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean): AxisSpecNormalized[];
35
36
  static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey;
36
37
  /** Split array of axes into several arrays by parents: axes of one group are parents for each other.
37
38
  There are no order inside every group. */
@@ -1 +1 @@
1
- {"version":3,"file":"linker_columns.d.ts","sourceRoot":"","sources":["../../../src/drivers/pframe/linker_columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,MAAM,EAKZ,MAAM,aAAa,CAAC;AAErB,KAAK,SAAS,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAClC,SAAS,EACT;IACE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;CAC5C,CACF,CAAC;AAEF,UAAU,WAAW;IACnB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AACD,qBAAa,SAAU,YAAW,WAAW;IAC3C,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;gBAEtB,SAAS,EAAE,kBAAkB;IAIzC,IAAI,IAAI;;OAEP;IAED,IAAI,UAAU,eAEb;IAED,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE;IAkD9C,4EAA4E;IAC5E,uBAAuB,CAAC,cAAc,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;IAqBpE,8EAA8E;IAC9E,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,gBAAgB,EAAE;IA+B5E,uBAAuB,CAAC,EACtB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,UAAU,EACd,qBAA4B,GAC7B,EAAE;QACD,IAAI,EAAE,kBAAkB,EAAE,CAAC;QAC3B,EAAE,EAAE,kBAAkB,EAAE,CAAC;QACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,GAAG,gBAAgB,EAAE;IAuBtB,6DAA6D;IAC7D,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,kBAAkB,EAAE;IAShE,sGAAsG;IACtG,kBAAkB,CAChB,UAAU,EAAE,kBAAkB,EAAE,EAChC,UAAU,EAAE,kBAAkB,EAAE,GAC/B,kBAAkB,EAAE;IAkBvB,kEAAkE;IAClE,iCAAiC,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,QAAQ,EAAE;IAM/E,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS;IAIpE;gDAC4C;IAC5C,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,EAAE;IA0D5E,0DAA0D;IAC1D,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE;CAItE"}
1
+ {"version":3,"file":"linker_columns.d.ts","sourceRoot":"","sources":["../../../src/drivers/pframe/linker_columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,MAAM,EAKZ,MAAM,aAAa,CAAC;AAErB,KAAK,SAAS,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAClC,SAAS,EACT;IACE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;CAC5C,CACF,CAAC;AAEF,UAAU,WAAW;IACnB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AACD,qBAAa,SAAU,YAAW,WAAW;IAC3C,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;gBAEtB,SAAS,EAAE,kBAAkB;IAIzC,IAAI,IAAI;;OAEP;IAED,IAAI,UAAU,eAEb;IAED,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE;IAkD9C,4EAA4E;IAC5E,uBAAuB,CAAC,cAAc,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;IAqBpE,8EAA8E;IAC9E,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,gBAAgB,EAAE;IA+B5E,uBAAuB,CAAC,EACtB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,UAAU,EACd,qBAA4B,GAC7B,EAAE;QACD,IAAI,EAAE,kBAAkB,EAAE,CAAC;QAC3B,EAAE,EAAE,kBAAkB,EAAE,CAAC;QACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,GAAG,gBAAgB,EAAE;IAuBtB,6DAA6D;IAC7D,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,kBAAkB,EAAE;IAShE,sGAAsG;IACtG,kBAAkB,CAChB,UAAU,EAAE,kBAAkB,EAAE,EAChC,UAAU,EAAE,kBAAkB,EAAE,GAC/B,kBAAkB,EAAE;IAkBvB,kEAAkE;IAClE,2CAA2C,CACzC,UAAU,EAAE,kBAAkB,EAAE,EAChC,aAAa,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,GAC1E,kBAAkB,EAAE;IAuBvB,iCAAiC,CAC/B,UAAU,EAAE,QAAQ,EAAE,EACtB,aAAa,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,GAC1E,kBAAkB,EAAE;IAIvB,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS;IAIpE;gDAC4C;IAC5C,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,EAAE;IA0D5E,0DAA0D;IAC1D,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE;CAItE"}
@@ -149,11 +149,26 @@ class LinkerMap {
149
149
  return axes;
150
150
  }
151
151
  /** Get all axes that can be connected to sourceAxes by linkers */
152
- getReachableByLinkersAxesFromAxes(sourceAxes) {
153
- const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
152
+ getReachableByLinkersAxesFromAxesNormalized(sourceAxes, matchAxisIdFn) {
153
+ let startKeys = [];
154
+ if (matchAxisIdFn) {
155
+ const sourceAxisIdsGrouped = sourceAxes.map((axis) => getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));
156
+ for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {
157
+ const matched = this.keyAxesIds.find((keyIds) => keyIds.every((linkerKeyAxisId) => sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId))));
158
+ if (matched) {
159
+ startKeys.push(canonicalizeJson(matched));
160
+ }
161
+ }
162
+ }
163
+ else {
164
+ startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
165
+ }
154
166
  const availableKeys = this.searchAvailableAxesKeys(startKeys);
155
167
  return this.getAxesListFromKeysList([...availableKeys]);
156
168
  }
169
+ getReachableByLinkersAxesFromAxes(sourceAxes, matchAxisIdFn) {
170
+ return this.getReachableByLinkersAxesFromAxesNormalized(getNormalizedAxesList(sourceAxes), matchAxisIdFn);
171
+ }
157
172
  static getLinkerKeyFromAxisSpec(axis) {
158
173
  return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));
159
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"linker_columns.js","sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import {\n canonicalizeJson,\n parseJson,\n type CanonicalizedJson,\n} from '../../json';\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from './spec/spec';\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter((l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn))) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(right).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n result.get(keyRight)?.linkWith.set(keyLeft, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map((id: LinkerKey) => this.data.get(id)!.linkWith.get(previous[id])!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce((shortestPath, path) => (shortestPath.length && shortestPath.length < path.length) || !path.length ? shortestPath : path,\n [] as PColumnIdAndSpec[])\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys.flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) => getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [canonicalizeJson(getAxisId(axis)), axis])),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxes(sourceAxes: AxisSpecNormalized[]): AxisSpec[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0: return [];\n case 1: return [[axesSpec[0]]];\n default: break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) => new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(`malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`);\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n };\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))));\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linker_columns.js","sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import {\n canonicalizeJson,\n parseJson,\n type CanonicalizedJson,\n} from '../../json';\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from './spec/spec';\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter((l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn))) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(right).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n result.get(keyRight)?.linkWith.set(keyLeft, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n return ids.map((id: LinkerKey) => this.data.get(id)!.linkWith.get(previous[id])!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce((shortestPath, path) => (shortestPath.length && shortestPath.length < path.length) || !path.length ? shortestPath : path,\n [] as PColumnIdAndSpec[])\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys.flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) => getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [canonicalizeJson(getAxisId(axis)), axis])),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) => getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find(\n (keyIds: AxisId[]) => keyIds.every(\n (linkerKeyAxisId) => sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(getNormalizedAxesList(sourceAxes), matchAxisIdFn);\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0: return [];\n case 1: return [[axesSpec[0]]];\n default: break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) => new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(`malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`);\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n };\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))));\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.cjs","sources":["../src/navigation.ts"],"sourcesContent":["/** Block section visualized as items in left panel block overview */\nexport type BlockSection = BlockSectionLink | BlockSectionDelimiter;\n\n/** Tells the system that specific section from the main UI of this block should\n * be opened */\nexport type BlockSectionLink = {\n /** Potentially there may be multiple section types, i.e. for \"+\" rows and for\n * sections directly opening html from the outputs. */\n readonly type: 'link';\n\n /** Internal block section identifier */\n readonly href: `/${string}`;\n\n /** Link visual appearance */\n readonly appearance?: BlockSectionLinkAppearance;\n\n /** Visible section title, can also be used in the window header. */\n readonly label: string;\n};\n\n/** Different variants for link section appearance */\nexport type BlockSectionLinkAppearance =\n /** Shows a section of type `link` with a `+` icon and a certain specific style */\n 'add-section';\n\n/** Create a horizontal line between sections */\nexport type BlockSectionDelimiter = {\n readonly type: 'delimiter';\n};\n\n/**\n * Part of the block state, representing current navigation information\n * (i.e. currently selected section)\n * */\nexport type NavigationState<Href extends `/${string}` = `/${string}`> = {\n readonly href: Href;\n};\n\nexport const DefaultNavigationState: NavigationState = { href: '/' };\n"],"names":[],"mappings":";;MAsCa,sBAAsB,GAAoB,EAAE,IAAI,EAAE,GAAG;;;;"}
1
+ {"version":3,"file":"navigation.cjs","sources":["../src/navigation.ts"],"sourcesContent":["/** Block section visualized as items in left panel block overview */\nexport type BlockSection = BlockSectionLink | BlockSectionDelimiter;\n\n/** Tells the system that specific section from the main UI of this block should\n * be opened */\nexport type BlockSectionLink = {\n /** Potentially there may be multiple section types, i.e. for \"+\" rows and for\n * sections directly opening html from the outputs. */\n readonly type: 'link';\n\n /** Internal block section identifier */\n readonly href: `/${string}`;\n\n /** Link visual appearance */\n readonly appearance?: BlockSectionLinkAppearance;\n\n /** Visible section title, can also be used in the window header. */\n readonly label: string;\n\n /** Optional text shown as a small badge next to the section */\n readonly badge?: string;\n};\n\n/** Different variants for link section appearance */\nexport type BlockSectionLinkAppearance =\n /** Shows a section of type `link` with a `+` icon and a certain specific style */\n 'add-section';\n\n/** Create a horizontal line between sections */\nexport type BlockSectionDelimiter = {\n readonly type: 'delimiter';\n};\n\n/**\n * Part of the block state, representing current navigation information\n * (i.e. currently selected section)\n */\nexport type NavigationState<Href extends `/${string}` = `/${string}`> = {\n readonly href: Href;\n};\n\nexport const DefaultNavigationState: NavigationState = { href: '/' };\n"],"names":[],"mappings":";;MAyCa,sBAAsB,GAAoB,EAAE,IAAI,EAAE,GAAG;;;;"}
@@ -12,6 +12,8 @@ export type BlockSectionLink = {
12
12
  readonly appearance?: BlockSectionLinkAppearance;
13
13
  /** Visible section title, can also be used in the window header. */
14
14
  readonly label: string;
15
+ /** Optional text shown as a small badge next to the section */
16
+ readonly badge?: string;
15
17
  };
16
18
  /** Different variants for link section appearance */
17
19
  export type BlockSectionLinkAppearance =
@@ -24,7 +26,7 @@ export type BlockSectionDelimiter = {
24
26
  /**
25
27
  * Part of the block state, representing current navigation information
26
28
  * (i.e. currently selected section)
27
- * */
29
+ */
28
30
  export type NavigationState<Href extends `/${string}` = `/${string}`> = {
29
31
  readonly href: Href;
30
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;AAEpE;eACe;AACf,MAAM,MAAM,gBAAgB,GAAG;IAC7B;0DACsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;IAE5B,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,0BAA0B,CAAC;IAEjD,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,0BAA0B;AACpC,kFAAkF;AAClF,aAAa,CAAC;AAEhB,gDAAgD;AAChD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC5B,CAAC;AAEF;;;KAGK;AACL,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,IAAI;IACtE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAA+B,CAAC"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;AAEpE;eACe;AACf,MAAM,MAAM,gBAAgB,GAAG;IAC7B;0DACsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;IAE5B,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,0BAA0B,CAAC;IAEjD,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,0BAA0B;AACpC,kFAAkF;AAClF,aAAa,CAAC;AAEhB,gDAAgD;AAChD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,IAAI;IACtE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAA+B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.js","sources":["../src/navigation.ts"],"sourcesContent":["/** Block section visualized as items in left panel block overview */\nexport type BlockSection = BlockSectionLink | BlockSectionDelimiter;\n\n/** Tells the system that specific section from the main UI of this block should\n * be opened */\nexport type BlockSectionLink = {\n /** Potentially there may be multiple section types, i.e. for \"+\" rows and for\n * sections directly opening html from the outputs. */\n readonly type: 'link';\n\n /** Internal block section identifier */\n readonly href: `/${string}`;\n\n /** Link visual appearance */\n readonly appearance?: BlockSectionLinkAppearance;\n\n /** Visible section title, can also be used in the window header. */\n readonly label: string;\n};\n\n/** Different variants for link section appearance */\nexport type BlockSectionLinkAppearance =\n /** Shows a section of type `link` with a `+` icon and a certain specific style */\n 'add-section';\n\n/** Create a horizontal line between sections */\nexport type BlockSectionDelimiter = {\n readonly type: 'delimiter';\n};\n\n/**\n * Part of the block state, representing current navigation information\n * (i.e. currently selected section)\n * */\nexport type NavigationState<Href extends `/${string}` = `/${string}`> = {\n readonly href: Href;\n};\n\nexport const DefaultNavigationState: NavigationState = { href: '/' };\n"],"names":[],"mappings":"MAsCa,sBAAsB,GAAoB,EAAE,IAAI,EAAE,GAAG;;;;"}
1
+ {"version":3,"file":"navigation.js","sources":["../src/navigation.ts"],"sourcesContent":["/** Block section visualized as items in left panel block overview */\nexport type BlockSection = BlockSectionLink | BlockSectionDelimiter;\n\n/** Tells the system that specific section from the main UI of this block should\n * be opened */\nexport type BlockSectionLink = {\n /** Potentially there may be multiple section types, i.e. for \"+\" rows and for\n * sections directly opening html from the outputs. */\n readonly type: 'link';\n\n /** Internal block section identifier */\n readonly href: `/${string}`;\n\n /** Link visual appearance */\n readonly appearance?: BlockSectionLinkAppearance;\n\n /** Visible section title, can also be used in the window header. */\n readonly label: string;\n\n /** Optional text shown as a small badge next to the section */\n readonly badge?: string;\n};\n\n/** Different variants for link section appearance */\nexport type BlockSectionLinkAppearance =\n /** Shows a section of type `link` with a `+` icon and a certain specific style */\n 'add-section';\n\n/** Create a horizontal line between sections */\nexport type BlockSectionDelimiter = {\n readonly type: 'delimiter';\n};\n\n/**\n * Part of the block state, representing current navigation information\n * (i.e. currently selected section)\n */\nexport type NavigationState<Href extends `/${string}` = `/${string}`> = {\n readonly href: Href;\n};\n\nexport const DefaultNavigationState: NavigationState = { href: '/' };\n"],"names":[],"mappings":"MAyCa,sBAAsB,GAAoB,EAAE,IAAI,EAAE,GAAG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-model-common",
3
- "version": "1.21.9",
3
+ "version": "1.22.0",
4
4
  "description": "Platforma SDK Model",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -24,18 +24,19 @@
24
24
  "devDependencies": {
25
25
  "eslint": "^9.25.1",
26
26
  "typescript": "~5.6.3",
27
- "vitest": "^4.0.7",
28
- "@milaboratories/ts-builder": "1.0.5",
29
- "@platforma-sdk/eslint-config": "1.1.0",
30
- "@milaboratories/ts-configs": "1.0.6",
31
- "@milaboratories/build-configs": "1.0.8"
27
+ "vitest": "^4.0.16",
28
+ "@vitest/coverage-istanbul": "^4.0.16",
29
+ "@milaboratories/build-configs": "1.2.1",
30
+ "@milaboratories/ts-configs": "1.2.0",
31
+ "@milaboratories/eslint-config": "1.0.5",
32
+ "@milaboratories/ts-builder": "1.2.1"
32
33
  },
33
34
  "scripts": {
34
35
  "type-check": "ts-builder types --target node",
35
36
  "build": "ts-builder build --target node",
36
37
  "watch": "ts-builder build --target node --watch",
37
38
  "lint": "eslint .",
38
- "test": "vitest run",
39
+ "test": "vitest run --coverage",
39
40
  "do-pack": "rm -f *.tgz && pnpm pack && mv *.tgz package.tgz"
40
41
  }
41
42
  }
@@ -32,7 +32,7 @@ export type BlockConfigV3Generic<
32
32
  * arguments.
33
33
  *
34
34
  * Optional to support earlier SDK version configs.
35
- * */
35
+ */
36
36
  readonly inputsValid: BroadActiveHandleDescriptor;
37
37
 
38
38
  /** Configuration to derive list of section for the left overview panel */
@@ -41,10 +41,16 @@ export type BlockConfigV3Generic<
41
41
  /** Lambda to derive block title */
42
42
  readonly title?: NarrowActiveHandleDescriptor;
43
43
 
44
+ /** Lambda to derive block subtitle, shown below the title */
45
+ readonly subtitle?: NarrowActiveHandleDescriptor;
46
+
47
+ /** Lambda returning array of tags for search functionality */
48
+ readonly tags?: BroadActiveHandleDescriptor;
49
+
44
50
  /**
45
51
  * Lambda returning list of upstream blocks this block enriches with its exports,
46
52
  * influences dependency graph construction
47
- * */
53
+ */
48
54
  readonly enrichmentTargets?: NarrowActiveHandleDescriptor;
49
55
 
50
56
  /** Configuration for the output cells */
@@ -32,6 +32,8 @@ export function extractConfigGeneric(cfg: BlockConfigContainer): BlockConfigGene
32
32
  featureFlags,
33
33
  sections,
34
34
  title,
35
+ subtitle,
36
+ tags,
35
37
  enrichmentTargets,
36
38
  } = cfg.v3;
37
39
  const { code } = cfg;
@@ -45,6 +47,8 @@ export function extractConfigGeneric(cfg: BlockConfigContainer): BlockConfigGene
45
47
  featureFlags,
46
48
  sections,
47
49
  title,
50
+ subtitle,
51
+ tags,
48
52
  code,
49
53
  enrichmentTargets,
50
54
  };
@@ -237,12 +237,12 @@ describe('Linker columns', () => {
237
237
  const linkersMap = LinkerMap.fromColumns([linker1, linker2]);
238
238
 
239
239
  expect(
240
- new Set(linkersMap.getReachableByLinkersAxesFromAxes(group2Normalized).map(a => a.name))
240
+ new Set(linkersMap.getReachableByLinkersAxesFromAxesNormalized(group2Normalized).map(a => a.name))
241
241
  ).toEqual(
242
242
  new Set(([...group1, ...group3]).map(a => a.name))
243
243
  );
244
- expect(linkersMap.getReachableByLinkersAxesFromAxes([axisDn])).toEqual([]);
245
- expect(linkersMap.getReachableByLinkersAxesFromAxes([axisBn])).toEqual([]);
244
+ expect(linkersMap.getReachableByLinkersAxesFromAxesNormalized([axisDn])).toEqual([]);
245
+ expect(linkersMap.getReachableByLinkersAxesFromAxesNormalized([axisBn])).toEqual([]);
246
246
  });
247
247
 
248
248
  test('Order of parents should not matter', () => {
@@ -257,8 +257,8 @@ describe('Linker columns', () => {
257
257
  makeLinkerColumn({ name: 'linker1', from: [axisA, axisB, axisC1], to: [axisD] })
258
258
  ]);
259
259
 
260
- expect(linkerMap.getReachableByLinkersAxesFromAxes([c2])).not.toHaveLength(0);
261
- expect(linkerMap.getReachableByLinkersAxesFromAxes([c1])).not.toHaveLength(0);
260
+ expect(linkerMap.getReachableByLinkersAxesFromAxesNormalized([c2])).not.toHaveLength(0);
261
+ expect(linkerMap.getReachableByLinkersAxesFromAxesNormalized([c1])).not.toHaveLength(0);
262
262
  })
263
263
 
264
264
  test('Non-linkable axes', () => {
@@ -212,12 +212,39 @@ export class LinkerMap implements LinkersData {
212
212
  }
213
213
 
214
214
  /** Get all axes that can be connected to sourceAxes by linkers */
215
- getReachableByLinkersAxesFromAxes(sourceAxes: AxisSpecNormalized[]): AxisSpec[] {
216
- const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
215
+ getReachableByLinkersAxesFromAxesNormalized(
216
+ sourceAxes: AxisSpecNormalized[],
217
+ matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,
218
+ ): AxisSpecNormalized[] {
219
+ let startKeys: CanonicalizedJson<AxisId[]>[] = [];
220
+
221
+ if (matchAxisIdFn) {
222
+ const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) => getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));
223
+ for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {
224
+ const matched = this.keyAxesIds.find(
225
+ (keyIds: AxisId[]) => keyIds.every(
226
+ (linkerKeyAxisId) => sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),
227
+ ),
228
+ );
229
+ if (matched) {
230
+ startKeys.push(canonicalizeJson(matched));
231
+ }
232
+ }
233
+ } else {
234
+ startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);
235
+ }
236
+
217
237
  const availableKeys = this.searchAvailableAxesKeys(startKeys);
218
238
  return this.getAxesListFromKeysList([...availableKeys]);
219
239
  }
220
240
 
241
+ getReachableByLinkersAxesFromAxes(
242
+ sourceAxes: AxisSpec[],
243
+ matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,
244
+ ): AxisSpecNormalized[] {
245
+ return this.getReachableByLinkersAxesFromAxesNormalized(getNormalizedAxesList(sourceAxes), matchAxisIdFn);
246
+ }
247
+
221
248
  static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {
222
249
  return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));
223
250
  }
package/src/navigation.ts CHANGED
@@ -16,6 +16,9 @@ export type BlockSectionLink = {
16
16
 
17
17
  /** Visible section title, can also be used in the window header. */
18
18
  readonly label: string;
19
+
20
+ /** Optional text shown as a small badge next to the section */
21
+ readonly badge?: string;
19
22
  };
20
23
 
21
24
  /** Different variants for link section appearance */
@@ -31,7 +34,7 @@ export type BlockSectionDelimiter = {
31
34
  /**
32
35
  * Part of the block state, representing current navigation information
33
36
  * (i.e. currently selected section)
34
- * */
37
+ */
35
38
  export type NavigationState<Href extends `/${string}` = `/${string}`> = {
36
39
  readonly href: Href;
37
40
  };