UNPKG

dynamics-meta

Version:

Library for download MetaData from Dynamics365

1 lines 15.1 kB
{"version":3,"sources":["../src/types/api.ts","../src/auth.ts","../src/build.ts"],"sourcesContent":["export enum FieldType {\n String = 'String',\n Lookup = 'Lookup',\n Memo = 'Memo',\n Virtual = 'Virtual',\n DateTime = 'DateTime',\n Boolean = 'Boolean',\n Picklist = 'Picklist',\n Number = 'Number',\n Owner = 'Owner',\n State = 'State',\n Status = 'Status',\n PartyList = 'PartyList',\n Integer = 'Integer',\n Choice = 'Choice',\n EntityName = 'EntityName',\n Uniqueidentifier = 'Uniqueidentifier',\n}\n\nexport type TMetaData = {\n PrimaryIdAttribute: string;\n PrimaryNameAttribute: string;\n PrimaryImageAttribute: string;\n LogicalName: string;\n LogicalCollectionName: string;\n SchemaName: string;\n DisplayName: {\n UserLocalizedLabel: {\n Label: string;\n };\n };\n DisplayCollectionName: {\n UserLocalizedLabel: {\n Label: string;\n };\n };\n IsActivity: boolean;\n OwnershipType: string;\n ObjectTypeCode: number;\n IsCustomEntity: boolean;\n};\n\nexport type TApiJoinParams = Pick<TMetaData, 'DisplayName' | 'LogicalName' | 'LogicalCollectionName' | 'PrimaryIdAttribute' | 'PrimaryNameAttribute'>\n\nexport type TFieldMetaData = {\n '@odata.type': string;\n LogicalName: string;\n AttributeType: FieldType;\n Format?: string;\n FormatName?: { Value: string };\n DisplayName: {\n UserLocalizedLabel: {\n Label: string;\n };\n };\n Description: {\n UserLocalizedLabel: {\n Label: string;\n };\n };\n MaxLength?: number;\n MinValue?: number;\n MaxValue?: number;\n Targets?: string[];\n};\n\nexport type PickListOptionsType = {\n OptionSet: {\n Options: Array<{\n Value: string;\n Label: {\n UserLocalizedLabel: {\n Label: string;\n };\n };\n }>;\n FalseOption?: {\n Value: string;\n Label: {\n UserLocalizedLabel: {\n Label: string;\n };\n };\n };\n TrueOption?: {\n Value: string;\n Label: {\n UserLocalizedLabel: {\n Label: string;\n };\n };\n };\n };\n};\n","import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\n\nexport type Params<T = Record<string, any>> = {\n url: string;\n method?: 'get' | 'post' | 'patch' | 'delete';\n data?: T;\n params?: Record<string, any>;\n timeout?: number;\n tries?: number;\n};\n\nexport const getRequest = (Authorization: string, baseURL: string) => {\n return async <R, T = Record<string, any>>(props: Params<T>): Promise<AxiosResponse<R>> => {\n const { method = 'get', tries, ...rest } = props;\n const request = () =>\n axios.request<R>({\n baseURL,\n method,\n ...rest,\n headers: { Authorization },\n } as AxiosRequestConfig);\n if (tries) {\n const sendRequest = async (tries: number) => {\n try {\n return await request();\n } catch (e) {\n if (e.code === 'ECONNABORTED' && tries > 0) {\n return await sendRequest(tries - 1);\n } else {\n throw e;\n }\n }\n };\n return sendRequest(tries);\n }\n return request();\n };\n};\n","import { getRequest } from './auth';\nimport { FieldType, PickListOptionsType, TApiJoinParams, TFieldMetaData, TMetaData } from './types/api';\nimport { TAppFieldMeta, TAppEntityMeta, TConfig, TJoinParams } from './types/app';\n\nconst splitArray = (array: Array<any>, LIMIT = 10) =>\n Array.from(new Array(Math.ceil(array.length / LIMIT)).keys())\n .map((k) => array.slice(k * LIMIT, k * LIMIT + 25))\n\nexport const systemBasedFields = ['ownerid', 'createdon', 'createdby', 'modifiedon'];\n\nconst optionBasedTypes = [\n '#Microsoft.Dynamics.CRM.PicklistAttributeMetadata',\n '#Microsoft.Dynamics.CRM.BooleanAttributeMetadata',\n '#Microsoft.Dynamics.CRM.MultiSelectPicklistAttributeMetadata',\n]\n\nexport const getBuildFunction = (token: string, url: string, config: TConfig) => {\n const request = getRequest(token, url);\n\n const targets = new Set<string>();\n\n const getFieldsData = (logicalName: string) =>\n request<{ value: TFieldMetaData[] }>({\n url: `EntityDefinitions(LogicalName='${logicalName}')/Attributes`,\n timeout: 5000,\n tries: 3,\n });\n\n const getJoinParams = async (names: string[]) =>\n (await Promise.all(splitArray(names, 20)\n .map(names => request<{ value: TApiJoinParams[] }>({\n url: `EntityDefinitions`,\n timeout: 5000,\n tries: 3,\n params: {\n $select:\n 'LogicalName,LogicalCollectionName,PrimaryIdAttribute,PrimaryNameAttribute,DisplayName',\n $filter: names.map((name) => `LogicalName eq '${name}'`).join(' or '),\n },\n })))).map(v => v.data.value).flat();\n\n const getEntityMeta = (names: string[]) =>\n request<{ value: TMetaData[] }>({\n url: `EntityDefinitions`,\n params: {\n $select:\n 'LogicalName,LogicalCollectionName,PrimaryIdAttribute,PrimaryNameAttribute,PrimaryImageAttribute,DisplayName,DisplayCollectionName,IsActivity,SchemaName,ObjectTypeCode,OwnershipType,IsCustomEntity',\n $filter: names.map((name) => `LogicalName eq '${name}'`).join(' or '),\n },\n timeout: 5000,\n tries: 3,\n });\n\n const getListItems = (entityLogicalName: string, field: string, type: string) =>\n request<PickListOptionsType>({\n url: `EntityDefinitions(LogicalName='${entityLogicalName}')/Attributes(LogicalName='${field}')/${type.slice(1)}`,\n params: {\n $select: 'LogicalName',\n $expand: 'OptionSet',\n },\n timeout: 5000,\n tries: 3,\n });\n\n const getOptions = async (type: FieldType, fullType: string, logicalName: string, fieldName: string) => {\n if (\n [FieldType.Picklist, FieldType.Virtual, FieldType.Boolean, FieldType.Status, FieldType.State].includes(type) &&\n fullType\n ) {\n try {\n const {\n data: {\n OptionSet: { Options, FalseOption, TrueOption },\n },\n } = await getListItems(logicalName, fieldName, fullType);\n if (type === FieldType.Boolean && FalseOption && TrueOption) {\n return [\n ['true', TrueOption.Label.UserLocalizedLabel.Label],\n ['false', FalseOption.Label.UserLocalizedLabel.Label],\n ];\n } else {\n return Options.map((v) => [`${v.Value}`, v.Label.UserLocalizedLabel.Label]);\n }\n } catch (e) {\n console.log(e);\n }\n } else {\n return [];\n }\n };\n\n const getMeta = async (entityName: string) => {\n const {\n data: { value: fieldsMeta },\n } = await getFieldsData(config[entityName].name);\n\n const columns = (config[entityName].columns as string[]).concat(...systemBasedFields);\n\n const options = {};\n\n try {\n await Promise.all(\n fieldsMeta\n .filter(\n (v) =>\n optionBasedTypes.includes(v['@odata.type']) &&\n (config[entityName]?.columns as string[]).includes(v.LogicalName)\n )\n .map(async ({ LogicalName, AttributeType, '@odata.type': type }) => {\n options[LogicalName] = await getOptions(AttributeType, type, config[entityName].name, LogicalName);\n })\n );\n } catch (e) {\n console.log(e);\n }\n\n fieldsMeta.filter((v) => columns.includes(v.LogicalName) && v.Targets).map(v => v.Targets).flat().forEach(v => targets.add(v));\n\n return fieldsMeta\n .filter((v) => columns.includes(v.LogicalName))\n .reduce(\n (acc, next) => ({\n ...acc,\n [next.LogicalName]: {\n label: next.DisplayName.UserLocalizedLabel.Label,\n description: next.Description.UserLocalizedLabel.Label,\n extraType: next['@odata.type'],\n type: next.AttributeType,\n format: next.Format,\n formatName: next.FormatName?.Value,\n targets: next.Targets,\n options: options[next.LogicalName],\n maxLength: next.MaxLength,\n minValue: next.MinValue,\n maxValue: next.MaxValue,\n },\n }),\n {} as Record<string, TAppFieldMeta>\n );\n };\n\n return async () => {\n const mainKeys = Object.keys(config);\n\n const entitiesMeta = Object.fromEntries(\n (await getEntityMeta(mainKeys.map((entityName) => config[entityName].name))).data.value\n .map(({LogicalName, DisplayName, LogicalCollectionName, IsActivity, DisplayCollectionName, SchemaName, ...rest}) => [\n LogicalName,\n ({\n logicalName: LogicalName,\n url: LogicalCollectionName,\n fields: {} as Record<string, TAppFieldMeta>,\n displayName: DisplayName?.UserLocalizedLabel?.Label,\n displayCollectionName: DisplayCollectionName?.UserLocalizedLabel?.Label,\n isActivity: IsActivity,\n schemaName: SchemaName,\n ...rest,\n })\n ])\n );\n\n const meta = Object.fromEntries(mainKeys.map((key) => [key, entitiesMeta[config[key].name]])) as Record<\n string,\n TAppEntityMeta & { fields: Record<string, TAppFieldMeta> }\n >;\n\n const fields = Object.fromEntries(\n await Promise.all(mainKeys.map(async (entityName: string) => [entityName, await getMeta(entityName)]))\n );\n\n const targetsResponse = await getJoinParams([...targets.values()])\n const targetCollections: Record<string, TJoinParams> = Object.fromEntries(\n targetsResponse.map(({ LogicalName, DisplayName, ...rest}) =>\n [LogicalName, { LogicalName, DisplayName: DisplayName?.UserLocalizedLabel?.Label, ... rest }]\n ));\n\n return { meta: Object.fromEntries(\n Object.entries(meta).map(([key, values]) => [key, { ...values, fields: fields[key] }])\n ) as Record<string, TAppEntityMeta>, targetCollections };\n }\n}\n"],"mappings":"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","names":["FieldType","tries","names","_a","_b"]}