more stuff works!
Some checks failed
Playwright Tests / test (push) Failing after 52s

This commit is contained in:
parent f486be9780
commit 0d411428dc
Signed by: tablet
GPG Key ID: 924A5F6AF051E87C
10 changed files with 416 additions and 185 deletions

BIN
.yarn/install-state.gz vendored

Binary file not shown.

@ -5,8 +5,10 @@
"@codemirror/language": "https://github.com/lishid/cm-language", "@codemirror/language": "https://github.com/lishid/cm-language",
"@codemirror/state": "^6.0.1", "@codemirror/state": "^6.0.1",
"@codemirror/view": "^6.0.1", "@codemirror/view": "^6.0.1",
"@playwright/test": "^1.48.1",
"asar": "^3.2.0", "asar": "^3.2.0",
"electron": "^33.0.2", "electron": "^33.0.2",
"obsidian": "latest",
"playwright": "^1.48.1", "playwright": "^1.48.1",
"tmp": "^0.2.3", "tmp": "^0.2.3",
"typescript": "^5.6.3" "typescript": "^5.6.3"
@ -34,9 +36,7 @@
"prepublish": "npm run build" "prepublish": "npm run build"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.48.1",
"@types/tmp": "^0", "@types/tmp": "^0",
"obsidian": "latest",
"vitest": "^2.1.3" "vitest": "^2.1.3"
}, },
"type": "module" "type": "module"

