@wener/utils 1.1.27 → 1.1.29

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 (324) hide show
  1. package/lib/arrays/MaybeArray.js +36 -25
  2. package/lib/arrays/MaybeArray.js.map +1 -1
  3. package/lib/arrays/arrayFromAsync.js +5 -7
  4. package/lib/arrays/arrayFromAsync.js.map +1 -1
  5. package/lib/asyncs/AsyncInterval.js +11 -12
  6. package/lib/asyncs/AsyncInterval.js.map +1 -1
  7. package/lib/asyncs/MaybePromise.js +3 -0
  8. package/lib/asyncs/MaybePromise.js.map +1 -0
  9. package/lib/asyncs/createAsyncIterator.js +37 -35
  10. package/lib/asyncs/createAsyncIterator.js.map +1 -1
  11. package/lib/asyncs/createLazyPromise.js +59 -60
  12. package/lib/asyncs/createLazyPromise.js.map +1 -1
  13. package/lib/asyncs/firstOfAsyncIterator.js +7 -9
  14. package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
  15. package/lib/asyncs/generatorOfStream.js +16 -0
  16. package/lib/asyncs/generatorOfStream.js.map +1 -0
  17. package/lib/asyncs/isIterator.js +3 -4
  18. package/lib/asyncs/isIterator.js.map +1 -1
  19. package/lib/asyncs/isPromise.js +3 -4
  20. package/lib/asyncs/isPromise.js.map +1 -1
  21. package/lib/asyncs/isThenable.js +6 -0
  22. package/lib/asyncs/isThenable.js.map +1 -0
  23. package/lib/asyncs/nextOfAsyncIterator.js +20 -14
  24. package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
  25. package/lib/asyncs/promiseOfCallback.js +17 -0
  26. package/lib/asyncs/promiseOfCallback.js.map +1 -0
  27. package/lib/asyncs/sleep.js +2 -3
  28. package/lib/asyncs/sleep.js.map +1 -1
  29. package/lib/asyncs/timeout.js +22 -26
  30. package/lib/asyncs/timeout.js.map +1 -1
  31. package/lib/browsers/copy.js +47 -45
  32. package/lib/browsers/copy.js.map +1 -1
  33. package/lib/browsers/download.js +38 -27
  34. package/lib/browsers/download.js.map +1 -1
  35. package/lib/browsers/getFileFromDataTransfer.js +41 -28
  36. package/lib/browsers/getFileFromDataTransfer.js.map +1 -1
  37. package/lib/browsers/loaders.js +43 -43
  38. package/lib/browsers/loaders.js.map +1 -1
  39. package/lib/crypto/base.js +5 -4
  40. package/lib/crypto/base.js.map +1 -1
  41. package/lib/crypto/getNodeCrypto.js +14 -13
  42. package/lib/crypto/getNodeCrypto.js.map +1 -1
  43. package/lib/crypto/getRandomValues.js +22 -26
  44. package/lib/crypto/getRandomValues.js.map +1 -1
  45. package/lib/crypto/hashing.js +42 -50
  46. package/lib/crypto/hashing.js.map +1 -1
  47. package/lib/crypto/md5.bench.js +21 -0
  48. package/lib/crypto/md5.bench.js.map +1 -0
  49. package/lib/crypto/md5.d.js +3 -0
  50. package/lib/crypto/md5.d.js.map +1 -0
  51. package/lib/crypto/md5.js +119 -121
  52. package/lib/crypto/md5.js.map +1 -1
  53. package/lib/crypto/pem/pem.js +32 -35
  54. package/lib/crypto/pem/pem.js.map +1 -1
  55. package/lib/crypto/randomUUID.js +12 -11
  56. package/lib/crypto/randomUUID.js.map +1 -1
  57. package/lib/crypto/ulid.js +123 -112
  58. package/lib/crypto/ulid.js.map +1 -1
  59. package/lib/errors/Errors.js +167 -149
  60. package/lib/errors/Errors.js.map +1 -1
  61. package/lib/fetch/createFetchWith.js +20 -23
  62. package/lib/fetch/createFetchWith.js.map +1 -1
  63. package/lib/fetch/createFetchWithLogging.js +20 -16
  64. package/lib/fetch/createFetchWithLogging.js.map +1 -1
  65. package/lib/fetch/createFetchWithRetry.js +61 -65
  66. package/lib/fetch/createFetchWithRetry.js.map +1 -1
  67. package/lib/fetch/dumpRequest.js +39 -42
  68. package/lib/fetch/dumpRequest.js.map +1 -1
  69. package/lib/fetch/dumpResponse.js +13 -20
  70. package/lib/fetch/dumpResponse.js.map +1 -1
  71. package/lib/fetch/index.js +7 -0
  72. package/lib/fetch/index.js.map +1 -0
  73. package/lib/fetch/types.js +3 -0
  74. package/lib/fetch/types.js.map +1 -0
  75. package/lib/http/HttpStatus.js +89 -80
  76. package/lib/http/HttpStatus.js.map +1 -1
  77. package/lib/i18n/createTranslate.js +48 -48
  78. package/lib/i18n/createTranslate.js.map +1 -1
  79. package/lib/index.js +28 -14
  80. package/lib/index.js.map +1 -1
  81. package/lib/io/AbstractEncoding.js +7 -0
  82. package/lib/io/AbstractEncoding.js.map +1 -0
  83. package/lib/io/ArrayBuffer.test-d.js +7 -0
  84. package/lib/io/ArrayBuffer.test-d.js.map +1 -0
  85. package/lib/io/ArrayBuffers.js +198 -172
  86. package/lib/io/ArrayBuffers.js.map +1 -1
  87. package/lib/io/Buffer.js +21 -20
  88. package/lib/io/Buffer.js.map +1 -1
  89. package/lib/io/base64.js +49 -48
  90. package/lib/io/base64.js.map +1 -1
  91. package/lib/io/isBuffer.js +7 -5
  92. package/lib/io/isBuffer.js.map +1 -1
  93. package/lib/io/isTransferable.js +23 -19
  94. package/lib/io/isTransferable.js.map +1 -1
  95. package/lib/isomorphics/getGlobalThis.js +17 -12
  96. package/lib/isomorphics/getGlobalThis.js.map +1 -1
  97. package/lib/isomorphics/structuredClone.js +71 -63
  98. package/lib/isomorphics/structuredClone.js.map +1 -1
  99. package/lib/langs/MaybeFunction.js +7 -7
  100. package/lib/langs/MaybeFunction.js.map +1 -1
  101. package/lib/langs/classOf.js +3 -4
  102. package/lib/langs/classOf.js.map +1 -1
  103. package/lib/langs/deepEqual.js +77 -85
  104. package/lib/langs/deepEqual.js.map +1 -1
  105. package/lib/langs/deepFreeze.js +17 -13
  106. package/lib/langs/deepFreeze.js.map +1 -1
  107. package/lib/langs/hashCode.ignored.js +112 -0
  108. package/lib/langs/hashCode.ignored.js.map +1 -0
  109. package/lib/langs/isClass.js +3 -4
  110. package/lib/langs/isClass.js.map +1 -1
  111. package/lib/langs/isDefined.js +3 -4
  112. package/lib/langs/isDefined.js.map +1 -1
  113. package/lib/langs/isEmptyObject.js +3 -5
  114. package/lib/langs/isEmptyObject.js.map +1 -1
  115. package/lib/langs/isFunction.js +5 -0
  116. package/lib/langs/isFunction.js.map +1 -0
  117. package/lib/langs/isPlainObject.js +7 -8
  118. package/lib/langs/isPlainObject.js.map +1 -1
  119. package/lib/langs/memoize.js +19 -21
  120. package/lib/langs/memoize.js.map +1 -1
  121. package/lib/langs/parseBoolean.js +26 -27
  122. package/lib/langs/parseBoolean.js.map +1 -1
  123. package/lib/langs/shallowClone.js +12 -12
  124. package/lib/langs/shallowClone.js.map +1 -1
  125. package/lib/langs/shallowEqual.js +21 -18
  126. package/lib/langs/shallowEqual.js.map +1 -1
  127. package/lib/libs/ms.js +123 -103
  128. package/lib/libs/ms.js.map +1 -1
  129. package/lib/logging/Logger.js +5 -0
  130. package/lib/logging/Logger.js.map +1 -0
  131. package/lib/logging/createChildLogger.js +12 -14
  132. package/lib/logging/createChildLogger.js.map +1 -1
  133. package/lib/logging/createLogger.js +59 -33
  134. package/lib/logging/createLogger.js.map +1 -1
  135. package/lib/logging/createNoopLogger.js +11 -12
  136. package/lib/logging/createNoopLogger.js.map +1 -1
  137. package/lib/logging/slog.js +143 -0
  138. package/lib/logging/slog.js.map +1 -0
  139. package/lib/maths/clamp.js +20 -20
  140. package/lib/maths/clamp.js.map +1 -1
  141. package/lib/maths/random.js +14 -15
  142. package/lib/maths/random.js.map +1 -1
  143. package/lib/modules/isModule.js +5 -4
  144. package/lib/modules/isModule.js.map +1 -1
  145. package/lib/modules/parseModuleId.js +36 -31
  146. package/lib/modules/parseModuleId.js.map +1 -1
  147. package/lib/objects/get.js +13 -11
  148. package/lib/objects/get.js.map +1 -1
  149. package/lib/objects/get.test-d.js +33 -0
  150. package/lib/objects/get.test-d.js.map +1 -0
  151. package/lib/objects/merge/index.js +3 -0
  152. package/lib/objects/merge/index.js.map +1 -0
  153. package/lib/objects/merge/isMergeableObject.js +11 -10
  154. package/lib/objects/merge/isMergeableObject.js.map +1 -1
  155. package/lib/objects/merge/merge.js +65 -66
  156. package/lib/objects/merge/merge.js.map +1 -1
  157. package/lib/objects/parseObjectPath.js +35 -23
  158. package/lib/objects/parseObjectPath.js.map +1 -1
  159. package/lib/objects/set.js +33 -34
  160. package/lib/objects/set.js.map +1 -1
  161. package/lib/schema/typebox/gen/codegen/common/encoder.js +93 -67
  162. package/lib/schema/typebox/gen/codegen/common/encoder.js.map +1 -1
  163. package/lib/schema/typebox/gen/codegen/common/formatter.js +31 -8
  164. package/lib/schema/typebox/gen/codegen/common/formatter.js.map +1 -1
  165. package/lib/schema/typebox/gen/codegen/common/index.js +5 -0
  166. package/lib/schema/typebox/gen/codegen/common/index.js.map +1 -0
  167. package/lib/schema/typebox/gen/codegen/common/jsdoc.js +109 -60
  168. package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +1 -1
  169. package/lib/schema/typebox/gen/codegen/expression/compiler.js +359 -317
  170. package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +1 -1
  171. package/lib/schema/typebox/gen/codegen/expression/errors.js +255 -233
  172. package/lib/schema/typebox/gen/codegen/expression/errors.js.map +1 -1
  173. package/lib/schema/typebox/gen/codegen/expression/evaluator.js +249 -236
  174. package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +1 -1
  175. package/lib/schema/typebox/gen/codegen/expression/expression.js +382 -198
  176. package/lib/schema/typebox/gen/codegen/expression/expression.js.map +1 -1
  177. package/lib/schema/typebox/gen/codegen/expression/index.js +6 -0
  178. package/lib/schema/typebox/gen/codegen/expression/index.js.map +1 -0
  179. package/lib/schema/typebox/gen/codegen/index.js +5 -19
  180. package/lib/schema/typebox/gen/codegen/index.js.map +1 -1
  181. package/lib/schema/typebox/gen/codegen/model/index.js +16 -0
  182. package/lib/schema/typebox/gen/codegen/model/index.js.map +1 -0
  183. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +236 -260
  184. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +1 -1
  185. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +348 -352
  186. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +1 -1
  187. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +214 -242
  188. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +1 -1
  189. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +229 -292
  190. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +1 -1
  191. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +42 -15
  192. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +1 -1
  193. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +168 -168
  194. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +1 -1
  195. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +31 -8
  196. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +1 -1
  197. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +156 -190
  198. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +1 -1
  199. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +215 -249
  200. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +1 -1
  201. package/lib/schema/typebox/gen/codegen/model/model-to-value.js +37 -13
  202. package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +1 -1
  203. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +201 -242
  204. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +1 -1
  205. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +200 -245
  206. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +1 -1
  207. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +223 -268
  208. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +1 -1
  209. package/lib/schema/typebox/gen/codegen/model/model.js +27 -0
  210. package/lib/schema/typebox/gen/codegen/model/model.js.map +1 -0
  211. package/lib/schema/typebox/gen/codegen/typescript/index.js +4 -0
  212. package/lib/schema/typebox/gen/codegen/typescript/index.js.map +1 -0
  213. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +43 -40
  214. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +1 -1
  215. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +592 -616
  216. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +1 -1
  217. package/lib/schema/typebox/gen/index.js +3 -3
  218. package/lib/schema/typebox/gen/index.js.map +1 -1
  219. package/lib/schema/typebox/index.js +3 -3
  220. package/lib/schema/typebox/index.js.map +1 -1
  221. package/lib/schema/typebox/typebox.js +18 -29
  222. package/lib/schema/typebox/typebox.js.map +1 -1
  223. package/lib/server.js +2 -1
  224. package/lib/server.js.map +1 -1
  225. package/lib/servers/crypto/md5.js +3 -5
  226. package/lib/servers/crypto/md5.js.map +1 -1
  227. package/lib/servers/fetch/createFetchWithProxy.js +2 -4
  228. package/lib/servers/fetch/createFetchWithProxy.js.map +1 -1
  229. package/lib/servers/fetch/createFetchWithProxyByNodeFetch.js +34 -34
  230. package/lib/servers/fetch/createFetchWithProxyByNodeFetch.js.map +1 -1
  231. package/lib/servers/fetch/createFetchWithProxyByUndici.js +57 -58
  232. package/lib/servers/fetch/createFetchWithProxyByUndici.js.map +1 -1
  233. package/lib/servers/getPackageDir.js +8 -10
  234. package/lib/servers/getPackageDir.js.map +1 -1
  235. package/lib/servers/jsdom.js +3 -2
  236. package/lib/servers/jsdom.js.map +1 -1
  237. package/lib/servers/node-fetch.js +4 -3
  238. package/lib/servers/node-fetch.js.map +1 -1
  239. package/lib/servers/polyfill/polyfillBrowser.js +17 -0
  240. package/lib/servers/polyfill/polyfillBrowser.js.map +1 -0
  241. package/lib/servers/polyfill/polyfillCrypto.js +8 -10
  242. package/lib/servers/polyfill/polyfillCrypto.js.map +1 -1
  243. package/lib/servers/polyfill/polyfillFetch.js +23 -22
  244. package/lib/servers/polyfill/polyfillFetch.js.map +1 -1
  245. package/lib/servers/polyfill/polyfillJsDom.js +59 -52
  246. package/lib/servers/polyfill/polyfillJsDom.js.map +1 -1
  247. package/lib/servers/polyfill/polyfillWebSocket.js +13 -13
  248. package/lib/servers/polyfill/polyfillWebSocket.js.map +1 -1
  249. package/lib/servers/ws.js +3 -2
  250. package/lib/servers/ws.js.map +1 -1
  251. package/lib/strings/camelCase.js +51 -49
  252. package/lib/strings/camelCase.js.map +1 -1
  253. package/lib/strings/formatBytes.js +41 -15
  254. package/lib/strings/formatBytes.js.map +1 -1
  255. package/lib/strings/renderTemplate.js +27 -20
  256. package/lib/strings/renderTemplate.js.map +1 -1
  257. package/lib/typedoc.js +4 -0
  258. package/lib/typedoc.js.map +1 -0
  259. package/lib/types/global.d.js +2 -0
  260. package/lib/types/global.d.js.map +1 -0
  261. package/lib/types/index.d.js +6 -0
  262. package/lib/types/index.d.js.map +1 -0
  263. package/lib/validations/asserts.js +14 -0
  264. package/lib/validations/asserts.js.map +1 -0
  265. package/lib/validations/isUUID.js +3 -4
  266. package/lib/validations/isUUID.js.map +1 -1
  267. package/lib/validations/parseTimestamp.js +25 -21
  268. package/lib/validations/parseTimestamp.js.map +1 -1
  269. package/package.json +47 -47
  270. package/dist/LICENSE.txt +0 -1
  271. package/dist/cjs/createFetchWith-qhRObsE4.js +0 -2
  272. package/dist/cjs/createFetchWith-qhRObsE4.js.map +0 -1
  273. package/dist/cjs/getGlobalThis-GhffAgiG.js +0 -2
  274. package/dist/cjs/getGlobalThis-GhffAgiG.js.map +0 -1
  275. package/dist/cjs/index.cjs +0 -21
  276. package/dist/cjs/index.cjs.map +0 -1
  277. package/dist/cjs/schema/typebox/gen/index.cjs +0 -118
  278. package/dist/cjs/schema/typebox/gen/index.cjs.map +0 -1
  279. package/dist/cjs/schema/typebox/index.cjs +0 -2
  280. package/dist/cjs/schema/typebox/index.cjs.map +0 -1
  281. package/dist/cjs/server.cjs +0 -2
  282. package/dist/cjs/server.cjs.map +0 -1
  283. package/dist/cjs/servers/jsdom.cjs +0 -2
  284. package/dist/cjs/servers/jsdom.cjs.map +0 -1
  285. package/dist/cjs/servers/node-fetch.cjs +0 -2
  286. package/dist/cjs/servers/node-fetch.cjs.map +0 -1
  287. package/dist/cjs/servers/ws.cjs +0 -2
  288. package/dist/cjs/servers/ws.cjs.map +0 -1
  289. package/dist/esm/createFetchWith-1q1S-Xro.js +0 -2
  290. package/dist/esm/createFetchWith-1q1S-Xro.js.map +0 -1
  291. package/dist/esm/getGlobalThis-A8F-nU7J.js +0 -2
  292. package/dist/esm/getGlobalThis-A8F-nU7J.js.map +0 -1
  293. package/dist/esm/index.js +0 -21
  294. package/dist/esm/index.js.map +0 -1
  295. package/dist/esm/schema/typebox/gen.js +0 -118
  296. package/dist/esm/schema/typebox/gen.js.map +0 -1
  297. package/dist/esm/schema/typebox.js +0 -2
  298. package/dist/esm/schema/typebox.js.map +0 -1
  299. package/dist/esm/server.js +0 -2
  300. package/dist/esm/server.js.map +0 -1
  301. package/dist/esm/servers/jsdom.js +0 -2
  302. package/dist/esm/servers/jsdom.js.map +0 -1
  303. package/dist/esm/servers/node-fetch.js +0 -2
  304. package/dist/esm/servers/node-fetch.js.map +0 -1
  305. package/dist/esm/servers/ws.js +0 -2
  306. package/dist/esm/servers/ws.js.map +0 -1
  307. package/dist/system/createFetchWith-TjUle-dI.js +0 -2
  308. package/dist/system/createFetchWith-TjUle-dI.js.map +0 -1
  309. package/dist/system/getGlobalThis-X5ifUXDI.js +0 -2
  310. package/dist/system/getGlobalThis-X5ifUXDI.js.map +0 -1
  311. package/dist/system/index.js +0 -21
  312. package/dist/system/index.js.map +0 -1
  313. package/dist/system/schema/typebox/gen.js +0 -118
  314. package/dist/system/schema/typebox/gen.js.map +0 -1
  315. package/dist/system/schema/typebox.js +0 -2
  316. package/dist/system/schema/typebox.js.map +0 -1
  317. package/dist/system/server.js +0 -2
  318. package/dist/system/server.js.map +0 -1
  319. package/dist/system/servers/jsdom.js +0 -2
  320. package/dist/system/servers/jsdom.js.map +0 -1
  321. package/dist/system/servers/node-fetch.js +0 -2
  322. package/dist/system/servers/node-fetch.js.map +0 -1
  323. package/dist/system/servers/ws.js +0 -2
  324. package/dist/system/servers/ws.js.map +0 -1
