starlight-fsharp-oracle 0.1.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 (89) hide show
  1. package/Directory.Build.props +25 -0
  2. package/Directory.Packages.props +18 -0
  3. package/README.md +80 -0
  4. package/dist/Extensions/StringBuilder.js +28 -0
  5. package/dist/Extensions/TextNode.js +115 -0
  6. package/dist/FSharp.Oracle.Schema/Schema.js +674 -0
  7. package/dist/Generate.js +254 -0
  8. package/dist/Helpers.js +69 -0
  9. package/dist/Plugin.js +139 -0
  10. package/dist/Render/Documentation.js +87 -0
  11. package/dist/Render/Entries.js +148 -0
  12. package/dist/Render/Pages.js +292 -0
  13. package/dist/Render/Primitives.js +114 -0
  14. package/dist/Render/Types.js +30 -0
  15. package/dist/Render.js +12 -0
  16. package/dist/Themes.js +78 -0
  17. package/oracle-bin/FSharp.Compiler.Service.dll +0 -0
  18. package/oracle-bin/FSharp.Core.dll +0 -0
  19. package/oracle-bin/FSharp.DependencyManager.Nuget.dll +0 -0
  20. package/oracle-bin/FSharp.Oracle.Schema.dll +0 -0
  21. package/oracle-bin/FSharp.Oracle.Schema.pdb +0 -0
  22. package/oracle-bin/FSharp.Oracle.Schema.xml +219 -0
  23. package/oracle-bin/Fable.Core.dll +0 -0
  24. package/oracle-bin/Oracle +0 -0
  25. package/oracle-bin/Oracle.deps.json +280 -0
  26. package/oracle-bin/Oracle.dll +0 -0
  27. package/oracle-bin/Oracle.pdb +0 -0
  28. package/oracle-bin/Oracle.runtimeconfig.json +13 -0
  29. package/oracle-bin/Oracle.xml +111 -0
  30. package/oracle-bin/Thoth.Json.Core.Auto.dll +0 -0
  31. package/oracle-bin/Thoth.Json.Core.dll +0 -0
  32. package/oracle-bin/Thoth.Json.System.Text.Json.dll +0 -0
  33. package/oracle-bin/cs/FSharp.Compiler.Service.resources.dll +0 -0
  34. package/oracle-bin/cs/FSharp.Core.resources.dll +0 -0
  35. package/oracle-bin/cs/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  36. package/oracle-bin/de/FSharp.Compiler.Service.resources.dll +0 -0
  37. package/oracle-bin/de/FSharp.Core.resources.dll +0 -0
  38. package/oracle-bin/de/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  39. package/oracle-bin/es/FSharp.Compiler.Service.resources.dll +0 -0
  40. package/oracle-bin/es/FSharp.Core.resources.dll +0 -0
  41. package/oracle-bin/es/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  42. package/oracle-bin/fr/FSharp.Compiler.Service.resources.dll +0 -0
  43. package/oracle-bin/fr/FSharp.Core.resources.dll +0 -0
  44. package/oracle-bin/fr/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  45. package/oracle-bin/it/FSharp.Compiler.Service.resources.dll +0 -0
  46. package/oracle-bin/it/FSharp.Core.resources.dll +0 -0
  47. package/oracle-bin/it/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  48. package/oracle-bin/ja/FSharp.Compiler.Service.resources.dll +0 -0
  49. package/oracle-bin/ja/FSharp.Core.resources.dll +0 -0
  50. package/oracle-bin/ja/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  51. package/oracle-bin/ko/FSharp.Compiler.Service.resources.dll +0 -0
  52. package/oracle-bin/ko/FSharp.Core.resources.dll +0 -0
  53. package/oracle-bin/ko/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  54. package/oracle-bin/pl/FSharp.Compiler.Service.resources.dll +0 -0
  55. package/oracle-bin/pl/FSharp.Core.resources.dll +0 -0
  56. package/oracle-bin/pl/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  57. package/oracle-bin/pt-BR/FSharp.Compiler.Service.resources.dll +0 -0
  58. package/oracle-bin/pt-BR/FSharp.Core.resources.dll +0 -0
  59. package/oracle-bin/pt-BR/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  60. package/oracle-bin/ru/FSharp.Compiler.Service.resources.dll +0 -0
  61. package/oracle-bin/ru/FSharp.Core.resources.dll +0 -0
  62. package/oracle-bin/ru/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  63. package/oracle-bin/tr/FSharp.Compiler.Service.resources.dll +0 -0
  64. package/oracle-bin/tr/FSharp.Core.resources.dll +0 -0
  65. package/oracle-bin/tr/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  66. package/oracle-bin/zh-Hans/FSharp.Compiler.Service.resources.dll +0 -0
  67. package/oracle-bin/zh-Hans/FSharp.Core.resources.dll +0 -0
  68. package/oracle-bin/zh-Hans/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  69. package/oracle-bin/zh-Hant/FSharp.Compiler.Service.resources.dll +0 -0
  70. package/oracle-bin/zh-Hant/FSharp.Core.resources.dll +0 -0
  71. package/oracle-bin/zh-Hant/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  72. package/package.json +38 -0
  73. package/packages/FSharp.Oracle/Extractor/Assembly.fs +160 -0
  74. package/packages/FSharp.Oracle/Extractor/EntityExtractor.fs +608 -0
  75. package/packages/FSharp.Oracle/Extractor/Helpers.fs +150 -0
  76. package/packages/FSharp.Oracle/Extractor/MemberExtractor.fs +172 -0
  77. package/packages/FSharp.Oracle/Extractor/ModuleExtractor.fs +45 -0
  78. package/packages/FSharp.Oracle/Extractor/ParameterExtractor.fs +47 -0
  79. package/packages/FSharp.Oracle/Extractor/SignatureRendering.fs +464 -0
  80. package/packages/FSharp.Oracle/Extractor/ValueExtractor.fs +171 -0
  81. package/packages/FSharp.Oracle/FSharp.Oracle.fsproj +36 -0
  82. package/packages/FSharp.Oracle/Program.fs +66 -0
  83. package/packages/FSharp.Oracle/XmlDoc.fs +463 -0
  84. package/packages/FSharp.Oracle.Schema/FSharp.Oracle.Schema.fsproj +16 -0
  85. package/packages/FSharp.Oracle.Schema/Schema.fs +454 -0
  86. package/packages/Starlight.FSharp.Oracle/components/DocEntry.astro +256 -0
  87. package/packages/Starlight.FSharp.Oracle/components/FSharpDocPage.astro +121 -0
  88. package/packages/Starlight.FSharp.Oracle/components/fsharp-doc.css +58 -0
  89. package/packages/Starlight.FSharp.Oracle/layouts/FSharpDocLayout.astro +27 -0
