diff --git a/src/DotVVM.Framework/Resources/Scripts/dotvvm-root.ts b/src/DotVVM.Framework/Resources/Scripts/dotvvm-root.ts index 15681ea30a..b9a4cf9bc3 100644 --- a/src/DotVVM.Framework/Resources/Scripts/dotvvm-root.ts +++ b/src/DotVVM.Framework/Resources/Scripts/dotvvm-root.ts @@ -25,6 +25,7 @@ import * as viewModuleManager from './viewModules/viewModuleManager' import { notifyModuleLoaded } from './postback/resourceLoader' import { logError, logWarning, logInfo, logInfoVerbose, level, logPostBackScriptError } from "./utils/logging" import { orderBy, orderByDesc } from './collections/sortingHelper' +import * as metadataHelper from './metadata/metadataHelper' import * as arrayHelper from './collections/arrayHelper' import * as stringHelper from './utils/stringHelper' @@ -99,6 +100,12 @@ const dotvvmExports = { parseDate, deserialize }, + metadata: { + getTypeId: metadataHelper.getTypeId, + getTypeMetadata: metadataHelper.getTypeMetadata, + getEnumMetadata: metadataHelper.getEnumMetadata, + getEnumValue: metadataHelper.getEnumValue + }, viewModules: { registerOne: viewModuleManager.registerViewModule, init: viewModuleManager.initViewModule, diff --git a/src/DotVVM.Framework/Resources/Scripts/metadata/metadataHelper.ts b/src/DotVVM.Framework/Resources/Scripts/metadata/metadataHelper.ts new file mode 100644 index 0000000000..87719d6af2 --- /dev/null +++ b/src/DotVVM.Framework/Resources/Scripts/metadata/metadataHelper.ts @@ -0,0 +1,28 @@ +import { getTypeInfo } from "./typeMap"; + +export function getTypeId(viewModel: object): string | undefined { + return ko.unwrap((viewModel as any).$type); +} + +export function getTypeMetadata(typeId: string): TypeMetadata { + return getTypeInfo(typeId); +} + +export function getEnumMetadata(enumMetadataId: string): EnumTypeMetadata { + let metadata = getTypeInfo(enumMetadataId); + if (metadata.type !== "enum") { + throw new Error("Expected enum, but received object"); + } + + return metadata as EnumTypeMetadata; +} + +export function getEnumValue(identifier: string | number, enumMetadataId: string): number | undefined { + let metadata = getEnumMetadata(enumMetadataId); + if (typeof identifier === "string") { + return metadata.values[identifier]; + } + else { + return identifier; + } +}