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.
Files changed (202) hide show
  1. package/README.md +311 -0
  2. package/dist/arctic-auth.d.ts +101 -0
  3. package/dist/arctic-auth.d.ts.map +1 -0
  4. package/dist/arctic-auth.js +538 -0
  5. package/dist/arctic-auth.js.map +1 -0
  6. package/dist/asset-manifest.d.ts +14 -0
  7. package/dist/asset-manifest.d.ts.map +1 -0
  8. package/dist/asset-manifest.js +102 -0
  9. package/dist/asset-manifest.js.map +1 -0
  10. package/dist/browser.d.ts +18 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +25 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/build-esbuild.d.ts +29 -0
  15. package/dist/build-esbuild.d.ts.map +1 -0
  16. package/dist/build-esbuild.js +699 -0
  17. package/dist/build-esbuild.js.map +1 -0
  18. package/dist/build-prod.d.ts +126 -0
  19. package/dist/build-prod.d.ts.map +1 -0
  20. package/dist/build-prod.js +1014 -0
  21. package/dist/build-prod.js.map +1 -0
  22. package/dist/cli-new.d.ts +14 -0
  23. package/dist/cli-new.d.ts.map +1 -0
  24. package/dist/cli-new.js +637 -0
  25. package/dist/cli-new.js.map +1 -0
  26. package/dist/client.d.ts +43 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +130 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/cors.d.ts +16 -0
  31. package/dist/cors.d.ts.map +1 -0
  32. package/dist/cors.js +60 -0
  33. package/dist/cors.js.map +1 -0
  34. package/dist/ctx.d.ts +78 -0
  35. package/dist/ctx.d.ts.map +1 -0
  36. package/dist/ctx.js +280 -0
  37. package/dist/ctx.js.map +1 -0
  38. package/dist/dev-watcher.d.ts +23 -0
  39. package/dist/dev-watcher.d.ts.map +1 -0
  40. package/dist/dev-watcher.js +136 -0
  41. package/dist/dev-watcher.js.map +1 -0
  42. package/dist/docs-generator.d.ts +69 -0
  43. package/dist/docs-generator.d.ts.map +1 -0
  44. package/dist/docs-generator.js +557 -0
  45. package/dist/docs-generator.js.map +1 -0
  46. package/dist/docs-page.d.ts +20 -0
  47. package/dist/docs-page.d.ts.map +1 -0
  48. package/dist/docs-page.js +1152 -0
  49. package/dist/docs-page.js.map +1 -0
  50. package/dist/download.d.ts +78 -0
  51. package/dist/download.d.ts.map +1 -0
  52. package/dist/download.js +202 -0
  53. package/dist/download.js.map +1 -0
  54. package/dist/env-loader.d.ts +76 -0
  55. package/dist/env-loader.d.ts.map +1 -0
  56. package/dist/env-loader.js +213 -0
  57. package/dist/env-loader.js.map +1 -0
  58. package/dist/errors.d.ts +146 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +386 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/head.d.ts +31 -0
  63. package/dist/head.d.ts.map +1 -0
  64. package/dist/head.js +245 -0
  65. package/dist/head.js.map +1 -0
  66. package/dist/index.d.ts +30 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +30 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/internal-prefixes.d.ts +16 -0
  71. package/dist/internal-prefixes.d.ts.map +1 -0
  72. package/dist/internal-prefixes.js +16 -0
  73. package/dist/internal-prefixes.js.map +1 -0
  74. package/dist/internal.d.ts +25 -0
  75. package/dist/internal.d.ts.map +1 -0
  76. package/dist/internal.js +25 -0
  77. package/dist/internal.js.map +1 -0
  78. package/dist/jwt.d.ts +166 -0
  79. package/dist/jwt.d.ts.map +1 -0
  80. package/dist/jwt.js +261 -0
  81. package/dist/jwt.js.map +1 -0
  82. package/dist/log.d.ts +44 -0
  83. package/dist/log.d.ts.map +1 -0
  84. package/dist/log.js +66 -0
  85. package/dist/log.js.map +1 -0
  86. package/dist/logger.d.ts +76 -0
  87. package/dist/logger.d.ts.map +1 -0
  88. package/dist/logger.js +138 -0
  89. package/dist/logger.js.map +1 -0
  90. package/dist/main-runner.d.ts +59 -0
  91. package/dist/main-runner.d.ts.map +1 -0
  92. package/dist/main-runner.js +157 -0
  93. package/dist/main-runner.js.map +1 -0
  94. package/dist/mates-auth.d.ts +82 -0
  95. package/dist/mates-auth.d.ts.map +1 -0
  96. package/dist/mates-auth.js +323 -0
  97. package/dist/mates-auth.js.map +1 -0
  98. package/dist/middleware.d.ts +30 -0
  99. package/dist/middleware.d.ts.map +1 -0
  100. package/dist/middleware.js +67 -0
  101. package/dist/middleware.js.map +1 -0
  102. package/dist/project-resolver.d.ts +102 -0
  103. package/dist/project-resolver.d.ts.map +1 -0
  104. package/dist/project-resolver.js +271 -0
  105. package/dist/project-resolver.js.map +1 -0
  106. package/dist/rate-limit.d.ts +37 -0
  107. package/dist/rate-limit.d.ts.map +1 -0
  108. package/dist/rate-limit.js +109 -0
  109. package/dist/rate-limit.js.map +1 -0
  110. package/dist/redirect.d.ts +84 -0
  111. package/dist/redirect.d.ts.map +1 -0
  112. package/dist/redirect.js +105 -0
  113. package/dist/redirect.js.map +1 -0
  114. package/dist/renderer.d.ts +91 -0
  115. package/dist/renderer.d.ts.map +1 -0
  116. package/dist/renderer.js +630 -0
  117. package/dist/renderer.js.map +1 -0
  118. package/dist/request-logger.d.ts +12 -0
  119. package/dist/request-logger.d.ts.map +1 -0
  120. package/dist/request-logger.js +55 -0
  121. package/dist/request-logger.js.map +1 -0
  122. package/dist/rest.d.ts +25 -0
  123. package/dist/rest.d.ts.map +1 -0
  124. package/dist/rest.js +93 -0
  125. package/dist/rest.js.map +1 -0
  126. package/dist/router.d.ts +71 -0
  127. package/dist/router.d.ts.map +1 -0
  128. package/dist/router.js +222 -0
  129. package/dist/router.js.map +1 -0
  130. package/dist/rpc-registry.d.ts +84 -0
  131. package/dist/rpc-registry.d.ts.map +1 -0
  132. package/dist/rpc-registry.js +271 -0
  133. package/dist/rpc-registry.js.map +1 -0
  134. package/dist/rpc-runner.d.ts +82 -0
  135. package/dist/rpc-runner.d.ts.map +1 -0
  136. package/dist/rpc-runner.js +564 -0
  137. package/dist/rpc-runner.js.map +1 -0
  138. package/dist/sanitize.d.ts +61 -0
  139. package/dist/sanitize.d.ts.map +1 -0
  140. package/dist/sanitize.js +193 -0
  141. package/dist/sanitize.js.map +1 -0
  142. package/dist/security-headers.d.ts +114 -0
  143. package/dist/security-headers.d.ts.map +1 -0
  144. package/dist/security-headers.js +121 -0
  145. package/dist/security-headers.js.map +1 -0
  146. package/dist/server-fn.d.ts +323 -0
  147. package/dist/server-fn.d.ts.map +1 -0
  148. package/dist/server-fn.js +373 -0
  149. package/dist/server-fn.js.map +1 -0
  150. package/dist/server-public.d.ts +13 -0
  151. package/dist/server-public.d.ts.map +1 -0
  152. package/dist/server-public.js +12 -0
  153. package/dist/server-public.js.map +1 -0
  154. package/dist/server-timeout.d.ts +38 -0
  155. package/dist/server-timeout.d.ts.map +1 -0
  156. package/dist/server-timeout.js +46 -0
  157. package/dist/server-timeout.js.map +1 -0
  158. package/dist/server.d.ts +100 -0
  159. package/dist/server.d.ts.map +1 -0
  160. package/dist/server.js +1218 -0
  161. package/dist/server.js.map +1 -0
  162. package/dist/socket-router.d.ts +153 -0
  163. package/dist/socket-router.d.ts.map +1 -0
  164. package/dist/socket-router.js +612 -0
  165. package/dist/socket-router.js.map +1 -0
  166. package/dist/sso.d.ts +90 -0
  167. package/dist/sso.d.ts.map +1 -0
  168. package/dist/sso.js +261 -0
  169. package/dist/sso.js.map +1 -0
  170. package/dist/ssr-context.d.ts +49 -0
  171. package/dist/ssr-context.d.ts.map +1 -0
  172. package/dist/ssr-context.js +85 -0
  173. package/dist/ssr-context.js.map +1 -0
  174. package/dist/ssr-globals.d.ts +32 -0
  175. package/dist/ssr-globals.d.ts.map +1 -0
  176. package/dist/ssr-globals.js +1010 -0
  177. package/dist/ssr-globals.js.map +1 -0
  178. package/dist/ssr-template.d.ts +73 -0
  179. package/dist/ssr-template.d.ts.map +1 -0
  180. package/dist/ssr-template.js +507 -0
  181. package/dist/ssr-template.js.map +1 -0
  182. package/dist/stack-mapper.d.ts +25 -0
  183. package/dist/stack-mapper.d.ts.map +1 -0
  184. package/dist/stack-mapper.js +139 -0
  185. package/dist/stack-mapper.js.map +1 -0
  186. package/dist/stream.d.ts +89 -0
  187. package/dist/stream.d.ts.map +1 -0
  188. package/dist/stream.js +299 -0
  189. package/dist/stream.js.map +1 -0
  190. package/dist/upload.d.ts +69 -0
  191. package/dist/upload.d.ts.map +1 -0
  192. package/dist/upload.js +110 -0
  193. package/dist/upload.js.map +1 -0
  194. package/dist/validate.d.ts +58 -0
  195. package/dist/validate.d.ts.map +1 -0
  196. package/dist/validate.js +89 -0
  197. package/dist/validate.js.map +1 -0
  198. package/dist/verify-package.d.ts +3 -0
  199. package/dist/verify-package.d.ts.map +1 -0
  200. package/dist/verify-package.js +128 -0
  201. package/dist/verify-package.js.map +1 -0
  202. 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"}