obsidian-integration-testing 12.0.0 → 12.1.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/dist/lib/cjs/adb-device-list.cjs +54 -0
- package/dist/lib/cjs/adb-device-list.d.cts +72 -0
- package/dist/lib/cjs/android-sdk.cjs +52 -0
- package/dist/lib/cjs/android-sdk.d.cts +29 -0
- package/dist/lib/cjs/app-startup-progress.cjs +87 -0
- package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
- package/dist/lib/cjs/appium-server-marker.cjs +29 -32
- package/dist/lib/cjs/appium-server-marker.d.cts +22 -0
- package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
- package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
- package/dist/lib/cjs/community-plugin-registry.cjs +1 -1
- package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
- package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
- package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
- package/dist/lib/cjs/config-directory.cjs +46 -0
- package/dist/lib/cjs/config-directory.d.cts +45 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
- package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
- package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
- package/dist/lib/cjs/device-readiness.cjs +38 -3
- package/dist/lib/cjs/device-readiness.d.cts +83 -9
- package/dist/lib/cjs/emulator-arguments.cjs +6 -2
- package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
- package/dist/lib/cjs/emulator-backend.cjs +71 -0
- package/dist/lib/cjs/emulator-backend.d.cts +76 -0
- package/dist/lib/cjs/emulator-liveness.cjs +72 -0
- package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
- package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
- package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
- package/dist/lib/cjs/global-setup-core.cjs +30 -30
- package/dist/lib/cjs/global-setup-core.d.cts +27 -2
- package/dist/lib/cjs/headless-vault-config.cjs +51 -0
- package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
- package/dist/lib/cjs/index.cjs +12 -1
- package/dist/lib/cjs/index.d.cts +6 -1
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +14 -2
- package/dist/lib/cjs/mobile-input.d.cts +5 -9
- package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.cjs +52 -3
- package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
- package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
- package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
- package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
- package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
- package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
- package/dist/lib/cjs/parent-liveness.cjs +42 -5
- package/dist/lib/cjs/parent-liveness.d.cts +37 -5
- package/dist/lib/cjs/port-owner.cjs +61 -0
- package/dist/lib/cjs/port-owner.d.cts +47 -0
- package/dist/lib/cjs/process-capture.cjs +62 -0
- package/dist/lib/cjs/process-capture.d.cts +83 -0
- package/dist/lib/cjs/process-exit-message.cjs +14 -8
- package/dist/lib/cjs/process-exit-message.d.cts +37 -3
- package/dist/lib/cjs/process-liveness.cjs +51 -0
- package/dist/lib/cjs/process-liveness.d.cts +18 -0
- package/dist/lib/cjs/run-version-matrix.cjs +1 -1
- package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
- package/dist/lib/cjs/teardown-verdict.cjs +53 -0
- package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
- package/dist/lib/cjs/temporary-vault.cjs +43 -8
- package/dist/lib/cjs/temporary-vault.d.cts +47 -5
- package/dist/lib/cjs/transport-appium.cjs +102 -17
- package/dist/lib/cjs/transport-appium.d.cts +53 -3
- package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
- package/dist/lib/cjs/transport-factory.cjs +951 -133
- package/dist/lib/cjs/transport-options.cjs +11 -3
- package/dist/lib/cjs/transport-options.d.cts +131 -12
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +7 -1
- package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
- package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
- package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
- package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +2 -2
- package/dist/lib/cjs/webview-cdp.cjs +6 -7
- package/dist/lib/cjs/webview-cdp.d.cts +5 -1
- package/dist/lib/esm/adb-device-list.d.mts +72 -0
- package/dist/lib/esm/adb-device-list.mjs +28 -0
- package/dist/lib/esm/android-sdk.d.mts +29 -0
- package/dist/lib/esm/android-sdk.mjs +18 -0
- package/dist/lib/esm/app-startup-progress.d.mts +128 -0
- package/dist/lib/esm/app-startup-progress.mjs +59 -0
- package/dist/lib/esm/appium-server-marker.d.mts +22 -0
- package/dist/lib/esm/appium-server-marker.mjs +28 -22
- package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
- package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
- package/dist/lib/esm/community-plugin-registry.d.mts +1 -1
- package/dist/lib/esm/community-plugin-registry.mjs +1 -1
- package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
- package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
- package/dist/lib/esm/config-directory.d.mts +45 -0
- package/dist/lib/esm/config-directory.mjs +21 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
- package/dist/lib/esm/connect-to-cdp.mjs +13 -7
- package/dist/lib/esm/demo-vault-bootstrap.d.mts +3 -2
- package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
- package/dist/lib/esm/demo-vault-populate.mjs +3 -2
- package/dist/lib/esm/device-readiness.d.mts +83 -9
- package/dist/lib/esm/device-readiness.mjs +34 -2
- package/dist/lib/esm/emulator-arguments.d.mts +26 -0
- package/dist/lib/esm/emulator-arguments.mjs +6 -2
- package/dist/lib/esm/emulator-backend.d.mts +76 -0
- package/dist/lib/esm/emulator-backend.mjs +45 -0
- package/dist/lib/esm/emulator-liveness.d.mts +158 -0
- package/dist/lib/esm/emulator-liveness.mjs +47 -0
- package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
- package/dist/lib/esm/emulator-snapshot.mjs +32 -0
- package/dist/lib/esm/global-setup-core.d.mts +27 -2
- package/dist/lib/esm/global-setup-core.mjs +34 -35
- package/dist/lib/esm/headless-vault-config.d.mts +67 -0
- package/dist/lib/esm/headless-vault-config.mjs +31 -0
- package/dist/lib/esm/index.d.mts +6 -1
- package/dist/lib/esm/index.mjs +11 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.d.mts +5 -9
- package/dist/lib/esm/mobile-input.mjs +14 -2
- package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
- package/dist/lib/esm/obsidian-instance.d.mts +12 -0
- package/dist/lib/esm/obsidian-instance.mjs +55 -3
- package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
- package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
- package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
- package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
- package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
- package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
- package/dist/lib/esm/owned-vault-seed.mjs +9 -5
- package/dist/lib/esm/parent-liveness.d.mts +37 -5
- package/dist/lib/esm/parent-liveness.mjs +42 -5
- package/dist/lib/esm/port-owner.d.mts +47 -0
- package/dist/lib/esm/port-owner.mjs +36 -0
- package/dist/lib/esm/process-capture.d.mts +83 -0
- package/dist/lib/esm/process-capture.mjs +38 -0
- package/dist/lib/esm/process-exit-message.d.mts +37 -3
- package/dist/lib/esm/process-exit-message.mjs +13 -8
- package/dist/lib/esm/process-liveness.d.mts +18 -0
- package/dist/lib/esm/process-liveness.mjs +17 -0
- package/dist/lib/esm/run-version-matrix.d.mts +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +1 -1
- package/dist/lib/esm/teardown-verdict.d.mts +69 -0
- package/dist/lib/esm/teardown-verdict.mjs +28 -0
- package/dist/lib/esm/temporary-vault.d.mts +47 -5
- package/dist/lib/esm/temporary-vault.mjs +43 -8
- package/dist/lib/esm/transport-appium.d.mts +53 -3
- package/dist/lib/esm/transport-appium.mjs +108 -17
- package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
- package/dist/lib/esm/transport-factory.mjs +995 -138
- package/dist/lib/esm/transport-options.d.mts +131 -12
- package/dist/lib/esm/transport-options.mjs +9 -2
- package/dist/lib/esm/transport.d.mts +7 -1
- package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
- package/dist/lib/esm/vault-plugin-install.mjs +20 -0
- package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
- package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
- package/dist/lib/esm/version-matrix.d.mts +2 -2
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +5 -1
- package/dist/lib/esm/webview-cdp.mjs +6 -7
- package/package.json +24 -23
- package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
- package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
- package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
- package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
- package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
- package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
- package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
- package/dist/lib/esm/obsidian-namespace.mjs +0 -1
|
@@ -33,6 +33,14 @@ export interface AppiumServerMarker {
|
|
|
33
33
|
When the server was started (`Date.now()` epoch milliseconds).
|
|
34
34
|
*/
|
|
35
35
|
readonly startedAtInMilliseconds: number;
|
|
36
|
+
/**
|
|
37
|
+
* When a run tried to stop this server and could not verify it exited
|
|
38
|
+
* (`Date.now()` epoch milliseconds), or `undefined` when no stop has failed.
|
|
39
|
+
*
|
|
40
|
+
* Its presence means the server is a **known-doomed leftover**: it was ours,
|
|
41
|
+
* we asked it to die, and it did not. See {@link recordAppiumServerStopAttempt}.
|
|
42
|
+
*/
|
|
43
|
+
readonly stopAttemptedAtInMilliseconds?: number | undefined;
|
|
36
44
|
}
|
|
37
45
|
/**
|
|
38
46
|
* Parameters for {@link writeAppiumServerMarker}.
|
|
@@ -72,6 +80,20 @@ export declare function clearAppiumServerMarker(port: number): void;
|
|
|
72
80
|
* @returns The marker, or `undefined` when there is none, it is unreadable, or it does not describe this port.
|
|
73
81
|
*/
|
|
74
82
|
export declare function readAppiumServerMarker(port: number): AppiumServerMarker | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Records that a run tried to stop the marked server and could not verify it
|
|
85
|
+
* exited — **instead of** clearing the marker.
|
|
86
|
+
*
|
|
87
|
+
* Clearing it would be the worst of both worlds: the leftover keeps serving, and
|
|
88
|
+
* the next run reads it as a foreign, user-managed server it must never touch
|
|
89
|
+
* (`checkIsHarnessOwnedAppiumServer` needs the marker to convict it). Keeping
|
|
90
|
+
* the marker, stamped, says exactly what is true — this is ours, and it outlived
|
|
91
|
+
* our teardown — which is what lets the next run refuse to adopt it and replace
|
|
92
|
+
* it instead.
|
|
93
|
+
*
|
|
94
|
+
* @param port - The Appium server port.
|
|
95
|
+
*/
|
|
96
|
+
export declare function recordAppiumServerStopAttempt(port: number): void;
|
|
75
97
|
/**
|
|
76
98
|
* Records the server this run just started, stamping it with the current time so
|
|
77
99
|
* a later run can report how long it has been up.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var avd_probe_verdict_exports = {};
|
|
20
|
+
__export(avd_probe_verdict_exports, {
|
|
21
|
+
buildAvdProbeSummary: () => buildAvdProbeSummary,
|
|
22
|
+
buildUnreadableDevicesMessage: () => buildUnreadableDevicesMessage,
|
|
23
|
+
checkIsEmulatorDeviceId: () => checkIsEmulatorDeviceId,
|
|
24
|
+
classifyAvdProbe: () => classifyAvdProbe,
|
|
25
|
+
resolveAvdProbeVerdict: () => resolveAvdProbeVerdict
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(avd_probe_verdict_exports);
|
|
28
|
+
var import_type_guards = require("./type-guards.cjs");
|
|
29
|
+
const EMULATOR_DEVICE_ID_PATTERN = /^emulator-\d+$/;
|
|
30
|
+
function buildAvdProbeSummary(results) {
|
|
31
|
+
if (results.length === 0) {
|
|
32
|
+
return "no devices";
|
|
33
|
+
}
|
|
34
|
+
return results.map((result) => `${result.deviceId}=${result.outcome}`).join(", ");
|
|
35
|
+
}
|
|
36
|
+
function buildUnreadableDevicesMessage(params) {
|
|
37
|
+
const deviceList = params.unreadableDeviceIds.join(", ");
|
|
38
|
+
const isSingle = params.unreadableDeviceIds.length === 1;
|
|
39
|
+
const subject = isSingle ? `device ${deviceList}` : `devices ${deviceList}`;
|
|
40
|
+
const command = isSingle ? `adb -s ${deviceList} emu avd name` : "adb -s <device> emu avd name";
|
|
41
|
+
const holder = isSingle ? "it is" : "one of them is";
|
|
42
|
+
const remedy = isSingle ? "Kill the unresponsive device" : "Kill the unresponsive devices";
|
|
43
|
+
return `AVD "${params.avdName}": ${subject} did not answer \`${command}\` within ${String(params.probeTimeoutInMilliseconds)}ms (retried once), so this run cannot tell whether ${holder} already serving that AVD. Starting an emulator anyway would collide (\`FATAL | Running multiple emulators with the same AVD is an experimental feature\`), which the emulator reports only to its own stdout. ${remedy}, or run \`adb kill-server\`, then retry.`;
|
|
44
|
+
}
|
|
45
|
+
function checkIsEmulatorDeviceId(deviceId) {
|
|
46
|
+
return EMULATOR_DEVICE_ID_PATTERN.test(deviceId);
|
|
47
|
+
}
|
|
48
|
+
function classifyAvdProbe(params) {
|
|
49
|
+
if (!checkIsEmulatorDeviceId(params.deviceId)) {
|
|
50
|
+
return "not-an-emulator";
|
|
51
|
+
}
|
|
52
|
+
if (params.probedAvdName === void 0 || params.probedAvdName.length === 0) {
|
|
53
|
+
return "no-answer";
|
|
54
|
+
}
|
|
55
|
+
return params.probedAvdName === params.avdName ? "match" : "other-avd";
|
|
56
|
+
}
|
|
57
|
+
function resolveAvdProbeVerdict(results) {
|
|
58
|
+
const unreadableDeviceIds = [];
|
|
59
|
+
for (const result of results) {
|
|
60
|
+
switch (result.outcome) {
|
|
61
|
+
case "match": {
|
|
62
|
+
return { deviceId: result.deviceId, verdict: "reuse" };
|
|
63
|
+
}
|
|
64
|
+
case "no-answer": {
|
|
65
|
+
unreadableDeviceIds.push(result.deviceId);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case "not-an-emulator":
|
|
69
|
+
case "other-avd": {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
default: {
|
|
73
|
+
return (0, import_type_guards.assertNever)(result.outcome);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (unreadableDeviceIds.length > 0) {
|
|
78
|
+
return { unreadableDeviceIds, verdict: "refuse" };
|
|
79
|
+
}
|
|
80
|
+
return { verdict: "start-new" };
|
|
81
|
+
}
|
|
82
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
83
|
+
0 && (module.exports = {
|
|
84
|
+
buildAvdProbeSummary,
|
|
85
|
+
buildUnreadableDevicesMessage,
|
|
86
|
+
checkIsEmulatorDeviceId,
|
|
87
|
+
classifyAvdProbe,
|
|
88
|
+
resolveAvdProbeVerdict
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1wcm9iZS12ZXJkaWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgQVZEIGFkb3B0aW9uIHByb2JlIFx1MjAxNCBkZWNpZGluZywgZnJvbSB3aGF0IGVhY2hcbiAqIGNvbm5lY3RlZCBkZXZpY2UgYW5zd2VyZWQsIHdoZXRoZXIgdGhpcyBydW4gbWF5IHJldXNlIG9uZSwgbXVzdCBzdGFydCBpdHNcbiAqIG93biBlbXVsYXRvciwgb3IgY2Fubm90IHNhZmVseSBkbyBlaXRoZXIuXG4gKlxuICogVGhlIHByb2JlIChgYWRiIC1zIDxkZXZpY2U+IGVtdSBhdmQgbmFtZWApIHVzZWQgdG8gZGlzY2FyZCBpdHMgZXJyb3IgYW5kXG4gKiByZXNvbHZlIGAnJ2AsIHNvIGEgY2FsbCB0aGF0ICoqbmV2ZXIgYW5zd2VyZWQqKiB3YXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAqIHRoYXQgYW5zd2VyZWQgKlwiYSBkaWZmZXJlbnQgQVZEXCIqLiBCb3RoIGZlbGwgdGhyb3VnaCB0byBcInN0YXJ0IGEgbmV3XG4gKiBlbXVsYXRvclwiLCB3aGljaCBjb2xsaWRlcyB3aXRoIHRoZSBlbXVsYXRvciBhbHJlYWR5IHNlcnZpbmcgdGhhdCBBVkQ6XG4gKlxuICogYGBgdGV4dFxuICogMTQ6Mjc6NTIuMTE0ICBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCJvYnNpZGlhbl90ZXN0XCIuLi4gKGNvbm5lY3RlZDogW2VtdWxhdG9yLTU1NTRdKVxuICogMTQ6Mjc6NTcuMTcwICBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uXG4gKiBgYGBcbiAqXG4gKiA1LjA1NnMgYXBhcnQgXHUyMDE0IGV4YWN0bHkgdGhlIHByb2JlJ3Mgb3duIHRpbWVvdXQuIFRoZSBsYXVuY2ggdGhhdCBmb2xsb3dlZCBoaXRcbiAqIGBGQVRBTCB8IFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbFxuICogZmVhdHVyZWAsIHdoaWNoIHRoZSBlbXVsYXRvciB3cml0ZXMgdG8gaXRzIG93biBzdGRvdXQuICoqQSBwcm9iZSB0aGF0IG5ldmVyXG4gKiBhbnN3ZXJlZCBpcyBub3QgZXZpZGVuY2UgdGhhdCB0aGUgYW5zd2VyIGlzIG5vKiogXHUyMDE0IHRoZSBzYW1lIGRpc3RpbmN0aW9uXG4gKiBgYWRiLWRldmljZS1saXN0LnRzYCBkcmF3cyBiZXR3ZWVuIGBvZmZsaW5lYCBhbmQgYWJzZW50LCBhbmQgdGhlIHNhbWUgb25lXG4gKiB0aGUgY29ubmVjdGl2aXR5IHByb2JlIGRyYXdzIGJldHdlZW4gYSBmYWlsZWQgZHVtcCBhbmQgYSBtaXNzaW5nIG5ldHdvcmsuXG4gKlxuICogV29yc2UsIHRoZSBwcm9iZSBpcyBhc2tlZCBpdHMgcXVlc3Rpb24gcHJlY2lzZWx5IHdoZW4gdGhlIGd1ZXN0IGlzIGxlYXN0IGFibGVcbiAqIHRvIGFuc3dlciBpdCBcdTIwMTQgYSB3ZWRnZWQgZW11bGF0b3IgdGltZXMgb3V0IGV2ZXJ5IGBhZGJgIGNhbGwgXHUyMDE0IHdoaWNoIGlzIHRoZVxuICogY29uZGl0aW9uIHVuZGVyIHdoaWNoIGEgY29sbGlkaW5nIGxhdW5jaCBkb2VzIHRoZSBtb3N0IGRhbWFnZS5cbiAqXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCAoZXhjbHVkZWQgZnJvbVxuICogdW5pdCB0ZXN0cykgc28gdGhlIGNsYXNzaWZpY2F0aW9uIHN0YXlzIHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZlxuICogc2hlbGxzIG91dCB0byBgYWRiYC5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcblxuLyoqXG4gKiBXaGF0IG9uZSBkZXZpY2UgYW5zd2VyZWQgd2hlbiBhc2tlZCB3aGljaCBBVkQgaXQgaXMgc2VydmluZy5cbiAqXG4gKiBgbm90LWFuLWVtdWxhdG9yYCBhbmQgYG90aGVyLWF2ZGAgYXJlIGJvdGggbGVnaXRpbWF0ZSBza2lwczsgb25seVxuICogYG5vLWFuc3dlcmAgaXMgdGhlIHNpbGVuY2UgdGhhdCBtdXN0IG5ldmVyIGJlIHJlYWQgYXMgb25lLlxuICovXG5leHBvcnQgdHlwZSBBdmRQcm9iZU91dGNvbWUgPSAnbWF0Y2gnIHwgJ25vLWFuc3dlcicgfCAnbm90LWFuLWVtdWxhdG9yJyB8ICdvdGhlci1hdmQnO1xuXG4vKipcbiAqIFRoZSBydW4gY2Fubm90IHRlbGwgd2hldGhlciB0aGUgQVZEIGlzIGFscmVhZHkgcnVubmluZywgc28gaXQgbXVzdCBub3QgbGF1bmNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2ZFByb2JlUmVmdXNlVmVyZGljdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlcyB0aGF0IGNvdWxkIG5vdCBiZSByZWFkLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBydWxlZCBvdXQgYXMgdGhlIEFWRCdzIGhvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHVucmVhZGFibGVEZXZpY2VJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAncmVmdXNlJztcbn1cblxuLyoqXG4gKiBPbmUgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVJlc3VsdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlIFVESUQsIGUuZy4gYGVtdWxhdG9yLTU1NTRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgV2hhdCB0aGUgZGV2aWNlIGFuc3dlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0Y29tZTogQXZkUHJvYmVPdXRjb21lO1xufVxuXG4vKipcbiAqIFRoZSBBVkQgaXMgYWxyZWFkeSBydW5uaW5nLCBvbiBhIGRldmljZSB0aGlzIHJ1biBtYXkgYWRvcHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXZkUHJvYmVSZXVzZVZlcmRpY3Qge1xuICAvKipcbiAgVGhlIGRldmljZSBhbHJlYWR5IHNlcnZpbmcgdGhlIHJlcXVlc3RlZCBBVkQuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAncmV1c2UnO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGRldmljZSBhbnN3ZXJlZCwgbm9uZSBpcyBzZXJ2aW5nIHRoZSBBVkQsIHNvIGxhdW5jaGluZyBjYW5ub3QgY29sbGlkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVN0YXJ0TmV3VmVyZGljdCB7XG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAnc3RhcnQtbmV3Jztcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBydW4gbWF5IGRvLCBnaXZlbiBldmVyeSBkZXZpY2UncyBwcm9iZSBvdXRjb21lLlxuICovXG5leHBvcnQgdHlwZSBBdmRQcm9iZVZlcmRpY3QgPSBBdmRQcm9iZVJlZnVzZVZlcmRpY3QgfCBBdmRQcm9iZVJldXNlVmVyZGljdCB8IEF2ZFByb2JlU3RhcnROZXdWZXJkaWN0O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgVGhlIEFWRCB0aGUgcnVuIHdhbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGJ1ZGdldCBlYWNoIHByb2JlIGF0dGVtcHQgd2FzIGdpdmVuLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBwcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlcyB0aGF0IGRpZCBub3QgYW5zd2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5yZWFkYWJsZURldmljZUlkczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNsYXNzaWZ5QXZkUHJvYmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzaWZ5QXZkUHJvYmVQYXJhbXMge1xuICAvKipcbiAgVGhlIEFWRCB0aGUgcnVuIHdhbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoYXQgd2FzIHByb2JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBBVkQgbmFtZSB0aGUgZGV2aWNlIGFuc3dlcmVkLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGRpZCBub3QgYW5zd2VyIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JlZEF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgZGV2aWNlIElEcyBhZGIgZ2l2ZXMgZW11bGF0b3JzIHN0YXJ0ZWQgdGhlIHdheSB0aGlzIGhhcm5lc3NcbiAqIHN0YXJ0cyB0aGVtOiBgZW11bGF0b3IgLWF2ZCA8bmFtZT5gLCB3aG9zZSBjb25zb2xlIGxhbmRzIG9uIGEgbG9jYWwgcG9ydC5cbiAqXG4gKiBPbmx5IHN1Y2ggYSBkZXZpY2UgY2FuIGNvbGxpZGUgd2l0aCB0aGlzIHJ1bidzIGxhdW5jaCwgc28gb25seSBzdWNoIGEgZGV2aWNlJ3NcbiAqIHNpbGVuY2UgaXMgd29ydGggcmVmdXNpbmcgb3Zlci4gQSBwaHlzaWNhbCBoYW5kc2V0IChhbiBhcmJpdHJhcnkgc2VyaWFsKSBvciBhXG4gKiBUQ1AtYXR0YWNoZWQgZGV2aWNlIGFuc3dlcnMgYGFkYiBcdTIwMjYgZW11IGF2ZCBuYW1lYCB3aXRoIGFuIGVycm9yIGhvd2V2ZXIgaGVhbHRoeVxuICogaXQgaXM7IHJlYWRpbmcgdGhhdCBhcyBcImRpZCBub3QgYW5zd2VyXCIgd291bGQgYmxvY2sgZXZlcnkgcnVuIG9uIGEgaG9zdCB3aXRoIGFcbiAqIHBob25lIHBsdWdnZWQgaW4sIHdoaWNoIGlzIGEgd29yc2UgZGVmZWN0IHRoYW4gdGhlIG9uZSB0aGlzIG1vZHVsZSBmaXhlcy5cbiAqL1xuY29uc3QgRU1VTEFUT1JfREVWSUNFX0lEX1BBVFRFUk4gPSAvXmVtdWxhdG9yLVxcZCskLztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN1bW1hcnkgbGluZSBuYW1pbmcgd2hhdCBlYWNoIGRldmljZSBhbnN3ZXJlZC5cbiAqXG4gKiBUaGUgb2xkIGxvZyBwcmludGVkIG9ubHkgdGhlIGNvbmNsdXNpb24gKGBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZWApLFxuICogd2hpY2ggaXMgZXhhY3RseSB0aGUgbGluZSB0aGF0IHdhcyB3cm9uZzsgcHJpbnRpbmcgdGhlIGV2aWRlbmNlIG5leHQgdG8gaXQgaXNcbiAqIHdoYXQgbWFrZXMgYSBiYWQgY29uY2x1c2lvbiB2aXNpYmxlIHdpdGhvdXQgYSBzZWNvbmQgcnVuLlxuICpcbiAqIEBwYXJhbSByZXN1bHRzIC0gRXZlcnkgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqIEByZXR1cm5zIFRoZSBzdW1tYXJ5LCBvciBgbm8gZGV2aWNlc2Agd2hlbiBub3RoaW5nIHdhcyBjb25uZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF2ZFByb2JlU3VtbWFyeShyZXN1bHRzOiByZWFkb25seSBBdmRQcm9iZVJlc3VsdFtdKTogc3RyaW5nIHtcbiAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdubyBkZXZpY2VzJztcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiBgJHtyZXN1bHQuZGV2aWNlSWR9PSR7cmVzdWx0Lm91dGNvbWV9YCkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHJlZnVzYWwgbWVzc2FnZSBmb3IgZGV2aWNlcyB0aGF0IGNvdWxkIG5vdCBiZSByZWFkLlxuICpcbiAqIE5hbWVzIHRoZSBkZXZpY2UsIHRoZSBBVkQsIHRoZSBidWRnZXQsIHRoZSBjb25zZXF1ZW5jZSBhbmQgdGhlIHJlY292ZXJ5IFx1MjAxNCB0aGVcbiAqIHNoYXBlIGB0ZWFyZG93bi12ZXJkaWN0LnRzYCB1c2VzIGZvciBpdHMgb3duIHdhcm5pbmcsIGJlY2F1c2UgYSBtZXNzYWdlIHRoYXRcbiAqIHN0b3BzIGEgcnVuIGhhcyB0byBsZWF2ZSB0aGUgcmVhZGVyIGFibGUgdG8gdW5ibG9jayBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIEFWRCwgdGhlIHByb2JlIGJ1ZGdldCwgYW5kIHRoZSBkZXZpY2VzIHRoYXQgZGlkIG5vdCBhbnN3ZXIuXG4gKiBAcmV0dXJucyBUaGUgcmVmdXNhbCBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2UocGFyYW1zOiBCdWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZVBhcmFtcyk6IHN0cmluZyB7XG4gIC8qXG4gICAqIFdoZW4gdGhlcmUgaXMgZXhhY3RseSBvbmUgZGV2aWNlIHRoZSBqb2luZWQgbGlzdCBJUyBpdHMgSUQsIHNvIHRoZSBzaW5ndWxhclxuICAgKiB3b3JkaW5nIG5lZWRzIG5vIGluZGV4IGFjY2VzcyBcdTIwMTQgYW5kIG5vIHVucmVhY2hhYmxlIGZhbGxiYWNrIGZvciBvbmUuXG4gICAqL1xuICBjb25zdCBkZXZpY2VMaXN0ID0gcGFyYW1zLnVucmVhZGFibGVEZXZpY2VJZHMuam9pbignLCAnKTtcbiAgY29uc3QgaXNTaW5nbGUgPSBwYXJhbXMudW5yZWFkYWJsZURldmljZUlkcy5sZW5ndGggPT09IDE7XG5cbiAgY29uc3Qgc3ViamVjdCA9IGlzU2luZ2xlID8gYGRldmljZSAke2RldmljZUxpc3R9YCA6IGBkZXZpY2VzICR7ZGV2aWNlTGlzdH1gO1xuICBjb25zdCBjb21tYW5kID0gaXNTaW5nbGUgPyBgYWRiIC1zICR7ZGV2aWNlTGlzdH0gZW11IGF2ZCBuYW1lYCA6ICdhZGIgLXMgPGRldmljZT4gZW11IGF2ZCBuYW1lJztcbiAgY29uc3QgaG9sZGVyID0gaXNTaW5nbGUgPyAnaXQgaXMnIDogJ29uZSBvZiB0aGVtIGlzJztcbiAgY29uc3QgcmVtZWR5ID0gaXNTaW5nbGUgPyAnS2lsbCB0aGUgdW5yZXNwb25zaXZlIGRldmljZScgOiAnS2lsbCB0aGUgdW5yZXNwb25zaXZlIGRldmljZXMnO1xuXG4gIHJldHVybiBgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIjogJHtzdWJqZWN0fSBkaWQgbm90IGFuc3dlciBcXGAke2NvbW1hbmR9XFxgIHdpdGhpbiAke1N0cmluZyhwYXJhbXMucHJvYmVUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zIChyZXRyaWVkIG9uY2UpLCBgXG4gICAgKyBgc28gdGhpcyBydW4gY2Fubm90IHRlbGwgd2hldGhlciAke2hvbGRlcn0gYWxyZWFkeSBzZXJ2aW5nIHRoYXQgQVZELiBTdGFydGluZyBhbiBlbXVsYXRvciBhbnl3YXkgd291bGQgY29sbGlkZSBgXG4gICAgKyAnKGBGQVRBTCB8IFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCksIHdoaWNoIHRoZSBlbXVsYXRvciByZXBvcnRzIG9ubHkgdG8gaXRzIG93biBzdGRvdXQuICdcbiAgICArIGAke3JlbWVkeX0sIG9yIHJ1biBcXGBhZGIga2lsbC1zZXJ2ZXJcXGAsIHRoZW4gcmV0cnkuYDtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgYSBkZXZpY2UgY2FuIGhvbGQgYW4gQVZEIHRoaXMgcnVuIGNvdWxkIGNvbGxpZGUgd2l0aC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8ganVkZ2UuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGEgbG9jYWxseSBzdGFydGVkIGVtdWxhdG9yLCB3aG9zZSBjb25zb2xlIHRoaXMgcnVuIGNhbiBhc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lzRW11bGF0b3JEZXZpY2VJZChkZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTVVMQVRPUl9ERVZJQ0VfSURfUEFUVEVSTi50ZXN0KGRldmljZUlkKTtcbn1cblxuLyoqXG4gKiBDbGFzc2lmaWVzIG9uZSBkZXZpY2UncyBwcm9iZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIEFWRCB3YW50ZWQsIHRoZSBkZXZpY2UgcHJvYmVkLCBhbmQgd2hhdCBpdCBhbnN3ZXJlZC5cbiAqIEByZXR1cm5zIFRoZSBvdXRjb21lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlBdmRQcm9iZShwYXJhbXM6IENsYXNzaWZ5QXZkUHJvYmVQYXJhbXMpOiBBdmRQcm9iZU91dGNvbWUge1xuICBpZiAoIWNoZWNrSXNFbXVsYXRvckRldmljZUlkKHBhcmFtcy5kZXZpY2VJZCkpIHtcbiAgICByZXR1cm4gJ25vdC1hbi1lbXVsYXRvcic7XG4gIH1cblxuICBpZiAocGFyYW1zLnByb2JlZEF2ZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXMucHJvYmVkQXZkTmFtZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ25vLWFuc3dlcic7XG4gIH1cblxuICByZXR1cm4gcGFyYW1zLnByb2JlZEF2ZE5hbWUgPT09IHBhcmFtcy5hdmROYW1lID8gJ21hdGNoJyA6ICdvdGhlci1hdmQnO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hhdCB0aGUgcnVuIG1heSBkbywgZnJvbSBldmVyeSBkZXZpY2UncyBwcm9iZSBvdXRjb21lLlxuICpcbiAqICoqQSBtYXRjaCB3aW5zIG92ZXIgYW4gdW5yZWFkYWJsZSBzaWJsaW5nLioqIE9uY2UgdGhlIHJlcXVlc3RlZCBBVkQgaXMgZm91bmRcbiAqIGFuZCByZXVzYWJsZSwgYW4gdW5yZWxhdGVkIHdlZGdlZCBkZXZpY2UgaXMgc29tZWJvZHkgZWxzZSdzIHByb2JsZW0gYW5kIG11c3RcbiAqIG5vdCBibG9jayBhIHJ1biB0aGF0IGhhcyBldmVyeXRoaW5nIGl0IG5lZWRzIFx1MjAxNCB0aGUgc2FtZSByZXN0cmFpbnRcbiAqIGBlbXVsYXRvci1iYWNrZW5kLnRzYCBzaG93cyBpbiBuZXZlciBzd2VlcGluZyBhIGBxZW11KmAgaXQgZG9lcyBub3Qgb3duLiBPbmx5XG4gKiB3aGVuIG5vdGhpbmcgbWF0Y2hlZCBkb2VzIHNpbGVuY2UgYmVjb21lIGRlY2lzaXZlLCBiZWNhdXNlIG9ubHkgdGhlbiB3b3VsZCB0aGVcbiAqIHJ1biBnbyBvbiB0byBsYXVuY2guXG4gKlxuICogQHBhcmFtIHJlc3VsdHMgLSBFdmVyeSBkZXZpY2UncyBwcm9iZSBvdXRjb21lLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXZkUHJvYmVWZXJkaWN0KHJlc3VsdHM6IHJlYWRvbmx5IEF2ZFByb2JlUmVzdWx0W10pOiBBdmRQcm9iZVZlcmRpY3Qge1xuICBjb25zdCB1bnJlYWRhYmxlRGV2aWNlSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBzd2l0Y2ggKHJlc3VsdC5vdXRjb21lKSB7XG4gICAgICBjYXNlICdtYXRjaCc6IHtcbiAgICAgICAgcmV0dXJuIHsgZGV2aWNlSWQ6IHJlc3VsdC5kZXZpY2VJZCwgdmVyZGljdDogJ3JldXNlJyB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbm8tYW5zd2VyJzoge1xuICAgICAgICB1bnJlYWRhYmxlRGV2aWNlSWRzLnB1c2gocmVzdWx0LmRldmljZUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdub3QtYW4tZW11bGF0b3InOlxuICAgICAgY2FzZSAnb3RoZXItYXZkJzoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydE5ldmVyKHJlc3VsdC5vdXRjb21lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodW5yZWFkYWJsZURldmljZUlkcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHsgdW5yZWFkYWJsZURldmljZUlkcywgdmVyZGljdDogJ3JlZnVzZScgfTtcbiAgfVxuXG4gIHJldHVybiB7IHZlcmRpY3Q6ICdzdGFydC1uZXcnIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQ0EseUJBQTRCO0FBd0g1QixNQUFNLDZCQUE2QjtBQVk1QixTQUFTLHFCQUFxQixTQUE0QztBQUMvRSxNQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxRQUFRLElBQUksT0FBTyxPQUFPLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDbEY7QUFZTyxTQUFTLDhCQUE4QixRQUFxRDtBQUtqRyxRQUFNLGFBQWEsT0FBTyxvQkFBb0IsS0FBSyxJQUFJO0FBQ3ZELFFBQU0sV0FBVyxPQUFPLG9CQUFvQixXQUFXO0FBRXZELFFBQU0sVUFBVSxXQUFXLFVBQVUsVUFBVSxLQUFLLFdBQVcsVUFBVTtBQUN6RSxRQUFNLFVBQVUsV0FBVyxVQUFVLFVBQVUsa0JBQWtCO0FBQ2pFLFFBQU0sU0FBUyxXQUFXLFVBQVU7QUFDcEMsUUFBTSxTQUFTLFdBQVcsaUNBQWlDO0FBRTNELFNBQU8sUUFBUSxPQUFPLE9BQU8sTUFBTSxPQUFPLHFCQUFxQixPQUFPLGFBQWEsT0FBTyxPQUFPLDBCQUEwQixDQUFDLHNEQUNyRixNQUFNLGtOQUV0QyxNQUFNO0FBQ2Y7QUFRTyxTQUFTLHdCQUF3QixVQUEyQjtBQUNqRSxTQUFPLDJCQUEyQixLQUFLLFFBQVE7QUFDakQ7QUFRTyxTQUFTLGlCQUFpQixRQUFpRDtBQUNoRixNQUFJLENBQUMsd0JBQXdCLE9BQU8sUUFBUSxHQUFHO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxPQUFPLGtCQUFrQixVQUFhLE9BQU8sY0FBYyxXQUFXLEdBQUc7QUFDM0UsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLE9BQU8sa0JBQWtCLE9BQU8sVUFBVSxVQUFVO0FBQzdEO0FBZU8sU0FBUyx1QkFBdUIsU0FBcUQ7QUFDMUYsUUFBTSxzQkFBZ0MsQ0FBQztBQUV2QyxhQUFXLFVBQVUsU0FBUztBQUM1QixZQUFRLE9BQU8sU0FBUztBQUFBLE1BQ3RCLEtBQUssU0FBUztBQUNaLGVBQU8sRUFBRSxVQUFVLE9BQU8sVUFBVSxTQUFTLFFBQVE7QUFBQSxNQUN2RDtBQUFBLE1BQ0EsS0FBSyxhQUFhO0FBQ2hCLDRCQUFvQixLQUFLLE9BQU8sUUFBUTtBQUN4QztBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLEtBQUssYUFBYTtBQUNoQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFNBQVM7QUFDUCxtQkFBTyxnQ0FBWSxPQUFPLE9BQU87QUFBQSxNQUNuQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxvQkFBb0IsU0FBUyxHQUFHO0FBQ2xDLFdBQU8sRUFBRSxxQkFBcUIsU0FBUyxTQUFTO0FBQUEsRUFDbEQ7QUFFQSxTQUFPLEVBQUUsU0FBUyxZQUFZO0FBQ2hDOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure classification of the AVD adoption probe — deciding, from what each
|
|
5
|
+
* connected device answered, whether this run may reuse one, must start its
|
|
6
|
+
* own emulator, or cannot safely do either.
|
|
7
|
+
*
|
|
8
|
+
* The probe (`adb -s <device> emu avd name`) used to discard its error and
|
|
9
|
+
* resolve `''`, so a call that **never answered** was indistinguishable from one
|
|
10
|
+
* that answered *"a different AVD"*. Both fell through to "start a new
|
|
11
|
+
* emulator", which collides with the emulator already serving that AVD:
|
|
12
|
+
*
|
|
13
|
+
* ```text
|
|
14
|
+
* 14:27:52.114 Checking existing devices for AVD "obsidian_test"... (connected: [emulator-5554])
|
|
15
|
+
* 14:27:57.170 AVD "obsidian_test" not found on any existing device, starting a new emulator...
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* 5.056s apart — exactly the probe's own timeout. The launch that followed hit
|
|
19
|
+
* `FATAL | Running multiple emulators with the same AVD is an experimental
|
|
20
|
+
* feature`, which the emulator writes to its own stdout. **A probe that never
|
|
21
|
+
* answered is not evidence that the answer is no** — the same distinction
|
|
22
|
+
* `adb-device-list.ts` draws between `offline` and absent, and the same one
|
|
23
|
+
* the connectivity probe draws between a failed dump and a missing network.
|
|
24
|
+
*
|
|
25
|
+
* Worse, the probe is asked its question precisely when the guest is least able
|
|
26
|
+
* to answer it — a wedged emulator times out every `adb` call — which is the
|
|
27
|
+
* condition under which a colliding launch does the most damage.
|
|
28
|
+
*
|
|
29
|
+
* Kept separate from the integration-only `transport-factory` (excluded from
|
|
30
|
+
* unit tests) so the classification stays unit-testable — the factory itself
|
|
31
|
+
* shells out to `adb`.
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* What one device answered when asked which AVD it is serving.
|
|
35
|
+
*
|
|
36
|
+
* `not-an-emulator` and `other-avd` are both legitimate skips; only
|
|
37
|
+
* `no-answer` is the silence that must never be read as one.
|
|
38
|
+
*/
|
|
39
|
+
export type AvdProbeOutcome = 'match' | 'no-answer' | 'not-an-emulator' | 'other-avd';
|
|
40
|
+
/**
|
|
41
|
+
* The run cannot tell whether the AVD is already running, so it must not launch.
|
|
42
|
+
*/
|
|
43
|
+
export interface AvdProbeRefuseVerdict {
|
|
44
|
+
/**
|
|
45
|
+
The devices that could not be read, and therefore cannot be ruled out as the AVD's holder.
|
|
46
|
+
*/
|
|
47
|
+
readonly unreadableDeviceIds: string[];
|
|
48
|
+
/**
|
|
49
|
+
Discriminant.
|
|
50
|
+
*/
|
|
51
|
+
readonly verdict: 'refuse';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* One device's probe outcome.
|
|
55
|
+
*/
|
|
56
|
+
export interface AvdProbeResult {
|
|
57
|
+
/**
|
|
58
|
+
The device UDID, e.g. `emulator-5554`.
|
|
59
|
+
*/
|
|
60
|
+
readonly deviceId: string;
|
|
61
|
+
/**
|
|
62
|
+
What the device answered.
|
|
63
|
+
*/
|
|
64
|
+
readonly outcome: AvdProbeOutcome;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The AVD is already running, on a device this run may adopt.
|
|
68
|
+
*/
|
|
69
|
+
export interface AvdProbeReuseVerdict {
|
|
70
|
+
/**
|
|
71
|
+
The device already serving the requested AVD.
|
|
72
|
+
*/
|
|
73
|
+
readonly deviceId: string;
|
|
74
|
+
/**
|
|
75
|
+
Discriminant.
|
|
76
|
+
*/
|
|
77
|
+
readonly verdict: 'reuse';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Every device answered, none is serving the AVD, so launching cannot collide.
|
|
81
|
+
*/
|
|
82
|
+
export interface AvdProbeStartNewVerdict {
|
|
83
|
+
/**
|
|
84
|
+
Discriminant.
|
|
85
|
+
*/
|
|
86
|
+
readonly verdict: 'start-new';
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* What the run may do, given every device's probe outcome.
|
|
90
|
+
*/
|
|
91
|
+
export type AvdProbeVerdict = AvdProbeRefuseVerdict | AvdProbeReuseVerdict | AvdProbeStartNewVerdict;
|
|
92
|
+
/**
|
|
93
|
+
* Parameters for {@link buildUnreadableDevicesMessage}.
|
|
94
|
+
*/
|
|
95
|
+
export interface BuildUnreadableDevicesMessageParams {
|
|
96
|
+
/**
|
|
97
|
+
The AVD the run wanted.
|
|
98
|
+
*/
|
|
99
|
+
readonly avdName: string;
|
|
100
|
+
/**
|
|
101
|
+
The budget each probe attempt was given, in milliseconds.
|
|
102
|
+
*/
|
|
103
|
+
readonly probeTimeoutInMilliseconds: number;
|
|
104
|
+
/**
|
|
105
|
+
The devices that did not answer.
|
|
106
|
+
*/
|
|
107
|
+
readonly unreadableDeviceIds: readonly string[];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parameters for {@link classifyAvdProbe}.
|
|
111
|
+
*/
|
|
112
|
+
export interface ClassifyAvdProbeParams {
|
|
113
|
+
/**
|
|
114
|
+
The AVD the run wants.
|
|
115
|
+
*/
|
|
116
|
+
readonly avdName: string;
|
|
117
|
+
/**
|
|
118
|
+
The device that was probed.
|
|
119
|
+
*/
|
|
120
|
+
readonly deviceId: string;
|
|
121
|
+
/**
|
|
122
|
+
The AVD name the device answered, or `undefined` when it did not answer at all.
|
|
123
|
+
*/
|
|
124
|
+
readonly probedAvdName?: string | undefined;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Builds the summary line naming what each device answered.
|
|
128
|
+
*
|
|
129
|
+
* The old log printed only the conclusion (`not found on any existing device`),
|
|
130
|
+
* which is exactly the line that was wrong; printing the evidence next to it is
|
|
131
|
+
* what makes a bad conclusion visible without a second run.
|
|
132
|
+
*
|
|
133
|
+
* @param results - Every device's probe outcome.
|
|
134
|
+
* @returns The summary, or `no devices` when nothing was connected.
|
|
135
|
+
*/
|
|
136
|
+
export declare function buildAvdProbeSummary(results: readonly AvdProbeResult[]): string;
|
|
137
|
+
/**
|
|
138
|
+
* Builds the refusal message for devices that could not be read.
|
|
139
|
+
*
|
|
140
|
+
* Names the device, the AVD, the budget, the consequence and the recovery — the
|
|
141
|
+
* shape `teardown-verdict.ts` uses for its own warning, because a message that
|
|
142
|
+
* stops a run has to leave the reader able to unblock it.
|
|
143
|
+
*
|
|
144
|
+
* @param params - The AVD, the probe budget, and the devices that did not answer.
|
|
145
|
+
* @returns The refusal message.
|
|
146
|
+
*/
|
|
147
|
+
export declare function buildUnreadableDevicesMessage(params: BuildUnreadableDevicesMessageParams): string;
|
|
148
|
+
/**
|
|
149
|
+
* Decides whether a device can hold an AVD this run could collide with.
|
|
150
|
+
*
|
|
151
|
+
* @param deviceId - The device UDID to judge.
|
|
152
|
+
* @returns `true` for a locally started emulator, whose console this run can ask.
|
|
153
|
+
*/
|
|
154
|
+
export declare function checkIsEmulatorDeviceId(deviceId: string): boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Classifies one device's probe.
|
|
157
|
+
*
|
|
158
|
+
* @param params - The AVD wanted, the device probed, and what it answered.
|
|
159
|
+
* @returns The outcome.
|
|
160
|
+
*/
|
|
161
|
+
export declare function classifyAvdProbe(params: ClassifyAvdProbeParams): AvdProbeOutcome;
|
|
162
|
+
/**
|
|
163
|
+
* Decides what the run may do, from every device's probe outcome.
|
|
164
|
+
*
|
|
165
|
+
* **A match wins over an unreadable sibling.** Once the requested AVD is found
|
|
166
|
+
* and reusable, an unrelated wedged device is somebody else's problem and must
|
|
167
|
+
* not block a run that has everything it needs — the same restraint
|
|
168
|
+
* `emulator-backend.ts` shows in never sweeping a `qemu*` it does not own. Only
|
|
169
|
+
* when nothing matched does silence become decisive, because only then would the
|
|
170
|
+
* run go on to launch.
|
|
171
|
+
*
|
|
172
|
+
* @param results - Every device's probe outcome.
|
|
173
|
+
* @returns The verdict.
|
|
174
|
+
*/
|
|
175
|
+
export declare function resolveAvdProbeVerdict(results: readonly AvdProbeResult[]): AvdProbeVerdict;
|
|
@@ -49,4 +49,4 @@ function selectPluginRepo(params) {
|
|
|
49
49
|
isValidRepoReference,
|
|
50
50
|
selectPluginRepo
|
|
51
51
|
});
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW11bml0eS1wbHVnaW4tcmVnaXN0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIHJlc29sdmluZyBhIGNvbW11bml0eSBwbHVnaW4ncyAqKkdpdEh1YiByZWxlYXNlIGFzc2V0cyoqIGZyb21cbiAqIG5vdGhpbmcgYnV0IGl0cyBwbHVnaW4gaWQgXHUyMDE0IHRoZSBpZCBcdTIxOTIgcmVwbyBsb29rdXAgYW5kIHRoZSBhc3NldCBVUkwgc2hhcGVzLlxuICpcbiAqIEEgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgbmV2ZXIgbGl2ZSBpbiBnaXQ6IGAub2JzaWRpYW4vcGx1Z2lucy8qYCBpcyBnaXRpZ25vcmVkIGluXG4gKiBhIHBsdWdpbiByZXBvLCBzbyBhIGRlbW8gdmF1bHQncyBpbmplY3RlZCBjb21tdW5pdHkgcGx1Z2lucyBleGlzdCBvblxuICogZXhhY3RseSB0aGUgbWFjaGluZSB0aGF0IG9uY2Ugb3BlbmVkIHRoYXQgdmF1bHQgaW4gT2JzaWRpYW4uIFRvIGluc3RhbGwgdGhlbVxuICogaGVhZGxlc3NseSAoc2VlIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2ApIHR3byB0aGluZ3MgbXVzdCBiZSBkZXJpdmFibGU6XG4gKlxuICogLSAqKldoaWNoIHJlcG8gcHVibGlzaGVzIHRoZSBpZC4qKiBPYnNpZGlhbidzIG93biByZWdpc3RyeSBcdTIwMTRcbiAqICAge0BsaW5rIENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTH0sIHNlcnZlZCBmcm9tIHRoZSBzYW1lXG4gKiAgIGBvYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzYCByZXBvc2l0b3J5IHRoZSBpbnN0YWxsZXIgZG93bmxvYWRlciBhbHJlYWR5XG4gKiAgIHVzZXMgXHUyMDE0IG1hcHMgZXZlcnkgY29tbXVuaXR5IHBsdWdpbidzIGBpZGAgdG8gaXRzIGBvd25lci9uYW1lYCByZXBvLiBUaGF0IGlzXG4gKiAgIHRoZSBzYW1lIHRhYmxlIHRoZSBpbi1hcHAgY29tbXVuaXR5IGJyb3dzZXIgaW5zdGFsbHMgZnJvbSwgc28gbm9cbiAqICAgcGx1Z2luLXNwZWNpZmljIG1hcHBpbmcgaGFzIHRvIGJlIGhhcmRjb2RlZCBoZXJlLlxuICogLSAqKldoZXJlIHRoYXQgcmVwbydzIGFzc2V0cyBsaXZlLioqIEEgcGx1Z2luIHJlbGVhc2UgcHVibGlzaGVzIGBtYW5pZmVzdC5qc29uYCxcbiAqICAgYG1haW4uanNgIGFuZCAob3B0aW9uYWxseSkgYHN0eWxlcy5jc3NgIGFzIHJlbGVhc2UgYXNzZXRzO1xuICogICB7QGxpbmsgYnVpbGRQbHVnaW5Bc3NldFVybH0gYnVpbGRzIHRoZSBVUkwgZm9yIG9uZSwgZm9yIGVpdGhlciB0aGUgbGF0ZXN0XG4gKiAgIHJlbGVhc2Ugb3IgYSBwaW5uZWQgdGFnLlxuICpcbiAqIEV2ZXJ5dGhpbmcgZGVjaWRhYmxlIHdpdGhvdXQgdGhlIG5ldHdvcmsgbGl2ZXMgaGVyZSBzbyBpdCBzdGF5cyB1bml0LXRlc3RlZDsgdGhlXG4gKiBmZXRjaGluZyBhbmQgd3JpdGluZyBzaXQgaW4gYGRlbW8tdmF1bHQtYm9vdHN0cmFwLnRzYCwgbWlycm9yaW5nIHRoZVxuICogYGluc3RhbGxlci1hc3NldC50c2AgLyBgb2JzaWRpYW4taW5zdGFsbGVyLnRzYCBzcGxpdC5cbiAqL1xuXG4vKipcbiAqIE9ic2lkaWFuJ3Mgb3duIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnk6IHRoZSBgaWRgIFx1MjE5MiBgcmVwb2AgdGFibGUgdGhlIGluLWFwcFxuICogY29tbXVuaXR5IGJyb3dzZXIgaW5zdGFsbHMgZnJvbSwgc2VydmVkIGZyb20gdGhlIGBvYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzYFxuICogcmVwb3NpdG9yeS5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9tYXN0ZXIvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5cbi8qKlxuICogVGhlIGBtYWluLmpzYCAvIGBtYW5pZmVzdC5qc29uYCBwYWlyIGV2ZXJ5IHBsdWdpbiByZWxlYXNlIG11c3QgcHVibGlzaCBmb3IgdGhlXG4gKiBwbHVnaW4gdG8gYmUgbG9hZGFibGUgXHUyMDE0IHRoZSBzYW1lIHR3byBmaWxlcyBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgcmVxdWlyZXMgb25cbiAqIGRpc2suXG4gKi9cbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMgPSBbJ21haW4uanMnLCAnbWFuaWZlc3QuanNvbiddIGFzIGNvbnN0O1xuXG4vKipcbiAqIGBzdHlsZXMuY3NzYCBpcyBwdWJsaXNoZWQgb25seSBieSBwbHVnaW5zIHRoYXQgc2hpcCBDU1MsIHNvIGEgZG93bmxvYWQgb2YgaXQgaXNcbiAqIGFsbG93ZWQgdG8gNDA0IHdpdGhvdXQgZmFpbGluZyB0aGUgaW5zdGFsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9QVElPTkFMX1BMVUdJTl9BU1NFVF9OQU1FUyA9IFsnc3R5bGVzLmNzcyddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZFBsdWdpbkFzc2V0VXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFBsdWdpbkFzc2V0VXJsUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSByZWxlYXNlIGFzc2V0J3MgZmlsZSBuYW1lLCBlLmcuIGBtYWluLmpzYC5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHVibGlzaGluZyBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSB0YWcgdG8gZG93bmxvYWQgZnJvbS4gT21pdCBmb3IgdGhlIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTRcbiAgICogd2hpY2ggaXMgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPbmUgcm93IG9mIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gLCByZWR1Y2VkIHRvIHRoZSBmaWVsZHMgdGhlXG4gKiBib290c3RyYXAgbmVlZHMuIFRoZSBwdWJsaXNoZWQgcm93cyBjYXJyeSBgbmFtZWAsIGBhdXRob3JgIGFuZCBgZGVzY3JpcHRpb25gXG4gKiB0b287IHRoZXkgYXJlIGRlbGliZXJhdGVseSBub3QgbW9kZWxsZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeSB7XG4gIC8qKlxuICBUaGUgcGx1Z2luJ3MgaWQgXHUyMDE0IGl0cyBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPmAgZm9sZGVyIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHVibGlzaGluZyBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzZWxlY3RQbHVnaW5SZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RQbHVnaW5SZXBvUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSByZWdpc3RyeSByb3dzLCBhcyBwdWJsaXNoZWQgYnkge0BsaW5rIENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTH0uXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W107XG5cbiAgLyoqXG4gIFRoZSBwbHVnaW4gaWQgdG8gbG9vayB1cC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBkb3dubG9hZCBVUkwgZm9yIG9uZSBhc3NldCBvZiBhIHBsdWdpbidzIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEdpdEh1YiBzZXJ2ZXMgdHdvIGZvcm1zIFx1MjAxNCBhIHBpbm5lZCBgcmVsZWFzZXMvZG93bmxvYWQvPHRhZz4vPGFzc2V0PmAgYW5kIHRoZVxuICogbW92aW5nIGByZWxlYXNlcy9sYXRlc3QvZG93bmxvYWQvPGFzc2V0PmAgXHUyMDE0IHNvIGEgcGlubmVkIHZlcnNpb24gYW5kIHRoZSBkZWZhdWx0XG4gKiBcIndoYXRldmVyIGlzIGN1cnJlbnRcIiBzaGFyZSBvbmUgYnVpbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZFBsdWdpbkFzc2V0VXJsUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBhc3NldCdzIGRvd25sb2FkIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGx1Z2luQXNzZXRVcmwocGFyYW1zOiBCdWlsZFBsdWdpbkFzc2V0VXJsUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhc3NldE5hbWUsIHJlcG8sIHZlcnNpb24gfSA9IHBhcmFtcztcbiAgY29uc3QgcmVsZWFzZVBhdGggPSB2ZXJzaW9uID09PSB1bmRlZmluZWQgPyAnbGF0ZXN0L2Rvd25sb2FkJyA6IGBkb3dubG9hZC8ke3ZlcnNpb259YDtcbiAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy8ke3JlbGVhc2VQYXRofS8ke2Fzc2V0TmFtZX1gO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGEgc3RyaW5nIGhhcyB0aGUgYG93bmVyL25hbWVgIHNoYXBlIGEgR2l0SHViIHJlcG9zaXRvcnkgcmVmZXJlbmNlXG4gKiBuZWVkcywgc28gYSBtYWxmb3JtZWQgb3ZlcnJpZGUgaXMgcmVqZWN0ZWQgYmVmb3JlIGl0IGlzIHNwbGljZWQgaW50byBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gcmVwbyAtIFRoZSBjYW5kaWRhdGUgcmVwb3NpdG9yeSByZWZlcmVuY2UuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGl0IGlzIGEgd2VsbC1mb3JtZWQgYG93bmVyL25hbWVgIHBhaXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmVwb1JlZmVyZW5jZShyZXBvOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW1xcdy4tXStcXC9bXFx3Li1dKyQvLnRlc3QocmVwbyk7XG59XG5cbi8qKlxuICogTG9va3MgYSBwbHVnaW4gaWQgdXAgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFNlbGVjdFBsdWdpblJlcG9QYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHB1Ymxpc2hpbmcgYG93bmVyL25hbWVgIHJlcG8sIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGlkIGlzIG5vdCBhXG4gKiAgIHJlZ2lzdGVyZWQgY29tbXVuaXR5IHBsdWdpbiAoYSBwcml2YXRlIG9yIHVubGlzdGVkIHBsdWdpbiwgb3IgYSB0eXBvKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFBsdWdpblJlcG8ocGFyYW1zOiBTZWxlY3RQbHVnaW5SZXBvUGFyYW1zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBhcmFtcy5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5pZCA9PT0gcGFyYW1zLnBsdWdpbklkKT8ucmVwbztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0NPLE1BQU0saUNBQWlDO0FBT3ZDLE1BQU0sOEJBQThCLENBQUMsV0FBVyxlQUFlO0FBTS9ELE1BQU0sOEJBQThCLENBQUMsWUFBWTtBQWlFakQsU0FBUyxvQkFBb0IsUUFBMkM7QUFDN0UsUUFBTSxFQUFFLFdBQVcsTUFBTSxRQUFRLElBQUk7QUFDckMsUUFBTSxjQUFjLFlBQVksU0FBWSxvQkFBb0IsWUFBWSxPQUFPO0FBQ25GLFNBQU8sc0JBQXNCLElBQUksYUFBYSxXQUFXLElBQUksU0FBUztBQUN4RTtBQVNPLFNBQVMscUJBQXFCLE1BQXVCO0FBQzFELFNBQU8scUJBQXFCLEtBQUssSUFBSTtBQUN2QztBQVNPLFNBQVMsaUJBQWlCLFFBQW9EO0FBQ25GLFNBQU8sT0FBTyxRQUFRLEtBQUssQ0FBQyxVQUFVLE1BQU0sT0FBTyxPQUFPLFFBQVEsR0FBRztBQUN2RTsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* nothing but its plugin id — the id → repo lookup and the asset URL shapes.
|
|
6
6
|
*
|
|
7
7
|
* A plugin's built files never live in git: `.obsidian/plugins/*` is gitignored in
|
|
8
|
-
*
|
|
8
|
+
* a plugin repo, so a demo vault's injected community plugins exist on
|
|
9
9
|
* exactly the machine that once opened that vault in Obsidian. To install them
|
|
10
10
|
* headlessly (see `demo-vault-bootstrap.ts`) two things must be derivable:
|
|
11
11
|
*
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var config_directory_fallback_error_exports = {};
|
|
20
|
+
__export(config_directory_fallback_error_exports, {
|
|
21
|
+
ConfigDirectoryFallbackError: () => ConfigDirectoryFallbackError
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(config_directory_fallback_error_exports);
|
|
24
|
+
class ConfigDirectoryFallbackError extends Error {
|
|
25
|
+
/**
|
|
26
|
+
The config folder the vault is actually using.
|
|
27
|
+
*/
|
|
28
|
+
actualConfigDirectory;
|
|
29
|
+
/**
|
|
30
|
+
The config folder that was requested.
|
|
31
|
+
*/
|
|
32
|
+
requestedConfigDirectory;
|
|
33
|
+
/**
|
|
34
|
+
Absolute path to the vault that was opened.
|
|
35
|
+
*/
|
|
36
|
+
vaultPath;
|
|
37
|
+
/**
|
|
38
|
+
* Creates the error from the requested and actual config folders.
|
|
39
|
+
*
|
|
40
|
+
* @param params - The requested folder, the folder actually in use, and the vault path.
|
|
41
|
+
*/
|
|
42
|
+
constructor(params) {
|
|
43
|
+
const { actualConfigDirectory, requestedConfigDirectory, vaultPath } = params;
|
|
44
|
+
super(
|
|
45
|
+
`Vault ${vaultPath} was opened with config folder ${actualConfigDirectory} but ${requestedConfigDirectory} was requested \u2014 Obsidian rejected the override or never saw it, and silently fell back. Check that ${requestedConfigDirectory} exists in the vault and is a name Obsidian accepts.`
|
|
46
|
+
);
|
|
47
|
+
this.name = "ConfigDirectoryFallbackError";
|
|
48
|
+
this.actualConfigDirectory = actualConfigDirectory;
|
|
49
|
+
this.requestedConfigDirectory = requestedConfigDirectory;
|
|
50
|
+
this.vaultPath = vaultPath;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
54
|
+
0 && (module.exports = {
|
|
55
|
+
ConfigDirectoryFallbackError
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbmZpZy1kaXJlY3RvcnktZmFsbGJhY2stZXJyb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgZGlzdGluY3QgZXJyb3IgdGhyb3duIHdoZW4gYW4gb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYm9vdGVkIGEgdmF1bHRcbiAqIGFnYWluc3QgYSAqKmRpZmZlcmVudCBjb25maWcgZm9sZGVyKiogdGhhbiB0aGUgb25lIHJlcXVlc3RlZCB0aHJvdWdoXG4gKiBgY29uZmlnRGlyZWN0b3J5YCBcdTIwMTQgT2JzaWRpYW4gcmVqZWN0ZWQgdGhlIG92ZXJyaWRlLCBvciBuZXZlciBzYXcgaXQsIGFuZCBzaWxlbnRseVxuICogZmVsbCBiYWNrIHRvIGAub2JzaWRpYW5gLlxuICpcbiAqIFRoZSBmYWxsYmFjayBpcyBzaWxlbnQgYnkgY29uc3RydWN0aW9uIChgc2V0Q29uZmlnRGlyYCBzd2FwcyBhbiBpbnZhbGlkIHZhbHVlXG4gKiBmb3IgdGhlIGRlZmF1bHQgd2l0aG91dCBhIHdvcmQpIGFuZCB0aGUgcmVzdWx0aW5nIHZhdWx0IGxvb2tzIHBlcmZlY3RseVxuICogaGVhbHRoeTogaXQgb3BlbnMsIGl0cyBsYXlvdXQgaXMgcmVhZHksIGFuZCBpdCByZXBvcnRzIHN1Y2Nlc3MuIFdoYXQgaXQgZG9lc1xuICogbm90IGhhdmUgaXMgdGhlIHNldHRpbmdzLCBlbmFibGVkIHBsdWdpbnMsIGFuZCB3b3Jrc3BhY2Ugb2YgdGhlIGZvbGRlciB0aGF0XG4gKiB3YXMgYXNrZWQgZm9yIFx1MjAxNCBzbyBhIHN1aXRlIHRoYXQgdmVyaWZpZXMgYmVoYXZpb3VyIGFnYWluc3QgYSByZWFsIHZhdWx0J3NcbiAqIHBsdWdpbiBzZXQgd291bGQgc2lsZW50bHkgdmVyaWZ5IG5vdGhpbmcuIEhlbmNlIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGFcbiAqIHdhcm5pbmcsIGFuZCwgdW5saWtlIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAsIG5vIGtub2IgdG8gZG93bmdyYWRlIGl0OiB0aGVyZVxuICogaXMgbm8gdmVyc2lvbiBvZiB0aGlzIG91dGNvbWUgd29ydGggY29udGludWluZyBhZ2FpbnN0LlxuICpcbiAqIEV4cG9ydGVkIHNvIGNhbGxlcnMgb2YgYGNvbm5lY3RUb0NkcGAgLyB0aGUgdHJhbnNwb3J0IGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2hcbiAqIHRoaXMgc3BlY2lmaWMgZmFpbHVyZS5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBjb25maWcgZm9sZGVyIHRoZSB2YXVsdCBpcyBhY3R1YWxseSB1c2luZywgYXMgcmVhZCBiYWNrIGZyb20gYGFwcC52YXVsdC5jb25maWdEaXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0dWFsQ29uZmlnRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBjb25maWcgZm9sZGVyIHRoYXQgd2FzIHJlcXVlc3RlZCB0aHJvdWdoIGBjb25maWdEaXJlY3RvcnlgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IHRoYXQgd2FzIG9wZW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgYm9vdGVkIG93bmVkIGluc3RhbmNlIHJlcG9ydHMgYSBkaWZmZXJlbnQgYGFwcC52YXVsdC5jb25maWdEaXJgXG4gKiB0aGFuIHRoZSByZXF1ZXN0ZWRcbiAqIHtAbGluayBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yQ29uc3RydWN0b3JQYXJhbXMucmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5fS5cbiAqIENhcnJpZXMgYm90aCBmb2xkZXIgbmFtZXMgYW5kIHRoZSB2YXVsdCBwYXRoIHNvIGNhbGxlcnMgY2FuIGBpbnN0YW5jZW9mYC1tYXRjaFxuICogYW5kIHJlcG9ydCB3aGljaCB2YXVsdCB3YXMgb3BlbmVkIHdyb25nbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgVGhlIGNvbmZpZyBmb2xkZXIgdGhlIHZhdWx0IGlzIGFjdHVhbGx5IHVzaW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFjdHVhbENvbmZpZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgY29uZmlnIGZvbGRlciB0aGF0IHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IHRoYXQgd2FzIG9wZW5lZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2YXVsdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB0aGUgcmVxdWVzdGVkIGFuZCBhY3R1YWwgY29uZmlnIGZvbGRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVxdWVzdGVkIGZvbGRlciwgdGhlIGZvbGRlciBhY3R1YWxseSBpbiB1c2UsIGFuZCB0aGUgdmF1bHQgcGF0aC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IHsgYWN0dWFsQ29uZmlnRGlyZWN0b3J5LCByZXF1ZXN0ZWRDb25maWdEaXJlY3RvcnksIHZhdWx0UGF0aCB9ID0gcGFyYW1zO1xuICAgIHN1cGVyKFxuICAgICAgYFZhdWx0ICR7dmF1bHRQYXRofSB3YXMgb3BlbmVkIHdpdGggY29uZmlnIGZvbGRlciAke2FjdHVhbENvbmZpZ0RpcmVjdG9yeX0gYnV0ICR7cmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5fSB3YXMgcmVxdWVzdGVkIFx1MjAxNCBgXG4gICAgICAgICsgJ09ic2lkaWFuIHJlamVjdGVkIHRoZSBvdmVycmlkZSBvciBuZXZlciBzYXcgaXQsIGFuZCBzaWxlbnRseSBmZWxsIGJhY2suICdcbiAgICAgICAgKyBgQ2hlY2sgdGhhdCAke3JlcXVlc3RlZENvbmZpZ0RpcmVjdG9yeX0gZXhpc3RzIGluIHRoZSB2YXVsdCBhbmQgaXMgYSBuYW1lIE9ic2lkaWFuIGFjY2VwdHMuYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3InO1xuICAgIHRoaXMuYWN0dWFsQ29uZmlnRGlyZWN0b3J5ID0gYWN0dWFsQ29uZmlnRGlyZWN0b3J5O1xuICAgIHRoaXMucmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5ID0gcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5O1xuICAgIHRoaXMudmF1bHRQYXRoID0gdmF1bHRQYXRoO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0RPLE1BQU0scUNBQXFDLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl0QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxRQUF1RDtBQUN4RSxVQUFNLEVBQUUsdUJBQXVCLDBCQUEwQixVQUFVLElBQUk7QUFDdkU7QUFBQSxNQUNFLFNBQVMsU0FBUyxrQ0FBa0MscUJBQXFCLFFBQVEsd0JBQXdCLDRHQUV2Rix3QkFBd0I7QUFBQSxJQUM1QztBQUNBLFNBQUssT0FBTztBQUNaLFNBQUssd0JBQXdCO0FBQzdCLFNBQUssMkJBQTJCO0FBQ2hDLFNBQUssWUFBWTtBQUFBLEVBQ25CO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* The distinct error thrown when an owned Obsidian instance booted a vault
|
|
5
|
+
* against a **different config folder** than the one requested through
|
|
6
|
+
* `configDirectory` — Obsidian rejected the override, or never saw it, and silently
|
|
7
|
+
* fell back to `.obsidian`.
|
|
8
|
+
*
|
|
9
|
+
* The fallback is silent by construction (`setConfigDir` swaps an invalid value
|
|
10
|
+
* for the default without a word) and the resulting vault looks perfectly
|
|
11
|
+
* healthy: it opens, its layout is ready, and it reports success. What it does
|
|
12
|
+
* not have is the settings, enabled plugins, and workspace of the folder that
|
|
13
|
+
* was asked for — so a suite that verifies behaviour against a real vault's
|
|
14
|
+
* plugin set would silently verify nothing. Hence a hard failure rather than a
|
|
15
|
+
* warning, and, unlike `SilentAsarFallbackError`, no knob to downgrade it: there
|
|
16
|
+
* is no version of this outcome worth continuing against.
|
|
17
|
+
*
|
|
18
|
+
* Exported so callers of `connectToCdp` / the transport can `instanceof`-match
|
|
19
|
+
* this specific failure.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Parameters for the {@link ConfigDirectoryFallbackError} constructor.
|
|
23
|
+
*/
|
|
24
|
+
export interface ConfigDirectoryFallbackErrorConstructorParams {
|
|
25
|
+
/**
|
|
26
|
+
The config folder the vault is actually using, as read back from `app.vault.configDir`.
|
|
27
|
+
*/
|
|
28
|
+
readonly actualConfigDirectory: string;
|
|
29
|
+
/**
|
|
30
|
+
The config folder that was requested through `configDirectory`.
|
|
31
|
+
*/
|
|
32
|
+
readonly requestedConfigDirectory: string;
|
|
33
|
+
/**
|
|
34
|
+
Absolute path to the vault that was opened.
|
|
35
|
+
*/
|
|
36
|
+
readonly vaultPath: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Thrown when a booted owned instance reports a different `app.vault.configDir`
|
|
40
|
+
* than the requested
|
|
41
|
+
* {@link ConfigDirectoryFallbackErrorConstructorParams.requestedConfigDirectory}.
|
|
42
|
+
* Carries both folder names and the vault path so callers can `instanceof`-match
|
|
43
|
+
* and report which vault was opened wrongly.
|
|
44
|
+
*/
|
|
45
|
+
export declare class ConfigDirectoryFallbackError extends Error {
|
|
46
|
+
/**
|
|
47
|
+
The config folder the vault is actually using.
|
|
48
|
+
*/
|
|
49
|
+
readonly actualConfigDirectory: string;
|
|
50
|
+
/**
|
|
51
|
+
The config folder that was requested.
|
|
52
|
+
*/
|
|
53
|
+
readonly requestedConfigDirectory: string;
|
|
54
|
+
/**
|
|
55
|
+
Absolute path to the vault that was opened.
|
|
56
|
+
*/
|
|
57
|
+
readonly vaultPath: string;
|
|
58
|
+
/**
|
|
59
|
+
* Creates the error from the requested and actual config folders.
|
|
60
|
+
*
|
|
61
|
+
* @param params - The requested folder, the folder actually in use, and the vault path.
|
|
62
|
+
*/
|
|
63
|
+
constructor(params: ConfigDirectoryFallbackErrorConstructorParams);
|
|
64
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var config_directory_exports = {};
|
|
20
|
+
__export(config_directory_exports, {
|
|
21
|
+
DEFAULT_CONFIG_DIRECTORY: () => DEFAULT_CONFIG_DIRECTORY,
|
|
22
|
+
assertValidConfigDirectory: () => assertValidConfigDirectory
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(config_directory_exports);
|
|
25
|
+
const DEFAULT_CONFIG_DIRECTORY = ".obsidian";
|
|
26
|
+
function assertValidConfigDirectory(configDirectory) {
|
|
27
|
+
if (!configDirectory.startsWith(".")) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Invalid configDirectory ${JSON.stringify(configDirectory)}: an Obsidian config folder name must start with a dot, e.g. '${DEFAULT_CONFIG_DIRECTORY}'.`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
if (configDirectory === ".") {
|
|
33
|
+
throw new Error(`Invalid configDirectory ${JSON.stringify(configDirectory)}: a bare dot is not a config folder name.`);
|
|
34
|
+
}
|
|
35
|
+
if (configDirectory.includes("/") || configDirectory.includes("\\")) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
`Invalid configDirectory ${JSON.stringify(configDirectory)}: the config folder sits directly inside the vault, so its name cannot contain a path separator.`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
+
0 && (module.exports = {
|
|
43
|
+
DEFAULT_CONFIG_DIRECTORY,
|
|
44
|
+
assertValidConfigDirectory
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbmZpZy1kaXJlY3RvcnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWxpZGF0ZXMgYSB2YXVsdCdzICoqY29uZmlnIGZvbGRlcioqIG5hbWUgXHUyMDE0IHRoZSBwZXItdmF1bHQgb3ZlcnJpZGUgT2JzaWRpYW5cbiAqIGV4cG9zZXMgYXMgKlNldHRpbmdzIFx1MjE5MiBBYm91dCBcdTIxOTIgT3ZlcnJpZGUgY29uZmlnIGZvbGRlciogYW5kIHN0b3JlcyBhcyB0aGVcbiAqIGA8dmF1bHRJZD4tY29uZmlnYCBgbG9jYWxTdG9yYWdlYCBlbnRyeSAoc2VlIGB0cmFuc3BvcnQtZGVza3RvcC1jZHBgJ3NcbiAqIGBvcGVuVmF1bHRGcm9tU3RhcnRlclNjcmVlbmApLlxuICpcbiAqIE9ic2lkaWFuIHZhbGlkYXRlcyB0aGUgc2FtZSB2YWx1ZSBiZWZvcmUgYXBwbHlpbmcgaXQsIGFuZCAqKnNpbGVudGx5IGZhbGxzXG4gKiBiYWNrKiogdG8ge0BsaW5rIERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWX0gd2hlbiB0aGUgdmFsdWUgaXMgcmVqZWN0ZWRcbiAqIChPYnNpZGlhbiAxLjEzLjcsIGBhcHAuanNgKTpcbiAqXG4gKiBgYGBqc1xuICogdC52YWxpZGF0ZUNvbmZpZ0RpciA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBcIi5cIiAhPT0gZSAmJiBlLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFIRC50ZXN0KGUpIH07XG4gKiB0LnByb3RvdHlwZS5zZXRDb25maWdEaXIgPSBmdW5jdGlvbiAoZSkgeyB0LnZhbGlkYXRlQ29uZmlnRGlyKGUpIHx8IChlID0gVUQpLCB0aGlzLmNvbmZpZ0RpciA9IGUgfTtcbiAqIGBgYFxuICpcbiAqIFRoZSB0d28gc3RydWN0dXJhbCBjbGF1c2VzIGFyZSByZXByb2R1Y2VkIGhlcmUgc28gYSBiYWQgdmFsdWUgZmFpbHMgbG91ZGx5IGF0XG4gKiB0aGUgY2FsbCBzaXRlLCBuYW1pbmcgdGhlIG9wdGlvbiwgaW5zdGVhZCBvZiBib290aW5nIGEgdmF1bHQgYWdhaW5zdCB0aGUgd3JvbmdcbiAqIGZvbGRlci4gVGhlIHRoaXJkIFx1MjAxNCBgSERgLCBhIGNoYXJhY3RlciBibGFja2xpc3QgbWluaWZpZWQgcGFzdCByZWNvdmVyeSBcdTIwMTQgaXNcbiAqIGRlbGliZXJhdGVseSAqKm5vdCoqIGd1ZXNzZWQgYXQ6IGEgc3RyaWN0ZXIgbG9jYWwgY29weSB3b3VsZCByZWplY3QgZm9sZGVyXG4gKiBuYW1lcyBPYnNpZGlhbiBhY2NlcHRzLiBBbnl0aGluZyB0aGlzIHZhbGlkYXRvciBsZXRzIHRocm91Z2ggdGhhdCBPYnNpZGlhblxuICogdGhlbiByZWplY3RzIGlzIGNhdWdodCBwb3N0LWJvb3QgYnkgdGhlIGBhcHAudmF1bHQuY29uZmlnRGlyYCByZWFkYmFjaywgd2hpY2hcbiAqIHRocm93cyBgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcmAuIFRoYXQgcmVhZGJhY2sgaXMgdGhlIHJlYWwgZ3VhcmFudGVlO1xuICogdGhpcyBpcyB0aGUgZWFybHksIGJldHRlci13b3JkZWQgaGFsZiBvZiBpdC5cbiAqL1xuXG4vKipcbiAqIFRoZSBjb25maWcgZm9sZGVyIE9ic2lkaWFuIHVzZXMgd2hlbiBhIHZhdWx0IGhhcyBubyBvdmVycmlkZSBcdTIwMTQgYW5kIHRoZSBvbmUgaXRcbiAqIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gd2hlbiBhbiBvdmVycmlkZSBmYWlscyBpdHMgb3duIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkgPSAnLm9ic2lkaWFuJztcblxuLyoqXG4gKiBUaHJvd3MgdW5sZXNzIGBjb25maWdEaXJlY3RvcnlgIGlzIGEgc3RydWN0dXJhbGx5IHZhbGlkIE9ic2lkaWFuIGNvbmZpZyBmb2xkZXJcbiAqIG5hbWUuXG4gKlxuICogTWlycm9ycyB0aGUgdHdvIHJlY292ZXJhYmxlIGNsYXVzZXMgb2YgT2JzaWRpYW4ncyBvd24gYHZhbGlkYXRlQ29uZmlnRGlyYDogdGhlXG4gKiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGRvdCBhbmQgbXVzdCBub3QgYmUgdGhlIGJhcmUgZG90LiBBIHBhdGggc2VwYXJhdG9yIGlzXG4gKiByZWplY3RlZCBvbiB0b3Agb2YgdGhvc2UsIGJlY2F1c2UgdGhlIG92ZXJyaWRlIG5hbWVzIGEgc2luZ2xlIGZvbGRlciBkaXJlY3RseVxuICogaW5zaWRlIHRoZSB2YXVsdCwgbmV2ZXIgYSBuZXN0ZWQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnRGlyZWN0b3J5IC0gVGhlIGNhbmRpZGF0ZSBjb25maWcgZm9sZGVyIG5hbWUsIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLlxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gdGhlIG5hbWUgd291bGQgYmUgcmVqZWN0ZWQgYnkgT2JzaWRpYW4gYW5kIHNpbGVudGx5XG4gKiAgIHJlcGxhY2VkIHdpdGgge0BsaW5rIERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeShjb25maWdEaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWNvbmZpZ0RpcmVjdG9yeS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjb25maWdEaXJlY3RvcnkgJHtKU09OLnN0cmluZ2lmeShjb25maWdEaXJlY3RvcnkpfTogYW4gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGRvdCwgZS5nLiAnJHtERUZBVUxUX0NPTkZJR19ESVJFQ1RPUll9Jy5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChjb25maWdEaXJlY3RvcnkgPT09ICcuJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25maWdEaXJlY3RvcnkgJHtKU09OLnN0cmluZ2lmeShjb25maWdEaXJlY3RvcnkpfTogYSBiYXJlIGRvdCBpcyBub3QgYSBjb25maWcgZm9sZGVyIG5hbWUuYCk7XG4gIH1cblxuICBpZiAoY29uZmlnRGlyZWN0b3J5LmluY2x1ZGVzKCcvJykgfHwgY29uZmlnRGlyZWN0b3J5LmluY2x1ZGVzKCdcXFxcJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjb25maWdEaXJlY3RvcnkgJHtKU09OLnN0cmluZ2lmeShjb25maWdEaXJlY3RvcnkpfTogdGhlIGNvbmZpZyBmb2xkZXIgc2l0cyBkaXJlY3RseSBpbnNpZGUgdGhlIHZhdWx0LCBzbyBpdHMgbmFtZSBjYW5ub3QgY29udGFpbiBhIHBhdGggc2VwYXJhdG9yLmBcbiAgICApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUErQk8sTUFBTSwyQkFBMkI7QUFlakMsU0FBUywyQkFBMkIsaUJBQStCO0FBQ3hFLE1BQUksQ0FBQyxnQkFBZ0IsV0FBVyxHQUFHLEdBQUc7QUFDcEMsVUFBTSxJQUFJO0FBQUEsTUFDUiwyQkFBMkIsS0FBSyxVQUFVLGVBQWUsQ0FBQyxpRUFBaUUsd0JBQXdCO0FBQUEsSUFDcko7QUFBQSxFQUNGO0FBRUEsTUFBSSxvQkFBb0IsS0FBSztBQUMzQixVQUFNLElBQUksTUFBTSwyQkFBMkIsS0FBSyxVQUFVLGVBQWUsQ0FBQywyQ0FBMkM7QUFBQSxFQUN2SDtBQUVBLE1BQUksZ0JBQWdCLFNBQVMsR0FBRyxLQUFLLGdCQUFnQixTQUFTLElBQUksR0FBRztBQUNuRSxVQUFNLElBQUk7QUFBQSxNQUNSLDJCQUEyQixLQUFLLFVBQVUsZUFBZSxDQUFDO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Validates a vault's **config folder** name — the per-vault override Obsidian
|
|
5
|
+
* exposes as *Settings → About → Override config folder* and stores as the
|
|
6
|
+
* `<vaultId>-config` `localStorage` entry (see `transport-desktop-cdp`'s
|
|
7
|
+
* `openVaultFromStarterScreen`).
|
|
8
|
+
*
|
|
9
|
+
* Obsidian validates the same value before applying it, and **silently falls
|
|
10
|
+
* back** to {@link DEFAULT_CONFIG_DIRECTORY} when the value is rejected
|
|
11
|
+
* (Obsidian 1.13.7, `app.js`):
|
|
12
|
+
*
|
|
13
|
+
* ```js
|
|
14
|
+
* t.validateConfigDir = function (e) { return "." !== e && e.startsWith(".") && !HD.test(e) };
|
|
15
|
+
* t.prototype.setConfigDir = function (e) { t.validateConfigDir(e) || (e = UD), this.configDir = e };
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The two structural clauses are reproduced here so a bad value fails loudly at
|
|
19
|
+
* the call site, naming the option, instead of booting a vault against the wrong
|
|
20
|
+
* folder. The third — `HD`, a character blacklist minified past recovery — is
|
|
21
|
+
* deliberately **not** guessed at: a stricter local copy would reject folder
|
|
22
|
+
* names Obsidian accepts. Anything this validator lets through that Obsidian
|
|
23
|
+
* then rejects is caught post-boot by the `app.vault.configDir` readback, which
|
|
24
|
+
* throws `ConfigDirectoryFallbackError`. That readback is the real guarantee;
|
|
25
|
+
* this is the early, better-worded half of it.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* The config folder Obsidian uses when a vault has no override — and the one it
|
|
29
|
+
* silently falls back to when an override fails its own validation.
|
|
30
|
+
*/
|
|
31
|
+
export declare const DEFAULT_CONFIG_DIRECTORY = ".obsidian";
|
|
32
|
+
/**
|
|
33
|
+
* Throws unless `configDirectory` is a structurally valid Obsidian config folder
|
|
34
|
+
* name.
|
|
35
|
+
*
|
|
36
|
+
* Mirrors the two recoverable clauses of Obsidian's own `validateConfigDir`: the
|
|
37
|
+
* name must start with a dot and must not be the bare dot. A path separator is
|
|
38
|
+
* rejected on top of those, because the override names a single folder directly
|
|
39
|
+
* inside the vault, never a nested path.
|
|
40
|
+
*
|
|
41
|
+
* @param configDirectory - The candidate config folder name, e.g. `'.obsidian-desktop'`.
|
|
42
|
+
* @throws {Error} When the name would be rejected by Obsidian and silently
|
|
43
|
+
* replaced with {@link DEFAULT_CONFIG_DIRECTORY}.
|
|
44
|
+
*/
|
|
45
|
+
export declare function assertValidConfigDirectory(configDirectory: string): void;
|