mage-validator
Version:
Validation utility for MAGE user commands & topics (TypeScript)
78 lines • 8.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const mage = require("mage");
const path = require("path");
const errors_1 = require("./errors");
/**
* Throw only if the error is not "file/folder not found"
*/
function throwIfNotFileNotFoundError(error) {
if (error.code !== 'ENOENT') {
throw error;
}
}
/**
* Load topics from each module's 'topics' folder
*
* This function is a helper you will use in your project's
* `lib/archivist/index.js` file, as follow:
*
* ```typescript
* import { loadTopicsFromModules } from 'mage-validator'
*
* loadTopicsFromModules(exports)
* ```
*
* This will:
*
* - Find all your projetc's modules
* - For each module folders, check if there is a `topics` folder
* - When a `topics` folder is found, require each file in it
* - Add the content of the require to exports[fileNameWithoutJSExtension]
*/
function loadTopicsFromModules(exports) {
const modules = mage.listModules();
for (const moduleName of modules) {
loadTopicsFromModule(exports, moduleName);
}
}
exports.loadTopicsFromModules = loadTopicsFromModules;
/**
* Load topics defined in a single module
*/
function loadTopicsFromModule(archivistExports, moduleName) {
const modulePath = mage.getModulePath(moduleName);
const moduleTopicsPath = path.join(modulePath, 'topics');
try {
fs.readdirSync(moduleTopicsPath).forEach(function (topicFileName) {
const topicPath = path.join(moduleTopicsPath, topicFileName);
const topicPathInfo = path.parse(topicPath);
const topicName = topicPathInfo.name;
// Skip all files but TypeScript source files
if (topicPathInfo.ext !== '.ts') {
return;
}
if (archivistExports[topicName]) {
throw errors_1.crash('Topic is already defined!', {
alreadySetByModule: archivistExports[topicName]._module,
module: moduleName,
topic: topicName,
});
}
// Add topic to the export of lib/archivist/index.ts
const topic = archivistExports[topicName] = require(topicPath).default;
topic._module = moduleName;
// No explicit class name defined; we assign the name of the file as
// the class name used internally within the topic's methods
if (topic.getClassName().substring(0, 8) === 'default_') {
topic.setClassName(topicName);
}
});
}
catch (error) {
throwIfNotFileNotFoundError(error);
}
}
exports.loadTopicsFromModule = loadTopicsFromModule;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlCQUF3QjtBQUN4Qiw2QkFBNEI7QUFDNUIsNkJBQTRCO0FBRTVCLHFDQUFnQztBQUVoQzs7R0FFRztBQUNILHFDQUFxQyxLQUE0QjtJQUMvRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzNCLE1BQU0sS0FBSyxDQUFBO0tBQ1o7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILCtCQUFzQyxPQUFZO0lBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNsQyxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sRUFBRTtRQUNoQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUE7S0FDMUM7QUFDSCxDQUFDO0FBTEQsc0RBS0M7QUFFRDs7R0FFRztBQUNILDhCQUFxQyxnQkFBcUIsRUFBRSxVQUFrQjtJQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFeEQsSUFBSTtRQUNGLEVBQUUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxhQUFhO1lBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDNUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMzQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFBO1lBRXBDLDZDQUE2QztZQUM3QyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFO2dCQUMvQixPQUFNO2FBQ1A7WUFFRCxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUMvQixNQUFNLGNBQUssQ0FBQywyQkFBMkIsRUFBRTtvQkFDdkMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTztvQkFDdkQsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLEtBQUssRUFBRSxTQUFTO2lCQUNqQixDQUFDLENBQUE7YUFDSDtZQUVELG9EQUFvRDtZQUNwRCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFBO1lBQ3RFLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFBO1lBRTFCLG9FQUFvRTtZQUNwRSw0REFBNEQ7WUFDNUQsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQUU7Z0JBQ3ZELEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7YUFDOUI7UUFDSCxDQUFDLENBQUMsQ0FBQTtLQUNIO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCwyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtLQUNuQztBQUNILENBQUM7QUFwQ0Qsb0RBb0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgKiBhcyBtYWdlIGZyb20gJ21hZ2UnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnXG5cbmltcG9ydCB7IGNyYXNoIH0gZnJvbSAnLi9lcnJvcnMnXG5cbi8qKlxuICogVGhyb3cgb25seSBpZiB0aGUgZXJyb3IgaXMgbm90IFwiZmlsZS9mb2xkZXIgbm90IGZvdW5kXCJcbiAqL1xuZnVuY3Rpb24gdGhyb3dJZk5vdEZpbGVOb3RGb3VuZEVycm9yKGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pIHtcbiAgaWYgKGVycm9yLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgdG9waWNzIGZyb20gZWFjaCBtb2R1bGUncyAndG9waWNzJyBmb2xkZXJcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgaGVscGVyIHlvdSB3aWxsIHVzZSBpbiB5b3VyIHByb2plY3Qnc1xuICogYGxpYi9hcmNoaXZpc3QvaW5kZXguanNgIGZpbGUsIGFzIGZvbGxvdzpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBsb2FkVG9waWNzRnJvbU1vZHVsZXMgfSBmcm9tICdtYWdlLXZhbGlkYXRvcidcbiAqXG4gKiBsb2FkVG9waWNzRnJvbU1vZHVsZXMoZXhwb3J0cylcbiAqIGBgYFxuICpcbiAqIFRoaXMgd2lsbDpcbiAqXG4gKiAgIC0gRmluZCBhbGwgeW91ciBwcm9qZXRjJ3MgbW9kdWxlc1xuICogICAtIEZvciBlYWNoIG1vZHVsZSBmb2xkZXJzLCBjaGVjayBpZiB0aGVyZSBpcyBhIGB0b3BpY3NgIGZvbGRlclxuICogICAtIFdoZW4gYSBgdG9waWNzYCBmb2xkZXIgaXMgZm91bmQsIHJlcXVpcmUgZWFjaCBmaWxlIGluIGl0XG4gKiAgIC0gQWRkIHRoZSBjb250ZW50IG9mIHRoZSByZXF1aXJlIHRvIGV4cG9ydHNbZmlsZU5hbWVXaXRob3V0SlNFeHRlbnNpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkVG9waWNzRnJvbU1vZHVsZXMoZXhwb3J0czogYW55KSB7XG4gIGNvbnN0IG1vZHVsZXMgPSBtYWdlLmxpc3RNb2R1bGVzKClcbiAgZm9yIChjb25zdCBtb2R1bGVOYW1lIG9mIG1vZHVsZXMpIHtcbiAgICBsb2FkVG9waWNzRnJvbU1vZHVsZShleHBvcnRzLCBtb2R1bGVOYW1lKVxuICB9XG59XG5cbi8qKlxuICogTG9hZCB0b3BpY3MgZGVmaW5lZCBpbiBhIHNpbmdsZSBtb2R1bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRUb3BpY3NGcm9tTW9kdWxlKGFyY2hpdmlzdEV4cG9ydHM6IGFueSwgbW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IG1vZHVsZVBhdGggPSBtYWdlLmdldE1vZHVsZVBhdGgobW9kdWxlTmFtZSlcbiAgY29uc3QgbW9kdWxlVG9waWNzUGF0aCA9IHBhdGguam9pbihtb2R1bGVQYXRoLCAndG9waWNzJylcblxuICB0cnkge1xuICAgIGZzLnJlYWRkaXJTeW5jKG1vZHVsZVRvcGljc1BhdGgpLmZvckVhY2goZnVuY3Rpb24gKHRvcGljRmlsZU5hbWUpIHtcbiAgICAgIGNvbnN0IHRvcGljUGF0aCA9IHBhdGguam9pbihtb2R1bGVUb3BpY3NQYXRoLCB0b3BpY0ZpbGVOYW1lKVxuICAgICAgY29uc3QgdG9waWNQYXRoSW5mbyA9IHBhdGgucGFyc2UodG9waWNQYXRoKVxuICAgICAgY29uc3QgdG9waWNOYW1lID0gdG9waWNQYXRoSW5mby5uYW1lXG5cbiAgICAgIC8vIFNraXAgYWxsIGZpbGVzIGJ1dCBUeXBlU2NyaXB0IHNvdXJjZSBmaWxlc1xuICAgICAgaWYgKHRvcGljUGF0aEluZm8uZXh0ICE9PSAnLnRzJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGFyY2hpdmlzdEV4cG9ydHNbdG9waWNOYW1lXSkge1xuICAgICAgICB0aHJvdyBjcmFzaCgnVG9waWMgaXMgYWxyZWFkeSBkZWZpbmVkIScsIHtcbiAgICAgICAgICBhbHJlYWR5U2V0QnlNb2R1bGU6IGFyY2hpdmlzdEV4cG9ydHNbdG9waWNOYW1lXS5fbW9kdWxlLFxuICAgICAgICAgIG1vZHVsZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICB0b3BpYzogdG9waWNOYW1lLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG9waWMgdG8gdGhlIGV4cG9ydCBvZiBsaWIvYXJjaGl2aXN0L2luZGV4LnRzXG4gICAgICBjb25zdCB0b3BpYyA9IGFyY2hpdmlzdEV4cG9ydHNbdG9waWNOYW1lXSA9IHJlcXVpcmUodG9waWNQYXRoKS5kZWZhdWx0XG4gICAgICB0b3BpYy5fbW9kdWxlID0gbW9kdWxlTmFtZVxuXG4gICAgICAvLyBObyBleHBsaWNpdCBjbGFzcyBuYW1lIGRlZmluZWQ7IHdlIGFzc2lnbiB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhc1xuICAgICAgLy8gdGhlIGNsYXNzIG5hbWUgdXNlZCBpbnRlcm5hbGx5IHdpdGhpbiB0aGUgdG9waWMncyBtZXRob2RzXG4gICAgICBpZiAodG9waWMuZ2V0Q2xhc3NOYW1lKCkuc3Vic3RyaW5nKDAsIDgpID09PSAnZGVmYXVsdF8nKSB7XG4gICAgICAgIHRvcGljLnNldENsYXNzTmFtZSh0b3BpY05hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvd0lmTm90RmlsZU5vdEZvdW5kRXJyb3IoZXJyb3IpXG4gIH1cbn1cbiJdfQ==