@gloocan/cat-inspector 0.1.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 (201) hide show
  1. package/dist/artifact-helpers.d.ts +4 -0
  2. package/dist/artifact-helpers.d.ts.map +1 -0
  3. package/dist/artifact-helpers.js +21 -0
  4. package/dist/artifact-helpers.js.map +1 -0
  5. package/dist/ast/get-all-ts-files.d.ts +5 -0
  6. package/dist/ast/get-all-ts-files.d.ts.map +1 -0
  7. package/dist/ast/get-all-ts-files.js +36 -0
  8. package/dist/ast/get-all-ts-files.js.map +1 -0
  9. package/dist/ast/merge-ast.d.ts +3 -0
  10. package/dist/ast/merge-ast.d.ts.map +1 -0
  11. package/dist/ast/merge-ast.js +40 -0
  12. package/dist/ast/merge-ast.js.map +1 -0
  13. package/dist/ast/run-ast-scanner.d.ts +15 -0
  14. package/dist/ast/run-ast-scanner.d.ts.map +1 -0
  15. package/dist/ast/run-ast-scanner.js +44 -0
  16. package/dist/ast/run-ast-scanner.js.map +1 -0
  17. package/dist/ast/scan-for-labels.d.ts +20 -0
  18. package/dist/ast/scan-for-labels.d.ts.map +1 -0
  19. package/dist/ast/scan-for-labels.js +88 -0
  20. package/dist/ast/scan-for-labels.js.map +1 -0
  21. package/dist/ast/scan-for-returns.d.ts +13 -0
  22. package/dist/ast/scan-for-returns.d.ts.map +1 -0
  23. package/dist/ast/scan-for-returns.js +48 -0
  24. package/dist/ast/scan-for-returns.js.map +1 -0
  25. package/dist/ast/type-expand.d.ts +16 -0
  26. package/dist/ast/type-expand.d.ts.map +1 -0
  27. package/dist/ast/type-expand.js +118 -0
  28. package/dist/ast/type-expand.js.map +1 -0
  29. package/dist/ast/visit-node.d.ts +31 -0
  30. package/dist/ast/visit-node.d.ts.map +1 -0
  31. package/dist/ast/visit-node.js +298 -0
  32. package/dist/ast/visit-node.js.map +1 -0
  33. package/dist/bootstrap.d.ts +105 -0
  34. package/dist/bootstrap.d.ts.map +1 -0
  35. package/dist/bootstrap.js +121 -0
  36. package/dist/bootstrap.js.map +1 -0
  37. package/dist/catalog-bootstrap-cache.d.ts +23 -0
  38. package/dist/catalog-bootstrap-cache.d.ts.map +1 -0
  39. package/dist/catalog-bootstrap-cache.js +54 -0
  40. package/dist/catalog-bootstrap-cache.js.map +1 -0
  41. package/dist/catalog-fingerprint.d.ts +20 -0
  42. package/dist/catalog-fingerprint.d.ts.map +1 -0
  43. package/dist/catalog-fingerprint.js +57 -0
  44. package/dist/catalog-fingerprint.js.map +1 -0
  45. package/dist/coverage/compute-coverage.d.ts +41 -0
  46. package/dist/coverage/compute-coverage.d.ts.map +1 -0
  47. package/dist/coverage/compute-coverage.js +229 -0
  48. package/dist/coverage/compute-coverage.js.map +1 -0
  49. package/dist/coverage/scan-all-service-candidates.d.ts +15 -0
  50. package/dist/coverage/scan-all-service-candidates.d.ts.map +1 -0
  51. package/dist/coverage/scan-all-service-candidates.js +73 -0
  52. package/dist/coverage/scan-all-service-candidates.js.map +1 -0
  53. package/dist/coverage/scan-express-candidates.d.ts +17 -0
  54. package/dist/coverage/scan-express-candidates.d.ts.map +1 -0
  55. package/dist/coverage/scan-express-candidates.js +300 -0
  56. package/dist/coverage/scan-express-candidates.js.map +1 -0
  57. package/dist/coverage/scan-reachable-services.d.ts +13 -0
  58. package/dist/coverage/scan-reachable-services.d.ts.map +1 -0
  59. package/dist/coverage/scan-reachable-services.js +469 -0
  60. package/dist/coverage/scan-reachable-services.js.map +1 -0
  61. package/dist/coverage/types.d.ts +32 -0
  62. package/dist/coverage/types.d.ts.map +1 -0
  63. package/dist/coverage/types.js +2 -0
  64. package/dist/coverage/types.js.map +1 -0
  65. package/dist/decorators/cat-class.d.ts +11 -0
  66. package/dist/decorators/cat-class.d.ts.map +1 -0
  67. package/dist/decorators/cat-class.js +20 -0
  68. package/dist/decorators/cat-class.js.map +1 -0
  69. package/dist/decorators/cat.d.ts +3 -0
  70. package/dist/decorators/cat.d.ts.map +1 -0
  71. package/dist/decorators/cat.js +102 -0
  72. package/dist/decorators/cat.js.map +1 -0
  73. package/dist/express-inspector-correlation.d.ts +23 -0
  74. package/dist/express-inspector-correlation.d.ts.map +1 -0
  75. package/dist/express-inspector-correlation.js +50 -0
  76. package/dist/express-inspector-correlation.js.map +1 -0
  77. package/dist/express-playground-mocks.d.ts +28 -0
  78. package/dist/express-playground-mocks.d.ts.map +1 -0
  79. package/dist/express-playground-mocks.js +55 -0
  80. package/dist/express-playground-mocks.js.map +1 -0
  81. package/dist/express-qa-host-minio-upload.d.ts +16 -0
  82. package/dist/express-qa-host-minio-upload.d.ts.map +1 -0
  83. package/dist/express-qa-host-minio-upload.js +56 -0
  84. package/dist/express-qa-host-minio-upload.js.map +1 -0
  85. package/dist/express.d.ts +21 -0
  86. package/dist/express.d.ts.map +1 -0
  87. package/dist/express.js +167 -0
  88. package/dist/express.js.map +1 -0
  89. package/dist/functional.d.ts +15 -0
  90. package/dist/functional.d.ts.map +1 -0
  91. package/dist/functional.js +165 -0
  92. package/dist/functional.js.map +1 -0
  93. package/dist/graph/relationships.d.ts +9 -0
  94. package/dist/graph/relationships.d.ts.map +1 -0
  95. package/dist/graph/relationships.js +92 -0
  96. package/dist/graph/relationships.js.map +1 -0
  97. package/dist/http-bridge-registry.d.ts +26 -0
  98. package/dist/http-bridge-registry.d.ts.map +1 -0
  99. package/dist/http-bridge-registry.js +39 -0
  100. package/dist/http-bridge-registry.js.map +1 -0
  101. package/dist/index.d.ts +36 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +35 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/invoke-policy.d.ts +34 -0
  106. package/dist/invoke-policy.d.ts.map +1 -0
  107. package/dist/invoke-policy.js +72 -0
  108. package/dist/invoke-policy.js.map +1 -0
  109. package/dist/invoke-runtime-config.d.ts +4 -0
  110. package/dist/invoke-runtime-config.d.ts.map +1 -0
  111. package/dist/invoke-runtime-config.js +15 -0
  112. package/dist/invoke-runtime-config.js.map +1 -0
  113. package/dist/jobs/in-memory-job-registry.d.ts +21 -0
  114. package/dist/jobs/in-memory-job-registry.d.ts.map +1 -0
  115. package/dist/jobs/in-memory-job-registry.js +44 -0
  116. package/dist/jobs/in-memory-job-registry.js.map +1 -0
  117. package/dist/logger.d.ts +9 -0
  118. package/dist/logger.d.ts.map +1 -0
  119. package/dist/logger.js +17 -0
  120. package/dist/logger.js.map +1 -0
  121. package/dist/openapi/registry-to-openapi.d.ts +11 -0
  122. package/dist/openapi/registry-to-openapi.d.ts.map +1 -0
  123. package/dist/openapi/registry-to-openapi.js +61 -0
  124. package/dist/openapi/registry-to-openapi.js.map +1 -0
  125. package/dist/registry-state.d.ts +107 -0
  126. package/dist/registry-state.d.ts.map +1 -0
  127. package/dist/registry-state.js +302 -0
  128. package/dist/registry-state.js.map +1 -0
  129. package/dist/return.d.ts +14 -0
  130. package/dist/return.d.ts.map +1 -0
  131. package/dist/return.js +107 -0
  132. package/dist/return.js.map +1 -0
  133. package/dist/rpc.d.ts +7 -0
  134. package/dist/rpc.d.ts.map +1 -0
  135. package/dist/rpc.js +287 -0
  136. package/dist/rpc.js.map +1 -0
  137. package/dist/serialize-rpc-result.d.ts +38 -0
  138. package/dist/serialize-rpc-result.d.ts.map +1 -0
  139. package/dist/serialize-rpc-result.js +132 -0
  140. package/dist/serialize-rpc-result.js.map +1 -0
  141. package/dist/session-store.d.ts +9 -0
  142. package/dist/session-store.d.ts.map +1 -0
  143. package/dist/session-store.js +19 -0
  144. package/dist/session-store.js.map +1 -0
  145. package/dist/source-utils.d.ts +19 -0
  146. package/dist/source-utils.d.ts.map +1 -0
  147. package/dist/source-utils.js +65 -0
  148. package/dist/source-utils.js.map +1 -0
  149. package/dist/transport/remote-bridge-cli.d.ts +2 -0
  150. package/dist/transport/remote-bridge-cli.d.ts.map +1 -0
  151. package/dist/transport/remote-bridge-cli.js +12 -0
  152. package/dist/transport/remote-bridge-cli.js.map +1 -0
  153. package/dist/transport/remote-inspector-bridge.d.ts +18 -0
  154. package/dist/transport/remote-inspector-bridge.d.ts.map +1 -0
  155. package/dist/transport/remote-inspector-bridge.js +71 -0
  156. package/dist/transport/remote-inspector-bridge.js.map +1 -0
  157. package/dist/transport/socket-io-playground.d.ts +78 -0
  158. package/dist/transport/socket-io-playground.d.ts.map +1 -0
  159. package/dist/transport/socket-io-playground.js +875 -0
  160. package/dist/transport/socket-io-playground.js.map +1 -0
  161. package/dist/transport/socket-io.d.ts +4 -0
  162. package/dist/transport/socket-io.d.ts.map +1 -0
  163. package/dist/transport/socket-io.js +4 -0
  164. package/dist/transport/socket-io.js.map +1 -0
  165. package/dist/transport/ws-server.d.ts +42 -0
  166. package/dist/transport/ws-server.d.ts.map +1 -0
  167. package/dist/transport/ws-server.js +429 -0
  168. package/dist/transport/ws-server.js.map +1 -0
  169. package/dist/type-string-normalize.d.ts +24 -0
  170. package/dist/type-string-normalize.d.ts.map +1 -0
  171. package/dist/type-string-normalize.js +178 -0
  172. package/dist/type-string-normalize.js.map +1 -0
  173. package/dist/types.d.ts +218 -0
  174. package/dist/types.d.ts.map +1 -0
  175. package/dist/types.js +2 -0
  176. package/dist/types.js.map +1 -0
  177. package/dist/upload/fetch-file-url.d.ts +24 -0
  178. package/dist/upload/fetch-file-url.d.ts.map +1 -0
  179. package/dist/upload/fetch-file-url.js +130 -0
  180. package/dist/upload/fetch-file-url.js.map +1 -0
  181. package/dist/upload/host-minio-client.d.ts +30 -0
  182. package/dist/upload/host-minio-client.d.ts.map +1 -0
  183. package/dist/upload/host-minio-client.js +56 -0
  184. package/dist/upload/host-minio-client.js.map +1 -0
  185. package/dist/upload/materialize.d.ts +110 -0
  186. package/dist/upload/materialize.d.ts.map +1 -0
  187. package/dist/upload/materialize.js +466 -0
  188. package/dist/upload/materialize.js.map +1 -0
  189. package/dist/upload/upload-store.d.ts +44 -0
  190. package/dist/upload/upload-store.d.ts.map +1 -0
  191. package/dist/upload/upload-store.js +86 -0
  192. package/dist/upload/upload-store.js.map +1 -0
  193. package/dist/validate-params-json-schema.d.ts +13 -0
  194. package/dist/validate-params-json-schema.d.ts.map +1 -0
  195. package/dist/validate-params-json-schema.js +37 -0
  196. package/dist/validate-params-json-schema.js.map +1 -0
  197. package/dist/validate-return-json-schema.d.ts +9 -0
  198. package/dist/validate-return-json-schema.d.ts.map +1 -0
  199. package/dist/validate-return-json-schema.js +33 -0
  200. package/dist/validate-return-json-schema.js.map +1 -0
  201. package/package.json +63 -0