@@ -1,620 +1,596 @@
1
1
  import * as ts from 'typescript';
2
- import { JsDoc } from '../common/jsdoc.js';
3
-
4
- class TypeScriptToTypeBoxError extends Error {
5
- constructor(diagnostics) {
6
- super("");
7
- this.diagnostics = diagnostics;
8
- }
2
+ import { JsDoc } from '../common/jsdoc';
3
+ export class TypeScriptToTypeBoxError extends Error {
4
+ diagnostics;
5
+ constructor(diagnostics){
6
+ super('');
7
+ this.diagnostics = diagnostics;
8
+ }
9
9
  }
10
- var TypeScriptToTypeBox;
11
- ((TypeScriptToTypeBox2) => {
12
- const transpilerOptions = {
13
- compilerOptions: {
14
- strict: true,
15
- target: ts.ScriptTarget.ES2022
16
- }
17
- };
18
- const typenames = /* @__PURE__ */ new Set();
19
- let recursiveDeclaration = null;
20
- let blockLevel = 0;
21
- let useImports = false;
22
- let useOptions = false;
23
- let useGenerics = false;
24
- let useCloneType = false;
25
- let useExportsEverything = false;
26
- let useIdentifiers = false;
27
- let useTypeBoxImport = true;
28
- function FindRecursiveParent(decl, node) {
29
- return ts.isTypeReferenceNode(node) && decl.name.getText() === node.typeName.getText() || node.getChildren().some((node2) => FindRecursiveParent(decl, node2));
30
- }
31
- function FindRecursiveThis(node) {
32
- return node.getChildren().some((node2) => ts.isThisTypeNode(node2) || FindRecursiveThis(node2));
33
- }
34
- function FindTypeName(node, name) {
35
- const found = typenames.has(name) || node.getChildren().some((node2) => {
36
- return (ts.isInterfaceDeclaration(node2) || ts.isTypeAliasDeclaration(node2)) && node2.name.getText() === name || FindTypeName(node2, name);
37
- });
38
- if (found)
39
- typenames.add(name);
40
- return found;
41
- }
42
- function IsRecursiveType(decl) {
43
- const check1 = ts.isTypeAliasDeclaration(decl) ? [decl.type].some((node) => FindRecursiveParent(decl, node)) : decl.members.some((node) => FindRecursiveParent(decl, node));
44
- const check2 = ts.isInterfaceDeclaration(decl) && FindRecursiveThis(decl);
45
- return check1 || check2;
46
- }
47
- function IsReadonlyProperty(node) {
48
- return node.modifiers !== void 0 && node.modifiers.find((modifier) => modifier.getText() === "readonly") !== void 0;
49
- }
50
- function IsOptionalProperty(node) {
51
- return node.questionToken !== void 0;
52
- }
53
- function IsExport(node) {
54
- return blockLevel === 0 && (useExportsEverything || node.modifiers !== void 0 && node.modifiers.find((modifier) => modifier.getText() === "export") !== void 0);
55
- }
56
- function IsNamespace(node) {
57
- return node.flags === ts.NodeFlags.Namespace;
58
- }
59
- function ResolveJsDocComment(node) {
60
- const content = node.getFullText().trim();
61
- if (node.kind === ts.SyntaxKind.LiteralType) {
62
- if (content.startsWith("/**")) {
63
- return content.slice(0, content.lastIndexOf("*/") + 2).replace(/\*+\/$/, "\n$0");
64
- } else {
65
- return "";
66
- }
67
- }
68
- const indices = [content.indexOf("/**"), content.indexOf("type"), content.indexOf("interface")].map(
69
- (n) => n === -1 ? Infinity : n
70
- );
71
- if (indices[0] === -1 || indices[1] < indices[0] || indices[2] < indices[0])
72
- return "";
73
- for (let i = indices[0]; i < content.length; i++) {
74
- if (content[i] === "*" && content[i + 1] === "/")
75
- return content.slice(0, i + 2);
76
- }
77
- return "";
78
- }
79
- function ResolveOptions(node) {
80
- const content = ResolveJsDocComment(node);
81
- return JsDoc.Parse(content);
82
- }
83
- function ResolveIdentifier(node) {
84
- function* resolve(node2) {
85
- if (node2.parent)
86
- yield* resolve(node2.parent);
87
- if (ts.isModuleDeclaration(node2))
88
- yield node2.name.getText();
89
- }
90
- return [...resolve(node), node.name.getText()].join(".");
91
- }
92
- function UnwrapModifier(type) {
93
- for (let i = 0; i < type.length; i++)
94
- if (type[i] === "(")
95
- return type.slice(i + 1, type.length - 1);
96
- return type;
97
- }
98
- function InjectOptions(type, options) {
99
- if (globalThis.Object.keys(options).length === 0)
100
- return type;
101
- if (type.indexOf("Type.ReadonlyOptional") === 0)
102
- return `Type.ReadonlyOptional( ${InjectOptions(UnwrapModifier(type), options)} )`;
103
- if (type.indexOf("Type.Readonly") === 0)
104
- return `Type.Readonly( ${InjectOptions(UnwrapModifier(type), options)} )`;
105
- if (type.indexOf("Type.Optional") === 0)
106
- return `Type.Optional( ${InjectOptions(UnwrapModifier(type), options)} )`;
107
- const encoded = JSON.stringify(options);
108
- if (type.lastIndexOf("]") === type.length - 1)
109
- useCloneType = true;
110
- if (type.lastIndexOf("]") === type.length - 1)
111
- return `CloneType(${type}, ${encoded})`;
112
- if (type.indexOf("(") === -1) {
113
- useCloneType = true;
114
- return `CloneType(${type}, ${encoded})`;
115
- }
116
- if (type.lastIndexOf("()") === type.length - 2)
117
- return type.slice(0, type.length - 1) + `${encoded})`;
118
- if (type.lastIndexOf("})") === type.length - 2)
119
- return type.slice(0, type.length - 1) + `, ${encoded})`;
120
- if (type.lastIndexOf("])") === type.length - 2)
121
- return type.slice(0, type.length - 1) + `, ${encoded})`;
122
- if (type.lastIndexOf(")") === type.length - 1)
123
- return type.slice(0, type.length - 1) + `, ${encoded})`;
124
- return type;
125
- }
126
- function* SourceFile(node) {
127
- for (const next of node.getChildren()) {
128
- yield* Visit(next);
129
- }
130
- }
131
- function* PropertySignature(node) {
132
- const [readonly, optional] = [IsReadonlyProperty(node), IsOptionalProperty(node)];
133
- const options = ResolveOptions(node);
134
- const type_0 = Collect(node.type);
135
- const type_1 = InjectOptions(type_0, options);
136
- if (readonly && optional) {
137
- return yield `${node.name.getText()}: Type.ReadonlyOptional(${type_1})`;
138
- } else if (readonly) {
139
- return yield `${node.name.getText()}: Type.Readonly(${type_1})`;
140
- } else if (optional) {
141
- return yield `${node.name.getText()}: Type.Optional(${type_1})`;
142
- } else {
143
- return yield `${node.name.getText()}: ${type_1}`;
144
- }
145
- }
146
- function* ArrayTypeNode(node) {
147
- const type = Collect(node.elementType);
148
- yield `Type.Array(${type})`;
149
- }
150
- function* Block(node) {
151
- blockLevel += 1;
152
- const statments = node.statements.map((statement) => Collect(statement)).join("\n\n");
153
- blockLevel -= 1;
154
- yield `{
155
- ${statments}
156
- }`;
157
- }
158
- function* TupleTypeNode(node) {
159
- const types = node.elements.map((type) => Collect(type)).join(",\n");
160
- yield `Type.Tuple([
161
- ${types}
162
- ])`;
163
- }
164
- function* UnionTypeNode(node) {
165
- const types = node.types.map((type) => Collect(type)).join(",\n");
166
- yield `Type.Union([
167
- ${types}
168
- ])`;
169
- }
170
- function* MappedTypeNode(node) {
171
- const K = Collect(node.typeParameter);
172
- const T = Collect(node.type);
173
- const C = Collect(node.typeParameter.constraint);
174
- const readonly = node.readonlyToken !== void 0;
175
- const optional = node.questionToken !== void 0;
176
- const readonly_subtractive = readonly && ts.isMinusToken(node.readonlyToken);
177
- const optional_subtractive = optional && ts.isMinusToken(node.questionToken);
178
- return yield readonly && optional ? readonly_subtractive && optional_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T}, false), false))` : readonly_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T}), false))` : optional_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T}, false)))` : `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T})))` : readonly ? readonly_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(${T}, false))` : `Type.Mapped(${C}, ${K} => Type.Readonly(${T}))` : optional ? optional_subtractive ? `Type.Mapped(${C}, ${K} => Type.Optional(${T}, false))` : `Type.Mapped(${C}, ${K} => Type.Optional(${T}))` : `Type.Mapped(${C}, ${K} => ${T})`;
179
- }
180
- function* MethodSignature(node) {
181
- const parameters = node.parameters.map(
182
- (parameter) => parameter.dotDotDotToken !== void 0 ? `...Type.Rest(${Collect(parameter)})` : Collect(parameter)
183
- ).join(", ");
184
- const returnType = node.type === void 0 ? `Type.Unknown()` : Collect(node.type);
185
- yield `${node.name.getText()}: Type.Function([${parameters}], ${returnType})`;
186
- }
187
- function* TemplateLiteralTypeNode(node) {
188
- const collect = node.getChildren().map((node2) => Collect(node2)).join("");
189
- yield `Type.TemplateLiteral([${collect.slice(0, collect.length - 2)}])`;
190
- }
191
- function* TemplateLiteralTypeSpan(node) {
192
- const collect = node.getChildren().map((node2) => Collect(node2)).join(", ");
193
- if (collect.length > 0)
194
- yield `${collect}`;
195
- }
196
- function* TemplateHead(node) {
197
- if (node.text.length > 0)
198
- yield `Type.Literal('${node.text}'), `;
199
- }
200
- function* TemplateMiddle(node) {
201
- if (node.text.length > 0)
202
- yield `Type.Literal('${node.text}'), `;
203
- }
204
- function* TemplateTail(node) {
205
- if (node.text.length > 0)
206
- yield `Type.Literal('${node.text}'), `;
207
- }
208
- function* ThisTypeNode(node) {
209
- yield `This`;
210
- }
211
- function* IntersectionTypeNode(node) {
212
- const types = node.types.map((type) => Collect(type)).join(",\n");
213
- yield `Type.Intersect([
214
- ${types}
215
- ])`;
216
- }
217
- function* TypeOperatorNode(node) {
218
- if (node.operator === ts.SyntaxKind.KeyOfKeyword) {
219
- const type = Collect(node.type);
220
- yield `Type.KeyOf(${type})`;
221
- }
222
- if (node.operator === ts.SyntaxKind.ReadonlyKeyword) {
223
- yield `Type.Readonly(${Collect(node.type)})`;
224
- }
225
- }
226
- function* Parameter(node) {
227
- yield Collect(node.type);
228
- }
229
- function* FunctionTypeNode(node) {
230
- const parameters = node.parameters.map(
231
- (parameter) => parameter.dotDotDotToken !== void 0 ? `...Type.Rest(${Collect(parameter)})` : Collect(parameter)
232
- ).join(", ");
233
- const returns = Collect(node.type);
234
- yield `Type.Function([${parameters}], ${returns})`;
235
- }
236
- function* ConstructorTypeNode(node) {
237
- const parameters = node.parameters.map((param) => Collect(param)).join(", ");
238
- const returns = Collect(node.type);
239
- yield `Type.Constructor([${parameters}], ${returns})`;
240
- }
241
- function* EnumDeclaration(node) {
242
- useImports = true;
243
- const exports = IsExport(node) ? "export " : "";
244
- const members = node.members.map((member) => member.getText()).join(", ");
245
- const enumType = `${exports}enum Enum${node.name.getText()} { ${members} }`;
246
- const staticType = `${exports}type ${node.name.getText()} = Static<typeof ${node.name.getText()}>`;
247
- const type = `${exports}const ${node.name.getText()} = Type.Enum(Enum${node.name.getText()})`;
248
- yield [enumType, "", staticType, type].join("\n");
249
- }
250
- function PropertiesFromTypeElementArray(members) {
251
- const properties = members.filter((member) => !ts.isIndexSignatureDeclaration(member));
252
- const indexers = members.filter((member) => ts.isIndexSignatureDeclaration(member));
253
- const propertyCollect = properties.map((property) => Collect(property)).join(",\n");
254
- const indexer = indexers.length > 0 ? Collect(indexers[indexers.length - 1]) : "";
255
- if (properties.length === 0 && indexer.length > 0) {
256
- return `{},
257
- {
258
- additionalProperties: ${indexer}
259
- }`;
260
- } else if (properties.length > 0 && indexer.length > 0) {
261
- return `{
262
- ${propertyCollect}
263
- },
264
- {
265
- additionalProperties: ${indexer}
266
- }`;
267
- } else {
268
- return `{
269
- ${propertyCollect}
270
- }`;
271
- }
272
- }
273
- function* TypeLiteralNode(node) {
274
- const members = PropertiesFromTypeElementArray(node.members);
275
- yield* `Type.Object(${members})`;
276
- }
277
- function* InterfaceDeclaration(node) {
278
- useImports = true;
279
- const isRecursiveType = IsRecursiveType(node);
280
- if (isRecursiveType)
281
- recursiveDeclaration = node;
282
- const heritage = node.heritageClauses !== void 0 ? node.heritageClauses.flatMap((node2) => Collect(node2)) : [];
283
- if (node.typeParameters) {
284
- useGenerics = true;
285
- const exports = IsExport(node) ? "export " : "";
286
- const identifier = ResolveIdentifier(node);
287
- const options = useIdentifiers ? { ...ResolveOptions(node), $id: identifier } : { ...ResolveOptions(node) };
288
- const constraints = node.typeParameters.map((param) => `${Collect(param)} extends TSchema`).join(", ");
289
- const parameters = node.typeParameters.map((param) => `${Collect(param)}: ${Collect(param)}`).join(", ");
290
- const members = PropertiesFromTypeElementArray(node.members);
291
- const rawTypeExpression = IsRecursiveType(node) ? `Type.Recursive(This => Type.Object(${members}))` : `Type.Object(${members})`;
292
- const typeExpression = heritage.length === 0 ? rawTypeExpression : `Type.Composite([${heritage.join(", ")}, ${rawTypeExpression}])`;
293
- const type = InjectOptions(typeExpression, options);
294
- const typeDeclaration = `${exports}const ${node.name.getText()} = <${constraints}>(${parameters}) => ${type}`;
295
- yield `${typeDeclaration}`;
296
- } else {
297
- const exports = IsExport(node) ? "export " : "";
298
- const identifier = ResolveIdentifier(node);
299
- const options = useIdentifiers ? { ...ResolveOptions(node), $id: identifier } : { ...ResolveOptions(node) };
300
- const members = PropertiesFromTypeElementArray(node.members);
301
- const staticDeclaration = `${exports}type ${node.name.getText()} = Static<typeof ${node.name.getText()}>`;
302
- const rawTypeExpression = IsRecursiveType(node) ? `Type.Recursive(This => Type.Object(${members}))` : `Type.Object(${members})`;
303
- const typeExpression = heritage.length === 0 ? rawTypeExpression : `Type.Composite([${heritage.join(", ")}, ${rawTypeExpression}])`;
304
- const type = InjectOptions(typeExpression, options);
305
- const typeDeclaration = `${exports}const ${node.name.getText()} = ${type}`;
306
- yield `${staticDeclaration}
307
- ${typeDeclaration}`;
308
- }
309
- recursiveDeclaration = null;
310
- }
311
- function* TypeAliasDeclaration(node) {
312
- useImports = true;
313
- const isRecursiveType = IsRecursiveType(node);
314
- if (isRecursiveType)
315
- recursiveDeclaration = node;
316
- if (node.typeParameters) {
317
- useGenerics = true;
318
- const exports = IsExport(node) ? "export " : "";
319
- const options = useIdentifiers ? { $id: ResolveIdentifier(node) } : {};
320
- const constraints = node.typeParameters.map((param) => `${Collect(param)} extends TSchema`).join(", ");
321
- const parameters = node.typeParameters.map((param) => `${Collect(param)}: ${Collect(param)}`).join(", ");
322
- const type_0 = Collect(node.type);
323
- const type_1 = isRecursiveType ? `Type.Recursive(This => ${type_0})` : type_0;
324
- const type_2 = InjectOptions(type_1, options);
325
- const typeDeclaration = `${exports}const ${node.name.getText()} = <${constraints}>(${parameters}) => ${type_2}`;
326
- yield `${typeDeclaration}`;
327
- } else {
328
- const exports = IsExport(node) ? "export " : "";
329
- const options = useIdentifiers ? { $id: ResolveIdentifier(node), ...ResolveOptions(node) } : { ...ResolveOptions(node) };
330
- const type_0 = Collect(node.type);
331
- const type_1 = isRecursiveType ? `Type.Recursive(This => ${type_0})` : type_0;
332
- const type_2 = InjectOptions(type_1, options);
333
- const staticDeclaration = `${exports}type ${node.name.getText()} = Static<typeof ${node.name.getText()}>`;
334
- const typeDeclaration = `${exports}const ${node.name.getText()} = ${type_2}`;
335
- yield `${staticDeclaration}
336
- ${typeDeclaration}`;
337
- }
338
- recursiveDeclaration = null;
339
- }
340
- function* HeritageClause(node) {
341
- const types = node.types.map((node2) => Collect(node2));
342
- if (types.length === 1)
343
- return yield types[0];
344
- yield types.join(", ");
345
- }
346
- function* IndexedAccessType(node) {
347
- const obj = node.objectType.getText();
348
- const key = Collect(node.indexType);
349
- yield `Type.Index(${obj}, ${key})`;
350
- }
351
- function* ExpressionWithTypeArguments(node) {
352
- const name = Collect(node.expression);
353
- const typeArguments = node.typeArguments === void 0 ? [] : node.typeArguments.map((node2) => Collect(node2));
354
- return yield typeArguments.length === 0 ? `${name}` : `${name}(${typeArguments.join(", ")})`;
355
- }
356
- function* TypeParameterDeclaration(node) {
357
- yield node.name.getText();
358
- }
359
- function* ParenthesizedTypeNode(node) {
360
- yield Collect(node.type);
361
- }
362
- function* RestTypeNode(node) {
363
- yield `...Type.Rest(${node.type.getText()})`;
364
- }
365
- function* ConditionalTypeNode(node) {
366
- const checkType = Collect(node.checkType);
367
- const extendsType = Collect(node.extendsType);
368
- const trueType = Collect(node.trueType);
369
- const falseType = Collect(node.falseType);
370
- yield `Type.Extends(${checkType}, ${extendsType}, ${trueType}, ${falseType})`;
371
- }
372
- function* isIndexSignatureDeclaration(node) {
373
- yield Collect(node.type);
374
- }
375
- function* TypeReferenceNode(node) {
376
- const name = node.typeName.getText();
377
- const args = node.typeArguments ? `(${node.typeArguments.map((type) => Collect(type)).join(", ")})` : "";
378
- if (name === "Date")
379
- return yield `Type.Date()`;
380
- if (name === "Uint8Array")
381
- return yield `Type.Uint8Array()`;
382
- if (name === "String")
383
- return yield `Type.String()`;
384
- if (name === "Number")
385
- return yield `Type.Number()`;
386
- if (name === "Boolean")
387
- return yield `Type.Boolean()`;
388
- if (name === "Function")
389
- return yield `Type.Function([], Type.Unknown())`;
390
- if (name === "Array")
391
- return yield `Type.Array${args}`;
392
- if (name === "Record")
393
- return yield `Type.Record${args}`;
394
- if (name === "Partial")
395
- return yield `Type.Partial${args}`;
396
- if (name === "Required")
397
- return yield `Type.Required${args}`;
398
- if (name === "Omit")
399
- return yield `Type.Omit${args}`;
400
- if (name === "Pick")
401
- return yield `Type.Pick${args}`;
402
- if (name === "Promise")
403
- return yield `Type.Promise${args}`;
404
- if (name === "ReturnType")
405
- return yield `Type.ReturnType${args}`;
406
- if (name === "InstanceType")
407
- return yield `Type.InstanceType${args}`;
408
- if (name === "Parameters")
409
- return yield `Type.Parameters${args}`;
410
- if (name === "AsyncIterableIterator")
411
- return yield `Type.AsyncIterator${args}`;
412
- if (name === "IterableIterator")
413
- return yield `Type.Iterator${args}`;
414
- if (name === "ConstructorParameters")
415
- return yield `Type.ConstructorParameters${args}`;
416
- if (name === "Exclude")
417
- return yield `Type.Exclude${args}`;
418
- if (name === "Extract")
419
- return yield `Type.Extract${args}`;
420
- if (name === "Awaited")
421
- return yield `Type.Awaited${args}`;
422
- if (name === "Uppercase")
423
- return yield `Type.Uppercase${args}`;
424
- if (name === "Lowercase")
425
- return yield `Type.Lowercase${args}`;
426
- if (name === "Capitalize")
427
- return yield `Type.Capitalize${args}`;
428
- if (name === "Uncapitalize")
429
- return yield `Type.Uncapitalize${args}`;
430
- if (recursiveDeclaration !== null && FindRecursiveParent(recursiveDeclaration, node))
431
- return yield `This`;
432
- if (FindTypeName(node.getSourceFile(), name) && args.length === 0) {
433
- return yield `${name}${args}`;
434
- }
435
- if (name in globalThis)
436
- return yield `Type.Never()`;
437
- return yield `${name}${args}`;
438
- }
439
- function* LiteralTypeNode(node) {
440
- const text = node.getText();
441
- if (text === "null")
442
- return yield `Type.Null()`;
443
- yield InjectOptions(`Type.Literal(${node.getText()})`, ResolveOptions(node));
444
- }
445
- function* ModuleDeclaration(node) {
446
- const export_specifier = IsExport(node) ? "export " : "";
447
- const module_specifier = IsNamespace(node) ? "namespace" : "module";
448
- yield `${export_specifier}${module_specifier} ${node.name.getText()} {`;
449
- yield* Visit(node.body);
450
- yield `}`;
451
- }
452
- function* ModuleBlock(node) {
453
- for (const statement of node.statements) {
454
- yield* Visit(statement);
455
- }
456
- }
457
- function* FunctionDeclaration(node) {
458
- }
459
- function* ClassDeclaration(node) {
460
- }
461
- function Collect(node) {
462
- return `${[...Visit(node)].join("")}`;
463
- }
464
- function* Visit(node) {
465
- if (node === void 0)
466
- return;
467
- if (ts.isArrayTypeNode(node))
468
- return yield* ArrayTypeNode(node);
469
- if (ts.isBlock(node))
470
- return yield* Block(node);
471
- if (ts.isClassDeclaration(node))
472
- return yield* ClassDeclaration();
473
- if (ts.isConditionalTypeNode(node))
474
- return yield* ConditionalTypeNode(node);
475
- if (ts.isConstructorTypeNode(node))
476
- return yield* ConstructorTypeNode(node);
477
- if (ts.isEnumDeclaration(node))
478
- return yield* EnumDeclaration(node);
479
- if (ts.isExpressionWithTypeArguments(node))
480
- return yield* ExpressionWithTypeArguments(node);
481
- if (ts.isFunctionDeclaration(node))
482
- return yield* FunctionDeclaration();
483
- if (ts.isFunctionTypeNode(node))
484
- return yield* FunctionTypeNode(node);
485
- if (ts.isHeritageClause(node))
486
- return yield* HeritageClause(node);
487
- if (ts.isIndexedAccessTypeNode(node))
488
- return yield* IndexedAccessType(node);
489
- if (ts.isIndexSignatureDeclaration(node))
490
- return yield* isIndexSignatureDeclaration(node);
491
- if (ts.isInterfaceDeclaration(node))
492
- return yield* InterfaceDeclaration(node);
493
- if (ts.isLiteralTypeNode(node))
494
- return yield* LiteralTypeNode(node);
495
- if (ts.isPropertySignature(node))
496
- return yield* PropertySignature(node);
497
- if (ts.isModuleDeclaration(node))
498
- return yield* ModuleDeclaration(node);
499
- if (ts.isIdentifier(node))
500
- return yield node.getText();
501
- if (ts.isIntersectionTypeNode(node))
502
- return yield* IntersectionTypeNode(node);
503
- if (ts.isUnionTypeNode(node))
504
- return yield* UnionTypeNode(node);
505
- if (ts.isMappedTypeNode(node))
506
- return yield* MappedTypeNode(node);
507
- if (ts.isMethodSignature(node))
508
- return yield* MethodSignature(node);
509
- if (ts.isModuleBlock(node))
510
- return yield* ModuleBlock(node);
511
- if (ts.isParameter(node))
512
- return yield* Parameter(node);
513
- if (ts.isParenthesizedTypeNode(node))
514
- return yield* ParenthesizedTypeNode(node);
515
- if (ts.isRestTypeNode(node))
516
- return yield* RestTypeNode(node);
517
- if (ts.isTupleTypeNode(node))
518
- return yield* TupleTypeNode(node);
519
- if (ts.isTemplateLiteralTypeNode(node))
520
- return yield* TemplateLiteralTypeNode(node);
521
- if (ts.isTemplateLiteralTypeSpan(node))
522
- return yield* TemplateLiteralTypeSpan(node);
523
- if (ts.isTemplateHead(node))
524
- return yield* TemplateHead(node);
525
- if (ts.isTemplateMiddle(node))
526
- return yield* TemplateMiddle(node);
527
- if (ts.isTemplateTail(node))
528
- return yield* TemplateTail(node);
529
- if (ts.isThisTypeNode(node))
530
- return yield* ThisTypeNode();
531
- if (ts.isTypeAliasDeclaration(node))
532
- return yield* TypeAliasDeclaration(node);
533
- if (ts.isTypeLiteralNode(node))
534
- return yield* TypeLiteralNode(node);
535
- if (ts.isTypeOperatorNode(node))
536
- return yield* TypeOperatorNode(node);
537
- if (ts.isTypeParameterDeclaration(node))
538
- return yield* TypeParameterDeclaration(node);
539
- if (ts.isTypeReferenceNode(node))
540
- return yield* TypeReferenceNode(node);
541
- if (ts.isSourceFile(node))
542
- return yield* SourceFile(node);
543
- if (node.kind === ts.SyntaxKind.ExportKeyword)
544
- return yield `export`;
545
- if (node.kind === ts.SyntaxKind.KeyOfKeyword)
546
- return yield `Type.KeyOf()`;
547
- if (node.kind === ts.SyntaxKind.NumberKeyword)
548
- return yield `Type.Number()`;
549
- if (node.kind === ts.SyntaxKind.BigIntKeyword)
550
- return yield `Type.BigInt()`;
551
- if (node.kind === ts.SyntaxKind.StringKeyword)
552
- return yield `Type.String()`;
553
- if (node.kind === ts.SyntaxKind.SymbolKeyword)
554
- return yield `Type.Symbol()`;
555
- if (node.kind === ts.SyntaxKind.BooleanKeyword)
556
- return yield `Type.Boolean()`;
557
- if (node.kind === ts.SyntaxKind.UndefinedKeyword)
558
- return yield `Type.Undefined()`;
559
- if (node.kind === ts.SyntaxKind.UnknownKeyword)
560
- return yield `Type.Unknown()`;
561
- if (node.kind === ts.SyntaxKind.AnyKeyword)
562
- return yield `Type.Any()`;
563
- if (node.kind === ts.SyntaxKind.NeverKeyword)
564
- return yield `Type.Never()`;
565
- if (node.kind === ts.SyntaxKind.NullKeyword)
566
- return yield `Type.Null()`;
567
- if (node.kind === ts.SyntaxKind.VoidKeyword)
568
- return yield `Type.Void()`;
569
- if (node.kind === ts.SyntaxKind.EndOfFileToken)
570
- return;
571
- if (node.kind === ts.SyntaxKind.SyntaxList) {
572
- for (const child of node.getChildren()) {
573
- yield* Visit(child);
574
- }
575
- return;
576
- }
577
- console.warn("Unhandled:", ts.SyntaxKind[node.kind], node.getText());
578
- }
579
- function ImportStatement() {
580
- if (!(useImports && useTypeBoxImport))
581
- return "";
582
- const set = /* @__PURE__ */ new Set(["Type", "Static"]);
583
- if (useGenerics) {
584
- set.add("TSchema");
585
- }
586
- if (useOptions) {
587
- set.add("SchemaOptions");
588
- }
589
- if (useCloneType) {
590
- set.add("CloneType");
591
- }
592
- const imports = [...set].join(", ");
593
- return `import { ${imports} } from '@sinclair/typebox'`;
594
- }
595
- function Generate(typescriptCode, options) {
596
- var _a, _b, _c;
597
- useExportsEverything = (_a = options == null ? void 0 : options.useExportEverything) != null ? _a : false;
598
- useIdentifiers = (_b = options == null ? void 0 : options.useIdentifiers) != null ? _b : false;
599
- useTypeBoxImport = (_c = options == null ? void 0 : options.useTypeBoxImport) != null ? _c : true;
600
- typenames.clear();
601
- useImports = false;
602
- useOptions = false;
603
- useGenerics = false;
604
- useCloneType = false;
605
- blockLevel = 0;
606
- const source = ts.createSourceFile("types.ts", typescriptCode, ts.ScriptTarget.ESNext, true);
607
- const declarations = [...Visit(source)].join("\n\n");
608
- const imports = ImportStatement();
609
- const typescript = [imports, "", "", declarations].join("\n");
610
- const assertion = ts.transpileModule(typescript, transpilerOptions);
611
- if (assertion.diagnostics && assertion.diagnostics.length > 0) {
612
- throw new TypeScriptToTypeBoxError(assertion.diagnostics);
613
- }
614
- return typescript;
615
- }
616
- TypeScriptToTypeBox2.Generate = Generate;
10
+ /** Generates TypeBox types from TypeScript code */ export var TypeScriptToTypeBox;
11
+ (function(TypeScriptToTypeBox) {
12
+ // ------------------------------------------------------------------------------------------------------------
13
+ // Transpile Options
14
+ // ------------------------------------------------------------------------------------------------------------
15
+ const transpilerOptions = {
16
+ compilerOptions: {
17
+ strict: true,
18
+ target: ts.ScriptTarget.ES2022
19
+ }
20
+ };
21
+ // ------------------------------------------------------------------------------------------------------------
22
+ // Transpile States
23
+ // ------------------------------------------------------------------------------------------------------------
24
+ // (auto) tracked on calls to find type name
25
+ const typenames = new Set();
26
+ // (auto) tracked for recursive types and used to associate This type references
27
+ let recursiveDeclaration = null;
28
+ // (auto) tracked for scoped block level definitions and used to prevent `export` emit when not in global scope.
29
+ let blockLevel = 0;
30
+ // (auto) tracked for injecting typebox import statements
31
+ let useImports = false;
32
+ // (auto) tracked for injecting JSON schema optios
33
+ let useOptions = false;
34
+ // (auto) tracked for injecting TSchema import statements
35
+ let useGenerics = false;
36
+ // (auto) tracked for cases where composition requires deep clone
37
+ let useCloneType = false;
38
+ // (option) export override to ensure all schematics
39
+ let useExportsEverything = false;
40
+ // (option) inject identifiers
41
+ let useIdentifiers = false;
42
+ // (option) specifies if typebox imports should be included
43
+ let useTypeBoxImport = true;
44
+ // ------------------------------------------------------------------------------------------------------------
45
+ // AST Query
46
+ // ------------------------------------------------------------------------------------------------------------
47
+ function FindRecursiveParent(decl, node) {
48
+ return ts.isTypeReferenceNode(node) && decl.name.getText() === node.typeName.getText() || node.getChildren().some((node)=>FindRecursiveParent(decl, node));
49
+ }
50
+ function FindRecursiveThis(node) {
51
+ return node.getChildren().some((node)=>ts.isThisTypeNode(node) || FindRecursiveThis(node));
52
+ }
53
+ function FindTypeName(node, name) {
54
+ const found = typenames.has(name) || node.getChildren().some((node)=>{
55
+ return (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) && node.name.getText() === name || FindTypeName(node, name);
56
+ });
57
+ if (found) typenames.add(name);
58
+ return found;
59
+ }
60
+ function IsRecursiveType(decl) {
61
+ const check1 = ts.isTypeAliasDeclaration(decl) ? [
62
+ decl.type
63
+ ].some((node)=>FindRecursiveParent(decl, node)) : decl.members.some((node)=>FindRecursiveParent(decl, node));
64
+ const check2 = ts.isInterfaceDeclaration(decl) && FindRecursiveThis(decl);
65
+ return check1 || check2;
66
+ }
67
+ function IsReadonlyProperty(node) {
68
+ return node.modifiers !== undefined && node.modifiers.find((modifier)=>modifier.getText() === 'readonly') !== undefined;
69
+ }
70
+ function IsOptionalProperty(node) {
71
+ return node.questionToken !== undefined;
72
+ }
73
+ function IsExport(node) {
74
+ return blockLevel === 0 && (useExportsEverything || node.modifiers !== undefined && node.modifiers.find((modifier)=>modifier.getText() === 'export') !== undefined);
75
+ }
76
+ function IsNamespace(node) {
77
+ return node.flags === ts.NodeFlags.Namespace;
78
+ }
79
+ // ------------------------------------------------------------------------------------------------------------
80
+ // Options
81
+ // ------------------------------------------------------------------------------------------------------------
82
+ function ResolveJsDocComment(node) {
83
+ const content = node.getFullText().trim();
84
+ if (node.kind === ts.SyntaxKind.LiteralType) {
85
+ if (content.startsWith('/**')) {
86
+ // add a new line for JsDoc to parse properly
87
+ return content.slice(0, content.lastIndexOf('*/') + 2).replace(/\*+\/$/, '\n$0');
88
+ } else {
89
+ return '';
90
+ }
91
+ }
92
+ const indices = [
93
+ content.indexOf('/**'),
94
+ content.indexOf('type'),
95
+ content.indexOf('interface')
96
+ ].map((n)=>n === -1 ? Infinity : n);
97
+ if (indices[0] === -1 || indices[1] < indices[0] || indices[2] < indices[0]) return ''; // no comment or declaration before comment
98
+ for(let i = indices[0]; i < content.length; i++){
99
+ if (content[i] === '*' && content[i + 1] === '/') return content.slice(0, i + 2);
100
+ }
101
+ return '';
102
+ }
103
+ function ResolveOptions(node) {
104
+ const content = ResolveJsDocComment(node);
105
+ return JsDoc.Parse(content);
106
+ }
107
+ // ------------------------------------------------------------------------------------------------------------
108
+ // Identifiers
109
+ // ------------------------------------------------------------------------------------------------------------
110
+ function ResolveIdentifier(node) {
111
+ function* resolve(node) {
112
+ if (node.parent) yield* resolve(node.parent);
113
+ if (ts.isModuleDeclaration(node)) yield node.name.getText();
114
+ }
115
+ return [
116
+ ...resolve(node),
117
+ node.name.getText()
118
+ ].join('.');
119
+ }
120
+ function UnwrapModifier(type) {
121
+ for(let i = 0; i < type.length; i++)if (type[i] === '(') return type.slice(i + 1, type.length - 1);
122
+ return type;
123
+ }
124
+ // Note: This function is only called when 'useIdentifiers' is true. What we're trying to achieve with
125
+ // identifier injection is a referential type model over the default inline model. For the purposes of
126
+ // code generation, we tend to prefer referential types as these can be both inlined or referenced in
127
+ // the codegen target; and where different targets may have different referential requirements. It
128
+ // should be possible to implement a more robust injection mechanism however. For review.
129
+ // prettier-ignore
130
+ function InjectOptions(type, options) {
131
+ if (globalThis.Object.keys(options).length === 0) return type;
132
+ // unwrap for modifiers
133
+ if (type.indexOf('Type.ReadonlyOptional') === 0) return `Type.ReadonlyOptional( ${InjectOptions(UnwrapModifier(type), options)} )`;
134
+ if (type.indexOf('Type.Readonly') === 0) return `Type.Readonly( ${InjectOptions(UnwrapModifier(type), options)} )`;
135
+ if (type.indexOf('Type.Optional') === 0) return `Type.Optional( ${InjectOptions(UnwrapModifier(type), options)} )`;
136
+ const encoded = JSON.stringify(options);
137
+ // indexer type
138
+ if (type.lastIndexOf(']') === type.length - 1) useCloneType = true;
139
+ if (type.lastIndexOf(']') === type.length - 1) return `CloneType(${type}, ${encoded})`;
140
+ // referenced type
141
+ if (type.indexOf('(') === -1) {
142
+ useCloneType = true;
143
+ return `CloneType(${type}, ${encoded})`;
144
+ }
145
+ if (type.lastIndexOf('()') === type.length - 2) return type.slice(0, type.length - 1) + `${encoded})`;
146
+ if (type.lastIndexOf('})') === type.length - 2) return type.slice(0, type.length - 1) + `, ${encoded})`;
147
+ if (type.lastIndexOf('])') === type.length - 2) return type.slice(0, type.length - 1) + `, ${encoded})`;
148
+ if (type.lastIndexOf(')') === type.length - 1) return type.slice(0, type.length - 1) + `, ${encoded})`;
149
+ return type;
150
+ }
151
+ // ------------------------------------------------------------------------------------------------------------
152
+ // Nodes
153
+ // ------------------------------------------------------------------------------------------------------------
154
+ function* SourceFile(node) {
155
+ for (const next of node.getChildren()){
156
+ yield* Visit(next);
157
+ }
158
+ }
159
+ function* PropertySignature(node) {
160
+ const [readonly, optional] = [
161
+ IsReadonlyProperty(node),
162
+ IsOptionalProperty(node)
163
+ ];
164
+ const options = ResolveOptions(node);
165
+ const type_0 = Collect(node.type);
166
+ const type_1 = InjectOptions(type_0, options);
167
+ if (readonly && optional) {
168
+ return yield `${node.name.getText()}: Type.ReadonlyOptional(${type_1})`;
169
+ } else if (readonly) {
170
+ return yield `${node.name.getText()}: Type.Readonly(${type_1})`;
171
+ } else if (optional) {
172
+ return yield `${node.name.getText()}: Type.Optional(${type_1})`;
173
+ } else {
174
+ return yield `${node.name.getText()}: ${type_1}`;
175
+ }
176
+ }
177
+ function* ArrayTypeNode(node) {
178
+ const type = Collect(node.elementType);
179
+ yield `Type.Array(${type})`;
180
+ }
181
+ function* Block(node) {
182
+ blockLevel += 1;
183
+ const statments = node.statements.map((statement)=>Collect(statement)).join('\n\n');
184
+ blockLevel -= 1;
185
+ yield `{\n${statments}\n}`;
186
+ }
187
+ function* TupleTypeNode(node) {
188
+ const types = node.elements.map((type)=>Collect(type)).join(',\n');
189
+ yield `Type.Tuple([\n${types}\n])`;
190
+ }
191
+ function* UnionTypeNode(node) {
192
+ const types = node.types.map((type)=>Collect(type)).join(',\n');
193
+ yield `Type.Union([\n${types}\n])`;
194
+ }
195
+ function* MappedTypeNode(node) {
196
+ const K = Collect(node.typeParameter);
197
+ const T = Collect(node.type);
198
+ const C = Collect(node.typeParameter.constraint);
199
+ const readonly = node.readonlyToken !== undefined;
200
+ const optional = node.questionToken !== undefined;
201
+ const readonly_subtractive = readonly && ts.isMinusToken(node.readonlyToken);
202
+ const optional_subtractive = optional && ts.isMinusToken(node.questionToken);
203
+ // prettier-ignore
204
+ return yield readonly && optional ? readonly_subtractive && optional_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T}, false), false))` : readonly_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T}), false))` : optional_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T}, false)))` : `Type.Mapped(${C}, ${K} => Type.Readonly(Type.Optional(${T})))` : readonly ? readonly_subtractive ? `Type.Mapped(${C}, ${K} => Type.Readonly(${T}, false))` : `Type.Mapped(${C}, ${K} => Type.Readonly(${T}))` : optional ? optional_subtractive ? `Type.Mapped(${C}, ${K} => Type.Optional(${T}, false))` : `Type.Mapped(${C}, ${K} => Type.Optional(${T}))` : `Type.Mapped(${C}, ${K} => ${T})`;
205
+ }
206
+ function* MethodSignature(node) {
207
+ const parameters = node.parameters.map((parameter)=>parameter.dotDotDotToken !== undefined ? `...Type.Rest(${Collect(parameter)})` : Collect(parameter)).join(', ');
208
+ const returnType = node.type === undefined ? `Type.Unknown()` : Collect(node.type);
209
+ yield `${node.name.getText()}: Type.Function([${parameters}], ${returnType})`;
210
+ }
211
+ // prettier-ignore
212
+ function* TemplateLiteralTypeNode(node) {
213
+ const collect = node.getChildren().map((node)=>Collect(node)).join('');
214
+ yield `Type.TemplateLiteral([${collect.slice(0, collect.length - 2)}])` // can't remove trailing here
215
+ ;
216
+ }
217
+ // prettier-ignore
218
+ function* TemplateLiteralTypeSpan(node) {
219
+ const collect = node.getChildren().map((node)=>Collect(node)).join(', ');
220
+ if (collect.length > 0) yield `${collect}`;
221
+ }
222
+ function* TemplateHead(node) {
223
+ if (node.text.length > 0) yield `Type.Literal('${node.text}'), `;
224
+ }
225
+ function* TemplateMiddle(node) {
226
+ if (node.text.length > 0) yield `Type.Literal('${node.text}'), `;
227
+ }
228
+ function* TemplateTail(node) {
229
+ if (node.text.length > 0) yield `Type.Literal('${node.text}'), `;
230
+ }
231
+ function* ThisTypeNode(node) {
232
+ yield `This`;
233
+ }
234
+ function* IntersectionTypeNode(node) {
235
+ const types = node.types.map((type)=>Collect(type)).join(',\n');
236
+ yield `Type.Intersect([\n${types}\n])`;
237
+ }
238
+ function* TypeOperatorNode(node) {
239
+ if (node.operator === ts.SyntaxKind.KeyOfKeyword) {
240
+ const type = Collect(node.type);
241
+ yield `Type.KeyOf(${type})`;
242
+ }
243
+ if (node.operator === ts.SyntaxKind.ReadonlyKeyword) {
244
+ yield `Type.Readonly(${Collect(node.type)})`;
245
+ }
246
+ }
247
+ function* Parameter(node) {
248
+ yield Collect(node.type);
249
+ }
250
+ function* FunctionTypeNode(node) {
251
+ const parameters = node.parameters.map((parameter)=>parameter.dotDotDotToken !== undefined ? `...Type.Rest(${Collect(parameter)})` : Collect(parameter)).join(', ');
252
+ const returns = Collect(node.type);
253
+ yield `Type.Function([${parameters}], ${returns})`;
254
+ }
255
+ function* ConstructorTypeNode(node) {
256
+ const parameters = node.parameters.map((param)=>Collect(param)).join(', ');
257
+ const returns = Collect(node.type);
258
+ yield `Type.Constructor([${parameters}], ${returns})`;
259
+ }
260
+ function* EnumDeclaration(node) {
261
+ useImports = true;
262
+ const exports = IsExport(node) ? 'export ' : '';
263
+ const members = node.members.map((member)=>member.getText()).join(', ');
264
+ const enumType = `${exports}enum Enum${node.name.getText()} { ${members} }`;
265
+ const staticType = `${exports}type ${node.name.getText()} = Static<typeof ${node.name.getText()}>`;
266
+ const type = `${exports}const ${node.name.getText()} = Type.Enum(Enum${node.name.getText()})`;
267
+ yield [
268
+ enumType,
269
+ '',
270
+ staticType,
271
+ type
272
+ ].join('\n');
273
+ }
274
+ function PropertiesFromTypeElementArray(members) {
275
+ const properties = members.filter((member)=>!ts.isIndexSignatureDeclaration(member));
276
+ const indexers = members.filter((member)=>ts.isIndexSignatureDeclaration(member));
277
+ const propertyCollect = properties.map((property)=>Collect(property)).join(',\n');
278
+ const indexer = indexers.length > 0 ? Collect(indexers[indexers.length - 1]) : '';
279
+ if (properties.length === 0 && indexer.length > 0) {
280
+ return `{},\n{\nadditionalProperties: ${indexer}\n }`;
281
+ } else if (properties.length > 0 && indexer.length > 0) {
282
+ return `{\n${propertyCollect}\n},\n{\nadditionalProperties: ${indexer}\n }`;
283
+ } else {
284
+ return `{\n${propertyCollect}\n}`;
285
+ }
286
+ }
287
+ function* TypeLiteralNode(node) {
288
+ const members = PropertiesFromTypeElementArray(node.members);
289
+ yield* `Type.Object(${members})`;
290
+ }
291
+ function* InterfaceDeclaration(node) {
292
+ useImports = true;
293
+ const isRecursiveType = IsRecursiveType(node);
294
+ if (isRecursiveType) recursiveDeclaration = node;
295
+ const heritage = node.heritageClauses !== undefined ? node.heritageClauses.flatMap((node)=>Collect(node)) : [];
296
+ if (node.typeParameters) {
297
+ useGenerics = true;
298
+ const exports = IsExport(node) ? 'export ' : '';
299
+ const identifier = ResolveIdentifier(node);
300
+ const options = useIdentifiers ? {
301
+ ...ResolveOptions(node),
302
+ $id: identifier
303
+ } : {
304
+ ...ResolveOptions(node)
305
+ };
306
+ const constraints = node.typeParameters.map((param)=>`${Collect(param)} extends TSchema`).join(', ');
307
+ const parameters = node.typeParameters.map((param)=>`${Collect(param)}: ${Collect(param)}`).join(', ');
308
+ const members = PropertiesFromTypeElementArray(node.members);
309
+ // const names = node.typeParameters.map((param) => `${Collect(param)}`).join(', ')
310
+ // const staticDeclaration = `${exports}type ${node.name.getText()}<${constraints}> = Static<ReturnType<typeof ${node.name.getText()}<${names}>>>`
311
+ const rawTypeExpression = IsRecursiveType(node) ? `Type.Recursive(This => Type.Object(${members}))` : `Type.Object(${members})`;
312
+ const typeExpression = heritage.length === 0 ? rawTypeExpression : `Type.Composite([${heritage.join(', ')}, ${rawTypeExpression}])`;
313
+ const type = InjectOptions(typeExpression, options);
314
+ const typeDeclaration = `${exports}const ${node.name.getText()} = <${constraints}>(${parameters}) => ${type}`;
315
+ yield `${typeDeclaration}`;
316
+ } else {
317
+ const exports = IsExport(node) ? 'export ' : '';
318
+ const identifier = ResolveIdentifier(node);
319
+ const options = useIdentifiers ? {
320
+ ...ResolveOptions(node),
321
+ $id: identifier
322
+ } : {
323
+ ...ResolveOptions(node)
324
+ };
325
+ const members = PropertiesFromTypeElementArray(node.members);
326
+ const staticDeclaration = `${exports}type ${node.name.getText()} = Static<typeof ${node.name.getText()}>`;
327
+ const rawTypeExpression = IsRecursiveType(node) ? `Type.Recursive(This => Type.Object(${members}))` : `Type.Object(${members})`;
328
+ const typeExpression = heritage.length === 0 ? rawTypeExpression : `Type.Composite([${heritage.join(', ')}, ${rawTypeExpression}])`;
329
+ const type = InjectOptions(typeExpression, options);
330
+ const typeDeclaration = `${exports}const ${node.name.getText()} = ${type}`;
331
+ yield `${staticDeclaration}\n${typeDeclaration}`;
332
+ }
333
+ recursiveDeclaration = null;
334
+ }
335
+ function* TypeAliasDeclaration(node) {
336
+ useImports = true;
337
+ const isRecursiveType = IsRecursiveType(node);
338
+ if (isRecursiveType) recursiveDeclaration = node;
339
+ // Generics case
340
+ if (node.typeParameters) {
341
+ useGenerics = true;
342
+ const exports = IsExport(node) ? 'export ' : '';
343
+ const options = useIdentifiers ? {
344
+ $id: ResolveIdentifier(node)
345
+ } : {};
346
+ const constraints = node.typeParameters.map((param)=>`${Collect(param)} extends TSchema`).join(', ');
347
+ const parameters = node.typeParameters.map((param)=>`${Collect(param)}: ${Collect(param)}`).join(', ');
348
+ const type_0 = Collect(node.type);
349
+ const type_1 = isRecursiveType ? `Type.Recursive(This => ${type_0})` : type_0;
350
+ const type_2 = InjectOptions(type_1, options);
351
+ // const names = node.typeParameters.map((param) => Collect(param)).join(', ')
352
+ // const staticDeclaration = `${exports}type ${node.name.getText()}<${constraints}> = Static<ReturnType<typeof ${node.name.getText()}<${names}>>>`
353
+ const typeDeclaration = `${exports}const ${node.name.getText()} = <${constraints}>(${parameters}) => ${type_2}`;
354
+ yield `${typeDeclaration}`;
355
+ } else {
356
+ const exports = IsExport(node) ? 'export ' : '';
357
+ const options = useIdentifiers ? {
358
+ $id: ResolveIdentifier(node),
359
+ ...ResolveOptions(node)
360
+ } : {
361
+ ...ResolveOptions(node)
362
+ };
363
+ const type_0 = Collect(node.type);
364
+ const type_1 = isRecursiveType ? `Type.Recursive(This => ${type_0})` : type_0;
365
+ const type_2 = InjectOptions(type_1, options);
366
+ const staticDeclaration = `${exports}type ${node.name.getText()} = Static<typeof ${node.name.getText()}>`;
367
+ const typeDeclaration = `${exports}const ${node.name.getText()} = ${type_2}`;
368
+ yield `${staticDeclaration}\n${typeDeclaration}`;
369
+ }
370
+ recursiveDeclaration = null;
371
+ }
372
+ function* HeritageClause(node) {
373
+ // Consideration: This may be better expressed as a heritage type (for review)
374
+ const types = node.types.map((node)=>Collect(node));
375
+ if (types.length === 1) return yield types[0];
376
+ // yield `Type.Composite([${types.join(', ')}])`
377
+ // Note: Heritage clauses are only used in extends cases, and where Composite
378
+ // is the exterior type. These types will be prepended to the Composite array.
379
+ yield types.join(', ');
380
+ }
381
+ function* IndexedAccessType(node) {
382
+ const obj = node.objectType.getText();
383
+ const key = Collect(node.indexType);
384
+ yield `Type.Index(${obj}, ${key})`;
385
+ }
386
+ function* ExpressionWithTypeArguments(node) {
387
+ const name = Collect(node.expression);
388
+ const typeArguments = node.typeArguments === undefined ? [] : node.typeArguments.map((node)=>Collect(node));
389
+ // todo: default type argument (resolve `= number` from `type Foo<T = number>`)
390
+ return yield typeArguments.length === 0 ? `${name}` : `${name}(${typeArguments.join(', ')})`;
391
+ }
392
+ function* TypeParameterDeclaration(node) {
393
+ yield node.name.getText();
394
+ }
395
+ function* ParenthesizedTypeNode(node) {
396
+ yield Collect(node.type);
397
+ }
398
+ function* RestTypeNode(node) {
399
+ yield `...Type.Rest(${node.type.getText()})`;
400
+ }
401
+ function* ConditionalTypeNode(node) {
402
+ const checkType = Collect(node.checkType);
403
+ const extendsType = Collect(node.extendsType);
404
+ const trueType = Collect(node.trueType);
405
+ const falseType = Collect(node.falseType);
406
+ yield `Type.Extends(${checkType}, ${extendsType}, ${trueType}, ${falseType})`;
407
+ }
408
+ function* isIndexSignatureDeclaration(node) {
409
+ // note: we ignore the key and just return the type. this is a mismatch between
410
+ // object and record types. Address in TypeBox by unifying validation paths
411
+ // for objects and record types.
412
+ yield Collect(node.type);
413
+ }
414
+ function* TypeReferenceNode(node) {
415
+ const name = node.typeName.getText();
416
+ const args = node.typeArguments ? `(${node.typeArguments.map((type)=>Collect(type)).join(', ')})` : '';
417
+ // --------------------------------------------------------------
418
+ // Instance Types
419
+ // --------------------------------------------------------------
420
+ if (name === 'Date') return yield `Type.Date()`;
421
+ if (name === 'Uint8Array') return yield `Type.Uint8Array()`;
422
+ if (name === 'String') return yield `Type.String()`;
423
+ if (name === 'Number') return yield `Type.Number()`;
424
+ if (name === 'Boolean') return yield `Type.Boolean()`;
425
+ if (name === 'Function') return yield `Type.Function([], Type.Unknown())`;
426
+ // --------------------------------------------------------------
427
+ // Types
428
+ // --------------------------------------------------------------
429
+ if (name === 'Array') return yield `Type.Array${args}`;
430
+ if (name === 'Record') return yield `Type.Record${args}`;
431
+ if (name === 'Partial') return yield `Type.Partial${args}`;
432
+ if (name === 'Required') return yield `Type.Required${args}`;
433
+ if (name === 'Omit') return yield `Type.Omit${args}`;
434
+ if (name === 'Pick') return yield `Type.Pick${args}`;
435
+ if (name === 'Promise') return yield `Type.Promise${args}`;
436
+ if (name === 'ReturnType') return yield `Type.ReturnType${args}`;
437
+ if (name === 'InstanceType') return yield `Type.InstanceType${args}`;
438
+ if (name === 'Parameters') return yield `Type.Parameters${args}`;
439
+ if (name === 'AsyncIterableIterator') return yield `Type.AsyncIterator${args}`;
440
+ if (name === 'IterableIterator') return yield `Type.Iterator${args}`;
441
+ if (name === 'ConstructorParameters') return yield `Type.ConstructorParameters${args}`;
442
+ if (name === 'Exclude') return yield `Type.Exclude${args}`;
443
+ if (name === 'Extract') return yield `Type.Extract${args}`;
444
+ if (name === 'Awaited') return yield `Type.Awaited${args}`;
445
+ if (name === 'Uppercase') return yield `Type.Uppercase${args}`;
446
+ if (name === 'Lowercase') return yield `Type.Lowercase${args}`;
447
+ if (name === 'Capitalize') return yield `Type.Capitalize${args}`;
448
+ if (name === 'Uncapitalize') return yield `Type.Uncapitalize${args}`;
449
+ if (recursiveDeclaration !== null && FindRecursiveParent(recursiveDeclaration, node)) return yield `This`;
450
+ if (FindTypeName(node.getSourceFile(), name) && args.length === 0 /** non-resolvable */ ) {
451
+ return yield `${name}${args}`;
452
+ }
453
+ if (name in globalThis) return yield `Type.Never()`;
454
+ return yield `${name}${args}`;
455
+ }
456
+ function* LiteralTypeNode(node) {
457
+ const text = node.getText();
458
+ if (text === 'null') return yield `Type.Null()`;
459
+ yield InjectOptions(`Type.Literal(${node.getText()})`, ResolveOptions(node));
460
+ }
461
+ function* ModuleDeclaration(node) {
462
+ const export_specifier = IsExport(node) ? 'export ' : '';
463
+ const module_specifier = IsNamespace(node) ? 'namespace' : 'module';
464
+ yield `${export_specifier}${module_specifier} ${node.name.getText()} {`;
465
+ yield* Visit(node.body);
466
+ yield `}`;
467
+ }
468
+ function* ModuleBlock(node) {
469
+ for (const statement of node.statements){
470
+ yield* Visit(statement);
471
+ }
472
+ }
473
+ function* FunctionDeclaration(node) {
474
+ // ignore
475
+ }
476
+ function* ClassDeclaration(node) {
477
+ // ignore
478
+ }
479
+ function Collect(node) {
480
+ return `${[
481
+ ...Visit(node)
482
+ ].join('')}`;
483
+ }
484
+ function* Visit(node) {
485
+ if (node === undefined) return;
486
+ if (ts.isArrayTypeNode(node)) return yield* ArrayTypeNode(node);
487
+ if (ts.isBlock(node)) return yield* Block(node);
488
+ if (ts.isClassDeclaration(node)) return yield* ClassDeclaration(node);
489
+ if (ts.isConditionalTypeNode(node)) return yield* ConditionalTypeNode(node);
490
+ if (ts.isConstructorTypeNode(node)) return yield* ConstructorTypeNode(node);
491
+ if (ts.isEnumDeclaration(node)) return yield* EnumDeclaration(node);
492
+ if (ts.isExpressionWithTypeArguments(node)) return yield* ExpressionWithTypeArguments(node);
493
+ if (ts.isFunctionDeclaration(node)) return yield* FunctionDeclaration(node);
494
+ if (ts.isFunctionTypeNode(node)) return yield* FunctionTypeNode(node);
495
+ if (ts.isHeritageClause(node)) return yield* HeritageClause(node);
496
+ if (ts.isIndexedAccessTypeNode(node)) return yield* IndexedAccessType(node);
497
+ if (ts.isIndexSignatureDeclaration(node)) return yield* isIndexSignatureDeclaration(node);
498
+ if (ts.isInterfaceDeclaration(node)) return yield* InterfaceDeclaration(node);
499
+ if (ts.isLiteralTypeNode(node)) return yield* LiteralTypeNode(node);
500
+ if (ts.isPropertySignature(node)) return yield* PropertySignature(node);
501
+ if (ts.isModuleDeclaration(node)) return yield* ModuleDeclaration(node);
502
+ if (ts.isIdentifier(node)) return yield node.getText();
503
+ if (ts.isIntersectionTypeNode(node)) return yield* IntersectionTypeNode(node);
504
+ if (ts.isUnionTypeNode(node)) return yield* UnionTypeNode(node);
505
+ if (ts.isMappedTypeNode(node)) return yield* MappedTypeNode(node);
506
+ if (ts.isMethodSignature(node)) return yield* MethodSignature(node);
507
+ if (ts.isModuleBlock(node)) return yield* ModuleBlock(node);
508
+ if (ts.isParameter(node)) return yield* Parameter(node);
509
+ if (ts.isParenthesizedTypeNode(node)) return yield* ParenthesizedTypeNode(node);
510
+ if (ts.isRestTypeNode(node)) return yield* RestTypeNode(node);
511
+ if (ts.isTupleTypeNode(node)) return yield* TupleTypeNode(node);
512
+ if (ts.isTemplateLiteralTypeNode(node)) return yield* TemplateLiteralTypeNode(node);
513
+ if (ts.isTemplateLiteralTypeSpan(node)) return yield* TemplateLiteralTypeSpan(node);
514
+ if (ts.isTemplateHead(node)) return yield* TemplateHead(node);
515
+ if (ts.isTemplateMiddle(node)) return yield* TemplateMiddle(node);
516
+ if (ts.isTemplateTail(node)) return yield* TemplateTail(node);
517
+ if (ts.isThisTypeNode(node)) return yield* ThisTypeNode(node);
518
+ if (ts.isTypeAliasDeclaration(node)) return yield* TypeAliasDeclaration(node);
519
+ if (ts.isTypeLiteralNode(node)) return yield* TypeLiteralNode(node);
520
+ if (ts.isTypeOperatorNode(node)) return yield* TypeOperatorNode(node);
521
+ if (ts.isTypeParameterDeclaration(node)) return yield* TypeParameterDeclaration(node);
522
+ if (ts.isTypeReferenceNode(node)) return yield* TypeReferenceNode(node);
523
+ if (ts.isSourceFile(node)) return yield* SourceFile(node);
524
+ if (node.kind === ts.SyntaxKind.ExportKeyword) return yield `export`;
525
+ if (node.kind === ts.SyntaxKind.KeyOfKeyword) return yield `Type.KeyOf()`;
526
+ if (node.kind === ts.SyntaxKind.NumberKeyword) return yield `Type.Number()`;
527
+ if (node.kind === ts.SyntaxKind.BigIntKeyword) return yield `Type.BigInt()`;
528
+ if (node.kind === ts.SyntaxKind.StringKeyword) return yield `Type.String()`;
529
+ if (node.kind === ts.SyntaxKind.SymbolKeyword) return yield `Type.Symbol()`;
530
+ if (node.kind === ts.SyntaxKind.BooleanKeyword) return yield `Type.Boolean()`;
531
+ if (node.kind === ts.SyntaxKind.UndefinedKeyword) return yield `Type.Undefined()`;
532
+ if (node.kind === ts.SyntaxKind.UnknownKeyword) return yield `Type.Unknown()`;
533
+ if (node.kind === ts.SyntaxKind.AnyKeyword) return yield `Type.Any()`;
534
+ if (node.kind === ts.SyntaxKind.NeverKeyword) return yield `Type.Never()`;
535
+ if (node.kind === ts.SyntaxKind.NullKeyword) return yield `Type.Null()`;
536
+ if (node.kind === ts.SyntaxKind.VoidKeyword) return yield `Type.Void()`;
537
+ if (node.kind === ts.SyntaxKind.EndOfFileToken) return;
538
+ if (node.kind === ts.SyntaxKind.SyntaxList) {
539
+ for (const child of node.getChildren()){
540
+ yield* Visit(child);
541
+ }
542
+ return;
543
+ }
544
+ console.warn('Unhandled:', ts.SyntaxKind[node.kind], node.getText());
545
+ }
546
+ function ImportStatement() {
547
+ if (!(useImports && useTypeBoxImport)) return '';
548
+ const set = new Set([
549
+ 'Type',
550
+ 'Static'
551
+ ]);
552
+ if (useGenerics) {
553
+ set.add('TSchema');
554
+ }
555
+ if (useOptions) {
556
+ set.add('SchemaOptions');
557
+ }
558
+ if (useCloneType) {
559
+ set.add('CloneType');
560
+ }
561
+ const imports = [
562
+ ...set
563
+ ].join(', ');
564
+ return `import { ${imports} } from '@sinclair/typebox'`;
565
+ }
566
+ function Generate(typescriptCode, options) {
567
+ useExportsEverything = options?.useExportEverything ?? false;
568
+ useIdentifiers = options?.useIdentifiers ?? false;
569
+ useTypeBoxImport = options?.useTypeBoxImport ?? true;
570
+ typenames.clear();
571
+ useImports = false;
572
+ useOptions = false;
573
+ useGenerics = false;
574
+ useCloneType = false;
575
+ blockLevel = 0;
576
+ const source = ts.createSourceFile('types.ts', typescriptCode, ts.ScriptTarget.ESNext, true);
577
+ const declarations = [
578
+ ...Visit(source)
579
+ ].join('\n\n');
580
+ const imports = ImportStatement();
581
+ const typescript = [
582
+ imports,
583
+ '',
584
+ '',
585
+ declarations
586
+ ].join('\n');
587
+ const assertion = ts.transpileModule(typescript, transpilerOptions);
588
+ if (assertion.diagnostics && assertion.diagnostics.length > 0) {
589
+ throw new TypeScriptToTypeBoxError(assertion.diagnostics);
590
+ }
591
+ return typescript;
592
+ }
593
+ TypeScriptToTypeBox.Generate = Generate;
617
594
  })(TypeScriptToTypeBox || (TypeScriptToTypeBox = {}));
618
595
 
619
- export { TypeScriptToTypeBox, TypeScriptToTypeBoxError };
620
- //# sourceMappingURL=typescript-to-typebox.js.map
596
+ //# sourceMappingURL=typescript-to-typebox.js.map