@dotglitch/ngx-common 1.0.21 → 1.0.23

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.
Files changed (61) hide show
  1. package/assets/mat-icons.d.ts +5705 -0
  2. package/components/filemanager/file-grid/file-grid.component.d.ts +97 -0
  3. package/components/filemanager/filemanager.component.d.ts +206 -0
  4. package/components/filemanager/folder-rename/folder-rename.component.d.ts +18 -0
  5. package/components/filemanager/helpers.d.ts +5 -0
  6. package/components/filemanager/icon-resolver.d.ts +13 -0
  7. package/components/filemanager/textextensions.d.ts +3 -0
  8. package/components/filemanager/toolbar/breadcrumb/breadcrumb.component.d.ts +16 -0
  9. package/components/filemanager/toolbar/icon-button/icon-button.component.d.ts +11 -0
  10. package/components/filemanager/toolbar/toolbar.component.d.ts +30 -0
  11. package/components/filemanager/tree-view/tree-view.component.d.ts +21 -0
  12. package/components/tabulator/tabulator.component.d.ts +30 -0
  13. package/components/types.d.ts +16 -0
  14. package/components/vscode/ts-type-resolver/dependency-parser.d.ts +6 -0
  15. package/components/vscode/ts-type-resolver/dummy-source-cache.d.ts +7 -0
  16. package/components/vscode/ts-type-resolver/import-resolver.d.ts +28 -0
  17. package/components/vscode/ts-type-resolver/main.d.ts +22 -0
  18. package/components/vscode/ts-type-resolver/recursion-depth.d.ts +11 -0
  19. package/components/vscode/ts-type-resolver/types.d.ts +179 -0
  20. package/components/vscode/ts-type-resolver/unpkg-source-resolver.d.ts +5 -0
  21. package/components/vscode/ts-type-resolver/update-emitter.d.ts +2 -0
  22. package/components/vscode/vscode.component.d.ts +57 -0
  23. package/esm2020/assets/mat-icons.mjs +5705 -0
  24. package/esm2020/components/filemanager/file-grid/file-grid.component.mjs +672 -0
  25. package/esm2020/components/filemanager/filemanager.component.mjs +301 -0
  26. package/esm2020/components/filemanager/folder-rename/folder-rename.component.mjs +57 -0
  27. package/esm2020/components/filemanager/helpers.mjs +26 -0
  28. package/esm2020/components/filemanager/icon-resolver.mjs +155 -0
  29. package/esm2020/components/filemanager/textextensions.mjs +294 -0
  30. package/esm2020/components/filemanager/toolbar/breadcrumb/breadcrumb.component.mjs +26 -0
  31. package/esm2020/components/filemanager/toolbar/icon-button/icon-button.component.mjs +34 -0
  32. package/esm2020/components/filemanager/toolbar/toolbar.component.mjs +163 -0
  33. package/esm2020/components/filemanager/tree-view/tree-view.component.mjs +53 -0
  34. package/esm2020/components/lazy-loader/lazy-loader.module.mjs +3 -3
  35. package/esm2020/components/lazy-loader/lazy-loader.service.mjs +1 -1
  36. package/esm2020/components/menu/menu.component.mjs +3 -4
  37. package/esm2020/components/tabulator/tabulator.component.mjs +92 -0
  38. package/esm2020/components/types.mjs +3 -0
  39. package/esm2020/components/vscode/ts-type-resolver/dependency-parser.mjs +91 -0
  40. package/esm2020/components/vscode/ts-type-resolver/dummy-source-cache.mjs +15 -0
  41. package/esm2020/components/vscode/ts-type-resolver/import-resolver.mjs +311 -0
  42. package/esm2020/components/vscode/ts-type-resolver/main.mjs +112 -0
  43. package/esm2020/components/vscode/ts-type-resolver/recursion-depth.mjs +21 -0
  44. package/esm2020/components/vscode/ts-type-resolver/types.mjs +14 -0
  45. package/esm2020/components/vscode/ts-type-resolver/unpkg-source-resolver.mjs +21 -0
  46. package/esm2020/components/vscode/ts-type-resolver/update-emitter.mjs +37 -0
  47. package/esm2020/components/vscode/vscode.component.mjs +230 -0
  48. package/esm2020/directives/menu.directive.mjs +19 -18
  49. package/esm2020/public-api.mjs +6 -1
  50. package/esm2020/types/menu.mjs +1 -1
  51. package/fesm2015/dotglitch-ngx-common-folder-rename.component-d039534b.mjs +79 -0
  52. package/fesm2015/dotglitch-ngx-common-folder-rename.component-d039534b.mjs.map +1 -0
  53. package/fesm2015/dotglitch-ngx-common.mjs +8361 -28
  54. package/fesm2015/dotglitch-ngx-common.mjs.map +1 -1
  55. package/fesm2020/dotglitch-ngx-common-folder-rename.component-ba3ebd0a.mjs +78 -0
  56. package/fesm2020/dotglitch-ngx-common-folder-rename.component-ba3ebd0a.mjs.map +1 -0
  57. package/fesm2020/dotglitch-ngx-common.mjs +8330 -27
  58. package/fesm2020/dotglitch-ngx-common.mjs.map +1 -1
  59. package/package.json +6 -2
  60. package/public-api.d.ts +4 -0
  61. package/types/menu.d.ts +4 -0
