obsidian-dev-utils 87.0.2 → 87.0.3

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 (71) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/demo-vault-helper/main.js +232 -0
  3. package/dist/demo-vault-helper/manifest.json +9 -0
  4. package/dist/dev/main.js +37464 -0
  5. package/dist/dev/manifest.json +9 -0
  6. package/dist/lib/cjs/__merged.cjs +13 -1
  7. package/dist/lib/cjs/__merged.d.cts +4 -2
  8. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  9. package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +138 -0
  10. package/dist/lib/cjs/obsidian/code-block-reg-exp.d.cts +33 -0
  11. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +13 -6
  12. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.d.cts +13 -5
  13. package/dist/lib/cjs/obsidian/community-plugins.cjs +25 -1
  14. package/dist/lib/cjs/obsidian/community-plugins.d.cts +28 -0
  15. package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +159 -0
  16. package/dist/lib/cjs/obsidian/demo-vault-helper.d.cts +40 -0
  17. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +17 -13
  18. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +13 -5
  19. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  20. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  21. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +12 -10
  22. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  23. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +2 -0
  24. package/dist/lib/cjs/reg-exp.cjs +11 -1
  25. package/dist/lib/cjs/reg-exp.d.cts +34 -0
  26. package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +289 -0
  27. package/dist/lib/cjs/script-utils/demo-vault-coverage.d.cts +264 -0
  28. package/dist/lib/cjs/script-utils/demo-vault.cjs +36 -3
  29. package/dist/lib/cjs/script-utils/demo-vault.d.cts +5 -5
  30. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  31. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  32. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +14 -1
  33. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +4 -5
  34. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  35. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  36. package/dist/lib/cjs/script-utils/version.cjs +2 -2
  37. package/dist/lib/esm/__merged.d.mts +4 -2
  38. package/dist/lib/esm/__merged.mjs +11 -1
  39. package/dist/lib/esm/generated-during-build.mjs +1 -1
  40. package/dist/lib/esm/obsidian/code-block-reg-exp.d.mts +33 -0
  41. package/dist/lib/esm/obsidian/code-block-reg-exp.mjs +30 -0
  42. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.d.mts +13 -5
  43. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +13 -6
  44. package/dist/lib/esm/obsidian/community-plugins.d.mts +28 -0
  45. package/dist/lib/esm/obsidian/community-plugins.mjs +24 -1
  46. package/dist/lib/esm/obsidian/demo-vault-helper.d.mts +40 -0
  47. package/dist/lib/esm/obsidian/demo-vault-helper.mjs +56 -0
  48. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +13 -5
  49. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +17 -13
  50. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  51. package/dist/lib/esm/obsidian/index.mjs +5 -1
  52. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +15 -10
  53. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +2 -0
  54. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  55. package/dist/lib/esm/reg-exp.d.mts +34 -0
  56. package/dist/lib/esm/reg-exp.mjs +11 -2
  57. package/dist/lib/esm/script-utils/demo-vault-coverage.d.mts +264 -0
  58. package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +190 -0
  59. package/dist/lib/esm/script-utils/demo-vault.d.mts +5 -5
  60. package/dist/lib/esm/script-utils/demo-vault.mjs +31 -5
  61. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  62. package/dist/lib/esm/script-utils/index.mjs +3 -1
  63. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +14 -1
  64. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +4 -5
  65. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  66. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  67. package/dist/lib/esm/script-utils/version.mjs +2 -2
  68. package/obsidian/code-block-reg-exp/package.json +6 -0
  69. package/obsidian/demo-vault-helper/package.json +6 -0
  70. package/package.json +6 -5
  71. package/script-utils/demo-vault-coverage/package.json +6 -0
