platformatic
Version:
Platformatic CLI
120 lines (109 loc) • 3.98 kB
JavaScript
import { command as client } from '@platformatic/client-cli'
import {
getRuntimesCommand,
injectRuntimeCommand,
runControl,
streamRuntimeLogsCommand
} from '@platformatic/control/control.js'
import { startCommand } from '@platformatic/runtime'
import { compile, run as runRuntime } from '@platformatic/runtime/runtime.mjs'
import { checkNodeVersionForServices } from '@platformatic/utils'
import { isColorSupported } from 'colorette'
import commist from 'commist'
import { join } from 'desm'
import helpMe from 'help-me'
import minimist from 'minimist'
import { readFile } from 'node:fs/promises'
import { createRequire } from 'node:module'
import path from 'node:path'
import { pathToFileURL } from 'node:url'
import { logo } from './lib/ascii.js'
import { build } from './lib/build.js'
import { install } from './lib/install.js'
import { patchConfig } from './lib/patch-config.js'
import { resolve } from './lib/resolve.js'
import { upgrade } from './lib/upgrade.js'
checkNodeVersionForServices()
const program = commist({ maxDistance: 2 })
const help = helpMe({
dir: join(import.meta.url, 'help'),
// the default
ext: '.txt'
})
async function load (moduleName) {
const require = createRequire(path.join(process.cwd(), 'package.json'))
const file = require.resolve(moduleName)
return import(pathToFileURL(file))
}
const ensureCommand = async ({ output, help }) => {
if (!output) {
return
}
if (output.length) {
console.log('Command not found:', output.join(' '), '\n')
}
await help.toStdout()
process.exit(1)
}
program.register('db', async args => {
const { runDB } = await load('@platformatic/db/db.mjs')
return ensureCommand(await runDB(args))
})
program.register('runtime', async args => ensureCommand(await runRuntime(args)))
program.register('service', async args => {
const { runService } = await load('@platformatic/service/service.mjs')
return ensureCommand(await runService(args))
})
program.register('composer', async args => {
const { runComposer } = await load('@platformatic/composer/composer.mjs')
return ensureCommand(await runComposer(args))
})
program.register('start', async args => ensureCommand(await startCommand(args)))
program.register('ctl', async args => ensureCommand(await runControl(args)))
program.register('ps', async args => getRuntimesCommand(args))
program.register('inject', async args => injectRuntimeCommand(args))
program.register('logs', async args => streamRuntimeLogsCommand(args))
program.register('upgrade', upgrade)
program.register('resolve', resolve)
program.register('patch-config', patchConfig)
program.register('client', client)
program.register('build', build)
program.register('install', install)
program.register('compile', async args => ((await compile(args)) ? null : process.exit(1)))
program.register('help', help.toStdout)
program.register('help db', async args => {
const { runDB } = await load('@platformatic/db/db.mjs')
return runDB(['help', ...args])
})
program.register('help client', () => client([]))
program.register('help runtime', async args => runRuntime(['help', ...args]))
program.register('help service', async args => {
const { runService } = await load('@platformatic/service/service.mjs')
return runService(['help', ...args])
})
const args = minimist(process.argv.slice(2), {
boolean: ['help', 'version'],
alias: {
help: 'h',
version: 'v'
}
})
if (args.version && !args._.includes('inject')) {
const version = JSON.parse(await readFile(join(import.meta.url, 'package.json'), 'utf-8')).version
console.log('v' + version)
process.exit(0)
}
if (args.help) {
await help.toStdout(['help'])
} else if (process.argv.length > 2) {
const output = await program.parseAsync(process.argv.slice(2))
await ensureCommand({ output, help })
/* c8 ignore start */
} else {
if (isColorSupported && process.stdout.isTTY) {
console.log(logo)
}
await help.toStdout(['help'])
}
/* c8 ignore stop */