ask-cli-x
Version:
Alexa Skills Kit (ASK) Command Line Interfaces
166 lines (165 loc) • 8.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getLastExpectedFromInteractionGroup = void 0;
const acdl_1 = require("@alexa/acdl");
const interactions_1 = require("./types/interactions");
const simulation_response_parser_1 = require("./simulation-response-parser");
const types_1 = require("./types");
const getLastExpectedFromInteractionGroup = (interactionGroup) => {
if (!interactionGroup)
return;
const turns = (0, interactions_1.isExpressionInteractionGroup)(interactionGroup) ? interactionGroup.expressions : interactionGroup.expected;
if (turns.length > 0) {
return turns[turns.length - 1];
}
return;
};
exports.getLastExpectedFromInteractionGroup = getLastExpectedFromInteractionGroup;
const INITIAL_IMPORTS = [
new acdl_1.Import("ImportNamespace", "com.amazon.alexa.ask.conversations"),
new acdl_1.Import("ImportNamespace", "com.amazon.alexa.schema"),
new acdl_1.Import("ImportNamespace", "com.amazon.ask.types.builtins.AMAZON"),
new acdl_1.Import("ImportNamespace", "prompts"),
new acdl_1.Import("ImportNamespace", "slotTypes"),
new acdl_1.Import("ImportNamespace", "displays"),
];
const getAllTypesInInteractionGroups = (interactionGroups) => {
return interactionGroups.reduce((types, group) => [...types, ...getAllTypesInInteractionGroup(group)], []);
};
const getAllTypesInInteractionGroup = (interactionGroup) => {
return (0, interactions_1.isExpressionInteractionGroup)(interactionGroup)
? getAllTypeInPredictionAsts(interactionGroup.expressions)
: [...getAllTypeInPredictionAsts(interactionGroup.actual), ...getAllTypeInPredictionAsts(interactionGroup.expected)];
};
const getAllContentInPredictionAsts = (predictionAst) => {
return predictionAst.map((x) => x.ast.content);
};
const getAllTypeInPredictionAsts = (predictionAst) => {
return predictionAst.map((x) => x.ast.typeDecl).filter((x) => !!x);
};
const resolveTurnInteractions = (turnInteraction, counter) => {
return turnInteraction.reduce((turns, unresolvedTurn) => {
const resolved = unresolvedTurn(turns, counter);
return [...turns, resolved];
}, []);
};
const resolveInteractionGroup = (interactionGroup, counter) => {
if ((0, interactions_1.isUnresolvedExpressionInteractionGroup)(interactionGroup)) {
return { expressions: resolveTurnInteractions(interactionGroup.expressions, counter) };
}
return {
...interactionGroup,
expected: resolveTurnInteractions(interactionGroup.expected, counter),
};
};
/**
* Turns the current evaluation context into a valid module for printing or validation.
*/
const interactionBlockToModule = (timeStamp, namespace, interactionBlocks) => {
const types = getAllTypesInInteractionGroups(interactionBlocks);
const localeAnnotation = new acdl_1.Annotation(new acdl_1.Call(new acdl_1.Name(acdl_1.AlexaConversations.locale), [
new acdl_1.Argument(new acdl_1.Name("locales"), 0, new acdl_1.PropertyReference(new acdl_1.Name(acdl_1.Locale.en_US), new acdl_1.NameReference(new acdl_1.Name(acdl_1.AlexaConversations.Locale)))),
]));
return new acdl_1.Module(timeStamp, "https://amazonalexa.com/ask/2020/12/Module", new acdl_1.Name(namespace), INITIAL_IMPORTS, [],
// expressions
[
...types,
new acdl_1.InteractionDeclaration(new acdl_1.InteractionScope(interactionBlocks.reduce((expressions, group) => {
if ((0, interactions_1.isExpressionInteractionGroup)(group)) {
return [...expressions, ...group.expressions.map((_) => _.ast.content)];
}
else {
return [
...expressions,
new acdl_1.Correction(new acdl_1.CorrectionScope(group.actual.map((_) => _.ast.content)), new acdl_1.CorrectionScope(group.expected.map((_) => _.ast.content))),
];
}
}, [])), [localeAnnotation]),
]);
};
const contextToModule = (evaluateContext, timestamp, namespace) => {
const counter = new simulation_response_parser_1.Counter(evaluateContext.interactionBlock.length.toString());
const correctionGroup = (0, types_1.isCorrectionContext)(evaluateContext)
? resolveInteractionGroup(evaluateContext.turnInteractionGroup, counter)
: undefined;
const interactionBlocks = correctionGroup ? [...evaluateContext.interactionBlock, correctionGroup] : evaluateContext.interactionBlock;
return [interactionBlockToModule(timestamp, namespace, interactionBlocks), correctionGroup];
};
const contextPlusToModule = (context, extraInteractions, timeStamp, namespace) => {
const tempContext = {
...context,
interactionBlock: [...context.interactionBlock, { expressions: extraInteractions }],
};
return contextToModule(tempContext, timeStamp, namespace);
};
const copyProject = (project) => new acdl_1.Project({
config: project.config,
external: project.external,
source: project.source,
});
const getProjectWithModule = (__project, module, timeStamp) => {
const virtualFile = (0, acdl_1.sourceFile)("", timeStamp, module);
const project = copyProject(__project);
project.update(virtualFile);
return project;
};
/**
* A stateless utility which vends ACDL project, type checkers, and modules given the
* evaluate dialog context state.
*/
const factory = (__project, timeStamp, namespace) => ({
contextToModule: (evaluateContext) => contextToModule(evaluateContext, timeStamp, namespace),
contextPlusToModule: (context, extraInteractions) => {
const tempContext = {
...context,
interactionBlock: [...context.interactionBlock, { expressions: extraInteractions }],
};
return contextToModule(tempContext, timeStamp, namespace);
},
contextPlusUnresolvedToModule: (context, extraInteractions) => {
const tempContext = {
...context,
turnInteractionGroup: { expressions: extraInteractions },
};
return contextToModule(tempContext, timeStamp, namespace);
},
contextToProjectScope: (evaluateContext, extraInteractions) => {
const [module, group] = extraInteractions
? contextPlusToModule(evaluateContext, extraInteractions, timeStamp, namespace)
: contextToModule(evaluateContext, timeStamp, namespace);
return { project: getProjectWithModule(__project, module, timeStamp), module, lastGroup: group };
},
getProjectWithModule: (module) => getProjectWithModule(__project, module, timeStamp),
/**
* Resolves a single turn interaction in context of the context's committed and uncommitted interactions.
* Uncommitted interactions are either in the expressions or expected collection of the turnInteractionGroup
*/
resolveTurnInteractionForContext: (context, turnInteraction, counter) => {
const unresolvedInteractions = (0, interactions_1.isUnresolvedExpressionInteractionGroup)(context.turnInteractionGroup)
? context.turnInteractionGroup.expressions
: context.turnInteractionGroup.expected;
const __counter = counter !== null && counter !== void 0 ? counter : new simulation_response_parser_1.Counter(context.interactionBlock.length.toString());
const result = resolveTurnInteractions([...unresolvedInteractions, turnInteraction], __counter);
return result[result.length - 1];
},
resolveTurnInteractions,
resolveInteractionGroup,
getAllTypesInInteractionGroups,
getAllContentInPredictionAsts,
/**
* Output the given node as AcIR.
* Note: Make sure the node you are printing has been added to the context.turnInteractionGroup
* of the context given or the compile command will likely fail.
*/
astToAcir: (project, node) => {
return (0, acdl_1.compileExpression)(node, {
checker: project.getTypeChecker(),
moduleUri: "",
});
},
// TODO: change to a method to reformat the printed acdl
printAstToAcdl: (node, project) => {
return (0, acdl_1.printNode)(node, 0, { checker: project.getTypeChecker() }, false).replace(/\s\s/g, "").replace(/\n/g, "").replace("( ", "(");
},
});
exports.default = factory;