UNPKG

5.19 kBJavaScriptView Raw
1import { __read, __spread } from "tslib";
2import lex from 'coffee-lex';
3import { nodes as getCoffee1Nodes, tokens as getCoffee1Tokens } from 'decaffeinate-coffeescript';
4import { nodes as getCoffee2Nodes, tokens as getCoffee2Tokens } from 'decaffeinate-coffeescript2';
5import { parse as decaffeinateParse } from 'decaffeinate-parser';
6import AddVariableDeclarationsStage from './stages/add-variable-declarations/index';
7import ResugarStage from './stages/resugar/index';
8import LiterateStage from './stages/literate/index';
9import MainStage from './stages/main/index';
10import NormalizeStage from './stages/normalize/index';
11import SemicolonsStage from './stages/semicolons/index';
12import { mergeSuggestions, prependSuggestionComment } from './suggestions';
13import CodeContext from './utils/CodeContext';
14import convertNewlines from './utils/convertNewlines';
15import detectNewlineStr from './utils/detectNewlineStr';
16import formatCoffeeLexTokens from './utils/formatCoffeeLexTokens';
17import formatCoffeeScriptAst from './utils/formatCoffeeScriptAst';
18import formatCoffeeScriptLexerTokens from './utils/formatCoffeeScriptLexerTokens';
19import formatDecaffeinateParserAst from './utils/formatDecaffeinateParserAst';
20import PatchError from './utils/PatchError';
21import removeUnicodeBOMIfNecessary from './utils/removeUnicodeBOMIfNecessary';
22import resolveToPatchError from './utils/resolveToPatchError';
23export { default as run } from './cli';
24import { resolveOptions } from './options';
25import notNull from './utils/notNull';
26export { PatchError };
27/**
28 * Convert CoffeeScript source code into modern JavaScript preserving comments
29 * and formatting.
30 */
31export function convert(source, options) {
32 if (options === void 0) { options = {}; }
33 source = removeUnicodeBOMIfNecessary(source);
34 options = resolveOptions(options);
35 var originalNewlineStr = detectNewlineStr(source);
36 source = convertNewlines(source, '\n');
37 var literate = options.literate ||
38 notNull(options.filename).endsWith('.litcoffee') ||
39 notNull(options.filename).endsWith('.coffee.md');
40 var stages = __spread((literate ? [LiterateStage] : []), [
41 NormalizeStage,
42 MainStage,
43 AddVariableDeclarationsStage,
44 SemicolonsStage,
45 ResugarStage
46 ]);
47 var runToStage = options.runToStage;
48 if (runToStage !== null && runToStage !== undefined) {
49 var stageIndex = stages.findIndex(function (stage) { return stage.name === runToStage; });
50 if (stageIndex !== -1) {
51 stages = stages.slice(0, stageIndex + 1);
52 }
53 else {
54 return convertCustomStage(source, runToStage, Boolean(options.useCS2));
55 }
56 }
57 var result = runStages(source, options, stages);
58 if (!options.disableSuggestionComment) {
59 result.code = prependSuggestionComment(result.code, result.suggestions);
60 }
61 result.code = convertNewlines(result.code, originalNewlineStr);
62 return {
63 code: result.code
64 };
65}
66export function modernizeJS(source, options) {
67 if (options === void 0) { options = {}; }
68 source = removeUnicodeBOMIfNecessary(source);
69 options = resolveOptions(options);
70 var originalNewlineStr = detectNewlineStr(source);
71 source = convertNewlines(source, '\n');
72 var stages = [ResugarStage];
73 var result = runStages(source, options, stages);
74 result.code = convertNewlines(result.code, originalNewlineStr);
75 return {
76 code: result.code
77 };
78}
79function runStages(initialContent, options, stages) {
80 var content = initialContent;
81 var suggestions = [];
82 stages.forEach(function (stage) {
83 var _a = runStage(stage, content, options), code = _a.code, stageSuggestions = _a.suggestions;
84 content = code;
85 suggestions.push.apply(suggestions, __spread(stageSuggestions));
86 });
87 return { code: content, suggestions: mergeSuggestions(suggestions) };
88}
89function runStage(stage, content, options) {
90 try {
91 return stage.run(content, options);
92 }
93 catch (err) {
94 var patchError = resolveToPatchError(err, content, stage.name);
95 if (patchError !== null) {
96 throw patchError;
97 }
98 throw err;
99 }
100}
101function convertCustomStage(source, stageName, useCS2) {
102 var context = new CodeContext(source);
103 if (stageName === 'coffeescript-lexer') {
104 var tokens = useCS2 ? getCoffee2Tokens(source) : getCoffee1Tokens(source);
105 return {
106 code: formatCoffeeScriptLexerTokens(tokens, context)
107 };
108 }
109 else if (stageName === 'coffeescript-parser') {
110 var nodes = useCS2 ? getCoffee2Nodes(source) : getCoffee1Nodes(source);
111 return {
112 code: formatCoffeeScriptAst(nodes, context)
113 };
114 }
115 else if (stageName === 'coffee-lex') {
116 return {
117 code: formatCoffeeLexTokens(lex(source, { useCS2: useCS2 }), context)
118 };
119 }
120 else if (stageName === 'decaffeinate-parser') {
121 return {
122 code: formatDecaffeinateParserAst(decaffeinateParse(source, { useCS2: useCS2 }), context)
123 };
124 }
125 else {
126 throw new Error("Unrecognized stage name: " + stageName);
127 }
128}