@dogsbay/format-mkdocs 0.2.0-beta.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 (145) hide show
  1. package/dist/autodoc/markdown-generator.d.ts +6 -0
  2. package/dist/autodoc/markdown-generator.d.ts.map +1 -0
  3. package/dist/autodoc/markdown-generator.js +242 -0
  4. package/dist/autodoc/markdown-generator.js.map +1 -0
  5. package/dist/autodoc/module-resolver.d.ts +8 -0
  6. package/dist/autodoc/module-resolver.d.ts.map +1 -0
  7. package/dist/autodoc/module-resolver.js +218 -0
  8. package/dist/autodoc/module-resolver.js.map +1 -0
  9. package/dist/autodoc/python-docstring.d.ts +7 -0
  10. package/dist/autodoc/python-docstring.d.ts.map +1 -0
  11. package/dist/autodoc/python-docstring.js +324 -0
  12. package/dist/autodoc/python-docstring.js.map +1 -0
  13. package/dist/autodoc/python-parser.d.ts +10 -0
  14. package/dist/autodoc/python-parser.d.ts.map +1 -0
  15. package/dist/autodoc/python-parser.js +541 -0
  16. package/dist/autodoc/python-parser.js.map +1 -0
  17. package/dist/autodoc/tree-builder.d.ts +9 -0
  18. package/dist/autodoc/tree-builder.d.ts.map +1 -0
  19. package/dist/autodoc/tree-builder.js +279 -0
  20. package/dist/autodoc/tree-builder.js.map +1 -0
  21. package/dist/autodoc/types.d.ts +128 -0
  22. package/dist/autodoc/types.d.ts.map +1 -0
  23. package/dist/autodoc/types.js +2 -0
  24. package/dist/autodoc/types.js.map +1 -0
  25. package/dist/cli.d.ts +3 -0
  26. package/dist/cli.d.ts.map +1 -0
  27. package/dist/cli.js +32 -0
  28. package/dist/cli.js.map +1 -0
  29. package/dist/export/to-astro.d.ts +26 -0
  30. package/dist/export/to-astro.d.ts.map +1 -0
  31. package/dist/export/to-astro.js +551 -0
  32. package/dist/export/to-astro.js.map +1 -0
  33. package/dist/export/to-mkdocs-project.d.ts +27 -0
  34. package/dist/export/to-mkdocs-project.d.ts.map +1 -0
  35. package/dist/export/to-mkdocs-project.js +192 -0
  36. package/dist/export/to-mkdocs-project.js.map +1 -0
  37. package/dist/export/to-mkdocs.d.ts +6 -0
  38. package/dist/export/to-mkdocs.d.ts.map +1 -0
  39. package/dist/export/to-mkdocs.js +178 -0
  40. package/dist/export/to-mkdocs.js.map +1 -0
  41. package/dist/importer.d.ts +30 -0
  42. package/dist/importer.d.ts.map +1 -0
  43. package/dist/importer.js +376 -0
  44. package/dist/importer.js.map +1 -0
  45. package/dist/index.d.ts +57 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +170 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/inline-walker.d.ts +17 -0
  50. package/dist/inline-walker.d.ts.map +1 -0
  51. package/dist/inline-walker.js +167 -0
  52. package/dist/inline-walker.js.map +1 -0
  53. package/dist/loader.d.ts +42 -0
  54. package/dist/loader.d.ts.map +1 -0
  55. package/dist/loader.js +765 -0
  56. package/dist/loader.js.map +1 -0
  57. package/dist/parse.d.ts +12 -0
  58. package/dist/parse.d.ts.map +1 -0
  59. package/dist/parse.js +46 -0
  60. package/dist/parse.js.map +1 -0
  61. package/dist/renderers/mermaid.d.ts +9 -0
  62. package/dist/renderers/mermaid.d.ts.map +1 -0
  63. package/dist/renderers/mermaid.js +117 -0
  64. package/dist/renderers/mermaid.js.map +1 -0
  65. package/dist/rules/admonition.d.ts +6 -0
  66. package/dist/rules/admonition.d.ts.map +1 -0
  67. package/dist/rules/admonition.js +73 -0
  68. package/dist/rules/admonition.js.map +1 -0
  69. package/dist/rules/annotations.d.ts +6 -0
  70. package/dist/rules/annotations.d.ts.map +1 -0
  71. package/dist/rules/annotations.js +57 -0
  72. package/dist/rules/annotations.js.map +1 -0
  73. package/dist/rules/autodoc.d.ts +7 -0
  74. package/dist/rules/autodoc.d.ts.map +1 -0
  75. package/dist/rules/autodoc.js +102 -0
  76. package/dist/rules/autodoc.js.map +1 -0
  77. package/dist/rules/blocks.d.ts +6 -0
  78. package/dist/rules/blocks.d.ts.map +1 -0
  79. package/dist/rules/blocks.js +172 -0
  80. package/dist/rules/blocks.js.map +1 -0
  81. package/dist/rules/content-tabs.d.ts +6 -0
  82. package/dist/rules/content-tabs.d.ts.map +1 -0
  83. package/dist/rules/content-tabs.js +67 -0
  84. package/dist/rules/content-tabs.js.map +1 -0
  85. package/dist/rules/docusaurus-admonitions.d.ts +7 -0
  86. package/dist/rules/docusaurus-admonitions.d.ts.map +1 -0
  87. package/dist/rules/docusaurus-admonitions.js +101 -0
  88. package/dist/rules/docusaurus-admonitions.js.map +1 -0
  89. package/dist/rules/file-include.d.ts +28 -0
  90. package/dist/rules/file-include.d.ts.map +1 -0
  91. package/dist/rules/file-include.js +198 -0
  92. package/dist/rules/file-include.js.map +1 -0
  93. package/dist/rules/footnotes.d.ts +6 -0
  94. package/dist/rules/footnotes.d.ts.map +1 -0
  95. package/dist/rules/footnotes.js +161 -0
  96. package/dist/rules/footnotes.js.map +1 -0
  97. package/dist/rules/icon-shortcode.d.ts +30 -0
  98. package/dist/rules/icon-shortcode.d.ts.map +1 -0
  99. package/dist/rules/icon-shortcode.js +169 -0
  100. package/dist/rules/icon-shortcode.js.map +1 -0
  101. package/dist/rules/keys.d.ts +6 -0
  102. package/dist/rules/keys.d.ts.map +1 -0
  103. package/dist/rules/keys.js +30 -0
  104. package/dist/rules/keys.js.map +1 -0
  105. package/dist/rules/link-rewrite.d.ts +7 -0
  106. package/dist/rules/link-rewrite.d.ts.map +1 -0
  107. package/dist/rules/link-rewrite.js +93 -0
  108. package/dist/rules/link-rewrite.js.map +1 -0
  109. package/dist/rules/math.d.ts +14 -0
  110. package/dist/rules/math.d.ts.map +1 -0
  111. package/dist/rules/math.js +114 -0
  112. package/dist/rules/math.js.map +1 -0
  113. package/dist/rules/md-in-html.d.ts +6 -0
  114. package/dist/rules/md-in-html.d.ts.map +1 -0
  115. package/dist/rules/md-in-html.js +135 -0
  116. package/dist/rules/md-in-html.js.map +1 -0
  117. package/dist/rules/snippets.d.ts +10 -0
  118. package/dist/rules/snippets.d.ts.map +1 -0
  119. package/dist/rules/snippets.js +109 -0
  120. package/dist/rules/snippets.js.map +1 -0
  121. package/dist/rules/templates.d.ts +15 -0
  122. package/dist/rules/templates.d.ts.map +1 -0
  123. package/dist/rules/templates.js +105 -0
  124. package/dist/rules/templates.js.map +1 -0
  125. package/dist/rules/variants.d.ts +12 -0
  126. package/dist/rules/variants.d.ts.map +1 -0
  127. package/dist/rules/variants.js +148 -0
  128. package/dist/rules/variants.js.map +1 -0
  129. package/dist/tree.d.ts +2 -0
  130. package/dist/tree.d.ts.map +1 -0
  131. package/dist/tree.js +2 -0
  132. package/dist/tree.js.map +1 -0
  133. package/dist/utils/indent.d.ts +18 -0
  134. package/dist/utils/indent.d.ts.map +1 -0
  135. package/dist/utils/indent.js +56 -0
  136. package/dist/utils/indent.js.map +1 -0
  137. package/dist/utils/types.d.ts +19 -0
  138. package/dist/utils/types.d.ts.map +1 -0
  139. package/dist/utils/types.js +63 -0
  140. package/dist/utils/types.js.map +1 -0
  141. package/dist/walker.d.ts +8 -0
  142. package/dist/walker.d.ts.map +1 -0
  143. package/dist/walker.js +193 -0
  144. package/dist/walker.js.map +1 -0
  145. package/package.json +71 -0
