UNPKG

bobflux-gen

Version:

Generator for monkey files in bobflux application.

144 lines (143 loc) 6.69 kB
"use strict"; var ts = require("typescript"); var tsa = require("./tsAnalyzer"); var tsch = require("./tsCompilerHost"); var pathPlatformDependent = require("path"); var path = pathPlatformDependent.posix; // This works everythere, just use forward slashes exports.mainStateIndex = 0; exports.stateNotFoundError = 'Main state file could not be found.'; exports.stateImportKey = 's'; function resolveBobfluxPrefix(mainState) { var founds = mainState.heritages.filter(function (h) { return h.indexOf('.IState') !== -1 || h.indexOf('.IRouteComponentState') !== -1 || h.indexOf('.IComponentState') !== -1; }); return (founds.length === 0) ? 'bf' : founds[0].split('.')[0]; } exports.resolveBobfluxPrefix = resolveBobfluxPrefix; function resolveState(allStates, stateName) { var states = allStates.filter(function (s) { return s.typeName === stateName; }); return states.length === 0 ? null : states[0]; } exports.resolveState = resolveState; function resolveSourceFile(sourceFiles, fullPath) { var lowFullPath = fullPath.toLowerCase().replace(/\\/g, '/'); var files = sourceFiles.filter(function (s) { return path.relative(s.path.toLowerCase(), lowFullPath) === ''; }); if (files.length === 0) return null; return files[0]; } exports.resolveSourceFile = resolveSourceFile; function loadSourceFiles(project, tsAnalyzer, logger) { return new Promise(function (f, r) { logger.info('Generator runs in: ' + project.appSourcesDirectory); logger.info('Application state file is: ' + project.appStateFileName); logger.info('Application state name is: ' + project.appStateName); var program = ts.createProgram([project.appStateFileName], project.tsOptions, tsch.createCompilerHost(project.appSourcesDirectory, logger)); var tc = program.getTypeChecker(); var sourceFiles = program.getSourceFiles(); logger.info('Found source files: ', sourceFiles.map(function (s) { return s.path; })); var foundSource = resolveSourceFile(sourceFiles, path.join(project.appSourcesDirectory, project.appStateFileName)); if (!foundSource) { logger.error('Source files could not be loaded.'); r(exports.stateNotFoundError); return; } var data = tsAnalyzer.getSourceData(foundSource, tc); var filePath = path.join(path.dirname(foundSource.path), foundSource.fileName); f({ stateFilePath: filePath, data: data, sourceFiles: sourceFiles, typeChecker: tc }); }); } exports.loadSourceFiles = loadSourceFiles; function isExternalState(type, data) { return type.split('.')[0] in data.sourceDeps; } exports.isExternalState = isExternalState; function getExternalAlias(type, data, topLevelImports) { if (topLevelImports === void 0) { topLevelImports = {}; } var typePath = type.split('.'); var dep = data.sourceDeps[typePath[0]]; if (!dep) return null; if (!topLevelImports[dep.fullPath]) { topLevelImports[dep.fullPath] = Object.assign({}, dep, { prefix: exports.createUnusedAlias(dep.prefix, Object.keys(topLevelImports).map(function (key) { return topLevelImports[key]; })) }); } return Object.assign({}, dep, { prefix: topLevelImports[dep.fullPath].prefix, sourceType: typePath[0] === dep.prefix ? typePath.slice(1).join('.') : dep.types.find(function (t) { return t.targetType === typePath[0]; }).sourceType }); } exports.getExternalAlias = getExternalAlias; function getFullType(ts, data, stateAlias, topLevelImports) { if (topLevelImports === void 0) { topLevelImports = {}; } return ts.map(function (t) { var fieldType = t.name; if (isExternalState(t.name, data)) { var alias = getExternalAlias(t.name, data, topLevelImports); fieldType = alias.prefix + "." + alias.sourceType; } if (isFieldEnumType(fieldType, data.enums) || isCustomType(fieldType, data.customTypes) || data.states.filter(function (s) { return s.typeName === t.name; }).length > 0) fieldType = stateAlias + "." + fieldType; if (t.arguments) fieldType += "<" + t.arguments.map(function (t) { return getFullType(t, data, stateAlias, topLevelImports); }).join(', ') + ">"; if (t.isArray) fieldType += '[]'; if (t.indexer) fieldType = "{ [" + t.indexer + "]: " + fieldType + " }"; return fieldType; }).join(' | '); } exports.getFullType = getFullType; function composeCursorKey() { var parts = []; for (var _i = 0; _i < arguments.length; _i++) { parts[_i] = arguments[_i]; } return parts.filter(function (p) { return p !== null; }).join('.'); } exports.composeCursorKey = composeCursorKey; function createFullImports(stateAlias, stateFilePath, imports) { return "import * as " + stateAlias + " from '" + stateFilePath + "';\n" + createImports(imports) + "\nexport * from '" + stateFilePath + "';\n\n"; } exports.createFullImports = createFullImports; exports.createUnusedAlias = tsa.createUnusedAlias; function createImports(imports) { var s = imports.map(function (i) { return "import * as " + i.prefix + " from '" + i.relativePath + "';"; }).join('\n'); return s ? s + '\n' : ''; } function isFieldEnumType(fieldType, enums) { return enums.filter(function (e) { return e.name === fieldType; }).length > 0; } exports.isFieldEnumType = isFieldEnumType; function isCustomType(fieldType, customeTypes) { return customeTypes.filter(function (e) { return e.name === fieldType; }).length > 0; } exports.isCustomType = isCustomType; function isRouteComponentState() { var heritages = []; for (var _i = 0; _i < arguments.length; _i++) { heritages[_i] = arguments[_i]; } return heritages.filter(function (h) { return h.indexOf('IRouteComponentState') !== -1; }).length > 0; } exports.isRouteComponentState = isRouteComponentState; function isComponentState() { var heritages = []; for (var _i = 0; _i < arguments.length; _i++) { heritages[_i] = arguments[_i]; } return heritages.filter(function (h) { return h.indexOf('IComponentState') !== -1; }).length > 0; } exports.isComponentState = isComponentState; function createAutogeneratedHeader(version) { return "// \n// This source code was auto-generated by bobflux-gen, Version=" + version + ".\n// Don't modify this file but re-generate it by bobflux-gen.\n// Bobflux-gen - https://www.npmjs.com/package/bobflux-gen\n//\n\n"; } exports.createAutogeneratedHeader = createAutogeneratedHeader;