UNPKG

mage-validator

Version:

Validation utility for MAGE user commands & topics (TypeScript)

78 lines 8.12 kB
"use strict"; 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==