beyond
Version:
The Full Stack Universal Typescript Framework
150 lines (127 loc) • 4.51 kB
JavaScript
require('colors');
const p = require('path');
const { fs, crc32 } = global.utils;
module.exports = function (ipc) {
const getPath = async applicationId => {
let appData = await ipc.exec('applications/get', [applicationId]);
appData = appData[applicationId];
return appData.path;
};
this.create = async params => {
try {
const { cwd, projectId } = params;
const projectPath = cwd ?? (await getPath(projectId));
if (!projectPath) return { status: 'ok', error: 'package.json file not found' };
const { Project, Module } = require('./models');
const project = new Project(projectPath);
await project.load();
const tplPath = await project.templatesPath();
if (!(await fs.exists(tplPath))) {
return { status: false, error: `${await project.templatesPackage()} package not installed.` };
}
if (!project._exists) return { status: 'ok', error: 'package.json file not found' };
const isLayout = !!params.bundles.includes('layout');
const name = isLayout ? `layouts/${params.name}` : params.name;
const module = new Module(p.join(project.modules.path, name));
if (module.exists) {
return { status: 'ok', error: 'The module already exists' };
}
await module.load();
await module.create(params);
/**
* Activate the ts compiler to generate the .d.ts file of the module
* This option only applies to creating modules from the workspace
* because it must be running in the same process as the devServer
*/
const process = () => {
const split = project.path.split('\\');
split.pop();
const id = `application//${crc32(split.join('\\'))}//${params.name}`;
ipc.exec('modules/declarations/update', { id });
};
!params.noDeclaration && setTimeout(process, 1000);
return { status: 'ok', data: true };
} catch (exc) {
console.error(exc);
return { error: exc.message };
}
};
this.clone = async params => {
const appId = params.moduleId.split('//')[1];
let application = await ipc.exec('applications/get', [appId]);
application = application[appId];
let module = await ipc.exec('modules/get', [params.moduleId]);
module = module[params.moduleId];
const current = module.path;
const toCreate = p.join(application.modulesPath, params.name);
try {
if (!(await fs.exists(current))) {
console.error({ error: true, code: 'FILE_NOT_FOUND' });
return { error: true, code: 'FILE_NOT_FOUND' };
}
await fs.copy(current, toCreate);
const { Module } = require('../builder/models');
const module = new Module(toCreate);
await module.save({ name: params.name });
return { status: true };
} catch (e) {
return { error: true, code: e };
}
};
this.edit = async params => {
try {
const id = params.id || params.moduleId;
if (!id) {
return { status: false, error: 'the "id" param is required' };
}
let data = await ipc.exec('modules/get', [id]);
data = data[id];
const { Module } = require('./models');
const module = new Module(data.path);
await module.load();
if (params.static) {
const includes = module.static?.includes ? module.static.includes : [];
!includes.includes(params.static.path) && (params.static = { includes: [params.static.path] });
}
delete params.moduleId;
await module.save(params);
return { status: true, data };
} catch (e) {
console.error(e);
return { status: false, error: e.message };
}
};
this.addBundle = async params => {
try {
let data = await ipc.exec('modules/get', [params.moduleId]);
data = data[params.moduleId];
const { Module } = require('./models');
const module = new Module(data.path);
await module.load();
await module.bundles.add(params);
await module.bundles.build();
await module.save();
return { status: 'ok', data: true };
} catch (e) {
return { status: false, error: e.message };
}
};
this.install = async params => {
if (!Array.isArray(params)) return { error: 'PARAMS_NOT_VALID' };
const dependencies = params.join(', ');
return new Promise((resolve, reject) => {
const { exec } = require('child_process');
exec(
'npm install',
{
cwd: dependencies,
},
(error, stdout, stderr) => {
error && console.error('error', error);
stderr && console.error('stderr', stderr);
resolve();
}
);
});
};
};