@geheimgang188/fmod-service-api
Version:
FMOD service API
268 lines • 25.1 kB
JavaScript
;
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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