150 lines
11 KiB
JavaScript
150 lines
11 KiB
JavaScript
import { exec } from 'child_process';
|
|
import { promisify } from 'util';
|
|
import { logger } from '../../index.js';
|
|
import pMap from "p-map";
|
|
import { sync as exists } from '@polymech/fs/exists';
|
|
import { toolLogger } from '../../index.js';
|
|
const execAsync = promisify(exec);
|
|
const install = async (dependency, directory) => {
|
|
return new Promise((resolve, reject) => {
|
|
const command = `pnpm add ${dependency} --dir ${directory}`;
|
|
exec(command, (error, stdout, stderr) => {
|
|
if (error) {
|
|
logger.error(`Error installing ${dependency}:`, error.message);
|
|
return resolve(false);
|
|
}
|
|
logger.info(`Successfully installed "${dependency}" in "${directory}".`);
|
|
});
|
|
});
|
|
};
|
|
export const tools = (target, options) => {
|
|
const logger = toolLogger('npm', options);
|
|
return [
|
|
{
|
|
type: 'function',
|
|
function: {
|
|
name: 'build_project',
|
|
description: 'Build project using pnpm build command',
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {},
|
|
required: []
|
|
},
|
|
function: async () => {
|
|
try {
|
|
logger.debug(`Tool::BuildProject Building project at ${target}`);
|
|
const { stdout, stderr } = await execAsync('pnpm build', {
|
|
cwd: target
|
|
});
|
|
return {
|
|
success: !stderr,
|
|
output: stdout,
|
|
error: stderr || null
|
|
};
|
|
}
|
|
catch (error) {
|
|
logger.error('Error building project', error);
|
|
return {
|
|
success: false,
|
|
output: null,
|
|
error: error.message
|
|
};
|
|
}
|
|
},
|
|
parse: JSON.parse
|
|
}
|
|
},
|
|
{
|
|
type: 'function',
|
|
function: {
|
|
name: 'run_npm',
|
|
description: 'Run an npm/pnpm command',
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
command: { type: 'string', description: 'Command to run (e.g. install, test, etc)' },
|
|
args: {
|
|
type: 'array',
|
|
items: { type: 'string' },
|
|
description: 'Additional arguments for the command',
|
|
optional: true
|
|
}
|
|
},
|
|
required: ['command']
|
|
},
|
|
function: async (params) => {
|
|
try {
|
|
const args = params.args ? params.args.join(' ') : '';
|
|
const fullCommand = `pnpm ${params.command} ${args}`.trim();
|
|
logger.debug(`Tool::RunNpm Running command: ${fullCommand}`);
|
|
const { stdout, stderr } = await execAsync(fullCommand, {
|
|
cwd: target
|
|
});
|
|
return {
|
|
success: !stderr,
|
|
output: stdout,
|
|
error: stderr || null
|
|
};
|
|
}
|
|
catch (error) {
|
|
logger.error('Error running npm command', error);
|
|
return {
|
|
success: false,
|
|
output: null,
|
|
error: error.message
|
|
};
|
|
}
|
|
},
|
|
parse: JSON.parse
|
|
}
|
|
},
|
|
{
|
|
type: 'function',
|
|
function: {
|
|
name: "install_dependency",
|
|
description: "Install a dependency using npm",
|
|
parameters: {
|
|
type: "object",
|
|
properties: {
|
|
dependencies: {
|
|
type: "array",
|
|
items: {
|
|
type: "string"
|
|
}
|
|
}
|
|
},
|
|
required: ["dependencies"],
|
|
},
|
|
function: async (ret) => {
|
|
try {
|
|
const { dependencies } = ret;
|
|
if (!target) {
|
|
logger.error(`Tool::NPM Target is required to install dependencies`);
|
|
return;
|
|
}
|
|
if (!exists(target)) {
|
|
logger.error(`Project doesnt path exists ${target}`);
|
|
return;
|
|
}
|
|
await pMap(dependencies, (async (dependency) => {
|
|
logger.info(`Installing dependency`, dependency);
|
|
try {
|
|
return install(dependency, target);
|
|
}
|
|
catch (error) {
|
|
logger.error(`Error installing dependency ${dependency} `, error);
|
|
}
|
|
}), {
|
|
concurrency: 1
|
|
});
|
|
}
|
|
catch (error) {
|
|
logger.error(`Error installing dependencies`, error);
|
|
}
|
|
},
|
|
parse: JSON.parse,
|
|
}
|
|
}
|
|
];
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90b29scy9ucG0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN2QyxPQUFPLElBQUksTUFBTSxPQUFPLENBQUE7QUFDeEIsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUVwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFM0MsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2pDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxVQUFrQixFQUFFLFNBQWlCLEVBQWdCLEVBQUU7SUFDMUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxNQUFNLE9BQU8sR0FBRyxZQUFZLFVBQVUsVUFBVSxTQUFTLEVBQUUsQ0FBQTtRQUMzRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNwQyxJQUFJLEtBQUssRUFBRTtnQkFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixVQUFVLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQzlELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQ3hCO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsVUFBVSxTQUFTLFNBQVMsSUFBSSxDQUFDLENBQUE7UUFDNUUsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUNE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
|