obsidian-dev-utils 101.4.1 → 101.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/integration-test-plugin/main.js +2818 -2631
- package/dist/lib/cjs/__merged.cjs +10 -1
- package/dist/lib/cjs/__merged.d.cts +3 -2
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/settings-migration-component.cjs +232 -0
- package/dist/lib/cjs/obsidian/components/settings-migration-component.d.cts +120 -0
- package/dist/lib/cjs/obsidian/html-element.cjs +14 -3
- package/dist/lib/cjs/obsidian/html-element.d.cts +46 -2
- package/dist/lib/cjs/obsidian/link.cjs +50 -8
- package/dist/lib/cjs/obsidian/link.d.cts +289 -1
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +1 -1
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +5 -3
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +9 -2
- package/dist/lib/cjs/obsidian/modals/prompt.d.cts +12 -0
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +13 -1
- package/dist/lib/cjs/obsidian/modals/select-item.d.cts +14 -0
- package/dist/lib/cjs/obsidian/obsidian-settings.cjs +28 -1
- package/dist/lib/cjs/obsidian/obsidian-settings.d.cts +30 -0
- package/dist/lib/cjs/obsidian/plugin/index.cjs +6 -3
- package/dist/lib/cjs/obsidian/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/plugin/settings-migration-api.cjs +141 -0
- package/dist/lib/cjs/obsidian/plugin/settings-migration-api.d.cts +91 -0
- package/dist/lib/cjs/script-utils/gate.cjs +195 -0
- package/dist/lib/cjs/script-utils/gate.d.cts +78 -0
- package/dist/lib/cjs/script-utils/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/version.cjs +7 -15
- package/dist/lib/esm/__merged.d.mts +3 -2
- package/dist/lib/esm/__merged.mjs +13 -3
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/settings-migration-component.d.mts +120 -0
- package/dist/lib/esm/obsidian/components/settings-migration-component.mjs +127 -0
- package/dist/lib/esm/obsidian/html-element.d.mts +46 -2
- package/dist/lib/esm/obsidian/html-element.mjs +15 -2
- package/dist/lib/esm/obsidian/link.d.mts +289 -1
- package/dist/lib/esm/obsidian/link.mjs +54 -9
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +5 -3
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/prompt.d.mts +12 -0
- package/dist/lib/esm/obsidian/modals/prompt.mjs +10 -3
- package/dist/lib/esm/obsidian/modals/select-item.d.mts +14 -0
- package/dist/lib/esm/obsidian/modals/select-item.mjs +13 -1
- package/dist/lib/esm/obsidian/obsidian-settings.d.mts +30 -0
- package/dist/lib/esm/obsidian/obsidian-settings.mjs +26 -1
- package/dist/lib/esm/obsidian/plugin/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/plugin/index.mjs +4 -2
- package/dist/lib/esm/obsidian/plugin/settings-migration-api.d.mts +91 -0
- package/dist/lib/esm/obsidian/plugin/settings-migration-api.mjs +44 -0
- package/dist/lib/esm/script-utils/gate.d.mts +78 -0
- package/dist/lib/esm/script-utils/gate.mjs +93 -0
- package/dist/lib/esm/script-utils/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/index.mjs +3 -1
- package/dist/lib/esm/script-utils/version.mjs +7 -18
- package/dist/templates/scripts/gate/gate.ts +10 -0
- package/obsidian/components/settings-migration-component/package.json +6 -0
- package/obsidian/plugin/settings-migration-api/package.json +6 -0
- package/package.json +16 -15
- package/script-utils/gate/package.json +6 -0
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* This module exports a function to display a modal that allows the user to select an item from a list. The modal uses fuzzy search to help the user find the item.
|
|
8
8
|
*/
|
|
9
9
|
import type { ModalParamsBase } from './modal.cjs';
|
|
10
|
+
import { SpellcheckMode } from '../obsidian-settings.cjs';
|
|
10
11
|
/**
|
|
11
12
|
* Options for {@link selectItem}.
|
|
12
13
|
*
|
|
@@ -30,6 +31,19 @@ export interface SelectItemParams<T> extends ModalParamsBase {
|
|
|
30
31
|
* @default `''`
|
|
31
32
|
*/
|
|
32
33
|
readonly placeholder?: string;
|
|
34
|
+
/**
|
|
35
|
+
* The mode deciding whether the search box is spell-checked.
|
|
36
|
+
*
|
|
37
|
+
* The default is what this modal has always done, so passing nothing changes nothing. It differs from
|
|
38
|
+
* the `prompt()` parameter's default on purpose: Obsidian builds every `SuggestModal` input
|
|
39
|
+
* with a hardcoded `spellcheck="false"` and never consults `Editor > Spellcheck` there, so `Off` — not
|
|
40
|
+
* `FollowObsidianSetting` — is the value that leaves the box exactly as Obsidian built it.
|
|
41
|
+
*
|
|
42
|
+
* Raise it for a picker whose box can NAME the thing it is about to create, rather than only find one.
|
|
43
|
+
*
|
|
44
|
+
* @default `SpellcheckMode.Off`
|
|
45
|
+
*/
|
|
46
|
+
readonly spellcheckMode?: SpellcheckMode;
|
|
33
47
|
}
|
|
34
48
|
/**
|
|
35
49
|
* Displays a selection modal in Obsidian for choosing an item from a list.
|
|
@@ -142,24 +142,51 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
142
142
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
143
143
|
var obsidian_settings_exports = {};
|
|
144
144
|
__export(obsidian_settings_exports, {
|
|
145
|
+
SpellcheckMode: () => SpellcheckMode,
|
|
145
146
|
getNewLinkFormat: () => getNewLinkFormat,
|
|
146
147
|
isSpellcheckEnabled: () => isSpellcheckEnabled,
|
|
148
|
+
isSpellcheckEnabledForMode: () => isSpellcheckEnabledForMode,
|
|
147
149
|
shouldUseWikilinks: () => shouldUseWikilinks
|
|
148
150
|
});
|
|
149
151
|
module.exports = __toCommonJS(obsidian_settings_exports);
|
|
152
|
+
var import_type_guards = require('../type-guards.cjs');
|
|
153
|
+
var SpellcheckMode = /* @__PURE__ */ ((SpellcheckMode2) => {
|
|
154
|
+
SpellcheckMode2["AlwaysOn"] = "AlwaysOn";
|
|
155
|
+
SpellcheckMode2["FollowObsidianSetting"] = "FollowObsidianSetting";
|
|
156
|
+
SpellcheckMode2["Off"] = "Off";
|
|
157
|
+
return SpellcheckMode2;
|
|
158
|
+
})(SpellcheckMode || {});
|
|
150
159
|
function getNewLinkFormat(app) {
|
|
151
160
|
return app.vault.getConfig("newLinkFormat");
|
|
152
161
|
}
|
|
153
162
|
function isSpellcheckEnabled(app) {
|
|
154
163
|
return Boolean(app.vault.getConfig("spellcheck"));
|
|
155
164
|
}
|
|
165
|
+
function isSpellcheckEnabledForMode(app, spellcheckMode) {
|
|
166
|
+
switch (spellcheckMode) {
|
|
167
|
+
case "AlwaysOn" /* AlwaysOn */: {
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
case "FollowObsidianSetting" /* FollowObsidianSetting */: {
|
|
171
|
+
return isSpellcheckEnabled(app);
|
|
172
|
+
}
|
|
173
|
+
case "Off" /* Off */: {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
default: {
|
|
177
|
+
(0, import_type_guards.assertNever)(spellcheckMode);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
156
181
|
function shouldUseWikilinks(app) {
|
|
157
182
|
return !app.vault.getConfig("useMarkdownLinks");
|
|
158
183
|
}
|
|
159
184
|
// Annotate the CommonJS export names for ESM import in node:
|
|
160
185
|
0 && (module.exports = {
|
|
186
|
+
SpellcheckMode,
|
|
161
187
|
getNewLinkFormat,
|
|
162
188
|
isSpellcheckEnabled,
|
|
189
|
+
isSpellcheckEnabledForMode,
|
|
163
190
|
shouldUseWikilinks
|
|
164
191
|
});
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL29ic2lkaWFuLXNldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBPYnNpZGlhbiBzZXR0aW5ncy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogQSB3YXkgYW4gaW5wdXQgZGVjaWRlcyB3aGV0aGVyIGl0IGlzIHNwZWxsLWNoZWNrZWQuXG4gKlxuICogVGhlIGBzcGVsbGNoZWNrYCBhdHRyaWJ1dGUgaXMgdGhlIHdob2xlIG1lY2hhbmlzbTogT2JzaWRpYW4gbmV2ZXIgY2FsbHMgRWxlY3Ryb24nc1xuICogYHNldFNwZWxsQ2hlY2tlckVuYWJsZWRgLCBpdCBvbmx5IHNldHMgdGhlIGF0dHJpYnV0ZSBwZXIgZWxlbWVudC4gU28gYEFsd2F5c09uYCByZWFsbHkgZG9lcyBzcGVsbC1jaGVja1xuICogd2l0aCBgRWRpdG9yID4gU3BlbGxjaGVja2Agb2ZmLCBhbmQgd2hhdCBpdCBpbnZva2VzIGlzIENocm9taXVtJ3MgYnVpbHQtaW4gY2hlY2tlci5cbiAqL1xuZXhwb3J0IGVudW0gU3BlbGxjaGVja01vZGUge1xuICAvKipcbiAgICogQWx3YXlzIHNwZWxsLWNoZWNrIHRoZSBpbnB1dCwgd2hhdGV2ZXIgYEVkaXRvciA+IFNwZWxsY2hlY2tgIHNheXMuXG4gICAqL1xuICBBbHdheXNPbiA9ICdBbHdheXNPbicsXG5cbiAgLyoqXG4gICAqIEZvbGxvdyBgRWRpdG9yID4gU3BlbGxjaGVja2AsIHRoZSB3YXkgT2JzaWRpYW4ncyBvd24gbmFtZS1lbnRyeSBzdXJmYWNlcyBkbyBcdTIwMTQgdGhlIGlubGluZSBub3RlIHRpdGxlLFxuICAgKiB0aGUgZmlsZSBleHBsb3JlcidzIGlubGluZSByZW5hbWUsIHRoZSBwcm9wZXJ0aWVzIGZpZWxkcy5cbiAgICovXG4gIEZvbGxvd09ic2lkaWFuU2V0dGluZyA9ICdGb2xsb3dPYnNpZGlhblNldHRpbmcnLFxuXG4gIC8qKlxuICAgKiBOZXZlciBzcGVsbC1jaGVjayB0aGUgaW5wdXQsIHdoYXRldmVyIGBFZGl0b3IgPiBTcGVsbGNoZWNrYCBzYXlzLlxuICAgKi9cbiAgT2ZmID0gJ09mZidcbn1cblxuLyoqXG4gKiBBIGZvcm1hdCBvZiB0aGUgbmV3IGxpbmsuXG4gKi9cbmV4cG9ydCB0eXBlIE5ld0xpbmtGb3JtYXQgPSAnYWJzb2x1dGUnIHwgJ3JlbGF0aXZlJyB8ICdzaG9ydGVzdCc7XG5cbi8qKlxuICogUmV0cmlldmVzIHdoZXRoZXIgdG8gdXNlIHJlbGF0aXZlIGxpbmtzIGJhc2VkIG9uIHRoZSBPYnNpZGlhbiBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdG8gdXNlIHJlbGF0aXZlIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3TGlua0Zvcm1hdChhcHA6IEFwcCk6IE5ld0xpbmtGb3JtYXQge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldENvbmZpZygnbmV3TGlua0Zvcm1hdCcpIGFzIE5ld0xpbmtGb3JtYXQ7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHdoZXRoZXIgdGhlIHNwZWxsY2hlY2sgaXMgZW5hYmxlZCBiYXNlZCBvbiB0aGUgT2JzaWRpYW4gc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzcGVsbGNoZWNrIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NwZWxsY2hlY2tFbmFibGVkKGFwcDogQXBwKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKGFwcC52YXVsdC5nZXRDb25maWcoJ3NwZWxsY2hlY2snKSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSB7QGxpbmsgU3BlbGxjaGVja01vZGV9IGFnYWluc3QgdGhlIE9ic2lkaWFuIHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHNwZWxsY2hlY2tNb2RlIC0gVGhlIG1vZGUgdG8gcmVzb2x2ZS5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGlucHV0IHNob3VsZCBiZSBzcGVsbC1jaGVja2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTcGVsbGNoZWNrRW5hYmxlZEZvck1vZGUoYXBwOiBBcHAsIHNwZWxsY2hlY2tNb2RlOiBTcGVsbGNoZWNrTW9kZSk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKHNwZWxsY2hlY2tNb2RlKSB7XG4gICAgY2FzZSBTcGVsbGNoZWNrTW9kZS5BbHdheXNPbjoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhc2UgU3BlbGxjaGVja01vZGUuRm9sbG93T2JzaWRpYW5TZXR0aW5nOiB7XG4gICAgICByZXR1cm4gaXNTcGVsbGNoZWNrRW5hYmxlZChhcHApO1xuICAgIH1cbiAgICBjYXNlIFNwZWxsY2hlY2tNb2RlLk9mZjoge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihzcGVsbGNoZWNrTW9kZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHdoZXRoZXIgdG8gdXNlIHdpa2lsaW5rcyBiYXNlZCBvbiB0aGUgT2JzaWRpYW4gc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRvIHVzZSB3aWtpbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VXaWtpbGlua3MoYXBwOiBBcHApOiBib29sZWFuIHtcbiAgcmV0dXJuICFhcHAudmF1bHQuZ2V0Q29uZmlnKCd1c2VNYXJrZG93bkxpbmtzJyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEseUJBQTRCO0FBU3JCLElBQUssaUJBQUwsa0JBQUtBLG9CQUFMO0FBSUwsRUFBQUEsZ0JBQUEsY0FBVztBQU1YLEVBQUFBLGdCQUFBLDJCQUF3QjtBQUt4QixFQUFBQSxnQkFBQSxTQUFNO0FBZkksU0FBQUE7QUFBQSxHQUFBO0FBNkJMLFNBQVMsaUJBQWlCLEtBQXlCO0FBQ3hELFNBQU8sSUFBSSxNQUFNLFVBQVUsZUFBZTtBQUM1QztBQVFPLFNBQVMsb0JBQW9CLEtBQW1CO0FBQ3JELFNBQU8sUUFBUSxJQUFJLE1BQU0sVUFBVSxZQUFZLENBQUM7QUFDbEQ7QUFTTyxTQUFTLDJCQUEyQixLQUFVLGdCQUF5QztBQUM1RixVQUFRLGdCQUFnQjtBQUFBLElBQ3RCLEtBQUssMkJBQXlCO0FBQzVCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLHFEQUFzQztBQUN6QyxhQUFPLG9CQUFvQixHQUFHO0FBQUEsSUFDaEM7QUFBQSxJQUNBLEtBQUssaUJBQW9CO0FBQ3ZCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxTQUFTO0FBQ1AsMENBQVksY0FBYztBQUFBLElBQzVCO0FBQUEsRUFDRjtBQUNGO0FBUU8sU0FBUyxtQkFBbUIsS0FBbUI7QUFDcEQsU0FBTyxDQUFDLElBQUksTUFBTSxVQUFVLGtCQUFrQjtBQUNoRDsiLAogICJuYW1lcyI6IFsiU3BlbGxjaGVja01vZGUiXQp9Cg==
|
|
@@ -5,6 +5,28 @@
|
|
|
5
5
|
* This module provides utility functions for working with Obsidian settings.
|
|
6
6
|
*/
|
|
7
7
|
import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
|
|
8
|
+
/**
|
|
9
|
+
* A way an input decides whether it is spell-checked.
|
|
10
|
+
*
|
|
11
|
+
* The `spellcheck` attribute is the whole mechanism: Obsidian never calls Electron's
|
|
12
|
+
* `setSpellCheckerEnabled`, it only sets the attribute per element. So `AlwaysOn` really does spell-check
|
|
13
|
+
* with `Editor > Spellcheck` off, and what it invokes is Chromium's built-in checker.
|
|
14
|
+
*/
|
|
15
|
+
export declare enum SpellcheckMode {
|
|
16
|
+
/**
|
|
17
|
+
* Always spell-check the input, whatever `Editor > Spellcheck` says.
|
|
18
|
+
*/
|
|
19
|
+
AlwaysOn = "AlwaysOn",
|
|
20
|
+
/**
|
|
21
|
+
* Follow `Editor > Spellcheck`, the way Obsidian's own name-entry surfaces do — the inline note title,
|
|
22
|
+
* the file explorer's inline rename, the properties fields.
|
|
23
|
+
*/
|
|
24
|
+
FollowObsidianSetting = "FollowObsidianSetting",
|
|
25
|
+
/**
|
|
26
|
+
* Never spell-check the input, whatever `Editor > Spellcheck` says.
|
|
27
|
+
*/
|
|
28
|
+
Off = "Off"
|
|
29
|
+
}
|
|
8
30
|
/**
|
|
9
31
|
* A format of the new link.
|
|
10
32
|
*/
|
|
@@ -23,6 +45,14 @@ export declare function getNewLinkFormat(app: App): NewLinkFormat;
|
|
|
23
45
|
* @returns Whether the spellcheck is enabled.
|
|
24
46
|
*/
|
|
25
47
|
export declare function isSpellcheckEnabled(app: App): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Resolves a {@link SpellcheckMode} against the Obsidian settings.
|
|
50
|
+
*
|
|
51
|
+
* @param app - The Obsidian app instance.
|
|
52
|
+
* @param spellcheckMode - The mode to resolve.
|
|
53
|
+
* @returns Whether the input should be spell-checked.
|
|
54
|
+
*/
|
|
55
|
+
export declare function isSpellcheckEnabledForMode(app: App, spellcheckMode: SpellcheckMode): boolean;
|
|
26
56
|
/**
|
|
27
57
|
* Retrieves whether to use wikilinks based on the Obsidian settings.
|
|
28
58
|
*
|
|
@@ -157,7 +157,8 @@ __export(plugin_exports, {
|
|
|
157
157
|
"plugin-api": () => plugin_api,
|
|
158
158
|
"plugin-context": () => plugin_context,
|
|
159
159
|
"plugin-event-source": () => plugin_event_source,
|
|
160
|
-
"plugin-settings-tab": () => plugin_settings_tab
|
|
160
|
+
"plugin-settings-tab": () => plugin_settings_tab,
|
|
161
|
+
"settings-migration-api": () => settings_migration_api
|
|
161
162
|
});
|
|
162
163
|
module.exports = __toCommonJS(plugin_exports);
|
|
163
164
|
var obsidian_plugin_repo_paths = __toESM(__extractDefault(require('./obsidian-plugin-repo-paths.cjs')), 1);
|
|
@@ -166,6 +167,7 @@ var plugin_context = __toESM(__extractDefault(require('./plugin-context.cjs')),
|
|
|
166
167
|
var plugin_event_source = __toESM(__extractDefault(require('./plugin-event-source.cjs')), 1);
|
|
167
168
|
var plugin_settings_tab = __toESM(__extractDefault(require('./plugin-settings-tab.cjs')), 1);
|
|
168
169
|
var plugin = __toESM(__extractDefault(require('./plugin.cjs')), 1);
|
|
170
|
+
var settings_migration_api = __toESM(__extractDefault(require('./settings-migration-api.cjs')), 1);
|
|
169
171
|
// Annotate the CommonJS export names for ESM import in node:
|
|
170
172
|
0 && (module.exports = {
|
|
171
173
|
"obsidian-plugin-repo-paths": null,
|
|
@@ -173,6 +175,7 @@ var plugin = __toESM(__extractDefault(require('./plugin.cjs')), 1);
|
|
|
173
175
|
"plugin-api": null,
|
|
174
176
|
"plugin-context": null,
|
|
175
177
|
"plugin-event-source": null,
|
|
176
|
-
"plugin-settings-tab": null
|
|
178
|
+
"plugin-settings-tab": null,
|
|
179
|
+
"settings-migration-api": null
|
|
177
180
|
});
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdvYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocycgZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWFwaScgZnJvbSAnLi9wbHVnaW4tYXBpLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dCcgZnJvbSAnLi9wbHVnaW4tY29udGV4dC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWV2ZW50LXNvdXJjZScgZnJvbSAnLi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tc2V0dGluZ3MtdGFiJyBmcm9tICcuL3BsdWdpbi1zZXR0aW5ncy10YWIudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbicgZnJvbSAnLi9wbHVnaW4udHMnO1xuZXhwb3J0ICogYXMgJ3NldHRpbmdzLW1pZ3JhdGlvbi1hcGknIGZyb20gJy4vc2V0dGluZ3MtbWlncmF0aW9uLWFwaS50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxzQ0FBQUE7QUFBQSxFQUFBO0FBQUEsc0JBQUFDO0FBQUEsRUFBQSx3QkFBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUEsNkJBQUFDO0FBQUEsRUFBQSxnQ0FBQUM7QUFBQTtBQUFBO0FBRUEsSUFBQUwsNkJBQThDO0FBQzlDLElBQUFDLGFBQThCO0FBQzlCLElBQUFDLGlCQUFrQztBQUNsQyxJQUFBQyxzQkFBdUM7QUFDdkMsSUFBQUMsc0JBQXVDO0FBQ3ZDLGFBQTBCO0FBQzFCLElBQUFDLHlCQUEwQzsiLAogICJuYW1lcyI6IFsib2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMiLCAicGx1Z2luLWFwaSIsICJwbHVnaW4tY29udGV4dCIsICJwbHVnaW4tZXZlbnQtc291cmNlIiwgInBsdWdpbi1zZXR0aW5ncy10YWIiLCAic2V0dGluZ3MtbWlncmF0aW9uLWFwaSJdCn0K
|
|
@@ -5,3 +5,4 @@ export * as 'plugin-context' from './plugin-context.cjs';
|
|
|
5
5
|
export * as 'plugin-event-source' from './plugin-event-source.cjs';
|
|
6
6
|
export * as 'plugin-settings-tab' from './plugin-settings-tab.cjs';
|
|
7
7
|
export * as 'plugin' from './plugin.cjs';
|
|
8
|
+
export * as 'settings-migration-api' from './settings-migration-api.cjs';
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureBrowserProcess() {
|
|
8
|
+
const browserProcess = {
|
|
9
|
+
browser: true,
|
|
10
|
+
cwd() {
|
|
11
|
+
return '/';
|
|
12
|
+
},
|
|
13
|
+
env: {},
|
|
14
|
+
platform: 'android'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
18
|
+
const existingProcess = globalThis.process;
|
|
19
|
+
|
|
20
|
+
if (!existingProcess) {
|
|
21
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const existingProcessRecord = existingProcess;
|
|
31
|
+
|
|
32
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
33
|
+
existingProcessRecord[key] ??= value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
existingProcessRecord['browser'] = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function keepName($unknown) {
|
|
40
|
+
return $unknown;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(function initCjs() {
|
|
44
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
45
|
+
const globalThisRecord = globalThis;
|
|
46
|
+
globalThisRecord['__name'] ??= keepName;
|
|
47
|
+
const originalRequire = require;
|
|
48
|
+
if (originalRequire && !originalRequire.__isPatched) {
|
|
49
|
+
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
50
|
+
require = Object.assign(
|
|
51
|
+
(id) => requirePatched(id),
|
|
52
|
+
originalRequire,
|
|
53
|
+
{
|
|
54
|
+
__isPatched: true
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
60
|
+
|
|
61
|
+
ensureBrowserProcess();
|
|
62
|
+
|
|
63
|
+
function extractDefault(module) {
|
|
64
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
68
|
+
'@codemirror/autocomplete',
|
|
69
|
+
'@codemirror/collab',
|
|
70
|
+
'@codemirror/commands',
|
|
71
|
+
'@codemirror/language',
|
|
72
|
+
'@codemirror/lint',
|
|
73
|
+
'@codemirror/search',
|
|
74
|
+
'@codemirror/state',
|
|
75
|
+
'@codemirror/text',
|
|
76
|
+
'@codemirror/view',
|
|
77
|
+
'@lezer/common',
|
|
78
|
+
'@lezer/highlight',
|
|
79
|
+
'@lezer/lr',
|
|
80
|
+
'obsidian']
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
84
|
+
'@codemirror/closebrackets',
|
|
85
|
+
'@codemirror/comment',
|
|
86
|
+
'@codemirror/fold',
|
|
87
|
+
'@codemirror/gutter',
|
|
88
|
+
'@codemirror/highlight',
|
|
89
|
+
'@codemirror/history',
|
|
90
|
+
'@codemirror/matchbrackets',
|
|
91
|
+
'@codemirror/panel',
|
|
92
|
+
'@codemirror/rangeset',
|
|
93
|
+
'@codemirror/rectangular-selection',
|
|
94
|
+
'@codemirror/stream-parser',
|
|
95
|
+
'@codemirror/tooltip']
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
function requirePatched(id) {
|
|
99
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
100
|
+
return originalRequire?.(id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
104
|
+
if (globalThis.app.isMobile) {
|
|
105
|
+
if (id === 'process' || id === 'node:process') {
|
|
106
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
107
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
108
|
+
|
|
109
|
+
return process;
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
const module = originalRequire?.(id);
|
|
113
|
+
if (module) {
|
|
114
|
+
return extractDefault(module);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
119
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
120
|
+
return {};
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
})();
|
|
124
|
+
|
|
125
|
+
"use strict";
|
|
126
|
+
var __defProp = Object.defineProperty;
|
|
127
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
128
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
129
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
130
|
+
var __copyProps = (to, from, except, desc) => {
|
|
131
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
132
|
+
for (let key of __getOwnPropNames(from))
|
|
133
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
134
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
135
|
+
}
|
|
136
|
+
return to;
|
|
137
|
+
};
|
|
138
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
139
|
+
var settings_migration_api_exports = {};
|
|
140
|
+
module.exports = __toCommonJS(settings_migration_api_exports);
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9zZXR0aW5ncy1taWdyYXRpb24tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdlbmVyaWMgaGFsZiBvZiBhIHNldHRpbmdzIEhBTkRPVkVSIGNvbnRyYWN0OiBvbmUgcGx1Z2luIG9mZmVycyBhbm90aGVyIHRoZSBzZXR0aW5ncyBpdCB1c2VkIHRvIG93bixcbiAqIGFuZCB0aGUgcGx1Z2luIHRoYXQgb3ducyB0aGVtIG5vdyBkZWNpZGVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgb2ZmZXIuXG4gKlxuICogVGhlIHNoYXBlIGJlbG93IGlzIGRlbGliZXJhdGVseSB0aGUgKmVudmVsb3BlKiBhbmQgbm90aGluZyBlbHNlLiBBIGhhbmRvdmVyIGhhcyB0aHJlZSBwYXJ0cywgYW5kIG9ubHkgb25lXG4gKiBvZiB0aGVtIGlzIGdlbmVyaWM6XG4gKlxuICogLSBUaGUgKiplbnZlbG9wZSoqIFx1MjAxNCBhIGBtaWdyYXRlU2V0dGluZ3NgIGNhbGwsIHdobyBpcyBwcm9wb3NpbmcsIGFuZCB3aGV0aGVyIHRoZSB1c2VyIGFwcGxpZWQgaXQuIElkZW50aWNhbFxuICogICBmb3IgZXZlcnkgcGFpciBvZiBwbHVnaW5zLCBzbyBpdCBsaXZlcyBoZXJlLlxuICogLSBUaGUgKipwYXlsb2FkKiogXHUyMDE0IHdoaWNoIHNldHRpbmdzIGFyZSBiZWluZyBwcm9wb3NlZC4gRW50aXJlbHkgdGhlIHBhaXIncyBvd24gYnVzaW5lc3MsIHNvIGl0IHN0YXlzIGEgdHlwZVxuICogICBwYXJhbWV0ZXIgYW5kIGlzIG5ldmVyIG5hbWVkIGhlcmUuXG4gKiAtIFRoZSAqKnByb3ZpZGVyJ3MgaWRlbnRpdHkqKiBcdTIwMTQgaXRzIHBsdWdpbiBpZCBhbmQgZGlzcGxheSBuYW1lLiBBbHNvIHRoZSBwYWlyJ3Mgb3duIGJ1c2luZXNzLCBhbmQgbm90XG4gKiAgIHNvbWV0aGluZyB0aGlzIGxpYnJhcnkgaGFzIGFueSBzdGFuZGluZyB0byBvd24uXG4gKlxuICogV2h5IGl0IGlzIGRlY2xhcmVkIHJhdGhlciB0aGFuIGltcG9ydGVkLiBBIHByb3ZpZGVyIGlzIHR5cGljYWxseSBhbiBPYnNpZGlhbiAqcGx1Z2luKiByZXBvLCBub3QgYW4gbnBtXG4gKiBwYWNrYWdlLCBzbyBhIGNvbnN1bWVyIGhhcyBub3RoaW5nIHRvIGRlcGVuZCBvbiBhbmQgaGFuZC13cml0ZXMgaXRzIG93biBjb3B5IG9mIHRoZSBjb250cmFjdC4gRml2ZSBjb3BpZXNcbiAqIG9mIG9uZSBjb250cmFjdCB3aXRoIG5vIGNvbXBpbGVyIGxpbmsgYmV0d2VlbiB0aGVtIG1lYW5zIGRyaWZ0IGlzIFNJTEVOVCBcdTIwMTQgZXZlcnkgY29weSBzdGlsbCBjb21waWxlcyBhbmRcbiAqIHRoZSBoYW5kb3ZlciBmYWlscyBhdCBydW50aW1lIGluc3RlYWQuIERlY2xhcmluZyB0aGUgZW52ZWxvcGUgaGVyZSBnaXZlcyBib3RoIGVuZHMgb25lIGRlY2xhcmF0aW9uIHRvXG4gKiBjb21waWxlIGFnYWluc3Q7IGB3YXRjaFBsdWdpbkFwaWAgc3RpbGwgbmVnb3RpYXRlcyB0aGUgdmVyc2lvbiBhdCBydW50aW1lLCBiZWNhdXNlIHRoZSB0d28gZW5kcyBzaGlwXG4gKiBpbmRlcGVuZGVudGx5IGFuZCBhbHdheXMgd2lsbC5cbiAqXG4gKiBUaGUgcHJvdmlkZXIgcHVibGlzaGVzIGl0OlxuICpcbiAqIGBgYHRzXG4gKiBwdWJsaXNoUGx1Z2luQXBpPFNldHRpbmdzTWlncmF0aW9uQXBpPE15TWlncmF0YWJsZVNldHRpbmdzPj4oe1xuICogICBhcGk6IHRoaXMuc2V0dGluZ3NNaWdyYXRpb25BcGksXG4gKiAgIGFwaVZlcnNpb246ICcxLjAuMCcsXG4gKiAgIGNvbnRyYWN0OiB7IG1pZ3JhdGVTZXR0aW5nczoge30gfSxcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIFRoZSBjb25zdW1lciByZWFjaGVzIGl0IHRocm91Z2gge0BsaW5rIG9ic2lkaWFuL2NvbXBvbmVudHMvc2V0dGluZ3MtbWlncmF0aW9uLWNvbXBvbmVudCFTZXR0aW5nc01pZ3JhdGlvbkNvbXBvbmVudH0sXG4gKiB3aGljaCBvd25zIHRoZSB3aG9sZSBvZmZlci1hbmQtcmV0aXJlIGRhbmNlLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFNldHRpbmdzTWlncmF0aW9uQXBpLm1pZ3JhdGVTZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBUTWlncmF0YWJsZVNldHRpbmdzIC0gVGhlIHNldHRpbmdzIHRoZSBwcm9wb3NpbmcgcGx1Z2luIG1heSBoYW5kIG92ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0ZVNldHRpbmdzUGFyYW1zPFRNaWdyYXRhYmxlU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZXMgdGhlIHByb3Bvc2luZyBwbHVnaW4gb2ZmZXJzLlxuICAgKlxuICAgKiBDb252ZW50aW9uYWxseSBldmVyeSBtZW1iZXIgaXMgb3B0aW9uYWwsIHNvIGEgcGx1Z2luIHByb3Bvc2VzIG9ubHkgd2hhdCBpdCBhY3R1YWxseSBoZWxkIGFuZCBhIHZhbHVlIHRoZVxuICAgKiBwcm92aWRlciBhbHJlYWR5IG93bnMgaXMgbmV2ZXIgb3ZlcndyaXR0ZW4gYnkgYSBkZWZhdWx0IG5vYm9keSBjaG9zZS4gVGhhdCBjb252ZW50aW9uIGJlbG9uZ3MgdG8gdGhlIHBhaXIsXG4gICAqIHRob3VnaCBcdTIwMTQgdGhpcyB0eXBlIGltcG9zZXMgb25seSB0aGUgZW52ZWxvcGUuXG4gICAqL1xuICByZWFkb25seSBwcm9wb3NlZFNldHRpbmdzOiBUTWlncmF0YWJsZVNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIG1ha2luZyB0aGUgcHJvcG9zYWwsIHNvIHRoZSBwcm92aWRlcidzIGRpYWxvZyBjYW4gc2F5IHdob3NlIHNldHRpbmdzXG4gICAqIHRoZXNlIGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG91dGNvbWUgb2Yge0BsaW5rIFNldHRpbmdzTWlncmF0aW9uQXBpLm1pZ3JhdGVTZXR0aW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0ZVNldHRpbmdzUmVzdWx0IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHVzZXIgYXBwcm92ZWQgdGhlIG1pZ3JhdGlvbi5cbiAgICpcbiAgICogYGZhbHNlYCBtZWFucyB0aGV5IGNhbmNlbGxlZCBhbmQgbm90aGluZyB3YXMgd3JpdHRlbiwgc28gdGhlIHByb3Bvc2luZyBwbHVnaW4gbXVzdCBOT1QgcmVjb3JkIHRoZVxuICAgKiBtaWdyYXRpb24gYXMgZG9uZSBcdTIwMTQgYSBjYW5jZWwgaXMgbm90IGFuIGFuc3dlciwgYW5kIHRoZSBvZmZlciBoYXMgdG8gY29tZSBiYWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBsaWVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBBUEkgYSBwbHVnaW4gcHVibGlzaGVzIHdoZW4gaXQgaXMgd2lsbGluZyB0byByZWNlaXZlIHNldHRpbmdzIGFub3RoZXIgcGx1Z2luIHVzZWQgdG8gb3duLlxuICpcbiAqIEB0eXBlUGFyYW0gVE1pZ3JhdGFibGVTZXR0aW5ncyAtIFRoZSBzZXR0aW5ncyB0aGlzIHByb3ZpZGVyIGFjY2VwdHMuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSBwcm92aWRlciBvd25zIHRoZSBzZXR0aW5ncywgc28gaXQgb3ducyB0aGUgZGlhbG9nOiBhIHByb3Bvc2luZyBwbHVnaW4gbmV2ZXIgd3JpdGVzIGludG8gYW5vdGhlclxuICogcGx1Z2luJ3MgYGRhdGEuanNvbmAuIEl0IHByb3Bvc2VzLCBhbmQgdGhlIHVzZXIgYXBwcm92ZXMsIGVkaXRzIG9yIGRlY2xpbmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzTWlncmF0aW9uQXBpPFRNaWdyYXRhYmxlU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIE9mZmVycyB0aGUgdXNlciBhIHNldCBvZiBzZXR0aW5ncyB2YWx1ZXMgYW5vdGhlciBwbHVnaW4gcHJvcG9zZXMsIGFuZCBhcHBsaWVzIHdoYXQgdGhleSBhcHByb3ZlLlxuICAgKlxuICAgKiBSZXNvbHZlcyBvbmx5IG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQsIHNvIHRoZSBjYWxsZXIgbGVhcm5zIHdoZXRoZXIgdGhlIG1pZ3JhdGlvbiBhY3R1YWxseSBoYXBwZW5lZCBhbmRcbiAgICogY2FuIHJldGlyZSBcdTIwMTQgb3Igd2l0aGhvbGQgXHUyMDE0IGl0cyBvd24gcGVuZGluZyB2YWx1ZXMgb24gdGhhdCBhbnN3ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcHJvcG9zYWwuXG4gICAqIEByZXR1cm5zIFdoYXQgdGhlIHVzZXIgYXBwcm92ZWQuXG4gICAqL1xuICBtaWdyYXRlU2V0dGluZ3MocGFyYW1zOiBNaWdyYXRlU2V0dGluZ3NQYXJhbXM8VE1pZ3JhdGFibGVTZXR0aW5ncz4pOiBQcm9taXNlPE1pZ3JhdGVTZXR0aW5nc1Jlc3VsdD47XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/// <reference path="../../library.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The generic half of a settings HANDOVER contract: one plugin offers another the settings it used to own,
|
|
6
|
+
* and the plugin that owns them now decides what to do with the offer.
|
|
7
|
+
*
|
|
8
|
+
* The shape below is deliberately the *envelope* and nothing else. A handover has three parts, and only one
|
|
9
|
+
* of them is generic:
|
|
10
|
+
*
|
|
11
|
+
* - The **envelope** — a `migrateSettings` call, who is proposing, and whether the user applied it. Identical
|
|
12
|
+
* for every pair of plugins, so it lives here.
|
|
13
|
+
* - The **payload** — which settings are being proposed. Entirely the pair's own business, so it stays a type
|
|
14
|
+
* parameter and is never named here.
|
|
15
|
+
* - The **provider's identity** — its plugin id and display name. Also the pair's own business, and not
|
|
16
|
+
* something this library has any standing to own.
|
|
17
|
+
*
|
|
18
|
+
* Why it is declared rather than imported. A provider is typically an Obsidian *plugin* repo, not an npm
|
|
19
|
+
* package, so a consumer has nothing to depend on and hand-writes its own copy of the contract. Five copies
|
|
20
|
+
* of one contract with no compiler link between them means drift is SILENT — every copy still compiles and
|
|
21
|
+
* the handover fails at runtime instead. Declaring the envelope here gives both ends one declaration to
|
|
22
|
+
* compile against; `watchPluginApi` still negotiates the version at runtime, because the two ends ship
|
|
23
|
+
* independently and always will.
|
|
24
|
+
*
|
|
25
|
+
* The provider publishes it:
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* publishPluginApi<SettingsMigrationApi<MyMigratableSettings>>({
|
|
29
|
+
* api: this.settingsMigrationApi,
|
|
30
|
+
* apiVersion: '1.0.0',
|
|
31
|
+
* contract: { migrateSettings: {} },
|
|
32
|
+
* plugin: this
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* The consumer reaches it through {@link obsidian/components/settings-migration-component!SettingsMigrationComponent},
|
|
37
|
+
* which owns the whole offer-and-retire dance.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* Parameters for {@link SettingsMigrationApi.migrateSettings}.
|
|
41
|
+
*
|
|
42
|
+
* @typeParam TMigratableSettings - The settings the proposing plugin may hand over.
|
|
43
|
+
*/
|
|
44
|
+
export interface MigrateSettingsParams<TMigratableSettings extends object> {
|
|
45
|
+
/**
|
|
46
|
+
* The values the proposing plugin offers.
|
|
47
|
+
*
|
|
48
|
+
* Conventionally every member is optional, so a plugin proposes only what it actually held and a value the
|
|
49
|
+
* provider already owns is never overwritten by a default nobody chose. That convention belongs to the pair,
|
|
50
|
+
* though — this type imposes only the envelope.
|
|
51
|
+
*/
|
|
52
|
+
readonly proposedSettings: TMigratableSettings;
|
|
53
|
+
/**
|
|
54
|
+
* The `manifest.id` of the plugin making the proposal, so the provider's dialog can say whose settings
|
|
55
|
+
* these are.
|
|
56
|
+
*/
|
|
57
|
+
readonly sourcePluginId: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The outcome of {@link SettingsMigrationApi.migrateSettings}.
|
|
61
|
+
*/
|
|
62
|
+
export interface MigrateSettingsResult {
|
|
63
|
+
/**
|
|
64
|
+
* Whether the user approved the migration.
|
|
65
|
+
*
|
|
66
|
+
* `false` means they cancelled and nothing was written, so the proposing plugin must NOT record the
|
|
67
|
+
* migration as done — a cancel is not an answer, and the offer has to come back.
|
|
68
|
+
*/
|
|
69
|
+
readonly isApplied: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The API a plugin publishes when it is willing to receive settings another plugin used to own.
|
|
73
|
+
*
|
|
74
|
+
* @typeParam TMigratableSettings - The settings this provider accepts.
|
|
75
|
+
*
|
|
76
|
+
* @remarks
|
|
77
|
+
* The provider owns the settings, so it owns the dialog: a proposing plugin never writes into another
|
|
78
|
+
* plugin's `data.json`. It proposes, and the user approves, edits or declines.
|
|
79
|
+
*/
|
|
80
|
+
export interface SettingsMigrationApi<TMigratableSettings extends object> {
|
|
81
|
+
/**
|
|
82
|
+
* Offers the user a set of settings values another plugin proposes, and applies what they approve.
|
|
83
|
+
*
|
|
84
|
+
* Resolves only once the dialog is closed, so the caller learns whether the migration actually happened and
|
|
85
|
+
* can retire — or withhold — its own pending values on that answer.
|
|
86
|
+
*
|
|
87
|
+
* @param params - The proposal.
|
|
88
|
+
* @returns What the user approved.
|
|
89
|
+
*/
|
|
90
|
+
migrateSettings(params: MigrateSettingsParams<TMigratableSettings>): Promise<MigrateSettingsResult>;
|
|
91
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureBrowserProcess() {
|
|
8
|
+
const browserProcess = {
|
|
9
|
+
browser: true,
|
|
10
|
+
cwd() {
|
|
11
|
+
return '/';
|
|
12
|
+
},
|
|
13
|
+
env: {},
|
|
14
|
+
platform: 'android'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
18
|
+
const existingProcess = globalThis.process;
|
|
19
|
+
|
|
20
|
+
if (!existingProcess) {
|
|
21
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const existingProcessRecord = existingProcess;
|
|
31
|
+
|
|
32
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
33
|
+
existingProcessRecord[key] ??= value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
existingProcessRecord['browser'] = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function keepName($unknown) {
|
|
40
|
+
return $unknown;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(function initCjs() {
|
|
44
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
45
|
+
const globalThisRecord = globalThis;
|
|
46
|
+
globalThisRecord['__name'] ??= keepName;
|
|
47
|
+
const originalRequire = require;
|
|
48
|
+
if (originalRequire && !originalRequire.__isPatched) {
|
|
49
|
+
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
50
|
+
require = Object.assign(
|
|
51
|
+
(id) => requirePatched(id),
|
|
52
|
+
originalRequire,
|
|
53
|
+
{
|
|
54
|
+
__isPatched: true
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
60
|
+
|
|
61
|
+
ensureBrowserProcess();
|
|
62
|
+
|
|
63
|
+
function extractDefault(module) {
|
|
64
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
68
|
+
'@codemirror/autocomplete',
|
|
69
|
+
'@codemirror/collab',
|
|
70
|
+
'@codemirror/commands',
|
|
71
|
+
'@codemirror/language',
|
|
72
|
+
'@codemirror/lint',
|
|
73
|
+
'@codemirror/search',
|
|
74
|
+
'@codemirror/state',
|
|
75
|
+
'@codemirror/text',
|
|
76
|
+
'@codemirror/view',
|
|
77
|
+
'@lezer/common',
|
|
78
|
+
'@lezer/highlight',
|
|
79
|
+
'@lezer/lr',
|
|
80
|
+
'obsidian']
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
84
|
+
'@codemirror/closebrackets',
|
|
85
|
+
'@codemirror/comment',
|
|
86
|
+
'@codemirror/fold',
|
|
87
|
+
'@codemirror/gutter',
|
|
88
|
+
'@codemirror/highlight',
|
|
89
|
+
'@codemirror/history',
|
|
90
|
+
'@codemirror/matchbrackets',
|
|
91
|
+
'@codemirror/panel',
|
|
92
|
+
'@codemirror/rangeset',
|
|
93
|
+
'@codemirror/rectangular-selection',
|
|
94
|
+
'@codemirror/stream-parser',
|
|
95
|
+
'@codemirror/tooltip']
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
function requirePatched(id) {
|
|
99
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
100
|
+
return originalRequire?.(id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
104
|
+
if (globalThis.app.isMobile) {
|
|
105
|
+
if (id === 'process' || id === 'node:process') {
|
|
106
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
107
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
108
|
+
|
|
109
|
+
return process;
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
const module = originalRequire?.(id);
|
|
113
|
+
if (module) {
|
|
114
|
+
return extractDefault(module);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
119
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
120
|
+
return {};
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
})();
|
|
124
|
+
|
|
125
|
+
"use strict";
|
|
126
|
+
var __defProp = Object.defineProperty;
|
|
127
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
128
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
129
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
130
|
+
var __export = (target, all) => {
|
|
131
|
+
for (var name in all)
|
|
132
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
133
|
+
};
|
|
134
|
+
var __copyProps = (to, from, except, desc) => {
|
|
135
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
136
|
+
for (let key of __getOwnPropNames(from))
|
|
137
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
138
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
139
|
+
}
|
|
140
|
+
return to;
|
|
141
|
+
};
|
|
142
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
143
|
+
var gate_exports = {};
|
|
144
|
+
__export(gate_exports, {
|
|
145
|
+
gate: () => gate,
|
|
146
|
+
parseGateArguments: () => parseGateArguments
|
|
147
|
+
});
|
|
148
|
+
module.exports = __toCommonJS(gate_exports);
|
|
149
|
+
var import_node_util = require('node:util');
|
|
150
|
+
var import_npm_run = require('./npm-run.cjs');
|
|
151
|
+
async function gate(options = {}) {
|
|
152
|
+
const {
|
|
153
|
+
shouldBuild = true,
|
|
154
|
+
shouldRunChecks = true,
|
|
155
|
+
shouldRunIntegrationTests = false
|
|
156
|
+
} = options;
|
|
157
|
+
if (shouldRunChecks) {
|
|
158
|
+
await (0, import_npm_run.npmRun)("format:check");
|
|
159
|
+
await (0, import_npm_run.npmRun)("spellcheck");
|
|
160
|
+
await (0, import_npm_run.npmRun)("lint:md");
|
|
161
|
+
}
|
|
162
|
+
if (shouldBuild) {
|
|
163
|
+
await (0, import_npm_run.npmRun)("build");
|
|
164
|
+
}
|
|
165
|
+
if (shouldRunChecks) {
|
|
166
|
+
await (0, import_npm_run.npmRun)("lint");
|
|
167
|
+
await (0, import_npm_run.npmRunOptional)("find-overexposed");
|
|
168
|
+
if (await (0, import_npm_run.npmRunOptional)("test:coverage") === import_npm_run.NpmRunOptionalResult.Skipped) {
|
|
169
|
+
await (0, import_npm_run.npmRunOptional)("test");
|
|
170
|
+
}
|
|
171
|
+
if (shouldRunIntegrationTests) {
|
|
172
|
+
await (0, import_npm_run.npmRunOptional)("test:integration");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function parseGateArguments($arguments) {
|
|
177
|
+
const { values } = (0, import_node_util.parseArgs)({
|
|
178
|
+
// eslint-disable-next-line unicorn/name-replacements -- `args` is the option name Node's `parseArgs` reads.
|
|
179
|
+
args: $arguments,
|
|
180
|
+
options: {
|
|
181
|
+
"no-build": { type: "boolean" },
|
|
182
|
+
"no-checks": { type: "boolean" }
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
shouldBuild: !(values["no-build"] ?? false),
|
|
187
|
+
shouldRunChecks: !(values["no-checks"] ?? false)
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
191
|
+
0 && (module.exports = {
|
|
192
|
+
gate,
|
|
193
|
+
parseGateArguments
|
|
194
|
+
});
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9nYXRlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGJyYW5jaCBnYXRlOiB0aGUgdmVyaWZpY2F0aW9uIHNlcXVlbmNlIHRoYXQgYHVwZGF0ZVZlcnNpb25gIHJ1bnMgYXMgaXRzIHJlbGVhc2UgcHJlZmxpZ2h0LCBhdmFpbGFibGVcbiAqIGFzIGEgY29tbWFuZCBvZiBpdHMgb3duLlxuICpcbiAqIEZvdXIgb2YgdGhlIHByZWZsaWdodCdzIGNoZWNrcyBcdTIwMTQgYGZvcm1hdDpjaGVja2AsIGBzcGVsbGNoZWNrYCwgYGZpbmQtb3ZlcmV4cG9zZWRgIGFuZCBgdGVzdDpjb3ZlcmFnZWAgXHUyMDE0XG4gKiBhcmUgcmVhY2hhYmxlIGJ5IG5vIG90aGVyIHJvdXRpbmUgY29tbWFuZC4gU28gdGhlIG5hdHVyYWwgYnJhbmNoIGdhdGUgKGJ1aWxkLCBsaW50LCB0ZXN0KSBjYW4gYmUgZ3JlZW5cbiAqIHdoaWxlIHRoZSByZWxlYXNlIGlzIHN0aWxsIGdvaW5nIHRvIGZhaWwsIGFuZCB0aGUgZmFpbHVyZSBhcnJpdmVzIGF0IHJlbGVhc2UgdGltZSByYXRoZXIgdGhhbiBpbiBzZWNvbmRzXG4gKiBvbiB0aGUgYnJhbmNoLlxuICpcbiAqIFRoaXMgbW9kdWxlIGV4aXN0cyBzbyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBjb2RlIHJhdGhlciB0aGFuIHR3byBsaXN0cyB0aGF0IGFncmVlIHRvZGF5OiBgdXBkYXRlVmVyc2lvbmBcbiAqIGNhbGxzIHtAbGluayBnYXRlfSwgYW5kIGEgY2hlY2sgYWRkZWQgaGVyZSBpcyByZWFjaGFibGUgZnJvbSBib3RoLiBXaGF0IHRoZSBnYXRlIGRlbGliZXJhdGVseSBsZWF2ZXMgdG9cbiAqIHRoZSByZWxlYXNlIHBhdGggaXMgdGhlIGNsZWFuLXJlcG8gYXNzZXJ0aW9uIFx1MjAxNCBhIGJyYW5jaCBnYXRlIGlzIHJ1biBvbiBhIGRpcnR5IHRyZWUsIHdoaWNoIGlzIHRoZSB3aG9sZVxuICogcG9pbnQgb2YgcnVubmluZyBpdCBiZWZvcmUgY29tbWl0dGluZyBcdTIwMTQgYW5kIHRoZSBpbnRlZ3JhdGlvbiBzdWl0ZSwgd2hpY2ggaGFzIHRvIHJ1biBpbiBzZXF1ZW5jZSBhY3Jvc3NcbiAqIHRoZSB3aG9sZSBmbGVldCBhbmQgc28gY2Fubm90IGJlIHBhcnQgb2YgYSBjb21tYW5kIHJ1biBjYXN1YWxseS5cbiAqXG4gKiBUaGUgdGVzdHMgcnVuIE9OQ0UsIHRocm91Z2ggYHRlc3Q6Y292ZXJhZ2VgIHdoZXJlIHRoZSBwcm9qZWN0IGRlZmluZXMgaXQgYW5kIHRocm91Z2ggYHRlc3RgIG90aGVyd2lzZS5cbiAqIFJ1bm5pbmcgYm90aCwgYXMgdGhpcyBkaWQgdW50aWwgMjAyNi0wOS0wNSwgd2FzIGEgZHVwbGljYXRlIGV2ZXJ5d2hlcmUgaXQgbWF0dGVyZWQ6IGEgcHJvamVjdCBzY29wZXMgaXRzXG4gKiB0d28gdGVzdCBzY3JpcHRzIHRvIHRoZSBzYW1lIHZpdGVzdCBwcm9qZWN0cyBcdTIwMTQgZXZlcnkgcmVwbyBpbiB0aGlzIHdvcmtzcGFjZSBwYXNzZXMgdGhlIHNhbWUgYHByb2plY3RzYFxuICogYXJyYXkgdG8gYm90aCBcdTIwMTQgc28gYHRlc3Q6Y292ZXJhZ2VgIGlzIGB0ZXN0YCBwbHVzIHRoZSB0aHJlc2hvbGQgZmxhZ3MsIG92ZXIgdGhlIGlkZW50aWNhbCBmaWxlcy4gSXQgYnV5c1xuICogbm8gZmFpbC1mYXN0IGVpdGhlciwgYmVjYXVzZSB0aGUgY292ZXJhZ2UgcnVuIGZhaWxzIG9uIGV4YWN0bHkgdGhlIGZhaWx1cmVzIHRoZSBwbGFpbiBydW4gd291bGQgaGF2ZVxuICogY2F1Z2h0LiBUaGUgb25lIHRoaW5nIGxvc3QgaXMgdGhlIGFiaWxpdHkgdG8gc3dpdGNoIG9mZiBvbmx5IHRoZSBjb3ZlcmFnZSBoYWxmOiBgVEVTVF9DT1ZFUkFHRT0wYCBub3dcbiAqIHR1cm5zIG9mZiB0aGUgZ2F0ZSdzIHdob2xlIHRlc3Qgc3RlcCByYXRoZXIgdGhhbiBkZW1vdGluZyBpdCB0byBgdGVzdGAuXG4gKi9cblxuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSAnbm9kZTp1dGlsJztcblxuaW1wb3J0IHtcbiAgbnBtUnVuLFxuICBucG1SdW5PcHRpb25hbCxcbiAgTnBtUnVuT3B0aW9uYWxSZXN1bHRcbn0gZnJvbSAnLi9ucG0tcnVuLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2F0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGJ1aWxkLiBUaGUgYnVpbGQgaXMgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrIFx1MjAxNCBpdCBpcyBrZXB0IGluIHRoZSBnYXRlIGJlY2F1c2UgaXQgaXNcbiAgICogdGhlIG9ubHkgc3RlcCB0aGF0IHR5cGUtY2hlY2tzIHRoZSBwcm9qZWN0LCBhbmQgYSBncmVlbiBsaW50IGlzIG5vdCBhIHR5cGUtY2hlY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgdmVyaWZpY2F0aW9uIGNoZWNrcy4gV2hlbiBgZmFsc2VgLCBvbmx5IHRoZSBidWlsZCBydW5zLCB3aGljaCBpcyB3aGF0XG4gICAqIGBucG0gcnVuIHZlcnNpb24gLS0gLS1uby1jaGVja3NgIGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUnVuQ2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGludGVncmF0aW9uIHRlc3Qgc3VpdGUuIE9mZiBieSBkZWZhdWx0OiBpbnRlZ3JhdGlvbiBydW5zIGhhdmUgdG8gYmUgc2VyaWFsaXplZFxuICAgKiBhY3Jvc3MgdGhlIHdob2xlIHNldCBvZiBzaWJsaW5nIHJlcG9zaXRvcmllcywgc28gYSBnYXRlIHRoYXQgYWx3YXlzIHJhbiB0aGVtIHdvdWxkIGNvbGxpZGUgd2l0aFxuICAgKiBhbm90aGVyIHNlc3Npb24ncyBydW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHZlcmlmaWNhdGlvbiBzZXF1ZW5jZSB0aGF0IGBucG0gcnVuIHZlcnNpb25gIHJ1bnMgYXMgaXRzIHByZWZsaWdodC5cbiAqXG4gKiBUaGUgb3JkZXIgaXMgZGVsaWJlcmF0ZTogdGhlIGNoZWNrcyB0aGF0IGZpbmlzaCBpbiBzZWNvbmRzIChgZm9ybWF0OmNoZWNrYCwgYHNwZWxsY2hlY2tgLCBgbGludDptZGApIHJ1blxuICogZmlyc3QsIHNvIGEgdHlwbyBmYWlscyB0aGUgZ2F0ZSBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGFmdGVyIHRoZSBjb3ZlcmFnZSBydW4uIEVhY2ggc3RlcCBpcyBkaXNwYXRjaGVkXG4gKiB0aHJvdWdoIHRoZSBwYWNrYWdlIG1hbmFnZXIsIHNvIGEgcHJvamVjdCBvdmVycmlkaW5nIG9uZSBvZiB0aGVzZSBzY3JpcHRzIGdldHMgaXRzIG93biB2ZXJzaW9uLCBhbmQgZWFjaFxuICogc3RlcCBjYXJyaWVzIGl0cyBvd24gZW52aXJvbm1lbnQgb2ZmIHN3aXRjaC5cbiAqXG4gKiBUaGUgc3RlcHMgdGhhdCBhcmUgcnVuIHdpdGgge0BsaW5rIG5wbVJ1bk9wdGlvbmFsfSBhcmUgc2tpcHBlZCB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGRlZmluZSB0aGVtOyB0aGVcbiAqIHJlc3QgYXJlIHJlcXVpcmVkLiBUaGUgdGVzdCBzdGVwIGlzIHRoZSBvbmUgcGxhY2UgdGhhdCByZWFkcyB0aGF0IHNraXA6IGB0ZXN0OmNvdmVyYWdlYCBpcyBwcmVmZXJyZWQsIGFuZFxuICogYHRlc3RgIHJ1bnMgb25seSBhcyBpdHMgZmFsbGJhY2ssIHNvIHRoZSBzdWl0ZSBpcyBuZXZlciBydW4gdHdpY2UuIFRoZSB1bml0IHRlc3RzIHN0YXkgYWhlYWQgb2ZcbiAqIGB0ZXN0OmludGVncmF0aW9uYCBmb3IgdGhlIHNhbWUgZmFzdGVzdC1maXJzdCByZWFzb24gXHUyMDE0IGEgYnJva2VuIHVuaXQgdGVzdCBzaG91bGQgZmFpbCBiZWZvcmUgYW5cbiAqIGludGVncmF0aW9uIHN1aXRlIGlzIHN0YXJ0ZWQsIG5vdCBhZnRlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgR2F0ZU9wdGlvbnN9IGNvbnRyb2xsaW5nIHdoaWNoIHN0ZXBzIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBzdGVwIGhhcyBwYXNzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnYXRlKG9wdGlvbnM6IEdhdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHNob3VsZEJ1aWxkID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHMgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIGlmIChzaG91bGRCdWlsZCkge1xuICAgIGF3YWl0IG5wbVJ1bignYnVpbGQnKTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5DaGVja3MpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgnZmluZC1vdmVyZXhwb3NlZCcpO1xuXG4gICAgaWYgKGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmNvdmVyYWdlJykgPT09IE5wbVJ1bk9wdGlvbmFsUmVzdWx0LlNraXBwZWQpIHtcbiAgICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHMpIHtcbiAgICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0aGUgZ2F0ZSBzY3JpcHQuXG4gKlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQge0BsaW5rIEdhdGVPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2F0ZUFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IEdhdGVPcHRpb25zIHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGFyZ3NgIGlzIHRoZSBvcHRpb24gbmFtZSBOb2RlJ3MgYHBhcnNlQXJnc2AgcmVhZHMuXG4gICAgYXJnczogJGFyZ3VtZW50cyxcbiAgICBvcHRpb25zOiB7XG4gICAgICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoZWNrcyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSlcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwQkEsdUJBQTBCO0FBRTFCLHFCQUlPO0FBaURQLGVBQXNCLEtBQUssVUFBdUIsQ0FBQyxHQUFrQjtBQUNuRSxRQUFNO0FBQUEsSUFDSixjQUFjO0FBQUEsSUFDZCxrQkFBa0I7QUFBQSxJQUNsQiw0QkFBNEI7QUFBQSxFQUM5QixJQUFJO0FBRUosTUFBSSxpQkFBaUI7QUFDbkIsY0FBTSx1QkFBTyxjQUFjO0FBQzNCLGNBQU0sdUJBQU8sWUFBWTtBQUN6QixjQUFNLHVCQUFPLFNBQVM7QUFBQSxFQUN4QjtBQUVBLE1BQUksYUFBYTtBQUNmLGNBQU0sdUJBQU8sT0FBTztBQUFBLEVBQ3RCO0FBRUEsTUFBSSxpQkFBaUI7QUFDbkIsY0FBTSx1QkFBTyxNQUFNO0FBQ25CLGNBQU0sK0JBQWUsa0JBQWtCO0FBRXZDLFFBQUksVUFBTSwrQkFBZSxlQUFlLE1BQU0sb0NBQXFCLFNBQVM7QUFDMUUsZ0JBQU0sK0JBQWUsTUFBTTtBQUFBLElBQzdCO0FBRUEsUUFBSSwyQkFBMkI7QUFDN0IsZ0JBQU0sK0JBQWUsa0JBQWtCO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLG1CQUFtQixZQUFtQztBQUNwRSxRQUFNLEVBQUUsT0FBTyxRQUFJLDRCQUFVO0FBQUE7QUFBQSxJQUUzQixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsTUFDUCxZQUFZLEVBQUUsTUFBTSxVQUFVO0FBQUEsTUFDOUIsYUFBYSxFQUFFLE1BQU0sVUFBVTtBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTztBQUFBLElBQ0wsYUFBYSxFQUFFLE9BQU8sVUFBVSxLQUFLO0FBQUEsSUFDckMsaUJBQWlCLEVBQUUsT0FBTyxXQUFXLEtBQUs7QUFBQSxFQUM1QztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|