@refrakt-md/docs 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/cli-plugin.d.ts +12 -0
  2. package/dist/cli-plugin.d.ts.map +1 -0
  3. package/dist/cli-plugin.js +113 -0
  4. package/dist/cli-plugin.js.map +1 -0
  5. package/dist/extract/command.d.ts +10 -0
  6. package/dist/extract/command.d.ts.map +1 -0
  7. package/dist/extract/command.js +161 -0
  8. package/dist/extract/command.js.map +1 -0
  9. package/dist/extract/extractors.d.ts +3 -0
  10. package/dist/extract/extractors.d.ts.map +1 -0
  11. package/dist/extract/extractors.js +17 -0
  12. package/dist/extract/extractors.js.map +1 -0
  13. package/dist/extract/layout-generator.d.ts +8 -0
  14. package/dist/extract/layout-generator.d.ts.map +1 -0
  15. package/dist/extract/layout-generator.js +22 -0
  16. package/dist/extract/layout-generator.js.map +1 -0
  17. package/dist/extract/python-docstring.d.ts +26 -0
  18. package/dist/extract/python-docstring.d.ts.map +1 -0
  19. package/dist/extract/python-docstring.js +396 -0
  20. package/dist/extract/python-docstring.js.map +1 -0
  21. package/dist/extract/python.d.ts +21 -0
  22. package/dist/extract/python.d.ts.map +1 -0
  23. package/dist/extract/python.js +557 -0
  24. package/dist/extract/python.js.map +1 -0
  25. package/dist/extract/symbol-generator.d.ts +14 -0
  26. package/dist/extract/symbol-generator.d.ts.map +1 -0
  27. package/dist/extract/symbol-generator.js +201 -0
  28. package/dist/extract/symbol-generator.js.map +1 -0
  29. package/dist/extract/types.d.ts +55 -0
  30. package/dist/extract/types.d.ts.map +1 -0
  31. package/dist/extract/types.js +2 -0
  32. package/dist/extract/types.js.map +1 -0
  33. package/dist/extract/typescript.d.ts +28 -0
  34. package/dist/extract/typescript.d.ts.map +1 -0
  35. package/dist/extract/typescript.js +562 -0
  36. package/dist/extract/typescript.js.map +1 -0
  37. package/dist/index.js +1 -1
  38. package/dist/tags/api.d.ts.map +1 -1
  39. package/dist/tags/api.js +1 -2
  40. package/dist/tags/api.js.map +1 -1
  41. package/dist/tags/changelog.d.ts.map +1 -1
  42. package/dist/tags/changelog.js +20 -34
  43. package/dist/tags/changelog.js.map +1 -1
  44. package/dist/tags/symbol.d.ts.map +1 -1
  45. package/dist/tags/symbol.js +3 -4
  46. package/dist/tags/symbol.js.map +1 -1
  47. package/package.json +18 -5
  48. package/dist/schema/api.d.ts +0 -6
  49. package/dist/schema/api.d.ts.map +0 -1
  50. package/dist/schema/api.js +0 -8
  51. package/dist/schema/api.js.map +0 -1
  52. package/dist/schema/changelog.d.ts +0 -10
  53. package/dist/schema/changelog.d.ts.map +0 -1
  54. package/dist/schema/changelog.js +0 -15
  55. package/dist/schema/changelog.js.map +0 -1
  56. package/dist/schema/symbol.d.ts +0 -14
  57. package/dist/schema/symbol.d.ts.map +0 -1
  58. package/dist/schema/symbol.js +0 -20
  59. package/dist/schema/symbol.js.map +0 -1
  60. package/dist/types.d.ts +0 -12
  61. package/dist/types.d.ts.map +0 -1
  62. package/dist/types.js +0 -13
  63. package/dist/types.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ interface CliPluginCommand {
2
+ name: string;
3
+ description: string;
4
+ handler: (args: string[]) => void | Promise<void>;
5
+ }
6
+ interface CliPlugin {
7
+ namespace: string;
8
+ commands: CliPluginCommand[];
9
+ }
10
+ declare const plugin: CliPlugin;
11
+ export default plugin;
12
+ //# sourceMappingURL=cli-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-plugin.d.ts","sourceRoot":"","sources":["../src/cli-plugin.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,UAAU,SAAS;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAsGD,QAAA,MAAM,MAAM,EAAE,SASb,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,113 @@
1
+ async function handleExtract(args) {
2
+ let input;
3
+ let output;
4
+ let lang;
5
+ let validate = false;
6
+ let sourceUrl;
7
+ let title;
8
+ for (let i = 0; i < args.length; i++) {
9
+ const arg = args[i];
10
+ if (arg === '--output' || arg === '-o') {
11
+ output = args[++i];
12
+ if (!output) {
13
+ console.error('Error: --output requires a path');
14
+ process.exit(1);
15
+ }
16
+ }
17
+ else if (arg === '--lang') {
18
+ lang = args[++i];
19
+ if (!lang) {
20
+ console.error('Error: --lang requires a value');
21
+ process.exit(1);
22
+ }
23
+ if (lang !== 'typescript' && lang !== 'python') {
24
+ console.error(`Error: Unsupported language "${lang}". Supported: typescript, python`);
25
+ process.exit(1);
26
+ }
27
+ }
28
+ else if (arg === '--validate') {
29
+ validate = true;
30
+ }
31
+ else if (arg === '--source-url') {
32
+ sourceUrl = args[++i];
33
+ if (!sourceUrl) {
34
+ console.error('Error: --source-url requires a URL');
35
+ process.exit(1);
36
+ }
37
+ }
38
+ else if (arg === '--title') {
39
+ title = args[++i];
40
+ if (!title) {
41
+ console.error('Error: --title requires a value');
42
+ process.exit(1);
43
+ }
44
+ }
45
+ else if (arg === '--help' || arg === '-h') {
46
+ printExtractHelp();
47
+ process.exit(0);
48
+ }
49
+ else if (arg.startsWith('-')) {
50
+ console.error(`Error: Unknown flag "${arg}"\n`);
51
+ printExtractHelp();
52
+ process.exit(1);
53
+ }
54
+ else if (!input) {
55
+ input = arg;
56
+ }
57
+ else {
58
+ console.error(`Error: Unexpected argument "${arg}"\n`);
59
+ printExtractHelp();
60
+ process.exit(1);
61
+ }
62
+ }
63
+ if (!input) {
64
+ console.error('Error: Missing input path\n');
65
+ printExtractHelp();
66
+ process.exit(1);
67
+ }
68
+ if (!output && !validate) {
69
+ console.error('Error: --output is required (or use --validate)\n');
70
+ process.exit(1);
71
+ }
72
+ const { extractCommand } = await import('./extract/command.js');
73
+ await extractCommand({
74
+ input: input,
75
+ output: output ?? './content/api',
76
+ lang: lang,
77
+ validate,
78
+ sourceUrl,
79
+ title,
80
+ });
81
+ }
82
+ function printExtractHelp() {
83
+ console.log(`
84
+ Usage: refrakt docs extract <path> [options]
85
+
86
+ Extract symbols from source code into {% symbol %} Markdown files.
87
+
88
+ Options:
89
+ --output, -o <path> Output directory for generated files (required)
90
+ --lang <language> Language: typescript, python (default: auto-detect)
91
+ --validate Check if generated files are up to date (exit 1 if stale)
92
+ --source-url <url> Base URL for source code links
93
+ --title <name> Navigation section title (default: "API Reference")
94
+ --help, -h Show this help message
95
+
96
+ Examples:
97
+ refrakt docs extract ./src -o ./content/api
98
+ refrakt docs extract ./src -o ./content/api --source-url https://github.com/my/repo/blob/main/src
99
+ refrakt docs extract ./src -o ./content/api --validate
100
+ `);
101
+ }
102
+ const plugin = {
103
+ namespace: 'docs',
104
+ commands: [
105
+ {
106
+ name: 'extract',
107
+ description: 'Extract symbols from source code into {% symbol %} Markdown',
108
+ handler: handleExtract,
109
+ },
110
+ ],
111
+ };
112
+ export default plugin;
113
+ //# sourceMappingURL=cli-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-plugin.js","sourceRoot":"","sources":["../src/cli-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface ExtractOptions {
2
+ input: string;
3
+ output: string;
4
+ lang?: 'typescript' | 'python';
5
+ validate?: boolean;
6
+ sourceUrl?: string;
7
+ title?: string;
8
+ }
9
+ export declare function extractCommand(opts: ExtractOptions): Promise<void>;
10
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/extract/command.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AA8DD,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GxE"}
@@ -0,0 +1,161 @@
1
+ import { resolve, join, relative, dirname } from 'node:path';
2
+ import { writeFileSync, readFileSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';
3
+ import { loadExtractor } from './extractors.js';
4
+ import { generateSymbolMarkdown, toSlug } from './symbol-generator.js';
5
+ import { generateLayoutMarkdown } from './layout-generator.js';
6
+ function detectLanguage(inputPath) {
7
+ const abs = resolve(inputPath);
8
+ // Check if input is a single file
9
+ if (existsSync(abs) && statSync(abs).isFile()) {
10
+ if (abs.endsWith('.ts') || abs.endsWith('.tsx'))
11
+ return 'typescript';
12
+ if (abs.endsWith('.py'))
13
+ return 'python';
14
+ }
15
+ // Check for tsconfig.json
16
+ if (existsSync(join(abs, 'tsconfig.json')) ||
17
+ existsSync(join(dirname(abs), 'tsconfig.json'))) {
18
+ return 'typescript';
19
+ }
20
+ // Check directory contents
21
+ if (existsSync(abs) && statSync(abs).isDirectory()) {
22
+ try {
23
+ const files = readdirSync(abs);
24
+ if (files.some(f => f.endsWith('.ts') || f.endsWith('.tsx')))
25
+ return 'typescript';
26
+ if (files.some(f => f.endsWith('.py')))
27
+ return 'python';
28
+ }
29
+ catch {
30
+ // fall through
31
+ }
32
+ }
33
+ return 'typescript';
34
+ }
35
+ function findSourceFiles(inputPath, lang) {
36
+ const abs = resolve(inputPath);
37
+ if (!existsSync(abs))
38
+ return [];
39
+ const stat = statSync(abs);
40
+ if (stat.isFile())
41
+ return [abs];
42
+ const ext = lang === 'typescript' ? /\.tsx?$/ : /\.py$/;
43
+ return walkFiles(abs, ext);
44
+ }
45
+ function walkFiles(dir, ext) {
46
+ const files = [];
47
+ const entries = readdirSync(dir);
48
+ for (const entry of entries) {
49
+ if (entry === 'node_modules' || entry === '__pycache__' || entry.startsWith('.'))
50
+ continue;
51
+ const fullPath = resolve(dir, entry);
52
+ const stat = statSync(fullPath);
53
+ if (stat.isDirectory()) {
54
+ files.push(...walkFiles(fullPath, ext));
55
+ }
56
+ else if (ext.test(entry)
57
+ && !entry.endsWith('.d.ts') && !entry.endsWith('.test.ts') && !entry.endsWith('.spec.ts')
58
+ && !entry.startsWith('test_') && !entry.endsWith('_test.py')
59
+ && entry !== 'conftest.py' && entry !== 'setup.py') {
60
+ files.push(fullPath);
61
+ }
62
+ }
63
+ return files;
64
+ }
65
+ export async function extractCommand(opts) {
66
+ const inputPath = resolve(opts.input);
67
+ const outputPath = resolve(opts.output);
68
+ const lang = opts.lang ?? detectLanguage(inputPath);
69
+ if (!existsSync(inputPath)) {
70
+ console.error(`Error: Input path does not exist: ${inputPath}`);
71
+ process.exit(1);
72
+ }
73
+ // Use the directory as rootDir for the extractor (even if input is a single file)
74
+ const extractorRoot = statSync(inputPath).isDirectory() ? inputPath : dirname(inputPath);
75
+ // Load the appropriate extractor
76
+ const extractor = await loadExtractor(lang, extractorRoot, opts.sourceUrl);
77
+ // Find all source files
78
+ const sourceFiles = findSourceFiles(inputPath, lang);
79
+ if (sourceFiles.length === 0) {
80
+ console.error(`No ${lang} source files found in ${inputPath}`);
81
+ process.exit(1);
82
+ }
83
+ // Extract symbols from all files
84
+ const allSymbols = [];
85
+ for (const file of sourceFiles) {
86
+ const result = extractor.extractFile(file);
87
+ allSymbols.push(...result.symbols);
88
+ }
89
+ if (allSymbols.length === 0) {
90
+ console.log('No exported symbols found.');
91
+ return;
92
+ }
93
+ console.log(`Found ${allSymbols.length} symbols in ${sourceFiles.length} files`);
94
+ // Detect slug collisions and resolve them
95
+ const slugMap = new Map();
96
+ for (const doc of allSymbols) {
97
+ const slug = toSlug(doc.name);
98
+ const existing = slugMap.get(slug) ?? [];
99
+ existing.push(doc);
100
+ slugMap.set(slug, existing);
101
+ }
102
+ // Generate Markdown for each symbol
103
+ const generated = new Map();
104
+ for (const [slug, docs] of slugMap) {
105
+ if (docs.length === 1) {
106
+ const filePath = join(outputPath, `${slug}.md`);
107
+ generated.set(filePath, generateSymbolMarkdown(docs[0], { lang }));
108
+ }
109
+ else {
110
+ // Resolve collisions by appending kind
111
+ for (const doc of docs) {
112
+ const uniqueSlug = `${slug}-${doc.kind}`;
113
+ const filePath = join(outputPath, `${uniqueSlug}.md`);
114
+ generated.set(filePath, generateSymbolMarkdown(doc, { lang }));
115
+ }
116
+ }
117
+ }
118
+ // Generate _layout.md
119
+ const layoutPath = join(outputPath, '_layout.md');
120
+ const layoutContent = generateLayoutMarkdown(allSymbols, { title: opts.title });
121
+ generated.set(layoutPath, layoutContent);
122
+ // Validate mode: compare generated to existing
123
+ if (opts.validate) {
124
+ let stale = false;
125
+ for (const [filePath, content] of generated) {
126
+ if (!existsSync(filePath)) {
127
+ console.error(`MISSING: ${relative(process.cwd(), filePath)}`);
128
+ stale = true;
129
+ }
130
+ else {
131
+ const existing = readFileSync(filePath, 'utf-8');
132
+ if (existing !== content) {
133
+ console.error(`STALE: ${relative(process.cwd(), filePath)}`);
134
+ stale = true;
135
+ }
136
+ }
137
+ }
138
+ if (stale) {
139
+ console.error('\nAPI reference is out of date. Run `refrakt docs extract` to regenerate.');
140
+ process.exit(1);
141
+ }
142
+ else {
143
+ console.log(`OK: ${generated.size} files up to date (${allSymbols.length} symbols)`);
144
+ }
145
+ return;
146
+ }
147
+ // Write mode
148
+ if (!existsSync(outputPath)) {
149
+ mkdirSync(outputPath, { recursive: true });
150
+ }
151
+ let written = 0;
152
+ for (const [filePath, content] of generated) {
153
+ const dir = dirname(filePath);
154
+ if (!existsSync(dir))
155
+ mkdirSync(dir, { recursive: true });
156
+ writeFileSync(filePath, content);
157
+ written++;
158
+ }
159
+ console.log(`Written ${written} files to ${relative(process.cwd(), outputPath)}`);
160
+ }
161
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/extract/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { SymbolDoc, SymbolExtractor, ExtractorResult, SymbolKind, SymbolParameter, SymbolReturn, SymbolThrows, SymbolMemberDoc, SymbolGroupDoc, } from './types.js';
2
+ export declare function loadExtractor(lang: 'typescript' | 'python', rootDir: string, sourceUrl?: string): Promise<import('./types.js').SymbolExtractor>;
3
+ //# sourceMappingURL=extractors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../src/extract/extractors.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EACvD,eAAe,EAAE,YAAY,EAAE,YAAY,EAC3C,eAAe,EAAE,cAAc,GAC/B,MAAM,YAAY,CAAC;AAEpB,wBAAsB,aAAa,CAClC,IAAI,EAAE,YAAY,GAAG,QAAQ,EAC7B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,YAAY,EAAE,eAAe,CAAC,CAe/C"}
@@ -0,0 +1,17 @@
1
+ export async function loadExtractor(lang, rootDir, sourceUrl) {
2
+ switch (lang) {
3
+ case 'typescript': {
4
+ const { TypeScriptExtractor } = await import('./typescript.js');
5
+ return new TypeScriptExtractor(rootDir, sourceUrl);
6
+ }
7
+ case 'python': {
8
+ const { PythonExtractor } = await import('./python.js');
9
+ const extractor = new PythonExtractor(rootDir, sourceUrl);
10
+ await extractor.init();
11
+ return extractor;
12
+ }
13
+ default:
14
+ throw new Error(`Unsupported language: ${lang}`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=extractors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractors.js","sourceRoot":"","sources":["../../src/extract/extractors.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,IAA6B,EAC7B,OAAe,EACf,SAAkB;IAElB,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,YAAY,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAChE,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC1D,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QAClB,CAAC;QACD;YACC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SymbolDoc } from './types.js';
2
+ export interface LayoutOptions {
3
+ /** Title for the nav section (default: "API Reference") */
4
+ title?: string;
5
+ }
6
+ /** Generate a _layout.md with {% nav %} for API reference navigation */
7
+ export declare function generateLayoutMarkdown(symbols: SymbolDoc[], options?: LayoutOptions): string;
8
+ //# sourceMappingURL=layout-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-generator.d.ts","sourceRoot":"","sources":["../../src/extract/layout-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,aAAa;IAC7B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,SAAS,EAAE,EACpB,OAAO,CAAC,EAAE,aAAa,GACrB,MAAM,CAsBR"}
@@ -0,0 +1,22 @@
1
+ import { toSlug } from './symbol-generator.js';
2
+ /** Generate a _layout.md with {% nav %} for API reference navigation */
3
+ export function generateLayoutMarkdown(symbols, options) {
4
+ const title = options?.title ?? 'API Reference';
5
+ const lines = [];
6
+ lines.push('{% layout %}');
7
+ lines.push('{% region name="nav" %}');
8
+ lines.push('{% nav %}');
9
+ lines.push('');
10
+ lines.push(`## ${title}`);
11
+ lines.push('');
12
+ for (const doc of symbols) {
13
+ lines.push(`- ${toSlug(doc.name)}`);
14
+ }
15
+ lines.push('');
16
+ lines.push('{% /nav %}');
17
+ lines.push('{% /region %}');
18
+ lines.push('{% /layout %}');
19
+ lines.push('');
20
+ return lines.join('\n');
21
+ }
22
+ //# sourceMappingURL=layout-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-generator.js","sourceRoot":"","sources":["../../src/extract/layout-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,wEAAwE;AACxE,MAAM,UAAU,sBAAsB,CACrC,OAAoB,EACpB,OAAuB;IAEvB,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,eAAe,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Python docstring parser — supports Google, NumPy, and Sphinx (reST) conventions.
3
+ * Auto-detects the format and extracts parameters, returns, raises, since, and deprecated.
4
+ */
5
+ export interface DocstringParam {
6
+ type: string;
7
+ description: string;
8
+ }
9
+ export interface DocstringInfo {
10
+ description: string;
11
+ params: Map<string, DocstringParam>;
12
+ returns?: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ raises: Array<{
17
+ type: string;
18
+ description: string;
19
+ }>;
20
+ since?: string;
21
+ deprecated?: string;
22
+ }
23
+ export type DocstringStyle = 'google' | 'numpy' | 'sphinx' | 'plain';
24
+ export declare function detectStyle(raw: string): DocstringStyle;
25
+ export declare function parseDocstring(raw: string): DocstringInfo;
26
+ //# sourceMappingURL=python-docstring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-docstring.d.ts","sourceRoot":"","sources":["../../src/extract/python-docstring.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAQrE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAMvD;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAazD"}