obsidian-dev-utils 44.2.4 → 45.0.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.
Files changed (57) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/lib/cjs/Async.cjs +53 -32
  3. package/dist/lib/cjs/Async.d.cts +92 -10
  4. package/dist/lib/cjs/Library.cjs +1 -1
  5. package/dist/lib/cjs/obsidian/AsyncWithNotice.cjs +167 -0
  6. package/dist/lib/cjs/obsidian/AsyncWithNotice.d.cts +74 -0
  7. package/dist/lib/cjs/obsidian/Backlink.cjs +2 -3
  8. package/dist/lib/cjs/obsidian/Callout.cjs +8 -2
  9. package/dist/lib/cjs/obsidian/Commands/AbstractFileCommandBase.cjs +56 -41
  10. package/dist/lib/cjs/obsidian/Commands/AbstractFileCommandBase.d.cts +45 -12
  11. package/dist/lib/cjs/obsidian/Commands/CommandBase.cjs +13 -1
  12. package/dist/lib/cjs/obsidian/Commands/CommandBase.d.cts +7 -0
  13. package/dist/lib/cjs/obsidian/Commands/EditorCommandBase.cjs +3 -9
  14. package/dist/lib/cjs/obsidian/Commands/EditorCommandBase.d.cts +7 -7
  15. package/dist/lib/cjs/obsidian/Commands/FileCommandBase.cjs +123 -26
  16. package/dist/lib/cjs/obsidian/Commands/FileCommandBase.d.cts +100 -9
  17. package/dist/lib/cjs/obsidian/Commands/FolderCommandBase.cjs +115 -26
  18. package/dist/lib/cjs/obsidian/Commands/FolderCommandBase.d.cts +94 -10
  19. package/dist/lib/cjs/obsidian/FileSystem.cjs +44 -1
  20. package/dist/lib/cjs/obsidian/FileSystem.d.cts +81 -33
  21. package/dist/lib/cjs/obsidian/MetadataCache.cjs +45 -41
  22. package/dist/lib/cjs/obsidian/Queue.cjs +34 -17
  23. package/dist/lib/cjs/obsidian/Queue.d.cts +62 -12
  24. package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +37 -27
  25. package/dist/lib/cjs/obsidian/Vault.cjs +45 -66
  26. package/dist/lib/cjs/obsidian/Vault.d.cts +0 -8
  27. package/dist/lib/cjs/obsidian/index.cjs +4 -1
  28. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  29. package/dist/lib/esm/Async.d.mts +92 -10
  30. package/dist/lib/esm/Async.mjs +53 -32
  31. package/dist/lib/esm/Library.mjs +1 -1
  32. package/dist/lib/esm/obsidian/AsyncWithNotice.d.mts +74 -0
  33. package/dist/lib/esm/obsidian/AsyncWithNotice.mjs +63 -0
  34. package/dist/lib/esm/obsidian/Backlink.mjs +4 -4
  35. package/dist/lib/esm/obsidian/Callout.mjs +8 -2
  36. package/dist/lib/esm/obsidian/Commands/AbstractFileCommandBase.d.mts +45 -12
  37. package/dist/lib/esm/obsidian/Commands/AbstractFileCommandBase.mjs +54 -40
  38. package/dist/lib/esm/obsidian/Commands/CommandBase.d.mts +7 -0
  39. package/dist/lib/esm/obsidian/Commands/CommandBase.mjs +13 -1
  40. package/dist/lib/esm/obsidian/Commands/EditorCommandBase.d.mts +7 -7
  41. package/dist/lib/esm/obsidian/Commands/EditorCommandBase.mjs +3 -9
  42. package/dist/lib/esm/obsidian/Commands/FileCommandBase.d.mts +100 -9
  43. package/dist/lib/esm/obsidian/Commands/FileCommandBase.mjs +127 -26
  44. package/dist/lib/esm/obsidian/Commands/FolderCommandBase.d.mts +94 -10
  45. package/dist/lib/esm/obsidian/Commands/FolderCommandBase.mjs +119 -26
  46. package/dist/lib/esm/obsidian/FileSystem.d.mts +81 -33
  47. package/dist/lib/esm/obsidian/FileSystem.mjs +38 -1
  48. package/dist/lib/esm/obsidian/MetadataCache.mjs +46 -41
  49. package/dist/lib/esm/obsidian/Queue.d.mts +62 -12
  50. package/dist/lib/esm/obsidian/Queue.mjs +35 -19
  51. package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +37 -27
  52. package/dist/lib/esm/obsidian/Vault.d.mts +0 -8
  53. package/dist/lib/esm/obsidian/Vault.mjs +46 -70
  54. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  55. package/dist/lib/esm/obsidian/index.mjs +3 -1
  56. package/obsidian/AsyncWithNotice/package.json +6 -0
  57. package/package.json +7 -7
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import type { Plugin, TAbstractFile, WorkspaceLeaf } from 'obsidian';
7
7
  import { TFile } from 'obsidian';
8
- import { AbstractFileCommandBase, AbstractFileCommandInvocationBase } from './AbstractFileCommandBase.mjs';
8
+ import { AbstractFileCommandBase, AbstractFileCommandInvocationBase, AbstractFilesCommandInvocationBase } from './AbstractFileCommandBase.mjs';
9
9
  /**
10
10
  * Base class for file commands.
11
11
  *
@@ -13,20 +13,58 @@ import { AbstractFileCommandBase, AbstractFileCommandInvocationBase } from './Ab
13
13
  */
