bobflux-gen
Version:
Generator for monkey files in bobflux application.
144 lines (143 loc) • 6.69 kB
JavaScript
;
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;