starlight-fsharp-oracle 0.1.2 → 0.3.0

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 (97) hide show
  1. package/dist/Extensions/TextNode.js +1 -1
  2. package/dist/Generate.js +53 -21
  3. package/dist/Plugin.js +22 -16
  4. package/dist/Render/Documentation.js +6 -6
  5. package/dist/Render/Entries.js +2 -2
  6. package/dist/Render/Pages.js +77 -48
  7. package/dist/Render/Primitives.js +51 -8
  8. package/dist/Render.js +1 -1
  9. package/dist/fable_modules/Fable.Promise.3.2.0/AsyncIterable.fs +0 -0
  10. package/dist/fable_modules/Fable.Promise.3.2.0/Fable.Promise.fableproj +0 -0
  11. package/dist/fable_modules/Fable.Promise.3.2.0/Promise.fs +0 -0
  12. package/dist/fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs +0 -0
  13. package/dist/fable_modules/Thoth.Json.Core.0.9.0/Decode.fs +0 -0
  14. package/dist/fable_modules/Thoth.Json.Core.0.9.0/DecoderCE.fs +0 -0
  15. package/dist/fable_modules/Thoth.Json.Core.0.9.0/Encode.fs +0 -0
  16. package/dist/fable_modules/Thoth.Json.Core.0.9.0/Thoth.Json.Core.fableproj +0 -0
  17. package/dist/fable_modules/Thoth.Json.Core.0.9.0/Types.fs +0 -0
  18. package/dist/fable_modules/Thoth.Json.Core.Auto.0.1.0/Casing.fs +0 -0
  19. package/dist/fable_modules/Thoth.Json.Core.Auto.0.1.0/Decode.fs +0 -0
  20. package/dist/fable_modules/Thoth.Json.Core.Auto.0.1.0/Domain.fs +0 -0
  21. package/dist/fable_modules/Thoth.Json.Core.Auto.0.1.0/Encode.fs +0 -0
  22. package/dist/fable_modules/Thoth.Json.Core.Auto.0.1.0/Prelude.fs +0 -0
  23. package/dist/fable_modules/Thoth.Json.Core.Auto.0.1.0/Thoth.Json.Core.Auto.fableproj +0 -0
  24. package/dist/fable_modules/Thoth.Json.JavaScript.0.5.0/Decode.fs +0 -0
  25. package/dist/fable_modules/Thoth.Json.JavaScript.0.5.0/Encode.fs +0 -0
  26. package/dist/fable_modules/Thoth.Json.JavaScript.0.5.0/Thoth.Json.JavaScript.fableproj +0 -0
  27. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Array.js +0 -0
  28. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Async.js +0 -0
  29. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/AsyncBuilder.js +0 -0
  30. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/BigInt.js +0 -0
  31. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/BitConverter.js +0 -0
  32. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Boolean.js +0 -0
  33. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/CHANGELOG.md +0 -0
  34. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Char.js +0 -0
  35. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Choice.js +0 -0
  36. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/CollectionUtil.js +0 -0
  37. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/ConditionalWeakTable.js +0 -0
  38. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Date.js +0 -0
  39. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/DateOffset.js +0 -0
  40. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/DateOnly.js +0 -0
  41. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Decimal.js +0 -0
  42. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Double.js +0 -0
  43. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Encoding.js +0 -0
  44. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Event.js +0 -0
  45. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/FSharp.Collections.js +0 -0
  46. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/FSharp.Core.CompilerServices.js +0 -0
  47. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/FSharp.Core.js +0 -0
  48. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Global.js +0 -0
  49. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Guid.js +0 -0
  50. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Int32.js +0 -0
  51. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/List.js +0 -0
  52. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Long.js +0 -0
  53. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/MailboxProcessor.js +0 -0
  54. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Map.js +0 -0
  55. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/MapUtil.js +0 -0
  56. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/MutableMap.js +0 -0
  57. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/MutableSet.js +0 -0
  58. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Native.js +0 -0
  59. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Numeric.js +0 -0
  60. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Observable.js +0 -0
  61. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Option.js +0 -0
  62. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/README.md +0 -0
  63. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Random.js +0 -0
  64. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Range.js +0 -0
  65. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Reflection.js +0 -0
  66. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/RegExp.js +0 -0
  67. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Result.js +0 -0
  68. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Seq.js +0 -0
  69. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Seq2.js +0 -0
  70. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Set.js +0 -0
  71. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/String.js +0 -0
  72. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/System.Collections.Generic.js +0 -0
  73. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/System.Text.js +0 -0
  74. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/System.js +0 -0
  75. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/TimeOnly.js +0 -0
  76. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/TimeSpan.js +0 -0
  77. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Timer.js +0 -0
  78. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Types.js +0 -0
  79. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Unicode.13.0.0.js +0 -0
  80. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Uri.js +0 -0
  81. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/Util.js +0 -0
  82. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/big.d.ts +0 -0
  83. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/lib/big.js +0 -0
  84. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/package.json +0 -0
  85. package/dist/fable_modules/fable-library-js.5.0.0-rc.7/quotation.js +0 -0
  86. package/package.json +9 -8
  87. package/packages/FSharp.Oracle/Extractor/Assembly.fs +6 -1
  88. package/packages/FSharp.Oracle/Extractor/EntityExtractor.fs +35 -4
  89. package/packages/FSharp.Oracle/Program.fs +7 -6
  90. package/packages/FSharp.Oracle/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.fs +0 -3
  91. package/packages/FSharp.Oracle/obj/Debug/net10.0/FSharp.Oracle.AssemblyInfo.fs +0 -17
  92. package/packages/FSharp.Oracle/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.fs +0 -3
  93. package/packages/FSharp.Oracle/obj/Release/net10.0/FSharp.Oracle.AssemblyInfo.fs +0 -17
  94. package/packages/FSharp.Oracle.Schema/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.fs +0 -3
  95. package/packages/FSharp.Oracle.Schema/obj/Debug/net10.0/FSharp.Oracle.Schema.AssemblyInfo.fs +0 -17
  96. package/packages/FSharp.Oracle.Schema/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.fs +0 -3
  97. package/packages/FSharp.Oracle.Schema/obj/Release/net10.0/FSharp.Oracle.Schema.AssemblyInfo.fs +0 -17