14
14
  export declare abstract class FileCommandBase<TPlugin extends Plugin = Plugin> extends AbstractFileCommandBase<TPlugin> {
15
15
  /**
16
- * Creates a new file command invocation.
16
+ * Creates a new abstract file command invocation.
17
+ *
18
+ * @param abstractFile - The abstract file to invoke the command for.
19
+ * @returns The command invocation.
20
+ */
21
+ protected createCommandInvocation(abstractFile?: TAbstractFile): AbstractFileCommandInvocationBase<TPlugin>;
22
+ /**
23
+ * Creates a new abstract file command invocation for an abstract file.
17
24
  *
25
+ * @param abstractFile - The abstract file to invoke the command for. If `null`, the active file is used.
18
26
  * @returns The command invocation.
19
27
  */
20
- protected abstract createCommandInvocation(): FileCommandInvocationBase<TPlugin>;
28
+ protected createCommandInvocationForAbstractFile(abstractFile: null | TAbstractFile): AbstractFileCommandInvocationBase<TPlugin>;
29
+ /**
30
+ * Creates a new abstract files command invocation for abstract files.
31
+ *
32
+ * @param abstractFiles - The abstract files to invoke the command for.
33
+ * @returns A new abstract files command invocation.
34
+ */
35
+ protected createCommandInvocationForAbstractFiles(abstractFiles: TAbstractFile[]): AbstractFilesCommandInvocationBase<TPlugin>;
36
+ /**
37
+ * Creates a new file command invocation for a file.
38
+ *
39
+ * @param file - The file to invoke the command for.
40
+ * @returns A new file command invocation.
41
+ */
42
+ protected abstract createCommandInvocationForFile(file: null | TFile): FileCommandInvocationBase<TPlugin>;
43
+ /**
44
+ * Creates a new files command invocation for files.
45
+ *
46
+ * @param files - The files to invoke the command for.
47
+ * @returns A new files command invocation.
48
+ */
49
+ protected createCommandInvocationForFiles(files: TFile[]): FilesCommandInvocationBase<TPlugin>;
21
50
  /**
22
51
  * Checks if the command should be added to the abstract file menu.
23
52
  *
24
53
  * @param abstractFile - The abstract file to check.
25
- * @param _source - The source of the abstract file.
26
- * @param _leaf - The leaf to check.
54
+ * @param source - The source of the abstract file.
55
+ * @param leaf - The leaf to check.
27
56
  * @returns Whether the command should be added to the abstract file menu.
28
57
  */
29
- protected shouldAddToAbstractFileMenu(abstractFile: TAbstractFile, _source: string, _leaf?: WorkspaceLeaf): boolean;
58
+ protected shouldAddToAbstractFileMenu(abstractFile: TAbstractFile, source: string, leaf?: WorkspaceLeaf): boolean;
59
+ /**
60
+ * Checks if the command should be added to the abstract files menu.
61
+ *
62
+ * @param abstractFiles - The abstract files to check.
63
+ * @param source - The source of the abstract files.
64
+ * @param leaf - The leaf to check.
65
+ * @returns Whether the command should be added to the abstract files menu.
66
+ */
67
+ protected shouldAddToAbstractFilesMenu(abstractFiles: TAbstractFile[], source: string, leaf?: WorkspaceLeaf): boolean;
30
68
  /**
31
69
  * Checks if the command should be added to the file menu.
32
70
  *
@@ -36,6 +74,15 @@ export declare abstract class FileCommandBase<TPlugin extends Plugin = Plugin> e
36
74
  * @returns Whether the command should be added to the file menu.
37
75
  */
38
76
  protected shouldAddToFileMenu(_file: TFile, _source: string, _leaf?: WorkspaceLeaf): boolean;
77
+ /**
78
+ * Checks if the command should be added to the files menu.
79
+ *
80
+ * @param _files - The files to check.
81
+ * @param _source - The source of the files.
82
+ * @param _leaf - The leaf to check.
83
+ * @returns Whether the command should be added to the files menu.
84
+ */
85
+ protected shouldAddToFilesMenu(_files: TFile[], _source: string, _leaf?: WorkspaceLeaf): boolean;
39
86
  }
40
87
  /**
41
88
  * Base class for file command invocations.
@@ -51,15 +98,59 @@ export declare abstract class FileCommandInvocationBase<TPlugin extends Plugin>
51
98
  */
52
99
  protected get file(): TFile;
53
100
  /**
54
- * Sets the file that the command invocation belongs to.
101
+ * Creates a new file command invocation.
102
+ *
103
+ * @param plugin - The plugin that the command invocation belongs to.
104
+ * @param file - The file to invoke the command for.
105
+ */
106
+ constructor(plugin: TPlugin, file: null | TFile);
107
+ /**
108
+ * Checks if the command can execute.
109
+ *
110
+ * @returns Whether the command can execute.
111
+ */
112
+ protected canExecute(): boolean;
113
+ }
114
+ /**
115
+ * Base class for files command invocations.
116
+ *
117
+ * @typeParam TPlugin - The type of the plugin that the command belongs to.
118
+ */
119
+ export declare abstract class FilesCommandInvocationBase<TPlugin extends Plugin> extends AbstractFilesCommandInvocationBase<TPlugin> {
120
+ readonly files: TFile[];
121
+ /**
122
+ * Creates a new files command invocation.
123
+ *
124
+ * @param plugin - The plugin that the command invocation belongs to.
125
+ * @param files - The files to invoke the command for.
126
+ */
127
+ constructor(plugin: TPlugin, files: TFile[]);
128
+ }
129
+ /**
130
+ * Base class for sequential files command invocations.
131
+ *
132
+ * @typeParam TPlugin - The type of the plugin that the command belongs to.
133
+ */
134
+ export declare class SequentialFilesCommandInvocationBase<TPlugin extends Plugin> extends FilesCommandInvocationBase<TPlugin> {
135
+ private readonly createCommandInvocationForFile;
136
+ /**
137
+ * Creates a new sequential files command invocation.
55
138
  *
56
- * @param file - The file that the command invocation belongs to.
139
+ * @param plugin - The plugin that the command invocation belongs to.
140
+ * @param files - The files to invoke the command for.
141
+ * @param createCommandInvocationForFile - The function to create a command invocation for a file.
57
142
  */
58
- protected set file(file: TFile);
143
+ constructor(plugin: TPlugin, files: TFile[], createCommandInvocationForFile: (file: TFile) => FileCommandInvocationBase<TPlugin>);
59
144
  /**
60
145
  * Checks if the command can execute.
61
146
  *
62
147
  * @returns Whether the command can execute.
63
148
  */
64
149
  protected canExecute(): boolean;
150
+ /**
151
+ * Executes the command.
152
+ *
153
+ * @returns A promise that resolves when the command has been executed.
154
+ */
155
+ protected execute(): Promise<void>;
65
156
  }
