UNPKG

voxa

Version:

A fsm (state machine) framework for Alexa, Dialogflow, Facebook Messenger and Botframework apps using Node.js

215 lines 9.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const actions_on_google_1 = require("actions-on-google"); const bluebird = require("bluebird"); const _ = require("lodash"); const directives_1 = require("../../../directives"); class DialogflowDirective { constructor(options, requiredCapability) { this.options = options; this.requiredCapability = requiredCapability; } hasRequiredCapability(event) { if (!this.requiredCapability) { return true; } return _.includes(event.supportedInterfaces, this.requiredCapability); } async getQuestion(QuestionClass, event) { if (_.isString(this.options)) { const options = await event.renderer.renderPath(this.options, event); return new QuestionClass(options); } return new QuestionClass(this.options); } } function createSystemIntentDirective(QuestionClass, key, requiredCapability) { var _a; return _a = class extends DialogflowDirective { constructor(options) { super(options, requiredCapability); this.options = options; } async writeToReply(reply, event, transition) { if (!this.hasRequiredCapability(event)) { return; } const google = reply.payload.google; const question = await this.getQuestion(QuestionClass, event); google.systemIntent = { data: question.inputValueData, intent: question.intent, }; } }, _a.platform = "google", _a.key = key, _a; } function createRichResponseDirective(RichResponseItemClass, key, requiredCapability) { var _a; return _a = class extends DialogflowDirective { constructor(options) { super(options, requiredCapability); this.options = options; } async writeToReply(reply, event, transition) { if (!this.hasRequiredCapability(event)) { return; } const google = reply.payload.google; if (!google.richResponse) { throw new Error(`A simple response is required before a ${key}`); } const question = await this.getQuestion(RichResponseItemClass, event); google.richResponse.add(question); } }, _a.platform = "google", _a.key = key, _a; } exports.LinkOutSuggestion = createRichResponseDirective(actions_on_google_1.LinkOutSuggestion, "dialogflowLinkOutSuggestion"); exports.NewSurface = createSystemIntentDirective(actions_on_google_1.NewSurface, "dialogflowNewSurface"); exports.List = createSystemIntentDirective(actions_on_google_1.List, "dialogflowList", "actions.capability.SCREEN_OUTPUT"); exports.Carousel = createSystemIntentDirective(actions_on_google_1.Carousel, "dialogflowCarousel", "actions.capability.SCREEN_OUTPUT"); exports.AccountLinkingCard = createSystemIntentDirective(actions_on_google_1.SignIn, "dialogflowAccountLinkingCard"); exports.Permission = createSystemIntentDirective(actions_on_google_1.Permission, "dialogflowPermission"); exports.DateTime = createSystemIntentDirective(actions_on_google_1.DateTime, "dialogflowDateTime"); exports.Confirmation = createSystemIntentDirective(actions_on_google_1.Confirmation, "dialogflowConfirmation"); exports.DeepLink = createSystemIntentDirective(actions_on_google_1.DeepLink, "dialogflowDeepLink"); exports.Place = createSystemIntentDirective(actions_on_google_1.Place, "dialogflowPlace"); exports.CompletePurchase = createSystemIntentDirective(actions_on_google_1.CompletePurchase, "googleCompletePurchase"); exports.TransactionDecision = createSystemIntentDirective(actions_on_google_1.TransactionDecision, "dialogflowTransactionDecision"); exports.TransactionRequirements = createSystemIntentDirective(actions_on_google_1.TransactionRequirements, "dialogflowTransactionRequirements"); exports.RegisterUpdate = createSystemIntentDirective(actions_on_google_1.RegisterUpdate, "dialogflowRegisterUpdate"); exports.UpdatePermission = createSystemIntentDirective(actions_on_google_1.UpdatePermission, "dialogflowUpdatePermission"); exports.BasicCard = createRichResponseDirective(actions_on_google_1.BasicCard, "dialogflowBasicCard", "actions.capability.SCREEN_OUTPUT"); exports.MediaResponse = createRichResponseDirective(actions_on_google_1.MediaResponse, "dialogflowMediaResponse", "actions.capability.AUDIO_OUTPUT"); exports.Table = createRichResponseDirective(actions_on_google_1.Table, "dialogflowTable", "actions.capability.SCREEN_OUTPUT"); exports.BrowseCarousel = createRichResponseDirective(actions_on_google_1.BrowseCarousel, "dialogflowBrowseCarousel", "actions.capability.SCREEN_OUTPUT"); class Suggestions { constructor(suggestions) { this.suggestions = suggestions; } async writeToReply(reply, event, transition) { let options = this.suggestions; if (_.isString(options)) { options = await event.renderer.renderPath(options, event); } const suggestions = new actions_on_google_1.Suggestions(options); const google = reply.payload.google; const richResponse = google.richResponse; richResponse.addSuggestion(suggestions); } } Suggestions.platform = "google"; Suggestions.key = "dialogflowSuggestions"; exports.Suggestions = Suggestions; class Context { constructor(contextConfig) { this.contextConfig = contextConfig; } async writeToReply(reply, event, transition) { const conv = event.dialogflow .conv; conv.contexts.set(this.contextConfig.name, this.contextConfig.lifespan, this.contextConfig.parameters); } } Context.platform = "google"; Context.key = "dialogflowContext"; exports.Context = Context; class Say extends directives_1.Say { async writeToReply(reply, event, transition) { const google = reply.payload.google; let richResponse = google.richResponse; if (!richResponse) { richResponse = new actions_on_google_1.RichResponse([]); } google.richResponse = richResponse; let viewPaths = this.viewPaths; if (_.isString(viewPaths)) { viewPaths = [viewPaths]; } await bluebird.mapSeries(viewPaths, async (view) => { const statement = await event.renderer.renderPath(view, event); if (transition.dialogflowSplitSimpleResponses) { richResponse.add(new actions_on_google_1.SimpleResponse("")); } reply.addStatement(directives_1.sampleOrItem(statement, event.platform)); }); } } Say.key = "say"; Say.platform = "google"; exports.Say = Say; class SessionEntity { constructor(viewPath) { this.viewPath = viewPath; } async writeToReply(reply, event, transition) { let entity = this.viewPath; if (_.isString(this.viewPath)) { entity = await event.renderer.renderPath(this.viewPath, event); } if (_.isPlainObject(entity)) { entity = [entity]; } if (!_.isArray(entity) || _.isEmpty(entity)) { throw new Error("Please verify your entity it could be empty or is not an array"); } entity = generateSessionEntity(entity, event); reply.sessionEntityTypes = entity; } } SessionEntity.key = "dialogflowSessionEntity"; SessionEntity.platform = "google"; exports.SessionEntity = SessionEntity; var EntityOverrideMode; (function (EntityOverrideMode) { EntityOverrideMode["Unspecified"] = "ENTITY_OVERRIDE_MODE_UNSPECIFIED"; EntityOverrideMode["Override"] = "ENTITY_OVERRIDE_MODE_OVERRIDE"; EntityOverrideMode["Supplement"] = "ENTITY_OVERRIDE_MODE_SUPPLEMENT"; })(EntityOverrideMode = exports.EntityOverrideMode || (exports.EntityOverrideMode = {})); function generateSessionEntity(entity, event) { const newSessionEntity = entity.reduce((filteredSessionEntity, property) => { const entityMode = _.get(property, "entityOverrideMode", EntityOverrideMode.Override); const name = _.get(property, "name"); const entities = _.get(property, "entities"); validateEntityMode(entityMode); validateEntityName(name); validateEntity(entities); const newEntity = { entities: property.entities, entityOverrideMode: entityMode, name: `${event.rawEvent.session}/entityTypes/${name}`, }; filteredSessionEntity.push(newEntity); return filteredSessionEntity; }, []); return newSessionEntity; } function validateEntityMode(entityMode) { if (!_.includes([ EntityOverrideMode.Unspecified, EntityOverrideMode.Override, EntityOverrideMode.Supplement, ], entityMode)) { throw new Error("The Entity Override Mode specified is incorrect, please consider use one of the followings: ENTITY_OVERRIDE_MODE_UNSPECIFIED, ENTITY_OVERRIDE_MODE_OVERRIDE or ENTITY_OVERRIDE_MODE_SUPPLEMENT"); } } function validateEntity(entities) { if (!entities || _.isEmpty(entities)) { throw new Error("The entities property is empty or was not provided, please verify"); } } function validateEntityName(name) { const regexName = new RegExp(/^[A-Z-_]+$/i); if (!name) { throw new Error("A name is required for a Session Entity"); } if (!regexName.test(name)) { throw new Error("The name property for Session Entity Type should be only alphabetic characters"); } } //# sourceMappingURL=directives.js.map