sourcey 3.5.10 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +24 -97
  2. package/dist/adapters/index.d.ts +12 -0
  3. package/dist/adapters/index.d.ts.map +1 -0
  4. package/dist/adapters/index.js +130 -0
  5. package/dist/adapters/mkdocs.d.ts +5 -0
  6. package/dist/adapters/mkdocs.d.ts.map +1 -0
  7. package/dist/adapters/mkdocs.js +367 -0
  8. package/dist/adapters/shared.d.ts +12 -0
  9. package/dist/adapters/shared.d.ts.map +1 -0
  10. package/dist/adapters/shared.js +134 -0
  11. package/dist/adapters/types.d.ts +74 -0
  12. package/dist/adapters/types.d.ts.map +1 -0
  13. package/dist/adapters/types.js +1 -0
  14. package/dist/cli.js +28 -34
  15. package/dist/client/search.js +213 -82
  16. package/dist/client/tabs.js +23 -0
  17. package/dist/components/layout/Head.js +17 -4
  18. package/dist/components/layout/TableOfContents.d.ts.map +1 -1
  19. package/dist/components/layout/TableOfContents.js +4 -2
  20. package/dist/components/openapi/Introduction.d.ts.map +1 -1
  21. package/dist/components/openapi/Introduction.js +16 -1
  22. package/dist/components/openapi/Security.d.ts.map +1 -1
  23. package/dist/components/openapi/Security.js +18 -2
  24. package/dist/config.d.ts +101 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +95 -143
  27. package/dist/core/api-rendering.d.ts +47 -0
  28. package/dist/core/api-rendering.d.ts.map +1 -0
  29. package/dist/core/api-rendering.js +76 -0
  30. package/dist/core/doxygen-loader.d.ts.map +1 -1
  31. package/dist/core/doxygen-loader.js +36 -17
  32. package/dist/core/godoc-loader.d.ts.map +1 -1
  33. package/dist/core/godoc-loader.js +17 -6
  34. package/dist/core/markdown-loader.d.ts +14 -0
  35. package/dist/core/markdown-loader.d.ts.map +1 -1
  36. package/dist/core/markdown-loader.js +70 -26
  37. package/dist/core/mcp-normalizer.d.ts.map +1 -1
  38. package/dist/core/mcp-normalizer.js +48 -34
  39. package/dist/core/navigation.d.ts.map +1 -1
  40. package/dist/core/navigation.js +8 -7
  41. package/dist/core/parser.d.ts.map +1 -1
  42. package/dist/core/parser.js +75 -4
  43. package/dist/core/rustdoc-introspector.d.ts +29 -0
  44. package/dist/core/rustdoc-introspector.d.ts.map +1 -0
  45. package/dist/core/rustdoc-introspector.js +236 -0
  46. package/dist/core/rustdoc-loader.d.ts +25 -0
  47. package/dist/core/rustdoc-loader.d.ts.map +1 -0
  48. package/dist/core/rustdoc-loader.js +469 -0
  49. package/dist/core/rustdoc-render.d.ts +76 -0
  50. package/dist/core/rustdoc-render.d.ts.map +1 -0
  51. package/dist/core/rustdoc-render.js +785 -0
  52. package/dist/core/rustdoc-types.d.ts +314 -0
  53. package/dist/core/rustdoc-types.d.ts.map +1 -0
  54. package/dist/core/rustdoc-types.js +18 -0
  55. package/dist/core/search-indexer.d.ts +10 -0
  56. package/dist/core/search-indexer.d.ts.map +1 -1
  57. package/dist/core/search-indexer.js +6 -1
  58. package/dist/core/sourcey-rustdoc/Cargo.lock +705 -0
  59. package/dist/core/sourcey-rustdoc/Cargo.toml +38 -0
  60. package/dist/core/sourcey-rustdoc/README.md +59 -0
  61. package/dist/core/sourcey-rustdoc/src/diagnostics.rs +42 -0
  62. package/dist/core/sourcey-rustdoc/src/doctest.rs +268 -0
  63. package/dist/core/sourcey-rustdoc/src/extract.rs +492 -0
  64. package/dist/core/sourcey-rustdoc/src/lib.rs +58 -0
  65. package/dist/core/sourcey-rustdoc/src/links.rs +126 -0
  66. package/dist/core/sourcey-rustdoc/src/main.rs +256 -0
  67. package/dist/core/sourcey-rustdoc/src/signature.rs +415 -0
  68. package/dist/core/sourcey-rustdoc/src/spec.rs +390 -0
  69. package/dist/core/sourcey-rustdoc/tests/format_version.rs +45 -0
  70. package/dist/dev-server.d.ts.map +1 -1
  71. package/dist/dev-server.js +109 -33
  72. package/dist/index.d.ts +4 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +26 -14
  75. package/dist/init.d.ts.map +1 -1
  76. package/dist/init.js +21 -16
  77. package/dist/renderer/changelog-feed.d.ts.map +1 -1
  78. package/dist/renderer/changelog-feed.js +27 -19
  79. package/dist/renderer/html-builder.d.ts.map +1 -1
  80. package/dist/renderer/html-builder.js +4 -3
  81. package/dist/renderer/llms.js +57 -2
  82. package/dist/site-assembly.d.ts +5 -0
  83. package/dist/site-assembly.d.ts.map +1 -1
  84. package/dist/site-assembly.js +161 -25
  85. package/dist/themes/default/sourcey.css +300 -0
  86. package/dist/utils/code-samples.d.ts +1 -0
  87. package/dist/utils/code-samples.d.ts.map +1 -1
  88. package/dist/utils/code-samples.js +30 -22
  89. package/dist/utils/html.d.ts +10 -0
  90. package/dist/utils/html.d.ts.map +1 -0
  91. package/dist/utils/html.js +152 -0
  92. package/dist/utils/http.d.ts +0 -2
  93. package/dist/utils/http.d.ts.map +1 -1
  94. package/dist/utils/http.js +19 -34
  95. package/dist/utils/markdown.d.ts.map +1 -1
  96. package/dist/utils/markdown.js +115 -39
  97. package/dist/vite-plugin.d.ts +2 -0
  98. package/dist/vite-plugin.d.ts.map +1 -1
  99. package/dist/vite-plugin.js +71 -1
  100. package/package.json +11 -5
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAA8B,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAiBlD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAkB3E;AAMD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,gBAAgB,EAAE,OAAO,wBAAwB,EAAE,qBAAqB,EAAE,CAAC;IAC3E,wDAAwD;IACxD,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACtC;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoF5F;AA4CD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EAEnB,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmBlD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAkB3E;AAMD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,gBAAgB,EAAE,OAAO,wBAAwB,EAAE,qBAAqB,EAAE,CAAC;IAC3E,kBAAkB,EAAE,OAAO,0BAA0B,EAAE,uBAAuB,EAAE,CAAC;IACjF,wDAAwD;IACxD,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACtC;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgG5F;AA8CD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,EACb,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,WAAW,EACX,eAAe,GAChB,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { loadConfig, configFromSpec } from "./config.js";
5
5
  import { buildSiteNavigation } from "./core/navigation.js";
