mirror of
https://github.com/hexastack/hexabot
synced 2025-06-26 18:27:28 +00:00
fix: remove old way of handling extensions
This commit is contained in:
parent
357e058e65
commit
1fc58f4496
@ -4,10 +4,6 @@ WORKDIR /app
|
|||||||
|
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|
||||||
COPY merge-extensions-deps.js ./
|
|
||||||
|
|
||||||
COPY src/extensions ./src/extensions
|
|
||||||
|
|
||||||
COPY patches ./patches
|
COPY patches ./patches
|
||||||
|
|
||||||
RUN npm ci
|
RUN npm ci
|
||||||
@ -22,8 +18,6 @@ WORKDIR /app
|
|||||||
|
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|
||||||
COPY --from=builder /app/merge-extensions-deps.js ./
|
|
||||||
|
|
||||||
COPY --from=builder /app/src/extensions ./src/extensions
|
COPY --from=builder /app/src/extensions ./src/extensions
|
||||||
|
|
||||||
COPY --from=builder /app/patches ./patches
|
COPY --from=builder /app/patches ./patches
|
||||||
@ -44,8 +38,6 @@ WORKDIR /app
|
|||||||
|
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|
||||||
COPY --from=builder /app/merge-extensions-deps.js ./
|
|
||||||
|
|
||||||
COPY --from=builder /app/src/extensions ./src/extensions
|
COPY --from=builder /app/src/extensions ./src/extensions
|
||||||
|
|
||||||
COPY --from=builder /app/patches ./patches
|
COPY --from=builder /app/patches ./patches
|
||||||
|
@ -1,80 +0,0 @@
|
|||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
||||||
const fs = require('fs');
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
// Define the paths
|
|
||||||
const rootPackageJsonPath = path.join(__dirname, 'package.json');
|
|
||||||
const pluginsDir = path.join(__dirname, 'src', 'extensions', 'plugins');
|
|
||||||
const channelsDir = path.join(__dirname, 'src', 'extensions', 'channels');
|
|
||||||
const helpersDir = path.join(__dirname, 'src', 'extensions', 'helpers');
|
|
||||||
|
|
||||||
// Helper function to merge dependencies
|
|
||||||
function mergeDependencies(rootDeps, pluginDeps) {
|
|
||||||
return {
|
|
||||||
...rootDeps,
|
|
||||||
...Object.entries(pluginDeps).reduce((acc, [key, version]) => {
|
|
||||||
if (!rootDeps[key]) {
|
|
||||||
acc[key] = version;
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}, {}),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the root package.json
|
|
||||||
const rootPackageJson = JSON.parse(
|
|
||||||
fs.readFileSync(rootPackageJsonPath, 'utf-8'),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Initialize dependencies if not already present
|
|
||||||
if (!rootPackageJson.dependencies) {
|
|
||||||
rootPackageJson.dependencies = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate over extension directories
|
|
||||||
[
|
|
||||||
...fs.readdirSync(pluginsDir),
|
|
||||||
...fs.readdirSync(helpersDir),
|
|
||||||
...fs.readdirSync(channelsDir),
|
|
||||||
].forEach((pluginFolder) => {
|
|
||||||
const pluginPackageJsonPath = path.join(
|
|
||||||
pluginsDir,
|
|
||||||
pluginFolder,
|
|
||||||
'package.json',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (fs.existsSync(pluginPackageJsonPath)) {
|
|
||||||
const pluginPackageJson = JSON.parse(
|
|
||||||
fs.readFileSync(pluginPackageJsonPath, 'utf-8'),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Merge extension dependencies into root dependencies
|
|
||||||
if (pluginPackageJson.dependencies) {
|
|
||||||
rootPackageJson.dependencies = mergeDependencies(
|
|
||||||
rootPackageJson.dependencies,
|
|
||||||
pluginPackageJson.dependencies,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Merge extension devDependencies into root devDependencies
|
|
||||||
if (pluginPackageJson.devDependencies) {
|
|
||||||
rootPackageJson.devDependencies = mergeDependencies(
|
|
||||||
rootPackageJson.devDependencies,
|
|
||||||
pluginPackageJson.devDependencies,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Write the updated root package.json
|
|
||||||
fs.writeFileSync(
|
|
||||||
rootPackageJsonPath,
|
|
||||||
JSON.stringify(rootPackageJson, null, 2),
|
|
||||||
'utf-8',
|
|
||||||
);
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(
|
|
||||||
'Dependencies from extensions have been merged into the root package.json',
|
|
||||||
);
|
|
@ -6,7 +6,6 @@
|
|||||||
"author": "Hexastack",
|
"author": "Hexastack",
|
||||||
"license": "AGPL-3.0-only",
|
"license": "AGPL-3.0-only",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": "node merge-extensions-deps.js",
|
|
||||||
"postinstall": "patch-package",
|
"postinstall": "patch-package",
|
||||||
"build:clean": "rm -rf src/.hexabot",
|
"build:clean": "rm -rf src/.hexabot",
|
||||||
"build:channels": "mkdir -p src/.hexabot/channels && find node_modules/ -name 'hexabot-channel-*' -exec cp -R {} src/.hexabot/channels/ \\;",
|
"build:channels": "mkdir -p src/.hexabot/channels && find node_modules/ -name 'hexabot-channel-*' -exec cp -R {} src/.hexabot/channels/ \\;",
|
||||||
|
@ -94,7 +94,7 @@ export class BlockController extends BaseController<
|
|||||||
try {
|
try {
|
||||||
if (!pluginName) {
|
if (!pluginName) {
|
||||||
throw new BadRequestException(
|
throw new BadRequestException(
|
||||||
'Plugin id must be supplied as a query param',
|
'Plugin name must be supplied as a query param',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
import figlet from 'figlet';
|
import chalk from 'chalk';
|
||||||
import { Command } from 'commander';
|
|
||||||
import { execSync } from 'child_process';
|
import { execSync } from 'child_process';
|
||||||
|
import { Command } from 'commander';
|
||||||
|
import figlet from 'figlet';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import chalk from 'chalk';
|
|
||||||
import degit from 'degit';
|
|
||||||
|
|
||||||
console.log(figlet.textSync('Hexabot'));
|
console.log(figlet.textSync('Hexabot'));
|
||||||
|
|
||||||
@ -95,7 +94,7 @@ const dockerCompose = (args: string): void => {
|
|||||||
const dockerExec = (
|
const dockerExec = (
|
||||||
container: string,
|
container: string,
|
||||||
command: string,
|
command: string,
|
||||||
options?: string
|
options?: string,
|
||||||
): void => {
|
): void => {
|
||||||
try {
|
try {
|
||||||
execSync(`docker exec -it ${options} ${container} ${command}`, {
|
execSync(`docker exec -it ${options} ${container} ${command}`, {
|
||||||
@ -179,7 +178,11 @@ program
|
|||||||
.description('Run database migrations')
|
.description('Run database migrations')
|
||||||
.action((args) => {
|
.action((args) => {
|
||||||
const migrateArgs = args.join(' ');
|
const migrateArgs = args.join(' ');
|
||||||
dockerExec('api', `npm run migrate ${migrateArgs}`, '--user $(id -u):$(id -g)');
|
dockerExec(
|
||||||
|
'api',
|
||||||
|
`npm run migrate ${migrateArgs}`,
|
||||||
|
'--user $(id -u):$(id -g)',
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
program
|
program
|
||||||
@ -222,81 +225,6 @@ program
|
|||||||
dockerCompose(`${composeArgs} down -v`);
|
dockerCompose(`${composeArgs} down -v`);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add install command to install extensions (e.g., channels, plugins)
|
|
||||||
program
|
|
||||||
.command('install')
|
|
||||||
.description('Install an extension for Hexabot')
|
|
||||||
.argument('<type>', 'The type of extension (e.g., channel, plugin)')
|
|
||||||
.argument(
|
|
||||||
'<repository>',
|
|
||||||
'GitHub repository for the extension (user/repo format)',
|
|
||||||
)
|
|
||||||
.action(async (type, repository) => {
|
|
||||||
// Define the target folder based on the extension type
|
|
||||||
let targetFolder = '';
|
|
||||||
switch (type) {
|
|
||||||
case 'channel':
|
|
||||||
targetFolder = 'api/src/extensions/channels/';
|
|
||||||
break;
|
|
||||||
case 'plugin':
|
|
||||||
targetFolder = 'api/src/extensions/plugins/';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
console.error(chalk.red(`Unknown extension type: ${type}`));
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the last part of the repository name
|
|
||||||
const repoName = repository.split('/').pop();
|
|
||||||
|
|
||||||
// If the repo name starts with "hexabot-<TYPE>-", remove that prefix
|
|
||||||
const extensionName = repoName.startsWith(`hexabot-${type}-`)
|
|
||||||
? repoName.replace(`hexabot-${type}-`, '')
|
|
||||||
: repoName;
|
|
||||||
|
|
||||||
const extensionPath = path.resolve(
|
|
||||||
process.cwd(),
|
|
||||||
targetFolder,
|
|
||||||
extensionName,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Check if the extension folder already exists
|
|
||||||
if (fs.existsSync(extensionPath)) {
|
|
||||||
console.error(
|
|
||||||
chalk.red(`Error: Extension already exists at ${extensionPath}`),
|
|
||||||
);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
console.log(
|
|
||||||
chalk.cyan(`Fetching ${repository} into ${extensionPath}...`),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Use degit to fetch the repository without .git history
|
|
||||||
const emitter = degit(repository);
|
|
||||||
await emitter.clone(extensionPath);
|
|
||||||
|
|
||||||
console.log(chalk.cyan('Running npm install in the api/ folder...'));
|
|
||||||
// Run npm install in the api folder to install dependencies
|
|
||||||
execSync('npm run preinstall', {
|
|
||||||
cwd: path.resolve(process.cwd(), 'api'),
|
|
||||||
stdio: 'inherit',
|
|
||||||
});
|
|
||||||
execSync('npm install', {
|
|
||||||
cwd: path.resolve(process.cwd(), 'api'),
|
|
||||||
stdio: 'inherit',
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(
|
|
||||||
chalk.green(`Successfully installed ${extensionName} as a ${type}.`),
|
|
||||||
);
|
|
||||||
} catch (error) {
|
|
||||||
console.error(chalk.red('Error during installation:'), error);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Parse arguments
|
// Parse arguments
|
||||||
program.parse(process.argv);
|
program.parse(process.argv);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user