moonflower 1.3.4 → 1.3.5

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 (34) hide show
  1. package/dist/openapi/analyzerModule/nodeParsers.cjs +1 -1
  2. package/dist/openapi/analyzerModule/nodeParsers.cjs.map +1 -1
  3. package/dist/openapi/analyzerModule/nodeParsers.d.ts.map +1 -1
  4. package/dist/openapi/analyzerModule/nodeParsers.mjs +98 -96
  5. package/dist/openapi/analyzerModule/nodeParsers.mjs.map +1 -1
  6. package/dist/openapi/analyzerModule/test/TestCase.d.ts +2 -0
  7. package/dist/openapi/analyzerModule/test/TestCase.d.ts.map +1 -1
  8. package/dist/openapi/generatorModule/getSchema.cjs +1 -1
  9. package/dist/openapi/generatorModule/getSchema.cjs.map +1 -1
  10. package/dist/openapi/generatorModule/getSchema.d.ts.map +1 -1
  11. package/dist/openapi/generatorModule/getSchema.mjs +6 -6
  12. package/dist/openapi/generatorModule/getSchema.mjs.map +1 -1
  13. package/dist/test/TestAppRouter.d.ts.map +1 -1
  14. package/package.json +1 -1
  15. package/src/hooks/useApiEndpoint.spec.ts +2 -0
  16. package/src/hooks/useApiHeader/useApiHeader.spec.ts +2 -0
  17. package/src/hooks/useCookieParams.spec.ts +2 -0
  18. package/src/hooks/useHeaderParams.spec.ts +2 -0
  19. package/src/hooks/usePathParams.spec.ts +1 -0
  20. package/src/hooks/useQueryParams.spec.ts +1 -0
  21. package/src/hooks/useRequestBody.spec.ts +1 -0
  22. package/src/hooks/useRequestRawBody.spec.ts +2 -0
  23. package/src/hooks/useReturnValue.spec.ts +2 -0
  24. package/src/openapi/analyzerModule/nodeParsers.ts +4 -0
  25. package/src/openapi/analyzerModule/test/TestCase.ts +2 -0
  26. package/src/openapi/analyzerModule/test/openApiAnalyzer.spec.data.ts +9 -0
  27. package/src/openapi/analyzerModule/test/openApiAnalyzer.spec.ts +43 -0
  28. package/src/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.ts +2 -0
  29. package/src/openapi/discoveryModule/discoverRouters/discoverRouters.spec.ts +1 -0
  30. package/src/openapi/generatorModule/getSchema.ts +4 -0
  31. package/src/test/TestAppRouter.ts +8 -0
  32. package/src/test/app.spec.ts +80 -1
  33. package/src/utils/object.spec.ts +2 -0
  34. package/src/utils/printers.spec.ts +1 -1
@@ -2,9 +2,9 @@ import { SyntaxKind as e } from "ts-morph";
2
2
  import { Logger as m } from "../../utils/logger.mjs";
3
3
  import { OpenApiManager as O } from "../manager/OpenApiManager.mjs";
4
4
  const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
