obsidian-integration-testing 8.3.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +52 -11
  2. package/dist/lib/cjs/asar-fallback-detection.cjs +48 -0
  3. package/dist/lib/cjs/asar-fallback-detection.d.cts +75 -0
  4. package/dist/lib/cjs/avd-list.cjs +36 -0
  5. package/dist/lib/cjs/avd-list.d.cts +38 -0
  6. package/dist/lib/cjs/compatibility-options.cjs +18 -1
  7. package/dist/lib/cjs/compatibility-options.d.cts +41 -0
  8. package/dist/lib/cjs/connect-to-cdp.cjs +17 -18
  9. package/dist/lib/cjs/connect-to-cdp.d.cts +25 -0
  10. package/dist/lib/cjs/demo-vault-tree.cjs +52 -0
  11. package/dist/lib/cjs/demo-vault-tree.d.cts +34 -0
  12. package/dist/lib/cjs/ecmascript-version.cjs +63 -0
  13. package/dist/lib/cjs/ecmascript-version.d.cts +28 -0
  14. package/dist/lib/cjs/global-setup-core.cjs +44 -27
  15. package/dist/lib/cjs/global-setup-core.d.cts +15 -3
  16. package/dist/lib/cjs/index.cjs +10 -1
  17. package/dist/lib/cjs/index.d.cts +7 -1
  18. package/dist/lib/cjs/installer-asset.cjs +18 -3
  19. package/dist/lib/cjs/installer-asset.d.cts +26 -0
  20. package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +41 -0
  21. package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +26 -0
  22. package/dist/lib/cjs/jest/global-setup.cjs +2 -2
  23. package/dist/lib/cjs/jest/global-setup.d.cts +11 -1
  24. package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +26 -0
  25. package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +11 -0
  26. package/dist/lib/cjs/library.cjs +1 -1
  27. package/dist/lib/cjs/namespace-bootstrap.cjs +44 -7
  28. package/dist/lib/cjs/normalize-optional-properties.cjs +31 -0
  29. package/dist/lib/cjs/normalize-optional-properties.d.cts +26 -0
  30. package/dist/lib/cjs/obsidian-installer.cjs +6 -1
  31. package/dist/lib/cjs/obsidian-metadata.cjs +3775 -302
  32. package/dist/lib/cjs/obsidian-metadata.d.cts +71 -0
  33. package/dist/lib/cjs/obsidian-version-switch.cjs +5 -2
  34. package/dist/lib/cjs/owned-vault-seed.cjs +38 -0
  35. package/dist/lib/cjs/owned-vault-seed.d.cts +67 -0
  36. package/dist/lib/cjs/process-exit-message.cjs +47 -0
  37. package/dist/lib/cjs/process-exit-message.d.cts +48 -0
  38. package/dist/lib/cjs/silent-asar-fallback-error.cjs +48 -0
  39. package/dist/lib/cjs/silent-asar-fallback-error.d.cts +40 -0
  40. package/dist/lib/cjs/transport-desktop-cdp.cjs +197 -73
  41. package/dist/lib/cjs/transport-desktop-cdp.d.cts +74 -15
  42. package/dist/lib/cjs/transport-factory.cjs +135 -34
  43. package/dist/lib/cjs/transport-options.cjs +1 -1
  44. package/dist/lib/cjs/transport-options.d.cts +16 -0
  45. package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +37 -0
  46. package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +26 -0
  47. package/dist/lib/cjs/vitest/global-setup.cjs +2 -2
  48. package/dist/lib/cjs/vitest/global-setup.d.cts +11 -1
  49. package/dist/lib/esm/asar-fallback-detection.d.mts +75 -0
  50. package/dist/lib/esm/asar-fallback-detection.mjs +24 -0
  51. package/dist/lib/esm/avd-list.d.mts +38 -0
  52. package/dist/lib/esm/avd-list.mjs +11 -0
  53. package/dist/lib/esm/compatibility-options.d.mts +41 -0
  54. package/dist/lib/esm/compatibility-options.mjs +16 -1
  55. package/dist/lib/esm/connect-to-cdp.d.mts +25 -0
  56. package/dist/lib/esm/connect-to-cdp.mjs +17 -18
  57. package/dist/lib/esm/demo-vault-tree.d.mts +34 -0
  58. package/dist/lib/esm/demo-vault-tree.mjs +35 -0
  59. package/dist/lib/esm/ecmascript-version.d.mts +28 -0
  60. package/dist/lib/esm/ecmascript-version.mjs +39 -0
  61. package/dist/lib/esm/global-setup-core.d.mts +15 -3
  62. package/dist/lib/esm/global-setup-core.mjs +44 -27
  63. package/dist/lib/esm/index.d.mts +7 -1
  64. package/dist/lib/esm/index.mjs +7 -1
  65. package/dist/lib/esm/installer-asset.d.mts +26 -0
  66. package/dist/lib/esm/installer-asset.mjs +16 -2
  67. package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +26 -0
  68. package/dist/lib/esm/jest/global-setup-no-plugin.mjs +17 -0
  69. package/dist/lib/esm/jest/global-setup.d.mts +11 -1
  70. package/dist/lib/esm/jest/global-setup.mjs +2 -2
  71. package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +11 -0
  72. package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +6 -0
  73. package/dist/lib/esm/library.mjs +1 -1
  74. package/dist/lib/esm/namespace-bootstrap.mjs +44 -7
  75. package/dist/lib/esm/normalize-optional-properties.d.mts +26 -0
  76. package/dist/lib/esm/normalize-optional-properties.mjs +7 -0
  77. package/dist/lib/esm/obsidian-installer.mjs +8 -2
  78. package/dist/lib/esm/obsidian-metadata.d.mts +71 -0
  79. package/dist/lib/esm/obsidian-metadata.mjs +3775 -302
  80. package/dist/lib/esm/obsidian-version-switch.mjs +5 -2
  81. package/dist/lib/esm/owned-vault-seed.d.mts +67 -0
  82. package/dist/lib/esm/owned-vault-seed.mjs +14 -0
  83. package/dist/lib/esm/process-exit-message.d.mts +48 -0
  84. package/dist/lib/esm/process-exit-message.mjs +23 -0
  85. package/dist/lib/esm/silent-asar-fallback-error.d.mts +40 -0
  86. package/dist/lib/esm/silent-asar-fallback-error.mjs +24 -0
  87. package/dist/lib/esm/transport-desktop-cdp.d.mts +74 -15
  88. package/dist/lib/esm/transport-desktop-cdp.mjs +197 -73
  89. package/dist/lib/esm/transport-factory.mjs +139 -34
  90. package/dist/lib/esm/transport-options.d.mts +16 -0
  91. package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +26 -0
  92. package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +11 -0
  93. package/dist/lib/esm/vitest/global-setup.d.mts +11 -1
  94. package/dist/lib/esm/vitest/global-setup.mjs +2 -2
  95. package/dist/obsidian-integration-testing-9.0.0.tgz +0 -0
  96. package/package.json +40 -8
  97. package/dist/obsidian-integration-testing-8.3.0.tgz +0 -0
@@ -9,6 +9,7 @@ import { tmpdir } from "node:os";
9
9
  import { join } from "node:path";
10
10
  import { gunzipSync } from "node:zlib";
11
11
  import { log } from "./log.mjs";
