From 15640ae08466bf8fb59cea250f958481872919c9 Mon Sep 17 00:00:00 2001 From: Graham Barber Date: Wed, 19 Mar 2025 17:18:09 -0700 Subject: [PATCH] initial working version --- cmd/build.ts | 70 +++++ cmd/bump.ts | 50 ++++ cmd/install.ts | 99 +++++++ cmd/uninstall.ts | 99 +++++++ deno.json | 7 + deno.lock | 711 +++++++++++++++++++++++++++++++++++++++++++++++ main.ts | 42 +++ 7 files changed, 1078 insertions(+) create mode 100644 cmd/build.ts create mode 100644 cmd/bump.ts create mode 100644 cmd/install.ts create mode 100644 cmd/uninstall.ts create mode 100644 deno.json create mode 100644 deno.lock create mode 100644 main.ts diff --git a/cmd/build.ts b/cmd/build.ts new file mode 100644 index 0000000..633ff16 --- /dev/null +++ b/cmd/build.ts @@ -0,0 +1,70 @@ +import builtins from "npm:builtin-modules"; +import { build } from "npm:vite"; +import deno from "npm:@deno/vite-plugin"; +import banner from "npm:vite-plugin-banner"; +import { resolve } from "jsr:@std/path"; +import { wait } from "jsr:@denosaurs/wait"; + +interface BuildArgs { + production?: boolean; + watch?: boolean; + pluginDir?: string; +} + +const bannerContent = `/* +* THIS IS A GENERATED/BUNDLED FILE BY VITE +* if you want to view the source, please visit the github repository of this plugin +*/ +`; + +export async function buildPlugin(args: BuildArgs) { + const spinner = wait("Building plugin TypeScript").start(); + const cwd = args.pluginDir ? resolve(Deno.cwd(), args.pluginDir) : Deno.cwd(); + + await build({ + root: cwd, + plugins: [deno(), banner(bannerContent)], + logLevel: "error", + build: { + watch: args.watch ? {} : undefined, + lib: { + entry: resolve(cwd, "main.ts"), + name: "main", + fileName: () => "main.js", + formats: ["cjs"], + }, + minify: args.production || false, + sourcemap: args.production ? "inline" : false, + cssCodeSplit: false, + emptyOutDir: false, + outDir: ".", + rollupOptions: { + input: { + main: resolve(cwd, "main.ts"), + }, + output: { + entryFileNames: "main.js", + assetFileNames: "styles.css", + }, + external: [ + "obsidian", + "electron", + "@codemirror/autocomplete", + "@codemirror/collab", + "@codemirror/commands", + "@codemirror/language", + "@codemirror/lint", + "@codemirror/search", + "@codemirror/state", + "@codemirror/view", + "@lezer/common", + "@lezer/highlight", + "@lezer/lr", + ...builtins, + ], + }, + }, + }); + + spinner.succeed("Build successful"); +} diff --git a/cmd/bump.ts b/cmd/bump.ts new file mode 100644 index 0000000..75bcc9f --- /dev/null +++ b/cmd/bump.ts @@ -0,0 +1,50 @@ +import { resolve } from "jsr:@std/path"; +import { format, parse } from "jsr:@std/semver"; + +interface BumpArgs { + pluginDir?: string; +} + +export async function bumpVersion( + args: BumpArgs, + level: "patch" | "minor" | "major", +) { + console.info("Bumping plugin version. Checking for required files"); + const cwd = args.pluginDir ? resolve(Deno.cwd(), args.pluginDir) : Deno.cwd(); + const manifestPath = resolve(cwd, "manifest.json"); + const versionsPath = resolve(cwd, "versions.json"); + + const manifestText = await Deno.readTextFile(manifestPath); + const manifest = JSON.parse(manifestText); + const versionsText = await Deno.readTextFile(versionsPath); + const versions = JSON.parse(versionsText); + + const appSemver = parse(manifest.version); + + appSemver[level] += 1; + + const newVersion = format(appSemver); + const newMinAppVersion = manifest.minAppVersion; + + // Write new manifest + manifest.version = newVersion; + const newManifest = JSON.stringify(manifest, null, "\t"); + + // Write new minimum version, if required + if (!(Object.values(versions).includes(manifest.minAppVersion))) { + console.info( + "Minimum app version updated. Writing to versions file", + ); + + versions[newVersion] = newMinAppVersion; + const newVersions = JSON.stringify(versions, null, "\t"); + + await Deno.writeTextFile(versionsPath, newVersions); + } + + console.info("Writing version to manifest"); + + await Deno.writeTextFile(manifestPath, newManifest); + + console.log(`Bumped ${manifest.name} to version ${newVersion}`); +} diff --git a/cmd/install.ts b/cmd/install.ts new file mode 100644 index 0000000..32cd736 --- /dev/null +++ b/cmd/install.ts @@ -0,0 +1,99 @@ +import { resolve } from "jsr:@std/path"; +import { buildPlugin } from "./build.ts"; +import { exists } from "jsr:@std/fs"; + +interface InstallArgs { + pluginDir?: string; + production?: boolean; +} + +export async function installPlugin(args: InstallArgs, vault: string) { + console.info("Building plugin"); + await buildPlugin(args); + + const cwd = args.pluginDir ? resolve(Deno.cwd(), args.pluginDir) : Deno.cwd(); + const manifestPath = resolve(cwd, "manifest.json"); + const versionsPath = resolve(cwd, "versions.json"); + + const manifestText = await Deno.readTextFile(manifestPath); + const manifest = JSON.parse(manifestText); + + const jsPath = resolve(cwd, "main.js;"); + const vaultPath = resolve(cwd, vault); + const pluginPath = resolve( + vaultPath, + ".obsidian", + "plugins", + manifest.id, + ); + + console.info("Verifying required paths"); + try { + await Promise.allSettled([ + Deno.lstat(jsPath), + Deno.lstat(manifestPath), + Deno.lstat(versionsPath), + Deno.lstat(resolve(vaultPath, ".obsidian")), + ]); + } catch (err) { + if (err instanceof Deno.errors.NotFound) { + console.info( + "Failed to find the specified vault or one of the required main.js, versions.json, and manifest.json files", + ); + console.error(err.message); + Deno.exit(1); + } + + throw err; + } + + if (await exists(pluginPath, { isDirectory: true })) { + console.info( + `Vault already has plugin ${manifest.name} installed. Aborting`, + ); + Deno.exit(0); + } + + console.info("Creating plugin directory"); + + try { + await Deno.mkdir(pluginPath, { recursive: true }); + } catch (err) { + if (!(err instanceof Deno.errors.AlreadyExists)) { + throw err; + } + + console.info("Plugin directory already exists. Continuing"); + } + + console.info("Creating symbolic links"); + try { + await Promise.all([ + Deno.symlink( + manifestPath, + resolve(pluginPath, "manifest.json"), + { type: "file" }, + ), + Deno.symlink( + versionsPath, + resolve(pluginPath, "versions.json"), + { type: "file" }, + ), + Deno.symlink( + jsPath, + resolve(pluginPath, "main.js"), + { type: "file" }, + ), + ]); + } catch (err) { + throw err; + } + + const kv = await Deno.openKv(); + await kv.set( + ["installed-plugins", manifest.id, vaultPath], + vaultPath, + ); + + console.log("Plugin has been installed in the specified vault"); +} diff --git a/cmd/uninstall.ts b/cmd/uninstall.ts new file mode 100644 index 0000000..a52859e --- /dev/null +++ b/cmd/uninstall.ts @@ -0,0 +1,99 @@ +import { resolve } from "jsr:@std/path"; +import { Confirm } from "jsr:@cliffy/prompt@1.0.0-rc.7/confirm"; +import { Select } from "jsr:@cliffy/prompt@1.0.0-rc.7/select"; + +interface UninstallArgs { + yes?: boolean; + pluginDir?: string; +} + +async function confirmUninstall() { + const consent = await Confirm.prompt({ + message: + `Uninstalling this plugin will remove all files associated with this plugin from the specified vault. Your settings cannot be recovered! + +If you are okay with this, please confirm:`, + default: false, + }); + + if (!consent) { + console.info("Aborting uninstallation"); + Deno.exit(0); + } else { + console.info("Uninstallation confirmed. Continuing"); + } +} + +export async function uninstallPlugin(args: UninstallArgs, vault?: string) { + const cwd = args.pluginDir ? resolve(Deno.cwd(), args.pluginDir) : Deno.cwd(); + const manifestText = await Deno.readTextFile(resolve(cwd, "manifest.json")); + const manifest = JSON.parse(manifestText); + + if (vault) { + if (!args.yes) { + await confirmUninstall(); + } + + const pluginPath = resolve(cwd, vault, ".obsidian", "plugins", manifest.id); + + try { + await Deno.lstat(pluginPath); + } catch (err) { + if (err instanceof Deno.errors.NotFound) { + console.error(`Could not find a plugin folder at path ${pluginPath}`); + Deno.exit(1); + } + + throw err; + } + + console.info("Plugin found. Removing"); + + try { + await Deno.remove(pluginPath, { recursive: true }); + } catch (err) { + throw err; + } + + console.info(`Plugin successfully removed from vault with path ${vault}`); + Deno.exit(0); + } + + console.info("No vault specified. Checking installation history"); + + const kv = await Deno.openKv(); + const vaults: string[] = []; + const entries = kv.list({ + prefix: ["installed-plugins", manifest.id], + }); + + for await (const entry of entries) { + vaults.push(entry.value); + } + + if (vaults.length === 0) { + console.info("No vaults found. Nothing to do"); + Deno.exit(0); + } else if (vaults.length === 1) { + const vaultPath = vaults.shift(); + console.info( + `Only one vault found. Proceeding with vault path: ${vaultPath}`, + ); + await uninstallPlugin(args, vaultPath); + } + + const selectedVault = await Select.prompt({ + message: "Select a vault to uninstall plugin:", + options: vaults.map((path) => ({ + value: path, + })), + }); + + if (!selectedVault) { + console.info("No vault selected. Nothing to do"); + Deno.exit(0); + } + + console.info(`Proceeding with vault path: ${selectedVault}`); + await uninstallPlugin(args, selectedVault); +} diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..30d844a --- /dev/null +++ b/deno.json @@ -0,0 +1,7 @@ +{ + "tasks": { + "shim": "deno install -Afg -n obsideno -c ./deno.json main.ts", + "unshim": "deno uninstall -g obsideno" + }, + "unstable": ["kv"] +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..6b6156d --- /dev/null +++ b/deno.lock @@ -0,0 +1,711 @@ +{ + "version": "4", + "specifiers": { + "jsr:@cliffy/ansi@1.0.0-rc.7": "1.0.0-rc.7", + "jsr:@cliffy/internal@1.0.0-rc.7": "1.0.0-rc.7", + "jsr:@cliffy/keycode@1.0.0-rc.7": "1.0.0-rc.7", + "jsr:@cliffy/prompt@1.0.0-rc.7": "1.0.0-rc.7", + "jsr:@denosaurs/tty@~0.2.1": "0.2.1", + "jsr:@denosaurs/wait@*": "0.2.2", + "jsr:@std/assert@~1.0.6": "1.0.11", + "jsr:@std/encoding@~1.0.5": "1.0.7", + "jsr:@std/fmt@1": "1.0.6", + "jsr:@std/fmt@~1.0.2": "1.0.6", + "jsr:@std/fs@*": "1.0.14", + "jsr:@std/io@~0.224.9": "0.224.9", + "jsr:@std/path@^1.0.8": "1.0.8", + "jsr:@std/path@~1.0.6": "1.0.8", + "jsr:@std/text@~1.0.7": "1.0.11", + "npm:@deno/vite-plugin@*": "1.0.4_vite@6.2.2", + "npm:@types/node@*": "22.12.0", + "npm:builtin-modules@*": "5.0.0", + "npm:esbuild@*": "0.25.1", + "npm:obsidian@*": "1.2.8_@codemirror+state@6.2.1_@codemirror+view@6.13.0", + "npm:rollup-plugin-copy@*": "3.5.0", + "npm:vite-plugin-banner@*": "0.8.0", + "npm:vite-plugin-static-copy@*": "2.3.0_vite@6.2.2_@types+node@22.12.0", + "npm:vite@*": "6.2.2" + }, + "jsr": { + "@cliffy/ansi@1.0.0-rc.7": { + "integrity": "f71c921cce224c13d322e5cedba4f38e8f7354c7d855c9cb22729362a53f25aa", + "dependencies": [ + "jsr:@cliffy/internal", + "jsr:@std/encoding", + "jsr:@std/io" + ] + }, + "@cliffy/internal@1.0.0-rc.7": { + "integrity": "10412636ab3e67517d448be9eaab1b70c88eba9be22617b5d146257a11cc9b17" + }, + "@cliffy/keycode@1.0.0-rc.7": { + "integrity": "5b3f6c33994e81a76b79f108b1989642ac22705840da33781f7972d7dff05503" + }, + "@cliffy/prompt@1.0.0-rc.7": { + "integrity": "a9cbd13acd8073558447cae8ca4cf593c09d23bcbe429cc63346920c21187b83", + "dependencies": [ + "jsr:@cliffy/ansi", + "jsr:@cliffy/internal", + "jsr:@cliffy/keycode", + "jsr:@std/assert", + "jsr:@std/fmt@~1.0.2", + "jsr:@std/io", + "jsr:@std/path@~1.0.6", + "jsr:@std/text" + ] + }, + "@denosaurs/tty@0.2.1": { + "integrity": "f1fc651cc9021c90bf230a45c6eb893c26a54fae6a855e9cd26aad0083d772dd" + }, + "@denosaurs/wait@0.2.2": { + "integrity": "5ec0a7e72c57a96c9fdb2f4a52e2ce3b1ad010acc59fefe6f88054a9e27bc33d", + "dependencies": [ + "jsr:@denosaurs/tty", + "jsr:@std/fmt@1" + ] + }, + "@std/assert@1.0.11": { + "integrity": "2461ef3c368fe88bc60e186e7744a93112f16fd110022e113a0849e94d1c83c1" + }, + "@std/encoding@1.0.7": { + "integrity": "f631247c1698fef289f2de9e2a33d571e46133b38d042905e3eac3715030a82d" + }, + "@std/fmt@1.0.6": { + "integrity": "a2c56a69a2369876ddb3ad6a500bb6501b5bad47bb3ea16bfb0c18974d2661fc" + }, + "@std/fs@1.0.14": { + "integrity": "1e84bf0b95fe08f41f1f4aea9717bbf29f45408a56ce073b0114474ce1c9fccf", + "dependencies": [ + "jsr:@std/path@^1.0.8" + ] + }, + "@std/io@0.224.9": { + "integrity": "4414664b6926f665102e73c969cfda06d2c4c59bd5d0c603fd4f1b1c840d6ee3" + }, + "@std/path@1.0.8": { + "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" + }, + "@std/text@1.0.11": { + "integrity": "f191fa22590cac8b1cdba6cc4ab97940e720f7cc67b3084e54405b428bf5843d" + } + }, + "npm": { + "@codemirror/state@6.2.1": { + "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==" + }, + "@codemirror/view@6.13.0": { + "integrity": "sha512-oXTfJzHJ5Tl7f6T8ZO0HKf981zubxgKohjddLobbntbNZHlOZGMRL+pPZGtclDWFaFJWtGBYRGyNdjQ6Xsx5yA==", + "dependencies": [ + "@codemirror/state", + "style-mod", + "w3c-keyname" + ] + }, + "@deno/vite-plugin@1.0.4_vite@6.2.2": { + "integrity": "sha512-xg8YT8Wn2sGXSnJgiGTpBGX1Dov0c6fd1rAp8VsfrCUtyBRRWzwVMAnd3fQ4yq8h7LSVvJUxEFN4U421k/DQLA==", + "dependencies": [ + "vite@6.2.2" + ] + }, + "@esbuild/aix-ppc64@0.25.1": { + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==" + }, + "@esbuild/android-arm64@0.25.1": { + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==" + }, + "@esbuild/android-arm@0.25.1": { + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==" + }, + "@esbuild/android-x64@0.25.1": { + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==" + }, + "@esbuild/darwin-arm64@0.25.1": { + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==" + }, + "@esbuild/darwin-x64@0.25.1": { + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==" + }, + "@esbuild/freebsd-arm64@0.25.1": { + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==" + }, + "@esbuild/freebsd-x64@0.25.1": { + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==" + }, + "@esbuild/linux-arm64@0.25.1": { + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==" + }, + "@esbuild/linux-arm@0.25.1": { + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==" + }, + "@esbuild/linux-ia32@0.25.1": { + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==" + }, + "@esbuild/linux-loong64@0.25.1": { + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==" + }, + "@esbuild/linux-mips64el@0.25.1": { + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==" + }, + "@esbuild/linux-ppc64@0.25.1": { + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==" + }, + "@esbuild/linux-riscv64@0.25.1": { + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==" + }, + "@esbuild/linux-s390x@0.25.1": { + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==" + }, + "@esbuild/linux-x64@0.25.1": { + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==" + }, + "@esbuild/netbsd-arm64@0.25.1": { + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==" + }, + "@esbuild/netbsd-x64@0.25.1": { + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==" + }, + "@esbuild/openbsd-arm64@0.25.1": { + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==" + }, + "@esbuild/openbsd-x64@0.25.1": { + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==" + }, + "@esbuild/sunos-x64@0.25.1": { + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==" + }, + "@esbuild/win32-arm64@0.25.1": { + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==" + }, + "@esbuild/win32-ia32@0.25.1": { + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==" + }, + "@esbuild/win32-x64@0.25.1": { + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==" + }, + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": [ + "@nodelib/fs.stat", + "run-parallel" + ] + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": [ + "@nodelib/fs.scandir", + "fastq" + ] + }, + "@rollup/rollup-android-arm-eabi@4.36.0": { + "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==" + }, + "@rollup/rollup-android-arm64@4.36.0": { + "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==" + }, + "@rollup/rollup-darwin-arm64@4.36.0": { + "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==" + }, + "@rollup/rollup-darwin-x64@4.36.0": { + "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==" + }, + "@rollup/rollup-freebsd-arm64@4.36.0": { + "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==" + }, + "@rollup/rollup-freebsd-x64@4.36.0": { + "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==" + }, + "@rollup/rollup-linux-arm-gnueabihf@4.36.0": { + "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==" + }, + "@rollup/rollup-linux-arm-musleabihf@4.36.0": { + "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==" + }, + "@rollup/rollup-linux-arm64-gnu@4.36.0": { + "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==" + }, + "@rollup/rollup-linux-arm64-musl@4.36.0": { + "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==" + }, + "@rollup/rollup-linux-loongarch64-gnu@4.36.0": { + "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==" + }, + "@rollup/rollup-linux-powerpc64le-gnu@4.36.0": { + "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==" + }, + "@rollup/rollup-linux-riscv64-gnu@4.36.0": { + "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==" + }, + "@rollup/rollup-linux-s390x-gnu@4.36.0": { + "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==" + }, + "@rollup/rollup-linux-x64-gnu@4.36.0": { + "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==" + }, + "@rollup/rollup-linux-x64-musl@4.36.0": { + "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==" + }, + "@rollup/rollup-win32-arm64-msvc@4.36.0": { + "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==" + }, + "@rollup/rollup-win32-ia32-msvc@4.36.0": { + "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==" + }, + "@rollup/rollup-win32-x64-msvc@4.36.0": { + "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==" + }, + "@types/codemirror@0.0.108": { + "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", + "dependencies": [ + "@types/tern" + ] + }, + "@types/estree@1.0.6": { + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "@types/fs-extra@8.1.5": { + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dependencies": [ + "@types/node" + ] + }, + "@types/glob@7.2.0": { + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dependencies": [ + "@types/minimatch", + "@types/node" + ] + }, + "@types/minimatch@5.1.2": { + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "@types/node@22.12.0": { + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "dependencies": [ + "undici-types" + ] + }, + "@types/tern@0.23.4": { + "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", + "dependencies": [ + "@types/estree" + ] + }, + "anymatch@3.1.3": { + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": [ + "normalize-path", + "picomatch" + ] + }, + "array-union@2.1.0": { + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions@2.3.0": { + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "brace-expansion@1.1.11": { + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": [ + "balanced-match", + "concat-map" + ] + }, + "braces@3.0.3": { + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": [ + "fill-range" + ] + }, + "builtin-modules@5.0.0": { + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==" + }, + "chokidar@3.6.0": { + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": [ + "anymatch", + "braces", + "fsevents", + "glob-parent", + "is-binary-path", + "is-glob", + "normalize-path", + "readdirp" + ] + }, + "colorette@1.4.0": { + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "dir-glob@3.0.1": { + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": [ + "path-type" + ] + }, + "esbuild@0.25.1": { + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "dependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-arm64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ] + }, + "fast-glob@3.3.3": { + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": [ + "@nodelib/fs.stat", + "@nodelib/fs.walk", + "glob-parent", + "merge2", + "micromatch" + ] + }, + "fastq@1.19.1": { + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dependencies": [ + "reusify" + ] + }, + "fill-range@7.1.1": { + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": [ + "to-regex-range" + ] + }, + "fs-extra@11.3.0": { + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dependencies": [ + "graceful-fs", + "jsonfile@6.1.0", + "universalify@2.0.1" + ] + }, + "fs-extra@8.1.0": { + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": [ + "graceful-fs", + "jsonfile@4.0.0", + "universalify@0.1.2" + ] + }, + "fs.realpath@1.0.0": { + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + }, + "glob-parent@5.1.2": { + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": [ + "is-glob" + ] + }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": [ + "fs.realpath", + "inflight", + "inherits", + "minimatch", + "once", + "path-is-absolute" + ] + }, + "globby@10.0.1": { + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dependencies": [ + "@types/glob", + "array-union", + "dir-glob", + "fast-glob", + "glob", + "ignore", + "merge2", + "slash" + ] + }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "ignore@5.3.2": { + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" + }, + "inflight@1.0.6": { + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": [ + "once", + "wrappy" + ] + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-binary-path@2.1.0": { + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": [ + "binary-extensions" + ] + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": [ + "is-extglob" + ] + }, + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-object@3.0.1": { + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==" + }, + "jsonfile@4.0.0": { + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dependencies": [ + "graceful-fs" + ] + }, + "jsonfile@6.1.0": { + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": [ + "graceful-fs", + "universalify@2.0.1" + ] + }, + "merge2@1.4.1": { + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch@4.0.8": { + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": [ + "braces", + "picomatch" + ] + }, + "minimatch@3.1.2": { + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": [ + "brace-expansion" + ] + }, + "moment@2.29.4": { + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "nanoid@3.3.11": { + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" + }, + "normalize-path@3.0.0": { + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "obsidian@1.2.8_@codemirror+state@6.2.1_@codemirror+view@6.13.0": { + "integrity": "sha512-HrC+feA8o0tXspj4lEAqxb1btwLwHD2oHXSwbbN+CdRHURqbCkuIDLld+nkuyJ1w1c9uvVDRVk8BoeOnWheOrQ==", + "dependencies": [ + "@codemirror/state", + "@codemirror/view", + "@types/codemirror", + "moment" + ] + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": [ + "wrappy" + ] + }, + "p-map@7.0.3": { + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==" + }, + "path-is-absolute@1.0.1": { + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-type@4.0.0": { + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "postcss@8.5.3": { + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "readdirp@3.6.0": { + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": [ + "picomatch" + ] + }, + "reusify@1.1.0": { + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" + }, + "rollup-plugin-copy@3.5.0": { + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", + "dependencies": [ + "@types/fs-extra", + "colorette", + "fs-extra@8.1.0", + "globby", + "is-plain-object" + ] + }, + "rollup@4.36.0": { + "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "dependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loongarch64-gnu", + "@rollup/rollup-linux-powerpc64le-gnu", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-msvc", + "@types/estree", + "fsevents" + ] + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": [ + "queue-microtask" + ] + }, + "slash@3.0.0": { + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "style-mod@4.0.3": { + "integrity": "sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==" + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": [ + "is-number" + ] + }, + "undici-types@6.20.0": { + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "universalify@0.1.2": { + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "universalify@2.0.1": { + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "vite-plugin-banner@0.8.0": { + "integrity": "sha512-JpDWDYxtrsytuvUOJCgJcTkBb6XM8yPOidjRtB6F5SW1JSzDd/Y+PD/44wR6ovWKXhSUiyDRqPvx7mMf8+8ELg==" + }, + "vite-plugin-static-copy@2.3.0_vite@6.2.2_@types+node@22.12.0": { + "integrity": "sha512-LLKwhhHetGaCnWz4mas4qqjjguDka6/6b4+SeIohRroj8aCE7QTfiZECfPecslFQkWZ3HdQuq5kOPmWZjNYlKA==", + "dependencies": [ + "chokidar", + "fast-glob", + "fs-extra@11.3.0", + "p-map", + "picocolors", + "vite@6.2.2_@types+node@22.12.0" + ] + }, + "vite@6.2.2": { + "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "dependencies": [ + "esbuild", + "fsevents", + "postcss", + "rollup" + ] + }, + "vite@6.2.2_@types+node@22.12.0": { + "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "dependencies": [ + "@types/node", + "esbuild", + "fsevents", + "postcss", + "rollup" + ] + }, + "w3c-keyname@2.2.7": { + "integrity": "sha512-XB8aa62d4rrVfoZYQaYNy3fy+z4nrfy2ooea3/0BnBzXW0tSdZ+lRgjzBZhk0La0H6h8fVyYCxx/qkQcAIuvfg==" + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + }, + "remote": { + "https://deno.land/std@0.122.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.122.0/bytes/bytes_list.ts": "3bff6a09c72b2e0b1e92e29bd3b135053894196cca07a2bba842901073efe5cb", + "https://deno.land/std@0.122.0/bytes/equals.ts": "69f55fdbd45c71f920c1a621e6c0865dc780cd8ae34e0f5e55a9497b70c31c1b", + "https://deno.land/std@0.122.0/bytes/mod.ts": "fedb80b8da2e7ad8dd251148e65f92a04c73d6c5a430b7d197dc39588c8dda6f", + "https://deno.land/std@0.122.0/fmt/colors.ts": "8368ddf2d48dfe413ffd04cdbb7ae6a1009cf0dccc9c7ff1d76259d9c61a0621", + "https://deno.land/std@0.122.0/io/buffer.ts": "8f10342821b81990acf859cdccb4e4031c7c9187a0ffc3ed6b356ee29ecc6681", + "https://deno.land/std@0.122.0/streams/conversion.ts": "7ff9af42540063fa72003ab31a377ba9dde8532d43b16329b933c37a6d7aac5f", + "https://deno.land/std@0.122.0/testing/_diff.ts": "e6a10d2aca8d6c27a9c5b8a2dbbf64353874730af539707b5b39d4128140642d", + "https://deno.land/std@0.122.0/testing/asserts.ts": "e1e7325b449cc9c747c309690b22d8cf464e401f79f494ddb106e4842fdb4dda", + "https://deno.land/std@0.97.0/fmt/colors.ts": "db22b314a2ae9430ae7460ce005e0a7130e23ae1c999157e3bb77cf55800f7e4", + "https://deno.land/std@0.97.0/testing/_diff.ts": "961eaf6d9f5b0a8556c9d835bbc6fa74f5addd7d3b02728ba7936ff93364f7a3", + "https://deno.land/std@0.97.0/testing/asserts.ts": "341292d12eebc44be4c3c2ca101ba8b6b5859cef2fa69d50c217f9d0bfbcfd1f", + "https://deno.land/x/expect@v0.2.9/expect.ts": "128c60f94ff3f977e2a649463238e403f9bdb8e6ab77e65214c0236bd61b0111", + "https://deno.land/x/expect@v0.2.9/matchers.ts": "ba7360b73c5031a22449fa98eb4d5dbe7f256a88dd4c22ccae96dc6c01f0b19c", + "https://deno.land/x/expect@v0.2.9/mock.ts": "562d4b1d735d15b0b8e935f342679096b64fe452f86e96714fe8616c0c884914", + "https://deno.land/x/expect@v0.2.9/mod.ts": "0304d2430e1e96ba669a8495e24ba606dcc3d152e1f81aaa8da898cea24e36c2", + "https://deno.land/x/kia@0.4.1/deps.ts": "75da73e1fd9f18b9abbc0e615894aef9cafd8bcf81c5c6aab3be5986425474c4", + "https://deno.land/x/kia@0.4.1/kia.ts": "9eaaae34b1179a43251f4ced6b4b94b9d8100e587a95b8152f01b22fe52cbe84", + "https://deno.land/x/kia@0.4.1/mod.ts": "727b60e707c46429e40a2159ab73381245ef08a8e1e59e1e5a705745b99f4aec", + "https://deno.land/x/kia@0.4.1/spinners.ts": "26b63f964c745d6cc46e547d98352a4f64ae6d28400d35d9b77be7a5141db860", + "https://deno.land/x/kia@0.4.1/util.ts": "b7ac0962b5a39f666bad41c8b93efe1ea599fbac05ea9f65c0409926e8092618" + } +} diff --git a/main.ts b/main.ts new file mode 100644 index 0000000..5d03eb1 --- /dev/null +++ b/main.ts @@ -0,0 +1,42 @@ +import { Command, EnumType } from "jsr:@cliffy/command@1.0.0-rc.7"; + +import { buildPlugin } from "./cmd/build.ts"; +import { bumpVersion } from "./cmd/bump.ts"; +import { installPlugin } from "./cmd/install.ts"; +import { uninstallPlugin } from "./cmd/uninstall.ts"; + +const bumpLevel = new EnumType(["patch", "minor", "major"]); + +await new Command() + .name("obsideno") + .version("1.0.0") + .description("CLI helper for building Obsidian plugins") + .globalOption( + "-d, --plugin-dir ", + "Root directory of your plugin. Defaults the directory where the command is run", + ) + // Build command + .command("build", "Build your plugin with ESBuild") + .option("-p, --production", "Minify and inline sourcemaps for production") + .option("-w, --watch", "Watch for file changes and rebuild") + // .action((args) => buildPlugin(args)) + .action((args) => buildPlugin(args)) + // Install command + .command("install", "Build and install your plugin in the specified vault") + .option("-p, --production", "Minify and inline sourcemaps for production") + .arguments("") + .action((args, path) => installPlugin(args, path)) + // Uninstall command + .command( + "uninstall", + "Removes your plugin from the specified vault. Omit the vault path to search your installation history", + ) + .option("-y, --yes", "Skip the confirmation step") + .arguments("[vault-path]") + .action((args, path) => uninstallPlugin(args, path)) + // Version bump command + .command("bump", "Bump your plugin version according to Semver") + .type("bumpLevel", bumpLevel) + .arguments("") + .action((args, level) => bumpVersion(args, level)) + .parse(Deno.args);