Files
xSaherElmClient/platforms/electron/modules/models/x-file.descriptor.js
T
2026-04-17 17:04:44 +03:30

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,
}