@@ -0,0 +1,4 @@
1
+ import type { RpcArtifactRef } from './types.js';
2
+ /** Normalize artifact-like objects nested under `result` into `RpcResponse.artifacts` (optional UX helper). */
3
+ export declare function extractArtifactsFromResult(result: unknown): RpcArtifactRef[] | undefined;
4
+ //# sourceMappingURL=artifact-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-helpers.d.ts","sourceRoot":"","sources":["../src/artifact-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,+GAA+G;AAC/G,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,SAAS,CAgBxF"}
@@ -0,0 +1,21 @@
1
+ /** Normalize artifact-like objects nested under `result` into `RpcResponse.artifacts` (optional UX helper). */
2
+ export function extractArtifactsFromResult(result) {
3
+ if (!result || typeof result !== 'object')
4
+ return undefined;
5
+ const r = result;
6
+ const ex = r.express;
7
+ if (ex && typeof ex === 'object' && 'handlerReturn' in ex) {
8
+ return extractArtifactsFromResult(ex.handlerReturn);
9
+ }
10
+ const raw = r.artifacts;
11
+ if (!Array.isArray(raw))
12
+ return undefined;
13
+ const out = [];
14
+ for (const item of raw) {
15
+ if (item && typeof item === 'object' && typeof item.kind === 'string') {
16
+ out.push(item);
17
+ }
18
+ }
19
+ return out.length > 0 ? out : undefined;
20
+ }
21
+ //# sourceMappingURL=artifact-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-helpers.js","sourceRoot":"","sources":["../src/artifact-helpers.ts"],"names":[],"mappings":"AAEA,+GAA+G;AAC/G,MAAM,UAAU,0BAA0B,CAAC,MAAe;IACzD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC3D,MAAM,CAAC,GAAG,MAAiC,CAAA;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAA;IACpB,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,eAAe,IAAI,EAAE,EAAE,CAAC;QAC3D,OAAO,0BAA0B,CAAE,EAAkC,CAAC,aAAa,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAA;IACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IACzC,MAAM,GAAG,GAAqB,EAAE,CAAA;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAQ,IAAuB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3F,GAAG,CAAC,IAAI,CAAC,IAAsB,CAAC,CAAA;QACjC,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;AACxC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface GetAllTsFilesOptions {
2
+ skipDirNames?: Set<string>;
3
+ }
4
+ export declare function getAllTsFiles(dir: string, options?: GetAllTsFilesOptions): string[];
5
+ //# sourceMappingURL=get-all-ts-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-all-ts-files.d.ts","sourceRoot":"","sources":["../../src/ast/get-all-ts-files.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACpC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC1B;AAED,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GAChC,MAAM,EAAE,CAwBV"}
@@ -0,0 +1,36 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const DEFAULT_SKIP = new Set([
4
+ 'node_modules',
5
+ 'dist',
6
+ '.git',
7
+ 'coverage',
8
+ '.vite',
9
+ ]);
10
+ export function getAllTsFiles(dir, options = {}) {
11
+ const skip = options.skipDirNames ?? DEFAULT_SKIP;
12
+ const results = [];
13
+ function walk(current) {
14
+ let entries;
15
+ try {
16
+ entries = fs.readdirSync(current, { withFileTypes: true });
17
+ }
18
+ catch {
19
+ return;
20
+ }
21
+ for (const ent of entries) {
22
+ const full = path.join(current, ent.name);
23
+ if (ent.isDirectory()) {
24
+ if (skip.has(ent.name))
25
+ continue;
26
+ walk(full);
27
+ }
28
+ else if (ent.isFile() && ent.name.endsWith('.ts') && !ent.name.endsWith('.d.ts')) {
29
+ results.push(full);
30
+ }
31
+ }
32
+ }
33
+ walk(dir);
34
+ return results;
35
+ }
36
+ //# sourceMappingURL=get-all-ts-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-all-ts-files.js","sourceRoot":"","sources":["../../src/ast/get-all-ts-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC5B,cAAc;IACd,MAAM;IACN,MAAM;IACN,UAAU;IACV,OAAO;CACP,CAAC,CAAA;AAMF,MAAM,UAAU,aAAa,CAC5B,GAAW,EACX,UAAgC,EAAE;IAElC,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,IAAI,YAAY,CAAA;IACjD,MAAM,OAAO,GAAa,EAAE,CAAA;IAE5B,SAAS,IAAI,CAAC,OAAe;QAC5B,IAAI,OAAoB,CAAA;QACxB,IAAI,CAAC;YACJ,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;QAAC,MAAM,CAAC;YACR,OAAM;QACP,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBAChC,IAAI,CAAC,IAAI,CAAC,CAAA;YACX,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,OAAO,CAAA;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AstMethodResult } from './visit-node.js';
2
+ export declare function mergeASTIntoRegistry(astResults: AstMethodResult[]): void;
3
+ //# sourceMappingURL=merge-ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-ast.d.ts","sourceRoot":"","sources":["../../src/ast/merge-ast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGtD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI,CAuCxE"}
@@ -0,0 +1,40 @@
1
+ import { Registry } from '../registry-state.js';
2
+ export function mergeASTIntoRegistry(astResults) {
3
+ for (const row of astResults) {
4
+ const { fnName, className, returns, throws, apiReturns } = row;
5
+ const fnKey = `${className}.${fnName}`;
6
+ if (!Registry.has(fnKey))
7
+ continue;
8
+ const meta = Registry.get(fnKey);
9
+ if (row.paramsFromAst && row.paramsFromAst.length > 0) {
10
+ meta.params = row.paramsFromAst;
11
+ }
12
+ if (row.declaredReturnFromAst !== undefined) {
13
+ meta.declaredReturn = row.declaredReturnFromAst;
14
+ }
15
+ for (const { label, type } of returns) {
16
+ const entry = meta.returns.find((r) => r.label === label);
17
+ if (entry) {
18
+ entry.type = type;
19
+ entry.status = 'resolved';
20
+ }
21
+ }
22
+ for (const { label, type } of throws) {
23
+ const entry = meta.errors.find((e) => e.label === label);
24
+ if (entry) {
25
+ entry.type = type;
26
+ entry.status = 'resolved';
27
+ }
28
+ }
29
+ for (const { label, statusCode, bodyType } of apiReturns) {
30
+ const entry = meta.apiResponses.find((r) => r.label === label);
31
+ if (entry) {
32
+ if (statusCode !== null)
33
+ entry.statusCode = statusCode;
34
+ entry.bodyShape = bodyType;
35
+ entry.status = 'resolved';
36
+ }
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=merge-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-ast.js","sourceRoot":"","sources":["../../src/ast/merge-ast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,MAAM,UAAU,oBAAoB,CAAC,UAA6B;IACjE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAA;QAC9D,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAQ;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAA;QAEjC,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,aAAa,CAAA;QAChC,CAAC;QACD,IAAI,GAAG,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,qBAAqB,CAAA;QAChD,CAAC;QAED,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;YACzD,IAAI,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;gBACjB,KAAK,CAAC,MAAM,GAAG,UAAU,CAAA;YAC1B,CAAC;QACF,CAAC;QAED,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;YACxD,IAAI,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;gBACjB,KAAK,CAAC,MAAM,GAAG,UAAU,CAAA;YAC1B,CAAC;QACF,CAAC;QAED,KAAK,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACX,IAAI,UAAU,KAAK,IAAI;oBAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAA;gBACtD,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAA;gBAC1B,KAAK,CAAC,MAAM,GAAG,UAAU,CAAA;YAC1B,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import ts from 'typescript';
2
+ import { type GetAllTsFilesOptions } from './get-all-ts-files.js';
3
+ import type { ExpandTypeOptions } from './type-expand.js';
4
+ import type { AstMethodResult } from './visit-node.js';
5
+ export interface RunAstScannerOptions {
6
+ getAllTsFilesOptions?: GetAllTsFilesOptions;
7
+ /** Extra compiler options merged over parsed config */
8
+ compilerOptions?: ts.CompilerOptions;
9
+ /** If set, only these files are in the program (for tests / narrow scans) */
10
+ files?: string[];
11
+ expandParamTypes?: boolean;
12
+ expandParamTypesOptions?: ExpandTypeOptions;
13
+ }
14
+ export declare function runASTScanner(rootDir: string, options?: RunAstScannerOptions): AstMethodResult[];
15
+ //# sourceMappingURL=run-ast-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-ast-scanner.d.ts","sourceRoot":"","sources":["../../src/ast/run-ast-scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGtD,MAAM,WAAW,oBAAoB;IACpC,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,uDAAuD;IACvD,eAAe,CAAC,EAAE,EAAE,CAAC,eAAe,CAAA;IACpC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,uBAAuB,CAAC,EAAE,iBAAiB,CAAA;CAC3C;AAgCD,wBAAgB,aAAa,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,oBAAyB,GAChC,eAAe,EAAE,CAsBnB"}
@@ -0,0 +1,44 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import ts from 'typescript';
4
+ import { getAllTsFiles } from './get-all-ts-files.js';
5
+ import { visitNode } from './visit-node.js';
6
+ function loadCompilerOptions(rootDir, extra) {
7
+ const configPath = ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.json');
8
+ if (!configPath) {
9
+ return {
10
+ ...(extra ?? {}),
11
+ target: ts.ScriptTarget.ES2022,
12
+ module: ts.ModuleKind.NodeNext,
13
+ moduleResolution: ts.ModuleResolutionKind.NodeNext,
14
+ experimentalDecorators: true,
15
+ emitDecoratorMetadata: true,
16
+ strict: true,
17
+ };
18
+ }
19
+ const read = ts.readConfigFile(configPath, (p) => fs.readFileSync(p, 'utf8'));
20
+ if (read.error) {
21
+ throw new Error(ts.formatDiagnostic(read.error, ts.createCompilerHost({})));
22
+ }
23
+ const parsed = ts.parseJsonConfigFileContent(read.config, ts.sys, path.dirname(configPath), undefined, configPath);
24
+ return { ...parsed.options, ...extra };
25
+ }
26
+ export function runASTScanner(rootDir, options = {}) {
27
+ const files = options.files ?? getAllTsFiles(rootDir, options.getAllTsFilesOptions);
28
+ const results = [];
29
+ const compilerOptions = loadCompilerOptions(rootDir, options.compilerOptions);
30
+ const program = ts.createProgram(files, compilerOptions);
31
+ const checker = program.getTypeChecker();
32
+ for (const filePath of files) {
33
+ const source = program.getSourceFile(filePath);
34
+ if (!source)
35
+ continue;
36
+ ts.forEachChild(source, (node) => visitNode(node, source, checker, results, {
37
+ expandParamTypes: options.expandParamTypes ?? true,
38
+ expandParamTypesOptions: options.expandParamTypesOptions,
39
+ program,
40
+ }));
41
+ }
42
+ return results;
43
+ }
44
+ //# sourceMappingURL=run-ast-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-ast-scanner.js","sourceRoot":"","sources":["../../src/ast/run-ast-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,OAAO,EAAE,aAAa,EAA6B,MAAM,uBAAuB,CAAA;AAGhF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAY3C,SAAS,mBAAmB,CAC3B,OAAe,EACf,KAA0B;IAE1B,MAAM,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;IACjF,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO;YACN,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAChB,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;YAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ;YAC9B,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ;YAClD,sBAAsB,EAAE,IAAI;YAC5B,qBAAqB,EAAE,IAAI;YAC3B,MAAM,EAAE,IAAI;SACZ,CAAA;IACF,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7E,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5E,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,0BAA0B,CAC3C,IAAI,CAAC,MAAM,EACX,EAAE,CAAC,GAAG,EACN,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EACxB,SAAS,EACT,UAAU,CACV,CAAA;IACD,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,OAAe,EACf,UAAgC,EAAE;IAElC,MAAM,KAAK,GACV,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACtE,MAAM,OAAO,GAAsB,EAAE,CAAA;IACrC,MAAM,eAAe,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IAE7E,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAA;IAExC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAChC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;YACzC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;YAClD,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;YACxD,OAAO;SACP,CAAC,CACF,CAAA;IACF,CAAC;IAED,OAAO,OAAO,CAAA;AACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ import ts from 'typescript';
2
+ export declare function parseThrowCall(node: ts.CallExpression): {
3
+ label: string;
4
+ errorExpr: ts.Expression;
5
+ } | null;
6
+ export declare function parseApiReturnCall(node: ts.CallExpression): {
7
+ label: string;
8
+ statusCodeExpr: ts.Expression;
9
+ bodyExpr: ts.Expression;
10
+ } | null;
11
+ export declare function scanForThrows(node: ts.Node, checker: ts.TypeChecker, results: {
12
+ label: string;
13
+ type: string;
14
+ }[]): void;
15
+ export declare function scanForApiReturns(node: ts.Node, checker: ts.TypeChecker, results: {
16
+ label: string;
17
+ statusCode: number | null;
18
+ bodyType: string;
19
+ }[]): void;
20
+ //# sourceMappingURL=scan-for-labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-for-labels.d.ts","sourceRoot":"","sources":["../../src/ast/scan-for-labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAkB3B,wBAAgB,cAAc,CAC7B,IAAI,EAAE,EAAE,CAAC,cAAc,GACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAA;CAAE,GAAG,IAAI,CAmBpD;AAED,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,EAAE,CAAC,cAAc,GACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,EAAE,CAAC,UAAU,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAA;CAAE,GAAG,IAAI,CAmBlF;AAED,wBAAgB,aAAa,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACxC,IAAI,CAYN;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,GACvE,IAAI,CAiBN"}
@@ -0,0 +1,88 @@
1
+ import ts from 'typescript';
2
+ function stringLiteralText(n) {
3
+ if (ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n))
4
+ return n.text;
5
+ return null;
6
+ }
7
+ function unwrapCallee(expr) {
8
+ if (ts.isParenthesizedExpression(expr))
9
+ return unwrapCallee(expr.expression);
10
+ return expr;
11
+ }
12
+ function isCommaCallee(expr, name) {
13
+ if (!ts.isBinaryExpression(expr))
14
+ return false;
15
+ if (expr.operatorToken.kind !== ts.SyntaxKind.CommaToken)
16
+ return false;
17
+ return ts.isIdentifier(expr.right) && expr.right.text === name;
18
+ }
19
+ export function parseThrowCall(node) {
20
+ const args = node.arguments;
21
+ if (args.length < 2)
22
+ return null;
23
+ const cal = unwrapCallee(node.expression);
24
+ if (ts.isIdentifier(cal) && cal.text === 'Throw') {
25
+ const label = stringLiteralText(args[0]);
26
+ if (label === null)
27
+ return null;
28
+ return { label, errorExpr: args[1] };
29
+ }
30
+ if (isCommaCallee(cal, 'Throw')) {
31
+ const label = stringLiteralText(args[0]);
32
+ if (label === null)
33
+ return null;
34
+ return { label, errorExpr: args[1] };
35
+ }
36
+ return null;
37
+ }
38
+ export function parseApiReturnCall(node) {
39
+ const args = node.arguments;
40
+ if (args.length < 3)
41
+ return null;
42
+ const cal = unwrapCallee(node.expression);
43
+ if (ts.isIdentifier(cal) && cal.text === 'ApiReturn') {
44
+ const label = stringLiteralText(args[0]);
45
+ if (label === null)
46
+ return null;
47
+ return { label, statusCodeExpr: args[1], bodyExpr: args[2] };
48
+ }
49
+ if (isCommaCallee(cal, 'ApiReturn')) {
50
+ const label = stringLiteralText(args[0]);
51
+ if (label === null)
52
+ return null;
53
+ return { label, statusCodeExpr: args[1], bodyExpr: args[2] };
54
+ }
55
+ return null;
56
+ }
57
+ export function scanForThrows(node, checker, results) {
58
+ if (ts.isCallExpression(node)) {
59
+ const parsed = parseThrowCall(node);
60
+ if (parsed) {
61
+ const type = checker.getTypeAtLocation(parsed.errorExpr);
62
+ results.push({
63
+ label: parsed.label,
64
+ type: checker.typeToString(type),
65
+ });
66
+ }
67
+ }
68
+ ts.forEachChild(node, (child) => scanForThrows(child, checker, results));
69
+ }
70
+ export function scanForApiReturns(node, checker, results) {
71
+ if (ts.isCallExpression(node)) {
72
+ const parsed = parseApiReturnCall(node);
73
+ if (parsed) {
74
+ let statusCode = null;
75
+ if (ts.isNumericLiteral(parsed.statusCodeExpr)) {
76
+ statusCode = Number(parsed.statusCodeExpr.text);
77
+ }
78
+ const body = checker.getTypeAtLocation(parsed.bodyExpr);
79
+ results.push({
80
+ label: parsed.label,
81
+ statusCode,
82
+ bodyType: checker.typeToString(body),
83
+ });
84
+ }
85
+ }
86
+ ts.forEachChild(node, (child) => scanForApiReturns(child, checker, results));
87
+ }
88
+ //# sourceMappingURL=scan-for-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-for-labels.js","sourceRoot":"","sources":["../../src/ast/scan-for-labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import ts from 'typescript';
2
+ /**
3
+ * Recognizes `Return("L", v)` and `(0,Return)("L", v)`-style calls.
4
+ */
5
+ export declare function parseReturnCall(node: ts.CallExpression): {
6
+ label: string;
7
+ valueExpr: ts.Expression;
8
+ } | null;
9
+ export declare function scanForReturns(node: ts.Node, checker: ts.TypeChecker, results: {
10
+ label: string;
11
+ type: string;
12
+ }[]): void;
13
+ //# sourceMappingURL=scan-for-returns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-for-returns.d.ts","sourceRoot":"","sources":["../../src/ast/scan-for-returns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAO3B;;GAEG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,EAAE,CAAC,cAAc,GACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAA;CAAE,GAAG,IAAI,CAyBpD;AAED,wBAAgB,cAAc,CAC7B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACxC,IAAI,CAYN"}
@@ -0,0 +1,48 @@
1
+ import ts from 'typescript';
2
+ function stringLiteralText(n) {
3
+ if (ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n))
4
+ return n.text;
5
+ return null;
6
+ }
7
+ /**
8
+ * Recognizes `Return("L", v)` and `(0,Return)("L", v)`-style calls.
9
+ */
10
+ export function parseReturnCall(node) {
11
+ const args = node.arguments;
12
+ if (args.length < 2)
13
+ return null;
14
+ let cal = node.expression;
15
+ if (ts.isParenthesizedExpression(cal)) {
16
+ cal = cal.expression;
17
+ }
18
+ if (ts.isIdentifier(cal) && cal.text === 'Return') {
19
+ const label = stringLiteralText(args[0]);
20
+ if (label === null)
21
+ return null;
22
+ return { label, valueExpr: args[1] };
23
+ }
24
+ if (ts.isBinaryExpression(cal) && cal.operatorToken.kind === ts.SyntaxKind.CommaToken) {
25
+ const right = cal.right;
26
+ if (ts.isIdentifier(right) && right.text === 'Return') {
27
+ const label = stringLiteralText(args[0]);
28
+ if (label === null)
29
+ return null;
30
+ return { label, valueExpr: args[1] };
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ export function scanForReturns(node, checker, results) {
36
+ if (ts.isCallExpression(node)) {
37
+ const parsed = parseReturnCall(node);
38
+ if (parsed) {
39
+ const type = checker.getTypeAtLocation(parsed.valueExpr);
40
+ results.push({
41
+ label: parsed.label,
42
+ type: checker.typeToString(type),
43
+ });
44
+ }
45
+ }
46
+ ts.forEachChild(node, (child) => scanForReturns(child, checker, results));
47
+ }
48
+ //# sourceMappingURL=scan-for-returns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-for-returns.js","sourceRoot":"","sources":["../../src/ast/scan-for-returns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,SAAS,iBAAiB,CAAC,CAAgB;IAC1C,IAAI,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAA;IACjF,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,IAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAA;IAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAEhC,IAAI,GAAG,GAAkB,IAAI,CAAC,UAAU,CAAA;IACxC,IAAI,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,GAAG,GAAG,GAAG,CAAC,UAAU,CAAA;IACrB,CAAC;IAED,IAAI,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;QACzC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QAC/B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,CAAA;IACtC,CAAC;IAED,IAAI,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACvF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;QACvB,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;YACzC,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC/B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,CAAA;QACtC,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,IAAa,EACb,OAAuB,EACvB,OAA0C;IAE1C,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YACxD,OAAO,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;aAChC,CAAC,CAAA;QACH,CAAC;IACF,CAAC;IACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AAC1E,CAAC"}
@@ -0,0 +1,16 @@
1
+ import ts from 'typescript';
2
+ export interface ExpandTypeOptions {
3
+ maxDepth?: number;
4
+ maxProps?: number;
5
+ maxUnion?: number;
6
+ maxLen?: number;
7
+ /** When set (e.g. from runASTScanner), lib/external object types collapse to `typeToString` (e.g. `File`). */
8
+ program?: ts.Program;
9
+ /**
10
+ * When true, object/interface types declared only in default or external library sources use short names.
11
+ * Default: `true` when `program` is set, otherwise `false`.
12
+ */
13
+ collapseLibOrExternalObjectShapes?: boolean;
14
+ }
15
+ export declare function expandTypeToShapeString(type: ts.Type, checker: ts.TypeChecker, contextNode: ts.Node, opts?: ExpandTypeOptions): string;
16
+ //# sourceMappingURL=type-expand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-expand.d.ts","sourceRoot":"","sources":["../../src/ast/type-expand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8GAA8G;IAC9G,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAA;IACpB;;;OAGG;IACH,iCAAiC,CAAC,EAAE,OAAO,CAAA;CAC3C;AAyKD,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,WAAW,EAAE,EAAE,CAAC,IAAI,EACpB,IAAI,GAAE,iBAAsB,GAC1B,MAAM,CAQR"}
@@ -0,0 +1,118 @@
1
+ import ts from 'typescript';
2
+ const DEFAULT_EXPAND_TYPE_OPTIONS = {
3
+ maxDepth: 3,
4
+ maxProps: 30,
5
+ maxUnion: 5,
6
+ maxLen: 2000,
7
+ };
8
+ function resolveExpandOptions(opts = {}) {
9
+ const collapseLibOrExternalObjectShapes = opts.collapseLibOrExternalObjectShapes ?? Boolean(opts.program);
10
+ return {
11
+ maxDepth: opts.maxDepth ?? DEFAULT_EXPAND_TYPE_OPTIONS.maxDepth,
12
+ maxProps: opts.maxProps ?? DEFAULT_EXPAND_TYPE_OPTIONS.maxProps,
13
+ maxUnion: opts.maxUnion ?? DEFAULT_EXPAND_TYPE_OPTIONS.maxUnion,
14
+ maxLen: opts.maxLen ?? DEFAULT_EXPAND_TYPE_OPTIONS.maxLen,
15
+ program: opts.program,
16
+ collapseLibOrExternalObjectShapes,
17
+ };
18
+ }
19
+ function resolveNonAliasSymbol(type, checker) {
20
+ let sym = type.aliasSymbol ?? type.getSymbol();
21
+ if (!sym)
22
+ return undefined;
23
+ while (sym.flags & ts.SymbolFlags.Alias) {
24
+ sym = checker.getAliasedSymbol(sym);
25
+ }
26
+ return sym;
27
+ }
28
+ /** True when every declaration lives in TS default libs or node_modules / external typings. */
29
+ function shouldCollapseObjectTypeToName(program, collapse, checker, type) {
30
+ if (!collapse || !program)
31
+ return false;
32
+ const sym = resolveNonAliasSymbol(type, checker);
33
+ if (!sym?.declarations?.length)
34
+ return false;
35
+ return sym.declarations.every((decl) => {
36
+ const sf = decl.getSourceFile();
37
+ return program.isSourceFileDefaultLibrary(sf) || program.isSourceFileFromExternalLibrary(sf);
38
+ });
39
+ }
40
+ function withFallback(type, checker, value, options) {
41
+ if (value.length > options.maxLen)
42
+ return checker.typeToString(type);
43
+ return value;
44
+ }
45
+ function isOptionalProperty(symbol) {
46
+ if ((symbol.flags & ts.SymbolFlags.Optional) !== 0)
47
+ return true;
48
+ return symbol.declarations?.some((decl) => {
49
+ return ((ts.isPropertySignature(decl) || ts.isPropertyDeclaration(decl) || ts.isParameter(decl)) &&
50
+ decl.questionToken !== undefined);
51
+ }) ?? false;
52
+ }
53
+ function expandTypeInternal(type, checker, contextNode, options, depth, state) {
54
+ if (depth >= options.maxDepth)
55
+ return checker.typeToString(type);
56
+ if (state.seen.has(type))
57
+ return checker.typeToString(type);
58
+ if (checker.isArrayType(type)) {
59
+ const [elementType] = checker.getTypeArguments(type);
60
+ if (!elementType)
61
+ return checker.typeToString(type);
62
+ const expanded = expandTypeInternal(elementType, checker, contextNode, options, depth + 1, state);
63
+ return withFallback(type, checker, `Array<${expanded}>`, options);
64
+ }
65
+ if (checker.isTupleType(type)) {
66
+ const tupleArgs = checker
67
+ .getTypeArguments(type)
68
+ .map((arg) => expandTypeInternal(arg, checker, contextNode, options, depth + 1, state));
69
+ return withFallback(type, checker, `[${tupleArgs.join(', ')}]`, options);
70
+ }
71
+ if (type.isUnion()) {
72
+ const booleanLike = new Set(type.types.map((part) => checker.typeToString(part)));
73
+ if (booleanLike.size === 2 && booleanLike.has('false') && booleanLike.has('true')) {
74
+ return 'boolean';
75
+ }
76
+ if (type.types.length > options.maxUnion)
77
+ return checker.typeToString(type);
78
+ const parts = type.types.map((part) => expandTypeInternal(part, checker, contextNode, options, depth + 1, state));
79
+ return withFallback(type, checker, parts.join(' | '), options);
80
+ }
81
+ if (type.isIntersection()) {
82
+ if (type.types.length > options.maxUnion)
83
+ return checker.typeToString(type);
84
+ const parts = type.types.map((part) => expandTypeInternal(part, checker, contextNode, options, depth + 1, state));
85
+ return withFallback(type, checker, parts.join(' & '), options);
86
+ }
87
+ const primitiveString = checker.typeToString(type);
88
+ if ((type.flags & ts.TypeFlags.Object) === 0)
89
+ return primitiveString;
90
+ const properties = checker.getPropertiesOfType(type);
91
+ if (properties.length === 0)
92
+ return primitiveString;
93
+ if (properties.length > options.maxProps)
94
+ return primitiveString;
95
+ if (shouldCollapseObjectTypeToName(options.program, options.collapseLibOrExternalObjectShapes, checker, type)) {
96
+ return primitiveString;
97
+ }
98
+ state.seen.add(type);
99
+ try {
100
+ const fields = properties.map((symbol) => {
101
+ const propertyType = checker.getTypeOfSymbolAtLocation(symbol, contextNode);
102
+ const propText = expandTypeInternal(propertyType, checker, contextNode, options, depth + 1, state);
103
+ return `${symbol.getName()}${isOptionalProperty(symbol) ? '?' : ''}: ${propText}`;
104
+ });
105
+ return withFallback(type, checker, `{ ${fields.join('; ')} }`, options);
106
+ }
107
+ finally {
108
+ state.seen.delete(type);
109
+ }
110
+ }
111
+ export function expandTypeToShapeString(type, checker, contextNode, opts = {}) {
112
+ const options = resolveExpandOptions(opts);
113
+ if (options.maxDepth <= 0 || options.maxProps <= 0 || options.maxUnion <= 0 || options.maxLen <= 0) {
114
+ return checker.typeToString(type);
115
+ }
116
+ return expandTypeInternal(type, checker, contextNode, options, 0, { seen: new Set() });
117
+ }
118
+ //# sourceMappingURL=type-expand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-expand.js","sourceRoot":"","sources":["../../src/ast/type-expand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import ts from 'typescript';
2
+ import { type ExpandTypeOptions } from './type-expand.js';
3
+ import type { RegistryParam } from '../types.js';
4
+ export interface AstMethodResult {
5
+ fnName: string;
6
+ className: string;
7
+ returns: {
8
+ label: string;
9
+ type: string;
10
+ }[];
11
+ throws: {
12
+ label: string;
13
+ type: string;
14
+ }[];
15
+ apiReturns: {
16
+ label: string;
17
+ statusCode: number | null;
18
+ bodyType: string;
19
+ }[];
20
+ /** From TypeChecker — fills registry when reflect-metadata is missing (e.g. Vitest/esbuild) */
21
+ paramsFromAst?: RegistryParam[];
22
+ declaredReturnFromAst?: string;
23
+ }
24
+ export interface VisitNodeOptions {
25
+ expandParamTypes: boolean;
26
+ expandParamTypesOptions?: ExpandTypeOptions;
27
+ /** Passed from runASTScanner into param type expansion (lib/external collapse). */
28
+ program?: ts.Program;
29
+ }
30
+ export declare function visitNode(node: ts.Node, _source: ts.SourceFile, checker: ts.TypeChecker, results: AstMethodResult[], options: VisitNodeOptions): void;
31
+ //# sourceMappingURL=visit-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visit-node.d.ts","sourceRoot":"","sources":["../../src/ast/visit-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAI3B,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1C,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC5E,+FAA+F;IAC/F,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAChC,gBAAgB,EAAE,OAAO,CAAA;IACzB,uBAAuB,CAAC,EAAE,iBAAiB,CAAA;IAC3C,mFAAmF;IACnF,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAA;CACpB;AAmSD,wBAAgB,SAAS,CACxB,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,EAAE,CAAC,UAAU,EACtB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,EAAE,gBAAgB,GACvB,IAAI,CA+BN"}