UNPKG

bobflux-gen

Version:

Generator for monkey files in bobflux application.

92 lines (91 loc) 6.06 kB
"use strict"; 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;