UNPKG

3.9 kBPlain TextView Raw
1/**
2 * Copyright (c) Microsoft Corporation. All rights reserved.
3 * Licensed under the MIT License.
4 */
5import * as models from '@conversationlearner/models'
6import { CallbackMap } from './CLRunner'
7
8/**
9 * Given an app definition return an updated app definition.
10 * If no updates are performed, return undefined.
11 */
12export default function (appDefinition: models.AppDefinition, callbackMap: CallbackMap): models.AppDefinitionChange {
13 let isChanged = false
14 const appDefinitionChanges: models.AppDefinitionChanges = {
15 actions: appDefinition.actions.map<models.IChangeResult<models.ActionBase>>(a => getActionChangeResult(a, callbackMap)),
16 entities: appDefinition.entities.map(getDefaultChangeResult),
17 trainDialogs: appDefinition.trainDialogs.map(getDefaultChangeResult)
18 }
19
20 const actionsChanged = appDefinitionChanges.actions.some(cr => cr.isChanged)
21 isChanged = isChanged || actionsChanged
22
23 return isChanged
24 ? {
25 isChanged: true,
26 currentAppDefinition: appDefinition,
27 updatedAppDefinition: {
28 actions: appDefinitionChanges.actions.map(cr => cr.value),
29 entities: appDefinitionChanges.entities.map(cr => cr.value),
30 trainDialogs: appDefinitionChanges.trainDialogs.map(cr => cr.value)
31 },
32 appDefinitionChanges
33 }
34 : {
35 isChanged: false,
36 currentAppDefinition: appDefinition
37 }
38}
39
40export function getDefaultChangeResult<T> (value: T): models.IChangeResult<T> {
41 return {
42 isChanged: false,
43 value,
44 changes: []
45 }
46}
47
48export function getActionChangeResult (action: models.ActionBase, callbackMap: CallbackMap): models.IChangeResult<models.ActionBase> {
49 // By default no update is performed
50 const changeResult: models.IChangeResult<models.ActionBase> = {
51 isChanged: false,
52 value: action,
53 changes: []
54 }
55
56 if (action.actionType === models.ActionTypes.API_LOCAL) {
57 const untypedActionPayload: any = JSON.parse(action.payload)
58 if (Array.isArray(untypedActionPayload.arguments)) {
59 const legacyActionPayload: models.ActionPayloadSingleArguments = untypedActionPayload
60 const callback = callbackMap[legacyActionPayload.payload]
61
62 const actionPayload: models.ActionPayload = callback
63 ? getActionPayload(legacyActionPayload, callback)
64 : {
65 payload: legacyActionPayload.payload,
66 logicArguments: legacyActionPayload.arguments,
67 renderArguments: []
68 }
69
70 const updatedAction = {
71 ...action,
72 payload: JSON.stringify(actionPayload)
73 }
74
75 changeResult.isChanged = true
76 changeResult.value = updatedAction
77 changeResult.changes.push(`Payload with old format using single array of arguments was updated to use the new form with separate logic and render arguments.`)
78 }
79 }
80
81 return changeResult
82}
83
84export function getActionPayload(legacyActionPayload: models.ActionPayloadSingleArguments, callback: models.Callback): models.ActionPayload {
85 return legacyActionPayload.arguments.reduce<models.ActionPayload>((actionPayload, argument) => {
86 const isMovedToLogicArgument = callback.logicArguments.some(la => la === argument.parameter)
87 if (isMovedToLogicArgument) {
88 actionPayload.logicArguments.push(argument)
89 }
90
91 const isMovedToRenderArgument = callback.renderArguments.some(la => la === argument.parameter)
92 if (isMovedToRenderArgument) {
93 actionPayload.renderArguments.push(argument)
94 }
95
96 return actionPayload
97 }, {
98 payload: legacyActionPayload.payload,
99 logicArguments: [],
100 renderArguments: []
101 })
102}
103
\No newline at end of file