@@ -0,0 +1,111 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <doc>
3
+ <assembly><name>Oracle</name></assembly>
4
+ <members>
5
+ <member name="M:Oracle.XmlDoc.moduleDocOf(Microsoft.FSharp.Collections.FSharpMap{System.String,System.String},System.String)">
6
+ <summary>
7
+ Look up just the summary for a module-level signature.
8
+ Used for Module.XmlDoc which is stored as a plain string in the IR.
9
+ </summary>
10
+ </member>
11
+ <member name="M:Oracle.XmlDoc.xmlDocOf(Microsoft.FSharp.Collections.FSharpMap{System.String,System.String},System.String)">
12
+ <summary>
13
+ Look up and parse the XML doc for a given member signature.
14
+ Returns an empty XmlDoc when the signature is not found in the map.
15
+ </summary>
16
+ </member>
17
+ <member name="M:Oracle.XmlDoc.loadXmlDocFile(System.String)">
18
+ <summary>
19
+ Load the XML documentation file that lives next to a compiled DLL and
20
+ return a lookup map from the standard XML-doc member ID (e.g.
21
+ &quot;M:My.Namespace.func(System.Int32)&quot;) to the inner XML content of that
22
+ &lt;member&gt; element.
23
+ </summary>
24
+ </member>
25
+ <member name="M:Oracle.XmlDoc.fixXmlAttributeChars(System.String)">
26
+ <summary>
27
+ Escape `&lt;` and `&gt;` characters that appear inside XML attribute values.
28
+ The F# compiler sometimes generates invalid XML for anonymous record
29
+ type signatures (e.g. `name=&quot;M:Foo(&lt;&gt;f__AnonymousType...)`).
30
+ </summary>
31
+ </member>
32
+ <member name="M:Oracle.XmlDoc.parseXmlContent(System.String)">
33
+ <summary>
34
+ Parse the inner XML content of a &lt;member&gt; element into the structured
35
+ XmlDoc IR type, with all inline tags converted to Markdown.
36
+ </summary>
37
+ </member>
38
+ <member name="M:FSharp.Oracle.Helpers.resolveCref(Microsoft.FSharp.Core.FSharpFunc{System.String,System.String},System.String)">
39
+ <summary>
40
+ Resolves XML-doc &lt;see cref=&quot;...&quot;/&gt; strings to page URLs.
41
+ cref format: T:Namespace.Type or M:Namespace.Type.Member(...)
42
+ </summary>
43
+ </member>
44
+ <member name="P:FSharp.Oracle.Helpers.postfixTypeNames">
45
+ <summary>
46
+ Full names for types that conventionally use postfix syntax in F#.
47
+ </summary>
48
+ </member>
49
+ <member name="P:FSharp.Oracle.Helpers.postfixTypeDisplayNames">
50
+ <summary>
51
+ Display names for types that conventionally use postfix syntax in F#.
52
+ </summary>
53
+ </member>
54
+ <member name="M:FSharp.Oracle.Helpers.isSrtp(FSharp.Compiler.Symbols.FSharpGenericParameter)">
55
+ <summary>
56
+ True for SRTP parameters (have member/static-member constraints).
57
+ </summary>
58
+ </member>
59
+ <member name="M:FSharp.Oracle.Helpers.safeFullName(FSharp.Compiler.Symbols.FSharpEntity)">
60
+ <summary>
61
+ Compute a safe FullName for any entity.
62
+ Type abbreviations for primitives (e.g. `type Meters = float`) throw on FullName;
63
+ fall back to constructing it from Namespace + DisplayName.
64
+ </summary>
65
+ </member>
66
+ <member name="M:FSharp.Oracle.Helpers.tryGetFullName(FSharp.Compiler.Symbols.FSharpEntity)">
67
+ <summary>
68
+ Try to get FullName from a FSharpEntity; returns None for primitives
69
+ like &apos;string&apos;, &apos;int&apos; that are F# type abbreviations with no qualified name.
70
+ </summary>
71
+ </member>
72
+ <member name="M:FSharp.Oracle.Helpers.namespaceOf(System.String)">
73
+ <summary>
74
+ Returns everything before the last dot, e.g. &quot;A.B.C&quot; → &quot;A.B&quot;.
75
+ Returns &quot;&quot; for unqualified names.
76
+ </summary>
77
+ </member>
78
+ <member name="M:FSharp.Oracle.SignatureRendering.stripGenericParamBrackets(Microsoft.FSharp.Core.FSharpOption{FSharp.Oracle.Schema.TextNode})">
79
+ <summary>
80
+ Strip `&lt;`, `&gt;` and the leading type variable from a generic-parameter list,
81
+ returning only the constraint clause (e.g. ` when &apos;T : comparison`).
82
+ Used to append constraints after a value/member signature.
83
+ </summary>
84
+ </member>
85
+ <member name="M:FSharp.Oracle.SignatureRendering.renderGenericParams(Microsoft.FSharp.Core.FSharpFunc{System.String,System.String},System.Collections.Generic.IEnumerable{FSharp.Compiler.Symbols.FSharpGenericParameter})">
86
+ <summary>
87
+ Render the generic-parameter list for a function or member, e.g.
88
+ `&lt;&apos;T when &apos;T : comparison&gt;` or `&lt;^T when ^T : (static member (+) : ^T * ^T -&gt; ^T)&gt;`.
89
+ Returns `None` when there are no parameters.
90
+ </summary>
91
+ </member>
92
+ <member name="M:FSharp.Oracle.SignatureRendering.renderConstraint(Microsoft.FSharp.Core.FSharpFunc{System.String,System.String},FSharp.Compiler.Symbols.FSharpGenericParameter,FSharp.Compiler.Symbols.FSharpGenericParameterConstraint)">
93
+ <summary>
94
+ Render a single generic parameter constraint as a TextNode list.
95
+ </summary>
96
+ </member>
97
+ <member name="M:FSharp.Oracle.MemberExtractor.buildMemberDeclaration(FSharp.Oracle.Schema.MemberKind,System.String,System.Boolean,System.Boolean,Microsoft.FSharp.Collections.FSharpList{Microsoft.FSharp.Collections.FSharpList{FSharp.Oracle.Schema.Parameter}},FSharp.Oracle.Schema.TextNode,FSharp.Oracle.Schema.TextNode)">
98
+ <summary>
99
+ Builds the signature TextNode for the per-member DocEntry slot (no anchors, no indentation).
100
+ This is the pre-computed Declaration stored on Member.
101
+ </summary>
102
+ </member>
103
+ <member name="M:FSharp.Oracle.Extractor.extractAssembly(FSharp.Compiler.CodeAnalysis.FSharpChecker,System.String[],System.String,System.String)">
104
+ <summary>
105
+ Extract the JSON IR for a single compiled .dll + optional .xml doc file.
106
+ The checker must have already been created with [allDllPaths] as references
107
+ so cross-assembly resolution works.
108
+ </summary>
109
+ </member>
110
+ </members>
111
+ </doc>
Binary file
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "starlight-fsharp-oracle",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./dist/Plugin.js",
7
+ "./components/DocEntry.astro": "./packages/Starlight.FSharp.Oracle/components/DocEntry.astro",
8
+ "./components/FSharpDocPage.astro": "./packages/Starlight.FSharp.Oracle/components/FSharpDocPage.astro",
9
+ "./layouts/FSharpDocLayout.astro": "./packages/Starlight.FSharp.Oracle/layouts/FSharpDocLayout.astro"
10
+ },
11
+ "files": [
12
+ "dist/**/*",
13
+ "oracle-bin/",
14
+ "packages/FSharp.Oracle/**/*.fs",
15
+ "!packages/FSharp.Oracle/obj",
16
+ "packages/FSharp.Oracle/*.fsproj",
17
+ "packages/FSharp.Oracle.Schema/**/*.fs",
18
+ "!packages/FSharp.Oracle.Schema/obj",
19
+ "packages/FSharp.Oracle.Schema/*.fsproj",
20
+ "packages/Starlight.FSharp.Oracle/components/",
21
+ "packages/Starlight.FSharp.Oracle/layouts/",
22
+ "Directory.Build.props",
23
+ "Directory.Packages.props"
24
+ ],
25
+ "scripts": {
26
+ "postinstall": "dotnet publish packages/FSharp.Oracle/FSharp.Oracle.fsproj -c Release --nologo -o oracle-bin"
27
+ },
28
+ "peerDependencies": {
29
+ "@astrojs/starlight": ">= 0.38.0",
30
+ "astro-expressive-code": ">= 0.38.0"
31
+ },
32
+ "devDependencies": {
33
+ "@hideoo/tsconfig": "^2.0.3",
34
+ "@types/node": "^25.6.0",
35
+ "astro-expressive-code": "^0.41.7",
36
+ "typescript": "^5.8.0"
37
+ }
38
+ }
@@ -0,0 +1,160 @@
1
+ module FSharp.Oracle.Extractor
2
+
3
+ open FSharp.Compiler.CodeAnalysis
4
+ open FSharp.Compiler.Symbols
5
+ open FSharp.Oracle.Schema
6
+ open Oracle.XmlDoc
7
+ open FSharp.Oracle.Helpers
8
+ open FSharp.Oracle.EntityExtractor
9
+ open FSharp.Oracle.ModuleExtractor
10
+
11
+ // ---------------------------------------------------------------------------
12
+ // Public entry point
13
+ // ---------------------------------------------------------------------------
14
+
15
+ /// Extract the JSON IR for a single compiled .dll + optional .xml doc file.
16
+ /// The checker must have already been created with [allDllPaths] as references
17
+ /// so cross-assembly resolution works.
18
+ let extractAssembly
19
+ (checker: FSharpChecker)
20
+ (allDllPaths: string array)
21
+ (outputBase: string)
22
+ (dllPath: string)
23
+ : Assembly
24
+ =
25
+ let toSlug (name: string) =
26
+ let sanitized = name.ToLowerInvariant().Replace(".", "-")
27
+ // Strip F# generic arity suffix (e.g. Tree`1 -> tree)
28
+ System.Text.RegularExpressions.Regex.Replace(sanitized, @"`\d+$", "")
29
+
30
+ let toUrl (fullName: string) = $"/{outputBase}/{toSlug fullName}"
31
+
32
+ let baseOptions, _ =
33
+ checker.GetProjectOptionsFromScript(
34
+ "dummy.fsx",
35
+ FSharp.Compiler.Text.SourceText.ofString ""
36
+ )
37
+ |> Async.RunSynchronously
38
+
39
+ // Reference every DLL so FCS can resolve cross-assembly dependencies.
40
+ let projectOptions =
41
+ { baseOptions with
42
+ OtherOptions =
43
+ [|
44
+ yield! baseOptions.OtherOptions
45
+ for path in allDllPaths do
46
+ $"-r:{path}"
47
+ |]
48
+ }
49
+
50
+ // Load the assembly via FCS reflection
51
+ let fsharpAssembly =
52
+ checker.ParseAndCheckProject(projectOptions)
53
+ |> Async.RunSynchronously
54
+ // Walk the resolved assemblies to find the target dll
55
+ |> fun results ->
56
+ let targetName = System.IO.Path.GetFileNameWithoutExtension(dllPath)
57
+
58
+ results.ProjectContext.GetReferencedAssemblies()
59
+ |> List.tryFind (fun a -> a.SimpleName = targetName)
60
+
61
+ match fsharpAssembly with
62
+ | None -> failwithf "Could not load assembly: %s" dllPath
63
+ | Some asm ->
64
+ let docs = loadXmlDocFile dllPath
65
+
66
+ // Recursively collect a module and all its nested sub-modules as
67
+ // separate pages (each sub-module becomes its own page).
68
+ let rec collectModulePages (entity: FSharpEntity) : Module list =
69
+ let thisPage = extractModule toUrl docs entity
70
+
71
+ let subPages =
72
+ entity.NestedEntities
73
+ |> Seq.filter (fun e -> e.IsFSharpModule)
74
+ |> Seq.collect collectModulePages
75
+ |> Seq.toList
76
+
77
+ thisPage :: subPages
78
+
79
+ // All pages that come from module entities (including sub-modules).
80
+ let modulePages =
81
+ asm.Contents.Entities
82
+ |> Seq.filter (fun e -> e.IsFSharpModule)
83
+ |> Seq.collect collectModulePages
84
+ |> Seq.toList
85
+
86
+ // Bare types at the assembly root that live in a namespace but are not
87
+ // inside any module (e.g. record/union types declared directly in a
88
+ // namespace declaration). Group them by their namespace and emit one
89
+ // synthetic module page per namespace.
90
+ let syntheticPages =
91
+ asm.Contents.Entities
92
+ |> Seq.filter (fun e ->
93
+ not e.IsFSharpModule && not e.IsNamespace && not e.IsArrayType && not e.IsByRef
94
+ )
95
+ |> Seq.groupBy (fun e -> namespaceOf (safeFullName e))
96
+ |> Seq.map (fun (ns, entities) ->
97
+ {
98
+ Name = "global"
99
+ FullName = ns + ".global"
100
+ Namespace = ns
101
+ XmlDoc = None
102
+ Entities = entities |> Seq.map (extractEntity toUrl docs) |> Seq.toList
103
+ Functions = []
104
+ Values = []
105
+ IsSynthetic = true
106
+ ObsoleteInfo = ObsoleteInfo.Active
107
+ }
108
+ )
109
+ |> Seq.toList
110
+
111
+ let rec collectFcsNamespaces (entity: FSharpEntity) : string list =
112
+ if entity.IsNamespace then
113
+ let nested = entity.NestedEntities |> Seq.collect collectFcsNamespaces |> Seq.toList
114
+ entity.FullName :: nested
115
+ else
116
+ []
117
+
118
+ let allModules = modulePages @ syntheticPages
119
+
120
+ let namespaceNames =
121
+ [
122
+ yield! asm.Contents.Entities |> Seq.collect collectFcsNamespaces
123
+
124
+ yield!
125
+ allModules
126
+ |> List.map (fun m -> m.Namespace)
127
+ |> List.filter (fun ns -> ns <> "")
128
+ ]
129
+ |> List.distinct
130
+ |> List.sort
131
+
132
+ let namespaces =
133
+ [
134
+ // "global" if any module has no namespace
135
+ if allModules |> List.exists (fun m -> m.Namespace = "") then
136
+ {
137
+ Name = "global"
138
+ FullName = ""
139
+ }
140
+
141
+ for ns in namespaceNames do
142
+ let name =
143
+ let lastDot = ns.LastIndexOf('.')
144
+
145
+ if lastDot < 0 then
146
+ ns
147
+ else
148
+ ns.[lastDot + 1 ..]
149
+
150
+ {
151
+ Name = name
152
+ FullName = ns
153
+ }
154
+ ]
155
+
156
+ {
157
+ Name = asm.SimpleName
158
+ Namespaces = namespaces
159
+ Modules = allModules
160
+ }