@@ -0,0 +1,91 @@
1
+ import * as path from 'path-browserify';
2
+ export class DependencyParser {
3
+ constructor() {
4
+ this.REGEX_NODE_MODULE = /^node:([\w\W\/]+)$/;
5
+ }
6
+ // https://github.com/lukasbach/monaco-editor-auto-typings/commit/fc046e7d9a2abbb5121ad8ab25195d8c1c277416
7
+ parseDependencies(source, parent) {
8
+ const importRegex = /import *.+ *from *['"](?<importPath>.+?)['"]/g;
9
+ const dynamicImportRegex = /await import ?\(['"](?<importPath>.+?)['"]\)/g;
10
+ const cjsRequireRegex = /require *\(['"](?<importPath>.+?)['"]\)/g;
11
+ const matches = [
12
+ ...source.matchAll(importRegex),
13
+ ...source.matchAll(dynamicImportRegex),
14
+ ...source.matchAll(cjsRequireRegex)
15
+ ];
16
+ const importPaths = matches.map(match => match.groups?.['importPath']);
17
+ const result = importPaths.map(imp => this.resolvePath(imp, parent));
18
+ return result;
19
+ }
20
+ resolvePath(importPath, parent) {
21
+ const nodeImport = importPath.match(this.REGEX_NODE_MODULE);
22
+ if (nodeImport) {
23
+ return {
24
+ kind: 'relative-in-package',
25
+ packageName: '@types/node',
26
+ importPath: `${nodeImport[1]}.d.ts`,
27
+ sourcePath: '',
28
+ };
29
+ }
30
+ if (typeof parent === 'string') {
31
+ if (importPath.startsWith('.')) {
32
+ return {
33
+ kind: 'relative',
34
+ importPath,
35
+ sourcePath: parent,
36
+ };
37
+ }
38
+ else if (importPath.startsWith('@')) {
39
+ const segments = importPath.split('/');
40
+ return {
41
+ kind: 'package',
42
+ packageName: `${segments[0]}/${segments[1]}`,
43
+ importPath: segments.slice(2).join('/'),
44
+ };
45
+ }
46
+ else {
47
+ const segments = importPath.split('/');
48
+ return {
49
+ kind: 'package',
50
+ packageName: segments[0],
51
+ importPath: segments.slice(1).join('/'),
52
+ };
53
+ }
54
+ }
55
+ else {
56
+ switch (parent.kind) {
57
+ case 'package':
58
+ throw Error('TODO?');
59
+ case 'relative':
60
+ throw Error('TODO2?');
61
+ case 'relative-in-package':
62
+ if (importPath.startsWith('.')) {
63
+ return {
64
+ kind: 'relative-in-package',
65
+ packageName: parent.packageName,
66
+ sourcePath: path.join(parent.sourcePath, parent.importPath),
67
+ importPath: importPath,
68
+ };
69
+ }
70
+ else if (importPath.startsWith('@')) {
71
+ const segments = importPath.split('/');
72
+ return {
73
+ kind: 'package',
74
+ packageName: `${segments[0]}/${segments[1]}`,
75
+ importPath: segments.slice(2).join('/'),
76
+ };
77
+ }
78
+ else {
79
+ const segments = importPath.split('/');
80
+ return {
81
+ kind: 'package',
82
+ packageName: segments[0],
83
+ importPath: segments.slice(1).join('/'),
84
+ };
85
+ }
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ }
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZW5jeS1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvdnNjb2RlL3RzLXR5cGUtcmVzb2x2ZXIvZGVwZW5kZW5jeS1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxpQkFBaUIsQ0FBQztBQUd4QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQTdCO1FBQ1ksc0JBQWlCLEdBQUcsb0JBQW9CLENBQUM7SUEwRnJELENBQUM7SUF4RkcsMEdBQTBHO0lBQ25HLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxNQUFtQztRQUN4RSxNQUFNLFdBQVcsR0FBRywrQ0FBK0MsQ0FBQztRQUNwRSxNQUFNLGtCQUFrQixHQUFHLCtDQUErQyxDQUFDO1FBQzNFLE1BQU0sZUFBZSxHQUFHLDBDQUEwQyxDQUFDO1FBRW5FLE1BQU0sT0FBTyxHQUFHO1lBQ1osR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUMvQixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUM7WUFDdEMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztTQUN0QyxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE9BQU8sTUFBTSxDQUFBO0lBQ2pCLENBQUM7SUFFTyxXQUFXLENBQUMsVUFBa0IsRUFBRSxNQUFtQztRQUN2RSxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzVELElBQUksVUFBVSxFQUFFO1lBQ1osT0FBTztnQkFDSCxJQUFJLEVBQUUscUJBQXFCO2dCQUMzQixXQUFXLEVBQUUsYUFBYTtnQkFDMUIsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUNuQyxVQUFVLEVBQUUsRUFBRTthQUNqQixDQUFDO1NBQ0w7UUFFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUM1QixJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLE9BQU87b0JBQ0gsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLFVBQVU7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ3JCLENBQUM7YUFDTDtpQkFDSSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU87b0JBQ0gsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsV0FBVyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDNUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztpQkFDMUMsQ0FBQzthQUNMO2lCQUNJO2dCQUNELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU87b0JBQ0gsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ3hCLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7aUJBQzFDLENBQUM7YUFDTDtTQUNKO2FBQ0k7WUFDRCxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssU0FBUztvQkFDVixNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekIsS0FBSyxVQUFVO29CQUNYLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixLQUFLLHFCQUFxQjtvQkFDdEIsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUM1QixPQUFPOzRCQUNILElBQUksRUFBRSxxQkFBcUI7NEJBQzNCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVzs0QkFDL0IsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDOzRCQUMzRCxVQUFVLEVBQUUsVUFBVTt5QkFDekIsQ0FBQztxQkFDTDt5QkFDSSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ2pDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3ZDLE9BQU87NEJBQ0gsSUFBSSxFQUFFLFNBQVM7NEJBQ2YsV0FBVyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDNUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQzt5QkFDMUMsQ0FBQztxQkFDTDt5QkFDSTt3QkFDRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN2QyxPQUFPOzRCQUNILElBQUksRUFBRSxTQUFTOzRCQUNmLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDOzRCQUN4QixVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO3lCQUMxQyxDQUFDO3FCQUNMO2FBQ1I7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aC1icm93c2VyaWZ5JztcbmltcG9ydCB7IEltcG9ydFJlc291cmNlUGF0aCB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeVBhcnNlciB7XG4gICAgcHJpdmF0ZSBSRUdFWF9OT0RFX01PRFVMRSA9IC9ebm9kZTooW1xcd1xcV1xcL10rKSQvO1xuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2x1a2FzYmFjaC9tb25hY28tZWRpdG9yLWF1dG8tdHlwaW5ncy9jb21taXQvZmMwNDZlN2Q5YTJhYmJiNTEyMWFkOGFiMjUxOTVkOGMxYzI3NzQxNlxuICAgIHB1YmxpYyBwYXJzZURlcGVuZGVuY2llcyhzb3VyY2U6IHN0cmluZywgcGFyZW50OiBJbXBvcnRSZXNvdXJjZVBhdGggfCBzdHJpbmcpOiBJbXBvcnRSZXNvdXJjZVBhdGhbXSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFJlZ2V4ID0gL2ltcG9ydCAqLisgKmZyb20gKlsnXCJdKD88aW1wb3J0UGF0aD4uKz8pWydcIl0vZztcbiAgICAgICAgY29uc3QgZHluYW1pY0ltcG9ydFJlZ2V4ID0gL2F3YWl0IGltcG9ydCA/XFwoWydcIl0oPzxpbXBvcnRQYXRoPi4rPylbJ1wiXVxcKS9nO1xuICAgICAgICBjb25zdCBjanNSZXF1aXJlUmVnZXggPSAvcmVxdWlyZSAqXFwoWydcIl0oPzxpbXBvcnRQYXRoPi4rPylbJ1wiXVxcKS9nO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBbXG4gICAgICAgICAgICAuLi5zb3VyY2UubWF0Y2hBbGwoaW1wb3J0UmVnZXgpLFxuICAgICAgICAgICAgLi4uc291cmNlLm1hdGNoQWxsKGR5bmFtaWNJbXBvcnRSZWdleCksXG4gICAgICAgICAgICAuLi5zb3VyY2UubWF0Y2hBbGwoY2pzUmVxdWlyZVJlZ2V4KVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRocyA9IG1hdGNoZXMubWFwKG1hdGNoID0+IG1hdGNoLmdyb3Vwcz8uWydpbXBvcnRQYXRoJ10pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpbXBvcnRQYXRocy5tYXAoaW1wID0+IHRoaXMucmVzb2x2ZVBhdGgoaW1wLCBwYXJlbnQpKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlUGF0aChpbXBvcnRQYXRoOiBzdHJpbmcsIHBhcmVudDogSW1wb3J0UmVzb3VyY2VQYXRoIHwgc3RyaW5nKTogSW1wb3J0UmVzb3VyY2VQYXRoIHtcbiAgICAgICAgY29uc3Qgbm9kZUltcG9ydCA9IGltcG9ydFBhdGgubWF0Y2godGhpcy5SRUdFWF9OT0RFX01PRFVMRSk7XG4gICAgICAgIGlmIChub2RlSW1wb3J0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdyZWxhdGl2ZS1pbi1wYWNrYWdlJyxcbiAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZTogJ0B0eXBlcy9ub2RlJyxcbiAgICAgICAgICAgICAgICBpbXBvcnRQYXRoOiBgJHtub2RlSW1wb3J0WzFdfS5kLnRzYCxcbiAgICAgICAgICAgICAgICBzb3VyY2VQYXRoOiAnJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHBhcmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6IHBhcmVudCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IGltcG9ydFBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAncGFja2FnZScsXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lOiBgJHtzZWdtZW50c1swXX0vJHtzZWdtZW50c1sxXX1gLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXRoOiBzZWdtZW50cy5zbGljZSgyKS5qb2luKCcvJyksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gaW1wb3J0UGF0aC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdwYWNrYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWU6IHNlZ21lbnRzWzBdLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXRoOiBzZWdtZW50cy5zbGljZSgxKS5qb2luKCcvJyksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGFyZW50LmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdwYWNrYWdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RPRE8/Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVsYXRpdmUnOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVE9ETzI/Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVsYXRpdmUtaW4tcGFja2FnZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAncmVsYXRpdmUtaW4tcGFja2FnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWU6IHBhcmVudC5wYWNrYWdlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VQYXRoOiBwYXRoLmpvaW4ocGFyZW50LnNvdXJjZVBhdGgsIHBhcmVudC5pbXBvcnRQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXRoOiBpbXBvcnRQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBpbXBvcnRQYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdwYWNrYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZTogYCR7c2VnbWVudHNbMF19LyR7c2VnbWVudHNbMV19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXRoOiBzZWdtZW50cy5zbGljZSgyKS5qb2luKCcvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBpbXBvcnRQYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdwYWNrYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZTogc2VnbWVudHNbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aDogc2VnbWVudHMuc2xpY2UoMSkuam9pbignLycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ export class DummySourceCache {
2
+ getFile(uri) {
3
+ return undefined;
4
+ }
5
+ async isFileAvailable(uri) {
6
+ return false;
7
+ }
8
+ storeFile(uri, content) {
9
+ return undefined;
10
+ }
11
+ clear() {
12
+ return undefined;
13
+ }
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXktc291cmNlLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9jb21wb25lbnRzL3ZzY29kZS90cy10eXBlLXJlc29sdmVyL2R1bW15LXNvdXJjZS1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLE9BQU8sQ0FBQyxHQUFXO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQVc7UUFDcEMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVNLFNBQVMsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUN6QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSztRQUNSLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvdXJjZUNhY2hlIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBEdW1teVNvdXJjZUNhY2hlIGltcGxlbWVudHMgU291cmNlQ2FjaGUge1xuICAgIHB1YmxpYyBnZXRGaWxlKHVyaTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaXNGaWxlQXZhaWxhYmxlKHVyaTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcmVGaWxlKHVyaTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,311 @@
1
+ import { DependencyParser } from './dependency-parser';
2
+ import * as path from 'path-browserify';
3
+ import { invokeUpdate } from './update-emitter';
4
+ import { RecursionDepth } from './recursion-depth';
5
+ import { importResourcePathToString } from './types';
6
+ import { UnpkgSourceResolver } from './unpkg-source-resolver';
7
+ export class ImportResolver {
8
+ constructor(options) {
9
+ this.options = options;
10
+ this.loadedFiles = [];
11
+ this.dependencyParser = new DependencyParser();
12
+ this.cache = options.sourceCache;
13
+ this.newImportsResolved = false;
14
+ this.monaco = options.monaco;
15
+ if (options.preloadPackages && options.versions) {
16
+ this.versions = options.versions;
17
+ for (const [packageName, version] of Object.entries(options.versions)) {
18
+ this.resolveImport({
19
+ kind: 'package',
20
+ packageName: packageName,
21
+ importPath: '',
22
+ }, new RecursionDepth(this.options)).catch(e => {
23
+ console.error(e);
24
+ });
25
+ }
26
+ }
27
+ }
28
+ wereNewImportsResolved() {
29
+ return this.newImportsResolved;
30
+ }
31
+ resetNewImportsResolved() {
32
+ this.newImportsResolved = false;
33
+ }
34
+ async resolveImportsInFile(source, parent, depth) {
35
+ if (depth.shouldStop()) {
36
+ return;
37
+ }
38
+ const imports = this.dependencyParser.parseDependencies(source, parent);
39
+ for (const importCall of imports) {
40
+ try {
41
+ await this.resolveImport(importCall, depth);
42
+ }
43
+ catch (e) {
44
+ if (this.options.onError) {
45
+ this.options.onError?.(e.message ?? e);
46
+ }
47
+ else {
48
+ console.error(e);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ async resolveImport(importResource, depth) {
54
+ const hash = this.hashImportResourcePath(importResource);
55
+ if (this.loadedFiles.includes(hash)) {
56
+ return;
57
+ }
58
+ this.loadedFiles.push(hash);
59
+ console.log("resolveImport", importResource, depth);
60
+ // Ignore these package imports as they are well-known to be pointless.
61
+ if (importResource.kind == "package" && importResource.packageName == "require")
62
+ return null;
63
+ switch (importResource.kind) {
64
+ case 'package':
65
+ const packageRelativeImport = await this.resolveImportFromPackageRoot(importResource);
66
+ if (packageRelativeImport) {
67
+ return await this.resolveImportInPackage(packageRelativeImport, depth.nextPackage().nextFile());
68
+ }
69
+ break;
70
+ case 'relative':
71
+ throw Error('Not implemented yet');
72
+ case 'relative-in-package':
73
+ return await this.resolveImportInPackage(importResource, depth.nextFile());
74
+ case 'bruteforce': {
75
+ }
76
+ }
77
+ }
78
+ async resolveImportInPackage(importResource, depth) {
79
+ console.log("resolveImportInPackage", importResource, depth);
80
+ const contents = await this.loadSourceFileContents(importResource);
81
+ if (contents) {
82
+ const { source, at } = contents;
83
+ this.createModel(source, this.monaco.Uri.parse(this.options.fileRootPath + path.join(`node_modules/${importResource.packageName}`, at)));
84
+ await this.resolveImportsInFile(source, {
85
+ kind: 'relative-in-package',
86
+ packageName: importResource.packageName,
87
+ sourcePath: path.dirname(at),
88
+ importPath: '',
89
+ }, depth);
90
+ }
91
+ }
92
+ async resolveImportFromPackageRoot(importResource) {
93
+ console.log("resolveImportFromPackageRoot", importResource);
94
+ const failedProgressUpdate = {
95
+ type: 'LookedUpPackage',
96
+ package: importResource.packageName,
97
+ definitelyTyped: false,
98
+ success: false,
99
+ };
100
+ if (this.options.onlySpecifiedPackages) {
101
+ if (!this.versions?.[importResource.packageName] && !this.versions?.['@types/' + importResource.packageName]) {
102
+ invokeUpdate(failedProgressUpdate, this.options);
103
+ return null;
104
+ }
105
+ }
106
+ const doesPkgJsonHasSubpath = importResource.importPath?.length ?? 0 > 0;
107
+ let pkgJsonSubpath = doesPkgJsonHasSubpath ? `/${importResource.importPath}` : '';
108
+ let pkgJson = await this.resolvePackageJson(importResource.packageName, this.versions?.[importResource.packageName], doesPkgJsonHasSubpath ? importResource.importPath : undefined);
109
+ if (!pkgJson && doesPkgJsonHasSubpath) {
110
+ pkgJson = await this.resolvePackageJson(importResource.packageName, this.versions?.[importResource.packageName]);
111
+ pkgJsonSubpath = '';
112
+ }
113
+ if (!pkgJson)
114
+ return invokeUpdate(failedProgressUpdate, this.options);
115
+ const pkg = JSON.parse(pkgJson);
116
+ console.log("package meta", pkg);
117
+ if (pkg.typings || pkg.types) {
118
+ const typings = pkg.typings || pkg.types;
119
+ this.createModel(pkgJson, this.monaco.Uri.parse(`${this.options.fileRootPath}node_modules/${importResource.packageName}${pkgJsonSubpath}/package.json`));
120
+ invokeUpdate({
121
+ type: 'LookedUpPackage',
122
+ package: importResource.packageName,
123
+ definitelyTyped: false,
124
+ success: true,
125
+ }, this.options);
126
+ this.setVersion(importResource.packageName, pkg.version);
127
+ return {
128
+ kind: 'relative-in-package',
129
+ packageName: importResource.packageName,
130
+ sourcePath: '',
131
+ importPath: path.join(importResource.importPath ?? '', typings.startsWith('./') ? typings.slice(2) : typings),
132
+ };
133
+ }
134
+ else {
135
+ const typingPackageName = `@types/${importResource.packageName.startsWith('@')
136
+ ? importResource.packageName.slice(1).replace(/\//, '__')
137
+ : importResource.packageName}`;
138
+ const pkgJsonTypings = await this.resolvePackageJson(typingPackageName, this.versions?.[typingPackageName]);
139
+ if (!pkgJsonTypings)
140
+ return invokeUpdate(failedProgressUpdate, this.options);
141
+ const pkg = JSON.parse(pkgJsonTypings);
142
+ if (!pkg.typings && !pkg.types) {
143
+ const files = await fetch("https://www.npmjs.com/package/@dt-esa/dynatrace-api-client/v/2.2.6/index", {
144
+ method: "get"
145
+ }).then(e => e.json());
146
+ const typingFiles = Object.entries(files.files).map(([key, val]) => val);
147
+ invokeUpdate({
148
+ type: 'LookedUpPackage',
149
+ package: typingPackageName,
150
+ definitelyTyped: true,
151
+ success: true,
152
+ }, this.options);
153
+ return {
154
+ kind: 'bruteforce',
155
+ packageName: typingPackageName,
156
+ typingFiles,
157
+ };
158
+ return;
159
+ // return invokeUpdate(failedProgressUpdate, this.options);
160
+ }
161
+ const typings = pkg.typings || pkg.types;
162
+ this.createModel(pkgJsonTypings, this.monaco.Uri.parse(`${this.options.fileRootPath}node_modules/${typingPackageName}/package.json`));
163
+ invokeUpdate({
164
+ type: 'LookedUpPackage',
165
+ package: typingPackageName,
166
+ definitelyTyped: true,
167
+ success: true,
168
+ }, this.options);
169
+ this.setVersion(typingPackageName, pkg.version);
170
+ return {
171
+ kind: 'relative-in-package',
172
+ packageName: typingPackageName,
173
+ sourcePath: '',
174
+ importPath: path.join(importResource.importPath ?? '', typings.startsWith('./') ? typings.slice(2) : typings),
175
+ };
176
+ }
177
+ }
178
+ async loadSourceFileContents(importResource) {
179
+ const progressUpdatePath = path.join(importResource.packageName, importResource.sourcePath, importResource.importPath);
180
+ const failedProgressUpdate = {
181
+ type: 'LookedUpTypeFile',
182
+ path: progressUpdatePath,
183
+ definitelyTyped: false,
184
+ success: false,
185
+ };
186
+ const pkgName = importResource.packageName;
187
+ const version = this.getVersion(importResource.packageName);
188
+ let appends = ['.d.ts', '/index.d.ts', '.ts', '.tsx', '/index.ts', '/index.tsx'];
189
+ if (appends.map(append => importResource.importPath.endsWith(append)).reduce((a, b) => a || b, false)) {
190
+ const source = await this.resolveSourceFile(pkgName, version, path.join(importResource.sourcePath, importResource.importPath));
191
+ if (source) {
192
+ return { source, at: path.join(importResource.sourcePath, importResource.importPath) };
193
+ }
194
+ }
195
+ else {
196
+ for (const append of appends) {
197
+ const fullPath = path.join(importResource.sourcePath, importResource.importPath) + append;
198
+ const source = await this.resolveSourceFile(pkgName, version, fullPath);
199
+ invokeUpdate({
200
+ type: 'AttemptedLookUpFile',
201
+ path: path.join(pkgName, fullPath),
202
+ success: !!source,
203
+ }, this.options);
204
+ if (source) {
205
+ invokeUpdate({
206
+ type: 'LookedUpTypeFile',
207
+ path: path.join(pkgName, fullPath),
208
+ success: true,
209
+ }, this.options);
210
+ return { source, at: fullPath };
211
+ }
212
+ }
213
+ }
214
+ const pkgJson = await this.resolvePackageJson(pkgName, version, path.join(importResource.sourcePath, importResource.importPath));
215
+ if (pkgJson) {
216
+ const { types } = JSON.parse(pkgJson);
217
+ if (types) {
218
+ const fullPath = path.join(importResource.sourcePath, importResource.importPath, types);
219
+ const source = await this.resolveSourceFile(pkgName, version, fullPath);
220
+ if (source) {
221
+ invokeUpdate({
222
+ type: 'LookedUpTypeFile',
223
+ path: path.join(pkgName, fullPath),
224
+ success: true,
225
+ }, this.options);
226
+ return { source, at: fullPath };
227
+ }
228
+ }
229
+ }
230
+ invokeUpdate(failedProgressUpdate, this.options);
231
+ return null;
232
+ }
233
+ getVersion(packageName) {
234
+ return this.versions?.[packageName];
235
+ }
236
+ setVersions(versions) {
237
+ this.versions = versions;
238
+ this.options.onUpdateVersions?.(versions);
239
+ // TODO reload packages whose version has changed
240
+ }
241
+ setVersion(packageName, version) {
242
+ this.setVersions({
243
+ ...this.versions,
244
+ [packageName]: version,
245
+ });
246
+ }
247
+ createModel(source, uri) {
248
+ uri = uri.with({ path: uri.path.replace('@types/', '') });
249
+ if (!this.monaco.editor.getModel(uri)) {
250
+ this.monaco.editor.createModel(source, 'typescript', uri);
251
+ this.newImportsResolved = true;
252
+ }
253
+ }
254
+ hashImportResourcePath(p) {
255
+ return importResourcePathToString(p);
256
+ }
257
+ async resolvePackageJson(packageName, version, subPath) {
258
+ const uri = path.join(packageName + (version ? `@${version}` : ''), subPath ?? '', 'package.json');
259
+ let isAvailable = false;
260
+ let content = undefined;
261
+ if (this.cache.isFileAvailable) {
262
+ isAvailable = await this.cache.isFileAvailable(uri);
263
+ }
264
+ else {
265
+ content = await this.cache.getFile(uri);
266
+ isAvailable = content !== undefined;
267
+ }
268
+ if (isAvailable) {
269
+ return content ?? (await this.cache.getFile(uri));
270
+ }
271
+ else {
272
+ console.log("recursing resolvePackageJson", packageName, version, subPath);
273
+ content = await UnpkgSourceResolver.resolvePackageJson(packageName, version, subPath);
274
+ if (content) {
275
+ this.cache.storeFile(uri, content);
276
+ }
277
+ return content;
278
+ }
279
+ }
280
+ async resolveSourceFile(packageName, version, filePath) {
281
+ const uri = path.join(packageName + (version ? `@${version}` : ''), filePath);
282
+ let isAvailable = false;
283
+ let content = undefined;
284
+ if (this.cache.isFileAvailable) {
285
+ isAvailable = await this.cache.isFileAvailable(uri);
286
+ }
287
+ else {
288
+ content = await this.cache.getFile(uri);
289
+ isAvailable = content !== undefined;
290
+ }
291
+ if (isAvailable) {
292
+ invokeUpdate({
293
+ type: 'LoadedFromCache',
294
+ importPath: uri,
295
+ }, this.options);
296
+ return content ?? (await this.cache.getFile(uri));
297
+ }
298
+ else {
299
+ content = await UnpkgSourceResolver.resolveSourceFile(packageName, version, filePath);
300
+ if (content) {
301
+ invokeUpdate({
302
+ type: 'StoredToCache',
303
+ importPath: uri,
304
+ }, this.options);
305
+ this.cache.storeFile(uri, content);
306
+ }
307
+ return content;
308
+ }
309
+ }
310
+ }
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9jb21wb25lbnRzL3ZzY29kZS90cy10eXBlLXJlc29sdmVyL2ltcG9ydC1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssSUFBSSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUE0RywwQkFBMEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMvSixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxNQUFNLE9BQU8sY0FBYztJQVF2QixZQUFvQixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTyxDQUFDO1FBRTlCLElBQUksT0FBTyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNqQyxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFB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WUFDdEYsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsWUFBWSxDQUNSO29CQUNJLElBQUksRUFBRSxlQUFlO29CQUNyQixVQUFVLEVBQUUsR0FBRztpQkFDbEIsRUFDRCxJQUFJLENBQUMsT0FBTyxDQUNmLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ3RDO1lBQ0QsT0FBTyxPQUFPLENBQUM7U0FDbEI7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7IERlcGVuZGVuY3lQYXJzZXIgfSBmcm9tICcuL2RlcGVuZGVuY3ktcGFyc2VyJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aC1icm93c2VyaWZ5JztcbmltcG9ydCB7IGludm9rZVVwZGF0ZSB9IGZyb20gJy4vdXBkYXRlLWVtaXR0ZXInO1xuaW1wb3J0IHsgUmVjdXJzaW9uRGVwdGggfSBmcm9tICcuL3JlY3Vyc2lvbi1kZXB0aCc7XG5pbXBvcnQgeyBJbXBvcnRSZXNvdXJjZVBhdGgsIEltcG9ydFJlc291cmNlUGF0aFBhY2thZ2UsIEltcG9ydFJlc291cmNlUGF0aFJlbGF0aXZlSW5QYWNrYWdlLCBPcHRpb25zLCBTb3VyY2VDYWNoZSwgaW1wb3J0UmVzb3VyY2VQYXRoVG9TdHJpbmcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFVucGtnU291cmNlUmVzb2x2ZXIgfSBmcm9tICcuL3VucGtnLXNvdXJjZS1yZXNvbHZlcic7XG5cbmV4cG9ydCBjbGFzcyBJbXBvcnRSZXNvbHZlciB7XG4gICAgcHJpdmF0ZSBsb2FkZWRGaWxlczogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBkZXBlbmRlbmN5UGFyc2VyOiBEZXBlbmRlbmN5UGFyc2VyO1xuICAgIHByaXZhdGUgY2FjaGU6IFNvdXJjZUNhY2hlO1xuICAgIHByaXZhdGUgdmVyc2lvbnM/OiB7IFtwYWNrYWdlTmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgcHJpdmF0ZSBuZXdJbXBvcnRzUmVzb2x2ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBtb25hY286IHR5cGVvZiBtb25hY287XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY3lQYXJzZXIgPSBuZXcgRGVwZW5kZW5jeVBhcnNlcigpO1xuICAgICAgICB0aGlzLmNhY2hlID0gb3B0aW9ucy5zb3VyY2VDYWNoZTtcbiAgICAgICAgdGhpcy5uZXdJbXBvcnRzUmVzb2x2ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb25hY28gPSBvcHRpb25zLm1vbmFjbyE7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJlbG9hZFBhY2thZ2VzICYmIG9wdGlvbnMudmVyc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMudmVyc2lvbnMgPSBvcHRpb25zLnZlcnNpb25zO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFja2FnZU5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMudmVyc2lvbnMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlSW1wb3J0KFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAncGFja2FnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZTogcGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXRoOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkRlcHRoKHRoaXMub3B0aW9ucylcbiAgICAgICAgICAgICAgICApLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdlcmVOZXdJbXBvcnRzUmVzb2x2ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld0ltcG9ydHNSZXNvbHZlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXROZXdJbXBvcnRzUmVzb2x2ZWQoKSB7XG4gICAgICAgIHRoaXMubmV3SW1wb3J0c1Jlc29sdmVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc29sdmVJbXBvcnRzSW5GaWxlKHNvdXJjZTogc3RyaW5nLCBwYXJlbnQ6IHN0cmluZyB8IEltcG9ydFJlc291cmNlUGF0aCwgZGVwdGg6IFJlY3Vyc2lvbkRlcHRoKSB7XG4gICAgICAgIGlmIChkZXB0aC5zaG91bGRTdG9wKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSB0aGlzLmRlcGVuZGVuY3lQYXJzZXIucGFyc2VEZXBlbmRlbmNpZXMoc291cmNlLCBwYXJlbnQpO1xuICAgICAgICBmb3IgKGNvbnN0IGltcG9ydENhbGwgb2YgaW1wb3J0cykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVJbXBvcnQoaW1wb3J0Q2FsbCwgZGVwdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uRXJyb3I/LigoZSBhcyBFcnJvcikubWVzc2FnZSA/PyBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlSW1wb3J0KGltcG9ydFJlc291cmNlOiBJbXBvcnRSZXNvdXJjZVBhdGgsIGRlcHRoOiBSZWN1cnNpb25EZXB0aCkge1xuICAgICAgICBjb25zdCBoYXNoID0gdGhpcy5oYXNoSW1wb3J0UmVzb3VyY2VQYXRoKGltcG9ydFJlc291cmNlKTtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkRmlsZXMuaW5jbHVkZXMoaGFzaCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGVkRmlsZXMucHVzaChoYXNoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJyZXNvbHZlSW1wb3J0XCIsIGltcG9ydFJlc291cmNlLCBkZXB0aCk7XG5cbiAgICAgICAgLy8gSWdub3JlIHRoZXNlIHBhY2thZ2UgaW1wb3J0cyBhcyB0aGV5IGFyZSB3ZWxsLWtub3duIHRvIGJlIHBvaW50bGVzcy5cbiAgICAgICAgaWYgKGltcG9ydFJlc291cmNlLmtpbmQgPT0gXCJwYWNrYWdlXCIgJiYgaW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWUgPT0gXCJyZXF1aXJlXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBzd2l0Y2ggKGltcG9ydFJlc291cmNlLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BhY2thZ2UnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VSZWxhdGl2ZUltcG9ydCA9IGF3YWl0IHRoaXMucmVzb2x2ZUltcG9ydEZyb21QYWNrYWdlUm9vdChpbXBvcnRSZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VSZWxhdGl2ZUltcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXNvbHZlSW1wb3J0SW5QYWNrYWdlKHBhY2thZ2VSZWxhdGl2ZUltcG9ydCwgZGVwdGgubmV4dFBhY2thZ2UoKS5uZXh0RmlsZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyZWxhdGl2ZSc6XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgICAgIGNhc2UgJ3JlbGF0aXZlLWluLXBhY2thZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlc29sdmVJbXBvcnRJblBhY2thZ2UoaW1wb3J0UmVzb3VyY2UsIGRlcHRoLm5leHRGaWxlKCkpO1xuICAgICAgICAgICAgY2FzZSAnYnJ1dGVmb3JjZSc6IHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlSW1wb3J0SW5QYWNrYWdlKGltcG9ydFJlc291cmNlOiBJbXBvcnRSZXNvdXJjZVBhdGhSZWxhdGl2ZUluUGFja2FnZSwgZGVwdGg6IFJlY3Vyc2lvbkRlcHRoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzb2x2ZUltcG9ydEluUGFja2FnZVwiLCBpbXBvcnRSZXNvdXJjZSwgZGVwdGgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgdGhpcy5sb2FkU291cmNlRmlsZUNvbnRlbnRzKGltcG9ydFJlc291cmNlKTtcblxuICAgICAgICBpZiAoY29udGVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc291cmNlLCBhdCB9ID0gY29udGVudHM7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vZGVsKFxuICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vbmFjby5VcmkucGFyc2UodGhpcy5vcHRpb25zLmZpbGVSb290UGF0aCArIHBhdGguam9pbihgbm9kZV9tb2R1bGVzLyR7aW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWV9YCwgYXQpKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlSW1wb3J0c0luRmlsZShcbiAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAncmVsYXRpdmUtaW4tcGFja2FnZScsXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lOiBpbXBvcnRSZXNvdXJjZS5wYWNrYWdlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlUGF0aDogcGF0aC5kaXJuYW1lKGF0KSxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aDogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXB0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUltcG9ydEZyb21QYWNrYWdlUm9vdChcbiAgICAgICAgaW1wb3J0UmVzb3VyY2U6IEltcG9ydFJlc291cmNlUGF0aFBhY2thZ2VcbiAgICApOiBQcm9taXNlPEltcG9ydFJlc291cmNlUGF0aFJlbGF0aXZlSW5QYWNrYWdlIHwgdm9pZD4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcInJlc29sdmVJbXBvcnRGcm9tUGFja2FnZVJvb3RcIiwgaW1wb3J0UmVzb3VyY2UpO1xuXG4gICAgICAgIGNvbnN0IGZhaWxlZFByb2dyZXNzVXBkYXRlID0ge1xuICAgICAgICAgICAgdHlwZTogJ0xvb2tlZFVwUGFja2FnZScsXG4gICAgICAgICAgICBwYWNrYWdlOiBpbXBvcnRSZXNvdXJjZS5wYWNrYWdlTmFtZSxcbiAgICAgICAgICAgIGRlZmluaXRlbHlUeXBlZDogZmFsc2UsXG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9ubHlTcGVjaWZpZWRQYWNrYWdlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZlcnNpb25zPy5baW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWVdICYmICF0aGlzLnZlcnNpb25zPy5bJ0B0eXBlcy8nICsgaW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgaW52b2tlVXBkYXRlKGZhaWxlZFByb2dyZXNzVXBkYXRlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9lc1BrZ0pzb25IYXNTdWJwYXRoID0gaW1wb3J0UmVzb3VyY2UuaW1wb3J0UGF0aD8ubGVuZ3RoID8/IDAgPiAwO1xuICAgICAgICBsZXQgcGtnSnNvblN1YnBhdGggPSBkb2VzUGtnSnNvbkhhc1N1YnBhdGggPyBgLyR7aW1wb3J0UmVzb3VyY2UuaW1wb3J0UGF0aH1gIDogJyc7XG4gICAgICAgIGxldCBwa2dKc29uID0gYXdhaXQgdGhpcy5yZXNvbHZlUGFja2FnZUpzb24oXG4gICAgICAgICAgICBpbXBvcnRSZXNvdXJjZS5wYWNrYWdlTmFtZSxcbiAgICAgICAgICAgIHRoaXMudmVyc2lvbnM/LltpbXBvcnRSZXNvdXJjZS5wYWNrYWdlTmFtZV0sXG4gICAgICAgICAgICBkb2VzUGtnSnNvbkhhc1N1YnBhdGggPyBpbXBvcnRSZXNvdXJjZS5pbXBvcnRQYXRoIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFwa2dKc29uICYmIGRvZXNQa2dKc29uSGFzU3VicGF0aCkge1xuICAgICAgICAgICAgcGtnSnNvbiA9IGF3YWl0IHRoaXMucmVzb2x2ZVBhY2thZ2VKc29uKGltcG9ydFJlc291cmNlLnBhY2thZ2VOYW1lLCB0aGlzLnZlcnNpb25zPy5baW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWVdKTtcbiAgICAgICAgICAgIHBrZ0pzb25TdWJwYXRoID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBrZ0pzb24pIHJldHVybiBpbnZva2VVcGRhdGUoZmFpbGVkUHJvZ3Jlc3NVcGRhdGUsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShwa2dKc29uKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhcInBhY2thZ2UgbWV0YVwiLCBwa2cpO1xuXG4gICAgICAgIGlmIChwa2cudHlwaW5ncyB8fCBwa2cudHlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGluZ3MgPSBwa2cudHlwaW5ncyB8fCBwa2cudHlwZXM7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vZGVsKFxuICAgICAgICAgICAgICAgIHBrZ0pzb24sXG4gICAgICAgICAgICAgICAgdGhpcy5tb25hY28uVXJpLnBhcnNlKFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLm9wdGlvbnMuZmlsZVJvb3RQYXRofW5vZGVfbW9kdWxlcy8ke2ltcG9ydFJlc291cmNlLnBhY2thZ2VOYW1lfSR7cGtnSnNvblN1YnBhdGh9L3BhY2thZ2UuanNvbmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpbnZva2VVcGRhdGUoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTG9va2VkVXBQYWNrYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogaW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRlbHlUeXBlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNldFZlcnNpb24oaW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWUsIHBrZy52ZXJzaW9uKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBraW5kOiAncmVsYXRpdmUtaW4tcGFja2FnZScsXG4gICAgICAgICAgICAgICAgcGFja2FnZU5hbWU6IGltcG9ydFJlc291cmNlLnBhY2thZ2VOYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIGltcG9ydFBhdGg6IHBhdGguam9pbihpbXBvcnRSZXNvdXJjZS5pbXBvcnRQYXRoID8/ICcnLCB0eXBpbmdzLnN0YXJ0c1dpdGgoJy4vJykgPyB0eXBpbmdzLnNsaWNlKDIpIDogdHlwaW5ncyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuXG4gICAgICAgICAgICBjb25zdCB0eXBpbmdQYWNrYWdlTmFtZSA9IGBAdHlwZXMvJHtcbiAgICAgICAgICAgICAgICBpbXBvcnRSZXNvdXJjZS5wYWNrYWdlTmFtZS5zdGFydHNXaXRoKCdAJylcbiAgICAgICAgICAgICAgICAgICAgPyBpbXBvcnRSZXNvdXJjZS5wYWNrYWdlTmFtZS5zbGljZSgxKS5yZXBsYWNlKC9cXC8vLCAnX18nKVxuICAgICAgICAgICAgICAgICAgICA6IGltcG9ydFJlc291cmNlLnBhY2thZ2VOYW1lXG4gICAgICAgICAgICB9YDtcblxuICAgICAgICAgICAgY29uc3QgcGtnSnNvblR5cGluZ3MgPSBhd2FpdCB0aGlzLnJlc29sdmVQYWNrYWdlSnNvbih0eXBpbmdQYWNrYWdlTmFtZSwgdGhpcy52ZXJzaW9ucz8uW3R5cGluZ1BhY2thZ2VOYW1lXSk7XG5cbiAgICAgICAgICAgIGlmICghcGtnSnNvblR5cGluZ3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZVVwZGF0ZShmYWlsZWRQcm9ncmVzc1VwZGF0ZSwgdGhpcy5vcHRpb25zKTtcblxuICAgICAgICAgICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShwa2dKc29uVHlwaW5ncyk7XG5cbiAgICAgICAgICAgIGlmICghcGtnLnR5cGluZ3MgJiYgIXBrZy50eXBlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVDb3VudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW2tleTogc3RyaW5nXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIkZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JpbmFyeTogXCJ0cnVlXCIgfCBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdyaXR5OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXN1bTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemU6IG51bWJlclxuICAgICAgICAgICAgICAgIH0gPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BkdC1lc2EvZHluYXRyYWNlLWFwaS1jbGllbnQvdi8yLjIuNi9pbmRleFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIlxuICAgICAgICAgICAgICAgIH0pLnRoZW4oZSA9PiBlLmpzb24oKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0eXBpbmdGaWxlcyA9IE9iamVjdC5lbnRyaWVzKGZpbGVzLmZpbGVzKS5tYXAoKFtrZXksIHZhbF0pID0+IHZhbCk7XG5cbiAgICAgICAgICAgICAgICBpbnZva2VVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdMb29rZWRVcFBhY2thZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogdHlwaW5nUGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0ZWx5VHlwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ2JydXRlZm9yY2UnLFxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZTogdHlwaW5nUGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGluZ0ZpbGVzLFxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiBpbnZva2VVcGRhdGUoZmFpbGVkUHJvZ3Jlc3NVcGRhdGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHR5cGluZ3MgPSBwa2cudHlwaW5ncyB8fCBwa2cudHlwZXM7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vZGVsKFxuICAgICAgICAgICAgICAgIHBrZ0pzb25UeXBpbmdzLFxuICAgICAgICAgICAgICAgIHRoaXMubW9uYWNvLlVyaS5wYXJzZShgJHt0aGlzLm9wdGlvbnMuZmlsZVJvb3RQYXRofW5vZGVfbW9kdWxlcy8ke3R5cGluZ1BhY2thZ2VOYW1lfS9wYWNrYWdlLmpzb25gKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaW52b2tlVXBkYXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0xvb2tlZFVwUGFja2FnZScsXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2U6IHR5cGluZ1BhY2thZ2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZWZpbml0ZWx5VHlwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNldFZlcnNpb24odHlwaW5nUGFja2FnZU5hbWUsIHBrZy52ZXJzaW9uKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBraW5kOiAncmVsYXRpdmUtaW4tcGFja2FnZScsXG4gICAgICAgICAgICAgICAgcGFja2FnZU5hbWU6IHR5cGluZ1BhY2thZ2VOYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIGltcG9ydFBhdGg6IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0UmVzb3VyY2UuaW1wb3J0UGF0aCA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwaW5ncy5zdGFydHNXaXRoKCcuLycpID8gdHlwaW5ncy5zbGljZSgyKSA6IHR5cGluZ3NcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFNvdXJjZUZpbGVDb250ZW50cyhcbiAgICAgICAgaW1wb3J0UmVzb3VyY2U6IEltcG9ydFJlc291cmNlUGF0aFJlbGF0aXZlSW5QYWNrYWdlXG4gICAgKTogUHJvbWlzZTx7IHNvdXJjZTogc3RyaW5nOyBhdDogc3RyaW5nIH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzVXBkYXRlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgIGltcG9ydFJlc291cmNlLnBhY2thZ2VOYW1lLFxuICAgICAgICAgICAgaW1wb3J0UmVzb3VyY2Uuc291cmNlUGF0aCxcbiAgICAgICAgICAgIGltcG9ydFJlc291cmNlLmltcG9ydFBhdGhcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBmYWlsZWRQcm9ncmVzc1VwZGF0ZSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdMb29rZWRVcFR5cGVGaWxlJyxcbiAgICAgICAgICAgIHBhdGg6IHByb2dyZXNzVXBkYXRlUGF0aCxcbiAgICAgICAgICAgIGRlZmluaXRlbHlUeXBlZDogZmFsc2UsXG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWU7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oaW1wb3J0UmVzb3VyY2UucGFja2FnZU5hbWUpO1xuXG4gICAgICAgIGxldCBhcHBlbmRzID0gWycuZC50cycsICcvaW5kZXguZC50cycsICcudHMnLCAnLnRzeCcsICcvaW5kZXgudHMnLCAnL2luZGV4LnRzeCddO1xuXG4gICAgICAgIGlmIChhcHBlbmRzLm1hcChhcHBlbmQgPT4gaW1wb3J0UmVzb3VyY2UuaW1wb3J0UGF0aC5lbmRzV2l0aChhcHBlbmQpKS5yZWR1Y2UoKGEsIGIpID0+IGEgfHwgYiwgZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLnJlc29sdmVTb3VyY2VGaWxlKFxuICAgICAgICAgICAgICAgIHBrZ05hbWUsXG4gICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oaW1wb3J0UmVzb3VyY2Uuc291cmNlUGF0aCwgaW1wb3J0UmVzb3VyY2UuaW1wb3J0UGF0aClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc291cmNlLCBhdDogcGF0aC5qb2luKGltcG9ydFJlc291cmNlLnNvdXJjZVBhdGgsIGltcG9ydFJlc291cmNlLmltcG9ydFBhdGgpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFwcGVuZCBvZiBhcHBlbmRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oaW1wb3J0UmVzb3VyY2Uuc291cmNlUGF0aCwgaW1wb3J0UmVzb3VyY2UuaW1wb3J0UGF0aCkgKyBhcHBlbmQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgdGhpcy5yZXNvbHZlU291cmNlRmlsZShwa2dOYW1lLCB2ZXJzaW9uLCBmdWxsUGF0aCk7XG4gICAgICAgICAgICAgICAgaW52b2tlVXBkYXRlKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQXR0ZW1wdGVkTG9va1VwRmlsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4ocGtnTmFtZSwgZnVsbFBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogISFzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnZva2VVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0xvb2tlZFVwVHlwZUZpbGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGguam9pbihwa2dOYW1lLCBmdWxsUGF0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc291cmNlLCBhdDogZnVsbFBhdGggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwa2dKc29uID0gYXdhaXQgdGhpcy5yZXNvbHZlUGFja2FnZUpzb24oXG4gICAgICAgICAgICBwa2dOYW1lLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIHBhdGguam9pbihpbXBvcnRSZXNvdXJjZS5zb3VyY2VQYXRoLCBpbXBvcnRSZXNvdXJjZS5pbXBvcnRQYXRoKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwa2dKc29uKSB7XG4gICAgICAgICAgICBjb25zdCB7IHR5cGVzIH0gPSBKU09OLnBhcnNlKHBrZ0pzb24pO1xuICAgICAgICAgICAgaWYgKHR5cGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oaW1wb3J0UmVzb3VyY2Uuc291cmNlUGF0aCwgaW1wb3J0UmVzb3VyY2UuaW1wb3J0UGF0aCwgdHlwZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVNvdXJjZUZpbGUocGtnTmFtZSwgdmVyc2lvbiwgZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlVXBkYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdMb29rZWRVcFR5cGVGaWxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4ocGtnTmFtZSwgZnVsbFBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZSwgYXQ6IGZ1bGxQYXRoIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW52b2tlVXBkYXRlKGZhaWxlZFByb2dyZXNzVXBkYXRlLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9ucz8uW3BhY2thZ2VOYW1lXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VmVyc2lvbnModmVyc2lvbnM6IHsgW3BhY2thZ2VOYW1lOiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLnZlcnNpb25zID0gdmVyc2lvbnM7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vblVwZGF0ZVZlcnNpb25zPy4odmVyc2lvbnMpO1xuICAgICAgICAvLyBUT0RPIHJlbG9hZCBwYWNrYWdlcyB3aG9zZSB2ZXJzaW9uIGhhcyBjaGFuZ2VkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldFZlcnNpb25zKHtcbiAgICAgICAgICAgIC4uLnRoaXMudmVyc2lvbnMsXG4gICAgICAgICAgICBbcGFja2FnZU5hbWVdOiB2ZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1vZGVsKHNvdXJjZTogc3RyaW5nLCB1cmk6IG1vbmFjby5VcmkpIHtcbiAgICAgICAgdXJpID0gdXJpLndpdGgoeyBwYXRoOiB1cmkucGF0aC5yZXBsYWNlKCdAdHlwZXMvJywgJycpIH0pO1xuICAgICAgICBpZiAoIXRoaXMubW9uYWNvLmVkaXRvci5nZXRNb2RlbCh1cmkpKSB7XG4gICAgICAgICAgICB0aGlzLm1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwoc291cmNlLCAndHlwZXNjcmlwdCcsIHVyaSk7XG4gICAgICAgICAgICB0aGlzLm5ld0ltcG9ydHNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc2hJbXBvcnRSZXNvdXJjZVBhdGgocDogSW1wb3J0UmVzb3VyY2VQYXRoKSB7XG4gICAgICAgIHJldHVybiBpbXBvcnRSZXNvdXJjZVBhdGhUb1N0cmluZyhwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVQYWNrYWdlSnNvbihcbiAgICAgICAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICAgICAgdmVyc2lvbj86IHN0cmluZyxcbiAgICAgICAgc3ViUGF0aD86IHN0cmluZ1xuICAgICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cbiAgICAgICAgY29uc3QgdXJpID0gcGF0aC5qb2luKHBhY2thZ2VOYW1lICsgKHZlcnNpb24gPyBgQCR7dmVyc2lvbn1gIDogJycpLCBzdWJQYXRoID8/ICcnLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGxldCBpc0F2YWlsYWJsZSA9IGZhbHNlO1xuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmlzRmlsZUF2YWlsYWJsZSkge1xuICAgICAgICAgICAgaXNBdmFpbGFibGUgPSBhd2FpdCB0aGlzLmNhY2hlLmlzRmlsZUF2YWlsYWJsZSh1cmkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IHRoaXMuY2FjaGUuZ2V0RmlsZSh1cmkpO1xuICAgICAgICAgICAgaXNBdmFpbGFibGUgPSBjb250ZW50ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50ID8/IChhd2FpdCB0aGlzLmNhY2hlLmdldEZpbGUodXJpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlY3Vyc2luZyByZXNvbHZlUGFja2FnZUpzb25cIiwgcGFja2FnZU5hbWUsIHZlcnNpb24sIHN1YlBhdGgpXG4gICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgVW5wa2dTb3VyY2VSZXNvbHZlci5yZXNvbHZlUGFja2FnZUpzb24ocGFja2FnZU5hbWUsIHZlcnNpb24sIHN1YlBhdGgpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlLnN0b3JlRmlsZSh1cmksIGNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVTb3VyY2VGaWxlKFxuICAgICAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgICAgICB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIGZpbGVQYXRoOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXG4gICAgICAgIGNvbnN0IHVyaSA9IHBhdGguam9pbihwYWNrYWdlTmFtZSArICh2ZXJzaW9uID8gYEAke3ZlcnNpb259YCA6ICcnKSwgZmlsZVBhdGgpO1xuICAgICAgICBsZXQgaXNBdmFpbGFibGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5pc0ZpbGVBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIGlzQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5jYWNoZS5pc0ZpbGVBdmFpbGFibGUodXJpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCB0aGlzLmNhY2hlLmdldEZpbGUodXJpKTtcbiAgICAgICAgICAgIGlzQXZhaWxhYmxlID0gY29udGVudCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICBpbnZva2VVcGRhdGUoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTG9hZGVkRnJvbUNhY2hlJyxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aDogdXJpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQgPz8gKGF3YWl0IHRoaXMuY2FjaGUuZ2V0RmlsZSh1cmkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCBVbnBrZ1NvdXJjZVJlc29sdmVyLnJlc29sdmVTb3VyY2VGaWxlKHBhY2thZ2VOYW1lLCB2ZXJzaW9uLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgICAgICAgIGludm9rZVVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1N0b3JlZFRvQ2FjaGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aDogdXJpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc3RvcmVGaWxlKHVyaSwgY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,112 @@
1
+ import { ImportResolver } from './import-resolver';
2
+ import * as path from 'path-browserify';
3
+ import { invokeUpdate } from './update-emitter';
4
+ import { RecursionDepth } from './recursion-depth';
5
+ import { DummySourceCache } from './dummy-source-cache';
6
+ // https://github.com/lukasbach/monaco-editor-auto-typings
7
+ export class MonacoAutoTypeImporter {
8
+ constructor(editor, options) {
9
+ this.editor = editor;
10
+ this.options = options;
11
+ this.disposables = [];
12
+ this.importResolver = new ImportResolver(options);
13
+ const changeModelDisposable = editor.onDidChangeModelContent(e => {
14
+ this.debouncedResolveContents();
15
+ });
16
+ this.disposables.push(changeModelDisposable);
17
+ this.resolveContents();
18
+ if (!options.dontAdaptEditorOptions) {
19
+ options.monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
20
+ ...options.monaco.languages.typescript.typescriptDefaults.getCompilerOptions(),
21
+ moduleResolution: options.monaco.languages.typescript.ModuleResolutionKind.NodeJs,
22
+ allowSyntheticDefaultImports: true,
23
+ rootDir: options.fileRootPath,
24
+ });
25
+ }
26
+ }
27
+ static async create(editor, options) {
28
+ if (options?.shareCache && options.sourceCache && !MonacoAutoTypeImporter.sharedCache) {
29
+ MonacoAutoTypeImporter.sharedCache = options.sourceCache;
30
+ }
31
+ const monacoInstance = options?.monaco ?? window['monaco'];
32
+ if (!monacoInstance) {
33
+ throw new Error('monacoInstance not found, you can specify the monaco instance via options.monaco');
34
+ }
35
+ return new MonacoAutoTypeImporter(editor, {
36
+ fileRootPath: 'inmemory://model/',
37
+ onlySpecifiedPackages: false,
38
+ preloadPackages: false,
39
+ shareCache: false,
40
+ dontAdaptEditorOptions: false,
41
+ dontRefreshModelValueAfterResolvement: false,
42
+ sourceCache: MonacoAutoTypeImporter.sharedCache ?? new DummySourceCache(),
43
+ debounceDuration: 4000,
44
+ fileRecursionDepth: 10,
45
+ packageRecursionDepth: 3,
46
+ ...options,
47
+ monaco: monacoInstance,
48
+ });
49
+ }
50
+ dispose() {
51
+ this.disposables.forEach(d => d.dispose());
52
+ }
53
+ setVersions(versions) {
54
+ this.importResolver.setVersions(versions);
55
+ this.options.versions = versions;
56
+ }
57
+ async clearCache() {
58
+ await this.options.sourceCache.clear();
59
+ }
60
+ debouncedResolveContents() {
61
+ if (this.isResolving) {
62
+ return;
63
+ }
64
+ invokeUpdate({ type: 'CodeChanged' }, this.options);
65
+ if (this.options.debounceDuration <= 0) {
66
+ this.resolveContents();
67
+ }
68
+ else {
69
+ if (this.debounceTimer !== undefined) {
70
+ clearTimeout(this.debounceTimer);
71
+ }
72
+ this.debounceTimer = setTimeout(async () => {
73
+ await this.resolveContents();
74
+ this.debounceTimer = undefined;
75
+ }, this.options.debounceDuration);
76
+ }
77
+ }
78
+ async resolveContents() {
79
+ this.isResolving = true;
80
+ invokeUpdate({ type: 'ResolveNewImports' }, this.options);
81
+ const model = this.editor.getModel();
82
+ // This can happen when the editor is disposed before all typings
83
+ // are installed.
84
+ if (!model) {
85
+ throw Error('No model');
86
+ }
87
+ const content = model.getLinesContent();
88
+ try {
89
+ await this.importResolver.resolveImportsInFile(content.join('\n'), path.dirname(model.uri.toString()), new RecursionDepth(this.options));
90
+ }
91
+ catch (e) {
92
+ if (this.options.onError) {
93
+ this.options.onError(e.message ?? e);
94
+ }
95
+ else {
96
+ throw e;
97
+ }
98
+ }
99
+ if (this.importResolver.wereNewImportsResolved()) {
100
+ if (!this.options.dontRefreshModelValueAfterResolvement) {
101
+ const currentPosition = this.editor.getPosition();
102
+ model.setValue(model.getValue());
103
+ if (currentPosition) {
104
+ this.editor.setPosition(currentPosition);
105
+ }
106
+ }
107
+ this.importResolver.resetNewImportsResolved();
108
+ }
109
+ this.isResolving = false;
110
+ }
111
+ }
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy92c2NvZGUvdHMtdHlwZS1yZXNvbHZlci9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssSUFBSSxNQUFNLGlCQUFpQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJeEQsMERBQTBEO0FBQzFELE1BQU0sT0FBTyxzQkFBc0I7SUFPL0IsWUFBMkIsTUFBYyxFQUFVLE9BQWdCO1FBQXhDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBRjNELGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUczQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxELE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtZQUNqQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3RFLEdBQUcsT0FBTyxDQUFD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QUMsQ0FBQztpQkFDNUM7YUFDSjtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNqRDtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEltcG9ydFJlc29sdmVyIH0gZnJvbSAnLi9pbXBvcnQtcmVzb2x2ZXInO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoLWJyb3dzZXJpZnknO1xuaW1wb3J0IHR5cGUgKiBhcyBtb25hY28gZnJvbSAnbW9uYWNvLWVkaXRvcic7XG5pbXBvcnQgeyBpbnZva2VVcGRhdGUgfSBmcm9tICcuL3VwZGF0ZS1lbWl0dGVyJztcbmltcG9ydCB7IFJlY3Vyc2lvbkRlcHRoIH0gZnJvbSAnLi9yZWN1cnNpb24tZGVwdGgnO1xuaW1wb3J0IHsgT3B0aW9ucywgU291cmNlQ2FjaGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IER1bW15U291cmNlQ2FjaGUgfSBmcm9tICcuL2R1bW15LXNvdXJjZS1jYWNoZSc7XG5cbnR5cGUgRWRpdG9yID0gbW9uYWNvLmVkaXRvci5JQ29kZUVkaXRvciB8IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbHVrYXNiYWNoL21vbmFjby1lZGl0b3ItYXV0by10eXBpbmdzXG5leHBvcnQgY2xhc3MgTW9uYWNvQXV0b1R5cGVJbXBvcnRlciBpbXBsZW1lbnRzIG1vbmFjby5JRGlzcG9zYWJsZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgc2hhcmVkQ2FjaGU/OiBTb3VyY2VDYWNoZTtcbiAgICBwcml2YXRlIGltcG9ydFJlc29sdmVyOiBJbXBvcnRSZXNvbHZlcjtcbiAgICBwcml2YXRlIGRlYm91bmNlVGltZXI/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBpc1Jlc29sdmluZz86IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNwb3NhYmxlczogbW9uYWNvLklEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGVkaXRvcjogRWRpdG9yLCBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbXBvcnRSZXNvbHZlciA9IG5ldyBJbXBvcnRSZXNvbHZlcihvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VNb2RlbERpc3Bvc2FibGUgPSBlZGl0b3Iub25EaWRDaGFuZ2VNb2RlbENvbnRlbnQoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlYm91bmNlZFJlc29sdmVDb250ZW50cygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wdXNoKGNoYW5nZU1vZGVsRGlzcG9zYWJsZSk7XG4gICAgICAgIHRoaXMucmVzb2x2ZUNvbnRlbnRzKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmRvbnRBZGFwdEVkaXRvck9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubW9uYWNvLmxhbmd1YWdlcy50eXBlc2NyaXB0LnR5cGVzY3JpcHREZWZhdWx0cy5zZXRDb21waWxlck9wdGlvbnMoe1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMubW9uYWNvLmxhbmd1YWdlcy50eXBlc2NyaXB0LnR5cGVzY3JpcHREZWZhdWx0cy5nZXRDb21waWxlck9wdGlvbnMoKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBvcHRpb25zLm1vbmFjby5sYW5ndWFnZXMudHlwZXNjcmlwdC5Nb2R1bGVSZXNvbHV0aW9uS2luZC5Ob2RlSnMsXG4gICAgICAgICAgICAgICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICByb290RGlyOiBvcHRpb25zLmZpbGVSb290UGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGUoZWRpdG9yOiBFZGl0b3IsIG9wdGlvbnM/OiBQYXJ0aWFsPE9wdGlvbnM+KTogUHJvbWlzZTxNb25hY29BdXRvVHlwZUltcG9ydGVyPiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5zaGFyZUNhY2hlICYmIG9wdGlvbnMuc291cmNlQ2FjaGUgJiYgIU1vbmFjb0F1dG9UeXBlSW1wb3J0ZXIuc2hhcmVkQ2FjaGUpIHtcbiAgICAgICAgICAgIE1vbmFjb0F1dG9UeXBlSW1wb3J0ZXIuc2hhcmVkQ2FjaGUgPSBvcHRpb25zLnNvdXJjZUNhY2hlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9uYWNvSW5zdGFuY2UgPSBvcHRpb25zPy5tb25hY28gPz8gd2luZG93Wydtb25hY28nXTtcblxuICAgICAgICBpZiAoIW1vbmFjb0luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21vbmFjb0luc3RhbmNlIG5vdCBmb3VuZCwgeW91IGNhbiBzcGVjaWZ5IHRoZSBtb25hY28gaW5zdGFuY2UgdmlhIG9wdGlvbnMubW9uYWNvJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE1vbmFjb0F1dG9UeXBlSW1wb3J0ZXIoZWRpdG9yLCB7XG4gICAgICAgICAgICBmaWxlUm9vdFBhdGg6ICdpbm1lbW9yeTovL21vZGVsLycsXG4gICAgICAgICAgICBvbmx5U3BlY2lmaWVkUGFja2FnZXM6IGZhbHNlLFxuICAgICAgICAgICAgcHJlbG9hZFBhY2thZ2VzOiBmYWxzZSxcbiAgICAgICAgICAgIHNoYXJlQ2FjaGU6IGZhbHNlLFxuICAgICAgICAgICAgZG9udEFkYXB0RWRpdG9yT3B0aW9uczogZmFsc2UsXG4gICAgICAgICAgICBkb250UmVmcmVzaE1vZGVsVmFsdWVBZnRlclJlc29sdmVtZW50OiBmYWxzZSxcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlOiBNb25hY29BdXRvVHlwZUltcG9ydGVyLnNoYXJlZENhY2hlID8/IG5ldyBEdW1teVNvdXJjZUNhY2hlKCksXG4gICAgICAgICAgICBkZWJvdW5jZUR1cmF0aW9uOiA0MDAwLFxuICAgICAgICAgICAgZmlsZVJlY3Vyc2lvbkRlcHRoOiAxMCxcbiAgICAgICAgICAgIHBhY2thZ2VSZWN1cnNpb25EZXB0aDogMyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtb25hY286IG1vbmFjb0luc3RhbmNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5mb3JFYWNoKGQgPT4gZC5kaXNwb3NlKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHNldFZlcnNpb25zKHZlcnNpb25zOiB7IFtwYWNrYWdlTmFtZTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5pbXBvcnRSZXNvbHZlci5zZXRWZXJzaW9ucyh2ZXJzaW9ucyk7XG4gICAgICAgIHRoaXMub3B0aW9ucy52ZXJzaW9ucyA9IHZlcnNpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhckNhY2hlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuc291cmNlQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYm91bmNlZFJlc29sdmVDb250ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGludm9rZVVwZGF0ZSh7IHR5cGU6ICdDb2RlQ2hhbmdlZCcgfSwgdGhpcy5vcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlYm91bmNlRHVyYXRpb24gPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlQ29udGVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYm91bmNlVGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZGVib3VuY2VEdXJhdGlvbikgYXMgYW55O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlQ29udGVudHMoKSB7XG4gICAgICAgIHRoaXMuaXNSZXNvbHZpbmcgPSB0cnVlO1xuICAgICAgICBpbnZva2VVcGRhdGUoeyB0eXBlOiAnUmVzb2x2ZU5ld0ltcG9ydHMnIH0sIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmVkaXRvci5nZXRNb2RlbCgpO1xuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgZWRpdG9yIGlzIGRpc3Bvc2VkIGJlZm9yZSBhbGwgdHlwaW5nc1xuICAgICAgICAvLyBhcmUgaW5zdGFsbGVkLlxuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTm8gbW9kZWwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBtb2RlbC5nZXRMaW5lc0NvbnRlbnQoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRSZXNvbHZlci5yZXNvbHZlSW1wb3J0c0luRmlsZShcbiAgICAgICAgICAgICAgICBjb250ZW50LmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShtb2RlbC51cmkudG9TdHJpbmcoKSksXG4gICAgICAgICAgICAgICAgbmV3IFJlY3Vyc2lvbkRlcHRoKHRoaXMub3B0aW9ucylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMub25FcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkVycm9yKChlIGFzIEVycm9yKS5tZXNzYWdlID8/IGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltcG9ydFJlc29sdmVyLndlcmVOZXdJbXBvcnRzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZG9udFJlZnJlc2hNb2RlbFZhbHVlQWZ0ZXJSZXNvbHZlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuZWRpdG9yLmdldFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgbW9kZWwuc2V0VmFsdWUobW9kZWwuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRQb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW1wb3J0UmVzb2x2ZXIucmVzZXROZXdJbXBvcnRzUmVzb2x2ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNSZXNvbHZpbmcgPSBmYWxzZTtcbiAgICB9XG59XG4iXX0=