1 | import { __read, __spread } from "tslib";
|
2 | import lex from 'coffee-lex';
|
3 | import { nodes as getCoffee1Nodes, tokens as getCoffee1Tokens } from 'decaffeinate-coffeescript';
|
4 | import { nodes as getCoffee2Nodes, tokens as getCoffee2Tokens } from 'decaffeinate-coffeescript2';
|
5 | import { parse as decaffeinateParse } from 'decaffeinate-parser';
|
6 | import AddVariableDeclarationsStage from './stages/add-variable-declarations/index';
|
7 | import ResugarStage from './stages/resugar/index';
|
8 | import LiterateStage from './stages/literate/index';
|
9 | import MainStage from './stages/main/index';
|
10 | import NormalizeStage from './stages/normalize/index';
|
11 | import SemicolonsStage from './stages/semicolons/index';
|
12 | import { mergeSuggestions, prependSuggestionComment } from './suggestions';
|
13 | import CodeContext from './utils/CodeContext';
|
14 | import convertNewlines from './utils/convertNewlines';
|
15 | import detectNewlineStr from './utils/detectNewlineStr';
|
16 | import formatCoffeeLexTokens from './utils/formatCoffeeLexTokens';
|
17 | import formatCoffeeScriptAst from './utils/formatCoffeeScriptAst';
|
18 | import formatCoffeeScriptLexerTokens from './utils/formatCoffeeScriptLexerTokens';
|
19 | import formatDecaffeinateParserAst from './utils/formatDecaffeinateParserAst';
|
20 | import PatchError from './utils/PatchError';
|
21 | import removeUnicodeBOMIfNecessary from './utils/removeUnicodeBOMIfNecessary';
|
22 | import resolveToPatchError from './utils/resolveToPatchError';
|
23 | export { default as run } from './cli';
|
24 | import { resolveOptions } from './options';
|
25 | import notNull from './utils/notNull';
|
26 | export { PatchError };
|
27 |
|
28 |
|
29 |
|
30 |
|
31 | export 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 | }
|
66 | export 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 | }
|
79 | function 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 | }
|
89 | function 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 | }
|
101 | function 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 | }
|