mates-fullstack 1.0.0-beta.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.
- package/README.md +311 -0
- package/dist/arctic-auth.d.ts +101 -0
- package/dist/arctic-auth.d.ts.map +1 -0
- package/dist/arctic-auth.js +538 -0
- package/dist/arctic-auth.js.map +1 -0
- package/dist/asset-manifest.d.ts +14 -0
- package/dist/asset-manifest.d.ts.map +1 -0
- package/dist/asset-manifest.js +102 -0
- package/dist/asset-manifest.js.map +1 -0
- package/dist/browser.d.ts +18 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +25 -0
- package/dist/browser.js.map +1 -0
- package/dist/build-esbuild.d.ts +29 -0
- package/dist/build-esbuild.d.ts.map +1 -0
- package/dist/build-esbuild.js +699 -0
- package/dist/build-esbuild.js.map +1 -0
- package/dist/build-prod.d.ts +126 -0
- package/dist/build-prod.d.ts.map +1 -0
- package/dist/build-prod.js +1014 -0
- package/dist/build-prod.js.map +1 -0
- package/dist/cli-new.d.ts +14 -0
- package/dist/cli-new.d.ts.map +1 -0
- package/dist/cli-new.js +637 -0
- package/dist/cli-new.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +130 -0
- package/dist/client.js.map +1 -0
- package/dist/cors.d.ts +16 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +60 -0
- package/dist/cors.js.map +1 -0
- package/dist/ctx.d.ts +78 -0
- package/dist/ctx.d.ts.map +1 -0
- package/dist/ctx.js +280 -0
- package/dist/ctx.js.map +1 -0
- package/dist/dev-watcher.d.ts +23 -0
- package/dist/dev-watcher.d.ts.map +1 -0
- package/dist/dev-watcher.js +136 -0
- package/dist/dev-watcher.js.map +1 -0
- package/dist/docs-generator.d.ts +69 -0
- package/dist/docs-generator.d.ts.map +1 -0
- package/dist/docs-generator.js +557 -0
- package/dist/docs-generator.js.map +1 -0
- package/dist/docs-page.d.ts +20 -0
- package/dist/docs-page.d.ts.map +1 -0
- package/dist/docs-page.js +1152 -0
- package/dist/docs-page.js.map +1 -0
- package/dist/download.d.ts +78 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +202 -0
- package/dist/download.js.map +1 -0
- package/dist/env-loader.d.ts +76 -0
- package/dist/env-loader.d.ts.map +1 -0
- package/dist/env-loader.js +213 -0
- package/dist/env-loader.js.map +1 -0
- package/dist/errors.d.ts +146 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +386 -0
- package/dist/errors.js.map +1 -0
- package/dist/head.d.ts +31 -0
- package/dist/head.d.ts.map +1 -0
- package/dist/head.js +245 -0
- package/dist/head.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/internal-prefixes.d.ts +16 -0
- package/dist/internal-prefixes.d.ts.map +1 -0
- package/dist/internal-prefixes.js +16 -0
- package/dist/internal-prefixes.js.map +1 -0
- package/dist/internal.d.ts +25 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +25 -0
- package/dist/internal.js.map +1 -0
- package/dist/jwt.d.ts +166 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +261 -0
- package/dist/jwt.js.map +1 -0
- package/dist/log.d.ts +44 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +66 -0
- package/dist/log.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +138 -0
- package/dist/logger.js.map +1 -0
- package/dist/main-runner.d.ts +59 -0
- package/dist/main-runner.d.ts.map +1 -0
- package/dist/main-runner.js +157 -0
- package/dist/main-runner.js.map +1 -0
- package/dist/mates-auth.d.ts +82 -0
- package/dist/mates-auth.d.ts.map +1 -0
- package/dist/mates-auth.js +323 -0
- package/dist/mates-auth.js.map +1 -0
- package/dist/middleware.d.ts +30 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +67 -0
- package/dist/middleware.js.map +1 -0
- package/dist/project-resolver.d.ts +102 -0
- package/dist/project-resolver.d.ts.map +1 -0
- package/dist/project-resolver.js +271 -0
- package/dist/project-resolver.js.map +1 -0
- package/dist/rate-limit.d.ts +37 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +109 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/redirect.d.ts +84 -0
- package/dist/redirect.d.ts.map +1 -0
- package/dist/redirect.js +105 -0
- package/dist/redirect.js.map +1 -0
- package/dist/renderer.d.ts +91 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +630 -0
- package/dist/renderer.js.map +1 -0
- package/dist/request-logger.d.ts +12 -0
- package/dist/request-logger.d.ts.map +1 -0
- package/dist/request-logger.js +55 -0
- package/dist/request-logger.js.map +1 -0
- package/dist/rest.d.ts +25 -0
- package/dist/rest.d.ts.map +1 -0
- package/dist/rest.js +93 -0
- package/dist/rest.js.map +1 -0
- package/dist/router.d.ts +71 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +222 -0
- package/dist/router.js.map +1 -0
- package/dist/rpc-registry.d.ts +84 -0
- package/dist/rpc-registry.d.ts.map +1 -0
- package/dist/rpc-registry.js +271 -0
- package/dist/rpc-registry.js.map +1 -0
- package/dist/rpc-runner.d.ts +82 -0
- package/dist/rpc-runner.d.ts.map +1 -0
- package/dist/rpc-runner.js +564 -0
- package/dist/rpc-runner.js.map +1 -0
- package/dist/sanitize.d.ts +61 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +193 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/security-headers.d.ts +114 -0
- package/dist/security-headers.d.ts.map +1 -0
- package/dist/security-headers.js +121 -0
- package/dist/security-headers.js.map +1 -0
- package/dist/server-fn.d.ts +323 -0
- package/dist/server-fn.d.ts.map +1 -0
- package/dist/server-fn.js +373 -0
- package/dist/server-fn.js.map +1 -0
- package/dist/server-public.d.ts +13 -0
- package/dist/server-public.d.ts.map +1 -0
- package/dist/server-public.js +12 -0
- package/dist/server-public.js.map +1 -0
- package/dist/server-timeout.d.ts +38 -0
- package/dist/server-timeout.d.ts.map +1 -0
- package/dist/server-timeout.js +46 -0
- package/dist/server-timeout.js.map +1 -0
- package/dist/server.d.ts +100 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1218 -0
- package/dist/server.js.map +1 -0
- package/dist/socket-router.d.ts +153 -0
- package/dist/socket-router.d.ts.map +1 -0
- package/dist/socket-router.js +612 -0
- package/dist/socket-router.js.map +1 -0
- package/dist/sso.d.ts +90 -0
- package/dist/sso.d.ts.map +1 -0
- package/dist/sso.js +261 -0
- package/dist/sso.js.map +1 -0
- package/dist/ssr-context.d.ts +49 -0
- package/dist/ssr-context.d.ts.map +1 -0
- package/dist/ssr-context.js +85 -0
- package/dist/ssr-context.js.map +1 -0
- package/dist/ssr-globals.d.ts +32 -0
- package/dist/ssr-globals.d.ts.map +1 -0
- package/dist/ssr-globals.js +1010 -0
- package/dist/ssr-globals.js.map +1 -0
- package/dist/ssr-template.d.ts +73 -0
- package/dist/ssr-template.d.ts.map +1 -0
- package/dist/ssr-template.js +507 -0
- package/dist/ssr-template.js.map +1 -0
- package/dist/stack-mapper.d.ts +25 -0
- package/dist/stack-mapper.d.ts.map +1 -0
- package/dist/stack-mapper.js +139 -0
- package/dist/stack-mapper.js.map +1 -0
- package/dist/stream.d.ts +89 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +299 -0
- package/dist/stream.js.map +1 -0
- package/dist/upload.d.ts +69 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +110 -0
- package/dist/upload.js.map +1 -0
- package/dist/validate.d.ts +58 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +89 -0
- package/dist/validate.js.map +1 -0
- package/dist/verify-package.d.ts +3 -0
- package/dist/verify-package.d.ts.map +1 -0
- package/dist/verify-package.js +128 -0
- package/dist/verify-package.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mates-fullstack — docs-generator.ts
|
|
3
|
+
*
|
|
4
|
+
* Generates interactive API documentation for all RPC functions in server/api/
|
|
5
|
+
* by statically analysing TypeScript source files with ts-morph.
|
|
6
|
+
*
|
|
7
|
+
* ts-morph is an optional peer dependency. If it is not installed this module
|
|
8
|
+
* returns [] gracefully — the server never crashes.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* import { generateDocs } from "./docs-generator.js";
|
|
12
|
+
* const docs = await generateDocs("/abs/path/to/server/api", "/abs/path/to/shared/types");
|
|
13
|
+
*/
|
|
14
|
+
import { createRequire } from "node:module";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
// ─── Reserved export names (mirrors rpc-registry.ts) ─────────────────────────
|
|
17
|
+
const RESERVED_NAMES = new Set([
|
|
18
|
+
"default",
|
|
19
|
+
"loader",
|
|
20
|
+
"meta",
|
|
21
|
+
"layout",
|
|
22
|
+
"staticPaths",
|
|
23
|
+
"onConnect",
|
|
24
|
+
"onDisconnect",
|
|
25
|
+
"then",
|
|
26
|
+
"catch",
|
|
27
|
+
"finally",
|
|
28
|
+
]);
|
|
29
|
+
// ─── Cache ────────────────────────────────────────────────────────────────────
|
|
30
|
+
let _cachedDocs = null;
|
|
31
|
+
let _cachedDocsKey = null;
|
|
32
|
+
let _lastScanTime = 0;
|
|
33
|
+
const CACHE_TTL_MS = 5000;
|
|
34
|
+
export function clearDocsCache() {
|
|
35
|
+
_cachedDocs = null;
|
|
36
|
+
_cachedDocsKey = null;
|
|
37
|
+
_lastScanTime = 0;
|
|
38
|
+
}
|
|
39
|
+
// ─── ts-morph availability ────────────────────────────────────────────────────
|
|
40
|
+
let _tsMorphWarned = false;
|
|
41
|
+
export async function isTsMorphAvailable(projectRoot) {
|
|
42
|
+
return (await _loadTsMorph(projectRoot, false)) !== null;
|
|
43
|
+
}
|
|
44
|
+
async function _loadTsMorph(projectRoot, warn = true) {
|
|
45
|
+
if (projectRoot) {
|
|
46
|
+
try {
|
|
47
|
+
const requireFromProject = createRequire(path.resolve(projectRoot, "package.json"));
|
|
48
|
+
return requireFromProject("ts-morph");
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Fall back to resolving from mates-fullstack itself.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
// @ts-ignore — ts-morph is an optional peer dep; may not be resolvable
|
|
56
|
+
return await import("ts-morph");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
if (warn && !_tsMorphWarned) {
|
|
60
|
+
_tsMorphWarned = true;
|
|
61
|
+
console.warn("[mates-fullstack] docs-generator: ts-morph is not installed. " +
|
|
62
|
+
"API documentation generation is disabled. " +
|
|
63
|
+
"Install it with: npm install --save-dev ts-morph");
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ─── Main entry point ─────────────────────────────────────────────────────────
|
|
69
|
+
/**
|
|
70
|
+
* Parse server/api/ with ts-morph and return a RouteDoc for every registered
|
|
71
|
+
* RPC function. Results are cached for 5 seconds (TTL covers dev hot-reload).
|
|
72
|
+
*
|
|
73
|
+
* Returns [] immediately if ts-morph is not installed.
|
|
74
|
+
*/
|
|
75
|
+
export async function generateDocs(apiDir, sharedTypesDir, projectRoot) {
|
|
76
|
+
const cacheKey = JSON.stringify({
|
|
77
|
+
apiDir: path.resolve(apiDir),
|
|
78
|
+
sharedTypesDir: sharedTypesDir ? path.resolve(sharedTypesDir) : null,
|
|
79
|
+
projectRoot: projectRoot ? path.resolve(projectRoot) : null,
|
|
80
|
+
});
|
|
81
|
+
// Return cached result if still fresh
|
|
82
|
+
if (_cachedDocs !== null &&
|
|
83
|
+
_cachedDocsKey === cacheKey &&
|
|
84
|
+
Date.now() - _lastScanTime < CACHE_TTL_MS) {
|
|
85
|
+
return _cachedDocs;
|
|
86
|
+
}
|
|
87
|
+
// ts-morph is an optional peer dep — types are accessed via `any` at runtime.
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
const TsMorph = await _loadTsMorph(projectRoot);
|
|
90
|
+
if (!TsMorph)
|
|
91
|
+
return [];
|
|
92
|
+
const { Project } = TsMorph;
|
|
93
|
+
// Build a ts-morph project from the api sources (+ optional shared types)
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
const project = new Project({
|
|
96
|
+
compilerOptions: {
|
|
97
|
+
allowJs: true,
|
|
98
|
+
checkJs: true,
|
|
99
|
+
strict: false,
|
|
100
|
+
skipLibCheck: true,
|
|
101
|
+
},
|
|
102
|
+
skipAddingFilesFromTsConfig: true,
|
|
103
|
+
});
|
|
104
|
+
project.addSourceFilesAtPaths([
|
|
105
|
+
`${apiDir}/**/*.ts`,
|
|
106
|
+
`${apiDir}/**/*.tsx`,
|
|
107
|
+
`${apiDir}/**/*.js`,
|
|
108
|
+
`${apiDir}/**/*.jsx`,
|
|
109
|
+
]);
|
|
110
|
+
if (sharedTypesDir) {
|
|
111
|
+
project.addSourceFilesAtPaths([
|
|
112
|
+
`${sharedTypesDir}/**/*.ts`,
|
|
113
|
+
`${sharedTypesDir}/**/*.tsx`,
|
|
114
|
+
`${sharedTypesDir}/**/*.js`,
|
|
115
|
+
`${sharedTypesDir}/**/*.jsx`,
|
|
116
|
+
]);
|
|
117
|
+
}
|
|
118
|
+
const docs = [];
|
|
119
|
+
for (const sourceFile of project.getSourceFiles()) {
|
|
120
|
+
const filePath = sourceFile.getFilePath();
|
|
121
|
+
// Only process files that live inside apiDir
|
|
122
|
+
const absApiDir = path.resolve(apiDir);
|
|
123
|
+
const absFilePath = path.resolve(filePath);
|
|
124
|
+
if (!absFilePath.startsWith(absApiDir + path.sep))
|
|
125
|
+
continue;
|
|
126
|
+
// Skip test / spec / private files
|
|
127
|
+
const basename = path.basename(filePath);
|
|
128
|
+
if (basename.startsWith("_") || basename.startsWith("."))
|
|
129
|
+
continue;
|
|
130
|
+
if (basename.includes(".test.") || basename.includes(".spec."))
|
|
131
|
+
continue;
|
|
132
|
+
try {
|
|
133
|
+
const fileDocs = _processSourceFile(sourceFile, apiDir, filePath, project);
|
|
134
|
+
docs.push(...fileDocs);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
138
|
+
console.warn(`[mates-fullstack] docs-generator: skipping ${path.relative(apiDir, filePath)} — ${msg}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
_cachedDocs = docs;
|
|
142
|
+
_cachedDocsKey = cacheKey;
|
|
143
|
+
_lastScanTime = Date.now();
|
|
144
|
+
return docs;
|
|
145
|
+
}
|
|
146
|
+
// ─── Source-file processing ───────────────────────────────────────────────────
|
|
147
|
+
// All ts-morph node types are `any` here — ts-morph is an optional dep and
|
|
148
|
+
// may not be present in the project consuming this package.
|
|
149
|
+
function _processSourceFile(
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
+
sourceFile, apiDir, filePath,
|
|
152
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
|
+
project) {
|
|
154
|
+
const results = [];
|
|
155
|
+
const fileRelPath = path.relative(apiDir, filePath);
|
|
156
|
+
const isTypeScriptFile = /\.(ts|tsx)$/i.test(filePath);
|
|
157
|
+
// ── Regular function declarations ──────────────────────────────────────────
|
|
158
|
+
for (const fn of sourceFile.getFunctions()) {
|
|
159
|
+
if (!fn.isExported())
|
|
160
|
+
continue;
|
|
161
|
+
const fnName = fn.getName();
|
|
162
|
+
if (!fnName)
|
|
163
|
+
continue;
|
|
164
|
+
if (RESERVED_NAMES.has(fnName))
|
|
165
|
+
continue;
|
|
166
|
+
if (!fn.isAsync())
|
|
167
|
+
continue;
|
|
168
|
+
const url = _deriveRpcUrl(apiDir, filePath, fnName);
|
|
169
|
+
const description = _extractDescription(fn);
|
|
170
|
+
const tags = _extractTags(fn, "tags");
|
|
171
|
+
const paramDescriptions = _extractParamDescriptions(fn);
|
|
172
|
+
const firstArg = isTypeScriptFile
|
|
173
|
+
? _resolvePayloadFromParams(fn.getParameters(), paramDescriptions, project)
|
|
174
|
+
: null;
|
|
175
|
+
const payload = firstArg?.type ?? null;
|
|
176
|
+
const response = isTypeScriptFile
|
|
177
|
+
? _resolveResponseType(fn.getReturnType(), project, Boolean(fn.getReturnTypeNode?.()))
|
|
178
|
+
: null;
|
|
179
|
+
const signature = isTypeScriptFile
|
|
180
|
+
? _buildSignature(fnName, firstArg?.name ?? null, payload, response)
|
|
181
|
+
: `${fnName}(...)`;
|
|
182
|
+
results.push({
|
|
183
|
+
url,
|
|
184
|
+
fnName,
|
|
185
|
+
filePath,
|
|
186
|
+
fileRelPath,
|
|
187
|
+
description,
|
|
188
|
+
typed: isTypeScriptFile,
|
|
189
|
+
firstArgName: firstArg?.name ?? null,
|
|
190
|
+
payload,
|
|
191
|
+
response,
|
|
192
|
+
signature,
|
|
193
|
+
tags,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// ── Arrow / function-expression variable declarations ──────────────────────
|
|
197
|
+
for (const varDecl of sourceFile.getVariableDeclarations()) {
|
|
198
|
+
const varStatement = varDecl.getVariableStatement();
|
|
199
|
+
if (!varStatement)
|
|
200
|
+
continue;
|
|
201
|
+
if (!varStatement.isExported())
|
|
202
|
+
continue;
|
|
203
|
+
const fnName = varDecl.getName();
|
|
204
|
+
if (!fnName)
|
|
205
|
+
continue;
|
|
206
|
+
if (RESERVED_NAMES.has(fnName))
|
|
207
|
+
continue;
|
|
208
|
+
const initializer = varDecl.getInitializer();
|
|
209
|
+
if (!initializer)
|
|
210
|
+
continue;
|
|
211
|
+
const kind = initializer.getKindName();
|
|
212
|
+
if (kind !== "ArrowFunction" && kind !== "FunctionExpression")
|
|
213
|
+
continue;
|
|
214
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
215
|
+
const arrowFn = initializer;
|
|
216
|
+
if (!arrowFn.isAsync())
|
|
217
|
+
continue;
|
|
218
|
+
const url = _deriveRpcUrl(apiDir, filePath, fnName);
|
|
219
|
+
// JSDoc lives on the variable statement for `const foo = async () => ...`
|
|
220
|
+
const jsDocs = varStatement.getJsDocs();
|
|
221
|
+
const description = jsDocs
|
|
222
|
+
.map((d) => d.getDescription().trim())
|
|
223
|
+
.join("\n")
|
|
224
|
+
.trim();
|
|
225
|
+
const tags = _extractTagsFromJsDocs(jsDocs, "tags");
|
|
226
|
+
const paramDescriptions = _extractParamDescriptionsFromJsDocs(jsDocs);
|
|
227
|
+
const firstArg = isTypeScriptFile
|
|
228
|
+
? _resolvePayloadFromParams(arrowFn.getParameters(), paramDescriptions, project)
|
|
229
|
+
: null;
|
|
230
|
+
const payload = firstArg?.type ?? null;
|
|
231
|
+
const response = isTypeScriptFile
|
|
232
|
+
? _resolveResponseType(arrowFn.getReturnType(), project, Boolean(arrowFn.getReturnTypeNode?.()))
|
|
233
|
+
: null;
|
|
234
|
+
const signature = isTypeScriptFile
|
|
235
|
+
? _buildSignature(fnName, firstArg?.name ?? null, payload, response)
|
|
236
|
+
: `${fnName}(...)`;
|
|
237
|
+
results.push({
|
|
238
|
+
url,
|
|
239
|
+
fnName,
|
|
240
|
+
filePath,
|
|
241
|
+
fileRelPath,
|
|
242
|
+
description,
|
|
243
|
+
typed: isTypeScriptFile,
|
|
244
|
+
firstArgName: firstArg?.name ?? null,
|
|
245
|
+
payload,
|
|
246
|
+
response,
|
|
247
|
+
signature,
|
|
248
|
+
tags,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
return results;
|
|
252
|
+
}
|
|
253
|
+
// ─── URL derivation (mirrors rpc-registry.ts::deriveRpcUrl) ──────────────────
|
|
254
|
+
function _deriveRpcUrl(apiDir, filePath, fnName) {
|
|
255
|
+
const rel = path.relative(apiDir, filePath);
|
|
256
|
+
const withoutExt = rel.replace(/\.(ts|js|tsx|jsx)$/, "");
|
|
257
|
+
let modulePath = withoutExt.split(path.sep).join("/");
|
|
258
|
+
if (modulePath.endsWith("/index")) {
|
|
259
|
+
modulePath = modulePath.slice(0, -6);
|
|
260
|
+
}
|
|
261
|
+
else if (modulePath === "index") {
|
|
262
|
+
modulePath = "";
|
|
263
|
+
}
|
|
264
|
+
const parts = ["api"];
|
|
265
|
+
if (modulePath)
|
|
266
|
+
parts.push(modulePath);
|
|
267
|
+
parts.push(fnName);
|
|
268
|
+
return "/" + parts.join("/");
|
|
269
|
+
}
|
|
270
|
+
// ─── JSDoc helpers ────────────────────────────────────────────────────────────
|
|
271
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
272
|
+
function _extractDescription(fn) {
|
|
273
|
+
const docs = fn.getJsDocs();
|
|
274
|
+
return docs
|
|
275
|
+
.map((d) => d.getDescription().trim())
|
|
276
|
+
.join("\n")
|
|
277
|
+
.trim();
|
|
278
|
+
}
|
|
279
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
280
|
+
function _extractTags(fn, tagName) {
|
|
281
|
+
return _extractTagsFromJsDocs(fn.getJsDocs(), tagName);
|
|
282
|
+
}
|
|
283
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
284
|
+
function _extractTagsFromJsDocs(jsDocs, tagName) {
|
|
285
|
+
const tags = [];
|
|
286
|
+
for (const doc of jsDocs) {
|
|
287
|
+
for (const tag of doc.getTags()) {
|
|
288
|
+
if (tag.getTagName() === tagName) {
|
|
289
|
+
const text = tag.getCommentText()?.trim();
|
|
290
|
+
if (text) {
|
|
291
|
+
// Allow comma-separated tags on one line: @tags users, auth
|
|
292
|
+
tags.push(...text
|
|
293
|
+
.split(",")
|
|
294
|
+
.map((t) => t.trim())
|
|
295
|
+
.filter(Boolean));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return tags;
|
|
301
|
+
}
|
|
302
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
303
|
+
function _extractParamDescriptions(fn) {
|
|
304
|
+
return _extractParamDescriptionsFromJsDocs(fn.getJsDocs());
|
|
305
|
+
}
|
|
306
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
307
|
+
function _extractParamDescriptionsFromJsDocs(jsDocs) {
|
|
308
|
+
const map = new Map();
|
|
309
|
+
for (const doc of jsDocs) {
|
|
310
|
+
for (const tag of doc.getTags()) {
|
|
311
|
+
if (tag.getTagName() === "param") {
|
|
312
|
+
// JSDocParameterTag exposes getName()
|
|
313
|
+
if (typeof tag.getName === "function") {
|
|
314
|
+
const name = tag.getName();
|
|
315
|
+
const comment = tag.getCommentText()?.trim() ?? "";
|
|
316
|
+
if (name)
|
|
317
|
+
map.set(name, comment);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return map;
|
|
323
|
+
}
|
|
324
|
+
// ─── Payload extraction ───────────────────────────────────────────────────────
|
|
325
|
+
function _resolvePayloadFromParams(
|
|
326
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
327
|
+
params, paramDescriptions,
|
|
328
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
329
|
+
project) {
|
|
330
|
+
// Find the first parameter that is not ctx / Context
|
|
331
|
+
for (const param of params) {
|
|
332
|
+
const name = param.getName();
|
|
333
|
+
if (name === "ctx")
|
|
334
|
+
continue;
|
|
335
|
+
const typeNode = param.getTypeNode();
|
|
336
|
+
const inferredType = param.getType();
|
|
337
|
+
const typeText = typeNode
|
|
338
|
+
? typeNode.getText()
|
|
339
|
+
: inferredType.getText();
|
|
340
|
+
if (typeText === "Context")
|
|
341
|
+
continue;
|
|
342
|
+
const confidence = _confidenceFromType(typeText, Boolean(typeNode));
|
|
343
|
+
const shape = _buildTypeShape(typeText, inferredType, project, new Set(), 0, confidence);
|
|
344
|
+
if (shape?.fields) {
|
|
345
|
+
for (const field of shape.fields) {
|
|
346
|
+
const description = paramDescriptions.get(field.name);
|
|
347
|
+
if (description)
|
|
348
|
+
field.description = description;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return shape ? { name, type: shape } : null;
|
|
352
|
+
}
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
// ─── Response extraction ──────────────────────────────────────────────────────
|
|
356
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
357
|
+
function _resolveResponseType(
|
|
358
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
359
|
+
returnType, project, hasExplicitReturnType) {
|
|
360
|
+
// Unwrap Promise<T>
|
|
361
|
+
let inner = returnType;
|
|
362
|
+
const typeText = returnType.getText();
|
|
363
|
+
if (typeText.startsWith("Promise<")) {
|
|
364
|
+
const typeArgs = returnType.getTypeArguments();
|
|
365
|
+
if (typeArgs.length > 0) {
|
|
366
|
+
inner = typeArgs[0];
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
const innerText = inner.getText();
|
|
370
|
+
// void / undefined → no data returned
|
|
371
|
+
if (innerText === "void" || innerText === "undefined")
|
|
372
|
+
return null;
|
|
373
|
+
const confidence = _confidenceFromType(innerText, hasExplicitReturnType);
|
|
374
|
+
return _buildTypeShape(innerText, inner, project, new Set(), 0, confidence);
|
|
375
|
+
}
|
|
376
|
+
// ─── Signature / confidence helpers ──────────────────────────────────────────
|
|
377
|
+
function _buildSignature(fnName, firstArgName, payload, response) {
|
|
378
|
+
const arg = firstArgName
|
|
379
|
+
? `${firstArgName}: ${payload ? _shapeSignature(payload) : "unknown"}`
|
|
380
|
+
: "";
|
|
381
|
+
const returnType = response ? _shapeSignature(response) : "void";
|
|
382
|
+
return `${fnName}(${arg}): Promise<${returnType}>`;
|
|
383
|
+
}
|
|
384
|
+
function _confidenceFromType(typeText, hasExplicitAnnotation) {
|
|
385
|
+
const clean = typeText.trim();
|
|
386
|
+
if (clean === "" ||
|
|
387
|
+
clean === "any" ||
|
|
388
|
+
clean === "unknown" ||
|
|
389
|
+
clean === "object") {
|
|
390
|
+
return "unknown";
|
|
391
|
+
}
|
|
392
|
+
return hasExplicitAnnotation ? "explicit" : "inferred";
|
|
393
|
+
}
|
|
394
|
+
function _displayTypeName(typeName) {
|
|
395
|
+
return typeName
|
|
396
|
+
.replace(/import\(["'][^)]+["']\)\./g, "")
|
|
397
|
+
.replace(/import\(["'][^)]+["']\)/g, "")
|
|
398
|
+
.replace(/Promise<(.+)>/g, "$1");
|
|
399
|
+
}
|
|
400
|
+
function _shapeSignature(shape) {
|
|
401
|
+
if (shape.kind === "array" && shape.fields && shape.fields.length > 0) {
|
|
402
|
+
return `${_fieldsToInlineType(shape.fields)}[]`;
|
|
403
|
+
}
|
|
404
|
+
if (shape.kind === "object" && shape.fields && shape.fields.length > 0) {
|
|
405
|
+
return _fieldsToInlineType(shape.fields);
|
|
406
|
+
}
|
|
407
|
+
return _displayTypeName(shape.typeName);
|
|
408
|
+
}
|
|
409
|
+
function _fieldsToInlineType(fields) {
|
|
410
|
+
return `{ ${fields
|
|
411
|
+
.map((field) => {
|
|
412
|
+
const name = field.required ? field.name : `${field.name}?`;
|
|
413
|
+
return `${name}: ${_displayTypeName(field.type)}`;
|
|
414
|
+
})
|
|
415
|
+
.join("; ")} }`;
|
|
416
|
+
}
|
|
417
|
+
// ─── Type shape builder ───────────────────────────────────────────────────────
|
|
418
|
+
const MAX_DEPTH = 3;
|
|
419
|
+
const TRIVIAL_PAYLOAD_TYPES = new Set([
|
|
420
|
+
"{}",
|
|
421
|
+
"unknown",
|
|
422
|
+
"any",
|
|
423
|
+
"Record<string, unknown>",
|
|
424
|
+
"Record<string, any>",
|
|
425
|
+
"object",
|
|
426
|
+
]);
|
|
427
|
+
const PRIMITIVE_TYPES = new Set([
|
|
428
|
+
"string",
|
|
429
|
+
"number",
|
|
430
|
+
"boolean",
|
|
431
|
+
"bigint",
|
|
432
|
+
"symbol",
|
|
433
|
+
"null",
|
|
434
|
+
"void",
|
|
435
|
+
"undefined",
|
|
436
|
+
"never",
|
|
437
|
+
]);
|
|
438
|
+
function _buildTypeShape(typeText,
|
|
439
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
440
|
+
type,
|
|
441
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
442
|
+
project, visiting, depth, confidence) {
|
|
443
|
+
// Empty object payloads are meaningful in RPC docs: `payload: {}` means the
|
|
444
|
+
// function accepts no fields, not that the argument type is unknown.
|
|
445
|
+
if (typeText.trim() === "{}") {
|
|
446
|
+
return { kind: "object", typeName: "{}", fields: [], confidence };
|
|
447
|
+
}
|
|
448
|
+
// Trivial / uninteresting shapes
|
|
449
|
+
if (TRIVIAL_PAYLOAD_TYPES.has(typeText.trim())) {
|
|
450
|
+
return { kind: "unknown", typeName: "unknown", confidence };
|
|
451
|
+
}
|
|
452
|
+
// Hard depth limit to prevent runaway recursion
|
|
453
|
+
if (depth >= MAX_DEPTH) {
|
|
454
|
+
return { kind: "unknown", typeName: typeText, confidence };
|
|
455
|
+
}
|
|
456
|
+
// Primitive
|
|
457
|
+
if (PRIMITIVE_TYPES.has(typeText.trim())) {
|
|
458
|
+
return { kind: "primitive", typeName: typeText.trim(), confidence };
|
|
459
|
+
}
|
|
460
|
+
// Literal types (string, number, boolean literals)
|
|
461
|
+
if (type.isStringLiteral() ||
|
|
462
|
+
type.isNumberLiteral() ||
|
|
463
|
+
type.isBooleanLiteral()) {
|
|
464
|
+
return { kind: "primitive", typeName: typeText, confidence };
|
|
465
|
+
}
|
|
466
|
+
// Array — T[] or Array<T>
|
|
467
|
+
if (type.isArray()) {
|
|
468
|
+
const elementType = type.getArrayElementType();
|
|
469
|
+
const elementShape = elementType
|
|
470
|
+
? _buildTypeShape(elementType.getText(), elementType, project, visiting, depth + 1, confidence)
|
|
471
|
+
: null;
|
|
472
|
+
const itemType = elementShape
|
|
473
|
+
? _shapeSignature(elementShape)
|
|
474
|
+
: elementType
|
|
475
|
+
? _displayTypeName(elementType.getText())
|
|
476
|
+
: "unknown";
|
|
477
|
+
return {
|
|
478
|
+
kind: "array",
|
|
479
|
+
typeName: `${itemType}[]`,
|
|
480
|
+
itemType,
|
|
481
|
+
fields: elementShape?.fields,
|
|
482
|
+
confidence,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
// Tuple — treat as an array of the first element's type
|
|
486
|
+
if (type.isTuple()) {
|
|
487
|
+
const tupleElements = type.getTupleElements();
|
|
488
|
+
const firstElement = tupleElements[0];
|
|
489
|
+
const elementShape = firstElement
|
|
490
|
+
? _buildTypeShape(firstElement.getText(), firstElement, project, visiting, depth + 1, confidence)
|
|
491
|
+
: null;
|
|
492
|
+
const itemType = elementShape
|
|
493
|
+
? _shapeSignature(elementShape)
|
|
494
|
+
: firstElement
|
|
495
|
+
? _displayTypeName(firstElement.getText())
|
|
496
|
+
: "unknown";
|
|
497
|
+
return {
|
|
498
|
+
kind: "array",
|
|
499
|
+
typeName: `${itemType}[]`,
|
|
500
|
+
itemType,
|
|
501
|
+
fields: elementShape?.fields,
|
|
502
|
+
confidence,
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
// Union — string | null, etc.
|
|
506
|
+
if (type.isUnion()) {
|
|
507
|
+
return { kind: "union", typeName: typeText, confidence };
|
|
508
|
+
}
|
|
509
|
+
// Intersection — show as object but don't try to expand members
|
|
510
|
+
if (type.isIntersection()) {
|
|
511
|
+
return { kind: "object", typeName: typeText, confidence };
|
|
512
|
+
}
|
|
513
|
+
// Object / interface — expand properties one level at a time
|
|
514
|
+
if (type.isObject() || type.isInterface()) {
|
|
515
|
+
const symbolName = type.getSymbol()?.getName() ?? typeText;
|
|
516
|
+
// Cycle detection
|
|
517
|
+
if (visiting.has(symbolName)) {
|
|
518
|
+
return {
|
|
519
|
+
kind: "unknown",
|
|
520
|
+
typeName: `${symbolName} (circular)`,
|
|
521
|
+
confidence,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
// Skip well-known built-in complex types that shouldn't be expanded
|
|
525
|
+
const skipBuiltins = /^(Promise|Map|Set|WeakMap|WeakSet|Date|RegExp|Error|Function|Symbol)\b/;
|
|
526
|
+
if (skipBuiltins.test(typeText)) {
|
|
527
|
+
return { kind: "primitive", typeName: typeText, confidence };
|
|
528
|
+
}
|
|
529
|
+
const nextVisiting = new Set(visiting);
|
|
530
|
+
nextVisiting.add(symbolName);
|
|
531
|
+
const props = type.getProperties();
|
|
532
|
+
if (props.length === 0) {
|
|
533
|
+
return { kind: "object", typeName: typeText, confidence };
|
|
534
|
+
}
|
|
535
|
+
const fields = [];
|
|
536
|
+
for (const prop of props) {
|
|
537
|
+
const propName = prop.getName();
|
|
538
|
+
// Skip symbol properties and TS internal members
|
|
539
|
+
if (propName.startsWith("[") || propName.startsWith("__"))
|
|
540
|
+
continue;
|
|
541
|
+
const declarations = prop.getDeclarations();
|
|
542
|
+
const locationNode = declarations.length > 0 ? declarations[0] : project.getSourceFiles()[0];
|
|
543
|
+
const propType = prop.getTypeAtLocation(locationNode);
|
|
544
|
+
const propTypeText = _displayTypeName(propType.getText());
|
|
545
|
+
const required = !prop.isOptional();
|
|
546
|
+
fields.push({ name: propName, type: propTypeText, required });
|
|
547
|
+
}
|
|
548
|
+
return { kind: "object", typeName: typeText, fields, confidence };
|
|
549
|
+
}
|
|
550
|
+
// any / unknown
|
|
551
|
+
if (type.isAny() || type.isUnknown()) {
|
|
552
|
+
return { kind: "unknown", typeName: "unknown", confidence: "unknown" };
|
|
553
|
+
}
|
|
554
|
+
// Fallback
|
|
555
|
+
return { kind: "primitive", typeName: typeText, confidence };
|
|
556
|
+
}
|
|
557
|
+
//# sourceMappingURL=docs-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-generator.js","sourceRoot":"","sources":["../src/docs-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mates-fullstack — docs-page.ts
|
|
3
|
+
*
|
|
4
|
+
* Builds and serves a self-contained HTML API documentation page at /api/docs.
|
|
5
|
+
* Takes RouteDoc objects from docs-generator.ts and renders a dark-themed,
|
|
6
|
+
* developer-focused interactive docs UI with a Try-it panel.
|
|
7
|
+
*/
|
|
8
|
+
/// <reference types="node" />
|
|
9
|
+
import type { ServerResponse } from "node:http";
|
|
10
|
+
import type { RouteDoc } from "./docs-generator.js";
|
|
11
|
+
/**
|
|
12
|
+
* Build a complete self-contained HTML string for the /api/docs page.
|
|
13
|
+
* No external dependencies — all CSS and JS are inlined.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildDocsHtml(docs: RouteDoc[], dev: boolean): string;
|
|
16
|
+
/**
|
|
17
|
+
* Write the docs HTML page to an HTTP ServerResponse.
|
|
18
|
+
*/
|
|
19
|
+
export declare function serveDocsPage(res: ServerResponse, docs: RouteDoc[], dev: boolean): void;
|
|
20
|
+
//# sourceMappingURL=docs-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-page.d.ts","sourceRoot":"","sources":["../src/docs-page.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAuB,MAAM,qBAAqB,CAAC;AAKzE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CA0DpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,QAAQ,EAAE,EAChB,GAAG,EAAE,OAAO,GACX,IAAI,CAON"}
|