wdio-obsidian-service 3.1.0 → 3.1.1
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/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -3269,6 +3269,15 @@ var ObsidianWorkerService = class {
|
|
|
3269
3269
|
* Runs before the session and browser have started.
|
|
3270
3270
|
*/
|
|
3271
3271
|
async beforeSession(config, cap) {
|
|
3272
|
+
if (!config.transformRequest) {
|
|
3273
|
+
config.transformRequest = (requestOptions) => {
|
|
3274
|
+
if (requestOptions.headers instanceof Headers) {
|
|
3275
|
+
requestOptions.headers.delete("Connection");
|
|
3276
|
+
requestOptions.headers.delete("Content-Length");
|
|
3277
|
+
}
|
|
3278
|
+
return requestOptions;
|
|
3279
|
+
};
|
|
3280
|
+
}
|
|
3272
3281
|
try {
|
|
3273
3282
|
if (!cap[OBSIDIAN_CAPABILITY_KEY]) return;
|
|
3274
3283
|
if (cap[OBSIDIAN_CAPABILITY_KEY].vault != void 0) {
|
|
@@ -3342,17 +3351,14 @@ import { remote } from "webdriverio";
|
|
|
3342
3351
|
async function startWdioSession(params, serviceOptions) {
|
|
3343
3352
|
serviceOptions = serviceOptions ?? {};
|
|
3344
3353
|
const capabilities = params.capabilities;
|
|
3345
|
-
const testRunnerOptions = {
|
|
3346
|
-
cacheDir: params.cacheDir
|
|
3347
|
-
};
|
|
3348
3354
|
const launcherService = new ObsidianLauncherService(
|
|
3349
3355
|
serviceOptions,
|
|
3350
3356
|
[capabilities],
|
|
3351
|
-
|
|
3357
|
+
params
|
|
3352
3358
|
);
|
|
3353
|
-
const workerService = new ObsidianWorkerService(serviceOptions, capabilities,
|
|
3354
|
-
await launcherService.onPrepare(
|
|
3355
|
-
await workerService.beforeSession(
|
|
3359
|
+
const workerService = new ObsidianWorkerService(serviceOptions, capabilities, params);
|
|
3360
|
+
await launcherService.onPrepare(params, [capabilities]);
|
|
3361
|
+
await workerService.beforeSession(params, capabilities);
|
|
3356
3362
|
const browser2 = await remote(params);
|
|
3357
3363
|
await workerService.before(capabilities, [], browser2);
|
|
3358
3364
|
return browser2;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_tsx@4.21.0_typescript@5.9.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/dist/types/tokens.js","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/types/types.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/dist/types/set-lookup.js","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/types/index.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/sets.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/util.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/tokenizer.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/sets-lookup.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/write-set-tokens.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/reconstruct.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/index.ts","../../../node_modules/.pnpm/safe-regex2@5.1.1/node_modules/safe-regex2/index.js","../../../node_modules/.pnpm/loglevel@1.9.2/node_modules/loglevel/lib/loglevel.js","../../../node_modules/.pnpm/loglevel-plugin-prefix@0.8.4/node_modules/loglevel-plugin-prefix/lib/loglevel-plugin-prefix.js","../src/index.ts","../src/service.ts","../../../node_modules/.pnpm/@wdio+logger@9.18.0/node_modules/@wdio/logger/build/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.pnpm/strip-ansi@7.2.0/node_modules/strip-ansi/index.js","../../../node_modules/.pnpm/ansi-regex@6.2.2/node_modules/ansi-regex/index.js","../src/browserCommands.ts","../src/pageobjects/obsidianPage.ts","../src/types.ts","../src/pageobjects/basePage.ts","../../../node_modules/.pnpm/@wdio+globals@9.27.1_expect-webdriverio@5.6.5_webdriverio@9.27.1/node_modules/@wdio/globals/build/index.js","../src/utils.ts","../src/standalone.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=tokens.js.map",null,"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=set-lookup.js.map",null,null,null,null,null,null,null,null,"'use strict'\n\nconst parse = require('ret')\nconst { types } = require('ret')\n\n/**\n * @param {*} node\n * @param {object} opts\n * @param {number} opts.reps - The number of repetitions encountered\n * @param {number} opts.limit - The maximum number of repetitions allowed\n * @param {number} starHeight - The current height of the star in the regex tree\n * @returns {boolean}\n */\nfunction walk (node, opts, starHeight) {\n let i\n let ok\n let len\n\n if (node.type === types.REPETITION) {\n starHeight++\n opts.reps++\n if (starHeight > 1) return false\n if (opts.reps > opts.limit) return false\n }\n\n const options = node.options || node.value?.options\n if (options) {\n for (i = 0, len = options.length; i < len; i++) {\n ok = walk({ stack: options[i] }, opts, starHeight)\n if (!ok) return false\n }\n }\n const stack = node.stack || node.value?.stack\n if (!stack) return true\n\n for (i = 0, len = stack.length; i < len; i++) {\n ok = walk(stack[i], opts, starHeight)\n if (!ok) return false\n }\n\n return true\n}\n\n/**\n * @param {string|RegExp} re - The regular expression to check, can be a string or RegExp object\n * @param {object} [options]\n * @param {number} [options.limit=25] - The maximum number of repetitions allowed\n * @returns {boolean} - Returns true if the regex is safe, false if it is unsafe or invalid\n */\nfunction safeRegex (re, options) {\n const opts = {\n reps: 0,\n limit: options?.limit ?? 25\n }\n\n if (isRegExp(re)) re = re.source\n else if (typeof re !== 'string') re = String(re)\n\n try {\n return walk(parse(re), opts, 0)\n } catch {\n return false\n }\n}\n\n/**\n * @param {*} x\n * @returns {x is RegExp}\n */\nfunction isRegExp (x) {\n return Object.prototype.toString.call(x) === '[object RegExp]'\n}\n\nmodule.exports = safeRegex\nmodule.exports.default = safeRegex\nmodule.exports.safeRegex = safeRegex\n","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory();\n } else {\n root.prefix = factory(root);\n }\n}(this, function (root) {\n 'use strict';\n\n var merge = function (target) {\n var i = 1;\n var length = arguments.length;\n var key;\n for (; i < length; i++) {\n for (key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n target[key] = arguments[i][key];\n }\n }\n }\n return target;\n };\n\n var defaults = {\n template: '[%t] %l:',\n levelFormatter: function (level) {\n return level.toUpperCase();\n },\n nameFormatter: function (name) {\n return name || 'root';\n },\n timestampFormatter: function (date) {\n return date.toTimeString().replace(/.*(\\d{2}:\\d{2}:\\d{2}).*/, '$1');\n },\n format: undefined\n };\n\n var loglevel;\n var configs = {};\n\n var reg = function (rootLogger) {\n if (!rootLogger || !rootLogger.getLogger) {\n throw new TypeError('Argument is not a root logger');\n }\n loglevel = rootLogger;\n };\n\n var apply = function (logger, config) {\n if (!logger || !logger.setLevel) {\n throw new TypeError('Argument is not a logger');\n }\n\n /* eslint-disable vars-on-top */\n var originalFactory = logger.methodFactory;\n var name = logger.name || '';\n var parent = configs[name] || configs[''] || defaults;\n /* eslint-enable vars-on-top */\n\n function methodFactory(methodName, logLevel, loggerName) {\n var originalMethod = originalFactory(methodName, logLevel, loggerName);\n var options = configs[loggerName] || configs[''];\n\n var hasTimestamp = options.template.indexOf('%t') !== -1;\n var hasLevel = options.template.indexOf('%l') !== -1;\n var hasName = options.template.indexOf('%n') !== -1;\n\n return function () {\n var content = '';\n\n var length = arguments.length;\n var args = Array(length);\n var key = 0;\n for (; key < length; key++) {\n args[key] = arguments[key];\n }\n\n // skip the root method for child loggers to prevent duplicate logic\n if (name || !configs[loggerName]) {\n /* eslint-disable vars-on-top */\n var timestamp = options.timestampFormatter(new Date());\n var level = options.levelFormatter(methodName);\n var lname = options.nameFormatter(loggerName);\n /* eslint-enable vars-on-top */\n\n if (options.format) {\n content += options.format(level, lname, timestamp);\n } else {\n content += options.template;\n if (hasTimestamp) {\n content = content.replace(/%t/, timestamp);\n }\n if (hasLevel) content = content.replace(/%l/, level);\n if (hasName) content = content.replace(/%n/, lname);\n }\n\n if (args.length && typeof args[0] === 'string') {\n // concat prefix with first argument to support string substitutions\n args[0] = content + ' ' + args[0];\n } else {\n args.unshift(content);\n }\n }\n\n originalMethod.apply(undefined, args);\n };\n }\n\n if (!configs[name]) {\n logger.methodFactory = methodFactory;\n }\n\n // for remove inherited format option if template option preset\n config = config || {};\n if (config.template) config.format = undefined;\n\n configs[name] = merge({}, parent, config);\n\n logger.setLevel(logger.getLevel());\n\n if (!loglevel) {\n logger.warn(\n 'It is necessary to call the function reg() of loglevel-plugin-prefix before calling apply. From the next release, it will throw an error. See more: https://github.com/kutuluk/loglevel-plugin-prefix/blob/master/README.md'\n );\n }\n\n return logger;\n };\n\n var api = {\n reg: reg,\n apply: apply\n };\n\n var save;\n\n if (root) {\n save = root.prefix;\n api.noConflict = function () {\n if (root.prefix === api) {\n root.prefix = save;\n }\n return api;\n };\n }\n\n return api;\n}));\n","/**\n * @module\n * @document ../README.md\n * @categoryDescription Options\n * Capability and service options.\n * @categoryDescription WDIO Helpers\n * Helpers for use in wdio.conf.mts, or for launching WDIO in standalone mode.\n * @categoryDescription Utilities\n * Browser commands and helper functions for writing tests.\n */\nimport ObsidianLauncher from \"obsidian-launcher\";\nimport { deprecate } from \"util\";\n\nimport { ObsidianLauncherService, ObsidianWorkerService } from \"./service.js\";\n/** @hidden */\nexport default ObsidianWorkerService;\n/** @hidden */\nexport const launcher = ObsidianLauncherService;\n\nexport type { ObsidianCapabilityOptions, ObsidianServiceOptions } from \"./types.js\";\nexport type { ObsidianBrowserCommands, ExecuteObsidianArg, InstalledPlugins } from \"./browserCommands.js\";\nexport { default as obsidianPage } from \"./pageobjects/obsidianPage.js\";\nexport type { ObsidianPage, Platform } from \"./pageobjects/obsidianPage.js\";\nexport type { PluginEntry, ThemeEntry } from \"obsidian-launcher\";\n\nexport { minSupportedObsidianVersion } from \"./service.js\";\nexport { startWdioSession } from \"./standalone.js\";\n\n// Some convenience helpers for use in wdio.conf.mts\n\n/**\n * Returns true if there is a current Obsidian beta and we have the credentials to download it, or its already in cache.\n * @category WDIO Helpers\n * @param opts.cacheDir Obsidian cache dir, defaults to `.obsidian-cache`.\n */\nexport async function obsidianBetaAvailable(opts: string|{cacheDir?: string} = {}) {\n opts = typeof opts == \"string\" ? {cacheDir: opts} : opts;\n const launcher = new ObsidianLauncher(opts);\n const versionInfo = await launcher.getVersionInfo(\"latest-beta\");\n return versionInfo.isBeta && await launcher.isAvailable(versionInfo.version);\n}\n\n/**\n * Resolves Obsidian app and installer version strings to absolute versions.\n * \n * @category WDIO Helpers\n * @deprecated Use parseObsidianVersions instead\n */\nexport const resolveObsidianVersions = deprecate(async function(\n appVersion: string, installerVersion: string, cacheDir?: string,\n): Promise<[string, string]> {\n const launcher = new ObsidianLauncher({cacheDir: cacheDir});\n return await launcher.resolveVersion(appVersion, installerVersion);\n}, 'resolveObsidianVersions is deprecated, use parseObsidianVersions instead');\n\n\n/**\n * Parses a string of Obsidian versions into [appVersion, installerVersion] tuples. This is a convenience helper for use\n * in `wdio.conf.mts`\n * \n * `versions` should be a space separated list of Obsidian app versions. You can optionally specify the installer\n * version by using \"appVersion/installerVersion\" e.g. `\"1.7.7/1.8.10\"`.\n * \n * Example: \n * ```js\n * parseObsidianVersions(\"1.8.10/1.7.7 latest latest-beta/earliest\")\n * ```\n * \n * See also: [Obsidian App vs Installer Versions](../README.md#obsidian-app-vs-installer-versions)\n * \n * @category WDIO Helpers\n * @param versions string to parse\n * @param opts.cacheDir Obsidian cache dir, defaults to `.obsidian-cache`.\n * @returns [appVersion, installerVersion][] resolved to specific versions.\n */\nexport async function parseObsidianVersions(\n versions: string,\n opts: {cacheDir?: string} = {},\n): Promise<[string, string][]> {\n const launcher = new ObsidianLauncher({cacheDir: opts.cacheDir});\n return launcher.parseVersions(versions);\n}\n","import fs from \"fs\"\nimport fsAsync from \"fs/promises\"\nimport path from \"path\"\nimport crypto from \"crypto\"\nimport { SevereServiceError } from 'webdriverio'\nimport type { Capabilities, Options, Services } from '@wdio/types'\nimport logger from '@wdio/logger'\nimport { fileURLToPath, pathToFileURL } from \"url\"\nimport ObsidianLauncher, {\n PluginEntry, ThemeEntry, DownloadedPluginEntry, DownloadedThemeEntry,\n} from \"obsidian-launcher\"\nimport { browserCommands } from \"./browserCommands.js\"\nimport {\n ObsidianServiceOptions, NormalizedObsidianCapabilityOptions, OBSIDIAN_CAPABILITY_KEY,\n} from \"./types.js\"\nimport {\n isAppium, appiumUploadFiles, appiumDownloadFile, appiumExists, appiumReaddir, getAppiumOptions, fileExists,\n navigateAndWait, retry, pathIsUnder,\n} from \"./utils.js\";\nimport semver from \"semver\"\nimport _ from \"lodash\"\n\n\nconst log = logger(\"wdio-obsidian-service\");\n\nfunction getDefaultCacheDir(rootDir: string) {\n return path.resolve(rootDir, process.env.WEBDRIVER_CACHE_DIR ?? process.env.OBSIDIAN_CACHE ?? \"./.obsidian-cache\");\n}\n\n/** By default wdio continues on service errors, so we throw a SevereServiceError to make it bail on error */\nfunction getServiceErrorMessage(e: any) {\n return (\n `Failed to download and setup Obsidian. Caused by:\\n` +\n `${e.stack}\\n`+\n ` ------The above causes:-----`\n );\n}\n\nfunction resolveEntry(rootDir: string, entry: PluginEntry|ThemeEntry): PluginEntry|ThemeEntry {\n if (typeof entry == \"string\") {\n return path.resolve(rootDir, entry);\n } else if ('path' in entry) {\n return {...entry, path: path.resolve(rootDir, entry.path)};\n } else {\n return entry;\n }\n}\n\n/** Returns a plugin list with only the selected plugin ids enabled. */\nfunction selectPlugins(currentPlugins: DownloadedPluginEntry[], selection?: string[]): DownloadedPluginEntry[] {\n if (selection !== undefined) {\n const unknownPlugins = _.difference(selection, currentPlugins.map(p => p.id));\n if (unknownPlugins.length > 0) {\n throw Error(`Unknown plugin ids: ${unknownPlugins.join(', ')}`)\n }\n return currentPlugins.map(p => ({\n ...p,\n enabled: selection.includes(p.id) || p.id == \"wdio-obsidian-service-plugin\",\n }));\n } else {\n return currentPlugins;\n }\n}\n\n/** Returns a theme list with only the selected theme enabled. */\nfunction selectThemes(currentThemes: DownloadedThemeEntry[], selection?: string): DownloadedThemeEntry[] {\n if (selection !== undefined) {\n if (selection != \"default\" && currentThemes.every(t => t.name != selection)) {\n throw Error(`Unknown theme: ${selection}`);\n }\n return currentThemes.map(t => ({...t, enabled: selection != 'default' && t.name === selection}));\n } else {\n return currentThemes;\n }\n}\n\nfunction getNormalizedObsidianOptions(cap: WebdriverIO.Capabilities): NormalizedObsidianCapabilityOptions {\n return cap[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n}\n\n\n/**\n * Minimum Obsidian version that wdio-obsidian-service supports.\n * @category WDIO Helpers\n */\nexport const minSupportedObsidianVersion: string = \"1.0.3\"\n\n/**\n * We used to put vaults on \"Device Storage\" by default. However, there's some weird issues with the emulated storage\n * that can cause writes to intermittently fail silently. (See https://forum.obsidian.md/t/102935). This causes a bunch\n * of intermittent issues when writing files, and when uploading the vault.\n * \n * So now we are defaulting to \"App Storage\" mode which, even though its still under the emulated storage uses a\n * different filesystem api and avoids the issue.\n */\nconst ANDROID_APP_STORAGE_DIR = \"/storage/emulated/0/Android/data/md.obsidian/files\"\nconst ANDROID_DEFAULT_DEVICE_STORAGE_DIR = \"/storage/emulated/0/Documents/wdio-obsidian-service-vaults\"\n\nconst OBSIDIAN_HANG_ERROR = Symbol(\"hang\");\n\n\n/**\n * wdio launcher service.\n * Use in wdio.conf.mts like so:\n * ```ts\n * services: ['obsidian'],\n * ```\n * @hidden\n */\nexport class ObsidianLauncherService implements Services.ServiceInstance {\n private obsidianLauncher: ObsidianLauncher\n private readonly helperPluginPath: string\n private readonly rootDir: string\n\n constructor (\n public options: ObsidianServiceOptions,\n public capabilities: WebdriverIO.Capabilities,\n public config: Options.Testrunner\n ) {\n this.rootDir = config.rootDir || process.cwd();\n this.obsidianLauncher = new ObsidianLauncher({\n cacheDir: config.cacheDir ?? getDefaultCacheDir(this.rootDir),\n versionsUrl: options.versionsUrl,\n communityPluginsUrl: options.communityPluginsUrl, communityThemesUrl: options.communityThemesUrl,\n });\n this.helperPluginPath = path.resolve(fileURLToPath(import.meta.url), '../../helper-plugin');\n }\n\n /**\n * Validates wdio:obsidianOptions and downloads Obsidian, plugins, and themes.\n */\n async onPrepare(config: Options.Testrunner, capabilities: Capabilities.TestrunnerCapabilities) {\n try {\n // Create an ID that is unique per test run, but the same between sessions.\n const runId = crypto.randomBytes(10).toString(\"base64url\").replace(/[-_]/g, '0');\n\n if (!Array.isArray(capabilities)) {\n capabilities = Object.values(capabilities).map(\n (multiremoteOption) => (multiremoteOption as Capabilities.WithRequestedCapabilities).capabilities,\n );\n }\n\n const obsidianCapabilities = capabilities.flatMap((cap) => {\n if ((\"browserName\" in cap) && cap.browserName === \"obsidian\") {\n return [cap as WebdriverIO.Capabilities];\n } else {\n return [];\n }\n });\n\n for (const cap of obsidianCapabilities) {\n const obsidianOptions = cap[OBSIDIAN_CAPABILITY_KEY] ?? {};\n \n // check vault\n const vault = obsidianOptions.vault ? path.resolve(this.rootDir, obsidianOptions.vault) : undefined;\n if (vault && !fs.existsSync(vault)) {\n throw Error(`Vault \"${vault}\" doesn't exist`)\n }\n \n // download plugins and themes to cache\n const plugins = await this.obsidianLauncher.downloadPlugins(\n (obsidianOptions.plugins ?? [])\n .concat([this.helperPluginPath]) // Always install the helper plugin\n .map(p => resolveEntry(this.rootDir, p) as PluginEntry)\n );\n\n const themes = await this.obsidianLauncher.downloadThemes(\n (obsidianOptions.themes ?? [])\n .map(t => resolveEntry(this.rootDir, t) as ThemeEntry),\n );\n\n let appVersion = cap.browserVersion ?? cap[OBSIDIAN_CAPABILITY_KEY]?.appVersion ?? \"latest\";\n appVersion = (await this.obsidianLauncher.getVersionInfo(appVersion)).version;\n if (semver.lt(appVersion, minSupportedObsidianVersion)) {\n throw Error(`Minimum supported Obsidian version is ${minSupportedObsidianVersion}`)\n }\n\n if (isAppium(cap)) {\n let apk = getAppiumOptions(cap).app;\n if (!apk) {\n apk = await this.obsidianLauncher.downloadAndroid(appVersion);\n }\n let chromedriverDir = getAppiumOptions(cap).chromedriverExecutableDir;\n if (!chromedriverDir) {\n chromedriverDir = path.join(this.obsidianLauncher.cacheDir, 'appium-chromedriver');\n }\n\n let androidVaultStorage = obsidianOptions.androidVaultStorage;\n if (!androidVaultStorage) {\n // App storage was introduced in 1.8.10\n androidVaultStorage = semver.lt(appVersion, \"1.8.10\") ? \"device-storage\" : \"app-storage\";\n }\n if (androidVaultStorage == \"device-storage\") {\n androidVaultStorage = ANDROID_DEFAULT_DEVICE_STORAGE_DIR;\n } else if (androidVaultStorage != \"app-storage\" && !androidVaultStorage.startsWith(\"/\")) {\n throw Error(`androidVaultStorage must be \"app-storage\", \"device-storage\", or an absolute path on the Android device.`)\n }\n\n const normalizedObsidianOptions: NormalizedObsidianCapabilityOptions = {\n ...obsidianOptions,\n plugins, themes, vault: vault,\n copy: obsidianOptions.copy ?? true,\n appVersion, installerVersion: appVersion,\n emulateMobile: false,\n testRunId: runId,\n androidVaultStorage,\n }\n cap[OBSIDIAN_CAPABILITY_KEY] = normalizedObsidianOptions;\n cap['appium:app'] = apk;\n cap['appium:chromedriverExecutableDir'] = chromedriverDir;\n cap[\"wdio:enforceWebDriverClassic\"] = true; // BiDi doesn't seem to work on Obsidian mobile\n // appium-service expects these to not be set\n delete cap.browserName;\n delete cap.browserVersion;\n if (!getAppiumOptions(cap)['noReset']) {\n log.warn(\"Note: For best performance set noReset to true, wdio-obsidian-service will handle resetting Obsidian between tests.\")\n }\n } else {\n const [, installerVersion] = await this.obsidianLauncher.resolveVersion(\n appVersion, obsidianOptions.installerVersion ?? \"earliest\",\n );\n const installerInfo = await this.obsidianLauncher.getInstallerInfo(installerVersion);\n\n let installerPath: string;\n if (obsidianOptions.binaryPath) {\n installerPath = path.resolve(this.rootDir, obsidianOptions.binaryPath)\n } else {\n installerPath = await this.obsidianLauncher.downloadInstaller(installerVersion);\n }\n let appPath: string;\n if (obsidianOptions.appPath) {\n appPath = path.resolve(this.rootDir, obsidianOptions.appPath)\n } else {\n appPath = await this.obsidianLauncher.downloadApp(appVersion);\n }\n let chromedriverPath = cap['wdio:chromedriverOptions']?.binary;\n // wdio can't download chromedriver for versions less than 115 automatically. Fetching it ourselves is\n // also a bit faster as it skips the chromedriver version detection step.\n if (!chromedriverPath) {\n chromedriverPath = await this.obsidianLauncher.downloadChromedriver(installerVersion);\n }\n\n const normalizedObsidianOptions: NormalizedObsidianCapabilityOptions = {\n ...obsidianOptions,\n plugins, themes, vault,\n copy: obsidianOptions.copy ?? true,\n binaryPath: installerPath, appPath: appPath,\n appVersion, installerVersion,\n emulateMobile: obsidianOptions.emulateMobile ?? false,\n testRunId: runId,\n }\n\n cap.browserName = \"chrome\";\n cap.browserVersion = installerInfo.chrome;\n cap[OBSIDIAN_CAPABILITY_KEY] = normalizedObsidianOptions;\n cap['goog:chromeOptions'] = {\n binary: installerPath,\n windowTypes: [\"app\", \"webview\"],\n ...cap['goog:chromeOptions'],\n args: [\n // Workaround for SUID issue on linux. See https://github.com/electron/electron/issues/42510\n ...(process.platform == 'linux' ? [\"--no-sandbox\"] : []),\n ...(cap['goog:chromeOptions']?.args ?? [])\n ],\n }\n cap['wdio:chromedriverOptions'] = {\n // allowedIps is not included in the types, but gets passed as --allowed-ips to chromedriver.\n // It defaults to [\"0.0.0.0\"] which makes Windows Firewall complain, and we don't need remote\n // connections anyways.\n allowedIps: [],\n ...cap['wdio:chromedriverOptions'],\n binary: chromedriverPath,\n } as WebdriverIO.ChromedriverOptions;\n cap[\"wdio:enforceWebDriverClassic\"] = true; // electron doesn't support BiDi yet.\n }\n }\n\n // show a warning if doing parallel tests on no copy vaults\n const dupNoCopyVaults = _(obsidianCapabilities)\n .map(cap => cap[OBSIDIAN_CAPABILITY_KEY])\n .filter(cap => !!cap && cap.copy === false && !!cap.vault)\n .map(cap => cap!.vault!)\n .countBy(v => v)\n .pickBy(count => count >= 2)\n .keys()\n .sort()\n .value()\n if (config.maxInstances !== 1 && dupNoCopyVaults.length > 0) {\n log.warn(\n `Multiple capabilities share the same vault with \\`copy: false\\`. This means parallel tests will run ` +\n `on the same directory which can cause errors. Either set \\`copy: true\\` or set \\`maxInstances: 1\\`. ` +\n `Affected vaults: ${dupNoCopyVaults.join(', ')}`\n )\n }\n } catch (e: any) {\n throw new SevereServiceError(getServiceErrorMessage(e));\n }\n }\n}\n\n\n/**\n * wdio worker service.\n * Use in wdio.conf.mts like so:\n * ```ts\n * services: ['obsidian'],\n * ```\n * @hidden\n */\nexport class ObsidianWorkerService implements Services.ServiceInstance {\n private obsidianLauncher: ObsidianLauncher\n private browser: WebdriverIO.Browser|undefined;\n /** Directories to clean up after the tests */\n private tmpDirs: string[]\n\n constructor (\n public options: ObsidianServiceOptions,\n public capabilities: WebdriverIO.Capabilities,\n public config: Options.Testrunner\n ) {\n this.obsidianLauncher = new ObsidianLauncher({\n cacheDir: config.cacheDir ?? getDefaultCacheDir(config.rootDir || process.cwd()),\n versionsUrl: options.versionsUrl,\n communityPluginsUrl: options.communityPluginsUrl, communityThemesUrl: options.communityThemesUrl,\n });\n this.tmpDirs = [];\n }\n\n /**\n * Sets up the vault with plugins and themes installed, optionally copying it first.\n */\n private async setupVault(cap: WebdriverIO.Capabilities) {\n const obsidianOptions = getNormalizedObsidianOptions(cap);\n let openVault: string|undefined;\n if (obsidianOptions.vault != undefined) {\n const shouldCopy = obsidianOptions.copy;\n log.info(`Opening vault ${obsidianOptions.vault}${obsidianOptions.copy ? ' (copy)' : ' (in-place)'}`);\n openVault = await this.obsidianLauncher.setupVault({\n vault: obsidianOptions.vault,\n copy: shouldCopy,\n plugins: obsidianOptions.plugins,\n themes: obsidianOptions.themes,\n });\n if (shouldCopy) {\n this.tmpDirs.push(openVault);\n }\n } else {\n log.info(`Opening Obsidian without a vault`)\n }\n obsidianOptions.openVault = openVault; // for use in getVaultPath() and the other service hooks\n }\n\n /**\n * Sets up the --user-data-dir for the Electron app. Sets the obsidian.json in the dir to open the vault on boot.\n */\n private async electronSetupConfigDir(cap: WebdriverIO.Capabilities) {\n const obsidianOptions = getNormalizedObsidianOptions(cap);\n const configDir = await this.obsidianLauncher.setupConfigDir({\n appVersion: obsidianOptions.appVersion, installerVersion: obsidianOptions.installerVersion,\n appPath: obsidianOptions.appPath,\n vault: obsidianOptions.openVault,\n // `app.emulateMobile` just sets this localStorage variable. Setting it ourselves here instead of calling\n // the function simplifies the boot/plugin load sequence and makes sure plugins load in mobile mode.\n localStorage: obsidianOptions.emulateMobile ? {\"EmulateMobile\": \"1\"} : {},\n });\n this.tmpDirs.push(configDir);\n\n cap['goog:chromeOptions'] = {\n ...cap['goog:chromeOptions'],\n args: [\n `--user-data-dir=${configDir}`,\n ...(cap['goog:chromeOptions']?.args ?? []).filter(arg => {\n const match = arg.match(/^--user-data-dir=(.*)$/);\n return !match || !this.tmpDirs.includes(match[1]);\n })\n ]\n }\n }\n\n /**\n * Transfers src to dest. src may be a file or a directory.\n * Handles making sure the permissions under Obsidian app storage are correct.\n */\n private async appiumUpload(src: string, dest: string) {\n const browser = this.browser!;\n const isDirectory = (await fsAsync.stat(src)).isDirectory();\n const isAppStorage = pathIsUnder(ANDROID_APP_STORAGE_DIR, dest);\n\n if (isAppStorage) {\n // Even with root and run-as, I can't seem to get the permissions for app storage to work out directly via\n // shell commands. And the Android Emulator won't always have root depending on how it was set up. So I use\n // the Capacitor API to copy it directly from Obsidian.\n const tmp = `/storage/emulated/0/Documents/tmp-${crypto.randomBytes(10).toString(\"base64url\").replace(/[-_]/g, '0')}`\n if (isDirectory) {\n await appiumUploadFiles(browser, {src, dest: tmp});\n } else {\n await browser.pushFile(tmp, (await fsAsync.readFile(src)).toString('base64'));\n }\n await browser.execute(async (from, to) => {\n const Filesystem = (window as any).Capacitor.Plugins.Filesystem;\n await Filesystem.copy({ from, to });\n }, pathToFileURL(tmp).toString(), pathToFileURL(dest).toString());\n await browser.execute(\"mobile: shell\", {command: \"rm\", args: [\"-rf\", tmp]});\n } else {\n if (isDirectory) {\n await appiumUploadFiles(browser, {src, dest});\n } else {\n await browser.pushFile(dest, (await fsAsync.readFile(src)).toString('base64'));\n }\n }\n }\n\n /**\n * Sets up the Obsidian app. Installs and launches it if needed, and sets permissions and contexts. Opens the vault\n * switcher page.\n * \n * You can configure Appium to install and launch the app for you. However, if you do that it reboots the app after\n * every session/spec which is really slow. So we are handling the app setup manually here.\n */\n private async appiumSetupApp() {\n const browser = this.browser!;\n const appiumOptions = getAppiumOptions(browser.requestedCapabilities);\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n const appId = \"md.obsidian\";\n\n // install/reinstall Obsidian if needed\n const dumpsys: string = await browser.execute(\"mobile: shell\", {command: \"dumpsys\", args: [\"package\", appId]});\n const installedObsidianVersion = dumpsys.match(/versionName[=:](.*)$/m)?.[1]?.trim();\n if (installedObsidianVersion != obsidianOptions.appVersion) {\n await browser.execute('mobile: terminateApp', {appId}); // terminate app (if running)\n await browser.execute('mobile: removeApp', {appId, keepData: false}); // uninstall (if present)\n await browser.execute('mobile: installApp', {\n appPath: appiumOptions.app, // the APK\n timeout: appiumOptions.androidInstallTimeout, // respect appium configuration\n grantPermissions: true, // this and autoGrantPermissions don't seem to really work, see below\n });\n }\n\n // start app if needed\n const appState: number = await browser.execute(\"mobile: queryAppState\", {appId});\n if (appState < 4) { // 0: not installed, 1: not running, 3: running in background, 4: running in foreground\n await browser.execute(\"mobile: activateApp\", {appId});\n }\n\n // grant Obsidian the permissions it needs, mainly file access.\n // appium:autoGrantPermissions is supposed to automatically grant everything it needs, but I can't get it to\n // work. The \"mobile: changePermissions\" \"all\" option also doesn't seem to work here. I have to explicitly list\n // the permissions and use the \"appops\" target. See https://github.com/appium/appium/issues/19991\n // I'm calling \"mobile: changePermissions\" \"all\" as well just in case it is actually doing something\n await browser.execute(\"mobile: changePermissions\", {\n action: \"grant\",\n appPackage: appId,\n permissions: \"all\",\n });\n await browser.execute(\"mobile: changePermissions\", {\n action: \"allow\",\n appPackage: appId,\n permissions: [ // these are from apk AndroidManifest.xml (extracted with apktool)\n \"READ_EXTERNAL_STORAGE\", \"WRITE_EXTERNAL_STORAGE\", \"MANAGE_EXTERNAL_STORAGE\",\n ],\n target: \"appops\", // requires appium --allow-insecure adb_shell\n });\n\n // switch to the webview context\n const context = \"WEBVIEW_md.obsidian\";\n await browser.waitUntil(\n async () => (await browser.getContexts() as string[]).includes(context),\n {timeout: 30_000, interval: 100},\n );\n await browser.switchContext(context);\n\n // Clear app state\n await browser.execute(() => { // in case tests get interrupted during the `_capacitor_file_` bit\n if (window.location.href != \"http://localhost/\") {\n window.location.replace('http://localhost/');\n }\n })\n await this.appiumCloseVault(); // close vault and go to vault switcher (if vault is open)\n }\n\n /**\n * Uploads the vault to appium\n */\n private async appiumUploadVault() {\n const browser = this.browser!;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n const isAppStorage = (obsidianOptions.androidVaultStorage == 'app-storage');\n\n // create a path based on the openVault.\n // if copy: true, openVault path is randomized so the hash will also be unique\n // if copy: false, openVault is same as vault, so we'll reuse an already uploaded vault\n // We include the runId and if its a copy so we can know what to clean up at the end of the tests. We want to\n // make sure that nocopy vaults are still uploaded ONCE at the beginning of tests, even if the last test didn't\n // clean up androidVaultStorage properly.\n const runId = obsidianOptions.testRunId;\n const pathHash = crypto.createHash(\"SHA256\").update(obsidianOptions.openVault!).digest(\"base64url\").replace(/[-_]/g, '0').slice(0, 8);\n const basename = path.basename(obsidianOptions.vault!);\n const androidVaultName = `${basename}-${pathHash}-${runId}-wdio-${obsidianOptions.copy ? 'copy' : 'nocopy'}`;\n const androidVaultPath = `${isAppStorage ? ANDROID_APP_STORAGE_DIR : obsidianOptions.androidVaultStorage}/${androidVaultName}`;\n obsidianOptions.androidVault = androidVaultPath;\n\n // transfer the vault to the device\n if (!(await appiumExists(browser, obsidianOptions.androidVault))) {\n await this.appiumUpload(obsidianOptions.openVault!, obsidianOptions.androidVault);\n }\n }\n\n /**\n * Opens the vault in appium.\n * \n * clearAppState determines whether we wipe localStorage or not. (In desktop mode we create a entirely new\n * electron dir every time we open a new vault, in Android we need to use clearAppState to replicate that.)\n */\n private async appiumOpenVault(opts: {clearAppState: boolean}) {\n const browser = this.browser!;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n const isAppStorage = (obsidianOptions.androidVaultStorage == 'app-storage');\n\n // open vault by setting the localStorage keys and relaunching Obsidian\n // on appium restarting the app with appium:fullReset is *really* slow. And, unlike electron we can actually\n // switch vault with just a reload. So for Appium, instead of rebooting we manually wipe localStorage and use\n // reload to switch the vault.\n await browser.execute(async (androidVaultPath, isAppStorage, clearAppState) => {\n if (clearAppState) {\n localStorage.clear();\n }\n \n if (isAppStorage) { // appId on mobile app storage, vault id is just the vault name\n const androidVaultName = androidVaultPath.split(\"/\").at(-1)!;\n localStorage.setItem('mobile-external-vaults', JSON.stringify([]));\n localStorage.setItem('mobile-selected-vault', androidVaultName);\n localStorage.setItem(`enable-plugin-${androidVaultName}`, 'true');\n } else { // On device storage its the full path\n localStorage.setItem('mobile-external-vaults', JSON.stringify([androidVaultPath]));\n localStorage.setItem('mobile-selected-vault', androidVaultPath);\n localStorage.setItem(`enable-plugin-${androidVaultPath}`, 'true');\n }\n\n }, obsidianOptions.androidVault!, isAppStorage, opts.clearAppState);\n await navigateAndWait(browser, () => location.reload());\n }\n\n /**\n * Close any open vault and go back to the vault switcher\n */\n private async appiumCloseVault() {\n const browser = this.browser!;\n // skip if we're already on the vault switcher\n const isVaultOpen = await browser.execute(() => !!localStorage.getItem('mobile-selected-vault'));\n if (isVaultOpen) {\n await browser.execute(() => {\n localStorage.removeItem('mobile-external-vaults');\n localStorage.removeItem('mobile-selected-vault');\n });\n await navigateAndWait(browser, () => location.reload());\n }\n }\n\n /**\n * Waits for Obsidian to be ready, and does some other final setup.\n */\n private async prepareApp() {\n const browser = this.browser!;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n\n if (obsidianOptions.emulateMobile && obsidianOptions.vault != undefined) {\n // I don't think this is technically necessary, but when you set the window size via emulateMobile it sets\n // the window size in the browser view, but not the actual window size which looks weird and makes it hard\n // to manually debug a paused test. The normal ways to set window size don't work on Obsidian. Obsidian\n // doesn't respect the `--window-size` argument, and wdio setViewport and setWindowSize don't work without\n // BiDi. This resizes the window directly using electron APIs.\n await browser.waitUntil(\n () => browser.execute(() => !!(window as any).electron),\n {timeout: 10_000, interval: 100},\n );\n const [width, height] = await browser.execute(() => [window.innerWidth, window.innerHeight]);\n await browser.execute(async (width, height) => {\n await (window as any).electron.remote.getCurrentWindow().setSize(width, height);\n }, width, height);\n }\n\n // wait until app is loaded\n if (obsidianOptions.vault) {\n if (isAppium(browser.requestedCapabilities) && semver.gte(obsidianOptions.appVersion, '1.12.0')) {\n // Obsidian >= 1.12.0 has a bug on mobile startup that intermittently causes the app to get stuck during\n // boot in the emulator. Seems to be caused by changes to the Capacitor plugin load sequence and a race\n // condition with the Capacitor bridge. Not sure why it doesn't show up in real usage, probably just the\n // race condition only losing on the sluggish emulator. Only work around I've found is to just detect the\n // state and trigger a refresh.\n await retry(async (attempt) => {\n if (attempt > 0) {\n console.warn(\"Obsidian Android app stuck, relaunching...\");\n await navigateAndWait(browser, () => location.reload());\n }\n await browser.waitUntil(\n () => browser.execute(() => !!window.ready), // wait for enhance.js to be loaded\n {timeout: 60_000, interval: 100},\n );\n await browser.waitUntil( // if this fails to load soon after, we are in the hang state\n () => browser.execute(() => document.body?.classList.contains(\"is-mobile\")),\n {timeout: 2_000, interval: 100},\n ).catch(() => {\n throw OBSIDIAN_HANG_ERROR; // eslint-disable-line @typescript-eslint/only-throw-error\n });\n }, {\n retries: 2,\n backoff: 2000,\n retryIf: (error) => error === OBSIDIAN_HANG_ERROR,\n });\n }\n await browser.waitUntil( // wait until the helper plugin is loaded\n () => browser.execute(() => !!(window as any).wdioObsidianService),\n {\n timeout: isAppium(browser.requestedCapabilities) ? 120_000 : 60_000,\n interval: 100,\n },\n );\n await browser.executeObsidian(async ({app}) => {\n await new Promise<void>((resolve) => app.workspace.onLayoutReady(resolve));\n });\n } else {\n await browser.execute(async () => {\n if (document.readyState === \"loading\") {\n return new Promise<void>(resolve => document.addEventListener(\"DOMContentLoaded\", () => resolve()));\n }\n });\n }\n }\n\n private createReloadObsidian() {\n const service = this; // eslint-disable-line @typescript-eslint/no-this-alias\n const reloadObsidian: WebdriverIO.Browser['reloadObsidian'] = async function(\n this: WebdriverIO.Browser,\n {vault, copy = true, plugins, theme} = {},\n ) {\n const oldObsidianOptions = getNormalizedObsidianOptions(this.requestedCapabilities);\n const selectedPlugins = selectPlugins(oldObsidianOptions.plugins, plugins);\n const selectedThemes = selectThemes(oldObsidianOptions.themes, theme);\n if (!vault && oldObsidianOptions.openVault == undefined) {\n throw Error(`No vault is open, pass a vault path to reloadObsidian`);\n }\n const newObsidianOptions: NormalizedObsidianCapabilityOptions = {\n ...oldObsidianOptions,\n // Resolve relative to PWD instead of root dir during tests\n vault: vault ? path.resolve(vault) : oldObsidianOptions.vault,\n copy,\n plugins: selectedPlugins, themes: selectedThemes,\n };\n\n if (isAppium(this.requestedCapabilities)) {\n this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] = newObsidianOptions;\n if (vault) {\n await service.setupVault(this.requestedCapabilities);\n await service.appiumUploadVault();\n await service.appiumOpenVault({clearAppState: true});\n } else {\n // reload without resetting app state or triggering appium:fullReset\n await service.appiumCloseVault()\n\n // modify the vault files to setup plugins and themes\n const local = path.join(oldObsidianOptions.openVault!, \".obsidian\");\n const localCommunityPlugins = path.join(local, \"community-plugins.json\");\n const localAppearance = path.join(local, \"appearance.json\");\n const remote = `${oldObsidianOptions.androidVault!}/.obsidian`;\n const remoteCommunityPlugins = `${remote}/community-plugins.json`;\n const remoteAppearance = `${remote}/appearance.json`;\n\n await appiumDownloadFile(this, remoteCommunityPlugins, localCommunityPlugins).catch(() => {});\n await appiumDownloadFile(this, remoteAppearance, localAppearance).catch(() => {});\n await service.obsidianLauncher.setupVault({\n vault: oldObsidianOptions.openVault!, copy: false,\n plugins: selectedPlugins, themes: selectedThemes,\n });\n for (const [src, dest] of [[localCommunityPlugins, remoteCommunityPlugins], [localAppearance, remoteAppearance]]) {\n if (await fileExists(src)) {\n await service.appiumUpload(src, dest)\n }\n }\n await service.appiumOpenVault({clearAppState: false})\n }\n } else {\n // if browserName is set, reloadSession tries to restart the driver entirely, so unset those\n const newCap: WebdriverIO.Capabilities = _.cloneDeep(\n _.omit(this.requestedCapabilities, ['browserName', 'browserVersion'])\n );\n newCap[OBSIDIAN_CAPABILITY_KEY] = newObsidianOptions;\n\n if (vault) {\n await service.setupVault(newCap);\n await service.electronSetupConfigDir(newCap);\n await this.reloadSession(newCap);\n } else {\n // reload preserving current vault and config dir\n\n // Obsidian debounces saves to the config dir, and so changes to configuration made in the tests may\n // not get saved to disk before the reboot. I haven't found a better way to flush everything than\n // just waiting a bit.\n await this.pause(2000);\n\n await this.deleteSession({shutdownDriver: false});\n // while Obsidian is down, modify the vault files to setup plugins and themes\n await service.obsidianLauncher.setupVault({\n vault: oldObsidianOptions.openVault!, copy: false,\n plugins: selectedPlugins, themes: selectedThemes,\n });\n await this.reloadSession(newCap);\n }\n }\n await service.prepareApp();\n };\n return reloadObsidian;\n }\n\n /**\n * Runs before the session and browser have started.\n */\n async beforeSession(config: Options.Testrunner, cap: WebdriverIO.Capabilities) {\n try {\n if (!cap[OBSIDIAN_CAPABILITY_KEY]) return;\n if (cap[OBSIDIAN_CAPABILITY_KEY].vault != undefined) {\n await this.setupVault(cap);\n }\n if (!isAppium(cap)) {\n await this.electronSetupConfigDir(cap);\n }\n } catch (e: any) {\n throw new SevereServiceError(getServiceErrorMessage(e));\n }\n }\n\n /**\n * Runs after session and browser have started, but before tests.\n */\n async before(cap: WebdriverIO.Capabilities, specs: unknown, browser: WebdriverIO.Browser) {\n this.browser = browser;\n try {\n if (!cap[OBSIDIAN_CAPABILITY_KEY]) return;\n\n // You are supposed to add commands via the addCommand hook, however you can't add synchronous methods that\n // way. Also, addCommand completely breaks the stack traces of errors from the methods, while tacking on the\n // methods manually doesn't.\n const newBrowserCommands = {\n ...browserCommands,\n reloadObsidian: this.createReloadObsidian(),\n }\n for (const [name, cmd] of Object.entries(newBrowserCommands)) {\n (browser as any)[name] = cmd;\n }\n\n if (isAppium(browser.requestedCapabilities)) {\n await this.appiumSetupApp();\n if (cap[OBSIDIAN_CAPABILITY_KEY].vault) {\n await this.appiumUploadVault();\n await this.appiumOpenVault({clearAppState: true});\n }\n }\n await this.prepareApp();\n } catch (e: any) {\n throw new SevereServiceError(getServiceErrorMessage(e));\n }\n }\n\n /** Runs after tests are done, but before the session is shut down */\n async after(result: number, cap: WebdriverIO.Capabilities) {\n const browser = this.browser!;\n if (!cap[OBSIDIAN_CAPABILITY_KEY]) return;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n\n if (isAppium(cap)) {\n await this.appiumCloseVault();\n\n const androidVaultsDir = obsidianOptions.androidVaultStorage == \"app-storage\" ? ANDROID_APP_STORAGE_DIR : obsidianOptions.androidVaultStorage!;\n for (const file of await appiumReaddir(browser, androidVaultsDir)) {\n const name = path.posix.basename(file);\n const isServiceManaged = name.match(/-wdio-(no)?copy$/);\n const isFromThisRun = name.includes(obsidianOptions.testRunId);\n const isCopy = name.match(/-copy$/)\n if (isServiceManaged && (!isFromThisRun || isCopy)) {\n await browser.execute(\"mobile: shell\", {command: \"rm\", args: [\"-rf\", file]});\n }\n }\n }\n }\n\n /**\n * Cleanup\n */\n async afterSession() {\n for (const tmpDir of this.tmpDirs) {\n await fsAsync.rm(tmpDir, { recursive: true, force: true });\n }\n }\n}\n","// src/utils.ts\nimport safeRegexTest from \"safe-regex2\";\nvar SENSITIVE_DATA_REPLACER = \"**MASKED**\";\nvar skipError = (aFunction) => {\n try {\n return aFunction();\n } catch {\n return void 0;\n }\n};\nvar parseMaskingPatterns = (maskingRegexString) => {\n if (typeof maskingRegexString !== \"string\") {\n return void 0;\n }\n const regexStrings = maskingRegexString?.split(/,\\s*/).filter((regexStr) => regexStr.trim() !== \"\");\n return regexStrings?.map((regexStr) => {\n const regexParts = regexStr.match(/^\\/(.*?)\\/([gimsuy]*)$/);\n if (!regexParts && safeRegexTest(regexStr)) {\n return skipError(() => new RegExp(regexStr));\n }\n if (regexParts?.[1] && safeRegexTest(regexParts[1])) {\n return skipError(() => regexParts[2] ? new RegExp(regexParts[1], regexParts[2]) : new RegExp(regexParts[1]));\n }\n return void 0;\n }).filter((regex) => regex !== void 0);\n};\nvar mask = (text, maskingPatterns) => {\n if (!maskingPatterns || typeof text !== \"string\") {\n return text;\n }\n const endsWithNewline = text.endsWith(\"\\n\");\n let maskedText = text;\n maskingPatterns.forEach((maskingRegex) => {\n maskedText = maskedText.replace(maskingRegex, (fullMatch, ...capturedGroupsAndMore) => {\n const capturedGroups = capturedGroupsAndMore.slice(0, capturedGroupsAndMore.length - 2);\n if (capturedGroups.length === 0) {\n return SENSITIVE_DATA_REPLACER;\n }\n let matchedMaskedText = fullMatch;\n capturedGroups.forEach((group) => {\n matchedMaskedText = matchedMaskedText.replace(group, SENSITIVE_DATA_REPLACER);\n });\n return matchedMaskedText;\n });\n });\n if (endsWithNewline && !maskedText.endsWith(\"\\n\")) {\n maskedText += \"\\n\";\n }\n return maskedText;\n};\n\n// src/index.ts\nimport fs from \"node:fs\";\nimport util from \"node:util\";\nimport log from \"loglevel\";\nimport chalk from \"chalk\";\nimport prefix from \"loglevel-plugin-prefix\";\nimport ansiStrip from \"strip-ansi\";\nprefix.reg(log);\nvar DEFAULT_LEVEL = process.env.WDIO_DEBUG ? \"trace\" : \"info\";\nvar COLORS = {\n error: \"red\",\n warn: \"yellow\",\n info: \"cyanBright\",\n debug: \"green\",\n trace: \"cyan\",\n progress: \"magenta\"\n};\nvar matches = {\n COMMAND: \"COMMAND\",\n BIDICOMMAND: \"BIDI COMMAND\",\n DATA: \"DATA\",\n RESULT: \"RESULT\",\n BIDIRESULT: \"BIDI RESULT\"\n};\nvar SERIALIZERS = [{\n /**\n * display error stack\n */\n matches: (err) => err instanceof Error,\n serialize: (err) => err.stack\n}, {\n /**\n * color commands blue\n */\n matches: (log2) => log2 === matches.COMMAND || log2 === matches.BIDICOMMAND,\n serialize: (log2) => chalk.magenta(log2)\n}, {\n /**\n * color data yellow\n */\n matches: (log2) => log2 === matches.DATA,\n serialize: (log2) => chalk.yellow(log2)\n}, {\n /**\n * color result cyan\n */\n matches: (log2) => log2 === matches.RESULT || log2 === matches.BIDIRESULT,\n serialize: (log2) => chalk.cyan(log2)\n}];\nvar loggers = log.getLoggers();\nvar logLevelsConfig = {};\nvar maskingPatternsConfig = {};\nvar logCache = /* @__PURE__ */ new Set();\nvar logFile;\nvar originalFactory = log.methodFactory;\nvar wdioLoggerMethodFactory = (wdioLogger) => function(methodName, logLevel, loggerName) {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return (...args) => {\n if (!logFile && process.env.WDIO_LOG_PATH) {\n logFile = fs.createWriteStream(process.env.WDIO_LOG_PATH);\n }\n const match = Object.values(matches).filter((x) => args[0].endsWith(`: ${x}`))[0];\n if (match) {\n const prefixStr = args.shift().slice(0, -match.length - 1);\n args.unshift(prefixStr, match);\n }\n args = args.map((arg) => {\n for (const s of SERIALIZERS) {\n if (s.matches(arg)) {\n return s.serialize(arg);\n }\n }\n return arg;\n });\n const unmaskedLogText = ansiStrip(`${util.format.apply(this, args)}\n`);\n const maskedLogText = mask(unmaskedLogText, wdioLogger.maskingPatterns);\n if (logFile && logFile.writable) {\n if (logCache.size) {\n logCache.forEach((log2) => {\n if (logFile) {\n logFile.write(log2);\n }\n });\n logCache.clear();\n }\n if (!logsContainInitPackageError(unmaskedLogText)) {\n return logFile.write(maskedLogText);\n }\n logFile.write(maskedLogText);\n }\n logCache.add(maskedLogText);\n if (maskedLogText === unmaskedLogText) {\n rawMethod(...args);\n } else {\n rawMethod(maskedLogText.replace(/\\n$/, \"\"));\n }\n };\n};\nvar progress = function(data) {\n if (process.stdout.isTTY && this.getLevel() <= log.levels.INFO) {\n const level = \"progress\";\n const timestampFormatter = chalk.gray((/* @__PURE__ */ new Date()).toISOString());\n const levelFormatter = chalk[COLORS[level]](level.toUpperCase());\n const nameFormatter = chalk.whiteBright(this.name);\n const _data = data.length > 0 ? `${timestampFormatter} ${levelFormatter} ${nameFormatter}: ${data}` : \"\\r\\x1B[K\\x1B[?25h\";\n process.stdout.write(\"\\x1B[?25l\");\n process.stdout.write(`${_data}\\r`);\n }\n};\nfunction getLogger(name) {\n if (loggers[name]) {\n return loggers[name];\n }\n let logLevel = process.env.WDIO_LOG_LEVEL || DEFAULT_LEVEL;\n const logLevelName = getLogLevelName(name);\n if (logLevelsConfig[logLevelName]) {\n logLevel = logLevelsConfig[logLevelName];\n }\n loggers[name] = log.getLogger(name);\n const logger = loggers[name];\n logger.setLevel(logLevel);\n logger.maskingPatterns = maskingPatternsConfig[name] ?? parseMaskingPatterns(process.env.WDIO_LOG_MASKING_PATTERNS);\n logger.progress = progress;\n logger.methodFactory = wdioLoggerMethodFactory(logger);\n prefix.apply(logger, {\n template: \"%t %l %n:\",\n timestampFormatter: (date) => chalk.gray(date.toISOString()),\n levelFormatter: (level) => chalk[COLORS[level]](level.toUpperCase()),\n nameFormatter: (name2) => chalk.whiteBright(name2)\n });\n return logger;\n}\ngetLogger.waitForBuffer = async () => new Promise((resolve) => {\n if (logFile && Array.isArray(logFile.writableBuffer) && logFile.writableBuffer.length !== 0) {\n return setTimeout(async () => {\n await getLogger.waitForBuffer();\n resolve();\n }, 20);\n }\n resolve();\n});\ngetLogger.setLevel = (name, level) => loggers[name].setLevel(level);\ngetLogger.clearLogger = () => {\n if (logFile) {\n logFile.end();\n }\n logFile = null;\n};\ngetLogger.setLogLevelsConfig = (logLevels = {}, wdioLogLevel = DEFAULT_LEVEL) => {\n if (process.env.WDIO_LOG_LEVEL === void 0) {\n process.env.WDIO_LOG_LEVEL = wdioLogLevel;\n }\n logLevelsConfig = {};\n Object.entries(logLevels).forEach(([logName, logLevel]) => {\n const logLevelName = getLogLevelName(logName);\n logLevelsConfig[logLevelName] = logLevel;\n });\n Object.keys(loggers).forEach((logName) => {\n const logLevelName = getLogLevelName(logName);\n const logLevel = typeof logLevelsConfig[logLevelName] !== \"undefined\" ? logLevelsConfig[logLevelName] : process.env.WDIO_LOG_LEVEL;\n loggers[logName].setLevel(logLevel);\n });\n};\ngetLogger.setMaskingPatterns = (pattern) => {\n if (typeof pattern === \"string\") {\n if (process.env.WDIO_LOG_MASKING_PATTERNS === void 0) {\n process.env.WDIO_LOG_MASKING_PATTERNS = pattern;\n }\n } else if (typeof pattern === \"object\") {\n maskingPatternsConfig = Object.entries(pattern).reduce((acc, [logName, maskingPatternsString]) => {\n acc[logName] = parseMaskingPatterns(maskingPatternsString);\n return acc;\n }, maskingPatternsConfig);\n } else {\n throw new Error(`Invalid pattern property, expected \\`string\\` or \\`Record<string, string>\\` but received \\`${typeof pattern}\\``);\n }\n Object.keys(loggers).forEach((logName) => {\n const maskingPatterns = maskingPatternsConfig[logName] ?? parseMaskingPatterns(process.env.WDIO_LOG_MASKING_PATTERNS);\n loggers[logName].maskingPatterns = maskingPatterns;\n });\n};\nvar getLogLevelName = (logName) => logName.split(\":\").shift();\nfunction logsContainInitPackageError(logText) {\n return ERROR_LOG_VALIDATOR.every((pattern) => logText.includes(pattern));\n}\nvar ERROR_LOG_VALIDATOR = [\n \"Couldn't find plugin\",\n \"neither as wdio scoped package\",\n \"nor as community package\",\n \"Please make sure you have it installed\"\n];\nexport {\n SENSITIVE_DATA_REPLACER,\n getLogger as default\n};\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Fast path: ANSI codes require ESC (7-bit) or CSI (8-bit) introducer\n\tif (!string.includes('\\u001B') && !string.includes('\\u009B')) {\n\t\treturn string;\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import type * as obsidian from \"obsidian\"\nimport { ObsidianPage } from \"./pageobjects/obsidianPage.js\"\nimport { NormalizedObsidianCapabilityOptions, OBSIDIAN_CAPABILITY_KEY } from \"./types.js\";\nimport { AppInternal } from \"./obsidianTypes.js\";\n\nexport const browserCommands = {\n /**\n * Wrapper around browser.execute that passes the Obsidian API to the function. The first argument to the function\n * is an object containing keys:\n * - app: Obsidian app instance\n * - obsidian: Full Obsidian API\n * - plugins: Object of all installed plugins, mapped by plugin id converted to camelCase.\n * - require: The customized require function Obsidian makes available to plugins. This is also available globally,\n * so you can just use `require` directly instead of from {@link ExecuteObsidianArg} if you prefer.\n * \n * The same caveats as `browser.execute` apply. The function will be stringified and then run inside Obsidian, so\n * you can't capture any local variables. Instead, pass inputs as extra arguments to the function.\n * \n * See also: https://webdriver.io/docs/api/browser/execute\n * \n * Example usage:\n * ```ts\n * const stats = await browser.executeObsidian(({app}, path) => {\n * return app.vault.getMarkdownFiles().find(f => f.path == path)!.stat;\n * }, \"Welcome.md\");\n * ```\n * \n * Make sure not to capture Obsidian types, instead use the provided obsidian module object. E.g. \n * This *won't* work:\n * ```ts\n * import { FileView } from \"obsidian\"\n * browser.executeObsidian(({app}) => {\n * if (leaf.view instanceof FileView) {\n * ...\n * }\n * })\n * ```\n * do this instead:\n * ```ts\n * browser.executeObsidian(({app, obsidian}) => {\n * if (leaf.view instanceof obsidian.FileView) {\n * ...\n * }\n * })\n * ```\n */\n async executeObsidian<Return, Params extends unknown[]>(\n this: WebdriverIO.Browser,\n func: (obs: ExecuteObsidianArg, ...params: Params) => Return,\n ...params: Params\n ): Promise<Return> {\n const obsidianOptions = this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n if (obsidianOptions.vault === undefined) {\n throw Error(\"No vault open, set vault in wdio.conf.mts or use reloadObsidian to open a vault dynamically.\")\n }\n // Call the function. Just stringify the function (browser.execute stringifies it anyways). Add a workaround for\n // node fs errors returning useless error messages. If the thrown error has a \"code\" field that is a string, the\n // chromedriver throws an error like this with no further info:\n // \"unknown error: call function result missing int 'status'\"\n // I think this is a bug in ChromeDevtoolsProtocol or chromedriver. See\n // https://github.com/electron-userland/spectron/issues/1057\n const result = await this.execute<Return, Params>(`\n const require = window.wdioObsidianService().require;\n try {\n return await (\n ${func.toString()}\n ).call(null, window.wdioObsidianService(), ...arguments);\n } catch (e) {\n if (\"code\" in e && typeof e.code != \"number\") {\n delete e.code;\n }\n throw e;\n }\n `, ...params);\n // TODO Should maybe add in the TransformReturn and TransformElement bit that wdio has recently added to the\n // execute types, though it causes weird affects if `func` returns type any.\n return result as Return;\n },\n\n /**\n * Executes an Obsidian command by id.\n * @param id Id of the command to run.\n */\n async executeObsidianCommand(this: WebdriverIO.Browser, id: string) {\n const result = await this.executeObsidian(\n ({app}, id) => (app as AppInternal).commands.executeCommandById(id),\n id,\n );\n if (!result) {\n throw Error(`Obsidian command ${id} not found or failed.`);\n }\n },\n\n /**\n * Returns the Obsidian app version this test is running under.\n */\n getObsidianVersion(this: WebdriverIO.Browser): string {\n const obsidianOptions = this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n return obsidianOptions.appVersion;\n },\n \n /**\n * Returns the Obsidian installer version this test is running under.\n */\n getObsidianInstallerVersion(this: WebdriverIO.Browser): string {\n const obsidianOptions = this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n return obsidianOptions.installerVersion;\n },\n\n /**\n * Returns the ObsidianPage object with convenience helper functions.\n * You can also just import the page object directly with\n * ```ts\n * import { obsidianPage } from \"wdio-obsidian-service\"\n * ```\n */\n getObsidianPage(this: WebdriverIO.Browser): ObsidianPage {\n return new ObsidianPage(this);\n },\n}\n\n/**\n * Extra commands added to the WDIO Browser instance.\n * \n * See also: https://webdriver.io/docs/api/browser\n * @interface\n * @category Utilities\n */\nexport type ObsidianBrowserCommands = typeof browserCommands & {\n /**\n * Relaunch obsidian. Can be used to switch to a new vault, change the plugin list, or just to reboot Obsidian.\n * \n * As this does a full reboot of Obsidian, this is rather slow. In many cases you can use\n * {@link ObsidianPage.resetVault} instead, which modifies vault files in place without rebooting Obsidian. If all\n * your tests use the same vault, you can also just set the vault in the `wdio.conf.mts` capabilities section.\n * \n * @param params.vault Path to the vault to open. The vault will be copied by default, so any changes made in your\n * tests won't be persisted to the original. Set `copy` to `false` to use the vault in-place. If omitted, it will\n * reboot Obsidian with the current vault without creating a new copy of the vault.\n * @param params.copy Whether to copy the vault to a temporary directory before running tests in it (default true).\n * When `true` (the default), the vault is copied so that tests don't modify the original and parallel tests will\n * work on separate copies of the vault. When `false`, the vault is used in-place, useful for debugging or\n * read-only tests on large vaults.\n *\n * **WARNING**: With `copy: false`, even with \"read-only\" tests, Obsidian will often make changes under\n * `.obsidian` that will get persisted. This also means that running parallel tests on the same vault with\n * `copy: false` is unsafe.\n * @param params.plugins List of plugin ids to enable. If omitted it will keep current plugin list. Note, all the\n * plugins must be defined in your wdio.conf.mts capabilities. You can also use the enablePlugin and disablePlugin\n * commands to change plugins without relaunching Obsidian.\n * @param params.theme Name of the theme to enable. If omitted it will keep the current theme. Pass \"default\" to\n * switch back to the default theme. Like with plugins, the theme must be defined in wdio.conf.mts.\n */\n reloadObsidian(params?: {\n vault?: string,\n copy?: boolean,\n plugins?: string[], theme?: string,\n }): Promise<void>;\n // This command is implemented in the service hooks.\n};\n\n/**\n * Argument passed to the {@link ObsidianBrowserCommands.executeObsidian | executeObsidian} browser command.\n * @category Types\n */\nexport interface ExecuteObsidianArg {\n /**\n * There is a global \"app\" instance, but that may be removed in the future so you can use this to access it from\n * tests. See https://docs.obsidian.md/Plugins/Releasing/Plugin+guidelines#Avoid+using+global+app+instance\n */\n app: obsidian.App,\n\n /**\n * The full obsidian API. See https://github.com/obsidianmd/obsidian-api/blob/master/obsidian.d.ts\n */\n obsidian: typeof obsidian,\n\n /**\n * Object containing all installed plugins mapped by their id. Plugin ids are converted to camelCase for ease of\n * destructuring.\n * \n * If you want to add typings for your plugin(s) you can use something like this in a `.d.ts`:\n * ```ts\n * import type MyPlugin from \"../src/main.js\"\n * declare module \"wdio-obsidian-service\" {\n * interface InstalledPlugins {\n * myPlugin: MyPlugin,\n * }\n * }\n * ```\n */\n plugins: InstalledPlugins,\n\n /**\n * The customized require function Obsidian makes available to plugins. This is also available globally, so you can\n * just use `require` directly instead of from {@link ExecuteObsidianArg} if you prefer.\n */\n require: NodeJS.Require,\n}\n\n/**\n * Installed plugins, mapped by their id converted to camelCase\n * @category Types\n */\nexport interface InstalledPlugins extends Record<string, obsidian.Plugin> {\n}\n","import * as path from \"path\"\nimport * as fsAsync from \"fs/promises\"\nimport * as crypto from \"crypto\";\nimport * as semver from \"semver\";\nimport { fileURLToPath } from \"url\";\nimport { TFile } from \"obsidian\";\nimport _ from \"lodash\";\nimport { OBSIDIAN_CAPABILITY_KEY, NormalizedObsidianCapabilityOptions } from \"../types.js\";\nimport { BasePage } from \"./basePage.js\";\nimport { isAppium, normalizePath, isHidden, isText } from \"../utils.js\";\nimport { AppInternal, PlatformInternal } from \"../obsidianTypes.js\";\n\n/**\n * Class with various helper methods for writing Obsidian tests using the\n * [page object pattern](https://webdriver.io/docs/pageobjects).\n * \n * You can get an instance of this class either by running\n * ```ts\n * const obsidianPage = await browser.getObsidianPage();\n * ```\n * or just importing it directly with\n * ```ts\n * import { obsidianPage } from \"wdio-obsidian-service\";\n * ```\n * \n * @hideconstructor\n * @category Utilities\n */\nclass ObsidianPage extends BasePage {\n private getObsidianCapabilities(): NormalizedObsidianCapabilityOptions {\n return this.browser.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY];\n }\n\n /**\n * Returns the path to the vault opened in Obsidian.\n * \n * wdio-obsidian-service copies your vault before running tests, so this is the path to the temporary copy.\n */\n getVaultPath(): string {\n const obsidianOptions = this.getObsidianCapabilities();\n if (obsidianOptions.openVault === undefined) {\n throw Error(\"No vault open, set vault in wdio.conf.mts or use reloadObsidian to open a vault dynamically.\")\n }\n return obsidianOptions.androidVault ?? obsidianOptions.openVault;\n }\n\n /** \n * Run an Obsidian CLI command.\n * \n * The Obsidian CLI Only works on Obsidian >=1.12.0 with installer >=1.11.7\n * See https://help.obsidian.md/cli\n */\n async runObsidianCli(args: string[]): Promise<{stdout: string, stderr: string}> {\n const {appVersion, installerVersion} = this.getObsidianCapabilities();\n if (semver.lt(appVersion, \"1.12.0\") || semver.lt(installerVersion, \"1.11.7\")) {\n throw Error(`Obsidian CLI only works on app >=1.12.0 and installer >=1.11.7`)\n }\n if (isAppium(this.browser.requestedCapabilities)) {\n throw Error(`Obsidian CLI only works on desktop`)\n }\n const stdout = await this.browser.execute((args) => (window as any).handleCli(args), args);\n return {stdout, stderr: \"\"};\n // TODO: I'd prefer to run this with the actual binary instead of using the internal API here, but as of 1.12.5,\n // the communication socket Obsidian uses has a constant name, e.g. `/run/user/1000/obsidian-cli.sock`,\n // so parallel Obsidian instances interfere with each other. \n\n // const chromeArgs: string[] = this.browser.requestedCapabilities['goog:chromeOptions'].args;\n // The Windows .com wrapper is losing --user-data-dir args\n // const cliBinary = binaryPath!.replace(/.exe$/, '.com');\n // return await execFile(binaryPath!, [...args, ...chromeArgs]);\n }\n\n /**\n * Return the Obsidian config dir (just \".obsidian\" unless you changed the config dir name in settings).\n */\n async getConfigDir(): Promise<string> {\n return await this.browser.executeObsidian(({app}) => app.vault.configDir)\n }\n\n /**\n * Returns the Obsidian Platform object. Useful for skipping tests based on whether you are running in desktop or\n * mobile, or based on OS.\n */\n async getPlatform(): Promise<Platform> {\n const obsidianOptions = this.getObsidianCapabilities();\n const appium = isAppium(this.browser.requestedCapabilities);\n const emulateMobile = obsidianOptions.emulateMobile;\n\n // To allow calling getPlatform before opening a vault, we'll compute the values ourselves when a vault isn't\n // open. We'll pull obsidian Platform if there is a vault, as technically you can change the screen size and\n // emulation mode during tests. Also, on very old versions of Obsidian, not all these fields are exist.\n const platform = {\n isDesktop: !(appium || emulateMobile),\n isMobile: appium || emulateMobile,\n isDesktopApp: !appium,\n isMobileApp: appium,\n isIosApp: false, // iOS is not supported\n isAndroidApp: appium,\n isMacOS: !appium && process.platform == 'darwin',\n isWin: !appium && process.platform == 'win32',\n isLinux: appium || process.platform == 'linux',\n isSafari: false, // iOS is not supported\n };\n\n if (obsidianOptions.vault !== undefined) {\n const obsidianPlatform = await this.browser.executeObsidian(({obsidian}) => {\n // The types for this in old versions of obsidian types are incomplete, so any cast here\n const p = obsidian.Platform as PlatformInternal;\n return {\n isMobileApp: p.isMobileApp,\n isIosApp: p.isIosApp,\n isAndroidApp: p.isAndroidApp,\n isPhone: p.isPhone,\n isTablet: p.isTablet,\n isMacOS: p.isMacOS,\n isWin: p.isWin,\n isLinux: p.isLinux,\n isSafari: p.isSafari,\n };\n })\n Object.assign(platform, _.pickBy(obsidianPlatform, x => x != null));\n } else {\n const [width, height] = await this.browser.execute(() => [window.innerWidth, window.innerHeight]);\n\n let isTablet = false;\n let isPhone = false;\n if (appium || emulateMobile) {\n // replicate Obsidian's tablet vs phone breakpoint\n isTablet = (width >= 600 && height >= 600);\n isPhone = !isTablet;\n }\n\n Object.assign(platform, {isTablet, isPhone});\n }\n\n return platform as Platform;\n }\n\n /**\n * Enables a plugin by ID\n */\n async enablePlugin(pluginId: string): Promise<void> {\n await this.browser.executeObsidian(\n async ({app}, pluginId) => await (app as AppInternal).plugins.enablePluginAndSave(pluginId),\n pluginId,\n );\n }\n\n /**\n * Disables a plugin by ID\n */\n async disablePlugin(pluginId: string): Promise<void> {\n await this.browser.executeObsidian(\n async ({app}, pluginId) => await (app as AppInternal).plugins.disablePluginAndSave(pluginId),\n pluginId,\n );\n }\n\n /**\n * Sets the theme. Pass \"default\" to reset to the Obsidian theme.\n */\n async setTheme(themeName: string): Promise<void> {\n themeName = themeName == 'default' ? '' : themeName;\n await this.browser.executeObsidian(\n async ({app}, themeName) => await (app as AppInternal).customCss.setTheme(themeName),\n themeName,\n )\n }\n\n /**\n * Opens a file in a new tab.\n */\n async openFile(path: string) {\n await this.browser.executeObsidian(async ({app, obsidian}, path) => {\n const file = app.vault.getAbstractFileByPath(path);\n if (file instanceof obsidian.TFile) {\n const leaf = app.workspace.getLeaf('tab');\n await leaf.openFile(file);\n app.workspace.setActiveLeaf(leaf, {focus: true});\n } else {\n throw Error(`No file ${path} exists`);\n }\n }, path)\n }\n\n /**\n * Loads a saved workspace layout from `.obsidian/workspaces.json` by name. Use the core \"Workspaces\"\n * plugin to create the layouts. You can also pass the layout object directly.\n */\n async loadWorkspaceLayout(layout: any): Promise<void> {\n if (typeof layout == \"string\") {\n // read from .obsidian/workspaces.json like the built-in workspaces plugin does\n const workspacesPath = `${await this.getConfigDir()}/workspaces.json`;\n const layoutName = layout;\n try {\n const fileContent = await this.browser.executeObsidian(async ({app}, workspacesPath) => {\n return await app.vault.adapter.read(workspacesPath);\n }, workspacesPath);\n layout = JSON.parse(fileContent)?.workspaces?.[layoutName];\n } catch {\n throw new Error(`Failed to load ${workspacesPath}:${layoutName}`);\n }\n if (!layout) {\n throw new Error(`No workspace ${layoutName} found in ${workspacesPath}`);\n }\n }\n\n await this.browser.executeObsidian(async ({app}, layout) => {\n await app.workspace.changeLayout(layout)\n }, layout)\n }\n\n /**\n * Return contents of a file in the vault.\n */\n async read(file: string): Promise<string> {\n return await this.browser.executeObsidian(async ({app, obsidian}, file) => {\n file = obsidian.normalizePath(file);\n return await app.vault.adapter.read(file);\n }, file);\n }\n\n /**\n * Return contents of a binary file in the vault.\n */\n async readBinary(file: string): Promise<ArrayBuffer> {\n const b64Contents = await this.browser.executeObsidian(async ({app, obsidian}, file) => {\n function toB64(buffer: ArrayBuffer) {\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n file = obsidian.normalizePath(file);\n return toB64(await app.vault.adapter.readBinary(file));\n }, file);\n return Buffer.from(b64Contents, 'base64').buffer;\n }\n\n /**\n * Deletes a file or folder in the vault.\n * @param file path of inside vault, e.g. \"/books/leviathan-wakes.md\"\n */\n async delete(file: string) {\n await this.browser.executeObsidian(async ({app, obsidian}, file, isVaultFile) => {\n file = obsidian.normalizePath(file);\n if (isVaultFile) {\n const fileObj = app.vault.getAbstractFileByPath(file);\n if (fileObj) {\n await app.vault.delete(fileObj, true);\n };\n } else {\n const stat = await app.vault.adapter.stat(file);\n if (stat && stat.type == \"folder\") {\n await app.vault.adapter.rmdir(file, true);\n } else if (stat) {\n await app.vault.adapter.remove(file);\n }\n }\n }, file, !isHidden(file));\n }\n\n /**\n * Writes to a file in the vault. Creates parent directories if needed.\n * @param file path of inside vault, e.g. \"/books/leviathan-wakes.md\"\n * @param content content to write to the file\n */\n async write(file: string, content: string|ArrayBufferLike|ArrayBuffer) {\n let strContent: string|undefined, binContent: string|undefined;\n if (typeof content == \"string\") {\n strContent = content;\n } else {\n binContent = Buffer.from(content).toString(\"base64\");\n }\n await this.browser.executeObsidian(async ({app, obsidian}, file, isVaultFile, strContent, binContent) => {\n file = obsidian.normalizePath(file);\n const parent = file.split(\"/\").slice(0, -1).join(\"/\");\n if (isVaultFile) {\n if (parent && !app.vault.getAbstractFileByPath(parent)) {\n await app.vault.createFolder(parent);\n }\n const fileObj = app.vault.getAbstractFileByPath(file);\n strContent = strContent ?? atob(binContent!);\n if (fileObj) {\n await app.vault.modify(fileObj as TFile, strContent);\n } else {\n await app.vault.create(file, strContent);\n }\n } else {\n await app.vault.adapter.mkdir(parent);\n if (strContent) {\n await app.vault.adapter.write(file, strContent);\n } else {\n const buffer = Uint8Array.from(atob(binContent!), c => c.charCodeAt(0)).buffer;\n await app.vault.adapter.writeBinary(file, buffer);\n }\n }\n }, file, !isHidden(file) && isText(file), strContent, binContent);\n }\n\n /**\n * Create a folder in the vault. Creates parent directories if needed.\n * @param file path of inside vault, e.g. \"/books\"\n */\n async mkdir(file: string) {\n await this.browser.executeObsidian(async ({app, obsidian}, file, isVaultFile) => {\n file = obsidian.normalizePath(file);\n if (isVaultFile) {\n if (parent && !app.vault.getAbstractFileByPath(file)) {\n await app.vault.createFolder(file);\n }\n } else {\n await app.vault.adapter.mkdir(file);\n }\n }, file, !isHidden(file));\n }\n\n /**\n * Updates the vault by modifying files in place without reloading Obsidian. Can be used to reset the vault back to\n * its original state or to \"switch\" to an entirely different vault without rebooting Obsidian\n * \n * This will only update regular vault files, it won't touch anything under `.obsidian`, and it won't reset any\n * Obsidian config or plugin settings. But if all you need is to reset the vault files, this can be used as a faster\n * alternative to {@link ObsidianBrowserCommands.reloadObsidian | reloadObsidian}.\n * \n * You'll often want to combine resetVault with something like this to reset your plugin's configuration as well:\n * ```ts\n * await browser.executeObsidian(async ({plugins}, settings) => {\n * Object.assign(plugins.myPlugin.settings, settings);\n * await plugins.myPlugin.saveSettings();\n * }, {...});\n * ```\n *\n * If no vault is passed, it resets the vault back to the oringal vault opened by the tests. You can also pass a\n * path to a different vault, and it will replace the current files with the files of that vault (similar to an\n * \"rsync\"). Or, instead of passing a vault path you can pass an object mapping vault file paths to file content.\n * E.g.\n * ```ts\n * obsidianPage.resetVault({\n * 'path/in/vault.md': \"Hello World\",\n * })\n * ```\n * \n * You can also pass multiple vaults and objects, and they will be merged. This can be useful if you want to add a\n * few small modifications to the base vault. e.g:\n * ```ts\n * obsidianPage.resetVault('./path/to/vault', {\n * \"books/leviathan-wakes.md\": \"...\",\n * })\n * ```\n */\n async resetVault(...vaults: (string|Record<string, string|ArrayBufferLike|ArrayBuffer>)[]) {\n const obsidianOptions = this.getObsidianCapabilities();\n if (!obsidianOptions.vault) {\n // open an empty vault if there's no vault open\n const defaultVaultPath = path.resolve(fileURLToPath(import.meta.url), '../../default-vault');\n await this.browser.reloadObsidian({vault: defaultVaultPath});\n }\n const configDir = await this.getConfigDir();\n vaults = vaults.length == 0 ? [obsidianOptions.vault!] : vaults;\n\n // list all files in the new vault\n type NewFileInfo = {\n type: \"file\"|\"folder\",\n sourceContent?: string|ArrayBufferLike|ArrayBuffer,\n sourceFile?: string,\n };\n const newVault: Map<string, NewFileInfo> = new Map();\n for (let vault of vaults) {\n if (typeof vault == \"string\") {\n vault = path.resolve(vault);\n const files = await fsAsync.readdir(vault, { recursive: true, withFileTypes: true });\n for (const f of files) {\n const fullPath = path.join(f.parentPath, f.name);\n const vaultPath = path.relative(vault, fullPath).split(path.sep).join(\"/\");\n if (!vaultPath.startsWith(configDir + \"/\")) {\n if (f.isDirectory()) {\n newVault.set(vaultPath, {type: 'folder'});\n } else {\n newVault.set(vaultPath, {type: 'file', sourceFile: fullPath});\n }\n }\n }\n } else {\n vault = _.mapKeys(vault, (v, k) => normalizePath(k));\n for (const [file, content] of Object.entries(vault)) {\n newVault.set(file, {type: \"file\", sourceContent: content});\n }\n const folders = new Set(Object.keys(vault).map(p => path.posix.dirname(p)).filter(p => p !== \".\"));\n for (const folder of folders) {\n newVault.set(folder, {type: \"folder\"});\n }\n }\n }\n\n // list all files in the current vault\n type CurrFileInfo = {type: \"file\"|\"folder\", hash?: string};\n const currVault = new Map(await this.browser.executeObsidian(({app}, configDir) => {\n async function hash(data: ArrayBuffer) {\n const hashBuffer = await window.crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n }\n\n async function listRecursive(path: string): Promise<[string, CurrFileInfo][]> {\n const result: [string, CurrFileInfo][] = [];\n const { folders, files } = await app.vault.adapter.list(path);\n for (const folder of folders) {\n if (!folder.startsWith(configDir + \"/\")) {\n result.push([folder, {type: \"folder\"}]);\n result.push(...await listRecursive(folder));\n }\n }\n for (const file of files) {\n if (!file.startsWith(configDir + \"/\")) {\n let fileHash = (app as AppInternal).metadataCache.getFileInfo(file)?.hash;\n if (!fileHash) { // hidden files etc. aren't in Obsidian's metadata cache\n fileHash = await hash(await app.vault.adapter.readBinary(file));\n }\n result.push([file, { type: \"file\", hash: fileHash }]);\n }\n }\n return result;\n }\n\n return listRecursive(\"/\");\n }, configDir));\n\n // delete any files that need to be deleted\n for (const file of [...currVault.keys()].sort().reverse()) {\n const currFileInfo = currVault.get(file)!\n if (!newVault.has(file) || newVault.get(file)!.type != currFileInfo.type) {\n await this.delete(file);\n }\n }\n\n // create files and folders\n for (const [file, newFileInfo] of _.sortBy([...newVault.entries()], 0)) {\n const currFileInfo = currVault.get(file);\n if (newFileInfo.type == \"file\") {\n let content = newFileInfo.sourceContent;\n if (!content) {\n content = (await fsAsync.readFile(newFileInfo.sourceFile!)).buffer as ArrayBuffer;\n }\n const hash = crypto.createHash(\"SHA256\")\n .update(typeof content == \"string\" ? content : new Uint8Array(content))\n .digest(\"hex\");\n if (!currFileInfo || currFileInfo.hash != hash) {\n await this.write(file, content);\n }\n } else if (newFileInfo.type == \"folder\" && !currFileInfo) {\n await this.mkdir(file);\n }\n }\n }\n}\n\n/**\n * Info on the platform we are running on or emulating, in similar format as\n * [obsidian.Platform](https://docs.obsidian.md/Reference/TypeScript+API/Platform)\n * @category Types\n */\nexport interface Platform {\n /**\n * The UI is in desktop mode.\n */\n isDesktop: boolean;\n /**\n * The UI is in mobile mode.\n */\n isMobile: boolean;\n /**\n * We're running the Electron-based desktop app.\n * Note, when running under `emulateMobile` this will still be true and isDesktop will be false.\n */\n isDesktopApp: boolean;\n /**\n * We're running the Capacitor-js mobile app.\n * Note, when running under `emulateMobile` this will still be false and isMobile will be true.\n */\n isMobileApp: boolean;\n /** \n * We're running the iOS app.\n * Note, wdio-obsidian-service doesn't support iOS yet, so this will always be false.\n */\n isIosApp: boolean;\n /**\n * We're running the Android app.\n */\n isAndroidApp: boolean;\n /**\n * We're in a mobile app that has very limited screen space.\n */\n isPhone: boolean;\n /**\n * We're in a mobile app that has sufficiently large screen space.\n */\n isTablet: boolean;\n /**\n * We're on a macOS device, or a device that pretends to be one (like iPhones and iPads).\n * Typically used to detect whether to use command-based hotkeys vs ctrl-based hotkeys.\n */\n isMacOS: boolean;\n /**\n * We're on a Windows device.\n */\n isWin: boolean;\n /**\n * We're on a Linux device.\n */\n isLinux: boolean;\n /**\n * We're running in Safari.\n * Note, wdio-obsidian-service doesn't support iOS yet, so this will always be false.\n */\n isSafari: boolean;\n};\n\n/**\n * Instance of {@link ObsidianPage} with helper methods for writing Obsidian tests.\n * @category Utilities\n */\nconst obsidianPage = new ObsidianPage()\nexport default obsidianPage;\nexport { ObsidianPage };\n","import type { ObsidianBrowserCommands } from \"./browserCommands.js\";\nimport type { PluginEntry, ThemeEntry, DownloadedPluginEntry, DownloadedThemeEntry } from \"obsidian-launcher\";\n\nexport const OBSIDIAN_CAPABILITY_KEY = \"wdio:obsidianOptions\";\n\n/**\n * Options passed to an \"wdio:obsidianOptions\" capability in wdio.conf.mts. E.g.\n * ```ts\n * // ...\n * capabilities: [{\n * browserName: \"obsidian\",\n * browserVersion: \"latest\",\n * 'wdio:obsidianOptions': {\n * installerVersion: 'earliest',\n * plugins: [\".\"],\n * },\n * }],\n * ```\n * \n * @category Options\n */\nexport interface ObsidianCapabilityOptions {\n /**\n * Version of Obsidian to download and run.\n * \n * Can be set to a specific version or one of:\n * - \"latest\": Run the latest non-beta Obsidian version\n * - \"latest-beta\": Run the latest beta Obsidian version (or latest if there is no current beta)\n * - To download Obsidian beta versions you'll need to have an Obsidian Insiders account and either set the \n * `OBSIDIAN_EMAIL` and `OBSIDIAN_PASSWORD` environment variables (`.env` file is supported) or pre-download\n * the Obsidian beta version with `npx obsidian-launcher download app -v latest-beta`\n * - \"earliest\": Run the `minAppVersion` set in your `manifest.json`\n * \n * Defaults to \"latest\".\n * \n * You can also use the wdio capability `browserVersion` field to set the Obsidian version.\n * \n * See also: [Obsidian App vs Installer Versions](../README.md#obsidian-app-vs-installer-versions)\n */\n appVersion?: string\n\n /**\n * Version of the Obsidian installer to download and run.\n * \n * Obsidian is Desktop distributed in two parts, the app which contains the JS, and the installer which is the\n * binary with Electron. Obsidian's auto update only updates the app, so users on the same Obsidian version can be\n * running different Electron versions. You can use this to test your plugin against different installer/Electron\n * versions.\n * \n * See also: [Obsidian App vs Installer Versions](../README.md#obsidian-app-vs-installer-versions)\n *\n * Can be set to a specific version string or one of:\n * - \"latest\": Run the latest Obsidian installer compatible with `appVersion`.\n * - \"earliest\": Run the oldest Obsidian installer compatible with `appVersion`.\n * \n * Defaults to \"earliest\".\n */\n installerVersion?: string,\n\n /**\n * List of plugins to install.\n * \n * Each entry is a path to the local plugin to install, e.g. [\".\"] or [\"dist\"] depending on your build setup. Paths\n * are relative to your `wdio.conf.mts`. You can also pass objects. If you pass an object it should contain one of\n * `path` (to install a local plugin), `repo` (to install a plugin from GitHub), or `id` (to install a community\n * plugin). You can set `enabled: false` to install the plugin but start it disabled. You can enable the plugin\n * later using {@link ObsidianBrowserCommands.reloadObsidian|browser.reloadObsidian} or\n * {@link ObsidianPage.enablePlugin}.\n */\n plugins?: PluginEntry[],\n\n /**\n * List of themes to install.\n * \n * Each entry is a path to the local theme to install. Paths are relative to your `wdio.conf.mts`. You can also pass\n * an object. If you pass an object it should contain one of `path` (to install a local theme), `repo` (to install a\n * theme from GitHub), or `name` (to install a community theme). You can set `enabled: false` to install the theme,\n * but start it disabled. You can only have one enabled theme, so if you pass multiple you'll have to disable all\n * but one.\n */\n themes?: ThemeEntry[],\n\n /**\n * The path to the vault to open.\n *\n * By default the vault will be copied to a temporary directory, so any changes made in your tests won't affect\n * the original. Set {@link copy} to `false` to use the vault in-place. If omitted, no vault will be opened and\n * you'll need to call {@link ObsidianBrowserCommands.reloadObsidian|browser.reloadObsidian} to open a vault\n * during your tests. Path is relative to your `wdio.conf.mts`.\n */\n vault?: string,\n\n /**\n * Whether to copy the vault to a temporary directory before running tests in it (the default).\n *\n * When `true` (the default), the vault is copied so that tests don't modify the original and parallel tests will\n * work on separate copies of the vault. When `false`, the vault is used in-place, useful for debugging or\n * read-only tests on large vaults.\n *\n * **WARNING**: With `copy: false`, even with \"read-only\" tests, Obsidian will often make changes under `.obsidian`\n * that will get persisted. This also means that running parallel tests on the same vault with `copy: false` is\n * unsafe.\n */\n copy?: boolean,\n\n /**\n * Set to true to emulate mobile on the Electron desktop app. This uses Obsidian `app.emulateMobile()` to switch\n * Obsidian to the mobile UI, and you can use Chrome's mobileEmulation to set the screen size. You can compare\n * tablet vs phone UIs by setting the screen size or emulated device. Obsidian tablet UI triggers at\n * width/height >= 600.\n *\n * Note that Obsidian Mobile runs on Capacitor instead of Electron so there are various platform differences that\n * can't be emulated. But it's good enough for most cases as long as you aren't interacting directly with the\n * operating system or Electron APIs. You can use an Android Virtual Device instead if you want a more accurate\n * (but slower) mobile test.\n *\n * See [Mobile Emulation](../README.md#mobile-emulation) for more info.\n * See [Android](../README.md#android) if you want to test the real mobile app on an Android Virtual Device instead.\n */\n emulateMobile?: boolean,\n\n /**\n * Path to the Obsidian binary to use. If omitted it will be downloaded automatically.\n */\n binaryPath?: string,\n\n /**\n * Path to the app asar to load into obsidian. If omitted it will be downloaded automatically.\n */\n appPath?: string,\n\n /**\n * Where to store test vaults when test on Android.\n * \n * Options:\n * - \"app-storage\": Store the vault as Obsidian app data. Default.\n * - \"device-storage\": Store the vault on the SD card (`/storage/emulated/0`). Currently not recommended due to \n * intermittent write failures in Capacitor that cause flaky tests. See https://forum.obsidian.md/t/102935\n * - custom path: Store vaults under a custom device storage path. Same caveats as \"device-storage\" apply.\n */\n androidVaultStorage?: string,\n}\n\n\n/** Internal type, capability options after being normalized by onPrepare */\nexport interface NormalizedObsidianCapabilityOptions {\n appVersion: string\n installerVersion: string,\n plugins: DownloadedPluginEntry[],\n themes: DownloadedThemeEntry[],\n copy: boolean,\n /** The original vault path passed by the user */\n vault?: string,\n /** The actually open vault (a copy of vault unless copy is false) */\n openVault?: string,\n /** Path of the vault on the appium device */\n androidVault?: string,\n /**\n * Unique ID per test run. We use this for handling Appium vault uploads.\n */\n testRunId: string\n emulateMobile: boolean,\n binaryPath?: string,\n appPath?: string,\n /** Just app-storage or the absolute path (device-storage is resolved to the default) */\n androidVaultStorage?: string,\n}\n\n\n/**\n * Options passed to wdio-obsidian-service service in wdio.conf.mts. E.g.\n * ```js\n * // ...\n * services: [[\"obsidian\", {versionsUrl: \"file:///path/to/obsidian-versions.json\"}]]\n * ```\n * You'll usually want to leave these options as the default, they are mostly useful for wdio-obsidian-service's\n * internal tests.\n * \n * @category Options\n */\nexport interface ObsidianServiceOptions {\n /**\n * Override the `obsidian-versions.json` used by the service. Can be a file URL.\n * Defaults to https://raw.githubusercontent.com/jesse-r-s-hines/wdio-obsidian-service/HEAD/obsidian-versions.json\n * which is auto-updated to contain information on available Obsidian versions.\n */\n versionsUrl?: string,\n /**\n * Override the `community-plugins.json` used by the service. Can be a file URL.\n * Defaults to https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json\n */\n communityPluginsUrl?: string,\n /**\n * Override the `community-css-themes.json` used by the service. Can be a file URL.\n * Defaults to https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json\n */\n communityThemesUrl?: string,\n}\n\ndeclare global {\n namespace WebdriverIO {\n interface Capabilities {\n [OBSIDIAN_CAPABILITY_KEY]?: ObsidianCapabilityOptions,\n }\n\n interface Browser extends ObsidianBrowserCommands {}\n }\n}\n","import * as wdioGlobals from \"@wdio/globals\"\n\n/**\n * Base page object for use in the wdio [page object pattern](https://webdriver.io/docs/pageobjects).\n * \n * You can pass the browser to the page object, which allows using the object even in wdio standalone mode.\n */\nexport class BasePage {\n private _browser: WebdriverIO.Browser|undefined\n constructor(browser?: WebdriverIO.Browser) {\n this._browser = browser;\n }\n\n /**\n * Returns the browser instance.\n * @hidden\n */\n protected get browser(): WebdriverIO.Browser {\n return this._browser ?? wdioGlobals.browser;\n }\n}\n","// src/index.ts\nvar globals = globalThis._wdioGlobals = globalThis._wdioGlobals || /* @__PURE__ */ new Map();\nvar GLOBALS_ERROR_MESSAGE = `No browser instance registered. Don't import @wdio/globals outside of the WDIO testrunner context. Or you have two two different \"@wdio/globals\" packages installed.`;\nfunction proxyHandler(key) {\n return {\n get: (self, prop) => {\n if (!globals.has(key)) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n const receiver = globals.get(key);\n const field = receiver[prop];\n return typeof field === \"function\" ? field.bind(receiver) : field;\n }\n };\n}\nvar browser = new Proxy(\n class Browser {\n },\n proxyHandler(\"browser\")\n);\nvar driver = new Proxy(\n class Browser2 {\n },\n proxyHandler(\"driver\")\n);\nvar multiremotebrowser = new Proxy(\n class Browser3 {\n },\n proxyHandler(\"multiremotebrowser\")\n);\nvar multiRemoteBrowser = new Proxy(\n class Browser4 {\n },\n proxyHandler(\"multiRemoteBrowser\")\n);\nvar $ = (...args) => {\n if (!globals.has(\"$\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"$\")(...args);\n};\nvar $$ = (...args) => {\n if (!globals.has(\"$$\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"$$\")(...args);\n};\nvar expect = ((...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"expect\")(...args);\n});\nvar ASYNC_MATCHERS = [\n \"any\",\n \"anything\",\n \"arrayContaining\",\n \"objectContaining\",\n \"stringContaining\",\n \"stringMatching\"\n];\nfor (const matcher of ASYNC_MATCHERS) {\n expect[matcher] = (...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"expect\")[matcher](...args);\n };\n}\nexpect.not = ASYNC_MATCHERS.reduce((acc, matcher) => {\n acc[matcher] = (...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"expect\").not[matcher](...args);\n };\n return acc;\n}, {});\nexpect.extend = (...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n const expect2 = globals.get(\"expect\");\n return expect2.extend(...args);\n};\nfunction _setGlobal(key, value, setGlobal = true) {\n globals.set(key, value);\n if (setGlobal) {\n globalThis[key] = value;\n }\n}\nexport {\n $,\n $$,\n _setGlobal,\n browser,\n driver,\n expect,\n multiRemoteBrowser,\n multiremotebrowser\n};\n","import path from \"path\";\nimport crypto from \"crypto\";\nimport fsAsync from \"fs/promises\";\nimport * as tar from \"tar\";\nimport _ from \"lodash\";\n\n/** Quote string for use in shell scripts */\nexport function quote(input: string) {\n return `'${input.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport async function fileExists(path: string) {\n try {\n await fsAsync.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Gets the appium options.\n * Handles combining `\"appium:foo\"` and `\"appium:options\": {\"foo\": ...}` style options.\n */\nexport function getAppiumOptions(\n cap: WebdriverIO.Capabilities,\n): Exclude<WebdriverIO.Capabilities['appium:options'], undefined> {\n let result = _.pickBy(cap, (v, k) => k.startsWith(\"appium:\") && k != 'appium:options');\n result = _.mapKeys(result, (v, k) => k.slice(7))\n return {...result, ...cap['appium:options']};\n}\n\n/** Returns true if this capability is for Appium */\nexport function isAppium(cap: WebdriverIO.Capabilities) {\n return getAppiumOptions(cap).automationName?.toLocaleLowerCase() === 'uiautomator2';\n}\n\n/**\n * Upload multiple files at once. Uploads files as a tar for much better performance and to avoid issues with special\n * characters in names. (see https://github.com/appium/appium-android-driver/issues/1004)\n * \n * @param opts.src Directory to copy from (-C in tar)\n * @param opts.dest Directory to copy to\n * @param opts.files Files under src to copy. Defaults to the whole dir.\n * @param opts.chunkSize Size to split the tar into while uploading (to avoid excessive RAM usage)\n */\nexport async function appiumUploadFiles(browser: WebdriverIO.Browser, opts: {\n src: string, dest: string, files?: string[], chunkSize?: number,\n}) {\n let {\n src, dest,\n files = [src],\n chunkSize = 2 * 1024 * 1024,\n } = opts;\n src = path.resolve(src);\n dest = path.posix.normalize(dest).replace(/\\/$/, '');\n files = files.map(f => path.relative(src, f) || \".\");\n if (files.length == 0) return; // nothing to do\n\n // We'll tar the files up and then extract the tar on Android side. This is a lot faster than doing many small\n // pushFiles. Since pushFile requires sending the whole file contents as a base64 string, we'll split up the tar\n // into chunks to keep the size manageable for large vaults.\n\n const tmpDir = \"/data/local/tmp\"\n const slug = crypto.randomBytes(10).toString(\"base64url\").replace(/[-_]/g, '0');\n const stream = tar.create({C: src, gzip: { level: 2 }}, files);\n\n // buffer/chunk size of the tar stream varies. Without compression it appears to be one chunk per file, splitting\n // large files at maxReadSize, plus some chunks for the header. However compression adds another layer that appears\n // to limit the output chunk size to about 16K.\n let buffers: Buffer[] = [];\n let bufferSize = 0;\n let i = 0;\n for await (const chunk of stream) {\n if (bufferSize + chunk.length > chunkSize && bufferSize > 0) {\n const data = Buffer.concat(buffers).toString('base64');\n await browser.pushFile(`${tmpDir}/${slug}-${String(i).padStart(6, '0')}.tar`, data);\n i++;\n buffers = [];\n bufferSize = 0;\n }\n buffers.push(chunk);\n bufferSize += chunk.length;\n }\n const data = Buffer.concat(buffers).toString('base64');\n await browser.pushFile(`${tmpDir}/${slug}-${String(i).padStart(6, '0')}.tar`, data);\n\n // extract the tar. `mobile: shell` does NOT escape arguments despite taking an argument array.\n await browser.execute(\"mobile: shell\", {command: \"sh\", args: [\"-c\", quote(`\n mkdir -p ${quote(dest)};\n cat ${tmpDir}/${slug}-*.tar | tar -xz -C ${quote(dest)};\n rm ${tmpDir}/${slug}-*.tar;\n `)]});\n}\n\nexport async function appiumDownloadFile(browser: WebdriverIO.Browser, src: string, dest: string) {\n src = path.posix.normalize(src);\n dest = path.resolve(dest);\n const content = Buffer.from(await browser.pullFile(src), \"base64\");\n await fsAsync.writeFile(dest, content);\n}\n\n/** Lists all files under a folder. Returns full paths. */\nexport async function appiumReaddir(browser: WebdriverIO.Browser, dir: string) {\n // list all files, one per line, no escaping\n const stdout: string = await browser.execute(\"mobile: shell\", {command: \"ls\", args: [\"-NA1\", dir]});\n return stdout.split(\"\\n\").filter(f => f).map(f => path.join(dir, f)).sort();\n}\n\nexport async function appiumExists(browser: WebdriverIO.Browser, file: string) {\n const stdout: string = await browser.execute(\"mobile: shell\", {command: \"sh\", args: [\"-c\",\n quote(`[ -e ${quote(file)} ] && echo \"true\" || echo \"false\"`)],\n });\n return stdout.trim() == \"true\" ? true : false;\n}\n\n/**\n * Reload/replace the page and then wait for the current page to unloaded. Does NOT wait for the new page to be ready.\n * Example:\n * ```ts\n * await navigateAndWait(browser, () => location.reload());\n * ```\n */\nexport async function navigateAndWait(browser: WebdriverIO.Browser, func: () => void) {\n await browser.execute(() => { (window as any)._waitingForNavigation = true });\n await browser.execute(func);\n await browser.waitUntil(() => browser.execute(() => !('_waitingForNavigation' in window)));\n}\n\n/** SHA256 hash */\nexport async function hash(content: string|ArrayBufferLike) {\n return crypto.createHash(\"SHA256\")\n .update(typeof content == \"string\" ? content : new Uint8Array(content))\n .digest(\"hex\");\n}\n\n/** Replicate obsidian.normalizePath */\nexport function normalizePath(p: string) {\n p = p.replace(/([\\\\/])+/g, \"/\").replace(/(^\\/+|\\/+$)/g, \"\");\n if (p == \"\") {\n p = \"/\"\n }\n p = p.replace(/\\u00A0|\\u202F/g, \" \"); // replace special space characters\n p = p.normalize(\"NFC\");\n return p;\n}\n\n/**\n * Returns true if child is under parent. returns false if parent == child or child is outside of parent.\n */\nexport function pathIsUnder(parent: string, child: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel != '' && rel.split(path.sep)[0] != \"..\" && !path.isAbsolute(rel)\n}\n\n\n/** Returns true if a vault file path is hidden (either it or one of it's parent directories starts with \".\") */\nexport function isHidden(file: string) {\n return file.split(\"/\").some(p => p.startsWith(\".\"))\n}\n\n/** Returns true if this is a simple text file */\nexport function isText(file: string) {\n return [\".md\", \".json\", \".txt\", \".js\"].includes(path.extname(file).toLocaleLowerCase());\n}\n\n\nexport async function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n\nexport type RetryOpts = {\n retries?: number,\n backoff?: number,\n retryIf?: (error: any) => boolean,\n};\n/** Retries func on error */\nexport async function retry<T>(func: (attempt: number) => Promise<T>|T, opts: RetryOpts = {}): Promise<T> {\n const { retries = 4, backoff = 1000, retryIf = () => true } = opts;\n let attempt = 0;\n let error: any;\n\n while (attempt <= retries) {\n try {\n return await func(attempt);\n } catch (e: any) {\n error = e;\n }\n const delay = backoff*Math.random() + backoff*Math.pow(2, attempt);\n if (!retryIf(error) || attempt >= retries) {\n throw error; // throw without sleeping\n }\n await sleep(delay);\n attempt += 1;\n }\n throw error; // unreachable\n}\n","import { remote } from 'webdriverio'\nimport type { Capabilities, Options } from '@wdio/types'\nimport { ObsidianLauncherService, ObsidianWorkerService } from \"./service.js\"\nimport { ObsidianServiceOptions } from \"./types.js\"\n\n/**\n * Starts an Obsidian instance for WDIO standalone mode.\n * \n * For testing, you'll usually want to use the WDIO testrunner with Mocha, wdio.conf.mts, etc. to launch WDIO. However\n * if you want to use WDIO for some kind of scripting scenario, you can use this function to launch a WDIO standalone\n * session connected to Obsidian.\n * \n * See also: https://webdriver.io/docs/setuptypes/#standalone-mode\n * \n * Example:\n * ```ts\n * const browser = await startWdioSession({\n * capabilities: {\n * browserName: \"obsidian\",\n * browserVersion: \"latest\",\n * 'wdio:obsidianOptions': {\n * installerVersion: \"latest\",\n * vault: \"./test/vaults/basic\",\n * },\n * },\n * });\n * await browser.executeObsidian(({app}) => {\n * // extract some file metadata, edit the vault, etc...\n * });\n * await browser.deleteSession();\n * ```\n * \n * Note that in standalone mode, the global `obsidianPage` instance won't work, you have to use\n * {@link ObsidianBrowserCommands.getObsidianPage | getObsidianPage} to get the page object, e.g.:\n * ```js\n * const obsidianPage = browser.getObsidianPage()\n * ```\n * instead of the \n * @category WDIO Helpers\n */\nexport async function startWdioSession(\n params: Capabilities.WebdriverIOConfig,\n serviceOptions?: ObsidianServiceOptions,\n): Promise<WebdriverIO.Browser> {\n serviceOptions = serviceOptions ?? {};\n const capabilities = params.capabilities as WebdriverIO.Capabilities;\n const testRunnerOptions: Options.Testrunner = {\n cacheDir: params.cacheDir,\n };\n const launcherService = new ObsidianLauncherService(\n serviceOptions,\n [capabilities] as WebdriverIO.Capabilities,\n testRunnerOptions,\n );\n const workerService = new ObsidianWorkerService(serviceOptions, capabilities, testRunnerOptions);\n\n await launcherService.onPrepare(testRunnerOptions, [capabilities]);\n await workerService.beforeSession(testRunnerOptions, capabilities);\n\n const browser = await remote(params);\n\n await workerService.before(capabilities, [], browser);\n\n return browser;\n}\n"],"mappings":"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","names":["types","util","prefix","location","getLogger","originalFactory","parent","ObsidianLauncher","fs","fsAsync","path","crypto","matches","process","prefix","prefix","styles","chalk","styles","parent","safeRegexTest","regex","prefix","log","log2","resolve","fileURLToPath","path","fsAsync","crypto","fileURLToPath","_","browser","path","browser","data","parent","path","resolve","args","_","pluginId","themeName","path","workspacesPath","layout","file","strContent","binContent","parent","fileURLToPath","configDir","id","semver","_","log","path","fileURLToPath","crypto","fs","browser","fsAsync","isAppStorage","width","height","resolve","remote","browser","launcher","ObsidianLauncher"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_tsx@4.21.0_typescript@5.9.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/dist/types/tokens.js","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/types/types.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/dist/types/set-lookup.js","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/types/index.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/sets.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/util.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/tokenizer.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/sets-lookup.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/write-set-tokens.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/reconstruct.ts","../../../node_modules/.pnpm/ret@0.5.0/node_modules/ret/lib/index.ts","../../../node_modules/.pnpm/safe-regex2@5.1.1/node_modules/safe-regex2/index.js","../../../node_modules/.pnpm/loglevel@1.9.2/node_modules/loglevel/lib/loglevel.js","../../../node_modules/.pnpm/loglevel-plugin-prefix@0.8.4/node_modules/loglevel-plugin-prefix/lib/loglevel-plugin-prefix.js","../src/index.ts","../src/service.ts","../../../node_modules/.pnpm/@wdio+logger@9.18.0/node_modules/@wdio/logger/build/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.pnpm/strip-ansi@7.2.0/node_modules/strip-ansi/index.js","../../../node_modules/.pnpm/ansi-regex@6.2.2/node_modules/ansi-regex/index.js","../src/browserCommands.ts","../src/pageobjects/obsidianPage.ts","../src/types.ts","../src/pageobjects/basePage.ts","../../../node_modules/.pnpm/@wdio+globals@9.27.1_expect-webdriverio@5.6.5_webdriverio@9.27.1/node_modules/@wdio/globals/build/index.js","../src/utils.ts","../src/standalone.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=tokens.js.map",null,"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=set-lookup.js.map",null,null,null,null,null,null,null,null,"'use strict'\n\nconst parse = require('ret')\nconst { types } = require('ret')\n\n/**\n * @param {*} node\n * @param {object} opts\n * @param {number} opts.reps - The number of repetitions encountered\n * @param {number} opts.limit - The maximum number of repetitions allowed\n * @param {number} starHeight - The current height of the star in the regex tree\n * @returns {boolean}\n */\nfunction walk (node, opts, starHeight) {\n let i\n let ok\n let len\n\n if (node.type === types.REPETITION) {\n starHeight++\n opts.reps++\n if (starHeight > 1) return false\n if (opts.reps > opts.limit) return false\n }\n\n const options = node.options || node.value?.options\n if (options) {\n for (i = 0, len = options.length; i < len; i++) {\n ok = walk({ stack: options[i] }, opts, starHeight)\n if (!ok) return false\n }\n }\n const stack = node.stack || node.value?.stack\n if (!stack) return true\n\n for (i = 0, len = stack.length; i < len; i++) {\n ok = walk(stack[i], opts, starHeight)\n if (!ok) return false\n }\n\n return true\n}\n\n/**\n * @param {string|RegExp} re - The regular expression to check, can be a string or RegExp object\n * @param {object} [options]\n * @param {number} [options.limit=25] - The maximum number of repetitions allowed\n * @returns {boolean} - Returns true if the regex is safe, false if it is unsafe or invalid\n */\nfunction safeRegex (re, options) {\n const opts = {\n reps: 0,\n limit: options?.limit ?? 25\n }\n\n if (isRegExp(re)) re = re.source\n else if (typeof re !== 'string') re = String(re)\n\n try {\n return walk(parse(re), opts, 0)\n } catch {\n return false\n }\n}\n\n/**\n * @param {*} x\n * @returns {x is RegExp}\n */\nfunction isRegExp (x) {\n return Object.prototype.toString.call(x) === '[object RegExp]'\n}\n\nmodule.exports = safeRegex\nmodule.exports.default = safeRegex\nmodule.exports.safeRegex = safeRegex\n","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory();\n } else {\n root.prefix = factory(root);\n }\n}(this, function (root) {\n 'use strict';\n\n var merge = function (target) {\n var i = 1;\n var length = arguments.length;\n var key;\n for (; i < length; i++) {\n for (key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n target[key] = arguments[i][key];\n }\n }\n }\n return target;\n };\n\n var defaults = {\n template: '[%t] %l:',\n levelFormatter: function (level) {\n return level.toUpperCase();\n },\n nameFormatter: function (name) {\n return name || 'root';\n },\n timestampFormatter: function (date) {\n return date.toTimeString().replace(/.*(\\d{2}:\\d{2}:\\d{2}).*/, '$1');\n },\n format: undefined\n };\n\n var loglevel;\n var configs = {};\n\n var reg = function (rootLogger) {\n if (!rootLogger || !rootLogger.getLogger) {\n throw new TypeError('Argument is not a root logger');\n }\n loglevel = rootLogger;\n };\n\n var apply = function (logger, config) {\n if (!logger || !logger.setLevel) {\n throw new TypeError('Argument is not a logger');\n }\n\n /* eslint-disable vars-on-top */\n var originalFactory = logger.methodFactory;\n var name = logger.name || '';\n var parent = configs[name] || configs[''] || defaults;\n /* eslint-enable vars-on-top */\n\n function methodFactory(methodName, logLevel, loggerName) {\n var originalMethod = originalFactory(methodName, logLevel, loggerName);\n var options = configs[loggerName] || configs[''];\n\n var hasTimestamp = options.template.indexOf('%t') !== -1;\n var hasLevel = options.template.indexOf('%l') !== -1;\n var hasName = options.template.indexOf('%n') !== -1;\n\n return function () {\n var content = '';\n\n var length = arguments.length;\n var args = Array(length);\n var key = 0;\n for (; key < length; key++) {\n args[key] = arguments[key];\n }\n\n // skip the root method for child loggers to prevent duplicate logic\n if (name || !configs[loggerName]) {\n /* eslint-disable vars-on-top */\n var timestamp = options.timestampFormatter(new Date());\n var level = options.levelFormatter(methodName);\n var lname = options.nameFormatter(loggerName);\n /* eslint-enable vars-on-top */\n\n if (options.format) {\n content += options.format(level, lname, timestamp);\n } else {\n content += options.template;\n if (hasTimestamp) {\n content = content.replace(/%t/, timestamp);\n }\n if (hasLevel) content = content.replace(/%l/, level);\n if (hasName) content = content.replace(/%n/, lname);\n }\n\n if (args.length && typeof args[0] === 'string') {\n // concat prefix with first argument to support string substitutions\n args[0] = content + ' ' + args[0];\n } else {\n args.unshift(content);\n }\n }\n\n originalMethod.apply(undefined, args);\n };\n }\n\n if (!configs[name]) {\n logger.methodFactory = methodFactory;\n }\n\n // for remove inherited format option if template option preset\n config = config || {};\n if (config.template) config.format = undefined;\n\n configs[name] = merge({}, parent, config);\n\n logger.setLevel(logger.getLevel());\n\n if (!loglevel) {\n logger.warn(\n 'It is necessary to call the function reg() of loglevel-plugin-prefix before calling apply. From the next release, it will throw an error. See more: https://github.com/kutuluk/loglevel-plugin-prefix/blob/master/README.md'\n );\n }\n\n return logger;\n };\n\n var api = {\n reg: reg,\n apply: apply\n };\n\n var save;\n\n if (root) {\n save = root.prefix;\n api.noConflict = function () {\n if (root.prefix === api) {\n root.prefix = save;\n }\n return api;\n };\n }\n\n return api;\n}));\n","/**\n * @module\n * @document ../README.md\n * @categoryDescription Options\n * Capability and service options.\n * @categoryDescription WDIO Helpers\n * Helpers for use in wdio.conf.mts, or for launching WDIO in standalone mode.\n * @categoryDescription Utilities\n * Browser commands and helper functions for writing tests.\n */\nimport ObsidianLauncher from \"obsidian-launcher\";\nimport { deprecate } from \"util\";\n\nimport { ObsidianLauncherService, ObsidianWorkerService } from \"./service.js\";\n/** @hidden */\nexport default ObsidianWorkerService;\n/** @hidden */\nexport const launcher = ObsidianLauncherService;\n\nexport type { ObsidianCapabilityOptions, ObsidianServiceOptions } from \"./types.js\";\nexport type { ObsidianBrowserCommands, ExecuteObsidianArg, InstalledPlugins } from \"./browserCommands.js\";\nexport { default as obsidianPage } from \"./pageobjects/obsidianPage.js\";\nexport type { ObsidianPage, Platform } from \"./pageobjects/obsidianPage.js\";\nexport type { PluginEntry, ThemeEntry } from \"obsidian-launcher\";\n\nexport { minSupportedObsidianVersion } from \"./service.js\";\nexport { startWdioSession } from \"./standalone.js\";\n\n// Some convenience helpers for use in wdio.conf.mts\n\n/**\n * Returns true if there is a current Obsidian beta and we have the credentials to download it, or its already in cache.\n * @category WDIO Helpers\n * @param opts.cacheDir Obsidian cache dir, defaults to `.obsidian-cache`.\n */\nexport async function obsidianBetaAvailable(opts: string|{cacheDir?: string} = {}) {\n opts = typeof opts == \"string\" ? {cacheDir: opts} : opts;\n const launcher = new ObsidianLauncher(opts);\n const versionInfo = await launcher.getVersionInfo(\"latest-beta\");\n return versionInfo.isBeta && await launcher.isAvailable(versionInfo.version);\n}\n\n/**\n * Resolves Obsidian app and installer version strings to absolute versions.\n * \n * @category WDIO Helpers\n * @deprecated Use parseObsidianVersions instead\n */\nexport const resolveObsidianVersions = deprecate(async function(\n appVersion: string, installerVersion: string, cacheDir?: string,\n): Promise<[string, string]> {\n const launcher = new ObsidianLauncher({cacheDir: cacheDir});\n return await launcher.resolveVersion(appVersion, installerVersion);\n}, 'resolveObsidianVersions is deprecated, use parseObsidianVersions instead');\n\n\n/**\n * Parses a string of Obsidian versions into [appVersion, installerVersion] tuples. This is a convenience helper for use\n * in `wdio.conf.mts`\n * \n * `versions` should be a space separated list of Obsidian app versions. You can optionally specify the installer\n * version by using \"appVersion/installerVersion\" e.g. `\"1.7.7/1.8.10\"`.\n * \n * Example: \n * ```js\n * parseObsidianVersions(\"1.8.10/1.7.7 latest latest-beta/earliest\")\n * ```\n * \n * See also: [Obsidian App vs Installer Versions](../README.md#obsidian-app-vs-installer-versions)\n * \n * @category WDIO Helpers\n * @param versions string to parse\n * @param opts.cacheDir Obsidian cache dir, defaults to `.obsidian-cache`.\n * @returns [appVersion, installerVersion][] resolved to specific versions.\n */\nexport async function parseObsidianVersions(\n versions: string,\n opts: {cacheDir?: string} = {},\n): Promise<[string, string][]> {\n const launcher = new ObsidianLauncher({cacheDir: opts.cacheDir});\n return launcher.parseVersions(versions);\n}\n","import fs from \"fs\"\nimport fsAsync from \"fs/promises\"\nimport path from \"path\"\nimport crypto from \"crypto\"\nimport { SevereServiceError } from 'webdriverio'\nimport type { Capabilities, Options, Services } from '@wdio/types'\nimport logger from '@wdio/logger'\nimport { fileURLToPath, pathToFileURL } from \"url\"\nimport ObsidianLauncher, {\n PluginEntry, ThemeEntry, DownloadedPluginEntry, DownloadedThemeEntry,\n} from \"obsidian-launcher\"\nimport { browserCommands } from \"./browserCommands.js\"\nimport {\n ObsidianServiceOptions, NormalizedObsidianCapabilityOptions, OBSIDIAN_CAPABILITY_KEY,\n} from \"./types.js\"\nimport {\n isAppium, appiumUploadFiles, appiumDownloadFile, appiumExists, appiumReaddir, getAppiumOptions, fileExists,\n navigateAndWait, retry, pathIsUnder,\n} from \"./utils.js\";\nimport semver from \"semver\"\nimport _ from \"lodash\"\n\n\nconst log = logger(\"wdio-obsidian-service\");\n\nfunction getDefaultCacheDir(rootDir: string) {\n return path.resolve(rootDir, process.env.WEBDRIVER_CACHE_DIR ?? process.env.OBSIDIAN_CACHE ?? \"./.obsidian-cache\");\n}\n\n/** By default wdio continues on service errors, so we throw a SevereServiceError to make it bail on error */\nfunction getServiceErrorMessage(e: any) {\n return (\n `Failed to download and setup Obsidian. Caused by:\\n` +\n `${e.stack}\\n`+\n ` ------The above causes:-----`\n );\n}\n\nfunction resolveEntry(rootDir: string, entry: PluginEntry|ThemeEntry): PluginEntry|ThemeEntry {\n if (typeof entry == \"string\") {\n return path.resolve(rootDir, entry);\n } else if ('path' in entry) {\n return {...entry, path: path.resolve(rootDir, entry.path)};\n } else {\n return entry;\n }\n}\n\n/** Returns a plugin list with only the selected plugin ids enabled. */\nfunction selectPlugins(currentPlugins: DownloadedPluginEntry[], selection?: string[]): DownloadedPluginEntry[] {\n if (selection !== undefined) {\n const unknownPlugins = _.difference(selection, currentPlugins.map(p => p.id));\n if (unknownPlugins.length > 0) {\n throw Error(`Unknown plugin ids: ${unknownPlugins.join(', ')}`)\n }\n return currentPlugins.map(p => ({\n ...p,\n enabled: selection.includes(p.id) || p.id == \"wdio-obsidian-service-plugin\",\n }));\n } else {\n return currentPlugins;\n }\n}\n\n/** Returns a theme list with only the selected theme enabled. */\nfunction selectThemes(currentThemes: DownloadedThemeEntry[], selection?: string): DownloadedThemeEntry[] {\n if (selection !== undefined) {\n if (selection != \"default\" && currentThemes.every(t => t.name != selection)) {\n throw Error(`Unknown theme: ${selection}`);\n }\n return currentThemes.map(t => ({...t, enabled: selection != 'default' && t.name === selection}));\n } else {\n return currentThemes;\n }\n}\n\nfunction getNormalizedObsidianOptions(cap: WebdriverIO.Capabilities): NormalizedObsidianCapabilityOptions {\n return cap[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n}\n\n\n/**\n * Minimum Obsidian version that wdio-obsidian-service supports.\n * @category WDIO Helpers\n */\nexport const minSupportedObsidianVersion: string = \"1.0.3\"\n\n/**\n * We used to put vaults on \"Device Storage\" by default. However, there's some weird issues with the emulated storage\n * that can cause writes to intermittently fail silently. (See https://forum.obsidian.md/t/102935). This causes a bunch\n * of intermittent issues when writing files, and when uploading the vault.\n * \n * So now we are defaulting to \"App Storage\" mode which, even though its still under the emulated storage uses a\n * different filesystem api and avoids the issue.\n */\nconst ANDROID_APP_STORAGE_DIR = \"/storage/emulated/0/Android/data/md.obsidian/files\"\nconst ANDROID_DEFAULT_DEVICE_STORAGE_DIR = \"/storage/emulated/0/Documents/wdio-obsidian-service-vaults\"\n\nconst OBSIDIAN_HANG_ERROR = Symbol(\"hang\");\n\n\n/**\n * wdio launcher service.\n * Use in wdio.conf.mts like so:\n * ```ts\n * services: ['obsidian'],\n * ```\n * @hidden\n */\nexport class ObsidianLauncherService implements Services.ServiceInstance {\n private obsidianLauncher: ObsidianLauncher\n private readonly helperPluginPath: string\n private readonly rootDir: string\n\n constructor (\n public options: ObsidianServiceOptions,\n public capabilities: WebdriverIO.Capabilities,\n public config: Options.Testrunner\n ) {\n this.rootDir = config.rootDir || process.cwd();\n this.obsidianLauncher = new ObsidianLauncher({\n cacheDir: config.cacheDir ?? getDefaultCacheDir(this.rootDir),\n versionsUrl: options.versionsUrl,\n communityPluginsUrl: options.communityPluginsUrl, communityThemesUrl: options.communityThemesUrl,\n });\n this.helperPluginPath = path.resolve(fileURLToPath(import.meta.url), '../../helper-plugin');\n }\n\n /**\n * Validates wdio:obsidianOptions and downloads Obsidian, plugins, and themes.\n */\n async onPrepare(config: Options.Testrunner, capabilities: Capabilities.TestrunnerCapabilities) {\n try {\n // Create an ID that is unique per test run, but the same between sessions.\n const runId = crypto.randomBytes(10).toString(\"base64url\").replace(/[-_]/g, '0');\n\n if (!Array.isArray(capabilities)) {\n capabilities = Object.values(capabilities).map(\n (multiremoteOption) => (multiremoteOption as Capabilities.WithRequestedCapabilities).capabilities,\n );\n }\n\n const obsidianCapabilities = capabilities.flatMap((cap) => {\n if ((\"browserName\" in cap) && cap.browserName === \"obsidian\") {\n return [cap as WebdriverIO.Capabilities];\n } else {\n return [];\n }\n });\n\n for (const cap of obsidianCapabilities) {\n const obsidianOptions = cap[OBSIDIAN_CAPABILITY_KEY] ?? {};\n \n // check vault\n const vault = obsidianOptions.vault ? path.resolve(this.rootDir, obsidianOptions.vault) : undefined;\n if (vault && !fs.existsSync(vault)) {\n throw Error(`Vault \"${vault}\" doesn't exist`)\n }\n \n // download plugins and themes to cache\n const plugins = await this.obsidianLauncher.downloadPlugins(\n (obsidianOptions.plugins ?? [])\n .concat([this.helperPluginPath]) // Always install the helper plugin\n .map(p => resolveEntry(this.rootDir, p) as PluginEntry)\n );\n\n const themes = await this.obsidianLauncher.downloadThemes(\n (obsidianOptions.themes ?? [])\n .map(t => resolveEntry(this.rootDir, t) as ThemeEntry),\n );\n\n let appVersion = cap.browserVersion ?? cap[OBSIDIAN_CAPABILITY_KEY]?.appVersion ?? \"latest\";\n appVersion = (await this.obsidianLauncher.getVersionInfo(appVersion)).version;\n if (semver.lt(appVersion, minSupportedObsidianVersion)) {\n throw Error(`Minimum supported Obsidian version is ${minSupportedObsidianVersion}`)\n }\n\n if (isAppium(cap)) {\n let apk = getAppiumOptions(cap).app;\n if (!apk) {\n apk = await this.obsidianLauncher.downloadAndroid(appVersion);\n }\n let chromedriverDir = getAppiumOptions(cap).chromedriverExecutableDir;\n if (!chromedriverDir) {\n chromedriverDir = path.join(this.obsidianLauncher.cacheDir, 'appium-chromedriver');\n }\n\n let androidVaultStorage = obsidianOptions.androidVaultStorage;\n if (!androidVaultStorage) {\n // App storage was introduced in 1.8.10\n androidVaultStorage = semver.lt(appVersion, \"1.8.10\") ? \"device-storage\" : \"app-storage\";\n }\n if (androidVaultStorage == \"device-storage\") {\n androidVaultStorage = ANDROID_DEFAULT_DEVICE_STORAGE_DIR;\n } else if (androidVaultStorage != \"app-storage\" && !androidVaultStorage.startsWith(\"/\")) {\n throw Error(`androidVaultStorage must be \"app-storage\", \"device-storage\", or an absolute path on the Android device.`)\n }\n\n const normalizedObsidianOptions: NormalizedObsidianCapabilityOptions = {\n ...obsidianOptions,\n plugins, themes, vault: vault,\n copy: obsidianOptions.copy ?? true,\n appVersion, installerVersion: appVersion,\n emulateMobile: false,\n testRunId: runId,\n androidVaultStorage,\n }\n cap[OBSIDIAN_CAPABILITY_KEY] = normalizedObsidianOptions;\n cap['appium:app'] = apk;\n cap['appium:chromedriverExecutableDir'] = chromedriverDir;\n cap[\"wdio:enforceWebDriverClassic\"] = true; // BiDi doesn't seem to work on Obsidian mobile\n // appium-service expects these to not be set\n delete cap.browserName;\n delete cap.browserVersion;\n if (!getAppiumOptions(cap)['noReset']) {\n log.warn(\"Note: For best performance set noReset to true, wdio-obsidian-service will handle resetting Obsidian between tests.\")\n }\n } else {\n const [, installerVersion] = await this.obsidianLauncher.resolveVersion(\n appVersion, obsidianOptions.installerVersion ?? \"earliest\",\n );\n const installerInfo = await this.obsidianLauncher.getInstallerInfo(installerVersion);\n\n let installerPath: string;\n if (obsidianOptions.binaryPath) {\n installerPath = path.resolve(this.rootDir, obsidianOptions.binaryPath)\n } else {\n installerPath = await this.obsidianLauncher.downloadInstaller(installerVersion);\n }\n let appPath: string;\n if (obsidianOptions.appPath) {\n appPath = path.resolve(this.rootDir, obsidianOptions.appPath)\n } else {\n appPath = await this.obsidianLauncher.downloadApp(appVersion);\n }\n let chromedriverPath = cap['wdio:chromedriverOptions']?.binary;\n // wdio can't download chromedriver for versions less than 115 automatically. Fetching it ourselves is\n // also a bit faster as it skips the chromedriver version detection step.\n if (!chromedriverPath) {\n chromedriverPath = await this.obsidianLauncher.downloadChromedriver(installerVersion);\n }\n\n const normalizedObsidianOptions: NormalizedObsidianCapabilityOptions = {\n ...obsidianOptions,\n plugins, themes, vault,\n copy: obsidianOptions.copy ?? true,\n binaryPath: installerPath, appPath: appPath,\n appVersion, installerVersion,\n emulateMobile: obsidianOptions.emulateMobile ?? false,\n testRunId: runId,\n }\n\n cap.browserName = \"chrome\";\n cap.browserVersion = installerInfo.chrome;\n cap[OBSIDIAN_CAPABILITY_KEY] = normalizedObsidianOptions;\n cap['goog:chromeOptions'] = {\n binary: installerPath,\n windowTypes: [\"app\", \"webview\"],\n ...cap['goog:chromeOptions'],\n args: [\n // Workaround for SUID issue on linux. See https://github.com/electron/electron/issues/42510\n ...(process.platform == 'linux' ? [\"--no-sandbox\"] : []),\n ...(cap['goog:chromeOptions']?.args ?? [])\n ],\n }\n cap['wdio:chromedriverOptions'] = {\n // allowedIps is not included in the types, but gets passed as --allowed-ips to chromedriver.\n // It defaults to [\"0.0.0.0\"] which makes Windows Firewall complain, and we don't need remote\n // connections anyways.\n allowedIps: [],\n ...cap['wdio:chromedriverOptions'],\n binary: chromedriverPath,\n } as WebdriverIO.ChromedriverOptions;\n cap[\"wdio:enforceWebDriverClassic\"] = true; // electron doesn't support BiDi yet.\n }\n }\n\n // show a warning if doing parallel tests on no copy vaults\n const dupNoCopyVaults = _(obsidianCapabilities)\n .map(cap => cap[OBSIDIAN_CAPABILITY_KEY])\n .filter(cap => !!cap && cap.copy === false && !!cap.vault)\n .map(cap => cap!.vault!)\n .countBy(v => v)\n .pickBy(count => count >= 2)\n .keys()\n .sort()\n .value()\n if (config.maxInstances !== 1 && dupNoCopyVaults.length > 0) {\n log.warn(\n `Multiple capabilities share the same vault with \\`copy: false\\`. This means parallel tests will run ` +\n `on the same directory which can cause errors. Either set \\`copy: true\\` or set \\`maxInstances: 1\\`. ` +\n `Affected vaults: ${dupNoCopyVaults.join(', ')}`\n )\n }\n } catch (e: any) {\n throw new SevereServiceError(getServiceErrorMessage(e));\n }\n }\n}\n\n\n/**\n * wdio worker service.\n * Use in wdio.conf.mts like so:\n * ```ts\n * services: ['obsidian'],\n * ```\n * @hidden\n */\nexport class ObsidianWorkerService implements Services.ServiceInstance {\n private obsidianLauncher: ObsidianLauncher\n private browser: WebdriverIO.Browser|undefined;\n /** Directories to clean up after the tests */\n private tmpDirs: string[]\n\n constructor (\n public options: ObsidianServiceOptions,\n public capabilities: WebdriverIO.Capabilities,\n public config: Options.Testrunner\n ) {\n this.obsidianLauncher = new ObsidianLauncher({\n cacheDir: config.cacheDir ?? getDefaultCacheDir(config.rootDir || process.cwd()),\n versionsUrl: options.versionsUrl,\n communityPluginsUrl: options.communityPluginsUrl, communityThemesUrl: options.communityThemesUrl,\n });\n this.tmpDirs = [];\n }\n\n /**\n * Sets up the vault with plugins and themes installed, optionally copying it first.\n */\n private async setupVault(cap: WebdriverIO.Capabilities) {\n const obsidianOptions = getNormalizedObsidianOptions(cap);\n let openVault: string|undefined;\n if (obsidianOptions.vault != undefined) {\n const shouldCopy = obsidianOptions.copy;\n log.info(`Opening vault ${obsidianOptions.vault}${obsidianOptions.copy ? ' (copy)' : ' (in-place)'}`);\n openVault = await this.obsidianLauncher.setupVault({\n vault: obsidianOptions.vault,\n copy: shouldCopy,\n plugins: obsidianOptions.plugins,\n themes: obsidianOptions.themes,\n });\n if (shouldCopy) {\n this.tmpDirs.push(openVault);\n }\n } else {\n log.info(`Opening Obsidian without a vault`)\n }\n obsidianOptions.openVault = openVault; // for use in getVaultPath() and the other service hooks\n }\n\n /**\n * Sets up the --user-data-dir for the Electron app. Sets the obsidian.json in the dir to open the vault on boot.\n */\n private async electronSetupConfigDir(cap: WebdriverIO.Capabilities) {\n const obsidianOptions = getNormalizedObsidianOptions(cap);\n const configDir = await this.obsidianLauncher.setupConfigDir({\n appVersion: obsidianOptions.appVersion, installerVersion: obsidianOptions.installerVersion,\n appPath: obsidianOptions.appPath,\n vault: obsidianOptions.openVault,\n // `app.emulateMobile` just sets this localStorage variable. Setting it ourselves here instead of calling\n // the function simplifies the boot/plugin load sequence and makes sure plugins load in mobile mode.\n localStorage: obsidianOptions.emulateMobile ? {\"EmulateMobile\": \"1\"} : {},\n });\n this.tmpDirs.push(configDir);\n\n cap['goog:chromeOptions'] = {\n ...cap['goog:chromeOptions'],\n args: [\n `--user-data-dir=${configDir}`,\n ...(cap['goog:chromeOptions']?.args ?? []).filter(arg => {\n const match = arg.match(/^--user-data-dir=(.*)$/);\n return !match || !this.tmpDirs.includes(match[1]);\n })\n ]\n }\n }\n\n /**\n * Transfers src to dest. src may be a file or a directory.\n * Handles making sure the permissions under Obsidian app storage are correct.\n */\n private async appiumUpload(src: string, dest: string) {\n const browser = this.browser!;\n const isDirectory = (await fsAsync.stat(src)).isDirectory();\n const isAppStorage = pathIsUnder(ANDROID_APP_STORAGE_DIR, dest);\n\n if (isAppStorage) {\n // Even with root and run-as, I can't seem to get the permissions for app storage to work out directly via\n // shell commands. And the Android Emulator won't always have root depending on how it was set up. So I use\n // the Capacitor API to copy it directly from Obsidian.\n const tmp = `/storage/emulated/0/Documents/tmp-${crypto.randomBytes(10).toString(\"base64url\").replace(/[-_]/g, '0')}`\n if (isDirectory) {\n await appiumUploadFiles(browser, {src, dest: tmp});\n } else {\n await browser.pushFile(tmp, (await fsAsync.readFile(src)).toString('base64'));\n }\n await browser.execute(async (from, to) => {\n const Filesystem = (window as any).Capacitor.Plugins.Filesystem;\n await Filesystem.copy({ from, to });\n }, pathToFileURL(tmp).toString(), pathToFileURL(dest).toString());\n await browser.execute(\"mobile: shell\", {command: \"rm\", args: [\"-rf\", tmp]});\n } else {\n if (isDirectory) {\n await appiumUploadFiles(browser, {src, dest});\n } else {\n await browser.pushFile(dest, (await fsAsync.readFile(src)).toString('base64'));\n }\n }\n }\n\n /**\n * Sets up the Obsidian app. Installs and launches it if needed, and sets permissions and contexts. Opens the vault\n * switcher page.\n * \n * You can configure Appium to install and launch the app for you. However, if you do that it reboots the app after\n * every session/spec which is really slow. So we are handling the app setup manually here.\n */\n private async appiumSetupApp() {\n const browser = this.browser!;\n const appiumOptions = getAppiumOptions(browser.requestedCapabilities);\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n const appId = \"md.obsidian\";\n\n // install/reinstall Obsidian if needed\n const dumpsys: string = await browser.execute(\"mobile: shell\", {command: \"dumpsys\", args: [\"package\", appId]});\n const installedObsidianVersion = dumpsys.match(/versionName[=:](.*)$/m)?.[1]?.trim();\n if (installedObsidianVersion != obsidianOptions.appVersion) {\n await browser.execute('mobile: terminateApp', {appId}); // terminate app (if running)\n await browser.execute('mobile: removeApp', {appId, keepData: false}); // uninstall (if present)\n await browser.execute('mobile: installApp', {\n appPath: appiumOptions.app, // the APK\n timeout: appiumOptions.androidInstallTimeout, // respect appium configuration\n grantPermissions: true, // this and autoGrantPermissions don't seem to really work, see below\n });\n }\n\n // start app if needed\n const appState: number = await browser.execute(\"mobile: queryAppState\", {appId});\n if (appState < 4) { // 0: not installed, 1: not running, 3: running in background, 4: running in foreground\n await browser.execute(\"mobile: activateApp\", {appId});\n }\n\n // grant Obsidian the permissions it needs, mainly file access.\n // appium:autoGrantPermissions is supposed to automatically grant everything it needs, but I can't get it to\n // work. The \"mobile: changePermissions\" \"all\" option also doesn't seem to work here. I have to explicitly list\n // the permissions and use the \"appops\" target. See https://github.com/appium/appium/issues/19991\n // I'm calling \"mobile: changePermissions\" \"all\" as well just in case it is actually doing something\n await browser.execute(\"mobile: changePermissions\", {\n action: \"grant\",\n appPackage: appId,\n permissions: \"all\",\n });\n await browser.execute(\"mobile: changePermissions\", {\n action: \"allow\",\n appPackage: appId,\n permissions: [ // these are from apk AndroidManifest.xml (extracted with apktool)\n \"READ_EXTERNAL_STORAGE\", \"WRITE_EXTERNAL_STORAGE\", \"MANAGE_EXTERNAL_STORAGE\",\n ],\n target: \"appops\", // requires appium --allow-insecure adb_shell\n });\n\n // switch to the webview context\n const context = \"WEBVIEW_md.obsidian\";\n await browser.waitUntil(\n async () => (await browser.getContexts() as string[]).includes(context),\n {timeout: 30_000, interval: 100},\n );\n await browser.switchContext(context);\n\n // Clear app state\n await browser.execute(() => { // in case tests get interrupted during the `_capacitor_file_` bit\n if (window.location.href != \"http://localhost/\") {\n window.location.replace('http://localhost/');\n }\n })\n await this.appiumCloseVault(); // close vault and go to vault switcher (if vault is open)\n }\n\n /**\n * Uploads the vault to appium\n */\n private async appiumUploadVault() {\n const browser = this.browser!;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n const isAppStorage = (obsidianOptions.androidVaultStorage == 'app-storage');\n\n // create a path based on the openVault.\n // if copy: true, openVault path is randomized so the hash will also be unique\n // if copy: false, openVault is same as vault, so we'll reuse an already uploaded vault\n // We include the runId and if its a copy so we can know what to clean up at the end of the tests. We want to\n // make sure that nocopy vaults are still uploaded ONCE at the beginning of tests, even if the last test didn't\n // clean up androidVaultStorage properly.\n const runId = obsidianOptions.testRunId;\n const pathHash = crypto.createHash(\"SHA256\").update(obsidianOptions.openVault!).digest(\"base64url\").replace(/[-_]/g, '0').slice(0, 8);\n const basename = path.basename(obsidianOptions.vault!);\n const androidVaultName = `${basename}-${pathHash}-${runId}-wdio-${obsidianOptions.copy ? 'copy' : 'nocopy'}`;\n const androidVaultPath = `${isAppStorage ? ANDROID_APP_STORAGE_DIR : obsidianOptions.androidVaultStorage}/${androidVaultName}`;\n obsidianOptions.androidVault = androidVaultPath;\n\n // transfer the vault to the device\n if (!(await appiumExists(browser, obsidianOptions.androidVault))) {\n await this.appiumUpload(obsidianOptions.openVault!, obsidianOptions.androidVault);\n }\n }\n\n /**\n * Opens the vault in appium.\n * \n * clearAppState determines whether we wipe localStorage or not. (In desktop mode we create a entirely new\n * electron dir every time we open a new vault, in Android we need to use clearAppState to replicate that.)\n */\n private async appiumOpenVault(opts: {clearAppState: boolean}) {\n const browser = this.browser!;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n const isAppStorage = (obsidianOptions.androidVaultStorage == 'app-storage');\n\n // open vault by setting the localStorage keys and relaunching Obsidian\n // on appium restarting the app with appium:fullReset is *really* slow. And, unlike electron we can actually\n // switch vault with just a reload. So for Appium, instead of rebooting we manually wipe localStorage and use\n // reload to switch the vault.\n await browser.execute(async (androidVaultPath, isAppStorage, clearAppState) => {\n if (clearAppState) {\n localStorage.clear();\n }\n \n if (isAppStorage) { // appId on mobile app storage, vault id is just the vault name\n const androidVaultName = androidVaultPath.split(\"/\").at(-1)!;\n localStorage.setItem('mobile-external-vaults', JSON.stringify([]));\n localStorage.setItem('mobile-selected-vault', androidVaultName);\n localStorage.setItem(`enable-plugin-${androidVaultName}`, 'true');\n } else { // On device storage its the full path\n localStorage.setItem('mobile-external-vaults', JSON.stringify([androidVaultPath]));\n localStorage.setItem('mobile-selected-vault', androidVaultPath);\n localStorage.setItem(`enable-plugin-${androidVaultPath}`, 'true');\n }\n\n }, obsidianOptions.androidVault!, isAppStorage, opts.clearAppState);\n await navigateAndWait(browser, () => location.reload());\n }\n\n /**\n * Close any open vault and go back to the vault switcher\n */\n private async appiumCloseVault() {\n const browser = this.browser!;\n // skip if we're already on the vault switcher\n const isVaultOpen = await browser.execute(() => !!localStorage.getItem('mobile-selected-vault'));\n if (isVaultOpen) {\n await browser.execute(() => {\n localStorage.removeItem('mobile-external-vaults');\n localStorage.removeItem('mobile-selected-vault');\n });\n await navigateAndWait(browser, () => location.reload());\n }\n }\n\n /**\n * Waits for Obsidian to be ready, and does some other final setup.\n */\n private async prepareApp() {\n const browser = this.browser!;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n\n if (obsidianOptions.emulateMobile && obsidianOptions.vault != undefined) {\n // I don't think this is technically necessary, but when you set the window size via emulateMobile it sets\n // the window size in the browser view, but not the actual window size which looks weird and makes it hard\n // to manually debug a paused test. The normal ways to set window size don't work on Obsidian. Obsidian\n // doesn't respect the `--window-size` argument, and wdio setViewport and setWindowSize don't work without\n // BiDi. This resizes the window directly using electron APIs.\n await browser.waitUntil(\n () => browser.execute(() => !!(window as any).electron),\n {timeout: 10_000, interval: 100},\n );\n const [width, height] = await browser.execute(() => [window.innerWidth, window.innerHeight]);\n await browser.execute(async (width, height) => {\n await (window as any).electron.remote.getCurrentWindow().setSize(width, height);\n }, width, height);\n }\n\n // wait until app is loaded\n if (obsidianOptions.vault) {\n if (isAppium(browser.requestedCapabilities) && semver.gte(obsidianOptions.appVersion, '1.12.0')) {\n // Obsidian >= 1.12.0 has a bug on mobile startup that intermittently causes the app to get stuck during\n // boot in the emulator. Seems to be caused by changes to the Capacitor plugin load sequence and a race\n // condition with the Capacitor bridge. Not sure why it doesn't show up in real usage, probably just the\n // race condition only losing on the sluggish emulator. Only work around I've found is to just detect the\n // state and trigger a refresh.\n await retry(async (attempt) => {\n if (attempt > 0) {\n console.warn(\"Obsidian Android app stuck, relaunching...\");\n await navigateAndWait(browser, () => location.reload());\n }\n await browser.waitUntil(\n () => browser.execute(() => !!window.ready), // wait for enhance.js to be loaded\n {timeout: 60_000, interval: 100},\n );\n await browser.waitUntil( // if this fails to load soon after, we are in the hang state\n () => browser.execute(() => document.body?.classList.contains(\"is-mobile\")),\n {timeout: 2_000, interval: 100},\n ).catch(() => {\n throw OBSIDIAN_HANG_ERROR; // eslint-disable-line @typescript-eslint/only-throw-error\n });\n }, {\n retries: 2,\n backoff: 2000,\n retryIf: (error) => error === OBSIDIAN_HANG_ERROR,\n });\n }\n await browser.waitUntil( // wait until the helper plugin is loaded\n () => browser.execute(() => !!(window as any).wdioObsidianService),\n {\n timeout: isAppium(browser.requestedCapabilities) ? 120_000 : 60_000,\n interval: 100,\n },\n );\n await browser.executeObsidian(async ({app}) => {\n await new Promise<void>((resolve) => app.workspace.onLayoutReady(resolve));\n });\n } else {\n await browser.execute(async () => {\n if (document.readyState === \"loading\") {\n return new Promise<void>(resolve => document.addEventListener(\"DOMContentLoaded\", () => resolve()));\n }\n });\n }\n }\n\n private createReloadObsidian() {\n const service = this; // eslint-disable-line @typescript-eslint/no-this-alias\n const reloadObsidian: WebdriverIO.Browser['reloadObsidian'] = async function(\n this: WebdriverIO.Browser,\n {vault, copy = true, plugins, theme} = {},\n ) {\n const oldObsidianOptions = getNormalizedObsidianOptions(this.requestedCapabilities);\n const selectedPlugins = selectPlugins(oldObsidianOptions.plugins, plugins);\n const selectedThemes = selectThemes(oldObsidianOptions.themes, theme);\n if (!vault && oldObsidianOptions.openVault == undefined) {\n throw Error(`No vault is open, pass a vault path to reloadObsidian`);\n }\n const newObsidianOptions: NormalizedObsidianCapabilityOptions = {\n ...oldObsidianOptions,\n // Resolve relative to PWD instead of root dir during tests\n vault: vault ? path.resolve(vault) : oldObsidianOptions.vault,\n copy,\n plugins: selectedPlugins, themes: selectedThemes,\n };\n\n if (isAppium(this.requestedCapabilities)) {\n this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] = newObsidianOptions;\n if (vault) {\n await service.setupVault(this.requestedCapabilities);\n await service.appiumUploadVault();\n await service.appiumOpenVault({clearAppState: true});\n } else {\n // reload without resetting app state or triggering appium:fullReset\n await service.appiumCloseVault()\n\n // modify the vault files to setup plugins and themes\n const local = path.join(oldObsidianOptions.openVault!, \".obsidian\");\n const localCommunityPlugins = path.join(local, \"community-plugins.json\");\n const localAppearance = path.join(local, \"appearance.json\");\n const remote = `${oldObsidianOptions.androidVault!}/.obsidian`;\n const remoteCommunityPlugins = `${remote}/community-plugins.json`;\n const remoteAppearance = `${remote}/appearance.json`;\n\n await appiumDownloadFile(this, remoteCommunityPlugins, localCommunityPlugins).catch(() => {});\n await appiumDownloadFile(this, remoteAppearance, localAppearance).catch(() => {});\n await service.obsidianLauncher.setupVault({\n vault: oldObsidianOptions.openVault!, copy: false,\n plugins: selectedPlugins, themes: selectedThemes,\n });\n for (const [src, dest] of [[localCommunityPlugins, remoteCommunityPlugins], [localAppearance, remoteAppearance]]) {\n if (await fileExists(src)) {\n await service.appiumUpload(src, dest)\n }\n }\n await service.appiumOpenVault({clearAppState: false})\n }\n } else {\n // if browserName is set, reloadSession tries to restart the driver entirely, so unset those\n const newCap: WebdriverIO.Capabilities = _.cloneDeep(\n _.omit(this.requestedCapabilities, ['browserName', 'browserVersion'])\n );\n newCap[OBSIDIAN_CAPABILITY_KEY] = newObsidianOptions;\n\n if (vault) {\n await service.setupVault(newCap);\n await service.electronSetupConfigDir(newCap);\n await this.reloadSession(newCap);\n } else {\n // reload preserving current vault and config dir\n\n // Obsidian debounces saves to the config dir, and so changes to configuration made in the tests may\n // not get saved to disk before the reboot. I haven't found a better way to flush everything than\n // just waiting a bit.\n await this.pause(2000);\n\n await this.deleteSession({shutdownDriver: false});\n // while Obsidian is down, modify the vault files to setup plugins and themes\n await service.obsidianLauncher.setupVault({\n vault: oldObsidianOptions.openVault!, copy: false,\n plugins: selectedPlugins, themes: selectedThemes,\n });\n await this.reloadSession(newCap);\n }\n }\n await service.prepareApp();\n };\n return reloadObsidian;\n }\n\n /**\n * Runs before the session and browser have started.\n */\n async beforeSession(config: Options.Testrunner, cap: WebdriverIO.Capabilities) {\n // Workaround for https://github.com/webdriverio/webdriverio/issues/15265 on Node 26\n if (!config.transformRequest) {\n config.transformRequest = (requestOptions: RequestInit): RequestInit => {\n if (requestOptions.headers instanceof Headers) {\n requestOptions.headers.delete('Connection');\n requestOptions.headers.delete('Content-Length');\n }\n return requestOptions;\n }\n }\n\n try {\n if (!cap[OBSIDIAN_CAPABILITY_KEY]) return;\n if (cap[OBSIDIAN_CAPABILITY_KEY].vault != undefined) {\n await this.setupVault(cap);\n }\n if (!isAppium(cap)) {\n await this.electronSetupConfigDir(cap);\n }\n } catch (e: any) {\n throw new SevereServiceError(getServiceErrorMessage(e));\n }\n }\n\n /**\n * Runs after session and browser have started, but before tests.\n */\n async before(cap: WebdriverIO.Capabilities, specs: unknown, browser: WebdriverIO.Browser) {\n this.browser = browser;\n try {\n if (!cap[OBSIDIAN_CAPABILITY_KEY]) return;\n\n // You are supposed to add commands via the addCommand hook, however you can't add synchronous methods that\n // way. Also, addCommand completely breaks the stack traces of errors from the methods, while tacking on the\n // methods manually doesn't.\n const newBrowserCommands = {\n ...browserCommands,\n reloadObsidian: this.createReloadObsidian(),\n }\n for (const [name, cmd] of Object.entries(newBrowserCommands)) {\n (browser as any)[name] = cmd;\n }\n\n if (isAppium(browser.requestedCapabilities)) {\n await this.appiumSetupApp();\n if (cap[OBSIDIAN_CAPABILITY_KEY].vault) {\n await this.appiumUploadVault();\n await this.appiumOpenVault({clearAppState: true});\n }\n }\n await this.prepareApp();\n } catch (e: any) {\n throw new SevereServiceError(getServiceErrorMessage(e));\n }\n }\n\n /** Runs after tests are done, but before the session is shut down */\n async after(result: number, cap: WebdriverIO.Capabilities) {\n const browser = this.browser!;\n if (!cap[OBSIDIAN_CAPABILITY_KEY]) return;\n const obsidianOptions = getNormalizedObsidianOptions(browser.requestedCapabilities);\n\n if (isAppium(cap)) {\n await this.appiumCloseVault();\n\n const androidVaultsDir = obsidianOptions.androidVaultStorage == \"app-storage\" ? ANDROID_APP_STORAGE_DIR : obsidianOptions.androidVaultStorage!;\n for (const file of await appiumReaddir(browser, androidVaultsDir)) {\n const name = path.posix.basename(file);\n const isServiceManaged = name.match(/-wdio-(no)?copy$/);\n const isFromThisRun = name.includes(obsidianOptions.testRunId);\n const isCopy = name.match(/-copy$/)\n if (isServiceManaged && (!isFromThisRun || isCopy)) {\n await browser.execute(\"mobile: shell\", {command: \"rm\", args: [\"-rf\", file]});\n }\n }\n }\n }\n\n /**\n * Cleanup\n */\n async afterSession() {\n for (const tmpDir of this.tmpDirs) {\n await fsAsync.rm(tmpDir, { recursive: true, force: true });\n }\n }\n}\n","// src/utils.ts\nimport safeRegexTest from \"safe-regex2\";\nvar SENSITIVE_DATA_REPLACER = \"**MASKED**\";\nvar skipError = (aFunction) => {\n try {\n return aFunction();\n } catch {\n return void 0;\n }\n};\nvar parseMaskingPatterns = (maskingRegexString) => {\n if (typeof maskingRegexString !== \"string\") {\n return void 0;\n }\n const regexStrings = maskingRegexString?.split(/,\\s*/).filter((regexStr) => regexStr.trim() !== \"\");\n return regexStrings?.map((regexStr) => {\n const regexParts = regexStr.match(/^\\/(.*?)\\/([gimsuy]*)$/);\n if (!regexParts && safeRegexTest(regexStr)) {\n return skipError(() => new RegExp(regexStr));\n }\n if (regexParts?.[1] && safeRegexTest(regexParts[1])) {\n return skipError(() => regexParts[2] ? new RegExp(regexParts[1], regexParts[2]) : new RegExp(regexParts[1]));\n }\n return void 0;\n }).filter((regex) => regex !== void 0);\n};\nvar mask = (text, maskingPatterns) => {\n if (!maskingPatterns || typeof text !== \"string\") {\n return text;\n }\n const endsWithNewline = text.endsWith(\"\\n\");\n let maskedText = text;\n maskingPatterns.forEach((maskingRegex) => {\n maskedText = maskedText.replace(maskingRegex, (fullMatch, ...capturedGroupsAndMore) => {\n const capturedGroups = capturedGroupsAndMore.slice(0, capturedGroupsAndMore.length - 2);\n if (capturedGroups.length === 0) {\n return SENSITIVE_DATA_REPLACER;\n }\n let matchedMaskedText = fullMatch;\n capturedGroups.forEach((group) => {\n matchedMaskedText = matchedMaskedText.replace(group, SENSITIVE_DATA_REPLACER);\n });\n return matchedMaskedText;\n });\n });\n if (endsWithNewline && !maskedText.endsWith(\"\\n\")) {\n maskedText += \"\\n\";\n }\n return maskedText;\n};\n\n// src/index.ts\nimport fs from \"node:fs\";\nimport util from \"node:util\";\nimport log from \"loglevel\";\nimport chalk from \"chalk\";\nimport prefix from \"loglevel-plugin-prefix\";\nimport ansiStrip from \"strip-ansi\";\nprefix.reg(log);\nvar DEFAULT_LEVEL = process.env.WDIO_DEBUG ? \"trace\" : \"info\";\nvar COLORS = {\n error: \"red\",\n warn: \"yellow\",\n info: \"cyanBright\",\n debug: \"green\",\n trace: \"cyan\",\n progress: \"magenta\"\n};\nvar matches = {\n COMMAND: \"COMMAND\",\n BIDICOMMAND: \"BIDI COMMAND\",\n DATA: \"DATA\",\n RESULT: \"RESULT\",\n BIDIRESULT: \"BIDI RESULT\"\n};\nvar SERIALIZERS = [{\n /**\n * display error stack\n */\n matches: (err) => err instanceof Error,\n serialize: (err) => err.stack\n}, {\n /**\n * color commands blue\n */\n matches: (log2) => log2 === matches.COMMAND || log2 === matches.BIDICOMMAND,\n serialize: (log2) => chalk.magenta(log2)\n}, {\n /**\n * color data yellow\n */\n matches: (log2) => log2 === matches.DATA,\n serialize: (log2) => chalk.yellow(log2)\n}, {\n /**\n * color result cyan\n */\n matches: (log2) => log2 === matches.RESULT || log2 === matches.BIDIRESULT,\n serialize: (log2) => chalk.cyan(log2)\n}];\nvar loggers = log.getLoggers();\nvar logLevelsConfig = {};\nvar maskingPatternsConfig = {};\nvar logCache = /* @__PURE__ */ new Set();\nvar logFile;\nvar originalFactory = log.methodFactory;\nvar wdioLoggerMethodFactory = (wdioLogger) => function(methodName, logLevel, loggerName) {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return (...args) => {\n if (!logFile && process.env.WDIO_LOG_PATH) {\n logFile = fs.createWriteStream(process.env.WDIO_LOG_PATH);\n }\n const match = Object.values(matches).filter((x) => args[0].endsWith(`: ${x}`))[0];\n if (match) {\n const prefixStr = args.shift().slice(0, -match.length - 1);\n args.unshift(prefixStr, match);\n }\n args = args.map((arg) => {\n for (const s of SERIALIZERS) {\n if (s.matches(arg)) {\n return s.serialize(arg);\n }\n }\n return arg;\n });\n const unmaskedLogText = ansiStrip(`${util.format.apply(this, args)}\n`);\n const maskedLogText = mask(unmaskedLogText, wdioLogger.maskingPatterns);\n if (logFile && logFile.writable) {\n if (logCache.size) {\n logCache.forEach((log2) => {\n if (logFile) {\n logFile.write(log2);\n }\n });\n logCache.clear();\n }\n if (!logsContainInitPackageError(unmaskedLogText)) {\n return logFile.write(maskedLogText);\n }\n logFile.write(maskedLogText);\n }\n logCache.add(maskedLogText);\n if (maskedLogText === unmaskedLogText) {\n rawMethod(...args);\n } else {\n rawMethod(maskedLogText.replace(/\\n$/, \"\"));\n }\n };\n};\nvar progress = function(data) {\n if (process.stdout.isTTY && this.getLevel() <= log.levels.INFO) {\n const level = \"progress\";\n const timestampFormatter = chalk.gray((/* @__PURE__ */ new Date()).toISOString());\n const levelFormatter = chalk[COLORS[level]](level.toUpperCase());\n const nameFormatter = chalk.whiteBright(this.name);\n const _data = data.length > 0 ? `${timestampFormatter} ${levelFormatter} ${nameFormatter}: ${data}` : \"\\r\\x1B[K\\x1B[?25h\";\n process.stdout.write(\"\\x1B[?25l\");\n process.stdout.write(`${_data}\\r`);\n }\n};\nfunction getLogger(name) {\n if (loggers[name]) {\n return loggers[name];\n }\n let logLevel = process.env.WDIO_LOG_LEVEL || DEFAULT_LEVEL;\n const logLevelName = getLogLevelName(name);\n if (logLevelsConfig[logLevelName]) {\n logLevel = logLevelsConfig[logLevelName];\n }\n loggers[name] = log.getLogger(name);\n const logger = loggers[name];\n logger.setLevel(logLevel);\n logger.maskingPatterns = maskingPatternsConfig[name] ?? parseMaskingPatterns(process.env.WDIO_LOG_MASKING_PATTERNS);\n logger.progress = progress;\n logger.methodFactory = wdioLoggerMethodFactory(logger);\n prefix.apply(logger, {\n template: \"%t %l %n:\",\n timestampFormatter: (date) => chalk.gray(date.toISOString()),\n levelFormatter: (level) => chalk[COLORS[level]](level.toUpperCase()),\n nameFormatter: (name2) => chalk.whiteBright(name2)\n });\n return logger;\n}\ngetLogger.waitForBuffer = async () => new Promise((resolve) => {\n if (logFile && Array.isArray(logFile.writableBuffer) && logFile.writableBuffer.length !== 0) {\n return setTimeout(async () => {\n await getLogger.waitForBuffer();\n resolve();\n }, 20);\n }\n resolve();\n});\ngetLogger.setLevel = (name, level) => loggers[name].setLevel(level);\ngetLogger.clearLogger = () => {\n if (logFile) {\n logFile.end();\n }\n logFile = null;\n};\ngetLogger.setLogLevelsConfig = (logLevels = {}, wdioLogLevel = DEFAULT_LEVEL) => {\n if (process.env.WDIO_LOG_LEVEL === void 0) {\n process.env.WDIO_LOG_LEVEL = wdioLogLevel;\n }\n logLevelsConfig = {};\n Object.entries(logLevels).forEach(([logName, logLevel]) => {\n const logLevelName = getLogLevelName(logName);\n logLevelsConfig[logLevelName] = logLevel;\n });\n Object.keys(loggers).forEach((logName) => {\n const logLevelName = getLogLevelName(logName);\n const logLevel = typeof logLevelsConfig[logLevelName] !== \"undefined\" ? logLevelsConfig[logLevelName] : process.env.WDIO_LOG_LEVEL;\n loggers[logName].setLevel(logLevel);\n });\n};\ngetLogger.setMaskingPatterns = (pattern) => {\n if (typeof pattern === \"string\") {\n if (process.env.WDIO_LOG_MASKING_PATTERNS === void 0) {\n process.env.WDIO_LOG_MASKING_PATTERNS = pattern;\n }\n } else if (typeof pattern === \"object\") {\n maskingPatternsConfig = Object.entries(pattern).reduce((acc, [logName, maskingPatternsString]) => {\n acc[logName] = parseMaskingPatterns(maskingPatternsString);\n return acc;\n }, maskingPatternsConfig);\n } else {\n throw new Error(`Invalid pattern property, expected \\`string\\` or \\`Record<string, string>\\` but received \\`${typeof pattern}\\``);\n }\n Object.keys(loggers).forEach((logName) => {\n const maskingPatterns = maskingPatternsConfig[logName] ?? parseMaskingPatterns(process.env.WDIO_LOG_MASKING_PATTERNS);\n loggers[logName].maskingPatterns = maskingPatterns;\n });\n};\nvar getLogLevelName = (logName) => logName.split(\":\").shift();\nfunction logsContainInitPackageError(logText) {\n return ERROR_LOG_VALIDATOR.every((pattern) => logText.includes(pattern));\n}\nvar ERROR_LOG_VALIDATOR = [\n \"Couldn't find plugin\",\n \"neither as wdio scoped package\",\n \"nor as community package\",\n \"Please make sure you have it installed\"\n];\nexport {\n SENSITIVE_DATA_REPLACER,\n getLogger as default\n};\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Fast path: ANSI codes require ESC (7-bit) or CSI (8-bit) introducer\n\tif (!string.includes('\\u001B') && !string.includes('\\u009B')) {\n\t\treturn string;\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import type * as obsidian from \"obsidian\"\nimport { ObsidianPage } from \"./pageobjects/obsidianPage.js\"\nimport { NormalizedObsidianCapabilityOptions, OBSIDIAN_CAPABILITY_KEY } from \"./types.js\";\nimport { AppInternal } from \"./obsidianTypes.js\";\n\nexport const browserCommands = {\n /**\n * Wrapper around browser.execute that passes the Obsidian API to the function. The first argument to the function\n * is an object containing keys:\n * - app: Obsidian app instance\n * - obsidian: Full Obsidian API\n * - plugins: Object of all installed plugins, mapped by plugin id converted to camelCase.\n * - require: The customized require function Obsidian makes available to plugins. This is also available globally,\n * so you can just use `require` directly instead of from {@link ExecuteObsidianArg} if you prefer.\n * \n * The same caveats as `browser.execute` apply. The function will be stringified and then run inside Obsidian, so\n * you can't capture any local variables. Instead, pass inputs as extra arguments to the function.\n * \n * See also: https://webdriver.io/docs/api/browser/execute\n * \n * Example usage:\n * ```ts\n * const stats = await browser.executeObsidian(({app}, path) => {\n * return app.vault.getMarkdownFiles().find(f => f.path == path)!.stat;\n * }, \"Welcome.md\");\n * ```\n * \n * Make sure not to capture Obsidian types, instead use the provided obsidian module object. E.g. \n * This *won't* work:\n * ```ts\n * import { FileView } from \"obsidian\"\n * browser.executeObsidian(({app}) => {\n * if (leaf.view instanceof FileView) {\n * ...\n * }\n * })\n * ```\n * do this instead:\n * ```ts\n * browser.executeObsidian(({app, obsidian}) => {\n * if (leaf.view instanceof obsidian.FileView) {\n * ...\n * }\n * })\n * ```\n */\n async executeObsidian<Return, Params extends unknown[]>(\n this: WebdriverIO.Browser,\n func: (obs: ExecuteObsidianArg, ...params: Params) => Return,\n ...params: Params\n ): Promise<Return> {\n const obsidianOptions = this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n if (obsidianOptions.vault === undefined) {\n throw Error(\"No vault open, set vault in wdio.conf.mts or use reloadObsidian to open a vault dynamically.\")\n }\n // Call the function. Just stringify the function (browser.execute stringifies it anyways). Add a workaround for\n // node fs errors returning useless error messages. If the thrown error has a \"code\" field that is a string, the\n // chromedriver throws an error like this with no further info:\n // \"unknown error: call function result missing int 'status'\"\n // I think this is a bug in ChromeDevtoolsProtocol or chromedriver. See\n // https://github.com/electron-userland/spectron/issues/1057\n const result = await this.execute<Return, Params>(`\n const require = window.wdioObsidianService().require;\n try {\n return await (\n ${func.toString()}\n ).call(null, window.wdioObsidianService(), ...arguments);\n } catch (e) {\n if (\"code\" in e && typeof e.code != \"number\") {\n delete e.code;\n }\n throw e;\n }\n `, ...params);\n // TODO Should maybe add in the TransformReturn and TransformElement bit that wdio has recently added to the\n // execute types, though it causes weird affects if `func` returns type any.\n return result as Return;\n },\n\n /**\n * Executes an Obsidian command by id.\n * @param id Id of the command to run.\n */\n async executeObsidianCommand(this: WebdriverIO.Browser, id: string) {\n const result = await this.executeObsidian(\n ({app}, id) => (app as AppInternal).commands.executeCommandById(id),\n id,\n );\n if (!result) {\n throw Error(`Obsidian command ${id} not found or failed.`);\n }\n },\n\n /**\n * Returns the Obsidian app version this test is running under.\n */\n getObsidianVersion(this: WebdriverIO.Browser): string {\n const obsidianOptions = this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n return obsidianOptions.appVersion;\n },\n \n /**\n * Returns the Obsidian installer version this test is running under.\n */\n getObsidianInstallerVersion(this: WebdriverIO.Browser): string {\n const obsidianOptions = this.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY] as NormalizedObsidianCapabilityOptions;\n return obsidianOptions.installerVersion;\n },\n\n /**\n * Returns the ObsidianPage object with convenience helper functions.\n * You can also just import the page object directly with\n * ```ts\n * import { obsidianPage } from \"wdio-obsidian-service\"\n * ```\n */\n getObsidianPage(this: WebdriverIO.Browser): ObsidianPage {\n return new ObsidianPage(this);\n },\n}\n\n/**\n * Extra commands added to the WDIO Browser instance.\n * \n * See also: https://webdriver.io/docs/api/browser\n * @interface\n * @category Utilities\n */\nexport type ObsidianBrowserCommands = typeof browserCommands & {\n /**\n * Relaunch obsidian. Can be used to switch to a new vault, change the plugin list, or just to reboot Obsidian.\n * \n * As this does a full reboot of Obsidian, this is rather slow. In many cases you can use\n * {@link ObsidianPage.resetVault} instead, which modifies vault files in place without rebooting Obsidian. If all\n * your tests use the same vault, you can also just set the vault in the `wdio.conf.mts` capabilities section.\n * \n * @param params.vault Path to the vault to open. The vault will be copied by default, so any changes made in your\n * tests won't be persisted to the original. Set `copy` to `false` to use the vault in-place. If omitted, it will\n * reboot Obsidian with the current vault without creating a new copy of the vault.\n * @param params.copy Whether to copy the vault to a temporary directory before running tests in it (default true).\n * When `true` (the default), the vault is copied so that tests don't modify the original and parallel tests will\n * work on separate copies of the vault. When `false`, the vault is used in-place, useful for debugging or\n * read-only tests on large vaults.\n *\n * **WARNING**: With `copy: false`, even with \"read-only\" tests, Obsidian will often make changes under\n * `.obsidian` that will get persisted. This also means that running parallel tests on the same vault with\n * `copy: false` is unsafe.\n * @param params.plugins List of plugin ids to enable. If omitted it will keep current plugin list. Note, all the\n * plugins must be defined in your wdio.conf.mts capabilities. You can also use the enablePlugin and disablePlugin\n * commands to change plugins without relaunching Obsidian.\n * @param params.theme Name of the theme to enable. If omitted it will keep the current theme. Pass \"default\" to\n * switch back to the default theme. Like with plugins, the theme must be defined in wdio.conf.mts.\n */\n reloadObsidian(params?: {\n vault?: string,\n copy?: boolean,\n plugins?: string[], theme?: string,\n }): Promise<void>;\n // This command is implemented in the service hooks.\n};\n\n/**\n * Argument passed to the {@link ObsidianBrowserCommands.executeObsidian | executeObsidian} browser command.\n * @category Types\n */\nexport interface ExecuteObsidianArg {\n /**\n * There is a global \"app\" instance, but that may be removed in the future so you can use this to access it from\n * tests. See https://docs.obsidian.md/Plugins/Releasing/Plugin+guidelines#Avoid+using+global+app+instance\n */\n app: obsidian.App,\n\n /**\n * The full obsidian API. See https://github.com/obsidianmd/obsidian-api/blob/master/obsidian.d.ts\n */\n obsidian: typeof obsidian,\n\n /**\n * Object containing all installed plugins mapped by their id. Plugin ids are converted to camelCase for ease of\n * destructuring.\n * \n * If you want to add typings for your plugin(s) you can use something like this in a `.d.ts`:\n * ```ts\n * import type MyPlugin from \"../src/main.js\"\n * declare module \"wdio-obsidian-service\" {\n * interface InstalledPlugins {\n * myPlugin: MyPlugin,\n * }\n * }\n * ```\n */\n plugins: InstalledPlugins,\n\n /**\n * The customized require function Obsidian makes available to plugins. This is also available globally, so you can\n * just use `require` directly instead of from {@link ExecuteObsidianArg} if you prefer.\n */\n require: NodeJS.Require,\n}\n\n/**\n * Installed plugins, mapped by their id converted to camelCase\n * @category Types\n */\nexport interface InstalledPlugins extends Record<string, obsidian.Plugin> {\n}\n","import * as path from \"path\"\nimport * as fsAsync from \"fs/promises\"\nimport * as crypto from \"crypto\";\nimport * as semver from \"semver\";\nimport { fileURLToPath } from \"url\";\nimport { TFile } from \"obsidian\";\nimport _ from \"lodash\";\nimport { OBSIDIAN_CAPABILITY_KEY, NormalizedObsidianCapabilityOptions } from \"../types.js\";\nimport { BasePage } from \"./basePage.js\";\nimport { isAppium, normalizePath, isHidden, isText } from \"../utils.js\";\nimport { AppInternal, PlatformInternal } from \"../obsidianTypes.js\";\n\n/**\n * Class with various helper methods for writing Obsidian tests using the\n * [page object pattern](https://webdriver.io/docs/pageobjects).\n * \n * You can get an instance of this class either by running\n * ```ts\n * const obsidianPage = await browser.getObsidianPage();\n * ```\n * or just importing it directly with\n * ```ts\n * import { obsidianPage } from \"wdio-obsidian-service\";\n * ```\n * \n * @hideconstructor\n * @category Utilities\n */\nclass ObsidianPage extends BasePage {\n private getObsidianCapabilities(): NormalizedObsidianCapabilityOptions {\n return this.browser.requestedCapabilities[OBSIDIAN_CAPABILITY_KEY];\n }\n\n /**\n * Returns the path to the vault opened in Obsidian.\n * \n * wdio-obsidian-service copies your vault before running tests, so this is the path to the temporary copy.\n */\n getVaultPath(): string {\n const obsidianOptions = this.getObsidianCapabilities();\n if (obsidianOptions.openVault === undefined) {\n throw Error(\"No vault open, set vault in wdio.conf.mts or use reloadObsidian to open a vault dynamically.\")\n }\n return obsidianOptions.androidVault ?? obsidianOptions.openVault;\n }\n\n /** \n * Run an Obsidian CLI command.\n * \n * The Obsidian CLI Only works on Obsidian >=1.12.0 with installer >=1.11.7\n * See https://help.obsidian.md/cli\n */\n async runObsidianCli(args: string[]): Promise<{stdout: string, stderr: string}> {\n const {appVersion, installerVersion} = this.getObsidianCapabilities();\n if (semver.lt(appVersion, \"1.12.0\") || semver.lt(installerVersion, \"1.11.7\")) {\n throw Error(`Obsidian CLI only works on app >=1.12.0 and installer >=1.11.7`)\n }\n if (isAppium(this.browser.requestedCapabilities)) {\n throw Error(`Obsidian CLI only works on desktop`)\n }\n const stdout = await this.browser.execute((args) => (window as any).handleCli(args), args);\n return {stdout, stderr: \"\"};\n // TODO: I'd prefer to run this with the actual binary instead of using the internal API here, but as of 1.12.5,\n // the communication socket Obsidian uses has a constant name, e.g. `/run/user/1000/obsidian-cli.sock`,\n // so parallel Obsidian instances interfere with each other. \n\n // const chromeArgs: string[] = this.browser.requestedCapabilities['goog:chromeOptions'].args;\n // The Windows .com wrapper is losing --user-data-dir args\n // const cliBinary = binaryPath!.replace(/.exe$/, '.com');\n // return await execFile(binaryPath!, [...args, ...chromeArgs]);\n }\n\n /**\n * Return the Obsidian config dir (just \".obsidian\" unless you changed the config dir name in settings).\n */\n async getConfigDir(): Promise<string> {\n return await this.browser.executeObsidian(({app}) => app.vault.configDir)\n }\n\n /**\n * Returns the Obsidian Platform object. Useful for skipping tests based on whether you are running in desktop or\n * mobile, or based on OS.\n */\n async getPlatform(): Promise<Platform> {\n const obsidianOptions = this.getObsidianCapabilities();\n const appium = isAppium(this.browser.requestedCapabilities);\n const emulateMobile = obsidianOptions.emulateMobile;\n\n // To allow calling getPlatform before opening a vault, we'll compute the values ourselves when a vault isn't\n // open. We'll pull obsidian Platform if there is a vault, as technically you can change the screen size and\n // emulation mode during tests. Also, on very old versions of Obsidian, not all these fields are exist.\n const platform = {\n isDesktop: !(appium || emulateMobile),\n isMobile: appium || emulateMobile,\n isDesktopApp: !appium,\n isMobileApp: appium,\n isIosApp: false, // iOS is not supported\n isAndroidApp: appium,\n isMacOS: !appium && process.platform == 'darwin',\n isWin: !appium && process.platform == 'win32',\n isLinux: appium || process.platform == 'linux',\n isSafari: false, // iOS is not supported\n };\n\n if (obsidianOptions.vault !== undefined) {\n const obsidianPlatform = await this.browser.executeObsidian(({obsidian}) => {\n // The types for this in old versions of obsidian types are incomplete, so any cast here\n const p = obsidian.Platform as PlatformInternal;\n return {\n isMobileApp: p.isMobileApp,\n isIosApp: p.isIosApp,\n isAndroidApp: p.isAndroidApp,\n isPhone: p.isPhone,\n isTablet: p.isTablet,\n isMacOS: p.isMacOS,\n isWin: p.isWin,\n isLinux: p.isLinux,\n isSafari: p.isSafari,\n };\n })\n Object.assign(platform, _.pickBy(obsidianPlatform, x => x != null));\n } else {\n const [width, height] = await this.browser.execute(() => [window.innerWidth, window.innerHeight]);\n\n let isTablet = false;\n let isPhone = false;\n if (appium || emulateMobile) {\n // replicate Obsidian's tablet vs phone breakpoint\n isTablet = (width >= 600 && height >= 600);\n isPhone = !isTablet;\n }\n\n Object.assign(platform, {isTablet, isPhone});\n }\n\n return platform as Platform;\n }\n\n /**\n * Enables a plugin by ID\n */\n async enablePlugin(pluginId: string): Promise<void> {\n await this.browser.executeObsidian(\n async ({app}, pluginId) => await (app as AppInternal).plugins.enablePluginAndSave(pluginId),\n pluginId,\n );\n }\n\n /**\n * Disables a plugin by ID\n */\n async disablePlugin(pluginId: string): Promise<void> {\n await this.browser.executeObsidian(\n async ({app}, pluginId) => await (app as AppInternal).plugins.disablePluginAndSave(pluginId),\n pluginId,\n );\n }\n\n /**\n * Sets the theme. Pass \"default\" to reset to the Obsidian theme.\n */\n async setTheme(themeName: string): Promise<void> {\n themeName = themeName == 'default' ? '' : themeName;\n await this.browser.executeObsidian(\n async ({app}, themeName) => await (app as AppInternal).customCss.setTheme(themeName),\n themeName,\n )\n }\n\n /**\n * Opens a file in a new tab.\n */\n async openFile(path: string) {\n await this.browser.executeObsidian(async ({app, obsidian}, path) => {\n const file = app.vault.getAbstractFileByPath(path);\n if (file instanceof obsidian.TFile) {\n const leaf = app.workspace.getLeaf('tab');\n await leaf.openFile(file);\n app.workspace.setActiveLeaf(leaf, {focus: true});\n } else {\n throw Error(`No file ${path} exists`);\n }\n }, path)\n }\n\n /**\n * Loads a saved workspace layout from `.obsidian/workspaces.json` by name. Use the core \"Workspaces\"\n * plugin to create the layouts. You can also pass the layout object directly.\n */\n async loadWorkspaceLayout(layout: any): Promise<void> {\n if (typeof layout == \"string\") {\n // read from .obsidian/workspaces.json like the built-in workspaces plugin does\n const workspacesPath = `${await this.getConfigDir()}/workspaces.json`;\n const layoutName = layout;\n try {\n const fileContent = await this.browser.executeObsidian(async ({app}, workspacesPath) => {\n return await app.vault.adapter.read(workspacesPath);\n }, workspacesPath);\n layout = JSON.parse(fileContent)?.workspaces?.[layoutName];\n } catch {\n throw new Error(`Failed to load ${workspacesPath}:${layoutName}`);\n }\n if (!layout) {\n throw new Error(`No workspace ${layoutName} found in ${workspacesPath}`);\n }\n }\n\n await this.browser.executeObsidian(async ({app}, layout) => {\n await app.workspace.changeLayout(layout)\n }, layout)\n }\n\n /**\n * Return contents of a file in the vault.\n */\n async read(file: string): Promise<string> {\n return await this.browser.executeObsidian(async ({app, obsidian}, file) => {\n file = obsidian.normalizePath(file);\n return await app.vault.adapter.read(file);\n }, file);\n }\n\n /**\n * Return contents of a binary file in the vault.\n */\n async readBinary(file: string): Promise<ArrayBuffer> {\n const b64Contents = await this.browser.executeObsidian(async ({app, obsidian}, file) => {\n function toB64(buffer: ArrayBuffer) {\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n file = obsidian.normalizePath(file);\n return toB64(await app.vault.adapter.readBinary(file));\n }, file);\n return Buffer.from(b64Contents, 'base64').buffer;\n }\n\n /**\n * Deletes a file or folder in the vault.\n * @param file path of inside vault, e.g. \"/books/leviathan-wakes.md\"\n */\n async delete(file: string) {\n await this.browser.executeObsidian(async ({app, obsidian}, file, isVaultFile) => {\n file = obsidian.normalizePath(file);\n if (isVaultFile) {\n const fileObj = app.vault.getAbstractFileByPath(file);\n if (fileObj) {\n await app.vault.delete(fileObj, true);\n };\n } else {\n const stat = await app.vault.adapter.stat(file);\n if (stat && stat.type == \"folder\") {\n await app.vault.adapter.rmdir(file, true);\n } else if (stat) {\n await app.vault.adapter.remove(file);\n }\n }\n }, file, !isHidden(file));\n }\n\n /**\n * Writes to a file in the vault. Creates parent directories if needed.\n * @param file path of inside vault, e.g. \"/books/leviathan-wakes.md\"\n * @param content content to write to the file\n */\n async write(file: string, content: string|ArrayBufferLike|ArrayBuffer) {\n let strContent: string|undefined, binContent: string|undefined;\n if (typeof content == \"string\") {\n strContent = content;\n } else {\n binContent = Buffer.from(content).toString(\"base64\");\n }\n await this.browser.executeObsidian(async ({app, obsidian}, file, isVaultFile, strContent, binContent) => {\n file = obsidian.normalizePath(file);\n const parent = file.split(\"/\").slice(0, -1).join(\"/\");\n if (isVaultFile) {\n if (parent && !app.vault.getAbstractFileByPath(parent)) {\n await app.vault.createFolder(parent);\n }\n const fileObj = app.vault.getAbstractFileByPath(file);\n strContent = strContent ?? atob(binContent!);\n if (fileObj) {\n await app.vault.modify(fileObj as TFile, strContent);\n } else {\n await app.vault.create(file, strContent);\n }\n } else {\n await app.vault.adapter.mkdir(parent);\n if (strContent) {\n await app.vault.adapter.write(file, strContent);\n } else {\n const buffer = Uint8Array.from(atob(binContent!), c => c.charCodeAt(0)).buffer;\n await app.vault.adapter.writeBinary(file, buffer);\n }\n }\n }, file, !isHidden(file) && isText(file), strContent, binContent);\n }\n\n /**\n * Create a folder in the vault. Creates parent directories if needed.\n * @param file path of inside vault, e.g. \"/books\"\n */\n async mkdir(file: string) {\n await this.browser.executeObsidian(async ({app, obsidian}, file, isVaultFile) => {\n file = obsidian.normalizePath(file);\n if (isVaultFile) {\n if (parent && !app.vault.getAbstractFileByPath(file)) {\n await app.vault.createFolder(file);\n }\n } else {\n await app.vault.adapter.mkdir(file);\n }\n }, file, !isHidden(file));\n }\n\n /**\n * Updates the vault by modifying files in place without reloading Obsidian. Can be used to reset the vault back to\n * its original state or to \"switch\" to an entirely different vault without rebooting Obsidian\n * \n * This will only update regular vault files, it won't touch anything under `.obsidian`, and it won't reset any\n * Obsidian config or plugin settings. But if all you need is to reset the vault files, this can be used as a faster\n * alternative to {@link ObsidianBrowserCommands.reloadObsidian | reloadObsidian}.\n * \n * You'll often want to combine resetVault with something like this to reset your plugin's configuration as well:\n * ```ts\n * await browser.executeObsidian(async ({plugins}, settings) => {\n * Object.assign(plugins.myPlugin.settings, settings);\n * await plugins.myPlugin.saveSettings();\n * }, {...});\n * ```\n *\n * If no vault is passed, it resets the vault back to the oringal vault opened by the tests. You can also pass a\n * path to a different vault, and it will replace the current files with the files of that vault (similar to an\n * \"rsync\"). Or, instead of passing a vault path you can pass an object mapping vault file paths to file content.\n * E.g.\n * ```ts\n * obsidianPage.resetVault({\n * 'path/in/vault.md': \"Hello World\",\n * })\n * ```\n * \n * You can also pass multiple vaults and objects, and they will be merged. This can be useful if you want to add a\n * few small modifications to the base vault. e.g:\n * ```ts\n * obsidianPage.resetVault('./path/to/vault', {\n * \"books/leviathan-wakes.md\": \"...\",\n * })\n * ```\n */\n async resetVault(...vaults: (string|Record<string, string|ArrayBufferLike|ArrayBuffer>)[]) {\n const obsidianOptions = this.getObsidianCapabilities();\n if (!obsidianOptions.vault) {\n // open an empty vault if there's no vault open\n const defaultVaultPath = path.resolve(fileURLToPath(import.meta.url), '../../default-vault');\n await this.browser.reloadObsidian({vault: defaultVaultPath});\n }\n const configDir = await this.getConfigDir();\n vaults = vaults.length == 0 ? [obsidianOptions.vault!] : vaults;\n\n // list all files in the new vault\n type NewFileInfo = {\n type: \"file\"|\"folder\",\n sourceContent?: string|ArrayBufferLike|ArrayBuffer,\n sourceFile?: string,\n };\n const newVault: Map<string, NewFileInfo> = new Map();\n for (let vault of vaults) {\n if (typeof vault == \"string\") {\n vault = path.resolve(vault);\n const files = await fsAsync.readdir(vault, { recursive: true, withFileTypes: true });\n for (const f of files) {\n const fullPath = path.join(f.parentPath, f.name);\n const vaultPath = path.relative(vault, fullPath).split(path.sep).join(\"/\");\n if (!vaultPath.startsWith(configDir + \"/\")) {\n if (f.isDirectory()) {\n newVault.set(vaultPath, {type: 'folder'});\n } else {\n newVault.set(vaultPath, {type: 'file', sourceFile: fullPath});\n }\n }\n }\n } else {\n vault = _.mapKeys(vault, (v, k) => normalizePath(k));\n for (const [file, content] of Object.entries(vault)) {\n newVault.set(file, {type: \"file\", sourceContent: content});\n }\n const folders = new Set(Object.keys(vault).map(p => path.posix.dirname(p)).filter(p => p !== \".\"));\n for (const folder of folders) {\n newVault.set(folder, {type: \"folder\"});\n }\n }\n }\n\n // list all files in the current vault\n type CurrFileInfo = {type: \"file\"|\"folder\", hash?: string};\n const currVault = new Map(await this.browser.executeObsidian(({app}, configDir) => {\n async function hash(data: ArrayBuffer) {\n const hashBuffer = await window.crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n }\n\n async function listRecursive(path: string): Promise<[string, CurrFileInfo][]> {\n const result: [string, CurrFileInfo][] = [];\n const { folders, files } = await app.vault.adapter.list(path);\n for (const folder of folders) {\n if (!folder.startsWith(configDir + \"/\")) {\n result.push([folder, {type: \"folder\"}]);\n result.push(...await listRecursive(folder));\n }\n }\n for (const file of files) {\n if (!file.startsWith(configDir + \"/\")) {\n let fileHash = (app as AppInternal).metadataCache.getFileInfo(file)?.hash;\n if (!fileHash) { // hidden files etc. aren't in Obsidian's metadata cache\n fileHash = await hash(await app.vault.adapter.readBinary(file));\n }\n result.push([file, { type: \"file\", hash: fileHash }]);\n }\n }\n return result;\n }\n\n return listRecursive(\"/\");\n }, configDir));\n\n // delete any files that need to be deleted\n for (const file of [...currVault.keys()].sort().reverse()) {\n const currFileInfo = currVault.get(file)!\n if (!newVault.has(file) || newVault.get(file)!.type != currFileInfo.type) {\n await this.delete(file);\n }\n }\n\n // create files and folders\n for (const [file, newFileInfo] of _.sortBy([...newVault.entries()], 0)) {\n const currFileInfo = currVault.get(file);\n if (newFileInfo.type == \"file\") {\n let content = newFileInfo.sourceContent;\n if (!content) {\n content = (await fsAsync.readFile(newFileInfo.sourceFile!)).buffer as ArrayBuffer;\n }\n const hash = crypto.createHash(\"SHA256\")\n .update(typeof content == \"string\" ? content : new Uint8Array(content))\n .digest(\"hex\");\n if (!currFileInfo || currFileInfo.hash != hash) {\n await this.write(file, content);\n }\n } else if (newFileInfo.type == \"folder\" && !currFileInfo) {\n await this.mkdir(file);\n }\n }\n }\n}\n\n/**\n * Info on the platform we are running on or emulating, in similar format as\n * [obsidian.Platform](https://docs.obsidian.md/Reference/TypeScript+API/Platform)\n * @category Types\n */\nexport interface Platform {\n /**\n * The UI is in desktop mode.\n */\n isDesktop: boolean;\n /**\n * The UI is in mobile mode.\n */\n isMobile: boolean;\n /**\n * We're running the Electron-based desktop app.\n * Note, when running under `emulateMobile` this will still be true and isDesktop will be false.\n */\n isDesktopApp: boolean;\n /**\n * We're running the Capacitor-js mobile app.\n * Note, when running under `emulateMobile` this will still be false and isMobile will be true.\n */\n isMobileApp: boolean;\n /** \n * We're running the iOS app.\n * Note, wdio-obsidian-service doesn't support iOS yet, so this will always be false.\n */\n isIosApp: boolean;\n /**\n * We're running the Android app.\n */\n isAndroidApp: boolean;\n /**\n * We're in a mobile app that has very limited screen space.\n */\n isPhone: boolean;\n /**\n * We're in a mobile app that has sufficiently large screen space.\n */\n isTablet: boolean;\n /**\n * We're on a macOS device, or a device that pretends to be one (like iPhones and iPads).\n * Typically used to detect whether to use command-based hotkeys vs ctrl-based hotkeys.\n */\n isMacOS: boolean;\n /**\n * We're on a Windows device.\n */\n isWin: boolean;\n /**\n * We're on a Linux device.\n */\n isLinux: boolean;\n /**\n * We're running in Safari.\n * Note, wdio-obsidian-service doesn't support iOS yet, so this will always be false.\n */\n isSafari: boolean;\n};\n\n/**\n * Instance of {@link ObsidianPage} with helper methods for writing Obsidian tests.\n * @category Utilities\n */\nconst obsidianPage = new ObsidianPage()\nexport default obsidianPage;\nexport { ObsidianPage };\n","import type { ObsidianBrowserCommands } from \"./browserCommands.js\";\nimport type { PluginEntry, ThemeEntry, DownloadedPluginEntry, DownloadedThemeEntry } from \"obsidian-launcher\";\n\nexport const OBSIDIAN_CAPABILITY_KEY = \"wdio:obsidianOptions\";\n\n/**\n * Options passed to an \"wdio:obsidianOptions\" capability in wdio.conf.mts. E.g.\n * ```ts\n * // ...\n * capabilities: [{\n * browserName: \"obsidian\",\n * browserVersion: \"latest\",\n * 'wdio:obsidianOptions': {\n * installerVersion: 'earliest',\n * plugins: [\".\"],\n * },\n * }],\n * ```\n * \n * @category Options\n */\nexport interface ObsidianCapabilityOptions {\n /**\n * Version of Obsidian to download and run.\n * \n * Can be set to a specific version or one of:\n * - \"latest\": Run the latest non-beta Obsidian version\n * - \"latest-beta\": Run the latest beta Obsidian version (or latest if there is no current beta)\n * - To download Obsidian beta versions you'll need to have an Obsidian Insiders account and either set the \n * `OBSIDIAN_EMAIL` and `OBSIDIAN_PASSWORD` environment variables (`.env` file is supported) or pre-download\n * the Obsidian beta version with `npx obsidian-launcher download app -v latest-beta`\n * - \"earliest\": Run the `minAppVersion` set in your `manifest.json`\n * \n * Defaults to \"latest\".\n * \n * You can also use the wdio capability `browserVersion` field to set the Obsidian version.\n * \n * See also: [Obsidian App vs Installer Versions](../README.md#obsidian-app-vs-installer-versions)\n */\n appVersion?: string\n\n /**\n * Version of the Obsidian installer to download and run.\n * \n * Obsidian is Desktop distributed in two parts, the app which contains the JS, and the installer which is the\n * binary with Electron. Obsidian's auto update only updates the app, so users on the same Obsidian version can be\n * running different Electron versions. You can use this to test your plugin against different installer/Electron\n * versions.\n * \n * See also: [Obsidian App vs Installer Versions](../README.md#obsidian-app-vs-installer-versions)\n *\n * Can be set to a specific version string or one of:\n * - \"latest\": Run the latest Obsidian installer compatible with `appVersion`.\n * - \"earliest\": Run the oldest Obsidian installer compatible with `appVersion`.\n * \n * Defaults to \"earliest\".\n */\n installerVersion?: string,\n\n /**\n * List of plugins to install.\n * \n * Each entry is a path to the local plugin to install, e.g. [\".\"] or [\"dist\"] depending on your build setup. Paths\n * are relative to your `wdio.conf.mts`. You can also pass objects. If you pass an object it should contain one of\n * `path` (to install a local plugin), `repo` (to install a plugin from GitHub), or `id` (to install a community\n * plugin). You can set `enabled: false` to install the plugin but start it disabled. You can enable the plugin\n * later using {@link ObsidianBrowserCommands.reloadObsidian|browser.reloadObsidian} or\n * {@link ObsidianPage.enablePlugin}.\n */\n plugins?: PluginEntry[],\n\n /**\n * List of themes to install.\n * \n * Each entry is a path to the local theme to install. Paths are relative to your `wdio.conf.mts`. You can also pass\n * an object. If you pass an object it should contain one of `path` (to install a local theme), `repo` (to install a\n * theme from GitHub), or `name` (to install a community theme). You can set `enabled: false` to install the theme,\n * but start it disabled. You can only have one enabled theme, so if you pass multiple you'll have to disable all\n * but one.\n */\n themes?: ThemeEntry[],\n\n /**\n * The path to the vault to open.\n *\n * By default the vault will be copied to a temporary directory, so any changes made in your tests won't affect\n * the original. Set {@link copy} to `false` to use the vault in-place. If omitted, no vault will be opened and\n * you'll need to call {@link ObsidianBrowserCommands.reloadObsidian|browser.reloadObsidian} to open a vault\n * during your tests. Path is relative to your `wdio.conf.mts`.\n */\n vault?: string,\n\n /**\n * Whether to copy the vault to a temporary directory before running tests in it (the default).\n *\n * When `true` (the default), the vault is copied so that tests don't modify the original and parallel tests will\n * work on separate copies of the vault. When `false`, the vault is used in-place, useful for debugging or\n * read-only tests on large vaults.\n *\n * **WARNING**: With `copy: false`, even with \"read-only\" tests, Obsidian will often make changes under `.obsidian`\n * that will get persisted. This also means that running parallel tests on the same vault with `copy: false` is\n * unsafe.\n */\n copy?: boolean,\n\n /**\n * Set to true to emulate mobile on the Electron desktop app. This uses Obsidian `app.emulateMobile()` to switch\n * Obsidian to the mobile UI, and you can use Chrome's mobileEmulation to set the screen size. You can compare\n * tablet vs phone UIs by setting the screen size or emulated device. Obsidian tablet UI triggers at\n * width/height >= 600.\n *\n * Note that Obsidian Mobile runs on Capacitor instead of Electron so there are various platform differences that\n * can't be emulated. But it's good enough for most cases as long as you aren't interacting directly with the\n * operating system or Electron APIs. You can use an Android Virtual Device instead if you want a more accurate\n * (but slower) mobile test.\n *\n * See [Mobile Emulation](../README.md#mobile-emulation) for more info.\n * See [Android](../README.md#android) if you want to test the real mobile app on an Android Virtual Device instead.\n */\n emulateMobile?: boolean,\n\n /**\n * Path to the Obsidian binary to use. If omitted it will be downloaded automatically.\n */\n binaryPath?: string,\n\n /**\n * Path to the app asar to load into obsidian. If omitted it will be downloaded automatically.\n */\n appPath?: string,\n\n /**\n * Where to store test vaults when test on Android.\n * \n * Options:\n * - \"app-storage\": Store the vault as Obsidian app data. Default.\n * - \"device-storage\": Store the vault on the SD card (`/storage/emulated/0`). Currently not recommended due to \n * intermittent write failures in Capacitor that cause flaky tests. See https://forum.obsidian.md/t/102935\n * - custom path: Store vaults under a custom device storage path. Same caveats as \"device-storage\" apply.\n */\n androidVaultStorage?: string,\n}\n\n\n/** Internal type, capability options after being normalized by onPrepare */\nexport interface NormalizedObsidianCapabilityOptions {\n appVersion: string\n installerVersion: string,\n plugins: DownloadedPluginEntry[],\n themes: DownloadedThemeEntry[],\n copy: boolean,\n /** The original vault path passed by the user */\n vault?: string,\n /** The actually open vault (a copy of vault unless copy is false) */\n openVault?: string,\n /** Path of the vault on the appium device */\n androidVault?: string,\n /**\n * Unique ID per test run. We use this for handling Appium vault uploads.\n */\n testRunId: string\n emulateMobile: boolean,\n binaryPath?: string,\n appPath?: string,\n /** Just app-storage or the absolute path (device-storage is resolved to the default) */\n androidVaultStorage?: string,\n}\n\n\n/**\n * Options passed to wdio-obsidian-service service in wdio.conf.mts. E.g.\n * ```js\n * // ...\n * services: [[\"obsidian\", {versionsUrl: \"file:///path/to/obsidian-versions.json\"}]]\n * ```\n * You'll usually want to leave these options as the default, they are mostly useful for wdio-obsidian-service's\n * internal tests.\n * \n * @category Options\n */\nexport interface ObsidianServiceOptions {\n /**\n * Override the `obsidian-versions.json` used by the service. Can be a file URL.\n * Defaults to https://raw.githubusercontent.com/jesse-r-s-hines/wdio-obsidian-service/HEAD/obsidian-versions.json\n * which is auto-updated to contain information on available Obsidian versions.\n */\n versionsUrl?: string,\n /**\n * Override the `community-plugins.json` used by the service. Can be a file URL.\n * Defaults to https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json\n */\n communityPluginsUrl?: string,\n /**\n * Override the `community-css-themes.json` used by the service. Can be a file URL.\n * Defaults to https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json\n */\n communityThemesUrl?: string,\n}\n\ndeclare global {\n namespace WebdriverIO {\n interface Capabilities {\n [OBSIDIAN_CAPABILITY_KEY]?: ObsidianCapabilityOptions,\n }\n\n interface Browser extends ObsidianBrowserCommands {}\n }\n}\n","import * as wdioGlobals from \"@wdio/globals\"\n\n/**\n * Base page object for use in the wdio [page object pattern](https://webdriver.io/docs/pageobjects).\n * \n * You can pass the browser to the page object, which allows using the object even in wdio standalone mode.\n */\nexport class BasePage {\n private _browser: WebdriverIO.Browser|undefined\n constructor(browser?: WebdriverIO.Browser) {\n this._browser = browser;\n }\n\n /**\n * Returns the browser instance.\n * @hidden\n */\n protected get browser(): WebdriverIO.Browser {\n return this._browser ?? wdioGlobals.browser;\n }\n}\n","// src/index.ts\nvar globals = globalThis._wdioGlobals = globalThis._wdioGlobals || /* @__PURE__ */ new Map();\nvar GLOBALS_ERROR_MESSAGE = `No browser instance registered. Don't import @wdio/globals outside of the WDIO testrunner context. Or you have two two different \"@wdio/globals\" packages installed.`;\nfunction proxyHandler(key) {\n return {\n get: (self, prop) => {\n if (!globals.has(key)) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n const receiver = globals.get(key);\n const field = receiver[prop];\n return typeof field === \"function\" ? field.bind(receiver) : field;\n }\n };\n}\nvar browser = new Proxy(\n class Browser {\n },\n proxyHandler(\"browser\")\n);\nvar driver = new Proxy(\n class Browser2 {\n },\n proxyHandler(\"driver\")\n);\nvar multiremotebrowser = new Proxy(\n class Browser3 {\n },\n proxyHandler(\"multiremotebrowser\")\n);\nvar multiRemoteBrowser = new Proxy(\n class Browser4 {\n },\n proxyHandler(\"multiRemoteBrowser\")\n);\nvar $ = (...args) => {\n if (!globals.has(\"$\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"$\")(...args);\n};\nvar $$ = (...args) => {\n if (!globals.has(\"$$\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"$$\")(...args);\n};\nvar expect = ((...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"expect\")(...args);\n});\nvar ASYNC_MATCHERS = [\n \"any\",\n \"anything\",\n \"arrayContaining\",\n \"objectContaining\",\n \"stringContaining\",\n \"stringMatching\"\n];\nfor (const matcher of ASYNC_MATCHERS) {\n expect[matcher] = (...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"expect\")[matcher](...args);\n };\n}\nexpect.not = ASYNC_MATCHERS.reduce((acc, matcher) => {\n acc[matcher] = (...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n return globals.get(\"expect\").not[matcher](...args);\n };\n return acc;\n}, {});\nexpect.extend = (...args) => {\n if (!globals.has(\"expect\")) {\n throw new Error(GLOBALS_ERROR_MESSAGE);\n }\n const expect2 = globals.get(\"expect\");\n return expect2.extend(...args);\n};\nfunction _setGlobal(key, value, setGlobal = true) {\n globals.set(key, value);\n if (setGlobal) {\n globalThis[key] = value;\n }\n}\nexport {\n $,\n $$,\n _setGlobal,\n browser,\n driver,\n expect,\n multiRemoteBrowser,\n multiremotebrowser\n};\n","import path from \"path\";\nimport crypto from \"crypto\";\nimport fsAsync from \"fs/promises\";\nimport * as tar from \"tar\";\nimport _ from \"lodash\";\n\n/** Quote string for use in shell scripts */\nexport function quote(input: string) {\n return `'${input.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport async function fileExists(path: string) {\n try {\n await fsAsync.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Gets the appium options.\n * Handles combining `\"appium:foo\"` and `\"appium:options\": {\"foo\": ...}` style options.\n */\nexport function getAppiumOptions(\n cap: WebdriverIO.Capabilities,\n): Exclude<WebdriverIO.Capabilities['appium:options'], undefined> {\n let result = _.pickBy(cap, (v, k) => k.startsWith(\"appium:\") && k != 'appium:options');\n result = _.mapKeys(result, (v, k) => k.slice(7))\n return {...result, ...cap['appium:options']};\n}\n\n/** Returns true if this capability is for Appium */\nexport function isAppium(cap: WebdriverIO.Capabilities) {\n return getAppiumOptions(cap).automationName?.toLocaleLowerCase() === 'uiautomator2';\n}\n\n/**\n * Upload multiple files at once. Uploads files as a tar for much better performance and to avoid issues with special\n * characters in names. (see https://github.com/appium/appium-android-driver/issues/1004)\n * \n * @param opts.src Directory to copy from (-C in tar)\n * @param opts.dest Directory to copy to\n * @param opts.files Files under src to copy. Defaults to the whole dir.\n * @param opts.chunkSize Size to split the tar into while uploading (to avoid excessive RAM usage)\n */\nexport async function appiumUploadFiles(browser: WebdriverIO.Browser, opts: {\n src: string, dest: string, files?: string[], chunkSize?: number,\n}) {\n let {\n src, dest,\n files = [src],\n chunkSize = 2 * 1024 * 1024,\n } = opts;\n src = path.resolve(src);\n dest = path.posix.normalize(dest).replace(/\\/$/, '');\n files = files.map(f => path.relative(src, f) || \".\");\n if (files.length == 0) return; // nothing to do\n\n // We'll tar the files up and then extract the tar on Android side. This is a lot faster than doing many small\n // pushFiles. Since pushFile requires sending the whole file contents as a base64 string, we'll split up the tar\n // into chunks to keep the size manageable for large vaults.\n\n const tmpDir = \"/data/local/tmp\"\n const slug = crypto.randomBytes(10).toString(\"base64url\").replace(/[-_]/g, '0');\n const stream = tar.create({C: src, gzip: { level: 2 }}, files);\n\n // buffer/chunk size of the tar stream varies. Without compression it appears to be one chunk per file, splitting\n // large files at maxReadSize, plus some chunks for the header. However compression adds another layer that appears\n // to limit the output chunk size to about 16K.\n let buffers: Buffer[] = [];\n let bufferSize = 0;\n let i = 0;\n for await (const chunk of stream) {\n if (bufferSize + chunk.length > chunkSize && bufferSize > 0) {\n const data = Buffer.concat(buffers).toString('base64');\n await browser.pushFile(`${tmpDir}/${slug}-${String(i).padStart(6, '0')}.tar`, data);\n i++;\n buffers = [];\n bufferSize = 0;\n }\n buffers.push(chunk);\n bufferSize += chunk.length;\n }\n const data = Buffer.concat(buffers).toString('base64');\n await browser.pushFile(`${tmpDir}/${slug}-${String(i).padStart(6, '0')}.tar`, data);\n\n // extract the tar. `mobile: shell` does NOT escape arguments despite taking an argument array.\n await browser.execute(\"mobile: shell\", {command: \"sh\", args: [\"-c\", quote(`\n mkdir -p ${quote(dest)};\n cat ${tmpDir}/${slug}-*.tar | tar -xz -C ${quote(dest)};\n rm ${tmpDir}/${slug}-*.tar;\n `)]});\n}\n\nexport async function appiumDownloadFile(browser: WebdriverIO.Browser, src: string, dest: string) {\n src = path.posix.normalize(src);\n dest = path.resolve(dest);\n const content = Buffer.from(await browser.pullFile(src), \"base64\");\n await fsAsync.writeFile(dest, content);\n}\n\n/** Lists all files under a folder. Returns full paths. */\nexport async function appiumReaddir(browser: WebdriverIO.Browser, dir: string) {\n // list all files, one per line, no escaping\n const stdout: string = await browser.execute(\"mobile: shell\", {command: \"ls\", args: [\"-NA1\", dir]});\n return stdout.split(\"\\n\").filter(f => f).map(f => path.join(dir, f)).sort();\n}\n\nexport async function appiumExists(browser: WebdriverIO.Browser, file: string) {\n const stdout: string = await browser.execute(\"mobile: shell\", {command: \"sh\", args: [\"-c\",\n quote(`[ -e ${quote(file)} ] && echo \"true\" || echo \"false\"`)],\n });\n return stdout.trim() == \"true\" ? true : false;\n}\n\n/**\n * Reload/replace the page and then wait for the current page to unloaded. Does NOT wait for the new page to be ready.\n * Example:\n * ```ts\n * await navigateAndWait(browser, () => location.reload());\n * ```\n */\nexport async function navigateAndWait(browser: WebdriverIO.Browser, func: () => void) {\n await browser.execute(() => { (window as any)._waitingForNavigation = true });\n await browser.execute(func);\n await browser.waitUntil(() => browser.execute(() => !('_waitingForNavigation' in window)));\n}\n\n/** SHA256 hash */\nexport async function hash(content: string|ArrayBufferLike) {\n return crypto.createHash(\"SHA256\")\n .update(typeof content == \"string\" ? content : new Uint8Array(content))\n .digest(\"hex\");\n}\n\n/** Replicate obsidian.normalizePath */\nexport function normalizePath(p: string) {\n p = p.replace(/([\\\\/])+/g, \"/\").replace(/(^\\/+|\\/+$)/g, \"\");\n if (p == \"\") {\n p = \"/\"\n }\n p = p.replace(/\\u00A0|\\u202F/g, \" \"); // replace special space characters\n p = p.normalize(\"NFC\");\n return p;\n}\n\n/**\n * Returns true if child is under parent. returns false if parent == child or child is outside of parent.\n */\nexport function pathIsUnder(parent: string, child: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel != '' && rel.split(path.sep)[0] != \"..\" && !path.isAbsolute(rel)\n}\n\n\n/** Returns true if a vault file path is hidden (either it or one of it's parent directories starts with \".\") */\nexport function isHidden(file: string) {\n return file.split(\"/\").some(p => p.startsWith(\".\"))\n}\n\n/** Returns true if this is a simple text file */\nexport function isText(file: string) {\n return [\".md\", \".json\", \".txt\", \".js\"].includes(path.extname(file).toLocaleLowerCase());\n}\n\n\nexport async function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n\nexport type RetryOpts = {\n retries?: number,\n backoff?: number,\n retryIf?: (error: any) => boolean,\n};\n/** Retries func on error */\nexport async function retry<T>(func: (attempt: number) => Promise<T>|T, opts: RetryOpts = {}): Promise<T> {\n const { retries = 4, backoff = 1000, retryIf = () => true } = opts;\n let attempt = 0;\n let error: any;\n\n while (attempt <= retries) {\n try {\n return await func(attempt);\n } catch (e: any) {\n error = e;\n }\n const delay = backoff*Math.random() + backoff*Math.pow(2, attempt);\n if (!retryIf(error) || attempt >= retries) {\n throw error; // throw without sleeping\n }\n await sleep(delay);\n attempt += 1;\n }\n throw error; // unreachable\n}\n","import { remote } from 'webdriverio'\nimport type { Capabilities } from '@wdio/types'\nimport { ObsidianLauncherService, ObsidianWorkerService } from \"./service.js\"\nimport { ObsidianServiceOptions } from \"./types.js\"\n\n/**\n * Starts an Obsidian instance for WDIO standalone mode.\n * \n * For testing, you'll usually want to use the WDIO testrunner with Mocha, wdio.conf.mts, etc. to launch WDIO. However\n * if you want to use WDIO for some kind of scripting scenario, you can use this function to launch a WDIO standalone\n * session connected to Obsidian.\n * \n * See also: https://webdriver.io/docs/setuptypes/#standalone-mode\n * \n * Example:\n * ```ts\n * const browser = await startWdioSession({\n * capabilities: {\n * browserName: \"obsidian\",\n * browserVersion: \"latest\",\n * 'wdio:obsidianOptions': {\n * installerVersion: \"latest\",\n * vault: \"./test/vaults/basic\",\n * },\n * },\n * });\n * await browser.executeObsidian(({app}) => {\n * // extract some file metadata, edit the vault, etc...\n * });\n * await browser.deleteSession();\n * ```\n * \n * Note that in standalone mode, the global `obsidianPage` instance won't work, you have to use\n * {@link ObsidianBrowserCommands.getObsidianPage | getObsidianPage} to get the page object, e.g.:\n * ```js\n * const obsidianPage = browser.getObsidianPage()\n * ```\n * instead of the \n * @category WDIO Helpers\n */\nexport async function startWdioSession(\n params: Capabilities.WebdriverIOConfig,\n serviceOptions?: ObsidianServiceOptions,\n): Promise<WebdriverIO.Browser> {\n serviceOptions = serviceOptions ?? {};\n const capabilities = params.capabilities as WebdriverIO.Capabilities;\n const launcherService = new ObsidianLauncherService(\n serviceOptions,\n [capabilities] as WebdriverIO.Capabilities,\n params,\n );\n const workerService = new ObsidianWorkerService(serviceOptions, capabilities, params);\n\n await launcherService.onPrepare(params, [capabilities]);\n await workerService.beforeSession(params, capabilities);\n\n const browser = await remote(params);\n\n await workerService.before(capabilities, [], browser);\n\n return browser;\n}\n"],"mappings":"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","names":["types","util","prefix","location","getLogger","originalFactory","parent","ObsidianLauncher","fs","fsAsync","path","crypto","matches","process","prefix","prefix","styles","chalk","styles","parent","safeRegexTest","regex","prefix","log","log2","resolve","fileURLToPath","path","fsAsync","crypto","fileURLToPath","_","browser","path","browser","data","parent","path","resolve","args","_","pluginId","themeName","path","workspacesPath","layout","file","strContent","binContent","parent","fileURLToPath","configDir","id","semver","_","log","path","fileURLToPath","crypto","fs","browser","fsAsync","isAppStorage","width","height","resolve","remote","browser","launcher","ObsidianLauncher"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wdio-obsidian-service",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "A WebdriverIO service for end-to-end testing of Obsidian plugins",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -51,16 +51,16 @@
|
|
|
51
51
|
"@wdio/types": "^9.16.2",
|
|
52
52
|
"chai": "^6.2.2",
|
|
53
53
|
"cross-env": "^10.1.0",
|
|
54
|
-
"mocha": "^
|
|
54
|
+
"mocha": "^11.7.6",
|
|
55
55
|
"ts-node": "^10.9.2",
|
|
56
56
|
"tsup": "^8.5.1",
|
|
57
57
|
"tsx": "4.21.0",
|
|
58
58
|
"typescript": "^5.9.3",
|
|
59
|
-
"wdio-obsidian-reporter": "3.1.
|
|
59
|
+
"wdio-obsidian-reporter": "3.1.1"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"lodash": "^4.17.21",
|
|
63
|
-
"obsidian-launcher": "3.1.
|
|
63
|
+
"obsidian-launcher": "3.1.1",
|
|
64
64
|
"semver": "^7.7.3",
|
|
65
65
|
"tar": "^7.5.3"
|
|
66
66
|
},
|