1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | import {ResolvedUrl, UrlLoader} from 'polymer-analyzer';
|
16 |
|
17 | import {getFileContents} from './streams';
|
18 |
|
19 | import File = require('vinyl');
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | export class FileMapUrlLoader implements UrlLoader {
|
26 | files: Map<ResolvedUrl, File>;
|
27 | fallbackLoader?: UrlLoader;
|
28 |
|
29 | constructor(files: Map<ResolvedUrl, File>, fallbackLoader?: UrlLoader) {
|
30 | this.files = files;
|
31 | this.fallbackLoader = fallbackLoader;
|
32 | }
|
33 |
|
34 |
|
35 | canLoad(url: ResolvedUrl): boolean {
|
36 | return !!(
|
37 | this.files.has(url) ||
|
38 | this.fallbackLoader && this.fallbackLoader.canLoad(url));
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 | async load(url: ResolvedUrl): Promise<string> {
|
44 | const file = this.files.get(url);
|
45 |
|
46 | if (file == null) {
|
47 | if (this.fallbackLoader) {
|
48 | if (this.fallbackLoader.canLoad(url)) {
|
49 | return this.fallbackLoader.load(url);
|
50 | }
|
51 | throw new Error(
|
52 | `${url} not present in file map and fallback loader can not load.`);
|
53 | }
|
54 | throw new Error(`${url} not present in file map and no fallback loader.`);
|
55 | }
|
56 |
|
57 | return getFileContents(file);
|
58 | }
|
59 | }
|