UNPKG

bixby-cli

Version:

A CLI for bixby capsule development

220 lines (207 loc) 6.14 kB
import * as fs from "fs"; import * as shell from "shelljs"; import { trainingId } from "../generators/capsule.generator"; import { ActionType } from "../structs/ActionType.enum"; import { PrimitifType } from "../structs/PrimitifType.enum"; import {dialog as dialogHelper, training as trainingHelper} from "./targets.helper"; function jsCode(): string { return `module.exports.function = function (name) { return { name: name } }`; } function action(name: string, type: ActionType): string { return `action (${name[0].toUpperCase() + name.slice(1)}) { type(${ActionType[type]}) description (A sample ${name.toLowerCase()} action) collect { input (name) { type (Name) min (Required) max (One) } } output (Person) }`; } function primitif(name: string, type: PrimitifType): string { return `${PrimitifType[type]} (${name[0].toUpperCase() + name.slice(1)}) { description (A sample ${name.toLowerCase()} primitif) }`; } function structure(name: string): string { return `structure (${name[0].toUpperCase() + name.slice(1)}) { description (A sample ${name.toLowerCase()} structure) property (name) { type (Name) min (Required) max (One) } }`; } function view(): string { return `result-view { match: Person (this) { from-output: Hello(action) } render { layout { section { content { thumbnail-card { image-background-color (Transparent) image-object-fit (Contain) image-url("/user.png") image-object-position (Center) image-position (Start) title-area { halign (Start) slot1 { text { value("#{value(this.name)}") style(Title_M) } } } } } } } } }`; } function endpoints(): string { return `endpoints { action-endpoints { action-endpoint (Hello) { accepted-inputs (name) local-endpoint (hello.js) } } }`; } function capsule_bxb(id: string, targets: string[]): string { const targetText = () => { return targets.map((target: string) => { return `target (bixby-mobile-${target})`; }).reduce((a: string, b: string) => { return a + "\n" + b; }, ""); }; return `capsule { id (${id}) version (0.1.0) format (3) targets { ${targetText()} } runtime-flags { concepts-inherit-super-type-features modern-prompt-rejection support-halt-effect-in-computed-inputs } }`; } function dialog(): string { return `dialog (Result) { match: Person (this) { from-output: Hello(action) } template-macro (Welcome) { param (name) { expression (this.name) } } }`; } function templateMacroDef(local: string): string { return `template-macro-def (Welcome) { params { param (name) { type (Name) min (Required) max (One) } } content { template ("${dialogHelper(local)} #{value(name)} 👋") } }`; } function training(local: string, name: string) { return `train (${trainingId("0")}) { utterance ("[g:Hello] ${trainingHelper(local)} (${name})[v:Name]") plan () last-modified (${Date.now()}) }`; } function capsule_info( name: string, company: string = "__COMPANY_NAME__", iconUrl: string = "https://bixbydevelopers.com/dev/static/bixby2logo.svg", ): string { return `description { displayName (${name}) companyName (${company}) iconUrl (${iconUrl}) description ("A sample test capsule") websiteUrl (https://example.com/) termsUrl (https://example.com/terms-of-use/) }`; } export function createNewCapsule(id: string, targets: string[], username: string): void { const capsulePath = process.cwd() + "/" + id; shell.mkdir("-p", capsulePath); fs.writeFileSync(capsulePath + "/capsule.bxb", capsule_bxb(id, targets), {encoding: "utf8"}); shell.mkdir("-p", capsulePath + "/assets"); const assetSourcePath = __dirname.replace(/\/bixby\-cli.*$/g, "/bixby-cli/assets/"); shell.cp("-f", assetSourcePath + "user.png", capsulePath + "/assets/user.png"); shell.mkdir("-p", capsulePath + "/code"); fs.writeFileSync(capsulePath + "/code/hello.js", jsCode(), {encoding: "utf8"}); shell.mkdir("-p", capsulePath + "/models/action"); fs.writeFileSync( ( capsulePath + "/models/action/Hello.model.bxb" ), action("Hello", ActionType.Search), {encoding: "utf8"}, ); shell.mkdir("-p", capsulePath + "/models/concept/primitif"); fs.writeFileSync( ( capsulePath + "/models/concept/primitif/Name.model.bxb" ), primitif( "Name", PrimitifType.text, ), { encoding: "utf8", }, ); shell.mkdir("-p", capsulePath + "/models/concept/structure"); fs.writeFileSync(capsulePath + "/models/concept/structure/Person.model.bxb", structure("Person"), {encoding: "utf8"}); shell.mkdir("-p", capsulePath + "/resources/base/dialog"); fs.writeFileSync( ( capsulePath + "/resources/base/" + id.split(".")[1] + ".endpoints.bxb" ), endpoints(), { encoding: "utf8", }, ); fs.writeFileSync(capsulePath + "/resources/base/dialog/hello.dialog.bxb", dialog(), {encoding: "utf8"}); shell.mkdir("-p", capsulePath + "/resources/base/view"); fs.writeFileSync(capsulePath + "/resources/base/view/hello.view.bxb", view(), {encoding: "utf8"}); targets.map((target) => { const targetPath = capsulePath + "/resources/" + target; shell.mkdir("-p", targetPath + "/training"); fs.writeFileSync(targetPath + "/training/t-0.training.bxb", training(target, username), {encoding: "utf8"}); fs.writeFileSync(targetPath + "/capsule-info.bxb", capsule_info(id.split(".")[1]), {encoding: "utf8"}); fs.writeFileSync(targetPath + "/nlg-strings.dialog.bxb", templateMacroDef(target), {encoding: "utf8"}); }); }