@@ -20,24 +20,81 @@ if you want to view the source, please visit the github repository of this plugi
20
20
  })();
21
21
 
22
22
  import { TFile } from "obsidian";
23
+ import {
24
+ asArrayOfFiles,
25
+ asFile,
26
+ asFileOrNull,
27
+ isFile
28
+ } from "../FileSystem.mjs";
23
29
  import {
24
30
  AbstractFileCommandBase,
25
- AbstractFileCommandInvocationBase
31
+ AbstractFileCommandInvocationBase,
32
+ AbstractFilesCommandInvocationBase
26
33
  } from "./AbstractFileCommandBase.mjs";
27
34
  class FileCommandBase extends AbstractFileCommandBase {
35
+ /**
36
+ * Creates a new abstract file command invocation.
37
+ *
38
+ * @param abstractFile - The abstract file to invoke the command for.
39
+ * @returns The command invocation.
40
+ */
41
+ createCommandInvocation(abstractFile) {
42
+ return this.createCommandInvocationForAbstractFile(abstractFile ?? this.app.workspace.getActiveFile());
43
+ }
44
+ /**
45
+ * Creates a new abstract file command invocation for an abstract file.
46
+ *
47
+ * @param abstractFile - The abstract file to invoke the command for. If `null`, the active file is used.
48
+ * @returns The command invocation.
49
+ */
50
+ createCommandInvocationForAbstractFile(abstractFile) {
51
+ return this.createCommandInvocationForFile(asFileOrNull(abstractFile));
52
+ }
53
+ /**
54
+ * Creates a new abstract files command invocation for abstract files.
55
+ *
56
+ * @param abstractFiles - The abstract files to invoke the command for.
57
+ * @returns A new abstract files command invocation.
58
+ */
59
+ createCommandInvocationForAbstractFiles(abstractFiles) {
60
+ return this.createCommandInvocationForFiles(asArrayOfFiles(abstractFiles));
61
+ }
62
+ /**
63
+ * Creates a new files command invocation for files.
64
+ *
65
+ * @param files - The files to invoke the command for.
66
+ * @returns A new files command invocation.
67
+ */
68
+ createCommandInvocationForFiles(files) {
69
+ return new SequentialFilesCommandInvocationBase(this.plugin, files, this.createCommandInvocationForFile.bind(this));
70
+ }
28
71
  /**
29
72
  * Checks if the command should be added to the abstract file menu.
30
73
  *
31
74
  * @param abstractFile - The abstract file to check.
32
- * @param _source - The source of the abstract file.
33
- * @param _leaf - The leaf to check.
75
+ * @param source - The source of the abstract file.
76
+ * @param leaf - The leaf to check.
34
77
  * @returns Whether the command should be added to the abstract file menu.
35
78
  */
36
- shouldAddToAbstractFileMenu(abstractFile, _source, _leaf) {
37
- if (!(abstractFile instanceof TFile)) {
79
+ shouldAddToAbstractFileMenu(abstractFile, source, leaf) {
80
+ if (!isFile(abstractFile)) {
38
81
  return false;
39
82
  }
40
- return this.shouldAddToFileMenu(abstractFile, _source, _leaf);
83
+ return this.shouldAddToFileMenu(abstractFile, source, leaf);
84
+ }
85
+ /**
86
+ * Checks if the command should be added to the abstract files menu.
87
+ *
88
+ * @param abstractFiles - The abstract files to check.
89
+ * @param source - The source of the abstract files.
90
+ * @param leaf - The leaf to check.
91
+ * @returns Whether the command should be added to the abstract files menu.
92
+ */
93
+ shouldAddToAbstractFilesMenu(abstractFiles, source, leaf) {
94
+ if (!abstractFiles.every((abstractFile) => isFile(abstractFile))) {
95
+ return false;
96
+ }
97
+ return this.shouldAddToFilesMenu(asArrayOfFiles(abstractFiles), source, leaf);
41
98
  }
42
99
  /**
43
100
  * Checks if the command should be added to the file menu.
@@ -50,6 +107,17 @@ class FileCommandBase extends AbstractFileCommandBase {
50
107
  shouldAddToFileMenu(_file, _source, _leaf) {
51
108
  return false;
52
109
  }
110
+ /**
111
+ * Checks if the command should be added to the files menu.
112
+ *
113
+ * @param _files - The files to check.
114
+ * @param _source - The source of the files.
115
+ * @param _leaf - The leaf to check.
116
+ * @returns Whether the command should be added to the files menu.
117
+ */
118
+ shouldAddToFilesMenu(_files, _source, _leaf) {
119
+ return false;
120
+ }
53
121
  }
54
122
  class FileCommandInvocationBase extends AbstractFileCommandInvocationBase {
55
123
  /**
@@ -59,18 +127,16 @@ class FileCommandInvocationBase extends AbstractFileCommandInvocationBase {
59
127
  * @throws If the abstract file is not a file.
60
128
  */
61
129
  get file() {
62
- if (!(this.abstractFile instanceof TFile)) {
63
- throw new Error("Abstract file is not a file");
64
- }
65
- return this.abstractFile;
130
+ return asFile(this._abstractFile);
66
131
  }
67
132
  /**
68
- * Sets the file that the command invocation belongs to.
133
+ * Creates a new file command invocation.
69
134
  *
70
- * @param file - The file that the command invocation belongs to.
135
+ * @param plugin - The plugin that the command invocation belongs to.
136
+ * @param file - The file to invoke the command for.
71
137
  */
72
- set file(file) {
73
- this.abstractFile = file;
138
+ constructor(plugin, file) {
139
+ super(plugin, file);
74
140
  }
75
141
  /**
76
142
  * Checks if the command can execute.
@@ -78,21 +144,56 @@ class FileCommandInvocationBase extends AbstractFileCommandInvocationBase {
78
144
  * @returns Whether the command can execute.
79
145
  */
80
146
  canExecute() {
81
- if (!super.canExecute()) {
82
- return false;
83
- }
84
- if (!(this.abstractFile instanceof TFile)) {
85
- const file = this.app.workspace.getActiveFile();
86
- if (!file) {
87
- return false;
88
- }
89
- this.file = file;
147
+ return super.canExecute() && !!this._abstractFile;
148
+ }
149
+ }
150
+ class FilesCommandInvocationBase extends AbstractFilesCommandInvocationBase {
151
+ /**
152
+ * Creates a new files command invocation.
153
+ *
154
+ * @param plugin - The plugin that the command invocation belongs to.
155
+ * @param files - The files to invoke the command for.
156
+ */
157
+ constructor(plugin, files) {
158
+ super(plugin, files);
159
+ this.files = files;
160
+ }
161
+ }
162
+ class SequentialFilesCommandInvocationBase extends FilesCommandInvocationBase {
163
+ /**
164
+ * Creates a new sequential files command invocation.
165
+ *
166
+ * @param plugin - The plugin that the command invocation belongs to.
167
+ * @param files - The files to invoke the command for.
168
+ * @param createCommandInvocationForFile - The function to create a command invocation for a file.
169
+ */
170
+ constructor(plugin, files, createCommandInvocationForFile) {
171
+ super(plugin, files);
172
+ this.createCommandInvocationForFile = createCommandInvocationForFile;
173
+ }
174
+ /**
175
+ * Checks if the command can execute.
176
+ *
177
+ * @returns Whether the command can execute.
178
+ */
179
+ canExecute() {
180
+ return super.canExecute() && this.files.every((file) => this.createCommandInvocationForFile(file).invoke(true));
181
+ }
182
+ /**
183
+ * Executes the command.
184
+ *
185
+ * @returns A promise that resolves when the command has been executed.
186
+ */
187
+ async execute() {
188
+ for (const file of this.files) {
189
+ await this.createCommandInvocationForFile(file).invokeAsync(false);
90
190
  }
91
- return true;
92
191
  }
93
192
  }
94
193
  export {
95
194
  FileCommandBase,
96
- FileCommandInvocationBase
195
+ FileCommandInvocationBase,
196
+ FilesCommandInvocationBase,
197
+ SequentialFilesCommandInvocationBase
97
198
  };
98
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0NvbW1hbmRzL0ZpbGVDb21tYW5kQmFzZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBCYXNlIGNsYXNzZXMgZm9yIGZpbGUgY29tbWFuZHMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBQbHVnaW4sXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFdvcmtzcGFjZUxlYWZcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RGaWxlQ29tbWFuZEJhc2UsXG4gIEFic3RyYWN0RmlsZUNvbW1hbmRJbnZvY2F0aW9uQmFzZVxufSBmcm9tICcuL0Fic3RyYWN0RmlsZUNvbW1hbmRCYXNlLnRzJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBmaWxlIGNvbW1hbmRzLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBiZWxvbmdzIHRvLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmlsZUNvbW1hbmRCYXNlPFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gPSBQbHVnaW4+IGV4dGVuZHMgQWJzdHJhY3RGaWxlQ29tbWFuZEJhc2U8VFBsdWdpbj4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvdmVycmlkZSBjcmVhdGVDb21tYW5kSW52b2NhdGlvbigpOiBGaWxlQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4+O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBhYnN0cmFjdCBmaWxlIG1lbnUuXG4gICAqXG4gICAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBjaGVjay5cbiAgICogQHBhcmFtIF9zb3VyY2UgLSBUaGUgc291cmNlIG9mIHRoZSBhYnN0cmFjdCBmaWxlLlxuICAgKiBAcGFyYW0gX2xlYWYgLSBUaGUgbGVhZiB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGFic3RyYWN0IGZpbGUgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRBZGRUb0Fic3RyYWN0RmlsZU1lbnUoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlLCBfc291cmNlOiBzdHJpbmcsIF9sZWFmPzogV29ya3NwYWNlTGVhZik6IGJvb2xlYW4ge1xuICAgIGlmICghKGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG91bGRBZGRUb0ZpbGVNZW51KGFic3RyYWN0RmlsZSwgX3NvdXJjZSwgX2xlYWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGZpbGUgbWVudS5cbiAgICpcbiAgICogQHBhcmFtIF9maWxlIC0gVGhlIGZpbGUgdG8gY2hlY2suXG4gICAqIEBwYXJhbSBfc291cmNlIC0gVGhlIHNvdXJjZSBvZiB0aGUgZmlsZS5cbiAgICogQHBhcmFtIF9sZWFmIC0gVGhlIGxlYWYgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBmaWxlIG1lbnUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2hvdWxkQWRkVG9GaWxlTWVudShfZmlsZTogVEZpbGUsIF9zb3VyY2U6IHN0cmluZywgX2xlYWY/OiBXb3Jrc3BhY2VMZWFmKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZmlsZSBjb21tYW5kIGludm9jYXRpb25zLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBiZWxvbmdzIHRvLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmlsZUNvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luPiBleHRlbmRzIEFic3RyYWN0RmlsZUNvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luPiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaWxlIHRoYXQgdGhlIGNvbW1hbmQgaW52b2NhdGlvbiBiZWxvbmdzIHRvLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSB0aGF0IHRoZSBjb21tYW5kIGludm9jYXRpb24gYmVsb25ncyB0by5cbiAgICogQHRocm93cyBJZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBmaWxlKCk6IFRGaWxlIHtcbiAgICBpZiAoISh0aGlzLmFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWJzdHJhY3RGaWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGZpbGUoZmlsZTogVEZpbGUpIHtcbiAgICB0aGlzLmFic3RyYWN0RmlsZSA9IGZpbGU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNhbkV4ZWN1dGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5jYW5FeGVjdXRlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzLmFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyxhQUFhO0FBRXRCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBT0EsTUFBZSx3QkFBeUQsd0JBQWlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZ0IzRiw0QkFBNEIsY0FBNkIsU0FBaUIsT0FBZ0M7QUFDM0gsUUFBSSxFQUFFLHdCQUF3QixRQUFRO0FBQ3BDLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTyxLQUFLLG9CQUFvQixjQUFjLFNBQVMsS0FBSztBQUFBLEVBQzlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVVUsb0JBQW9CLE9BQWMsU0FBaUIsT0FBZ0M7QUFDM0YsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQU9PLE1BQWUsa0NBQTBELGtDQUEyQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT3pILElBQWMsT0FBYztBQUMxQixRQUFJLEVBQUUsS0FBSyx3QkFBd0IsUUFBUTtBQUN6QyxZQUFNLElBQUksTUFBTSw2QkFBNkI7QUFBQSxJQUMvQztBQUNBLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxJQUFjLEtBQUssTUFBYTtBQUM5QixTQUFLLGVBQWU7QUFBQSxFQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9tQixhQUFzQjtBQUN2QyxRQUFJLENBQUMsTUFBTSxXQUFXLEdBQUc7QUFDdkIsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLEVBQUUsS0FBSyx3QkFBd0IsUUFBUTtBQUN6QyxZQUFNLE9BQU8sS0FBSyxJQUFJLFVBQVUsY0FBYztBQUM5QyxVQUFJLENBQUMsTUFBTTtBQUNULGVBQU87QUFBQSxNQUNUO0FBQ0EsV0FBSyxPQUFPO0FBQUEsSUFDZDtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
199
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0NvbW1hbmRzL0ZpbGVDb21tYW5kQmFzZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBCYXNlIGNsYXNzZXMgZm9yIGZpbGUgY29tbWFuZHMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBQbHVnaW4sXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFdvcmtzcGFjZUxlYWZcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgYXNBcnJheU9mRmlsZXMsXG4gIGFzRmlsZSxcbiAgYXNGaWxlT3JOdWxsLFxuICBpc0ZpbGVcbn0gZnJvbSAnLi4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBBYnN0cmFjdEZpbGVDb21tYW5kQmFzZSxcbiAgQWJzdHJhY3RGaWxlQ29tbWFuZEludm9jYXRpb25CYXNlLFxuICBBYnN0cmFjdEZpbGVzQ29tbWFuZEludm9jYXRpb25CYXNlXG59IGZyb20gJy4vQWJzdHJhY3RGaWxlQ29tbWFuZEJhc2UudHMnO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGZpbGUgY29tbWFuZHMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IHRoZSBjb21tYW5kIGJlbG9uZ3MgdG8uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaWxlQ29tbWFuZEJhc2U8VFBsdWdpbiBleHRlbmRzIFBsdWdpbiA9IFBsdWdpbj4gZXh0ZW5kcyBBYnN0cmFjdEZpbGVDb21tYW5kQmFzZTxUUGx1Z2luPiB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGFic3RyYWN0IGZpbGUgY29tbWFuZCBpbnZvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYWJzdHJhY3RGaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgdG8gaW52b2tlIHRoZSBjb21tYW5kIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVDb21tYW5kSW52b2NhdGlvbihhYnN0cmFjdEZpbGU/OiBUQWJzdHJhY3RGaWxlKTogQWJzdHJhY3RGaWxlQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDb21tYW5kSW52b2NhdGlvbkZvckFic3RyYWN0RmlsZShhYnN0cmFjdEZpbGUgPz8gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBhYnN0cmFjdCBmaWxlIGNvbW1hbmQgaW52b2NhdGlvbiBmb3IgYW4gYWJzdHJhY3QgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGludm9rZSB0aGUgY29tbWFuZCBmb3IuIElmIGBudWxsYCwgdGhlIGFjdGl2ZSBmaWxlIGlzIHVzZWQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21tYW5kIGludm9jYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JBYnN0cmFjdEZpbGUoYWJzdHJhY3RGaWxlOiBudWxsIHwgVEFic3RyYWN0RmlsZSk6IEFic3RyYWN0RmlsZUNvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlKGFzRmlsZU9yTnVsbChhYnN0cmFjdEZpbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGFic3RyYWN0IGZpbGVzIGNvbW1hbmQgaW52b2NhdGlvbiBmb3IgYWJzdHJhY3QgZmlsZXMuXG4gICAqXG4gICAqIEBwYXJhbSBhYnN0cmFjdEZpbGVzIC0gVGhlIGFic3RyYWN0IGZpbGVzIHRvIGludm9rZSB0aGUgY29tbWFuZCBmb3IuXG4gICAqIEByZXR1cm5zIEEgbmV3IGFic3RyYWN0IGZpbGVzIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVDb21tYW5kSW52b2NhdGlvbkZvckFic3RyYWN0RmlsZXMoYWJzdHJhY3RGaWxlczogVEFic3RyYWN0RmlsZVtdKTogQWJzdHJhY3RGaWxlc0NvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlcyhhc0FycmF5T2ZGaWxlcyhhYnN0cmFjdEZpbGVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIGNvbW1hbmQgaW52b2NhdGlvbiBmb3IgYSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIGludm9rZSB0aGUgY29tbWFuZCBmb3IuXG4gICAqIEByZXR1cm5zIEEgbmV3IGZpbGUgY29tbWFuZCBpbnZvY2F0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUNvbW1hbmRJbnZvY2F0aW9uRm9yRmlsZShmaWxlOiBudWxsIHwgVEZpbGUpOiBGaWxlQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGZpbGVzIGNvbW1hbmQgaW52b2NhdGlvbiBmb3IgZmlsZXMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byBpbnZva2UgdGhlIGNvbW1hbmQgZm9yLlxuICAgKiBAcmV0dXJucyBBIG5ldyBmaWxlcyBjb21tYW5kIGludm9jYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlcyhmaWxlczogVEZpbGVbXSk6IEZpbGVzQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4+IHtcbiAgICByZXR1cm4gbmV3IFNlcXVlbnRpYWxGaWxlc0NvbW1hbmRJbnZvY2F0aW9uQmFzZSh0aGlzLnBsdWdpbiwgZmlsZXMsIHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGFic3RyYWN0IGZpbGUgbWVudS5cbiAgICpcbiAgICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHNvdXJjZSBvZiB0aGUgYWJzdHJhY3QgZmlsZS5cbiAgICogQHBhcmFtIGxlYWYgLSBUaGUgbGVhZiB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGFic3RyYWN0IGZpbGUgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRBZGRUb0Fic3RyYWN0RmlsZU1lbnUoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlLCBzb3VyY2U6IHN0cmluZywgbGVhZj86IFdvcmtzcGFjZUxlYWYpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzRmlsZShhYnN0cmFjdEZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3VsZEFkZFRvRmlsZU1lbnUoYWJzdHJhY3RGaWxlLCBzb3VyY2UsIGxlYWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGFic3RyYWN0IGZpbGVzIG1lbnUuXG4gICAqXG4gICAqIEBwYXJhbSBhYnN0cmFjdEZpbGVzIC0gVGhlIGFic3RyYWN0IGZpbGVzIHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHNvdXJjZSBvZiB0aGUgYWJzdHJhY3QgZmlsZXMuXG4gICAqIEBwYXJhbSBsZWFmIC0gVGhlIGxlYWYgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBhYnN0cmFjdCBmaWxlcyBtZW51LlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZEFkZFRvQWJzdHJhY3RGaWxlc01lbnUoYWJzdHJhY3RGaWxlczogVEFic3RyYWN0RmlsZVtdLCBzb3VyY2U6IHN0cmluZywgbGVhZj86IFdvcmtzcGFjZUxlYWYpOiBib29sZWFuIHtcbiAgICBpZiAoIWFic3RyYWN0RmlsZXMuZXZlcnkoKGFic3RyYWN0RmlsZSkgPT4gaXNGaWxlKGFic3RyYWN0RmlsZSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3VsZEFkZFRvRmlsZXNNZW51KGFzQXJyYXlPZkZpbGVzKGFic3RyYWN0RmlsZXMpLCBzb3VyY2UsIGxlYWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGZpbGUgbWVudS5cbiAgICpcbiAgICogQHBhcmFtIF9maWxlIC0gVGhlIGZpbGUgdG8gY2hlY2suXG4gICAqIEBwYXJhbSBfc291cmNlIC0gVGhlIHNvdXJjZSBvZiB0aGUgZmlsZS5cbiAgICogQHBhcmFtIF9sZWFmIC0gVGhlIGxlYWYgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBmaWxlIG1lbnUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2hvdWxkQWRkVG9GaWxlTWVudShfZmlsZTogVEZpbGUsIF9zb3VyY2U6IHN0cmluZywgX2xlYWY/OiBXb3Jrc3BhY2VMZWFmKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGZpbGVzIG1lbnUuXG4gICAqXG4gICAqIEBwYXJhbSBfZmlsZXMgLSBUaGUgZmlsZXMgdG8gY2hlY2suXG4gICAqIEBwYXJhbSBfc291cmNlIC0gVGhlIHNvdXJjZSBvZiB0aGUgZmlsZXMuXG4gICAqIEBwYXJhbSBfbGVhZiAtIFRoZSBsZWFmIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjb21tYW5kIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZmlsZXMgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBzaG91bGRBZGRUb0ZpbGVzTWVudShfZmlsZXM6IFRGaWxlW10sIF9zb3VyY2U6IHN0cmluZywgX2xlYWY/OiBXb3Jrc3BhY2VMZWFmKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZmlsZSBjb21tYW5kIGludm9jYXRpb25zLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBiZWxvbmdzIHRvLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmlsZUNvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luPiBleHRlbmRzIEFic3RyYWN0RmlsZUNvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luPiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaWxlIHRoYXQgdGhlIGNvbW1hbmQgaW52b2NhdGlvbiBiZWxvbmdzIHRvLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSB0aGF0IHRoZSBjb21tYW5kIGludm9jYXRpb24gYmVsb25ncyB0by5cbiAgICogQHRocm93cyBJZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBmaWxlKCk6IFRGaWxlIHtcbiAgICByZXR1cm4gYXNGaWxlKHRoaXMuX2Fic3RyYWN0RmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gaW52b2tlIHRoZSBjb21tYW5kIGZvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW46IFRQbHVnaW4sIGZpbGU6IG51bGwgfCBURmlsZSkge1xuICAgIHN1cGVyKHBsdWdpbiwgZmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNhbkV4ZWN1dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKSAmJiAhIXRoaXMuX2Fic3RyYWN0RmlsZTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGZpbGVzIGNvbW1hbmQgaW52b2NhdGlvbnMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IHRoZSBjb21tYW5kIGJlbG9uZ3MgdG8uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaWxlc0NvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luPiBleHRlbmRzIEFic3RyYWN0RmlsZXNDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxlcyBjb21tYW5kIGludm9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRoYXQgdGhlIGNvbW1hbmQgaW52b2NhdGlvbiBiZWxvbmdzIHRvLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gaW52b2tlIHRoZSBjb21tYW5kIGZvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW46IFRQbHVnaW4sIHB1YmxpYyByZWFkb25seSBmaWxlczogVEZpbGVbXSkge1xuICAgIHN1cGVyKHBsdWdpbiwgZmlsZXMpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igc2VxdWVudGlhbCBmaWxlcyBjb21tYW5kIGludm9jYXRpb25zLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBiZWxvbmdzIHRvLlxuICovXG5leHBvcnQgY2xhc3MgU2VxdWVudGlhbEZpbGVzQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4+IGV4dGVuZHMgRmlsZXNDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzZXF1ZW50aWFsIGZpbGVzIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byBpbnZva2UgdGhlIGNvbW1hbmQgZm9yLlxuICAgKiBAcGFyYW0gY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlIC0gVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGNvbW1hbmQgaW52b2NhdGlvbiBmb3IgYSBmaWxlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbjogVFBsdWdpbiwgZmlsZXM6IFRGaWxlW10sIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlOiAoZmlsZTogVEZpbGUpID0+IEZpbGVDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4pIHtcbiAgICBzdXBlcihwbHVnaW4sIGZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbW1hbmQgY2FuIGV4ZWN1dGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgY2FuIGV4ZWN1dGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY2FuRXhlY3V0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpICYmIHRoaXMuZmlsZXMuZXZlcnkoKGZpbGUpID0+IHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlKGZpbGUpLmludm9rZSh0cnVlKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGJlZW4gZXhlY3V0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5maWxlcykge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb21tYW5kSW52b2NhdGlvbkZvckZpbGUoZmlsZSkuaW52b2tlQXN5bmMoZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyxhQUFhO0FBRXRCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFPQSxNQUFlLHdCQUF5RCx3QkFBaUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU8zRix3QkFBd0Is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
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import type { Plugin, TAbstractFile, WorkspaceLeaf } from 'obsidian';
7
7
  import { TFolder } from 'obsidian';
8
- import { AbstractFileCommandBase, AbstractFileCommandInvocationBase } from './AbstractFileCommandBase.mjs';
8
+ import { AbstractFileCommandBase, AbstractFileCommandInvocationBase, AbstractFilesCommandInvocationBase } from './AbstractFileCommandBase.mjs';
9
9
  /**
10
10
  * Base class for folder commands.
11
11
  *
@@ -13,20 +13,58 @@ import { AbstractFileCommandBase, AbstractFileCommandInvocationBase } from './Ab
13
13
  */
14
14
  export declare abstract class FolderCommandBase<TPlugin extends Plugin = Plugin> extends AbstractFileCommandBase<TPlugin> {
15
15
  /**
16
- * Creates a new file command invocation.
16
+ * Creates a new abstract file command invocation.
17
17
  *
18
- * @returns The command invocation.
18
+ * @param abstractFile - The abstract file to invoke the command for.
19
+ * @returns A new abstract file command invocation.
19
20
  */
20
- protected abstract createCommandInvocation(): FolderCommandInvocationBase<TPlugin>;
21
+ protected createCommandInvocation(abstractFile?: TAbstractFile): AbstractFileCommandInvocationBase<TPlugin>;
22
+ /**
23
+ * Creates a new abstract file command invocation for an abstract file.
24
+ *
25
+ * @param abstractFile - The abstract file to invoke the command for.
26
+ * @returns A new abstract file command invocation.
27
+ */
28
+ protected createCommandInvocationForAbstractFile(abstractFile: null | TAbstractFile): AbstractFileCommandInvocationBase<TPlugin>;
29
+ /**
30
+ * Creates a new abstract files command invocation for abstract files.
31
+ *
32
+ * @param abstractFiles - The abstract files to invoke the command for.
33
+ * @returns A new abstract files command invocation.
34
+ */
35
+ protected createCommandInvocationForAbstractFiles(abstractFiles: TAbstractFile[]): AbstractFilesCommandInvocationBase<TPlugin>;
36
+ /**
37
+ * Creates a new abstract file command invocation for a folder.
38
+ *
39
+ * @param folder - The folder to invoke the command for.
40
+ * @returns A new folder command invocation.
41
+ */
42
+ protected abstract createCommandInvocationForFolder(folder: null | TFolder): FolderCommandInvocationBase<TPlugin>;
43
+ /**
44
+ * Creates a new folders command invocation for folders.
45
+ *
46
+ * @param folders - The folders to invoke the command for.
47
+ * @returns A new folders command invocation.
48
+ */
49
+ protected createCommandInvocationForFolders(folders: TFolder[]): FoldersCommandInvocationBase<TPlugin>;
21
50
  /**
22
51
  * Checks if the command should be added to the abstract file menu.
23
52
  *
24
53
  * @param abstractFile - The abstract file to check.
25
- * @param _source - The source of the abstract file.
26
- * @param _leaf - The leaf to check.
54
+ * @param source - The source of the abstract file.
55
+ * @param leaf - The leaf to check.
27
56
  * @returns Whether the command should be added to the abstract file menu.
28
57
  */
29
- protected shouldAddToAbstractFileMenu(abstractFile: TAbstractFile, _source: string, _leaf?: WorkspaceLeaf): boolean;
58
+ protected shouldAddToAbstractFileMenu(abstractFile: TAbstractFile, source: string, leaf?: WorkspaceLeaf): boolean;
59
+ /**
60
+ * Checks if the command should be added to the abstract files menu.
61
+ *
62
+ * @param abstractFiles - The abstract files to check.
63
+ * @param source - The source of the abstract files.
64
+ * @param leaf - The leaf to check.
65
+ * @returns Whether the command should be added to the abstract files menu.
66
+ */
67
+ protected shouldAddToAbstractFilesMenu(abstractFiles: TAbstractFile[], source: string, leaf?: WorkspaceLeaf): boolean;
30
68
  /**
31
69
  * Checks if the command should be added to the folder menu.
32
70
  *
@@ -36,6 +74,15 @@ export declare abstract class FolderCommandBase<TPlugin extends Plugin = Plugin>
36
74
  * @returns Whether the command should be added to the folder menu.
37
75
  */
38
76
  protected shouldAddToFolderMenu(_folder: TFolder, _source: string, _leaf?: WorkspaceLeaf): boolean;
77
+ /**
78
+ * Checks if the command should be added to the folders menu.
79
+ *
80
+ * @param _folders - The folders to check.
81
+ * @param _source - The source of the folders.
82
+ * @param _leaf - The leaf to check.
83
+ * @returns Whether the command should be added to the folders menu.
84
+ */
85
+ protected shouldAddToFoldersMenu(_folders: TFolder[], _source: string, _leaf?: WorkspaceLeaf): boolean;
39
86
  }
40
87
  /**
41
88
  * Base class for folder command invocations.
@@ -51,15 +98,52 @@ export declare abstract class FolderCommandInvocationBase<TPlugin extends Plugin
51
98
  */
52
99
  protected get folder(): TFolder;
53
100
  /**
54
- * Sets the folder that the command invocation belongs to.
101
+ * Checks if the command can execute.
102
+ *
103
+ * @returns Whether the command can execute.
104
+ */
105
+ protected canExecute(): boolean;
106
+ }
107
+ /**
108
+ * Base class for folders command invocations.
109
+ *
110
+ * @typeParam TPlugin - The type of the plugin that the command belongs to.
111
+ */
112
+ export declare abstract class FoldersCommandInvocationBase<TPlugin extends Plugin> extends AbstractFilesCommandInvocationBase<TPlugin> {
113
+ readonly folders: TFolder[];
114
+ /**
115
+ * Creates a new folders command invocation.
55
116
  *
56
- * @param folder - The folder that the command invocation belongs to.
117
+ * @param plugin - The plugin that the command invocation belongs to.
118
+ * @param folders - The folders to invoke the command for.
57
119
  */
58
- protected set folder(folder: TFolder);
120
+ constructor(plugin: TPlugin, folders: TFolder[]);
121
+ }
122
+ /**
123
+ * Base class for sequential folders command invocations.
124
+ *
125
+ * @typeParam TPlugin - The type of the plugin that the command belongs to.
126
+ */
127
+ export declare class SequentialFoldersCommandInvocationBase<TPlugin extends Plugin> extends FoldersCommandInvocationBase<TPlugin> {
128
+ private readonly createCommandInvocationForFolder;
129
+ /**
130
+ * Creates a new sequential folders command invocation.
131
+ *
132
+ * @param plugin - The plugin that the command invocation belongs to.
133
+ * @param folders - The folders to invoke the command for.
134
+ * @param createCommandInvocationForFolder - The function to create a command invocation for a folder.
135
+ */
136
+ constructor(plugin: TPlugin, folders: TFolder[], createCommandInvocationForFolder: (folder: TFolder) => FolderCommandInvocationBase<TPlugin>);
59
137
  /**
60
138
  * Checks if the command can execute.
61
139
  *
62
140
  * @returns Whether the command can execute.
63
141
  */
64
142
  protected canExecute(): boolean;
143
+ /**
144
+ * Executes the command.
145
+ *
146
+ * @returns A promise that resolves when the command has been executed.
147
+ */
148
+ protected execute(): Promise<void>;
65
149
  }