skeet
Version:
Full-stack TypeScript Serverless Framework
122 lines (115 loc) • 3.73 kB
text/typescript
import { Logger } from '@/lib/logger'
import { importConfig } from '@/index'
import {
setupActions,
updateSkeetCloudConfig,
getWorkerConfig,
cloudRunDeploy,
syncRunUrl,
syncWorkerPluginUrl,
saveSkeetSolanaTransfer,
} from '@/cli'
import {
API_PATH,
getContainerRegion,
getPluginData,
ROUTE_PACKAGE_JSON_PATH,
} from '@/lib/getNetworkConfig'
import fs from 'fs'
import inquirer from 'inquirer'
import { skeetWorkerPluginList } from '@/lib/workerPluginList'
import { execSyncCmd } from '@/lib/execSyncCmd'
export const addWorkerPlugin = async (pluginName: string) => {
const skeetConfig = await importConfig()
const cRegion = await getContainerRegion(skeetConfig.api.region)
const isWorkerPlugin = true
const workerConf = await getWorkerConfig(pluginName)
const pluginInfo = await getPluginData(pluginName)
await updateSkeetCloudConfig(pluginName)
await addWorkerPluginToPackageJson(
pluginName,
cRegion,
String(pluginInfo.port)
)
await setupActions()
await cloudRunDeploy(
skeetConfig.api.projectId,
skeetConfig.api.appName,
skeetConfig.api.region,
workerConf.cloudRun.memory,
String(workerConf.cloudRun.cpu),
String(workerConf.cloudRun.maxConcurrency),
String(workerConf.cloudRun.maxInstances),
String(workerConf.cloudRun.minInstances),
pluginName,
isWorkerPlugin,
skeetConfig.api.hasLoadBalancer
)
await syncRunUrl()
await syncWorkerPluginUrl(pluginName)
const shCmd = ['yarn', 'add', `@skeet-framework/api-plugin-${pluginName}`]
await execSyncCmd(shCmd, API_PATH)
Logger.success(`Successfully created ${pluginName}!`)
}
export const addWorkerPluginToPackageJson = async (
pluginName: string,
cRegion: string,
port: string = '1112'
) => {
const packageJson = fs.readFileSync('./package.json')
const newPackageJson = JSON.parse(String(packageJson))
newPackageJson.scripts[
`skeet:${pluginName}`
] = `yarn rm:${pluginName}-container && yarn run:${pluginName}`
newPackageJson.scripts[
`rm:${pluginName}-container`
] = `docker rm -f skeet-worker-${pluginName}-dev`
newPackageJson.scripts[
`run:${pluginName}`
] = `docker run -p ${port}:${port} --name skeet-worker-${pluginName}-dev --env-file apps/api/.env ${cRegion}/skeet-framework/skeet-worker-${pluginName}-dev:latest`
fs.writeFileSync(
ROUTE_PACKAGE_JSON_PATH,
JSON.stringify(newPackageJson, null, 2)
)
Logger.success('Successfully Updated ./package.json!')
}
export const selectWorkerPlugin = async () => {
const workerPluginList = skeetWorkerPluginList.map((value) => value.name)
inquirer
.prompt([
{
type: 'list',
message: 'Select Services to deploy',
name: 'deploying',
choices: [new inquirer.Separator(' = Plugins = '), ...workerPluginList],
validate(answer) {
if (answer.length < 1) {
return 'You must choose at least one service.'
}
return true
},
},
])
.then(async (answers) => {
switch (answers.deploying) {
case 'solana-transfer':
await addWorkerPlugin(answers.deploying)
const yarnAddSolanaPlugin = [
'yarn',
'add',
'@skeet-framework/api-plugin-solana-transfer',
]
await execSyncCmd(yarnAddSolanaPlugin, API_PATH)
await addSolanaResponse()
break
default:
await Logger.sync('Coming soon!')
break
}
})
}
const addSolanaResponse = async () => {
const fileData = await saveSkeetSolanaTransfer()
fs.writeFileSync(fileData.filePath, JSON.stringify(fileData.body, null, 2))
await Logger.success(`Successfully added ${fileData.filePath}`)
}