UNPKG

@geheimgang188/fmod-service-api

Version:
268 lines 25.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.FmodCodegen = void 0; const fs = __importStar(require("fs")); const naming_tools_1 = require("./naming-tools"); const fmod_event_type_1 = require("./interfaces/fmod-event-type"); class FmodCodegen { constructor(data, options) { this._importFrom = '@geheimgang188/fmod-service-api'; this._data = data; this._options = options; } /** * Overrides the default import location. * @param path Defaults to the module name. */ importFrom(path) { this._importFrom = path; return this; } generateTo(mainName, destPath) { const code = this.generate(mainName); console.log(`Writing generated API to ${destPath}`); fs.writeFileSync(destPath, code); } generate(mainName) { var _a; const allData = []; const eventData = []; const globalParamsData = []; for (const bank of this._data.banks) { for (const event of bank.events) { const paramData = []; for (const param of event.params) { paramData.push(this.generateLocalParamCode(param, event)); } const eventCode = this.generateEventCode(event, bank, paramData); eventData.push(eventCode); allData.push(...paramData); allData.push(eventCode); } } for (const param of (_a = this._data.globalParameters) !== null && _a !== void 0 ? _a : []) { globalParamsData.push(this.generateGlobalParamCode(param)); } allData.push(...globalParamsData); const mainClass = this.generateMainCode(mainName, eventData, globalParamsData); const codeElements = [ this.generateIncludes(), mainClass, ]; codeElements.push(...allData.map(el => el.code)); return codeElements.join('\n\n'); } generateIncludes() { var _a; const customIncludeList = []; if (((_a = this._options) === null || _a === void 0 ? void 0 : _a.projectDataType) !== undefined) { customIncludeList.push(this._options.projectDataType.importInstruction); } return this.loadTemplate('includes') .replaceAll('\'../../index\'', `'${this._importFrom}'`) .replaceAll('\'../../api/i-logger\'', `'${this._importFrom}'`) .replaceAll(/'..\/..\/ports\/.*'/g, `'${this._importFrom}'`) .replace('// CUSTOM_INCLUDES', customIncludeList.join('\n')); } generateMainCode(mainName, eventData, globalParamData) { var _a, _b, _c; const names = naming_tools_1.NamingTools.generateClassNames(mainName); const s4 = this.createSpacer(4); const s8 = this.createSpacer(8); const eventDefinitions = []; const eventInitialisation = []; const eventRegistration = []; const globalParamDefs = []; const globalParamRegistration = []; eventData.forEach((event, ix) => { eventDefinitions.push(`${s4(ix)}${event.memberName}: ${event.className};`); eventInitialisation.push(`${s8(ix)}this.${event.memberName} = new ${event.className}( logger );`); eventRegistration.push(`${s8(1)}this.registerEvent( this.${event.memberName} );`); if (event.memberName !== event.originalName) { eventDefinitions.push(`${s4(1)}'${event.originalName}': ${event.className};`); eventInitialisation.push(`${s8(1)}this['${event.originalName}'] = this.${event.memberName};`); } }); globalParamData.forEach((param, ix) => { globalParamDefs.push(`${s8(ix)}${param.memberName}: new ${param.className}(),`); globalParamRegistration.push(`${s8(1)}this.registerGlobalParam( this.globalParameters.${param.memberName} );`); }); let localise = '// (no localised banks)'; if (this._data.localisation !== undefined) { const localisedBanks = this._data.banks .filter(el => el.localised) .map(el => `'${el.bankName}'`) .join(', '); const languages = this._data.localisation.languages .map(el => `'${el}'`) .join(', '); localise = `this.configureLocalisation( [ ${localisedBanks} ], [ ${languages} ], '${this._data.localisation.defaultLanguage}' );`; } const globalParams = globalParamDefs.length > 0 ? globalParamDefs.join('\n') : '// No global parameters.'; const constructor = eventInitialisation .concat(eventRegistration) .concat(globalParamRegistration) .join('\n'); const projectDataType = (_c = (_b = (_a = this._options) === null || _a === void 0 ? void 0 : _a.projectDataType) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : 'IFmodProject'; const eslintIgnores = ' // eslint-disable-line quotes, object-curly-spacing'; const projectRawData = `public readonly rawProjectData: ${projectDataType} = ${JSON.stringify(this._data)} as ${projectDataType};${eslintIgnores}`; return this.loadTemplate('main', names) .replace('/* PROJECT_DATA_TYPE */', `<${projectDataType}>`) .replace('// RAW_PROJECT_DATA', projectRawData) .replace('// EVENT_DEF', eventDefinitions.join('\n')) .replace('// LOCALISE', localise) .replace('// GLOBAL_PARAMS', globalParams) .replace('// CONSTRUCTOR', constructor); } generateEventCode(event, bank, paramData) { var _a, _b; const names = naming_tools_1.NamingTools.generateClassNames(event.name); const s4 = this.createSpacer(4); const s8 = this.createSpacer(8); const s12 = this.createSpacer(12); const parameterDefinitions = []; const parameterInitialisation = []; const parameterList = []; paramData.forEach((el, ix) => { parameterDefinitions.push(`${s4(ix)}${el.memberName}: ${el.className};`); parameterInitialisation.push(`${s8(ix)}this.${el.memberName} = new ${el.className}();`); parameterList.push(`${s12(ix)}this.${el.memberName},`); if (el.memberName !== el.originalName) { parameterDefinitions.push(`${s4(1)}'${el.originalName}': ${el.className};`); parameterInitialisation.push(`${s8(1)}this['${el.originalName}'] = this.${el.memberName};`); } }); const useOrDefault = (text, defaultValue) => text.length > 0 ? text : defaultValue; let eventTypeKey = 'event'; if (event.eventType !== undefined) { for (const [k, v] of Object.entries(fmod_event_type_1.FmodEventType)) { if (v === event.eventType) { eventTypeKey = k; } } } const code = this.loadTemplate('event', names) .replace('EVENT_NAME', `${event.name}`) .replace('EVENT_TYPE', `FmodEventType.${eventTypeKey}`) .replace('BANK_NAME', `${bank.bankName}`) .replace('\'ADDITIONAL_BANKS\'', `${(_b = (_a = event.requiresOtherBanks) === null || _a === void 0 ? void 0 : _a.map(el => `'${el}'`).join(', ')) !== null && _b !== void 0 ? _b : ''}`) .replace('// PARAM_LIST', useOrDefault(parameterList.join('\n'), '// No Parameters')) .replace('// PARAM_DEF', useOrDefault(parameterDefinitions.join('\n'), '// No definitions')) .replace('// CONSTRUCTOR', useOrDefault(parameterInitialisation.join('\n'), '// Nothing to construct')); return { code, originalName: event.name, className: names.className, memberName: names.memberName, }; } generateGlobalParamCode(param) { const names = naming_tools_1.NamingTools.generateClassNames(param.name, 'Global'); return this.generateParamCode(param, 'global', names); } generateLocalParamCode(param, event) { const names = naming_tools_1.NamingTools.generateClassNames(param.name, event.name); return this.generateParamCode(param, `event:/${event.name}`, names); } generateParamCode(param, path, names) { var _a; let templateName; switch (param.type) { case 'continuous': templateName = 'param-continuous'; break; case 'labeled': templateName = 'param-labeled'; break; default: throw new Error(`Unhandled type: ${param.type}`); } let code = this.loadTemplate(templateName, names) .replaceAll('PARAM_NAME', param.name) .replaceAll('EVENT_ID', path) .replaceAll('DEFAULT_VALUE', `${(_a = param.defaultValue) !== null && _a !== void 0 ? _a : 0}`); const s4 = this.createSpacer(4); if (param.type === 'labeled') { const labeledParam = param; const labels = labeledParam.labels .map((el, ix) => `${s4(ix)}'${el.name}': ${el.value},`) .join('\n'); code = code.replace('// LABELS', labels); } return { code, originalName: param.name, className: names.className, memberName: names.memberName, }; } loadTemplate(name, names) { const rawTemplate = fs.readFileSync(__dirname + `/../../../src/api-generator/templates/${name}.template.ts`, { encoding: 'utf-8' }); const lines = rawTemplate.split('\n'); let include = false; let data = lines.filter((line) => { if (!include) { if (line === '// begin-template') { include = true; } return false; } else { if (line === '// end-template') { include = false; return false; } return true; } }).join('\n'); if (names !== undefined) { data = data.replaceAll('CLASSNAME', names.className); } return data; } /** * Creates a spacer function for the given indent. The spacer function takes one argument; * if it is > 0, the indent is not added, otherwise it is. * * This is used for replacing in templates where the search string is usually already indented, * so only the following lines need indentation. */ createSpacer(length) { return (ix) => ix > 0 ? new Array(length).fill(' ').join('') : ''; } } exports.FmodCodegen = FmodCodegen; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZC1jb2RlZ2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nZW5lcmF0b3IvZm1vZC1jb2RlZ2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QixpREFBd0Q7QUFFeEQsa0VBQTZEO0FBbUI3RCxNQUFhLFdBQVc7SUFLcEIsWUFBYSxJQUFrQixFQUFFLE9BQTRCO1FBRnJELGdCQUFXLEdBQUcsaUNBQWlDLENBQUM7UUFHcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBRSxJQUFZO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUUsUUFBZ0IsRUFBRSxRQUFnQjtRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFFLFFBQVEsQ0FBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUUsNEJBQTRCLFFBQVEsRUFBRSxDQUFFLENBQUM7UUFDdEQsRUFBRSxDQUFDLGFBQWEsQ0FBRSxRQUFRLEVBQUUsSUFBSSxDQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELFFBQVEsQ0FBRSxRQUFnQjs7UUFFdEIsTUFBTSxPQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBZ0IsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQWdCLEVBQUUsQ0FBQztRQUV6QyxLQUFNLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFHLENBQUM7WUFFcEMsS0FBTSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFHLENBQUM7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