diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 3dd177b..46097a7 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/packages/obsidian-testing-framework/package.json b/packages/obsidian-testing-framework/package.json index f083f1e..8c02672 100644 --- a/packages/obsidian-testing-framework/package.json +++ b/packages/obsidian-testing-framework/package.json @@ -5,8 +5,10 @@ "@codemirror/language": "https://github.com/lishid/cm-language", "@codemirror/state": "^6.0.1", "@codemirror/view": "^6.0.1", + "@playwright/test": "^1.48.1", "asar": "^3.2.0", "electron": "^33.0.2", + "obsidian": "latest", "playwright": "^1.48.1", "tmp": "^0.2.3", "typescript": "^5.6.3" @@ -34,9 +36,7 @@ "prepublish": "npm run build" }, "devDependencies": { - "@playwright/test": "^1.48.1", "@types/tmp": "^0", - "obsidian": "latest", "vitest": "^2.1.3" }, "type": "module" diff --git a/packages/obsidian-testing-framework/src/index.ts b/packages/obsidian-testing-framework/src/index.ts index afc5af0..488e34e 100644 --- a/packages/obsidian-testing-framework/src/index.ts +++ b/packages/obsidian-testing-framework/src/index.ts @@ -4,7 +4,7 @@ import { Fixtures } from "@playwright/test"; import path from "path"; import { ObsidianTestFixtures } from "./fixtures.js"; 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 { randomBytes } from "crypto"; @@ -47,11 +47,12 @@ function checkToy() { } function generateVaultConfig(vault: string) { - const vaultHash = randomBytes(16).toString("hex").toLocaleLowerCase(); + const vaultHash = randomBytes(8).toString("hex").toLocaleLowerCase(); let configLocation; + console.log("vault is", vault) checkToy(); if (process.platform == "win32") { - configLocation = path.join(`${process.env.LOCALAPPDATA}`, "Obsidian"); + configLocation = path.join(`${process.env.APPDATA}`, "Obsidian"); } else { configLocation = path.join(`${process.env.XDG_CONFIG_HOME}`, "obsidian"); try { @@ -122,7 +123,18 @@ const obsidianTestFixtures: Fixtures = { page = electronApp.windows()[electronApp.windows().length - 1]!; await page.waitForEvent("load"); 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) => { console.log( ...(await Promise.all(msg.args().map((a) => a.jsonValue()))) diff --git a/packages/obsidian-testing-framework/src/tester.ts.not b/packages/obsidian-testing-framework/src/tester.ts.not deleted file mode 100644 index f9c0a70..0000000 --- a/packages/obsidian-testing-framework/src/tester.ts.not +++ /dev/null @@ -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[0]>; -export type TestOptions = Omit & { - vault: string; -}; -export class ObsidianTester { - #loadPromise: Promise; - - public electronApp: ElectronApplication | null = null; - public page: Page; - public app: App; - - constructor(options: Partial) { - 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 - ): Promise { - await this.#loadPromise; - return await callback(this.app); - } - - public async doWithVault( - callback: (vault: Vault) => Promise - ): Promise { - 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 { - 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("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(); - } -} diff --git a/packages/obsidian-testing-framework/src/util.ts b/packages/obsidian-testing-framework/src/util.ts index a36ed44..550ab51 100644 --- a/packages/obsidian-testing-framework/src/util.ts +++ b/packages/obsidian-testing-framework/src/util.ts @@ -1,9 +1,17 @@ import { App, TFile } from "obsidian"; -import { JSHandle, Page } from "playwright"; +import { Page } from "playwright"; import { expect } from "@playwright/test"; -// type TestArgs = Parameters[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( page: Page, path: string, @@ -11,9 +19,20 @@ export async function assertFileEquals( cached: boolean = true ) { const fileContent = await readFile(page, path, cached); - 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( page: Page, path: string, @@ -27,73 +46,122 @@ export async function assertLineEquals( normalizeEOL(expectedContent) ); } -export async function getApp(page: Page): Promise> { - 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( page: Page, - filePath: string, + path: string, start: number, end: number, expected: string, 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 expectedLines = normalizeEOL(expected).split("\n"); expect(lines.every((l, i) => l == expectedLines[i])).toEqual(true); } -export function getFile(app: App, file: string): TFile { - let f = app.vault.getFileByPath(file); +const getFile = (file: string): TFile => { + console.log("gfbp", window.app.vault.getFileByPath, file) + let f = window.app.vault.getFileByPath(file); if (!f) { throw new Error("File does not exist in vault."); } 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} the file's contents + */ export async function readFile( - app: Page, + page: Page, path: string, cached: boolean = true ): Promise { + const fn = getFile.toString(); return normalizeEOL( - await doWithApp(app, (a) => { - const file = getFile(a, path); - return cached ? a.vault.cachedRead(file) : a.vault.read(file); - }) + await doWithApp(page, async (app, args) => { + console.log(args); + 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( +/** + * 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)} callback - the function to execute + * @param {A} [args] - optional arguments to pass to the callback + * @return {*} {Promise} a promise containing `callback`'s return value (if any) + */ +export async function doWithApp( page: Page, - callback: (a: App) => T | Promise + callback: (a: App, args?: A) => T | Promise, + args?: A ): Promise { const cbStr = callback.toString(); - return await page.evaluate(async (cb) => { - const func = new Function(`return (${cb})(window.app)`) - return await func(); - }, cbStr); + return await page.evaluate(async ({__callback: cb, args}) => { + const func = new Function("args", `return ((${cb}))(window.app, args)`) + console.log(func.toString()); + return await func(args); + }, {__callback: cbStr, args}); } -export function waitForIndexingComplete(appHandle: JSHandle) { - return appHandle.evaluate(() => { - return new Promise((res2, rej2) => { - let resolved = false; - app.metadataCache.on("resolved", () => { - res2(null); - resolved = true; +/** + * @internal + */ +export function waitForIndexingComplete(page: Page) { + return page.evaluateHandle("window.app").then((appHandle) => { + return appHandle.evaluate(() => { + 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 = { getFile, -} +}; diff --git a/packages/obsidian-testing-framework/tsconfig.json b/packages/obsidian-testing-framework/tsconfig.json index 2856928..6f9b4a5 100644 --- a/packages/obsidian-testing-framework/tsconfig.json +++ b/packages/obsidian-testing-framework/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ESNext", "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "bundler", "lib": [ "es2015", "DOM", @@ -10,21 +10,17 @@ ], "outDir": "lib", - "baseUrl": ".", - "strict": true, - "alwaysStrict": true, - "strictFunctionTypes": true, - "strictNullChecks": true, + "baseUrl": ".", "strictPropertyInitialization": false, "forceConsistentCasingInFileNames": true, - "noImplicitAny": true, + "noImplicitAny": false, "noImplicitReturns": true, "noImplicitThis": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, "noUnusedParameters": true, - + "resolvePackageJsonExports": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "downlevelIteration": true, diff --git a/packages/obsidian-testing-framework/typings/global.d.ts b/packages/obsidian-testing-framework/typings/global.d.ts index 7626241..06c32f0 100644 --- a/packages/obsidian-testing-framework/typings/global.d.ts +++ b/packages/obsidian-testing-framework/typings/global.d.ts @@ -1,6 +1,7 @@ +import { Funkify } from "@han-moe-htet/funkify"; import {App} from "obsidian"; declare global { var app: App; - var __callback: (app: App) => T; + var __callback: (app: App) => T; } export {} diff --git a/packages/test-project/e2e/example.spec.ts b/packages/test-project/e2e/example.spec.ts index 354c479..25890d8 100644 --- a/packages/test-project/e2e/example.spec.ts +++ b/packages/test-project/e2e/example.spec.ts @@ -1,22 +1,21 @@ import { expect } from '@playwright/test'; 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 }) => { console.log(page.url()); expect(/obsidian\.md/i.test(page.url())).toBeTruthy() }); test("idk", async({page}) => { - console.log("idk") - let what = await doWithApp(page,async (app) => { - 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; + let what = await doWithApp(page, async (app) => { + return app.metadataCache.getFirstLinkpathDest("Welcome", "/"); }); - 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*."); }) diff --git a/packages/test-project/playwright.config.ts b/packages/test-project/playwright.config.ts index 6b2abb8..aa72139 100644 --- a/packages/test-project/playwright.config.ts +++ b/packages/test-project/playwright.config.ts @@ -39,7 +39,6 @@ export default defineConfig({ } }, - /* Configure projects for major browsers */ diff --git a/yarn.lock b/yarn.lock index 4edc161..23538a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -371,6 +371,13 @@ __metadata: languageName: node 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": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -938,6 +945,13 @@ __metadata: languageName: node 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": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -978,7 +992,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.0.0": +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -1026,6 +1040,13 @@ __metadata: languageName: node 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": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -1131,6 +1152,19 @@ __metadata: languageName: node 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": version: 5.1.1 resolution: "chai@npm:5.1.1" @@ -1144,6 +1178,16 @@ __metadata: languageName: node 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": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -1165,6 +1209,13 @@ __metadata: languageName: node 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": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -1211,7 +1262,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -1266,7 +1317,7 @@ __metadata: languageName: node 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 resolution: "define-data-property@npm:1.1.4" dependencies: @@ -1688,6 +1739,15 @@ __metadata: languageName: node 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": version: 3.3.0 resolution: "foreground-child@npm:3.3.0" @@ -1709,6 +1769,18 @@ __metadata: languageName: node 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": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -1833,7 +1905,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.6": +"glob@npm:^7.1.3, glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -1913,14 +1985,21 @@ __metadata: languageName: node 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 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node 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 resolution: "has-property-descriptors@npm:1.0.2" dependencies: @@ -2046,6 +2125,15 @@ __metadata: languageName: node 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": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -2083,6 +2171,22 @@ __metadata: languageName: node 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": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -2110,6 +2214,13 @@ __metadata: languageName: node 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": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -2124,6 +2235,18 @@ __metadata: languageName: node 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": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -2143,6 +2266,26 @@ __metadata: languageName: node 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": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -2152,6 +2295,15 @@ __metadata: languageName: node 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": version: 3.1.2 resolution: "loupe@npm:3.1.2" @@ -2218,7 +2370,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -2260,6 +2412,13 @@ __metadata: languageName: node 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": version: 2.0.1 resolution: "minipass-collect@npm:2.0.1" @@ -2468,11 +2627,14 @@ __metadata: "@codemirror/language": "https://github.com/lishid/cm-language" "@codemirror/state": "npm:^6.0.1" "@codemirror/view": "npm:^6.0.1" + "@han-moe-htet/funkify": "npm:^0.0.1" "@playwright/test": "npm:^1.48.1" "@types/tmp": "npm:^0" asar: "npm:^3.2.0" electron: "npm:^33.0.2" + javascript-stringify: "npm:^2.1.0" obsidian: "npm:latest" + patch-package: "npm:^8.0.0" playwright: "npm:^1.48.1" tmp: "npm:^0.2.3" typescript: "npm:^5.6.3" @@ -2502,6 +2664,23 @@ __metadata: languageName: node 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": version: 2.1.1 resolution: "p-cancelable@npm:2.1.1" @@ -2525,6 +2704,31 @@ __metadata: languageName: node 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": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -2711,6 +2915,17 @@ __metadata: languageName: node 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": version: 2.15.4 resolution: "roarr@npm:2.15.4" @@ -2820,7 +3035,7 @@ __metadata: languageName: node 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 resolution: "semver@npm:7.6.3" bin: @@ -2838,6 +3053,20 @@ __metadata: languageName: node 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": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -2868,6 +3097,13 @@ __metadata: languageName: node 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": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -2996,6 +3232,15 @@ __metadata: languageName: node 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": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -3045,6 +3290,15 @@ __metadata: languageName: node 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": version: 0.2.3 resolution: "tmp@npm:0.2.3" @@ -3165,6 +3419,13 @@ __metadata: languageName: node 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": version: 2.1.3 resolution: "vite-node@npm:2.1.3" @@ -3371,6 +3632,15 @@ __metadata: languageName: node 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": version: 2.10.0 resolution: "yauzl@npm:2.10.0"