1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | exports.normalizePath = void 0;
|
7 | var path_1 = require("path");
|
8 | var typescript_1 = __importDefault(require("typescript"));
|
9 | var url_1 = require("url");
|
10 | var fs_1 = require("fs");
|
11 |
|
12 |
|
13 |
|
14 | exports.normalizePath = function (p) {
|
15 |
|
16 | return /^\\\\\?\\/.test(p) || /[^\u0000-\u0080]+/.test(p)
|
17 | ? p
|
18 | :
|
19 | p.replace(/[\\\/]+/g, "/");
|
20 | };
|
21 |
|
22 |
|
23 |
|
24 | var transformer = function (_) { return function (context) { return function (sourceFile) {
|
25 | var _a, _b;
|
26 | var resolver = typeof context.getEmitResolver === "function"
|
27 | ? context.getEmitResolver()
|
28 | : undefined;
|
29 | var compilerOptions = context.getCompilerOptions();
|
30 | var sourceDir = path_1.dirname(sourceFile.fileName);
|
31 | var implicitExtensions = [".ts", ".d.ts"];
|
32 | var allowJs = compilerOptions.allowJs === true;
|
33 | var allowJsx = compilerOptions.jsx !== undefined &&
|
34 | compilerOptions.jsx !== typescript_1.default.JsxEmit.None;
|
35 | var allowJson = compilerOptions.resolveJsonModule === true;
|
36 | allowJs && implicitExtensions.push(".js");
|
37 | allowJsx && implicitExtensions.push(".tsx");
|
38 | allowJs && allowJsx && implicitExtensions.push(".jsx");
|
39 | allowJson && implicitExtensions.push(".json");
|
40 | var isDeclarationFile = sourceFile.isDeclarationFile;
|
41 | var _c = compilerOptions.baseUrl, baseUrl = _c === void 0 ? "" : _c, _d = compilerOptions.paths, paths = _d === void 0 ? {} : _d;
|
42 | paths["*"] = (_b = (_a = paths["*"]) === null || _a === void 0 ? void 0 : _a.concat("*")) !== null && _b !== void 0 ? _b : ["*"];
|
43 | var binds = Object.keys(paths)
|
44 | .filter(function (key) { return paths[key].length; })
|
45 | .map(function (key) { return ({
|
46 | regexp: new RegExp("^" + key.replace("*", "(.*)") + "$"),
|
47 | paths: paths[key],
|
48 | }); });
|
49 | if (!baseUrl || binds.length === 0) {
|
50 |
|
51 | return sourceFile;
|
52 | }
|
53 | function isRelative(s) {
|
54 | return s[0] === ".";
|
55 | }
|
56 | function isUrl(s) {
|
57 | return url_1.parse(s).protocol !== null;
|
58 | }
|
59 | function fileExists(s) {
|
60 |
|
61 | for (var _i = 0, implicitExtensions_1 = implicitExtensions; _i < implicitExtensions_1.length; _i++) {
|
62 | var ext = implicitExtensions_1[_i];
|
63 | if (fs_1.existsSync(s + ext))
|
64 | return true;
|
65 | }
|
66 |
|
67 | if (path_1.extname(s) !== "")
|
68 | return fs_1.existsSync(s);
|
69 | return false;
|
70 | }
|
71 | function bindModuleToFile(moduleName) {
|
72 | if (isRelative(moduleName)) {
|
73 |
|
74 | return moduleName;
|
75 | }
|
76 | for (var _i = 0, binds_1 = binds; _i < binds_1.length; _i++) {
|
77 | var _a = binds_1[_i], regexp = _a.regexp, paths_2 = _a.paths;
|
78 | var match = regexp.exec(moduleName);
|
79 | if (match) {
|
80 | for (var _b = 0, paths_1 = paths_2; _b < paths_1.length; _b++) {
|
81 | var p = paths_1[_b];
|
82 | var out = p.replace(/\*/g, match[1]);
|
83 | if (isUrl(out))
|
84 | return out;
|
85 | var filepath = path_1.resolve(baseUrl, out);
|
86 | if (!fileExists(filepath + "/index") && !fileExists(filepath))
|
87 | continue;
|
88 | var resolved = fixupImportPath(path_1.relative(sourceDir, filepath));
|
89 | return isRelative(resolved) ? resolved : "./" + resolved;
|
90 | }
|
91 | }
|
92 | }
|
93 | return undefined;
|
94 | }
|
95 | var isRequire = function (node) {
|
96 | return typescript_1.default.isCallExpression(node) &&
|
97 | typescript_1.default.isIdentifier(node.expression) &&
|
98 | node.expression.text === "require" &&
|
99 | typescript_1.default.isStringLiteral(node.arguments[0]) &&
|
100 | node.arguments.length === 1;
|
101 | };
|
102 | var isAsyncImport = function (node) {
|
103 | return typescript_1.default.isCallExpression(node) &&
|
104 | node.expression.kind === typescript_1.default.SyntaxKind.ImportKeyword &&
|
105 | typescript_1.default.isStringLiteral(node.arguments[0]) &&
|
106 | node.arguments.length === 1;
|
107 | };
|
108 | function visit(node) {
|
109 | if (isRequire(node) || isAsyncImport(node)) {
|
110 | return unpathRequireAndAsyncImport(node);
|
111 | }
|
112 | if (typescript_1.default.isExternalModuleReference(node)) {
|
113 | return unpathImportEqualsDeclaration(node);
|
114 | }
|
115 | if (typescript_1.default.isImportDeclaration(node)) {
|
116 | return unpathImportDeclaration(node);
|
117 | }
|
118 | if (typescript_1.default.isExportDeclaration(node)) {
|
119 | return unpathExportDeclaration(node);
|
120 | }
|
121 | if (typescript_1.default.isImportTypeNode(node)) {
|
122 | return unpathImportTypeNode(node);
|
123 | }
|
124 | return typescript_1.default.visitEachChild(node, visit, context);
|
125 | }
|
126 | function unpathRequireAndAsyncImport(node) {
|
127 | var firstArg = node.arguments[0];
|
128 | var file = bindModuleToFile(firstArg.text);
|
129 | if (!file) {
|
130 | return node;
|
131 | }
|
132 | var fileLiteral = typescript_1.default.createLiteral(file);
|
133 | return typescript_1.default.updateCall(node, node.expression, node.typeArguments, [
|
134 | fileLiteral,
|
135 | ]);
|
136 | }
|
137 | function unpathImportTypeNode(node) {
|
138 | var argument = node.argument;
|
139 | var literal = argument.literal;
|
140 | if (!typescript_1.default.isStringLiteral(literal)) {
|
141 | return node;
|
142 | }
|
143 | var file = bindModuleToFile(literal.text);
|
144 | if (!file) {
|
145 | return node;
|
146 | }
|
147 | var fileLiteral = typescript_1.default.createLiteral(file);
|
148 | var fileArgument = typescript_1.default.updateLiteralTypeNode(argument, fileLiteral);
|
149 | return typescript_1.default.updateImportTypeNode(node, fileArgument, node.qualifier, node.typeArguments, node.isTypeOf);
|
150 | }
|
151 | function unpathImportEqualsDeclaration(node) {
|
152 | if (!typescript_1.default.isStringLiteral(node.expression)) {
|
153 | return node;
|
154 | }
|
155 | var file = bindModuleToFile(node.expression.text);
|
156 | if (!file) {
|
157 | return node;
|
158 | }
|
159 | var fileLiteral = typescript_1.default.createLiteral(file);
|
160 | return typescript_1.default.updateExternalModuleReference(node, fileLiteral);
|
161 | }
|
162 | function unpathImportDeclaration(node) {
|
163 | if (!typescript_1.default.isStringLiteral(node.moduleSpecifier)) {
|
164 | return node;
|
165 | }
|
166 | var file = bindModuleToFile(node.moduleSpecifier.text);
|
167 | if (!file) {
|
168 | return node;
|
169 | }
|
170 | var fileLiteral = typescript_1.default.createLiteral(file);
|
171 | var importClause = typescript_1.default.visitNode(node.importClause, visitImportClause, typescript_1.default.isImportClause);
|
172 | return node.importClause === importClause ||
|
173 | importClause ||
|
174 | isDeclarationFile
|
175 | ? typescript_1.default.updateImportDeclaration(node, node.decorators, node.modifiers, node.importClause, fileLiteral)
|
176 | : undefined;
|
177 | }
|
178 | function visitImportClause(node) {
|
179 | var name = resolver.isReferencedAliasDeclaration(node)
|
180 | ? node.name
|
181 | : undefined;
|
182 | var namedBindings = typescript_1.default.visitNode(node.namedBindings, visitNamedImportBindings, typescript_1.default.isNamedImports);
|
183 | return name || namedBindings
|
184 | ? typescript_1.default.updateImportClause(node, name, namedBindings, node.isTypeOnly)
|
185 | : undefined;
|
186 | }
|
187 | function visitNamedImportBindings(node) {
|
188 | if (node.kind === typescript_1.default.SyntaxKind.NamespaceImport) {
|
189 | return resolver.isReferencedAliasDeclaration(node) ? node : undefined;
|
190 | }
|
191 | else {
|
192 | var elements = typescript_1.default.visitNodes(node.elements, visitImportSpecifier, typescript_1.default.isImportSpecifier);
|
193 | return elements.some(function (e) { return e; })
|
194 | ? typescript_1.default.updateNamedImports(node, elements)
|
195 | : undefined;
|
196 | }
|
197 | }
|
198 | function visitImportSpecifier(node) {
|
199 | return resolver.isReferencedAliasDeclaration(node) ? node : undefined;
|
200 | }
|
201 | function unpathExportDeclaration(node) {
|
202 | if (!node.moduleSpecifier || !typescript_1.default.isStringLiteral(node.moduleSpecifier)) {
|
203 | return node;
|
204 | }
|
205 | var file = bindModuleToFile(node.moduleSpecifier.text);
|
206 | if (!file) {
|
207 | return node;
|
208 | }
|
209 | var fileLiteral = typescript_1.default.createLiteral(file);
|
210 | if ((!node.exportClause &&
|
211 | !compilerOptions.isolatedModules &&
|
212 | !resolver.moduleExportsSomeValue(node.moduleSpecifier)) ||
|
213 | (node.exportClause && resolver.isValueAliasDeclaration(node))) {
|
214 | return typescript_1.default.updateExportDeclaration(node, node.decorators, node.modifiers, node.exportClause, fileLiteral, node.isTypeOnly);
|
215 | }
|
216 | var exportClause = typescript_1.default.visitNode(node.exportClause, visitNamedExports, typescript_1.default.isNamedExports);
|
217 | return node.exportClause === exportClause ||
|
218 | exportClause ||
|
219 | isDeclarationFile
|
220 | ? typescript_1.default.updateExportDeclaration(node, node.decorators, node.modifiers, node.exportClause, fileLiteral, node.isTypeOnly)
|
221 | : undefined;
|
222 | }
|
223 | function visitNamedExports(node) {
|
224 | var elements = typescript_1.default.visitNodes(node.elements, visitExportSpecifier, typescript_1.default.isExportSpecifier);
|
225 | return elements.some(function (e) { return e; })
|
226 | ? typescript_1.default.updateNamedExports(node, elements)
|
227 | : undefined;
|
228 | }
|
229 | function visitExportSpecifier(node) {
|
230 | return resolver.isValueAliasDeclaration(node) ? node : undefined;
|
231 | }
|
232 | function fixupImportPath(p) {
|
233 | var res = exports.normalizePath(p);
|
234 |
|
235 | var ext = path_1.extname(res);
|
236 | if (ext && implicitExtensions.includes(ext.replace(/^\./, "")))
|
237 | res = res.slice(0, -ext.length);
|
238 | return res;
|
239 | }
|
240 | return typescript_1.default.visitNode(sourceFile, visit);
|
241 | }; }; };
|
242 | exports.default = transformer;
|