UNPKG

5.62 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var coffee_lex_1 = require("coffee-lex");
5var decaffeinate_coffeescript_1 = require("decaffeinate-coffeescript");
6var decaffeinate_coffeescript2_1 = require("decaffeinate-coffeescript2");
7var decaffeinate_parser_1 = require("decaffeinate-parser");
8var index_1 = require("./stages/add-variable-declarations/index");
9var index_2 = require("./stages/resugar/index");
10var index_3 = require("./stages/literate/index");
11var index_4 = require("./stages/main/index");
12var index_5 = require("./stages/normalize/index");
13var index_6 = require("./stages/semicolons/index");
14var suggestions_1 = require("./suggestions");
15var CodeContext_1 = require("./utils/CodeContext");
16var convertNewlines_1 = require("./utils/convertNewlines");
17var detectNewlineStr_1 = require("./utils/detectNewlineStr");
18var formatCoffeeLexTokens_1 = require("./utils/formatCoffeeLexTokens");
19var formatCoffeeScriptAst_1 = require("./utils/formatCoffeeScriptAst");
20var formatCoffeeScriptLexerTokens_1 = require("./utils/formatCoffeeScriptLexerTokens");
21var formatDecaffeinateParserAst_1 = require("./utils/formatDecaffeinateParserAst");
22var PatchError_1 = require("./utils/PatchError");
23exports.PatchError = PatchError_1.default;
24var removeUnicodeBOMIfNecessary_1 = require("./utils/removeUnicodeBOMIfNecessary");
25var resolveToPatchError_1 = require("./utils/resolveToPatchError");
26var cli_1 = require("./cli");
27exports.run = cli_1.default;
28var options_1 = require("./options");
29var notNull_1 = require("./utils/notNull");
30/**
31 * Convert CoffeeScript source code into modern JavaScript preserving comments
32 * and formatting.
33 */
34function 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}
69exports.convert = convert;
70function 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}
83exports.modernizeJS = modernizeJS;
84function 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}
94function 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}
106function 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}