toolkit for mdBook [mirror of my GitHub repo] docs.tonywu.dev/mdbookkit/
permalinks rust-analyzer mdbook
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor(permalinks): expand on linking with URLs (WIP)

Tony Wu 30fab861 c08108f0

+1514 -521
crates/mdbook-permalinks/README.md

This is a binary file and will not be displayed.

+25 -18
crates/mdbook-permalinks/src/diagnostic.rs
··· 1 1 use std::{borrow::Cow, collections::BTreeMap}; 2 2 3 3 use miette::LabeledSpan; 4 - use tap::TapFallible; 4 + use tap::TapOptional; 5 5 use url::Url; 6 6 7 7 use mdbookkit::diagnostics::{Diagnostics, Issue, IssueItem, ReportBuilder}; ··· 75 75 } 76 76 77 77 fn label(&self) -> LabeledSpan { 78 - let link = self.shorten(); 78 + let link = self.shorten(&self.link.link); 79 79 let status = &self.link.status; 80 80 let label = match status { 81 81 LinkStatus::Ignored => None, ··· 83 83 LinkStatus::Permalink => Some(format!("link: {link}")), 84 84 LinkStatus::Rewritten => Some(format!("file: {link}\nlink: {}", self.link.link)), 85 85 LinkStatus::PathNotCheckedIn => Some(format!("{status}: {link}")), 86 - LinkStatus::NoSuchPath => Some(format!("{status}: {link}")), 86 + LinkStatus::NoSuchPath(candidates) => Some(format!("{status}: {link}")), 87 87 LinkStatus::Error(..) => Some(format!("{status}")), 88 88 }; 89 89 LabeledSpan::new_with_span(label, self.link.span.clone()) ··· 91 91 } 92 92 93 93 impl LinkDiagnostic<'_> { 94 - fn shorten(&self) -> Cow<'_, str> { 95 - let Ok(link) = if self.link.link.starts_with('/') { 96 - self.root.join(&self.link.link[1..]) 94 + fn shorten<'a>(&self, path: &'a str) -> Cow<'a, str> { 95 + let url = if let Some(path) = path.strip_prefix('/') { 96 + self.root.join(path) 97 97 } else { 98 - self.page.join(&self.link.link) 98 + self.page.join(path) 99 99 } 100 - .tap_ok_mut(|u| u.set_fragment(None)) else { 101 - return Cow::Borrowed(&self.link.link); 102 - }; 103 - let Some(rel) = self.root.make_relative(&link) else { 104 - return Cow::Borrowed(&self.link.link); 105 - }; 106 - if rel.starts_with("../") { 107 - Cow::Owned(link.to_string()) 100 + .ok() 101 + .tap_some_mut(|url| { 102 + url.set_query(None); 103 + url.set_fragment(None); 104 + }); 105 + if let Some(url) = url { 106 + if let Some(rel) = self.root.make_relative(&url) { 107 + if rel.starts_with("../") { 108 + Cow::Owned(url.to_string()) 109 + } else { 110 + Cow::Owned(rel) 111 + } 112 + } else { 113 + Cow::Borrowed(path) 114 + } 108 115 } else { 109 - Cow::Owned(rel) 116 + Cow::Borrowed(path) 110 117 } 111 118 } 112 119 } ··· 119 126 Self::Rewritten => log::Level::Info, 120 127 Self::Permalink => log::Level::Info, 121 128 Self::PathNotCheckedIn => log::Level::Warn, 122 - Self::NoSuchPath => log::Level::Warn, 129 + Self::NoSuchPath(..) => log::Level::Warn, 123 130 Self::Error(..) => log::Level::Warn, 124 131 } 125 132 } ··· 149 156 fn order(&self) -> usize { 150 157 match self { 151 158 Self::Error(..) => 103, 152 - Self::NoSuchPath => 101, 159 + Self::NoSuchPath(..) => 101, 153 160 Self::PathNotCheckedIn => 100, 154 161 Self::Permalink => 3, 155 162 Self::Rewritten => 2,
+18 -17
crates/mdbook-permalinks/src/link.rs
··· 1 1 use std::{fmt::Debug, ops::Range}; 2 2 3 3 use mdbook_markdown::pulldown_cmark::{CowStr, Event, LinkType, Tag, TagEnd}; 4 + use url::Url; 4 5 5 6 #[derive(Debug, Default, Clone, thiserror::Error)] 6 7 pub enum LinkStatus { ··· 20 21 #[error("path to a file outside source control")] 21 22 PathNotCheckedIn, 22 23 #[error("file does not exist at path")] 23 - NoSuchPath, 24 + NoSuchPath(Vec<Url>), 24 25 25 26 #[error("error generating a link: {0}")] 26 27 Error(String), ··· 37 38 pub status: LinkStatus, 38 39 pub span: Range<usize>, 39 40 pub link: CowStr<'a>, 40 - pub usage: LinkUsage, 41 + pub hint: ContentTypeHint, 41 42 pub title: CowStr<'a>, 42 43 } 43 44 44 - #[derive(Clone, Copy, PartialEq)] 45 - pub enum LinkUsage { 46 - Link, 47 - Image, 45 + #[derive(Clone, Copy, PartialEq, Eq)] 46 + pub enum ContentTypeHint { 47 + Tree, 48 + Raw, 48 49 } 49 50 50 51 impl<'a> LinkSpan<'a> { ··· 72 73 73 74 impl RelativeLink<'_> { 74 75 fn emit(&self) -> Tag<'_> { 75 - match self.usage { 76 - LinkUsage::Link => Tag::Link { 76 + match self.hint { 77 + ContentTypeHint::Tree => Tag::Link { 77 78 link_type: LinkType::Inline, 78 79 dest_url: self.link.clone(), 79 80 title: self.title.clone(), 80 81 id: CowStr::Borrowed(""), 81 82 }, 82 - LinkUsage::Image => Tag::Image { 83 + ContentTypeHint::Raw => Tag::Image { 83 84 link_type: LinkType::Inline, 84 85 dest_url: self.link.clone(), 85 86 title: self.title.clone(), ··· 88 89 } 89 90 } 90 91 91 - fn will_emit(&self) -> Option<LinkUsage> { 92 + fn will_emit(&self) -> Option<ContentTypeHint> { 92 93 if matches!(self.status, LinkStatus::Permalink | LinkStatus::Rewritten) { 93 - Some(self.usage) 94 + Some(self.hint) 94 95 } else { 95 96 None 96 97 } ··· 99 100 100 101 pub struct EmitLinkSpan<'a> { 101 102 iter: std::slice::Iter<'a, LinkText<'a>>, 102 - opened: Vec<LinkUsage>, 103 + opened: Vec<ContentTypeHint>, 103 104 } 104 105 105 106 impl<'a> Iterator for EmitLinkSpan<'a> { ··· 110 111 match next { 111 112 LinkText::Text(text) => { 112 113 match (text, self.opened.last()) { 113 - (Event::End(TagEnd::Link), Some(LinkUsage::Link)) => { 114 + (Event::End(TagEnd::Link), Some(ContentTypeHint::Tree)) => { 114 115 self.opened.pop(); 115 116 return Some(text.clone()); 116 117 } 117 - (Event::End(TagEnd::Image), Some(LinkUsage::Image)) => { 118 + (Event::End(TagEnd::Image), Some(ContentTypeHint::Raw)) => { 118 119 self.opened.pop(); 119 120 return Some(text.clone()); 120 121 } ··· 167 168 } 168 169 } 169 170 170 - impl Debug for LinkUsage { 171 + impl Debug for ContentTypeHint { 171 172 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 172 173 match self { 173 - Self::Link => f.write_str("link"), 174 - Self::Image => f.write_str("image"), 174 + Self::Tree => f.write_str("tree"), 175 + Self::Raw => f.write_str("raw"), 175 176 } 176 177 } 177 178 }
+31 -29
crates/mdbook-permalinks/src/main.rs
··· 126 126 self.validate(); 127 127 128 128 for (base, link) in content.links_mut() { 129 - let file = if link.link.starts_with('/') { 130 - self.vcs.root.join(&link.link[1..]) 129 + let file = if let Some(link) = link.link.strip_prefix('/') { 130 + self.vcs.root.join(link) 131 131 } else { 132 132 base.join(&link.link) 133 133 } ··· 207 207 impl Resolver<'_, '_> { 208 208 fn resolve(self) { 209 209 if let Some(book) = &self.env.config.book_url { 210 - if let Some(page) = book.0.make_relative(&self.file_url) { 211 - // hard-coded URLs to book pages 212 - self.resolve_page(page) 210 + if let Some(path) = book.0.make_relative(&self.file_url) { 211 + self.resolve_book(path) 213 212 } else { 214 213 self.resolve_file() 215 214 } ··· 227 226 .. 228 227 } = self; 229 228 230 - let file_url = if let Some(path) = env.vcs.link.to_path(&file_url) { 231 - if let Ok(file_url) = env.vcs.root.join(&path) { 232 - link.link = format!("/{path}").into(); 233 - file_url 234 - } else { 235 - file_url 236 - } 229 + let (file_url, hint, suffix, is_vcs) = if let Some((path, hint)) = 230 + env.vcs.link.to_path(&file_url) 231 + && let Ok(url) = env.vcs.root.join(&path) 232 + { 233 + let (_, suffix) = UrlSuffix::take(file_url); 234 + (url, hint, suffix, true) 237 235 } else { 238 - file_url 236 + let (url, suffix) = UrlSuffix::take(file_url); 237 + (url, link.hint, suffix, false) 239 238 }; 240 - 241 - let (file_url, suffix) = UrlSuffix::take(file_url); 242 239 243 240 let Ok(path) = file_url.to_file_path() else { 244 241 link.status = LinkStatus::Ignored; ··· 268 265 .tap_err(log_debug!()); 269 266 270 267 if !matches!(exists, Ok(true)) { 271 - link.status = LinkStatus::NoSuchPath; 268 + link.status = LinkStatus::NoSuchPath(vec![]); 272 269 return; 273 270 } 274 271 ··· 281 278 return; 282 279 }; 283 280 284 - let always_link = relative_to_book.starts_with("../") 281 + let always_link = is_vcs 282 + || relative_to_book.starts_with("../") 285 283 || env 286 284 .config 287 285 .always_link ··· 302 300 return; 303 301 } 304 302 305 - match env.vcs.link.to_link(&relative_to_repo) { 303 + match env.vcs.link.to_link(&relative_to_repo, hint) { 306 304 Ok(href) => { 307 305 link.link = suffix.restored(href).as_str().to_owned().into(); 308 306 link.status = LinkStatus::Permalink; ··· 311 309 } 312 310 } 313 311 314 - /// Check hard-coded URLs to book pages 315 - fn resolve_page(self, page: String) { 312 + /// Check hard-coded URLs to book content 313 + fn resolve_book(self, path: String) { 316 314 let Self { 317 315 file_url, 318 316 page_url, ··· 321 319 } = self; 322 320 323 321 let path = { 324 - let mut path = page; 325 - if let Some(idx) = path.find('#') { 322 + let mut path = path; 323 + if let Some(idx) = path.rfind('#') { 326 324 path.truncate(idx) 327 325 }; 328 - if let Some(idx) = path.find('?') { 326 + if let Some(idx) = path.rfind('?') { 329 327 path.truncate(idx) 330 328 }; 331 329 path.strip_suffix(".html") ··· 338 336 return; 339 337 } 340 338 341 - let mut not_found = vec![]; 342 - 343 339 // one does not simply avoid trailing slash issues... 344 340 // https://github.com/slorber/trailing-slash-guide 345 341 let try_files = if path.is_empty() || path.ends_with('/') { ··· 348 344 // be addressed with a trailing slash 349 345 format!("{path}index.md"), 350 346 format!("{path}README.md"), 351 - ] as &[String] 347 + ] as &[_] 352 348 } else { 353 349 &[ 354 350 format!("{path}.md"), ··· 356 352 // /folder to /folder/, so these are okay 357 353 format!("{path}/index.md"), 358 354 format!("{path}/README.md"), 355 + // preserve extension if any which allows checking for 356 + // static files other than book pages 357 + path, 359 358 ] 360 359 }; 360 + 361 + let mut not_found = None; 361 362 362 363 for file in try_files { 363 364 let Ok(file) = self.env.book_src.join(file).tap_err(log_debug!()) else { ··· 387 388 return; 388 389 } 389 390 390 - not_found.push(file); 391 + not_found.get_or_insert(file); 391 392 } 392 393 393 - link.link = not_found[0].to_string().into(); 394 - link.status = LinkStatus::NoSuchPath; 394 + if let Some(file) = not_found { 395 + link.status = LinkStatus::NoSuchPath(vec![]); 396 + } 395 397 } 396 398 } 397 399
+6 -6
crates/mdbook-permalinks/src/page.rs
··· 10 10 markdown::{PatchStream, Spanned}, 11 11 }; 12 12 13 - use crate::link::{EmitLinkSpan, LinkSpan, LinkStatus, LinkText, LinkUsage, RelativeLink}; 13 + use crate::link::{ContentTypeHint, EmitLinkSpan, LinkSpan, LinkStatus, LinkText, RelativeLink}; 14 14 15 15 pub struct Pages<'a> { 16 16 pages: HashMap<Arc<Url>, Page<'a>>, ··· 86 86 let (usage, link, title) = match tag { 87 87 Tag::Link { 88 88 dest_url, title, .. 89 - } => (LinkUsage::Link, dest_url, title), 89 + } => (ContentTypeHint::Tree, dest_url, title), 90 90 Tag::Image { 91 91 dest_url, title, .. 92 - } => (LinkUsage::Image, dest_url, title), 92 + } => (ContentTypeHint::Raw, dest_url, title), 93 93 _ => unreachable!(), 94 94 }; 95 95 let link = RelativeLink { 96 96 status: LinkStatus::PathNotCheckedIn, 97 97 span, 98 98 link, 99 - usage, 99 + hint: usage, 100 100 title, 101 101 } 102 102 .pipe(LinkText::Link); ··· 108 108 109 109 event @ Event::End(end @ (TagEnd::Link | TagEnd::Image)) => { 110 110 let usage = match end { 111 - TagEnd::Link => LinkUsage::Link, 112 - TagEnd::Image => LinkUsage::Image, 111 + TagEnd::Link => ContentTypeHint::Tree, 112 + TagEnd::Image => ContentTypeHint::Raw, 113 113 _ => unreachable!(), 114 114 }; 115 115 let Some(mut items) = opened.take() else {
+1 -1
crates/mdbook-permalinks/src/tests.rs
··· 91 91 #[case("_stderr.rewritten", matcher!(LinkStatus::Rewritten))] 92 92 #[case("_stderr.permalink", matcher!(LinkStatus::Permalink))] 93 93 #[case("_stderr.not-checked-in", matcher!(LinkStatus::PathNotCheckedIn))] 94 - #[case("_stderr.no-such-path", matcher!(LinkStatus::NoSuchPath))] 94 + #[case("_stderr.no-such-path", matcher!(LinkStatus::NoSuchPath(..)))] 95 95 #[case("_stderr.link-error", matcher!(LinkStatus::Error(..)))] 96 96 fn test_stderr(#[case] name: &str, #[case] matcher: impl Fn(&LinkStatus) -> bool) -> Result<()> { 97 97 let Fixture { env, pages } = &*FIXTURE;
+1
crates/mdbook-permalinks/src/tests/LICENSE
··· 1 + Minato City, Tokyo, Japan.jpg, David Kernan, CC BY 4.0 <https://creativecommons.org/licenses/by/4.0>, via Wikimedia Commons, <https://commons.wikimedia.org/wiki/File:Minato_City,_Tokyo,_Japan.jpg>
crates/mdbook-permalinks/src/tests/Minato_City,_Tokyo,_Japan.jpg

This is a binary file and will not be displayed.

+62 -55
crates/mdbook-permalinks/src/vcs.rs
··· 8 8 9 9 use mdbookkit::log_debug; 10 10 11 - use crate::{Config, VersionControl}; 11 + use crate::{Config, VersionControl, link::ContentTypeHint}; 12 12 13 13 impl VersionControl { 14 14 pub fn try_from_git(config: &Config, book: &MDBookConfig) -> Result<Result<Self>> { ··· 75 75 76 76 pub trait PermalinkFormat { 77 77 /// Try to convert this path to a permalink 78 - fn to_link(&self, path: &str) -> Result<Url>; 78 + fn to_link(&self, path: &str, hint: ContentTypeHint) -> Result<Url>; 79 79 /// Try to extract a path (relative to repo root) from this link 80 - fn to_path(&self, link: &Url) -> Option<String>; 80 + fn to_path(&self, link: &Url) -> Option<(String, ContentTypeHint)>; 81 81 } 82 82 83 83 pub enum Permalink { ··· 86 86 } 87 87 88 88 impl PermalinkFormat for Permalink { 89 - fn to_link(&self, path: &str) -> Result<Url> { 89 + #[inline] 90 + fn to_link(&self, path: &str, hint: ContentTypeHint) -> Result<Url> { 90 91 match self { 91 - Self::GitHub(this) => this.to_link(path), 92 - Self::Custom(this) => this.to_link(path), 92 + Self::GitHub(this) => this.to_link(path, hint), 93 + Self::Custom(this) => this.to_link(path, hint), 93 94 } 94 95 } 95 96 96 - fn to_path(&self, link: &Url) -> Option<String> { 97 + #[inline] 98 + fn to_path(&self, link: &Url) -> Option<(String, ContentTypeHint)> { 97 99 match self { 98 100 Self::GitHub(this) => this.to_path(link), 99 101 Self::Custom(this) => this.to_path(link), ··· 104 106 pub struct GitHubPermalink(CustomPermalink); 105 107 106 108 impl PermalinkFormat for GitHubPermalink { 107 - fn to_link(&self, path: &str) -> Result<Url> { 108 - self.0.to_link(path) 109 + #[inline] 110 + fn to_link(&self, path: &str, hint: ContentTypeHint) -> Result<Url> { 111 + self.0.to_link(path, hint) 109 112 } 110 113 111 - fn to_path(&self, link: &Url) -> Option<String> { 114 + #[inline] 115 + fn to_path(&self, link: &Url) -> Option<(String, ContentTypeHint)> { 112 116 self.0.to_path(link) 113 117 } 114 118 } ··· 142 146 } 143 147 144 148 impl PermalinkFormat for CustomPermalink { 145 - fn to_link(&self, path: &str) -> Result<Url> { 149 + fn to_link(&self, path: &str, hint: ContentTypeHint) -> Result<Url> { 146 150 let path = self 147 151 .pattern 148 152 .path() 149 153 .split('/') 150 154 .map(|segment| match segment { 151 155 encoded_param!("ref") => &self.reference, 152 - encoded_param!("tree") => "tree", 156 + encoded_param!("tree") => match hint { 157 + ContentTypeHint::Tree => "tree", 158 + ContentTypeHint::Raw => "raw", 159 + }, 153 160 encoded_param!("path") => path, 154 161 _ => segment, 155 162 }) ··· 181 188 .pipe(Ok) 182 189 } 183 190 184 - // this is kind of ugly 185 - fn to_path(&self, link: &Url) -> Option<String> { 191 + // this is kind of messy 192 + fn to_path(&self, link: &Url) -> Option<(String, ContentTypeHint)> { 186 193 if self.pattern.origin() != link.origin() { 187 194 return None; 188 195 } 189 196 190 - fn match_param(lhs: &str, rhs: Option<&str>) -> ControlFlow<()> { 197 + let mut path = false; 198 + let mut hint = ContentTypeHint::Tree; 199 + 200 + let mut match_param = |lhs: &str, rhs: Option<&str>| -> ControlFlow<()> { 191 201 match lhs { 192 202 encoded_param!("tree") => match rhs { 193 - Some("tree" | "blob" | "raw") => ControlFlow::Continue(()), 203 + Some("tree" | "blob") => { 204 + hint = ContentTypeHint::Tree; 205 + ControlFlow::Continue(()) 206 + } 207 + Some("raw") => { 208 + hint = ContentTypeHint::Raw; 209 + ControlFlow::Continue(()) 210 + } 194 211 _ => ControlFlow::Break(()), 195 212 }, 196 213 encoded_param!("ref") => match rhs { ··· 202 219 _ => ControlFlow::Break(()), 203 220 }, 204 221 } 205 - } 206 - 207 - let mut path = false; 222 + }; 208 223 209 224 let mut lhs = self.pattern.path().split('/'); 210 225 let mut rhs = link.path().split('/'); ··· 251 266 None => return None, 252 267 }, 253 268 "{tree}" => match link_query.get(&k).map(|v| &**v) { 254 - Some("tree" | "blob" | "raw") => {} 269 + Some("tree" | "blob") => { 270 + hint = ContentTypeHint::Tree; 271 + } 272 + Some("raw") => { 273 + hint = ContentTypeHint::Raw; 274 + } 255 275 _ => return None, 256 276 }, 257 277 "{ref}" => match link_query.get(&k).map(|v| &**v) { ··· 262 282 } 263 283 } 264 284 265 - if let Some(path) = path { 266 - match link.fragment() { 267 - Some(fragment) => Some(format!("{path}#{fragment}")), 268 - None => Some(path), 269 - } 270 - } else { 271 - None 272 - } 285 + Some((path?, hint)) 273 286 } 274 287 } 275 288 ··· 376 389 use git2::Repository; 377 390 use mdbook_preprocessor::config::Config as MDBookConfig; 378 391 392 + use crate::link::ContentTypeHint; 393 + 379 394 use super::{CustomPermalink, PermalinkFormat, find_git_remote, remote_as_github}; 380 395 381 396 #[test] ··· 439 454 reference: "main".into(), 440 455 }; 441 456 442 - let link = scheme.to_link(".editorconfig")?; 457 + let link = scheme.to_link(".editorconfig", ContentTypeHint::Tree)?; 443 458 444 459 assert_eq!( 445 460 link.as_str(), ··· 456 471 reference: "master".into(), 457 472 }; 458 473 459 - let link = scheme.to_link(".editorconfig")?; 474 + let link = scheme.to_link(".editorconfig", ContentTypeHint::Tree)?; 460 475 461 476 assert_eq!( 462 477 link.as_str(), ··· 473 488 reference: "main".into(), 474 489 }; 475 490 476 - let path = scheme.to_path(&"https://github.com/lorem/ipsum/raw/HEAD/path/to/file".parse()?); 477 - 478 - assert_eq!(path.as_deref(), Some("path/to/file")); 479 - 480 - Ok(()) 481 - } 482 - 483 - #[test] 484 - fn test_link_to_path_with_fragments() -> Result<()> { 485 - let scheme = CustomPermalink { 486 - pattern: "https://github.com/lorem/ipsum/{tree}/{ref}/{path}".parse()?, 487 - reference: "main".into(), 488 - }; 489 - 490 - let path = scheme.to_path( 491 - &"https://github.com/lorem/ipsum/blob/HEAD/path/to/file.md#section-1".parse()?, 492 - ); 491 + let (path, hint) = scheme 492 + .to_path(&"https://github.com/lorem/ipsum/raw/HEAD/path/to/file".parse()?) 493 + .unwrap(); 493 494 494 - assert_eq!(path.as_deref(), Some("path/to/file.md#section-1")); 495 + assert_eq!(path, "path/to/file"); 496 + assert_eq!(hint, ContentTypeHint::Raw); 495 497 496 498 Ok(()) 497 499 } ··· 503 505 reference: "main".into(), 504 506 }; 505 507 506 - let path = scheme.to_path(&"https://github.com/lorem/ipsum/raw/HEAD".parse()?); 508 + let (path, _) = scheme 509 + .to_path(&"https://github.com/lorem/ipsum/raw/HEAD".parse()?) 510 + .unwrap(); 507 511 508 - assert_eq!(path.as_deref(), Some("")); 512 + assert_eq!(path, ""); 509 513 510 - let path = scheme.to_path(&"https://github.com/lorem/ipsum/raw/HEAD/".parse()?); 514 + let (path, _) = scheme 515 + .to_path(&"https://github.com/lorem/ipsum/raw/HEAD/".parse()?) 516 + .unwrap(); 511 517 512 - assert_eq!(path.as_deref(), Some("")); 518 + assert_eq!(path, ""); 513 519 514 520 Ok(()) 515 521 } ··· 521 527 reference: "main".into(), 522 528 }; 523 529 524 - let path = 525 - scheme.to_path(&"https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/.editorconfig?h=HEAD".parse()?); 530 + let (path, hint) = 531 + scheme.to_path(&"https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/raw/.editorconfig?h=HEAD".parse()?).unwrap(); 526 532 527 - assert_eq!(path.as_deref(), Some(".editorconfig")); 533 + assert_eq!(path, ".editorconfig"); 534 + assert_eq!(hint, ContentTypeHint::Raw); 528 535 529 536 Ok(()) 530 537 }
+4 -4
crates/mdbook-rustdoc-links/src/tests.rs
··· 131 131 } 132 132 133 133 test_documents![ 134 - "../../../docs/src/rustdoc-link/index.md", 135 - "../../../docs/src/rustdoc-link/getting-started.md", 136 - "../../../docs/src/rustdoc-link/supported-syntax.md", 137 - "../../../docs/src/rustdoc-link/known-issues.md", 134 + "../../../docs/src/rustdoc-links/index.md", 135 + "../../../docs/src/rustdoc-links/getting-started.md", 136 + "../../../docs/src/rustdoc-links/supported-syntax.md", 137 + "../../../docs/src/rustdoc-links/known-issues.md", 138 138 "tests/ra-known-quirks.md", 139 139 ];
+5 -5
crates/mdbook-rustdoc-links/src/tests/snaps/getting-started.snap
··· 19 19 2. Install the preprocessor: 20 20 21 21 ``` 22 - cargo install mdbookkit --features rustdoc-link 22 + cargo install mdbook-rustdoc-links 23 23 ``` 24 24 25 25 Alternatively, you may obtain precompiled binaries from [GitHub ··· 35 35 [book] 36 36 title = "My Book" 37 37 38 - [preprocessor.rustdoc-link] 39 - # mdBook will run `mdbook-rustdoc-link` 38 + [preprocessor.rustdoc-links] 39 + # mdBook will execute the command `mdbook-rustdoc-links` 40 40 after = ["links"] 41 41 # mdBook will run this preprocessor after the default `links` preprocessor. 42 42 # This is recommended. It allows the preprocessor to see text embedded ··· 79 79 80 80 > [!TIP] 81 81 > 82 - > `mdbook-rustdoc-link` makes use of rust-analyzer's ["Open Docs"][open-docs] feature, 82 + > `mdbook-rustdoc-links` makes use of rust-analyzer's ["Open Docs"][open-docs] feature, 83 83 > which resolves links to documentation given a symbol. 84 84 > 85 85 > Items from `std` will generate links to <https://doc.rust-lang.org>, while items from ··· 90 90 - See the full list of [supported syntax](supported-syntax.md). 91 91 - Understand [how the preprocessor resolves links](name-resolution.md) under the hood. 92 92 - Check out [available configuration options](configuration.md). 93 - - Learn about some [known issues and limitations](known-issues.md). 93 + - Learn about [known issues and limitations](known-issues.md). 94 94 95 95 <!-- prettier-ignore-start --> 96 96
+25 -17
crates/mdbook-rustdoc-links/src/tests/snaps/index.snap
··· 3 3 assertion_line: 61 4 4 expression: output 5 5 --- 6 - # mdbook-rustdoc-link 6 + # mdbook-rustdoc-links 7 7 8 8 <div class="hidden"> 9 9 10 10 **For best results, view this page at 11 - <https://tonywu6.github.io/mdbookkit/rustdoc-link>.** 11 + <https://tonywu6.github.io/mdbookkit/rustdoc-links>.** 12 12 13 13 </div> 14 14 ··· 50 50 51 51 For **writing documentation** — 52 52 53 - - To learn more about how the preprocessor resolves items into links, including 54 - [feature-gated items](name-resolution.md#feature-gated-items), see 55 - [Name resolution](name-resolution.md). 56 - - To learn how to link to additional items such as 53 + - [Supported syntax](supported-syntax.md): Full list of link syntax with examples. Know 54 + how to link to additional items such as 57 55 [functions, macros](supported-syntax.md#functions-and-macros), and 58 - [implementors](supported-syntax.md#implementors-and-fully-qualified-syntax), see 59 - [Supported syntax](supported-syntax.md). 56 + [implementors](supported-syntax.md#implementors-and-fully-qualified-syntax). 57 + 58 + - [Name resolution](name-resolution.md): Understand how the preprocessor finds Rust 59 + items, including 60 + [when items are gated behind features](name-resolution.md#feature-gated-items). 60 61 61 62 For **making the preprocessor work with your project** — 62 63 63 - - If you use [Cargo workspaces][workspaces], see specific instructions in 64 - [Workspace layout](workspace-layout.md). 65 - - If you are working on a large project, and processing is taking a long time, see the 66 - discussion in [Caching](caching.md). 64 + - [Workspace layout](workspace-layout.md): Setup and options suitable for [Cargo 65 + workspaces][workspaces]. 66 + 67 + - [Caching](caching.md): If you are working on a large project and processing is taking 68 + a long time. 67 69 68 70 For **additional usage information** — 69 71 70 - - You can use this as a standalone command line tool: see 71 - [Standalone usage](standalone-usage.md). 72 - - For tips on using this in CI, see [Continuous integration](continuous-integration.md). 73 - - For all available options and how to set them, see [Configuration](configuration.md). 74 - - Finally, review [Known issues](known-issues.md) and limitations. 72 + - [Standalone usage](standalone-usage.md): Use the preprocessor as a standalone command 73 + line tool. 74 + 75 + - [Continuous integration](continuous-integration.md): Information for running the 76 + preprocessor in CI environments, including 77 + [logging](continuous-integration.md#logging) and 78 + [failing a build when there are bad links](continuous-integration.md#error-handling). 79 + 80 + - [Configuration](configuration.md): List of available options. 81 + 82 + - [Known issues](known-issues.md) and limitations. 75 83 76 84 Happy linking! 77 85
+5 -5
crates/mdbook-rustdoc-links/src/tests/snaps/known-issues.snap
··· 7 7 8 8 ## Performance 9 9 10 - `mdbook-rustdoc-link` itself doesn't need much processing power, but it invokes 10 + `mdbook-rustdoc-links` itself doesn't need much processing power, but it invokes 11 11 rust-analyzer, which does a full scan of your workspace. The larger your workspace is, 12 12 the longer mdBook will have to wait for the preprocessor. This is the source of the 13 13 majority of the run time. ··· 45 45 - The correct link is 46 46 [https://docs.rs/tokio-macros/2.5.0/tokio_macros/~~macro~~attr.main.html][tokio::main] 47 47 48 - ### Trait items 48 + ### Implemented items with the same name 49 49 50 50 Rust allows methods to have the same name if they are from different traits, and types 51 51 can implement the same trait multiple times if the trait is generic. All such methods ··· 83 83 ## Sites other than docs.rs 84 84 85 85 Currently, items from crates other than `std` always generate links that point to 86 - <https://docs.rs>. `mdbook-rustdoc-link` does not yet support configuring alternative 87 - URL prefixes. 86 + <https://docs.rs>. The preprocessor does not yet support configuring alternative URL 87 + prefixes. 88 88 89 89 ## Wrong line numbers in diagnostics 90 90 ··· 101 101 102 102 This is an unfortunate limitation with mdBook's preprocessor architecture. Preprocessors 103 103 are run sequentially, with the next preprocessor receiving Markdown source rendered by 104 - the previous one. If preprocessors running before `mdbook-rustdoc-link` modify Markdown 104 + the previous one. If preprocessors running before the preprocessor modify Markdown 105 105 source in such ways that shift lines around, then the line numbers will look incorrect. 106 106 107 107 Unless mdBook somehow gains [source map][sourcemap] support, this problem is unlikely to
+1 -1
crates/mdbook-rustdoc-links/src/tests/snaps/known-issues.stderr.snap
··· 28 28 │ - The correct link is 29 29 │ [https://docs.rs/tokio-macros/2.5.0/tokio_macros/~~macro~~attr.main.html][tokio::main] 30 30 31 - │ ### Trait items 31 + │ ### Implemented items with the same name 32 32 33 33 │ Rust allows methods to have the same name if they are from different traits, and types 34 34 │ can implement the same trait multiple times if the trait is generic. All such methods
+1 -1
crates/mdbook-rustdoc-links/src/tests/snaps/supported-syntax.snap
··· 8 8 <div class="hidden"> 9 9 10 10 **For best results, view this page at 11 - <https://tonywu6.github.io/mdbookkit/rustdoc-link/supported-syntax>.** 11 + <https://tonywu6.github.io/mdbookkit/rustdoc-links/supported-syntax>.** 12 12 13 13 </div> 14 14
+7 -4
deno.json
··· 12 12 "docs/src/app" 13 13 ], 14 14 "imports": { 15 - "esbuild": "npm:esbuild@^0.25.1", 16 - "prettier": "npm:prettier@^3.5.3", 17 - "stylelint": "npm:stylelint@^16.18.0", 18 - "stylelint-config-recess-order": "npm:stylelint-config-recess-order@^6.0.0", 15 + "@std/encoding": "jsr:@std/encoding@^1.0.10", 16 + "@std/path": "jsr:@std/path@^1.1.3", 17 + "esbuild": "npm:esbuild@^0.25.12", 18 + "mermaid": "npm:mermaid@^11.12.2", 19 + "prettier": "npm:prettier@^3.7.4", 20 + "stylelint": "npm:stylelint@^16.26.1", 21 + "stylelint-config-recess-order": "npm:stylelint-config-recess-order@^6.1.0", 19 22 "stylelint-config-standard": "npm:stylelint-config-standard@^38.0.0" 20 23 }, 21 24 "nodeModulesDir": "auto",
+1030 -181
deno.lock
··· 1 1 { 2 - "version": "4", 2 + "version": "5", 3 3 "specifiers": { 4 4 "jsr:@std/encoding@*": "1.0.8", 5 + "jsr:@std/encoding@^1.0.10": "1.0.10", 6 + "jsr:@std/internal@^1.0.12": "1.0.12", 5 7 "jsr:@std/path@*": "1.0.8", 8 + "jsr:@std/path@^1.1.3": "1.1.3", 6 9 "npm:@types/node@*": "22.12.0", 7 - "npm:esbuild@*": "0.25.1", 8 - "npm:esbuild@0.25": "0.25.1", 9 10 "npm:esbuild@0.25.2": "0.25.2", 10 - "npm:esbuild@~0.25.1": "0.25.1", 11 - "npm:prettier@*": "3.5.3", 12 - "npm:prettier@^3.5.3": "3.5.3", 13 - "npm:stylelint-config-recess-order@6": "6.0.0_stylelint@16.18.0__@csstools+css-tokenizer@3.0.3__@csstools+css-parser-algorithms@3.0.4___@csstools+css-tokenizer@3.0.3__postcss-selector-parser@7.1.0__postcss@8.5.3", 14 - "npm:stylelint-config-standard@38": "38.0.0_stylelint@16.18.0__@csstools+css-tokenizer@3.0.3__@csstools+css-parser-algorithms@3.0.4___@csstools+css-tokenizer@3.0.3__postcss-selector-parser@7.1.0__postcss@8.5.3", 15 - "npm:stylelint@^16.18.0": "16.18.0_@csstools+css-tokenizer@3.0.3_@csstools+css-parser-algorithms@3.0.4__@csstools+css-tokenizer@3.0.3_postcss-selector-parser@7.1.0_postcss@8.5.3" 11 + "npm:esbuild@~0.25.12": "0.25.12", 12 + "npm:mermaid@^11.12.2": "11.12.2_cytoscape@3.33.1", 13 + "npm:prettier@^3.7.4": "3.7.4", 14 + "npm:stylelint-config-recess-order@^6.1.0": "6.1.0_stylelint@16.26.1__@csstools+css-tokenizer@3.0.4__@csstools+css-parser-algorithms@3.0.5___@csstools+css-tokenizer@3.0.4__postcss-selector-parser@7.1.0__postcss@8.5.6", 15 + "npm:stylelint-config-standard@38": "38.0.0_stylelint@16.26.1__@csstools+css-tokenizer@3.0.4__@csstools+css-parser-algorithms@3.0.5___@csstools+css-tokenizer@3.0.4__postcss-selector-parser@7.1.0__postcss@8.5.6", 16 + "npm:stylelint@^16.26.1": "16.26.1_@csstools+css-tokenizer@3.0.4_@csstools+css-parser-algorithms@3.0.5__@csstools+css-tokenizer@3.0.4_postcss-selector-parser@7.1.0_postcss@8.5.6" 16 17 }, 17 18 "jsr": { 18 19 "@std/encoding@1.0.8": { 19 20 "integrity": "a6c8f3f933ab1bed66244f435d1dc0fd23a888e07195532122ddc3d5f8f0e6b4" 20 21 }, 22 + "@std/encoding@1.0.10": { 23 + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" 24 + }, 25 + "@std/internal@1.0.12": { 26 + "integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027" 27 + }, 21 28 "@std/path@1.0.8": { 22 29 "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" 30 + }, 31 + "@std/path@1.1.3": { 32 + "integrity": "b015962d82a5e6daea980c32b82d2c40142149639968549c649031a230b1afb3", 33 + "dependencies": [ 34 + "jsr:@std/internal" 35 + ] 23 36 } 24 37 }, 25 38 "npm": { 39 + "@antfu/install-pkg@1.1.0": { 40 + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", 41 + "dependencies": [ 42 + "package-manager-detector", 43 + "tinyexec" 44 + ] 45 + }, 26 46 "@babel/code-frame@7.26.2": { 27 47 "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 28 48 "dependencies": [ ··· 34 54 "@babel/helper-validator-identifier@7.25.9": { 35 55 "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" 36 56 }, 37 - "@csstools/css-parser-algorithms@3.0.4_@csstools+css-tokenizer@3.0.3": { 38 - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", 57 + "@braintree/sanitize-url@7.1.1": { 58 + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==" 59 + }, 60 + "@cacheable/memory@2.0.6_keyv@5.5.5": { 61 + "integrity": "sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==", 62 + "dependencies": [ 63 + "@cacheable/utils", 64 + "@keyv/bigmap", 65 + "hookified", 66 + "keyv" 67 + ] 68 + }, 69 + "@cacheable/utils@2.3.2": { 70 + "integrity": "sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==", 71 + "dependencies": [ 72 + "hashery", 73 + "keyv" 74 + ] 75 + }, 76 + "@chevrotain/cst-dts-gen@11.0.3": { 77 + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", 78 + "dependencies": [ 79 + "@chevrotain/gast", 80 + "@chevrotain/types", 81 + "lodash-es" 82 + ] 83 + }, 84 + "@chevrotain/gast@11.0.3": { 85 + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", 86 + "dependencies": [ 87 + "@chevrotain/types", 88 + "lodash-es" 89 + ] 90 + }, 91 + "@chevrotain/regexp-to-ast@11.0.3": { 92 + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==" 93 + }, 94 + "@chevrotain/types@11.0.3": { 95 + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==" 96 + }, 97 + "@chevrotain/utils@11.0.3": { 98 + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==" 99 + }, 100 + "@csstools/css-parser-algorithms@3.0.5_@csstools+css-tokenizer@3.0.4": { 101 + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", 39 102 "dependencies": [ 40 103 "@csstools/css-tokenizer" 41 104 ] 42 105 }, 43 - "@csstools/css-tokenizer@3.0.3": { 44 - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==" 106 + "@csstools/css-syntax-patches-for-csstree@1.0.21": { 107 + "integrity": "sha512-plP8N8zKfEZ26figX4Nvajx8DuzfuRpLTqglQ5d0chfnt35Qt3X+m6ASZ+rG0D0kxe/upDVNwSIVJP5n4FuNfw==" 108 + }, 109 + "@csstools/css-tokenizer@3.0.4": { 110 + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" 45 111 }, 46 - "@csstools/media-query-list-parser@4.0.2_@csstools+css-parser-algorithms@3.0.4__@csstools+css-tokenizer@3.0.3_@csstools+css-tokenizer@3.0.3": { 47 - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", 112 + "@csstools/media-query-list-parser@4.0.3_@csstools+css-parser-algorithms@3.0.5__@csstools+css-tokenizer@3.0.4_@csstools+css-tokenizer@3.0.4": { 113 + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", 48 114 "dependencies": [ 49 115 "@csstools/css-parser-algorithms", 50 116 "@csstools/css-tokenizer" ··· 56 122 "postcss-selector-parser" 57 123 ] 58 124 }, 59 - "@dual-bundle/import-meta-resolve@4.1.0": { 60 - "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==" 125 + "@dual-bundle/import-meta-resolve@4.2.1": { 126 + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==" 61 127 }, 62 - "@esbuild/aix-ppc64@0.25.1": { 63 - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==" 128 + "@esbuild/aix-ppc64@0.25.12": { 129 + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", 130 + "os": ["aix"], 131 + "cpu": ["ppc64"] 64 132 }, 65 133 "@esbuild/aix-ppc64@0.25.2": { 66 - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==" 134 + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", 135 + "os": ["aix"], 136 + "cpu": ["ppc64"] 67 137 }, 68 - "@esbuild/android-arm64@0.25.1": { 69 - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==" 138 + "@esbuild/android-arm64@0.25.12": { 139 + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", 140 + "os": ["android"], 141 + "cpu": ["arm64"] 70 142 }, 71 143 "@esbuild/android-arm64@0.25.2": { 72 - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==" 144 + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", 145 + "os": ["android"], 146 + "cpu": ["arm64"] 73 147 }, 74 - "@esbuild/android-arm@0.25.1": { 75 - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==" 148 + "@esbuild/android-arm@0.25.12": { 149 + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", 150 + "os": ["android"], 151 + "cpu": ["arm"] 76 152 }, 77 153 "@esbuild/android-arm@0.25.2": { 78 - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==" 154 + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", 155 + "os": ["android"], 156 + "cpu": ["arm"] 79 157 }, 80 - "@esbuild/android-x64@0.25.1": { 81 - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==" 158 + "@esbuild/android-x64@0.25.12": { 159 + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", 160 + "os": ["android"], 161 + "cpu": ["x64"] 82 162 }, 83 163 "@esbuild/android-x64@0.25.2": { 84 - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==" 164 + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", 165 + "os": ["android"], 166 + "cpu": ["x64"] 85 167 }, 86 - "@esbuild/darwin-arm64@0.25.1": { 87 - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==" 168 + "@esbuild/darwin-arm64@0.25.12": { 169 + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", 170 + "os": ["darwin"], 171 + "cpu": ["arm64"] 88 172 }, 89 173 "@esbuild/darwin-arm64@0.25.2": { 90 - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==" 174 + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", 175 + "os": ["darwin"], 176 + "cpu": ["arm64"] 91 177 }, 92 - "@esbuild/darwin-x64@0.25.1": { 93 - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==" 178 + "@esbuild/darwin-x64@0.25.12": { 179 + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", 180 + "os": ["darwin"], 181 + "cpu": ["x64"] 94 182 }, 95 183 "@esbuild/darwin-x64@0.25.2": { 96 - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==" 184 + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", 185 + "os": ["darwin"], 186 + "cpu": ["x64"] 97 187 }, 98 - "@esbuild/freebsd-arm64@0.25.1": { 99 - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==" 188 + "@esbuild/freebsd-arm64@0.25.12": { 189 + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", 190 + "os": ["freebsd"], 191 + "cpu": ["arm64"] 100 192 }, 101 193 "@esbuild/freebsd-arm64@0.25.2": { 102 - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==" 194 + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", 195 + "os": ["freebsd"], 196 + "cpu": ["arm64"] 103 197 }, 104 - "@esbuild/freebsd-x64@0.25.1": { 105 - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==" 198 + "@esbuild/freebsd-x64@0.25.12": { 199 + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", 200 + "os": ["freebsd"], 201 + "cpu": ["x64"] 106 202 }, 107 203 "@esbuild/freebsd-x64@0.25.2": { 108 - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==" 204 + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", 205 + "os": ["freebsd"], 206 + "cpu": ["x64"] 109 207 }, 110 - "@esbuild/linux-arm64@0.25.1": { 111 - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==" 208 + "@esbuild/linux-arm64@0.25.12": { 209 + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", 210 + "os": ["linux"], 211 + "cpu": ["arm64"] 112 212 }, 113 213 "@esbuild/linux-arm64@0.25.2": { 114 - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==" 214 + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", 215 + "os": ["linux"], 216 + "cpu": ["arm64"] 115 217 }, 116 - "@esbuild/linux-arm@0.25.1": { 117 - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==" 218 + "@esbuild/linux-arm@0.25.12": { 219 + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", 220 + "os": ["linux"], 221 + "cpu": ["arm"] 118 222 }, 119 223 "@esbuild/linux-arm@0.25.2": { 120 - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==" 224 + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", 225 + "os": ["linux"], 226 + "cpu": ["arm"] 121 227 }, 122 - "@esbuild/linux-ia32@0.25.1": { 123 - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==" 228 + "@esbuild/linux-ia32@0.25.12": { 229 + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", 230 + "os": ["linux"], 231 + "cpu": ["ia32"] 124 232 }, 125 233 "@esbuild/linux-ia32@0.25.2": { 126 - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==" 234 + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", 235 + "os": ["linux"], 236 + "cpu": ["ia32"] 127 237 }, 128 - "@esbuild/linux-loong64@0.25.1": { 129 - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==" 238 + "@esbuild/linux-loong64@0.25.12": { 239 + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", 240 + "os": ["linux"], 241 + "cpu": ["loong64"] 130 242 }, 131 243 "@esbuild/linux-loong64@0.25.2": { 132 - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==" 244 + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", 245 + "os": ["linux"], 246 + "cpu": ["loong64"] 133 247 }, 134 - "@esbuild/linux-mips64el@0.25.1": { 135 - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==" 248 + "@esbuild/linux-mips64el@0.25.12": { 249 + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", 250 + "os": ["linux"], 251 + "cpu": ["mips64el"] 136 252 }, 137 253 "@esbuild/linux-mips64el@0.25.2": { 138 - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==" 254 + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", 255 + "os": ["linux"], 256 + "cpu": ["mips64el"] 139 257 }, 140 - "@esbuild/linux-ppc64@0.25.1": { 141 - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==" 258 + "@esbuild/linux-ppc64@0.25.12": { 259 + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", 260 + "os": ["linux"], 261 + "cpu": ["ppc64"] 142 262 }, 143 263 "@esbuild/linux-ppc64@0.25.2": { 144 - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==" 264 + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", 265 + "os": ["linux"], 266 + "cpu": ["ppc64"] 145 267 }, 146 - "@esbuild/linux-riscv64@0.25.1": { 147 - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==" 268 + "@esbuild/linux-riscv64@0.25.12": { 269 + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", 270 + "os": ["linux"], 271 + "cpu": ["riscv64"] 148 272 }, 149 273 "@esbuild/linux-riscv64@0.25.2": { 150 - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==" 274 + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", 275 + "os": ["linux"], 276 + "cpu": ["riscv64"] 151 277 }, 152 - "@esbuild/linux-s390x@0.25.1": { 153 - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==" 278 + "@esbuild/linux-s390x@0.25.12": { 279 + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", 280 + "os": ["linux"], 281 + "cpu": ["s390x"] 154 282 }, 155 283 "@esbuild/linux-s390x@0.25.2": { 156 - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==" 284 + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", 285 + "os": ["linux"], 286 + "cpu": ["s390x"] 157 287 }, 158 - "@esbuild/linux-x64@0.25.1": { 159 - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==" 288 + "@esbuild/linux-x64@0.25.12": { 289 + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", 290 + "os": ["linux"], 291 + "cpu": ["x64"] 160 292 }, 161 293 "@esbuild/linux-x64@0.25.2": { 162 - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==" 294 + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", 295 + "os": ["linux"], 296 + "cpu": ["x64"] 163 297 }, 164 - "@esbuild/netbsd-arm64@0.25.1": { 165 - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==" 298 + "@esbuild/netbsd-arm64@0.25.12": { 299 + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", 300 + "os": ["netbsd"], 301 + "cpu": ["arm64"] 166 302 }, 167 303 "@esbuild/netbsd-arm64@0.25.2": { 168 - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==" 304 + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", 305 + "os": ["netbsd"], 306 + "cpu": ["arm64"] 169 307 }, 170 - "@esbuild/netbsd-x64@0.25.1": { 171 - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==" 308 + "@esbuild/netbsd-x64@0.25.12": { 309 + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", 310 + "os": ["netbsd"], 311 + "cpu": ["x64"] 172 312 }, 173 313 "@esbuild/netbsd-x64@0.25.2": { 174 - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==" 314 + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", 315 + "os": ["netbsd"], 316 + "cpu": ["x64"] 175 317 }, 176 - "@esbuild/openbsd-arm64@0.25.1": { 177 - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==" 318 + "@esbuild/openbsd-arm64@0.25.12": { 319 + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", 320 + "os": ["openbsd"], 321 + "cpu": ["arm64"] 178 322 }, 179 323 "@esbuild/openbsd-arm64@0.25.2": { 180 - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==" 324 + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", 325 + "os": ["openbsd"], 326 + "cpu": ["arm64"] 181 327 }, 182 - "@esbuild/openbsd-x64@0.25.1": { 183 - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==" 328 + "@esbuild/openbsd-x64@0.25.12": { 329 + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", 330 + "os": ["openbsd"], 331 + "cpu": ["x64"] 184 332 }, 185 333 "@esbuild/openbsd-x64@0.25.2": { 186 - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==" 334 + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", 335 + "os": ["openbsd"], 336 + "cpu": ["x64"] 337 + }, 338 + "@esbuild/openharmony-arm64@0.25.12": { 339 + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", 340 + "os": ["openharmony"], 341 + "cpu": ["arm64"] 187 342 }, 188 - "@esbuild/sunos-x64@0.25.1": { 189 - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==" 343 + "@esbuild/sunos-x64@0.25.12": { 344 + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", 345 + "os": ["sunos"], 346 + "cpu": ["x64"] 190 347 }, 191 348 "@esbuild/sunos-x64@0.25.2": { 192 - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==" 349 + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", 350 + "os": ["sunos"], 351 + "cpu": ["x64"] 193 352 }, 194 - "@esbuild/win32-arm64@0.25.1": { 195 - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==" 353 + "@esbuild/win32-arm64@0.25.12": { 354 + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", 355 + "os": ["win32"], 356 + "cpu": ["arm64"] 196 357 }, 197 358 "@esbuild/win32-arm64@0.25.2": { 198 - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==" 359 + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", 360 + "os": ["win32"], 361 + "cpu": ["arm64"] 199 362 }, 200 - "@esbuild/win32-ia32@0.25.1": { 201 - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==" 363 + "@esbuild/win32-ia32@0.25.12": { 364 + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", 365 + "os": ["win32"], 366 + "cpu": ["ia32"] 202 367 }, 203 368 "@esbuild/win32-ia32@0.25.2": { 204 - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==" 369 + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", 370 + "os": ["win32"], 371 + "cpu": ["ia32"] 205 372 }, 206 - "@esbuild/win32-x64@0.25.1": { 207 - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==" 373 + "@esbuild/win32-x64@0.25.12": { 374 + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", 375 + "os": ["win32"], 376 + "cpu": ["x64"] 208 377 }, 209 378 "@esbuild/win32-x64@0.25.2": { 210 - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==" 379 + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", 380 + "os": ["win32"], 381 + "cpu": ["x64"] 382 + }, 383 + "@iconify/types@2.0.0": { 384 + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" 211 385 }, 212 - "@keyv/serialize@1.0.3": { 213 - "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", 386 + "@iconify/utils@3.1.0": { 387 + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", 388 + "dependencies": [ 389 + "@antfu/install-pkg", 390 + "@iconify/types", 391 + "mlly" 392 + ] 393 + }, 394 + "@keyv/bigmap@1.3.0_keyv@5.5.5": { 395 + "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", 214 396 "dependencies": [ 215 - "buffer" 397 + "hashery", 398 + "hookified", 399 + "keyv" 400 + ] 401 + }, 402 + "@keyv/serialize@1.1.1": { 403 + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==" 404 + }, 405 + "@mermaid-js/parser@0.6.3": { 406 + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", 407 + "dependencies": [ 408 + "langium" 216 409 ] 217 410 }, 218 411 "@nodelib/fs.scandir@2.1.5": { ··· 232 425 "fastq" 233 426 ] 234 427 }, 428 + "@types/d3-array@3.2.2": { 429 + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==" 430 + }, 431 + "@types/d3-axis@3.0.6": { 432 + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", 433 + "dependencies": [ 434 + "@types/d3-selection" 435 + ] 436 + }, 437 + "@types/d3-brush@3.0.6": { 438 + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", 439 + "dependencies": [ 440 + "@types/d3-selection" 441 + ] 442 + }, 443 + "@types/d3-chord@3.0.6": { 444 + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" 445 + }, 446 + "@types/d3-color@3.1.3": { 447 + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" 448 + }, 449 + "@types/d3-contour@3.0.6": { 450 + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", 451 + "dependencies": [ 452 + "@types/d3-array", 453 + "@types/geojson" 454 + ] 455 + }, 456 + "@types/d3-delaunay@6.0.4": { 457 + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" 458 + }, 459 + "@types/d3-dispatch@3.0.7": { 460 + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==" 461 + }, 462 + "@types/d3-drag@3.0.7": { 463 + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", 464 + "dependencies": [ 465 + "@types/d3-selection" 466 + ] 467 + }, 468 + "@types/d3-dsv@3.0.7": { 469 + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" 470 + }, 471 + "@types/d3-ease@3.0.2": { 472 + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" 473 + }, 474 + "@types/d3-fetch@3.0.7": { 475 + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", 476 + "dependencies": [ 477 + "@types/d3-dsv" 478 + ] 479 + }, 480 + "@types/d3-force@3.0.10": { 481 + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==" 482 + }, 483 + "@types/d3-format@3.0.4": { 484 + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" 485 + }, 486 + "@types/d3-geo@3.1.0": { 487 + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", 488 + "dependencies": [ 489 + "@types/geojson" 490 + ] 491 + }, 492 + "@types/d3-hierarchy@3.1.7": { 493 + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" 494 + }, 495 + "@types/d3-interpolate@3.0.4": { 496 + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", 497 + "dependencies": [ 498 + "@types/d3-color" 499 + ] 500 + }, 501 + "@types/d3-path@3.1.1": { 502 + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==" 503 + }, 504 + "@types/d3-polygon@3.0.2": { 505 + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" 506 + }, 507 + "@types/d3-quadtree@3.0.6": { 508 + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" 509 + }, 510 + "@types/d3-random@3.0.3": { 511 + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" 512 + }, 513 + "@types/d3-scale-chromatic@3.1.0": { 514 + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==" 515 + }, 516 + "@types/d3-scale@4.0.9": { 517 + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", 518 + "dependencies": [ 519 + "@types/d3-time" 520 + ] 521 + }, 522 + "@types/d3-selection@3.0.11": { 523 + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==" 524 + }, 525 + "@types/d3-shape@3.1.7": { 526 + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", 527 + "dependencies": [ 528 + "@types/d3-path" 529 + ] 530 + }, 531 + "@types/d3-time-format@4.0.3": { 532 + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" 533 + }, 534 + "@types/d3-time@3.0.4": { 535 + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" 536 + }, 537 + "@types/d3-timer@3.0.2": { 538 + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" 539 + }, 540 + "@types/d3-transition@3.0.9": { 541 + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", 542 + "dependencies": [ 543 + "@types/d3-selection" 544 + ] 545 + }, 546 + "@types/d3-zoom@3.0.8": { 547 + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", 548 + "dependencies": [ 549 + "@types/d3-interpolate", 550 + "@types/d3-selection" 551 + ] 552 + }, 553 + "@types/d3@7.4.3": { 554 + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", 555 + "dependencies": [ 556 + "@types/d3-array", 557 + "@types/d3-axis", 558 + "@types/d3-brush", 559 + "@types/d3-chord", 560 + "@types/d3-color", 561 + "@types/d3-contour", 562 + "@types/d3-delaunay", 563 + "@types/d3-dispatch", 564 + "@types/d3-drag", 565 + "@types/d3-dsv", 566 + "@types/d3-ease", 567 + "@types/d3-fetch", 568 + "@types/d3-force", 569 + "@types/d3-format", 570 + "@types/d3-geo", 571 + "@types/d3-hierarchy", 572 + "@types/d3-interpolate", 573 + "@types/d3-path", 574 + "@types/d3-polygon", 575 + "@types/d3-quadtree", 576 + "@types/d3-random", 577 + "@types/d3-scale", 578 + "@types/d3-scale-chromatic", 579 + "@types/d3-selection", 580 + "@types/d3-shape", 581 + "@types/d3-time", 582 + "@types/d3-time-format", 583 + "@types/d3-timer", 584 + "@types/d3-transition", 585 + "@types/d3-zoom" 586 + ] 587 + }, 588 + "@types/geojson@7946.0.16": { 589 + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" 590 + }, 235 591 "@types/node@22.12.0": { 236 592 "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", 237 593 "dependencies": [ 238 594 "undici-types" 239 595 ] 240 596 }, 597 + "@types/trusted-types@2.0.7": { 598 + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" 599 + }, 600 + "acorn@8.15.0": { 601 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 602 + "bin": true 603 + }, 241 604 "ajv@8.17.1": { 242 605 "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 243 606 "dependencies": [ ··· 268 631 "balanced-match@2.0.0": { 269 632 "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==" 270 633 }, 271 - "base64-js@1.5.1": { 272 - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 273 - }, 274 634 "braces@3.0.3": { 275 635 "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 276 636 "dependencies": [ 277 637 "fill-range" 278 638 ] 279 639 }, 280 - "buffer@6.0.3": { 281 - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 640 + "cacheable@2.3.0": { 641 + "integrity": "sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA==", 282 642 "dependencies": [ 283 - "base64-js", 284 - "ieee754" 643 + "@cacheable/memory", 644 + "@cacheable/utils", 645 + "hookified", 646 + "keyv", 647 + "qified" 285 648 ] 286 649 }, 287 - "cacheable@1.8.10": { 288 - "integrity": "sha512-0ZnbicB/N2R6uziva8l6O6BieBklArWyiGx4GkwAhLKhSHyQtRfM9T1nx7HHuHDKkYB/efJQhz3QJ6x/YqoZzA==", 650 + "callsites@3.1.0": { 651 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 652 + }, 653 + "chevrotain-allstar@0.3.1_chevrotain@11.0.3": { 654 + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", 289 655 "dependencies": [ 290 - "hookified", 291 - "keyv" 656 + "chevrotain", 657 + "lodash-es" 292 658 ] 293 659 }, 294 - "callsites@3.1.0": { 295 - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 660 + "chevrotain@11.0.3": { 661 + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", 662 + "dependencies": [ 663 + "@chevrotain/cst-dts-gen", 664 + "@chevrotain/gast", 665 + "@chevrotain/regexp-to-ast", 666 + "@chevrotain/types", 667 + "@chevrotain/utils", 668 + "lodash-es" 669 + ] 296 670 }, 297 671 "color-convert@2.0.1": { 298 672 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", ··· 306 680 "colord@2.9.3": { 307 681 "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" 308 682 }, 683 + "commander@7.2.0": { 684 + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" 685 + }, 686 + "commander@8.3.0": { 687 + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" 688 + }, 689 + "confbox@0.1.8": { 690 + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" 691 + }, 692 + "cose-base@1.0.3": { 693 + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", 694 + "dependencies": [ 695 + "layout-base@1.0.2" 696 + ] 697 + }, 698 + "cose-base@2.2.0": { 699 + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", 700 + "dependencies": [ 701 + "layout-base@2.0.1" 702 + ] 703 + }, 309 704 "cosmiconfig@9.0.0": { 310 705 "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", 311 706 "dependencies": [ ··· 326 721 ] 327 722 }, 328 723 "cssesc@3.0.0": { 329 - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" 724 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 725 + "bin": true 726 + }, 727 + "cytoscape-cose-bilkent@4.1.0_cytoscape@3.33.1": { 728 + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", 729 + "dependencies": [ 730 + "cose-base@1.0.3", 731 + "cytoscape" 732 + ] 733 + }, 734 + "cytoscape-fcose@2.2.0_cytoscape@3.33.1": { 735 + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", 736 + "dependencies": [ 737 + "cose-base@2.2.0", 738 + "cytoscape" 739 + ] 740 + }, 741 + "cytoscape@3.33.1": { 742 + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==" 743 + }, 744 + "d3-array@2.12.1": { 745 + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", 746 + "dependencies": [ 747 + "internmap" 748 + ] 749 + }, 750 + "d3-array@3.2.4": { 751 + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", 752 + "dependencies": [ 753 + "internmap" 754 + ] 755 + }, 756 + "d3-axis@3.0.0": { 757 + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" 758 + }, 759 + "d3-brush@3.0.0_d3-selection@3.0.0": { 760 + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", 761 + "dependencies": [ 762 + "d3-dispatch", 763 + "d3-drag", 764 + "d3-interpolate", 765 + "d3-selection", 766 + "d3-transition" 767 + ] 768 + }, 769 + "d3-chord@3.0.1": { 770 + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", 771 + "dependencies": [ 772 + "d3-path@3.1.0" 773 + ] 774 + }, 775 + "d3-color@3.1.0": { 776 + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" 777 + }, 778 + "d3-contour@4.0.2": { 779 + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", 780 + "dependencies": [ 781 + "d3-array@3.2.4" 782 + ] 783 + }, 784 + "d3-delaunay@6.0.4": { 785 + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", 786 + "dependencies": [ 787 + "delaunator" 788 + ] 789 + }, 790 + "d3-dispatch@3.0.1": { 791 + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" 792 + }, 793 + "d3-drag@3.0.0": { 794 + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", 795 + "dependencies": [ 796 + "d3-dispatch", 797 + "d3-selection" 798 + ] 799 + }, 800 + "d3-dsv@3.0.1": { 801 + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", 802 + "dependencies": [ 803 + "commander@7.2.0", 804 + "iconv-lite", 805 + "rw" 806 + ], 807 + "bin": true 808 + }, 809 + "d3-ease@3.0.1": { 810 + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" 811 + }, 812 + "d3-fetch@3.0.1": { 813 + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", 814 + "dependencies": [ 815 + "d3-dsv" 816 + ] 817 + }, 818 + "d3-force@3.0.0": { 819 + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", 820 + "dependencies": [ 821 + "d3-dispatch", 822 + "d3-quadtree", 823 + "d3-timer" 824 + ] 825 + }, 826 + "d3-format@3.1.0": { 827 + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" 828 + }, 829 + "d3-geo@3.1.1": { 830 + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", 831 + "dependencies": [ 832 + "d3-array@3.2.4" 833 + ] 834 + }, 835 + "d3-hierarchy@3.1.2": { 836 + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" 837 + }, 838 + "d3-interpolate@3.0.1": { 839 + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", 840 + "dependencies": [ 841 + "d3-color" 842 + ] 843 + }, 844 + "d3-path@1.0.9": { 845 + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" 846 + }, 847 + "d3-path@3.1.0": { 848 + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" 849 + }, 850 + "d3-polygon@3.0.1": { 851 + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" 852 + }, 853 + "d3-quadtree@3.0.1": { 854 + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" 855 + }, 856 + "d3-random@3.0.1": { 857 + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" 858 + }, 859 + "d3-sankey@0.12.3": { 860 + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", 861 + "dependencies": [ 862 + "d3-array@2.12.1", 863 + "d3-shape@1.3.7" 864 + ] 865 + }, 866 + "d3-scale-chromatic@3.1.0": { 867 + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", 868 + "dependencies": [ 869 + "d3-color", 870 + "d3-interpolate" 871 + ] 872 + }, 873 + "d3-scale@4.0.2": { 874 + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", 875 + "dependencies": [ 876 + "d3-array@3.2.4", 877 + "d3-format", 878 + "d3-interpolate", 879 + "d3-time", 880 + "d3-time-format" 881 + ] 882 + }, 883 + "d3-selection@3.0.0": { 884 + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" 885 + }, 886 + "d3-shape@1.3.7": { 887 + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", 888 + "dependencies": [ 889 + "d3-path@1.0.9" 890 + ] 891 + }, 892 + "d3-shape@3.2.0": { 893 + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", 894 + "dependencies": [ 895 + "d3-path@3.1.0" 896 + ] 897 + }, 898 + "d3-time-format@4.1.0": { 899 + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", 900 + "dependencies": [ 901 + "d3-time" 902 + ] 903 + }, 904 + "d3-time@3.1.0": { 905 + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", 906 + "dependencies": [ 907 + "d3-array@3.2.4" 908 + ] 909 + }, 910 + "d3-timer@3.0.1": { 911 + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" 912 + }, 913 + "d3-transition@3.0.1_d3-selection@3.0.0": { 914 + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", 915 + "dependencies": [ 916 + "d3-color", 917 + "d3-dispatch", 918 + "d3-ease", 919 + "d3-interpolate", 920 + "d3-selection", 921 + "d3-timer" 922 + ] 923 + }, 924 + "d3-zoom@3.0.0_d3-selection@3.0.0": { 925 + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", 926 + "dependencies": [ 927 + "d3-dispatch", 928 + "d3-drag", 929 + "d3-interpolate", 930 + "d3-selection", 931 + "d3-transition" 932 + ] 933 + }, 934 + "d3@7.9.0_d3-selection@3.0.0": { 935 + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", 936 + "dependencies": [ 937 + "d3-array@3.2.4", 938 + "d3-axis", 939 + "d3-brush", 940 + "d3-chord", 941 + "d3-color", 942 + "d3-contour", 943 + "d3-delaunay", 944 + "d3-dispatch", 945 + "d3-drag", 946 + "d3-dsv", 947 + "d3-ease", 948 + "d3-fetch", 949 + "d3-force", 950 + "d3-format", 951 + "d3-geo", 952 + "d3-hierarchy", 953 + "d3-interpolate", 954 + "d3-path@3.1.0", 955 + "d3-polygon", 956 + "d3-quadtree", 957 + "d3-random", 958 + "d3-scale", 959 + "d3-scale-chromatic", 960 + "d3-selection", 961 + "d3-shape@3.2.0", 962 + "d3-time", 963 + "d3-time-format", 964 + "d3-timer", 965 + "d3-transition", 966 + "d3-zoom" 967 + ] 968 + }, 969 + "dagre-d3-es@7.0.13": { 970 + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", 971 + "dependencies": [ 972 + "d3", 973 + "lodash-es" 974 + ] 330 975 }, 331 - "debug@4.4.0": { 332 - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 976 + "dayjs@1.11.19": { 977 + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==" 978 + }, 979 + "debug@4.4.3": { 980 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 333 981 "dependencies": [ 334 982 "ms" 335 983 ] 336 984 }, 985 + "delaunator@5.0.1": { 986 + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", 987 + "dependencies": [ 988 + "robust-predicates" 989 + ] 990 + }, 337 991 "dir-glob@3.0.1": { 338 992 "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 339 993 "dependencies": [ 340 994 "path-type" 995 + ] 996 + }, 997 + "dompurify@3.3.1": { 998 + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", 999 + "optionalDependencies": [ 1000 + "@types/trusted-types" 341 1001 ] 342 1002 }, 343 1003 "emoji-regex@8.0.0": { ··· 352 1012 "is-arrayish" 353 1013 ] 354 1014 }, 355 - "esbuild@0.25.1": { 356 - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", 357 - "dependencies": [ 358 - "@esbuild/aix-ppc64@0.25.1", 359 - "@esbuild/android-arm64@0.25.1", 360 - "@esbuild/android-arm@0.25.1", 361 - "@esbuild/android-x64@0.25.1", 362 - "@esbuild/darwin-arm64@0.25.1", 363 - "@esbuild/darwin-x64@0.25.1", 364 - "@esbuild/freebsd-arm64@0.25.1", 365 - "@esbuild/freebsd-x64@0.25.1", 366 - "@esbuild/linux-arm64@0.25.1", 367 - "@esbuild/linux-arm@0.25.1", 368 - "@esbuild/linux-ia32@0.25.1", 369 - "@esbuild/linux-loong64@0.25.1", 370 - "@esbuild/linux-mips64el@0.25.1", 371 - "@esbuild/linux-ppc64@0.25.1", 372 - "@esbuild/linux-riscv64@0.25.1", 373 - "@esbuild/linux-s390x@0.25.1", 374 - "@esbuild/linux-x64@0.25.1", 375 - "@esbuild/netbsd-arm64@0.25.1", 376 - "@esbuild/netbsd-x64@0.25.1", 377 - "@esbuild/openbsd-arm64@0.25.1", 378 - "@esbuild/openbsd-x64@0.25.1", 379 - "@esbuild/sunos-x64@0.25.1", 380 - "@esbuild/win32-arm64@0.25.1", 381 - "@esbuild/win32-ia32@0.25.1", 382 - "@esbuild/win32-x64@0.25.1" 383 - ] 1015 + "esbuild@0.25.12": { 1016 + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", 1017 + "optionalDependencies": [ 1018 + "@esbuild/aix-ppc64@0.25.12", 1019 + "@esbuild/android-arm@0.25.12", 1020 + "@esbuild/android-arm64@0.25.12", 1021 + "@esbuild/android-x64@0.25.12", 1022 + "@esbuild/darwin-arm64@0.25.12", 1023 + "@esbuild/darwin-x64@0.25.12", 1024 + "@esbuild/freebsd-arm64@0.25.12", 1025 + "@esbuild/freebsd-x64@0.25.12", 1026 + "@esbuild/linux-arm@0.25.12", 1027 + "@esbuild/linux-arm64@0.25.12", 1028 + "@esbuild/linux-ia32@0.25.12", 1029 + "@esbuild/linux-loong64@0.25.12", 1030 + "@esbuild/linux-mips64el@0.25.12", 1031 + "@esbuild/linux-ppc64@0.25.12", 1032 + "@esbuild/linux-riscv64@0.25.12", 1033 + "@esbuild/linux-s390x@0.25.12", 1034 + "@esbuild/linux-x64@0.25.12", 1035 + "@esbuild/netbsd-arm64@0.25.12", 1036 + "@esbuild/netbsd-x64@0.25.12", 1037 + "@esbuild/openbsd-arm64@0.25.12", 1038 + "@esbuild/openbsd-x64@0.25.12", 1039 + "@esbuild/openharmony-arm64", 1040 + "@esbuild/sunos-x64@0.25.12", 1041 + "@esbuild/win32-arm64@0.25.12", 1042 + "@esbuild/win32-ia32@0.25.12", 1043 + "@esbuild/win32-x64@0.25.12" 1044 + ], 1045 + "scripts": true, 1046 + "bin": true 384 1047 }, 385 1048 "esbuild@0.25.2": { 386 1049 "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", 387 - "dependencies": [ 1050 + "optionalDependencies": [ 388 1051 "@esbuild/aix-ppc64@0.25.2", 389 - "@esbuild/android-arm64@0.25.2", 390 1052 "@esbuild/android-arm@0.25.2", 1053 + "@esbuild/android-arm64@0.25.2", 391 1054 "@esbuild/android-x64@0.25.2", 392 1055 "@esbuild/darwin-arm64@0.25.2", 393 1056 "@esbuild/darwin-x64@0.25.2", 394 1057 "@esbuild/freebsd-arm64@0.25.2", 395 1058 "@esbuild/freebsd-x64@0.25.2", 396 - "@esbuild/linux-arm64@0.25.2", 397 1059 "@esbuild/linux-arm@0.25.2", 1060 + "@esbuild/linux-arm64@0.25.2", 398 1061 "@esbuild/linux-ia32@0.25.2", 399 1062 "@esbuild/linux-loong64@0.25.2", 400 1063 "@esbuild/linux-mips64el@0.25.2", ··· 410 1073 "@esbuild/win32-arm64@0.25.2", 411 1074 "@esbuild/win32-ia32@0.25.2", 412 1075 "@esbuild/win32-x64@0.25.2" 413 - ] 1076 + ], 1077 + "scripts": true, 1078 + "bin": true 414 1079 }, 415 1080 "fast-deep-equal@3.1.3": { 416 1081 "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" ··· 437 1102 "reusify" 438 1103 ] 439 1104 }, 440 - "file-entry-cache@10.0.7": { 441 - "integrity": "sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==", 1105 + "file-entry-cache@11.1.1": { 1106 + "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", 442 1107 "dependencies": [ 443 1108 "flat-cache" 444 1109 ] ··· 449 1114 "to-regex-range" 450 1115 ] 451 1116 }, 452 - "flat-cache@6.1.7": { 453 - "integrity": "sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==", 1117 + "flat-cache@6.1.19": { 1118 + "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", 454 1119 "dependencies": [ 455 1120 "cacheable", 456 1121 "flatted", ··· 494 1159 "globjoin@0.1.4": { 495 1160 "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==" 496 1161 }, 1162 + "hachure-fill@0.5.2": { 1163 + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==" 1164 + }, 497 1165 "has-flag@4.0.0": { 498 1166 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 499 1167 }, 500 - "hookified@1.8.1": { 501 - "integrity": "sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==" 1168 + "hashery@1.3.0": { 1169 + "integrity": "sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==", 1170 + "dependencies": [ 1171 + "hookified" 1172 + ] 1173 + }, 1174 + "hookified@1.14.0": { 1175 + "integrity": "sha512-pi1ynXIMFx/uIIwpWJ/5CEtOHLGtnUB0WhGeeYT+fKcQ+WCQbm3/rrkAXnpfph++PgepNqPdTC2WTj8A6k6zoQ==" 502 1176 }, 503 1177 "html-tags@3.3.1": { 504 1178 "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" 505 1179 }, 506 - "ieee754@1.2.1": { 507 - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1180 + "iconv-lite@0.6.3": { 1181 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1182 + "dependencies": [ 1183 + "safer-buffer" 1184 + ] 508 1185 }, 509 1186 "ignore@5.3.2": { 510 1187 "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" 511 1188 }, 512 - "ignore@7.0.3": { 513 - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==" 1189 + "ignore@7.0.5": { 1190 + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==" 514 1191 }, 515 1192 "import-fresh@3.3.1": { 516 1193 "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", ··· 525 1202 "ini@1.3.8": { 526 1203 "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 527 1204 }, 1205 + "internmap@1.0.1": { 1206 + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" 1207 + }, 528 1208 "is-arrayish@0.2.1": { 529 1209 "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 530 1210 }, ··· 556 1236 "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 557 1237 "dependencies": [ 558 1238 "argparse" 559 - ] 1239 + ], 1240 + "bin": true 560 1241 }, 561 1242 "json-parse-even-better-errors@2.3.1": { 562 1243 "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" ··· 564 1245 "json-schema-traverse@1.0.0": { 565 1246 "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 566 1247 }, 567 - "keyv@5.3.2": { 568 - "integrity": "sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==", 1248 + "katex@0.16.27": { 1249 + "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", 1250 + "dependencies": [ 1251 + "commander@8.3.0" 1252 + ], 1253 + "bin": true 1254 + }, 1255 + "keyv@5.5.5": { 1256 + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", 569 1257 "dependencies": [ 570 1258 "@keyv/serialize" 571 1259 ] 572 1260 }, 1261 + "khroma@2.1.0": { 1262 + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" 1263 + }, 573 1264 "kind-of@6.0.3": { 574 1265 "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" 575 1266 }, 576 - "known-css-properties@0.35.0": { 577 - "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==" 1267 + "known-css-properties@0.37.0": { 1268 + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==" 1269 + }, 1270 + "langium@3.3.1_chevrotain@11.0.3": { 1271 + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", 1272 + "dependencies": [ 1273 + "chevrotain", 1274 + "chevrotain-allstar", 1275 + "vscode-languageserver", 1276 + "vscode-languageserver-textdocument", 1277 + "vscode-uri" 1278 + ] 1279 + }, 1280 + "layout-base@1.0.2": { 1281 + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" 1282 + }, 1283 + "layout-base@2.0.1": { 1284 + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" 578 1285 }, 579 1286 "lines-and-columns@1.2.4": { 580 1287 "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 1288 + }, 1289 + "lodash-es@4.17.21": { 1290 + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 581 1291 }, 582 1292 "lodash.truncate@4.4.2": { 583 1293 "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" 584 1294 }, 1295 + "marked@16.4.2": { 1296 + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", 1297 + "bin": true 1298 + }, 585 1299 "mathml-tag-names@2.1.3": { 586 1300 "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==" 587 1301 }, ··· 594 1308 "merge2@1.4.1": { 595 1309 "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 596 1310 }, 1311 + "mermaid@11.12.2_cytoscape@3.33.1": { 1312 + "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", 1313 + "dependencies": [ 1314 + "@braintree/sanitize-url", 1315 + "@iconify/utils", 1316 + "@mermaid-js/parser", 1317 + "@types/d3", 1318 + "cytoscape", 1319 + "cytoscape-cose-bilkent", 1320 + "cytoscape-fcose", 1321 + "d3", 1322 + "d3-sankey", 1323 + "dagre-d3-es", 1324 + "dayjs", 1325 + "dompurify", 1326 + "katex", 1327 + "khroma", 1328 + "lodash-es", 1329 + "marked", 1330 + "roughjs", 1331 + "stylis", 1332 + "ts-dedent", 1333 + "uuid" 1334 + ] 1335 + }, 597 1336 "micromatch@4.0.8": { 598 1337 "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 599 1338 "dependencies": [ ··· 601 1340 "picomatch" 602 1341 ] 603 1342 }, 1343 + "mlly@1.8.0": { 1344 + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", 1345 + "dependencies": [ 1346 + "acorn", 1347 + "pathe", 1348 + "pkg-types", 1349 + "ufo" 1350 + ] 1351 + }, 604 1352 "ms@2.1.3": { 605 1353 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 606 1354 }, 607 - "nanoid@3.3.10": { 608 - "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==" 1355 + "nanoid@3.3.11": { 1356 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1357 + "bin": true 609 1358 }, 610 1359 "normalize-path@3.0.0": { 611 1360 "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1361 + }, 1362 + "package-manager-detector@1.6.0": { 1363 + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==" 612 1364 }, 613 1365 "parent-module@1.0.1": { 614 1366 "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", ··· 625 1377 "lines-and-columns" 626 1378 ] 627 1379 }, 1380 + "path-data-parser@0.1.0": { 1381 + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==" 1382 + }, 628 1383 "path-type@4.0.0": { 629 1384 "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 630 1385 }, 1386 + "pathe@2.0.3": { 1387 + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" 1388 + }, 631 1389 "picocolors@1.1.1": { 632 1390 "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 633 1391 }, 634 1392 "picomatch@2.3.1": { 635 1393 "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1394 + }, 1395 + "pkg-types@1.3.1": { 1396 + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", 1397 + "dependencies": [ 1398 + "confbox", 1399 + "mlly", 1400 + "pathe" 1401 + ] 1402 + }, 1403 + "points-on-curve@0.2.0": { 1404 + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==" 1405 + }, 1406 + "points-on-path@0.2.1": { 1407 + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", 1408 + "dependencies": [ 1409 + "path-data-parser", 1410 + "points-on-curve" 1411 + ] 636 1412 }, 637 1413 "postcss-resolve-nested-selector@0.1.6": { 638 1414 "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==" 639 1415 }, 640 - "postcss-safe-parser@7.0.1_postcss@8.5.3": { 1416 + "postcss-safe-parser@7.0.1_postcss@8.5.6": { 641 1417 "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", 642 1418 "dependencies": [ 643 1419 "postcss" ··· 650 1426 "util-deprecate" 651 1427 ] 652 1428 }, 653 - "postcss-sorting@8.0.2_postcss@8.5.3": { 1429 + "postcss-sorting@8.0.2_postcss@8.5.6": { 654 1430 "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", 655 1431 "dependencies": [ 656 1432 "postcss" ··· 659 1435 "postcss-value-parser@4.2.0": { 660 1436 "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 661 1437 }, 662 - "postcss@8.5.3": { 663 - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1438 + "postcss@8.5.6": { 1439 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 664 1440 "dependencies": [ 665 1441 "nanoid", 666 1442 "picocolors", 667 1443 "source-map-js" 668 1444 ] 669 1445 }, 670 - "prettier@3.5.3": { 671 - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==" 1446 + "prettier@3.7.4": { 1447 + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", 1448 + "bin": true 1449 + }, 1450 + "qified@0.5.3": { 1451 + "integrity": "sha512-kXuQdQTB6oN3KhI6V4acnBSZx8D2I4xzZvn9+wFLLFCoBNQY/sFnCW6c43OL7pOQ2HvGV4lnWIXNmgfp7cTWhQ==", 1452 + "dependencies": [ 1453 + "hookified" 1454 + ] 672 1455 }, 673 1456 "queue-microtask@1.2.3": { 674 1457 "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" ··· 685 1468 "reusify@1.1.0": { 686 1469 "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" 687 1470 }, 1471 + "robust-predicates@3.0.2": { 1472 + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" 1473 + }, 1474 + "roughjs@4.6.6": { 1475 + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", 1476 + "dependencies": [ 1477 + "hachure-fill", 1478 + "path-data-parser", 1479 + "points-on-curve", 1480 + "points-on-path" 1481 + ] 1482 + }, 688 1483 "run-parallel@1.2.0": { 689 1484 "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 690 1485 "dependencies": [ 691 1486 "queue-microtask" 692 1487 ] 1488 + }, 1489 + "rw@1.3.3": { 1490 + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" 1491 + }, 1492 + "safer-buffer@2.1.2": { 1493 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 693 1494 }, 694 1495 "signal-exit@4.1.0": { 695 1496 "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" ··· 722 1523 "ansi-regex" 723 1524 ] 724 1525 }, 725 - "stylelint-config-recess-order@6.0.0_stylelint@16.18.0__@csstools+css-tokenizer@3.0.3__@csstools+css-parser-algorithms@3.0.4___@csstools+css-tokenizer@3.0.3__postcss-selector-parser@7.1.0__postcss@8.5.3": { 726 - "integrity": "sha512-1KqrttqpIrCYFAVQ1/bbgXo7EvvcjmkxxmnzVr+U66Xr2OlrNZqQ5+44Tmct6grCWY6wGTIBh2tSANqcmwIM2g==", 1526 + "stylelint-config-recess-order@6.1.0_stylelint@16.26.1__@csstools+css-tokenizer@3.0.4__@csstools+css-parser-algorithms@3.0.5___@csstools+css-tokenizer@3.0.4__postcss-selector-parser@7.1.0__postcss@8.5.6": { 1527 + "integrity": "sha512-0rGZgJQjUKqv1PXZnRJxr13f3hb3i2snx2nIL6luDWUf4nD3BAweB8noS7jdfBQ56HQG3RKSF0a+MAHfBGFxgw==", 727 1528 "dependencies": [ 728 1529 "stylelint", 729 1530 "stylelint-order" 730 1531 ] 731 1532 }, 732 - "stylelint-config-recommended@16.0.0_stylelint@16.18.0__@csstools+css-tokenizer@3.0.3__@csstools+css-parser-algorithms@3.0.4___@csstools+css-tokenizer@3.0.3__postcss-selector-parser@7.1.0__postcss@8.5.3": { 1533 + "stylelint-config-recommended@16.0.0_stylelint@16.26.1__@csstools+css-tokenizer@3.0.4__@csstools+css-parser-algorithms@3.0.5___@csstools+css-tokenizer@3.0.4__postcss-selector-parser@7.1.0__postcss@8.5.6": { 733 1534 "integrity": "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==", 734 1535 "dependencies": [ 735 1536 "stylelint" 736 1537 ] 737 1538 }, 738 - "stylelint-config-standard@38.0.0_stylelint@16.18.0__@csstools+css-tokenizer@3.0.3__@csstools+css-parser-algorithms@3.0.4___@csstools+css-tokenizer@3.0.3__postcss-selector-parser@7.1.0__postcss@8.5.3": { 1539 + "stylelint-config-standard@38.0.0_stylelint@16.26.1__@csstools+css-tokenizer@3.0.4__@csstools+css-parser-algorithms@3.0.5___@csstools+css-tokenizer@3.0.4__postcss-selector-parser@7.1.0__postcss@8.5.6": { 739 1540 "integrity": "sha512-uj3JIX+dpFseqd/DJx8Gy3PcRAJhlEZ2IrlFOc4LUxBX/PNMEQ198x7LCOE2Q5oT9Vw8nyc4CIL78xSqPr6iag==", 740 1541 "dependencies": [ 741 1542 "stylelint", 742 1543 "stylelint-config-recommended" 743 1544 ] 744 1545 }, 745 - "stylelint-order@6.0.4_stylelint@16.18.0__@csstools+css-tokenizer@3.0.3__@csstools+css-parser-algorithms@3.0.4___@csstools+css-tokenizer@3.0.3__postcss-selector-parser@7.1.0__postcss@8.5.3_postcss@8.5.3": { 1546 + "stylelint-order@6.0.4_stylelint@16.26.1__@csstools+css-tokenizer@3.0.4__@csstools+css-parser-algorithms@3.0.5___@csstools+css-tokenizer@3.0.4__postcss-selector-parser@7.1.0__postcss@8.5.6_postcss@8.5.6": { 746 1547 "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", 747 1548 "dependencies": [ 748 1549 "postcss", ··· 750 1551 "stylelint" 751 1552 ] 752 1553 }, 753 - "stylelint@16.18.0_@csstools+css-tokenizer@3.0.3_@csstools+css-parser-algorithms@3.0.4__@csstools+css-tokenizer@3.0.3_postcss-selector-parser@7.1.0_postcss@8.5.3": { 754 - "integrity": "sha512-OXb68qzesv7J70BSbFwfK3yTVLEVXiQ/ro6wUE4UrSbKCMjLLA02S8Qq3LC01DxKyVjk7z8xh35aB4JzO3/sNA==", 1554 + "stylelint@16.26.1_@csstools+css-tokenizer@3.0.4_@csstools+css-parser-algorithms@3.0.5__@csstools+css-tokenizer@3.0.4_postcss-selector-parser@7.1.0_postcss@8.5.6": { 1555 + "integrity": "sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==", 755 1556 "dependencies": [ 756 1557 "@csstools/css-parser-algorithms", 1558 + "@csstools/css-syntax-patches-for-csstree", 757 1559 "@csstools/css-tokenizer", 758 1560 "@csstools/media-query-list-parser", 759 1561 "@csstools/selector-specificity", ··· 771 1573 "globby", 772 1574 "globjoin", 773 1575 "html-tags", 774 - "ignore@7.0.3", 1576 + "ignore@7.0.5", 775 1577 "imurmurhash", 776 1578 "is-plain-object", 777 1579 "known-css-properties", ··· 791 1593 "svg-tags", 792 1594 "table", 793 1595 "write-file-atomic" 794 - ] 1596 + ], 1597 + "bin": true 1598 + }, 1599 + "stylis@4.3.6": { 1600 + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==" 795 1601 }, 796 1602 "supports-color@7.2.0": { 797 1603 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", ··· 819 1625 "strip-ansi" 820 1626 ] 821 1627 }, 1628 + "tinyexec@1.0.2": { 1629 + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==" 1630 + }, 822 1631 "to-regex-range@5.0.1": { 823 1632 "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 824 1633 "dependencies": [ 825 1634 "is-number" 826 1635 ] 827 1636 }, 1637 + "ts-dedent@2.2.0": { 1638 + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==" 1639 + }, 1640 + "ufo@1.6.1": { 1641 + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" 1642 + }, 828 1643 "undici-types@6.20.0": { 829 1644 "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" 830 1645 }, 831 1646 "util-deprecate@1.0.2": { 832 1647 "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 833 1648 }, 1649 + "uuid@11.1.0": { 1650 + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", 1651 + "bin": true 1652 + }, 1653 + "vscode-jsonrpc@8.2.0": { 1654 + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==" 1655 + }, 1656 + "vscode-languageserver-protocol@3.17.5": { 1657 + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", 1658 + "dependencies": [ 1659 + "vscode-jsonrpc", 1660 + "vscode-languageserver-types" 1661 + ] 1662 + }, 1663 + "vscode-languageserver-textdocument@1.0.12": { 1664 + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" 1665 + }, 1666 + "vscode-languageserver-types@3.17.5": { 1667 + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" 1668 + }, 1669 + "vscode-languageserver@9.0.1": { 1670 + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", 1671 + "dependencies": [ 1672 + "vscode-languageserver-protocol" 1673 + ], 1674 + "bin": true 1675 + }, 1676 + "vscode-uri@3.0.8": { 1677 + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" 1678 + }, 834 1679 "which@1.3.1": { 835 1680 "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 836 1681 "dependencies": [ 837 1682 "isexe" 838 - ] 1683 + ], 1684 + "bin": true 839 1685 }, 840 1686 "write-file-atomic@5.0.1": { 841 1687 "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", ··· 847 1693 }, 848 1694 "workspace": { 849 1695 "dependencies": [ 850 - "npm:esbuild@~0.25.1", 851 - "npm:prettier@^3.5.3", 852 - "npm:stylelint-config-recess-order@6", 1696 + "jsr:@std/encoding@^1.0.10", 1697 + "jsr:@std/path@^1.1.3", 1698 + "npm:esbuild@~0.25.12", 1699 + "npm:mermaid@^11.12.2", 1700 + "npm:prettier@^3.7.4", 1701 + "npm:stylelint-config-recess-order@^6.1.0", 853 1702 "npm:stylelint-config-standard@38", 854 - "npm:stylelint@^16.18.0" 1703 + "npm:stylelint@^16.26.1" 855 1704 ] 856 1705 } 857 1706 }
+5 -4
docs/app/build/build.ts
··· 1 - import { encodeHex } from "jsr:@std/encoding/hex"; 2 - import * as pathlib from "jsr:@std/path"; 3 - import * as esbuild from "npm:esbuild@0.25.2"; 1 + import { encodeHex } from "@std/encoding/hex"; 2 + import * as pathlib from "@std/path"; 3 + import * as esbuild from "esbuild"; 4 4 5 5 const relpath = (path: string) => new URL(path, import.meta.url).pathname; 6 6 ··· 12 12 13 13 const built = await esbuild.build({ 14 14 bundle: true, 15 + splitting: true, 15 16 format: "esm", 16 17 target: ["chrome93", "firefox93", "safari15", "es2020"], 17 18 platform: "browser", ··· 29 30 const esm: string[] = []; 30 31 31 32 for (const [path, file] of Object.entries(built.metafile.outputs)) { 32 - if (file.entryPoint) { 33 + if (file.entryPoint?.startsWith("app/")) { 33 34 const name = JSON.stringify(`./${pathlib.basename(path)}`); 34 35 switch (path.split(".").pop()) { 35 36 case "css":
+4 -3
docs/app/build/preprocessor.ts
··· 9 9 console.log(JSON.stringify(book)); 10 10 11 11 async function read(r: ReadableStream): Promise<string> { 12 - const reader = r.getReader(); 13 - const decoder = new TextDecoder(); 12 + const decoder = new TextDecoderStream(); 13 + r.pipeTo(decoder.writable); 14 + const reader = decoder.readable.getReader(); 14 15 let result = ""; 15 16 while (true) { 16 17 const { done, value } = await reader.read(); 17 18 if (done) break; 18 - result += decoder.decode(value); 19 + result += value; 19 20 } 20 21 return result; 21 22 }
+13 -3
docs/app/main.css
··· 259 259 } 260 260 } 261 261 262 - .blockquote-tag-title svg { 263 - position: relative; 264 - top: 1px; 262 + .blockquote-tag { 263 + .blockquote-tag-title { 264 + margin-block-end: 0.5rem; 265 + 266 + svg { 267 + position: relative; 268 + top: 1px; 269 + } 270 + } 271 + 272 + > :nth-child(2):not(:last-child) { 273 + margin-block-start: 1rem; 274 + } 265 275 } 266 276 } 267 277
+21
docs/app/main.ts
··· 7 7 elem.textContent = elem.textContent.replaceAll("↩", "↩\ufe0e"); 8 8 } 9 9 }); 10 + 11 + (async () => { 12 + const diagrams = document.querySelectorAll("pre:has(code.language-mermaid)"); 13 + 14 + if (!diagrams.length) { 15 + return; 16 + } 17 + 18 + diagrams.forEach((elem) => { 19 + const code = elem.querySelector("code")?.textContent; 20 + if (!code) { 21 + return; 22 + } 23 + elem.textContent = code; 24 + elem.setAttribute("class", "mermaid"); 25 + }); 26 + 27 + const { default: mermaid } = await import("mermaid"); 28 + mermaid.initialize({}); 29 + await mermaid.run(); 30 + })();
+3 -2
docs/src/SUMMARY.md
··· 19 19 --- 20 20 21 21 - [mdbook-permalinks](permalinks/index.md) 22 - - [Feature sheet](permalinks/features.md) 23 - - [`{{#include}}` workarounds](permalinks/working-with-include.md) 22 + - [Getting started](permalinks/getting-started.md) 23 + - [Features](permalinks/features.md) 24 + - [More ways to link](permalinks/more-ways-to-link.md) 24 25 - [Continuous integration](permalinks/continuous-integration.md) 25 26 - [Configuration](permalinks/configuration.md) 26 27 - [Known issues](permalinks/known-issues.md)
+38 -29
docs/src/permalinks/features.md
··· 1 1 # Features 2 2 3 - - [Permalinks](#permalinks) 4 - - [Repo auto-discovery](#repo-auto-discovery) 5 - - [Link validation](#link-validation) 6 - 7 3 ## Permalinks 8 4 9 5 Simply use **relative paths** to link to any file in your source tree, and the 10 - preprocessor will convert them to GitHub permalinks. 6 + preprocessor will convert them to permalinks. 11 7 12 8 > ```md 13 9 > This project is dual licensed under the ··· 18 14 > This project is dual licensed under the 19 15 > [Apache License, Version 2.0](../../../LICENSE-APACHE.md) and the 20 16 > [MIT (Expat) License](../../../LICENSE-MIT.md). 21 - 22 - Permalinks use the **tag name or commit SHA** of HEAD at build time, so you get a 23 - rendered book with intra-repo links that are always _correct_ for that point in time. 24 17 25 18 > [!TIP] 26 19 > 27 - > Linking by path is cool! Not only is it [well-supported by 28 - > GitHub][github-relative-links], but editors like VS Code also provide smart features 20 + > Not only is linking by paths well-supported by platforms such as 21 + > [GitHub][github-relative-links], but editors like VS Code also provide smart features 29 22 > like [path completions][vscode-path-completions] and [link 30 23 > validation][link-validation]. 31 24 32 - URL fragments are preserved: 25 + Permalinks are **versioned using the tag name or hash** of the commit from which the 26 + book was built. Your links remain consistent with their source commit even as content in 27 + your repository changes over time. 28 + 29 + URL fragments are preserved. For example, you may use fragments to link to specific 30 + lines, if your Git hosting provider supports it: 33 31 34 32 > ```md 35 33 > This book uses [esbuild] to 36 - > [preprocess its style sheet](../../app/build/build.ts#L13-L24). 34 + > [preprocess its style sheet](../../app/build/build.ts#L13-25). 37 35 > ``` 38 36 > 39 37 > This book uses [esbuild] to 40 - > [preprocess its style sheet](../../app/build/build.ts#L13-L24). 38 + > [preprocess its style sheet](../../app/build/build.ts#L13-25). 41 39 42 40 By default, links to files under your book's `src/` directory are not converted, since 43 41 mdBook already [copies them to build output][mdbook-src-build], but this is configurable 44 42 using the [`always-link`](configuration.md#always-link) option. 45 43 46 - ## Repo auto-discovery 44 + ## Repo URL auto-discovery 47 45 48 - To know what GitHub repository to link to, the preprocessor looks at the following 49 - places, in order: 46 + To determine the base URL of the generated permalinks, the preprocessor looks at the 47 + following places and uses the first one it finds: 50 48 51 49 1. The [`output.html.git-repository-url`] option in your `book.toml` 52 50 2. The URL of a Git remote named `origin`[^1] ··· 54 52 > [!TIP] 55 53 > 56 54 > For Git remotes, both HTTP URLs and "scp-like" URIs (`git@github.com:org/repo.git`) 57 - > are supported, thanks to the [`gix_url`] crate. 55 + > are supported. 56 + 57 + Alternatively, you may configure a custom URL format using the 58 + [`repo-url-template`](configuration.md#repo-url-template) option. 59 + 60 + ## Markdown images 61 + 62 + Providers such as GitHub support two types of permalinks: 63 + 64 + - a `tree` or `blob` URL that opens the file's webpage for viewing 65 + - a `raw` URL that directly serves the file's content, suitable for embedding or 66 + downloading 58 67 59 - If you use Git but not GitHub, you can configure a custom URL pattern using the 60 - [`repo-url-template`](configuration.md#repo-url-template) option. For example: 68 + The preprocessor detects whether a path is used within a clickable link or an image and 69 + selects the most appropriate type of URL to use. For example, the following snippet 70 + creates an image wrapped in a clickable link which opens the image's page on GitHub: 61 71 62 - ```toml 63 - [preprocessor.link-forever] 64 - repo-url-template = "https://gitlab.haskell.org/ghc/ghc/-/tree/{ref}/{path}" 65 - ``` 72 + > ```md 73 + > [![Minato City][minato-city]][minato-city] 74 + > 75 + > [minato-city]: /crates/mdbook-permalinks/src/tests/Minato_City,_Tokyo,_Japan.jpg 76 + > ``` 77 + > 78 + > [![Minato City][minato-city]][minato-city] 79 + > 80 + > [minato-city]: /crates/mdbook-permalinks/src/tests/Minato_City,_Tokyo,_Japan.jpg 66 81 67 82 ## Link validation 68 83 ··· 80 95 81 96 </figure> 82 97 83 - > [!NOTE] 84 - > 85 - > Link validations are only supported for path-based links. For more comprehensive link 86 - > checking, look to projects like [`mdbook-linkcheck`]. 87 - 88 98 <!-- prettier-ignore-start --> 89 99 90 - [`mdbook-linkcheck`]: https://github.com/Michael-F-Bryan/mdbook-linkcheck 91 100 [`output.html.git-repository-url`]: https://rust-lang.github.io/mdBook/format/configuration/renderers.html#html-renderer-options 92 101 [esbuild]: https://esbuild.github.io 93 102 [github-relative-links]: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#relative-links
+60
docs/src/permalinks/getting-started.md
··· 1 + # Getting started 2 + 3 + ## Install 4 + 5 + ``` 6 + cargo install mdbook-permalinks 7 + ``` 8 + 9 + Alternatively, you may obtain precompiled binaries from [GitHub releases][gh-releases]. 10 + 11 + ## Configure 12 + 13 + Configure your `book.toml` to use the installed program as a [preprocessor]: 14 + 15 + ```toml 16 + [book] 17 + title = "My Book" 18 + 19 + [output.html] 20 + git-repository-url = "https://github.com/me/my-awesome-crate" 21 + 22 + [preprocessor.permalinks] 23 + ``` 24 + 25 + - The `git-repository-url` option in the `[output.html]` table controls the [icon link 26 + that appears in the menu bar in the top-right corner][git-repository-url]. If 27 + configured, the preprocessor will reuse this link as the base URL for the generated 28 + permalinks. 29 + 30 + - The `[preprocessor.permalinks]` table enables the preprocessor. mdBook will execute 31 + the command `mdbook-permalinks`. 32 + 33 + ## Write 34 + 35 + Link to files in your Git repository using the relative paths from your Markdown source 36 + files to the files to link. For example: 37 + 38 + ```md 39 + See [`book.toml`](../../book.toml) for an example config. 40 + ``` 41 + 42 + <figure class="fig-text"> 43 + 44 + See [`book.toml`](../../book.toml) for an example config. 45 + 46 + </figure> 47 + 48 + ## Next steps 49 + 50 + - Check out [available configuration options](configuration.md). 51 + <!-- TODO: including options to ... --> 52 + - Learn about [known issues and limitations](known-issues.md). 53 + 54 + <!-- prettier-ignore-start --> 55 + 56 + [gh-releases]: https://github.com/tonywu6/mdbookkit/releases 57 + [git-repository-url]: https://rust-lang.github.io/mdBook/format/configuration/renderers.html#html-renderer-options 58 + [preprocessor]: https://rust-lang.github.io/mdBook/format/configuration/preprocessors.html 59 + 60 + <!-- prettier-ignore-end -->
+12 -43
docs/src/permalinks/index.md
··· 1 - # mdbook-link-forever 1 + # mdbook-permalinks 2 2 3 - mdBook [preprocessor] that takes care of linking to files in your Git repository. 3 + Create permalinks to files in your Git repository just by using their paths. 4 4 5 - `mdbook-link-forever` rewrites path-based links to version-pinned GitHub permalinks. No 6 - more hard-coded GitHub URLs. 5 + Link to source code, examples, configuration files, etc., in your [mdBook] 6 + documentation, without having to hardcode URLs or worry about broken links. You simply 7 + write ... 7 8 8 9 ```md 9 - Here's a link to the [Cargo workspace manifest](../../../Cargo.toml). 10 + Here is a link to the project's [Cargo.toml](../../../Cargo.toml). 10 11 ``` 11 12 13 + ... and you get: 14 + 12 15 <figure class="fig-text"> 13 16 14 - Here's a link to the [Cargo workspace manifest](../../../Cargo.toml). 17 + Here is a link to the project's [Cargo.toml](../../../Cargo.toml). 15 18 16 19 </figure> 17 20 18 - - Versions are determined at build time. Supports both tags and commit hashes. 19 - - Because paths are readily accessible at build time, it also 20 - [validates](features.md#link-validation) them for you. 21 - 22 - ## Getting started 23 - 24 - 1. Install this crate: 21 + ## Overview 25 22 26 - ``` 27 - cargo install mdbookkit --features link-forever 28 - ``` 29 - 30 - 2. Configure your `book.toml`: 31 - 32 - ```toml 33 - [book] 34 - title = "My Book" 35 - 36 - [output.html] 37 - git-repository-url = "https://github.com/me/my-awesome-crate" 38 - # will use this for permalinks 39 - 40 - [preprocessor.link-forever] 41 - # mdBook will run `mdbook-link-forever` 42 - ``` 43 - 44 - 3. Link to files using paths, like this: 45 - 46 - ```md 47 - See [`book.toml`](../../book.toml#L44-L48) for an example config. 48 - ``` 49 - 50 - <figure class="fig-text"> 51 - 52 - See [`book.toml`](../../book.toml#L44-L48) for an example config. 53 - 54 - </figure> 23 + <!-- TODO: --> 55 24 56 25 ## License 57 26 ··· 60 29 61 30 <!-- prettier-ignore-start --> 62 31 63 - [preprocessor]: https://rust-lang.github.io/mdBook/format/configuration/preprocessors.html 32 + [mdBook]: https://rust-lang.github.io/mdBook/ 64 33 65 34 <!-- prettier-ignore-end -->
+128
docs/src/permalinks/more-ways-to-link.md
··· 1 + # More ways to link 2 + 3 + Linking by relative path should cover the majority of use cases. However, there are 4 + cases where this may not work: 5 + 6 + - When working with mdBook's `{{#include}}` directive, relative paths may become 7 + incorrect; 8 + - Furthermore, the included document may also be intended for additional platforms, 9 + where path-based links are not supported. 10 + 11 + The preprocessor supports some alternative link formats for such scenarios. 12 + 13 + ```mermaid 14 + stateDiagram-v2 15 + start : Is the text included using {{#include}} 16 + included : Is the file being included also published elsewhere <br>(e.g. crates.io) 17 + external : The link points to ... 18 + relativePath : Use a relative path 19 + absolutePath : Use an absolute path 20 + bookUrl : Hardcode the URL to your <br>book's website 21 + repoUrl : Hardcode the URL to your <br>Git remote 22 + 23 + start --> included: Yes 24 + start --> relativePath: No 25 + included --> external: Yes 26 + included --> absolutePath: No 27 + external --> bookUrl: a book page or <br>a file in the book 28 + external --> repoUrl: a file in your repo <br>outside the book 29 + ``` 30 + 31 + ## Using absolute paths 32 + 33 + mdBook provides the [`{{#include}}` directive][mdbook-include] which allows you to 34 + include the content of other text files directly in book pages. The preprocessor cannot 35 + resolve links relative to the file being included. In this case, relative paths could be 36 + valid for the source file (and therefore valid for e.g. GitHub) but invalid for the 37 + book. 38 + 39 + > For example, if `chapters/1.md` includes `shared/info.md`, and `shared/info.md` 40 + > contains a link to `./image.png` (i.e. `shared/image.png`), then the preprocessor can 41 + > only resolve `./image.png` starting from `chapters/1.md` (i.e. `chapters/image.png`), 42 + > which is incorrect. 43 + 44 + Instead of using relative paths, you may use paths that **start with a `/`**. Paths that 45 + start with a `/` are resolved **relative to the root of your repository**: 46 + 47 + > ```md 48 + > The [home page](index.md) simply embeds the package 49 + > [README](/crates/mdbook-permalinks/README.md). 50 + > ``` 51 + > 52 + > The [home page](index.md) simply embeds the package 53 + > [README](/crates/mdbook-permalinks/README.md). 54 + 55 + ## Using URLs 56 + 57 + In some situations, you cannot link using paths, and must fallback to full URLs. For 58 + example, you would like to reuse your package's `README.md` as your book's home page, 59 + where the `README.md` is also published to crates.io, where path-based links will become 60 + invalid. 61 + 62 + ### Using URLs to HEAD 63 + 64 + You can create permalinks to files in your source tree by writing URLs where the 65 + commit/ref portion is **`HEAD`**, for example: 66 + 67 + > ```md 68 + > [Cargo.toml](https://github.com/tonywu6/mdbookkit/raw/HEAD/Cargo.toml) 69 + > ``` 70 + > 71 + > [Cargo.toml](https://github.com/tonywu6/mdbookkit/raw/HEAD/Cargo.toml) 72 + 73 + - For your book, the preprocessor replaces `HEAD` with the tag name or commit hash at 74 + build time. The link type (`tree`/`blob` or `raw`) is preserved. 75 + - For other sites, the link remains functional and will point to `HEAD`. 76 + - If, after parsing, the link's corresponding file path is inaccessible during build, 77 + the preprocessor will emit a warning. 78 + 79 + > [!IMPORTANT] 80 + > 81 + > The commit/ref must be exactly `HEAD`. **Other common refs such as `main` are not 82 + > processed.** 83 + 84 + ### Using URLs to your book 85 + 86 + Finally, you can link to a page or file within your book using full URLs and the 87 + preprocessor will validate that the corresponding file is accessible. 88 + 89 + To enable validation of book URLs, you must specify the URL prefix at which you will 90 + deploy your book via the [`book-url`](configuration.md#book-url) option: 91 + 92 + ```toml 93 + [preprocessor.permalinks] 94 + book-url = "https://example.org/" 95 + ``` 96 + 97 + For each link that begins with this prefix, the preprocessor tests whether a matching 98 + file path is accessible: 99 + 100 + 1. The suffix `.html`, if present, is removed; 101 + 102 + 2. Depending on whether the resulting path contains a [trailing slash][trailing-slash], 103 + the following candidate paths are tested: 104 + 105 + | | `path/to.doc` | `path/to.doc/` | 106 + | :---------------------- | :-----------: | :------------: | 107 + | `path/to.doc/index.md` | ✓ | ✓ | 108 + | `path/to.doc/README.md` | ✓ | ✓ | 109 + | `path/to.doc.md` | ✓ | | 110 + | `path/to.doc` | ✓ | | 111 + 112 + - If none of the paths are accessible for a URL, the preprocessor will emit a warning. 113 + - For your book, the preprocessor rewrites the URL as a relative path (so that mdBook 114 + processes it as usual). 115 + - For other sites, the link remains functional and will link to your book's website. 116 + 117 + <figure> 118 + 119 + ![warnings emitted for broken canonical links](media/error-reporting-canonical-urls.png) 120 + 121 + </figure> 122 + 123 + <!-- prettier-ignore-start --> 124 + 125 + [mdbook-include]: https://rust-lang.github.io/mdBook/format/mdbook.html#including-files 126 + [trailing-slash]: https://github.com/slorber/trailing-slash-guide?tab=readme-ov-file#trailing-slash-guide 127 + 128 + <!-- prettier-ignore-end -->
-90
docs/src/permalinks/working-with-include.md
··· 1 - # Working with `{{#include}}` 2 - 3 - mdBook provides an [`{{#include}}` directive][mdbook-include] for embedding files in 4 - book pages. If the embedded content also contains path-based links, then some extra care 5 - may be needed: 6 - 7 - - The preprocessor does not resolve links relative to the file being included (because 8 - it doesn't have enough information to do so). In this case, relative paths could be 9 - valid for the source file (and therefore valid for e.g. GitHub) but invalid for the 10 - book. 11 - 12 - - In some situations, you cannot use path-based links and you have to use full URLs. 13 - This could be because the included file is also intended for platforms that don't 14 - support paths as links. 15 - 16 - This page describes some workarounds for linking in included files. 17 - 18 - - [Using absolute paths](#using-absolute-paths) 19 - - [Extra feature: Using URLs to link to book pages](#extra-feature-using-urls-to-link-to-book-pages) 20 - 21 - ## Using absolute paths 22 - 23 - To use paths as links in included content, you can use absolute paths that start with a 24 - `/`. Paths that start with a `/` are resolved relative to the root of your repository: 25 - 26 - > ```md 27 - > Front page of this book is actually from 28 - > [the crate README](/crates/mdbookkit/README.md). 29 - > ``` 30 - > 31 - > Front page of this book is actually from 32 - > [the crate README](/crates/mdbookkit/README.md). 33 - 34 - > [!TIP] 35 - > 36 - > This is also the behavior both in [VS Code][vscode-path-completions] and on 37 - > [GitHub][github-relative-links]. 38 - 39 - ## Extra feature: Using URLs to link to book pages 40 - 41 - You may be in a situation where you have to use full URLs to link to your book rather 42 - than relying on paths. 43 - 44 - > An example (that this project encountered) is including files that are also intended 45 - > for displaying on [crates.io][cargo-readme]. 46 - > 47 - > In this case, since other platforms like crates.io will not convert path-based `.md` 48 - > links to URLs, linking to book pages would require writing down full URLs to the 49 - > deployed book. 50 - 51 - To mitigate this, you can use the [`book-url`](configuration.md#book-url) option. 52 - 53 - In your `book.toml`, in the `[preprocessor.link-forever]` table, specify the URL prefix 54 - at which you will deploy your book: 55 - 56 - ```toml 57 - [preprocessor.link-forever] 58 - book-url = "https://example.org/" 59 - ``` 60 - 61 - Then, in Markdown, you may use full URLs, for example: 62 - 63 - > ```md 64 - > For a list of the crate's features, see [Feature flags](https://example.org/features). 65 - > ``` 66 - > 67 - > For a list of the crate's features, see [Feature flags](https://example.org/features). 68 - 69 - Specifying `book-url` enables the preprocessor to check URLs to your book against local 70 - paths. If a URL does not have a corresponding `.md` file under your book's `src/` 71 - directory, the preprocessor will warn you: 72 - 73 - <figure> 74 - 75 - ![warnings emitted for broken canonical links](media/error-reporting-canonical-urls.png) 76 - 77 - </figure> 78 - 79 - > [!NOTE] 80 - > 81 - > `book-url` only enables validation, and is only for links to your book, not to GitHub. 82 - 83 - <!-- prettier-ignore-start --> 84 - 85 - [cargo-readme]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-readme-field 86 - [github-relative-links]: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#relative-links 87 - [mdbook-include]: https://rust-lang.github.io/mdBook/format/mdbook.html#including-files 88 - [vscode-path-completions]: https://code.visualstudio.com/docs/languages/markdown#_path-completions 89 - 90 - <!-- prettier-ignore-end -->
+1 -1
docs/src/rustdoc-links/getting-started.md
··· 85 85 - See the full list of [supported syntax](supported-syntax.md). 86 86 - Understand [how the preprocessor resolves links](name-resolution.md) under the hood. 87 87 - Check out [available configuration options](configuration.md). 88 - - Learn about some [known issues and limitations](known-issues.md). 88 + - Learn about [known issues and limitations](known-issues.md). 89 89 90 90 <!-- prettier-ignore-start --> 91 91
+7 -2
docs/src/rustdoc-links/index.md
··· 1 - # mdbook-rustdoc-link 1 + # mdbook-rustdoc-links 2 2 3 3 <div class="hidden"> 4 4 ··· 49 49 how to link to additional items such as 50 50 [functions, macros](supported-syntax.md#functions-and-macros), and 51 51 [implementors](supported-syntax.md#implementors-and-fully-qualified-syntax). 52 - - [Name resolution](name-resolution.md): Understand how the preprocessor find Rust 52 + 53 + - [Name resolution](name-resolution.md): Understand how the preprocessor finds Rust 53 54 items, including 54 55 [when items are gated behind features](name-resolution.md#feature-gated-items). 55 56 ··· 57 58 58 59 - [Workspace layout](workspace-layout.md): Setup and options suitable for [Cargo 59 60 workspaces][workspaces]. 61 + 60 62 - [Caching](caching.md): If you are working on a large project and processing is taking 61 63 a long time. 62 64 ··· 64 66 65 67 - [Standalone usage](standalone-usage.md): Use the preprocessor as a standalone command 66 68 line tool. 69 + 67 70 - [Continuous integration](continuous-integration.md): Information for running the 68 71 preprocessor in CI environments, including 69 72 [logging](continuous-integration.md#logging) and 70 73 [failing a build when there are bad links](continuous-integration.md#error-handling). 74 + 71 75 - [Configuration](configuration.md): List of available options. 76 + 72 77 - [Known issues](known-issues.md) and limitations. 73 78 74 79 Happy linking!