5
- const n = L.get(t);
6
- if (n)
7
- return n;
5
+ const i = L.get(t);
6
+ if (i)
7
+ return i;
8
8
  if (t.getKind() === e.Identifier) {
9
9
  const r = t.asKind(e.Identifier).getImplementations()[0]?.getNode();
10
10
  if (r) {
@@ -26,31 +26,31 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
26
26
  }
27
27
  return L.set(t, t), t;
28
28
  }, C = (t) => {
29
- const n = t.getChildrenOfKind(e.Identifier);
30
- return n.length === 2 ? c(n[1]) : t.getChildren().reverse().find(
29
+ const i = t.getChildrenOfKind(e.Identifier);
30
+ return i.length === 2 ? c(i[1]) : t.getChildren().reverse().find(
31
31
  (l) => l.getKind() !== e.GreaterThanToken && l.getKind() !== e.CommaToken && l.getKind() !== e.SemicolonToken
32
32
  );
33
33
  }, P = (t) => {
34
- const n = t.getFirstChildByKind(e.SyntaxList);
35
- return n.isKind(e.SyntaxList) ? y(n.getFirstChild()) : y(n);
34
+ const i = t.getFirstChildByKind(e.SyntaxList);
35
+ return i.isKind(e.SyntaxList) ? y(i.getFirstChild()) : y(i);
36
36
  }, y = (t) => {
37
- const n = t.getSymbol()?.getName();
38
- if (n && O.getInstance().hasExposedModel(n))
37
+ const i = t.getSymbol()?.getName();
38
+ if (i && O.getInstance().hasExposedModel(i))
39
39
  return [
40
40
  {
41
41
  role: "ref",
42
- shape: n,
42
+ shape: i,
43
43
  optional: !1
44
44
  }
45
45
  ];
46
46
  const r = c(t);
47
47
  if (r.asKind(e.UndefinedKeyword))
48
48
  return "undefined";
49
- const i = r.asKind(e.LiteralType);
50
- if (i) {
51
- if (i.getFirstChildByKind(e.TrueKeyword))
49
+ const n = r.asKind(e.LiteralType);
50
+ if (n) {
51
+ if (n.getFirstChildByKind(e.TrueKeyword))
52
52
  return "true";
53
- if (i.getFirstChildByKind(e.FalseKeyword))
53
+ if (n.getFirstChildByKind(e.FalseKeyword))
54
54
  return "false";
55
55
  }
56
56
  if (r.asKind(e.BooleanKeyword) || r.asKind(e.TrueKeyword) || r.asKind(e.FalseKeyword))
@@ -76,8 +76,8 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
76
76
  if (d)
77
77
  return y(d.getFirstChild());
78
78
  if (r.asKind(e.PropertyAccessExpression)) {
79
- const w = c(r.getLastChild());
80
- return f(w.asKind(e.CallExpression).getReturnType(), w);
79
+ const b = c(r.getLastChild());
80
+ return f(b.asKind(e.CallExpression).getReturnType(), b);
81
81
  }
82
82
  const h = r.asKind(e.UnionType);
83
83
  if (h)
@@ -99,15 +99,15 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
99
99
  return y(E.getChildAtIndex(2));
100
100
  const D = r.getSourceFile().getFilePath().split("/").pop();
101
101
  return m.warn(`[${D}] Unknown node type: ${r.getKindName()}`), "unknown_1";
102
- }, z = (t) => t.getFirstDescendantByKind(e.SyntaxList).getChildrenOfKind(e.PropertyAssignment).map((i) => {
103
- const o = i.getFirstChild(), p = (() => {
102
+ }, z = (t) => t.getFirstDescendantByKind(e.SyntaxList).getChildrenOfKind(e.PropertyAssignment).map((n) => {
103
+ const o = n.getFirstChild(), p = (() => {
104
104
  if (o.isKind(e.Identifier))
105
105
  return o.getText();
106
106
  if (o.isKind(e.StringLiteral))
107
107
  return o.getLiteralText();
108
- const s = i.getSourceFile().getFilePath().split("/").pop();
108
+ const s = n.getSourceFile().getFilePath().split("/").pop();
109
109
  return m.warn(`[${s}] Unknown identifier name: ${o.getText()}`), "unknown_30";
110
- })(), a = i.getLastChild(), u = c(a);
110
+ })(), a = n.getLastChild(), u = c(a);
111
111
  return {
112
112
  role: "property",
113
113
  identifier: p,
@@ -117,10 +117,10 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
117
117
  errorMessage: K(u, "errorMessage")
118
118
  };
119
119
  }) || [], T = (t) => {
120
- const n = t.asKind(e.CallExpression);
121
- return n ? (n.getReturnType().getSymbol()?.getName() ?? "").startsWith("Zod") : !1;
120
+ const i = t.asKind(e.CallExpression);
121
+ return i ? (i.getReturnType().getSymbol()?.getName() ?? "").startsWith("Zod") : !1;
122
122
  }, A = (t) => {
123
- const n = t.asKind(e.CallExpression), l = n.getReturnType().getSymbol()?.getName() ?? "";
123
+ const i = t.asKind(e.CallExpression), l = i.getReturnType().getSymbol()?.getName() ?? "";
124
124
  if (l === "ZodNumber")
125
125
  return "number";
126
126
  if (l === "ZodString")
@@ -130,7 +130,7 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
130
130
  if (l === "ZodBigInt")
131
131
  return "bigint";
132
132
  if (l === "ZodObject") {
133
- const p = n.getFirstChildByKind(e.SyntaxList)?.getFirstChild()?.asKind(e.ObjectLiteralExpression);
133
+ const p = i.getFirstChildByKind(e.SyntaxList)?.getFirstChild()?.asKind(e.ObjectLiteralExpression);
134
134
  if (!p)
135
135
  return "unknown_zod_object";
136
136
  const a = p.getFirstChildByKind(e.SyntaxList);
@@ -145,7 +145,7 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
145
145
  }) : [];
146
146
  }
147
147
  if (l === "ZodArray") {
148
- const o = n.getFirstChildByKind(e.SyntaxList)?.getFirstChild();
148
+ const o = i.getFirstChildByKind(e.SyntaxList)?.getFirstChild();
149
149
  return o ? [
150
150
  {
151
151
  role: "array",
@@ -154,14 +154,14 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
154
154
  }
155
155
  ] : "unknown_zod_array";
156
156
  }
157
- const i = t.getSourceFile().getFilePath().split("/").pop();
158
- return m.warn(`[${i}] Unknown zod type: ${l}`), "unknown_zod";
157
+ const n = t.getSourceFile().getFilePath().split("/").pop();
158
+ return m.warn(`[${n}] Unknown zod type: ${l}`), "unknown_zod";
159
159
  }, N = (t) => {
160
160
  if (T(t))
161
161
  return A(t);
162
- const n = t.getParent().getFirstChildByKind(e.AsExpression);
163
- if (n) {
164
- const s = n.getLastChildByKind(e.TypeReference);
162
+ const i = t.getParent().getFirstChildByKind(e.AsExpression);
163
+ if (i) {
164
+ const s = i.getLastChildByKind(e.TypeReference);
165
165
  return P(s);
166
166
  }
167
167
  const r = t.getParent().getFirstChildByKind(e.TypeReference);
@@ -207,53 +207,53 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
207
207
  }, V = (t) => {
208
208
  if (T(t))
209
209
  return !1;
210
- const n = t.asKind(e.CallExpression);
211
- if (n) {
212
- const i = n.getFirstChildByKind(e.Identifier);
213
- if (i?.getText() === "OptionalParam")
210
+ const i = t.asKind(e.CallExpression);
211
+ if (i) {
212
+ const n = i.getFirstChildByKind(e.Identifier);
213
+ if (n?.getText() === "OptionalParam")
214
214
  return !0;
215
- if (i?.getText() === "RequiredParam")
215
+ if (n?.getText() === "RequiredParam")
216
216
  return !1;
217
- const o = n.getFirstChildByKind(e.SyntaxList), p = c(o.getFirstChild());
217
+ const o = i.getFirstChildByKind(e.SyntaxList), p = c(o.getFirstChild());
218
218
  return V(p);
219
219
  }
220
- return t.getFirstDescendantByKind(e.SyntaxList).getChildrenOfKind(e.PropertyAssignment).some((i) => i.getFirstDescendantByKind(e.Identifier).getText() === "optional" ? C(i).getKind() === e.TrueKeyword : !1);
221
- }, K = (t, n) => {
220
+ return t.getFirstDescendantByKind(e.SyntaxList).getChildrenOfKind(e.PropertyAssignment).some((n) => n.getFirstDescendantByKind(e.Identifier).getText() === "optional" ? C(n).getKind() === e.TrueKeyword : !1);
221
+ }, K = (t, i) => {
222
222
  if (T(t))
223
223
  return "";
224
224
  const r = c(t), l = r.asKind(e.CallExpression);
225
225
  if (l) {
226
226
  const d = l.getLastChildByKind(e.SyntaxList);
227
- return K(d, n);
227
+ return K(d, i);
228
228
  }
229
- const i = r.asKind(e.SyntaxList);
230
- if (i)
231
- return i.getChildren().map((g) => K(g, n)).find((g) => !!g && g !== "unknown_25") || "";
229
+ const n = r.asKind(e.SyntaxList);
230
+ if (n)
231
+ return n.getChildren().map((g) => K(g, i)).find((g) => !!g && g !== "unknown_25") || "";
232
232
  const o = r.asKind(e.ObjectLiteralExpression);
233
233
  if (o) {
234
- const g = _(o).find((h) => h.identifier === n);
234
+ const g = _(o).find((h) => h.identifier === i);
235
235
  return g ? Array.isArray(g.value) ? "array" : g.value || "" : "";
236
236
  }
237
237
  const p = r.asKind(e.IntersectionType);
238
238
  if (p)
239
- return p.getTypeNodes().flatMap((d) => K(d, n)).filter((d) => !!d && d !== "unknown_25")[0] || "unknown_27";
239
+ return p.getTypeNodes().flatMap((d) => K(d, i)).filter((d) => !!d && d !== "unknown_25")[0] || "unknown_27";
240
240
  const a = r.asKind(e.TypeLiteral);
241
241
  if (a)
242
- return K(a.getFirstChildByKind(e.SyntaxList), n);
242
+ return K(a.getFirstChildByKind(e.SyntaxList), i);
243
243
  const u = r.asKind(e.PropertySignature);
244
- if (u && r.getFirstDescendantByKind(e.Identifier).getText() === n)
244
+ if (u && r.getFirstDescendantByKind(e.Identifier).getText() === i)
245
245
  return C(u).getFirstDescendantByKind(
246
246
  e.StringLiteral
247
247
  ).getLiteralText();
248
248
  const s = r.getSourceFile().getFilePath().split("/").pop();
249
249
  return m.dev(`[${s}] Unknown property string value node ${r.getKindName()}`), "unknown_25";
250
250
  }, $ = (t) => {
251
- const n = t.getSymbol();
252
- if (!t.isObject() || !n)
251
+ const i = t.getSymbol();
252
+ if (!t.isObject() || !i)
253
253
  return !1;
254
254
  const r = t.getTypeArguments();
255
- return n.getName() === "Promise" && r.length === 1;
256
- }, f = (t, n, r = []) => {
255
+ return i.getName() === "Promise" && r.length === 1;
256
+ }, f = (t, i, r = []) => {
257
257
  const l = t.getAliasSymbol()?.getName();
258
258
  if (l && O.getInstance().hasExposedModel(l))
259
259
  return [
@@ -263,63 +263,65 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
263
263
  optional: !1
264
264
  }
265
265
  ];
266
- const i = $(t) ? t.getTypeArguments()[0] : t;
267
- if (r.some((a) => a === i))
266
+ const n = $(t) ? t.getTypeArguments()[0] : t;
267
+ if (r.some((a) => a === n))
268
268
  return "circular";
269
- const o = r.concat(i);
270
- if (i.getText() === "void")
269
+ const o = r.concat(n);
270
+ if (n.getText() === "void")
271
271
  return "void";
272
- if (i.isAny())
272
+ if (n.isAny())
273
273
  return "any";
274
- if (i.isNull())
274
+ if (n.isUnknown())
275
+ return "unknown";
276
+ if (n.isNull())
275
277
  return "null";
276
- if (i.isUndefined())
278
+ if (n.isUndefined())
277
279
  return "undefined";
278
- if (i.isBoolean() || i.isBooleanLiteral())
280
+ if (n.isBoolean() || n.isBooleanLiteral())
279
281
  return "boolean";
280
- if (i.isStringLiteral())
282
+ if (n.isStringLiteral())
281
283
  return [
282
284
  {
283
285
  role: "literal_string",
284
- shape: String(i.getLiteralValue()),
286
+ shape: String(n.getLiteralValue()),
285
287
  optional: !1
286
288
  }
287
289
  ];
288
- if (i.isNumberLiteral())
290
+ if (n.isNumberLiteral())
289
291
  return [
290
292
  {
291
293
  role: "literal_number",
292
- shape: String(i.getLiteralValue()),
294
+ shape: String(n.getLiteralValue()),
293
295
  optional: !1
294
296
  }
295
297
  ];
296
- if (i.isString() || i.isTemplateLiteral())
298
+ if (n.isString() || n.isTemplateLiteral())
297
299
  return "string";
298
- if (i.isNumber())
300
+ if (n.isNumber())
299
301
  return "number";
300
- if (i.getText() === "bigint")
302
+ if (n.getText() === "bigint")
301
303
  return "bigint";
302
- if (i.isTuple())
304
+ if (n.isTuple())
303
305
  return [
304
306
  {
305
307
  role: "tuple",
306
- shape: i.getTupleElements().map((a) => ({
308
+ shape: n.getTupleElements().map((a) => ({
307
309
  role: "tuple_entry",
308
- shape: f(a, n, o),
310
+ shape: f(a, i, o),
309
311
  optional: !1
310
312
  })),
311
313
  optional: !1
312
314
  }
313
315
  ];
314
- if (i.isArray())
316
+ if (n.isArray())
315
317
  return [
316
318
  {
317
319
  role: "array",
318
- shape: f(i.getArrayElementType(), n, o),
320
+ shape: f(n.getArrayElementType(), i, o),
319
321
  optional: !1
320
322
  }
321
323
  ];
322
- if (i.isObject() && i.getText() === "Buffer")
324
+ if (n.isObject() && n.getText() === "Buffer")
323
325
  return [
324
326
  {
325
327
  role: "buffer",
@@ -327,35 +329,35 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
327
329
  optional: !1
328
330
  }
329
331
  ];
330
- if (i.isObject() && i.getProperties().length === 0) {
331
- const a = i.getAliasTypeArguments()[1] ?? i.getStringIndexType();
332
+ if (n.isObject() && n.getProperties().length === 0) {
333
+ const a = n.getAliasTypeArguments()[1] ?? n.getStringIndexType();
332
334
  if (a)
333
335
  return [
334
336
  {
335
337
  role: "record",
336
- shape: f(a, n, o),
338
+ shape: f(a, i, o),
337
339
  optional: !1
338
340
  }
339
341
  ];
340
342
  }
341
- if (i.isObject())
342
- return i.getText() === "Date" ? "Date" : i.getProperties().map((a) => {
343
+ if (n.isObject())
344
+ return n.getText() === "Date" ? "Date" : n.getProperties().map((a) => {
343
345
  const u = a.getValueDeclaration() || a.getDeclarations()[0];
344
346
  if (!u)
345
347
  return {
346
348
  role: "property",
347
349
  identifier: a.getName(),
348
- shape: f(a.getTypeAtLocation(n), n, o),
350
+ shape: f(a.getTypeAtLocation(i), i, o),
349
351
  optional: !1
350
352
  };
351
353
  if (!(u.asKind(e.PropertySignature) || u.asKind(e.PropertyAssignment) || u.asKind(e.ShorthandPropertyAssignment)))
352
354
  return {
353
355
  role: "property",
354
356
  identifier: a.getName(),
355
- shape: f(a.getTypeAtLocation(n), n, o),
357
+ shape: f(a.getTypeAtLocation(i), i, o),
356
358
  optional: !1
357
359
  };
358
- const d = a.getTypeAtLocation(n).isNullable(), g = f(a.getTypeAtLocation(n), n, o);
360
+ const d = a.getTypeAtLocation(i).isNullable(), g = f(a.getTypeAtLocation(i), i, o);
359
361
  return {
360
362
  role: "property",
361
363
  identifier: a.getName(),
@@ -363,10 +365,10 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
363
365
  optional: d
364
366
  };
365
367
  }).filter((a) => a.shape !== "undefined");
366
- if (i.isUnion()) {
367
- const u = i.getUnionTypes().map((g) => ({
368
+ if (n.isUnion()) {
369
+ const u = n.getUnionTypes().map((g) => ({
368
370
  role: "union_entry",
369
- shape: f(g, n, o),
371
+ shape: f(g, i, o),
370
372
  optional: !1
371
373
  })).filter(
372
374
  (g, h, S) => !S.find((F, x) => F.shape === g.shape && x > h)
@@ -379,32 +381,32 @@ const L = /* @__PURE__ */ new WeakMap(), c = (t) => {
379
381
  }
380
382
  ];
381
383
  }
382
- if (i.isIntersection())
383
- return i.getIntersectionTypes().map((s) => f(s, n, o)).filter((s) => typeof s != "string").reduce((s, d) => [...s, ...d], []);
384
- const p = n.getSourceFile().getFilePath().split("/").pop();
384
+ if (n.isIntersection())
385
+ return n.getIntersectionTypes().map((s) => f(s, i, o)).filter((s) => typeof s != "string").reduce((s, d) => [...s, ...d], []);
386
+ const p = i.getSourceFile().getFilePath().split("/").pop();
385
387
  return m.warn(`[${p}] Unknown type shape node ${t.getText()}`), "unknown_5";
386
- }, b = (t) => {
388
+ }, w = (t) => {
387
389
  if (t.isKind(e.Identifier))
388
- return b(c(t));
390
+ return w(c(t));
389
391
  if (t.isKind(e.StringLiteral))
390
392
  return t.getLiteralValue();
391
393
  if (t.isKind(e.ArrayLiteralExpression))
392
- return t.forEachChildAsArray().map((r) => b(r));
394
+ return t.forEachChildAsArray().map((r) => w(r));
393
395
  if (t.isKind(e.PropertyAccessExpression))
394
- return b(C(t));
396
+ return w(C(t));
395
397
  if (t.isKind(e.ObjectLiteralExpression))
396
398
  return _(t);
397
- const n = t.getSourceFile().getFilePath().split("/").pop();
398
- return m.dev(`[${n}] Unknown literal value node ${t.getKindName()}`), "unknown_6";
399
+ const i = t.getSourceFile().getFilePath().split("/").pop();
400
+ return m.dev(`[${i}] Unknown literal value node ${t.getKindName()}`), "unknown_6";
399
401
  }, Q = (t) => {
400
- const n = t.getFirstDescendantByKind(e.CallExpression);
401
- if (!n) return null;
402
- const r = n.getArguments()[0];
402
+ const i = t.getFirstDescendantByKind(e.CallExpression);
403
+ if (!i) return null;
404
+ const r = i.getArguments()[0];
403
405
  if (!r) return null;
404
406
  const l = r.getType();
405
407
  return l.isStringLiteral() ? l.getLiteralValue() : null;
406
- }, _ = (t) => t.getFirstDescendantByKind(e.SyntaxList).getChildrenOfKind(e.PropertyAssignment).map((i) => {
407
- const p = i.getFirstDescendantByKind(e.Identifier).getText(), a = i.getLastChild(), u = c(a), s = b(u);
408
+ }, _ = (t) => t.getFirstDescendantByKind(e.SyntaxList).getChildrenOfKind(e.PropertyAssignment).map((n) => {
409
+ const p = n.getFirstDescendantByKind(e.Identifier).getText(), a = n.getLastChild(), u = c(a), s = w(u);
408
410
  return {
409
411
  identifier: p,
410
412
  value: s
@@ -1 +1 @@
1
- {"version":3,"file":"nodeParsers.mjs","sources":["../../../src/openapi/analyzerModule/nodeParsers.ts"],"sourcesContent":["import {\n\tNode,\n\tPropertyAccessExpression,\n\tPropertyAssignment,\n\tPropertySignature,\n\tShorthandPropertyAssignment,\n\tSyntaxKind,\n\tts,\n\tType,\n\tTypeReferenceNode,\n} from 'ts-morph'\n\nimport { Logger } from '../../utils/logger'\nimport { OpenApiManager } from '../manager/OpenApiManager'\nimport { ShapeOfProperty, ShapeOfType, ShapeOfUnionEntry } from './types'\n\nconst implementationCache = new WeakMap<Node, Node>()\n\nexport const findNodeImplementation = (node: Node): Node => {\n\tconst cached = implementationCache.get(node)\n\tif (cached) {\n\t\treturn cached\n\t}\n\n\tif (node.getKind() === SyntaxKind.Identifier) {\n\t\tconst implementationNode = node.asKind(SyntaxKind.Identifier)!.getImplementations()[0]?.getNode()\n\t\tif (implementationNode) {\n\t\t\tconst implementationParentNode = implementationNode.getParent()!\n\t\t\tconst assignmentValueNode = implementationParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\n\t\tconst definitionNode = node.asKind(SyntaxKind.Identifier)!.getDefinitions()[0]?.getNode()\n\t\tif (definitionNode) {\n\t\t\tconst definitionParentNode = definitionNode.getParent()!\n\t\t\tconst assignmentValueNode = definitionParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\t\tthrow new Error('No implementation nor definition available')\n\t}\n\n\timplementationCache.set(node, node)\n\treturn node\n}\n\nexport const findPropertyAssignmentValueNode = (\n\tnode:\n\t\t| PropertyAssignment\n\t\t| TypeReferenceNode\n\t\t| PropertySignature\n\t\t| PropertyAccessExpression\n\t\t| ShorthandPropertyAssignment,\n): Node => {\n\tconst identifierChildren = node.getChildrenOfKind(SyntaxKind.Identifier)\n\tif (identifierChildren.length === 2) {\n\t\treturn findNodeImplementation(identifierChildren[1])\n\t}\n\tconst lastMatchingChild = node.getChildren().reverse()\n\treturn lastMatchingChild.find(\n\t\t(child) =>\n\t\t\tchild.getKind() !== SyntaxKind.GreaterThanToken &&\n\t\t\tchild.getKind() !== SyntaxKind.CommaToken &&\n\t\t\tchild.getKind() !== SyntaxKind.SemicolonToken,\n\t)!\n}\n\nexport const getTypeReferenceShape = (node: TypeReferenceNode): ShapeOfType['shape'] => {\n\tconst firstChild = node.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\tif (firstChild.isKind(SyntaxKind.SyntaxList)) {\n\t\treturn getRecursiveNodeShape(firstChild.getFirstChild()!)\n\t} else {\n\t\treturn getRecursiveNodeShape(firstChild)\n\t}\n}\n\nexport const getRecursiveNodeShape = (nodeOrReference: Node): ShapeOfType['shape'] => {\n\tconst typeName = nodeOrReference.getSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\t// Undefined\n\tconst undefinedNode = node.asKind(SyntaxKind.UndefinedKeyword)\n\tif (undefinedNode) {\n\t\treturn 'undefined'\n\t}\n\n\t// Literal type\n\tconst literalNode = node.asKind(SyntaxKind.LiteralType)\n\tif (literalNode) {\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.TrueKeyword)) {\n\t\t\treturn 'true'\n\t\t}\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.FalseKeyword)) {\n\t\t\treturn 'false'\n\t\t}\n\t}\n\n\t// Boolean literal\n\tconst booleanLiteralNode =\n\t\tnode.asKind(SyntaxKind.BooleanKeyword) ||\n\t\tnode.asKind(SyntaxKind.TrueKeyword) ||\n\t\tnode.asKind(SyntaxKind.FalseKeyword)\n\tif (booleanLiteralNode) {\n\t\treturn 'boolean'\n\t}\n\n\t// String literal\n\tconst stringLiteralNode = node.asKind(SyntaxKind.StringKeyword) || node.asKind(SyntaxKind.StringLiteral)\n\tif (stringLiteralNode) {\n\t\treturn 'string'\n\t}\n\n\t// Number literal\n\tconst numberLiteralNode = node.asKind(SyntaxKind.NumberKeyword) || node.asKind(SyntaxKind.NumericLiteral)\n\tif (numberLiteralNode) {\n\t\treturn 'number'\n\t}\n\n\t// BigInt literal\n\tconst bigIntNode = node.asKind(SyntaxKind.BigIntKeyword) || node.asKind(SyntaxKind.BigIntLiteral)\n\tif (bigIntNode) {\n\t\treturn 'bigint'\n\t}\n\n\t// Type literal\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\tconst properties = typeLiteralNode\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getChildrenOfKind(SyntaxKind.PropertySignature)\n\n\t\tconst propertyShapes = properties.map((propNode) => {\n\t\t\tconst identifier = propNode.getFirstChildByKind(SyntaxKind.Identifier)!\n\t\t\tconst valueNode = findPropertyAssignmentValueNode(propNode)\n\t\t\tconst questionMarkToken = identifier.getNextSiblingIfKind(SyntaxKind.QuestionToken)\n\t\t\treturn {\n\t\t\t\trole: 'property' as const,\n\t\t\t\tidentifier: identifier.getText(),\n\t\t\t\tshape: getRecursiveNodeShape(valueNode),\n\t\t\t\toptional: valueNode.getType().isNullable() || !!questionMarkToken,\n\t\t\t}\n\t\t})\n\t\treturn propertyShapes\n\t}\n\n\t// Type reference\n\tconst typeReferenceNode = node.asKind(SyntaxKind.TypeReference)\n\tif (typeReferenceNode) {\n\t\treturn getRecursiveNodeShape(typeReferenceNode.getFirstChild()!)\n\t}\n\n\t// Property access expression\n\tconst propertyAccessNode = node.asKind(SyntaxKind.PropertyAccessExpression)\n\tif (propertyAccessNode) {\n\t\tconst lastChild = findNodeImplementation(node.getLastChild()!)\n\t\treturn getProperTypeShape(lastChild.asKind(SyntaxKind.CallExpression)!.getReturnType(), lastChild)\n\t}\n\n\t// Union type\n\tconst unionTypeNode = node.asKind(SyntaxKind.UnionType)\n\tif (unionTypeNode) {\n\t\treturn getProperTypeShape(unionTypeNode.getType(), node)\n\t}\n\n\t// Typeof query\n\tconst typeQueryNode = node.asKind(SyntaxKind.TypeQuery)\n\tif (typeQueryNode) {\n\t\treturn getRecursiveNodeShape(typeQueryNode.getLastChild()!)\n\t}\n\n\t// Qualified name\n\tconst qualifiedNameNode = node.asKind(SyntaxKind.QualifiedName)\n\tif (qualifiedNameNode) {\n\t\treturn getRecursiveNodeShape(qualifiedNameNode.getLastChild()!)\n\t}\n\n\t// Call expression\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\treturn getProperTypeShape(callExpressionNode.getReturnType(), callExpressionNode)\n\t}\n\n\t// Await expression\n\tconst awaitExpressionNode = node.asKind(SyntaxKind.AwaitExpression)\n\tif (awaitExpressionNode) {\n\t\treturn getRecursiveNodeShape(awaitExpressionNode.getChildAtIndex(1)!)\n\t}\n\n\t// 'As' Expression\n\tconst asExpressionNode = node.asKind(SyntaxKind.AsExpression)\n\tif (asExpressionNode) {\n\t\treturn getRecursiveNodeShape(asExpressionNode.getChildAtIndex(2)!)\n\t}\n\n\t// TODO\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown node type: ${node.getKindName()}`)\n\treturn 'unknown_1'\n}\n\nexport const getShapeOfValidatorLiteral = (\n\tobjectLiteralNode: Node<ts.ObjectLiteralExpression>,\n): (ShapeOfProperty & { description: string; errorMessage: string })[] => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstChild()!\n\t\tconst identifierName = (() => {\n\t\t\tif (identifierNode.isKind(SyntaxKind.Identifier)) {\n\t\t\t\treturn identifierNode.getText()\n\t\t\t}\n\t\t\tif (identifierNode.isKind(SyntaxKind.StringLiteral)) {\n\t\t\t\treturn identifierNode.getLiteralText()\n\t\t\t}\n\t\t\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\t\t\tLogger.warn(`[${fileName}] Unknown identifier name: ${identifierNode.getText()}`)\n\t\t\treturn 'unknown_30'\n\t\t})()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst innerLiteralNode = findNodeImplementation(assignmentValueNode)\n\n\t\treturn {\n\t\t\trole: 'property' as const,\n\t\t\tidentifier: identifierName,\n\t\t\tshape: getValidatorPropertyShape(innerLiteralNode),\n\t\t\toptional: getValidatorPropertyOptionality(innerLiteralNode),\n\t\t\tdescription: getValidatorPropertyStringValue(innerLiteralNode, 'description'),\n\t\t\terrorMessage: getValidatorPropertyStringValue(innerLiteralNode, 'errorMessage'),\n\t\t}\n\t})\n\n\treturn properties || []\n}\n\nconst isZodCallExpression = (node: Node): boolean => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)\n\tif (!callExpression) {\n\t\treturn false\n\t}\n\tconst returnType = callExpression.getReturnType()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\treturn typeName.startsWith('Zod')\n}\n\nconst getZodCallShape = (node: Node): ShapeOfType['shape'] => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)!\n\tconst returnType = callExpression.getReturnType()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\n\tif (typeName === 'ZodNumber') {\n\t\treturn 'number'\n\t}\n\tif (typeName === 'ZodString') {\n\t\treturn 'string'\n\t}\n\tif (typeName === 'ZodBoolean') {\n\t\treturn 'boolean'\n\t}\n\tif (typeName === 'ZodBigInt') {\n\t\treturn 'bigint'\n\t}\n\n\tif (typeName === 'ZodObject') {\n\t\tconst argNode = callExpression.getFirstChildByKind(SyntaxKind.SyntaxList)?.getFirstChild()\n\t\tconst objectLiteral = argNode?.asKind(SyntaxKind.ObjectLiteralExpression)\n\t\tif (!objectLiteral) {\n\t\t\treturn 'unknown_zod_object'\n\t\t}\n\t\tconst syntaxList = objectLiteral.getFirstChildByKind(SyntaxKind.SyntaxList)\n\t\tif (!syntaxList) {\n\t\t\treturn []\n\t\t}\n\t\tconst properties = syntaxList.getChildrenOfKind(SyntaxKind.PropertyAssignment)\n\t\treturn properties.map((prop) => {\n\t\t\tconst identifier = prop.getFirstChildByKind(SyntaxKind.Identifier)!.getText()\n\t\t\tconst valueNode = prop.getLastChild()!\n\t\t\treturn {\n\t\t\t\trole: 'property' as const,\n\t\t\t\tidentifier,\n\t\t\t\tshape: isZodCallExpression(valueNode)\n\t\t\t\t\t? getZodCallShape(valueNode)\n\t\t\t\t\t: getValidatorPropertyShape(valueNode),\n\t\t\t\toptional: false,\n\t\t\t}\n\t\t})\n\t}\n\n\tif (typeName === 'ZodArray') {\n\t\tconst argNode = callExpression.getFirstChildByKind(SyntaxKind.SyntaxList)?.getFirstChild()\n\t\tif (!argNode) {\n\t\t\treturn 'unknown_zod_array'\n\t\t}\n\t\tconst elementShape = isZodCallExpression(argNode)\n\t\t\t? getZodCallShape(argNode)\n\t\t\t: getValidatorPropertyShape(argNode)\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: elementShape,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown zod type: ${typeName}`)\n\treturn 'unknown_zod'\n}\n\nexport const getValidatorPropertyShape = (innerLiteralNode: Node): ShapeOfType['shape'] => {\n\t// Zod validator (e.g. z.number(), z.string(), z.object({...}), z.array(...))\n\tif (isZodCallExpression(innerLiteralNode)) {\n\t\treturn getZodCallShape(innerLiteralNode)\n\t}\n\n\t// Inline definition with `as Validator<...>` clause\n\tconst inlineValidatorAsExpression = innerLiteralNode\n\t\t.getParent()!\n\t\t.getFirstChildByKind(SyntaxKind.AsExpression)\n\tif (inlineValidatorAsExpression) {\n\t\tconst typeReference = inlineValidatorAsExpression.getLastChildByKind(SyntaxKind.TypeReference)!\n\t\treturn getTypeReferenceShape(typeReference)\n\t}\n\n\t// Variable with `: Validator<...>` clause\n\tconst childTypeReferenceNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.TypeReference)\n\tif (childTypeReferenceNode) {\n\t\treturn getTypeReferenceShape(childTypeReferenceNode)\n\t}\n\n\t// `RequiredParam<...>` inline call expression\n\tif (innerLiteralNode.getParent()!.getChildrenOfKind(SyntaxKind.SyntaxList).length >= 2) {\n\t\tconst typeNode = innerLiteralNode\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getFirstChild()!\n\t\treturn getRecursiveNodeShape(typeNode)\n\t}\n\n\t// `RequestParam | RequiredParam | OptionalParam` call expression\n\tconst childCallExpressionNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.CallExpression)\n\tif (childCallExpressionNode) {\n\t\tconst callExpressionArgument = findNodeImplementation(\n\t\t\tchildCallExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!.getFirstChild()!,\n\t\t)\n\n\t\t// Param is a type reference\n\t\tconst typeReferenceNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.TypeReference)!\n\t\tif (typeReferenceNode) {\n\t\t\treturn getProperTypeShape(typeReferenceNode.getType(), typeReferenceNode, [])\n\t\t}\n\n\t\tconst thingyNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.ObjectLiteralExpression)!\n\t\tif (thingyNode) {\n\t\t\treturn getValidatorPropertyShape(thingyNode)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.CallExpression) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.IntersectionType) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\t\tLogger.warn(`[${fileName}] Unknown call expression argument: ${callExpressionArgument.getKindName()}`)\n\t\treturn 'unknown_3'\n\t}\n\n\t// Attempting to infer type from `parse` function\n\tconst innerNodePropertyAssignments = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t.getChildrenOfKind(SyntaxKind.PropertyAssignment)\n\tconst parsePropertyAssignment = innerNodePropertyAssignments.find((prop) => {\n\t\treturn prop.getFirstChildByKind(SyntaxKind.Identifier)?.getText() === 'parse'\n\t})\n\tif (parsePropertyAssignment) {\n\t\tconst returnType = findPropertyAssignmentValueNode(parsePropertyAssignment)\n\t\t\t.asKind(SyntaxKind.ArrowFunction)!\n\t\t\t.getReturnType()\n\t\treturn getProperTypeShape(returnType, parsePropertyAssignment)\n\t}\n\n\t// Import statement\n\tconst importTypeNode = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)\n\t\t?.getFirstChildByKind(SyntaxKind.ImportType)\n\tif (importTypeNode) {\n\t\tconst indexOfGreaterThanToken = importTypeNode\n\t\t\t.getLastChildByKind(SyntaxKind.GreaterThanToken)!\n\t\t\t.getChildIndex()\n\t\tconst targetSyntaxList = importTypeNode.getChildAtIndex(indexOfGreaterThanToken - 1)\n\t\treturn getRecursiveNodeShape(targetSyntaxList.getFirstChild()!)\n\t}\n\n\t// Intersection type with Validator\n\tconst intersectionType = innerLiteralNode.isKind(SyntaxKind.IntersectionType)\n\t\t? innerLiteralNode\n\t\t: innerLiteralNode.getParent()?.isKind(SyntaxKind.VariableDeclaration)\n\t\t\t? innerLiteralNode.getParent()?.getFirstChildByKind(SyntaxKind.IntersectionType)\n\t\t\t: null\n\n\tif (intersectionType) {\n\t\tconst validatorType = intersectionType.getFirstChildByKind(SyntaxKind.TypeReference)\n\t\tif (validatorType) {\n\t\t\treturn getTypeReferenceShape(validatorType)\n\t\t}\n\t}\n\n\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown import type node`)\n\n\treturn 'unknown_2'\n}\n\nexport const getValidatorPropertyOptionality = (node: Node): boolean => {\n\tif (isZodCallExpression(node)) {\n\t\treturn false\n\t}\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst identifierNode = callExpressionNode.getFirstChildByKind(SyntaxKind.Identifier)\n\t\tif (identifierNode?.getText() === 'OptionalParam') {\n\t\t\treturn true\n\t\t} else if (identifierNode?.getText() === 'RequiredParam') {\n\t\t\treturn false\n\t\t}\n\n\t\tconst syntaxListNode = callExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\tconst literalExpression = findNodeImplementation(syntaxListNode.getFirstChild()!)\n\t\treturn getValidatorPropertyOptionality(literalExpression)\n\t}\n\n\tconst syntaxListNode = node.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\treturn assignmentNodes.some((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tif (identifierName === 'optional') {\n\t\t\tconst value = findPropertyAssignmentValueNode(node)\n\t\t\treturn value.getKind() === SyntaxKind.TrueKeyword\n\t\t}\n\t\treturn false\n\t})\n}\n\nexport const getValidatorPropertyStringValue = (\n\tnodeOrReference: Node,\n\tname: 'description' | 'errorMessage',\n): string => {\n\tif (isZodCallExpression(nodeOrReference)) {\n\t\treturn ''\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst targetChild = callExpressionNode.getLastChildByKind(SyntaxKind.SyntaxList)!\n\t\treturn getValidatorPropertyStringValue(targetChild, name)\n\t}\n\n\tconst syntaxListNode = node.asKind(SyntaxKind.SyntaxList)\n\tif (syntaxListNode) {\n\t\tconst children = syntaxListNode.getChildren().map((c) => getValidatorPropertyStringValue(c, name))\n\t\treturn children.find((value) => !!value && value !== 'unknown_25') || ''\n\t}\n\n\tconst objectLiteralNode = node.asKind(SyntaxKind.ObjectLiteralExpression)\n\tif (objectLiteralNode) {\n\t\tconst values = getValuesOfObjectLiteral(objectLiteralNode)\n\t\tconst targetValue = values.find((value) => value.identifier === name)\n\t\tif (!targetValue) {\n\t\t\treturn ''\n\t\t}\n\t\tif (Array.isArray(targetValue.value)) {\n\t\t\treturn 'array'\n\t\t}\n\t\treturn targetValue.value || ''\n\t}\n\n\tconst intersectionTypeNode = node.asKind(SyntaxKind.IntersectionType)\n\tif (intersectionTypeNode) {\n\t\treturn (\n\t\t\tintersectionTypeNode\n\t\t\t\t.getTypeNodes()\n\t\t\t\t.flatMap((t) => getValidatorPropertyStringValue(t, name))\n\t\t\t\t.filter((v) => !!v && v !== 'unknown_25')[0] || 'unknown_27'\n\t\t)\n\t}\n\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\treturn getValidatorPropertyStringValue(typeLiteralNode.getFirstChildByKind(SyntaxKind.SyntaxList)!, name)\n\t}\n\n\tconst propertySignatureNode = node.asKind(SyntaxKind.PropertySignature)\n\tif (propertySignatureNode) {\n\t\tconst identifier = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tif (identifier.getText() === name) {\n\t\t\tconst targetNode = findPropertyAssignmentValueNode(propertySignatureNode).getFirstDescendantByKind(\n\t\t\t\tSyntaxKind.StringLiteral,\n\t\t\t)!\n\t\t\treturn targetNode.getLiteralText()\n\t\t}\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown property string value node ${node.getKindName()}`)\n\treturn 'unknown_25'\n}\n\nconst isPromise = (type: Type) => {\n\tconst symbol = type.getSymbol()\n\tif (!type.isObject() || !symbol) {\n\t\treturn false\n\t}\n\tconst args = type.getTypeArguments()\n\treturn symbol.getName() === 'Promise' && args.length === 1\n}\n\nexport const getProperTypeShape = (\n\ttypeOrPromise: Type,\n\tatLocation: Node,\n\tstack: Type[] = [],\n): ShapeOfType['shape'] => {\n\tconst typeName = typeOrPromise.getAliasSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst type = isPromise(typeOrPromise) ? typeOrPromise.getTypeArguments()[0] : typeOrPromise\n\n\tif (stack.some((previousType) => previousType === type)) {\n\t\treturn 'circular'\n\t}\n\n\tconst nextStack = stack.concat(type)\n\n\tif (type.getText() === 'void') {\n\t\treturn 'void'\n\t}\n\n\tif (type.isAny()) {\n\t\treturn 'any'\n\t}\n\n\tif (type.isNull()) {\n\t\treturn 'null'\n\t}\n\n\tif (type.isUndefined()) {\n\t\treturn 'undefined'\n\t}\n\n\tif (type.isBoolean() || type.isBooleanLiteral()) {\n\t\treturn 'boolean'\n\t}\n\n\tif (type.isStringLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_string' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isNumberLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_number' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isString() || type.isTemplateLiteral()) {\n\t\treturn 'string'\n\t}\n\n\tif (type.isNumber()) {\n\t\treturn 'number'\n\t}\n\n\tif (type.getText() === 'bigint') {\n\t\treturn 'bigint'\n\t}\n\n\tif (type.isTuple()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'tuple' as const,\n\t\t\t\tshape: type.getTupleElements().map((t) => ({\n\t\t\t\t\trole: 'tuple_entry' as const,\n\t\t\t\t\tshape: getProperTypeShape(t, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t})),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isArray()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: getProperTypeShape(type.getArrayElementType()!, atLocation, nextStack),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && type.getText() === 'Buffer') {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'buffer' as const,\n\t\t\t\tshape: 'buffer',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && type.getProperties().length === 0) {\n\t\tconst targetType = type.getAliasTypeArguments()[1] ?? type.getStringIndexType()\n\t\tif (targetType) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'record' as const,\n\t\t\t\t\tshape: getProperTypeShape(targetType, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t}\n\n\tif (type.isObject()) {\n\t\tif (type.getText() === 'Date') {\n\t\t\treturn 'Date'\n\t\t}\n\t\treturn type\n\t\t\t.getProperties()\n\t\t\t.map((prop) => {\n\t\t\t\tconst valueDeclaration = prop.getValueDeclaration() || prop.getDeclarations()[0]!\n\t\t\t\tif (!valueDeclaration) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape: getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack),\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst valueDeclarationNode =\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertySignature) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertyAssignment) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n\t\t\t\tif (!valueDeclarationNode) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape: getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack),\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isOptional = prop.getTypeAtLocation(atLocation).isNullable()\n\n\t\t\t\tconst shape = getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack)\n\t\t\t\treturn {\n\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\tshape: shape,\n\t\t\t\t\toptional: isOptional,\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((val) => val.shape !== 'undefined')\n\t}\n\n\tif (type.isUnion()) {\n\t\tconst unfilteredShapes: ShapeOfUnionEntry[] = type.getUnionTypes().map((type) => ({\n\t\t\trole: 'union_entry',\n\t\t\tshape: getProperTypeShape(type, atLocation, nextStack),\n\t\t\toptional: false,\n\t\t}))\n\n\t\tconst dedupedShapes = unfilteredShapes.filter(\n\t\t\t(type, index, arr) => !arr.find((dup, dupIndex) => dup.shape === type.shape && dupIndex > index),\n\t\t)\n\t\tconst isNullable = dedupedShapes.some((shape) => shape.shape === 'undefined')\n\t\tconst shapes = dedupedShapes.filter((shape) => shape.shape !== 'undefined')\n\t\tif (shapes.length === 1) {\n\t\t\treturn shapes[0].shape\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'union',\n\t\t\t\tshape: shapes,\n\t\t\t\toptional: isNullable,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isIntersection()) {\n\t\tconst children = type.getIntersectionTypes()\n\t\tconst shapesOfChildren = children\n\t\t\t.map((child) => getProperTypeShape(child, atLocation, nextStack))\n\t\t\t.filter((shape) => typeof shape !== 'string') as ShapeOfProperty[][]\n\t\treturn shapesOfChildren.reduce<ShapeOfType[]>((total, current) => [...total, ...current], [])\n\t}\n\n\tconst fileName = atLocation.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown type shape node ${typeOrPromise.getText()}`)\n\treturn 'unknown_5'\n}\n\nconst getLiteralValueOfNode = (node: Node): string | string[] | unknown[] => {\n\tif (node.isKind(SyntaxKind.Identifier)) {\n\t\treturn getLiteralValueOfNode(findNodeImplementation(node))\n\t} else if (node.isKind(SyntaxKind.StringLiteral)) {\n\t\treturn node.getLiteralValue()\n\t} else if (node.isKind(SyntaxKind.ArrayLiteralExpression)) {\n\t\treturn node.forEachChildAsArray().map((child) => getLiteralValueOfNode(child)) as string[]\n\t} else if (node.isKind(SyntaxKind.PropertyAccessExpression)) {\n\t\treturn getLiteralValueOfNode(findPropertyAssignmentValueNode(node))\n\t} else if (node.isKind(SyntaxKind.ObjectLiteralExpression)) {\n\t\treturn getValuesOfObjectLiteral(node)\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown literal value node ${node.getKindName()}`)\n\n\treturn 'unknown_6'\n}\n\nexport const resolveEndpointPath = (node: Node): string | null => {\n\tconst callExpression = node.getFirstDescendantByKind(SyntaxKind.CallExpression)\n\tif (!callExpression) return null\n\n\tconst firstArg = callExpression.getArguments()[0]\n\tif (!firstArg) return null\n\n\tconst argType = firstArg.getType()\n\tif (argType.isStringLiteral()) {\n\t\treturn argType.getLiteralValue() as string\n\t}\n\n\treturn null\n}\n\nexport const getValuesOfObjectLiteral = (objectLiteralNode: Node<ts.ObjectLiteralExpression>) => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst targetNode = findNodeImplementation(assignmentValueNode)\n\t\tconst value = getLiteralValueOfNode(targetNode)\n\n\t\treturn {\n\t\t\tidentifier: identifierName,\n\t\t\tvalue,\n\t\t}\n\t})\n\n\treturn properties || []\n}\n"],"names":["implementationCache","findNodeImplementation","node","cached","SyntaxKind","implementationNode","assignmentValueNode","result","definitionNode","findPropertyAssignmentValueNode","identifierChildren","child","getTypeReferenceShape","firstChild","getRecursiveNodeShape","nodeOrReference","typeName","OpenApiManager","literalNode","typeLiteralNode","propNode","identifier","valueNode","questionMarkToken","typeReferenceNode","lastChild","getProperTypeShape","unionTypeNode","typeQueryNode","qualifiedNameNode","callExpressionNode","awaitExpressionNode","asExpressionNode","fileName","Logger","getShapeOfValidatorLiteral","objectLiteralNode","identifierNode","identifierName","innerLiteralNode","getValidatorPropertyShape","getValidatorPropertyOptionality","getValidatorPropertyStringValue","isZodCallExpression","callExpression","getZodCallShape","objectLiteral","syntaxList","prop","argNode","inlineValidatorAsExpression","typeReference","childTypeReferenceNode","typeNode","childCallExpressionNode","callExpressionArgument","thingyNode","parsePropertyAssignment","returnType","importTypeNode","indexOfGreaterThanToken","targetSyntaxList","intersectionType","validatorType","syntaxListNode","literalExpression","name","targetChild","c","value","targetValue","getValuesOfObjectLiteral","intersectionTypeNode","t","v","propertySignatureNode","isPromise","type","symbol","args","typeOrPromise","atLocation","stack","previousType","nextStack","targetType","valueDeclaration","isOptional","shape","val","dedupedShapes","index","arr","dup","dupIndex","isNullable","shapes","total","current","getLiteralValueOfNode","resolveEndpointPath","firstArg","argType","targetNode"],"mappings":"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"}
1
+ {"version":3,"file":"nodeParsers.mjs","sources":["../../../src/openapi/analyzerModule/nodeParsers.ts"],"sourcesContent":["import {\n\tNode,\n\tPropertyAccessExpression,\n\tPropertyAssignment,\n\tPropertySignature,\n\tShorthandPropertyAssignment,\n\tSyntaxKind,\n\tts,\n\tType,\n\tTypeReferenceNode,\n} from 'ts-morph'\n\nimport { Logger } from '../../utils/logger'\nimport { OpenApiManager } from '../manager/OpenApiManager'\nimport { ShapeOfProperty, ShapeOfType, ShapeOfUnionEntry } from './types'\n\nconst implementationCache = new WeakMap<Node, Node>()\n\nexport const findNodeImplementation = (node: Node): Node => {\n\tconst cached = implementationCache.get(node)\n\tif (cached) {\n\t\treturn cached\n\t}\n\n\tif (node.getKind() === SyntaxKind.Identifier) {\n\t\tconst implementationNode = node.asKind(SyntaxKind.Identifier)!.getImplementations()[0]?.getNode()\n\t\tif (implementationNode) {\n\t\t\tconst implementationParentNode = implementationNode.getParent()!\n\t\t\tconst assignmentValueNode = implementationParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\n\t\tconst definitionNode = node.asKind(SyntaxKind.Identifier)!.getDefinitions()[0]?.getNode()\n\t\tif (definitionNode) {\n\t\t\tconst definitionParentNode = definitionNode.getParent()!\n\t\t\tconst assignmentValueNode = definitionParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\t\tthrow new Error('No implementation nor definition available')\n\t}\n\n\timplementationCache.set(node, node)\n\treturn node\n}\n\nexport const findPropertyAssignmentValueNode = (\n\tnode:\n\t\t| PropertyAssignment\n\t\t| TypeReferenceNode\n\t\t| PropertySignature\n\t\t| PropertyAccessExpression\n\t\t| ShorthandPropertyAssignment,\n): Node => {\n\tconst identifierChildren = node.getChildrenOfKind(SyntaxKind.Identifier)\n\tif (identifierChildren.length === 2) {\n\t\treturn findNodeImplementation(identifierChildren[1])\n\t}\n\tconst lastMatchingChild = node.getChildren().reverse()\n\treturn lastMatchingChild.find(\n\t\t(child) =>\n\t\t\tchild.getKind() !== SyntaxKind.GreaterThanToken &&\n\t\t\tchild.getKind() !== SyntaxKind.CommaToken &&\n\t\t\tchild.getKind() !== SyntaxKind.SemicolonToken,\n\t)!\n}\n\nexport const getTypeReferenceShape = (node: TypeReferenceNode): ShapeOfType['shape'] => {\n\tconst firstChild = node.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\tif (firstChild.isKind(SyntaxKind.SyntaxList)) {\n\t\treturn getRecursiveNodeShape(firstChild.getFirstChild()!)\n\t} else {\n\t\treturn getRecursiveNodeShape(firstChild)\n\t}\n}\n\nexport const getRecursiveNodeShape = (nodeOrReference: Node): ShapeOfType['shape'] => {\n\tconst typeName = nodeOrReference.getSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\t// Undefined\n\tconst undefinedNode = node.asKind(SyntaxKind.UndefinedKeyword)\n\tif (undefinedNode) {\n\t\treturn 'undefined'\n\t}\n\n\t// Literal type\n\tconst literalNode = node.asKind(SyntaxKind.LiteralType)\n\tif (literalNode) {\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.TrueKeyword)) {\n\t\t\treturn 'true'\n\t\t}\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.FalseKeyword)) {\n\t\t\treturn 'false'\n\t\t}\n\t}\n\n\t// Boolean literal\n\tconst booleanLiteralNode =\n\t\tnode.asKind(SyntaxKind.BooleanKeyword) ||\n\t\tnode.asKind(SyntaxKind.TrueKeyword) ||\n\t\tnode.asKind(SyntaxKind.FalseKeyword)\n\tif (booleanLiteralNode) {\n\t\treturn 'boolean'\n\t}\n\n\t// String literal\n\tconst stringLiteralNode = node.asKind(SyntaxKind.StringKeyword) || node.asKind(SyntaxKind.StringLiteral)\n\tif (stringLiteralNode) {\n\t\treturn 'string'\n\t}\n\n\t// Number literal\n\tconst numberLiteralNode = node.asKind(SyntaxKind.NumberKeyword) || node.asKind(SyntaxKind.NumericLiteral)\n\tif (numberLiteralNode) {\n\t\treturn 'number'\n\t}\n\n\t// BigInt literal\n\tconst bigIntNode = node.asKind(SyntaxKind.BigIntKeyword) || node.asKind(SyntaxKind.BigIntLiteral)\n\tif (bigIntNode) {\n\t\treturn 'bigint'\n\t}\n\n\t// Type literal\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\tconst properties = typeLiteralNode\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getChildrenOfKind(SyntaxKind.PropertySignature)\n\n\t\tconst propertyShapes = properties.map((propNode) => {\n\t\t\tconst identifier = propNode.getFirstChildByKind(SyntaxKind.Identifier)!\n\t\t\tconst valueNode = findPropertyAssignmentValueNode(propNode)\n\t\t\tconst questionMarkToken = identifier.getNextSiblingIfKind(SyntaxKind.QuestionToken)\n\t\t\treturn {\n\t\t\t\trole: 'property' as const,\n\t\t\t\tidentifier: identifier.getText(),\n\t\t\t\tshape: getRecursiveNodeShape(valueNode),\n\t\t\t\toptional: valueNode.getType().isNullable() || !!questionMarkToken,\n\t\t\t}\n\t\t})\n\t\treturn propertyShapes\n\t}\n\n\t// Type reference\n\tconst typeReferenceNode = node.asKind(SyntaxKind.TypeReference)\n\tif (typeReferenceNode) {\n\t\treturn getRecursiveNodeShape(typeReferenceNode.getFirstChild()!)\n\t}\n\n\t// Property access expression\n\tconst propertyAccessNode = node.asKind(SyntaxKind.PropertyAccessExpression)\n\tif (propertyAccessNode) {\n\t\tconst lastChild = findNodeImplementation(node.getLastChild()!)\n\t\treturn getProperTypeShape(lastChild.asKind(SyntaxKind.CallExpression)!.getReturnType(), lastChild)\n\t}\n\n\t// Union type\n\tconst unionTypeNode = node.asKind(SyntaxKind.UnionType)\n\tif (unionTypeNode) {\n\t\treturn getProperTypeShape(unionTypeNode.getType(), node)\n\t}\n\n\t// Typeof query\n\tconst typeQueryNode = node.asKind(SyntaxKind.TypeQuery)\n\tif (typeQueryNode) {\n\t\treturn getRecursiveNodeShape(typeQueryNode.getLastChild()!)\n\t}\n\n\t// Qualified name\n\tconst qualifiedNameNode = node.asKind(SyntaxKind.QualifiedName)\n\tif (qualifiedNameNode) {\n\t\treturn getRecursiveNodeShape(qualifiedNameNode.getLastChild()!)\n\t}\n\n\t// Call expression\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\treturn getProperTypeShape(callExpressionNode.getReturnType(), callExpressionNode)\n\t}\n\n\t// Await expression\n\tconst awaitExpressionNode = node.asKind(SyntaxKind.AwaitExpression)\n\tif (awaitExpressionNode) {\n\t\treturn getRecursiveNodeShape(awaitExpressionNode.getChildAtIndex(1)!)\n\t}\n\n\t// 'As' Expression\n\tconst asExpressionNode = node.asKind(SyntaxKind.AsExpression)\n\tif (asExpressionNode) {\n\t\treturn getRecursiveNodeShape(asExpressionNode.getChildAtIndex(2)!)\n\t}\n\n\t// TODO\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown node type: ${node.getKindName()}`)\n\treturn 'unknown_1'\n}\n\nexport const getShapeOfValidatorLiteral = (\n\tobjectLiteralNode: Node<ts.ObjectLiteralExpression>,\n): (ShapeOfProperty & { description: string; errorMessage: string })[] => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstChild()!\n\t\tconst identifierName = (() => {\n\t\t\tif (identifierNode.isKind(SyntaxKind.Identifier)) {\n\t\t\t\treturn identifierNode.getText()\n\t\t\t}\n\t\t\tif (identifierNode.isKind(SyntaxKind.StringLiteral)) {\n\t\t\t\treturn identifierNode.getLiteralText()\n\t\t\t}\n\t\t\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\t\t\tLogger.warn(`[${fileName}] Unknown identifier name: ${identifierNode.getText()}`)\n\t\t\treturn 'unknown_30'\n\t\t})()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst innerLiteralNode = findNodeImplementation(assignmentValueNode)\n\n\t\treturn {\n\t\t\trole: 'property' as const,\n\t\t\tidentifier: identifierName,\n\t\t\tshape: getValidatorPropertyShape(innerLiteralNode),\n\t\t\toptional: getValidatorPropertyOptionality(innerLiteralNode),\n\t\t\tdescription: getValidatorPropertyStringValue(innerLiteralNode, 'description'),\n\t\t\terrorMessage: getValidatorPropertyStringValue(innerLiteralNode, 'errorMessage'),\n\t\t}\n\t})\n\n\treturn properties || []\n}\n\nconst isZodCallExpression = (node: Node): boolean => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)\n\tif (!callExpression) {\n\t\treturn false\n\t}\n\tconst returnType = callExpression.getReturnType()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\treturn typeName.startsWith('Zod')\n}\n\nconst getZodCallShape = (node: Node): ShapeOfType['shape'] => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)!\n\tconst returnType = callExpression.getReturnType()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\n\tif (typeName === 'ZodNumber') {\n\t\treturn 'number'\n\t}\n\tif (typeName === 'ZodString') {\n\t\treturn 'string'\n\t}\n\tif (typeName === 'ZodBoolean') {\n\t\treturn 'boolean'\n\t}\n\tif (typeName === 'ZodBigInt') {\n\t\treturn 'bigint'\n\t}\n\n\tif (typeName === 'ZodObject') {\n\t\tconst argNode = callExpression.getFirstChildByKind(SyntaxKind.SyntaxList)?.getFirstChild()\n\t\tconst objectLiteral = argNode?.asKind(SyntaxKind.ObjectLiteralExpression)\n\t\tif (!objectLiteral) {\n\t\t\treturn 'unknown_zod_object'\n\t\t}\n\t\tconst syntaxList = objectLiteral.getFirstChildByKind(SyntaxKind.SyntaxList)\n\t\tif (!syntaxList) {\n\t\t\treturn []\n\t\t}\n\t\tconst properties = syntaxList.getChildrenOfKind(SyntaxKind.PropertyAssignment)\n\t\treturn properties.map((prop) => {\n\t\t\tconst identifier = prop.getFirstChildByKind(SyntaxKind.Identifier)!.getText()\n\t\t\tconst valueNode = prop.getLastChild()!\n\t\t\treturn {\n\t\t\t\trole: 'property' as const,\n\t\t\t\tidentifier,\n\t\t\t\tshape: isZodCallExpression(valueNode)\n\t\t\t\t\t? getZodCallShape(valueNode)\n\t\t\t\t\t: getValidatorPropertyShape(valueNode),\n\t\t\t\toptional: false,\n\t\t\t}\n\t\t})\n\t}\n\n\tif (typeName === 'ZodArray') {\n\t\tconst argNode = callExpression.getFirstChildByKind(SyntaxKind.SyntaxList)?.getFirstChild()\n\t\tif (!argNode) {\n\t\t\treturn 'unknown_zod_array'\n\t\t}\n\t\tconst elementShape = isZodCallExpression(argNode)\n\t\t\t? getZodCallShape(argNode)\n\t\t\t: getValidatorPropertyShape(argNode)\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: elementShape,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown zod type: ${typeName}`)\n\treturn 'unknown_zod'\n}\n\nexport const getValidatorPropertyShape = (innerLiteralNode: Node): ShapeOfType['shape'] => {\n\t// Zod validator (e.g. z.number(), z.string(), z.object({...}), z.array(...))\n\tif (isZodCallExpression(innerLiteralNode)) {\n\t\treturn getZodCallShape(innerLiteralNode)\n\t}\n\n\t// Inline definition with `as Validator<...>` clause\n\tconst inlineValidatorAsExpression = innerLiteralNode\n\t\t.getParent()!\n\t\t.getFirstChildByKind(SyntaxKind.AsExpression)\n\tif (inlineValidatorAsExpression) {\n\t\tconst typeReference = inlineValidatorAsExpression.getLastChildByKind(SyntaxKind.TypeReference)!\n\t\treturn getTypeReferenceShape(typeReference)\n\t}\n\n\t// Variable with `: Validator<...>` clause\n\tconst childTypeReferenceNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.TypeReference)\n\tif (childTypeReferenceNode) {\n\t\treturn getTypeReferenceShape(childTypeReferenceNode)\n\t}\n\n\t// `RequiredParam<...>` inline call expression\n\tif (innerLiteralNode.getParent()!.getChildrenOfKind(SyntaxKind.SyntaxList).length >= 2) {\n\t\tconst typeNode = innerLiteralNode\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getFirstChild()!\n\t\treturn getRecursiveNodeShape(typeNode)\n\t}\n\n\t// `RequestParam | RequiredParam | OptionalParam` call expression\n\tconst childCallExpressionNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.CallExpression)\n\tif (childCallExpressionNode) {\n\t\tconst callExpressionArgument = findNodeImplementation(\n\t\t\tchildCallExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!.getFirstChild()!,\n\t\t)\n\n\t\t// Param is a type reference\n\t\tconst typeReferenceNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.TypeReference)!\n\t\tif (typeReferenceNode) {\n\t\t\treturn getProperTypeShape(typeReferenceNode.getType(), typeReferenceNode, [])\n\t\t}\n\n\t\tconst thingyNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.ObjectLiteralExpression)!\n\t\tif (thingyNode) {\n\t\t\treturn getValidatorPropertyShape(thingyNode)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.CallExpression) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.IntersectionType) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\t\tLogger.warn(`[${fileName}] Unknown call expression argument: ${callExpressionArgument.getKindName()}`)\n\t\treturn 'unknown_3'\n\t}\n\n\t// Attempting to infer type from `parse` function\n\tconst innerNodePropertyAssignments = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t.getChildrenOfKind(SyntaxKind.PropertyAssignment)\n\tconst parsePropertyAssignment = innerNodePropertyAssignments.find((prop) => {\n\t\treturn prop.getFirstChildByKind(SyntaxKind.Identifier)?.getText() === 'parse'\n\t})\n\tif (parsePropertyAssignment) {\n\t\tconst returnType = findPropertyAssignmentValueNode(parsePropertyAssignment)\n\t\t\t.asKind(SyntaxKind.ArrowFunction)!\n\t\t\t.getReturnType()\n\t\treturn getProperTypeShape(returnType, parsePropertyAssignment)\n\t}\n\n\t// Import statement\n\tconst importTypeNode = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)\n\t\t?.getFirstChildByKind(SyntaxKind.ImportType)\n\tif (importTypeNode) {\n\t\tconst indexOfGreaterThanToken = importTypeNode\n\t\t\t.getLastChildByKind(SyntaxKind.GreaterThanToken)!\n\t\t\t.getChildIndex()\n\t\tconst targetSyntaxList = importTypeNode.getChildAtIndex(indexOfGreaterThanToken - 1)\n\t\treturn getRecursiveNodeShape(targetSyntaxList.getFirstChild()!)\n\t}\n\n\t// Intersection type with Validator\n\tconst intersectionType = innerLiteralNode.isKind(SyntaxKind.IntersectionType)\n\t\t? innerLiteralNode\n\t\t: innerLiteralNode.getParent()?.isKind(SyntaxKind.VariableDeclaration)\n\t\t\t? innerLiteralNode.getParent()?.getFirstChildByKind(SyntaxKind.IntersectionType)\n\t\t\t: null\n\n\tif (intersectionType) {\n\t\tconst validatorType = intersectionType.getFirstChildByKind(SyntaxKind.TypeReference)\n\t\tif (validatorType) {\n\t\t\treturn getTypeReferenceShape(validatorType)\n\t\t}\n\t}\n\n\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown import type node`)\n\n\treturn 'unknown_2'\n}\n\nexport const getValidatorPropertyOptionality = (node: Node): boolean => {\n\tif (isZodCallExpression(node)) {\n\t\treturn false\n\t}\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst identifierNode = callExpressionNode.getFirstChildByKind(SyntaxKind.Identifier)\n\t\tif (identifierNode?.getText() === 'OptionalParam') {\n\t\t\treturn true\n\t\t} else if (identifierNode?.getText() === 'RequiredParam') {\n\t\t\treturn false\n\t\t}\n\n\t\tconst syntaxListNode = callExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\tconst literalExpression = findNodeImplementation(syntaxListNode.getFirstChild()!)\n\t\treturn getValidatorPropertyOptionality(literalExpression)\n\t}\n\n\tconst syntaxListNode = node.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\treturn assignmentNodes.some((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tif (identifierName === 'optional') {\n\t\t\tconst value = findPropertyAssignmentValueNode(node)\n\t\t\treturn value.getKind() === SyntaxKind.TrueKeyword\n\t\t}\n\t\treturn false\n\t})\n}\n\nexport const getValidatorPropertyStringValue = (\n\tnodeOrReference: Node,\n\tname: 'description' | 'errorMessage',\n): string => {\n\tif (isZodCallExpression(nodeOrReference)) {\n\t\treturn ''\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst targetChild = callExpressionNode.getLastChildByKind(SyntaxKind.SyntaxList)!\n\t\treturn getValidatorPropertyStringValue(targetChild, name)\n\t}\n\n\tconst syntaxListNode = node.asKind(SyntaxKind.SyntaxList)\n\tif (syntaxListNode) {\n\t\tconst children = syntaxListNode.getChildren().map((c) => getValidatorPropertyStringValue(c, name))\n\t\treturn children.find((value) => !!value && value !== 'unknown_25') || ''\n\t}\n\n\tconst objectLiteralNode = node.asKind(SyntaxKind.ObjectLiteralExpression)\n\tif (objectLiteralNode) {\n\t\tconst values = getValuesOfObjectLiteral(objectLiteralNode)\n\t\tconst targetValue = values.find((value) => value.identifier === name)\n\t\tif (!targetValue) {\n\t\t\treturn ''\n\t\t}\n\t\tif (Array.isArray(targetValue.value)) {\n\t\t\treturn 'array'\n\t\t}\n\t\treturn targetValue.value || ''\n\t}\n\n\tconst intersectionTypeNode = node.asKind(SyntaxKind.IntersectionType)\n\tif (intersectionTypeNode) {\n\t\treturn (\n\t\t\tintersectionTypeNode\n\t\t\t\t.getTypeNodes()\n\t\t\t\t.flatMap((t) => getValidatorPropertyStringValue(t, name))\n\t\t\t\t.filter((v) => !!v && v !== 'unknown_25')[0] || 'unknown_27'\n\t\t)\n\t}\n\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\treturn getValidatorPropertyStringValue(typeLiteralNode.getFirstChildByKind(SyntaxKind.SyntaxList)!, name)\n\t}\n\n\tconst propertySignatureNode = node.asKind(SyntaxKind.PropertySignature)\n\tif (propertySignatureNode) {\n\t\tconst identifier = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tif (identifier.getText() === name) {\n\t\t\tconst targetNode = findPropertyAssignmentValueNode(propertySignatureNode).getFirstDescendantByKind(\n\t\t\t\tSyntaxKind.StringLiteral,\n\t\t\t)!\n\t\t\treturn targetNode.getLiteralText()\n\t\t}\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown property string value node ${node.getKindName()}`)\n\treturn 'unknown_25'\n}\n\nconst isPromise = (type: Type) => {\n\tconst symbol = type.getSymbol()\n\tif (!type.isObject() || !symbol) {\n\t\treturn false\n\t}\n\tconst args = type.getTypeArguments()\n\treturn symbol.getName() === 'Promise' && args.length === 1\n}\n\nexport const getProperTypeShape = (\n\ttypeOrPromise: Type,\n\tatLocation: Node,\n\tstack: Type[] = [],\n): ShapeOfType['shape'] => {\n\tconst typeName = typeOrPromise.getAliasSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst type = isPromise(typeOrPromise) ? typeOrPromise.getTypeArguments()[0] : typeOrPromise\n\n\tif (stack.some((previousType) => previousType === type)) {\n\t\treturn 'circular'\n\t}\n\n\tconst nextStack = stack.concat(type)\n\n\tif (type.getText() === 'void') {\n\t\treturn 'void'\n\t}\n\n\tif (type.isAny()) {\n\t\treturn 'any'\n\t}\n\n\tif (type.isUnknown()) {\n\t\treturn 'unknown'\n\t}\n\n\tif (type.isNull()) {\n\t\treturn 'null'\n\t}\n\n\tif (type.isUndefined()) {\n\t\treturn 'undefined'\n\t}\n\n\tif (type.isBoolean() || type.isBooleanLiteral()) {\n\t\treturn 'boolean'\n\t}\n\n\tif (type.isStringLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_string' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isNumberLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_number' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isString() || type.isTemplateLiteral()) {\n\t\treturn 'string'\n\t}\n\n\tif (type.isNumber()) {\n\t\treturn 'number'\n\t}\n\n\tif (type.getText() === 'bigint') {\n\t\treturn 'bigint'\n\t}\n\n\tif (type.isTuple()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'tuple' as const,\n\t\t\t\tshape: type.getTupleElements().map((t) => ({\n\t\t\t\t\trole: 'tuple_entry' as const,\n\t\t\t\t\tshape: getProperTypeShape(t, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t})),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isArray()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: getProperTypeShape(type.getArrayElementType()!, atLocation, nextStack),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && type.getText() === 'Buffer') {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'buffer' as const,\n\t\t\t\tshape: 'buffer',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && type.getProperties().length === 0) {\n\t\tconst targetType = type.getAliasTypeArguments()[1] ?? type.getStringIndexType()\n\t\tif (targetType) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'record' as const,\n\t\t\t\t\tshape: getProperTypeShape(targetType, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t}\n\n\tif (type.isObject()) {\n\t\tif (type.getText() === 'Date') {\n\t\t\treturn 'Date'\n\t\t}\n\t\treturn type\n\t\t\t.getProperties()\n\t\t\t.map((prop) => {\n\t\t\t\tconst valueDeclaration = prop.getValueDeclaration() || prop.getDeclarations()[0]!\n\t\t\t\tif (!valueDeclaration) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape: getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack),\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst valueDeclarationNode =\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertySignature) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertyAssignment) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n\t\t\t\tif (!valueDeclarationNode) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape: getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack),\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isOptional = prop.getTypeAtLocation(atLocation).isNullable()\n\n\t\t\t\tconst shape = getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack)\n\t\t\t\treturn {\n\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\tshape: shape,\n\t\t\t\t\toptional: isOptional,\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((val) => val.shape !== 'undefined')\n\t}\n\n\tif (type.isUnion()) {\n\t\tconst unfilteredShapes: ShapeOfUnionEntry[] = type.getUnionTypes().map((type) => ({\n\t\t\trole: 'union_entry',\n\t\t\tshape: getProperTypeShape(type, atLocation, nextStack),\n\t\t\toptional: false,\n\t\t}))\n\n\t\tconst dedupedShapes = unfilteredShapes.filter(\n\t\t\t(type, index, arr) => !arr.find((dup, dupIndex) => dup.shape === type.shape && dupIndex > index),\n\t\t)\n\t\tconst isNullable = dedupedShapes.some((shape) => shape.shape === 'undefined')\n\t\tconst shapes = dedupedShapes.filter((shape) => shape.shape !== 'undefined')\n\t\tif (shapes.length === 1) {\n\t\t\treturn shapes[0].shape\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'union',\n\t\t\t\tshape: shapes,\n\t\t\t\toptional: isNullable,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isIntersection()) {\n\t\tconst children = type.getIntersectionTypes()\n\t\tconst shapesOfChildren = children\n\t\t\t.map((child) => getProperTypeShape(child, atLocation, nextStack))\n\t\t\t.filter((shape) => typeof shape !== 'string') as ShapeOfProperty[][]\n\t\treturn shapesOfChildren.reduce<ShapeOfType[]>((total, current) => [...total, ...current], [])\n\t}\n\n\tconst fileName = atLocation.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown type shape node ${typeOrPromise.getText()}`)\n\treturn 'unknown_5'\n}\n\nconst getLiteralValueOfNode = (node: Node): string | string[] | unknown[] => {\n\tif (node.isKind(SyntaxKind.Identifier)) {\n\t\treturn getLiteralValueOfNode(findNodeImplementation(node))\n\t} else if (node.isKind(SyntaxKind.StringLiteral)) {\n\t\treturn node.getLiteralValue()\n\t} else if (node.isKind(SyntaxKind.ArrayLiteralExpression)) {\n\t\treturn node.forEachChildAsArray().map((child) => getLiteralValueOfNode(child)) as string[]\n\t} else if (node.isKind(SyntaxKind.PropertyAccessExpression)) {\n\t\treturn getLiteralValueOfNode(findPropertyAssignmentValueNode(node))\n\t} else if (node.isKind(SyntaxKind.ObjectLiteralExpression)) {\n\t\treturn getValuesOfObjectLiteral(node)\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown literal value node ${node.getKindName()}`)\n\n\treturn 'unknown_6'\n}\n\nexport const resolveEndpointPath = (node: Node): string | null => {\n\tconst callExpression = node.getFirstDescendantByKind(SyntaxKind.CallExpression)\n\tif (!callExpression) return null\n\n\tconst firstArg = callExpression.getArguments()[0]\n\tif (!firstArg) return null\n\n\tconst argType = firstArg.getType()\n\tif (argType.isStringLiteral()) {\n\t\treturn argType.getLiteralValue() as string\n\t}\n\n\treturn null\n}\n\nexport const getValuesOfObjectLiteral = (objectLiteralNode: Node<ts.ObjectLiteralExpression>) => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst targetNode = findNodeImplementation(assignmentValueNode)\n\t\tconst value = getLiteralValueOfNode(targetNode)\n\n\t\treturn {\n\t\t\tidentifier: identifierName,\n\t\t\tvalue,\n\t\t}\n\t})\n\n\treturn properties || []\n}\n"],"names":["implementationCache","findNodeImplementation","node","cached","SyntaxKind","implementationNode","assignmentValueNode","result","definitionNode","findPropertyAssignmentValueNode","identifierChildren","child","getTypeReferenceShape","firstChild","getRecursiveNodeShape","nodeOrReference","typeName","OpenApiManager","literalNode","typeLiteralNode","propNode","identifier","valueNode","questionMarkToken","typeReferenceNode","lastChild","getProperTypeShape","unionTypeNode","typeQueryNode","qualifiedNameNode","callExpressionNode","awaitExpressionNode","asExpressionNode","fileName","Logger","getShapeOfValidatorLiteral","objectLiteralNode","identifierNode","identifierName","innerLiteralNode","getValidatorPropertyShape","getValidatorPropertyOptionality","getValidatorPropertyStringValue","isZodCallExpression","callExpression","getZodCallShape","objectLiteral","syntaxList","prop","argNode","inlineValidatorAsExpression","typeReference","childTypeReferenceNode","typeNode","childCallExpressionNode","callExpressionArgument","thingyNode","parsePropertyAssignment","returnType","importTypeNode","indexOfGreaterThanToken","targetSyntaxList","intersectionType","validatorType","syntaxListNode","literalExpression","name","targetChild","c","value","targetValue","getValuesOfObjectLiteral","intersectionTypeNode","t","v","propertySignatureNode","isPromise","type","symbol","args","typeOrPromise","atLocation","stack","previousType","nextStack","targetType","valueDeclaration","isOptional","shape","val","dedupedShapes","index","arr","dup","dupIndex","isNullable","shapes","total","current","getLiteralValueOfNode","resolveEndpointPath","firstArg","argType","targetNode"],"mappings":"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"}
@@ -5,5 +5,7 @@ export declare const TestCase: {
5
5
  readonly parsesInlineZodNumberArray: "parses-inline-zod-number-array";
6
6
  readonly parsesInlineZodObjectArray: "parses-inline-zod-object-array";
7
7
  readonly parsedAliasedZodSchema: "parses-aliased-zod-schema";
8
+ readonly parsesReturnRecordStringUnknown: "parses-return-record-string-unknown";
9
+ readonly parsesReturnObjectWithRecordProperty: "parses-return-object-with-record-property";
8
10
  };
9
11
  //# sourceMappingURL=TestCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestCase.d.ts","sourceRoot":"","sources":["../../../../src/openapi/analyzerModule/test/TestCase.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;;CAOX,CAAA"}
1
+ {"version":3,"file":"TestCase.d.ts","sourceRoot":"","sources":["../../../../src/openapi/analyzerModule/test/TestCase.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../../utils/logger.cjs"),i=e=>{if(typeof e=="string"&&e==="any"||typeof e=="string"&&e==="circular")return f();if(typeof e=="string"&&e==="null")return{type:"null"};if(typeof e=="string"&&e==="Date")return{type:"string",format:"date-time"};if(typeof e=="string"&&e==="bigint")return{type:"string",format:"bigint"};if(typeof e=="string")return{type:e};if(e.length===0)return s.Logger.warn(`Unknown shape ${e}`),{type:"unknown_20"};if(e[0].role==="literal_string")return{type:"string",enum:[e[0].shape]};if(e[0].role==="literal_number")return{type:"number",enum:[e[0].shape]};if(e[0].role==="property"){const t=e,r={};t.forEach(n=>{r[n.identifier]=i(n.shape)});const o=t.filter(n=>!n.optional).map(n=>n.identifier);return{type:"object",properties:r,required:o.length>0?o:void 0}}if(e[0].role==="union")return{oneOf:e[0].shape.map(r=>i(r.shape))};if(e[0].role==="record"){const t=e[0];return{type:"object",additionalProperties:i(t.shape)}}if(e[0].role==="array")return{type:"array",items:i(e[0].shape)};if(e[0].role==="ref")return{$ref:`#/components/schemas/${e[0].shape}`};if(e[0].role==="tuple"){const r=e[0].shape;return{type:"array",items:{oneOf:r.map(o=>i(o.shape))},minItems:r.length,maxItems:r.length}}return e[0].role==="buffer"?{type:"string",format:"binary"}:(s.Logger.warn(`Unknown shape ${e}`),{type:"unknown_21"})},f=()=>({oneOf:[{type:"string"},{type:"boolean"},{type:"number"},{type:"object"},{type:"array"}]});exports.getSchema=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("../../utils/logger.cjs"),i=e=>{if(typeof e=="string"&&e==="any"||typeof e=="string"&&e==="unknown"||typeof e=="string"&&e==="circular")return f();if(typeof e=="string"&&e==="null")return{type:"null"};if(typeof e=="string"&&e==="Date")return{type:"string",format:"date-time"};if(typeof e=="string"&&e==="bigint")return{type:"string",format:"bigint"};if(typeof e=="string")return{type:e};if(e.length===0)return u.Logger.warn(`Unknown shape ${e}`),{type:"unknown_20"};if(e[0].role==="literal_string")return{type:"string",enum:[e[0].shape]};if(e[0].role==="literal_number")return{type:"number",enum:[e[0].shape]};if(e[0].role==="property"){const t=e,r={};t.forEach(n=>{r[n.identifier]=i(n.shape)});const o=t.filter(n=>!n.optional).map(n=>n.identifier);return{type:"object",properties:r,required:o.length>0?o:void 0}}if(e[0].role==="union")return{oneOf:e[0].shape.map(r=>i(r.shape))};if(e[0].role==="record"){const t=e[0];return{type:"object",additionalProperties:i(t.shape)}}if(e[0].role==="array")return{type:"array",items:i(e[0].shape)};if(e[0].role==="ref")return{$ref:`#/components/schemas/${e[0].shape}`};if(e[0].role==="tuple"){const r=e[0].shape;return{type:"array",items:{oneOf:r.map(o=>i(o.shape))},minItems:r.length,maxItems:r.length}}return e[0].role==="buffer"?{type:"string",format:"binary"}:(u.Logger.warn(`Unknown shape ${e}`),{type:"unknown_21"})},f=()=>({oneOf:[{type:"string"},{type:"boolean"},{type:"number"},{type:"object"},{type:"array"}]});exports.getSchema=i;
2
2
  //# sourceMappingURL=getSchema.cjs.map