@ -4,7 +4,7 @@ import { Fixtures } from "@playwright/test";
import path from "path"; import path from "path";
import { ObsidianTestFixtures } from "./fixtures.js"; import { ObsidianTestFixtures } from "./fixtures.js";
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
import { getApp, waitForIndexingComplete } from "./util.js"; import { pageUtils, waitForIndexingComplete } from "./util.js";
import { execSync } from "child_process"; import { execSync } from "child_process";
import { randomBytes } from "crypto"; import { randomBytes } from "crypto";
@ -47,11 +47,12 @@ function checkToy() {
} }
function generateVaultConfig(vault: string) { function generateVaultConfig(vault: string) {
const vaultHash = randomBytes(16).toString("hex").toLocaleLowerCase(); const vaultHash = randomBytes(8).toString("hex").toLocaleLowerCase();
let configLocation; let configLocation;
console.log("vault is", vault)
checkToy(); checkToy();
if (process.platform == "win32") { if (process.platform == "win32") {
configLocation = path.join(`${process.env.LOCALAPPDATA}`, "Obsidian"); configLocation = path.join(`${process.env.APPDATA}`, "Obsidian");
} else { } else {
configLocation = path.join(`${process.env.XDG_CONFIG_HOME}`, "obsidian"); configLocation = path.join(`${process.env.XDG_CONFIG_HOME}`, "obsidian");
try { try {
@ -122,7 +123,18 @@ const obsidianTestFixtures: Fixtures<ObsidianTestFixtures> = {
page = electronApp.windows()[electronApp.windows().length - 1]!; page = electronApp.windows()[electronApp.windows().length - 1]!;
await page.waitForEvent("load"); await page.waitForEvent("load");
await page.waitForLoadState("domcontentloaded"); await page.waitForLoadState("domcontentloaded");
await waitForIndexingComplete(await getApp(page)); for(let fn of Object.entries(pageUtils)) {
await page.exposeFunction(fn[0], fn[1]);
}
try {
await waitForIndexingComplete(page);
} catch(e) {
console.warn("timed out waiting for metadata cache. continuing...");
}
page.on("pageerror", exc => {
console.error("EXCEPTION");
console.error(exc);
})
page.on("console", async (msg) => { page.on("console", async (msg) => {
console.log( console.log(
...(await Promise.all(msg.args().map((a) => a.jsonValue()))) ...(await Promise.all(msg.args().map((a) => a.jsonValue())))

@ -1,114 +0,0 @@
import {
_electron,
_electron as electron,
ElectronApplication,
Page,
} from "playwright";
import {expect} from "vitest"
import { App, TFile, Vault } from "obsidian";
import { execSync } from "child_process";
import path from "path";
import { EOL } from "os";
type RawOptions = NonNullable<Parameters<typeof _electron.launch>[0]>;
export type TestOptions = Omit<RawOptions, "executablePath"> & {
vault: string;
};
export class ObsidianTester {
#loadPromise: Promise<void>;
public electronApp: ElectronApplication | null = null;
public page: Page;
public app: App;
constructor(options: Partial<TestOptions & { vault: string }>) {
const args = [...(options.args || [])];
if (options.vault)
args.push(`obsidian://open?vault=${encodeURI(options.vault)}`);
this.#loadPromise = new Promise((res, rej) => {
electron
.launch({
...options,
args,
executablePath: ObsidianTester.getExe(),
})
.then((v) => {
this.postInit(v).then(() => {
res();
});
})
.catch((e) => rej(e));
});
}
public get vault(): Vault {
return this.app.vault
}
public async doWithApp(
callback: (app: App) => Promise<unknown>
): Promise<unknown> {
await this.#loadPromise;
return await callback(this.app);
}
public async doWithVault(
callback: (vault: Vault) => Promise<unknown>
): Promise<unknown> {
await this.#loadPromise;
return await callback(this.app.vault);
}
public async assertFileEquals(path: string, expectedContent: string, cached: boolean = true) {
await this.#loadPromise;
const fileContent = await this.readFile(path, cached);
expect(fileContent).toEqual(this.normalizeEOL(expectedContent));
}
public async assertLineEquals(path: string, lineNumber: number, expectedContent: string, cached: boolean = true) {
await this.#loadPromise;
const fileContent = await this.readFile(path, cached);
expect(fileContent.split("\n")[lineNumber]).toEqual(this.normalizeEOL(expectedContent));
}
public async assertLinesEqual(filePath: string, start: number, end: number, expected: string, cached: boolean = true) {
await this.#loadPromise;
const fileContent = await this.readFile(filePath, cached);
const lines = fileContent.split("\n").slice(start, end);
const expectedLines = this.normalizeEOL(expected).split("\n");
expect(lines.every((l, i) => l == expectedLines[i])).toEqual(true);
}
public getFile(file: string): TFile {
let f = this.app.vault.getFileByPath(file);
if(!f) {
throw new Error("File does not exist in vault.");
}
return f;
}
normalizeEOL(str: string): string {
return str.split(/\r\n|\r|\n/).join("\n");
}
async readFile(path: string, cached: boolean = true): Promise<string> {
await this.#loadPromise;
const file = this.getFile(path);
return this.normalizeEOL(await (cached ? this.app.vault.cachedRead(file) : this.app.vault.read(file)));
}
private async postInit(electronApp: ElectronApplication) {
this.electronApp = electronApp;
this.page = await this.electronApp.firstWindow();
this.app = await this.page.evaluate<App>("window.app");
}
public static getExe(): string {
if (process.platform == "win32") {
return path.join(process.env.LOCALAPPDATA!, "Obsidian", "Obsidian.exe");
}
if (process.platform == "darwin") {
throw new Error("use a non-toy operating system, dumbass");
}
return execSync("command -v obsidian").toString();
}
}

@ -1,9 +1,17 @@
import { App, TFile } from "obsidian"; import { App, TFile } from "obsidian";
import { JSHandle, Page } from "playwright"; import { Page } from "playwright";
import { expect } from "@playwright/test"; import { expect } from "@playwright/test";
// type TestArgs = Parameters<Parameters<typeof test>[2]>[0];
/**
* asserts that the contents of the file at `path` is equal to `expectedContent`.
*
* @export
* @param {Page} page - a Playwright page
* @param {string} path - the file to check
* @param {string} expectedContent - the expected content
* @param {boolean} [cached=true] - whether to use `app.vault.cachedRead`
*/
export async function assertFileEquals( export async function assertFileEquals(
page: Page, page: Page,
path: string, path: string,
@ -11,9 +19,20 @@ export async function assertFileEquals(
cached: boolean = true cached: boolean = true
) { ) {
const fileContent = await readFile(page, path, cached); const fileContent = await readFile(page, path, cached);
expect(fileContent).toEqual(normalizeEOL(expectedContent)); expect(fileContent).toEqual(normalizeEOL(expectedContent));
} }
/**
* asserts that the line at `lineNumber` in the file at `path` is equal
* to `expectedContent`.
*
* @export
* @param {Page} page - a Playwright page
* @param {string} path - the file to check
* @param {number} lineNumber - the line in the file to check (0-based)
* @param {string} expectedContent - the expected content
* @param {boolean} [cached=true] - whether to use `app.vault.cachedRead`
*/
export async function assertLineEquals( export async function assertLineEquals(
page: Page, page: Page,
path: string, path: string,
@ -27,73 +46,122 @@ export async function assertLineEquals(
normalizeEOL(expectedContent) normalizeEOL(expectedContent)
); );
} }
export async function getApp(page: Page): Promise<JSHandle<App>> {
return await page.evaluateHandle("window.app");
}
/**
* asserts that the lines in the specified range are equal to the expected
* content.
*
* @export
* @param {Page} page - a Playwright page
* @param {string} path the file to check
* @param {number} start - the start of the desired line range (0-based)
* @param {number} end - the end of the desired line range (1-based)
* @param {string} expected the expected content
* @param {boolean} [cached=true] - whether to use `app.vault.cachedRead`
*/
export async function assertLinesEqual( export async function assertLinesEqual(
page: Page, page: Page,
filePath: string, path: string,
start: number, start: number,
end: number, end: number,
expected: string, expected: string,
cached: boolean = true cached: boolean = true
) { ) {
const fileContent = await readFile(page, filePath, cached); const fileContent = await readFile(page, path, cached);
const lines = fileContent.split("\n").slice(start, end); const lines = fileContent.split("\n").slice(start, end);
const expectedLines = normalizeEOL(expected).split("\n"); const expectedLines = normalizeEOL(expected).split("\n");
expect(lines.every((l, i) => l == expectedLines[i])).toEqual(true); expect(lines.every((l, i) => l == expectedLines[i])).toEqual(true);
} }
export function getFile(app: App, file: string): TFile { const getFile = (file: string): TFile => {
let f = app.vault.getFileByPath(file); console.log("gfbp", window.app.vault.getFileByPath, file)
let f = window.app.vault.getFileByPath(file);
if (!f) { if (!f) {
throw new Error("File does not exist in vault."); throw new Error("File does not exist in vault.");
} }
return f; return f;
} }
function normalizeEOL(str: string): string { /**
return str.split(/\r\n|\r|\n/).join("\n"); * reads the file at `path` and returns its contents
} *
* @export
* @param {Page} page - a Playwright page
* @param {string} path the file to read
* @param {boolean} [cached=true] - whether to use `app.vault.cachedRead`
* @return {*} {Promise<string>} the file's contents
*/
export async function readFile( export async function readFile(
app: Page, page: Page,
path: string, path: string,
cached: boolean = true cached: boolean = true
): Promise<string> { ): Promise<string> {
const fn = getFile.toString();
return normalizeEOL( return normalizeEOL(
await doWithApp(app, (a) => { await doWithApp(page, async (app, args) => {
const file = getFile(a, path); console.log(args);
return cached ? a.vault.cachedRead(file) : a.vault.read(file); console.log(app.vault.getFileByPath)
}) const gf = eval(`(${args.getFile})`);
console.log("file", gf);
const file = (eval(args.getFile))(args.path);
return await (args.cached ? app.vault.cachedRead(file) : app.vault.read(file));
}, {path, cached, getFile: fn})
); );
} }
export async function doWithApp<T = unknown>( /**
* do something with the global `App` instance,
* and return the result of that invocation
*
* @export
* @typeParam - T the return type of the callback
* @typeParam - A the additional argument(s) to pass
* @param {Page} page - a Playwright page
* @param {((a: App, args?: A) => T | Promise<T>)} callback - the function to execute
* @param {A} [args] - optional arguments to pass to the callback
* @return {*} {Promise<T>} a promise containing `callback`'s return value (if any)
*/
export async function doWithApp<T = unknown, A = any>(
page: Page, page: Page,
callback: (a: App) => T | Promise<T> callback: (a: App, args?: A) => T | Promise<T>,
args?: A
): Promise<T> { ): Promise<T> {
const cbStr = callback.toString(); const cbStr = callback.toString();
return await page.evaluate<T, string>(async (cb) => { return await page.evaluate<T, {__callback: string, args: A}>(async ({__callback: cb, args}) => {
const func = new Function(`return (${cb})(window.app)`) const func = new Function("args", `return ((${cb}))(window.app, args)`)
return await func(); console.log(func.toString());
}, cbStr); return await func(args);
}, {__callback: cbStr, args});
} }
export function waitForIndexingComplete(appHandle: JSHandle<App>) { /**
return appHandle.evaluate(() => { * @internal
return new Promise((res2, rej2) => { */
let resolved = false; export function waitForIndexingComplete(page: Page) {
app.metadataCache.on("resolved", () => { return page.evaluateHandle<App>("window.app").then((appHandle) => {
res2(null); return appHandle.evaluate(() => {
resolved = true; return new Promise((res2, rej2) => {
let resolved = false;
app.metadataCache.on("resolved", () => {
res2(null);
resolved = true;
});
setTimeout(() => !resolved && rej2("timeout"), 10000);
}); });
setTimeout(() => !resolved && rej2("timeout"), 10000);
}); });
}); });
} }
/**
* @internal
*/
function normalizeEOL(str: string): string {
return str.split(/\r\n|\r|\n/).join("\n");
}
/**
* @internal
*/
export const pageUtils = { export const pageUtils = {
getFile, getFile,
} };

@ -2,7 +2,7 @@
"compilerOptions": { "compilerOptions": {
"target": "ESNext", "target": "ESNext",
"module": "ESNext", "module": "ESNext",
"moduleResolution": "Node", "moduleResolution": "bundler",
"lib": [ "lib": [
"es2015", "es2015",
"DOM", "DOM",
@ -10,21 +10,17 @@
], ],
"outDir": "lib", "outDir": "lib",
"baseUrl": ".", "baseUrl": ".",
"strict": true,
"alwaysStrict": true,
"strictFunctionTypes": true,
"strictNullChecks": true,
"strictPropertyInitialization": false, "strictPropertyInitialization": false,
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"noImplicitAny": true, "noImplicitAny": false,
"noImplicitReturns": true, "noImplicitReturns": true,
"noImplicitThis": true, "noImplicitThis": true,
"noFallthroughCasesInSwitch": true, "noFallthroughCasesInSwitch": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"resolvePackageJsonExports": true,
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"downlevelIteration": true, "downlevelIteration": true,

@ -1,6 +1,7 @@
import { Funkify } from "@han-moe-htet/funkify";
import {App} from "obsidian"; import {App} from "obsidian";
declare global { declare global {
var app: App; var app: App;
var __callback: <T>(app: App) => T; var __callback: <T>(app: App) => T;
} }
export {} export {}

@ -1,22 +1,21 @@
import { expect } from '@playwright/test'; import { expect } from '@playwright/test';
import {test} from "obsidian-testing-framework" import {test} from "obsidian-testing-framework"
import {doWithApp, getApp} from "obsidian-testing-framework/utils"; import {TFile} from "obsidian";
import {assertLineEquals, doWithApp, readFile} from "obsidian-testing-framework/utils";
test('something', async ({ page }) => { test('something', async ({ page }) => {
console.log(page.url()); console.log(page.url());
expect(/obsidian\.md/i.test(page.url())).toBeTruthy() expect(/obsidian\.md/i.test(page.url())).toBeTruthy()
}); });
test("idk", async({page}) => { test("idk", async({page}) => {
console.log("idk") let what = await doWithApp<TFile | null>(page, async (app) => {
let what = await doWithApp(page,async (app) => { return app.metadataCache.getFirstLinkpathDest("Welcome", "/");
console.log("hi", Object.keys(app), (app.metadataCache));
let thing = app.metadataCache.getFirstLinkpathDest("Welcome", "/");
console.log("THING", thing);
await new Promise(res => setTimeout(res, 5000))
console.log(thing?.path);
const what = {...thing};
delete what.parent;
delete what.vault;
return what;
}); });
expect(what.basename).toEqual("Welcome") // console.log("WHAT", what)
// console.log(what?.vault)
expect(what?.basename).toEqual("Welcome")
})
test("file line", async({page}) => {
console.log(await readFile(page, "Welcome.md"))
await assertLineEquals(page, "Welcome.md", 0, "This is your new *vault*.");
}) })

@ -39,7 +39,6 @@ export default defineConfig<ObsidianTestFixtures>({
} }
}, },
/* Configure projects for major browsers */ /* Configure projects for major browsers */

286
yarn.lock

@ -371,6 +371,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@han-moe-htet/funkify@npm:^0.0.1":
version: 0.0.1
resolution: "@han-moe-htet/funkify@npm:0.0.1"
checksum: 10c0/5d7380fc8bc73d16c9d362374b28ca3fe03a3f69693025bccf64c2bf56bd5eb9dfe559a4c70f5381b9f4b61c6d42fa79aebfb16702339ae6c3d6dfe68d33f714
languageName: node
linkType: hard
"@isaacs/cliui@npm:^8.0.2": "@isaacs/cliui@npm:^8.0.2":
version: 8.0.2 version: 8.0.2
resolution: "@isaacs/cliui@npm:8.0.2" resolution: "@isaacs/cliui@npm:8.0.2"
@ -938,6 +945,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@yarnpkg/lockfile@npm:^1.1.0":
version: 1.1.0
resolution: "@yarnpkg/lockfile@npm:1.1.0"
checksum: 10c0/0bfa50a3d756623d1f3409bc23f225a1d069424dbc77c6fd2f14fb377390cd57ec703dc70286e081c564be9051ead9ba85d81d66a3e68eeb6eb506d4e0c0fbda
languageName: node
linkType: hard
"abbrev@npm:^2.0.0": "abbrev@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "abbrev@npm:2.0.0" resolution: "abbrev@npm:2.0.0"
@ -978,7 +992,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ansi-styles@npm:^4.0.0": "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0":
version: 4.3.0 version: 4.3.0
resolution: "ansi-styles@npm:4.3.0" resolution: "ansi-styles@npm:4.3.0"
dependencies: dependencies:
@ -1026,6 +1040,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"at-least-node@npm:^1.0.0":
version: 1.0.0
resolution: "at-least-node@npm:1.0.0"
checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef
languageName: node
linkType: hard
"balanced-match@npm:^1.0.0": "balanced-match@npm:^1.0.0":
version: 1.0.2 version: 1.0.2
resolution: "balanced-match@npm:1.0.2" resolution: "balanced-match@npm:1.0.2"
@ -1131,6 +1152,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"call-bind@npm:^1.0.5":
version: 1.0.7
resolution: "call-bind@npm:1.0.7"
dependencies:
es-define-property: "npm:^1.0.0"
es-errors: "npm:^1.3.0"
function-bind: "npm:^1.1.2"
get-intrinsic: "npm:^1.2.4"
set-function-length: "npm:^1.2.1"
checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d
languageName: node
linkType: hard
"chai@npm:^5.1.1": "chai@npm:^5.1.1":
version: 5.1.1 version: 5.1.1
resolution: "chai@npm:5.1.1" resolution: "chai@npm:5.1.1"
@ -1144,6 +1178,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"chalk@npm:^4.1.2":
version: 4.1.2
resolution: "chalk@npm:4.1.2"
dependencies:
ansi-styles: "npm:^4.1.0"
supports-color: "npm:^7.1.0"
checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880
languageName: node
linkType: hard
"check-error@npm:^2.1.1": "check-error@npm:^2.1.1":
version: 2.1.1 version: 2.1.1
resolution: "check-error@npm:2.1.1" resolution: "check-error@npm:2.1.1"
@ -1165,6 +1209,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ci-info@npm:^3.7.0":
version: 3.9.0
resolution: "ci-info@npm:3.9.0"
checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a
languageName: node
linkType: hard
"clean-stack@npm:^2.0.0": "clean-stack@npm:^2.0.0":
version: 2.2.0 version: 2.2.0
resolution: "clean-stack@npm:2.2.0" resolution: "clean-stack@npm:2.2.0"
@ -1211,7 +1262,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"cross-spawn@npm:^7.0.0": "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3":
version: 7.0.3 version: 7.0.3
resolution: "cross-spawn@npm:7.0.3" resolution: "cross-spawn@npm:7.0.3"
dependencies: dependencies:
@ -1266,7 +1317,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"define-data-property@npm:^1.0.1": "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4":
version: 1.1.4 version: 1.1.4
resolution: "define-data-property@npm:1.1.4" resolution: "define-data-property@npm:1.1.4"
dependencies: dependencies:
@ -1688,6 +1739,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"find-yarn-workspace-root@npm:^2.0.0":
version: 2.0.0
resolution: "find-yarn-workspace-root@npm:2.0.0"
dependencies:
micromatch: "npm:^4.0.2"
checksum: 10c0/b0d3843013fbdaf4e57140e0165889d09fa61745c9e85da2af86e54974f4cc9f1967e40f0d8fc36a79d53091f0829c651d06607d552582e53976f3cd8f4e5689
languageName: node
linkType: hard
"foreground-child@npm:^3.1.0": "foreground-child@npm:^3.1.0":
version: 3.3.0 version: 3.3.0
resolution: "foreground-child@npm:3.3.0" resolution: "foreground-child@npm:3.3.0"
@ -1709,6 +1769,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"fs-extra@npm:^9.0.0":
version: 9.1.0
resolution: "fs-extra@npm:9.1.0"
dependencies:
at-least-node: "npm:^1.0.0"
graceful-fs: "npm:^4.2.0"
jsonfile: "npm:^6.0.1"
universalify: "npm:^2.0.0"
checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92
languageName: node
linkType: hard
"fs-minipass@npm:^2.0.0": "fs-minipass@npm:^2.0.0":
version: 2.1.0 version: 2.1.0
resolution: "fs-minipass@npm:2.1.0" resolution: "fs-minipass@npm:2.1.0"
@ -1833,7 +1905,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"glob@npm:^7.1.6": "glob@npm:^7.1.3, glob@npm:^7.1.6":
version: 7.2.3 version: 7.2.3
resolution: "glob@npm:7.2.3" resolution: "glob@npm:7.2.3"
dependencies: dependencies:
@ -1913,14 +1985,21 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": "graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6":
version: 4.2.11 version: 4.2.11
resolution: "graceful-fs@npm:4.2.11" resolution: "graceful-fs@npm:4.2.11"
checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2
languageName: node languageName: node
linkType: hard linkType: hard
"has-property-descriptors@npm:^1.0.0": "has-flag@npm:^4.0.0":
version: 4.0.0
resolution: "has-flag@npm:4.0.0"
checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1
languageName: node
linkType: hard
"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2":
version: 1.0.2 version: 1.0.2
resolution: "has-property-descriptors@npm:1.0.2" resolution: "has-property-descriptors@npm:1.0.2"
dependencies: dependencies:
@ -2046,6 +2125,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"is-docker@npm:^2.0.0":
version: 2.2.1
resolution: "is-docker@npm:2.2.1"
bin:
is-docker: cli.js
checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc
languageName: node
linkType: hard
"is-extglob@npm:^2.1.1": "is-extglob@npm:^2.1.1":
version: 2.1.1 version: 2.1.1
resolution: "is-extglob@npm:2.1.1" resolution: "is-extglob@npm:2.1.1"
@ -2083,6 +2171,22 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"is-wsl@npm:^2.1.1":
version: 2.2.0
resolution: "is-wsl@npm:2.2.0"
dependencies:
is-docker: "npm:^2.0.0"
checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e
languageName: node
linkType: hard
"isarray@npm:^2.0.5":
version: 2.0.5
resolution: "isarray@npm:2.0.5"
checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd
languageName: node
linkType: hard
"isexe@npm:^2.0.0": "isexe@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "isexe@npm:2.0.0" resolution: "isexe@npm:2.0.0"
@ -2110,6 +2214,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"javascript-stringify@npm:^2.1.0":
version: 2.1.0
resolution: "javascript-stringify@npm:2.1.0"
checksum: 10c0/374e74ebff29b94de78da39daa6e530999c58a145aeb293dc21180c4584459b14d9e5721d9bc6ed4eba319c437ef0145c157c946b70ecddcff6668682a002bcc
languageName: node
linkType: hard
"jsbn@npm:1.1.0": "jsbn@npm:1.1.0":
version: 1.1.0 version: 1.1.0
resolution: "jsbn@npm:1.1.0" resolution: "jsbn@npm:1.1.0"
@ -2124,6 +2235,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"json-stable-stringify@npm:^1.0.2":
version: 1.1.1
resolution: "json-stable-stringify@npm:1.1.1"
dependencies:
call-bind: "npm:^1.0.5"
isarray: "npm:^2.0.5"
jsonify: "npm:^0.0.1"
object-keys: "npm:^1.1.1"
checksum: 10c0/3801e3eeccbd030afb970f54bea690a079cfea7d9ed206a1b17ca9367f4b7772c764bf77a48f03e56b50e5f7ee7d11c52339fe20d8d7ccead003e4ca69e4cfde
languageName: node
linkType: hard
"json-stringify-safe@npm:^5.0.1": "json-stringify-safe@npm:^5.0.1":
version: 5.0.1 version: 5.0.1
resolution: "json-stringify-safe@npm:5.0.1" resolution: "json-stringify-safe@npm:5.0.1"
@ -2143,6 +2266,26 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"jsonfile@npm:^6.0.1":
version: 6.1.0
resolution: "jsonfile@npm:6.1.0"
dependencies:
graceful-fs: "npm:^4.1.6"
universalify: "npm:^2.0.0"
dependenciesMeta:
graceful-fs:
optional: true
checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865
languageName: node
linkType: hard
"jsonify@npm:^0.0.1":
version: 0.0.1
resolution: "jsonify@npm:0.0.1"
checksum: 10c0/7f5499cdd59a0967ed35bda48b7cec43d850bbc8fb955cdd3a1717bb0efadbe300724d5646de765bb7a99fc1c3ab06eb80d93503c6faaf99b4ff50a3326692f6
languageName: node
linkType: hard
"keyv@npm:^4.0.0": "keyv@npm:^4.0.0":
version: 4.5.4 version: 4.5.4
resolution: "keyv@npm:4.5.4" resolution: "keyv@npm:4.5.4"
@ -2152,6 +2295,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"klaw-sync@npm:^6.0.0":
version: 6.0.0
resolution: "klaw-sync@npm:6.0.0"
dependencies:
graceful-fs: "npm:^4.1.11"
checksum: 10c0/00d8e4c48d0d699b743b3b028e807295ea0b225caf6179f51029e19783a93ad8bb9bccde617d169659fbe99559d73fb35f796214de031d0023c26b906cecd70a
languageName: node
linkType: hard
"loupe@npm:^3.1.0, loupe@npm:^3.1.1": "loupe@npm:^3.1.0, loupe@npm:^3.1.1":
version: 3.1.2 version: 3.1.2
resolution: "loupe@npm:3.1.2" resolution: "loupe@npm:3.1.2"
@ -2218,7 +2370,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"micromatch@npm:^4.0.4": "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4":
version: 4.0.8 version: 4.0.8
resolution: "micromatch@npm:4.0.8" resolution: "micromatch@npm:4.0.8"
dependencies: dependencies:
@ -2260,6 +2412,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"minimist@npm:^1.2.6":
version: 1.2.8
resolution: "minimist@npm:1.2.8"
checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6
languageName: node
linkType: hard
"minipass-collect@npm:^2.0.1": "minipass-collect@npm:^2.0.1":
version: 2.0.1 version: 2.0.1
resolution: "minipass-collect@npm:2.0.1" resolution: "minipass-collect@npm:2.0.1"
@ -2468,11 +2627,14 @@ __metadata:
"@codemirror/language": "https://github.com/lishid/cm-language" "@codemirror/language": "https://github.com/lishid/cm-language"
"@codemirror/state": "npm:^6.0.1" "@codemirror/state": "npm:^6.0.1"
"@codemirror/view": "npm:^6.0.1" "@codemirror/view": "npm:^6.0.1"
"@han-moe-htet/funkify": "npm:^0.0.1"
"@playwright/test": "npm:^1.48.1" "@playwright/test": "npm:^1.48.1"
"@types/tmp": "npm:^0" "@types/tmp": "npm:^0"
asar: "npm:^3.2.0" asar: "npm:^3.2.0"
electron: "npm:^33.0.2" electron: "npm:^33.0.2"
javascript-stringify: "npm:^2.1.0"
obsidian: "npm:latest" obsidian: "npm:latest"
patch-package: "npm:^8.0.0"
playwright: "npm:^1.48.1" playwright: "npm:^1.48.1"
tmp: "npm:^0.2.3" tmp: "npm:^0.2.3"
typescript: "npm:^5.6.3" typescript: "npm:^5.6.3"
@ -2502,6 +2664,23 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"open@npm:^7.4.2":
version: 7.4.2
resolution: "open@npm:7.4.2"
dependencies:
is-docker: "npm:^2.0.0"
is-wsl: "npm:^2.1.1"
checksum: 10c0/77573a6a68f7364f3a19a4c80492712720746b63680ee304555112605ead196afe91052bd3c3d165efdf4e9d04d255e87de0d0a77acec11ef47fd5261251813f
languageName: node
linkType: hard
"os-tmpdir@npm:~1.0.2":
version: 1.0.2
resolution: "os-tmpdir@npm:1.0.2"
checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990
languageName: node
linkType: hard
"p-cancelable@npm:^2.0.0": "p-cancelable@npm:^2.0.0":
version: 2.1.1 version: 2.1.1
resolution: "p-cancelable@npm:2.1.1" resolution: "p-cancelable@npm:2.1.1"
@ -2525,6 +2704,31 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"patch-package@npm:^8.0.0":
version: 8.0.0
resolution: "patch-package@npm:8.0.0"
dependencies:
"@yarnpkg/lockfile": "npm:^1.1.0"
chalk: "npm:^4.1.2"
ci-info: "npm:^3.7.0"
cross-spawn: "npm:^7.0.3"
find-yarn-workspace-root: "npm:^2.0.0"
fs-extra: "npm:^9.0.0"
json-stable-stringify: "npm:^1.0.2"
klaw-sync: "npm:^6.0.0"
minimist: "npm:^1.2.6"
open: "npm:^7.4.2"
rimraf: "npm:^2.6.3"
semver: "npm:^7.5.3"
slash: "npm:^2.0.0"
tmp: "npm:^0.0.33"
yaml: "npm:^2.2.2"
bin:
patch-package: index.js
checksum: 10c0/690eab0537e953a3fd7d32bb23f0e82f97cd448f8244c3227ed55933611a126f9476397325c06ad2c11d881a19b427a02bd1881bee78d89f1731373fc4fe0fee
languageName: node
linkType: hard
"path-is-absolute@npm:^1.0.0": "path-is-absolute@npm:^1.0.0":
version: 1.0.1 version: 1.0.1
resolution: "path-is-absolute@npm:1.0.1" resolution: "path-is-absolute@npm:1.0.1"
@ -2711,6 +2915,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"rimraf@npm:^2.6.3":
version: 2.7.1
resolution: "rimraf@npm:2.7.1"
dependencies:
glob: "npm:^7.1.3"
bin:
rimraf: ./bin.js
checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40
languageName: node
linkType: hard
"roarr@npm:^2.15.3": "roarr@npm:^2.15.3":
version: 2.15.4 version: 2.15.4
resolution: "roarr@npm:2.15.4" resolution: "roarr@npm:2.15.4"
@ -2820,7 +3035,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7": "semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3":
version: 7.6.3 version: 7.6.3
resolution: "semver@npm:7.6.3" resolution: "semver@npm:7.6.3"
bin: bin:
@ -2838,6 +3053,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"set-function-length@npm:^1.2.1":
version: 1.2.2
resolution: "set-function-length@npm:1.2.2"
dependencies:
define-data-property: "npm:^1.1.4"
es-errors: "npm:^1.3.0"
function-bind: "npm:^1.1.2"
get-intrinsic: "npm:^1.2.4"
gopd: "npm:^1.0.1"
has-property-descriptors: "npm:^1.0.2"
checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c
languageName: node
linkType: hard
"shebang-command@npm:^2.0.0": "shebang-command@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "shebang-command@npm:2.0.0" resolution: "shebang-command@npm:2.0.0"
@ -2868,6 +3097,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"slash@npm:^2.0.0":
version: 2.0.0
resolution: "slash@npm:2.0.0"
checksum: 10c0/f83dbd3cb62c41bb8fcbbc6bf5473f3234b97fa1d008f571710a9d3757a28c7169e1811cad1554ccb1cc531460b3d221c9a7b37f549398d9a30707f0a5af9193
languageName: node
linkType: hard
"slash@npm:^3.0.0": "slash@npm:^3.0.0":
version: 3.0.0 version: 3.0.0
resolution: "slash@npm:3.0.0" resolution: "slash@npm:3.0.0"
@ -2996,6 +3232,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"supports-color@npm:^7.1.0":
version: 7.2.0
resolution: "supports-color@npm:7.2.0"
dependencies:
has-flag: "npm:^4.0.0"
checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124
languageName: node
linkType: hard
"tar@npm:^6.1.11, tar@npm:^6.2.1": "tar@npm:^6.1.11, tar@npm:^6.2.1":
version: 6.2.1 version: 6.2.1
resolution: "tar@npm:6.2.1" resolution: "tar@npm:6.2.1"
@ -3045,6 +3290,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tmp@npm:^0.0.33":
version: 0.0.33
resolution: "tmp@npm:0.0.33"
dependencies:
os-tmpdir: "npm:~1.0.2"
checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408
languageName: node
linkType: hard
"tmp@npm:^0.2.3": "tmp@npm:^0.2.3":
version: 0.2.3 version: 0.2.3
resolution: "tmp@npm:0.2.3" resolution: "tmp@npm:0.2.3"
@ -3165,6 +3419,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"universalify@npm:^2.0.0":
version: 2.0.1
resolution: "universalify@npm:2.0.1"
checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a
languageName: node
linkType: hard
"vite-node@npm:2.1.3": "vite-node@npm:2.1.3":
version: 2.1.3 version: 2.1.3
resolution: "vite-node@npm:2.1.3" resolution: "vite-node@npm:2.1.3"
@ -3371,6 +3632,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"yaml@npm:^2.2.2":
version: 2.6.0
resolution: "yaml@npm:2.6.0"
bin:
yaml: bin.mjs
checksum: 10c0/9e74cdb91cc35512a1c41f5ce509b0e93cc1d00eff0901e4ba831ee75a71ddf0845702adcd6f4ee6c811319eb9b59653248462ab94fa021ab855543a75396ceb
languageName: node
linkType: hard
"yauzl@npm:^2.10.0": "yauzl@npm:^2.10.0":
version: 2.10.0 version: 2.10.0
resolution: "yauzl@npm:2.10.0" resolution: "yauzl@npm:2.10.0"