353 lines
8.3 KiB
JavaScript
353 lines
8.3 KiB
JavaScript
//
|
|
//#region Imports ...
|
|
const XFileTools = require('../tools/x-file.tools');
|
|
const XValueTools = require('../tools/x-value.tools');
|
|
const XBaseDescriptor = require('./x-base.descriptor');
|
|
const XEnumDescriptor = require('./x-enum.descriptor');
|
|
const XTypeDescriptor = require('./x-type.descriptor');
|
|
const XClassDescriptor = require('./x-class.descriptor');
|
|
const XConstDescriptor = require('./x-const.descriptor');
|
|
const XImportDescriptor = require('./x-import.descriptor');
|
|
const XExportDescriptor = require('./x-export.descriptor');
|
|
const XInterfaceDescriptor = require('./x-interface.descriptor');
|
|
//#endregion
|
|
|
|
/**
|
|
* check an object instance is XFileDescriptor or not ...
|
|
*
|
|
* @param {any} object proposed object to check ...
|
|
* @returns
|
|
*/
|
|
function isDescriptor(object) {
|
|
//
|
|
if (!object) {
|
|
return false;
|
|
}
|
|
|
|
//
|
|
let result = false;
|
|
result =
|
|
Array.isArray(object.types) &&
|
|
object.hasOwnProperty('types') &&
|
|
//
|
|
Array.isArray(object.enums) &&
|
|
object.hasOwnProperty('enums') &&
|
|
//
|
|
Array.isArray(object.consts) &&
|
|
object.hasOwnProperty('consts') &&
|
|
//
|
|
Array.isArray(object.classes) &&
|
|
object.hasOwnProperty('classes') &&
|
|
//
|
|
Array.isArray(object.imports) &&
|
|
object.hasOwnProperty('imports') &&
|
|
//
|
|
Array.isArray(object.exports) &&
|
|
object.hasOwnProperty('exports') &&
|
|
//
|
|
Array.isArray(object.interfaces) &&
|
|
object.hasOwnProperty('interfaces');
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* retrieve base or filled XFileDescriptor object instance ...
|
|
*
|
|
* @param {any} value a value provider object ...
|
|
* @returns an instance of XFileDescriptor object ...
|
|
*/
|
|
function createDescriptor(value) {
|
|
//
|
|
let result = {
|
|
types: [XTypeDescriptor.createDescriptor()],
|
|
enums: [XEnumDescriptor.createDescriptor()],
|
|
consts: [XConstDescriptor.createDescriptor()],
|
|
classes: [XClassDescriptor.createDescriptor()],
|
|
imports: [XImportDescriptor.createDescriptor()],
|
|
exports: [XExportDescriptor.createDescriptor()],
|
|
interfaces: [XInterfaceDescriptor.createDescriptor()],
|
|
};
|
|
|
|
//
|
|
result.types.pop();
|
|
result.enums.pop();
|
|
result.consts.pop();
|
|
result.classes.pop();
|
|
result.imports.pop();
|
|
result.exports.pop();
|
|
result.interfaces.pop();
|
|
|
|
//
|
|
//#region Apply Value ...
|
|
if (value) {
|
|
//
|
|
//#region types ...
|
|
if (XValueTools.hasChildArray(value.types)) {
|
|
result.types = [
|
|
...value.types
|
|
];
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region enums ...
|
|
if (XValueTools.hasChildArray(value.enums)) {
|
|
result.enums = [
|
|
...value.enums
|
|
];
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region consts ...
|
|
if (XValueTools.hasChildArray(value.consts)) {
|
|
result.consts = [
|
|
...value.consts
|
|
];
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region classes ...
|
|
if (XValueTools.hasChildArray(value.classes)) {
|
|
result.classes = [
|
|
...value.classes
|
|
];
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region imports ...
|
|
if (XValueTools.hasChildArray(value.imports)) {
|
|
result.imports = [
|
|
...value.imports
|
|
];
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region exports ...
|
|
if (XValueTools.hasChildArray(value.exports)) {
|
|
result.exports = [
|
|
...value.exports
|
|
];
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region interfaces ...
|
|
if (XValueTools.hasChildArray(value.interfaces)) {
|
|
result.interfaces = [
|
|
...value.interfaces
|
|
];
|
|
}
|
|
//#endregion
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* converts an instance of Descriptor to Expression ...
|
|
*
|
|
* @param descriptor an instance of XFileDescriptor ...
|
|
* @returns creator string ...
|
|
*/
|
|
function toExpression(descriptor = createDescriptor()) {
|
|
//
|
|
let result = '';
|
|
|
|
//
|
|
// Validate Arg ...
|
|
if (!isDescriptor(descriptor)) {
|
|
return result;
|
|
}
|
|
|
|
//
|
|
//#region Imports ...
|
|
if (XValueTools.hasChildArray(descriptor.imports)) {
|
|
//
|
|
const expression = descriptor.imports
|
|
.map(d => XImportDescriptor
|
|
.toExpression(d)
|
|
).join('\n');
|
|
|
|
//
|
|
result += expression + '\n\n';
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region Enums ...
|
|
if (XValueTools.hasChildArray(descriptor.enums)) {
|
|
//
|
|
const expression = descriptor.enums
|
|
.map(d => XEnumDescriptor
|
|
.toExpression(d)
|
|
).join('\n');
|
|
|
|
//
|
|
result += expression + '\n\n';
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region Types ...
|
|
if (XValueTools.hasChildArray(descriptor.types)) {
|
|
//
|
|
const expression = descriptor.types
|
|
.map(d => XTypeDescriptor
|
|
.toExpression(d)
|
|
).join('\n');
|
|
|
|
//
|
|
result += expression + '\n\n';
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region Interfaces ...
|
|
if (XValueTools.hasChildArray(descriptor.interfaces)) {
|
|
//
|
|
const expression = descriptor.interfaces
|
|
.map(d => XInterfaceDescriptor
|
|
.toExpression(d)
|
|
).join('\n');
|
|
|
|
//
|
|
result += expression + '\n\n';
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region Consts ...
|
|
if (XValueTools.hasChildArray(descriptor.consts)) {
|
|
//
|
|
const expression = descriptor.consts
|
|
.map(d => XConstDescriptor
|
|
.toExpression(d)
|
|
).join('\n');
|
|
|
|
//
|
|
result += expression + '\n\n';
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region Classes ...
|
|
if (XValueTools.hasChildArray(descriptor.classes)) {
|
|
//
|
|
const expression = descriptor.classes
|
|
.map(d => XClassDescriptor
|
|
.toExpression(d)
|
|
).join('\n');
|
|
|
|
//
|
|
result += expression + '\n\n';
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
//#region Exports ...
|
|
if (XValueTools.hasChildArray(descriptor.exports)) {
|
|
//
|
|
const expression = descriptor.exports
|
|
.map(d => XExportDescriptor
|
|
.toExpression(d)
|
|
).join('\n');
|
|
|
|
//
|
|
result += expression + '\n\n';
|
|
}
|
|
//#endregion
|
|
|
|
//
|
|
if (XValueTools.endsWidth('\n', result)) {
|
|
result = result.substring(0, result.length - 1);
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* extract all exists XFileDescriptors ...
|
|
*
|
|
* @param {string} file a file path ...
|
|
* @returns a collection of XFileDescriptors ...
|
|
*/
|
|
async function extractDescriptor(file = '') {
|
|
//
|
|
let result = createDescriptor();
|
|
|
|
//
|
|
if (!XFileTools.isFileExists(file)) {
|
|
return undefined;
|
|
}
|
|
|
|
//
|
|
const fileContent = await XFileTools.readFile(file);
|
|
if (!XValueTools.isValidArg(fileContent)) {
|
|
return undefined;
|
|
}
|
|
|
|
//
|
|
result = extractDescriptorFromContent(fileContent);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* extract all exists XFileDescriptors ...
|
|
*
|
|
* @param {string} content a file content ...
|
|
* @returns a collection of XFileDescriptors ...
|
|
*/
|
|
function extractDescriptorFromContent(content = '') {
|
|
//
|
|
// Prepare result ...
|
|
let result = createDescriptor();
|
|
|
|
//
|
|
// Validate Args ...
|
|
if (!XValueTools.isValidArg(content)) {
|
|
return undefined;
|
|
}
|
|
|
|
//
|
|
const types = XTypeDescriptor.extractDescriptorsFromContent(content);
|
|
const enums = XEnumDescriptor.extractDescriptorsFromContent(content);
|
|
const consts = XConstDescriptor.extractDescriptorsFromContent(content);
|
|
const classes = XClassDescriptor.extractDescriptorsFromContent(content);
|
|
const exports = XExportDescriptor.extractDescriptorsFromContent(content);
|
|
const imports = XImportDescriptor.extractDescriptorsFromContent(content);
|
|
const interfaces = XInterfaceDescriptor.extractDescriptorsFromContent(content);
|
|
|
|
//
|
|
result = {
|
|
types,
|
|
enums,
|
|
consts,
|
|
imports,
|
|
exports,
|
|
classes,
|
|
interfaces,
|
|
};
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Module Exports ...
|
|
module.exports = {
|
|
//
|
|
isDescriptor,
|
|
toExpression,
|
|
createDescriptor,
|
|
extractDescriptor,
|
|
extractDescriptorFromContent,
|
|
} |