103 lines
3.6 KiB
TypeScript
103 lines
3.6 KiB
TypeScript
import * as plugins from '../../../plugins.js';
|
|
import { tspmIpcClient } from '../../../classes.ipcclient.js';
|
|
import type { IProcessConfig } from '../../../classes.tspm.js';
|
|
import type { CliArguments } from '../../types.js';
|
|
import { parseMemoryString, formatMemory } from '../../helpers/memory.js';
|
|
import { registerIpcCommand } from '../../registration/index.js';
|
|
|
|
export function registerStartCommand(smartcli: plugins.smartcli.Smartcli) {
|
|
registerIpcCommand(
|
|
smartcli,
|
|
'start',
|
|
async (argvArg: CliArguments) => {
|
|
const script = argvArg._[1];
|
|
if (!script) {
|
|
console.error('Error: Please provide a script to run');
|
|
console.log('Usage: tspm start <script> [options]');
|
|
console.log('\nOptions:');
|
|
console.log(' --name <name> Name for the process');
|
|
console.log(
|
|
' --memory <size> Memory limit (e.g., "512MB", "2GB")',
|
|
);
|
|
console.log(' --cwd <path> Working directory');
|
|
console.log(
|
|
' --watch Watch for file changes and restart',
|
|
);
|
|
console.log(' --watch-paths <paths> Comma-separated paths to watch');
|
|
console.log(' --autorestart Auto-restart on crash');
|
|
return;
|
|
}
|
|
|
|
const memoryLimit = argvArg.memory
|
|
? parseMemoryString(argvArg.memory)
|
|
: 512 * 1024 * 1024;
|
|
const projectDir = argvArg.cwd || process.cwd();
|
|
|
|
// Direct .ts support via tsx (bundled with TSPM)
|
|
let actualCommand = script;
|
|
let commandArgs: string[] | undefined = undefined;
|
|
|
|
if (script.endsWith('.ts')) {
|
|
try {
|
|
const tsxPath = await (async () => {
|
|
const { createRequire } = await import('module');
|
|
const require = createRequire(import.meta.url);
|
|
return require.resolve('tsx/dist/cli.mjs');
|
|
})();
|
|
|
|
const scriptPath = plugins.path.isAbsolute(script)
|
|
? script
|
|
: plugins.path.join(projectDir, script);
|
|
actualCommand = tsxPath;
|
|
commandArgs = [scriptPath];
|
|
} catch {
|
|
actualCommand = 'tsx';
|
|
commandArgs = [script];
|
|
}
|
|
}
|
|
|
|
const name = argvArg.name || script;
|
|
const watch = argvArg.watch || false;
|
|
const autorestart = argvArg.autorestart !== false; // default true
|
|
const watchPaths = argvArg.watchPaths
|
|
? typeof argvArg.watchPaths === 'string'
|
|
? (argvArg.watchPaths as string).split(',')
|
|
: argvArg.watchPaths
|
|
: undefined;
|
|
|
|
const processConfig: IProcessConfig = {
|
|
id: name.replace(/[^a-zA-Z0-9-_]/g, '_'),
|
|
name,
|
|
command: actualCommand,
|
|
args: commandArgs,
|
|
projectDir,
|
|
memoryLimitBytes: memoryLimit,
|
|
autorestart,
|
|
watch,
|
|
watchPaths,
|
|
};
|
|
|
|
console.log(`Starting process: ${name}`);
|
|
console.log(
|
|
` Command: ${script}${script.endsWith('.ts') ? ' (via tsx)' : ''}`,
|
|
);
|
|
console.log(` Directory: ${projectDir}`);
|
|
console.log(` Memory limit: ${formatMemory(memoryLimit)}`);
|
|
console.log(` Auto-restart: ${autorestart}`);
|
|
if (watch) {
|
|
console.log(` Watch mode: enabled`);
|
|
if (watchPaths) console.log(` Watch paths: ${watchPaths.join(', ')}`);
|
|
}
|
|
|
|
const response = await tspmIpcClient.request('start', {
|
|
config: processConfig,
|
|
});
|
|
console.log(`✓ Process started successfully`);
|
|
console.log(` ID: ${response.processId}`);
|
|
console.log(` PID: ${response.pid || 'N/A'}`);
|
|
console.log(` Status: ${response.status}`);
|
|
},
|
|
{ actionLabel: 'start process' },
|
|
);
|
|
}
|