@@ -0,0 +1,264 @@
1
+ /// <reference path="../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Static coverage/freshness checks that keep a plugin's in-repo `demo-vault/` in sync with its public surface.
6
+ *
7
+ * A plugin can ship a curated demo vault at `demo-vault/` in its repo root. These helpers reflect the real
8
+ * public API/config/docs straight from source and assert — WITHOUT launching Obsidian — that every feature is
9
+ * demonstrated in the notes and that the notes reference no API member that no longer exists (rename drift).
10
+ * The runtime behavior of the plugin is covered by its other integration tests, not by the demo vault; the
11
+ * vault is a learning resource, and these checks only guard that it stays truthful.
12
+ *
13
+ * Two layers are exposed:
14
+ * - {@link DemoVaultCoverageChecker} — a framework-agnostic core that reads the corpus, parses interface
15
+ * members, and returns diagnostic arrays (what is undemonstrated / stale / unlinked).
16
+ * - {@link registerDemoVaultCoverageSuite} — a thin wrapper that registers a `vitest` suite over the core, so
17
+ * a plugin's `demo-vault.no-app.integration.test.ts` is a single declarative call.
18
+ */
19
+ /**
20
+ * Reflects a config interface whose options are demonstrated by their bare name.
21
+ */
22
+ export interface DemoVaultConfigInterfaceCoverageSpec {
23
+ /**
24
+ * The name of the `export interface` whose properties are the config options.
25
+ */
26
+ readonly interfaceName: string;
27
+ /**
28
+ * The source file path (relative to the repo root) that declares the interface.
29
+ */
30
+ readonly sourcePath: string;
31
+ }
32
+ /**
33
+ * The parameters for the {@link DemoVaultCoverageChecker} constructor.
34
+ */
35
+ export interface DemoVaultCoverageCheckerConstructorParams {
36
+ /**
37
+ * The absolute path of the plugin repo root — the folder containing `demo-vault/` and the source being
38
+ * reflected. Callers typically pass `getRootFolder() ?? process.cwd()`.
39
+ */
40
+ readonly rootFolder: string;
41
+ }
42
+ /**
43
+ * The parameters for {@link DemoVaultCoverageChecker.findStaleReferences}.
44
+ */
45
+ export interface DemoVaultCoverageCheckerFindStaleReferencesParams {
46
+ /**
47
+ * The receiver whose `` `${receiver}.<member>` `` references are scanned for in the demo corpus.
48
+ */
49
+ readonly receiver: string;
50
+ /**
51
+ * The members that currently exist on the receiver; any referenced member not in this set is stale.
52
+ */
53
+ readonly validMembers: string[];
54
+ }
55
+ /**
56
+ * The parameters for {@link DemoVaultCoverageChecker.findUndemonstratedMembers}.
57
+ */
58
+ export interface DemoVaultCoverageCheckerFindUndemonstratedMembersParams {
59
+ /**
60
+ * The member names that must each appear in the demo corpus.
61
+ */
62
+ readonly members: string[];
63
+ /**
64
+ * When set, a member is demonstrated only if `` `${receiver}.${member}` `` appears (e.g. a context object's
65
+ * methods); when absent, the bare member name is looked up (e.g. a config option).
66
+ */
67
+ readonly receiver?: string;
68
+ }
69
+ /**
70
+ * The parameters for {@link DemoVaultCoverageChecker.findUnlinkedFeatureDocs}.
71
+ */
72
+ export interface DemoVaultCoverageCheckerFindUnlinkedFeatureDocsParams {
73
+ /**
74
+ * The docs folder (relative to the repo root) whose top-level `*.md` files are the feature docs.
75
+ */
76
+ readonly docsFolder: string;
77
+ /**
78
+ * The doc basenames (without `.md`) that are NOT per-feature pages and so need no linking demo note.
79
+ */
80
+ readonly nonFeatureDocs: string[];
81
+ }
82
+ /**
83
+ * The parameters for {@link DemoVaultCoverageChecker.getInterfaceMembers}.
84
+ */
85
+ export interface DemoVaultCoverageCheckerGetInterfaceMembersParams {
86
+ /**
87
+ * The name of the `export interface` to parse.
88
+ */
89
+ readonly interfaceName: string;
90
+ /**
91
+ * The source file path (relative to the repo root) that declares the interface.
92
+ */
93
+ readonly sourcePath: string;
94
+ }
95
+ /**
96
+ * Configures the feature-doc linking check.
97
+ */
98
+ export interface DemoVaultDocsCoverageSpec {
99
+ /**
100
+ * The docs folder (relative to the repo root) whose top-level `*.md` files are the feature docs.
101
+ */
102
+ readonly folder: string;
103
+ /**
104
+ * The doc basenames (without `.md`) that are NOT per-feature pages and so need no linking demo note.
105
+ */
106
+ readonly nonFeatureDocs: string[];
107
+ }
108
+ /**
109
+ * Reflects a single interface's members and demonstrates them via `` `${receiver}.<member>` `` references.
110
+ */
111
+ export interface DemoVaultInterfaceCoverageSpec {
112
+ /**
113
+ * The name of the `export interface` to reflect.
114
+ */
115
+ readonly interfaceName: string;
116
+ /**
117
+ * Whether the demonstrated members are the interface's methods or its properties.
118
+ */
119
+ readonly kind: DemoVaultInterfaceMemberKind;
120
+ /**
121
+ * The identifier the notes call the members on (e.g. `codeButtonContext`).
122
+ */
123
+ readonly receiver: string;
124
+ /**
125
+ * The source file path (relative to the repo root) that declares the interface.
126
+ */
127
+ readonly sourcePath: string;
128
+ }
129
+ /**
130
+ * Whether an interface's demonstrated members are its methods or its properties.
131
+ */
132
+ export type DemoVaultInterfaceMemberKind = 'methods' | 'properties';
133
+ /**
134
+ * Configures the guard that the reflected surface is non-trivial (protects against a parsing regression
135
+ * silently emptying every other check).
136
+ */
137
+ export interface DemoVaultNonTrivialGuardSpec {
138
+ /**
139
+ * A demo note (path relative to the demo vault) that must be present.
140
+ */
141
+ readonly expectDemoNote: string;
142
+ /**
143
+ * A member that must be reflected from {@link DemoVaultNonTrivialGuardSpec.interfaceName}.
144
+ */
145
+ readonly expectMember: string;
146
+ /**
147
+ * The name of the `export interface` whose members are re-parsed for the guard.
148
+ */
149
+ readonly interfaceName: string;
150
+ /**
151
+ * The source file path (relative to the repo root) that declares the interface.
152
+ */
153
+ readonly sourcePath: string;
154
+ }
155
+ /**
156
+ * The parsed members of a source interface.
157
+ */
158
+ export interface InterfaceMembers {
159
+ /**
160
+ * Every member — {@link InterfaceMembers.methods} followed by {@link InterfaceMembers.properties}.
161
+ */
162
+ readonly all: string[];
163
+ /**
164
+ * The method members (declared as `name(...)`).
165
+ */
166
+ readonly methods: string[];
167
+ /**
168
+ * The property members (declared as `name?: ...`).
169
+ */
170
+ readonly properties: string[];
171
+ }
172
+ /**
173
+ * The parameters for {@link registerDemoVaultCoverageSuite}.
174
+ */
175
+ export interface RegisterDemoVaultCoverageSuiteParams {
176
+ /**
177
+ * The config interfaces whose options must each be demonstrated by their bare name.
178
+ */
179
+ readonly configInterfaces: DemoVaultConfigInterfaceCoverageSpec[];
180
+ /**
181
+ * The feature-doc linking check, or `undefined` when the plugin ships no `docs/` folder.
182
+ */
183
+ readonly docs?: DemoVaultDocsCoverageSpec;
184
+ /**
185
+ * The interfaces whose members must each be demonstrated (and referenced without drift).
186
+ */
187
+ readonly interfaces: DemoVaultInterfaceCoverageSpec[];
188
+ /**
189
+ * The guard that keeps the reflected surface non-trivial.
190
+ */
191
+ readonly nonTrivialGuard: DemoVaultNonTrivialGuardSpec;
192
+ /**
193
+ * The absolute path of the plugin repo root. Callers typically pass `getRootFolder() ?? process.cwd()`.
194
+ */
195
+ readonly rootFolder: string;
196
+ }
197
+ /**
198
+ * Reflects a plugin's public surface from source and checks its in-repo `demo-vault/` stays in sync with it.
199
+ *
200
+ * Every method is a pure query over files under the repo root (the demo corpus is read once and cached), so
201
+ * the checker is trivially unit-testable against a fixture repo and carries no test-framework dependency.
202
+ */
203
+ export declare class DemoVaultCoverageChecker {
204
+ private cachedCorpus;
205
+ private readonly demoVaultFolder;
206
+ private readonly rootFolder;
207
+ /**
208
+ * Creates a checker rooted at a plugin repo.
209
+ *
210
+ * @param params - The parameters for the constructor.
211
+ */
212
+ constructor(params: DemoVaultCoverageCheckerConstructorParams);
213
+ /**
214
+ * Collects the demo notes as paths relative to the demo vault folder (for a non-trivial-surface guard).
215
+ *
216
+ * @returns The relative paths of every `*.md` note in the demo vault.
217
+ */
218
+ collectDemoNoteRelativePaths(): string[];
219
+ /**
220
+ * Finds members that the demo notes reference on a receiver but that no longer exist on it (rename drift).
221
+ *
222
+ * @param params - The parameters for the lookup.
223
+ * @returns The distinct stale member names referenced in the demo corpus.
224
+ */
225
+ findStaleReferences(params: DemoVaultCoverageCheckerFindStaleReferencesParams): string[];
226
+ /**
227
+ * Finds members that are not demonstrated anywhere in the demo corpus.
228
+ *
229
+ * @param params - The parameters for the lookup.
230
+ * @returns The member names with no demonstration.
231
+ */
232
+ findUndemonstratedMembers(params: DemoVaultCoverageCheckerFindUndemonstratedMembersParams): string[];
233
+ /**
234
+ * Finds feature docs that no demo note links to.
235
+ *
236
+ * @param params - The parameters for the lookup.
237
+ * @returns The feature-doc basenames (without `.md`) not linked from any demo note.
238
+ */
239
+ findUnlinkedFeatureDocs(params: DemoVaultCoverageCheckerFindUnlinkedFeatureDocsParams): string[];
240
+ /**
241
+ * Parses the members of an `export interface` declared in a source file.
242
+ *
243
+ * @param params - The parameters for the lookup.
244
+ * @returns The parsed {@link InterfaceMembers}.
245
+ * @throws When the interface cannot be found in the source file.
246
+ */
247
+ getInterfaceMembers(params: DemoVaultCoverageCheckerGetInterfaceMembersParams): InterfaceMembers;
248
+ /**
249
+ * Reads and caches the demo corpus — every `*.md` note in the demo vault joined into one string.
250
+ *
251
+ * @returns The concatenated demo-note contents.
252
+ */
253
+ readCorpus(): string;
254
+ private collectMarkdownFiles;
255
+ }
256
+ /**
257
+ * Registers a `vitest` suite that keeps a plugin's in-repo `demo-vault/` in sync with its public surface.
258
+ *
259
+ * Call it once from a plugin's `demo-vault.no-app.integration.test.ts`; it registers one test per check,
260
+ * delegating to {@link DemoVaultCoverageChecker}.
261
+ *
262
+ * @param params - The declarative coverage specification.
263
+ */
264
+ export declare function registerDemoVaultCoverageSuite(params: RegisterDemoVaultCoverageSuiteParams): void;
@@ -143,8 +143,23 @@ var import_node_fs = require('node:fs');
143
143
  var import_promises = require('node:fs/promises');