12
+ import { getVersionMetadata } from "./obsidian-metadata.mjs";
12
13
  import {
13
14
  compareVersions,
14
15
  DESKTOP_RELEASES_MANIFEST_URL,
@@ -100,10 +101,12 @@ async function downloadAndDecompressAsar(url) {
100
101
  }
101
102
  function getAsarDownloadUrls(version) {
102
103
  const asarGzFileName = `${getVersionAsarFileName(version)}.gz`;
103
- return [
104
+ const fallbackUrls = [
104
105
  `${PUBLIC_ASAR_RELEASE_BASE_URL}/v${version}/${asarGzFileName}`,
105
106
  `${CATALYST_ASAR_RELEASE_BASE_URL}/${asarGzFileName}`
106
107
  ];
108
+ const bakedUrl = getVersionMetadata(version)?.downloads?.asar;
109
+ return bakedUrl ? [bakedUrl, ...fallbackUrls] : fallbackUrls;
107
110
  }
108
111
  export {
109
112
  copyAsarIntoUserData,
@@ -113,4 +116,4 @@ export {
113
116
  getCachedAsarPath,
114
117
  resolveConcreteVersion
115
118
  };
116
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyLlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXIpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gTWF0Y2hlcyB0aGUgVUEgZG9jdW1lbnRlZCBpbiB0aGUgb2JzaWRpYW4tdmVyc2lvbnMgcmVwby5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipjYXRhbHlzdCoqIChlYXJseSBhY2Nlc3MgLyBpbnNpZGVyKSByZWxlYXNlIGFzYXJzLCBzZXJ2ZWQgZnJvbVxuICogdGhlIE9ic2lkaWFuIENETiBhcyBgLi4uL3JlbGVhc2Uvb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLiBQdWJsaWMgdmVyc2lvbnNcbiAqIGFyZSBOT1QgaG9zdGVkIGhlcmUgKHRoZSBDRE4gcmV0dXJucyBhbiBlbXB0eSBib2R5IGZvciB0aGVtKS5cbiAqL1xuY29uc3QgQ0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vcmVsZWFzZXMub2JzaWRpYW4ubWQvcmVsZWFzZSc7XG5cbmNvbnN0IENBQ0hFX1JPT1QgPSBqb2luKHRtcGRpcigpLCAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycpO1xuY29uc3QgQVNBUl9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdhc2FyLWNhY2hlJyk7XG5jb25zdCBBU0FSX0ZJTEVfUEFUVEVSTiA9IC9eb2JzaWRpYW4tKD88dmVyc2lvbj5cXGQrXFwuXFxkK1xcLlxcZCspXFwuYXNhciQvO1xuXG4vKipcbiAqIEEgZGlzY292ZXJlZCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEFzYXIge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgYXNhciBmaWxlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBgeC55LnpgIHZlcnNpb24gcGFyc2VkIGZyb20gdGhlIGZpbGUgbmFtZS4gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvcGllcyBhbiBhc2FyIGZpbGUgaW50byBhIHVzZXItZGF0YSBkaXIgdW5kZXIgaXRzIGNhbm9uaWNhbFxuICogYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBuYW1lLlxuICpcbiAqIEBwYXJhbSBhc2FyUGF0aCAtIFNvdXJjZSBhc2FyIHBhdGguXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSBhc2FyJ3MgdmVyc2lvbiAodXNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSkuXG4gKiBAcGFyYW0gdXNlckRhdGFEaXIgLSBEZXN0aW5hdGlvbiB1c2VyLWRhdGEgZGlyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weUFzYXJJbnRvVXNlckRhdGEoYXNhclBhdGg6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCB1c2VyRGF0YURpcjogc3RyaW5nKTogdm9pZCB7XG4gIG1rZGlyU3luYyh1c2VyRGF0YURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGRlc3QgPSBqb2luKHVzZXJEYXRhRGlyLCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbiAgY29weUZpbGVTeW5jKGFzYXJQYXRoLCBkZXN0KTtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFByb3Zpc2lvbmVkICR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0gaW50byAke3VzZXJEYXRhRGlyfS5gKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBhc2FyIGZvciBhIGNvbmNyZXRlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgbG9jYWwgY2FjaGUsXG4gKiBkb3dubG9hZGluZyBhbmQgZGVjb21wcmVzc2luZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgYXNhci5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQXNhckNhY2hlZCh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBta2RpclN5bmMoQVNBUl9DQUNIRV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjYWNoZWRQYXRoID0gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbik7XG4gIGlmIChleGlzdHNTeW5jKGNhY2hlZFBhdGgpKSB7XG4gICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFVzaW5nIGNhY2hlZCBhc2FyIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICB9XG5cbiAgLy8gQSB2ZXJzaW9uJ3MgYXNhci5neiBsaXZlcyBvbiBleGFjdGx5IG9uZSBob3N0IGRlcGVuZGluZyBvbiBpdHMgY2hhbm5lbFxuICAvLyAocHVibGljIFx1MjE5MiBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGNhdGFseXN0IFx1MjE5MiB0aGUgT2JzaWRpYW4gQ0ROKS4gVGhlIGNvbmNyZXRlXG4gIC8vIFZlcnNpb24gYWxvbmUgZG9lcyBub3QgdGVsbCB1cyB3aGljaCwgc28gdHJ5IGJvdGggYW5kIHVzZSB0aGUgZmlyc3QgdGhhdFxuICAvLyBSZXR1cm5zIGEgdmFsaWQgYXJjaGl2ZS5cbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHVybCBvZiBnZXRBc2FyRG93bmxvYWRVcmxzKHZlcnNpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzYXIgPSBhd2FpdCBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNhY2hlZFBhdGgsIGFzYXIpO1xuICAgICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIENhY2hlZCBhc2FyICR7dmVyc2lvbn0gKCR7U3RyaW5nKGFzYXIubGVuZ3RoKX0gYnl0ZXMpIC0+ICR7Y2FjaGVkUGF0aH1gKTtcbiAgICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBhc2FyICR7dmVyc2lvbn0uIEF0dGVtcHRzOiAke2Vycm9ycy5qb2luKCc7ICcpfWApO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYW5kIHBhcnNlcyBPYnNpZGlhbidzIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtYW5pZmVzdC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpOiBQcm9taXNlPERlc2t0b3BSZWxlYXNlc01hbmlmZXN0PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goREVTS1RPUF9SRUxFQVNFU19NQU5JRkVTVF9VUkwpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGVza3RvcCByZWxlYXNlcyBtYW5pZmVzdDogSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVza3RvcFJlbGVhc2VzTWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG5ld2VzdCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGluIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHNjYW4gKGUuZy4gdGhlIHVzZXIncyBPYnNpZGlhbiBjb25maWcgZGlyKS5cbiAqIEByZXR1cm5zIFRoZSBuZXdlc3QgZGlzY292ZXJlZCBhc2FyLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIC8gdGhlIGRpciBpcyB1bnJlYWRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5ld2VzdEFzYXIoZGlyOiBzdHJpbmcpOiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZCB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBuZXdlc3Q6IERpc2NvdmVyZWRBc2FyIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IEFTQVJfRklMRV9QQVRURVJOLmV4ZWMoZW50cnkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gbWF0Y2guZ3JvdXBzPy5bJ3ZlcnNpb24nXSA/PyAnJztcbiAgICBpZiAoIW5ld2VzdCB8fCBjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgbmV3ZXN0LnZlcnNpb24pID4gMCkge1xuICAgICAgbmV3ZXN0ID0geyBwYXRoOiBqb2luKGRpciwgZW50cnkpLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdlc3Q7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbG9jYWwgY2FjaGUgcGF0aCBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uJ3MgYXNhciAodGhlIGZpbGUgbWF5IG5vdFxuICogeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdGhlIGFzYXIgaXMgY2FjaGVkIGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oQVNBUl9DQUNIRV9ESVIsIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdmVyc2lvbiBzcGVjaWZpZXIgKGV4cGxpY2l0IG9yIGNoYW5uZWwgYWxpYXMpIHRvIGEgY29uY3JldGVcbiAqIGB4LnkuemAgdmVyc2lvbiwgZmV0Y2hpbmcgdGhlIG1hbmlmZXN0IG9ubHkgd2hlbiBhIGNoYW5uZWwgYWxpYXMgaXMgdXNlZC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSB2ZXJzaW9uIHNwZWNpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihzcGVjOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleHBsaWNpdCcpIHtcbiAgICByZXR1cm4gcGFyc2VkLnZlcnNpb247XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCk7XG4gIHJldHVybiByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdChtYW5pZmVzdCwgcGFyc2VkLmNoYW5uZWwpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBhIGd6aXAtY29tcHJlc3NlZCBhc2FyIGZyb20gYSBVUkwgYW5kIGRlY29tcHJlc3NlcyBpdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGAuYXNhci5nemAgVVJMLlxuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBhc2FyIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVxdWVzdCBmYWlscywgdGhlIGJvZHkgaXMgZW1wdHksIG9yIGRlY29tcHJlc3Npb24gZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRGVjb21wcmVzc0FzYXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBsb2coYFt2ZXJzaW9uLXN3aXRjaF0gRG93bmxvYWRpbmcgYXNhciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG5cbiAgY29uc3QgZ3ogPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGd6Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgcmVzcG9uc2UgYm9keScpO1xuICB9XG4gIHJldHVybiBndW56aXBTeW5jKGd6KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgYC5hc2FyLmd6YCBkb3dubG9hZCBVUkxzIGZvciBhIGNvbmNyZXRlIHZlcnNpb24sIHB1YmxpY1xuICogKEdpdEh1YikgZmlyc3QsIHRoZW4gY2F0YWx5c3QgKENETikuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBVUkxzIHRvIHRyeSwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEFzYXJEb3dubG9hZFVybHModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBhc2FyR3pGaWxlTmFtZSA9IGAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9Lmd6YDtcbiAgcmV0dXJuIFtcbiAgICBgJHtQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMfS92JHt2ZXJzaW9ufS8ke2FzYXJHekZpbGVOYW1lfWAsXG4gICAgYCR7Q0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMfS8ke2FzYXJHekZpbGVOYW1lfWBcbiAgXTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsU0FBUyxrQkFBa0I7QUFJM0IsU0FBUyxXQUFXO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBT1AsTUFBTSxzQkFBc0I7QUFNNUIsTUFBTSwrQkFBK0I7QUFPckMsTUFBTSxpQ0FBaUM7QUFFdkMsTUFBTSxhQUFhLEtBQUssT0FBTyxHQUFHLDhCQUE4QjtBQUNoRSxNQUFNLGlCQUFpQixLQUFLLFlBQVksWUFBWTtBQUNwRCxNQUFNLG9CQUFvQjtBQXFCbkIsU0FBUyxxQkFBcUIsVUFBa0IsU0FBaUIsYUFBMkI7QUFDakcsWUFBVSxhQUFhLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDMUMsUUFBTSxPQUFPLEtBQUssYUFBYSx1QkFBdUIsT0FBTyxDQUFDO0FBQzlELGVBQWEsVUFBVSxJQUFJO0FBQzNCLE1BQUksZ0NBQWdDLHVCQUF1QixPQUFPLENBQUMsU0FBUyxXQUFXLEdBQUc7QUFDNUY7QUFVQSxlQUFzQixpQkFBaUIsU0FBa0M7QUFDdkUsWUFBVSxnQkFBZ0IsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUM3QyxRQUFNLGFBQWEsa0JBQWtCLE9BQU87QUFDNUMsTUFBSSxXQUFXLFVBQVUsR0FBRztBQUMxQixRQUFJLDBDQUEwQyxPQUFPLEdBQUc7QUFDeEQsV0FBTztBQUFBLEVBQ1Q7QUFNQSxRQUFNLFNBQW1CLENBQUM7QUFDMUIsYUFB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
119
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyLlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXIpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gTWF0Y2hlcyB0aGUgVUEgZG9jdW1lbnRlZCBpbiB0aGUgb2JzaWRpYW4tdmVyc2lvbnMgcmVwby5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipjYXRhbHlzdCoqIChlYXJseSBhY2Nlc3MgLyBpbnNpZGVyKSByZWxlYXNlIGFzYXJzLCBzZXJ2ZWQgZnJvbVxuICogdGhlIE9ic2lkaWFuIENETiBhcyBgLi4uL3JlbGVhc2Uvb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLiBQdWJsaWMgdmVyc2lvbnNcbiAqIGFyZSBOT1QgaG9zdGVkIGhlcmUgKHRoZSBDRE4gcmV0dXJucyBhbiBlbXB0eSBib2R5IGZvciB0aGVtKS5cbiAqL1xuY29uc3QgQ0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vcmVsZWFzZXMub2JzaWRpYW4ubWQvcmVsZWFzZSc7XG5cbmNvbnN0IENBQ0hFX1JPT1QgPSBqb2luKHRtcGRpcigpLCAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycpO1xuY29uc3QgQVNBUl9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdhc2FyLWNhY2hlJyk7XG5jb25zdCBBU0FSX0ZJTEVfUEFUVEVSTiA9IC9eb2JzaWRpYW4tKD88dmVyc2lvbj5cXGQrXFwuXFxkK1xcLlxcZCspXFwuYXNhciQvO1xuXG4vKipcbiAqIEEgZGlzY292ZXJlZCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEFzYXIge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgYXNhciBmaWxlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBgeC55LnpgIHZlcnNpb24gcGFyc2VkIGZyb20gdGhlIGZpbGUgbmFtZS4gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvcGllcyBhbiBhc2FyIGZpbGUgaW50byBhIHVzZXItZGF0YSBkaXIgdW5kZXIgaXRzIGNhbm9uaWNhbFxuICogYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBuYW1lLlxuICpcbiAqIEBwYXJhbSBhc2FyUGF0aCAtIFNvdXJjZSBhc2FyIHBhdGguXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSBhc2FyJ3MgdmVyc2lvbiAodXNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSkuXG4gKiBAcGFyYW0gdXNlckRhdGFEaXIgLSBEZXN0aW5hdGlvbiB1c2VyLWRhdGEgZGlyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weUFzYXJJbnRvVXNlckRhdGEoYXNhclBhdGg6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCB1c2VyRGF0YURpcjogc3RyaW5nKTogdm9pZCB7XG4gIG1rZGlyU3luYyh1c2VyRGF0YURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGRlc3QgPSBqb2luKHVzZXJEYXRhRGlyLCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbiAgY29weUZpbGVTeW5jKGFzYXJQYXRoLCBkZXN0KTtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFByb3Zpc2lvbmVkICR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0gaW50byAke3VzZXJEYXRhRGlyfS5gKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBhc2FyIGZvciBhIGNvbmNyZXRlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgbG9jYWwgY2FjaGUsXG4gKiBkb3dubG9hZGluZyBhbmQgZGVjb21wcmVzc2luZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgYXNhci5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQXNhckNhY2hlZCh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBta2RpclN5bmMoQVNBUl9DQUNIRV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjYWNoZWRQYXRoID0gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbik7XG4gIGlmIChleGlzdHNTeW5jKGNhY2hlZFBhdGgpKSB7XG4gICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFVzaW5nIGNhY2hlZCBhc2FyIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICB9XG5cbiAgLy8gQSB2ZXJzaW9uJ3MgYXNhci5neiBsaXZlcyBvbiBleGFjdGx5IG9uZSBob3N0IGRlcGVuZGluZyBvbiBpdHMgY2hhbm5lbFxuICAvLyAocHVibGljIFx1MjE5MiBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGNhdGFseXN0IFx1MjE5MiB0aGUgT2JzaWRpYW4gQ0ROKS4gVGhlIGNvbmNyZXRlXG4gIC8vIFZlcnNpb24gYWxvbmUgZG9lcyBub3QgdGVsbCB1cyB3aGljaCwgc28gdHJ5IGJvdGggYW5kIHVzZSB0aGUgZmlyc3QgdGhhdFxuICAvLyBSZXR1cm5zIGEgdmFsaWQgYXJjaGl2ZS5cbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHVybCBvZiBnZXRBc2FyRG93bmxvYWRVcmxzKHZlcnNpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzYXIgPSBhd2FpdCBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNhY2hlZFBhdGgsIGFzYXIpO1xuICAgICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIENhY2hlZCBhc2FyICR7dmVyc2lvbn0gKCR7U3RyaW5nKGFzYXIubGVuZ3RoKX0gYnl0ZXMpIC0+ICR7Y2FjaGVkUGF0aH1gKTtcbiAgICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBhc2FyICR7dmVyc2lvbn0uIEF0dGVtcHRzOiAke2Vycm9ycy5qb2luKCc7ICcpfWApO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYW5kIHBhcnNlcyBPYnNpZGlhbidzIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtYW5pZmVzdC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpOiBQcm9taXNlPERlc2t0b3BSZWxlYXNlc01hbmlmZXN0PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goREVTS1RPUF9SRUxFQVNFU19NQU5JRkVTVF9VUkwpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGVza3RvcCByZWxlYXNlcyBtYW5pZmVzdDogSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVza3RvcFJlbGVhc2VzTWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG5ld2VzdCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGluIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHNjYW4gKGUuZy4gdGhlIHVzZXIncyBPYnNpZGlhbiBjb25maWcgZGlyKS5cbiAqIEByZXR1cm5zIFRoZSBuZXdlc3QgZGlzY292ZXJlZCBhc2FyLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIC8gdGhlIGRpciBpcyB1bnJlYWRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5ld2VzdEFzYXIoZGlyOiBzdHJpbmcpOiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZCB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBuZXdlc3Q6IERpc2NvdmVyZWRBc2FyIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IEFTQVJfRklMRV9QQVRURVJOLmV4ZWMoZW50cnkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gbWF0Y2guZ3JvdXBzPy5bJ3ZlcnNpb24nXSA/PyAnJztcbiAgICBpZiAoIW5ld2VzdCB8fCBjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgbmV3ZXN0LnZlcnNpb24pID4gMCkge1xuICAgICAgbmV3ZXN0ID0geyBwYXRoOiBqb2luKGRpciwgZW50cnkpLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdlc3Q7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbG9jYWwgY2FjaGUgcGF0aCBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uJ3MgYXNhciAodGhlIGZpbGUgbWF5IG5vdFxuICogeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdGhlIGFzYXIgaXMgY2FjaGVkIGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oQVNBUl9DQUNIRV9ESVIsIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdmVyc2lvbiBzcGVjaWZpZXIgKGV4cGxpY2l0IG9yIGNoYW5uZWwgYWxpYXMpIHRvIGEgY29uY3JldGVcbiAqIGB4LnkuemAgdmVyc2lvbiwgZmV0Y2hpbmcgdGhlIG1hbmlmZXN0IG9ubHkgd2hlbiBhIGNoYW5uZWwgYWxpYXMgaXMgdXNlZC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSB2ZXJzaW9uIHNwZWNpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihzcGVjOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleHBsaWNpdCcpIHtcbiAgICByZXR1cm4gcGFyc2VkLnZlcnNpb247XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCk7XG4gIHJldHVybiByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdChtYW5pZmVzdCwgcGFyc2VkLmNoYW5uZWwpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBhIGd6aXAtY29tcHJlc3NlZCBhc2FyIGZyb20gYSBVUkwgYW5kIGRlY29tcHJlc3NlcyBpdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGAuYXNhci5nemAgVVJMLlxuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBhc2FyIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVxdWVzdCBmYWlscywgdGhlIGJvZHkgaXMgZW1wdHksIG9yIGRlY29tcHJlc3Npb24gZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRGVjb21wcmVzc0FzYXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBsb2coYFt2ZXJzaW9uLXN3aXRjaF0gRG93bmxvYWRpbmcgYXNhciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG5cbiAgY29uc3QgZ3ogPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGd6Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgcmVzcG9uc2UgYm9keScpO1xuICB9XG4gIHJldHVybiBndW56aXBTeW5jKGd6KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgYC5hc2FyLmd6YCBkb3dubG9hZCBVUkxzIGZvciBhIGNvbmNyZXRlIHZlcnNpb24uXG4gKlxuICogVGhlIHZlcnNpb24ncyBleGFjdCBVUkwgYmFrZWQgaW50byB0aGUgYG1ldGFkYXRhLmpzb25gIGNhdGFsb2cgKGZyb20gdXBzdHJlYW1cbiAqIGBvYnNpZGlhbi12ZXJzaW9ucy5qc29uYCkgaXMgdHJpZWQgZmlyc3Qgd2hlbiBwcmVzZW50OyB0aGUgaGFuZC1yb2xsZWQgcHVibGljXG4gKiAoR2l0SHViKSBhbmQgY2F0YWx5c3QgKENETikgZ3Vlc3NlcyBmb2xsb3cgYXMgYSBmYWxsYmFjayBmb3IgdmVyc2lvbnMgYWJzZW50XG4gKiBmcm9tIHRoZSBjYXRhbG9nIChvciBhIHN0YWxlIGNhdGFsb2cpLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gQSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgVVJMcyB0byB0cnksIGluIG9yZGVyLlxuICovXG5mdW5jdGlvbiBnZXRBc2FyRG93bmxvYWRVcmxzKHZlcnNpb246IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXNhckd6RmlsZU5hbWUgPSBgJHtnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pfS5nemA7XG4gIGNvbnN0IGZhbGxiYWNrVXJscyA9IFtcbiAgICBgJHtQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMfS92JHt2ZXJzaW9ufS8ke2FzYXJHekZpbGVOYW1lfWAsXG4gICAgYCR7Q0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMfS8ke2FzYXJHekZpbGVOYW1lfWBcbiAgXTtcblxuICBjb25zdCBiYWtlZFVybCA9IGdldFZlcnNpb25NZXRhZGF0YSh2ZXJzaW9uKT8uZG93bmxvYWRzPy5hc2FyO1xuICByZXR1cm4gYmFrZWRVcmwgPyBbYmFrZWRVcmwsIC4uLmZhbGxiYWNrVXJsc10gOiBmYWxsYmFja1VybHM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFnQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsa0JBQWtCO0FBSTNCLFNBQVMsV0FBVztBQUNwQixTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQU9QLE1BQU0sc0JBQXNCO0FBTTVCLE1BQU0sK0JBQStCO0FBT3JDLE1BQU0saUNBQWlDO0FBRXZD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
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Builds the isolated `obsidian.json` the harness pre-seeds into an owned
5
+ * instance's temp `--user-data-dir` so Obsidian opens the harness vault directly
6
+ * instead of showing the first-run vault-selector (the `starter-screen`).
7
+ *
8
+ * The auto-open marker changed across Obsidian's history, so the seed carries
9
+ * BOTH forms and each version reads the one it understands (ignoring the other
10
+ * unknown key) — no per-version branching:
11
+ *
12
+ * - **Old versions** (confirmed 0.6.4) auto-open from a **top-level `last_open`**
13
+ * holding the vault id (`main.js`: `if (id && vaults.hasOwnProperty(id))
14
+ * createWindow(id); else openStarter();`), and store each vault entry as just
15
+ * `{ path, ts }`. Without `last_open` they fall through to the vault-selector.
16
+ * - **Newer versions** (confirmed 0.14.5+) dropped `last_open` and auto-open from
17
+ * the per-entry **`open: true`** flag.
18
+ *
19
+ * Seeding both was verified to open the vault directly (no selector) on 0.6.4,
20
+ * 0.9.20, 0.12.19, 0.13.19, 0.14.5 and 1.12.7. `updateDisabled` suppresses the
21
+ * throwaway instance's self-update.
22
+ */
23
+ /**
24
+ * Parameters for {@link buildOwnedObsidianJson}.
25
+ */
26
+ export interface BuildOwnedObsidianJsonParams {
27
+ /** Last-access timestamp to stamp on the vault entry. */
28
+ readonly ts: number;
29
+ /** The randomly-generated vault id used as the registry key and `last_open`. */
30
+ readonly vaultId: string;
31
+ /** Absolute path to the harness vault folder. */
32
+ readonly vaultPath: string;
33
+ }
34
+ /**
35
+ * The `obsidian.json` structure the harness seeds for an owned instance.
36
+ */
37
+ export interface OwnedObsidianJson {
38
+ /**
39
+ * Top-level auto-open marker (vault id) honored by old Obsidian versions;
40
+ * ignored as an unknown key by newer versions that use the per-entry `open`.
41
+ */
42
+ readonly last_open: string;
43
+ /** Disables the throwaway instance's self-update. */
44
+ readonly updateDisabled: true;
45
+ /** Vault registry keyed by vault id. */
46
+ readonly vaults: Readonly<Record<string, OwnedObsidianVaultEntry>>;
47
+ }
48
+ /**
49
+ * A single vault entry in the seeded `obsidian.json`.
50
+ */
51
+ export interface OwnedObsidianVaultEntry {
52
+ /** Per-entry auto-open flag honored by newer Obsidian versions. */
53
+ readonly open: true;
54
+ /** Absolute path to the harness vault folder. */
55
+ readonly path: string;
56
+ /** Last-access timestamp. */
57
+ readonly ts: number;
58
+ }
59
+ /**
60
+ * Builds the isolated `obsidian.json` that force-opens the owned vault across all
61
+ * supported Obsidian versions (see the file overview for the dual-marker
62
+ * rationale).
63
+ *
64
+ * @param params - The vault id, path, and timestamp to seed.
65
+ * @returns The `obsidian.json` object to write into the owned user-data dir.
66
+ */
67
+ export declare function buildOwnedObsidianJson(params: BuildOwnedObsidianJsonParams): OwnedObsidianJson;
@@ -0,0 +1,14 @@
1
+ function buildOwnedObsidianJson(params) {
2
+ return {
3
+ // eslint-disable-next-line camelcase -- Obsidian's own obsidian.json field name (old versions' auto-open marker).
4
+ last_open: params.vaultId,
5
+ updateDisabled: true,
6
+ vaults: {
7
+ [params.vaultId]: { open: true, path: params.vaultPath, ts: params.ts }
8
+ }
9
+ };
10
+ }
11
+ export {
12
+ buildOwnedObsidianJson
13
+ };
14
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLXZhdWx0LXNlZWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYCB0aGUgaGFybmVzcyBwcmUtc2VlZHMgaW50byBhbiBvd25lZFxuICogaW5zdGFuY2UncyB0ZW1wIGAtLXVzZXItZGF0YS1kaXJgIHNvIE9ic2lkaWFuIG9wZW5zIHRoZSBoYXJuZXNzIHZhdWx0IGRpcmVjdGx5XG4gKiBpbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZpcnN0LXJ1biB2YXVsdC1zZWxlY3RvciAodGhlIGBzdGFydGVyLXNjcmVlbmApLlxuICpcbiAqIFRoZSBhdXRvLW9wZW4gbWFya2VyIGNoYW5nZWQgYWNyb3NzIE9ic2lkaWFuJ3MgaGlzdG9yeSwgc28gdGhlIHNlZWQgY2Fycmllc1xuICogQk9USCBmb3JtcyBhbmQgZWFjaCB2ZXJzaW9uIHJlYWRzIHRoZSBvbmUgaXQgdW5kZXJzdGFuZHMgKGlnbm9yaW5nIHRoZSBvdGhlclxuICogdW5rbm93biBrZXkpIFx1MjAxNCBubyBwZXItdmVyc2lvbiBicmFuY2hpbmc6XG4gKlxuICogLSAqKk9sZCB2ZXJzaW9ucyoqIChjb25maXJtZWQgMC42LjQpIGF1dG8tb3BlbiBmcm9tIGEgKip0b3AtbGV2ZWwgYGxhc3Rfb3BlbmAqKlxuICogICBob2xkaW5nIHRoZSB2YXVsdCBpZCAoYG1haW4uanNgOiBgaWYgKGlkICYmIHZhdWx0cy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gKiAgIGNyZWF0ZVdpbmRvdyhpZCk7IGVsc2Ugb3BlblN0YXJ0ZXIoKTtgKSwgYW5kIHN0b3JlIGVhY2ggdmF1bHQgZW50cnkgYXMganVzdFxuICogICBgeyBwYXRoLCB0cyB9YC4gV2l0aG91dCBgbGFzdF9vcGVuYCB0aGV5IGZhbGwgdGhyb3VnaCB0byB0aGUgdmF1bHQtc2VsZWN0b3IuXG4gKiAtICoqTmV3ZXIgdmVyc2lvbnMqKiAoY29uZmlybWVkIDAuMTQuNSspIGRyb3BwZWQgYGxhc3Rfb3BlbmAgYW5kIGF1dG8tb3BlbiBmcm9tXG4gKiAgIHRoZSBwZXItZW50cnkgKipgb3BlbjogdHJ1ZWAqKiBmbGFnLlxuICpcbiAqIFNlZWRpbmcgYm90aCB3YXMgdmVyaWZpZWQgdG8gb3BlbiB0aGUgdmF1bHQgZGlyZWN0bHkgKG5vIHNlbGVjdG9yKSBvbiAwLjYuNCxcbiAqIDAuOS4yMCwgMC4xMi4xOSwgMC4xMy4xOSwgMC4xNC41IGFuZCAxLjEyLjcuIGB1cGRhdGVEaXNhYmxlZGAgc3VwcHJlc3NlcyB0aGVcbiAqIHRocm93YXdheSBpbnN0YW5jZSdzIHNlbGYtdXBkYXRlLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkT3duZWRPYnNpZGlhbkpzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3duZWRPYnNpZGlhbkpzb25QYXJhbXMge1xuICAvKiogTGFzdC1hY2Nlc3MgdGltZXN0YW1wIHRvIHN0YW1wIG9uIHRoZSB2YXVsdCBlbnRyeS4gKi9cbiAgcmVhZG9ubHkgdHM6IG51bWJlcjtcblxuICAvKiogVGhlIHJhbmRvbWx5LWdlbmVyYXRlZCB2YXVsdCBpZCB1c2VkIGFzIHRoZSByZWdpc3RyeSBrZXkgYW5kIGBsYXN0X29wZW5gLiAqL1xuICByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIGhhcm5lc3MgdmF1bHQgZm9sZGVyLiAqL1xuICByZWFkb25seSB2YXVsdFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgYG9ic2lkaWFuLmpzb25gIHN0cnVjdHVyZSB0aGUgaGFybmVzcyBzZWVkcyBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRPYnNpZGlhbkpzb24ge1xuICAvKipcbiAgICogVG9wLWxldmVsIGF1dG8tb3BlbiBtYXJrZXIgKHZhdWx0IGlkKSBob25vcmVkIGJ5IG9sZCBPYnNpZGlhbiB2ZXJzaW9ucztcbiAgICogaWdub3JlZCBhcyBhbiB1bmtub3duIGtleSBieSBuZXdlciB2ZXJzaW9ucyB0aGF0IHVzZSB0aGUgcGVyLWVudHJ5IGBvcGVuYC5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3Rfb3Blbjogc3RyaW5nO1xuXG4gIC8qKiBEaXNhYmxlcyB0aGUgdGhyb3dhd2F5IGluc3RhbmNlJ3Mgc2VsZi11cGRhdGUuICovXG4gIHJlYWRvbmx5IHVwZGF0ZURpc2FibGVkOiB0cnVlO1xuXG4gIC8qKiBWYXVsdCByZWdpc3RyeSBrZXllZCBieSB2YXVsdCBpZC4gKi9cbiAgcmVhZG9ubHkgdmF1bHRzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBPd25lZE9ic2lkaWFuVmF1bHRFbnRyeT4+O1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIHZhdWx0IGVudHJ5IGluIHRoZSBzZWVkZWQgYG9ic2lkaWFuLmpzb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkT2JzaWRpYW5WYXVsdEVudHJ5IHtcbiAgLyoqIFBlci1lbnRyeSBhdXRvLW9wZW4gZmxhZyBob25vcmVkIGJ5IG5ld2VyIE9ic2lkaWFuIHZlcnNpb25zLiAqL1xuICByZWFkb25seSBvcGVuOiB0cnVlO1xuXG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBoYXJuZXNzIHZhdWx0IGZvbGRlci4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKiBMYXN0LWFjY2VzcyB0aW1lc3RhbXAuICovXG4gIHJlYWRvbmx5IHRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpc29sYXRlZCBgb2JzaWRpYW4uanNvbmAgdGhhdCBmb3JjZS1vcGVucyB0aGUgb3duZWQgdmF1bHQgYWNyb3NzIGFsbFxuICogc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb25zIChzZWUgdGhlIGZpbGUgb3ZlcnZpZXcgZm9yIHRoZSBkdWFsLW1hcmtlclxuICogcmF0aW9uYWxlKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHZhdWx0IGlkLCBwYXRoLCBhbmQgdGltZXN0YW1wIHRvIHNlZWQuXG4gKiBAcmV0dXJucyBUaGUgYG9ic2lkaWFuLmpzb25gIG9iamVjdCB0byB3cml0ZSBpbnRvIHRoZSBvd25lZCB1c2VyLWRhdGEgZGlyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPd25lZE9ic2lkaWFuSnNvbihwYXJhbXM6IEJ1aWxkT3duZWRPYnNpZGlhbkpzb25QYXJhbXMpOiBPd25lZE9ic2lkaWFuSnNvbiB7XG4gIHJldHVybiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZSAtLSBPYnNpZGlhbidzIG93biBvYnNpZGlhbi5qc29uIGZpZWxkIG5hbWUgKG9sZCB2ZXJzaW9ucycgYXV0by1vcGVuIG1hcmtlcikuXG4gICAgbGFzdF9vcGVuOiBwYXJhbXMudmF1bHRJZCxcbiAgICB1cGRhdGVEaXNhYmxlZDogdHJ1ZSxcbiAgICB2YXVsdHM6IHtcbiAgICAgIFtwYXJhbXMudmF1bHRJZF06IHsgb3BlbjogdHJ1ZSwgcGF0aDogcGFyYW1zLnZhdWx0UGF0aCwgdHM6IHBhcmFtcy50cyB9XG4gICAgfVxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBNEVPLFNBQVMsdUJBQXVCLFFBQXlEO0FBQzlGLFNBQU87QUFBQTtBQUFBLElBRUwsV0FBVyxPQUFPO0FBQUEsSUFDbEIsZ0JBQWdCO0FBQUEsSUFDaEIsUUFBUTtBQUFBLE1BQ04sQ0FBQyxPQUFPLE9BQU8sR0FBRyxFQUFFLE1BQU0sTUFBTSxNQUFNLE9BQU8sV0FBVyxJQUFJLE9BQU8sR0FBRztBQUFBLElBQ3hFO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure builder for the diagnostic message describing an auto-started child
5
+ * process (the Android emulator or the Appium server) that died during startup,
6
+ * appending the captured output tail when available.
7
+ *
8
+ * Kept separate from the integration-only `transport-factory` (excluded from
9
+ * unit tests) so the message formatting stays unit-testable — the launchers
10
+ * themselves spawn real processes.
11
+ */
12
+ /**
13
+ * Parameters for {@link buildProcessExitMessage}.
14
+ */
15
+ export interface BuildProcessExitMessageParams {
16
+ /** The process's exit / spawn-failure details. */
17
+ readonly exitInfo: ProcessExitInfo;
18
+ /** The captured stdout+stderr tail (empty when none was captured). */
19
+ readonly output: string;
20
+ /** Label for the captured output section (e.g. `"Emulator output"`). */
21
+ readonly outputLabel: string;
22
+ /** Human-readable subject of the process (e.g. `"Android emulator"`). */
23
+ readonly subject: string;
24
+ }
25
+ /**
26
+ * Details of a spawned child process that has exited or failed to spawn.
27
+ *
28
+ * A normal exit sets `code`/`signal` (exactly one is non-`null`); a spawn
29
+ * failure (e.g. `ENOENT` for a missing binary) leaves both `null` and sets
30
+ * `spawnError` to the failure message.
31
+ */
32
+ export interface ProcessExitInfo {
33
+ /** Exit code, or `null` when terminated by a signal or when it failed to spawn. */
34
+ readonly code: null | number;
35
+ /** Terminating signal, or `null` when it exited normally or failed to spawn. */
36
+ readonly signal: NodeJS.Signals | null;
37
+ /** The spawn-failure message when the process never started (e.g. `ENOENT`), otherwise absent. */
38
+ readonly spawnError?: string;
39
+ }
40
+ /**
41
+ * Builds a descriptive error message for an auto-started child process that
42
+ * exited (or failed to spawn) during startup, appending the captured output
43
+ * tail when available.
44
+ *
45
+ * @param params - The subject, exit details, and captured output.
46
+ * @returns A human-readable error message.
47
+ */
48
+ export declare function buildProcessExitMessage(params: BuildProcessExitMessageParams): string;
@@ -0,0 +1,23 @@
1
+ function buildProcessExitMessage(params) {
2
+ const { exitInfo, output, outputLabel, subject } = params;
3
+ const reason = resolveReason(exitInfo);
4
+ const trimmedOutput = output.trim();
5
+ const details = trimmedOutput.length > 0 ? `
6
+
7
+ ${outputLabel} (tail):
8
+ ${trimmedOutput}` : "";
9
+ return `${subject} ${reason} during startup.${details}`;
10
+ }
11
+ function resolveReason(exitInfo) {
12
+ if (exitInfo.spawnError !== void 0) {
13
+ return `failed to start (${exitInfo.spawnError})`;
14
+ }
15
+ if (exitInfo.signal !== null) {
16
+ return `was terminated by signal ${exitInfo.signal}`;
17
+ }
18
+ return `exited prematurely with code ${exitInfo.code === null ? "(null)" : String(exitInfo.code)}`;
19
+ }
20
+ export {
21
+ buildProcessExitMessage
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Byb2Nlc3MtZXhpdC1tZXNzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBidWlsZGVyIGZvciB0aGUgZGlhZ25vc3RpYyBtZXNzYWdlIGRlc2NyaWJpbmcgYW4gYXV0by1zdGFydGVkIGNoaWxkXG4gKiBwcm9jZXNzICh0aGUgQW5kcm9pZCBlbXVsYXRvciBvciB0aGUgQXBwaXVtIHNlcnZlcikgdGhhdCBkaWVkIGR1cmluZyBzdGFydHVwLFxuICogYXBwZW5kaW5nIHRoZSBjYXB0dXJlZCBvdXRwdXQgdGFpbCB3aGVuIGF2YWlsYWJsZS5cbiAqXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCAoZXhjbHVkZWQgZnJvbVxuICogdW5pdCB0ZXN0cykgc28gdGhlIG1lc3NhZ2UgZm9ybWF0dGluZyBzdGF5cyB1bml0LXRlc3RhYmxlIFx1MjAxNCB0aGUgbGF1bmNoZXJzXG4gKiB0aGVtc2VsdmVzIHNwYXduIHJlYWwgcHJvY2Vzc2VzLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFByb2Nlc3NFeGl0TWVzc2FnZVBhcmFtcyB7XG4gIC8qKiBUaGUgcHJvY2VzcydzIGV4aXQgLyBzcGF3bi1mYWlsdXJlIGRldGFpbHMuICovXG4gIHJlYWRvbmx5IGV4aXRJbmZvOiBQcm9jZXNzRXhpdEluZm87XG5cbiAgLyoqIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwgKGVtcHR5IHdoZW4gbm9uZSB3YXMgY2FwdHVyZWQpLiAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKiogTGFiZWwgZm9yIHRoZSBjYXB0dXJlZCBvdXRwdXQgc2VjdGlvbiAoZS5nLiBgXCJFbXVsYXRvciBvdXRwdXRcImApLiAqL1xuICByZWFkb25seSBvdXRwdXRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzdWJqZWN0IG9mIHRoZSBwcm9jZXNzIChlLmcuIGBcIkFuZHJvaWQgZW11bGF0b3JcImApLiAqL1xuICByZWFkb25seSBzdWJqZWN0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGV0YWlscyBvZiBhIHNwYXduZWQgY2hpbGQgcHJvY2VzcyB0aGF0IGhhcyBleGl0ZWQgb3IgZmFpbGVkIHRvIHNwYXduLlxuICpcbiAqIEEgbm9ybWFsIGV4aXQgc2V0cyBgY29kZWAvYHNpZ25hbGAgKGV4YWN0bHkgb25lIGlzIG5vbi1gbnVsbGApOyBhIHNwYXduXG4gKiBmYWlsdXJlIChlLmcuIGBFTk9FTlRgIGZvciBhIG1pc3NpbmcgYmluYXJ5KSBsZWF2ZXMgYm90aCBgbnVsbGAgYW5kIHNldHNcbiAqIGBzcGF3bkVycm9yYCB0byB0aGUgZmFpbHVyZSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NFeGl0SW5mbyB7XG4gIC8qKiBFeGl0IGNvZGUsIG9yIGBudWxsYCB3aGVuIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwgb3Igd2hlbiBpdCBmYWlsZWQgdG8gc3Bhd24uICovXG4gIHJlYWRvbmx5IGNvZGU6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqIFRlcm1pbmF0aW5nIHNpZ25hbCwgb3IgYG51bGxgIHdoZW4gaXQgZXhpdGVkIG5vcm1hbGx5IG9yIGZhaWxlZCB0byBzcGF3bi4gKi9cbiAgcmVhZG9ubHkgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGw7XG5cbiAgLyoqIFRoZSBzcGF3bi1mYWlsdXJlIG1lc3NhZ2Ugd2hlbiB0aGUgcHJvY2VzcyBuZXZlciBzdGFydGVkIChlLmcuIGBFTk9FTlRgKSwgb3RoZXJ3aXNlIGFic2VudC4gKi9cbiAgcmVhZG9ubHkgc3Bhd25FcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGZvciBhbiBhdXRvLXN0YXJ0ZWQgY2hpbGQgcHJvY2VzcyB0aGF0XG4gKiBleGl0ZWQgKG9yIGZhaWxlZCB0byBzcGF3bikgZHVyaW5nIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0XG4gKiB0YWlsIHdoZW4gYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3ViamVjdCwgZXhpdCBkZXRhaWxzLCBhbmQgY2FwdHVyZWQgb3V0cHV0LlxuICogQHJldHVybnMgQSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcm9jZXNzRXhpdE1lc3NhZ2UocGFyYW1zOiBCdWlsZFByb2Nlc3NFeGl0TWVzc2FnZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZXhpdEluZm8sIG91dHB1dCwgb3V0cHV0TGFiZWwsIHN1YmplY3QgfSA9IHBhcmFtcztcblxuICBjb25zdCByZWFzb24gPSByZXNvbHZlUmVhc29uKGV4aXRJbmZvKTtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG4ke291dHB1dExhYmVsfSAodGFpbCk6XFxuJHt0cmltbWVkT3V0cHV0fWBcbiAgICA6ICcnO1xuICByZXR1cm4gYCR7c3ViamVjdH0gJHtyZWFzb259IGR1cmluZyBzdGFydHVwLiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyB3aHkgdGhlIHByb2Nlc3MgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGV4aXQgLyBzcGF3bi1mYWlsdXJlIGRldGFpbHMuXG4gKiBAcmV0dXJucyBUaGUgcmVhc29uIGNsYXVzZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlYXNvbihleGl0SW5mbzogUHJvY2Vzc0V4aXRJbmZvKTogc3RyaW5nIHtcbiAgaWYgKGV4aXRJbmZvLnNwYXduRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgZmFpbGVkIHRvIHN0YXJ0ICgke2V4aXRJbmZvLnNwYXduRXJyb3J9KWA7XG4gIH1cbiAgaWYgKGV4aXRJbmZvLnNpZ25hbCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZXhpdEluZm8uc2lnbmFsfWA7XG4gIH1cbiAgcmV0dXJuIGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7ZXhpdEluZm8uY29kZSA9PT0gbnVsbCA/ICcobnVsbCknIDogU3RyaW5nKGV4aXRJbmZvLmNvZGUpfWA7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUF1RE8sU0FBUyx3QkFBd0IsUUFBK0M7QUFDckYsUUFBTSxFQUFFLFVBQVUsUUFBUSxhQUFhLFFBQVEsSUFBSTtBQUVuRCxRQUFNLFNBQVMsY0FBYyxRQUFRO0FBQ3JDLFFBQU0sZ0JBQWdCLE9BQU8sS0FBSztBQUNsQyxRQUFNLFVBQVUsY0FBYyxTQUFTLElBQ25DO0FBQUE7QUFBQSxFQUFPLFdBQVc7QUFBQSxFQUFhLGFBQWEsS0FDNUM7QUFDSixTQUFPLEdBQUcsT0FBTyxJQUFJLE1BQU0sbUJBQW1CLE9BQU87QUFDdkQ7QUFRQSxTQUFTLGNBQWMsVUFBbUM7QUFDeEQsTUFBSSxTQUFTLGVBQWUsUUFBVztBQUNyQyxXQUFPLG9CQUFvQixTQUFTLFVBQVU7QUFBQSxFQUNoRDtBQUNBLE1BQUksU0FBUyxXQUFXLE1BQU07QUFDNUIsV0FBTyw0QkFBNEIsU0FBUyxNQUFNO0FBQUEsRUFDcEQ7QUFDQSxTQUFPLGdDQUFnQyxTQUFTLFNBQVMsT0FBTyxXQUFXLE9BQU8sU0FBUyxJQUFJLENBQUM7QUFDbEc7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when a booted owned Obsidian instance is **not**
5
+ * running the pinned app (asar) version — the installer shell silently fell back
6
+ * to its own bundled asar instead of running the swapped-in pin (see
7
+ * `asar-fallback-detection`). Unlike `RendererFailedToInitializeError` (a
8
+ * black-screen dead boot) this fires on a *healthy* renderer running the wrong
9
+ * (older) version, so it is discovered post-boot from the live running version
10
+ * rather than from an empty `<body>`. It is exported so callers of `connectToCdp`
11
+ * / the transport can `instanceof`-match this specific failure.
12
+ */
13
+ /**
14
+ * Parameters for the {@link SilentAsarFallbackError} constructor.
15
+ */
16
+ export interface SilentAsarFallbackErrorConstructorParams {
17
+ /** The pinned Obsidian app (asar) version that was requested. */
18
+ readonly requestedVersion: string;
19
+ /** The Obsidian app (asar) version the instance is actually running. */
20
+ readonly runningApiVersion: string;
21
+ }
22
+ /**
23
+ * Thrown when a booted owned instance is running a different app (asar) version
24
+ * than the pinned {@link SilentAsarFallbackErrorConstructorParams.requestedVersion} —
25
+ * the installer shell was too old for the pin and silently reverted to its own
26
+ * bundled asar. Carries both versions so callers can `instanceof`-match and
27
+ * surface an actionable remedy (pin a newer installer).
28
+ */
29
+ export declare class SilentAsarFallbackError extends Error {
30
+ /** The pinned Obsidian app (asar) version that was requested. */
31
+ readonly requestedVersion: string;
32
+ /** The Obsidian app (asar) version the instance is actually running. */
33
+ readonly runningApiVersion: string;
34
+ /**
35
+ * Creates the error from the pinned and actually-running versions.
36
+ *
37
+ * @param params - The requested pin and the version actually running.
38
+ */
39
+ constructor(params: SilentAsarFallbackErrorConstructorParams);
40
+ }
@@ -0,0 +1,24 @@
1
+ class SilentAsarFallbackError extends Error {
2
+ /** The pinned Obsidian app (asar) version that was requested. */
3
+ requestedVersion;
4
+ /** The Obsidian app (asar) version the instance is actually running. */
5
+ runningApiVersion;
6
+ /**
7
+ * Creates the error from the pinned and actually-running versions.
8
+ *
9
+ * @param params - The requested pin and the version actually running.
10
+ */
11
+ constructor(params) {
12
+ const { requestedVersion, runningApiVersion } = params;
13
+ super(
14
+ `Obsidian was pinned to app version ${requestedVersion} but is actually running ${runningApiVersion} \u2014 the installer shell is too old for the pin and silently fell back to its own bundled asar. Pin an obsidianInstallerVersion at or above ${requestedVersion}'s run floor so the pinned version runs.`
15
+ );
16
+ this.name = "SilentAsarFallbackError";
17
+ this.requestedVersion = requestedVersion;
18
+ this.runningApiVersion = runningApiVersion;
19
+ }
20
+ }
21
+ export {
22
+ SilentAsarFallbackError
23
+ };
24
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRpc3RpbmN0IGVycm9yIHRocm93biB3aGVuIGEgYm9vdGVkIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGlzICoqbm90KipcbiAqIHJ1bm5pbmcgdGhlIHBpbm5lZCBhcHAgKGFzYXIpIHZlcnNpb24gXHUyMDE0IHRoZSBpbnN0YWxsZXIgc2hlbGwgc2lsZW50bHkgZmVsbCBiYWNrXG4gKiB0byBpdHMgb3duIGJ1bmRsZWQgYXNhciBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlIHN3YXBwZWQtaW4gcGluIChzZWVcbiAqIGBhc2FyLWZhbGxiYWNrLWRldGVjdGlvbmApLiBVbmxpa2UgYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgIChhXG4gKiBibGFjay1zY3JlZW4gZGVhZCBib290KSB0aGlzIGZpcmVzIG9uIGEgKmhlYWx0aHkqIHJlbmRlcmVyIHJ1bm5pbmcgdGhlIHdyb25nXG4gKiAob2xkZXIpIHZlcnNpb24sIHNvIGl0IGlzIGRpc2NvdmVyZWQgcG9zdC1ib290IGZyb20gdGhlIGxpdmUgcnVubmluZyB2ZXJzaW9uXG4gKiByYXRoZXIgdGhhbiBmcm9tIGFuIGVtcHR5IGA8Ym9keT5gLiBJdCBpcyBleHBvcnRlZCBzbyBjYWxsZXJzIG9mIGBjb25uZWN0VG9DZHBgXG4gKiAvIHRoZSB0cmFuc3BvcnQgY2FuIGBpbnN0YW5jZW9mYC1tYXRjaCB0aGlzIHNwZWNpZmljIGZhaWx1cmUuXG4gKi9cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqIFRoZSBwaW5uZWQgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2FzIHJlcXVlc3RlZC4gKi9cbiAgcmVhZG9ubHkgcmVxdWVzdGVkVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIHRoZSBpbnN0YW5jZSBpcyBhY3R1YWxseSBydW5uaW5nLiAqL1xuICByZWFkb25seSBydW5uaW5nQXBpVmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgYm9vdGVkIG93bmVkIGluc3RhbmNlIGlzIHJ1bm5pbmcgYSBkaWZmZXJlbnQgYXBwIChhc2FyKSB2ZXJzaW9uXG4gKiB0aGFuIHRoZSBwaW5uZWQge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yQ29uc3RydWN0b3JQYXJhbXMucmVxdWVzdGVkVmVyc2lvbn0gXHUyMDE0XG4gKiB0aGUgaW5zdGFsbGVyIHNoZWxsIHdhcyB0b28gb2xkIGZvciB0aGUgcGluIGFuZCBzaWxlbnRseSByZXZlcnRlZCB0byBpdHMgb3duXG4gKiBidW5kbGVkIGFzYXIuIENhcnJpZXMgYm90aCB2ZXJzaW9ucyBzbyBjYWxsZXJzIGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2ggYW5kXG4gKiBzdXJmYWNlIGFuIGFjdGlvbmFibGUgcmVtZWR5IChwaW4gYSBuZXdlciBpbnN0YWxsZXIpLlxuICovXG5leHBvcnQgY2xhc3MgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKiBUaGUgcGlubmVkIE9ic2lkaWFuIGFwcCAoYXNhcikgdmVyc2lvbiB0aGF0IHdhcyByZXF1ZXN0ZWQuICovXG4gIHB1YmxpYyByZWFkb25seSByZXF1ZXN0ZWRWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBPYnNpZGlhbiBhcHAgKGFzYXIpIHZlcnNpb24gdGhlIGluc3RhbmNlIGlzIGFjdHVhbGx5IHJ1bm5pbmcuICovXG4gIHB1YmxpYyByZWFkb25seSBydW5uaW5nQXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvciBmcm9tIHRoZSBwaW5uZWQgYW5kIGFjdHVhbGx5LXJ1bm5pbmcgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVxdWVzdGVkIHBpbiBhbmQgdGhlIHZlcnNpb24gYWN0dWFsbHkgcnVubmluZy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB7IHJlcXVlc3RlZFZlcnNpb24sIHJ1bm5pbmdBcGlWZXJzaW9uIH0gPSBwYXJhbXM7XG4gICAgc3VwZXIoXG4gICAgICBgT2JzaWRpYW4gd2FzIHBpbm5lZCB0byBhcHAgdmVyc2lvbiAke3JlcXVlc3RlZFZlcnNpb259IGJ1dCBpcyBhY3R1YWxseSBydW5uaW5nICR7cnVubmluZ0FwaVZlcnNpb259IFx1MjAxNCBgXG4gICAgICAgICsgJ3RoZSBpbnN0YWxsZXIgc2hlbGwgaXMgdG9vIG9sZCBmb3IgdGhlIHBpbiBhbmQgc2lsZW50bHkgZmVsbCBiYWNrIHRvIGl0cyBvd24gYnVuZGxlZCBhc2FyLiAnXG4gICAgICAgICsgYFBpbiBhbiBvYnNpZGlhbkluc3RhbGxlclZlcnNpb24gYXQgb3IgYWJvdmUgJHtyZXF1ZXN0ZWRWZXJzaW9ufSdzIHJ1biBmbG9vciBzbyB0aGUgcGlubmVkIHZlcnNpb24gcnVucy5gXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnU2lsZW50QXNhckZhbGxiYWNrRXJyb3InO1xuICAgIHRoaXMucmVxdWVzdGVkVmVyc2lvbiA9IHJlcXVlc3RlZFZlcnNpb247XG4gICAgdGhpcy5ydW5uaW5nQXBpVmVyc2lvbiA9IHJ1bm5pbmdBcGlWZXJzaW9uO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUErQk8sTUFBTSxnQ0FBZ0MsTUFBTTtBQUFBO0FBQUEsRUFFakM7QUFBQTtBQUFBLEVBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFFBQWtEO0FBQ25FLFVBQU0sRUFBRSxrQkFBa0Isa0JBQWtCLElBQUk7QUFDaEQ7QUFBQSxNQUNFLHNDQUFzQyxnQkFBZ0IsNEJBQTRCLGlCQUFpQixrSkFFaEQsZ0JBQWdCO0FBQUEsSUFDckU7QUFDQSxTQUFLLE9BQU87QUFDWixTQUFLLG1CQUFtQjtBQUN4QixTQUFLLG9CQUFvQjtBQUFBLEVBQzNCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -16,6 +16,7 @@
16
16
  *
17
17
  * Requirements: Node.js 22+ (uses built-in `WebSocket` and `fetch` globals).
18
18
  */
19
+ import type { AsarFallback } from './asar-fallback-detection.mjs';
19
20
  import type { ElectronCompatibility } from './electron-compatibility.mjs';
20
21
  import type { InstallerCompatibility } from './installer-compatibility.mjs';
21
22
  import type { ObsidianTransport, TransportEvalOptions } from './transport.mjs';
@@ -75,6 +76,16 @@ export interface DesktopCdpTransportConfig {
75
76
  * @default `false`
76
77
  */
77
78
  shouldDisableSandbox?: boolean;
79
+ /**
80
+ * Whether a post-boot **silent asar fallback** (the running app version differs
81
+ * from the swapped-in pin) fails fast with {@link SilentAsarFallbackError}. The
82
+ * verdict is always computed and surfaced via
83
+ * {@link DesktopCdpTransport.getAsarFallback}; this gates only the throw. Only
84
+ * meaningful in owned mode running a swapped-in asar.
85
+ *
86
+ * @default `true`
87
+ */
88
+ shouldThrowOnSilentAsarFallback?: boolean;
78
89
  /**
79
90
  * Whether the post-boot runtime-Electron compatibility nag warning is emitted
80
91
  * when the live Electron is below the app's recommended minimum. The verdict is
@@ -141,6 +152,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
141
152
  */
142
153
  readonly isMobile = false;
143
154
  private activeVaultPath;
155
+ private asarFallback;
144
156
  private readonly cdpHost;
145
157
  private cdpPort;
146
158
  private cdpUrl;
@@ -153,6 +165,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
153
165
  private readonly ownedConfig;
154
166
  private ownedInstance;
155
167
  private readonly shouldDisableSandbox;
168
+ private readonly shouldThrowOnSilentAsarFallback;
156
169
  private readonly shouldWarnOnCompatibilityIssues;
157
170
  private ws;
158
171
  /**
@@ -185,6 +198,19 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
185
198
  * @returns The normalized result string.
186
199
  */
187
200
  evaluate(expression: string, options: TransportEvalOptions): Promise<string>;
201
+ /**
202
+ * Returns the silent-asar-fallback verdict for this owned instance — whether the
203
+ * app version it is actually running matches the swapped-in pin, or the installer
204
+ * silently reverted to its own bundled asar (read live post-boot). Returns
205
+ * `undefined` when this is not an owned instance, the instance has not booted
206
+ * yet, or the verdict could not be determined (no asar was swapped, or the live
207
+ * version was unreadable). A `'fallback'` verdict reaches this surface only when
208
+ * the throw is disabled ({@link DesktopCdpTransportConfig.shouldThrowOnSilentAsarFallback}
209
+ * `false`); otherwise it throws `SilentAsarFallbackError`.
210
+ *
211
+ * @returns The silent-asar-fallback verdict, or `undefined`.
212
+ */
213
+ getAsarFallback(): AsarFallback | undefined;
188
214
  /**
189
215
  * Returns the resolved installer↔app compatibility verdict for this owned
190
216
  * instance, so callers can assert on it. Returns `undefined` when this is not
@@ -239,24 +265,46 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
239
265
  */
240
266
  unregisterVault(vaultPath: string): Promise<void>;
241
267
  /**
242
- * Best-effort tier-2 runtime nag: reads the live Electron version and running
243
- * app version from the booted owned renderer and warns when the Electron the
244
- * instance is actually running is older than the app's recommended minimum.
245
- * Stores the verdict on {@link getElectronCompatibility}.
246
- *
247
- * The app version is read **live** — the running app version from the main
248
- * process (`ipcRenderer.sendSync('version')`, the same IPC channel the namespace
249
- * bootstrap uses) rather than from the resolved config — so the nag reflects the
250
- * version genuinely running across every owned sub-path (asar-swap / downgrade /
251
- * own-installer) and stays truthful even under a silent asar fallback.
252
- * `process.versions.electron` gives the shell's live Electron. Both are read at
253
- * the renderer top level (no `require('obsidian')`, which resolves only inside a
254
- * plugin-load context). Never throws a read failure is logged and ignored, so
255
- * it cannot break an otherwise-ready boot.
268
+ * Computes and stores the runtime-Electron compatibility verdict (on
269
+ * {@link getElectronCompatibility}) from an already-read version pair, warning
270
+ * when the live Electron is below the app's recommended minimum. Never throws; a
271
+ * boot whose running app version was unreadable is skipped (nothing to judge).
272
+ *
273
+ * @param appVersion - The live running app version, or `undefined` when unreadable.
274
+ * @param actualElectronVersion - The live Electron version, or `undefined` when unreadable.
275
+ */
276
+ private applyElectronCompatibility;
277
+ /**
278
+ * Verifies the running app (asar) version matches the swapped-in pin, storing the
279
+ * verdict on {@link getAsarFallback}. On a **silent fallback** (the installer ran
280
+ * its own bundled asar instead of the pin) it throws {@link SilentAsarFallbackError}
281
+ * when the throw is enabled, otherwise warns (when warnings are on) and lets the
282
+ * boot proceed. A boot with no swapped-in asar, or an unreadable running version,
283
+ * is `'unknown'` — nothing is thrown or warned. This is the healthy-UI companion to
284
+ * the black-screen {@link RendererFailedToInitializeError} dead-boot fast-fail.
285
+ *
286
+ * @param runningApiVersion - The live running app version, or `undefined` when unreadable.
287
+ */
288
+ private checkRuntimeAsarFallback;
289
+ /**
290
+ * Runs the post-boot runtime compatibility checks for an owned instance, once the
291
+ * vault is ready. Reads the live running app version and Electron version **once**
292
+ * from the booted renderer's main process, then: (1) verifies the running app
293
+ * version matches the swapped-in pin — throwing {@link SilentAsarFallbackError} on
294
+ * a silent fallback (when enabled); and (2) runs the best-effort runtime-Electron
295
+ * nag. Only the asar-fallback check can throw, so this must run outside the
296
+ * readiness poll's try/catch (a swallowed throw would loop until timeout).
297
+ *
298
+ * Both are read at the renderer top level: `ipcRenderer.sendSync('version')` (the
299
+ * running app version, truthful even under a silent asar fallback) and
300
+ * `process.versions.electron` (the live shell Electron); neither uses
301
+ * `require('obsidian')`, which resolves only inside a plugin-load context. A read
302
+ * failure leaves both unknown (logged, non-fatal) — an unreadable running version
303
+ * cannot be judged a fallback, so the boot is not broken by a flaky read.
256
304
  *
257
305
  * @param vaultPath - The vault path to evaluate in.
258
306
  */
259
- private checkRuntimeElectronCompatibility;
307
+ private checkRuntimeCompatibility;
260
308
  /**
261
309
  * Connects to a CDP target's WebSocket endpoint.
262
310
  *
@@ -320,6 +368,17 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
320
368
  * @returns The list of page targets.
321
369
  */
322
370
  private getPageTargets;
371
+ /**
372
+ * Kills the currently-running owned instance (if any) and waits for it to exit,
373
+ * so the next launch gets a pristine single-window instance.
374
+ *
375
+ * Relaunching over a live instance is forwarded by Electron's single-instance
376
+ * lock on the shared user-data dir and surfaces the vault picker, and opening a
377
+ * second window via IPC leaves stale windows that break vault-target routing —
378
+ * hence a full kill + wait-for-exit (releasing the lock) between launches. A
379
+ * no-op on the first attempt, when no instance is running yet.
380
+ */
381
+ private killRunningOwnedInstance;
323
382
  /**
324
383
  * Moves the owned instance's window off-screen so a hidden run never steals
325
384
  * focus. Uses Electron's remote bridge (`window.electron.remote`) — the only