@aws-amplify/datastore
Version:
AppSyncLocal support for aws-amplify
1 lines • 49.3 kB
Source Map (JSON)
{"version":3,"file":"utils.mjs","sources":["../../../src/sync/utils.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { GraphQLAuthError } from '@aws-amplify/api';\nimport { ConsoleLogger } from '@aws-amplify/core';\nimport { ModelOperation, OpType, isEnumFieldType, isGraphQLScalarType, isNonModelFieldType, isPredicateGroup, isPredicateObj, isSchemaModel, isSchemaModelWithAttributes, isTargetNameAssociation, } from '../types';\nimport { IDENTIFIER_KEY_SEPARATOR, establishRelationAndKeys, extractPrimaryKeyFieldNames, } from '../util';\nconst logger = new ConsoleLogger('DataStore');\nconst GraphQLOperationType = {\n LIST: 'query',\n CREATE: 'mutation',\n UPDATE: 'mutation',\n DELETE: 'mutation',\n GET: 'query',\n};\nexport var TransformerMutationType;\n(function (TransformerMutationType) {\n TransformerMutationType[\"CREATE\"] = \"Create\";\n TransformerMutationType[\"UPDATE\"] = \"Update\";\n TransformerMutationType[\"DELETE\"] = \"Delete\";\n TransformerMutationType[\"GET\"] = \"Get\";\n})(TransformerMutationType || (TransformerMutationType = {}));\nconst dummyMetadata = {\n _version: undefined,\n _lastChangedAt: undefined,\n _deleted: undefined,\n};\nconst metadataFields = Object.keys(dummyMetadata);\nexport function getMetadataFields() {\n return metadataFields;\n}\nexport function generateSelectionSet(namespace, modelDefinition) {\n const scalarFields = getScalarFields(modelDefinition);\n const nonModelFields = getNonModelFields(namespace, modelDefinition);\n const implicitOwnerField = getImplicitOwnerField(modelDefinition, scalarFields);\n let scalarAndMetadataFields = Object.values(scalarFields)\n .map(({ name }) => name)\n .concat(implicitOwnerField)\n .concat(nonModelFields);\n if (isSchemaModel(modelDefinition)) {\n scalarAndMetadataFields = scalarAndMetadataFields\n .concat(getMetadataFields())\n .concat(getConnectionFields(modelDefinition, namespace));\n }\n const result = scalarAndMetadataFields.join('\\n');\n return result;\n}\nfunction getImplicitOwnerField(modelDefinition, scalarFields) {\n const ownerFields = getOwnerFields(modelDefinition);\n if (!scalarFields.owner && ownerFields.includes('owner')) {\n return ['owner'];\n }\n return [];\n}\nfunction getOwnerFields(modelDefinition) {\n const ownerFields = [];\n if (isSchemaModelWithAttributes(modelDefinition)) {\n modelDefinition.attributes.forEach(attr => {\n if (attr.properties && attr.properties.rules) {\n const rule = attr.properties.rules.find(currentRule => currentRule.allow === 'owner');\n if (rule && rule.ownerField) {\n ownerFields.push(rule.ownerField);\n }\n }\n });\n }\n return ownerFields;\n}\nfunction getScalarFields(modelDefinition) {\n const { fields } = modelDefinition;\n const result = Object.values(fields)\n .filter(field => {\n if (isGraphQLScalarType(field.type) || isEnumFieldType(field.type)) {\n return true;\n }\n return false;\n })\n .reduce((acc, field) => {\n acc[field.name] = field;\n return acc;\n }, {});\n return result;\n}\n// Used for generating the selection set for queries and mutations\nfunction getConnectionFields(modelDefinition, namespace) {\n const result = [];\n Object.values(modelDefinition.fields)\n .filter(({ association }) => association && Object.keys(association).length)\n .forEach(({ name, association }) => {\n const { connectionType } = association || {};\n switch (connectionType) {\n case 'HAS_ONE':\n case 'HAS_MANY':\n // Intentionally blank\n break;\n case 'BELONGS_TO':\n if (isTargetNameAssociation(association)) {\n // New codegen (CPK)\n if (association.targetNames && association.targetNames.length > 0) {\n // Need to retrieve relations in order to get connected model keys\n const [relations] = establishRelationAndKeys(namespace);\n const connectedModelName = modelDefinition.fields[name].type.model;\n const byPkIndex = relations[connectedModelName].indexes.find(([currentName]) => currentName === 'byPk');\n const keyFields = byPkIndex && byPkIndex[1];\n const keyFieldSelectionSet = keyFields?.join(' ');\n // We rely on `_deleted` when we process the sync query (e.g. in batchSave in the adapters)\n result.push(`${name} { ${keyFieldSelectionSet} _deleted }`);\n }\n else {\n // backwards-compatability for schema generated prior to custom primary key support\n result.push(`${name} { id _deleted }`);\n }\n }\n break;\n default:\n throw new Error(`Invalid connection type ${connectionType}`);\n }\n });\n return result;\n}\nfunction getNonModelFields(namespace, modelDefinition) {\n const result = [];\n Object.values(modelDefinition.fields).forEach(({ name, type }) => {\n if (isNonModelFieldType(type)) {\n const typeDefinition = namespace.nonModels[type.nonModel];\n const scalarFields = Object.values(getScalarFields(typeDefinition)).map(({ name: currentName }) => currentName);\n const nested = [];\n Object.values(typeDefinition.fields).forEach(field => {\n const { type: fieldType, name: fieldName } = field;\n if (isNonModelFieldType(fieldType)) {\n const nonModelTypeDefinition = namespace.nonModels[fieldType.nonModel];\n nested.push(`${fieldName} { ${generateSelectionSet(namespace, nonModelTypeDefinition)} }`);\n }\n });\n result.push(`${name} { ${scalarFields.join(' ')} ${nested.join(' ')} }`);\n }\n });\n return result;\n}\nexport function getAuthorizationRules(modelDefinition) {\n // Searching for owner authorization on attributes\n const authConfig = []\n .concat(modelDefinition.attributes || [])\n .find(attr => attr && attr.type === 'auth');\n const { properties: { rules = [] } = {} } = authConfig || {};\n const resultRules = [];\n // Multiple rules can be declared for allow: owner\n rules.forEach(rule => {\n // setting defaults for backwards compatibility with old cli\n const { identityClaim = 'cognito:username', ownerField = 'owner', operations = ['create', 'update', 'delete', 'read'], provider = 'userPools', groupClaim = 'cognito:groups', allow: authStrategy = 'iam', groups = [], groupsField = '', } = rule;\n const isReadAuthorized = operations.includes('read');\n const isOwnerAuth = authStrategy === 'owner';\n if (!isReadAuthorized && !isOwnerAuth) {\n return;\n }\n const authRule = {\n identityClaim,\n ownerField,\n provider,\n groupClaim,\n authStrategy,\n groups,\n groupsField,\n areSubscriptionsPublic: false,\n };\n if (isOwnerAuth) {\n // look for the subscription level override\n // only pay attention to the public level\n const modelConfig = []\n .concat(modelDefinition.attributes || [])\n .find(attr => attr && attr.type === 'model');\n // find the subscriptions level. ON is default\n const { properties: { subscriptions: { level = 'on' } = {} } = {} } = modelConfig || {};\n // treat subscriptions as public for owner auth with unprotected reads\n // when `read` is omitted from `operations`\n authRule.areSubscriptionsPublic =\n !operations.includes('read') || level === 'public';\n }\n if (isOwnerAuth) {\n // owner rules has least priority\n resultRules.push(authRule);\n return;\n }\n resultRules.unshift(authRule);\n });\n return resultRules;\n}\nexport function buildSubscriptionGraphQLOperation(namespace, modelDefinition, transformerMutationType, isOwnerAuthorization, ownerField, filterArg = false) {\n const selectionSet = generateSelectionSet(namespace, modelDefinition);\n const { name: typeName } = modelDefinition;\n const opName = `on${transformerMutationType}${typeName}`;\n const docArgs = [];\n const opArgs = [];\n if (filterArg) {\n docArgs.push(`$filter: ModelSubscription${typeName}FilterInput`);\n opArgs.push('filter: $filter');\n }\n if (isOwnerAuthorization) {\n docArgs.push(`$${ownerField}: String!`);\n opArgs.push(`${ownerField}: $${ownerField}`);\n }\n const docStr = docArgs.length ? `(${docArgs.join(',')})` : '';\n const opStr = opArgs.length ? `(${opArgs.join(',')})` : '';\n return [\n transformerMutationType,\n opName,\n `subscription operation${docStr}{\n\t\t\t${opName}${opStr}{\n\t\t\t\t${selectionSet}\n\t\t\t}\n\t\t}`,\n ];\n}\nexport function buildGraphQLOperation(namespace, modelDefinition, graphQLOpType) {\n let selectionSet = generateSelectionSet(namespace, modelDefinition);\n const { name: typeName, pluralName: pluralTypeName } = modelDefinition;\n let operation;\n let documentArgs;\n let operationArgs;\n let transformerMutationType;\n switch (graphQLOpType) {\n case 'LIST':\n operation = `sync${pluralTypeName}`;\n documentArgs = `($limit: Int, $nextToken: String, $lastSync: AWSTimestamp, $filter: Model${typeName}FilterInput)`;\n operationArgs =\n '(limit: $limit, nextToken: $nextToken, lastSync: $lastSync, filter: $filter)';\n selectionSet = `items {\n\t\t\t\t\t\t\t${selectionSet}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextToken\n\t\t\t\t\t\tstartedAt`;\n break;\n case 'CREATE':\n operation = `create${typeName}`;\n documentArgs = `($input: Create${typeName}Input!)`;\n operationArgs = '(input: $input)';\n transformerMutationType = TransformerMutationType.CREATE;\n break;\n case 'UPDATE':\n operation = `update${typeName}`;\n documentArgs = `($input: Update${typeName}Input!, $condition: Model${typeName}ConditionInput)`;\n operationArgs = '(input: $input, condition: $condition)';\n transformerMutationType = TransformerMutationType.UPDATE;\n break;\n case 'DELETE':\n operation = `delete${typeName}`;\n documentArgs = `($input: Delete${typeName}Input!, $condition: Model${typeName}ConditionInput)`;\n operationArgs = '(input: $input, condition: $condition)';\n transformerMutationType = TransformerMutationType.DELETE;\n break;\n case 'GET':\n operation = `get${typeName}`;\n documentArgs = `($id: ID!)`;\n operationArgs = '(id: $id)';\n transformerMutationType = TransformerMutationType.GET;\n break;\n default:\n throw new Error(`Invalid graphQlOpType ${graphQLOpType}`);\n }\n return [\n [\n transformerMutationType,\n operation,\n `${GraphQLOperationType[graphQLOpType]} operation${documentArgs}{\n\t\t${operation}${operationArgs}{\n\t\t\t${selectionSet}\n\t\t}\n\t}`,\n ],\n ];\n}\nexport function createMutationInstanceFromModelOperation(relationships, modelDefinition, opType, model, element, condition, MutationEventConstructor, modelInstanceCreator, id) {\n let operation;\n switch (opType) {\n case OpType.INSERT:\n operation = TransformerMutationType.CREATE;\n break;\n case OpType.UPDATE:\n operation = TransformerMutationType.UPDATE;\n break;\n case OpType.DELETE:\n operation = TransformerMutationType.DELETE;\n break;\n default:\n throw new Error(`Invalid opType ${opType}`);\n }\n // stringify nested objects of type AWSJSON\n // this allows us to return parsed JSON to users (see `castInstanceType()` in datastore.ts),\n // but still send the object correctly over the wire\n const replacer = (k, v) => {\n const isAWSJSON = k &&\n v !== null &&\n typeof v === 'object' &&\n modelDefinition.fields[k] &&\n modelDefinition.fields[k].type === 'AWSJSON';\n if (isAWSJSON) {\n return JSON.stringify(v);\n }\n return v;\n };\n const modelId = getIdentifierValue(modelDefinition, element);\n const optionalId = OpType.INSERT && id ? { id } : {};\n const mutationEvent = modelInstanceCreator(MutationEventConstructor, {\n ...optionalId,\n data: JSON.stringify(element, replacer),\n modelId,\n model: model.name,\n operation: operation,\n condition: JSON.stringify(condition),\n });\n return mutationEvent;\n}\nexport function predicateToGraphQLCondition(predicate, modelDefinition) {\n const result = {};\n if (!predicate || !Array.isArray(predicate.predicates)) {\n return result;\n }\n // This is compatible with how the GQL Transform currently generates the Condition Input,\n // i.e. any PK and SK fields are omitted and can't be used as conditions.\n // However, I think this limits usability.\n // What if we want to delete all records where SK > some value\n // Or all records where PK = some value but SKs are different values\n // TODO: if the Transform gets updated we'll need to modify this logic to only omit\n // key fields from the predicate/condition when ALL of the keyFields are present and using `eq` operators\n const keyFields = extractPrimaryKeyFieldNames(modelDefinition);\n return predicateToGraphQLFilter(predicate, keyFields);\n}\n/**\n * @param predicatesGroup - Predicate Group\n @returns GQL Filter Expression from Predicate Group\n\n @remarks Flattens redundant list predicates\n @example\n\n ```js\n { and:[{ and:[{ username: { eq: 'bob' }}] }] }\n ```\n Becomes\n ```js\n { and:[{ username: { eq: 'bob' }}] }\n ```\n */\nexport function predicateToGraphQLFilter(predicatesGroup, fieldsToOmit = [], root = true) {\n const result = {};\n if (!predicatesGroup || !Array.isArray(predicatesGroup.predicates)) {\n return result;\n }\n const { type, predicates } = predicatesGroup;\n const isList = type === 'and' || type === 'or';\n result[type] = isList ? [] : {};\n const children = [];\n predicates.forEach(predicate => {\n if (isPredicateObj(predicate)) {\n const { field, operator, operand } = predicate;\n if (fieldsToOmit.includes(field))\n return;\n const gqlField = {\n [field]: { [operator]: operand },\n };\n children.push(gqlField);\n return;\n }\n const child = predicateToGraphQLFilter(predicate, fieldsToOmit, false);\n if (Object.keys(child).length > 0) {\n children.push(child);\n }\n });\n // flatten redundant list predicates\n if (children.length === 1) {\n const [child] = children;\n if (\n // any nested list node\n (isList && !root) ||\n // root list node where the only child is also a list node\n (isList && root && ('and' in child || 'or' in child))) {\n delete result[type];\n Object.assign(result, child);\n return result;\n }\n }\n children.forEach(child => {\n if (isList) {\n result[type].push(child);\n }\n else {\n result[type] = child;\n }\n });\n if (isList) {\n if (result[type].length === 0)\n return {};\n }\n else {\n if (Object.keys(result[type]).length === 0)\n return {};\n }\n return result;\n}\n/**\n *\n * @param group - selective sync predicate group\n * @returns set of distinct field names in the filter group\n */\nexport function filterFields(group) {\n const fields = new Set();\n if (!group || !Array.isArray(group.predicates))\n return fields;\n const { predicates } = group;\n const stack = [...predicates];\n while (stack.length > 0) {\n const current = stack.pop();\n if (isPredicateObj(current)) {\n fields.add(current.field);\n }\n else if (isPredicateGroup(current)) {\n stack.push(...current.predicates);\n }\n }\n return fields;\n}\n/**\n *\n * @param modelDefinition\n * @returns set of field names used with dynamic auth modes configured for the provided model definition\n */\nexport function dynamicAuthFields(modelDefinition) {\n const rules = getAuthorizationRules(modelDefinition);\n const fields = new Set();\n for (const rule of rules) {\n if (rule.groupsField && !rule.groups.length) {\n // dynamic group rule will have no values in `rule.groups`\n fields.add(rule.groupsField);\n }\n else if (rule.ownerField) {\n fields.add(rule.ownerField);\n }\n }\n return fields;\n}\n/**\n *\n * @param group - selective sync predicate group\n * @returns the total number of OR'd predicates in the filter group\n *\n * @example returns 2\n * ```js\n * { type: \"or\", predicates: [\n * { field: \"username\", operator: \"beginsWith\", operand: \"a\" },\n * { field: \"title\", operator: \"contains\", operand: \"abc\" },\n * ]}\n * ```\n */\nexport function countFilterCombinations(group) {\n if (!group || !Array.isArray(group.predicates))\n return 0;\n let count = 0;\n const stack = [group];\n while (stack.length > 0) {\n const current = stack.pop();\n if (isPredicateGroup(current)) {\n const { predicates, type } = current;\n // ignore length = 1; groups with 1 predicate will get flattened when converted to gqlFilter\n if (type === 'or' && predicates.length > 1) {\n count += predicates.length;\n }\n stack.push(...predicates);\n }\n }\n // if we didn't encounter any OR groups, default to 1\n return count || 1;\n}\n/**\n *\n * @param group - selective sync predicate group\n * @returns name of repeated field | null\n *\n * @example returns \"username\"\n * ```js\n * { type: \"and\", predicates: [\n * \t\t{ field: \"username\", operator: \"beginsWith\", operand: \"a\" },\n * \t\t{ field: \"username\", operator: \"contains\", operand: \"abc\" },\n * ] }\n * ```\n */\nexport function repeatedFieldInGroup(group) {\n if (!group || !Array.isArray(group.predicates))\n return null;\n // convert to filter in order to flatten redundant groups\n const gqlFilter = predicateToGraphQLFilter(group);\n const stack = [gqlFilter];\n const hasGroupRepeatedFields = (fields) => {\n const seen = {};\n for (const f of fields) {\n const [fieldName] = Object.keys(f);\n if (seen[fieldName]) {\n return fieldName;\n }\n seen[fieldName] = true;\n }\n return null;\n };\n while (stack.length > 0) {\n const current = stack.pop();\n const [key] = Object.keys(current);\n const values = current[key];\n if (!Array.isArray(values)) {\n return null;\n }\n // field value will be single object\n const predicateObjects = values.filter(v => !Array.isArray(Object.values(v)[0]));\n // group value will be an array\n const predicateGroups = values.filter(v => Array.isArray(Object.values(v)[0]));\n if (key === 'and') {\n const repeatedField = hasGroupRepeatedFields(predicateObjects);\n if (repeatedField) {\n return repeatedField;\n }\n }\n stack.push(...predicateGroups);\n }\n return null;\n}\nexport var RTFError;\n(function (RTFError) {\n RTFError[RTFError[\"UnknownField\"] = 0] = \"UnknownField\";\n RTFError[RTFError[\"MaxAttributes\"] = 1] = \"MaxAttributes\";\n RTFError[RTFError[\"MaxCombinations\"] = 2] = \"MaxCombinations\";\n RTFError[RTFError[\"RepeatedFieldname\"] = 3] = \"RepeatedFieldname\";\n RTFError[RTFError[\"NotGroup\"] = 4] = \"NotGroup\";\n RTFError[RTFError[\"FieldNotInType\"] = 5] = \"FieldNotInType\";\n})(RTFError || (RTFError = {}));\nexport function generateRTFRemediation(errorType, modelDefinition, predicatesGroup) {\n const selSyncFields = filterFields(predicatesGroup);\n const selSyncFieldStr = [...selSyncFields].join(', ');\n const dynamicAuthModeFields = dynamicAuthFields(modelDefinition);\n const dynamicAuthFieldsStr = [...dynamicAuthModeFields].join(', ');\n const filterCombinations = countFilterCombinations(predicatesGroup);\n const repeatedField = repeatedFieldInGroup(predicatesGroup);\n switch (errorType) {\n case RTFError.UnknownField:\n return (`Your API was generated with an older version of the CLI that doesn't support backend subscription filtering.` +\n 'To enable backend subscription filtering, upgrade your Amplify CLI to the latest version and push your app by running `amplify upgrade` followed by `amplify push`');\n case RTFError.MaxAttributes: {\n let message = `Your selective sync expression for ${modelDefinition.name} contains ${selSyncFields.size} different model fields: ${selSyncFieldStr}.\\n\\n`;\n if (dynamicAuthModeFields.size > 0) {\n message +=\n `Note: the number of fields you can use with selective sync is affected by @auth rules configured on the model.\\n\\n` +\n `Dynamic auth modes, such as owner auth and dynamic group auth each utilize 1 field.\\n` +\n `You currently have ${dynamicAuthModeFields.size} dynamic auth mode(s) configured on this model: ${dynamicAuthFieldsStr}.`;\n }\n return message;\n }\n case RTFError.MaxCombinations: {\n let message = `Your selective sync expression for ${modelDefinition.name} contains ${filterCombinations} field combinations (total number of predicates in an OR expression).\\n\\n`;\n if (dynamicAuthModeFields.size > 0) {\n message +=\n `Note: the number of fields you can use with selective sync is affected by @auth rules configured on the model.\\n\\n` +\n `Dynamic auth modes, such as owner auth and dynamic group auth factor in to the number of combinations you're using.\\n` +\n `You currently have ${dynamicAuthModeFields.size} dynamic auth mode(s) configured on this model: ${dynamicAuthFieldsStr}.`;\n }\n return message;\n }\n case RTFError.RepeatedFieldname:\n return `Your selective sync expression for ${modelDefinition.name} contains multiple entries for ${repeatedField} in the same AND group.`;\n case RTFError.NotGroup:\n return (`Your selective sync expression for ${modelDefinition.name} uses a \\`not\\` group. If you'd like to filter subscriptions in the backend, ` +\n `rewrite your expression using \\`ne\\` or \\`notContains\\` operators.`);\n case RTFError.FieldNotInType:\n // no remediation instructions. We'll surface the message directly\n return '';\n }\n}\nexport function getUserGroupsFromToken(token, rule) {\n // validate token against groupClaim\n let userGroups = token[rule.groupClaim] || [];\n if (typeof userGroups === 'string') {\n let parsedGroups;\n try {\n parsedGroups = JSON.parse(userGroups);\n }\n catch (e) {\n parsedGroups = userGroups;\n }\n userGroups = [].concat(parsedGroups);\n }\n return userGroups;\n}\nexport async function getModelAuthModes({ authModeStrategy, defaultAuthMode, modelName, schema, }) {\n const operations = Object.values(ModelOperation);\n const modelAuthModes = {\n CREATE: [],\n READ: [],\n UPDATE: [],\n DELETE: [],\n };\n try {\n await Promise.all(operations.map(async (operation) => {\n const authModes = await authModeStrategy({\n schema,\n modelName,\n operation,\n });\n if (typeof authModes === 'string') {\n modelAuthModes[operation] = [authModes];\n }\n else if (Array.isArray(authModes) && authModes.length) {\n modelAuthModes[operation] = authModes;\n }\n else {\n // Use default auth mode if nothing is returned from authModeStrategy\n modelAuthModes[operation] = [defaultAuthMode];\n }\n }));\n }\n catch (error) {\n logger.debug(`Error getting auth modes for model: ${modelName}`, error);\n }\n return modelAuthModes;\n}\nexport function getForbiddenError(error) {\n const forbiddenErrorCodes = [401, 403];\n let forbiddenError;\n if (error && error.errors) {\n forbiddenError = error.errors.find(err => forbiddenErrorCodes.includes(resolveServiceErrorStatusCode(err)));\n }\n else if (error && error.message) {\n forbiddenError = error;\n }\n if (forbiddenError) {\n return (forbiddenError.message ??\n `Request failed with status code ${resolveServiceErrorStatusCode(forbiddenError)}`);\n }\n return null;\n}\nexport function resolveServiceErrorStatusCode(error) {\n if (error?.$metadata?.httpStatusCode) {\n return Number(error?.$metadata?.httpStatusCode);\n }\n else if (error?.originalError) {\n return resolveServiceErrorStatusCode(error?.originalError);\n }\n else {\n return null;\n }\n}\nexport function getClientSideAuthError(error) {\n const clientSideAuthErrors = Object.values(GraphQLAuthError);\n const clientSideError = error &&\n error.message &&\n clientSideAuthErrors.find(clientError => error.message.includes(clientError));\n return clientSideError || null;\n}\nexport async function getTokenForCustomAuth(authMode, amplifyConfig = {}) {\n if (authMode === 'lambda') {\n const { authProviders: { functionAuthProvider } = { functionAuthProvider: null }, } = amplifyConfig;\n if (functionAuthProvider && typeof functionAuthProvider === 'function') {\n try {\n const { token } = await functionAuthProvider();\n return token;\n }\n catch (error) {\n throw new Error(`Error retrieving token from \\`functionAuthProvider\\`: ${error}`);\n }\n }\n else {\n // TODO: add docs link once available\n throw new Error('You must provide a `functionAuthProvider` function to `DataStore.configure` when using lambda');\n }\n }\n}\n// Util that takes a modelDefinition and model and returns either the id value(s) or the custom primary key value(s)\nexport function getIdentifierValue(modelDefinition, model) {\n const pkFieldNames = extractPrimaryKeyFieldNames(modelDefinition);\n const idOrPk = pkFieldNames.map(f => model[f]).join(IDENTIFIER_KEY_SEPARATOR);\n return idOrPk;\n}\n"],"names":[],"mappings":"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"}