@@ -0,0 +1,6 @@
1
+ import type { SymbolInfo, AutodocDirectiveOptions } from "./types.js";
2
+ /**
3
+ * Generate markdown documentation for a symbol.
4
+ */
5
+ export declare function generateMarkdown(symbol: SymbolInfo, options?: AutodocDirectiveOptions): string;
6
+ //# sourceMappingURL=markdown-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-generator.d.ts","sourceRoot":"","sources":["../../src/autodoc/markdown-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAa,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEjF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAaR"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Generate markdown documentation for a symbol.
3
+ */
4
+ export function generateMarkdown(symbol, options = {}) {
5
+ const level = options.headingLevel ?? 2;
6
+ const lines = [];
7
+ if (symbol.kind === "module") {
8
+ lines.push(...generateModule(symbol, level, options));
9
+ }
10
+ else if (symbol.kind === "class") {
11
+ lines.push(...generateClass(symbol, level, options));
12
+ }
13
+ else {
14
+ lines.push(...generateFunction(symbol, level, options));
15
+ }
16
+ return lines.join("\n");
17
+ }
18
+ function generateModule(symbol, level, options) {
19
+ const lines = [];
20
+ const heading = "#".repeat(level);
21
+ if (options.showRootHeading !== false) {
22
+ lines.push(`${heading} <span class="api-badge api-badge-module">module</span> \`${symbol.name}\``);
23
+ lines.push("");
24
+ }
25
+ if (symbol.docstring) {
26
+ lines.push(symbol.docstring);
27
+ lines.push("");
28
+ }
29
+ const members = filterMembers(symbol.members, options);
30
+ for (const member of members) {
31
+ lines.push(...generateSymbol(member, level + 1, options));
32
+ lines.push("");
33
+ }
34
+ return lines;
35
+ }
36
+ function generateClass(symbol, level, options) {
37
+ const lines = [];
38
+ const heading = "#".repeat(level);
39
+ if (options.showRootHeading !== false) {
40
+ lines.push(`${heading} <span class="api-badge api-badge-class">class</span> \`${symbol.name}\``);
41
+ lines.push("");
42
+ }
43
+ // Class signature — include __init__ params when mergeInitIntoClass
44
+ if (options.separateSignature !== false) {
45
+ lines.push("```python");
46
+ if (options.mergeInitIntoClass !== false && symbol.params.length > 0) {
47
+ // Full signature with all constructor parameters
48
+ const paramLines = symbol.params.map((p) => {
49
+ let s = ` ${p.name}`;
50
+ if (p.bareType || p.type)
51
+ s += `: ${p.bareType || p.type}`;
52
+ if (p.default)
53
+ s += ` = ${p.default}`;
54
+ return s + ",";
55
+ });
56
+ lines.push(`${symbol.name}(`);
57
+ lines.push(" *,");
58
+ lines.push(...paramLines);
59
+ lines.push(")");
60
+ }
61
+ else {
62
+ lines.push(symbol.signature);
63
+ }
64
+ lines.push("```");
65
+ lines.push("");
66
+ }
67
+ // Bases
68
+ if (symbol.bases.length > 0) {
69
+ lines.push(`Bases: ${symbol.bases.map((b) => `\`${b}\``).join(", ")}`);
70
+ lines.push("");
71
+ }
72
+ // Docstring — render as markdown directly
73
+ if (symbol.docstring) {
74
+ lines.push(dedentDoc(symbol.docstring));
75
+ lines.push("");
76
+ }
77
+ // Constructor parameters (merged into class if option set)
78
+ if (options.mergeInitIntoClass !== false && symbol.params.length > 0) {
79
+ lines.push(...generateParamTable(symbol.params));
80
+ lines.push("");
81
+ }
82
+ // Members
83
+ const members = filterMembers(symbol.members, options);
84
+ for (const member of members) {
85
+ if (member.name === "__init__" && options.mergeInitIntoClass !== false)
86
+ continue;
87
+ lines.push(...generateSymbol(member, level + 1, options));
88
+ lines.push("");
89
+ }
90
+ return lines;
91
+ }
92
+ function generateFunction(symbol, level, options) {
93
+ const lines = [];
94
+ const heading = "#".repeat(level);
95
+ if (options.showRootHeading !== false) {
96
+ const badge = symbol.kind === "method" ? "meth" : symbol.kind === "property" ? "attr" : "func";
97
+ lines.push(`${heading} <span class="api-badge api-badge-${badge}">${badge}</span> \`${symbol.name}\``);
98
+ lines.push("");
99
+ }
100
+ // Signature — show call-style for methods (no def, no self)
101
+ if (options.separateSignature !== false) {
102
+ lines.push("```python");
103
+ if (symbol.kind === "method" && symbol.params.length > 0) {
104
+ const paramLines = symbol.params.map((p) => {
105
+ let s = ` ${p.name}`;
106
+ if (p.bareType || p.type)
107
+ s += `: ${p.bareType || p.type}`;
108
+ if (p.default)
109
+ s += ` = ${p.default}`;
110
+ return s + ",";
111
+ });
112
+ lines.push(`${symbol.name}(`);
113
+ lines.push(...paramLines);
114
+ lines.push(")");
115
+ }
116
+ else if (symbol.kind === "method") {
117
+ lines.push(`${symbol.name}()`);
118
+ }
119
+ else {
120
+ lines.push(symbol.signature);
121
+ }
122
+ lines.push("```");
123
+ lines.push("");
124
+ }
125
+ // Decorators
126
+ if (symbol.decorators.length > 0) {
127
+ for (const dec of symbol.decorators) {
128
+ lines.push(`\`${dec}\``);
129
+ }
130
+ lines.push("");
131
+ }
132
+ // Docstring — render as markdown directly
133
+ if (symbol.docstring) {
134
+ lines.push(dedentDoc(symbol.docstring));
135
+ lines.push("");
136
+ }
137
+ // Parameters
138
+ if (symbol.params.length > 0) {
139
+ lines.push(...generateParamTable(symbol.params));
140
+ lines.push("");
141
+ }
142
+ // Return type
143
+ if (symbol.returnType) {
144
+ lines.push(`**Returns:** \`${symbol.returnType}\``);
145
+ lines.push("");
146
+ }
147
+ return lines;
148
+ }
149
+ function generateSymbol(symbol, level, options) {
150
+ if (symbol.kind === "class")
151
+ return generateClass(symbol, level, options);
152
+ return generateFunction(symbol, level, options);
153
+ }
154
+ /**
155
+ * Generate a JSON-encoded api-params directive that the loader
156
+ * will convert to a TreeNode. This avoids markdown table limitations
157
+ * (no multi-line cells) and lets a dedicated component render rich
158
+ * parameter documentation.
159
+ *
160
+ * Format: <!-- api-params:JSON -->
161
+ */
162
+ function generateParamTable(params) {
163
+ const paramData = params.map((p) => ({
164
+ name: p.name,
165
+ type: p.bareType || p.type || null,
166
+ default: p.default || null,
167
+ required: p.required,
168
+ doc: p.doc ? dedentDoc(p.doc) : null,
169
+ }));
170
+ return [
171
+ "**Parameters:**",
172
+ "",
173
+ `<!-- api-params:${JSON.stringify(paramData)} -->`,
174
+ "",
175
+ ];
176
+ }
177
+ function dedentDoc(text) {
178
+ const lines = text.split("\n");
179
+ // Find minimum indentation, skipping the first line (often unindented)
180
+ // and empty lines
181
+ let minIndent = Infinity;
182
+ for (let i = 0; i < lines.length; i++) {
183
+ if (lines[i].trim() === "")
184
+ continue;
185
+ const indent = lines[i].match(/^(\s*)/)?.[1].length ?? 0;
186
+ // Skip first line for min calculation if it has no indent
187
+ // (common pattern: first line right after quotes, rest indented)
188
+ if (i === 0 && indent === 0)
189
+ continue;
190
+ if (indent < minIndent)
191
+ minIndent = indent;
192
+ }
193
+ if (minIndent === Infinity || minIndent === 0)
194
+ return text.trim();
195
+ return lines.map((l) => {
196
+ if (l.trim() === "")
197
+ return "";
198
+ return l.startsWith(" ".repeat(minIndent)) ? l.slice(minIndent) : l;
199
+ }).join("\n").trim();
200
+ }
201
+ function filterMembers(members, options) {
202
+ let filtered = [...members];
203
+ // Apply member whitelist
204
+ if (options.members && options.members.length > 0) {
205
+ const allowed = new Set(options.members);
206
+ filtered = filtered.filter((m) => allowed.has(m.name));
207
+ // Preserve requested order
208
+ filtered.sort((a, b) => {
209
+ const aIdx = options.members.indexOf(a.name);
210
+ const bIdx = options.members.indexOf(b.name);
211
+ return aIdx - bIdx;
212
+ });
213
+ }
214
+ // Apply filters (e.g. "!^_" to exclude private members)
215
+ if (options.filters) {
216
+ for (const filter of options.filters) {
217
+ if (filter.startsWith("!")) {
218
+ const re = new RegExp(filter.slice(1));
219
+ filtered = filtered.filter((m) => !re.test(m.name));
220
+ }
221
+ else {
222
+ const re = new RegExp(filter);
223
+ filtered = filtered.filter((m) => re.test(m.name));
224
+ }
225
+ }
226
+ }
227
+ // Skip no-docstring members unless showIfNoDocstring
228
+ if (!options.showIfNoDocstring) {
229
+ // Keep all by default (FastAPI uses show_if_no_docstring: true globally)
230
+ }
231
+ // Sort
232
+ if (options.membersOrder === "alphabetical") {
233
+ filtered.sort((a, b) => a.name.localeCompare(b.name));
234
+ }
235
+ return filtered;
236
+ }
237
+ function truncate(s, maxLen) {
238
+ if (s.length <= maxLen)
239
+ return s;
240
+ return s.substring(0, maxLen - 3) + "...";
241
+ }
242
+ //# sourceMappingURL=markdown-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-generator.js","sourceRoot":"","sources":["../../src/autodoc/markdown-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SymbolInfo } from "./types.js";
2
+ /**
3
+ * Build list of source paths to search.
4
+ * Includes the sourceRoot itself plus any .venv site-packages.
5
+ */
6
+ export declare function buildSourcePaths(sourceRoot: string): string[];
7
+ export declare function resolveIdentifier(identifier: string, sourceRoot: string): Promise<SymbolInfo | null>;
8
+ //# sourceMappingURL=module-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-resolver.d.ts","sourceRoot":"","sources":["../../src/autodoc/module-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB7D;AAkBD,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAmB5B"}
@@ -0,0 +1,218 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { findSymbolInSource } from "./python-parser.js";
4
+ /**
5
+ * Build list of source paths to search.
6
+ * Includes the sourceRoot itself plus any .venv site-packages.
7
+ */
8
+ export function buildSourcePaths(sourceRoot) {
9
+ const paths = [sourceRoot];
10
+ // Search for .venv/lib/python*/site-packages/
11
+ const venvDirs = [".venv", "venv", ".env"];
12
+ for (const venv of venvDirs) {
13
+ const venvPath = join(sourceRoot, venv, "lib");
14
+ if (!existsSync(venvPath))
15
+ continue;
16
+ try {
17
+ for (const pyDir of readdirSync(venvPath)) {
18
+ const sitePackages = join(venvPath, pyDir, "site-packages");
19
+ if (existsSync(sitePackages) && statSync(sitePackages).isDirectory()) {
20
+ paths.push(sitePackages);
21
+ }
22
+ }
23
+ }
24
+ catch { /* continue */ }
25
+ }
26
+ return paths;
27
+ }
28
+ /**
29
+ * Resolve a dotted Python identifier to a source file and symbol.
30
+ *
31
+ * Examples:
32
+ * "fastapi.FastAPI" → fastapi/__init__.py or fastapi/applications.py
33
+ * "fastapi.security.OAuth2" → fastapi/security/__init__.py
34
+ * "fastapi.responses.JSONResponse" → fastapi/responses.py
35
+ * "fastapi.status" → fastapi/status.py (module-level)
36
+ */
37
+ // Cache source paths to avoid rebuilding for every resolve call
38
+ let cachedSourceRoot = null;
39
+ let cachedSourcePaths = [];
40
+ // Track identifiers being resolved to prevent infinite recursion
41
+ const resolving = new Set();
42
+ export async function resolveIdentifier(identifier, sourceRoot) {
43
+ if (resolving.has(identifier))
44
+ return null;
45
+ resolving.add(identifier);
46
+ try {
47
+ if (cachedSourceRoot !== sourceRoot) {
48
+ cachedSourcePaths = buildSourcePaths(sourceRoot);
49
+ cachedSourceRoot = sourceRoot;
50
+ }
51
+ for (const root of cachedSourcePaths) {
52
+ const result = await resolveInRoot(identifier, root, cachedSourcePaths, 0);
53
+ if (result)
54
+ return result;
55
+ }
56
+ return null;
57
+ }
58
+ finally {
59
+ resolving.delete(identifier);
60
+ }
61
+ }
62
+ async function resolveInRoot(identifier, sourceRoot, allPaths, depth = 0) {
63
+ // Prevent infinite recursion from circular re-exports
64
+ if (depth > 2)
65
+ return null;
66
+ const parts = identifier.split(".");
67
+ // Try progressively splitting: module.path vs symbol.name
68
+ for (let split = parts.length - 1; split >= 1; split--) {
69
+ const moduleParts = parts.slice(0, split);
70
+ const symbolName = parts.slice(split).join(".");
71
+ const filePath = resolveModulePath(moduleParts, sourceRoot);
72
+ if (!filePath)
73
+ continue;
74
+ try {
75
+ const source = readFileSync(filePath, "utf-8");
76
+ const symbol = await findSymbolInSource(source, symbolName, filePath);
77
+ if (symbol)
78
+ return symbol;
79
+ // Follow chained re-export in this file
80
+ const chainMatch = source.match(new RegExp(`from\\s+(\\S+)\\s+import\\s+${symbolName}(?:\\s+as\\s+${symbolName})?`));
81
+ if (chainMatch) {
82
+ const chainModule = chainMatch[1];
83
+ const searchPaths = allPaths || [sourceRoot];
84
+ for (const root of searchPaths) {
85
+ const result = await resolveInRoot(`${chainModule}.${symbolName}`, root, allPaths, depth + 1);
86
+ if (result)
87
+ return result;
88
+ }
89
+ }
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ }
95
+ // Follow re-exports from __init__.py
96
+ const lastPart = parts[parts.length - 1];
97
+ const packageParts = parts.slice(0, -1);
98
+ const packageDir = join(sourceRoot, ...packageParts);
99
+ if (existsSync(packageDir) && statSync(packageDir).isDirectory()) {
100
+ const initPath = join(packageDir, "__init__.py");
101
+ if (existsSync(initPath)) {
102
+ const initSource = readFileSync(initPath, "utf-8");
103
+ // Follow relative imports: from .submodule import Symbol
104
+ const relImportMatch = initSource.match(new RegExp(`from\\s+\\.(\\w+)\\s+import\\s+(?:.*\\b${lastPart}\\b)`));
105
+ if (relImportMatch) {
106
+ const submodule = relImportMatch[1];
107
+ const subPath = join(packageDir, submodule + ".py");
108
+ if (existsSync(subPath)) {
109
+ try {
110
+ const subSource = readFileSync(subPath, "utf-8");
111
+ // Try as a definition first
112
+ const symbol = await findSymbolInSource(subSource, lastPart, subPath);
113
+ if (symbol)
114
+ return symbol;
115
+ // Follow chained re-export: from other.module import Symbol
116
+ const chainMatch = subSource.match(new RegExp(`from\\s+(\\S+)\\s+import\\s+${lastPart}(?:\\s+as\\s+${lastPart})?`));
117
+ if (chainMatch) {
118
+ const chainModule = chainMatch[1];
119
+ const searchPaths = allPaths || [sourceRoot];
120
+ for (const root of searchPaths) {
121
+ const result = await resolveInRoot(`${chainModule}.${lastPart}`, root, allPaths, depth + 1);
122
+ if (result)
123
+ return result;
124
+ }
125
+ }
126
+ }
127
+ catch { /* continue */ }
128
+ }
129
+ }
130
+ // Follow absolute imports: from some.module import Symbol as Symbol
131
+ const absImportMatch = initSource.match(new RegExp(`from\\s+(\\S+)\\s+import\\s+${lastPart}(?:\\s+as\\s+${lastPart})?`));
132
+ if (absImportMatch) {
133
+ const absModule = absImportMatch[1];
134
+ // Resolve this as a new identifier from all source paths
135
+ const searchPaths = allPaths || [sourceRoot];
136
+ for (const root of searchPaths) {
137
+ const absResult = await resolveInRoot(`${absModule}.${lastPart}`, root, allPaths, depth + 1);
138
+ if (absResult)
139
+ return absResult;
140
+ }
141
+ }
142
+ }
143
+ // Scan .py files for definitions (skip at depth > 0 to avoid slow scans)
144
+ if (depth === 0) {
145
+ try {
146
+ for (const entry of readdirSync(packageDir)) {
147
+ if (!entry.endsWith(".py") || entry === "__init__.py")
148
+ continue;
149
+ const filePath = join(packageDir, entry);
150
+ try {
151
+ const source = readFileSync(filePath, "utf-8");
152
+ const symbol = await findSymbolInSource(source, lastPart, filePath);
153
+ if (symbol)
154
+ return symbol;
155
+ }
156
+ catch {
157
+ continue;
158
+ }
159
+ }
160
+ }
161
+ catch { /* continue */ }
162
+ }
163
+ }
164
+ // Try as a module itself
165
+ const modulePath = resolveModulePath(parts, sourceRoot);
166
+ if (modulePath) {
167
+ try {
168
+ const source = readFileSync(modulePath, "utf-8");
169
+ const { parsePythonSource } = await import("./python-parser.js");
170
+ const symbols = await parsePythonSource(source, modulePath);
171
+ return {
172
+ name: parts[parts.length - 1],
173
+ kind: "module",
174
+ signature: `module ${identifier}`,
175
+ docstring: extractModuleDocstring(source),
176
+ decorators: [],
177
+ bases: [],
178
+ params: [],
179
+ returnType: null,
180
+ members: symbols,
181
+ source: { file: modulePath, line: 1 },
182
+ };
183
+ }
184
+ catch {
185
+ // Fall through
186
+ }
187
+ }
188
+ return null;
189
+ }
190
+ /**
191
+ * Resolve module path parts to a file path.
192
+ * Tries: package/__init__.py, then module.py
193
+ */
194
+ function resolveModulePath(parts, sourceRoot) {
195
+ // Try as package: parts/__init__.py
196
+ const packageInit = join(sourceRoot, ...parts, "__init__.py");
197
+ if (existsSync(packageInit))
198
+ return packageInit;
199
+ // Try as module: parts[:-1]/parts[-1].py
200
+ if (parts.length > 1) {
201
+ const modulePath = join(sourceRoot, ...parts.slice(0, -1), parts[parts.length - 1] + ".py");
202
+ if (existsSync(modulePath))
203
+ return modulePath;
204
+ }
205
+ // Try as single file: parts.py
206
+ const singleFile = join(sourceRoot, parts.join("/") + ".py");
207
+ if (existsSync(singleFile))
208
+ return singleFile;
209
+ return null;
210
+ }
211
+ function extractModuleDocstring(source) {
212
+ // First string literal in the file
213
+ const match = source.match(/^(?:#[^\n]*\n)*\s*(?:"""([\s\S]*?)"""|'''([\s\S]*?)''')/);
214
+ if (match)
215
+ return (match[1] ?? match[2] ?? "").trim();
216
+ return null;
217
+ }
218
+ //# sourceMappingURL=module-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-resolver.js","sourceRoot":"","sources":["../../src/autodoc/module-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ParsedDocstring } from "./types.js";
2
+ /**
3
+ * Parse a Python docstring into structured sections.
4
+ * Supports Google, NumPy, and Sphinx styles.
5
+ */
6
+ export declare function parseDocstring(raw: string): ParsedDocstring;
7
+ //# sourceMappingURL=python-docstring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-docstring.d.ts","sourceRoot":"","sources":["../../src/autodoc/python-docstring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmD,MAAM,YAAY,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAoB3D"}