UNPKG

11.2 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.normalizePath = void 0;
7var path_1 = require("path");
8var typescript_1 = __importDefault(require("typescript"));
9var url_1 = require("url");
10var fs_1 = require("fs");
11/* ****************************************************************************************************************** *
12 * Helpers
13 * ****************************************************************************************************************** */
14exports.normalizePath = function (p) {
15 // Is extended length or has non-ascii chars (respectively)
16 return /^\\\\\?\\/.test(p) || /[^\u0000-\u0080]+/.test(p)
17 ? p
18 : // Normalize to forward slash and remove repeating slashes
19 p.replace(/[\\\/]+/g, "/");
20};
21/* ****************************************************************************************************************** *
22 * Transformer
23 * ****************************************************************************************************************** */
24var 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 // There is nothing we can do without baseUrl and paths specified.
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 // check for implicit extensions .ts, .dts, etc...
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 // else if has extensions, file must exist
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 // if it's relative path do not transform
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 /* Remove implicit extension */
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}; }; };
242exports.default = transformer;