@platforma-sdk/model 1.57.0 → 1.58.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.
- package/dist/block_model.cjs +17 -13
- package/dist/block_model.cjs.map +1 -1
- package/dist/block_model.d.ts +4 -4
- package/dist/block_model.d.ts.map +1 -1
- package/dist/block_model.js +17 -13
- package/dist/block_model.js.map +1 -1
- package/dist/block_model_legacy.cjs +1 -0
- package/dist/block_model_legacy.cjs.map +1 -1
- package/dist/block_model_legacy.d.ts.map +1 -1
- package/dist/block_model_legacy.js +1 -0
- package/dist/block_model_legacy.js.map +1 -1
- package/dist/block_storage.cjs +18 -14
- package/dist/block_storage.cjs.map +1 -1
- package/dist/block_storage.d.ts +14 -10
- package/dist/block_storage.d.ts.map +1 -1
- package/dist/block_storage.js +18 -14
- package/dist/block_storage.js.map +1 -1
- package/dist/block_storage_callbacks.cjs +3 -3
- package/dist/block_storage_callbacks.cjs.map +1 -1
- package/dist/block_storage_callbacks.d.ts +4 -3
- package/dist/block_storage_callbacks.d.ts.map +1 -1
- package/dist/block_storage_callbacks.js +3 -3
- package/dist/block_storage_callbacks.js.map +1 -1
- package/dist/components/PFrameForGraphs.cjs +0 -117
- package/dist/components/PFrameForGraphs.cjs.map +1 -1
- package/dist/components/PFrameForGraphs.d.ts +3 -5
- package/dist/components/PFrameForGraphs.d.ts.map +1 -1
- package/dist/components/PFrameForGraphs.js +2 -117
- package/dist/components/PFrameForGraphs.js.map +1 -1
- package/dist/components/PlDataTable/index.d.ts +1 -1
- package/dist/components/PlDataTable/index.d.ts.map +1 -1
- package/dist/components/PlDataTable/table.cjs +16 -1
- package/dist/components/PlDataTable/table.cjs.map +1 -1
- package/dist/components/PlDataTable/table.d.ts.map +1 -1
- package/dist/components/PlDataTable/table.js +16 -2
- package/dist/components/PlDataTable/table.js.map +1 -1
- package/dist/index.cjs +8 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/package.json.cjs +1 -1
- package/dist/package.json.js +1 -1
- package/dist/pframe_utils/axes.cjs +131 -0
- package/dist/pframe_utils/axes.cjs.map +1 -0
- package/dist/pframe_utils/axes.d.ts +15 -0
- package/dist/pframe_utils/axes.d.ts.map +1 -0
- package/dist/pframe_utils/axes.js +128 -0
- package/dist/pframe_utils/axes.js.map +1 -0
- package/dist/pframe_utils/columns.cjs +4 -7
- package/dist/pframe_utils/columns.cjs.map +1 -1
- package/dist/pframe_utils/columns.js +1 -4
- package/dist/pframe_utils/columns.js.map +1 -1
- package/dist/pframe_utils/index.cjs +0 -2
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.js +0 -2
- package/dist/pframe_utils/index.js.map +1 -1
- package/dist/platforma.d.ts +12 -2
- package/dist/platforma.d.ts.map +1 -1
- package/dist/plugin_handle.cjs +29 -0
- package/dist/plugin_handle.cjs.map +1 -0
- package/dist/plugin_handle.d.ts +51 -0
- package/dist/plugin_handle.d.ts.map +1 -0
- package/dist/plugin_handle.js +25 -0
- package/dist/plugin_handle.js.map +1 -0
- package/dist/plugin_model.cjs +27 -27
- package/dist/plugin_model.cjs.map +1 -1
- package/dist/plugin_model.d.ts +41 -33
- package/dist/plugin_model.d.ts.map +1 -1
- package/dist/plugin_model.js +27 -27
- package/dist/plugin_model.js.map +1 -1
- package/dist/render/api.cjs +9 -5
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +11 -5
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +9 -5
- package/dist/render/api.js.map +1 -1
- package/package.json +5 -5
- package/src/block_model.ts +33 -19
- package/src/block_model_legacy.ts +1 -0
- package/src/block_storage.test.ts +3 -2
- package/src/block_storage.ts +30 -22
- package/src/block_storage_callbacks.ts +8 -7
- package/src/components/PFrameForGraphs.ts +4 -167
- package/src/components/PlDataTable/index.ts +6 -1
- package/src/components/PlDataTable/table.ts +3 -4
- package/src/index.ts +2 -1
- package/src/pframe_utils/axes.ts +175 -0
- package/src/pframe_utils/columns.ts +2 -2
- package/src/platforma.ts +17 -2
- package/src/plugin_handle.ts +85 -0
- package/src/plugin_model.ts +118 -56
- package/src/render/api.ts +21 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(\n type: ValueType,\n response: PTableVector,\n absentValue: number | null = null,\n): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i, { absent: absentValue, na: null }) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(\n type: ValueType,\n response: PTableVector,\n absentValue: number | null = null,\n): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i, { absent: absentValue, na: null }) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"names":[],"mappings":";;;;;AA2EA;AACA,MAAM,mBAAmB,GAAG,OAAO;AAEnC;AACA,MAAM,mBAAmB,GAAG,CAAC,CAAoB,EAAE,CAAoB,KACrE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAEzD,SAAS,iBAAiB,CACxB,IAAe,EACf,QAAsB,EACtB,cAA6B,IAAI,EAAA;AAEjC,IAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,OAAO,QAAQ,CAAC,IAAgB;IAClC;IACA,MAAM,GAAG,GAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACrD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAW;IAChF;AACA,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,kBAAkB,CACzB,QAAmB,EACnB,SAAiB,EAAA;IAEjB,OAAO;AACL,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,EAAE,EAAE,QAAQ;AACb,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,QAAQ,EAAE,iBAAiB;YAC3B,SAAS;AACV,SAAA;KACF;AACH;AAEA,SAAS,sBAAsB,CAC7B,QAAkB,EAClB,SAAiB,EAAA;IAEjB,OAAO;AACL,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,EAAE,EAAE;gBACF,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;AACpB,aAAA;AACF,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,QAAQ,EAAE,iBAAiB;YAC3B,SAAS;AACV,SAAA;KACF;AACH;AAEA,SAAS,sBAAsB,CAAC,MAAgB,EAAA;AAC9C,IAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAC9F;AAEA,SAAS,eAAe,GAAA;AACtB,IAAA,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;AACpC,QAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;IACxD;AACA,IAAA,IAAI,OAAO,SAAS,CAAC,YAAY,KAAK,WAAW,EAAE;AACjD,QAAA,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC;IACrF;IACA,OAAO,SAAS,CAAC,YAAY;AAC/B;AAEA;AACO,eAAe,iBAAiB,CACrC,MAAoB,EACpB,EAAa,EAAA;AAEb,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAClE,OAAO,QAAQ,IAAI,IAAI;IACzB;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC;AACrD,QAAA,OAAO,IAAI;IACb;AACF;AAEO,eAAe,mBAAmB,CACvC,MAAoB,EACpB,EAAa,EACb,OAAA,GAA6C,EAAE,EAAA;AAE/C,IAAA,IAAI;QACF,MAAM,QAAQ,GAA2B,MAAM,eAAe,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE;AAC1F,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,MAAM,EAAE,EAAE;AACX,aAAA;YACD,OAAO;AACP,YAAA,OAAO,EAAE,EAAE;AAC4B,SAAA,CAAC;AAE1C,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;AACjE,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;QAEtE,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAA6B,EAAE,IAAI,KAAI;gBAC5D,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAgB,CAAC;AAChD,gBAAA,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;AACnE,gBAAA,OAAO,GAAG;YACZ,CAAC,EAAE,EAAE,CAAC;AACN,YAAA,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;SACrF;IACH;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC;AACjD,QAAA,MAAM,GAAG;IACX;AACF;AAEO,eAAe,qBAAqB,CACzC,MAAoB,EACpB,EAAa,EACb,KAAK,GAAG,mBAAmB,EAC3B,UAA6C,EAAE,EAAA;AAE/C,IAAA,MAAM,OAAO,GAAwB;AACnC,QAAA,QAAQ,EAAE,EAAE;QACZ,OAAO;QACP,KAAK;KACN;AAED,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;AACzE,QAAA,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,KAAK,CAAA,YAAA,EAAe,EAAE,CAAA,OAAA,CAAS,CAAC;QAC5D;QACA,OAAO;AACL,YAAA,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAA0B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1E,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B;IACH;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC;AACzD,QAAA,MAAM,GAAG;IACX;AACF;AAEO,eAAe,mBAAmB,CACvC,MAAoB,EACpB,MAAiC,EAAA;AAEjC,IAAA,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,GAAG,mBAAmB,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,MAAM;AACrF,IAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAE5C,MAAM,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9F,SAAA,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KACf,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE;AAE5E,SAAA,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,SAAS,CAAC,CACxF;AAEH,IAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,QAAA,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxC;AAEA,IAAA,IAAI;QACF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KACpB,eAAe,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE;AACxC,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,KAAK;SACN,CAAC,CACH,CACF;AAED,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAClD,OAAO;AACL,YAAA,MAAM,EAAE,IAAI,CACV,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAA0B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAC3F;YACD,QAAQ;SACT;IACH;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC;QAC5D,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxC;AACF;AAEO,eAAe,oCAAoC,CACxD,MAAoB,EACpB,OAAoB,EAAA;IAEpB,MAAM,MAAM,GAAa,EAAE;AAC3B,IAAA,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC;AAClD,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE;YAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D;IACF;AACA,IAAA,OAAO,MAAM;AACf;AAEO,eAAe,cAAc,CAClC,MAAoB,EACpB,MAA4B,EAAA;AAE5B,IAAA,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAC3F,MAAM;AAER,IAAA,IAAI;AACF,QAAA,MAAM,OAAO,GAAuB;AAClC,YAAA,YAAY,EAAE;AACZ,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,eAAe,EAAE,WAAW;gBAC5B,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,CAC5C,CAAC,GAAG,EAAE,CAAC,KAAI;AACT,oBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI;AACb,oBAAA,OAAO,GAAG;gBACZ,CAAC,EACD,EAA4B,CAC7B;AACF,aAAA;AACD,YAAA,cAAc,EAAE,MAAM,oCAAoC,CAAC,MAAM,EAAE,eAAe,CAAC;YACnF,kBAAkB;SACnB;AAED,QAAA,MAAM,QAAQ,GAAwB,MAAM,eAAe,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;QAC1F,OAAO,QAAQ,CAAC,IAAI;IACtB;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC;AAC1C,QAAA,MAAM,GAAG;IACX;AACF;AAEO,eAAe,4BAA4B,CAChD,MAAoB,EACpB,SAAoC,EAAA;AAEpC,IAAA,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE;AAChD,QAAA,eAAe,EAAE,EAAE;AACnB,QAAA,kBAAkB,EAAE,KAAK;AACzB,QAAA,KAAK,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,KAAA,CAAC;IAEF,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;QACjD,OAAO,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;AACjG,IAAA,CAAC,CAAC;IAEF,OAAO,WAAW,EAAE,QAAQ;AAC9B;AAEA,SAAS,+BAA+B,CAAC,UAAuB,EAAA;IAC9D,MAAM,iBAAiB,GAAG,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,cAAc,CAAC;IAC/E,IAAI,CAAC,iBAAiB,EAAE;AACtB,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,IAAI;QACF,MAAM,cAAc,GAAc,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAyB,CAAC,GAAG,CACzF,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CACjB;AACD,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAC5F,QAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpC;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,iBAAiB,CAAA,CAAE,CAAC;AAC/E,QAAA,OAAO,SAAS;IAClB;AACF;AAEA,eAAe,uBAAuB,CACpC,MAAoB,EACpB,MAOC,EAAA;AAED,IAAA,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,MAAM;IAC3F,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEzD,IAAI,OAAO,GAAsC,EAAE;IAEnD,IAAI,cAAc,EAAE;QAClB,IAAI,WAAW,EAAE;YACf,OAAO,GAAG,CAAC,kBAAkB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAC7D;QACA,IAAI,gBAAgB,EAAE;YACpB,OAAO,GAAG,CAAC,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAChE;AAEA,QAAA,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,mBAAmB,CAC9D,MAAM,EACN,cAAc,EACd,OAAO,CACR;AACD,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC;QACpC,MAAM,MAAM,GAAuC,EAAE;QAErD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5E,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E;AAEA,QAAA,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAChC,QAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE;IAChF;SAAO;AACL,QAAA,MAAM,qBAAqB,GAAG,WAAW,IAAI,gBAAgB;QAC7D,IAAI,qBAAqB,EAAE;YACzB,OAAO,GAAG,CAAC,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QACrE;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE;AACjD,YAAA,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC;YAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC;YAC3B,KAAK;YACL,OAAO;AACR,SAAA,CAAC;QAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;IAChD;AACF;AAEA,eAAe,yBAAyB,CACtC,MAAoB,EACpB,MAKC,EAAA;IAED,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,MAAM;AACjE,IAAA,MAAM,qBAAqB,GAAG,WAAW,IAAI,gBAAgB;IAE7D,MAAM,OAAO,GAAsC;UAC/C,CAAC,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC;UACpD,EAAE;AAEN,IAAA,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;IAC9E,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;AAChD;AAEO,eAAe,+BAA+B,CACnD,MAAoB,EACpB,MAAmC,EAAA;AAEnC,IAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,MAAM;IAE1E,MAAM,kBAAkB,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC;IACpE,IAAI,kBAAkB,IAAI,IAAI,IAAI,kBAAkB,CAAC,IAAI,KAAK,SAAS,EAAE;QACvE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxC;;AAGA,IAAA,MAAM,cAAc,GAAG,+BAA+B,CAAC,kBAAkB,CAAC;AAC1E,IAAA,IAAI,cAAc,IAAI,IAAI,EAAE;AAC1B,QAAA,OAAO,cAAc;IACvB;;AAGA,IAAA,IAAI,OAAO,IAAI,IAAI,EAAE;QACnB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrD,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,MAAM,4BAA4B,CAAC,MAAM,EAAE,SAAS,CAAC;QAE5E,OAAO,uBAAuB,CAAC,MAAM,EAAE;YACrC,QAAQ;YACR,QAAQ;YACR,cAAc;YACd,KAAK;YACL,WAAW;YACX,gBAAgB;AACjB,SAAA,CAAC;IACJ;;IAGA,OAAO,yBAAyB,CAAC,MAAM,EAAE;QACvC,QAAQ;QACR,KAAK;QACL,WAAW;QACX,gBAAgB;AACjB,KAAA,CAAC;AACJ;;;;"}
|
package/dist/platforma.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { BlockOutputsBase, BlockStateV3, DriverKit, OutputWithStatus } from
|
|
|
5
5
|
import type { SdkInfo } from "./version";
|
|
6
6
|
import type { BlockStatePatch } from "./block_state_patch";
|
|
7
7
|
import type { PluginInstance } from "./block_model";
|
|
8
|
+
import type { PluginHandle, PluginFactoryLike } from "./plugin_handle";
|
|
8
9
|
/** Defines all methods to interact with the platform environment from within a block UI. @deprecated */
|
|
9
10
|
export interface PlatformaV1<Args = unknown, Outputs extends Record<string, OutputWithStatus<unknown>> = Record<string, OutputWithStatus<unknown>>, UiState = unknown, Href extends `/${string}` = `/${string}`> extends BlockApiV1<Args, Outputs, UiState, Href>, DriverKit {
|
|
10
11
|
/** Information about SDK version current platforma environment was compiled with. */
|
|
@@ -32,6 +33,7 @@ export type BlockModelInfo = {
|
|
|
32
33
|
outputs: Record<string, {
|
|
33
34
|
withStatus: boolean;
|
|
34
35
|
}>;
|
|
36
|
+
pluginIds: PluginHandle[];
|
|
35
37
|
};
|
|
36
38
|
export type PlatformaApiVersion = Platforma["apiVersion"];
|
|
37
39
|
export type InferArgsType<Pl extends Platforma> = Pl extends Platforma<infer Args> ? Args : never;
|
|
@@ -45,7 +47,15 @@ export type PlatformaFactory = (config: {
|
|
|
45
47
|
export type InferBlockState<Pl extends Platforma> = BlockStateV3<InferDataType<Pl>, InferOutputsType<Pl>, InferHrefType<Pl>>;
|
|
46
48
|
export type InferBlockStatePatch<Pl extends Platforma> = BlockStatePatch<InferArgsType<Pl>, InferOutputsType<Pl>, InferUiState<Pl>, InferHrefType<Pl>>;
|
|
47
49
|
/** Extract plugin IDs as a string literal union from a Platforma type. */
|
|
48
|
-
export type InferPluginNames<Pl> = Pl extends PlatformaV3<
|
|
50
|
+
export type InferPluginNames<Pl> = Pl extends PlatformaV3<unknown, unknown, BlockOutputsBase, `/${string}`, infer P> ? string & keyof P : never;
|
|
49
51
|
/** Extract the Data type for a specific plugin by its ID. */
|
|
50
|
-
export type InferPluginData<Pl, PluginId extends string> = Pl extends PlatformaV3<
|
|
52
|
+
export type InferPluginData<Pl, PluginId extends string> = Pl extends PlatformaV3<unknown, unknown, BlockOutputsBase, `/${string}`, infer P> ? PluginId extends keyof P ? P[PluginId] extends PluginInstance<infer D, any, any> ? D : never : never : never;
|
|
53
|
+
/**
|
|
54
|
+
* Map each plugin instance to a type-safe opaque handle branded with normalized phantom.
|
|
55
|
+
* Uses the same brand structure as InferPluginHandle — only data/params/outputs, no config —
|
|
56
|
+
* because PluginInstance doesn't carry Config (it's lost after factory.create()).
|
|
57
|
+
*/
|
|
58
|
+
export type InferPluginHandles<T extends Record<string, unknown>> = {
|
|
59
|
+
readonly [K in keyof T]: T[K] extends PluginInstance<infer Data, infer Params, infer Outputs> ? PluginHandle<PluginFactoryLike<Data, Params, Outputs>> : never;
|
|
60
|
+
};
|
|
51
61
|
//# sourceMappingURL=platforma.d.ts.map
|
package/dist/platforma.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platforma.d.ts","sourceRoot":"","sources":["../src/platforma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"platforma.d.ts","sourceRoot":"","sources":["../src/platforma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* PluginHandle — Opaque branded handle and output key utilities for plugin instances.
|
|
5
|
+
*
|
|
6
|
+
* Extracted into its own module to break circular dependencies:
|
|
7
|
+
* both block_storage.ts and plugin_model.ts can import from here
|
|
8
|
+
* without depending on each other.
|
|
9
|
+
*
|
|
10
|
+
* @module plugin_handle
|
|
11
|
+
*/
|
|
12
|
+
const PLUGIN_OUTPUT_PREFIX = "plugin-output#";
|
|
13
|
+
/** Construct the output key for a plugin output in the block outputs map. */
|
|
14
|
+
function pluginOutputKey(handle, outputKey) {
|
|
15
|
+
return `${PLUGIN_OUTPUT_PREFIX}${handle}#${outputKey}`;
|
|
16
|
+
}
|
|
17
|
+
/** Check whether an output key belongs to a plugin (vs block-level output). */
|
|
18
|
+
function isPluginOutputKey(key) {
|
|
19
|
+
return key.startsWith(PLUGIN_OUTPUT_PREFIX);
|
|
20
|
+
}
|
|
21
|
+
/** Get the prefix used for all outputs of a specific plugin instance. */
|
|
22
|
+
function pluginOutputPrefix(handle) {
|
|
23
|
+
return pluginOutputKey(handle, "");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
exports.isPluginOutputKey = isPluginOutputKey;
|
|
27
|
+
exports.pluginOutputKey = pluginOutputKey;
|
|
28
|
+
exports.pluginOutputPrefix = pluginOutputPrefix;
|
|
29
|
+
//# sourceMappingURL=plugin_handle.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin_handle.cjs","sources":["../src/plugin_handle.ts"],"sourcesContent":["/**\n * PluginHandle — Opaque branded handle and output key utilities for plugin instances.\n *\n * Extracted into its own module to break circular dependencies:\n * both block_storage.ts and plugin_model.ts can import from here\n * without depending on each other.\n *\n * @module plugin_handle\n */\n\nimport type { Branded } from \"@milaboratories/helpers\";\n\n/**\n * Phantom-only base type for constraining PluginHandle's type parameter.\n *\n * PluginFactory has create() → PluginModel with function properties, making it invariant\n * under strictFunctionTypes. PluginFactoryLike exposes only the covariant `__types` phantom,\n * avoiding the contravariance chain. Handles only need `__types` for type extraction.\n *\n * PluginFactory extends PluginFactoryLike, so every concrete factory satisfies this constraint.\n */\nexport interface PluginFactoryLike<\n Data extends Record<string, unknown> = Record<string, unknown>,\n Params extends undefined | Record<string, unknown> = undefined | Record<string, unknown>,\n Outputs extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly __types?: {\n data: Data;\n params: Params;\n outputs: Outputs;\n };\n}\n\n/** Extract the Data type from a PluginFactoryLike phantom. */\nexport type InferFactoryData<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<infer D, any, any> ? D : Record<string, unknown>\n>;\n\n/** Extract the Params type from a PluginFactoryLike phantom. */\nexport type InferFactoryParams<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<any, infer P, any> ? P : undefined\n>;\n\n/** Extract the Outputs type from a PluginFactoryLike phantom. */\nexport type InferFactoryOutputs<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<any, any, infer O> ? O : Record<string, unknown>\n>;\n\n/**\n * Derive a typed PluginHandle from a PluginFactory type.\n * Normalizes the brand to only data/params/outputs (strips config) so handles\n * from InferPluginHandles match handles from InferPluginHandle.\n */\nexport type InferPluginHandle<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<infer Data, infer Params, infer Outputs>\n ? PluginHandle<PluginFactoryLike<Data, Params, Outputs>>\n : PluginHandle\n>;\n\n/**\n * Opaque handle for a plugin instance. Runtime value is the plugin instance ID string.\n * Branded with factory phantom `F` for type-safe data/outputs extraction.\n * Constrained with PluginFactoryLike (not PluginFactory) to avoid variance issues.\n */\nexport type PluginHandle<F extends PluginFactoryLike = PluginFactoryLike> = Branded<string, F>;\n\nconst PLUGIN_OUTPUT_PREFIX = \"plugin-output#\";\n\n/** Construct the output key for a plugin output in the block outputs map. */\nexport function pluginOutputKey<F extends PluginFactoryLike>(\n handle: PluginHandle<F>,\n outputKey: string,\n): string {\n return `${PLUGIN_OUTPUT_PREFIX}${handle}#${outputKey}`;\n}\n\n/** Check whether an output key belongs to a plugin (vs block-level output). */\nexport function isPluginOutputKey(key: string): boolean {\n return key.startsWith(PLUGIN_OUTPUT_PREFIX);\n}\n\n/** Get the prefix used for all outputs of a specific plugin instance. */\nexport function pluginOutputPrefix<F extends PluginFactoryLike>(handle: PluginHandle<F>): string {\n return pluginOutputKey(handle, \"\");\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;AAQG;AA0DH,MAAM,oBAAoB,GAAG,gBAAgB;AAE7C;AACM,SAAU,eAAe,CAC7B,MAAuB,EACvB,SAAiB,EAAA;AAEjB,IAAA,OAAO,GAAG,oBAAoB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,EAAE;AACxD;AAEA;AACM,SAAU,iBAAiB,CAAC,GAAW,EAAA;AAC3C,IAAA,OAAO,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC;AAC7C;AAEA;AACM,SAAU,kBAAkB,CAA8B,MAAuB,EAAA;AACrF,IAAA,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;AACpC;;;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluginHandle — Opaque branded handle and output key utilities for plugin instances.
|
|
3
|
+
*
|
|
4
|
+
* Extracted into its own module to break circular dependencies:
|
|
5
|
+
* both block_storage.ts and plugin_model.ts can import from here
|
|
6
|
+
* without depending on each other.
|
|
7
|
+
*
|
|
8
|
+
* @module plugin_handle
|
|
9
|
+
*/
|
|
10
|
+
import type { Branded } from "@milaboratories/helpers";
|
|
11
|
+
/**
|
|
12
|
+
* Phantom-only base type for constraining PluginHandle's type parameter.
|
|
13
|
+
*
|
|
14
|
+
* PluginFactory has create() → PluginModel with function properties, making it invariant
|
|
15
|
+
* under strictFunctionTypes. PluginFactoryLike exposes only the covariant `__types` phantom,
|
|
16
|
+
* avoiding the contravariance chain. Handles only need `__types` for type extraction.
|
|
17
|
+
*
|
|
18
|
+
* PluginFactory extends PluginFactoryLike, so every concrete factory satisfies this constraint.
|
|
19
|
+
*/
|
|
20
|
+
export interface PluginFactoryLike<Data extends Record<string, unknown> = Record<string, unknown>, Params extends undefined | Record<string, unknown> = undefined | Record<string, unknown>, Outputs extends Record<string, unknown> = Record<string, unknown>> {
|
|
21
|
+
readonly __types?: {
|
|
22
|
+
data: Data;
|
|
23
|
+
params: Params;
|
|
24
|
+
outputs: Outputs;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Extract the Data type from a PluginFactoryLike phantom. */
|
|
28
|
+
export type InferFactoryData<F extends PluginFactoryLike> = NonNullable<F extends PluginFactoryLike<infer D, any, any> ? D : Record<string, unknown>>;
|
|
29
|
+
/** Extract the Params type from a PluginFactoryLike phantom. */
|
|
30
|
+
export type InferFactoryParams<F extends PluginFactoryLike> = NonNullable<F extends PluginFactoryLike<any, infer P, any> ? P : undefined>;
|
|
31
|
+
/** Extract the Outputs type from a PluginFactoryLike phantom. */
|
|
32
|
+
export type InferFactoryOutputs<F extends PluginFactoryLike> = NonNullable<F extends PluginFactoryLike<any, any, infer O> ? O : Record<string, unknown>>;
|
|
33
|
+
/**
|
|
34
|
+
* Derive a typed PluginHandle from a PluginFactory type.
|
|
35
|
+
* Normalizes the brand to only data/params/outputs (strips config) so handles
|
|
36
|
+
* from InferPluginHandles match handles from InferPluginHandle.
|
|
37
|
+
*/
|
|
38
|
+
export type InferPluginHandle<F extends PluginFactoryLike> = NonNullable<F extends PluginFactoryLike<infer Data, infer Params, infer Outputs> ? PluginHandle<PluginFactoryLike<Data, Params, Outputs>> : PluginHandle>;
|
|
39
|
+
/**
|
|
40
|
+
* Opaque handle for a plugin instance. Runtime value is the plugin instance ID string.
|
|
41
|
+
* Branded with factory phantom `F` for type-safe data/outputs extraction.
|
|
42
|
+
* Constrained with PluginFactoryLike (not PluginFactory) to avoid variance issues.
|
|
43
|
+
*/
|
|
44
|
+
export type PluginHandle<F extends PluginFactoryLike = PluginFactoryLike> = Branded<string, F>;
|
|
45
|
+
/** Construct the output key for a plugin output in the block outputs map. */
|
|
46
|
+
export declare function pluginOutputKey<F extends PluginFactoryLike>(handle: PluginHandle<F>, outputKey: string): string;
|
|
47
|
+
/** Check whether an output key belongs to a plugin (vs block-level output). */
|
|
48
|
+
export declare function isPluginOutputKey(key: string): boolean;
|
|
49
|
+
/** Get the prefix used for all outputs of a specific plugin instance. */
|
|
50
|
+
export declare function pluginOutputPrefix<F extends PluginFactoryLike>(handle: PluginHandle<F>): string;
|
|
51
|
+
//# sourceMappingURL=plugin_handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin_handle.d.ts","sourceRoot":"","sources":["../src/plugin_handle.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB,CAChC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,MAAM,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxF,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjE,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,IAAI,WAAW,CACrE,CAAC,SAAS,iBAAiB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7E,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,iBAAiB,IAAI,WAAW,CACvE,CAAC,SAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAC/D,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,iBAAiB,IAAI,WAAW,CACxE,CAAC,SAAS,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7E,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,IAAI,WAAW,CACtE,CAAC,SAAS,iBAAiB,CAAC,MAAM,IAAI,EAAE,MAAM,MAAM,EAAE,MAAM,OAAO,CAAC,GAChE,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,GACtD,YAAY,CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAI/F,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,CAAC,SAAS,iBAAiB,EACzD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,iBAAiB,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,CAE/F"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluginHandle — Opaque branded handle and output key utilities for plugin instances.
|
|
3
|
+
*
|
|
4
|
+
* Extracted into its own module to break circular dependencies:
|
|
5
|
+
* both block_storage.ts and plugin_model.ts can import from here
|
|
6
|
+
* without depending on each other.
|
|
7
|
+
*
|
|
8
|
+
* @module plugin_handle
|
|
9
|
+
*/
|
|
10
|
+
const PLUGIN_OUTPUT_PREFIX = "plugin-output#";
|
|
11
|
+
/** Construct the output key for a plugin output in the block outputs map. */
|
|
12
|
+
function pluginOutputKey(handle, outputKey) {
|
|
13
|
+
return `${PLUGIN_OUTPUT_PREFIX}${handle}#${outputKey}`;
|
|
14
|
+
}
|
|
15
|
+
/** Check whether an output key belongs to a plugin (vs block-level output). */
|
|
16
|
+
function isPluginOutputKey(key) {
|
|
17
|
+
return key.startsWith(PLUGIN_OUTPUT_PREFIX);
|
|
18
|
+
}
|
|
19
|
+
/** Get the prefix used for all outputs of a specific plugin instance. */
|
|
20
|
+
function pluginOutputPrefix(handle) {
|
|
21
|
+
return pluginOutputKey(handle, "");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { isPluginOutputKey, pluginOutputKey, pluginOutputPrefix };
|
|
25
|
+
//# sourceMappingURL=plugin_handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin_handle.js","sources":["../src/plugin_handle.ts"],"sourcesContent":["/**\n * PluginHandle — Opaque branded handle and output key utilities for plugin instances.\n *\n * Extracted into its own module to break circular dependencies:\n * both block_storage.ts and plugin_model.ts can import from here\n * without depending on each other.\n *\n * @module plugin_handle\n */\n\nimport type { Branded } from \"@milaboratories/helpers\";\n\n/**\n * Phantom-only base type for constraining PluginHandle's type parameter.\n *\n * PluginFactory has create() → PluginModel with function properties, making it invariant\n * under strictFunctionTypes. PluginFactoryLike exposes only the covariant `__types` phantom,\n * avoiding the contravariance chain. Handles only need `__types` for type extraction.\n *\n * PluginFactory extends PluginFactoryLike, so every concrete factory satisfies this constraint.\n */\nexport interface PluginFactoryLike<\n Data extends Record<string, unknown> = Record<string, unknown>,\n Params extends undefined | Record<string, unknown> = undefined | Record<string, unknown>,\n Outputs extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly __types?: {\n data: Data;\n params: Params;\n outputs: Outputs;\n };\n}\n\n/** Extract the Data type from a PluginFactoryLike phantom. */\nexport type InferFactoryData<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<infer D, any, any> ? D : Record<string, unknown>\n>;\n\n/** Extract the Params type from a PluginFactoryLike phantom. */\nexport type InferFactoryParams<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<any, infer P, any> ? P : undefined\n>;\n\n/** Extract the Outputs type from a PluginFactoryLike phantom. */\nexport type InferFactoryOutputs<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<any, any, infer O> ? O : Record<string, unknown>\n>;\n\n/**\n * Derive a typed PluginHandle from a PluginFactory type.\n * Normalizes the brand to only data/params/outputs (strips config) so handles\n * from InferPluginHandles match handles from InferPluginHandle.\n */\nexport type InferPluginHandle<F extends PluginFactoryLike> = NonNullable<\n F extends PluginFactoryLike<infer Data, infer Params, infer Outputs>\n ? PluginHandle<PluginFactoryLike<Data, Params, Outputs>>\n : PluginHandle\n>;\n\n/**\n * Opaque handle for a plugin instance. Runtime value is the plugin instance ID string.\n * Branded with factory phantom `F` for type-safe data/outputs extraction.\n * Constrained with PluginFactoryLike (not PluginFactory) to avoid variance issues.\n */\nexport type PluginHandle<F extends PluginFactoryLike = PluginFactoryLike> = Branded<string, F>;\n\nconst PLUGIN_OUTPUT_PREFIX = \"plugin-output#\";\n\n/** Construct the output key for a plugin output in the block outputs map. */\nexport function pluginOutputKey<F extends PluginFactoryLike>(\n handle: PluginHandle<F>,\n outputKey: string,\n): string {\n return `${PLUGIN_OUTPUT_PREFIX}${handle}#${outputKey}`;\n}\n\n/** Check whether an output key belongs to a plugin (vs block-level output). */\nexport function isPluginOutputKey(key: string): boolean {\n return key.startsWith(PLUGIN_OUTPUT_PREFIX);\n}\n\n/** Get the prefix used for all outputs of a specific plugin instance. */\nexport function pluginOutputPrefix<F extends PluginFactoryLike>(handle: PluginHandle<F>): string {\n return pluginOutputKey(handle, \"\");\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;AAQG;AA0DH,MAAM,oBAAoB,GAAG,gBAAgB;AAE7C;AACM,SAAU,eAAe,CAC7B,MAAuB,EACvB,SAAiB,EAAA;AAEjB,IAAA,OAAO,GAAG,oBAAoB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,EAAE;AACxD;AAEA;AACM,SAAU,iBAAiB,CAAC,GAAW,EAAA;AAC3C,IAAA,OAAO,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC;AAC7C;AAEA;AACM,SAAU,kBAAkB,CAA8B,MAAuB,EAAA;AACrF,IAAA,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;AACpC;;;;"}
|
package/dist/plugin_model.cjs
CHANGED
|
@@ -10,9 +10,6 @@
|
|
|
10
10
|
*/
|
|
11
11
|
/** Symbol for internal builder creation method */
|
|
12
12
|
const FROM_BUILDER = Symbol("fromBuilder");
|
|
13
|
-
// =============================================================================
|
|
14
|
-
// Plugin Type
|
|
15
|
-
// =============================================================================
|
|
16
13
|
/**
|
|
17
14
|
* Configured plugin instance returned by PluginModelFactory.create().
|
|
18
15
|
* Contains the plugin's name, data model, and output definitions.
|
|
@@ -24,18 +21,21 @@ class PluginModel {
|
|
|
24
21
|
dataModel;
|
|
25
22
|
/** Output definitions - functions that compute outputs from plugin context */
|
|
26
23
|
outputs;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
this.
|
|
24
|
+
/** Feature flags declared by this plugin */
|
|
25
|
+
featureFlags;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.name = options.name;
|
|
28
|
+
this.dataModel = options.dataModel;
|
|
29
|
+
this.outputs = options.outputs;
|
|
30
|
+
this.featureFlags = options.featureFlags;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Internal method for creating PluginModel from factory.
|
|
34
34
|
* Uses Symbol key to prevent external access.
|
|
35
35
|
* @internal
|
|
36
36
|
*/
|
|
37
|
-
static [FROM_BUILDER](
|
|
38
|
-
return new
|
|
37
|
+
static [FROM_BUILDER](options) {
|
|
38
|
+
return new PluginModel(options);
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
41
|
* Creates a new PluginModelBuilder for building plugin definitions.
|
|
@@ -47,7 +47,7 @@ class PluginModel {
|
|
|
47
47
|
* @example
|
|
48
48
|
* const dataModelChain = new DataModelBuilder().from<MyData>(DATA_MODEL_DEFAULT_VERSION);
|
|
49
49
|
*
|
|
50
|
-
* const myPlugin = PluginModel.define
|
|
50
|
+
* const myPlugin = PluginModel.define({
|
|
51
51
|
* name: 'myPlugin' as PluginName,
|
|
52
52
|
* data: (cfg) => dataModelChain.init(() => ({ value: cfg.defaultValue })),
|
|
53
53
|
* })
|
|
@@ -58,18 +58,16 @@ class PluginModel {
|
|
|
58
58
|
return PluginModelBuilder[FROM_BUILDER](options);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
/**
|
|
62
|
-
* Plugin factory returned by PluginModelBuilder.build().
|
|
63
|
-
* Call create() with config to get a configured PluginModel instance.
|
|
64
|
-
*/
|
|
65
61
|
class PluginModelFactory {
|
|
66
62
|
name;
|
|
67
63
|
data;
|
|
68
64
|
outputs;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
this.
|
|
72
|
-
this.
|
|
65
|
+
featureFlags;
|
|
66
|
+
constructor(options) {
|
|
67
|
+
this.name = options.name;
|
|
68
|
+
this.data = options.data;
|
|
69
|
+
this.outputs = options.outputs;
|
|
70
|
+
this.featureFlags = options.featureFlags;
|
|
73
71
|
}
|
|
74
72
|
/** Create a configured PluginModel instance */
|
|
75
73
|
create(config) {
|
|
@@ -77,12 +75,10 @@ class PluginModelFactory {
|
|
|
77
75
|
name: this.name,
|
|
78
76
|
dataModel: this.data(config),
|
|
79
77
|
outputs: this.outputs,
|
|
78
|
+
featureFlags: this.featureFlags,
|
|
80
79
|
});
|
|
81
80
|
}
|
|
82
81
|
}
|
|
83
|
-
// =============================================================================
|
|
84
|
-
// Plugin Model Builder
|
|
85
|
-
// =============================================================================
|
|
86
82
|
/**
|
|
87
83
|
* Builder for creating PluginType with type-safe output definitions.
|
|
88
84
|
*
|
|
@@ -109,20 +105,22 @@ class PluginModelBuilder {
|
|
|
109
105
|
name;
|
|
110
106
|
data;
|
|
111
107
|
outputs;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
this.
|
|
108
|
+
featureFlags;
|
|
109
|
+
constructor(options) {
|
|
110
|
+
this.name = options.name;
|
|
111
|
+
this.data = options.data;
|
|
115
112
|
this.outputs =
|
|
116
|
-
|
|
113
|
+
options.outputs ??
|
|
117
114
|
{};
|
|
115
|
+
this.featureFlags = options.featureFlags;
|
|
118
116
|
}
|
|
119
117
|
/**
|
|
120
118
|
* Internal method for creating PluginModelBuilder.
|
|
121
119
|
* Uses Symbol key to prevent external access.
|
|
122
120
|
* @internal
|
|
123
121
|
*/
|
|
124
|
-
static [FROM_BUILDER](
|
|
125
|
-
return new
|
|
122
|
+
static [FROM_BUILDER](options) {
|
|
123
|
+
return new PluginModelBuilder(options);
|
|
126
124
|
}
|
|
127
125
|
/**
|
|
128
126
|
* Adds an output to the plugin.
|
|
@@ -139,6 +137,7 @@ class PluginModelBuilder {
|
|
|
139
137
|
return new PluginModelBuilder({
|
|
140
138
|
name: this.name,
|
|
141
139
|
data: this.data,
|
|
140
|
+
featureFlags: this.featureFlags,
|
|
142
141
|
outputs: {
|
|
143
142
|
...this.outputs,
|
|
144
143
|
[key]: fn,
|
|
@@ -163,6 +162,7 @@ class PluginModelBuilder {
|
|
|
163
162
|
name: this.name,
|
|
164
163
|
data: this.data,
|
|
165
164
|
outputs: this.outputs,
|
|
165
|
+
featureFlags: this.featureFlags,
|
|
166
166
|
});
|
|
167
167
|
}
|
|
168
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin_model.cjs","sources":["../src/plugin_model.ts"],"sourcesContent":["/**\n * PluginModel - Builder for creating plugin types with data model and outputs.\n *\n * Plugins are UI components with their own model logic and persistent state.\n * Block developers register plugin instances via BlockModelV3.plugin() method.\n *\n * @module plugin_model\n */\n\nimport type { DataModel } from \"./block_migrations\";\nimport type { PluginName } from \"./block_storage\";\nimport type { PluginRenderCtx } from \"./render\";\n\n/** Symbol for internal builder creation method */\nconst FROM_BUILDER = Symbol(\"fromBuilder\");\n\n// =============================================================================\n// Plugin Type\n// =============================================================================\n\n/**\n * Configured plugin instance returned by PluginModelFactory.create().\n * Contains the plugin's name, data model, and output definitions.\n */\nexport class PluginModel<Data = unknown, Params = undefined, Outputs = {}> {\n /** Globally unique plugin name */\n readonly name: PluginName;\n /** Data model instance for this plugin */\n readonly dataModel: DataModel<Data>;\n /** Output definitions - functions that compute outputs from plugin context */\n readonly outputs: { [K in keyof Outputs]: (ctx: PluginRenderCtx<Data, Params>) => Outputs[K] };\n\n private constructor(input: {\n name: PluginName;\n dataModel: DataModel<Data>;\n outputs: { [K in keyof Outputs]: (ctx: PluginRenderCtx<Data, Params>) => Outputs[K] };\n }) {\n this.name = input.name;\n this.dataModel = input.dataModel;\n this.outputs = input.outputs;\n }\n\n /**\n * Internal method for creating PluginModel from factory.\n * Uses Symbol key to prevent external access.\n * @internal\n */\n static [FROM_BUILDER]<D, P, O>(input: {\n name: PluginName;\n dataModel: DataModel<D>;\n outputs: { [K in keyof O]: (ctx: PluginRenderCtx<D, P>) => O[K] };\n }): PluginModel<D, P, O> {\n return new this<D, P, O>(input);\n }\n\n /**\n * Creates a new PluginModelBuilder for building plugin definitions.\n *\n * @param options.name - Globally unique plugin name\n * @param options.data - Factory function that creates the data model from config\n * @returns PluginModelBuilder for chaining output definitions\n *\n * @example\n * const dataModelChain = new DataModelBuilder().from<MyData>(DATA_MODEL_DEFAULT_VERSION);\n *\n * const myPlugin = PluginModel.define<MyData, MyParams, MyConfig>({\n * name: 'myPlugin' as PluginName,\n * data: (cfg) => dataModelChain.init(() => ({ value: cfg.defaultValue })),\n * })\n * .output('computed', (ctx) => ctx.data.value * ctx.params.multiplier)\n * .build();\n */\n static define<Data, Params = undefined, Config = undefined>(options: {\n name: PluginName;\n data: (config?: Config) => DataModel<Data>;\n }): PluginModelBuilder<Data, Params, Config> {\n return PluginModelBuilder[FROM_BUILDER]<Data, Params, Config>(options);\n }\n}\n\n/**\n * Plugin factory returned by PluginModelBuilder.build().\n * Call create() with config to get a configured PluginModel instance.\n */\nclass PluginModelFactory<Data, Params, Config, Outputs> {\n private readonly name: PluginName;\n private readonly data: (config?: Config) => DataModel<Data>;\n private readonly outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<Data, Params>) => Outputs[K];\n };\n\n constructor(input: {\n name: PluginName;\n data: (config?: Config) => DataModel<Data>;\n outputs: { [K in keyof Outputs]: (ctx: PluginRenderCtx<Data, Params>) => Outputs[K] };\n }) {\n this.name = input.name;\n this.data = input.data;\n this.outputs = input.outputs;\n }\n\n /** Create a configured PluginModel instance */\n create(config?: Config): PluginModel<Data, Params, Outputs> {\n return PluginModel[FROM_BUILDER]<Data, Params, Outputs>({\n name: this.name,\n dataModel: this.data(config),\n outputs: this.outputs,\n });\n }\n}\n\n// =============================================================================\n// Plugin Model Builder\n// =============================================================================\n\n/**\n * Builder for creating PluginType with type-safe output definitions.\n *\n * Use `PluginModel.define()` to create a builder instance.\n *\n * @typeParam Data - Plugin's persistent data type\n * @typeParam Params - Params derived from block's RenderCtx (optional)\n * @typeParam Config - Static configuration passed to plugin factory (optional)\n * @typeParam Outputs - Accumulated output types\n *\n * @example\n * const dataModelChain = new DataModelBuilder().from<TableData>(DATA_MODEL_DEFAULT_VERSION);\n *\n * const dataTable = PluginModel.define<TableData, TableParams, TableConfig>({\n * name: 'dataTable' as PluginName,\n * data: (cfg) => {\n * return dataModelChain.init(() => ({ state: createInitialState(cfg.ops) }));\n * },\n * })\n * .output('model', (ctx) => createTableModel(ctx))\n * .build();\n */\nclass PluginModelBuilder<\n Data,\n Params = undefined,\n Config = undefined,\n Outputs extends Record<string, unknown> = {},\n> {\n private readonly name: PluginName;\n private readonly data: (config?: Config) => DataModel<Data>;\n private readonly outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<Data, Params>) => Outputs[K];\n };\n\n private constructor(input: {\n name: PluginName;\n data: (config?: Config) => DataModel<Data>;\n outputs?: { [K in keyof Outputs]: (ctx: PluginRenderCtx<Data, Params>) => Outputs[K] };\n }) {\n this.name = input.name;\n this.data = input.data;\n this.outputs =\n input.outputs ??\n ({} as { [K in keyof Outputs]: (ctx: PluginRenderCtx<Data, Params>) => Outputs[K] });\n }\n\n /**\n * Internal method for creating PluginModelBuilder.\n * Uses Symbol key to prevent external access.\n * @internal\n */\n static [FROM_BUILDER]<D, P, C, O extends Record<string, unknown> = {}>(input: {\n name: PluginName;\n data: (config?: C) => DataModel<D>;\n outputs?: { [K in keyof O]: (ctx: PluginRenderCtx<D, P>) => O[K] };\n }): PluginModelBuilder<D, P, C, O> {\n return new this<D, P, C, O>(input);\n }\n\n /**\n * Adds an output to the plugin.\n *\n * @param key - Output name\n * @param fn - Function that computes the output value from plugin context\n * @returns PluginModel with the new output added\n *\n * @example\n * .output('model', (ctx) => createModel(ctx.params.columns, ctx.data.state))\n * .output('isReady', (ctx) => ctx.params.columns !== undefined)\n */\n output<const Key extends string, T>(\n key: Key,\n fn: (ctx: PluginRenderCtx<Data, Params>) => T,\n ): PluginModelBuilder<Data, Params, Config, Outputs & { [K in Key]: T }> {\n return new PluginModelBuilder<Data, Params, Config, Outputs & { [K in Key]: T }>({\n name: this.name,\n data: this.data,\n outputs: {\n ...this.outputs,\n [key]: fn,\n } as {\n [K in keyof (Outputs & { [P in Key]: T })]: (\n ctx: PluginRenderCtx<Data, Params>,\n ) => (Outputs & { [P in Key]: T })[K];\n },\n });\n }\n\n /**\n * Finalizes the plugin definition and returns a ConfigurablePluginModel.\n *\n * @returns Callable plugin factory that accepts config and returns PluginModel\n *\n * @example\n * const myPlugin = new PluginModelBuilder('myPlugin', () => dataModel)\n * .output('value', (ctx) => ctx.data.value)\n * .build();\n *\n * // Later, call create() with config to get a configured instance:\n * const configured = myPlugin.create({ defaultValue: 'test' });\n */\n build(): PluginModelFactory<Data, Params, Config, Outputs> {\n return new PluginModelFactory<Data, Params, Config, Outputs>({\n name: this.name,\n data: this.data,\n outputs: this.outputs,\n });\n }\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;AAOG;AAMH;AACA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AAE1C;AACA;AACA;AAEA;;;AAGG;MACU,WAAW,CAAA;;AAEb,IAAA,IAAI;;AAEJ,IAAA,SAAS;;AAET,IAAA,OAAO;AAEhB,IAAA,WAAA,CAAoB,KAInB,EAAA;AACC,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;IAC9B;AAEA;;;;AAIG;AACH,IAAA,QAAQ,YAAY,CAAC,CAAU,KAI9B,EAAA;AACC,QAAA,OAAO,IAAI,IAAI,CAAU,KAAK,CAAC;IACjC;AAEA;;;;;;;;;;;;;;;;AAgBG;IACH,OAAO,MAAM,CAA+C,OAG3D,EAAA;AACC,QAAA,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAuB,OAAO,CAAC;IACxE;AACD;AAED;;;AAGG;AACH,MAAM,kBAAkB,CAAA;AACL,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,OAAO;AAIxB,IAAA,WAAA,CAAY,KAIX,EAAA;AACC,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AACtB,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;IAC9B;;AAGA,IAAA,MAAM,CAAC,MAAe,EAAA;AACpB,QAAA,OAAO,WAAW,CAAC,YAAY,CAAC,CAAwB;YACtD,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,SAAA,CAAC;IACJ;AACD;AAED;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACH,MAAM,kBAAkB,CAAA;AAML,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,OAAO;AAIxB,IAAA,WAAA,CAAoB,KAInB,EAAA;AACC,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AACtB,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AACtB,QAAA,IAAI,CAAC,OAAO;AACV,YAAA,KAAK,CAAC,OAAO;AACZ,gBAAA,EAAmF;IACxF;AAEA;;;;AAIG;AACH,IAAA,QAAQ,YAAY,CAAC,CAAkD,KAItE,EAAA;AACC,QAAA,OAAO,IAAI,IAAI,CAAa,KAAK,CAAC;IACpC;AAEA;;;;;;;;;;AAUG;IACH,MAAM,CACJ,GAAQ,EACR,EAA6C,EAAA;QAE7C,OAAO,IAAI,kBAAkB,CAAoD;YAC/E,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,OAAO,EAAE;gBACP,GAAG,IAAI,CAAC,OAAO;gBACf,CAAC,GAAG,GAAG,EAAE;AAKV,aAAA;AACF,SAAA,CAAC;IACJ;AAEA;;;;;;;;;;;;AAYG;IACH,KAAK,GAAA;QACH,OAAO,IAAI,kBAAkB,CAAgC;YAC3D,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,SAAA,CAAC;IACJ;AACD;;;;"}
|
|
1
|
+
{"version":3,"file":"plugin_model.cjs","sources":["../src/plugin_model.ts"],"sourcesContent":["/**\n * PluginModel - Builder for creating plugin types with data model and outputs.\n *\n * Plugins are UI components with their own model logic and persistent state.\n * Block developers register plugin instances via BlockModelV3.plugin() method.\n *\n * @module plugin_model\n */\n\nimport type { BlockCodeKnownFeatureFlags } from \"@milaboratories/pl-model-common\";\nimport type { DataModel } from \"./block_migrations\";\nimport type { PluginName } from \"./block_storage\";\nimport type { PluginFactoryLike } from \"./plugin_handle\";\nimport type { PluginRenderCtx } from \"./render\";\n\n/** Symbol for internal builder creation method */\nconst FROM_BUILDER = Symbol(\"fromBuilder\");\n\nexport type PluginData = Record<string, unknown>;\nexport type PluginParams = undefined | Record<string, unknown>;\nexport type PluginOutputs = Record<string, unknown>;\nexport type PluginConfig = undefined | Record<string, unknown>;\n\n/**\n * Configured plugin instance returned by PluginModelFactory.create().\n * Contains the plugin's name, data model, and output definitions.\n */\nexport class PluginModel<\n Data extends PluginData = PluginData,\n Params extends PluginParams = undefined,\n Outputs extends PluginOutputs = PluginOutputs,\n> {\n /** Globally unique plugin name */\n readonly name: PluginName;\n /** Data model instance for this plugin */\n readonly dataModel: DataModel<Data>;\n /** Output definitions - functions that compute outputs from plugin context */\n readonly outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n /** Feature flags declared by this plugin */\n readonly featureFlags?: BlockCodeKnownFeatureFlags;\n\n private constructor(options: {\n name: PluginName;\n dataModel: DataModel<Data>;\n outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n featureFlags?: BlockCodeKnownFeatureFlags;\n }) {\n this.name = options.name;\n this.dataModel = options.dataModel;\n this.outputs = options.outputs;\n this.featureFlags = options.featureFlags;\n }\n\n /**\n * Internal method for creating PluginModel from factory.\n * Uses Symbol key to prevent external access.\n * @internal\n */\n static [FROM_BUILDER]<\n Data extends PluginData,\n Params extends PluginParams,\n Outputs extends PluginOutputs,\n >(options: {\n name: PluginName;\n dataModel: DataModel<Data>;\n outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n featureFlags?: BlockCodeKnownFeatureFlags;\n }): PluginModel<Data, Params, Outputs> {\n return new PluginModel<Data, Params, Outputs>(options);\n }\n\n /**\n * Creates a new PluginModelBuilder for building plugin definitions.\n *\n * @param options.name - Globally unique plugin name\n * @param options.data - Factory function that creates the data model from config\n * @returns PluginModelBuilder for chaining output definitions\n *\n * @example\n * const dataModelChain = new DataModelBuilder().from<MyData>(DATA_MODEL_DEFAULT_VERSION);\n *\n * const myPlugin = PluginModel.define({\n * name: 'myPlugin' as PluginName,\n * data: (cfg) => dataModelChain.init(() => ({ value: cfg.defaultValue })),\n * })\n * .output('computed', (ctx) => ctx.data.value * ctx.params.multiplier)\n * .build();\n */\n static define<\n Data extends PluginData,\n Params extends PluginParams,\n Config extends PluginConfig,\n >(options: {\n name: PluginName;\n data: (config?: Config) => DataModel<Data>;\n featureFlags?: BlockCodeKnownFeatureFlags;\n }): PluginModelBuilder<Data, Params, {}, Config> {\n return PluginModelBuilder[FROM_BUILDER](options);\n }\n}\n\n/** Plugin factory returned by PluginModelBuilder.build(). */\nexport interface PluginFactory<\n Data extends PluginData = PluginData,\n Params extends PluginParams = undefined,\n Outputs extends PluginOutputs = PluginOutputs,\n Config extends PluginConfig = undefined,\n> extends PluginFactoryLike {\n create(config?: Config): PluginModel<Data, Params, Outputs>;\n /**\n * @internal Phantom field for structural type extraction.\n * Enables InferFactoryData/InferFactoryOutputs to work via PluginFactoryLike.\n */\n readonly __types?: { data: Data; params: Params; outputs: Outputs; config: Config };\n}\n\nclass PluginModelFactory<\n Data extends PluginData = PluginData,\n Params extends PluginParams = undefined,\n Outputs extends PluginOutputs = PluginOutputs,\n Config extends PluginConfig = undefined,\n> implements PluginFactory<Data, Params, Outputs, Config> {\n private readonly name: PluginName;\n private readonly data: (config?: Config) => DataModel<Data>;\n private readonly outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n private readonly featureFlags?: BlockCodeKnownFeatureFlags;\n\n constructor(options: {\n name: PluginName;\n data: (config?: Config) => DataModel<Data>;\n outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n featureFlags?: BlockCodeKnownFeatureFlags;\n }) {\n this.name = options.name;\n this.data = options.data;\n this.outputs = options.outputs;\n this.featureFlags = options.featureFlags;\n }\n\n /** Create a configured PluginModel instance */\n create(config?: Config): PluginModel<Data, Params, Outputs> {\n return PluginModel[FROM_BUILDER]<Data, Params, Outputs>({\n name: this.name,\n dataModel: this.data(config),\n outputs: this.outputs,\n featureFlags: this.featureFlags,\n });\n }\n}\n\n/**\n * Builder for creating PluginType with type-safe output definitions.\n *\n * Use `PluginModel.define()` to create a builder instance.\n *\n * @typeParam Data - Plugin's persistent data type\n * @typeParam Params - Params derived from block's RenderCtx (optional)\n * @typeParam Config - Static configuration passed to plugin factory (optional)\n * @typeParam Outputs - Accumulated output types\n *\n * @example\n * const dataModelChain = new DataModelBuilder().from<TableData>(DATA_MODEL_DEFAULT_VERSION);\n *\n * const dataTable = PluginModel.define<TableData, TableParams, TableConfig>({\n * name: 'dataTable' as PluginName,\n * data: (cfg) => {\n * return dataModelChain.init(() => ({ state: createInitialState(cfg.ops) }));\n * },\n * })\n * .output('model', (ctx) => createTableModel(ctx))\n * .build();\n */\nclass PluginModelBuilder<\n Data extends PluginData = PluginData,\n Params extends PluginParams = undefined,\n Outputs extends PluginOutputs = PluginOutputs,\n Config extends PluginConfig = undefined,\n> {\n private readonly name: PluginName;\n private readonly data: (config?: Config) => DataModel<Data>;\n private readonly outputs: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n private readonly featureFlags?: BlockCodeKnownFeatureFlags;\n\n private constructor(options: {\n name: PluginName;\n data: (config?: Config) => DataModel<Data>;\n outputs?: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n featureFlags?: BlockCodeKnownFeatureFlags;\n }) {\n this.name = options.name;\n this.data = options.data;\n this.outputs =\n options.outputs ??\n ({} as {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n });\n this.featureFlags = options.featureFlags;\n }\n\n /**\n * Internal method for creating PluginModelBuilder.\n * Uses Symbol key to prevent external access.\n * @internal\n */\n static [FROM_BUILDER]<\n Data extends PluginData,\n Params extends PluginParams,\n Outputs extends PluginOutputs,\n Config extends PluginConfig,\n >(options: {\n name: PluginName;\n data: (config?: Config) => DataModel<Data>;\n outputs?: {\n [K in keyof Outputs]: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => Outputs[K];\n };\n featureFlags?: BlockCodeKnownFeatureFlags;\n }): PluginModelBuilder<Data, Params, Outputs, Config> {\n return new PluginModelBuilder(options);\n }\n\n /**\n * Adds an output to the plugin.\n *\n * @param key - Output name\n * @param fn - Function that computes the output value from plugin context\n * @returns PluginModel with the new output added\n *\n * @example\n * .output('model', (ctx) => createModel(ctx.params.columns, ctx.data.state))\n * .output('isReady', (ctx) => ctx.params.columns !== undefined)\n */\n output<const Key extends string, T>(\n key: Key,\n fn: (ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>) => T,\n ): PluginModelBuilder<Data, Params, Outputs & { [K in Key]: T }, Config> {\n return new PluginModelBuilder<Data, Params, Outputs & { [K in Key]: T }, Config>({\n name: this.name,\n data: this.data,\n featureFlags: this.featureFlags,\n outputs: {\n ...this.outputs,\n [key]: fn,\n } as {\n [K in keyof (Outputs & { [P in Key]: T })]: (\n ctx: PluginRenderCtx<PluginFactoryLike<Data, Params>>,\n ) => (Outputs & { [P in Key]: T })[K];\n },\n });\n }\n\n /**\n * Finalizes the plugin definition and returns a ConfigurablePluginModel.\n *\n * @returns Callable plugin factory that accepts config and returns PluginModel\n *\n * @example\n * const myPlugin = new PluginModelBuilder('myPlugin', () => dataModel)\n * .output('value', (ctx) => ctx.data.value)\n * .build();\n *\n * // Later, call create() with config to get a configured instance:\n * const configured = myPlugin.create({ defaultValue: 'test' });\n */\n build(): PluginFactory<Data, Params, Outputs, Config> {\n return new PluginModelFactory<Data, Params, Outputs, Config>({\n name: this.name,\n data: this.data,\n outputs: this.outputs,\n featureFlags: this.featureFlags,\n });\n }\n}\n"],"names":[],"mappings":"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"}
|