bobflux-gen
Version:
Generator for monkey files in bobflux application.
92 lines (91 loc) • 6.06 kB
JavaScript
;
var g = require("./generator");
var nameUnifier = require("./nameUnifier");
var pathPlatformDependent = require("path");
var path = pathPlatformDependent.posix; // This works everythere, just use forward slashes
var defaultLibFilename = path.join(path.dirname(require.resolve("typescript").replace(/\\/g, '/')), "lib.es6.d.ts");
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = function (project, tsAnalyzer, logger, rootStateKey) {
if (rootStateKey === void 0) { rootStateKey = null; }
return {
run: function () { return runBase(false, project, tsAnalyzer, logger, rootStateKey); },
runRecurse: function () { return runBase(true, project, tsAnalyzer, logger, rootStateKey); }
};
};
function runBase(applyRecurse, project, tsAnalyzer, logger, rootStateKey) {
var writeCallback = function (fn, c) { project.writeFileCallback(fn, new Buffer(c, 'utf-8')); };
function writeCursors(params, currentStateName, rootStateKey) {
var stateFilePath = params.stateFilePath;
var mainState = g.resolveState(params.data.states, currentStateName);
if (!mainState)
return;
var stateAlias = g.createUnusedAlias(g.stateImportKey, params.data.imports);
var bobfluxPrefix = g.resolveBobfluxPrefix(mainState);
logger.info('Generating has been started for: ', stateFilePath);
writeCallback(createCursorsFilePath(stateFilePath), g.createAutogeneratedHeader(project.version)
+ g.createFullImports(stateAlias, "./" + params.data.fileName, params.data.imports)
+ createCursorsForStateFields(params, rootStateKey, params.data, stateAlias + "." + mainState.typeName, mainState, bobfluxPrefix, stateAlias));
logger.info('Generating ended for: ', stateFilePath);
}
function createCursorsForStateFields(params, parentStateKey, data, mainStateTypeName, state, bobfluxPrefix, stateAlias, prefix) {
if (prefix === void 0) { prefix = null; }
var nexts = [];
var inner = state.fields.map(function (f) {
var key = parentStateKey === null ? g.composeCursorKey(parentStateKey, prefix, f.name) : g.composeCursorKey(prefix, f.name);
if (applyRecurse && f.type.length == 1 && !f.type[0].isArray && g.isExternalState(f.type[0].name, data)) {
var alias = g.getExternalAlias(f.type[0].name, data);
var innerFilePath = path.join(path.dirname(data.filePath), alias.relativePath + '.ts');
var innerSourceFile = g.resolveSourceFile(params.sourceFiles, innerFilePath);
if (innerSourceFile) {
var innerData = tsAnalyzer.getSourceData(innerSourceFile, params.typeChecker);
var innerResolvedState = g.resolveState(innerData.states, alias.sourceType);
if (innerResolvedState)
writeCursors({
stateFilePath: innerSourceFile.path,
data: tsAnalyzer.getSourceData(innerSourceFile, params.typeChecker),
sourceFiles: params.sourceFiles,
typeChecker: params.typeChecker
}, alias.sourceType, g.composeCursorKey(parentStateKey, key));
}
}
var fieldType = g.getFullType(f.type, data, stateAlias);
var indexedCursor = '';
f.type.forEach(function (t) {
var states = data.states.filter(function (s) { return s.typeName === t.name; });
if (f.type.length == 1 && t.isArray) {
indexedCursor = createIndexedFieldCursor(prefix, key, bobfluxPrefix, states.length > 0 ? stateAlias + "." + t.name : t.name, mainStateTypeName);
return;
}
if (states.length > 0)
nexts.push({ state: states[0], data: data, externalFileAlias: stateAlias, prefix: key });
if (states.length > 1)
throw 'Two states with same name could not be parsed. It\'s compilation error.';
});
return createFieldCursor(prefix, key, bobfluxPrefix, fieldType, mainStateTypeName) + indexedCursor;
}).join('\n');
return inner + (nexts.length > 0 ? '\n' : '') + nexts.map(function (n) { return createCursorsForStateFields(params, parentStateKey, n.data, mainStateTypeName, n.state, bobfluxPrefix, n.externalFileAlias, n.prefix); }).join('\n');
}
return new Promise(function (f, r) {
g.loadSourceFiles(project, tsAnalyzer, logger)
.then(function (p) {
try {
writeCursors(p, project.appStateName, rootStateKey);
}
catch (e) {
logger.error('Error on cursors writing.', e);
}
f();
})
.catch(function (e) { return r(e); });
});
}
function createFieldCursor(prefix, key, bobfluxPrefix, typeName, baseStateTypeName) {
return "export function " + (prefix === null ? key : nameUnifier.getStatePrefixFromKeyPrefix(prefix, nameUnifier.getStatePrefixFromKeyPrefix(key, ""))) + "(cursor: " + bobfluxPrefix + ".ICursor<" + baseStateTypeName + ">): " + bobfluxPrefix + ".ICursor<" + typeName + "> {\n return { key: cursor.key + '." + key + "' };\n}\n";
}
function createIndexedFieldCursor(prefix, key, bobfluxPrefix, typeName, baseStateTypeName) {
return "export function " + (prefix === null ? key : nameUnifier.getStatePrefixFromKeyPrefix(prefix, nameUnifier.getStatePrefixFromKeyPrefix(key, ""))) + "Item(cursor: " + bobfluxPrefix + ".ICursor<" + baseStateTypeName + ">, index: number): " + bobfluxPrefix + ".ICursor<" + typeName + "> {\n return { key: cursor.key + '." + key + ".' + index };\n}\n";
}
function createCursorsFilePath(stateFilePath) {
return path.join(path.dirname(stateFilePath), path.basename(stateFilePath).replace(path.extname(stateFilePath), '')) + ".f.cursors.ts";
}
exports.createCursorsFilePath = createCursorsFilePath;