diff --git a/package.json b/package.json index 7dd967df5..4ed5c7b5a 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@types/lru-cache": "^5.1.0", "@types/micro": "^7.3.3", "@types/mongodb": "^3.3.10", + "@types/prettier": "^1.19.0", "@types/restify": "^8.4.1", "@types/shortid": "^0.0.29", "@types/update-notifier": "^2.5.0", diff --git a/packages/bottender/src/cli/providers/sh/dev.ts b/packages/bottender/src/cli/providers/sh/dev.ts index 0e6d5b999..cc83d30bd 100644 --- a/packages/bottender/src/cli/providers/sh/dev.ts +++ b/packages/bottender/src/cli/providers/sh/dev.ts @@ -1,3 +1,6 @@ +import fs from 'fs'; +import path from 'path'; + import ngrok from 'ngrok'; import nodemon from 'nodemon'; @@ -23,9 +26,18 @@ const dev = async (ctx: CliContext): Promise => { const { channels } = config; + const isTypescript = fs.statSync(path.resolve('tsconfig.json')).isFile; + // watch nodemon( - `--exec "bottender start ${isConsole ? '--console' : ''} --port ${port}"` + [ + isTypescript ? '--ext js,mjs,json,ts --ignore dist/ ' : '', + '--exec "', + isTypescript ? 'tsc && ' : '', + 'bottender start', + isConsole ? ' --console' : '', + ` --port ${port}"`, + ].join('') ) // TODO: improve messages .on('start', () => { diff --git a/packages/create-bottender-app/.eslintignore b/packages/create-bottender-app/.eslintignore new file mode 100644 index 000000000..34940079d --- /dev/null +++ b/packages/create-bottender-app/.eslintignore @@ -0,0 +1 @@ +*.test.{ts,js} diff --git a/packages/create-bottender-app/package.json b/packages/create-bottender-app/package.json index cf12a4f16..46c4a2c67 100644 --- a/packages/create-bottender-app/package.json +++ b/packages/create-bottender-app/package.json @@ -18,6 +18,7 @@ "figures": "^3.0.0", "fs-extra": "^8.1.0", "inquirer": "^7.0.0", + "prettier": "^1.19.1", "validate-npm-package-name": "^3.0.0" } } diff --git a/packages/create-bottender-app/src/index.ts b/packages/create-bottender-app/src/index.ts index 460f9997b..b9c53e430 100644 --- a/packages/create-bottender-app/src/index.ts +++ b/packages/create-bottender-app/src/index.ts @@ -9,6 +9,7 @@ import inquirer from 'inquirer'; import spawn from 'cross-spawn'; import validateProjectName from 'validate-npm-package-name'; +import generateAppEntry from './utils/generateAppEntry'; import generateConfig from './utils/generateConfig'; import { Answer, Platform, Session } from './types'; import { bold, error, print } from './shared/log'; @@ -264,7 +265,11 @@ const run = async ( ), root ); - + const appEntry = generateAppEntry(useTypescript, platforms); + fs.writeFileSync( + path.join(root, 'src', useTypescript ? 'index.ts' : 'index.js'), + appEntry + ); fs.copySync(path.join(root, '.env.example'), path.join(root, '.env')); fs.copySync(path.join(root, 'gitignore'), path.join(root, '.gitignore')); fs.removeSync(path.join(root, 'gitignore')); @@ -280,10 +285,12 @@ const run = async ( print(''); const knownGeneratedFiles = [ + 'bottender.config.js', 'package.json', 'npm-debug.log', 'yarn-error.log', 'yarn-debug.log', + 'yarn.lock', 'node_modules', ]; const currentFiles = fs.readdirSync(path.join(root)); @@ -333,14 +340,9 @@ const createBot = async ( private: true, scripts: { dev: 'bottender dev', - lint: 'eslint .', - start: 'bottender start', + lint: `eslint . ${useTypescript ? '--ext=js,ts' : ''}`, + start: `${useTypescript ? 'tsc && ' : ''}bottender start`, test: 'jest', - ...(useTypescript - ? { - build: 'tsc', - } - : {}), }, }; diff --git a/packages/create-bottender-app/src/utils/generateAppEntry.ts b/packages/create-bottender-app/src/utils/generateAppEntry.ts new file mode 100644 index 000000000..7db61aa9f --- /dev/null +++ b/packages/create-bottender-app/src/utils/generateAppEntry.ts @@ -0,0 +1,46 @@ +import prettier from 'prettier'; + +import { Platform } from '../types'; + +const generateAppEntry = ( + isTypescript: boolean, + platforms: Platform[] +): string => { + if (!isTypescript) { + return prettier.format( + ` +module.exports = async function App(context) { + await context.sendText('Welcome to Bottender'); +}; +`, + { + trailingComma: 'es5', + singleQuote: true, + parser: 'babel', + } + ); + } + + const contexts = platforms.map( + platform => `${platform.charAt(0).toUpperCase()}${platform.slice(1)}Context` + ); + + return prettier.format( + ` +import { ${contexts.join(', ')} } from 'bottender'; + +export default async function App(context: ${contexts.join( + ' | ' + )}): Promise { + await context.sendText('Welcome to Bottender'); +}; +`, + { + trailingComma: 'es5', + singleQuote: true, + parser: 'typescript', + } + ); +}; + +export default generateAppEntry; diff --git a/packages/create-bottender-app/src/utils/generateConfig.ts b/packages/create-bottender-app/src/utils/generateConfig.ts index 601edb9d4..2127d55ef 100644 --- a/packages/create-bottender-app/src/utils/generateConfig.ts +++ b/packages/create-bottender-app/src/utils/generateConfig.ts @@ -1,9 +1,10 @@ +import prettier from 'prettier'; + import { Platform, Session } from '../types'; -const generateConfig = ( - session: Session, - platforms: Platform[] -): string => `module.exports = { +const generateConfig = (session: Session, platforms: Platform[]): string => + prettier.format( + `module.exports = { session: { driver: '${session}', stores: { @@ -63,6 +64,12 @@ const generateConfig = ( }, }, }; -`; +`, + { + trailingComma: 'es5', + singleQuote: true, + parser: 'babel', + } + ); export default generateConfig; diff --git a/packages/create-bottender-app/template-typescript/src/index.ts b/packages/create-bottender-app/template-typescript/src/index.ts deleted file mode 100644 index ff66a4fdb..000000000 --- a/packages/create-bottender-app/template-typescript/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default async function App(context: any): Promise { - await context.sendText('Welcome to Bottender'); -} diff --git a/packages/create-bottender-app/template/src/index.js b/packages/create-bottender-app/template/src/index.js deleted file mode 100644 index 9ff55a867..000000000 --- a/packages/create-bottender-app/template/src/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = async function App(context) { - await context.sendText('Welcome to Bottender'); -}; diff --git a/yarn.lock b/yarn.lock index b4363b5da..1b9ff9b0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1647,6 +1647,11 @@ resolved "https://registry.yarnpkg.com/@types/p-queue/-/p-queue-2.3.2.tgz#16bc5fece69ef85efaf2bce8b13f3ebe39c5a1c8" integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== +"@types/prettier@^1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.0.tgz#a2502fb7ce9b6626fdbfc2e2a496f472de1bdd05" + integrity sha512-gDE8JJEygpay7IjA/u3JiIURvwZW08f0cZSZLAzFoX/ZmeqvS0Sqv+97aKuHpNsalAMMhwPe+iAS6fQbfmbt7A== + "@types/range-parser@*": version "1.2.3" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" @@ -2564,9 +2569,9 @@ body-parser@1.19.0, body-parser@^1.19.0: type-is "~1.6.17" "bottender@file:packages/bottender": - version "1.2.0-alpha.4" + version "1.2.0" dependencies: - "@bottender/express" "file:../../../Library/Caches/Yarn/v4/npm-bottender-1.2.0-alpha.4-10dad676-e608-46ef-b748-ac2b653a576e-1578631392477/node_modules/bottender-express" + "@bottender/express" "file:../../../Library/Caches/Yarn/v6/npm-bottender-1.2.0-acf426fb-4401-4201-9696-d4b0bae7adb6-1581571697417/node_modules/bottender-express" "@hapi/joi" "^15.1.1" "@slack/rtm-api" "^5.0.3" arg "^4.1.1"