6
6
  import { buildSearchIndex } from "./core/search-indexer.js";
7
7
  import { generateLlmsTxt, generateLlmsFullTxt } from "./renderer/llms.js";
8
- import { assembleSite, buildSiteConfig, collectDocsPagesByTab, createMinimalSpec, enforceChangelogDiagnostics, } from "./site-assembly.js";
8
+ import { assembleSite, buildSiteConfig, collectDocsPagesByTab, createMinimalSpec, enforceChangelogDiagnostics, enforceGodocDiagnostics, enforceRustdocDiagnostics, } from "./site-assembly.js";
9
9
  /**
10
10
  * Build API documentation from a single OpenAPI/Swagger spec.
11
11
  * Wraps the spec in a single-tab site and renders through the modern layout.
@@ -29,12 +29,14 @@ export async function buildDocs(options) {
29
29
  }
30
30
  export async function buildSiteDocs(options = {}) {
31
31
  const outputDir = resolve(options.outputDir ?? "dist");
32
- const config = options.config ?? await loadConfig(options.configDir);
32
+ const config = options.config ?? (await loadConfig(options.configDir));
33
33
  const assembled = await assembleSite(config);
34
34
  const site = await buildSiteConfig(config);
35
35
  const sitePages = Array.from(assembled.pageMap.values());
36
36
  const navigation = buildSiteNavigation(assembled.siteTabs);
37
37
  enforceChangelogDiagnostics(assembled.changelogDiagnostics, options.strictChangelog);
38
+ enforceGodocDiagnostics(assembled.godocDiagnostics);
39
+ enforceRustdocDiagnostics(assembled.rustdocDiagnostics);
38
40
  const docsPagesByTab = collectDocsPagesByTab(assembled.pageMap, config.tabs);
39
41
  const searchIndex = buildSearchIndex(assembled.specsBySlug, docsPagesByTab, navigation, config.baseUrl || "/", config.search.featured, config.prettyUrls);
40
42
  const llmsTxt = generateLlmsTxt(sitePages, navigation, site);
@@ -50,22 +52,30 @@ export async function buildSiteDocs(options = {}) {
50
52
  const ogMeta = describePageForOg(page, config.name || "API", config.changelog.ogImages);
51
53
  if (!ogMeta)
52
54
  return;
53
- const ogPath = `_og/${page.outputPath.replace(/\.html$/, ".png")}`;
54
- const png = await generateOgImage({
55
- title: ogMeta.title,
56
- description: ogMeta.description,
57
- siteName: config.name,
58
- theme: config.theme,
59
- logo: site.logo?.light,
60
- });
61
- page.ogImagePath = ogPath;
62
- ogImages.set(ogPath, png);
55
+ try {
56
+ const ogPath = `_og/${page.outputPath.replace(/\.html$/, ".png")}`;
57
+ const png = await generateOgImage({
58
+ title: ogMeta.title,
59
+ description: ogMeta.description,
60
+ siteName: config.name,
61
+ theme: config.theme,
62
+ logo: site.logo?.light,
63
+ });
64
+ page.ogImagePath = ogPath;
65
+ ogImages.set(ogPath, png);
66
+ }
67
+ catch (error) {
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ console.warn(`Sourcey: skipping OG image for ${page.outputPath}: ${message}`);
70
+ }
63
71
  }));
64
72
  }
65
73
  }
66
74
  else {
67
75
  const staticOg = config.ogImage;
68
- if (staticOg.startsWith("http://") || staticOg.startsWith("https://") || staticOg.startsWith("data:")) {
76
+ if (staticOg.startsWith("http://") ||
77
+ staticOg.startsWith("https://") ||
78
+ staticOg.startsWith("data:")) {
69
79
  for (const page of sitePages) {
70
80
  page.ogImagePath = staticOg;
71
81
  }
@@ -93,6 +103,7 @@ export async function buildSiteDocs(options = {}) {
93
103
  pageCount: sitePages.length,
94
104
  changelogDiagnostics: assembled.changelogDiagnostics,
95
105
  godocDiagnostics: assembled.godocDiagnostics,
106
+ rustdocDiagnostics: assembled.rustdocDiagnostics,
96
107
  _specs: assembled.specsBySlug,
97
108
  };
98
109
  }
@@ -112,7 +123,7 @@ function describePageForOg(page, defaultSiteName, changelogPermalinkOg) {
112
123
  if (!version)
113
124
  return null;
114
125
  return {
115
- title: `${version.version ?? "Unreleased"} ${changelog.title}`,
126
+ title: `${version.version ?? "Unreleased"} - ${changelog.title}`,
116
127
  description: version.summary || summarizeVersion(version),
117
128
  };
118
129
  }
@@ -131,4 +142,5 @@ function summarizeVersion(version) {
131
142
  return summary || undefined;
132
143
  }
133
144
  export { defineConfig } from "./config.js";
145
+ export { doxygen, godoc, markdown, mcp, mkdocs, openapi, rustdoc } from "./adapters/index.js";
134
146
  export { resolveInternalLinks } from "./site-assembly.js";
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AA4DA,eAAO,MAAM,IAAI,qDAyPf,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AA4DA,eAAO,MAAM,IAAI,qDAoQf,CAAC"}
package/dist/init.js CHANGED
@@ -79,7 +79,9 @@ export const init = defineCommand({
79
79
  }
80
80
  }
81
81
  if (existsSync(resolve(targetDir, "sourcey.config.ts"))) {
82
- consola.error("sourcey.config.ts already exists in " + (targetDir === cwd ? "this directory" : relative(cwd, targetDir)) + ".");
82
+ consola.error("sourcey.config.ts already exists in " +
83
+ (targetDir === cwd ? "this directory" : relative(cwd, targetDir)) +
84
+ ".");
83
85
  process.exit(1);
84
86
  }
85
87
  // -- Auto-detect sources --
@@ -155,42 +157,45 @@ export const init = defineCommand({
155
157
  process.exit(0);
156
158
  }
157
159
  // -- Generate files --
158
- const pages = withExample
159
- ? `["introduction", "quickstart"]`
160
- : `["introduction"]`;
160
+ const pages = withExample ? `["introduction", "quickstart"]` : `["introduction"]`;
161
161
  // Build tabs array — paths relative from targetDir to cwd
162
162
  const relPath = (file) => {
163
163
  const abs = resolve(cwd, file);
164
164
  const rel = relative(targetDir, abs);
165
165
  return rel.startsWith(".") ? rel : "./" + rel;
166
166
  };
167
+ const imports = new Set(["defineConfig", "markdown"]);
167
168
  let tabs = ` {
168
169
  tab: "Documentation",
169
170
  slug: "",
170
- groups: [
171
- {
172
- group: "Getting Started",
173
- pages: ${pages},
174
- },
175
- ],
171
+ source: markdown({
172
+ groups: [
173
+ {
174
+ group: "Getting Started",
175
+ pages: ${pages},
176
+ },
177
+ ],
178
+ }),
176
179
  },`;
177
180
  if (addOpenAPI) {
181
+ imports.add("openapi");
178
182
  tabs += `
179
183
  {
180
184
  tab: "API Reference",
181
185
  slug: "api",
182
- openapi: "${relPath(addOpenAPI)}",
186
+ source: openapi("${relPath(addOpenAPI)}"),
183
187
  },`;
184
188
  }
185
189
  if (addDoxygen) {
190
+ imports.add("doxygen");
186
191
  tabs += `
187
192
  {
188
- tab: "API Reference",
189
- slug: "api",
190
- doxygen: { xml: "${relPath(addDoxygen.xmlDir)}" },
193
+ tab: "C++ Reference",
194
+ slug: "cpp-api",
195
+ source: doxygen({ xml: "${relPath(addDoxygen.xmlDir)}" }),
191
196
  },`;
192
197
  }
193
- const config = `import { defineConfig } from "sourcey";
198
+ const config = `import { ${[...imports].join(", ")} } from "sourcey";
194
199
 
195
200
  export default defineConfig({
196
201
  name: "${name}",
@@ -247,7 +252,7 @@ import { myFunction } from "my-package";
247
252
  build: "sourcey build",
248
253
  },
249
254
  dependencies: {
250
- sourcey: "^3.4.3",
255
+ sourcey: "^3.6.0",
251
256
  },
252
257
  }, null, 2);
253
258
  writeFileSync(resolve(targetDir, "package.json"), pkg + "\n");
@@ -1 +1 @@
1
- {"version":3,"file":"changelog-feed.d.ts","sourceRoot":"","sources":["../../src/renderer/changelog-feed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,CAAC;CAC1D;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,oBAAoB,GAC5B,kBAAkB,CAsEpB"}
1
+ {"version":3,"file":"changelog-feed.d.ts","sourceRoot":"","sources":["../../src/renderer/changelog-feed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAGnE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,CAAC;CAC1D;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,oBAAoB,GAC5B,kBAAkB,CA8EpB"}
@@ -1,12 +1,15 @@
1
+ import { renderMarkdownInline } from "../utils/markdown.js";
1
2
  export function generateChangelogFeeds(page, options) {
2
3
  const buildDate = options.buildDate ?? new Date();
3
- const updated = page.changelog.versions
4
- .map((version) => version.date ? new Date(`${version.date}T00:00:00Z`) : null)
5
- .find(Boolean) ?? buildDate;
4
+ const datedVersions = page.changelog.versions
5
+ .map((version) => (version.date ? new Date(`${version.date}T00:00:00Z`).getTime() : NaN))
6
+ .filter(Number.isFinite);
7
+ const updated = datedVersions.length ? new Date(Math.max(...datedVersions)) : buildDate;
6
8
  const title = options.title ?? [options.siteName, page.title].filter(Boolean).join(" ").trim();
7
9
  const description = options.description ?? page.description ?? `${page.title} feed`;
8
10
  const feedId = toFeedId(options.atomPath);
9
- const atomEntries = page.changelog.versions.map((version) => {
11
+ const atomEntries = page.changelog.versions
12
+ .map((version) => {
10
13
  const href = options.versionHref(version);
11
14
  const content = renderVersionHtml(version);
12
15
  const updatedAt = version.date ? new Date(`${version.date}T00:00:00Z`) : updated;
@@ -20,25 +23,28 @@ export function generateChangelogFeeds(page, options) {
20
23
  ` <content type="html">${escapeXml(content)}</content>`,
21
24
  " </entry>",
22
25
  ].join("\n");
23
- }).join("\n");
26
+ })
27
+ .join("\n");
24
28
  const atom = [
25
29
  `<?xml version="1.0" encoding="UTF-8"?>`,
26
30
  `<feed xmlns="http://www.w3.org/2005/Atom">`,
27
31
  ` <title>${escapeXml(title)}</title>`,
28
32
  ` <id>${escapeXml(feedId)}</id>`,
29
33
  ` <updated>${updated.toISOString()}</updated>`,
34
+ ` <author><name>${escapeXml(options.siteName || title)}</name></author>`,
30
35
  ` <subtitle>${escapeXml(description)}</subtitle>`,
31
36
  ` <link rel="self" href="${escapeXml(options.atomPath)}" />`,
32
37
  ` <link href="${escapeXml(options.pagePath)}" />`,
33
38
  page.changelog.versions.length ? atomEntries : "",
34
39
  `</feed>`,
35
- ].filter(Boolean).join("\n");
36
- const rssItems = page.changelog.versions.map((version) => {
40
+ ]
41
+ .filter(Boolean)
42
+ .join("\n");
43
+ const rssItems = page.changelog.versions
44
+ .map((version) => {
37
45
  const href = options.versionHref(version);
38
46
  const label = version.version ?? "Unreleased";
39
- const pubDate = version.date
40
- ? new Date(`${version.date}T00:00:00Z`)
41
- : updated;
47
+ const pubDate = version.date ? new Date(`${version.date}T00:00:00Z`) : updated;
42
48
  return [
43
49
  " <item>",
44
50
  ` <title>${escapeXml(label)}</title>`,
@@ -48,7 +54,8 @@ export function generateChangelogFeeds(page, options) {
48
54
  ` <description>${escapeXml(renderVersionHtml(version))}</description>`,
49
55
  " </item>",
50
56
  ].join("\n");
51
- }).join("\n");
57
+ })
58
+ .join("\n");
52
59
  const rss = [
53
60
  `<?xml version="1.0" encoding="UTF-8"?>`,
54
61
  `<rss version="2.0">`,
@@ -59,15 +66,19 @@ export function generateChangelogFeeds(page, options) {
59
66
  page.changelog.versions.length ? rssItems : "",
60
67
  ` </channel>`,
61
68
  `</rss>`,
62
- ].filter(Boolean).join("\n");
69
+ ]
70
+ .filter(Boolean)
71
+ .join("\n");
63
72
  return { atom, rss };
64
73
  }
65
74
  function renderVersionHtml(version) {
66
- const summary = version.summary ? `<p>${escapeHtml(version.summary)}</p>` : "";
67
- const sections = version.sections.map((section) => {
75
+ const summary = version.summary ? `<p>${renderMarkdownInline(version.summary)}</p>` : "";
76
+ const sections = version.sections
77
+ .map((section) => {
68
78
  const items = section.entries.map((entry) => `<li>${entry.html}</li>`).join("");
69
79
  return `<section><h3>${escapeHtml(section.label)}</h3><ul>${items}</ul></section>`;
70
- }).join("");
80
+ })
81
+ .join("");
71
82
  return `<article><h2>${escapeHtml(version.version ?? "Unreleased")}</h2>${summary}${sections}</article>`;
72
83
  }
73
84
  function escapeXml(value) {
@@ -79,10 +90,7 @@ function escapeXml(value) {
79
90
  .replace(/'/g, "&apos;");
80
91
  }
81
92
  function escapeHtml(value) {
82
- return value
83
- .replace(/&/g, "&amp;")
84
- .replace(/</g, "&lt;")
85
- .replace(/>/g, "&gt;");
93
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
86
94
  }
87
95
  function toFeedId(value) {
88
96
  if (value.startsWith("http://") || value.startsWith("https://"))
@@ -1 +1 @@
1
- {"version":3,"file":"html-builder.d.ts","sourceRoot":"","sources":["../../src/renderer/html-builder.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA2B5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,aAAa,CAcf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,EAAE,cAAc,EAC1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC3C,GACA,OAAO,CAAC,WAAW,CAAC,CA8EtB"}
1
+ {"version":3,"file":"html-builder.d.ts","sourceRoot":"","sources":["../../src/renderer/html-builder.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiC5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,aAAa,CAcf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,EAAE,cAAc,EAC1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC3C,GACA,OAAO,CAAC,WAAW,CAAC,CA8EtB"}
@@ -7,6 +7,7 @@ import preact from "@preact/preset-vite";
7
7
  import { renderPage } from "./static-renderer.js";
8
8
  import { withActivePage } from "../core/navigation.js";
9
9
  import { isAbsoluteHttpUrl, toAbsoluteUrl, toPublicPath } from "../site-url.js";
10
+ import { escapeHtml as escapeXml } from "../utils/html.js";
10
11
  const __dirname = dirname(fileURLToPath(import.meta.url));
11
12
  const projectRoot = resolve(__dirname, "../..");
12
13
  async function exists(path) {
@@ -27,8 +28,8 @@ async function resolveAssetPaths() {
27
28
  const distClient = resolve(projectRoot, "dist/client/index.js");
28
29
  const srcCss = resolve(projectRoot, "src/themes/default/sourcey.css");
29
30
  const distCss = resolve(projectRoot, "dist/themes/default/sourcey.css");
30
- const clientEntry = await exists(srcClient) ? srcClient : distClient;
31
- const sourceyCssPath = await exists(srcCss) ? srcCss : distCss;
31
+ const clientEntry = (await exists(srcClient)) ? srcClient : distClient;
32
+ const sourceyCssPath = (await exists(srcCss)) ? srcCss : distCss;
32
33
  return { clientEntry, sourceyCssPath };
33
34
  }
34
35
  export function createRenderOptions(page, site, options) {
@@ -88,7 +89,7 @@ export async function buildSite(pages, navigation, outputDir, site, options) {
88
89
  const urls = pages.map((page) => {
89
90
  const publicPath = toPublicPath(page.outputPath, site.baseUrl, site.prettyUrls);
90
91
  const loc = site.siteUrl ? toAbsoluteUrl(publicPath, site.siteUrl) : publicPath;
91
- return ` <url><loc>${loc}</loc></url>`;
92
+ return ` <url><loc>${escapeXml(loc)}</loc></url>`;
92
93
  });
93
94
  const sitemap = [
94
95
  `<?xml version="1.0" encoding="UTF-8"?>`,
@@ -41,7 +41,7 @@ export function generateLlmsTxt(pages, navigation, site) {
41
41
  if (op.hidden)
42
42
  continue;
43
43
  const opLabel = op.summary ?? operationDisplayName(op);
44
- const opSummary = [operationKind(op), firstLine(op.description)].filter(Boolean).join(" ");
44
+ const opSummary = [operationKind(op), firstLine(op.description)].filter(Boolean).join(" - ");
45
45
  lines.push(`- [${opLabel}](${href(page)}#${operationAnchor(op)})${opSummary ? `: ${opSummary}` : ""}`);
46
46
  }
47
47
  }
@@ -92,6 +92,15 @@ function appendMarkdownPage(lines, page, site) {
92
92
  lines.push(doc.description);
93
93
  lines.push("");
94
94
  }
95
+ const isRustdoc = doc.sourcePath?.startsWith("rustdoc/");
96
+ if (isRustdoc) {
97
+ const body = stripHtmlPreservingRustDoctests(doc.html);
98
+ if (body) {
99
+ lines.push(body);
100
+ lines.push("");
101
+ }
102
+ return;
103
+ }
95
104
  const body = stripHtml(doc.html);
96
105
  if (body) {
97
106
  lines.push(body);
@@ -207,7 +216,7 @@ function appendOperation(lines, op) {
207
216
  const type = param.schema
208
217
  ? formatSchemaType(param.schema)
209
218
  : firstContentSchemaType(param.content);
210
- const desc = param.description ? ` ${firstLine(param.description)}` : "";
219
+ const desc = param.description ? ` - ${firstLine(param.description)}` : "";
211
220
  lines.push(`- \`${param.name}\` (${param.in}, ${type}, ${req})${desc}`);
212
221
  }
213
222
  lines.push("");
@@ -337,6 +346,52 @@ function stripHtml(html) {
337
346
  .replace(/\s+/g, " ")
338
347
  .trim();
339
348
  }
349
+ /**
350
+ * Like stripHtml but preserves rustdoc doctest <pre><code> blocks as
351
+ * fenced ```rust ... ``` so they remain useful as runnable examples in
352
+ * llms-full.txt. Section headings and item names are also kept.
353
+ */
354
+ function stripHtmlPreservingRustDoctests(html) {
355
+ const tokens = [];
356
+ const sectionRe = /<section class="rust-item rust-([a-z_]+) api-item"[^>]*>([\s\S]*?)<\/section>/g;
357
+ let lastIndex = 0;
358
+ let prose = "";
359
+ for (const match of html.matchAll(sectionRe)) {
360
+ prose += html.slice(lastIndex, match.index ?? 0);
361
+ lastIndex = (match.index ?? 0) + match[0].length;
362
+ tokens.push(formatRustItemForLlms(match[2], match[1]));
363
+ }
364
+ prose += html.slice(lastIndex);
365
+ const proseText = stripHtml(prose);
366
+ const parts = [];
367
+ if (proseText)
368
+ parts.push(proseText);
369
+ if (tokens.length > 0)
370
+ parts.push(tokens.join("\n\n"));
371
+ return parts.join("\n\n").trim();
372
+ }
373
+ function formatRustItemForLlms(inner, kind) {
374
+ const titleMatch = inner.match(/<h4[^>]*class="[^"]*code-header[^"]*"[^>]*>([\s\S]*?)<\/h4>/);
375
+ const title = titleMatch ? stripHtml(titleMatch[1]) : "";
376
+ const docMatch = inner.match(/<div class="docblock[^"]*"[^>]*>([\s\S]*?)<\/div>/);
377
+ const docText = docMatch ? stripHtml(docMatch[1]) : "";
378
+ // The visible doctest renders through the shared Shiki code block. Match the
379
+ // `rust-doctest-code` wrapper (exact class, so the hidden `-full` variant is
380
+ // skipped), pull the inner Shiki <code>, then strip span tags while keeping
381
+ // line breaks so the extracted code stays readable.
382
+ const doctests = Array.from(inner.matchAll(/<div class="rust-doctest-code" id="[^"]*">[\s\S]*?<pre class="shiki[^"]*"[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/g)).map((m) => decodeEntities(m[1].replace(/<[^>]+>/g, "")).replace(/\n{3,}/g, "\n\n").trimEnd());
383
+ const out = [];
384
+ if (title)
385
+ out.push(`#### ${kind}: ${title}`);
386
+ if (docText)
387
+ out.push(docText);
388
+ for (const code of doctests) {
389
+ out.push("```rust");
390
+ out.push(code);
391
+ out.push("```");
392
+ }
393
+ return out.join("\n");
394
+ }
340
395
  function decodeEntities(text) {
341
396
  return text
342
397
  .replace(/&nbsp;/g, " ")
@@ -1,4 +1,5 @@
1
1
  import { type GodocLoaderDiagnostic } from "./core/godoc-loader.js";
2
+ import { type RustdocLoaderDiagnostic } from "./core/rustdoc-loader.js";
2
3
  import type { PrettyUrls, ResolvedConfig, ResolvedTab } from "./config.js";
3
4
  import type { DocsPage } from "./core/markdown-loader.js";
4
5
  import type { SiteTab } from "./core/navigation.js";
@@ -12,10 +13,14 @@ export interface SiteAssembly {
12
13
  pageMap: Map<string, SitePage>;
13
14
  changelogDiagnostics: ChangelogDiagnostic[];
14
15
  godocDiagnostics: GodocLoaderDiagnostic[];
16
+ rustdocDiagnostics: RustdocLoaderDiagnostic[];
15
17
  extraFiles: Map<string, string | Buffer>;
16
18
  }
17
19
  export declare function assembleSite(config: ResolvedConfig): Promise<SiteAssembly>;
18
20
  export declare function formatGodocDiagnostic(diag: GodocLoaderDiagnostic): string;
21
+ export declare function enforceGodocDiagnostics(diagnostics: GodocLoaderDiagnostic[]): void;
22
+ export declare function enforceRustdocDiagnostics(diagnostics: RustdocLoaderDiagnostic[]): void;
23
+ export declare function formatRustdocDiagnostic(diagnostic: RustdocLoaderDiagnostic): string;
19
24
  export declare function collectDocsPagesByTab(pageMap: Map<string, SitePage>, tabs: ResolvedTab[]): Map<string, DocsPage[]>;
20
25
  export declare function rebuildMarkdownTabNavigation(pageMap: Map<string, SitePage>, siteTabs: SiteTab[], tabs: ResolvedTab[], tabSlug: string, prettyUrls: PrettyUrls): void;
21
26
  export declare function enforceChangelogDiagnostics(diagnostics: ChangelogDiagnostic[], strictChangelog?: boolean): void;
@@ -1 +1 @@
1
- {"version":3,"file":"site-assembly.d.ts","sourceRoot":"","sources":["../src/site-assembly.ts"],"names":[],"mappings":"AASA,OAAO,EAAgB,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAIlF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAiB,QAAQ,EAAgB,MAAM,2BAA2B,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAA8B,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,cAAc,CAAC;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;IAC1C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CA2HhF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAKzE;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC9B,IAAI,EAAE,WAAW,EAAE,GAClB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAgBzB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,WAAW,EAAE,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,IAAI,CAsBN;AAaD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,mBAAmB,EAAE,EAClC,eAAe,UAAQ,GACtB,IAAI,CAYN;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAIjF;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAI9E;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAEvF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BjF;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAUlD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAuEpF"}
1
+ {"version":3,"file":"site-assembly.d.ts","sourceRoot":"","sources":["../src/site-assembly.ts"],"names":[],"mappings":"AASA,OAAO,EAAgB,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAkB,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAIxF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAiB,QAAQ,EAAgB,MAAM,2BAA2B,CAAC;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EACV,mBAAmB,EAEnB,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,cAAc,CAAC;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;IAC1C,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;IAC9C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAiKhF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAKzE;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAGlF;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAGtF;AAUD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAMnF;AAUD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC9B,IAAI,EAAE,WAAW,EAAE,GAClB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAoBzB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,WAAW,EAAE,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,IAAI,CAsBN;AAaD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,mBAAmB,EAAE,EAClC,eAAe,UAAQ,GACtB,IAAI,CAYN;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAIjF;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAI9E;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAEvF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BjF;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAUlD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA6FpF"}