@angular/compiler-cli 8.0.3 → 8.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ngcc/index.d.ts +1 -0
- package/ngcc/index.js +1 -1
- package/ngcc/main-ngcc.js +4 -4
- package/ngcc/src/analysis/decoration_analyzer.d.ts +5 -1
- package/ngcc/src/analysis/decoration_analyzer.js +12 -12
- package/ngcc/src/analysis/module_with_providers_analyzer.js +2 -2
- package/ngcc/src/analysis/private_declarations_analyzer.d.ts +3 -2
- package/ngcc/src/analysis/private_declarations_analyzer.js +8 -7
- package/ngcc/src/dependencies/commonjs_dependency_host.d.ts +46 -0
- package/ngcc/src/dependencies/commonjs_dependency_host.js +133 -0
- package/ngcc/src/dependencies/dependency_host.d.ts +17 -0
- package/ngcc/src/dependencies/dependency_host.js +20 -0
- package/ngcc/src/{packages → dependencies}/dependency_resolver.d.ts +13 -8
- package/ngcc/src/dependencies/dependency_resolver.js +138 -0
- package/ngcc/src/dependencies/esm_dependency_host.d.ts +62 -0
- package/ngcc/src/dependencies/esm_dependency_host.js +122 -0
- package/ngcc/src/dependencies/module_resolver.d.ts +139 -0
- package/ngcc/src/dependencies/module_resolver.js +297 -0
- package/ngcc/src/dependencies/umd_dependency_host.d.ts +46 -0
- package/ngcc/src/dependencies/umd_dependency_host.js +114 -0
- package/ngcc/src/file_system/file_system.d.ts +36 -0
- package/ngcc/src/file_system/file_system.js +20 -0
- package/ngcc/src/file_system/node_js_file_system.d.ts +27 -0
- package/ngcc/src/file_system/node_js_file_system.js +44 -0
- package/ngcc/src/host/commonjs_host.d.ts +43 -0
- package/ngcc/src/host/commonjs_host.js +187 -0
- package/ngcc/src/host/esm2015_host.d.ts +8 -10
- package/ngcc/src/host/esm2015_host.js +70 -40
- package/ngcc/src/host/esm5_host.js +3 -3
- package/ngcc/src/host/umd_host.d.ts +51 -0
- package/ngcc/src/host/umd_host.js +250 -0
- package/ngcc/src/main.d.ts +7 -8
- package/ngcc/src/main.js +64 -48
- package/ngcc/src/packages/build_marker.d.ts +3 -2
- package/ngcc/src/packages/build_marker.js +5 -6
- package/ngcc/src/packages/bundle_program.d.ts +13 -4
- package/ngcc/src/packages/bundle_program.js +11 -12
- package/ngcc/src/packages/entry_point.d.ts +6 -10
- package/ngcc/src/packages/entry_point.js +28 -24
- package/ngcc/src/packages/entry_point_bundle.d.ts +3 -1
- package/ngcc/src/packages/entry_point_bundle.js +10 -21
- package/ngcc/src/packages/entry_point_finder.d.ts +33 -3
- package/ngcc/src/packages/entry_point_finder.js +80 -18
- package/ngcc/src/packages/ngcc_compiler_host.d.ts +31 -0
- package/ngcc/src/packages/ngcc_compiler_host.js +108 -0
- package/ngcc/src/packages/transformer.d.ts +7 -5
- package/ngcc/src/packages/transformer.js +36 -12
- package/ngcc/src/rendering/commonjs_rendering_formatter.d.ts +25 -0
- package/ngcc/src/rendering/commonjs_rendering_formatter.js +89 -0
- package/ngcc/src/rendering/dts_renderer.d.ts +51 -0
- package/ngcc/src/rendering/dts_renderer.js +135 -0
- package/ngcc/src/rendering/esm5_rendering_formatter.d.ts +21 -0
- package/ngcc/src/rendering/esm5_rendering_formatter.js +44 -0
- package/ngcc/src/rendering/esm_rendering_formatter.d.ts +63 -0
- package/ngcc/src/rendering/esm_rendering_formatter.js +202 -0
- package/ngcc/src/rendering/renderer.d.ts +16 -112
- package/ngcc/src/rendering/renderer.js +38 -285
- package/ngcc/src/rendering/rendering_formatter.d.ts +35 -0
- package/ngcc/src/rendering/rendering_formatter.js +14 -0
- package/ngcc/src/rendering/source_maps.d.ts +45 -0
- package/ngcc/src/rendering/source_maps.js +129 -0
- package/ngcc/src/rendering/umd_rendering_formatter.d.ts +28 -0
- package/ngcc/src/rendering/umd_rendering_formatter.js +222 -0
- package/ngcc/src/rendering/utils.d.ts +25 -0
- package/ngcc/src/rendering/utils.js +34 -0
- package/ngcc/src/utils.d.ts +12 -0
- package/ngcc/src/utils.js +10 -1
- package/ngcc/src/writing/file_writer.d.ts +2 -2
- package/ngcc/src/writing/file_writer.js +1 -1
- package/ngcc/src/writing/in_place_file_writer.d.ts +6 -10
- package/ngcc/src/writing/in_place_file_writer.js +18 -19
- package/ngcc/src/writing/new_entry_point_file_writer.d.ts +4 -4
- package/ngcc/src/writing/new_entry_point_file_writer.js +24 -25
- package/package.json +2 -2
- package/src/ngtsc/annotations/src/base_def.d.ts +5 -4
- package/src/ngtsc/annotations/src/base_def.js +12 -3
- package/src/ngtsc/annotations/src/component.d.ts +0 -1
- package/src/ngtsc/annotations/src/component.js +2 -5
- package/src/ngtsc/annotations/src/directive.d.ts +2 -1
- package/src/ngtsc/annotations/src/directive.js +5 -4
- package/src/ngtsc/annotations/src/injectable.js +1 -3
- package/src/ngtsc/annotations/src/ng_module.d.ts +2 -1
- package/src/ngtsc/annotations/src/ng_module.js +17 -10
- package/src/ngtsc/annotations/src/pipe.js +1 -1
- package/src/ngtsc/annotations/src/util.js +7 -4
- package/src/ngtsc/imports/src/emitter.d.ts +8 -6
- package/src/ngtsc/imports/src/emitter.js +10 -38
- package/src/ngtsc/imports/src/resolver.js +4 -5
- package/src/ngtsc/incremental/src/state.d.ts +15 -3
- package/src/ngtsc/incremental/src/state.js +72 -52
- package/src/ngtsc/metadata/src/api.d.ts +18 -1
- package/src/ngtsc/metadata/src/api.js +1 -1
- package/src/ngtsc/metadata/src/util.d.ts +2 -2
- package/src/ngtsc/metadata/src/util.js +28 -9
- package/src/ngtsc/partial_evaluator/index.d.ts +1 -1
- package/src/ngtsc/partial_evaluator/index.js +1 -1
- package/src/ngtsc/partial_evaluator/src/dynamic.d.ts +2 -1
- package/src/ngtsc/partial_evaluator/src/dynamic.js +1 -1
- package/src/ngtsc/partial_evaluator/src/interface.d.ts +10 -3
- package/src/ngtsc/partial_evaluator/src/interface.js +6 -7
- package/src/ngtsc/partial_evaluator/src/interpreter.d.ts +4 -3
- package/src/ngtsc/partial_evaluator/src/interpreter.js +11 -9
- package/src/ngtsc/path/src/logical.js +4 -3
- package/src/ngtsc/path/src/types.d.ts +19 -7
- package/src/ngtsc/path/src/types.js +48 -9
- package/src/ngtsc/program.js +13 -12
- package/src/ngtsc/scope/src/local.d.ts +23 -5
- package/src/ngtsc/scope/src/local.js +34 -11
- package/src/ngtsc/shims/src/factory_generator.js +4 -2
- package/src/ngtsc/transform/src/api.d.ts +0 -1
- package/src/ngtsc/transform/src/api.js +1 -1
- package/src/ngtsc/transform/src/compilation.d.ts +4 -2
- package/src/ngtsc/transform/src/compilation.js +22 -20
- package/src/ngtsc/translator/index.d.ts +1 -1
- package/src/ngtsc/translator/index.js +1 -1
- package/src/ngtsc/translator/src/translator.d.ts +21 -8
- package/src/ngtsc/translator/src/translator.js +3 -12
- package/src/ngtsc/typecheck/src/api.d.ts +2 -1
- package/src/ngtsc/typecheck/src/api.js +1 -1
- package/src/ngtsc/typecheck/src/expression.js +104 -88
- package/src/ngtsc/typecheck/src/type_check_block.js +17 -11
- package/src/ngtsc/util/src/typescript.d.ts +7 -0
- package/src/ngtsc/util/src/typescript.js +17 -1
- package/src/version.js +1 -1
- package/ngcc/src/packages/dependency_host.d.ts +0 -84
- package/ngcc/src/packages/dependency_host.js +0 -164
- package/ngcc/src/packages/dependency_resolver.js +0 -126
- package/ngcc/src/rendering/esm5_renderer.d.ts +0 -14
- package/ngcc/src/rendering/esm5_renderer.js +0 -47
- package/ngcc/src/rendering/esm_renderer.d.ts +0 -30
- package/ngcc/src/rendering/esm_renderer.js +0 -141
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
/// <amd-module name="@angular/compiler-cli/ngcc/src/dependencies/module_resolver" />
|
|
9
|
+
import { AbsoluteFsPath } from '../../../src/ngtsc/path';
|
|
10
|
+
import { FileSystem } from '../file_system/file_system';
|
|
11
|
+
import { PathMappings } from '../utils';
|
|
12
|
+
/**
|
|
13
|
+
* This is a very cut-down implementation of the TypeScript module resolution strategy.
|
|
14
|
+
*
|
|
15
|
+
* It is specific to the needs of ngcc and is not intended to be a drop-in replacement
|
|
16
|
+
* for the TS module resolver. It is used to compute the dependencies between entry-points
|
|
17
|
+
* that may be compiled by ngcc.
|
|
18
|
+
*
|
|
19
|
+
* The algorithm only finds `.js` files for internal/relative imports and paths to
|
|
20
|
+
* the folder containing the `package.json` of the entry-point for external imports.
|
|
21
|
+
*
|
|
22
|
+
* It can cope with nested `node_modules` folders and also supports `paths`/`baseUrl`
|
|
23
|
+
* configuration properties, as provided in a `ts.CompilerOptions` object.
|
|
24
|
+
*/
|
|
25
|
+
export declare class ModuleResolver {
|
|
26
|
+
private fs;
|
|
27
|
+
private relativeExtensions;
|
|
28
|
+
private pathMappings;
|
|
29
|
+
constructor(fs: FileSystem, pathMappings?: PathMappings, relativeExtensions?: string[]);
|
|
30
|
+
/**
|
|
31
|
+
* Resolve an absolute path for the `moduleName` imported into a file at `fromPath`.
|
|
32
|
+
* @param moduleName The name of the import to resolve.
|
|
33
|
+
* @param fromPath The path to the file containing the import.
|
|
34
|
+
* @returns A path to the resolved module or null if missing.
|
|
35
|
+
* Specifically:
|
|
36
|
+
* * the absolute path to the package.json of an external module
|
|
37
|
+
* * a JavaScript file of an internal module
|
|
38
|
+
* * null if none exists.
|
|
39
|
+
*/
|
|
40
|
+
resolveModuleImport(moduleName: string, fromPath: AbsoluteFsPath): ResolvedModule | null;
|
|
41
|
+
/**
|
|
42
|
+
* Convert the `pathMappings` into a collection of `PathMapper` functions.
|
|
43
|
+
*/
|
|
44
|
+
private processPathMappings;
|
|
45
|
+
/**
|
|
46
|
+
* Try to resolve a module name, as a relative path, from the `fromPath`.
|
|
47
|
+
*
|
|
48
|
+
* As it is relative, it only looks for files that end in one of the `relativeExtensions`.
|
|
49
|
+
* For example: `${moduleName}.js` or `${moduleName}/index.js`.
|
|
50
|
+
* If neither of these files exist then the method returns `null`.
|
|
51
|
+
*/
|
|
52
|
+
private resolveAsRelativePath;
|
|
53
|
+
/**
|
|
54
|
+
* Try to resolve the `moduleName`, by applying the computed `pathMappings` and
|
|
55
|
+
* then trying to resolve the mapped path as a relative or external import.
|
|
56
|
+
*
|
|
57
|
+
* Whether the mapped path is relative is defined as it being "below the `fromPath`" and not
|
|
58
|
+
* containing `node_modules`.
|
|
59
|
+
*
|
|
60
|
+
* If the mapped path is not relative but does not resolve to an external entry-point, then we
|
|
61
|
+
* check whether it would have resolved to a relative path, in which case it is marked as a
|
|
62
|
+
* "deep-import".
|
|
63
|
+
*/
|
|
64
|
+
private resolveByPathMappings;
|
|
65
|
+
/**
|
|
66
|
+
* Try to resolve the `moduleName` as an external entry-point by searching the `node_modules`
|
|
67
|
+
* folders up the tree for a matching `.../node_modules/${moduleName}`.
|
|
68
|
+
*
|
|
69
|
+
* If a folder is found but the path does not contain a `package.json` then it is marked as a
|
|
70
|
+
* "deep-import".
|
|
71
|
+
*/
|
|
72
|
+
private resolveAsEntryPoint;
|
|
73
|
+
/**
|
|
74
|
+
* Attempt to resolve a `path` to a file by appending the provided `postFixes`
|
|
75
|
+
* to the `path` and checking if the file exists on disk.
|
|
76
|
+
* @returns An absolute path to the first matching existing file, or `null` if none exist.
|
|
77
|
+
*/
|
|
78
|
+
private resolvePath;
|
|
79
|
+
/**
|
|
80
|
+
* Can we consider the given path as an entry-point to a package?
|
|
81
|
+
*
|
|
82
|
+
* This is achieved by checking for the existence of `${modulePath}/package.json`.
|
|
83
|
+
*/
|
|
84
|
+
private isEntryPoint;
|
|
85
|
+
/**
|
|
86
|
+
* Apply the `pathMappers` to the `moduleName` and return all the possible
|
|
87
|
+
* paths that match.
|
|
88
|
+
*
|
|
89
|
+
* The mapped path is computed for each template in `mapping.templates` by
|
|
90
|
+
* replacing the `matcher.prefix` and `matcher.postfix` strings in `path with the
|
|
91
|
+
* `template.prefix` and `template.postfix` strings.
|
|
92
|
+
*/
|
|
93
|
+
private findMappedPaths;
|
|
94
|
+
/**
|
|
95
|
+
* Attempt to find a mapped path for the given `path` and a `mapping`.
|
|
96
|
+
*
|
|
97
|
+
* The `path` matches the `mapping` if if it starts with `matcher.prefix` and ends with
|
|
98
|
+
* `matcher.postfix`.
|
|
99
|
+
*
|
|
100
|
+
* @returns the wildcard segment of a matched `path`, or `null` if no match.
|
|
101
|
+
*/
|
|
102
|
+
private matchMapping;
|
|
103
|
+
/**
|
|
104
|
+
* Compute the candidate paths from the given mapping's templates using the matched
|
|
105
|
+
* string.
|
|
106
|
+
*/
|
|
107
|
+
private computeMappedTemplates;
|
|
108
|
+
/**
|
|
109
|
+
* Search up the folder tree for the first folder that contains `package.json`
|
|
110
|
+
* or `null` if none is found.
|
|
111
|
+
*/
|
|
112
|
+
private findPackagePath;
|
|
113
|
+
}
|
|
114
|
+
/** The result of resolving an import to a module. */
|
|
115
|
+
export declare type ResolvedModule = ResolvedExternalModule | ResolvedRelativeModule | ResolvedDeepImport;
|
|
116
|
+
/**
|
|
117
|
+
* A module that is external to the package doing the importing.
|
|
118
|
+
* In this case we capture the folder containing the entry-point.
|
|
119
|
+
*/
|
|
120
|
+
export declare class ResolvedExternalModule {
|
|
121
|
+
entryPointPath: AbsoluteFsPath;
|
|
122
|
+
constructor(entryPointPath: AbsoluteFsPath);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* A module that is relative to the module doing the importing, and so internal to the
|
|
126
|
+
* source module's package.
|
|
127
|
+
*/
|
|
128
|
+
export declare class ResolvedRelativeModule {
|
|
129
|
+
modulePath: AbsoluteFsPath;
|
|
130
|
+
constructor(modulePath: AbsoluteFsPath);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A module that is external to the package doing the importing but pointing to a
|
|
134
|
+
* module that is deep inside a package, rather than to an entry-point of the package.
|
|
135
|
+
*/
|
|
136
|
+
export declare class ResolvedDeepImport {
|
|
137
|
+
importPath: AbsoluteFsPath;
|
|
138
|
+
constructor(importPath: AbsoluteFsPath);
|
|
139
|
+
}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
(function (factory) {
|
|
9
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
10
|
+
var v = factory(require, exports);
|
|
11
|
+
if (v !== undefined) module.exports = v;
|
|
12
|
+
}
|
|
13
|
+
else if (typeof define === "function" && define.amd) {
|
|
14
|
+
define("@angular/compiler-cli/ngcc/src/dependencies/module_resolver", ["require", "exports", "tslib", "@angular/compiler-cli/src/ngtsc/path", "@angular/compiler-cli/ngcc/src/utils"], factory);
|
|
15
|
+
}
|
|
16
|
+
})(function (require, exports) {
|
|
17
|
+
"use strict";
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
var tslib_1 = require("tslib");
|
|
20
|
+
var path_1 = require("@angular/compiler-cli/src/ngtsc/path");
|
|
21
|
+
var utils_1 = require("@angular/compiler-cli/ngcc/src/utils");
|
|
22
|
+
/**
|
|
23
|
+
* This is a very cut-down implementation of the TypeScript module resolution strategy.
|
|
24
|
+
*
|
|
25
|
+
* It is specific to the needs of ngcc and is not intended to be a drop-in replacement
|
|
26
|
+
* for the TS module resolver. It is used to compute the dependencies between entry-points
|
|
27
|
+
* that may be compiled by ngcc.
|
|
28
|
+
*
|
|
29
|
+
* The algorithm only finds `.js` files for internal/relative imports and paths to
|
|
30
|
+
* the folder containing the `package.json` of the entry-point for external imports.
|
|
31
|
+
*
|
|
32
|
+
* It can cope with nested `node_modules` folders and also supports `paths`/`baseUrl`
|
|
33
|
+
* configuration properties, as provided in a `ts.CompilerOptions` object.
|
|
34
|
+
*/
|
|
35
|
+
var ModuleResolver = /** @class */ (function () {
|
|
36
|
+
function ModuleResolver(fs, pathMappings, relativeExtensions) {
|
|
37
|
+
if (relativeExtensions === void 0) { relativeExtensions = [
|
|
38
|
+
'.js', '/index.js'
|
|
39
|
+
]; }
|
|
40
|
+
this.fs = fs;
|
|
41
|
+
this.relativeExtensions = relativeExtensions;
|
|
42
|
+
this.pathMappings = pathMappings ? this.processPathMappings(pathMappings) : [];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve an absolute path for the `moduleName` imported into a file at `fromPath`.
|
|
46
|
+
* @param moduleName The name of the import to resolve.
|
|
47
|
+
* @param fromPath The path to the file containing the import.
|
|
48
|
+
* @returns A path to the resolved module or null if missing.
|
|
49
|
+
* Specifically:
|
|
50
|
+
* * the absolute path to the package.json of an external module
|
|
51
|
+
* * a JavaScript file of an internal module
|
|
52
|
+
* * null if none exists.
|
|
53
|
+
*/
|
|
54
|
+
ModuleResolver.prototype.resolveModuleImport = function (moduleName, fromPath) {
|
|
55
|
+
if (utils_1.isRelativePath(moduleName)) {
|
|
56
|
+
return this.resolveAsRelativePath(moduleName, fromPath);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return this.pathMappings.length && this.resolveByPathMappings(moduleName, fromPath) ||
|
|
60
|
+
this.resolveAsEntryPoint(moduleName, fromPath);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Convert the `pathMappings` into a collection of `PathMapper` functions.
|
|
65
|
+
*/
|
|
66
|
+
ModuleResolver.prototype.processPathMappings = function (pathMappings) {
|
|
67
|
+
var baseUrl = path_1.AbsoluteFsPath.from(pathMappings.baseUrl);
|
|
68
|
+
return Object.keys(pathMappings.paths).map(function (pathPattern) {
|
|
69
|
+
var matcher = splitOnStar(pathPattern);
|
|
70
|
+
var templates = pathMappings.paths[pathPattern].map(splitOnStar);
|
|
71
|
+
return { matcher: matcher, templates: templates, baseUrl: baseUrl };
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Try to resolve a module name, as a relative path, from the `fromPath`.
|
|
76
|
+
*
|
|
77
|
+
* As it is relative, it only looks for files that end in one of the `relativeExtensions`.
|
|
78
|
+
* For example: `${moduleName}.js` or `${moduleName}/index.js`.
|
|
79
|
+
* If neither of these files exist then the method returns `null`.
|
|
80
|
+
*/
|
|
81
|
+
ModuleResolver.prototype.resolveAsRelativePath = function (moduleName, fromPath) {
|
|
82
|
+
var resolvedPath = this.resolvePath(path_1.AbsoluteFsPath.resolve(path_1.AbsoluteFsPath.dirname(fromPath), moduleName), this.relativeExtensions);
|
|
83
|
+
return resolvedPath && new ResolvedRelativeModule(resolvedPath);
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Try to resolve the `moduleName`, by applying the computed `pathMappings` and
|
|
87
|
+
* then trying to resolve the mapped path as a relative or external import.
|
|
88
|
+
*
|
|
89
|
+
* Whether the mapped path is relative is defined as it being "below the `fromPath`" and not
|
|
90
|
+
* containing `node_modules`.
|
|
91
|
+
*
|
|
92
|
+
* If the mapped path is not relative but does not resolve to an external entry-point, then we
|
|
93
|
+
* check whether it would have resolved to a relative path, in which case it is marked as a
|
|
94
|
+
* "deep-import".
|
|
95
|
+
*/
|
|
96
|
+
ModuleResolver.prototype.resolveByPathMappings = function (moduleName, fromPath) {
|
|
97
|
+
var e_1, _a;
|
|
98
|
+
var mappedPaths = this.findMappedPaths(moduleName);
|
|
99
|
+
if (mappedPaths.length > 0) {
|
|
100
|
+
var packagePath = this.findPackagePath(fromPath);
|
|
101
|
+
if (packagePath !== null) {
|
|
102
|
+
try {
|
|
103
|
+
for (var mappedPaths_1 = tslib_1.__values(mappedPaths), mappedPaths_1_1 = mappedPaths_1.next(); !mappedPaths_1_1.done; mappedPaths_1_1 = mappedPaths_1.next()) {
|
|
104
|
+
var mappedPath = mappedPaths_1_1.value;
|
|
105
|
+
var isRelative = mappedPath.startsWith(packagePath) && !mappedPath.includes('node_modules');
|
|
106
|
+
if (isRelative) {
|
|
107
|
+
return this.resolveAsRelativePath(mappedPath, fromPath);
|
|
108
|
+
}
|
|
109
|
+
else if (this.isEntryPoint(mappedPath)) {
|
|
110
|
+
return new ResolvedExternalModule(mappedPath);
|
|
111
|
+
}
|
|
112
|
+
else if (this.resolveAsRelativePath(mappedPath, fromPath)) {
|
|
113
|
+
return new ResolvedDeepImport(mappedPath);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
118
|
+
finally {
|
|
119
|
+
try {
|
|
120
|
+
if (mappedPaths_1_1 && !mappedPaths_1_1.done && (_a = mappedPaths_1.return)) _a.call(mappedPaths_1);
|
|
121
|
+
}
|
|
122
|
+
finally { if (e_1) throw e_1.error; }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Try to resolve the `moduleName` as an external entry-point by searching the `node_modules`
|
|
130
|
+
* folders up the tree for a matching `.../node_modules/${moduleName}`.
|
|
131
|
+
*
|
|
132
|
+
* If a folder is found but the path does not contain a `package.json` then it is marked as a
|
|
133
|
+
* "deep-import".
|
|
134
|
+
*/
|
|
135
|
+
ModuleResolver.prototype.resolveAsEntryPoint = function (moduleName, fromPath) {
|
|
136
|
+
var folder = fromPath;
|
|
137
|
+
while (!path_1.AbsoluteFsPath.isRoot(folder)) {
|
|
138
|
+
folder = path_1.AbsoluteFsPath.dirname(folder);
|
|
139
|
+
if (folder.endsWith('node_modules')) {
|
|
140
|
+
// Skip up if the folder already ends in node_modules
|
|
141
|
+
folder = path_1.AbsoluteFsPath.dirname(folder);
|
|
142
|
+
}
|
|
143
|
+
var modulePath = path_1.AbsoluteFsPath.resolve(folder, 'node_modules', moduleName);
|
|
144
|
+
if (this.isEntryPoint(modulePath)) {
|
|
145
|
+
return new ResolvedExternalModule(modulePath);
|
|
146
|
+
}
|
|
147
|
+
else if (this.resolveAsRelativePath(modulePath, fromPath)) {
|
|
148
|
+
return new ResolvedDeepImport(modulePath);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Attempt to resolve a `path` to a file by appending the provided `postFixes`
|
|
155
|
+
* to the `path` and checking if the file exists on disk.
|
|
156
|
+
* @returns An absolute path to the first matching existing file, or `null` if none exist.
|
|
157
|
+
*/
|
|
158
|
+
ModuleResolver.prototype.resolvePath = function (path, postFixes) {
|
|
159
|
+
var e_2, _a;
|
|
160
|
+
try {
|
|
161
|
+
for (var postFixes_1 = tslib_1.__values(postFixes), postFixes_1_1 = postFixes_1.next(); !postFixes_1_1.done; postFixes_1_1 = postFixes_1.next()) {
|
|
162
|
+
var postFix = postFixes_1_1.value;
|
|
163
|
+
var testPath = path_1.AbsoluteFsPath.fromUnchecked(path + postFix);
|
|
164
|
+
if (this.fs.exists(testPath)) {
|
|
165
|
+
return testPath;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
170
|
+
finally {
|
|
171
|
+
try {
|
|
172
|
+
if (postFixes_1_1 && !postFixes_1_1.done && (_a = postFixes_1.return)) _a.call(postFixes_1);
|
|
173
|
+
}
|
|
174
|
+
finally { if (e_2) throw e_2.error; }
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Can we consider the given path as an entry-point to a package?
|
|
180
|
+
*
|
|
181
|
+
* This is achieved by checking for the existence of `${modulePath}/package.json`.
|
|
182
|
+
*/
|
|
183
|
+
ModuleResolver.prototype.isEntryPoint = function (modulePath) {
|
|
184
|
+
return this.fs.exists(path_1.AbsoluteFsPath.join(modulePath, 'package.json'));
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Apply the `pathMappers` to the `moduleName` and return all the possible
|
|
188
|
+
* paths that match.
|
|
189
|
+
*
|
|
190
|
+
* The mapped path is computed for each template in `mapping.templates` by
|
|
191
|
+
* replacing the `matcher.prefix` and `matcher.postfix` strings in `path with the
|
|
192
|
+
* `template.prefix` and `template.postfix` strings.
|
|
193
|
+
*/
|
|
194
|
+
ModuleResolver.prototype.findMappedPaths = function (moduleName) {
|
|
195
|
+
var _this = this;
|
|
196
|
+
var matches = this.pathMappings.map(function (mapping) { return _this.matchMapping(moduleName, mapping); });
|
|
197
|
+
var bestMapping;
|
|
198
|
+
var bestMatch;
|
|
199
|
+
for (var index = 0; index < this.pathMappings.length; index++) {
|
|
200
|
+
var mapping = this.pathMappings[index];
|
|
201
|
+
var match = matches[index];
|
|
202
|
+
if (match !== null) {
|
|
203
|
+
// If this mapping had no wildcard then this must be a complete match.
|
|
204
|
+
if (!mapping.matcher.hasWildcard) {
|
|
205
|
+
bestMatch = match;
|
|
206
|
+
bestMapping = mapping;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
// The best matched mapping is the one with the longest prefix.
|
|
210
|
+
if (!bestMapping || mapping.matcher.prefix > bestMapping.matcher.prefix) {
|
|
211
|
+
bestMatch = match;
|
|
212
|
+
bestMapping = mapping;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return (bestMapping && bestMatch) ? this.computeMappedTemplates(bestMapping, bestMatch) : [];
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* Attempt to find a mapped path for the given `path` and a `mapping`.
|
|
220
|
+
*
|
|
221
|
+
* The `path` matches the `mapping` if if it starts with `matcher.prefix` and ends with
|
|
222
|
+
* `matcher.postfix`.
|
|
223
|
+
*
|
|
224
|
+
* @returns the wildcard segment of a matched `path`, or `null` if no match.
|
|
225
|
+
*/
|
|
226
|
+
ModuleResolver.prototype.matchMapping = function (path, mapping) {
|
|
227
|
+
var _a = mapping.matcher, prefix = _a.prefix, postfix = _a.postfix, hasWildcard = _a.hasWildcard;
|
|
228
|
+
if (path.startsWith(prefix) && path.endsWith(postfix)) {
|
|
229
|
+
return hasWildcard ? path.substring(prefix.length, path.length - postfix.length) : '';
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* Compute the candidate paths from the given mapping's templates using the matched
|
|
235
|
+
* string.
|
|
236
|
+
*/
|
|
237
|
+
ModuleResolver.prototype.computeMappedTemplates = function (mapping, match) {
|
|
238
|
+
return mapping.templates.map(function (template) {
|
|
239
|
+
return path_1.AbsoluteFsPath.resolve(mapping.baseUrl, template.prefix + match + template.postfix);
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
/**
|
|
243
|
+
* Search up the folder tree for the first folder that contains `package.json`
|
|
244
|
+
* or `null` if none is found.
|
|
245
|
+
*/
|
|
246
|
+
ModuleResolver.prototype.findPackagePath = function (path) {
|
|
247
|
+
var folder = path;
|
|
248
|
+
while (!path_1.AbsoluteFsPath.isRoot(folder)) {
|
|
249
|
+
folder = path_1.AbsoluteFsPath.dirname(folder);
|
|
250
|
+
if (this.fs.exists(path_1.AbsoluteFsPath.join(folder, 'package.json'))) {
|
|
251
|
+
return folder;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
};
|
|
256
|
+
return ModuleResolver;
|
|
257
|
+
}());
|
|
258
|
+
exports.ModuleResolver = ModuleResolver;
|
|
259
|
+
/**
|
|
260
|
+
* A module that is external to the package doing the importing.
|
|
261
|
+
* In this case we capture the folder containing the entry-point.
|
|
262
|
+
*/
|
|
263
|
+
var ResolvedExternalModule = /** @class */ (function () {
|
|
264
|
+
function ResolvedExternalModule(entryPointPath) {
|
|
265
|
+
this.entryPointPath = entryPointPath;
|
|
266
|
+
}
|
|
267
|
+
return ResolvedExternalModule;
|
|
268
|
+
}());
|
|
269
|
+
exports.ResolvedExternalModule = ResolvedExternalModule;
|
|
270
|
+
/**
|
|
271
|
+
* A module that is relative to the module doing the importing, and so internal to the
|
|
272
|
+
* source module's package.
|
|
273
|
+
*/
|
|
274
|
+
var ResolvedRelativeModule = /** @class */ (function () {
|
|
275
|
+
function ResolvedRelativeModule(modulePath) {
|
|
276
|
+
this.modulePath = modulePath;
|
|
277
|
+
}
|
|
278
|
+
return ResolvedRelativeModule;
|
|
279
|
+
}());
|
|
280
|
+
exports.ResolvedRelativeModule = ResolvedRelativeModule;
|
|
281
|
+
/**
|
|
282
|
+
* A module that is external to the package doing the importing but pointing to a
|
|
283
|
+
* module that is deep inside a package, rather than to an entry-point of the package.
|
|
284
|
+
*/
|
|
285
|
+
var ResolvedDeepImport = /** @class */ (function () {
|
|
286
|
+
function ResolvedDeepImport(importPath) {
|
|
287
|
+
this.importPath = importPath;
|
|
288
|
+
}
|
|
289
|
+
return ResolvedDeepImport;
|
|
290
|
+
}());
|
|
291
|
+
exports.ResolvedDeepImport = ResolvedDeepImport;
|
|
292
|
+
function splitOnStar(str) {
|
|
293
|
+
var _a = tslib_1.__read(str.split('*', 2), 2), prefix = _a[0], postfix = _a[1];
|
|
294
|
+
return { prefix: prefix, postfix: postfix || '', hasWildcard: postfix !== undefined };
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlX3Jlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXItY2xpL25nY2Mvc3JjL2RlcGVuZGVuY2llcy9tb2R1bGVfcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7O0lBRUgsNkRBQXVEO0lBRXZELDhEQUFzRDtJQUV0RDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSDtRQUdFLHdCQUFvQixFQUFjLEVBQUUsWUFBMkIsRUFBVSxrQkFFeEU7WUFGd0UsbUNBQUEsRUFBQTtnQkFDdkUsS0FBSyxFQUFFLFdBQVc7YUFDbkI7WUFGbUIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtZQUF1Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBRTFGO1lBQ0MsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pGLENBQUM7UUFFRDs7Ozs7Ozs7O1dBU0c7UUFDSCw0Q0FBbUIsR0FBbkIsVUFBb0IsVUFBa0IsRUFBRSxRQUF3QjtZQUM5RCxJQUFJLHNCQUFjLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN6RDtpQkFBTTtnQkFDTCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDO29CQUMvRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3BEO1FBQ0gsQ0FBQztRQUVEOztXQUVHO1FBQ0ssNENBQW1CLEdBQTNCLFVBQTRCLFlBQTBCO1lBQ3BELElBQU0sT0FBTyxHQUFHLHFC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RSxnQ0FBbUIsVUFBMEI7WUFBMUIsZUFBVSxHQUFWLFVBQVUsQ0FBZ0I7UUFBRyxDQUFDO1FBQ25ELDZCQUFDO0lBQUQsQ0FBQyxBQUZELElBRUM7SUFGWSx3REFBc0I7SUFJbkM7OztPQUdHO0lBQ0g7UUFDRSw0QkFBbUIsVUFBMEI7WUFBMUIsZUFBVSxHQUFWLFVBQVUsQ0FBZ0I7UUFBRyxDQUFDO1FBQ25ELHlCQUFDO0lBQUQsQ0FBQyxBQUZELElBRUM7SUFGWSxnREFBa0I7SUFJL0IsU0FBUyxXQUFXLENBQUMsR0FBVztRQUN4QixJQUFBLHlDQUFxQyxFQUFwQyxjQUFNLEVBQUUsZUFBNEIsQ0FBQztRQUM1QyxPQUFPLEVBQUMsTUFBTSxRQUFBLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sS0FBSyxTQUFTLEVBQUMsQ0FBQztJQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0Fic29sdXRlRnNQYXRofSBmcm9tICcuLi8uLi8uLi9zcmMvbmd0c2MvcGF0aCc7XG5pbXBvcnQge0ZpbGVTeXN0ZW19IGZyb20gJy4uL2ZpbGVfc3lzdGVtL2ZpbGVfc3lzdGVtJztcbmltcG9ydCB7UGF0aE1hcHBpbmdzLCBpc1JlbGF0aXZlUGF0aH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIFRoaXMgaXMgYSB2ZXJ5IGN1dC1kb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUeXBlU2NyaXB0IG1vZHVsZSByZXNvbHV0aW9uIHN0cmF0ZWd5LlxuICpcbiAqIEl0IGlzIHNwZWNpZmljIHRvIHRoZSBuZWVkcyBvZiBuZ2NjIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50XG4gKiBmb3IgdGhlIFRTIG1vZHVsZSByZXNvbHZlci4gSXQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBlbnRyeS1wb2ludHNcbiAqIHRoYXQgbWF5IGJlIGNvbXBpbGVkIGJ5IG5nY2MuXG4gKlxuICogVGhlIGFsZ29yaXRobSBvbmx5IGZpbmRzIGAuanNgIGZpbGVzIGZvciBpbnRlcm5hbC9yZWxhdGl2ZSBpbXBvcnRzIGFuZCBwYXRocyB0b1xuICogdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSBgcGFja2FnZS5qc29uYCBvZiB0aGUgZW50cnktcG9pbnQgZm9yIGV4dGVybmFsIGltcG9ydHMuXG4gKlxuICogSXQgY2FuIGNvcGUgd2l0aCBuZXN0ZWQgYG5vZGVfbW9kdWxlc2AgZm9sZGVycyBhbmQgYWxzbyBzdXBwb3J0cyBgcGF0aHNgL2BiYXNlVXJsYFxuICogY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLCBhcyBwcm92aWRlZCBpbiBhIGB0cy5Db21waWxlck9wdGlvbnNgIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZHVsZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSBwYXRoTWFwcGluZ3M6IFByb2Nlc3NlZFBhdGhNYXBwaW5nW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmczogRmlsZVN5c3RlbSwgcGF0aE1hcHBpbmdzPzogUGF0aE1hcHBpbmdzLCBwcml2YXRlIHJlbGF0aXZlRXh0ZW5zaW9ucyA9IFtcbiAgICAnLmpzJywgJy9pbmRleC5qcydcbiAgXSkge1xuICAgIHRoaXMucGF0aE1hcHBpbmdzID0gcGF0aE1hcHBpbmdzID8gdGhpcy5wcm9jZXNzUGF0aE1hcHBpbmdzKHBhdGhNYXBwaW5ncykgOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGFic29sdXRlIHBhdGggZm9yIHRoZSBgbW9kdWxlTmFtZWAgaW1wb3J0ZWQgaW50byBhIGZpbGUgYXQgYGZyb21QYXRoYC5cbiAgICogQHBhcmFtIG1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGltcG9ydCB0byByZXNvbHZlLlxuICAgKiBAcGFyYW0gZnJvbVBhdGggVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW1wb3J0LlxuICAgKiBAcmV0dXJucyBBIHBhdGggdG8gdGhlIHJlc29sdmVkIG1vZHVsZSBvciBudWxsIGlmIG1pc3NpbmcuXG4gICAqIFNwZWNpZmljYWxseTpcbiAgICogICogdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHBhY2thZ2UuanNvbiBvZiBhbiBleHRlcm5hbCBtb2R1bGVcbiAgICogICogYSBKYXZhU2NyaXB0IGZpbGUgb2YgYW4gaW50ZXJuYWwgbW9kdWxlXG4gICAqICAqIG51bGwgaWYgbm9uZSBleGlzdHMuXG4gICAqL1xuICByZXNvbHZlTW9kdWxlSW1wb3J0KG1vZHVsZU5hbWU6IHN0cmluZywgZnJvbVBhdGg6IEFic29sdXRlRnNQYXRoKTogUmVzb2x2ZWRNb2R1bGV8bnVsbCB7XG4gICAgaWYgKGlzUmVsYXRpdmVQYXRoKG1vZHVsZU5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQXNSZWxhdGl2ZVBhdGgobW9kdWxlTmFtZSwgZnJvbVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoTWFwcGluZ3MubGVuZ3RoICYmIHRoaXMucmVzb2x2ZUJ5UGF0aE1hcHBpbmdzKG1vZHVsZU5hbWUsIGZyb21QYXRoKSB8fFxuICAgICAgICAgIHRoaXMucmVzb2x2ZUFzRW50cnlQb2ludChtb2R1bGVOYW1lLCBmcm9tUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGBwYXRoTWFwcGluZ3NgIGludG8gYSBjb2xsZWN0aW9uIG9mIGBQYXRoTWFwcGVyYCBmdW5jdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NQYXRoTWFwcGluZ3MocGF0aE1hcHBpbmdzOiBQYXRoTWFwcGluZ3MpOiBQcm9jZXNzZWRQYXRoTWFwcGluZ1tdIHtcbiAgICBjb25zdCBiYXNlVXJsID0gQWJzb2x1dGVGc1BhdGguZnJvbShwYXRoTWFwcGluZ3MuYmFzZVVybCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhdGhNYXBwaW5ncy5wYXRocykubWFwKHBhdGhQYXR0ZXJuID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXIgPSBzcGxpdE9uU3RhcihwYXRoUGF0dGVybik7XG4gICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBwYXRoTWFwcGluZ3MucGF0aHNbcGF0aFBhdHRlcm5dLm1hcChzcGxpdE9uU3Rhcik7XG4gICAgICByZXR1cm4ge21hdGNoZXIsIHRlbXBsYXRlcywgYmFzZVVybH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHJlc29sdmUgYSBtb2R1bGUgbmFtZSwgYXMgYSByZWxhdGl2ZSBwYXRoLCBmcm9tIHRoZSBgZnJvbVBhdGhgLlxuICAgKlxuICAgKiBBcyBpdCBpcyByZWxhdGl2ZSwgaXQgb25seSBsb29rcyBmb3IgZmlsZXMgdGhhdCBlbmQgaW4gb25lIG9mIHRoZSBgcmVsYXRpdmVFeHRlbnNpb25zYC5cbiAgICogRm9yIGV4YW1wbGU6IGAke21vZHVsZU5hbWV9LmpzYCBvciBgJHttb2R1bGVOYW1lfS9pbmRleC5qc2AuXG4gICAqIElmIG5laXRoZXIgb2YgdGhlc2UgZmlsZXMgZXhpc3QgdGhlbiB0aGUgbWV0aG9kIHJldHVybnMgYG51bGxgLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlQXNSZWxhdGl2ZVBhdGgobW9kdWxlTmFtZTogc3RyaW5nLCBmcm9tUGF0aDogQWJzb2x1dGVGc1BhdGgpOiBSZXNvbHZlZE1vZHVsZXxudWxsIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSB0aGlzLnJlc29sdmVQYXRoKFxuICAgICAgICBBYnNvbHV0ZUZzUGF0aC5yZXNvbHZlKEFic29sdXRlRnNQYXRoLmRpcm5hbWUoZnJvbVBhdGgpLCBtb2R1bGVOYW1lKSxcbiAgICAgICAgdGhpcy5yZWxhdGl2ZUV4dGVuc2lvbnMpO1xuICAgIHJldHVybiByZXNvbHZlZFBhdGggJiYgbmV3IFJlc29sdmVkUmVsYXRpdmVNb2R1bGUocmVzb2x2ZWRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gcmVzb2x2ZSB0aGUgYG1vZHVsZU5hbWVgLCBieSBhcHBseWluZyB0aGUgY29tcHV0ZWQgYHBhdGhNYXBwaW5nc2AgYW5kXG4gICAqIHRoZW4gdHJ5aW5nIHRvIHJlc29sdmUgdGhlIG1hcHBlZCBwYXRoIGFzIGEgcmVsYXRpdmUgb3IgZXh0ZXJuYWwgaW1wb3J0LlxuICAgKlxuICAgKiBXaGV0aGVyIHRoZSBtYXBwZWQgcGF0aCBpcyByZWxhdGl2ZSBpcyBkZWZpbmVkIGFzIGl0IGJlaW5nIFwiYmVsb3cgdGhlIGBmcm9tUGF0aGBcIiBhbmQgbm90XG4gICAqIGNvbnRhaW5pbmcgYG5vZGVfbW9kdWxlc2AuXG4gICAqXG4gICAqIElmIHRoZSBtYXBwZWQgcGF0aCBpcyBub3QgcmVsYXRpdmUgYnV0IGRvZXMgbm90IHJlc29sdmUgdG8gYW4gZXh0ZXJuYWwgZW50cnktcG9pbnQsIHRoZW4gd2VcbiAgICogY2hlY2sgd2hldGhlciBpdCB3b3VsZCBoYXZlIHJlc29sdmVkIHRvIGEgcmVsYXRpdmUgcGF0aCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBtYXJrZWQgYXMgYVxuICAgKiBcImRlZXAtaW1wb3J0XCIuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVCeVBhdGhNYXBwaW5ncyhtb2R1bGVOYW1lOiBzdHJpbmcsIGZyb21QYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IFJlc29sdmVkTW9kdWxlfG51bGwge1xuICAgIGNvbnN0IG1hcHBlZFBhdGhzID0gdGhpcy5maW5kTWFwcGVkUGF0aHMobW9kdWxlTmFtZSk7XG4gICAgaWYgKG1hcHBlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gdGhpcy5maW5kUGFja2FnZVBhdGgoZnJvbVBhdGgpO1xuICAgICAgaWYgKHBhY2thZ2VQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWFwcGVkUGF0aCBvZiBtYXBwZWRQYXRocykge1xuICAgICAgICAgIGNvbnN0IGlzUmVsYXRpdmUgPVxuICAgICAgICAgICAgICBtYXBwZWRQYXRoLnN0YXJ0c1dpdGgocGFja2FnZVBhdGgpICYmICFtYXBwZWRQYXRoLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKTtcbiAgICAgICAgICBpZiAoaXNSZWxhdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUFzUmVsYXRpdmVQYXRoKG1hcHBlZFBhdGgsIGZyb21QYXRoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNFbnRyeVBvaW50KG1hcHBlZFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkRXh0ZXJuYWxNb2R1bGUobWFwcGVkUGF0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc29sdmVBc1JlbGF0aXZlUGF0aChtYXBwZWRQYXRoLCBmcm9tUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWREZWVwSW1wb3J0KG1hcHBlZFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gcmVzb2x2ZSB0aGUgYG1vZHVsZU5hbWVgIGFzIGFuIGV4dGVybmFsIGVudHJ5LXBvaW50IGJ5IHNlYXJjaGluZyB0aGUgYG5vZGVfbW9kdWxlc2BcbiAgICogZm9sZGVycyB1cCB0aGUgdHJlZSBmb3IgYSBtYXRjaGluZyBgLi4uL25vZGVfbW9kdWxlcy8ke21vZHVsZU5hbWV9YC5cbiAgICpcbiAgICogSWYgYSBmb2xkZXIgaXMgZm91bmQgYnV0IHRoZSBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYSBgcGFja2FnZS5qc29uYCB0aGVuIGl0IGlzIG1hcmtlZCBhcyBhXG4gICAqIFwiZGVlcC1pbXBvcnRcIi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFzRW50cnlQb2ludChtb2R1bGVOYW1lOiBzdHJpbmcsIGZyb21QYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IFJlc29sdmVkTW9kdWxlfG51bGwge1xuICAgIGxldCBmb2xkZXIgPSBmcm9tUGF0aDtcbiAgICB3aGlsZSAoIUFic29sdXRlRnNQYXRoLmlzUm9vdChmb2xkZXIpKSB7XG4gICAgICBmb2xkZXIgPSBBYnNvbHV0ZUZzUGF0aC5kaXJuYW1lKGZvbGRlcik7XG4gICAgICBpZiAoZm9sZGVyLmVuZHNXaXRoKCdub2RlX21vZHVsZXMnKSkge1xuICAgICAgICAvLyBTa2lwIHVwIGlmIHRoZSBmb2xkZXIgYWxyZWFkeSBlbmRzIGluIG5vZGVfbW9kdWxlc1xuICAgICAgICBmb2xkZXIgPSBBYnNvbHV0ZUZzUGF0aC5kaXJuYW1lKGZvbGRlcik7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2R1bGVQYXRoID0gQWJzb2x1dGVGc1BhdGgucmVzb2x2ZShmb2xkZXIsICdub2RlX21vZHVsZXMnLCBtb2R1bGVOYW1lKTtcbiAgICAgIGlmICh0aGlzLmlzRW50cnlQb2ludChtb2R1bGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkRXh0ZXJuYWxNb2R1bGUobW9kdWxlUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb2x2ZUFzUmVsYXRpdmVQYXRoKG1vZHVsZVBhdGgsIGZyb21QYXRoKSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkRGVlcEltcG9ydChtb2R1bGVQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byByZXNvbHZlIGEgYHBhdGhgIHRvIGEgZmlsZSBieSBhcHBlbmRpbmcgdGhlIHByb3ZpZGVkIGBwb3N0Rml4ZXNgXG4gICAqIHRvIHRoZSBgcGF0aGAgYW5kIGNoZWNraW5nIGlmIHRoZSBmaWxlIGV4aXN0cyBvbiBkaXNrLlxuICAgKiBAcmV0dXJucyBBbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaXJzdCBtYXRjaGluZyBleGlzdGluZyBmaWxlLCBvciBgbnVsbGAgaWYgbm9uZSBleGlzdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVBhdGgocGF0aDogQWJzb2x1dGVGc1BhdGgsIHBvc3RGaXhlczogc3RyaW5nW10pOiBBYnNvbHV0ZUZzUGF0aHxudWxsIHtcbiAgICBmb3IgKGNvbnN0IHBvc3RGaXggb2YgcG9zdEZpeGVzKSB7XG4gICAgICBjb25zdCB0ZXN0UGF0aCA9IEFic29sdXRlRnNQYXRoLmZyb21VbmNoZWNrZWQocGF0aCArIHBvc3RGaXgpO1xuICAgICAgaWYgKHRoaXMuZnMuZXhpc3RzKHRlc3RQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGVzdFBhdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbiB3ZSBjb25zaWRlciB0aGUgZ2l2ZW4gcGF0aCBhcyBhbiBlbnRyeS1wb2ludCB0byBhIHBhY2thZ2U/XG4gICAqXG4gICAqIFRoaXMgaXMgYWNoaWV2ZWQgYnkgY2hlY2tpbmcgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYCR7bW9kdWxlUGF0aH0vcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHByaXZhdGUgaXNFbnRyeVBvaW50KG1vZHVsZVBhdGg6IEFic29sdXRlRnNQYXRoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZnMuZXhpc3RzKEFic29sdXRlRnNQYXRoLmpvaW4obW9kdWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgYHBhdGhNYXBwZXJzYCB0byB0aGUgYG1vZHVsZU5hbWVgIGFuZCByZXR1cm4gYWxsIHRoZSBwb3NzaWJsZVxuICAgKiBwYXRocyB0aGF0IG1hdGNoLlxuICAgKlxuICAgKiBUaGUgbWFwcGVkIHBhdGggaXMgY29tcHV0ZWQgZm9yIGVhY2ggdGVtcGxhdGUgaW4gYG1hcHBpbmcudGVtcGxhdGVzYCBieVxuICAgKiByZXBsYWNpbmcgdGhlIGBtYXRjaGVyLnByZWZpeGAgYW5kIGBtYXRjaGVyLnBvc3RmaXhgIHN0cmluZ3MgaW4gYHBhdGggd2l0aCB0aGVcbiAgICogYHRlbXBsYXRlLnByZWZpeGAgYW5kIGB0ZW1wbGF0ZS5wb3N0Zml4YCBzdHJpbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTWFwcGVkUGF0aHMobW9kdWxlTmFtZTogc3RyaW5nKTogQWJzb2x1dGVGc1BhdGhbXSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMucGF0aE1hcHBpbmdzLm1hcChtYXBwaW5nID0+IHRoaXMubWF0Y2hNYXBwaW5nKG1vZHVsZU5hbWUsIG1hcHBpbmcpKTtcblxuICAgIGxldCBiZXN0TWFwcGluZzogUHJvY2Vzc2VkUGF0aE1hcHBpbmd8dW5kZWZpbmVkO1xuICAgIGxldCBiZXN0TWF0Y2g6IHN0cmluZ3x1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5wYXRoTWFwcGluZ3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBtYXBwaW5nID0gdGhpcy5wYXRoTWFwcGluZ3NbaW5kZXhdO1xuICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2luZGV4XTtcbiAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIG1hcHBpbmcgaGFkIG5vIHdpbGRjYXJkIHRoZW4gdGhpcyBtdXN0IGJlIGEgY29tcGxldGUgbWF0Y2guXG4gICAgICAgIGlmICghbWFwcGluZy5tYXRjaGVyLmhhc1dpbGRjYXJkKSB7XG4gICAgICAgICAgYmVzdE1hdGNoID0gbWF0Y2g7XG4gICAgICAgICAgYmVzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBiZXN0IG1hdGNoZWQgbWFwcGluZyBpcyB0aGUgb25lIHdpdGggdGhlIGxvbmdlc3QgcHJlZml4LlxuICAgICAgICBpZiAoIWJlc3RNYXBwaW5nIHx8IG1hcHBpbmcubWF0Y2hlci5wcmVmaXggPiBiZXN0TWFwcGluZy5tYXRjaGVyLnByZWZpeCkge1xuICAgICAgICAgIGJlc3RNYXRjaCA9IG1hdGNoO1xuICAgICAgICAgIGJlc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoYmVzdE1hcHBpbmcgJiYgYmVzdE1hdGNoKSA/IHRoaXMuY29tcHV0ZU1hcHBlZFRlbXBsYXRlcyhiZXN0TWFwcGluZywgYmVzdE1hdGNoKSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gZmluZCBhIG1hcHBlZCBwYXRoIGZvciB0aGUgZ2l2ZW4gYHBhdGhgIGFuZCBhIGBtYXBwaW5nYC5cbiAgICpcbiAgICogVGhlIGBwYXRoYCBtYXRjaGVzIHRoZSBgbWFwcGluZ2AgaWYgaWYgaXQgc3RhcnRzIHdpdGggYG1hdGNoZXIucHJlZml4YCBhbmQgZW5kcyB3aXRoXG4gICAqIGBtYXRjaGVyLnBvc3RmaXhgLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgd2lsZGNhcmQgc2VnbWVudCBvZiBhIG1hdGNoZWQgYHBhdGhgLCBvciBgbnVsbGAgaWYgbm8gbWF0Y2guXG4gICAqL1xuICBwcml2YXRlIG1hdGNoTWFwcGluZyhwYXRoOiBzdHJpbmcsIG1hcHBpbmc6IFByb2Nlc3NlZFBhdGhNYXBwaW5nKTogc3RyaW5nfG51bGwge1xuICAgIGNvbnN0IHtwcmVmaXgsIHBvc3RmaXgsIGhhc1dpbGRjYXJkfSA9IG1hcHBpbmcubWF0Y2hlcjtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgcGF0aC5lbmRzV2l0aChwb3N0Zml4KSkge1xuICAgICAgcmV0dXJuIGhhc1dpbGRjYXJkID8gcGF0aC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCwgcGF0aC5sZW5ndGggLSBwb3N0Zml4Lmxlbmd0aCkgOiAnJztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgY2FuZGlkYXRlIHBhdGhzIGZyb20gdGhlIGdpdmVuIG1hcHBpbmcncyB0ZW1wbGF0ZXMgdXNpbmcgdGhlIG1hdGNoZWRcbiAgICogc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlTWFwcGVkVGVtcGxhdGVzKG1hcHBpbmc6IFByb2Nlc3NlZFBhdGhNYXBwaW5nLCBtYXRjaDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG1hcHBpbmcudGVtcGxhdGVzLm1hcChcbiAgICAgICAgdGVtcGxhdGUgPT5cbiAgICAgICAgICAgIEFic29sdXRlRnNQYXRoLnJlc29sdmUobWFwcGluZy5iYXNlVXJsLCB0ZW1wbGF0ZS5wcmVmaXggKyBtYXRjaCArIHRlbXBsYXRlLnBvc3RmaXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdXAgdGhlIGZvbGRlciB0cmVlIGZvciB0aGUgZmlyc3QgZm9sZGVyIHRoYXQgY29udGFpbnMgYHBhY2thZ2UuanNvbmBcbiAgICogb3IgYG51bGxgIGlmIG5vbmUgaXMgZm91bmQuXG4gICAqL1xuICBwcml2YXRlIGZpbmRQYWNrYWdlUGF0aChwYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IEFic29sdXRlRnNQYXRofG51bGwge1xuICAgIGxldCBmb2xkZXIgPSBwYXRoO1xuICAgIHdoaWxlICghQWJzb2x1dGVGc1BhdGguaXNSb290KGZvbGRlcikpIHtcbiAgICAgIGZvbGRlciA9IEFic29sdXRlRnNQYXRoLmRpcm5hbWUoZm9sZGVyKTtcbiAgICAgIGlmICh0aGlzLmZzLmV4aXN0cyhBYnNvbHV0ZUZzUGF0aC5qb2luKGZvbGRlciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICByZXR1cm4gZm9sZGVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKiogVGhlIHJlc3VsdCBvZiByZXNvbHZpbmcgYW4gaW1wb3J0IHRvIGEgbW9kdWxlLiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRNb2R1bGUgPSBSZXNvbHZlZEV4dGVybmFsTW9kdWxlIHwgUmVzb2x2ZWRSZWxhdGl2ZU1vZHVsZSB8IFJlc29sdmVkRGVlcEltcG9ydDtcblxuLyoqXG4gKiBBIG1vZHVsZSB0aGF0IGlzIGV4dGVybmFsIHRvIHRoZSBwYWNrYWdlIGRvaW5nIHRoZSBpbXBvcnRpbmcuXG4gKiBJbiB0aGlzIGNhc2Ugd2UgY2FwdHVyZSB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGVudHJ5LXBvaW50LlxuICovXG5leHBvcnQgY2xhc3MgUmVzb2x2ZWRFeHRlcm5hbE1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbnRyeVBvaW50UGF0aDogQWJzb2x1dGVGc1BhdGgpIHt9XG59XG5cbi8qKlxuICogQSBtb2R1bGUgdGhhdCBpcyByZWxhdGl2ZSB0byB0aGUgbW9kdWxlIGRvaW5nIHRoZSBpbXBvcnRpbmcsIGFuZCBzbyBpbnRlcm5hbCB0byB0aGVcbiAqIHNvdXJjZSBtb2R1bGUncyBwYWNrYWdlLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb2x2ZWRSZWxhdGl2ZU1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2R1bGVQYXRoOiBBYnNvbHV0ZUZzUGF0aCkge31cbn1cblxuLyoqXG4gKiBBIG1vZHVsZSB0aGF0IGlzIGV4dGVybmFsIHRvIHRoZSBwYWNrYWdlIGRvaW5nIHRoZSBpbXBvcnRpbmcgYnV0IHBvaW50aW5nIHRvIGFcbiAqIG1vZHVsZSB0aGF0IGlzIGRlZXAgaW5zaWRlIGEgcGFja2FnZSwgcmF0aGVyIHRoYW4gdG8gYW4gZW50cnktcG9pbnQgb2YgdGhlIHBhY2thZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZERlZXBJbXBvcnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW1wb3J0UGF0aDogQWJzb2x1dGVGc1BhdGgpIHt9XG59XG5cbmZ1bmN0aW9uIHNwbGl0T25TdGFyKHN0cjogc3RyaW5nKTogUGF0aE1hcHBpbmdQYXR0ZXJuIHtcbiAgY29uc3QgW3ByZWZpeCwgcG9zdGZpeF0gPSBzdHIuc3BsaXQoJyonLCAyKTtcbiAgcmV0dXJuIHtwcmVmaXgsIHBvc3RmaXg6IHBvc3RmaXggfHwgJycsIGhhc1dpbGRjYXJkOiBwb3N0Zml4ICE9PSB1bmRlZmluZWR9O1xufVxuXG5pbnRlcmZhY2UgUHJvY2Vzc2VkUGF0aE1hcHBpbmcge1xuICBiYXNlVXJsOiBBYnNvbHV0ZUZzUGF0aDtcbiAgbWF0Y2hlcjogUGF0aE1hcHBpbmdQYXR0ZXJuO1xuICB0ZW1wbGF0ZXM6IFBhdGhNYXBwaW5nUGF0dGVybltdO1xufVxuXG5pbnRlcmZhY2UgUGF0aE1hcHBpbmdQYXR0ZXJuIHtcbiAgcHJlZml4OiBzdHJpbmc7XG4gIHBvc3RmaXg6IHN0cmluZztcbiAgaGFzV2lsZGNhcmQ6IGJvb2xlYW47XG59XG4iXX0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/// <amd-module name="@angular/compiler-cli/ngcc/src/dependencies/umd_dependency_host" />
|
|
2
|
+
import { AbsoluteFsPath } from '../../../src/ngtsc/path';
|
|
3
|
+
import { FileSystem } from '../file_system/file_system';
|
|
4
|
+
import { DependencyHost, DependencyInfo } from './dependency_host';
|
|
5
|
+
import { ModuleResolver } from './module_resolver';
|
|
6
|
+
/**
|
|
7
|
+
* Helper functions for computing dependencies.
|
|
8
|
+
*/
|
|
9
|
+
export declare class UmdDependencyHost implements DependencyHost {
|
|
10
|
+
private fs;
|
|
11
|
+
private moduleResolver;
|
|
12
|
+
constructor(fs: FileSystem, moduleResolver: ModuleResolver);
|
|
13
|
+
/**
|
|
14
|
+
* Find all the dependencies for the entry-point at the given path.
|
|
15
|
+
*
|
|
16
|
+
* @param entryPointPath The absolute path to the JavaScript file that represents an entry-point.
|
|
17
|
+
* @returns Information about the dependencies of the entry-point, including those that were
|
|
18
|
+
* missing or deep imports into other entry-points.
|
|
19
|
+
*/
|
|
20
|
+
findDependencies(entryPointPath: AbsoluteFsPath): DependencyInfo;
|
|
21
|
+
/**
|
|
22
|
+
* Compute the dependencies of the given file.
|
|
23
|
+
*
|
|
24
|
+
* @param file An absolute path to the file whose dependencies we want to get.
|
|
25
|
+
* @param dependencies A set that will have the absolute paths of resolved entry points added to
|
|
26
|
+
* it.
|
|
27
|
+
* @param missing A set that will have the dependencies that could not be found added to it.
|
|
28
|
+
* @param deepImports A set that will have the import paths that exist but cannot be mapped to
|
|
29
|
+
* entry-points, i.e. deep-imports.
|
|
30
|
+
* @param alreadySeen A set that is used to track internal dependencies to prevent getting stuck
|
|
31
|
+
* in a
|
|
32
|
+
* circular dependency loop.
|
|
33
|
+
*/
|
|
34
|
+
private recursivelyFindDependencies;
|
|
35
|
+
/**
|
|
36
|
+
* Check whether a source file needs to be parsed for imports.
|
|
37
|
+
* This is a performance short-circuit, which saves us from creating
|
|
38
|
+
* a TypeScript AST unnecessarily.
|
|
39
|
+
*
|
|
40
|
+
* @param source The content of the source file to check.
|
|
41
|
+
*
|
|
42
|
+
* @returns false if there are definitely no require calls
|
|
43
|
+
* in this file, true otherwise.
|
|
44
|
+
*/
|
|
45
|
+
hasRequireCalls(source: string): boolean;
|
|
46
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define("@angular/compiler-cli/ngcc/src/dependencies/umd_dependency_host", ["require", "exports", "typescript", "@angular/compiler-cli/ngcc/src/host/umd_host", "@angular/compiler-cli/ngcc/src/dependencies/module_resolver"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/**
|
|
13
|
+
* @license
|
|
14
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
15
|
+
*
|
|
16
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
17
|
+
* found in the LICENSE file at https://angular.io/license
|
|
18
|
+
*/
|
|
19
|
+
var ts = require("typescript");
|
|
20
|
+
var umd_host_1 = require("@angular/compiler-cli/ngcc/src/host/umd_host");
|
|
21
|
+
var module_resolver_1 = require("@angular/compiler-cli/ngcc/src/dependencies/module_resolver");
|
|
22
|
+
/**
|
|
23
|
+
* Helper functions for computing dependencies.
|
|
24
|
+
*/
|
|
25
|
+
var UmdDependencyHost = /** @class */ (function () {
|
|
26
|
+
function UmdDependencyHost(fs, moduleResolver) {
|
|
27
|
+
this.fs = fs;
|
|
28
|
+
this.moduleResolver = moduleResolver;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Find all the dependencies for the entry-point at the given path.
|
|
32
|
+
*
|
|
33
|
+
* @param entryPointPath The absolute path to the JavaScript file that represents an entry-point.
|
|
34
|
+
* @returns Information about the dependencies of the entry-point, including those that were
|
|
35
|
+
* missing or deep imports into other entry-points.
|
|
36
|
+
*/
|
|
37
|
+
UmdDependencyHost.prototype.findDependencies = function (entryPointPath) {
|
|
38
|
+
var dependencies = new Set();
|
|
39
|
+
var missing = new Set();
|
|
40
|
+
var deepImports = new Set();
|
|
41
|
+
var alreadySeen = new Set();
|
|
42
|
+
this.recursivelyFindDependencies(entryPointPath, dependencies, missing, deepImports, alreadySeen);
|
|
43
|
+
return { dependencies: dependencies, missing: missing, deepImports: deepImports };
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Compute the dependencies of the given file.
|
|
47
|
+
*
|
|
48
|
+
* @param file An absolute path to the file whose dependencies we want to get.
|
|
49
|
+
* @param dependencies A set that will have the absolute paths of resolved entry points added to
|
|
50
|
+
* it.
|
|
51
|
+
* @param missing A set that will have the dependencies that could not be found added to it.
|
|
52
|
+
* @param deepImports A set that will have the import paths that exist but cannot be mapped to
|
|
53
|
+
* entry-points, i.e. deep-imports.
|
|
54
|
+
* @param alreadySeen A set that is used to track internal dependencies to prevent getting stuck
|
|
55
|
+
* in a
|
|
56
|
+
* circular dependency loop.
|
|
57
|
+
*/
|
|
58
|
+
UmdDependencyHost.prototype.recursivelyFindDependencies = function (file, dependencies, missing, deepImports, alreadySeen) {
|
|
59
|
+
var _this = this;
|
|
60
|
+
var fromContents = this.fs.readFile(file);
|
|
61
|
+
if (!this.hasRequireCalls(fromContents)) {
|
|
62
|
+
// Avoid parsing the source file as there are no require calls.
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Parse the source into a TypeScript AST and then walk it looking for imports and re-exports.
|
|
66
|
+
var sf = ts.createSourceFile(file, fromContents, ts.ScriptTarget.ES2015, false, ts.ScriptKind.JS);
|
|
67
|
+
if (sf.statements.length !== 1) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
var umdModule = umd_host_1.parseStatementForUmdModule(sf.statements[0]);
|
|
71
|
+
var umdImports = umdModule && umd_host_1.getImportsOfUmdModule(umdModule);
|
|
72
|
+
if (umdImports === null) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
umdImports.forEach(function (umdImport) {
|
|
76
|
+
var resolvedModule = _this.moduleResolver.resolveModuleImport(umdImport.path, file);
|
|
77
|
+
if (resolvedModule) {
|
|
78
|
+
if (resolvedModule instanceof module_resolver_1.ResolvedRelativeModule) {
|
|
79
|
+
var internalDependency = resolvedModule.modulePath;
|
|
80
|
+
if (!alreadySeen.has(internalDependency)) {
|
|
81
|
+
alreadySeen.add(internalDependency);
|
|
82
|
+
_this.recursivelyFindDependencies(internalDependency, dependencies, missing, deepImports, alreadySeen);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
if (resolvedModule instanceof module_resolver_1.ResolvedDeepImport) {
|
|
87
|
+
deepImports.add(resolvedModule.importPath);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
dependencies.add(resolvedModule.entryPointPath);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
missing.add(umdImport.path);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Check whether a source file needs to be parsed for imports.
|
|
101
|
+
* This is a performance short-circuit, which saves us from creating
|
|
102
|
+
* a TypeScript AST unnecessarily.
|
|
103
|
+
*
|
|
104
|
+
* @param source The content of the source file to check.
|
|
105
|
+
*
|
|
106
|
+
* @returns false if there are definitely no require calls
|
|
107
|
+
* in this file, true otherwise.
|
|
108
|
+
*/
|
|
109
|
+
UmdDependencyHost.prototype.hasRequireCalls = function (source) { return /require\(['"]/.test(source); };
|
|
110
|
+
return UmdDependencyHost;
|
|
111
|
+
}());
|
|
112
|
+
exports.UmdDependencyHost = UmdDependencyHost;
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW1kX2RlcGVuZGVuY3lfaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9uZ2NjL3NyYy9kZXBlbmRlbmNpZXMvdW1kX2RlcGVuZGVuY3lfaG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQUFBOzs7Ozs7T0FNRztJQUNILCtCQUFpQztJQUlqQyx5RUFBbUY7SUFHbkYsK0ZBQTZGO0lBSTdGOztPQUVHO0lBQ0g7UUFDRSwyQkFBb0IsRUFBYyxFQUFVLGNBQThCO1lBQXRELE9BQUUsR0FBRixFQUFFLENBQVk7WUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBRyxDQUFDO1FBRTlFOzs7Ozs7V0FNRztRQUNILDRDQUFnQixHQUFoQixVQUFpQixjQUE4QjtZQUM3QyxJQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztZQUMvQyxJQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztZQUN0RCxJQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztZQUM5QyxJQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztZQUM5QyxJQUFJLENBQUMsMkJBQTJCLENBQzVCLGNBQWMsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNyRSxPQUFPLEVBQUMsWUFBWSxjQUFBLEVBQUUsT0FBTyxTQUFBLEVBQUUsV0FBVyxhQUFBLEVBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQ7Ozs7Ozs7Ozs7OztXQVlHO1FBQ0ssdURBQTJCLEdBQW5DLFVBQ0ksSUFBb0IsRUFBRSxZQUFpQyxFQUFFLE9BQW9CLEVBQzdFLFdBQXdCLEVBQUUsV0FBZ0M7WUFGOUQsaUJBMkNDO1lBeENDLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUN2QywrREFBK0Q7Z0JBQy9ELE9BQU87YUFDUjtZQUVELDhGQUE4RjtZQUM5RixJQUFNLEVBQUUsR0FDSixFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RixJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDOUIsT0FBTzthQUNSO1lBRUQsSUFBTSxTQUFTLEdBQUcscUNBQTBCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELElBQU0sVUFBVSxHQUFHLFNBQVMsSUFBSSxnQ0FBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU87YUFDUjtZQUVELFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxTQUFTO2dCQUMxQixJQUFNLGNBQWMsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksY0FBYyxFQUFFO29CQUNsQixJQUFJLGNBQWMsWUFBWSx3Q0FBc0IsRUFBRTt3QkFDcEQsSUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDO3dCQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFOzRCQUN4QyxXQUFXLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7NEJBQ3BDLEtBQUksQ0FBQywyQkFBMkIsQ0FDNUIsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7eUJBQzFFO3FCQUNGO3lCQUFNO3dCQUNMLElBQUksY0FBYyxZQUFZLG9DQUFrQixFQUFFOzRCQUNoRCxXQUFXLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQzt5QkFDNUM7NkJBQU07NEJBQ0wsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7eUJBQ2pEO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3QjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVEOzs7Ozs7Ozs7V0FTRztRQUNILDJDQUFlLEdBQWYsVUFBZ0IsTUFBYyxJQUFhLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsd0JBQUM7SUFBRCxDQUFDLEFBekZELElBeUZDO0lBekZZLDhDQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge0Fic29sdXRlRnNQYXRoLCBQYXRoU2VnbWVudH0gZnJvbSAnLi4vLi4vLi4vc3JjL25ndHNjL3BhdGgnO1xuaW1wb3J0IHtGaWxlU3lzdGVtfSBmcm9tICcuLi9maWxlX3N5c3RlbS9maWxlX3N5c3RlbSc7XG5pbXBvcnQge2dldEltcG9ydHNPZlVtZE1vZHVsZSwgcGFyc2VTdGF0ZW1lbnRGb3JVbWRNb2R1bGV9IGZyb20gJy4uL2hvc3QvdW1kX2hvc3QnO1xuXG5pbXBvcnQge0RlcGVuZGVuY3lIb3N0LCBEZXBlbmRlbmN5SW5mb30gZnJvbSAnLi9kZXBlbmRlbmN5X2hvc3QnO1xuaW1wb3J0IHtNb2R1bGVSZXNvbHZlciwgUmVzb2x2ZWREZWVwSW1wb3J0LCBSZXNvbHZlZFJlbGF0aXZlTW9kdWxlfSBmcm9tICcuL21vZHVsZV9yZXNvbHZlcic7XG5cblxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyBkZXBlbmRlbmNpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbWREZXBlbmRlbmN5SG9zdCBpbXBsZW1lbnRzIERlcGVuZGVuY3lIb3N0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmczogRmlsZVN5c3RlbSwgcHJpdmF0ZSBtb2R1bGVSZXNvbHZlcjogTW9kdWxlUmVzb2x2ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEZpbmQgYWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBlbnRyeS1wb2ludCBhdCB0aGUgZ2l2ZW4gcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGVudHJ5UG9pbnRQYXRoIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBKYXZhU2NyaXB0IGZpbGUgdGhhdCByZXByZXNlbnRzIGFuIGVudHJ5LXBvaW50LlxuICAgKiBAcmV0dXJucyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBlbnRyeS1wb2ludCwgaW5jbHVkaW5nIHRob3NlIHRoYXQgd2VyZVxuICAgKiBtaXNzaW5nIG9yIGRlZXAgaW1wb3J0cyBpbnRvIG90aGVyIGVudHJ5LXBvaW50cy5cbiAgICovXG4gIGZpbmREZXBlbmRlbmNpZXMoZW50cnlQb2ludFBhdGg6IEFic29sdXRlRnNQYXRoKTogRGVwZW5kZW5jeUluZm8ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBTZXQ8QWJzb2x1dGVGc1BhdGg+KCk7XG4gICAgY29uc3QgbWlzc2luZyA9IG5ldyBTZXQ8QWJzb2x1dGVGc1BhdGh8UGF0aFNlZ21lbnQ+KCk7XG4gICAgY29uc3QgZGVlcEltcG9ydHMgPSBuZXcgU2V0PEFic29sdXRlRnNQYXRoPigpO1xuICAgIGNvbnN0IGFscmVhZHlTZWVuID0gbmV3IFNldDxBYnNvbHV0ZUZzUGF0aD4oKTtcbiAgICB0aGlzLnJlY3Vyc2l2ZWx5RmluZERlcGVuZGVuY2llcyhcbiAgICAgICAgZW50cnlQb2ludFBhdGgsIGRlcGVuZGVuY2llcywgbWlzc2luZywgZGVlcEltcG9ydHMsIGFscmVhZHlTZWVuKTtcbiAgICByZXR1cm4ge2RlcGVuZGVuY2llcywgbWlzc2luZywgZGVlcEltcG9ydHN9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgZ2l2ZW4gZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgQW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSB3aG9zZSBkZXBlbmRlbmNpZXMgd2Ugd2FudCB0byBnZXQuXG4gICAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgQSBzZXQgdGhhdCB3aWxsIGhhdmUgdGhlIGFic29sdXRlIHBhdGhzIG9mIHJlc29sdmVkIGVudHJ5IHBvaW50cyBhZGRlZCB0b1xuICAgKiBpdC5cbiAgICogQHBhcmFtIG1pc3NpbmcgQSBzZXQgdGhhdCB3aWxsIGhhdmUgdGhlIGRlcGVuZGVuY2llcyB0aGF0IGNvdWxkIG5vdCBiZSBmb3VuZCBhZGRlZCB0byBpdC5cbiAgICogQHBhcmFtIGRlZXBJbXBvcnRzIEEgc2V0IHRoYXQgd2lsbCBoYXZlIHRoZSBpbXBvcnQgcGF0aHMgdGhhdCBleGlzdCBidXQgY2Fubm90IGJlIG1hcHBlZCB0b1xuICAgKiBlbnRyeS1wb2ludHMsIGkuZS4gZGVlcC1pbXBvcnRzLlxuICAgKiBAcGFyYW0gYWxyZWFkeVNlZW4gQSBzZXQgdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGludGVybmFsIGRlcGVuZGVuY2llcyB0byBwcmV2ZW50IGdldHRpbmcgc3R1Y2tcbiAgICogaW4gYVxuICAgKiBjaXJjdWxhciBkZXBlbmRlbmN5IGxvb3AuXG4gICAqL1xuICBwcml2YXRlIHJlY3Vyc2l2ZWx5RmluZERlcGVuZGVuY2llcyhcbiAgICAgIGZpbGU6IEFic29sdXRlRnNQYXRoLCBkZXBlbmRlbmNpZXM6IFNldDxBYnNvbHV0ZUZzUGF0aD4sIG1pc3Npbmc6IFNldDxzdHJpbmc+LFxuICAgICAgZGVlcEltcG9ydHM6IFNldDxzdHJpbmc+LCBhbHJlYWR5U2VlbjogU2V0PEFic29sdXRlRnNQYXRoPik6IHZvaWQge1xuICAgIGNvbnN0IGZyb21Db250ZW50cyA9IHRoaXMuZnMucmVhZEZpbGUoZmlsZSk7XG4gICAgaWYgKCF0aGlzLmhhc1JlcXVpcmVDYWxscyhmcm9tQ29udGVudHMpKSB7XG4gICAgICAvLyBBdm9pZCBwYXJzaW5nIHRoZSBzb3VyY2UgZmlsZSBhcyB0aGVyZSBhcmUgbm8gcmVxdWlyZSBjYWxscy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgc291cmNlIGludG8gYSBUeXBlU2NyaXB0IEFTVCBhbmQgdGhlbiB3YWxrIGl0IGxvb2tpbmcgZm9yIGltcG9ydHMgYW5kIHJlLWV4cG9ydHMuXG4gICAgY29uc3Qgc2YgPVxuICAgICAgICB0cy5jcmVhdGVTb3VyY2VGaWxlKGZpbGUsIGZyb21Db250ZW50cywgdHMuU2NyaXB0VGFyZ2V0LkVTMjAxNSwgZmFsc2UsIHRzLlNjcmlwdEtpbmQuSlMpO1xuICAgIGlmIChzZi5zdGF0ZW1lbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVtZE1vZHVsZSA9IHBhcnNlU3RhdGVtZW50Rm9yVW1kTW9kdWxlKHNmLnN0YXRlbWVudHNbMF0pO1xuICAgIGNvbnN0IHVtZEltcG9ydHMgPSB1bWRNb2R1bGUgJiYgZ2V0SW1wb3J0c09mVW1kTW9kdWxlKHVtZE1vZHVsZSk7XG4gICAgaWYgKHVtZEltcG9ydHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB1bWRJbXBvcnRzLmZvckVhY2godW1kSW1wb3J0ID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkTW9kdWxlID0gdGhpcy5tb2R1bGVSZXNvbHZlci5yZXNvbHZlTW9kdWxlSW1wb3J0KHVtZEltcG9ydC5wYXRoLCBmaWxlKTtcbiAgICAgIGlmIChyZXNvbHZlZE1vZHVsZSkge1xuICAgICAgICBpZiAocmVzb2x2ZWRNb2R1bGUgaW5zdGFuY2VvZiBSZXNvbHZlZFJlbGF0aXZlTW9kdWxlKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJuYWxEZXBlbmRlbmN5ID0gcmVzb2x2ZWRNb2R1bGUubW9kdWxlUGF0aDtcbiAgICAgICAgICBpZiAoIWFscmVhZHlTZWVuLmhhcyhpbnRlcm5hbERlcGVuZGVuY3kpKSB7XG4gICAgICAgICAgICBhbHJlYWR5U2Vlbi5hZGQoaW50ZXJuYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlbHlGaW5kRGVwZW5kZW5jaWVzKFxuICAgICAgICAgICAgICAgIGludGVybmFsRGVwZW5kZW5jeSwgZGVwZW5kZW5jaWVzLCBtaXNzaW5nLCBkZWVwSW1wb3J0cywgYWxyZWFkeVNlZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRNb2R1bGUgaW5zdGFuY2VvZiBSZXNvbHZlZERlZXBJbXBvcnQpIHtcbiAgICAgICAgICAgIGRlZXBJbXBvcnRzLmFkZChyZXNvbHZlZE1vZHVsZS5pbXBvcnRQYXRoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChyZXNvbHZlZE1vZHVsZS5lbnRyeVBvaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaXNzaW5nLmFkZCh1bWRJbXBvcnQucGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBhIHNvdXJjZSBmaWxlIG5lZWRzIHRvIGJlIHBhcnNlZCBmb3IgaW1wb3J0cy5cbiAgICogVGhpcyBpcyBhIHBlcmZvcm1hbmNlIHNob3J0LWNpcmN1aXQsIHdoaWNoIHNhdmVzIHVzIGZyb20gY3JlYXRpbmdcbiAgICogYSBUeXBlU2NyaXB0IEFTVCB1bm5lY2Vzc2FyaWx5LlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byBjaGVjay5cbiAgICpcbiAgICogQHJldHVybnMgZmFsc2UgaWYgdGhlcmUgYXJlIGRlZmluaXRlbHkgbm8gcmVxdWlyZSBjYWxsc1xuICAgKiBpbiB0aGlzIGZpbGUsIHRydWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgaGFzUmVxdWlyZUNhbGxzKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiAvcmVxdWlyZVxcKFsnXCJdLy50ZXN0KHNvdXJjZSk7IH1cbn1cbiJdfQ==
|