UNPKG

ask-cli-x

Version:

Alexa Skills Kit (ASK) Command Line Interfaces

166 lines (165 loc) 8.29 kB
"use strict"; 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;