├── .envrc ├── .github └── workflows │ └── pages.yaml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── doc ├── .vitepress │ └── config.ts ├── am.data.js ├── index.md └── options.md ├── flake.lock ├── flake.nix ├── nix ├── home │ ├── core.nix │ ├── default.nix │ └── nixos-module.nix └── package.nix ├── package.json ├── pnpm-lock.yaml ├── src ├── api.rs ├── exec.rs ├── exec_node.rs ├── gsettings.rs ├── main.rs └── node.rs └── test ├── main.lua ├── main.nix └── nixos.nix /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | 3 | export AM_LOG=trace 4 | -------------------------------------------------------------------------------- /.github/workflows/pages.yaml: -------------------------------------------------------------------------------- 1 | name: site 2 | 3 | permissions: 4 | id-token: write 5 | pages: write 6 | 7 | on: 8 | push: 9 | branches: 10 | - master 11 | 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | environment: 17 | name: github-pages 18 | 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | - name: Install Nix 23 | uses: DeterminateSystems/nix-installer-action@main 24 | with: 25 | extra-conf: | 26 | extra-experimental-features = pipe-operators 27 | - name: Build page 28 | run: | 29 | eval "$(nix print-dev-env)" 30 | pnpm install 31 | pnpm build 32 | - name: Upload artifacts 33 | id: deployment 34 | uses: actions/upload-pages-artifact@v3 35 | with: 36 | path: doc/.vitepress/dist 37 | 38 | deploy: 39 | environment: 40 | name: github-pages 41 | url: ${{ steps.deployment.outputs.page_url }} 42 | runs-on: ubuntu-latest 43 | needs: build 44 | steps: 45 | - name: Deploy to GitHub Pages 46 | id: deployment 47 | uses: actions/deploy-pages@v4 48 | 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .direnv 3 | *result* 4 | *.qcow2 5 | node_modules 6 | .astro 7 | dist 8 | cache 9 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "activation-manager" 7 | version = "0.1.0" 8 | dependencies = [ 9 | "base16", 10 | "clap", 11 | "color-eyre", 12 | "eyre", 13 | "mlua", 14 | "once_cell", 15 | "owo-colors 4.1.0", 16 | "serde", 17 | "sha2", 18 | "tracing", 19 | "tracing-subscriber", 20 | ] 21 | 22 | [[package]] 23 | name = "addr2line" 24 | version = "0.21.0" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 27 | dependencies = [ 28 | "gimli", 29 | ] 30 | 31 | [[package]] 32 | name = "adler" 33 | version = "1.0.2" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 36 | 37 | [[package]] 38 | name = "aho-corasick" 39 | version = "1.1.3" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 42 | dependencies = [ 43 | "memchr", 44 | ] 45 | 46 | [[package]] 47 | name = "anstream" 48 | version = "0.6.18" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 51 | dependencies = [ 52 | "anstyle", 53 | "anstyle-parse", 54 | "anstyle-query", 55 | "anstyle-wincon", 56 | "colorchoice", 57 | "is_terminal_polyfill", 58 | "utf8parse", 59 | ] 60 | 61 | [[package]] 62 | name = "anstyle" 63 | version = "1.0.10" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 66 | 67 | [[package]] 68 | name = "anstyle-parse" 69 | version = "0.2.6" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 72 | dependencies = [ 73 | "utf8parse", 74 | ] 75 | 76 | [[package]] 77 | name = "anstyle-query" 78 | version = "1.1.2" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 81 | dependencies = [ 82 | "windows-sys", 83 | ] 84 | 85 | [[package]] 86 | name = "anstyle-wincon" 87 | version = "3.0.7" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 90 | dependencies = [ 91 | "anstyle", 92 | "once_cell", 93 | "windows-sys", 94 | ] 95 | 96 | [[package]] 97 | name = "autocfg" 98 | version = "1.4.0" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 101 | 102 | [[package]] 103 | name = "backtrace" 104 | version = "0.3.71" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 107 | dependencies = [ 108 | "addr2line", 109 | "cc", 110 | "cfg-if", 111 | "libc", 112 | "miniz_oxide", 113 | "object", 114 | "rustc-demangle", 115 | ] 116 | 117 | [[package]] 118 | name = "base16" 119 | version = "0.2.1" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" 122 | 123 | [[package]] 124 | name = "bitflags" 125 | version = "2.8.0" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 128 | 129 | [[package]] 130 | name = "block-buffer" 131 | version = "0.10.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 134 | dependencies = [ 135 | "generic-array", 136 | ] 137 | 138 | [[package]] 139 | name = "bstr" 140 | version = "1.11.3" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" 143 | dependencies = [ 144 | "memchr", 145 | "serde", 146 | ] 147 | 148 | [[package]] 149 | name = "cc" 150 | version = "1.2.13" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" 153 | dependencies = [ 154 | "shlex", 155 | ] 156 | 157 | [[package]] 158 | name = "cfg-if" 159 | version = "1.0.0" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 162 | 163 | [[package]] 164 | name = "clap" 165 | version = "4.5.28" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" 168 | dependencies = [ 169 | "clap_builder", 170 | "clap_derive", 171 | ] 172 | 173 | [[package]] 174 | name = "clap_builder" 175 | version = "4.5.27" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" 178 | dependencies = [ 179 | "anstream", 180 | "anstyle", 181 | "clap_lex", 182 | "strsim", 183 | ] 184 | 185 | [[package]] 186 | name = "clap_derive" 187 | version = "4.5.28" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" 190 | dependencies = [ 191 | "heck", 192 | "proc-macro2", 193 | "quote", 194 | "syn", 195 | ] 196 | 197 | [[package]] 198 | name = "clap_lex" 199 | version = "0.7.4" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 202 | 203 | [[package]] 204 | name = "color-eyre" 205 | version = "0.6.3" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" 208 | dependencies = [ 209 | "backtrace", 210 | "color-spantrace", 211 | "eyre", 212 | "indenter", 213 | "once_cell", 214 | "owo-colors 3.5.0", 215 | "tracing-error", 216 | ] 217 | 218 | [[package]] 219 | name = "color-spantrace" 220 | version = "0.2.1" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" 223 | dependencies = [ 224 | "once_cell", 225 | "owo-colors 3.5.0", 226 | "tracing-core", 227 | "tracing-error", 228 | ] 229 | 230 | [[package]] 231 | name = "colorchoice" 232 | version = "1.0.3" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 235 | 236 | [[package]] 237 | name = "cpufeatures" 238 | version = "0.2.17" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 241 | dependencies = [ 242 | "libc", 243 | ] 244 | 245 | [[package]] 246 | name = "crypto-common" 247 | version = "0.1.6" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 250 | dependencies = [ 251 | "generic-array", 252 | "typenum", 253 | ] 254 | 255 | [[package]] 256 | name = "digest" 257 | version = "0.10.7" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 260 | dependencies = [ 261 | "block-buffer", 262 | "crypto-common", 263 | ] 264 | 265 | [[package]] 266 | name = "either" 267 | version = "1.13.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 270 | 271 | [[package]] 272 | name = "erased-serde" 273 | version = "0.4.5" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" 276 | dependencies = [ 277 | "serde", 278 | "typeid", 279 | ] 280 | 281 | [[package]] 282 | name = "eyre" 283 | version = "0.6.12" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" 286 | dependencies = [ 287 | "indenter", 288 | "once_cell", 289 | ] 290 | 291 | [[package]] 292 | name = "generic-array" 293 | version = "0.14.7" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 296 | dependencies = [ 297 | "typenum", 298 | "version_check", 299 | ] 300 | 301 | [[package]] 302 | name = "gimli" 303 | version = "0.28.1" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 306 | 307 | [[package]] 308 | name = "heck" 309 | version = "0.5.0" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 312 | 313 | [[package]] 314 | name = "indenter" 315 | version = "0.3.3" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 318 | 319 | [[package]] 320 | name = "is_terminal_polyfill" 321 | version = "1.70.1" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 324 | 325 | [[package]] 326 | name = "lazy_static" 327 | version = "1.5.0" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 330 | 331 | [[package]] 332 | name = "libc" 333 | version = "0.2.169" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 336 | 337 | [[package]] 338 | name = "lock_api" 339 | version = "0.4.12" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 342 | dependencies = [ 343 | "autocfg", 344 | "scopeguard", 345 | ] 346 | 347 | [[package]] 348 | name = "log" 349 | version = "0.4.25" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 352 | 353 | [[package]] 354 | name = "matchers" 355 | version = "0.1.0" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 358 | dependencies = [ 359 | "regex-automata 0.1.10", 360 | ] 361 | 362 | [[package]] 363 | name = "memchr" 364 | version = "2.7.4" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 367 | 368 | [[package]] 369 | name = "miniz_oxide" 370 | version = "0.7.4" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 373 | dependencies = [ 374 | "adler", 375 | ] 376 | 377 | [[package]] 378 | name = "mlua" 379 | version = "0.10.3" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "d3f763c1041eff92ffb5d7169968a327e1ed2ebfe425dac0ee5a35f29082534b" 382 | dependencies = [ 383 | "bstr", 384 | "either", 385 | "erased-serde", 386 | "mlua-sys", 387 | "num-traits", 388 | "parking_lot", 389 | "rustc-hash", 390 | "serde", 391 | "serde-value", 392 | ] 393 | 394 | [[package]] 395 | name = "mlua-sys" 396 | version = "0.6.7" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "1901c1a635a22fe9250ffcc4fcc937c16b47c2e9e71adba8784af8bca1f69594" 399 | dependencies = [ 400 | "cc", 401 | "cfg-if", 402 | "pkg-config", 403 | ] 404 | 405 | [[package]] 406 | name = "nu-ansi-term" 407 | version = "0.46.0" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 410 | dependencies = [ 411 | "overload", 412 | "winapi", 413 | ] 414 | 415 | [[package]] 416 | name = "num-traits" 417 | version = "0.2.19" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 420 | dependencies = [ 421 | "autocfg", 422 | ] 423 | 424 | [[package]] 425 | name = "object" 426 | version = "0.32.2" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 429 | dependencies = [ 430 | "memchr", 431 | ] 432 | 433 | [[package]] 434 | name = "once_cell" 435 | version = "1.20.3" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 438 | 439 | [[package]] 440 | name = "ordered-float" 441 | version = "2.10.1" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" 444 | dependencies = [ 445 | "num-traits", 446 | ] 447 | 448 | [[package]] 449 | name = "overload" 450 | version = "0.1.1" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 453 | 454 | [[package]] 455 | name = "owo-colors" 456 | version = "3.5.0" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" 459 | 460 | [[package]] 461 | name = "owo-colors" 462 | version = "4.1.0" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" 465 | 466 | [[package]] 467 | name = "parking_lot" 468 | version = "0.12.3" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 471 | dependencies = [ 472 | "lock_api", 473 | "parking_lot_core", 474 | ] 475 | 476 | [[package]] 477 | name = "parking_lot_core" 478 | version = "0.9.10" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 481 | dependencies = [ 482 | "cfg-if", 483 | "libc", 484 | "redox_syscall", 485 | "smallvec", 486 | "windows-targets", 487 | ] 488 | 489 | [[package]] 490 | name = "pin-project-lite" 491 | version = "0.2.16" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 494 | 495 | [[package]] 496 | name = "pkg-config" 497 | version = "0.3.31" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 500 | 501 | [[package]] 502 | name = "proc-macro2" 503 | version = "1.0.93" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 506 | dependencies = [ 507 | "unicode-ident", 508 | ] 509 | 510 | [[package]] 511 | name = "quote" 512 | version = "1.0.38" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 515 | dependencies = [ 516 | "proc-macro2", 517 | ] 518 | 519 | [[package]] 520 | name = "redox_syscall" 521 | version = "0.5.8" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 524 | dependencies = [ 525 | "bitflags", 526 | ] 527 | 528 | [[package]] 529 | name = "regex" 530 | version = "1.11.1" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 533 | dependencies = [ 534 | "aho-corasick", 535 | "memchr", 536 | "regex-automata 0.4.9", 537 | "regex-syntax 0.8.5", 538 | ] 539 | 540 | [[package]] 541 | name = "regex-automata" 542 | version = "0.1.10" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 545 | dependencies = [ 546 | "regex-syntax 0.6.29", 547 | ] 548 | 549 | [[package]] 550 | name = "regex-automata" 551 | version = "0.4.9" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 554 | dependencies = [ 555 | "aho-corasick", 556 | "memchr", 557 | "regex-syntax 0.8.5", 558 | ] 559 | 560 | [[package]] 561 | name = "regex-syntax" 562 | version = "0.6.29" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 565 | 566 | [[package]] 567 | name = "regex-syntax" 568 | version = "0.8.5" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 571 | 572 | [[package]] 573 | name = "rustc-demangle" 574 | version = "0.1.24" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 577 | 578 | [[package]] 579 | name = "rustc-hash" 580 | version = "2.1.1" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 583 | 584 | [[package]] 585 | name = "scopeguard" 586 | version = "1.2.0" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 589 | 590 | [[package]] 591 | name = "serde" 592 | version = "1.0.217" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 595 | dependencies = [ 596 | "serde_derive", 597 | ] 598 | 599 | [[package]] 600 | name = "serde-value" 601 | version = "0.7.0" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" 604 | dependencies = [ 605 | "ordered-float", 606 | "serde", 607 | ] 608 | 609 | [[package]] 610 | name = "serde_derive" 611 | version = "1.0.217" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 614 | dependencies = [ 615 | "proc-macro2", 616 | "quote", 617 | "syn", 618 | ] 619 | 620 | [[package]] 621 | name = "sha2" 622 | version = "0.10.8" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 625 | dependencies = [ 626 | "cfg-if", 627 | "cpufeatures", 628 | "digest", 629 | ] 630 | 631 | [[package]] 632 | name = "sharded-slab" 633 | version = "0.1.7" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 636 | dependencies = [ 637 | "lazy_static", 638 | ] 639 | 640 | [[package]] 641 | name = "shlex" 642 | version = "1.3.0" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 645 | 646 | [[package]] 647 | name = "smallvec" 648 | version = "1.13.2" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 651 | 652 | [[package]] 653 | name = "strsim" 654 | version = "0.11.1" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 657 | 658 | [[package]] 659 | name = "syn" 660 | version = "2.0.98" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 663 | dependencies = [ 664 | "proc-macro2", 665 | "quote", 666 | "unicode-ident", 667 | ] 668 | 669 | [[package]] 670 | name = "thread_local" 671 | version = "1.1.8" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 674 | dependencies = [ 675 | "cfg-if", 676 | "once_cell", 677 | ] 678 | 679 | [[package]] 680 | name = "tracing" 681 | version = "0.1.41" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 684 | dependencies = [ 685 | "pin-project-lite", 686 | "tracing-attributes", 687 | "tracing-core", 688 | ] 689 | 690 | [[package]] 691 | name = "tracing-attributes" 692 | version = "0.1.28" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 695 | dependencies = [ 696 | "proc-macro2", 697 | "quote", 698 | "syn", 699 | ] 700 | 701 | [[package]] 702 | name = "tracing-core" 703 | version = "0.1.33" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 706 | dependencies = [ 707 | "once_cell", 708 | "valuable", 709 | ] 710 | 711 | [[package]] 712 | name = "tracing-error" 713 | version = "0.2.1" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" 716 | dependencies = [ 717 | "tracing", 718 | "tracing-subscriber", 719 | ] 720 | 721 | [[package]] 722 | name = "tracing-log" 723 | version = "0.2.0" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 726 | dependencies = [ 727 | "log", 728 | "once_cell", 729 | "tracing-core", 730 | ] 731 | 732 | [[package]] 733 | name = "tracing-subscriber" 734 | version = "0.3.19" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 737 | dependencies = [ 738 | "matchers", 739 | "nu-ansi-term", 740 | "once_cell", 741 | "regex", 742 | "sharded-slab", 743 | "smallvec", 744 | "thread_local", 745 | "tracing", 746 | "tracing-core", 747 | "tracing-log", 748 | ] 749 | 750 | [[package]] 751 | name = "typeid" 752 | version = "1.0.2" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" 755 | 756 | [[package]] 757 | name = "typenum" 758 | version = "1.17.0" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 761 | 762 | [[package]] 763 | name = "unicode-ident" 764 | version = "1.0.16" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 767 | 768 | [[package]] 769 | name = "utf8parse" 770 | version = "0.2.2" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 773 | 774 | [[package]] 775 | name = "valuable" 776 | version = "0.1.1" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 779 | 780 | [[package]] 781 | name = "version_check" 782 | version = "0.9.5" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 785 | 786 | [[package]] 787 | name = "winapi" 788 | version = "0.3.9" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 791 | dependencies = [ 792 | "winapi-i686-pc-windows-gnu", 793 | "winapi-x86_64-pc-windows-gnu", 794 | ] 795 | 796 | [[package]] 797 | name = "winapi-i686-pc-windows-gnu" 798 | version = "0.4.0" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 801 | 802 | [[package]] 803 | name = "winapi-x86_64-pc-windows-gnu" 804 | version = "0.4.0" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 807 | 808 | [[package]] 809 | name = "windows-sys" 810 | version = "0.59.0" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 813 | dependencies = [ 814 | "windows-targets", 815 | ] 816 | 817 | [[package]] 818 | name = "windows-targets" 819 | version = "0.52.6" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 822 | dependencies = [ 823 | "windows_aarch64_gnullvm", 824 | "windows_aarch64_msvc", 825 | "windows_i686_gnu", 826 | "windows_i686_gnullvm", 827 | "windows_i686_msvc", 828 | "windows_x86_64_gnu", 829 | "windows_x86_64_gnullvm", 830 | "windows_x86_64_msvc", 831 | ] 832 | 833 | [[package]] 834 | name = "windows_aarch64_gnullvm" 835 | version = "0.52.6" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 838 | 839 | [[package]] 840 | name = "windows_aarch64_msvc" 841 | version = "0.52.6" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 844 | 845 | [[package]] 846 | name = "windows_i686_gnu" 847 | version = "0.52.6" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 850 | 851 | [[package]] 852 | name = "windows_i686_gnullvm" 853 | version = "0.52.6" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 856 | 857 | [[package]] 858 | name = "windows_i686_msvc" 859 | version = "0.52.6" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 862 | 863 | [[package]] 864 | name = "windows_x86_64_gnu" 865 | version = "0.52.6" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 868 | 869 | [[package]] 870 | name = "windows_x86_64_gnullvm" 871 | version = "0.52.6" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 874 | 875 | [[package]] 876 | name = "windows_x86_64_msvc" 877 | version = "0.52.6" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 880 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "activation-manager" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | base16 = "0.2.1" 8 | clap = { version = "4.5.28", features = ["derive"] } 9 | color-eyre = "0.6.3" 10 | eyre = "0.6.12" 11 | mlua = { version = "0.10.3", features = ["lua54", "error-send", "serialize"] } 12 | once_cell = "1.20.3" 13 | owo-colors = "4.1.0" 14 | serde = { version = "1.0.217", features = ["derive"] } 15 | sha2 = "0.10.8" 16 | tracing = "0.1.41" 17 | tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Development has moved to https://github.com/viperML/nix-maid 2 | -------------------------------------------------------------------------------- /doc/.vitepress/config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | 3 | // https://vitepress.dev/reference/site-config 4 | export default defineConfig({ 5 | title: "Activation-Manager", 6 | description: "A VitePress Site", 7 | base: "/activation-manager/", 8 | themeConfig: { 9 | // https://vitepress.dev/reference/default-theme-config 10 | nav: [ 11 | // { text: 'Home', link: '/' }, 12 | // { text: 'Examples', link: '/markdown-examples' } 13 | ], 14 | 15 | sidebar: [ 16 | { 17 | text: 'Examples', 18 | items: [ 19 | { text: 'Options', link: '/options' }, 20 | ] 21 | } 22 | ], 23 | 24 | socialLinks: [ 25 | { icon: 'github', link: 'https://github.com/viperML/activation-manager' } 26 | ] 27 | }, 28 | vite: { 29 | ssr: { 30 | noExternal: 'easy-nix-documentation', 31 | } 32 | } 33 | }) 34 | -------------------------------------------------------------------------------- /doc/am.data.js: -------------------------------------------------------------------------------- 1 | import { loadOptions, stripNixStore } from "easy-nix-documentation/loader" 2 | export default { 3 | async load() { 4 | const optionsJSON = process.env.OPTIONS_JSON 5 | if (optionsJSON === undefined) { 6 | console.log("OPTIONS_JSON is undefined"); 7 | exit(1) 8 | } 9 | return await loadOptions(optionsJSON, { 10 | mapDeclarations: declaration => { 11 | const relDecl = stripNixStore(declaration); 12 | return `<activation-manager/${relDecl}>` 13 | }, 14 | }) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /doc/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: "Activation-Manager" 7 | text: "Post-modern configuration management" 8 | # tagline: My great project tagline 9 | actions: 10 | - theme: brand 11 | text: Options 12 | link: /options 13 | - theme: alt 14 | text: GitHub 15 | link: https://github.com/viperML/activation-manager 16 | 17 | # features: 18 | # - title: Feature A 19 | # details: Lorem ipsum dolor sit amet, consectetur adipiscing elit 20 | # - title: Feature B 21 | # details: Lorem ipsum dolor sit amet, consectetur adipiscing elit 22 | # - title: Feature C 23 | # details: Lorem ipsum dolor sit amet, consectetur adipiscing elit 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /doc/options.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Options 3 | --- 4 | 5 | # {{ $frontmatter.title }} 6 | 7 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "nixpkgs": { 4 | "locked": { 5 | "lastModified": 1739446958, 6 | "narHash": "sha256-+/bYK3DbPxMIvSL4zArkMX0LQvS7rzBKXnDXLfKyRVc=", 7 | "owner": "NixOS", 8 | "repo": "nixpkgs", 9 | "rev": "2ff53fe64443980e139eaa286017f53f88336dd0", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "NixOS", 14 | "ref": "nixos-unstable", 15 | "repo": "nixpkgs", 16 | "type": "github" 17 | } 18 | }, 19 | "root": { 20 | "inputs": { 21 | "nixpkgs": "nixpkgs" 22 | } 23 | } 24 | }, 25 | "root": "root", 26 | "version": 7 27 | } 28 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs = { 3 | nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-unstable"; 4 | }; 5 | 6 | outputs = 7 | { self, nixpkgs }: 8 | let 9 | forAllSystems = 10 | function: 11 | nixpkgs.lib.genAttrs [ 12 | "x86_64-linux" 13 | "aarch64-linux" 14 | ] (system: function nixpkgs.legacyPackages.${system}); 15 | in 16 | { 17 | lib = { 18 | home = import ./nix/home/default.nix; 19 | homeBundle = args: (self.lib.home args).config.build.bundle; 20 | }; 21 | 22 | nixosModules.home = ./nix/home/nixos-module.nix; 23 | 24 | packages = forAllSystems (pkgs: { 25 | default = pkgs.callPackage ./nix/package.nix { }; 26 | optionsJSON = 27 | (pkgs.nixosOptionsDoc { 28 | options = 29 | (self.lib.home { 30 | inherit pkgs; 31 | }).options; 32 | }).optionsJSON; 33 | }); 34 | 35 | devShells = forAllSystems (pkgs: { 36 | default = 37 | with pkgs; 38 | mkShell { 39 | packages = [ 40 | pkgs.cargo 41 | pkgs.rustc 42 | pkgs.clippy 43 | 44 | pkgs.rust-analyzer 45 | pkgs.rustfmt 46 | pkgs.yaml-language-server 47 | 48 | # If the dependencies need system libs, you usually need pkg-config + the lib 49 | pkgs.pkg-config 50 | lua54Packages.lua 51 | lua-language-server 52 | 53 | (pkgs.nodejs.override { enableNpm = false; }) 54 | pkgs.pnpm 55 | ]; 56 | env = { 57 | RUST_BACKTRACE = "full"; 58 | RUST_SRC_PATH = "${rustPlatform.rustLibSrc}"; 59 | OPTIONS_JSON = self.packages.${system}.optionsJSON; 60 | }; 61 | }; 62 | }); 63 | }; 64 | } 65 | -------------------------------------------------------------------------------- /nix/home/core.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs, 3 | config, 4 | options, 5 | lib, 6 | ... 7 | }: 8 | let 9 | inherit (lib) mkOption types; 10 | 11 | fileSubmodule = 12 | { name, ... }: 13 | { 14 | options = { 15 | target = mkOption { 16 | type = types.str; 17 | description = '' 18 | File that the link will point to. 19 | ''; 20 | }; 21 | link = mkOption { 22 | type = types.str; 23 | default = name; 24 | description = '' 25 | Location of the link. 26 | ''; 27 | }; 28 | }; 29 | }; 30 | in 31 | { 32 | options = { 33 | build = { 34 | package = mkOption { 35 | type = types.package; 36 | default = pkgs.callPackage ../package.nix { }; 37 | description = "FIXME"; 38 | }; 39 | 40 | manifest = mkOption { 41 | type = types.package; 42 | description = "FIXME"; 43 | }; 44 | 45 | bundle = mkOption { 46 | type = types.package; 47 | description = "FIXME"; 48 | }; 49 | 50 | optionsDoc = mkOption { 51 | type = types.attrsOf types.package; 52 | visible = false; 53 | default = pkgs.nixosOptionsDoc { 54 | inherit options; 55 | }; 56 | readOnly = true; 57 | description = "FIXME"; 58 | }; 59 | }; 60 | 61 | home = { 62 | file = mkOption { 63 | default = { }; 64 | type = types.attrsOf (types.submodule fileSubmodule); 65 | description = '' 66 | Create a symlink declaratively by specifying its target link and its location. 67 | ''; 68 | }; 69 | }; 70 | 71 | dconf = { 72 | settings = mkOption { 73 | default = { }; 74 | type = types.attrsOf (types.anything); 75 | example = { 76 | "/org/gnome/desktop/interface/color-scheme" = "prefer-dark"; 77 | }; 78 | description = '' 79 | Pairs of dconf key path and its value. 80 | ''; 81 | }; 82 | }; 83 | }; 84 | 85 | config = { 86 | build.manifest = 87 | pkgs.writeText "manifest.lua" 88 | # lua 89 | '' 90 | local am = require("am") 91 | local os = require("os") 92 | local home = os.getenv("HOME") 93 | 94 | local static = home .. "/.local/state/activation-manager/static" 95 | local static_new = static .. "-" .. os.time() 96 | 97 | ${ 98 | config.home.file 99 | |> builtins.attrValues 100 | |> (map (node: 101 | # lua 102 | '' 103 | am.file { 104 | link = home .. "/${node.link}", 105 | target = static .. "/${node.link}", 106 | } 107 | 108 | am.file { 109 | link = static_new .. "/${node.link}", 110 | target = home .. "/${node.target}", 111 | } 112 | '')) 113 | |> builtins.concatStringsSep "\n" 114 | } 115 | 116 | am.file { 117 | link = static, 118 | target = static_new, 119 | } 120 | 121 | ${ 122 | config.dconf.settings 123 | |> lib.attrsToList 124 | |> map ( 125 | { name, value }: 126 | # lua 127 | "am.dconf ${ 128 | lib.generators.toLua { } { 129 | inherit value; 130 | key = name; 131 | } 132 | }" 133 | ) 134 | |> builtins.concatStringsSep "\n" 135 | } 136 | ''; 137 | 138 | build.bundle = 139 | pkgs.runCommandLocal "am-bundle" 140 | { 141 | nativeBuildInputs = [ pkgs.makeWrapper ]; 142 | meta.mainProgram = "activate"; 143 | } 144 | '' 145 | mkdir -p $out/bin 146 | makeWrapper ${lib.getExe config.build.package} $out/bin/activate \ 147 | --append-flags ${config.build.manifest} 148 | ''; 149 | }; 150 | 151 | } 152 | -------------------------------------------------------------------------------- /nix/home/default.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs ? import { }, 3 | lib ? pkgs.lib, 4 | modules ? [ ], 5 | ... 6 | }: 7 | lib.evalModules { 8 | modules = [ ./core.nix ] ++ modules; 9 | specialArgs = { inherit pkgs; }; 10 | } 11 | -------------------------------------------------------------------------------- /nix/home/nixos-module.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs, 3 | lib, 4 | ... 5 | }: 6 | let 7 | inherit (lib) mkOption types; 8 | 9 | in 10 | { 11 | 12 | options.activation-manager = { 13 | mkHome = mkOption { 14 | type = types.functionTo types.package; 15 | readOnly = true; 16 | }; 17 | }; 18 | 19 | config = { 20 | systemd.user.services."activation-manager" = { 21 | wantedBy = [ "default.target" ]; 22 | script = '' 23 | activate="/etc/profiles/per-user/$USER/bin/activate" 24 | if [[ -f "$activate" ]]; then 25 | exec "$activate" 26 | else 27 | echo ":: Activation-manager not installed for this user" 28 | fi 29 | ''; 30 | }; 31 | 32 | activation-manager.mkHome = 33 | module: 34 | (import ./default.nix { 35 | inherit pkgs lib; 36 | modules = [ module ]; 37 | }).config.build.bundle; 38 | }; 39 | 40 | } 41 | -------------------------------------------------------------------------------- /nix/package.nix: -------------------------------------------------------------------------------- 1 | { 2 | rustPlatform, 3 | lib, 4 | pkg-config, 5 | lua54Packages, 6 | }: 7 | let 8 | cargoToml = builtins.fromTOML (builtins.readFile ../Cargo.toml); 9 | in 10 | rustPlatform.buildRustPackage { 11 | pname = cargoToml.package.name; 12 | version = cargoToml.package.version; 13 | 14 | src = lib.fileset.toSource { 15 | root = ../.; 16 | fileset = lib.fileset.intersection (lib.fileset.fromSource (lib.sources.cleanSource ../.)) ( 17 | lib.fileset.unions [ 18 | ../src 19 | ../Cargo.toml 20 | ../Cargo.lock 21 | ] 22 | ); 23 | }; 24 | 25 | cargoLock.lockFile = ../Cargo.lock; 26 | 27 | nativeBuildInputs = [ 28 | pkg-config 29 | ]; 30 | 31 | buildInputs = [ 32 | lua54Packages.lua 33 | ]; 34 | 35 | meta.mainProgram = cargoToml.package.name; 36 | } 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "activation-manager-documentation", 3 | "type": "module", 4 | "scripts": { 5 | "build": "vitepress build doc", 6 | "dev": "vitepress dev doc" 7 | }, 8 | "packageManager": "pnpm@10.4.1", 9 | "devDependencies": { 10 | "easy-nix-documentation": "^1.0.7", 11 | "vitepress": "^1.6.3" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | easy-nix-documentation: 12 | specifier: ^1.0.7 13 | version: 1.0.7(@algolia/client-search@5.20.4)(postcss@8.5.3)(search-insights@2.17.3) 14 | vitepress: 15 | specifier: ^1.6.3 16 | version: 1.6.3(@algolia/client-search@5.20.4)(@types/node@22.13.10)(postcss@8.5.3)(search-insights@2.17.3) 17 | 18 | packages: 19 | 20 | '@algolia/autocomplete-core@1.17.7': 21 | resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} 22 | 23 | '@algolia/autocomplete-plugin-algolia-insights@1.17.7': 24 | resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} 25 | peerDependencies: 26 | search-insights: '>= 1 < 3' 27 | 28 | '@algolia/autocomplete-preset-algolia@1.17.7': 29 | resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} 30 | peerDependencies: 31 | '@algolia/client-search': '>= 4.9.1 < 6' 32 | algoliasearch: '>= 4.9.1 < 6' 33 | 34 | '@algolia/autocomplete-shared@1.17.7': 35 | resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} 36 | peerDependencies: 37 | '@algolia/client-search': '>= 4.9.1 < 6' 38 | algoliasearch: '>= 4.9.1 < 6' 39 | 40 | '@algolia/client-abtesting@5.20.4': 41 | resolution: {integrity: sha512-OZ3Xvvf+k7NMcwmmioIVX+76E/KKtN607NCMNsBEKe+uHqktZ+I5bmi/EVr2m5VF59Gnh9MTlJCdXtBiGjruxw==} 42 | engines: {node: '>= 14.0.0'} 43 | 44 | '@algolia/client-analytics@5.20.4': 45 | resolution: {integrity: sha512-8pM5zQpHonCIBxKmMyBLgQoaSKUNBE5u741VEIjn2ArujolhoKRXempRAlLwEg5hrORKl9XIlit00ff4g6LWvA==} 46 | engines: {node: '>= 14.0.0'} 47 | 48 | '@algolia/client-common@5.20.4': 49 | resolution: {integrity: sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==} 50 | engines: {node: '>= 14.0.0'} 51 | 52 | '@algolia/client-insights@5.20.4': 53 | resolution: {integrity: sha512-MroyJStJFLf/cYeCbguCRdrA2U6miDVqbi3t9ZGovBWWTef7BZwVQG0mLyInzp4MIjBfwqu3xTrhxsiiOavX3A==} 54 | engines: {node: '>= 14.0.0'} 55 | 56 | '@algolia/client-personalization@5.20.4': 57 | resolution: {integrity: sha512-bVR5sxFfgCQ+G0ZegGVhBqtaDd7jCfr33m5mGuT43U+bH//xeqAHQyIS4abcmRulwqeIAHNm5Yl2J7grT3z//A==} 58 | engines: {node: '>= 14.0.0'} 59 | 60 | '@algolia/client-query-suggestions@5.20.4': 61 | resolution: {integrity: sha512-ZHsV0vceNDR87wIVaz7VjxilwCUCkzbuy4QnqIdnQs3NnC43is7KKbEtKueuNw+YGMdx+wmD5kRI2XKip1R93A==} 62 | engines: {node: '>= 14.0.0'} 63 | 64 | '@algolia/client-search@5.20.4': 65 | resolution: {integrity: sha512-hXM2LpwTzG5kGQSyq3feIijzzl6vkjYPP+LF3ru1relNUIh7fWJ4uYQay2NMNbWX5LWQzF8Vr9qlIA139doQXg==} 66 | engines: {node: '>= 14.0.0'} 67 | 68 | '@algolia/ingestion@1.20.4': 69 | resolution: {integrity: sha512-idAe53XsTlLSSQ7pJcjscUEmc67vEM+VohYkr78Ebfb43vtfKH0ik8ux9OGQpLRNGntaHqpe/lfU5PDRi5/92w==} 70 | engines: {node: '>= 14.0.0'} 71 | 72 | '@algolia/monitoring@1.20.4': 73 | resolution: {integrity: sha512-O6HjdSWtyu5LhHR7gdU83oWbl1vVVRwoTxkENHF61Ar7l9C1Ok91VtnK7RtXB9pJL1kpIMDExwZOT5sEN2Ppfw==} 74 | engines: {node: '>= 14.0.0'} 75 | 76 | '@algolia/recommend@5.20.4': 77 | resolution: {integrity: sha512-p8M78pQjPrN6PudO2TnkWiOJbyp/IPhgCFBW8aZrLshhZpPkV9N4u0YsU/w6OoeYDKSxmXntWQrKYiU1dVRWfg==} 78 | engines: {node: '>= 14.0.0'} 79 | 80 | '@algolia/requester-browser-xhr@5.20.4': 81 | resolution: {integrity: sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==} 82 | engines: {node: '>= 14.0.0'} 83 | 84 | '@algolia/requester-fetch@5.20.4': 85 | resolution: {integrity: sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==} 86 | engines: {node: '>= 14.0.0'} 87 | 88 | '@algolia/requester-node-http@5.20.4': 89 | resolution: {integrity: sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==} 90 | engines: {node: '>= 14.0.0'} 91 | 92 | '@babel/helper-string-parser@7.25.9': 93 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 94 | engines: {node: '>=6.9.0'} 95 | 96 | '@babel/helper-validator-identifier@7.25.9': 97 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 98 | engines: {node: '>=6.9.0'} 99 | 100 | '@babel/parser@7.26.9': 101 | resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} 102 | engines: {node: '>=6.0.0'} 103 | hasBin: true 104 | 105 | '@babel/types@7.26.9': 106 | resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} 107 | engines: {node: '>=6.9.0'} 108 | 109 | '@docsearch/css@3.8.2': 110 | resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} 111 | 112 | '@docsearch/js@3.8.2': 113 | resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} 114 | 115 | '@docsearch/react@3.8.2': 116 | resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} 117 | peerDependencies: 118 | '@types/react': '>= 16.8.0 < 19.0.0' 119 | react: '>= 16.8.0 < 19.0.0' 120 | react-dom: '>= 16.8.0 < 19.0.0' 121 | search-insights: '>= 1 < 3' 122 | peerDependenciesMeta: 123 | '@types/react': 124 | optional: true 125 | react: 126 | optional: true 127 | react-dom: 128 | optional: true 129 | search-insights: 130 | optional: true 131 | 132 | '@esbuild/aix-ppc64@0.21.5': 133 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 134 | engines: {node: '>=12'} 135 | cpu: [ppc64] 136 | os: [aix] 137 | 138 | '@esbuild/android-arm64@0.21.5': 139 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 140 | engines: {node: '>=12'} 141 | cpu: [arm64] 142 | os: [android] 143 | 144 | '@esbuild/android-arm@0.21.5': 145 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 146 | engines: {node: '>=12'} 147 | cpu: [arm] 148 | os: [android] 149 | 150 | '@esbuild/android-x64@0.21.5': 151 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 152 | engines: {node: '>=12'} 153 | cpu: [x64] 154 | os: [android] 155 | 156 | '@esbuild/darwin-arm64@0.21.5': 157 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 158 | engines: {node: '>=12'} 159 | cpu: [arm64] 160 | os: [darwin] 161 | 162 | '@esbuild/darwin-x64@0.21.5': 163 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 164 | engines: {node: '>=12'} 165 | cpu: [x64] 166 | os: [darwin] 167 | 168 | '@esbuild/freebsd-arm64@0.21.5': 169 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 170 | engines: {node: '>=12'} 171 | cpu: [arm64] 172 | os: [freebsd] 173 | 174 | '@esbuild/freebsd-x64@0.21.5': 175 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 176 | engines: {node: '>=12'} 177 | cpu: [x64] 178 | os: [freebsd] 179 | 180 | '@esbuild/linux-arm64@0.21.5': 181 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 182 | engines: {node: '>=12'} 183 | cpu: [arm64] 184 | os: [linux] 185 | 186 | '@esbuild/linux-arm@0.21.5': 187 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 188 | engines: {node: '>=12'} 189 | cpu: [arm] 190 | os: [linux] 191 | 192 | '@esbuild/linux-ia32@0.21.5': 193 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 194 | engines: {node: '>=12'} 195 | cpu: [ia32] 196 | os: [linux] 197 | 198 | '@esbuild/linux-loong64@0.21.5': 199 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 200 | engines: {node: '>=12'} 201 | cpu: [loong64] 202 | os: [linux] 203 | 204 | '@esbuild/linux-mips64el@0.21.5': 205 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 206 | engines: {node: '>=12'} 207 | cpu: [mips64el] 208 | os: [linux] 209 | 210 | '@esbuild/linux-ppc64@0.21.5': 211 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 212 | engines: {node: '>=12'} 213 | cpu: [ppc64] 214 | os: [linux] 215 | 216 | '@esbuild/linux-riscv64@0.21.5': 217 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 218 | engines: {node: '>=12'} 219 | cpu: [riscv64] 220 | os: [linux] 221 | 222 | '@esbuild/linux-s390x@0.21.5': 223 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 224 | engines: {node: '>=12'} 225 | cpu: [s390x] 226 | os: [linux] 227 | 228 | '@esbuild/linux-x64@0.21.5': 229 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 230 | engines: {node: '>=12'} 231 | cpu: [x64] 232 | os: [linux] 233 | 234 | '@esbuild/netbsd-x64@0.21.5': 235 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 236 | engines: {node: '>=12'} 237 | cpu: [x64] 238 | os: [netbsd] 239 | 240 | '@esbuild/openbsd-x64@0.21.5': 241 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 242 | engines: {node: '>=12'} 243 | cpu: [x64] 244 | os: [openbsd] 245 | 246 | '@esbuild/sunos-x64@0.21.5': 247 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 248 | engines: {node: '>=12'} 249 | cpu: [x64] 250 | os: [sunos] 251 | 252 | '@esbuild/win32-arm64@0.21.5': 253 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 254 | engines: {node: '>=12'} 255 | cpu: [arm64] 256 | os: [win32] 257 | 258 | '@esbuild/win32-ia32@0.21.5': 259 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 260 | engines: {node: '>=12'} 261 | cpu: [ia32] 262 | os: [win32] 263 | 264 | '@esbuild/win32-x64@0.21.5': 265 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 266 | engines: {node: '>=12'} 267 | cpu: [x64] 268 | os: [win32] 269 | 270 | '@iconify-json/simple-icons@1.2.27': 271 | resolution: {integrity: sha512-FtZwp/H7ih5rY9FPfDR+k6toOo/cuwpHWY8faNhxLs5O5uW6Q8TeqdNWfjVfgFtrs5tUUzWysjqNGL234v8EMA==} 272 | 273 | '@iconify/types@2.0.0': 274 | resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 275 | 276 | '@jridgewell/sourcemap-codec@1.5.0': 277 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 278 | 279 | '@rollup/rollup-android-arm-eabi@4.35.0': 280 | resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} 281 | cpu: [arm] 282 | os: [android] 283 | 284 | '@rollup/rollup-android-arm64@4.35.0': 285 | resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==} 286 | cpu: [arm64] 287 | os: [android] 288 | 289 | '@rollup/rollup-darwin-arm64@4.35.0': 290 | resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==} 291 | cpu: [arm64] 292 | os: [darwin] 293 | 294 | '@rollup/rollup-darwin-x64@4.35.0': 295 | resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==} 296 | cpu: [x64] 297 | os: [darwin] 298 | 299 | '@rollup/rollup-freebsd-arm64@4.35.0': 300 | resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==} 301 | cpu: [arm64] 302 | os: [freebsd] 303 | 304 | '@rollup/rollup-freebsd-x64@4.35.0': 305 | resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==} 306 | cpu: [x64] 307 | os: [freebsd] 308 | 309 | '@rollup/rollup-linux-arm-gnueabihf@4.35.0': 310 | resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==} 311 | cpu: [arm] 312 | os: [linux] 313 | 314 | '@rollup/rollup-linux-arm-musleabihf@4.35.0': 315 | resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==} 316 | cpu: [arm] 317 | os: [linux] 318 | 319 | '@rollup/rollup-linux-arm64-gnu@4.35.0': 320 | resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==} 321 | cpu: [arm64] 322 | os: [linux] 323 | 324 | '@rollup/rollup-linux-arm64-musl@4.35.0': 325 | resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==} 326 | cpu: [arm64] 327 | os: [linux] 328 | 329 | '@rollup/rollup-linux-loongarch64-gnu@4.35.0': 330 | resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==} 331 | cpu: [loong64] 332 | os: [linux] 333 | 334 | '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': 335 | resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==} 336 | cpu: [ppc64] 337 | os: [linux] 338 | 339 | '@rollup/rollup-linux-riscv64-gnu@4.35.0': 340 | resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==} 341 | cpu: [riscv64] 342 | os: [linux] 343 | 344 | '@rollup/rollup-linux-s390x-gnu@4.35.0': 345 | resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==} 346 | cpu: [s390x] 347 | os: [linux] 348 | 349 | '@rollup/rollup-linux-x64-gnu@4.35.0': 350 | resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==} 351 | cpu: [x64] 352 | os: [linux] 353 | 354 | '@rollup/rollup-linux-x64-musl@4.35.0': 355 | resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==} 356 | cpu: [x64] 357 | os: [linux] 358 | 359 | '@rollup/rollup-win32-arm64-msvc@4.35.0': 360 | resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==} 361 | cpu: [arm64] 362 | os: [win32] 363 | 364 | '@rollup/rollup-win32-ia32-msvc@4.35.0': 365 | resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==} 366 | cpu: [ia32] 367 | os: [win32] 368 | 369 | '@rollup/rollup-win32-x64-msvc@4.35.0': 370 | resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==} 371 | cpu: [x64] 372 | os: [win32] 373 | 374 | '@shikijs/core@2.5.0': 375 | resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} 376 | 377 | '@shikijs/engine-javascript@2.5.0': 378 | resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} 379 | 380 | '@shikijs/engine-oniguruma@2.5.0': 381 | resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} 382 | 383 | '@shikijs/langs@2.5.0': 384 | resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} 385 | 386 | '@shikijs/themes@2.5.0': 387 | resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} 388 | 389 | '@shikijs/transformers@2.5.0': 390 | resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} 391 | 392 | '@shikijs/types@2.5.0': 393 | resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} 394 | 395 | '@shikijs/vscode-textmate@10.0.2': 396 | resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 397 | 398 | '@types/estree@1.0.6': 399 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 400 | 401 | '@types/hast@3.0.4': 402 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 403 | 404 | '@types/linkify-it@5.0.0': 405 | resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} 406 | 407 | '@types/markdown-it@14.1.2': 408 | resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} 409 | 410 | '@types/mdast@4.0.4': 411 | resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 412 | 413 | '@types/mdurl@2.0.0': 414 | resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} 415 | 416 | '@types/node@22.13.10': 417 | resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} 418 | 419 | '@types/unist@3.0.3': 420 | resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 421 | 422 | '@types/web-bluetooth@0.0.21': 423 | resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} 424 | 425 | '@ungap/structured-clone@1.3.0': 426 | resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 427 | 428 | '@vitejs/plugin-vue@5.2.1': 429 | resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} 430 | engines: {node: ^18.0.0 || >=20.0.0} 431 | peerDependencies: 432 | vite: ^5.0.0 || ^6.0.0 433 | vue: ^3.2.25 434 | 435 | '@vue/compiler-core@3.5.13': 436 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 437 | 438 | '@vue/compiler-dom@3.5.13': 439 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 440 | 441 | '@vue/compiler-sfc@3.5.13': 442 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 443 | 444 | '@vue/compiler-ssr@3.5.13': 445 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 446 | 447 | '@vue/devtools-api@7.7.2': 448 | resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==} 449 | 450 | '@vue/devtools-kit@7.7.2': 451 | resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==} 452 | 453 | '@vue/devtools-shared@7.7.2': 454 | resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==} 455 | 456 | '@vue/reactivity@3.5.13': 457 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 458 | 459 | '@vue/runtime-core@3.5.13': 460 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 461 | 462 | '@vue/runtime-dom@3.5.13': 463 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 464 | 465 | '@vue/server-renderer@3.5.13': 466 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 467 | peerDependencies: 468 | vue: 3.5.13 469 | 470 | '@vue/shared@3.5.13': 471 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 472 | 473 | '@vueuse/core@12.8.2': 474 | resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} 475 | 476 | '@vueuse/integrations@12.8.2': 477 | resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} 478 | peerDependencies: 479 | async-validator: ^4 480 | axios: ^1 481 | change-case: ^5 482 | drauu: ^0.4 483 | focus-trap: ^7 484 | fuse.js: ^7 485 | idb-keyval: ^6 486 | jwt-decode: ^4 487 | nprogress: ^0.2 488 | qrcode: ^1.5 489 | sortablejs: ^1 490 | universal-cookie: ^7 491 | peerDependenciesMeta: 492 | async-validator: 493 | optional: true 494 | axios: 495 | optional: true 496 | change-case: 497 | optional: true 498 | drauu: 499 | optional: true 500 | focus-trap: 501 | optional: true 502 | fuse.js: 503 | optional: true 504 | idb-keyval: 505 | optional: true 506 | jwt-decode: 507 | optional: true 508 | nprogress: 509 | optional: true 510 | qrcode: 511 | optional: true 512 | sortablejs: 513 | optional: true 514 | universal-cookie: 515 | optional: true 516 | 517 | '@vueuse/metadata@12.8.2': 518 | resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} 519 | 520 | '@vueuse/shared@12.8.2': 521 | resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} 522 | 523 | algoliasearch@5.20.4: 524 | resolution: {integrity: sha512-wjfzqruxovJyDqga8M6Xk5XtfuVg3igrWjhjgkRya87+WwfEa1kg+IluujBLzgAiMSd6rO6jqRb7czjgeeSYgQ==} 525 | engines: {node: '>= 14.0.0'} 526 | 527 | birpc@0.2.19: 528 | resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} 529 | 530 | ccount@2.0.1: 531 | resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 532 | 533 | character-entities-html4@2.1.0: 534 | resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 535 | 536 | character-entities-legacy@3.0.0: 537 | resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 538 | 539 | comma-separated-tokens@2.0.3: 540 | resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 541 | 542 | copy-anything@3.0.5: 543 | resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} 544 | engines: {node: '>=12.13'} 545 | 546 | csstype@3.1.3: 547 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 548 | 549 | dequal@2.0.3: 550 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 551 | engines: {node: '>=6'} 552 | 553 | devlop@1.1.0: 554 | resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 555 | 556 | easy-nix-documentation@1.0.7: 557 | resolution: {integrity: sha512-WyU4Keopd9W/MmKjoejD9l4SsJA9o6mNTbMLEOgy8TrzqUaaqJnL64r95LCgEScwq2WKdW0oeB8aHvQY+5cCNA==} 558 | 559 | emoji-regex-xs@1.0.0: 560 | resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} 561 | 562 | entities@4.5.0: 563 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 564 | engines: {node: '>=0.12'} 565 | 566 | esbuild@0.21.5: 567 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 568 | engines: {node: '>=12'} 569 | hasBin: true 570 | 571 | estree-walker@2.0.2: 572 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 573 | 574 | focus-trap@7.6.4: 575 | resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} 576 | 577 | fsevents@2.3.3: 578 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 579 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 580 | os: [darwin] 581 | 582 | hast-util-to-html@9.0.5: 583 | resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 584 | 585 | hast-util-whitespace@3.0.0: 586 | resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 587 | 588 | hookable@5.5.3: 589 | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} 590 | 591 | html-void-elements@3.0.0: 592 | resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 593 | 594 | is-what@4.1.16: 595 | resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 596 | engines: {node: '>=12.13'} 597 | 598 | magic-string@0.30.17: 599 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 600 | 601 | mark.js@8.11.1: 602 | resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} 603 | 604 | mdast-util-to-hast@13.2.0: 605 | resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} 606 | 607 | micromark-util-character@2.1.1: 608 | resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 609 | 610 | micromark-util-encode@2.0.1: 611 | resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 612 | 613 | micromark-util-sanitize-uri@2.0.1: 614 | resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 615 | 616 | micromark-util-symbol@2.0.1: 617 | resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 618 | 619 | micromark-util-types@2.0.2: 620 | resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 621 | 622 | minisearch@7.1.2: 623 | resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} 624 | 625 | mitt@3.0.1: 626 | resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} 627 | 628 | nanoid@3.3.9: 629 | resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} 630 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 631 | hasBin: true 632 | 633 | oniguruma-to-es@3.1.1: 634 | resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} 635 | 636 | perfect-debounce@1.0.0: 637 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 638 | 639 | picocolors@1.1.1: 640 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 641 | 642 | postcss@8.5.3: 643 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 644 | engines: {node: ^10 || ^12 || >=14} 645 | 646 | preact@10.26.4: 647 | resolution: {integrity: sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==} 648 | 649 | property-information@7.0.0: 650 | resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} 651 | 652 | regex-recursion@6.0.2: 653 | resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} 654 | 655 | regex-utilities@2.3.0: 656 | resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} 657 | 658 | regex@6.0.1: 659 | resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} 660 | 661 | rfdc@1.4.1: 662 | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 663 | 664 | rollup@4.35.0: 665 | resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} 666 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 667 | hasBin: true 668 | 669 | search-insights@2.17.3: 670 | resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} 671 | 672 | shiki@2.5.0: 673 | resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} 674 | 675 | source-map-js@1.2.1: 676 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 677 | engines: {node: '>=0.10.0'} 678 | 679 | space-separated-tokens@2.0.2: 680 | resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 681 | 682 | speakingurl@14.0.1: 683 | resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} 684 | engines: {node: '>=0.10.0'} 685 | 686 | stringify-entities@4.0.4: 687 | resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 688 | 689 | superjson@2.2.2: 690 | resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} 691 | engines: {node: '>=16'} 692 | 693 | tabbable@6.2.0: 694 | resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 695 | 696 | trim-lines@3.0.1: 697 | resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 698 | 699 | undici-types@6.20.0: 700 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 701 | 702 | unist-util-is@6.0.0: 703 | resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 704 | 705 | unist-util-position@5.0.0: 706 | resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 707 | 708 | unist-util-stringify-position@4.0.0: 709 | resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 710 | 711 | unist-util-visit-parents@6.0.1: 712 | resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 713 | 714 | unist-util-visit@5.0.0: 715 | resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 716 | 717 | vfile-message@4.0.2: 718 | resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 719 | 720 | vfile@6.0.3: 721 | resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 722 | 723 | vite@5.4.14: 724 | resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} 725 | engines: {node: ^18.0.0 || >=20.0.0} 726 | hasBin: true 727 | peerDependencies: 728 | '@types/node': ^18.0.0 || >=20.0.0 729 | less: '*' 730 | lightningcss: ^1.21.0 731 | sass: '*' 732 | sass-embedded: '*' 733 | stylus: '*' 734 | sugarss: '*' 735 | terser: ^5.4.0 736 | peerDependenciesMeta: 737 | '@types/node': 738 | optional: true 739 | less: 740 | optional: true 741 | lightningcss: 742 | optional: true 743 | sass: 744 | optional: true 745 | sass-embedded: 746 | optional: true 747 | stylus: 748 | optional: true 749 | sugarss: 750 | optional: true 751 | terser: 752 | optional: true 753 | 754 | vitepress@1.6.3: 755 | resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} 756 | hasBin: true 757 | peerDependencies: 758 | markdown-it-mathjax3: ^4 759 | postcss: ^8 760 | peerDependenciesMeta: 761 | markdown-it-mathjax3: 762 | optional: true 763 | postcss: 764 | optional: true 765 | 766 | vue@3.5.13: 767 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 768 | peerDependencies: 769 | typescript: '*' 770 | peerDependenciesMeta: 771 | typescript: 772 | optional: true 773 | 774 | zwitch@2.0.4: 775 | resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 776 | 777 | snapshots: 778 | 779 | '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4)(search-insights@2.17.3)': 780 | dependencies: 781 | '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4)(search-insights@2.17.3) 782 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4) 783 | transitivePeerDependencies: 784 | - '@algolia/client-search' 785 | - algoliasearch 786 | - search-insights 787 | 788 | '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4)(search-insights@2.17.3)': 789 | dependencies: 790 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4) 791 | search-insights: 2.17.3 792 | transitivePeerDependencies: 793 | - '@algolia/client-search' 794 | - algoliasearch 795 | 796 | '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4)': 797 | dependencies: 798 | '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4) 799 | '@algolia/client-search': 5.20.4 800 | algoliasearch: 5.20.4 801 | 802 | '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4)': 803 | dependencies: 804 | '@algolia/client-search': 5.20.4 805 | algoliasearch: 5.20.4 806 | 807 | '@algolia/client-abtesting@5.20.4': 808 | dependencies: 809 | '@algolia/client-common': 5.20.4 810 | '@algolia/requester-browser-xhr': 5.20.4 811 | '@algolia/requester-fetch': 5.20.4 812 | '@algolia/requester-node-http': 5.20.4 813 | 814 | '@algolia/client-analytics@5.20.4': 815 | dependencies: 816 | '@algolia/client-common': 5.20.4 817 | '@algolia/requester-browser-xhr': 5.20.4 818 | '@algolia/requester-fetch': 5.20.4 819 | '@algolia/requester-node-http': 5.20.4 820 | 821 | '@algolia/client-common@5.20.4': {} 822 | 823 | '@algolia/client-insights@5.20.4': 824 | dependencies: 825 | '@algolia/client-common': 5.20.4 826 | '@algolia/requester-browser-xhr': 5.20.4 827 | '@algolia/requester-fetch': 5.20.4 828 | '@algolia/requester-node-http': 5.20.4 829 | 830 | '@algolia/client-personalization@5.20.4': 831 | dependencies: 832 | '@algolia/client-common': 5.20.4 833 | '@algolia/requester-browser-xhr': 5.20.4 834 | '@algolia/requester-fetch': 5.20.4 835 | '@algolia/requester-node-http': 5.20.4 836 | 837 | '@algolia/client-query-suggestions@5.20.4': 838 | dependencies: 839 | '@algolia/client-common': 5.20.4 840 | '@algolia/requester-browser-xhr': 5.20.4 841 | '@algolia/requester-fetch': 5.20.4 842 | '@algolia/requester-node-http': 5.20.4 843 | 844 | '@algolia/client-search@5.20.4': 845 | dependencies: 846 | '@algolia/client-common': 5.20.4 847 | '@algolia/requester-browser-xhr': 5.20.4 848 | '@algolia/requester-fetch': 5.20.4 849 | '@algolia/requester-node-http': 5.20.4 850 | 851 | '@algolia/ingestion@1.20.4': 852 | dependencies: 853 | '@algolia/client-common': 5.20.4 854 | '@algolia/requester-browser-xhr': 5.20.4 855 | '@algolia/requester-fetch': 5.20.4 856 | '@algolia/requester-node-http': 5.20.4 857 | 858 | '@algolia/monitoring@1.20.4': 859 | dependencies: 860 | '@algolia/client-common': 5.20.4 861 | '@algolia/requester-browser-xhr': 5.20.4 862 | '@algolia/requester-fetch': 5.20.4 863 | '@algolia/requester-node-http': 5.20.4 864 | 865 | '@algolia/recommend@5.20.4': 866 | dependencies: 867 | '@algolia/client-common': 5.20.4 868 | '@algolia/requester-browser-xhr': 5.20.4 869 | '@algolia/requester-fetch': 5.20.4 870 | '@algolia/requester-node-http': 5.20.4 871 | 872 | '@algolia/requester-browser-xhr@5.20.4': 873 | dependencies: 874 | '@algolia/client-common': 5.20.4 875 | 876 | '@algolia/requester-fetch@5.20.4': 877 | dependencies: 878 | '@algolia/client-common': 5.20.4 879 | 880 | '@algolia/requester-node-http@5.20.4': 881 | dependencies: 882 | '@algolia/client-common': 5.20.4 883 | 884 | '@babel/helper-string-parser@7.25.9': {} 885 | 886 | '@babel/helper-validator-identifier@7.25.9': {} 887 | 888 | '@babel/parser@7.26.9': 889 | dependencies: 890 | '@babel/types': 7.26.9 891 | 892 | '@babel/types@7.26.9': 893 | dependencies: 894 | '@babel/helper-string-parser': 7.25.9 895 | '@babel/helper-validator-identifier': 7.25.9 896 | 897 | '@docsearch/css@3.8.2': {} 898 | 899 | '@docsearch/js@3.8.2(@algolia/client-search@5.20.4)(search-insights@2.17.3)': 900 | dependencies: 901 | '@docsearch/react': 3.8.2(@algolia/client-search@5.20.4)(search-insights@2.17.3) 902 | preact: 10.26.4 903 | transitivePeerDependencies: 904 | - '@algolia/client-search' 905 | - '@types/react' 906 | - react 907 | - react-dom 908 | - search-insights 909 | 910 | '@docsearch/react@3.8.2(@algolia/client-search@5.20.4)(search-insights@2.17.3)': 911 | dependencies: 912 | '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4)(search-insights@2.17.3) 913 | '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.20.4)(algoliasearch@5.20.4) 914 | '@docsearch/css': 3.8.2 915 | algoliasearch: 5.20.4 916 | optionalDependencies: 917 | search-insights: 2.17.3 918 | transitivePeerDependencies: 919 | - '@algolia/client-search' 920 | 921 | '@esbuild/aix-ppc64@0.21.5': 922 | optional: true 923 | 924 | '@esbuild/android-arm64@0.21.5': 925 | optional: true 926 | 927 | '@esbuild/android-arm@0.21.5': 928 | optional: true 929 | 930 | '@esbuild/android-x64@0.21.5': 931 | optional: true 932 | 933 | '@esbuild/darwin-arm64@0.21.5': 934 | optional: true 935 | 936 | '@esbuild/darwin-x64@0.21.5': 937 | optional: true 938 | 939 | '@esbuild/freebsd-arm64@0.21.5': 940 | optional: true 941 | 942 | '@esbuild/freebsd-x64@0.21.5': 943 | optional: true 944 | 945 | '@esbuild/linux-arm64@0.21.5': 946 | optional: true 947 | 948 | '@esbuild/linux-arm@0.21.5': 949 | optional: true 950 | 951 | '@esbuild/linux-ia32@0.21.5': 952 | optional: true 953 | 954 | '@esbuild/linux-loong64@0.21.5': 955 | optional: true 956 | 957 | '@esbuild/linux-mips64el@0.21.5': 958 | optional: true 959 | 960 | '@esbuild/linux-ppc64@0.21.5': 961 | optional: true 962 | 963 | '@esbuild/linux-riscv64@0.21.5': 964 | optional: true 965 | 966 | '@esbuild/linux-s390x@0.21.5': 967 | optional: true 968 | 969 | '@esbuild/linux-x64@0.21.5': 970 | optional: true 971 | 972 | '@esbuild/netbsd-x64@0.21.5': 973 | optional: true 974 | 975 | '@esbuild/openbsd-x64@0.21.5': 976 | optional: true 977 | 978 | '@esbuild/sunos-x64@0.21.5': 979 | optional: true 980 | 981 | '@esbuild/win32-arm64@0.21.5': 982 | optional: true 983 | 984 | '@esbuild/win32-ia32@0.21.5': 985 | optional: true 986 | 987 | '@esbuild/win32-x64@0.21.5': 988 | optional: true 989 | 990 | '@iconify-json/simple-icons@1.2.27': 991 | dependencies: 992 | '@iconify/types': 2.0.0 993 | 994 | '@iconify/types@2.0.0': {} 995 | 996 | '@jridgewell/sourcemap-codec@1.5.0': {} 997 | 998 | '@rollup/rollup-android-arm-eabi@4.35.0': 999 | optional: true 1000 | 1001 | '@rollup/rollup-android-arm64@4.35.0': 1002 | optional: true 1003 | 1004 | '@rollup/rollup-darwin-arm64@4.35.0': 1005 | optional: true 1006 | 1007 | '@rollup/rollup-darwin-x64@4.35.0': 1008 | optional: true 1009 | 1010 | '@rollup/rollup-freebsd-arm64@4.35.0': 1011 | optional: true 1012 | 1013 | '@rollup/rollup-freebsd-x64@4.35.0': 1014 | optional: true 1015 | 1016 | '@rollup/rollup-linux-arm-gnueabihf@4.35.0': 1017 | optional: true 1018 | 1019 | '@rollup/rollup-linux-arm-musleabihf@4.35.0': 1020 | optional: true 1021 | 1022 | '@rollup/rollup-linux-arm64-gnu@4.35.0': 1023 | optional: true 1024 | 1025 | '@rollup/rollup-linux-arm64-musl@4.35.0': 1026 | optional: true 1027 | 1028 | '@rollup/rollup-linux-loongarch64-gnu@4.35.0': 1029 | optional: true 1030 | 1031 | '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': 1032 | optional: true 1033 | 1034 | '@rollup/rollup-linux-riscv64-gnu@4.35.0': 1035 | optional: true 1036 | 1037 | '@rollup/rollup-linux-s390x-gnu@4.35.0': 1038 | optional: true 1039 | 1040 | '@rollup/rollup-linux-x64-gnu@4.35.0': 1041 | optional: true 1042 | 1043 | '@rollup/rollup-linux-x64-musl@4.35.0': 1044 | optional: true 1045 | 1046 | '@rollup/rollup-win32-arm64-msvc@4.35.0': 1047 | optional: true 1048 | 1049 | '@rollup/rollup-win32-ia32-msvc@4.35.0': 1050 | optional: true 1051 | 1052 | '@rollup/rollup-win32-x64-msvc@4.35.0': 1053 | optional: true 1054 | 1055 | '@shikijs/core@2.5.0': 1056 | dependencies: 1057 | '@shikijs/engine-javascript': 2.5.0 1058 | '@shikijs/engine-oniguruma': 2.5.0 1059 | '@shikijs/types': 2.5.0 1060 | '@shikijs/vscode-textmate': 10.0.2 1061 | '@types/hast': 3.0.4 1062 | hast-util-to-html: 9.0.5 1063 | 1064 | '@shikijs/engine-javascript@2.5.0': 1065 | dependencies: 1066 | '@shikijs/types': 2.5.0 1067 | '@shikijs/vscode-textmate': 10.0.2 1068 | oniguruma-to-es: 3.1.1 1069 | 1070 | '@shikijs/engine-oniguruma@2.5.0': 1071 | dependencies: 1072 | '@shikijs/types': 2.5.0 1073 | '@shikijs/vscode-textmate': 10.0.2 1074 | 1075 | '@shikijs/langs@2.5.0': 1076 | dependencies: 1077 | '@shikijs/types': 2.5.0 1078 | 1079 | '@shikijs/themes@2.5.0': 1080 | dependencies: 1081 | '@shikijs/types': 2.5.0 1082 | 1083 | '@shikijs/transformers@2.5.0': 1084 | dependencies: 1085 | '@shikijs/core': 2.5.0 1086 | '@shikijs/types': 2.5.0 1087 | 1088 | '@shikijs/types@2.5.0': 1089 | dependencies: 1090 | '@shikijs/vscode-textmate': 10.0.2 1091 | '@types/hast': 3.0.4 1092 | 1093 | '@shikijs/vscode-textmate@10.0.2': {} 1094 | 1095 | '@types/estree@1.0.6': {} 1096 | 1097 | '@types/hast@3.0.4': 1098 | dependencies: 1099 | '@types/unist': 3.0.3 1100 | 1101 | '@types/linkify-it@5.0.0': {} 1102 | 1103 | '@types/markdown-it@14.1.2': 1104 | dependencies: 1105 | '@types/linkify-it': 5.0.0 1106 | '@types/mdurl': 2.0.0 1107 | 1108 | '@types/mdast@4.0.4': 1109 | dependencies: 1110 | '@types/unist': 3.0.3 1111 | 1112 | '@types/mdurl@2.0.0': {} 1113 | 1114 | '@types/node@22.13.10': 1115 | dependencies: 1116 | undici-types: 6.20.0 1117 | 1118 | '@types/unist@3.0.3': {} 1119 | 1120 | '@types/web-bluetooth@0.0.21': {} 1121 | 1122 | '@ungap/structured-clone@1.3.0': {} 1123 | 1124 | '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.13.10))(vue@3.5.13)': 1125 | dependencies: 1126 | vite: 5.4.14(@types/node@22.13.10) 1127 | vue: 3.5.13 1128 | 1129 | '@vue/compiler-core@3.5.13': 1130 | dependencies: 1131 | '@babel/parser': 7.26.9 1132 | '@vue/shared': 3.5.13 1133 | entities: 4.5.0 1134 | estree-walker: 2.0.2 1135 | source-map-js: 1.2.1 1136 | 1137 | '@vue/compiler-dom@3.5.13': 1138 | dependencies: 1139 | '@vue/compiler-core': 3.5.13 1140 | '@vue/shared': 3.5.13 1141 | 1142 | '@vue/compiler-sfc@3.5.13': 1143 | dependencies: 1144 | '@babel/parser': 7.26.9 1145 | '@vue/compiler-core': 3.5.13 1146 | '@vue/compiler-dom': 3.5.13 1147 | '@vue/compiler-ssr': 3.5.13 1148 | '@vue/shared': 3.5.13 1149 | estree-walker: 2.0.2 1150 | magic-string: 0.30.17 1151 | postcss: 8.5.3 1152 | source-map-js: 1.2.1 1153 | 1154 | '@vue/compiler-ssr@3.5.13': 1155 | dependencies: 1156 | '@vue/compiler-dom': 3.5.13 1157 | '@vue/shared': 3.5.13 1158 | 1159 | '@vue/devtools-api@7.7.2': 1160 | dependencies: 1161 | '@vue/devtools-kit': 7.7.2 1162 | 1163 | '@vue/devtools-kit@7.7.2': 1164 | dependencies: 1165 | '@vue/devtools-shared': 7.7.2 1166 | birpc: 0.2.19 1167 | hookable: 5.5.3 1168 | mitt: 3.0.1 1169 | perfect-debounce: 1.0.0 1170 | speakingurl: 14.0.1 1171 | superjson: 2.2.2 1172 | 1173 | '@vue/devtools-shared@7.7.2': 1174 | dependencies: 1175 | rfdc: 1.4.1 1176 | 1177 | '@vue/reactivity@3.5.13': 1178 | dependencies: 1179 | '@vue/shared': 3.5.13 1180 | 1181 | '@vue/runtime-core@3.5.13': 1182 | dependencies: 1183 | '@vue/reactivity': 3.5.13 1184 | '@vue/shared': 3.5.13 1185 | 1186 | '@vue/runtime-dom@3.5.13': 1187 | dependencies: 1188 | '@vue/reactivity': 3.5.13 1189 | '@vue/runtime-core': 3.5.13 1190 | '@vue/shared': 3.5.13 1191 | csstype: 3.1.3 1192 | 1193 | '@vue/server-renderer@3.5.13(vue@3.5.13)': 1194 | dependencies: 1195 | '@vue/compiler-ssr': 3.5.13 1196 | '@vue/shared': 3.5.13 1197 | vue: 3.5.13 1198 | 1199 | '@vue/shared@3.5.13': {} 1200 | 1201 | '@vueuse/core@12.8.2': 1202 | dependencies: 1203 | '@types/web-bluetooth': 0.0.21 1204 | '@vueuse/metadata': 12.8.2 1205 | '@vueuse/shared': 12.8.2 1206 | vue: 3.5.13 1207 | transitivePeerDependencies: 1208 | - typescript 1209 | 1210 | '@vueuse/integrations@12.8.2(focus-trap@7.6.4)': 1211 | dependencies: 1212 | '@vueuse/core': 12.8.2 1213 | '@vueuse/shared': 12.8.2 1214 | vue: 3.5.13 1215 | optionalDependencies: 1216 | focus-trap: 7.6.4 1217 | transitivePeerDependencies: 1218 | - typescript 1219 | 1220 | '@vueuse/metadata@12.8.2': {} 1221 | 1222 | '@vueuse/shared@12.8.2': 1223 | dependencies: 1224 | vue: 3.5.13 1225 | transitivePeerDependencies: 1226 | - typescript 1227 | 1228 | algoliasearch@5.20.4: 1229 | dependencies: 1230 | '@algolia/client-abtesting': 5.20.4 1231 | '@algolia/client-analytics': 5.20.4 1232 | '@algolia/client-common': 5.20.4 1233 | '@algolia/client-insights': 5.20.4 1234 | '@algolia/client-personalization': 5.20.4 1235 | '@algolia/client-query-suggestions': 5.20.4 1236 | '@algolia/client-search': 5.20.4 1237 | '@algolia/ingestion': 1.20.4 1238 | '@algolia/monitoring': 1.20.4 1239 | '@algolia/recommend': 5.20.4 1240 | '@algolia/requester-browser-xhr': 5.20.4 1241 | '@algolia/requester-fetch': 5.20.4 1242 | '@algolia/requester-node-http': 5.20.4 1243 | 1244 | birpc@0.2.19: {} 1245 | 1246 | ccount@2.0.1: {} 1247 | 1248 | character-entities-html4@2.1.0: {} 1249 | 1250 | character-entities-legacy@3.0.0: {} 1251 | 1252 | comma-separated-tokens@2.0.3: {} 1253 | 1254 | copy-anything@3.0.5: 1255 | dependencies: 1256 | is-what: 4.1.16 1257 | 1258 | csstype@3.1.3: {} 1259 | 1260 | dequal@2.0.3: {} 1261 | 1262 | devlop@1.1.0: 1263 | dependencies: 1264 | dequal: 2.0.3 1265 | 1266 | easy-nix-documentation@1.0.7(@algolia/client-search@5.20.4)(postcss@8.5.3)(search-insights@2.17.3): 1267 | dependencies: 1268 | '@types/node': 22.13.10 1269 | vitepress: 1.6.3(@algolia/client-search@5.20.4)(@types/node@22.13.10)(postcss@8.5.3)(search-insights@2.17.3) 1270 | vue: 3.5.13 1271 | transitivePeerDependencies: 1272 | - '@algolia/client-search' 1273 | - '@types/react' 1274 | - async-validator 1275 | - axios 1276 | - change-case 1277 | - drauu 1278 | - fuse.js 1279 | - idb-keyval 1280 | - jwt-decode 1281 | - less 1282 | - lightningcss 1283 | - markdown-it-mathjax3 1284 | - nprogress 1285 | - postcss 1286 | - qrcode 1287 | - react 1288 | - react-dom 1289 | - sass 1290 | - sass-embedded 1291 | - search-insights 1292 | - sortablejs 1293 | - stylus 1294 | - sugarss 1295 | - terser 1296 | - typescript 1297 | - universal-cookie 1298 | 1299 | emoji-regex-xs@1.0.0: {} 1300 | 1301 | entities@4.5.0: {} 1302 | 1303 | esbuild@0.21.5: 1304 | optionalDependencies: 1305 | '@esbuild/aix-ppc64': 0.21.5 1306 | '@esbuild/android-arm': 0.21.5 1307 | '@esbuild/android-arm64': 0.21.5 1308 | '@esbuild/android-x64': 0.21.5 1309 | '@esbuild/darwin-arm64': 0.21.5 1310 | '@esbuild/darwin-x64': 0.21.5 1311 | '@esbuild/freebsd-arm64': 0.21.5 1312 | '@esbuild/freebsd-x64': 0.21.5 1313 | '@esbuild/linux-arm': 0.21.5 1314 | '@esbuild/linux-arm64': 0.21.5 1315 | '@esbuild/linux-ia32': 0.21.5 1316 | '@esbuild/linux-loong64': 0.21.5 1317 | '@esbuild/linux-mips64el': 0.21.5 1318 | '@esbuild/linux-ppc64': 0.21.5 1319 | '@esbuild/linux-riscv64': 0.21.5 1320 | '@esbuild/linux-s390x': 0.21.5 1321 | '@esbuild/linux-x64': 0.21.5 1322 | '@esbuild/netbsd-x64': 0.21.5 1323 | '@esbuild/openbsd-x64': 0.21.5 1324 | '@esbuild/sunos-x64': 0.21.5 1325 | '@esbuild/win32-arm64': 0.21.5 1326 | '@esbuild/win32-ia32': 0.21.5 1327 | '@esbuild/win32-x64': 0.21.5 1328 | 1329 | estree-walker@2.0.2: {} 1330 | 1331 | focus-trap@7.6.4: 1332 | dependencies: 1333 | tabbable: 6.2.0 1334 | 1335 | fsevents@2.3.3: 1336 | optional: true 1337 | 1338 | hast-util-to-html@9.0.5: 1339 | dependencies: 1340 | '@types/hast': 3.0.4 1341 | '@types/unist': 3.0.3 1342 | ccount: 2.0.1 1343 | comma-separated-tokens: 2.0.3 1344 | hast-util-whitespace: 3.0.0 1345 | html-void-elements: 3.0.0 1346 | mdast-util-to-hast: 13.2.0 1347 | property-information: 7.0.0 1348 | space-separated-tokens: 2.0.2 1349 | stringify-entities: 4.0.4 1350 | zwitch: 2.0.4 1351 | 1352 | hast-util-whitespace@3.0.0: 1353 | dependencies: 1354 | '@types/hast': 3.0.4 1355 | 1356 | hookable@5.5.3: {} 1357 | 1358 | html-void-elements@3.0.0: {} 1359 | 1360 | is-what@4.1.16: {} 1361 | 1362 | magic-string@0.30.17: 1363 | dependencies: 1364 | '@jridgewell/sourcemap-codec': 1.5.0 1365 | 1366 | mark.js@8.11.1: {} 1367 | 1368 | mdast-util-to-hast@13.2.0: 1369 | dependencies: 1370 | '@types/hast': 3.0.4 1371 | '@types/mdast': 4.0.4 1372 | '@ungap/structured-clone': 1.3.0 1373 | devlop: 1.1.0 1374 | micromark-util-sanitize-uri: 2.0.1 1375 | trim-lines: 3.0.1 1376 | unist-util-position: 5.0.0 1377 | unist-util-visit: 5.0.0 1378 | vfile: 6.0.3 1379 | 1380 | micromark-util-character@2.1.1: 1381 | dependencies: 1382 | micromark-util-symbol: 2.0.1 1383 | micromark-util-types: 2.0.2 1384 | 1385 | micromark-util-encode@2.0.1: {} 1386 | 1387 | micromark-util-sanitize-uri@2.0.1: 1388 | dependencies: 1389 | micromark-util-character: 2.1.1 1390 | micromark-util-encode: 2.0.1 1391 | micromark-util-symbol: 2.0.1 1392 | 1393 | micromark-util-symbol@2.0.1: {} 1394 | 1395 | micromark-util-types@2.0.2: {} 1396 | 1397 | minisearch@7.1.2: {} 1398 | 1399 | mitt@3.0.1: {} 1400 | 1401 | nanoid@3.3.9: {} 1402 | 1403 | oniguruma-to-es@3.1.1: 1404 | dependencies: 1405 | emoji-regex-xs: 1.0.0 1406 | regex: 6.0.1 1407 | regex-recursion: 6.0.2 1408 | 1409 | perfect-debounce@1.0.0: {} 1410 | 1411 | picocolors@1.1.1: {} 1412 | 1413 | postcss@8.5.3: 1414 | dependencies: 1415 | nanoid: 3.3.9 1416 | picocolors: 1.1.1 1417 | source-map-js: 1.2.1 1418 | 1419 | preact@10.26.4: {} 1420 | 1421 | property-information@7.0.0: {} 1422 | 1423 | regex-recursion@6.0.2: 1424 | dependencies: 1425 | regex-utilities: 2.3.0 1426 | 1427 | regex-utilities@2.3.0: {} 1428 | 1429 | regex@6.0.1: 1430 | dependencies: 1431 | regex-utilities: 2.3.0 1432 | 1433 | rfdc@1.4.1: {} 1434 | 1435 | rollup@4.35.0: 1436 | dependencies: 1437 | '@types/estree': 1.0.6 1438 | optionalDependencies: 1439 | '@rollup/rollup-android-arm-eabi': 4.35.0 1440 | '@rollup/rollup-android-arm64': 4.35.0 1441 | '@rollup/rollup-darwin-arm64': 4.35.0 1442 | '@rollup/rollup-darwin-x64': 4.35.0 1443 | '@rollup/rollup-freebsd-arm64': 4.35.0 1444 | '@rollup/rollup-freebsd-x64': 4.35.0 1445 | '@rollup/rollup-linux-arm-gnueabihf': 4.35.0 1446 | '@rollup/rollup-linux-arm-musleabihf': 4.35.0 1447 | '@rollup/rollup-linux-arm64-gnu': 4.35.0 1448 | '@rollup/rollup-linux-arm64-musl': 4.35.0 1449 | '@rollup/rollup-linux-loongarch64-gnu': 4.35.0 1450 | '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0 1451 | '@rollup/rollup-linux-riscv64-gnu': 4.35.0 1452 | '@rollup/rollup-linux-s390x-gnu': 4.35.0 1453 | '@rollup/rollup-linux-x64-gnu': 4.35.0 1454 | '@rollup/rollup-linux-x64-musl': 4.35.0 1455 | '@rollup/rollup-win32-arm64-msvc': 4.35.0 1456 | '@rollup/rollup-win32-ia32-msvc': 4.35.0 1457 | '@rollup/rollup-win32-x64-msvc': 4.35.0 1458 | fsevents: 2.3.3 1459 | 1460 | search-insights@2.17.3: {} 1461 | 1462 | shiki@2.5.0: 1463 | dependencies: 1464 | '@shikijs/core': 2.5.0 1465 | '@shikijs/engine-javascript': 2.5.0 1466 | '@shikijs/engine-oniguruma': 2.5.0 1467 | '@shikijs/langs': 2.5.0 1468 | '@shikijs/themes': 2.5.0 1469 | '@shikijs/types': 2.5.0 1470 | '@shikijs/vscode-textmate': 10.0.2 1471 | '@types/hast': 3.0.4 1472 | 1473 | source-map-js@1.2.1: {} 1474 | 1475 | space-separated-tokens@2.0.2: {} 1476 | 1477 | speakingurl@14.0.1: {} 1478 | 1479 | stringify-entities@4.0.4: 1480 | dependencies: 1481 | character-entities-html4: 2.1.0 1482 | character-entities-legacy: 3.0.0 1483 | 1484 | superjson@2.2.2: 1485 | dependencies: 1486 | copy-anything: 3.0.5 1487 | 1488 | tabbable@6.2.0: {} 1489 | 1490 | trim-lines@3.0.1: {} 1491 | 1492 | undici-types@6.20.0: {} 1493 | 1494 | unist-util-is@6.0.0: 1495 | dependencies: 1496 | '@types/unist': 3.0.3 1497 | 1498 | unist-util-position@5.0.0: 1499 | dependencies: 1500 | '@types/unist': 3.0.3 1501 | 1502 | unist-util-stringify-position@4.0.0: 1503 | dependencies: 1504 | '@types/unist': 3.0.3 1505 | 1506 | unist-util-visit-parents@6.0.1: 1507 | dependencies: 1508 | '@types/unist': 3.0.3 1509 | unist-util-is: 6.0.0 1510 | 1511 | unist-util-visit@5.0.0: 1512 | dependencies: 1513 | '@types/unist': 3.0.3 1514 | unist-util-is: 6.0.0 1515 | unist-util-visit-parents: 6.0.1 1516 | 1517 | vfile-message@4.0.2: 1518 | dependencies: 1519 | '@types/unist': 3.0.3 1520 | unist-util-stringify-position: 4.0.0 1521 | 1522 | vfile@6.0.3: 1523 | dependencies: 1524 | '@types/unist': 3.0.3 1525 | vfile-message: 4.0.2 1526 | 1527 | vite@5.4.14(@types/node@22.13.10): 1528 | dependencies: 1529 | esbuild: 0.21.5 1530 | postcss: 8.5.3 1531 | rollup: 4.35.0 1532 | optionalDependencies: 1533 | '@types/node': 22.13.10 1534 | fsevents: 2.3.3 1535 | 1536 | vitepress@1.6.3(@algolia/client-search@5.20.4)(@types/node@22.13.10)(postcss@8.5.3)(search-insights@2.17.3): 1537 | dependencies: 1538 | '@docsearch/css': 3.8.2 1539 | '@docsearch/js': 3.8.2(@algolia/client-search@5.20.4)(search-insights@2.17.3) 1540 | '@iconify-json/simple-icons': 1.2.27 1541 | '@shikijs/core': 2.5.0 1542 | '@shikijs/transformers': 2.5.0 1543 | '@shikijs/types': 2.5.0 1544 | '@types/markdown-it': 14.1.2 1545 | '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.13.10))(vue@3.5.13) 1546 | '@vue/devtools-api': 7.7.2 1547 | '@vue/shared': 3.5.13 1548 | '@vueuse/core': 12.8.2 1549 | '@vueuse/integrations': 12.8.2(focus-trap@7.6.4) 1550 | focus-trap: 7.6.4 1551 | mark.js: 8.11.1 1552 | minisearch: 7.1.2 1553 | shiki: 2.5.0 1554 | vite: 5.4.14(@types/node@22.13.10) 1555 | vue: 3.5.13 1556 | optionalDependencies: 1557 | postcss: 8.5.3 1558 | transitivePeerDependencies: 1559 | - '@algolia/client-search' 1560 | - '@types/node' 1561 | - '@types/react' 1562 | - async-validator 1563 | - axios 1564 | - change-case 1565 | - drauu 1566 | - fuse.js 1567 | - idb-keyval 1568 | - jwt-decode 1569 | - less 1570 | - lightningcss 1571 | - nprogress 1572 | - qrcode 1573 | - react 1574 | - react-dom 1575 | - sass 1576 | - sass-embedded 1577 | - search-insights 1578 | - sortablejs 1579 | - stylus 1580 | - sugarss 1581 | - terser 1582 | - typescript 1583 | - universal-cookie 1584 | 1585 | vue@3.5.13: 1586 | dependencies: 1587 | '@vue/compiler-dom': 3.5.13 1588 | '@vue/compiler-sfc': 3.5.13 1589 | '@vue/runtime-dom': 3.5.13 1590 | '@vue/server-renderer': 3.5.13(vue@3.5.13) 1591 | '@vue/shared': 3.5.13 1592 | 1593 | zwitch@2.0.4: {} 1594 | -------------------------------------------------------------------------------- /src/api.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | use std::sync::mpsc; 3 | 4 | use mlua::prelude::*; 5 | use mlua::Table; 6 | 7 | use tracing::debug; 8 | use tracing::trace; 9 | use tracing::Callsite; 10 | 11 | #[derive(Debug, clap::Parser)] 12 | struct Args { 13 | file: PathBuf, 14 | 15 | #[arg(short = 'n', long)] 16 | dry: bool, 17 | } 18 | 19 | fn load_module>(lua: &Lua, name: S, module: &Table) -> LuaResult<()> { 20 | let name = name.as_ref(); 21 | let globals = lua.globals(); 22 | let package: Table = globals.get("package")?; 23 | let loaded: Table = package.get("loaded")?; 24 | loaded.set(name, module)?; 25 | Ok(()) 26 | } 27 | 28 | pub fn main() -> eyre::Result<()> { 29 | let args = ::parse(); 30 | trace!(?args); 31 | 32 | let lua = Lua::new(); 33 | 34 | let module = lua.create_table()?; 35 | 36 | let (tx, rx) = mpsc::channel(); 37 | 38 | let txx = tx.clone(); 39 | module.set( 40 | "file", 41 | lua.create_function(move |_, input: Table| { 42 | let node = crate::node::file_from_lua(input)?; 43 | // let id = node.id.clone(); 44 | txx.send(node).unwrap(); 45 | Ok(()) 46 | })?, 47 | )?; 48 | 49 | module.set( 50 | "debug", 51 | lua.create_function(|lua, input: LuaValue| { 52 | debug!("{input:?}"); 53 | Ok(()) 54 | })?, 55 | )?; 56 | 57 | let txx = tx.clone(); 58 | module.set( 59 | "dconf", 60 | lua.create_function(move |_, input: Table| { 61 | let node = crate::gsettings::dconf_node(input)?; 62 | // let id = node.id.clone(); 63 | txx.send(node).unwrap(); 64 | Ok(()) 65 | })?, 66 | )?; 67 | 68 | let txx = tx.clone(); 69 | module.set( 70 | "exec", 71 | lua.create_function(move |_, input: Table| { 72 | let node = crate::exec_node::lua_to_exec(input)?; 73 | let id = node.metadata.id.clone(); 74 | txx.send(node).unwrap(); 75 | Ok(id) 76 | })?, 77 | )?; 78 | 79 | load_module(&lua, "am", &module)?; 80 | 81 | lua.load(args.file.as_path()).exec()?; 82 | 83 | let mut nodes = Vec::new(); 84 | while let Ok(next) = rx.try_recv() { 85 | nodes.push(next); 86 | } 87 | trace!("{nodes:#?}"); 88 | 89 | crate::exec::run_graph(&nodes, args.dry)?; 90 | 91 | Ok(()) 92 | } 93 | -------------------------------------------------------------------------------- /src/exec.rs: -------------------------------------------------------------------------------- 1 | use color_eyre::owo_colors::OwoColorize; 2 | use tracing::error; 3 | 4 | use crate::node::Node; 5 | 6 | pub fn run_graph(nodes: &Vec, dry: bool) -> eyre::Result<()> { 7 | for node in nodes { 8 | print!("{} Activating: ", ">".green()); 9 | if let Some(desc) = &node.metadata.description { 10 | println!("{}", desc.bright_black()); 11 | } 12 | 13 | if !dry { 14 | let result = node.kind.exec(); 15 | 16 | if let Err(report) = result { 17 | error!("{:#}", report); 18 | } 19 | } 20 | } 21 | 22 | Ok(()) 23 | } 24 | -------------------------------------------------------------------------------- /src/exec_node.rs: -------------------------------------------------------------------------------- 1 | use std::process::Stdio; 2 | 3 | use eyre::bail; 4 | 5 | use crate::node::{Node, NodeExec, NodeMetadata}; 6 | 7 | #[derive(Debug)] 8 | pub struct ExecNode { 9 | command: Vec, 10 | } 11 | 12 | impl NodeExec for ExecNode { 13 | fn exec(&self) -> eyre::Result<()> { 14 | let mut _command = self.command.clone().into_iter(); 15 | let out = std::process::Command::new(_command.next().unwrap()) 16 | .args(_command) 17 | .stdout(Stdio::inherit()) 18 | .stderr(Stdio::inherit()) 19 | .output()?; 20 | 21 | if !out.status.success() { 22 | bail!("Failed to execute command!"); 23 | } 24 | 25 | // 26 | Ok(()) 27 | } 28 | } 29 | 30 | pub(crate) fn lua_to_exec(input: mlua::Table) -> mlua::Result { 31 | let command: Vec = input.get("command")?; 32 | let mut metadata = NodeMetadata::from_table(&input); 33 | 34 | let kind = ExecNode { command }; 35 | metadata.description = metadata 36 | .description 37 | .or_else(|| Some(kind.command.join(" "))); 38 | 39 | Ok(Node { 40 | metadata, 41 | kind: Box::new(kind), 42 | }) 43 | } 44 | -------------------------------------------------------------------------------- /src/gsettings.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use std::process::Command; 3 | 4 | use eyre::bail; 5 | use mlua::Table; 6 | use once_cell::sync::Lazy; 7 | use tracing::trace; 8 | 9 | use crate::node::{Node, NodeExec}; 10 | 11 | #[derive(Debug)] 12 | pub struct GsettingsNode { 13 | pub schema: Vec, 14 | pub key: String, 15 | pub value: String, 16 | } 17 | 18 | #[derive(Debug)] 19 | pub struct DconfNode { 20 | pub key: String, 21 | pub value: String, 22 | } 23 | 24 | static SCHEMAS: Lazy>>> = Lazy::new(|| { 25 | let out = Command::new("gsettings") 26 | .args(["list-schemas", "--print-paths"]) 27 | .output()?; 28 | if !out.status.success() { 29 | bail!("Command failed"); 30 | } 31 | 32 | let stdout = String::from_utf8(out.stdout)?; 33 | 34 | let mut mappings = HashMap::new(); 35 | 36 | for line in stdout.lines() { 37 | let (key, path) = line.split_once(" ").unwrap(); 38 | let k = key.split(".").map(|s| s.to_owned()).collect::>(); 39 | 40 | mappings.insert(path.to_string(), k); 41 | } 42 | 43 | Ok(mappings) 44 | }); 45 | 46 | impl NodeExec for GsettingsNode { 47 | fn exec(&self) -> eyre::Result<()> { 48 | let schemas = match Lazy::<_>::force(&SCHEMAS) { 49 | Ok(ok) => ok, 50 | Err(err) => bail!(err), 51 | }; 52 | trace!("{schemas:#?}"); 53 | 54 | let out = std::process::Command::new("gsettings") 55 | .arg("set") 56 | .arg(self.schema.join(".")) 57 | .arg(&self.key) 58 | .arg(&self.value) 59 | .output()?; 60 | 61 | if !out.status.success() { 62 | bail!("Command failed"); 63 | } 64 | 65 | trace!(?out); 66 | 67 | Ok(()) 68 | } 69 | } 70 | 71 | pub fn dconf_node(input: Table) -> mlua::Result { 72 | // let (before, after) = before_after(&input); 73 | // let dconf_key: String = input.get("key")?; 74 | // let value: String = input.get("value")?; 75 | // 76 | // let mut schema = vec![]; 77 | // for elem in dconf_key.strip_prefix("/").unwrap().split("/") { 78 | // schema.push(elem.to_string()); 79 | // } 80 | // let key = schema.pop().unwrap(); 81 | // 82 | // let kind = GsettingsNode { key, schema, value }; 83 | // 84 | // let description = Some(format!("{dconf_key} => {}", kind.value)); 85 | // 86 | // Ok(Node { 87 | // // id: format!("FIXME"), 88 | // before, 89 | // after, 90 | // kind: Box::new(kind), 91 | // description, 92 | // }) 93 | 94 | todo!(); 95 | } 96 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![allow(dead_code)] 2 | 3 | mod api; 4 | mod exec; 5 | mod exec_node; 6 | mod gsettings; 7 | mod node; 8 | 9 | fn main() -> eyre::Result<()> { 10 | use std::str::FromStr; 11 | use tracing_subscriber::{fmt, prelude::*, EnvFilter}; 12 | 13 | let level = std::env::var("AM_LOG").unwrap_or(String::from("warn")); 14 | 15 | tracing_subscriber::registry() 16 | .with(fmt::layer().without_time()) 17 | .with(EnvFilter::from_str(&level)?) 18 | .init(); 19 | 20 | tracing::trace!(?level); 21 | 22 | color_eyre::install()?; 23 | 24 | api::main()?; 25 | 26 | Ok(()) 27 | } 28 | -------------------------------------------------------------------------------- /src/node.rs: -------------------------------------------------------------------------------- 1 | use std::fmt; 2 | use std::fs; 3 | use std::os::unix; 4 | use std::path::PathBuf; 5 | use std::sync::Mutex; 6 | 7 | use eyre::ContextCompat; 8 | use mlua::prelude::*; 9 | use mlua::Table; 10 | use once_cell::sync::Lazy; 11 | use sha2::{Digest, Sha256}; 12 | 13 | #[derive(Debug)] 14 | pub struct Node { 15 | pub metadata: NodeMetadata, 16 | pub kind: Box, 17 | } 18 | 19 | #[derive(Debug)] 20 | pub struct NodeMetadata { 21 | pub id: String, 22 | pub before: Vec, 23 | pub after: Vec, 24 | pub description: Option, 25 | } 26 | 27 | pub trait NodeExec: fmt::Debug { 28 | fn exec(&self) -> eyre::Result<()>; 29 | } 30 | 31 | #[derive(Debug)] 32 | pub struct FileNodeKind { 33 | link: String, 34 | target: String, 35 | } 36 | 37 | impl NodeExec for FileNodeKind { 38 | fn exec(&self) -> eyre::Result<()> { 39 | if let Ok(meta) = fs::symlink_metadata(&self.link) { 40 | if meta.is_symlink() { 41 | fs::remove_file(&self.link)?; 42 | } 43 | } 44 | let link = PathBuf::from(&self.link); 45 | let parent = link.parent().wrap_err("Failed to get parent")?; 46 | fs::create_dir_all(parent)?; 47 | unix::fs::symlink(&self.target, &self.link)?; 48 | Ok(()) 49 | } 50 | } 51 | 52 | #[derive(Debug)] 53 | pub struct IdGenerator(Mutex); 54 | 55 | static ID_GENERATOR: Lazy = Lazy::new(|| IdGenerator(Mutex::new(0))); 56 | 57 | impl IdGenerator { 58 | fn get_next(&self) -> String { 59 | let mut x = self.0.lock().unwrap(); 60 | *x = *x + 1; 61 | return format!("node-internal-{}", *x); 62 | } 63 | } 64 | 65 | impl NodeMetadata { 66 | pub fn from_table(table: &Table) -> Self { 67 | let before = table.get("before").unwrap_or_default(); 68 | let after = table.get("after").unwrap_or_default(); 69 | let description = table.get("description").unwrap_or_default(); 70 | 71 | Self { 72 | id: ID_GENERATOR.get_next(), 73 | before, 74 | after, 75 | description, 76 | } 77 | } 78 | } 79 | 80 | pub fn file_from_lua(table: Table) -> LuaResult { 81 | let link: String = table.get("link")?; 82 | let target: String = table.get("target")?; 83 | let id: Option = table.get("id").ok(); 84 | let mut meta = NodeMetadata::from_table(&table); 85 | let copy: bool = table.get("copy").ok().unwrap_or(false); 86 | 87 | let kind = FileNodeKind { link, target }; 88 | 89 | let id = match id { 90 | Some(x) => x, 91 | None => { 92 | let mut hasher = Sha256::new(); 93 | hasher.update(&kind.link); 94 | hasher.update(&kind.target); 95 | let hash = base16::encode_lower(&hasher.finalize()); 96 | format!("node-{hash}") 97 | } 98 | }; 99 | 100 | meta.description = meta 101 | .description 102 | .or_else(|| Some(format!("Symlink {} -> {}", kind.link, kind.target))); 103 | 104 | let node = Node { 105 | kind: Box::new(kind), 106 | metadata: meta, 107 | }; 108 | 109 | Ok(node) 110 | } 111 | -------------------------------------------------------------------------------- /test/main.lua: -------------------------------------------------------------------------------- 1 | local am = require("am") 2 | local os = require("os") 3 | 4 | local home = os.getenv("HOME") 5 | 6 | ---@type string 7 | -- local f1 = am.file { 8 | -- id = "f1", 9 | -- from = home .. "/foo", 10 | -- to = home .. "/bar", 11 | -- } 12 | 13 | -- am.dconf { 14 | -- key = "/org/gnome/desktop/peripherals/mouse/accel-profile", 15 | -- value = "flat", 16 | -- } 17 | 18 | local ls = am.exec { 19 | command = { "ls" }, 20 | } 21 | 22 | am.debug(ls) 23 | 24 | am.exec { 25 | command = { "blhablah" }, 26 | } 27 | -------------------------------------------------------------------------------- /test/main.nix: -------------------------------------------------------------------------------- 1 | let 2 | mod = 3 | { pkgs, config, ... }: 4 | { 5 | home.file."foo" = { 6 | target = "hello"; 7 | }; 8 | dconf.settings = { 9 | "/org/gnome/desktop/peripherals/mouse/accel-profile" = "flat"; 10 | }; 11 | }; 12 | in 13 | import ../nix/home { 14 | modules = [ mod ]; 15 | } 16 | -------------------------------------------------------------------------------- /test/nixos.nix: -------------------------------------------------------------------------------- 1 | { config, pkgs, ... }: 2 | { 3 | imports = [ 4 | ../nix/home/nixos-module.nix 5 | ]; 6 | 7 | users.users."nixos" = { 8 | isNormalUser = true; 9 | extraGroups = [ "wheel" ]; 10 | packages = [ 11 | (config.activation-manager.mkHome { 12 | home.file."foo".target = "bar"; 13 | }) 14 | ]; 15 | }; 16 | 17 | services.getty.autologinUser = "nixos"; 18 | security.sudo.wheelNeedsPassword = false; 19 | } 20 | --------------------------------------------------------------------------------