1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 | var Module = require("module"),
|
6 | eslint = require("eslint");
|
7 |
|
8 | var moduleWrapper0 = Module.wrapper[0],
|
9 | moduleWrapper1 = Module.wrapper[1],
|
10 | originalExtensions = {},
|
11 | linter = new eslint.Linter(),
|
12 | eslintOptions = {
|
13 | env: {
|
14 | es6: true,
|
15 | },
|
16 | parserOptions: {
|
17 | ecmaVersion: 6,
|
18 | ecmaFeatures: {
|
19 | globalReturn: true,
|
20 | jsx: true,
|
21 | experimentalObjectRestSpread: true
|
22 | },
|
23 | },
|
24 | rules: {
|
25 | "no-const-assign": 2
|
26 | }
|
27 | },
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | matchConst = /(^|\s|\}|;)const(\/\*|\s|{)/gm,
|
44 |
|
45 | shebang = /^#!.+/,
|
46 | nodeRequire,
|
47 | currentModule;
|
48 |
|
49 | function load(targetModule) {
|
50 | nodeRequire = targetModule.require;
|
51 | targetModule.require = requireProxy;
|
52 | currentModule = targetModule;
|
53 |
|
54 | registerExtensions();
|
55 | targetModule.load(targetModule.id);
|
56 |
|
57 |
|
58 | reset();
|
59 | }
|
60 |
|
61 | function reset() {
|
62 | Module.wrapper[0] = moduleWrapper0;
|
63 | Module.wrapper[1] = moduleWrapper1;
|
64 | }
|
65 |
|
66 | function inject(prelude, appendix) {
|
67 | Module.wrapper[0] = moduleWrapper0 + prelude;
|
68 | Module.wrapper[1] = appendix + moduleWrapper1;
|
69 | }
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | function requireProxy(path) {
|
78 | reset();
|
79 | currentModule.require = nodeRequire;
|
80 | return nodeRequire.call(currentModule, path);
|
81 | }
|
82 |
|
83 | function registerExtensions() {
|
84 | var originalJsExtension = require.extensions[".js"];
|
85 | var originalTsExtension = require.extensions[".ts"];
|
86 |
|
87 | if (originalJsExtension) {
|
88 | originalExtensions.js = originalJsExtension;
|
89 | }
|
90 | if (originalTsExtension) {
|
91 | originalExtensions.ts = originalTsExtension;
|
92 | }
|
93 | require.extensions[".js"] = jsExtension;
|
94 | require.extensions[".ts"] = tsExtension;
|
95 | }
|
96 |
|
97 | function restoreExtensions() {
|
98 | if ("js" in originalExtensions) {
|
99 | require.extensions[".js"] = originalExtensions.js;
|
100 | }
|
101 | if ("ts" in originalExtensions) {
|
102 | require.extensions[".ts"] = originalExtensions.ts;
|
103 | }
|
104 | }
|
105 |
|
106 | function isNoConstAssignMessage(message) {
|
107 | return message.ruleId === "no-const-assign";
|
108 | }
|
109 |
|
110 | function jsExtension(module, filename) {
|
111 | var _compile = module._compile;
|
112 |
|
113 | module._compile = function (content, filename) {
|
114 | var noConstAssignMessage = linter.verify(content, eslintOptions).find(isNoConstAssignMessage);
|
115 | var line;
|
116 | var column;
|
117 |
|
118 | if (noConstAssignMessage !== undefined) {
|
119 | line = noConstAssignMessage.line;
|
120 | column = noConstAssignMessage.column;
|
121 | throw new TypeError(`Assignment to constant variable at ${ filename }:${ line }:${ column }`);
|
122 | }
|
123 |
|
124 | _compile.call(
|
125 | module,
|
126 | content
|
127 | .replace(shebang, '')
|
128 | .replace(matchConst, "$1let $2"),
|
129 | filename
|
130 | );
|
131 | };
|
132 |
|
133 | restoreExtensions();
|
134 | originalExtensions.js(module, filename);
|
135 | }
|
136 |
|
137 | function tsExtension(module, filename) {
|
138 | var _compile = module._compile;
|
139 |
|
140 | module._compile = function rewireCompile(content, filename) {
|
141 | var noConstAssignMessage = linter.verify(content, eslintOptions).find(isNoConstAssignMessage);
|
142 | var line;
|
143 | var column;
|
144 |
|
145 | if (noConstAssignMessage !== undefined) {
|
146 | line = noConstAssignMessage.line;
|
147 | column = noConstAssignMessage.column;
|
148 | throw new TypeError(`Assignment to constant variable at ${ filename }:${ line }:${ column }`);
|
149 | }
|
150 | _compile.call(
|
151 | this,
|
152 | content
|
153 | .replace(shebang, '')
|
154 | .replace(matchConst, "$1let $2"),
|
155 | filename
|
156 | );
|
157 | };
|
158 |
|
159 | restoreExtensions();
|
160 | originalExtensions.ts(module, filename);
|
161 | }
|
162 |
|
163 | exports.load = load;
|
164 | exports.inject = inject;
|