@@ -40,7 +40,7 @@ export function FSharp_Oracle_Schema_TextNode__TextNode_get_Html(this$) {
40
40
  case 11:
41
41
  return wrapInKeyword(",");
42
42
  case 9:
43
- return " ";
43
+ return " ‌";
44
44
  case 17:
45
45
  return wrapInKeyword(">");
46
46
  case 16:
package/dist/Generate.js CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { join, split, concat, substring, replace } from "./fable_modules/fable-library-js.5.0.0-rc.7/String.js";
3
- import { cons, append, toArray, exists, isEmpty, map, filter, ofArray, collect, sort } from "./fable_modules/fable-library-js.5.0.0-rc.7/List.js";
3
+ import { cons, append, toArray, contains, tryFind, exists, isEmpty, map, filter, ofArray, collect, sort } from "./fable_modules/fable-library-js.5.0.0-rc.7/List.js";
4
4
  import { List_distinct } from "./fable_modules/fable-library-js.5.0.0-rc.7/Seq2.js";
5
5
  import { scan, tail } from "./fable_modules/fable-library-js.5.0.0-rc.7/Array.js";
6
6
  import { comparePrimitives, stringHash } from "./fable_modules/fable-library-js.5.0.0-rc.7/Util.js";
@@ -62,7 +62,7 @@ import { Aside } from '@astrojs/starlight/components';
62
62
  ${page.TemplateBody}`;
63
63
  }
64
64
 
65
- export function namespacePages(outputBase, modules) {
65
+ export function namespacePages(basePath, outputBase, modules) {
66
66
  const realModules = filter((m) => !m.IsSynthetic, modules);
67
67
  const allNamespaces = namespacesOf(modules);
68
68
  const syntheticModules = filter((m_2) => m_2.IsSynthetic, modules);
@@ -80,23 +80,50 @@ export function namespacePages(outputBase, modules) {
80
80
  }
81
81
  }, allNamespaces);
82
82
  const entitiesInNs = collect((m_5) => m_5.Entities, filter((m_4) => (m_4.Namespace === ns_1), syntheticModules));
83
- return [slug, toMdxPage(renderNamespacePage((name) => ((fullName) => (`<a href="/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(ns_1)(subNamespaces)(entitiesInNs)(modulesInNs))];
83
+ return [slug, toMdxPage(renderNamespacePage((name) => ((fullName) => (`<a href="${basePath}/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(ns_1)(subNamespaces)(entitiesInNs)(modulesInNs))];
84
84
  }, allNamespaces);
85
85
  }
86
86
 
87
- export function modulePages(outputBase, modules) {
87
+ export function modulePages(basePath, outputBase, modules) {
88
88
  const realModules = filter((m) => !m.IsSynthetic, modules);
89
89
  return map((m_1) => {
90
90
  const subModules = filter((other) => (other.Namespace === m_1.FullName), realModules);
91
- return [toSlug(m_1.FullName), toMdxPage(renderModulePage((name) => ((fullName) => (`<a href="/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(m_1)(subModules))];
91
+ return [toSlug(m_1.FullName), toMdxPage(renderModulePage((name) => ((fullName) => (`<a href="${basePath}/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(m_1)(subModules))];
92
92
  }, realModules);
93
93
  }
94
94
 
95
- export function entityPages(outputBase, modules) {
96
- return toList(delay(() => collect_1((m) => map_1((e) => [toSlug(Entity__get_FullName(e)), toMdxPage(renderEntityPage((name) => ((fullName) => (`<a href="/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(e)(m))], m.Entities), modules)));
95
+ export function entityPages(basePath, outputBase, modules) {
96
+ const realModules = filter((m) => !m.IsSynthetic, modules);
97
+ return toList(delay(() => collect_1((m_2) => map_1((e) => {
98
+ let slug;
99
+ return [toSlug(Entity__get_FullName(e)), toMdxPage(renderEntityPage((name) => ((fullName) => (`<a href="${basePath}/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(e)(m_2)((slug = toSlug(Entity__get_FullName(e)), tryFind((m_1) => {
100
+ if (m_1.FullName !== m_2.FullName) {
101
+ return toSlug(m_1.FullName) === slug;
102
+ }
103
+ else {
104
+ return false;
105
+ }
106
+ }, realModules))))];
107
+ }, m_2.Entities), modules)));
97
108
  }
98
109
 
99
- export function rootIndexPage(outputBase, assemblies, modules) {
110
+ /**
111
+ * Slugs of modules whose page is merged into a same-slug entity page.
112
+ * Their standalone module page must be dropped so it does not clobber the merged one.
113
+ */
114
+ export function mergedModuleSlugs(modules) {
115
+ const realModules = filter((m) => !m.IsSynthetic, modules);
116
+ const entitySlugs = map((e) => toSlug(Entity__get_FullName(e)), collect((m_1) => m_1.Entities, modules));
117
+ return List_distinct(filter((slug) => contains(slug, entitySlugs, {
118
+ Equals: (x, y) => (x === y),
119
+ GetHashCode: (x) => (stringHash(x) | 0),
120
+ }), map((m_2) => toSlug(m_2.FullName), realModules)), {
121
+ Equals: (x_1, y_1) => (x_1 === y_1),
122
+ GetHashCode: (x_1) => (stringHash(x_1) | 0),
123
+ });
124
+ }
125
+
126
+ export function rootIndexPage(basePath, outputBase, assemblies, modules) {
100
127
  const globalModules = filter((m) => {
101
128
  if (!m.IsSynthetic) {
102
129
  return m.Namespace === "";
@@ -105,7 +132,7 @@ export function rootIndexPage(outputBase, assemblies, modules) {
105
132
  return false;
106
133
  }
107
134
  }, modules);
108
- return ["index", toMdxPage(renderRootIndexPage((name) => ((fullName) => (`<a href="/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(assemblies)(globalModules))];
135
+ return ["index", toMdxPage(renderRootIndexPage((name) => ((fullName) => (`<a href="${basePath}/${outputBase}/${toSlug(fullName)}">${name}</a>`)))(assemblies)(globalModules))];
109
136
  }
110
137
 
111
138
  function sidebarLink(outputBase, label, fullName, letter, kind) {
@@ -162,17 +189,22 @@ export function sidebarTree(outputBase, label, modules) {
162
189
  const realModules = filter((m) => !m.IsSynthetic, modules);
163
190
  const syntheticModules = filter((m_1) => m_1.IsSynthetic, modules);
164
191
  const allNamespaces = namespacesOf(modules);
165
- const moduleHref = (m_2) => concat("/", outputBase, "/", ...toSlug(m_2.FullName));
192
+ const realModuleSlugs = map((m_2) => toSlug(m_2.FullName), realModules);
193
+ const entitySidebarItems = (entities) => map((entity) => entitySidebarItem(outputBase, entity), filter((e) => !contains(toSlug(Entity__get_FullName(e)), realModuleSlugs, {
194
+ Equals: (x, y) => (x === y),
195
+ GetHashCode: (x) => (stringHash(x) | 0),
196
+ }), entities));
197
+ const moduleHref = (m_3) => concat("/", outputBase, "/", ...toSlug(m_3.FullName));
166
198
  const anchorLink = (label_1, href) => ({
167
199
  label: label_1,
168
200
  link: href,
169
201
  });
170
- const moduleSidebarItem = (m_3) => {
171
- const subModules = filter((other) => (other.Namespace === m_3.FullName), realModules);
172
- return sidebarGroup(m_3.Name, "M", "module", append(cons({
202
+ const moduleSidebarItem = (m_4) => {
203
+ const subModules = filter((other) => (other.Namespace === m_4.FullName), realModules);
204
+ return sidebarGroup(m_4.Name, "M", "module", append(cons({
173
205
  label: "Overview",
174
- link: moduleHref(m_3),
175
- }, map((entity) => entitySidebarItem(outputBase, entity), m_3.Entities)), append(map((f) => anchorLink(f.Name, concat(moduleHref(m_3), "#", ...f.Name)), m_3.Functions), append(map((v) => anchorLink(v.Name, concat(moduleHref(m_3), "#", ...v.Name)), m_3.Values), map(moduleSidebarItem, subModules)))));
206
+ link: moduleHref(m_4),
207
+ }, map((entity_1) => entitySidebarItem(outputBase, entity_1), m_4.Entities)), append(map((f) => anchorLink(f.Name, concat(moduleHref(m_4), "#", ...f.Name)), m_4.Functions), append(map((v) => anchorLink(v.Name, concat(moduleHref(m_4), "#", ...v.Name)), m_4.Values), map(moduleSidebarItem, subModules)))));
176
208
  };
177
209
  const buildNsGroup = (ns) => {
178
210
  let shortName;
@@ -180,28 +212,28 @@ export function sidebarTree(outputBase, label, modules) {
180
212
  shortName = ((lastDot < 0) ? ns : ns.slice(lastDot + 1, ns.length));
181
213
  const directChildNs = filter((other_1) => {
182
214
  if (other_1.startsWith(ns + ".") && !(other_1.slice(ns.length + 1, other_1.length).indexOf(".") >= 0)) {
183
- return !exists((m_4) => (m_4.FullName === other_1), realModules);
215
+ return !exists((m_5) => (m_5.FullName === other_1), realModules);
184
216
  }
185
217
  else {
186
218
  return false;
187
219
  }
188
220
  }, allNamespaces);
189
- const modulesInNs = filter((m_5) => (m_5.Namespace === ns), realModules);
190
- const syntheticInNs = filter((m_6) => (m_6.Namespace === ns), syntheticModules);
221
+ const modulesInNs = filter((m_6) => (m_6.Namespace === ns), realModules);
222
+ const syntheticInNs = filter((m_7) => (m_7.Namespace === ns), syntheticModules);
191
223
  return sidebarGroup(shortName, "N", "namespace", toList(delay(() => append_1(map(moduleSidebarItem, modulesInNs), delay(() => append_1(collect_1((sm) => {
192
224
  let lastDot_1;
193
- return (sm.Name === "global") ? map((entity_1) => entitySidebarItem(outputBase, entity_1), sm.Entities) : singleton(sidebarGroup((lastDot_1 = (sm.FullName.lastIndexOf(".") | 0), (lastDot_1 < 0) ? sm.FullName : sm.FullName.slice(lastDot_1 + 1, sm.FullName.length)), "N", "namespace", map((entity_2) => entitySidebarItem(outputBase, entity_2), sm.Entities)));
225
+ return (sm.Name === "global") ? entitySidebarItems(sm.Entities) : singleton(sidebarGroup((lastDot_1 = (sm.FullName.lastIndexOf(".") | 0), (lastDot_1 < 0) ? sm.FullName : sm.FullName.slice(lastDot_1 + 1, sm.FullName.length)), "N", "namespace", entitySidebarItems(sm.Entities)));
194
226
  }, syntheticInNs), delay(() => map(buildNsGroup, directChildNs))))))));
195
227
  };
196
228
  const topLevelNs = filter((ns_1) => {
197
229
  if (!exists((other_2) => ns_1.startsWith(other_2 + "."), allNamespaces)) {
198
- return !exists((m_7) => (m_7.FullName === ns_1), realModules);
230
+ return !exists((m_8) => (m_8.FullName === ns_1), realModules);
199
231
  }
200
232
  else {
201
233
  return false;
202
234
  }
203
235
  }, allNamespaces);
204
- const globalModules = filter((m_8) => (m_8.Namespace === ""), realModules);
236
+ const globalModules = filter((m_9) => (m_9.Namespace === ""), realModules);
205
237
  const overviewLink_1 = {
206
238
  label: "Overview",
207
239
  link: concat("/", ...outputBase),
package/dist/Plugin.js CHANGED
@@ -3,9 +3,9 @@ import * as path from "path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { toArray, singleton, append, delay, toList } from "./fable_modules/fable-library-js.5.0.0-rc.7/Seq.js";
5
5
  import * as child_process from "child_process";
6
- import { map, defaultArg, some } from "./fable_modules/fable-library-js.5.0.0-rc.7/Option.js";
6
+ import { map, ofNullable, defaultArg, some } from "./fable_modules/fable-library-js.5.0.0-rc.7/Option.js";
7
7
  import { stringHash, Exception } from "./fable_modules/fable-library-js.5.0.0-rc.7/Util.js";
8
- import { join, concat, interpolate } from "./fable_modules/fable-library-js.5.0.0-rc.7/String.js";
8
+ import { join, concat, trimEnd, interpolate } from "./fable_modules/fable-library-js.5.0.0-rc.7/String.js";
9
9
  import { unsafeFromString } from "./fable_modules/Thoth.Json.JavaScript.0.5.0/Decode.fs.js";
10
10
  import { generateDecoder } from "./fable_modules/Thoth.Json.Core.Auto.0.1.0/Decode.fs.js";
11
11
  import { Extra_empty } from "./fable_modules/Thoth.Json.Core.Auto.0.1.0/Domain.fs.js";
@@ -14,14 +14,14 @@ import { PromiseBuilder__Delay_62FBFDE1, PromiseBuilder__Run_212F1D4B } from "./
14
14
  import { promise } from "./fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs.js";
15
15
  import { createRenderer } from "astro-expressive-code";
16
16
  import { generateCss } from "./Themes.js";
17
- import { length, isEmpty, contains, filter, map as map_1, collect } from "./fable_modules/fable-library-js.5.0.0-rc.7/List.js";
18
- import { entityPages, rootIndexPage, namespacePages as namespacePages_1, modulePages as modulePages_1, sidebarTree, sidebarLabelInitScript } from "./Generate.js";
17
+ import { length, isEmpty, map as map_1, contains, filter, collect } from "./fable_modules/fable-library-js.5.0.0-rc.7/List.js";
18
+ import { entityPages, rootIndexPage, modulePages as modulePages_1, mergedModuleSlugs, namespacePages as namespacePages_1, sidebarTree, sidebarLabelInitScript } from "./Generate.js";
19
19
  import { FileOperationResult$1, collectErrors, writeSync, mkdirSync } from "./Helpers.js";
20
20
 
21
- function runExtractor(logger, outputBase, dllPaths) {
21
+ function runExtractor(logger, basePath, outputBase, dllPaths) {
22
22
  const maxBuffer = ((50 * 1024) * 1024) | 0;
23
23
  const oracleDll = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "oracle-bin", "Oracle.dll");
24
- const args = toList(delay(() => append(singleton(oracleDll), delay(() => append(singleton("--output-base"), delay(() => append(singleton(outputBase), delay(() => dllPaths))))))));
24
+ const args = toList(delay(() => append(singleton(oracleDll), delay(() => append(singleton("--output-base"), delay(() => append(singleton(outputBase), delay(() => append(singleton("--base"), delay(() => append(singleton(basePath), delay(() => dllPaths))))))))))));
25
25
  const result = child_process.spawnSync("dotnet", Array.from(args), some({
26
26
  encoding: "utf-8",
27
27
  maxBuffer: maxBuffer,
@@ -58,9 +58,11 @@ function starlightFSharpDoc(pluginOptions) {
58
58
  });
59
59
  return createRenderer({}).then((_arg) => {
60
60
  let matchValue, matchValue_1, msg;
61
- const themesCss = generateCss(_arg);
61
+ const layerOrder = "@layer starlight.base, starlight.reset, starlight.core, starlight.content, starlight.components, starlight.utils;\n";
62
+ const themesCss = layerOrder + generateCss(_arg);
62
63
  const outputBase = defaultArg(pluginOptions.output, "api");
63
- const root = runExtractor(logger, outputBase, toList(pluginOptions.assemblies));
64
+ const basePath = trimEnd(defaultArg(ofNullable(astroConfig.base), ""), "/");
65
+ const root = runExtractor(logger, basePath, outputBase, toList(pluginOptions.assemblies));
64
66
  const modules = collect((_arg_1) => _arg_1.Modules, root.Assemblies);
65
67
  const sidebarLabel = defaultArg(map((s) => s.label, pluginOptions.sidebar), "API Reference");
66
68
  const existingSidebar = defaultArg(hookOptions.config.sidebar, []);
@@ -78,16 +80,20 @@ function starlightFSharpDoc(pluginOptions) {
78
80
  return ((matchValue = mkdirSync(outputDir), (matchValue.tag === 0) ? ((matchValue_1 = writeSync(path.join(outputDir, ".gitignore"), "# Autogenerated by starlight-fsharp-oracle\n**/*\n"), (matchValue_1.tag === 0) ? (Promise.resolve()) : ((logger.warn(concat("Failed to write .gitignore: ", ...matchValue_1.fields[0])), Promise.resolve())))) : ((msg = matchValue.fields[0], (logger.error(msg), ((() => {
79
81
  throw new Exception(msg);
80
82
  })(), Promise.resolve())))))).then(() => PromiseBuilder__Delay_62FBFDE1(promise, () => {
81
- const modulePages = modulePages_1(outputBase, modules);
82
- const namespacePages = namespacePages_1(outputBase, modules);
83
- const moduleSlugs = map_1((tuple) => tuple[0], modulePages);
84
- const dedupedNamespacePages = filter((tupledArg) => !contains(tupledArg[0], moduleSlugs, {
83
+ const namespacePages = namespacePages_1(basePath, outputBase, modules);
84
+ const mergedSlugs = mergedModuleSlugs(modules);
85
+ const modulePages = filter((tupledArg) => !contains(tupledArg[0], mergedSlugs, {
85
86
  Equals: (x, y) => (x === y),
86
87
  GetHashCode: (x) => (stringHash(x) | 0),
88
+ }), modulePages_1(basePath, outputBase, modules));
89
+ const moduleSlugs = map_1((tuple) => tuple[0], modulePages);
90
+ const dedupedNamespacePages = filter((tupledArg_1) => !contains(tupledArg_1[0], moduleSlugs, {
91
+ Equals: (x_1, y_1) => (x_1 === y_1),
92
+ GetHashCode: (x_1) => (stringHash(x_1) | 0),
87
93
  }), namespacePages);
88
- const errors = collectErrors(map_1((tupledArg_1) => {
89
- const filePath = path.join(outputDir, tupledArg_1[0] + ".mdx");
90
- const matchValue_2 = writeSync(filePath, tupledArg_1[1]);
94
+ const errors = collectErrors(map_1((tupledArg_2) => {
95
+ const filePath = path.join(outputDir, tupledArg_2[0] + ".mdx");
96
+ const matchValue_2 = writeSync(filePath, tupledArg_2[1]);
91
97
  if (matchValue_2.tag === 0) {
92
98
  logger.info(concat(" wrote ", ...filePath));
93
99
  return new FileOperationResult$1(0, [undefined]);
@@ -97,7 +103,7 @@ function starlightFSharpDoc(pluginOptions) {
97
103
  logger.error(msg_2);
98
104
  return new FileOperationResult$1(1, [msg_2]);
99
105
  }
100
- }, toList(delay(() => append(singleton(rootIndexPage(outputBase, root.Assemblies, modules)), delay(() => append(dedupedNamespacePages, delay(() => append(modulePages, delay(() => entityPages(outputBase, modules)))))))))));
106
+ }, toList(delay(() => append(singleton(rootIndexPage(basePath, outputBase, root.Assemblies, modules)), delay(() => append(dedupedNamespacePages, delay(() => append(modulePages, delay(() => entityPages(basePath, outputBase, modules)))))))))));
101
107
  if (!isEmpty(errors)) {
102
108
  const errorMsg = (`Failed to write ${length(errors)} file(s):
103
109
  `) + join("\n", errors);
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { System_Text_StringBuilder__StringBuilder_NewLine, System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5 } from "../Extensions/StringBuilder.js";
3
- import { h2, renderExamples, escapeMdxText } from "./Primitives.js";
3
+ import { h2, renderExamples, escapeMdxMarkdown } from "./Primitives.js";
4
4
  import { iterate } from "../fable_modules/fable-library-js.5.0.0-rc.7/Seq.js";
5
5
  import { toArray } from "../fable_modules/fable-library-js.5.0.0-rc.7/Option.js";
6
6
  import { ofArray, tryFind, collect, isEmpty } from "../fable_modules/fable-library-js.5.0.0-rc.7/List.js";
@@ -13,7 +13,7 @@ export function renderSummary(sb, xmlDoc) {
13
13
  if (matchValue == null) {
14
14
  }
15
15
  else {
16
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(matchValue));
16
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(matchValue));
17
17
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
18
18
  }
19
19
  }
@@ -31,11 +31,11 @@ export function renderDocumentationBlock(sb, xmlDoc, renderExtra) {
31
31
  export function renderXmlDocSummaryAndRemarks(sb, toc, xmlDoc) {
32
32
  iterate((summary) => {
33
33
  h2(sb, toc, "description", "Description");
34
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(summary));
34
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(summary));
35
35
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
36
36
  }, toArray(xmlDoc.Summary));
37
37
  iterate((remarks) => {
38
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(remarks));
38
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(remarks));
39
39
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
40
40
  }, toArray(xmlDoc.Remarks));
41
41
  }
@@ -56,7 +56,7 @@ function renderParamsAndReturns(sb, parameters, xmlDoc) {
56
56
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, FSharp_Oracle_Schema_TextNode__TextNode_ToHtml_Static_Z3A0E64B3(ofArray([new TextNode(23, ["div", "fs-parameter__signature"]), new TextNode(20, []), parameter.Declaration, new TextNode(20, []), new TextNode(22, ["div"]), new TextNode(20, [])])));
57
57
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\'fs-parameter__documentation\'>");
58
58
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
59
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(paramDoc_1.Doc));
59
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(paramDoc_1.Doc));
60
60
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
61
61
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
62
62
  }
@@ -73,7 +73,7 @@ function renderParamsAndReturns(sb, parameters, xmlDoc) {
73
73
  const returnDoc = matchValue;
74
74
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<strong>Returns</strong>");
75
75
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
76
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(returnDoc));
76
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(returnDoc));
77
77
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
78
78
  }
79
79
  }
@@ -1,5 +1,5 @@
1
1
 
2
- import { tocH3, h2, escapeMdxText, renderDocEntry } from "./Primitives.js";
2
+ import { tocH3, h2, escapeMdxMarkdown, renderDocEntry } from "./Primitives.js";
3
3
  import { FSharp_Oracle_Schema_TextNode__TextNode_ToHtml_Static_Z3A0E64B3, FSharp_Oracle_Schema_TextNode__TextNode_get_Html } from "../Extensions/TextNode.js";
4
4
  import { MemberKind, TextNode, ObsoleteInfo } from "../FSharp.Oracle.Schema/Schema.js";
5
5
  import { renderXmlDocBody, renderDocumentationBlock } from "./Documentation.js";
@@ -23,7 +23,7 @@ export function renderUnionCaseEntry(sb, case$) {
23
23
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, FSharp_Oracle_Schema_TextNode__TextNode_ToHtml_Static_Z3A0E64B3(ofArray([new TextNode(23, ["div", "fs-parameter__signature"]), new TextNode(20, []), new TextNode(0, [f_1.Name]), new TextNode(9, []), new TextNode(12, []), new TextNode(9, []), f_1.Type, new TextNode(20, []), new TextNode(22, ["div"]), new TextNode(20, [])])));
24
24
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\'fs-parameter__documentation\'>");
25
25
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
26
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(value_1(f_1.XmlDoc.Summary)));
26
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(value_1(f_1.XmlDoc.Summary)));
27
27
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
28
28
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
29
29
  }
@@ -1,18 +1,55 @@
1
1
 
2
2
  import { isEmpty } from "../fable_modules/fable-library-js.5.0.0-rc.7/List.js";
3
- import { tocH3, renderObsoleteBanner, escapeMdxInline, obsoleteInlineHtml, h2 } from "./Primitives.js";
3
+ import { inlineSignatureHtml, renderObsoleteBanner, escapeMdxInline, obsoleteInlineHtml, tocH3, h2 } from "./Primitives.js";
4
4
  import { System_Text_StringBuilder__StringBuilder_Write_Z721C83C5, System_Text_StringBuilder__StringBuilder_NewLine, System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5 } from "../Extensions/StringBuilder.js";
5
5
  import { disposeSafe, getEnumerator } from "../fable_modules/fable-library-js.5.0.0-rc.7/Util.js";
6
+ import { renderMemberSections, renderRecordField, renderUnionCaseEntry, renderValueEntry, renderFunctionEntry } from "./Entries.js";
6
7
  import { concat } from "../fable_modules/fable-library-js.5.0.0-rc.7/String.js";
7
8
  import { StringBuilder_$ctor } from "../fable_modules/fable-library-js.5.0.0-rc.7/System.Text.js";
8
9
  import { Entity__get_FullName, Entity__get_Name, Entity__get_XmlDoc, Entity__get_Declaration, Entity__get_ObsoleteInfo } from "../FSharp.Oracle.Schema/Schema.js";
9
10
  import { FSharp_Oracle_Schema_TextNode__TextNode_get_Html } from "../Extensions/TextNode.js";
10
11
  import { renderXmlDocSummaryAndRemarks } from "./Documentation.js";
11
- import { renderValueEntry, renderFunctionEntry, renderMemberSections, renderRecordField, renderUnionCaseEntry } from "./Entries.js";
12
12
  import { toString } from "../fable_modules/fable-library-js.5.0.0-rc.7/Types.js";
13
13
  import { toList } from "../fable_modules/fable-library-js.5.0.0-rc.7/Seq.js";
14
14
  import { RenderedPage } from "./Types.js";
15
15
 
16
+ function renderFunctionsAndValues(sb, toc, functions, values) {
17
+ if (!isEmpty(functions)) {
18
+ h2(sb, toc, "functions", "Functions");
19
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"collapsible-group\">");
20
+ const enumerator = getEnumerator(functions);
21
+ try {
22
+ while (enumerator["System.Collections.IEnumerator.MoveNext"]()) {
23
+ const f = enumerator["System.Collections.Generic.IEnumerator`1.get_Current"]();
24
+ tocH3(toc, f.Name, f.Name);
25
+ renderFunctionEntry(sb, f);
26
+ }
27
+ }
28
+ finally {
29
+ disposeSafe(enumerator);
30
+ }
31
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
32
+ System_Text_StringBuilder__StringBuilder_NewLine(sb);
33
+ }
34
+ if (!isEmpty(values)) {
35
+ h2(sb, toc, "values", "Values");
36
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"collapsible-group\">");
37
+ const enumerator_1 = getEnumerator(values);
38
+ try {
39
+ while (enumerator_1["System.Collections.IEnumerator.MoveNext"]()) {
40
+ const v = enumerator_1["System.Collections.Generic.IEnumerator`1.get_Current"]();
41
+ tocH3(toc, v.Name, v.Name);
42
+ renderValueEntry(sb, v);
43
+ }
44
+ }
45
+ finally {
46
+ disposeSafe(enumerator_1);
47
+ }
48
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
49
+ System_Text_StringBuilder__StringBuilder_NewLine(sb);
50
+ }
51
+ }
52
+
16
53
  export function renderDeclaredModules(sb, toc, htmlLinkGen, modules) {
17
54
  if (!isEmpty(modules)) {
18
55
  h2(sb, toc, "declared-modules", "Declared Modules");
@@ -38,16 +75,15 @@ export function renderDeclaredModules(sb, toc, htmlLinkGen, modules) {
38
75
  }
39
76
  }
40
77
 
41
- export function renderEntityPage(htmlLinkGen, entity, parentModule) {
78
+ export function renderEntityPage(htmlLinkGen, entity, parentModule, companionModule) {
42
79
  const sb = StringBuilder_$ctor();
43
80
  const toc = [];
44
81
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, concat("<p><strong>Namespace:</strong> ", ...htmlLinkGen(parentModule.Namespace, parentModule.Namespace)) + concat("&nbsp;&nbsp;<strong>Parent:</strong> ", htmlLinkGen(parentModule.FullName, parentModule.FullName), ..."</p>"));
45
82
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
46
83
  renderObsoleteBanner(sb, Entity__get_ObsoleteInfo(entity));
47
84
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"not-content\">");
48
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"fsharp-doc-sig\">");
49
- System_Text_StringBuilder__StringBuilder_Write_Z721C83C5(sb, FSharp_Oracle_Schema_TextNode__TextNode_get_Html(Entity__get_Declaration(entity)));
50
- System_Text_StringBuilder__StringBuilder_NewLine(sb);
85
+ System_Text_StringBuilder__StringBuilder_Write_Z721C83C5(sb, "<div class=\"fsharp-doc-sig\">");
86
+ System_Text_StringBuilder__StringBuilder_Write_Z721C83C5(sb, inlineSignatureHtml(FSharp_Oracle_Schema_TextNode__TextNode_get_Html(Entity__get_Declaration(entity))));
51
87
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
52
88
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
53
89
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
@@ -92,6 +128,26 @@ export function renderEntityPage(htmlLinkGen, entity, parentModule) {
92
128
  renderMemberSections(sb, toc, r.Members);
93
129
  break;
94
130
  }
131
+ case 5: {
132
+ const e_1 = entity.fields[0];
133
+ if (!isEmpty(e_1.Fields)) {
134
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"collapsible-group\">");
135
+ const enumerator_2 = getEnumerator(e_1.Fields);
136
+ try {
137
+ while (enumerator_2["System.Collections.IEnumerator.MoveNext"]()) {
138
+ const field_1 = enumerator_2["System.Collections.Generic.IEnumerator`1.get_Current"]();
139
+ tocH3(toc, field_1.Name, field_1.Name);
140
+ renderRecordField(sb, field_1);
141
+ }
142
+ }
143
+ finally {
144
+ disposeSafe(enumerator_2);
145
+ }
146
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
147
+ System_Text_StringBuilder__StringBuilder_NewLine(sb);
148
+ }
149
+ break;
150
+ }
95
151
  case 3: {
96
152
  renderMemberSections(sb, toc, entity.fields[0].Members);
97
153
  break;
@@ -101,20 +157,20 @@ export function renderEntityPage(htmlLinkGen, entity, parentModule) {
101
157
  break;
102
158
  }
103
159
  case 7: {
104
- const e_3 = entity.fields[0];
105
- if (!isEmpty(e_3.Fields)) {
160
+ const e_4 = entity.fields[0];
161
+ if (!isEmpty(e_4.Fields)) {
106
162
  h2(sb, toc, "fields", "Fields");
107
163
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"collapsible-group\">");
108
- const enumerator_2 = getEnumerator(e_3.Fields);
164
+ const enumerator_3 = getEnumerator(e_4.Fields);
109
165
  try {
110
- while (enumerator_2["System.Collections.IEnumerator.MoveNext"]()) {
111
- const field_1 = enumerator_2["System.Collections.Generic.IEnumerator`1.get_Current"]();
112
- tocH3(toc, field_1.Name, field_1.Name);
113
- renderRecordField(sb, field_1);
166
+ while (enumerator_3["System.Collections.IEnumerator.MoveNext"]()) {
167
+ const field_2 = enumerator_3["System.Collections.Generic.IEnumerator`1.get_Current"]();
168
+ tocH3(toc, field_2.Name, field_2.Name);
169
+ renderRecordField(sb, field_2);
114
170
  }
115
171
  }
116
172
  finally {
117
- disposeSafe(enumerator_2);
173
+ disposeSafe(enumerator_3);
118
174
  }
119
175
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
120
176
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
@@ -124,6 +180,12 @@ export function renderEntityPage(htmlLinkGen, entity, parentModule) {
124
180
  default:
125
181
  undefined;
126
182
  }
183
+ if (companionModule == null) {
184
+ }
185
+ else {
186
+ const cm = companionModule;
187
+ renderFunctionsAndValues(sb, toc, cm.Functions, cm.Values);
188
+ }
127
189
  return new RenderedPage(Entity__get_Name(entity), toString(sb), toList(toc));
128
190
  }
129
191
 
@@ -200,40 +262,7 @@ export function renderModulePage(htmlLinkGen, m, subModules) {
200
262
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</dl>");
201
263
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
202
264
  }
203
- if (!isEmpty(m.Functions)) {
204
- h2(sb, toc, "functions", "Functions");
205
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"collapsible-group\">");
206
- const enumerator_1 = getEnumerator(m.Functions);
207
- try {
208
- while (enumerator_1["System.Collections.IEnumerator.MoveNext"]()) {
209
- const f = enumerator_1["System.Collections.Generic.IEnumerator`1.get_Current"]();
210
- tocH3(toc, f.Name, f.Name);
211
- renderFunctionEntry(sb, f);
212
- }
213
- }
214
- finally {
215
- disposeSafe(enumerator_1);
216
- }
217
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
218
- System_Text_StringBuilder__StringBuilder_NewLine(sb);
219
- }
220
- if (!isEmpty(m.Values)) {
221
- h2(sb, toc, "values", "Values");
222
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<div class=\"collapsible-group\">");
223
- const enumerator_2 = getEnumerator(m.Values);
224
- try {
225
- while (enumerator_2["System.Collections.IEnumerator.MoveNext"]()) {
226
- const v = enumerator_2["System.Collections.Generic.IEnumerator`1.get_Current"]();
227
- tocH3(toc, v.Name, v.Name);
228
- renderValueEntry(sb, v);
229
- }
230
- }
231
- finally {
232
- disposeSafe(enumerator_2);
233
- }
234
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
235
- System_Text_StringBuilder__StringBuilder_NewLine(sb);
236
- }
265
+ renderFunctionsAndValues(sb, toc, m.Functions, m.Values);
237
266
  return new RenderedPage(m.FullName, toString(sb), toList(toc));
238
267
  }
239
268
 
@@ -1,5 +1,7 @@
1
1
 
2
- import { concat, replace } from "../fable_modules/fable-library-js.5.0.0-rc.7/String.js";
2
+ import { concat, substring, replace } from "../fable_modules/fable-library-js.5.0.0-rc.7/String.js";
3
+ import { StringBuilder__Append_244C7CD6, StringBuilder__Append_Z721C83C5, StringBuilder_$ctor_Z524259A4 } from "../fable_modules/fable-library-js.5.0.0-rc.7/System.Text.js";
4
+ import { toString } from "../fable_modules/fable-library-js.5.0.0-rc.7/Types.js";
3
5
  import { replace as replace_1 } from "../fable_modules/fable-library-js.5.0.0-rc.7/RegExp.js";
4
6
  import { TocEntry } from "./Types.js";
5
7
  import { System_Text_StringBuilder__StringBuilder_Write_Z721C83C5, System_Text_StringBuilder__StringBuilder_NewLine, System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5 } from "../Extensions/StringBuilder.js";
@@ -15,12 +17,53 @@ export function escapeMdxText(text) {
15
17
  }
16
18
 
17
19
  /**
18
- * Escape text destined for an inline element such as `<dd>`. A blank line in
19
- * the source would be parsed by MDX as a paragraph break and close the
20
- * element early, so all whitespace runs are collapsed to single spaces first.
20
+ * Escape MDX-hostile characters in Markdown text while leaving code spans
21
+ * (`` `inline` `` and ``` ```fenced``` ```) untouched. MDX never parses `{`
22
+ * or `<` as JSX inside code, and HTML entities render verbatim there, so
23
+ * escaping code content would turn `` `Var<'T>` `` into a literal
24
+ * `Var&lt;'T&gt;`. Only the prose between code spans needs escaping.
25
+ */
26
+ export function escapeMdxMarkdown(text) {
27
+ const sb = StringBuilder_$ctor_Z524259A4(text.length);
28
+ const n = text.length | 0;
29
+ let i = 0;
30
+ while (i < n) {
31
+ let matchValue;
32
+ if (((((i + 2) < n) && (text[i] === "`")) && (text[i + 1] === "`")) && (text[i + 2] === "`")) {
33
+ const close = text.indexOf("```", i + 3) | 0;
34
+ const endIdx = ((close < 0) ? n : (close + 3)) | 0;
35
+ StringBuilder__Append_Z721C83C5(sb, substring(text, i, endIdx - i));
36
+ i = (endIdx | 0);
37
+ }
38
+ else if (text[i] === "`") {
39
+ const close_1 = text.indexOf("`", i + 1) | 0;
40
+ const endIdx_1 = ((close_1 < 0) ? n : (close_1 + 1)) | 0;
41
+ StringBuilder__Append_Z721C83C5(sb, substring(text, i, endIdx_1 - i));
42
+ i = (endIdx_1 | 0);
43
+ }
44
+ else {
45
+ (matchValue = text[i], (matchValue === "&") ? StringBuilder__Append_Z721C83C5(sb, "&amp;") : ((matchValue === "<") ? StringBuilder__Append_Z721C83C5(sb, "&lt;") : ((matchValue === ">") ? StringBuilder__Append_Z721C83C5(sb, "&gt;") : ((matchValue === "{") ? StringBuilder__Append_Z721C83C5(sb, "&#123;") : ((matchValue === "}") ? StringBuilder__Append_Z721C83C5(sb, "&#125;") : StringBuilder__Append_244C7CD6(sb, matchValue))))));
46
+ i = ((i + 1) | 0);
47
+ }
48
+ }
49
+ return toString(sb);
50
+ }
51
+
52
+ /**
53
+ * Collapse whitespace runs before escaping, so a blank line can't be read as
54
+ * a paragraph break that closes an inline element like `<dd>` early.
55
+ * Markdown code spans are preserved (see `escapeMdxMarkdown`).
21
56
  */
22
57
  export function escapeMdxInline(text) {
23
- return escapeMdxText(replace_1(text, "\\s+", " ").trim());
58
+ return escapeMdxMarkdown(replace_1(text, "\\s+", " ").trim());
59
+ }
60
+
61
+ /**
62
+ * MDX reflows multi-line raw HTML as a markdown paragraph, collapsing layout.
63
+ * Convert newlines to <br/> so the signature block renders verbatim.
64
+ */
65
+ export function inlineSignatureHtml(html) {
66
+ return replace(html, "\n", "<br/>");
24
67
  }
25
68
 
26
69
  export function h2(sb, toc, slug, text) {
@@ -37,7 +80,7 @@ export function renderDocEntry(sb, name, signatureHtml, obsoleteInfo, renderDocu
37
80
  const patternInput = (obsoleteInfo.tag === 1) ? [" obsolete", ""] : ((obsoleteInfo.tag === 2) ? [" obsolete", concat(" obsoleteMessage=\"", replace(obsoleteInfo.fields[0], "\"", "&quot;"), ..."\"")] : ["", ""]);
38
81
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, `<DocEntry name="${name}"${patternInput[0]}${patternInput[1]}>`);
39
82
  System_Text_StringBuilder__StringBuilder_Write_Z721C83C5(sb, "<div class=\"fsharp-doc-sig\" slot=\"signature\">");
40
- System_Text_StringBuilder__StringBuilder_Write_Z721C83C5(sb, signatureHtml);
83
+ System_Text_StringBuilder__StringBuilder_Write_Z721C83C5(sb, inlineSignatureHtml(signatureHtml));
41
84
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "</div>");
42
85
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
43
86
  renderDocumentation();
@@ -78,7 +121,7 @@ export function renderExamples(sb, examples) {
78
121
  if (isEmpty(tail(examples))) {
79
122
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, "<strong>Example</strong>");
80
123
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
81
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(head(examples)));
124
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(head(examples)));
82
125
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
83
126
  }
84
127
  else {
@@ -88,7 +131,7 @@ export function renderExamples(sb, examples) {
88
131
  const forLoopVar = enumerator["System.Collections.Generic.IEnumerator`1.get_Current"]();
89
132
  System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, `<strong>Example ${forLoopVar[0] + 1}</strong>`);
90
133
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
91
- System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxText(forLoopVar[1]));
134
+ System_Text_StringBuilder__StringBuilder_WriteLine_Z721C83C5(sb, escapeMdxMarkdown(forLoopVar[1]));
92
135
  System_Text_StringBuilder__StringBuilder_NewLine(sb);
93
136
  }
94
137
  }
package/dist/Render.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { renderRootIndexPage as renderRootIndexPage_1, renderModulePage as renderModulePage_1, renderNamespacePage as renderNamespacePage_1, renderEntityPage as renderEntityPage_1 } from "./Render/Pages.js";
3
3
  import { uncurry2 } from "./fable_modules/fable-library-js.5.0.0-rc.7/Util.js";
4
4
 
5
- export const renderEntityPage = (htmlLinkGen) => ((entity) => ((parentModule) => renderEntityPage_1(uncurry2(htmlLinkGen), entity, parentModule)));
5
+ export const renderEntityPage = (htmlLinkGen) => ((entity) => ((parentModule) => ((companionModule) => renderEntityPage_1(uncurry2(htmlLinkGen), entity, parentModule, companionModule))));
6
6
 
7
7
  export const renderNamespacePage = (htmlLinkGen) => ((ns) => ((subNamespaces) => ((entities) => ((modules) => renderNamespacePage_1(uncurry2(htmlLinkGen), ns, subNamespaces, entities, modules)))));
8
8
 
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starlight-fsharp-oracle",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dist/Plugin.js",
@@ -21,17 +21,18 @@
21
21
  "Directory.Build.props",
22
22
  "Directory.Packages.props"
23
23
  ],
24
+ "scripts": {
25
+ "postinstall": "dotnet publish packages/FSharp.Oracle/FSharp.Oracle.fsproj -c Release --nologo -o oracle-bin",
26
+ "prepack": "dotnet fable packages/Starlight.FSharp.Oracle/ --outDir dist --noCache && rm dist/fable_modules/.gitignore"
27
+ },
24
28
  "peerDependencies": {
25
29
  "@astrojs/starlight": ">= 0.38.0",
26
30
  "astro-expressive-code": ">= 0.38.0"
27
31
  },
28
32
  "devDependencies": {
29
33
  "@hideoo/tsconfig": "^2.0.3",
30
- "@types/node": "^25.6.0",
31
- "astro-expressive-code": "^0.41.7",
32
- "typescript": "^5.8.0"
33
- },
34
- "scripts": {
35
- "postinstall": "dotnet publish packages/FSharp.Oracle/FSharp.Oracle.fsproj -c Release --nologo -o oracle-bin"
34
+ "@types/node": "^26.1.1",
35
+ "astro-expressive-code": "^0.44.1",
36
+ "typescript": "^7.0.2"
36
37
  }
37
- }
38
+ }
@@ -18,6 +18,7 @@ open FSharp.Oracle.ModuleExtractor
18
18
  let extractAssembly
19
19
  (checker: FSharpChecker)
20
20
  (allDllPaths: string array)
21
+ (basePath: string)
21
22
  (outputBase: string)
22
23
  (dllPath: string)
23
24
  : Assembly
@@ -27,7 +28,11 @@ let extractAssembly
27
28
  // Strip F# generic arity suffix (e.g. Tree`1 -> tree)
28
29
  System.Text.RegularExpressions.Regex.Replace(sanitized, @"`\d+$", "")
29
30
 
30
- let toUrl (fullName: string) = $"/{outputBase}/{toSlug fullName}"
31
+ // Astro's site `base` (e.g. "/my-repo") must prefix in-content links; a bare
32
+ // "/" or empty base normalizes to no prefix.
33
+ let normalizedBase = basePath.TrimEnd('/')
34
+
35
+ let toUrl (fullName: string) = $"{normalizedBase}/{outputBase}/{toSlug fullName}"
31
36
 
32
37
  let baseOptions, _ =
33
38
  checker.GetProjectOptionsFromScript(
@@ -502,19 +502,50 @@ module internal EntityExtractor =
502
502
  }
503
503
 
504
504
  elif entity.IsEnum then
505
- let fields = entity.FSharpFields |> Seq.map (extractField toUrl docs) |> Seq.toList
505
+ // Enums carry a synthetic `value__` instance field (the underlying
506
+ // storage). Keep only the named literal members (the actual cases).
507
+ let enumValueNodes (f: FSharpField) =
508
+ match f.LiteralValue with
509
+ | Some value ->
510
+ [
511
+ TextNode.Space
512
+ TextNode.Equal
513
+ TextNode.Space
514
+ TextNode.Text(string value)
515
+ ]
516
+ | None -> []
517
+
518
+ let fields =
519
+ entity.FSharpFields
520
+ |> Seq.filter (fun f -> f.Name <> "value__")
521
+ |> Seq.map (fun f ->
522
+ let baseField = extractField toUrl docs f
523
+
524
+ // Render each case as `Name = value` rather than the useless
525
+ // `Name : underlyingType` the generic field extractor produces.
526
+ // The case name is styled as a property (blue), like record fields.
527
+ { baseField with
528
+ Declaration =
529
+ TextNode.Node(
530
+ TextNode.AnchoredProperty(f.Name, $"#{f.Name}") :: enumValueNodes f
531
+ )
532
+ }
533
+ )
534
+ |> Seq.toList
506
535
 
507
536
  let caseNodes =
508
- fields
509
- |> List.collect (fun f ->
537
+ Seq.zip (entity.FSharpFields |> Seq.filter (fun f -> f.Name <> "value__")) fields
538
+ |> Seq.collect (fun (fcsField, f) ->
510
539
  [
511
540
  TextNode.NewLine
512
541
  TextNode.Spaces 4
513
542
  TextNode.Keyword "|"
514
543
  TextNode.Space
515
- TextNode.Text f.Name
544
+ TextNode.AnchoredProperty(f.Name, $"#{f.Name}")
545
+ yield! enumValueNodes fcsField
516
546
  ]
517
547
  )
548
+ |> Seq.toList
518
549
 
519
550
  let declaration =
520
551
  TextNode.Node
@@ -9,13 +9,14 @@ open Thoth.Json.Core.Auto
9
9
 
10
10
  [<EntryPoint>]
11
11
  let main argv =
12
- let rec parseArgs outputBase dlls =
12
+ let rec parseArgs outputBase basePath dlls =
13
13
  function
14
- | "--output-base" :: value :: rest -> parseArgs value dlls rest
15
- | path :: rest -> parseArgs outputBase (path :: dlls) rest
16
- | [] -> outputBase, List.rev dlls |> List.toArray
14
+ | "--output-base" :: value :: rest -> parseArgs value basePath dlls rest
15
+ | "--base" :: value :: rest -> parseArgs outputBase value dlls rest
16
+ | path :: rest -> parseArgs outputBase basePath (path :: dlls) rest
17
+ | [] -> outputBase, basePath, List.rev dlls |> List.toArray
17
18
 
18
- let outputBase, dllPaths = parseArgs "api" [] (argv |> Array.toList)
19
+ let outputBase, basePath, dllPaths = parseArgs "api" "" [] (argv |> Array.toList)
19
20
 
20
21
  match dllPaths with
21
22
  | [||] ->
@@ -48,7 +49,7 @@ let main argv =
48
49
 
49
50
  let assemblies =
50
51
  dllPaths
51
- |> Array.map (extractAssembly checker allDllPaths outputBase)
52
+ |> Array.map (extractAssembly checker allDllPaths basePath outputBase)
52
53
  |> Array.toList
53
54
 
54
55
  let root =
@@ -1,3 +0,0 @@
1
- namespace Microsoft.BuildSettings
2
- [<System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName=".NET 10.0")>]
3
- do ()
@@ -1,17 +0,0 @@
1
- // <auto-generated>
2
- // Generated by the FSharp WriteCodeFragment class.
3
- // </auto-generated>
4
- namespace FSharp
5
-
6
- open System
7
- open System.Reflection
8
-
9
-
10
- [<assembly: System.Reflection.AssemblyCompanyAttribute("Maxime Mangel")>]
11
- [<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
12
- [<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13
- [<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f31138d32fcf52eeae38e3ddc3a7f7d85a4b2282")>]
14
- [<assembly: System.Reflection.AssemblyProductAttribute("Oracle")>]
15
- [<assembly: System.Reflection.AssemblyTitleAttribute("Oracle")>]
16
- [<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
17
- do()
@@ -1,3 +0,0 @@
1
- namespace Microsoft.BuildSettings
2
- [<System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName=".NET 10.0")>]
3
- do ()
@@ -1,17 +0,0 @@
1
- // <auto-generated>
2
- // Generated by the FSharp WriteCodeFragment class.
3
- // </auto-generated>
4
- namespace FSharp
5
-
6
- open System
7
- open System.Reflection
8
-
9
-
10
- [<assembly: System.Reflection.AssemblyCompanyAttribute("Maxime Mangel")>]
11
- [<assembly: System.Reflection.AssemblyConfigurationAttribute("Release")>]
12
- [<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13
- [<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1b716c695b7f73a88a6ebd13af6637880f9c0325")>]
14
- [<assembly: System.Reflection.AssemblyProductAttribute("Oracle")>]
15
- [<assembly: System.Reflection.AssemblyTitleAttribute("Oracle")>]
16
- [<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
17
- do()
@@ -1,3 +0,0 @@
1
- namespace Microsoft.BuildSettings
2
- [<System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName=".NET 10.0")>]
3
- do ()
@@ -1,17 +0,0 @@
1
- // <auto-generated>
2
- // Generated by the FSharp WriteCodeFragment class.
3
- // </auto-generated>
4
- namespace FSharp
5
-
6
- open System
7
- open System.Reflection
8
-
9
-
10
- [<assembly: System.Reflection.AssemblyCompanyAttribute("Maxime Mangel")>]
11
- [<assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")>]
12
- [<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13
- [<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f31138d32fcf52eeae38e3ddc3a7f7d85a4b2282")>]
14
- [<assembly: System.Reflection.AssemblyProductAttribute("FSharp.Oracle.Schema")>]
15
- [<assembly: System.Reflection.AssemblyTitleAttribute("FSharp.Oracle.Schema")>]
16
- [<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
17
- do()
@@ -1,3 +0,0 @@
1
- namespace Microsoft.BuildSettings
2
- [<System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName=".NET 10.0")>]
3
- do ()
@@ -1,17 +0,0 @@
1
- // <auto-generated>
2
- // Generated by the FSharp WriteCodeFragment class.
3
- // </auto-generated>
4
- namespace FSharp
5
-
6
- open System
7
- open System.Reflection
8
-
9
-
10
- [<assembly: System.Reflection.AssemblyCompanyAttribute("Maxime Mangel")>]
11
- [<assembly: System.Reflection.AssemblyConfigurationAttribute("Release")>]
12
- [<assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")>]
13
- [<assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+004b2222784b8ccac32bf46e91832b4f92d55505")>]
14
- [<assembly: System.Reflection.AssemblyProductAttribute("FSharp.Oracle.Schema")>]
15
- [<assembly: System.Reflection.AssemblyTitleAttribute("FSharp.Oracle.Schema")>]
16
- [<assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")>]
17
- do()