UNPKG

flowgen

Version:

Generate flowtype definition files from TypeScript

163 lines (121 loc) 6.69 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _path = _interopRequireDefault(require("path")); var _typescript = _interopRequireWildcard(require("typescript")); var _typescriptCompiler = _interopRequireDefault(require("typescript-compiler")); var _namespaceManager = _interopRequireDefault(require("../namespace-manager")); var _options = require("../options"); var _checker = require("../checker"); var logger = _interopRequireWildcard(require("../logger")); var _env = require("../env"); var _transformers = require("../parse/transformers"); var _parse = require("../parse"); var _node = require("../printers/node"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const compile = (0, _env.withEnv)((env, sourceFile) => { const rootNode = (0, _parse.recursiveWalkTree)(sourceFile); const output = rootNode.getChildren().map(child => { return child.print(); }).join(""); const helpersOutputs = (0, _node.printFlowGenHelper)(env); return `${helpersOutputs}\n\n${output}`; }); const reset = options => { (0, _options.resetOptions)(); if (options) { (0, _options.assignOptions)(options); } _namespaceManager.default.reset(); }; const compilerOptions = { noLib: true, target: _typescript.ScriptTarget.Latest }; const getTransformers = options => [(0, _transformers.legacyModules)(), (0, _transformers.importEqualsTransformer)(), (0, _transformers.declarationFileTransform)(options), (0, _transformers.importTypeToImportDeclaration)()]; const transformFile = (fileName, sourceText, languageVersion, options) => { const transformedAst = (0, _typescript.transform)( //$todo Flow has problems when switching variables instead of literals (0, _typescript.createSourceFile)(fileName, sourceText, languageVersion, true), getTransformers(options), compilerOptions).transformed[0]; const transformedText = _typescript.default.createPrinter().printFile(transformedAst); return (0, _typescript.createSourceFile)(fileName, transformedText, languageVersion, true); }; /** * Compiles typescript files */ var _default = { reset, compile: compile.withEnv({}), setChecker(typeChecker) { _checker.checker.current = typeChecker; }, getTransformers(options) { return getTransformers(options); }, compileTest: (testPath, target) => { _typescriptCompiler.default.compile(testPath, "--module commonjs -t ES6 --out " + target); }, compileDefinitionString: (string, options) => { reset(options); const compilerHost = (0, _typescript.createCompilerHost)({}, true); const oldSourceFile = compilerHost.getSourceFile; compilerHost.getSourceFile = (file, languageVersion) => { if (file === "file.ts") { return transformFile("/dev/null", string, languageVersion, options); } return oldSourceFile(file, languageVersion); }; const program = (0, _typescript.createProgram)(["file.ts"], compilerOptions, compilerHost); _checker.checker.current = program.getTypeChecker(); const sourceFile = program.getSourceFile("file.ts"); if (!sourceFile) return ""; logger.setSourceFile(sourceFile); return compile.withEnv({})(sourceFile); }, compileDefinitionFile: (definitionPath, options, mapSourceCode = a => a) => { reset(options); const compilerHost = (0, _typescript.createCompilerHost)({}, true); const oldSourceFile = compilerHost.getSourceFile; const oldReadFile = compilerHost.readFile; compilerHost.readFile = fileName => mapSourceCode(oldReadFile(fileName), fileName); const absolutePath = _path.default.resolve(definitionPath); compilerHost.getSourceFile = (file, languageVersion) => { if (_path.default.resolve(file) === absolutePath) { const sourceText = compilerHost.readFile(file); return transformFile(file, sourceText, languageVersion, options); } return oldSourceFile(file, languageVersion); }; const program = (0, _typescript.createProgram)([definitionPath], compilerOptions, compilerHost); _checker.checker.current = program.getTypeChecker(); const sourceFile = program.getSourceFile(definitionPath); if (!sourceFile) return ""; logger.setSourceFile(sourceFile); return compile.withEnv({})(sourceFile); }, compileDefinitionFiles: (definitionPaths, options, mapSourceCode = a => a) => { const compilerHost = (0, _typescript.createCompilerHost)({}, true); const oldSourceFile = compilerHost.getSourceFile; const oldReadFile = compilerHost.readFile; compilerHost.readFile = fileName => mapSourceCode(oldReadFile(fileName), fileName); const absolutePaths = new Set(definitionPaths.map(p => _path.default.resolve(p))); compilerHost.getSourceFile = (file, languageVersion) => { if (absolutePaths.has(_path.default.resolve(file))) { const sourceText = compilerHost.readFile(file); return transformFile(file, sourceText, languageVersion, options); } return oldSourceFile(file, languageVersion); }; const program = (0, _typescript.createProgram)(definitionPaths, compilerOptions, compilerHost); _checker.checker.current = program.getTypeChecker(); return definitionPaths.map(definitionPath => { const sourceFile = program.getSourceFile(definitionPath); if (!sourceFile) return [definitionPath, ""]; logger.setSourceFile(sourceFile); reset(options); return [definitionPath, compile.withEnv({})(sourceFile)]; }); } }; exports.default = _default;