1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var tslib_1 = require("tslib");
|
4 | var coffee_lex_1 = require("coffee-lex");
|
5 | var decaffeinate_coffeescript_1 = require("decaffeinate-coffeescript");
|
6 | var decaffeinate_coffeescript2_1 = require("decaffeinate-coffeescript2");
|
7 | var decaffeinate_parser_1 = require("decaffeinate-parser");
|
8 | var index_1 = require("./stages/add-variable-declarations/index");
|
9 | var index_2 = require("./stages/resugar/index");
|
10 | var index_3 = require("./stages/literate/index");
|
11 | var index_4 = require("./stages/main/index");
|
12 | var index_5 = require("./stages/normalize/index");
|
13 | var index_6 = require("./stages/semicolons/index");
|
14 | var suggestions_1 = require("./suggestions");
|
15 | var CodeContext_1 = require("./utils/CodeContext");
|
16 | var convertNewlines_1 = require("./utils/convertNewlines");
|
17 | var detectNewlineStr_1 = require("./utils/detectNewlineStr");
|
18 | var formatCoffeeLexTokens_1 = require("./utils/formatCoffeeLexTokens");
|
19 | var formatCoffeeScriptAst_1 = require("./utils/formatCoffeeScriptAst");
|
20 | var formatCoffeeScriptLexerTokens_1 = require("./utils/formatCoffeeScriptLexerTokens");
|
21 | var formatDecaffeinateParserAst_1 = require("./utils/formatDecaffeinateParserAst");
|
22 | var PatchError_1 = require("./utils/PatchError");
|
23 | exports.PatchError = PatchError_1.default;
|
24 | var removeUnicodeBOMIfNecessary_1 = require("./utils/removeUnicodeBOMIfNecessary");
|
25 | var resolveToPatchError_1 = require("./utils/resolveToPatchError");
|
26 | var cli_1 = require("./cli");
|
27 | exports.run = cli_1.default;
|
28 | var options_1 = require("./options");
|
29 | var notNull_1 = require("./utils/notNull");
|
30 |
|
31 |
|
32 |
|
33 |
|
34 | function convert(source, options) {
|
35 | if (options === void 0) { options = {}; }
|
36 | source = removeUnicodeBOMIfNecessary_1.default(source);
|
37 | options = options_1.resolveOptions(options);
|
38 | var originalNewlineStr = detectNewlineStr_1.default(source);
|
39 | source = convertNewlines_1.default(source, '\n');
|
40 | var literate = options.literate ||
|
41 | notNull_1.default(options.filename).endsWith('.litcoffee') ||
|
42 | notNull_1.default(options.filename).endsWith('.coffee.md');
|
43 | var stages = tslib_1.__spread((literate ? [index_3.default] : []), [
|
44 | index_5.default,
|
45 | index_4.default,
|
46 | index_1.default,
|
47 | index_6.default,
|
48 | index_2.default
|
49 | ]);
|
50 | var runToStage = options.runToStage;
|
51 | if (runToStage !== null && runToStage !== undefined) {
|
52 | var stageIndex = stages.findIndex(function (stage) { return stage.name === runToStage; });
|
53 | if (stageIndex !== -1) {
|
54 | stages = stages.slice(0, stageIndex + 1);
|
55 | }
|
56 | else {
|
57 | return convertCustomStage(source, runToStage, Boolean(options.useCS2));
|
58 | }
|
59 | }
|
60 | var result = runStages(source, options, stages);
|
61 | if (!options.disableSuggestionComment) {
|
62 | result.code = suggestions_1.prependSuggestionComment(result.code, result.suggestions);
|
63 | }
|
64 | result.code = convertNewlines_1.default(result.code, originalNewlineStr);
|
65 | return {
|
66 | code: result.code
|
67 | };
|
68 | }
|
69 | exports.convert = convert;
|
70 | function modernizeJS(source, options) {
|
71 | if (options === void 0) { options = {}; }
|
72 | source = removeUnicodeBOMIfNecessary_1.default(source);
|
73 | options = options_1.resolveOptions(options);
|
74 | var originalNewlineStr = detectNewlineStr_1.default(source);
|
75 | source = convertNewlines_1.default(source, '\n');
|
76 | var stages = [index_2.default];
|
77 | var result = runStages(source, options, stages);
|
78 | result.code = convertNewlines_1.default(result.code, originalNewlineStr);
|
79 | return {
|
80 | code: result.code
|
81 | };
|
82 | }
|
83 | exports.modernizeJS = modernizeJS;
|
84 | function runStages(initialContent, options, stages) {
|
85 | var content = initialContent;
|
86 | var suggestions = [];
|
87 | stages.forEach(function (stage) {
|
88 | var _a = runStage(stage, content, options), code = _a.code, stageSuggestions = _a.suggestions;
|
89 | content = code;
|
90 | suggestions.push.apply(suggestions, tslib_1.__spread(stageSuggestions));
|
91 | });
|
92 | return { code: content, suggestions: suggestions_1.mergeSuggestions(suggestions) };
|
93 | }
|
94 | function runStage(stage, content, options) {
|
95 | try {
|
96 | return stage.run(content, options);
|
97 | }
|
98 | catch (err) {
|
99 | var patchError = resolveToPatchError_1.default(err, content, stage.name);
|
100 | if (patchError !== null) {
|
101 | throw patchError;
|
102 | }
|
103 | throw err;
|
104 | }
|
105 | }
|
106 | function convertCustomStage(source, stageName, useCS2) {
|
107 | var context = new CodeContext_1.default(source);
|
108 | if (stageName === 'coffeescript-lexer') {
|
109 | var tokens = useCS2 ? decaffeinate_coffeescript2_1.tokens(source) : decaffeinate_coffeescript_1.tokens(source);
|
110 | return {
|
111 | code: formatCoffeeScriptLexerTokens_1.default(tokens, context)
|
112 | };
|
113 | }
|
114 | else if (stageName === 'coffeescript-parser') {
|
115 | var nodes = useCS2 ? decaffeinate_coffeescript2_1.nodes(source) : decaffeinate_coffeescript_1.nodes(source);
|
116 | return {
|
117 | code: formatCoffeeScriptAst_1.default(nodes, context)
|
118 | };
|
119 | }
|
120 | else if (stageName === 'coffee-lex') {
|
121 | return {
|
122 | code: formatCoffeeLexTokens_1.default(coffee_lex_1.default(source, { useCS2: useCS2 }), context)
|
123 | };
|
124 | }
|
125 | else if (stageName === 'decaffeinate-parser') {
|
126 | return {
|
127 | code: formatDecaffeinateParserAst_1.default(decaffeinate_parser_1.parse(source, { useCS2: useCS2 }), context)
|
128 | };
|
129 | }
|
130 | else {
|
131 | throw new Error("Unrecognized stage name: " + stageName);
|
132 | }
|
133 | }
|