144
144
  var import_obsidian_plugin_repo_paths = require('../obsidian/plugin/obsidian-plugin-repo-paths.cjs');
145
145
  var import_path = require('../path.cjs');
146
+ var import_obsidian_dev_utils_repo_paths = require('./obsidian-dev-utils-repo-paths.cjs');
146
147
  var import_root = require('./root.cjs');
147
- async function archivePluginDemoVault(newVersion) {
148
+ var __import_meta_url = globalThis["import.meta.url"] ?? (() => {
149
+ if (typeof __filename === "string") {
150
+ const localRequire = require;
151
+ const url = localRequire("node:url");
152
+ if (typeof url.pathToFileURL === "function") {
153
+ return url.pathToFileURL(__filename).href;
154
+ }
155
+ }
156
+ if (typeof window !== "undefined") {
157
+ return activeWindow.location.href;
158
+ }
159
+ return "";
160
+ })();
161
+ const DEMO_VAULT_HELPER_PLUGIN_ID = "demo-vault-helper";
162
+ async function archivePluginDemoVault() {
148
163
  const demoVaultPath = (0, import_root.resolvePathFromRootSafe)({ path: import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DemoVault });
149
164
  if (!(0, import_node_fs.existsSync)(demoVaultPath)) {
150
165
  return null;
@@ -162,16 +177,34 @@ async function archivePluginDemoVault(newVersion) {
162
177
  await (0, import_promises.mkdir)(pluginFolder, { recursive: true });
163
178
  const distBuildPath = (0, import_root.resolvePathFromRootSafe)({ path: import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DistBuild });
164
179
  await (0, import_promises.cp)(distBuildPath, pluginFolder, { recursive: true });
180
+ await injectDemoVaultHelper();
165
181
  const zipPath = (0, import_root.resolvePathFromRootSafe)({
166
- path: (0, import_path.join)(import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DistBuild, `demo-vault-${newVersion}.zip`)
182
+ path: (0, import_path.join)(import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DistBuild, `${manifest.id}.demo-vault.zip`)
167
183
  });
168
184
  const zip = new import_adm_zip.default();
169
185
  zip.addLocalFolder(demoVaultPath);
170
186
  await zip.writeZipPromise(zipPath);
171
187
  return zipPath;
172
188
  }
189
+ async function injectDemoVaultHelper() {
190
+ const packageFolder = (0, import_root.getRootFolder)((0, import_path.getFolderName)(__import_meta_url));
191
+ if (!packageFolder) {
192
+ throw new Error("Could not resolve the obsidian-dev-utils package folder to inject the demo-vault-helper plugin.");
193
+ }
194
+ const helperSourcePath = (0, import_path.join)(packageFolder, import_obsidian_dev_utils_repo_paths.ObsidianDevUtilsRepoPaths.DistDemoVaultHelper);
195
+ const helperFolder = (0, import_root.resolvePathFromRootSafe)({
196
+ path: (0, import_path.join)(
197
+ import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DemoVault,
198
+ import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DotObsidian,
199
+ import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.Plugins,
200
+ DEMO_VAULT_HELPER_PLUGIN_ID
201
+ )
202
+ });
203
+ await (0, import_promises.mkdir)(helperFolder, { recursive: true });
204
+ await (0, import_promises.cp)(helperSourcePath, helperFolder, { recursive: true });
205
+ }
173
206
  // Annotate the CommonJS export names for ESM import in node:
174
207
  0 && (module.exports = {
175
208
  archivePluginDemoVault
176
209
  });
177
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXJjaGl2ZXMgYSBwbHVnaW4ncyBkZW1vIHZhdWx0IGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIEF0IHJlbGVhc2UgdGltZSB0aGlzXG4gKiBtb2R1bGUgaW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGludG8gdGhhdCB2YXVsdCdzIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgZm9sZGVyIGFuZFxuICogemlwcyB0aGUgd2hvbGUgdmF1bHQgaW50byBgZGlzdC9idWlsZC9kZW1vLXZhdWx0LTx2ZXJzaW9uPi56aXBgLCBzbyB0aGUgZXhpc3RpbmcgR2l0SHViLXJlbGVhc2VcbiAqIHN0ZXAgKHdoaWNoIHVwbG9hZHMgZXZlcnkgZmlsZSBpbiBgZGlzdC9idWlsZC9gKSBhdHRhY2hlcyBpdCBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCBBZG1aaXAgZnJvbSAnYWRtLXppcCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuL3BsdWdpbi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyByZXNvbHZlUGF0aEZyb21Sb290U2FmZSB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUgb2YgYSBwbHVnaW4gYG1hbmlmZXN0Lmpzb25gIHJlYWQgYnkge0BsaW5rIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZCwgdXNlZCBhcyB0aGUgZm9sZGVyIG5hbWUgdW5kZXIgYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJjaGl2ZXMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2AgaW4gdGhlIHJlcG8gcm9vdCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBmcm9tIGBkaXN0L2J1aWxkL2AgaW50byB0aGUgdmF1bHQnc1xuICogYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIsIHRoZW4gemlwcyB0aGUgd2hvbGUgdmF1bHQgdG9cbiAqIGBkaXN0L2J1aWxkL2RlbW8tdmF1bHQtPHZlcnNpb24+LnppcGAuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBiZWluZyByZWxlYXNlZCwgdXNlZCBpbiB0aGUgYXJjaGl2ZSBmaWxlIG5hbWUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjcmVhdGVkIHppcCBhcmNoaXZlLCBvclxuICogYG51bGxgIGlmIHRoZSByZXBvIGhhcyBubyBgZGVtby12YXVsdC9gIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGRlbW9WYXVsdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KTtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgbWFuaWZlc3QuaWRcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGRpc3RCdWlsZFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgYXdhaXQgY3AoZGlzdEJ1aWxkUGF0aCwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBBcmNoaXZlIG5hbWUgaXMgaGFuZC1zeW5jZWQgd2l0aCB0aGUgcnVudGltZSBgb3BlbkRlbW9WYXVsdGAgb3BlbmVyLCB3aGljaCBkb3dubG9hZHMgdGhpcyBleGFjdCBhc3NldCBuYW1lLlxuICBjb25zdCB6aXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBgZGVtby12YXVsdC0ke25ld1ZlcnNpb259LnppcGApXG4gIH0pO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKCk7XG4gIHppcC5hZGRMb2NhbEZvbGRlcihkZW1vVmF1bHRQYXRoKTtcbiAgYXdhaXQgemlwLndyaXRlWmlwUHJvbWlzZSh6aXBQYXRoKTtcbiAgcmV0dXJuIHppcFBhdGg7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EscUJBQW1CO0FBQ25CLHFCQUEyQjtBQUMzQixzQkFJTztBQUVQLHdDQUF3QztBQUN4QyxrQkFBcUI7QUFDckIsa0JBQXdDO0FBdUJ4QyxlQUFzQix1QkFBdUIsWUFBNEM7QUFDdkYsUUFBTSxvQkFBZ0IscUNBQXdCLEVBQUUsTUFBTSwwREFBd0IsVUFBVSxDQUFDO0FBQ3pGLE1BQUksS0FBQywyQkFBVyxhQUFhLEdBQUc7QUFDOUIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFlLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLGFBQWEsQ0FBQztBQUMzRixRQUFNLFdBQVcsS0FBSyxNQUFNLFVBQU0sMEJBQVMsY0FBYyxPQUFPLENBQUM7QUFFakUsUUFBTSxtQkFBZSxxQ0FBd0I7QUFBQSxJQUMzQyxVQUFNO0FBQUEsTUFDSiwwREFBd0I7QUFBQSxNQUN4QiwwREFBd0I7QUFBQSxNQUN4QiwwREFBd0I7QUFBQSxNQUN4QixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0YsQ0FBQztBQUNELFlBQU0sdUJBQU0sY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRTdDLFFBQU0sb0JBQWdCLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLFVBQVUsQ0FBQztBQUN6RixZQUFNLG9CQUFHLGVBQWUsY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBR3pELFFBQU0sY0FBVSxxQ0FBd0I7QUFBQSxJQUN0QyxVQUFNLGtCQUFLLDBEQUF3QixXQUFXLGNBQWMsVUFBVSxNQUFNO0FBQUEsRUFDOUUsQ0FBQztBQUNELFFBQU0sTUFBTSxJQUFJLGVBQUFBLFFBQU87QUFDdkIsTUFBSSxlQUFlLGFBQWE7QUFDaEMsUUFBTSxJQUFJLGdCQUFnQixPQUFPO0FBQ2pDLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiQWRtWmlwIl0KfQo=
210
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ2YXIgX19pbXBvcnRfbWV0YV91cmwgPSBnbG9iYWxUaGlzWydpbXBvcnQubWV0YS51cmwnXSA/PyAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb2NhbFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICBjb25zdCB1cmwgPSBsb2NhbFJlcXVpcmUoJ25vZGU6dXJsJyk7XG4gICAgICAgIGlmICh0eXBlb2YgdXJsLnBhdGhUb0ZpbGVVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZVdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGVudmlyb25tZW50IGlzIHVua25vd25cbiAgICAgIHJldHVybiAnJztcbiAgICB9KSgpO1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFyY2hpdmVzIGEgcGx1Z2luJ3MgZGVtbyB2YXVsdCBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBBdCByZWxlYXNlIHRpbWUgdGhpc1xuICogbW9kdWxlIGluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBpbnRvIHRoYXQgdmF1bHQncyBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciBhbmRcbiAqIHppcHMgdGhlIHdob2xlIHZhdWx0IGludG8gYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4uZGVtby12YXVsdC56aXBgLCBzbyB0aGUgZXhpc3RpbmcgR2l0SHViLXJlbGVhc2VcbiAqIHN0ZXAgKHdoaWNoIHVwbG9hZHMgZXZlcnkgZmlsZSBpbiBgZGlzdC9idWlsZC9gKSBhdHRhY2hlcyBpdCBhdXRvbWF0aWNhbGx5LiBUaGUgYXJjaGl2ZSBpcyBuYW1lZCBieVxuICogcGx1Z2luIGlkIChub3QganVzdCBgZGVtby12YXVsdGApIHNvIHNldmVyYWwgcGx1Z2lucycgZGVtbyB2YXVsdHMgbmV2ZXIgY29sbGlkZS5cbiAqL1xuXG5pbXBvcnQgQWRtWmlwIGZyb20gJ2FkbS16aXAnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgY3AsXG4gIG1rZGlyLFxuICByZWFkRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Rm9sZGVyTmFtZSxcbiAgam9pblxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGdldFJvb3RGb2xkZXIsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbmNvbnN0IERFTU9fVkFVTFRfSEVMUEVSX1BMVUdJTl9JRCA9ICdkZW1vLXZhdWx0LWhlbHBlcic7XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUgb2YgYSBwbHVnaW4gYG1hbmlmZXN0Lmpzb25gIHJlYWQgYnkge0BsaW5rIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZCwgdXNlZCBhcyB0aGUgZm9sZGVyIG5hbWUgdW5kZXIgYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJjaGl2ZXMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2AgaW4gdGhlIHJlcG8gcm9vdCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBmcm9tIGBkaXN0L2J1aWxkL2AgaW50byB0aGUgdmF1bHQnc1xuICogYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIsIHRoZW4gemlwcyB0aGUgd2hvbGUgdmF1bHQgdG9cbiAqIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LmRlbW8tdmF1bHQuemlwYC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjcmVhdGVkIHppcCBhcmNoaXZlLCBvclxuICogYG51bGxgIGlmIHRoZSByZXBvIGhhcyBubyBgZGVtby12YXVsdC9gIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGRlbW9WYXVsdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KTtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgbWFuaWZlc3QuaWRcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGRpc3RCdWlsZFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgYXdhaXQgY3AoZGlzdEJ1aWxkUGF0aCwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBhd2FpdCBpbmplY3REZW1vVmF1bHRIZWxwZXIoKTtcblxuICAvLyBBcmNoaXZlIG5hbWUgaXMgaGFuZC1zeW5jZWQgd2l0aCB0aGUgcnVudGltZSBgb3BlbkRlbW9WYXVsdGAgb3BlbmVyLCB3aGljaCBkb3dubG9hZHMgdGhpcyBleGFjdCBhc3NldCBuYW1lLlxuICBjb25zdCB6aXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBgJHttYW5pZmVzdC5pZH0uZGVtby12YXVsdC56aXBgKVxuICB9KTtcbiAgY29uc3QgemlwID0gbmV3IEFkbVppcCgpO1xuICB6aXAuYWRkTG9jYWxGb2xkZXIoZGVtb1ZhdWx0UGF0aCk7XG4gIGF3YWl0IHppcC53cml0ZVppcFByb21pc2UoemlwUGF0aCk7XG4gIHJldHVybiB6aXBQYXRoO1xufVxuXG4vLyBJbmplY3RzIHRoZSBidWlsdCwgYG9ic2lkaWFuLWRldi11dGlsc2Atb3duZWQgYGRlbW8tdmF1bHQtaGVscGVyYCBib290c3RyYXAgcGx1Z2luIChzaGlwcGVkIGluIHRoaXMgcGFja2FnZSkgaW50byB0aGUgZGVtbyB2YXVsdCwgc28gbm8gcGVyLXZhdWx0IGNvcHkgaXMgY29tbWl0dGVkIGFuZCBhbiBgb2JzaWRpYW4tZGV2LXV0aWxzYCBidW1wIHByb3BhZ2F0ZXMgZml4ZXMuXG5hc3luYyBmdW5jdGlvbiBpbmplY3REZW1vVmF1bHRIZWxwZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VGb2xkZXIgPSBnZXRSb290Rm9sZGVyKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGlmICghcGFja2FnZUZvbGRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlc29sdmUgdGhlIG9ic2lkaWFuLWRldi11dGlscyBwYWNrYWdlIGZvbGRlciB0byBpbmplY3QgdGhlIGRlbW8tdmF1bHQtaGVscGVyIHBsdWdpbi4nKTtcbiAgfVxuXG4gIGNvbnN0IGhlbHBlclNvdXJjZVBhdGggPSBqb2luKHBhY2thZ2VGb2xkZXIsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdERlbW9WYXVsdEhlbHBlcik7XG4gIGNvbnN0IGhlbHBlckZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIoaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoaGVscGVyU291cmNlUGF0aCwgaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0QkEscUJBQW1CO0FBQ25CLHFCQUEyQjtBQUMzQixzQkFJTztBQUVQLHdDQUF3QztBQUN4QyxrQkFHTztBQUNQLDJDQUEwQztBQUMxQyxrQkFHTztBQTdDUCxJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQU07QUFDMUQsTUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxVQUFNLGVBQWU7QUFDckIsVUFBTSxNQUFNLGFBQWEsVUFBVTtBQUNuQyxRQUFJLE9BQU8sSUFBSSxrQkFBa0IsWUFBWTtBQUMzQyxhQUFPLElBQUksY0FBYyxVQUFVLEVBQUU7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQ2pDLFdBQU8sYUFBYSxTQUFTO0FBQUEsRUFDL0I7QUFHQSxTQUFPO0FBQ1QsR0FBRztBQWdDUCxNQUFNLDhCQUE4QjtBQXNCcEMsZUFBc0IseUJBQWlEO0FBQ3JFLFFBQU0sb0JBQWdCLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLFVBQVUsQ0FBQztBQUN6RixNQUFJLEtBQUMsMkJBQVcsYUFBYSxHQUFHO0FBQzlCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBZSxxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixhQUFhLENBQUM7QUFDM0YsUUFBTSxXQUFXLEtBQUssTUFBTSxVQUFNLDBCQUFTLGNBQWMsT0FBTyxDQUFDO0FBRWpFLFFBQU0sbUJBQWUscUNBQXdCO0FBQUEsSUFDM0MsVUFBTTtBQUFBLE1BQ0osMERBQXdCO0FBQUEsTUFDeEIsMERBQXdCO0FBQUEsTUFDeEIsMERBQXdCO0FBQUEsTUFDeEIsU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGLENBQUM7QUFDRCxZQUFNLHVCQUFNLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUU3QyxRQUFNLG9CQUFnQixxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixVQUFVLENBQUM7QUFDekYsWUFBTSxvQkFBRyxlQUFlLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUV6RCxRQUFNLHNCQUFzQjtBQUc1QixRQUFNLGNBQVUscUNBQXdCO0FBQUEsSUFDdEMsVUFBTSxrQkFBSywwREFBd0IsV0FBVyxHQUFHLFNBQVMsRUFBRSxpQkFBaUI7QUFBQSxFQUMvRSxDQUFDO0FBQ0QsUUFBTSxNQUFNLElBQUksZUFBQUEsUUFBTztBQUN2QixNQUFJLGVBQWUsYUFBYTtBQUNoQyxRQUFNLElBQUksZ0JBQWdCLE9BQU87QUFDakMsU0FBTztBQUNUO0FBR0EsZUFBZSx3QkFBdUM7QUFDcEQsUUFBTSxvQkFBZ0IsK0JBQWMsMkJBQWMsaUJBQWUsQ0FBQztBQUNsRSxNQUFJLENBQUMsZUFBZTtBQUNsQixVQUFNLElBQUksTUFBTSxpR0FBaUc7QUFBQSxFQUNuSDtBQUVBLFFBQU0sdUJBQW1CLGtCQUFLLGVBQWUsK0RBQTBCLG1CQUFtQjtBQUMxRixRQUFNLG1CQUFlLHFDQUF3QjtBQUFBLElBQzNDLFVBQU07QUFBQSxNQUNKLDBEQUF3QjtBQUFBLE1BQ3hCLDBEQUF3QjtBQUFBLE1BQ3hCLDBEQUF3QjtBQUFBLE1BQ3hCO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNELFlBQU0sdUJBQU0sY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzdDLFlBQU0sb0JBQUcsa0JBQWtCLGNBQWMsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUM5RDsiLAogICJuYW1lcyI6IFsiQWRtWmlwIl0KfQo=
@@ -6,18 +6,18 @@
6
6
  *
7
7
  * A plugin can ship a curated demo vault at `demo-vault/` in its repo root. At release time this
8
8
  * module installs the freshly built plugin into that vault's `.obsidian/plugins/<id>/` folder and
9
- * zips the whole vault into `dist/build/demo-vault-<version>.zip`, so the existing GitHub-release
10
- * step (which uploads every file in `dist/build/`) attaches it automatically.
9
+ * zips the whole vault into `dist/build/<plugin-id>.demo-vault.zip`, so the existing GitHub-release
10
+ * step (which uploads every file in `dist/build/`) attaches it automatically. The archive is named by
11
+ * plugin id (not just `demo-vault`) so several plugins' demo vaults never collide.
11
12
  */
12
13
  /**
13
14
  * Archives the plugin's demo vault (`demo-vault/` in the repo root) as a release artifact.
14
15
  *
15
16
  * Installs the freshly built plugin from `dist/build/` into the vault's
16
17
  * `.obsidian/plugins/<id>/` folder, then zips the whole vault to
17
- * `dist/build/demo-vault-<version>.zip`.
18
+ * `dist/build/<plugin-id>.demo-vault.zip`.
18
19
  *
19
- * @param newVersion - The version being released, used in the archive file name.
20
20
  * @returns A {@link Promise} that resolves to the absolute path of the created zip archive, or
21
21
  * `null` if the repo has no `demo-vault/` folder.
22
22
  */
23
- export declare function archivePluginDemoVault(newVersion: string): Promise<null | string>;
23
+ export declare function archivePluginDemoVault(): Promise<null | string>;
@@ -142,6 +142,7 @@ __export(script_utils_exports, {
142
142
  "code-generator": () => code_generator,
143
143
  "commitlint-config": () => commitlint_config,
144
144
  "demo-vault": () => demo_vault,
145
+ "demo-vault-coverage": () => demo_vault_coverage,
145
146
  exec: () => exec,
146
147
  formatters: () => formatters,
147
148
  fs: () => fs,
@@ -165,6 +166,7 @@ var check_project_types = __toESM(__extractDefault(require('./check-project-type
165
166
  var cli_utils = __toESM(__extractDefault(require('./cli-utils.cjs')), 1);
166
167
  var code_generator = __toESM(__extractDefault(require('./code-generator.cjs')), 1);
167
168
  var commitlint_config = __toESM(__extractDefault(require('./commitlint-config.cjs')), 1);
169
+ var demo_vault_coverage = __toESM(__extractDefault(require('./demo-vault-coverage.cjs')), 1);
168
170
  var demo_vault = __toESM(__extractDefault(require('./demo-vault.cjs')), 1);
169
171
  var exec = __toESM(__extractDefault(require('./exec.cjs')), 1);
170
172
  var formatters = __toESM(__extractDefault(require('./formatters/index.cjs')), 1);
@@ -190,6 +192,7 @@ var warnings_as_errors = __toESM(__extractDefault(require('./warnings-as-errors.
190
192
  "code-generator": null,
191
193
  "commitlint-config": null,
192
194
  "demo-vault": null,
195
+ "demo-vault-coverage": null,
193
196
  exec,
194
197
  formatters,
195
198
  fs,
@@ -206,4 +209,4 @@ var warnings_as_errors = __toESM(__extractDefault(require('./warnings-as-errors.
206
209
  version,
207
210
  "warnings-as-errors": null
208
211
  });
209
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdidWlsZCcgZnJvbSAnLi9idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnYnVuZGxlcnMnIGZyb20gJy4vYnVuZGxlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NoZWNrLXByb2plY3QtdHlwZXMnIGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5leHBvcnQgKiBhcyAnY2xpLXV0aWxzJyBmcm9tICcuL2NsaS11dGlscy50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1nZW5lcmF0b3InIGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtY29uZmlnJyBmcm9tICcuL2NvbW1pdGxpbnQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdkZW1vLXZhdWx0JyBmcm9tICcuL2RlbW8tdmF1bHQudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnanNvbicgZnJvbSAnLi9qc29uLnRzJztcbmV4cG9ydCAqIGFzICdsaW50ZXJzJyBmcm9tICcuL2xpbnRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ25hbm8tc3RhZ2VkLWNvbmZpZycgZnJvbSAnLi9uYW5vLXN0YWdlZC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1wdWJsaXNoJyBmcm9tICcuL25wbS1wdWJsaXNoLnRzJztcbmV4cG9ydCAqIGFzICducG0tcnVuJyBmcm9tICcuL25wbS1ydW4udHMnO1xuZXhwb3J0ICogYXMgJ25wbScgZnJvbSAnLi9ucG0udHMnO1xuZXhwb3J0ICogYXMgJ29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzJyBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmV4cG9ydCAqIGFzICdyb290JyBmcm9tICcuL3Jvb3QudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG5leHBvcnQgKiBhcyAnd2FybmluZ3MtYXMtZXJyb3JzJyBmcm9tICcuL3dhcm5pbmdzLWFzLWVycm9ycy50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLCtCQUFBQTtBQUFBLEVBQUEsbUJBQUFDO0FBQUEsRUFBQSx3QkFBQUM7QUFBQSxFQUFBLDJCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsOEJBQUFDO0FBQUEsRUFBQTtBQUFBLHVCQUFBQztBQUFBLEVBQUEsaUJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBO0FBQUEsd0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUEsOEJBQUFDO0FBQUE7QUFBQTtBQUVBLFlBQXlCO0FBQ3pCLGVBQTRCO0FBQzVCLElBQUFYLHNCQUF1QztBQUN2QyxJQUFBQyxZQUE2QjtBQUM3QixJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsb0JBQXFDO0FBQ3JDLElBQUFDLGFBQThCO0FBQzlCLFdBQXdCO0FBQ3hCLGlCQUE4QjtBQUM5QixTQUFzQjtBQUN0QixXQUF3QjtBQUN4QixjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsVUFBMkI7QUFDM0IsVUFBdUI7QUFDdkIsSUFBQUMsZ0NBQWlEO0FBQ2pELFdBQXdCO0FBQ3hCLElBQUFDLGVBQWdDO0FBQ2hDLElBQUFDLHdCQUF5QztBQUN6QyxjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7IiwKICAibmFtZXMiOiBbImNoZWNrLXByb2plY3QtdHlwZXMiLCAiY2xpLXV0aWxzIiwgImNvZGUtZ2VuZXJhdG9yIiwgImNvbW1pdGxpbnQtY29uZmlnIiwgImRlbW8tdmF1bHQiLCAibmFuby1zdGFnZWQtY29uZmlnIiwgIm5wbS1wdWJsaXNoIiwgIm5wbS1ydW4iLCAib2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMiLCAidGVzdC1ydW5uZXJzIiwgInZhbGlkYXRlLWRlY2xhcmF0aW9ucyIsICJ3YXJuaW5ncy1hcy1lcnJvcnMiXQp9Cg==
212
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdidWlsZCcgZnJvbSAnLi9idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnYnVuZGxlcnMnIGZyb20gJy4vYnVuZGxlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NoZWNrLXByb2plY3QtdHlwZXMnIGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5leHBvcnQgKiBhcyAnY2xpLXV0aWxzJyBmcm9tICcuL2NsaS11dGlscy50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1nZW5lcmF0b3InIGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtY29uZmlnJyBmcm9tICcuL2NvbW1pdGxpbnQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdkZW1vLXZhdWx0LWNvdmVyYWdlJyBmcm9tICcuL2RlbW8tdmF1bHQtY292ZXJhZ2UudHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQnIGZyb20gJy4vZGVtby12YXVsdC50cyc7XG5leHBvcnQgKiBhcyAnZXhlYycgZnJvbSAnLi9leGVjLnRzJztcbmV4cG9ydCAqIGFzICdmb3JtYXR0ZXJzJyBmcm9tICcuL2Zvcm1hdHRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2ZzJyBmcm9tICcuL2ZzLnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpbnRlcnMnIGZyb20gJy4vbGludGVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnbmFuby1zdGFnZWQtY29uZmlnJyBmcm9tICcuL25hbm8tc3RhZ2VkLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXB1Ymxpc2gnIGZyb20gJy4vbnBtLXB1Ymxpc2gudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1ydW4nIGZyb20gJy4vbnBtLXJ1bi50cyc7XG5leHBvcnQgKiBhcyAnbnBtJyBmcm9tICcuL25wbS50cyc7XG5leHBvcnQgKiBhcyAnb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMnIGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuZXhwb3J0ICogYXMgJ3Jvb3QnIGZyb20gJy4vcm9vdC50cyc7XG5leHBvcnQgKiBhcyAndGVzdC1ydW5uZXJzJyBmcm9tICcuL3Rlc3QtcnVubmVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVjbGFyYXRpb25zJyBmcm9tICcuL3ZhbGlkYXRlLWRlY2xhcmF0aW9ucy50cyc7XG5leHBvcnQgKiBhcyAndmVyc2lvbicgZnJvbSAnLi92ZXJzaW9uLnRzJztcbmV4cG9ydCAqIGFzICd3YXJuaW5ncy1hcy1lcnJvcnMnIGZyb20gJy4vd2FybmluZ3MtYXMtZXJyb3JzLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBQUFBO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUEsRUFBQSxvQkFBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBLGlCQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQTtBQUFBLHdCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQTtBQUFBLDhCQUFBQztBQUFBO0FBQUE7QUFFQSxZQUF5QjtBQUN6QixlQUE0QjtBQUM1QixJQUFBWixzQkFBdUM7QUFDdkMsSUFBQUMsWUFBNkI7QUFDN0IsSUFBQUMsaUJBQWtDO0FBQ2xDLElBQUFDLG9CQUFxQztBQUNyQyxJQUFBRSxzQkFBdUM7QUFDdkMsSUFBQUQsYUFBOEI7QUFDOUIsV0FBd0I7QUFDeEIsaUJBQThCO0FBQzlCLFNBQXNCO0FBQ3RCLFdBQXdCO0FBQ3hCLGNBQTJCO0FBQzNCLElBQUFFLHFCQUFzQztBQUN0QyxJQUFBQyxjQUErQjtBQUMvQixJQUFBQyxVQUEyQjtBQUMzQixVQUF1QjtBQUN2QixJQUFBQyxnQ0FBaUQ7QUFDakQsV0FBd0I7QUFDeEIsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUMsd0JBQXlDO0FBQ3pDLGNBQTJCO0FBQzNCLElBQUFDLHFCQUFzQzsiLAogICJuYW1lcyI6IFsiY2hlY2stcHJvamVjdC10eXBlcyIsICJjbGktdXRpbHMiLCAiY29kZS1nZW5lcmF0b3IiLCAiY29tbWl0bGludC1jb25maWciLCAiZGVtby12YXVsdCIsICJkZW1vLXZhdWx0LWNvdmVyYWdlIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgIm9ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzIiwgInRlc3QtcnVubmVycyIsICJ2YWxpZGF0ZS1kZWNsYXJhdGlvbnMiLCAid2FybmluZ3MtYXMtZXJyb3JzIl0KfQo=
@@ -5,6 +5,7 @@ export * as 'check-project-types' from './check-project-types.cjs';
5
5
  export * as 'cli-utils' from './cli-utils.cjs';
6
6
  export * as 'code-generator' from './code-generator.cjs';
7
7
  export * as 'commitlint-config' from './commitlint-config.cjs';
8
+ export * as 'demo-vault-coverage' from './demo-vault-coverage.cjs';
8
9
  export * as 'demo-vault' from './demo-vault.cjs';
9
10
  export * as 'exec' from './exec.cjs';
10
11
  export * as 'formatters' from './formatters/index.cjs';