@zyno-io/ts-server-foundation 26.712.36

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 (771) hide show
  1. package/README.md +31 -0
  2. package/dist/devconsole/assets/index-BlWLbczn.css +1 -0
  3. package/dist/devconsole/assets/index-lSF6DUY3.js +3 -0
  4. package/dist/devconsole/index.html +13 -0
  5. package/dist/src/app/base.d.ts +66 -0
  6. package/dist/src/app/base.d.ts.map +1 -0
  7. package/dist/src/app/base.js +577 -0
  8. package/dist/src/app/base.js.map +1 -0
  9. package/dist/src/app/commands.d.ts +20 -0
  10. package/dist/src/app/commands.d.ts.map +1 -0
  11. package/dist/src/app/commands.js +17 -0
  12. package/dist/src/app/commands.js.map +1 -0
  13. package/dist/src/app/config-loader.d.ts +9 -0
  14. package/dist/src/app/config-loader.d.ts.map +1 -0
  15. package/dist/src/app/config-loader.js +91 -0
  16. package/dist/src/app/config-loader.js.map +1 -0
  17. package/dist/src/app/config.d.ts +96 -0
  18. package/dist/src/app/config.d.ts.map +1 -0
  19. package/dist/src/app/config.js +114 -0
  20. package/dist/src/app/config.js.map +1 -0
  21. package/dist/src/app/const.d.ts +5 -0
  22. package/dist/src/app/const.d.ts.map +1 -0
  23. package/dist/src/app/const.js +17 -0
  24. package/dist/src/app/const.js.map +1 -0
  25. package/dist/src/app/current.d.ts +5 -0
  26. package/dist/src/app/current.d.ts.map +1 -0
  27. package/dist/src/app/current.js +14 -0
  28. package/dist/src/app/current.js.map +1 -0
  29. package/dist/src/app/index.d.ts +8 -0
  30. package/dist/src/app/index.d.ts.map +1 -0
  31. package/dist/src/app/index.js +13 -0
  32. package/dist/src/app/index.js.map +1 -0
  33. package/dist/src/app/lifecycle.d.ts +9 -0
  34. package/dist/src/app/lifecycle.d.ts.map +1 -0
  35. package/dist/src/app/lifecycle.js +21 -0
  36. package/dist/src/app/lifecycle.js.map +1 -0
  37. package/dist/src/app/migrations-entrypoint.d.ts +3 -0
  38. package/dist/src/app/migrations-entrypoint.d.ts.map +1 -0
  39. package/dist/src/app/migrations-entrypoint.js +35 -0
  40. package/dist/src/app/migrations-entrypoint.js.map +1 -0
  41. package/dist/src/app/resolver.d.ts +6 -0
  42. package/dist/src/app/resolver.d.ts.map +1 -0
  43. package/dist/src/app/resolver.js +15 -0
  44. package/dist/src/app/resolver.js.map +1 -0
  45. package/dist/src/auth/index.d.ts +3 -0
  46. package/dist/src/auth/index.d.ts.map +1 -0
  47. package/dist/src/auth/index.js +15 -0
  48. package/dist/src/auth/index.js.map +1 -0
  49. package/dist/src/auth/jwt.d.ts +61 -0
  50. package/dist/src/auth/jwt.d.ts.map +1 -0
  51. package/dist/src/auth/jwt.js +379 -0
  52. package/dist/src/auth/jwt.js.map +1 -0
  53. package/dist/src/auth/provider.d.ts +21 -0
  54. package/dist/src/auth/provider.d.ts.map +1 -0
  55. package/dist/src/auth/provider.js +148 -0
  56. package/dist/src/auth/provider.js.map +1 -0
  57. package/dist/src/cli/common.d.ts +13 -0
  58. package/dist/src/cli/common.d.ts.map +1 -0
  59. package/dist/src/cli/common.js +99 -0
  60. package/dist/src/cli/common.js.map +1 -0
  61. package/dist/src/cli/tsf-create-app.d.ts +3 -0
  62. package/dist/src/cli/tsf-create-app.d.ts.map +1 -0
  63. package/dist/src/cli/tsf-create-app.js +89 -0
  64. package/dist/src/cli/tsf-create-app.js.map +1 -0
  65. package/dist/src/cli/tsf-dev.d.ts +3 -0
  66. package/dist/src/cli/tsf-dev.d.ts.map +1 -0
  67. package/dist/src/cli/tsf-dev.js +753 -0
  68. package/dist/src/cli/tsf-dev.js.map +1 -0
  69. package/dist/src/cli/tsf-gen-proto.d.ts +3 -0
  70. package/dist/src/cli/tsf-gen-proto.d.ts.map +1 -0
  71. package/dist/src/cli/tsf-gen-proto.js +134 -0
  72. package/dist/src/cli/tsf-gen-proto.js.map +1 -0
  73. package/dist/src/cli/tsf-install.d.ts +8 -0
  74. package/dist/src/cli/tsf-install.d.ts.map +1 -0
  75. package/dist/src/cli/tsf-install.js +424 -0
  76. package/dist/src/cli/tsf-install.js.map +1 -0
  77. package/dist/src/cli/tsf-migrate.d.ts +3 -0
  78. package/dist/src/cli/tsf-migrate.d.ts.map +1 -0
  79. package/dist/src/cli/tsf-migrate.js +271 -0
  80. package/dist/src/cli/tsf-migrate.js.map +1 -0
  81. package/dist/src/cli/tsf-test.d.ts +4 -0
  82. package/dist/src/cli/tsf-test.d.ts.map +1 -0
  83. package/dist/src/cli/tsf-test.js +350 -0
  84. package/dist/src/cli/tsf-test.js.map +1 -0
  85. package/dist/src/cli/tsf-update.d.ts +3 -0
  86. package/dist/src/cli/tsf-update.d.ts.map +1 -0
  87. package/dist/src/cli/tsf-update.js +12 -0
  88. package/dist/src/cli/tsf-update.js.map +1 -0
  89. package/dist/src/cli/tsf.d.ts +3 -0
  90. package/dist/src/cli/tsf.d.ts.map +1 -0
  91. package/dist/src/cli/tsf.js +29 -0
  92. package/dist/src/cli/tsf.js.map +1 -0
  93. package/dist/src/database/database.d.ts +54 -0
  94. package/dist/src/database/database.d.ts.map +1 -0
  95. package/dist/src/database/database.js +695 -0
  96. package/dist/src/database/database.js.map +1 -0
  97. package/dist/src/database/driver.d.ts +28 -0
  98. package/dist/src/database/driver.d.ts.map +1 -0
  99. package/dist/src/database/driver.js +5 -0
  100. package/dist/src/database/driver.js.map +1 -0
  101. package/dist/src/database/drivers/index.d.ts +4 -0
  102. package/dist/src/database/drivers/index.d.ts.map +1 -0
  103. package/dist/src/database/drivers/index.js +9 -0
  104. package/dist/src/database/drivers/index.js.map +1 -0
  105. package/dist/src/database/drivers/mysql-session-rpc.d.ts +40 -0
  106. package/dist/src/database/drivers/mysql-session-rpc.d.ts.map +1 -0
  107. package/dist/src/database/drivers/mysql-session-rpc.js +180 -0
  108. package/dist/src/database/drivers/mysql-session-rpc.js.map +1 -0
  109. package/dist/src/database/drivers/mysql-session.d.ts +25 -0
  110. package/dist/src/database/drivers/mysql-session.d.ts.map +1 -0
  111. package/dist/src/database/drivers/mysql-session.js +124 -0
  112. package/dist/src/database/drivers/mysql-session.js.map +1 -0
  113. package/dist/src/database/drivers/mysql.d.ts +20 -0
  114. package/dist/src/database/drivers/mysql.d.ts.map +1 -0
  115. package/dist/src/database/drivers/mysql.js +84 -0
  116. package/dist/src/database/drivers/mysql.js.map +1 -0
  117. package/dist/src/database/drivers/postgres.d.ts +22 -0
  118. package/dist/src/database/drivers/postgres.d.ts.map +1 -0
  119. package/dist/src/database/drivers/postgres.js +80 -0
  120. package/dist/src/database/drivers/postgres.js.map +1 -0
  121. package/dist/src/database/entity.d.ts +112 -0
  122. package/dist/src/database/entity.d.ts.map +1 -0
  123. package/dist/src/database/entity.js +333 -0
  124. package/dist/src/database/entity.js.map +1 -0
  125. package/dist/src/database/errors.d.ts +7 -0
  126. package/dist/src/database/errors.d.ts.map +1 -0
  127. package/dist/src/database/errors.js +34 -0
  128. package/dist/src/database/errors.js.map +1 -0
  129. package/dist/src/database/factory.d.ts +48 -0
  130. package/dist/src/database/factory.d.ts.map +1 -0
  131. package/dist/src/database/factory.js +139 -0
  132. package/dist/src/database/factory.js.map +1 -0
  133. package/dist/src/database/identifiers.d.ts +8 -0
  134. package/dist/src/database/identifiers.d.ts.map +1 -0
  135. package/dist/src/database/identifiers.js +46 -0
  136. package/dist/src/database/identifiers.js.map +1 -0
  137. package/dist/src/database/index.d.ts +14 -0
  138. package/dist/src/database/index.d.ts.map +1 -0
  139. package/dist/src/database/index.js +33 -0
  140. package/dist/src/database/index.js.map +1 -0
  141. package/dist/src/database/metadata.d.ts +27 -0
  142. package/dist/src/database/metadata.d.ts.map +1 -0
  143. package/dist/src/database/metadata.js +70 -0
  144. package/dist/src/database/metadata.js.map +1 -0
  145. package/dist/src/database/migration/create/comparator.d.ts +3 -0
  146. package/dist/src/database/migration/create/comparator.d.ts.map +1 -0
  147. package/dist/src/database/migration/create/comparator.js +302 -0
  148. package/dist/src/database/migration/create/comparator.js.map +1 -0
  149. package/dist/src/database/migration/create/db-reader.d.ts +9 -0
  150. package/dist/src/database/migration/create/db-reader.d.ts.map +1 -0
  151. package/dist/src/database/migration/create/db-reader.js +478 -0
  152. package/dist/src/database/migration/create/db-reader.js.map +1 -0
  153. package/dist/src/database/migration/create/ddl-generator.d.ts +4 -0
  154. package/dist/src/database/migration/create/ddl-generator.d.ts.map +1 -0
  155. package/dist/src/database/migration/create/ddl-generator.js +431 -0
  156. package/dist/src/database/migration/create/ddl-generator.js.map +1 -0
  157. package/dist/src/database/migration/create/entity-reader.d.ts +7 -0
  158. package/dist/src/database/migration/create/entity-reader.d.ts.map +1 -0
  159. package/dist/src/database/migration/create/entity-reader.js +169 -0
  160. package/dist/src/database/migration/create/entity-reader.js.map +1 -0
  161. package/dist/src/database/migration/create/file-generator.d.ts +7 -0
  162. package/dist/src/database/migration/create/file-generator.d.ts.map +1 -0
  163. package/dist/src/database/migration/create/file-generator.js +60 -0
  164. package/dist/src/database/migration/create/file-generator.js.map +1 -0
  165. package/dist/src/database/migration/create/index.d.ts +19 -0
  166. package/dist/src/database/migration/create/index.d.ts.map +1 -0
  167. package/dist/src/database/migration/create/index.js +102 -0
  168. package/dist/src/database/migration/create/index.js.map +1 -0
  169. package/dist/src/database/migration/create/schema-model.d.ts +99 -0
  170. package/dist/src/database/migration/create/schema-model.d.ts.map +1 -0
  171. package/dist/src/database/migration/create/schema-model.js +24 -0
  172. package/dist/src/database/migration/create/schema-model.js.map +1 -0
  173. package/dist/src/database/migration/create/type-mapper.d.ts +13 -0
  174. package/dist/src/database/migration/create/type-mapper.d.ts.map +1 -0
  175. package/dist/src/database/migration/create/type-mapper.js +293 -0
  176. package/dist/src/database/migration/create/type-mapper.js.map +1 -0
  177. package/dist/src/database/migration/index.d.ts +33 -0
  178. package/dist/src/database/migration/index.d.ts.map +1 -0
  179. package/dist/src/database/migration/index.js +165 -0
  180. package/dist/src/database/migration/index.js.map +1 -0
  181. package/dist/src/database/migration/maintenance.d.ts +26 -0
  182. package/dist/src/database/migration/maintenance.d.ts.map +1 -0
  183. package/dist/src/database/migration/maintenance.js +65 -0
  184. package/dist/src/database/migration/maintenance.js.map +1 -0
  185. package/dist/src/database/query.d.ts +79 -0
  186. package/dist/src/database/query.d.ts.map +1 -0
  187. package/dist/src/database/query.js +435 -0
  188. package/dist/src/database/query.js.map +1 -0
  189. package/dist/src/database/schema.d.ts +147 -0
  190. package/dist/src/database/schema.d.ts.map +1 -0
  191. package/dist/src/database/schema.js +709 -0
  192. package/dist/src/database/schema.js.map +1 -0
  193. package/dist/src/database/session.d.ts +63 -0
  194. package/dist/src/database/session.d.ts.map +1 -0
  195. package/dist/src/database/session.js +226 -0
  196. package/dist/src/database/session.js.map +1 -0
  197. package/dist/src/database/sql.d.ts +37 -0
  198. package/dist/src/database/sql.d.ts.map +1 -0
  199. package/dist/src/database/sql.js +143 -0
  200. package/dist/src/database/sql.js.map +1 -0
  201. package/dist/src/database/values.d.ts +6 -0
  202. package/dist/src/database/values.d.ts.map +1 -0
  203. package/dist/src/database/values.js +237 -0
  204. package/dist/src/database/values.js.map +1 -0
  205. package/dist/src/devconsole/controller.d.ts +11 -0
  206. package/dist/src/devconsole/controller.d.ts.map +1 -0
  207. package/dist/src/devconsole/controller.js +78 -0
  208. package/dist/src/devconsole/controller.js.map +1 -0
  209. package/dist/src/devconsole/generated/devconsole.d.ts +306 -0
  210. package/dist/src/devconsole/generated/devconsole.d.ts.map +1 -0
  211. package/dist/src/devconsole/generated/devconsole.js +4029 -0
  212. package/dist/src/devconsole/generated/devconsole.js.map +1 -0
  213. package/dist/src/devconsole/index.d.ts +10 -0
  214. package/dist/src/devconsole/index.d.ts.map +1 -0
  215. package/dist/src/devconsole/index.js +26 -0
  216. package/dist/src/devconsole/index.js.map +1 -0
  217. package/dist/src/devconsole/observers.d.ts +4 -0
  218. package/dist/src/devconsole/observers.d.ts.map +1 -0
  219. package/dist/src/devconsole/observers.js +170 -0
  220. package/dist/src/devconsole/observers.js.map +1 -0
  221. package/dist/src/devconsole/runtime.d.ts +16 -0
  222. package/dist/src/devconsole/runtime.d.ts.map +1 -0
  223. package/dist/src/devconsole/runtime.js +48 -0
  224. package/dist/src/devconsole/runtime.js.map +1 -0
  225. package/dist/src/devconsole/security.d.ts +8 -0
  226. package/dist/src/devconsole/security.d.ts.map +1 -0
  227. package/dist/src/devconsole/security.js +33 -0
  228. package/dist/src/devconsole/security.js.map +1 -0
  229. package/dist/src/devconsole/server.d.ts +25 -0
  230. package/dist/src/devconsole/server.d.ts.map +1 -0
  231. package/dist/src/devconsole/server.js +452 -0
  232. package/dist/src/devconsole/server.js.map +1 -0
  233. package/dist/src/devconsole/store.d.ts +111 -0
  234. package/dist/src/devconsole/store.d.ts.map +1 -0
  235. package/dist/src/devconsole/store.js +177 -0
  236. package/dist/src/devconsole/store.js.map +1 -0
  237. package/dist/src/di/container.d.ts +38 -0
  238. package/dist/src/di/container.d.ts.map +1 -0
  239. package/dist/src/di/container.js +252 -0
  240. package/dist/src/di/container.js.map +1 -0
  241. package/dist/src/di/errors.d.ts +18 -0
  242. package/dist/src/di/errors.d.ts.map +1 -0
  243. package/dist/src/di/errors.js +71 -0
  244. package/dist/src/di/errors.js.map +1 -0
  245. package/dist/src/di/index.d.ts +5 -0
  246. package/dist/src/di/index.d.ts.map +1 -0
  247. package/dist/src/di/index.js +10 -0
  248. package/dist/src/di/index.js.map +1 -0
  249. package/dist/src/di/module.d.ts +29 -0
  250. package/dist/src/di/module.d.ts.map +1 -0
  251. package/dist/src/di/module.js +42 -0
  252. package/dist/src/di/module.js.map +1 -0
  253. package/dist/src/di/provider.d.ts +34 -0
  254. package/dist/src/di/provider.d.ts.map +1 -0
  255. package/dist/src/di/provider.js +24 -0
  256. package/dist/src/di/provider.js.map +1 -0
  257. package/dist/src/env.d.ts +122 -0
  258. package/dist/src/env.d.ts.map +1 -0
  259. package/dist/src/env.js +61 -0
  260. package/dist/src/env.js.map +1 -0
  261. package/dist/src/events/event-bus.d.ts +26 -0
  262. package/dist/src/events/event-bus.d.ts.map +1 -0
  263. package/dist/src/events/event-bus.js +67 -0
  264. package/dist/src/events/event-bus.js.map +1 -0
  265. package/dist/src/events/index.d.ts +2 -0
  266. package/dist/src/events/index.d.ts.map +1 -0
  267. package/dist/src/events/index.js +7 -0
  268. package/dist/src/events/index.js.map +1 -0
  269. package/dist/src/health/healthcheck.controller.d.ts +9 -0
  270. package/dist/src/health/healthcheck.controller.d.ts.map +1 -0
  271. package/dist/src/health/healthcheck.controller.js +33 -0
  272. package/dist/src/health/healthcheck.controller.js.map +1 -0
  273. package/dist/src/health/healthcheck.service.d.ts +13 -0
  274. package/dist/src/health/healthcheck.service.d.ts.map +1 -0
  275. package/dist/src/health/healthcheck.service.js +37 -0
  276. package/dist/src/health/healthcheck.service.js.map +1 -0
  277. package/dist/src/health/index.d.ts +3 -0
  278. package/dist/src/health/index.d.ts.map +1 -0
  279. package/dist/src/health/index.js +8 -0
  280. package/dist/src/health/index.js.map +1 -0
  281. package/dist/src/helpers/async/context.d.ts +10 -0
  282. package/dist/src/helpers/async/context.d.ts.map +1 -0
  283. package/dist/src/helpers/async/context.js +52 -0
  284. package/dist/src/helpers/async/context.js.map +1 -0
  285. package/dist/src/helpers/async/process.d.ts +16 -0
  286. package/dist/src/helpers/async/process.d.ts.map +1 -0
  287. package/dist/src/helpers/async/process.js +62 -0
  288. package/dist/src/helpers/async/process.js.map +1 -0
  289. package/dist/src/helpers/async/promise.d.ts +11 -0
  290. package/dist/src/helpers/async/promise.d.ts.map +1 -0
  291. package/dist/src/helpers/async/promise.js +32 -0
  292. package/dist/src/helpers/async/promise.js.map +1 -0
  293. package/dist/src/helpers/data/array.d.ts +5 -0
  294. package/dist/src/helpers/data/array.d.ts.map +1 -0
  295. package/dist/src/helpers/data/array.js +27 -0
  296. package/dist/src/helpers/data/array.js.map +1 -0
  297. package/dist/src/helpers/data/objects.d.ts +13 -0
  298. package/dist/src/helpers/data/objects.d.ts.map +1 -0
  299. package/dist/src/helpers/data/objects.js +55 -0
  300. package/dist/src/helpers/data/objects.js.map +1 -0
  301. package/dist/src/helpers/data/serialization.d.ts +5 -0
  302. package/dist/src/helpers/data/serialization.d.ts.map +1 -0
  303. package/dist/src/helpers/data/serialization.js +25 -0
  304. package/dist/src/helpers/data/serialization.js.map +1 -0
  305. package/dist/src/helpers/data/transformer.d.ts +13 -0
  306. package/dist/src/helpers/data/transformer.d.ts.map +1 -0
  307. package/dist/src/helpers/data/transformer.js +50 -0
  308. package/dist/src/helpers/data/transformer.js.map +1 -0
  309. package/dist/src/helpers/index.d.ts +19 -0
  310. package/dist/src/helpers/index.d.ts.map +1 -0
  311. package/dist/src/helpers/index.js +30 -0
  312. package/dist/src/helpers/index.js.map +1 -0
  313. package/dist/src/helpers/io/package.d.ts +10 -0
  314. package/dist/src/helpers/io/package.d.ts.map +1 -0
  315. package/dist/src/helpers/io/package.js +35 -0
  316. package/dist/src/helpers/io/package.js.map +1 -0
  317. package/dist/src/helpers/io/stream.d.ts +18 -0
  318. package/dist/src/helpers/io/stream.d.ts.map +1 -0
  319. package/dist/src/helpers/io/stream.js +131 -0
  320. package/dist/src/helpers/io/stream.js.map +1 -0
  321. package/dist/src/helpers/redis/broadcast.d.ts +15 -0
  322. package/dist/src/helpers/redis/broadcast.d.ts.map +1 -0
  323. package/dist/src/helpers/redis/broadcast.js +93 -0
  324. package/dist/src/helpers/redis/broadcast.js.map +1 -0
  325. package/dist/src/helpers/redis/cache.d.ts +20 -0
  326. package/dist/src/helpers/redis/cache.d.ts.map +1 -0
  327. package/dist/src/helpers/redis/cache.js +57 -0
  328. package/dist/src/helpers/redis/cache.js.map +1 -0
  329. package/dist/src/helpers/redis/mutex.d.ts +45 -0
  330. package/dist/src/helpers/redis/mutex.d.ts.map +1 -0
  331. package/dist/src/helpers/redis/mutex.js +446 -0
  332. package/dist/src/helpers/redis/mutex.js.map +1 -0
  333. package/dist/src/helpers/redis/redis.d.ts +12 -0
  334. package/dist/src/helpers/redis/redis.d.ts.map +1 -0
  335. package/dist/src/helpers/redis/redis.js +62 -0
  336. package/dist/src/helpers/redis/redis.js.map +1 -0
  337. package/dist/src/helpers/security/crypto.d.ts +31 -0
  338. package/dist/src/helpers/security/crypto.d.ts.map +1 -0
  339. package/dist/src/helpers/security/crypto.js +108 -0
  340. package/dist/src/helpers/security/crypto.js.map +1 -0
  341. package/dist/src/helpers/security/validation.d.ts +3 -0
  342. package/dist/src/helpers/security/validation.d.ts.map +1 -0
  343. package/dist/src/helpers/security/validation.js +14 -0
  344. package/dist/src/helpers/security/validation.js.map +1 -0
  345. package/dist/src/helpers/utils/date.d.ts +4 -0
  346. package/dist/src/helpers/utils/date.d.ts.map +1 -0
  347. package/dist/src/helpers/utils/date.js +16 -0
  348. package/dist/src/helpers/utils/date.js.map +1 -0
  349. package/dist/src/helpers/utils/error.d.ts +20 -0
  350. package/dist/src/helpers/utils/error.d.ts.map +1 -0
  351. package/dist/src/helpers/utils/error.js +164 -0
  352. package/dist/src/helpers/utils/error.js.map +1 -0
  353. package/dist/src/helpers/utils/uuid.d.ts +5 -0
  354. package/dist/src/helpers/utils/uuid.d.ts.map +1 -0
  355. package/dist/src/helpers/utils/uuid.js +13 -0
  356. package/dist/src/helpers/utils/uuid.js.map +1 -0
  357. package/dist/src/http/auth.d.ts +20 -0
  358. package/dist/src/http/auth.d.ts.map +1 -0
  359. package/dist/src/http/auth.js +68 -0
  360. package/dist/src/http/auth.js.map +1 -0
  361. package/dist/src/http/base.d.ts +57 -0
  362. package/dist/src/http/base.d.ts.map +1 -0
  363. package/dist/src/http/base.js +331 -0
  364. package/dist/src/http/base.js.map +1 -0
  365. package/dist/src/http/context.d.ts +6 -0
  366. package/dist/src/http/context.d.ts.map +1 -0
  367. package/dist/src/http/context.js +26 -0
  368. package/dist/src/http/context.js.map +1 -0
  369. package/dist/src/http/cors.d.ts +25 -0
  370. package/dist/src/http/cors.d.ts.map +1 -0
  371. package/dist/src/http/cors.js +124 -0
  372. package/dist/src/http/cors.js.map +1 -0
  373. package/dist/src/http/decorators.d.ts +64 -0
  374. package/dist/src/http/decorators.d.ts.map +1 -0
  375. package/dist/src/http/decorators.js +102 -0
  376. package/dist/src/http/decorators.js.map +1 -0
  377. package/dist/src/http/errors.d.ts +50 -0
  378. package/dist/src/http/errors.d.ts.map +1 -0
  379. package/dist/src/http/errors.js +158 -0
  380. package/dist/src/http/errors.js.map +1 -0
  381. package/dist/src/http/index.d.ts +31 -0
  382. package/dist/src/http/index.d.ts.map +1 -0
  383. package/dist/src/http/index.js +33 -0
  384. package/dist/src/http/index.js.map +1 -0
  385. package/dist/src/http/middleware.d.ts +12 -0
  386. package/dist/src/http/middleware.d.ts.map +1 -0
  387. package/dist/src/http/middleware.js +31 -0
  388. package/dist/src/http/middleware.js.map +1 -0
  389. package/dist/src/http/parameter-resolvers.d.ts +3 -0
  390. package/dist/src/http/parameter-resolvers.d.ts.map +1 -0
  391. package/dist/src/http/parameter-resolvers.js +8 -0
  392. package/dist/src/http/parameter-resolvers.js.map +1 -0
  393. package/dist/src/http/request-logging.d.ts +34 -0
  394. package/dist/src/http/request-logging.d.ts.map +1 -0
  395. package/dist/src/http/request-logging.js +130 -0
  396. package/dist/src/http/request-logging.js.map +1 -0
  397. package/dist/src/http/request.d.ts +69 -0
  398. package/dist/src/http/request.d.ts.map +1 -0
  399. package/dist/src/http/request.js +366 -0
  400. package/dist/src/http/request.js.map +1 -0
  401. package/dist/src/http/response.d.ts +98 -0
  402. package/dist/src/http/response.d.ts.map +1 -0
  403. package/dist/src/http/response.js +292 -0
  404. package/dist/src/http/response.js.map +1 -0
  405. package/dist/src/http/router.d.ts +100 -0
  406. package/dist/src/http/router.d.ts.map +1 -0
  407. package/dist/src/http/router.js +1085 -0
  408. package/dist/src/http/router.js.map +1 -0
  409. package/dist/src/http/startup-logging.d.ts +8 -0
  410. package/dist/src/http/startup-logging.d.ts.map +1 -0
  411. package/dist/src/http/startup-logging.js +55 -0
  412. package/dist/src/http/startup-logging.js.map +1 -0
  413. package/dist/src/http/static-files.d.ts +15 -0
  414. package/dist/src/http/static-files.d.ts.map +1 -0
  415. package/dist/src/http/static-files.js +110 -0
  416. package/dist/src/http/static-files.js.map +1 -0
  417. package/dist/src/http/store.d.ts +8 -0
  418. package/dist/src/http/store.d.ts.map +1 -0
  419. package/dist/src/http/store.js +47 -0
  420. package/dist/src/http/store.js.map +1 -0
  421. package/dist/src/http/types.d.ts +23 -0
  422. package/dist/src/http/types.d.ts.map +1 -0
  423. package/dist/src/http/types.js +3 -0
  424. package/dist/src/http/types.js.map +1 -0
  425. package/dist/src/http/upgrade.d.ts +22 -0
  426. package/dist/src/http/upgrade.d.ts.map +1 -0
  427. package/dist/src/http/upgrade.js +164 -0
  428. package/dist/src/http/upgrade.js.map +1 -0
  429. package/dist/src/http/uploads.d.ts +36 -0
  430. package/dist/src/http/uploads.d.ts.map +1 -0
  431. package/dist/src/http/uploads.js +287 -0
  432. package/dist/src/http/uploads.js.map +1 -0
  433. package/dist/src/http/workflow.d.ts +34 -0
  434. package/dist/src/http/workflow.d.ts.map +1 -0
  435. package/dist/src/http/workflow.js +40 -0
  436. package/dist/src/http/workflow.js.map +1 -0
  437. package/dist/src/index.d.ts +21 -0
  438. package/dist/src/index.d.ts.map +1 -0
  439. package/dist/src/index.js +88 -0
  440. package/dist/src/index.js.map +1 -0
  441. package/dist/src/openapi/controller.d.ts +9 -0
  442. package/dist/src/openapi/controller.d.ts.map +1 -0
  443. package/dist/src/openapi/controller.js +45 -0
  444. package/dist/src/openapi/controller.js.map +1 -0
  445. package/dist/src/openapi/index.d.ts +5 -0
  446. package/dist/src/openapi/index.d.ts.map +1 -0
  447. package/dist/src/openapi/index.js +21 -0
  448. package/dist/src/openapi/index.js.map +1 -0
  449. package/dist/src/openapi/schema.d.ts +26 -0
  450. package/dist/src/openapi/schema.d.ts.map +1 -0
  451. package/dist/src/openapi/schema.js +1128 -0
  452. package/dist/src/openapi/schema.js.map +1 -0
  453. package/dist/src/openapi/serializer.d.ts +16 -0
  454. package/dist/src/openapi/serializer.d.ts.map +1 -0
  455. package/dist/src/openapi/serializer.js +506 -0
  456. package/dist/src/openapi/serializer.js.map +1 -0
  457. package/dist/src/openapi/types.d.ts +84 -0
  458. package/dist/src/openapi/types.d.ts.map +1 -0
  459. package/dist/src/openapi/types.js +5 -0
  460. package/dist/src/openapi/types.js.map +1 -0
  461. package/dist/src/reflection/annotations.d.ts +15 -0
  462. package/dist/src/reflection/annotations.d.ts.map +1 -0
  463. package/dist/src/reflection/annotations.js +228 -0
  464. package/dist/src/reflection/annotations.js.map +1 -0
  465. package/dist/src/reflection/conversion.d.ts +15 -0
  466. package/dist/src/reflection/conversion.d.ts.map +1 -0
  467. package/dist/src/reflection/conversion.js +360 -0
  468. package/dist/src/reflection/conversion.js.map +1 -0
  469. package/dist/src/reflection/deserializer.d.ts +15 -0
  470. package/dist/src/reflection/deserializer.d.ts.map +1 -0
  471. package/dist/src/reflection/deserializer.js +42 -0
  472. package/dist/src/reflection/deserializer.js.map +1 -0
  473. package/dist/src/reflection/entity.d.ts +9 -0
  474. package/dist/src/reflection/entity.d.ts.map +1 -0
  475. package/dist/src/reflection/entity.js +74 -0
  476. package/dist/src/reflection/entity.js.map +1 -0
  477. package/dist/src/reflection/errors.d.ts +8 -0
  478. package/dist/src/reflection/errors.d.ts.map +1 -0
  479. package/dist/src/reflection/errors.js +21 -0
  480. package/dist/src/reflection/errors.js.map +1 -0
  481. package/dist/src/reflection/index.d.ts +8 -0
  482. package/dist/src/reflection/index.d.ts.map +1 -0
  483. package/dist/src/reflection/index.js +13 -0
  484. package/dist/src/reflection/index.js.map +1 -0
  485. package/dist/src/reflection/metadata-store.d.ts +14 -0
  486. package/dist/src/reflection/metadata-store.d.ts.map +1 -0
  487. package/dist/src/reflection/metadata-store.js +18 -0
  488. package/dist/src/reflection/metadata-store.js.map +1 -0
  489. package/dist/src/reflection/model.d.ts +271 -0
  490. package/dist/src/reflection/model.d.ts.map +1 -0
  491. package/dist/src/reflection/model.js +36 -0
  492. package/dist/src/reflection/model.js.map +1 -0
  493. package/dist/src/reflection/reflection-class.d.ts +60 -0
  494. package/dist/src/reflection/reflection-class.d.ts.map +1 -0
  495. package/dist/src/reflection/reflection-class.js +263 -0
  496. package/dist/src/reflection/reflection-class.js.map +1 -0
  497. package/dist/src/reflection/type-utils.d.ts +34 -0
  498. package/dist/src/reflection/type-utils.d.ts.map +1 -0
  499. package/dist/src/reflection/type-utils.js +485 -0
  500. package/dist/src/reflection/type-utils.js.map +1 -0
  501. package/dist/src/reflection.d.ts +2 -0
  502. package/dist/src/reflection.d.ts.map +1 -0
  503. package/dist/src/reflection.js +5 -0
  504. package/dist/src/reflection.js.map +1 -0
  505. package/dist/src/services/cli.d.ts +9 -0
  506. package/dist/src/services/cli.d.ts.map +1 -0
  507. package/dist/src/services/cli.js +47 -0
  508. package/dist/src/services/cli.js.map +1 -0
  509. package/dist/src/services/index.d.ts +8 -0
  510. package/dist/src/services/index.d.ts.map +1 -0
  511. package/dist/src/services/index.js +13 -0
  512. package/dist/src/services/index.js.map +1 -0
  513. package/dist/src/services/leader.d.ts +31 -0
  514. package/dist/src/services/leader.d.ts.map +1 -0
  515. package/dist/src/services/leader.js +176 -0
  516. package/dist/src/services/leader.js.map +1 -0
  517. package/dist/src/services/logger.d.ts +60 -0
  518. package/dist/src/services/logger.d.ts.map +1 -0
  519. package/dist/src/services/logger.js +349 -0
  520. package/dist/src/services/logger.js.map +1 -0
  521. package/dist/src/services/mail/index.d.ts +57 -0
  522. package/dist/src/services/mail/index.d.ts.map +1 -0
  523. package/dist/src/services/mail/index.js +89 -0
  524. package/dist/src/services/mail/index.js.map +1 -0
  525. package/dist/src/services/mail/postmark.d.ts +11 -0
  526. package/dist/src/services/mail/postmark.d.ts.map +1 -0
  527. package/dist/src/services/mail/postmark.js +41 -0
  528. package/dist/src/services/mail/postmark.js.map +1 -0
  529. package/dist/src/services/mail/smtp.d.ts +11 -0
  530. package/dist/src/services/mail/smtp.d.ts.map +1 -0
  531. package/dist/src/services/mail/smtp.js +50 -0
  532. package/dist/src/services/mail/smtp.js.map +1 -0
  533. package/dist/src/services/mesh-client/index.d.ts +9 -0
  534. package/dist/src/services/mesh-client/index.d.ts.map +1 -0
  535. package/dist/src/services/mesh-client/index.js +18 -0
  536. package/dist/src/services/mesh-client/index.js.map +1 -0
  537. package/dist/src/services/mesh-client/mesh-client-redis-registry.d.ts +23 -0
  538. package/dist/src/services/mesh-client/mesh-client-redis-registry.d.ts.map +1 -0
  539. package/dist/src/services/mesh-client/mesh-client-redis-registry.js +360 -0
  540. package/dist/src/services/mesh-client/mesh-client-redis-registry.js.map +1 -0
  541. package/dist/src/services/mesh-client/mesh-client-registry.d.ts +16 -0
  542. package/dist/src/services/mesh-client/mesh-client-registry.d.ts.map +1 -0
  543. package/dist/src/services/mesh-client/mesh-client-registry.js +44 -0
  544. package/dist/src/services/mesh-client/mesh-client-registry.js.map +1 -0
  545. package/dist/src/services/mesh-client/mesh-client-service.d.ts +88 -0
  546. package/dist/src/services/mesh-client/mesh-client-service.d.ts.map +1 -0
  547. package/dist/src/services/mesh-client/mesh-client-service.js +222 -0
  548. package/dist/src/services/mesh-client/mesh-client-service.js.map +1 -0
  549. package/dist/src/services/mesh-client/mesh-srpc-server.d.ts +95 -0
  550. package/dist/src/services/mesh-client/mesh-srpc-server.d.ts.map +1 -0
  551. package/dist/src/services/mesh-client/mesh-srpc-server.js +475 -0
  552. package/dist/src/services/mesh-client/mesh-srpc-server.js.map +1 -0
  553. package/dist/src/services/mesh-client/types.d.ts +36 -0
  554. package/dist/src/services/mesh-client/types.d.ts.map +1 -0
  555. package/dist/src/services/mesh-client/types.js +38 -0
  556. package/dist/src/services/mesh-client/types.js.map +1 -0
  557. package/dist/src/services/mesh.d.ts +73 -0
  558. package/dist/src/services/mesh.d.ts.map +1 -0
  559. package/dist/src/services/mesh.js +511 -0
  560. package/dist/src/services/mesh.js.map +1 -0
  561. package/dist/src/services/worker/entity.d.ts +26 -0
  562. package/dist/src/services/worker/entity.d.ts.map +1 -0
  563. package/dist/src/services/worker/entity.js +30 -0
  564. package/dist/src/services/worker/entity.js.map +1 -0
  565. package/dist/src/services/worker/index.d.ts +25 -0
  566. package/dist/src/services/worker/index.d.ts.map +1 -0
  567. package/dist/src/services/worker/index.js +52 -0
  568. package/dist/src/services/worker/index.js.map +1 -0
  569. package/dist/src/services/worker/observer.d.ts +13 -0
  570. package/dist/src/services/worker/observer.d.ts.map +1 -0
  571. package/dist/src/services/worker/observer.js +22 -0
  572. package/dist/src/services/worker/observer.js.map +1 -0
  573. package/dist/src/services/worker/queue.d.ts +38 -0
  574. package/dist/src/services/worker/queue.d.ts.map +1 -0
  575. package/dist/src/services/worker/queue.js +227 -0
  576. package/dist/src/services/worker/queue.js.map +1 -0
  577. package/dist/src/services/worker/recorder.d.ts +17 -0
  578. package/dist/src/services/worker/recorder.d.ts.map +1 -0
  579. package/dist/src/services/worker/recorder.js +88 -0
  580. package/dist/src/services/worker/recorder.js.map +1 -0
  581. package/dist/src/services/worker/runner.d.ts +37 -0
  582. package/dist/src/services/worker/runner.d.ts.map +1 -0
  583. package/dist/src/services/worker/runner.js +319 -0
  584. package/dist/src/services/worker/runner.js.map +1 -0
  585. package/dist/src/services/worker/types.d.ts +63 -0
  586. package/dist/src/services/worker/types.d.ts.map +1 -0
  587. package/dist/src/services/worker/types.js +38 -0
  588. package/dist/src/services/worker/types.js.map +1 -0
  589. package/dist/src/srpc/SrpcByteStream.d.ts +60 -0
  590. package/dist/src/srpc/SrpcByteStream.d.ts.map +1 -0
  591. package/dist/src/srpc/SrpcByteStream.js +237 -0
  592. package/dist/src/srpc/SrpcByteStream.js.map +1 -0
  593. package/dist/src/srpc/SrpcClient.d.ts +67 -0
  594. package/dist/src/srpc/SrpcClient.d.ts.map +1 -0
  595. package/dist/src/srpc/SrpcClient.js +406 -0
  596. package/dist/src/srpc/SrpcClient.js.map +1 -0
  597. package/dist/src/srpc/SrpcServer.d.ts +56 -0
  598. package/dist/src/srpc/SrpcServer.d.ts.map +1 -0
  599. package/dist/src/srpc/SrpcServer.js +519 -0
  600. package/dist/src/srpc/SrpcServer.js.map +1 -0
  601. package/dist/src/srpc/index.d.ts +9 -0
  602. package/dist/src/srpc/index.d.ts.map +1 -0
  603. package/dist/src/srpc/index.js +17 -0
  604. package/dist/src/srpc/index.js.map +1 -0
  605. package/dist/src/srpc/observer.d.ts +21 -0
  606. package/dist/src/srpc/observer.d.ts.map +1 -0
  607. package/dist/src/srpc/observer.js +22 -0
  608. package/dist/src/srpc/observer.js.map +1 -0
  609. package/dist/src/srpc/types.d.ts +92 -0
  610. package/dist/src/srpc/types.d.ts.map +1 -0
  611. package/dist/src/srpc/types.js +28 -0
  612. package/dist/src/srpc/types.js.map +1 -0
  613. package/dist/src/telemetry/index.d.ts +3 -0
  614. package/dist/src/telemetry/index.d.ts.map +1 -0
  615. package/dist/src/telemetry/index.js +22 -0
  616. package/dist/src/telemetry/index.js.map +1 -0
  617. package/dist/src/telemetry/otel/helpers.d.ts +45 -0
  618. package/dist/src/telemetry/otel/helpers.d.ts.map +1 -0
  619. package/dist/src/telemetry/otel/helpers.js +142 -0
  620. package/dist/src/telemetry/otel/helpers.js.map +1 -0
  621. package/dist/src/telemetry/otel/index.d.ts +22 -0
  622. package/dist/src/telemetry/otel/index.d.ts.map +1 -0
  623. package/dist/src/telemetry/otel/index.js +268 -0
  624. package/dist/src/telemetry/otel/index.js.map +1 -0
  625. package/dist/src/telemetry/otel/metrics.controller.d.ts +5 -0
  626. package/dist/src/telemetry/otel/metrics.controller.d.ts.map +1 -0
  627. package/dist/src/telemetry/otel/metrics.controller.js +82 -0
  628. package/dist/src/telemetry/otel/metrics.controller.js.map +1 -0
  629. package/dist/src/telemetry/otel/metrics.d.ts +2 -0
  630. package/dist/src/telemetry/otel/metrics.d.ts.map +1 -0
  631. package/dist/src/telemetry/otel/metrics.js +16 -0
  632. package/dist/src/telemetry/otel/metrics.js.map +1 -0
  633. package/dist/src/telemetry/sentry.d.ts +9 -0
  634. package/dist/src/telemetry/sentry.d.ts.map +1 -0
  635. package/dist/src/telemetry/sentry.js +63 -0
  636. package/dist/src/telemetry/sentry.js.map +1 -0
  637. package/dist/src/testing/database-readiness.d.ts +11 -0
  638. package/dist/src/testing/database-readiness.d.ts.map +1 -0
  639. package/dist/src/testing/database-readiness.js +102 -0
  640. package/dist/src/testing/database-readiness.js.map +1 -0
  641. package/dist/src/testing/expect.d.ts +21 -0
  642. package/dist/src/testing/expect.d.ts.map +1 -0
  643. package/dist/src/testing/expect.js +110 -0
  644. package/dist/src/testing/expect.js.map +1 -0
  645. package/dist/src/testing/fixtures.d.ts +18 -0
  646. package/dist/src/testing/fixtures.d.ts.map +1 -0
  647. package/dist/src/testing/fixtures.js +46 -0
  648. package/dist/src/testing/fixtures.js.map +1 -0
  649. package/dist/src/testing/index.d.ts +143 -0
  650. package/dist/src/testing/index.d.ts.map +1 -0
  651. package/dist/src/testing/index.js +993 -0
  652. package/dist/src/testing/index.js.map +1 -0
  653. package/dist/src/testing/mysql-session-manager-process.d.ts +3 -0
  654. package/dist/src/testing/mysql-session-manager-process.d.ts.map +1 -0
  655. package/dist/src/testing/mysql-session-manager-process.js +77 -0
  656. package/dist/src/testing/mysql-session-manager-process.js.map +1 -0
  657. package/dist/src/testing/mysql-session-manager.d.ts +59 -0
  658. package/dist/src/testing/mysql-session-manager.d.ts.map +1 -0
  659. package/dist/src/testing/mysql-session-manager.js +910 -0
  660. package/dist/src/testing/mysql-session-manager.js.map +1 -0
  661. package/dist/src/testing/sql.d.ts +47 -0
  662. package/dist/src/testing/sql.d.ts.map +1 -0
  663. package/dist/src/testing/sql.js +313 -0
  664. package/dist/src/testing/sql.js.map +1 -0
  665. package/dist/src/type-compiler/go/ast_expression.go +161 -0
  666. package/dist/src/type-compiler/go/ast_metadata.go +355 -0
  667. package/dist/src/type-compiler/go/collect.go +806 -0
  668. package/dist/src/type-compiler/go/emission_plan.go +205 -0
  669. package/dist/src/type-compiler/go/emit_ast.go +406 -0
  670. package/dist/src/type-compiler/go/emit_ast_test.go +248 -0
  671. package/dist/src/type-compiler/go/go.mod +10 -0
  672. package/dist/src/type-compiler/go/plugin.go +308 -0
  673. package/dist/src/type-compiler/go/plugin_test.go +752 -0
  674. package/dist/src/type-compiler/go/precompute.go +86 -0
  675. package/dist/src/type-compiler/go/receive_type.go +837 -0
  676. package/dist/src/type-compiler/go/resolve.go +265 -0
  677. package/dist/src/type-compiler/go/source_scan.go +51 -0
  678. package/dist/src/type-compiler/go/text_parse.go +671 -0
  679. package/dist/src/type-compiler/go/type_expr.go +1227 -0
  680. package/dist/src/type-compiler/go/typia_expr.go +2119 -0
  681. package/dist/src/type-compiler/index.cjs +6 -0
  682. package/dist/src/types/index.d.ts +7 -0
  683. package/dist/src/types/index.d.ts.map +1 -0
  684. package/dist/src/types/index.js +14 -0
  685. package/dist/src/types/index.js.map +1 -0
  686. package/dist/src/types/phone.d.ts +6 -0
  687. package/dist/src/types/phone.d.ts.map +1 -0
  688. package/dist/src/types/phone.js +64 -0
  689. package/dist/src/types/phone.js.map +1 -0
  690. package/dist/src/types/primitives.d.ts +33 -0
  691. package/dist/src/types/primitives.d.ts.map +1 -0
  692. package/dist/src/types/primitives.js +5 -0
  693. package/dist/src/types/primitives.js.map +1 -0
  694. package/dist/src/types/runtime.d.ts +5 -0
  695. package/dist/src/types/runtime.d.ts.map +1 -0
  696. package/dist/src/types/runtime.js +20 -0
  697. package/dist/src/types/runtime.js.map +1 -0
  698. package/dist/src/types/type-annotations.d.ts +28 -0
  699. package/dist/src/types/type-annotations.d.ts.map +1 -0
  700. package/dist/src/types/type-annotations.js +33 -0
  701. package/dist/src/types/type-annotations.js.map +1 -0
  702. package/dist/src/types.d.ts +2 -0
  703. package/dist/src/types.d.ts.map +1 -0
  704. package/dist/src/types.js +7 -0
  705. package/dist/src/types.js.map +1 -0
  706. package/docs/.vitepress/config.mts +85 -0
  707. package/docs/content/CONTRIBUTING.md +53 -0
  708. package/docs/content/README-DEV.md +59 -0
  709. package/docs/content/README.md +52 -0
  710. package/docs/content/authentication.md +213 -0
  711. package/docs/content/cli.md +214 -0
  712. package/docs/content/configuration.md +191 -0
  713. package/docs/content/database.md +476 -0
  714. package/docs/content/devconsole.md +148 -0
  715. package/docs/content/di.md +212 -0
  716. package/docs/content/documentation-plan.md +182 -0
  717. package/docs/content/env.md +120 -0
  718. package/docs/content/getting-started.md +324 -0
  719. package/docs/content/health.md +64 -0
  720. package/docs/content/helpers.md +294 -0
  721. package/docs/content/http.md +402 -0
  722. package/docs/content/index.md +109 -0
  723. package/docs/content/leader-service.md +98 -0
  724. package/docs/content/logging.md +225 -0
  725. package/docs/content/mail.md +171 -0
  726. package/docs/content/mesh-client.md +333 -0
  727. package/docs/content/mesh-service.md +255 -0
  728. package/docs/content/migrations.md +190 -0
  729. package/docs/content/openapi.md +134 -0
  730. package/docs/content/overview.md +98 -0
  731. package/docs/content/public/images/devconsole/01-dashboard.png +0 -0
  732. package/docs/content/public/images/devconsole/02-routes.png +0 -0
  733. package/docs/content/public/images/devconsole/03-openapi.png +0 -0
  734. package/docs/content/public/images/devconsole/04-requests.png +0 -0
  735. package/docs/content/public/images/devconsole/05-srpc.png +0 -0
  736. package/docs/content/public/images/devconsole/06-database.png +0 -0
  737. package/docs/content/public/images/devconsole/06b-database-log.png +0 -0
  738. package/docs/content/public/images/devconsole/07-health.png +0 -0
  739. package/docs/content/public/images/devconsole/08-mutex.png +0 -0
  740. package/docs/content/public/images/devconsole/09-repl.png +0 -0
  741. package/docs/content/public/images/devconsole/10-workers.png +0 -0
  742. package/docs/content/public-api.md +84 -0
  743. package/docs/content/redis.md +174 -0
  744. package/docs/content/reflection.md +180 -0
  745. package/docs/content/release.md +100 -0
  746. package/docs/content/sql.md +121 -0
  747. package/docs/content/srpc.md +292 -0
  748. package/docs/content/telemetry.md +173 -0
  749. package/docs/content/testing.md +327 -0
  750. package/docs/content/type-reflection-architecture.md +149 -0
  751. package/docs/content/types.md +286 -0
  752. package/docs/content/uploads.md +145 -0
  753. package/docs/content/worker.md +182 -0
  754. package/docs/openapi.md +3 -0
  755. package/package.json +124 -0
  756. package/resources/proto/devconsole.proto +286 -0
  757. package/template-app/.env.development +10 -0
  758. package/template-app/gitignore.tmpl +11 -0
  759. package/template-app/package.json.tmpl +25 -0
  760. package/template-app/src/app.ts +13 -0
  761. package/template-app/src/config.ts +5 -0
  762. package/template-app/src/controllers/Example.controller.ts +19 -0
  763. package/template-app/src/database.ts +5 -0
  764. package/template-app/src/entities/Example.entity.ts +9 -0
  765. package/template-app/src/index.ts +7 -0
  766. package/template-app/src/migrations/.gitkeep +2 -0
  767. package/template-app/src/services/Example.service.ts +20 -0
  768. package/template-app/tests/app.spec.ts +8 -0
  769. package/template-app/tsconfig.json +26 -0
  770. package/template-app/tsconfig.test.json +5 -0
  771. package/types.d.ts +4 -0
@@ -0,0 +1,2119 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "math"
6
+ "sort"
7
+ "strconv"
8
+ "strings"
9
+
10
+ shimast "github.com/microsoft/typescript-go/shim/ast"
11
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
12
+ typiafactories "github.com/samchon/typia/packages/typia/native/core/factories"
13
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
14
+ )
15
+
16
+ func typeExprForNode(info *fileInfo, reg *registry, raw string, node *shimast.Node, pos int) string {
17
+ return typeExprForNodePreferred(info, reg, raw, node, pos, false)
18
+ }
19
+
20
+ func typeExprForNodePreferred(info *fileInfo, reg *registry, raw string, node *shimast.Node, pos int, preferTypia bool) string {
21
+ if preferTypia {
22
+ if expr, ok := preferredWrapperTypeExprForNode(info, reg, raw, node, pos); ok {
23
+ return expr
24
+ }
25
+ if expr, ok := preferredCachedAliasTypeExpr(info, reg, raw, pos); ok {
26
+ return expr
27
+ }
28
+ if expr, ok := preferredNullishAliasTypeExpr(info, reg, raw, pos); ok {
29
+ return expr
30
+ }
31
+ if expr, ok := preferredDateRootTypeExpr(info, reg, raw, pos); ok {
32
+ return expr
33
+ }
34
+ if expr, ok := preferredExternalImportedTypeExpr(info, raw); ok {
35
+ return expr
36
+ }
37
+ if expr, ok := preferredExternalImportedCompositeTypeExpr(info, reg, raw, pos); ok {
38
+ return expr
39
+ }
40
+ if expr, ok := preferredNamedInterfaceTypeExpr(info, reg, raw, pos); ok {
41
+ return expr
42
+ }
43
+ if canPreferTypiaTypeOnPreferredSurfaceAt(info, reg, raw, pos) {
44
+ if expr, ok := typiaTypeExprForNode(info, reg, raw, node, pos); ok {
45
+ return typiaSourceNamedExpr(info, reg, expr, raw)
46
+ }
47
+ }
48
+ }
49
+ if shouldUseTextTypeExpr(raw) {
50
+ return internalTypeExprAt(info, reg, raw, pos)
51
+ }
52
+ if shouldUseTypiaType(info, reg, raw) && canPreferTypiaType(info, reg, raw) {
53
+ if expr, ok := typiaTypeExprForNode(info, reg, raw, node, pos); ok {
54
+ return typiaSourceNamedExpr(info, reg, expr, raw)
55
+ }
56
+ }
57
+ return internalTypeExprAt(info, reg, raw, pos)
58
+ }
59
+
60
+ func preferredCachedAliasTypeExpr(info *fileInfo, reg *registry, raw string, pos int) (string, bool) {
61
+ raw = strings.TrimSpace(trimParens(raw))
62
+ if !isIdentifierName(raw) {
63
+ return "", false
64
+ }
65
+ alias, owner, ref, ok := resolveAliasRef(info, reg, raw)
66
+ if !ok || len(alias.params) != 0 {
67
+ return "", false
68
+ }
69
+ aliasName := raw
70
+ if ref != nil {
71
+ aliasName = ref.exportName
72
+ }
73
+ alias = ensureAliasMetadata(owner, reg, aliasName, alias)
74
+ if strings.TrimSpace(alias.metadataText) == "" {
75
+ return "", false
76
+ }
77
+ return aliasTypeExprCtx(owner, reg, alias, raw, &typeContext{seen: map[string]bool{}, pos: pos}), true
78
+ }
79
+
80
+ func preferredNullishAliasTypeExpr(info *fileInfo, reg *registry, raw string, pos int) (string, bool) {
81
+ types := []string{}
82
+ aliasCount, ok := collectNullishAliasTypeExprs(info, reg, raw, pos, &types)
83
+ if !ok || aliasCount != 1 || len(types) <= 1 {
84
+ return "", false
85
+ }
86
+ return "{kind: 12, types: [" + strings.Join(types, ", ") + "]}", true
87
+ }
88
+
89
+ func collectNullishAliasTypeExprs(info *fileInfo, reg *registry, raw string, pos int, types *[]string) (int, bool) {
90
+ raw = strings.TrimSpace(trimParens(raw))
91
+ parts := nonEmptyParts(splitTop(raw, "|"))
92
+ if len(parts) > 1 {
93
+ aliasCount := 0
94
+ for _, part := range parts {
95
+ count, ok := collectNullishAliasTypeExprs(info, reg, part, pos, types)
96
+ if !ok {
97
+ return 0, false
98
+ }
99
+ aliasCount += count
100
+ }
101
+ return aliasCount, true
102
+ }
103
+ switch raw {
104
+ case "null":
105
+ *types = append(*types, "{kind: 5}")
106
+ return 0, true
107
+ case "undefined":
108
+ *types = append(*types, "{kind: 4}")
109
+ return 0, true
110
+ default:
111
+ expr, ok := preferredCachedAliasTypeExpr(info, reg, raw, pos)
112
+ if !ok {
113
+ return 0, false
114
+ }
115
+ *types = append(*types, expr)
116
+ return 1, true
117
+ }
118
+ }
119
+
120
+ func preferredDateRootTypeExpr(info *fileInfo, reg *registry, raw string, pos int) (string, bool) {
121
+ if !sourceTypeIsDateRootType(info, reg, raw, &typeContext{seen: map[string]bool{}, pos: pos}, map[string]bool{}) {
122
+ return "", false
123
+ }
124
+ return internalTypeExprAt(info, reg, raw, pos), true
125
+ }
126
+
127
+ func preferredExternalImportedTypeExpr(info *fileInfo, raw string) (string, bool) {
128
+ raw = strings.TrimSpace(trimParens(raw))
129
+ if !isIdentifierName(raw) {
130
+ return "", false
131
+ }
132
+ ref, ok := info.imports[raw]
133
+ if !ok || !isExternalImportRef(ref) {
134
+ return "", false
135
+ }
136
+ return externalImportedTypeExpr(ref, raw), true
137
+ }
138
+
139
+ func preferredExternalImportedCompositeTypeExpr(info *fileInfo, reg *registry, raw string, pos int) (string, bool) {
140
+ raw = strings.TrimSpace(trimParens(raw))
141
+ if raw == "" || isIdentifierName(raw) {
142
+ return "", false
143
+ }
144
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
145
+ if typeContainsExternalImportReferenceInParts(info, reg, parts, map[string]bool{}) {
146
+ return internalTypeExprAt(info, reg, raw, pos), true
147
+ }
148
+ }
149
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
150
+ if typeContainsExternalImportReferenceInParts(info, reg, parts, map[string]bool{}) {
151
+ return internalTypeExprAt(info, reg, raw, pos), true
152
+ }
153
+ }
154
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
155
+ parts := nonEmptyParts(splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","))
156
+ if typeContainsExternalImportReferenceInParts(info, reg, parts, map[string]bool{}) {
157
+ return internalTypeExprAt(info, reg, raw, pos), true
158
+ }
159
+ }
160
+ return "", false
161
+ }
162
+
163
+ func preferredNamedInterfaceTypeExpr(info *fileInfo, reg *registry, raw string, pos int) (string, bool) {
164
+ raw = strings.TrimSpace(trimParens(raw))
165
+ if !isIdentifierName(raw) {
166
+ return "", false
167
+ }
168
+ decl, owner, _, ok := resolveInterfaceDeclRefAt(info, reg, raw, pos)
169
+ if !ok {
170
+ return "", false
171
+ }
172
+ if !interfaceNeedsPreferredSourceMetadata(owner, reg, decl, map[string]bool{}) {
173
+ return "", false
174
+ }
175
+ return interfaceObjectLiteralExprPreferred(owner, reg, raw, decl, &typeContext{seen: map[string]bool{}, pos: pos}), true
176
+ }
177
+
178
+ func interfaceNeedsPreferredSourceMetadata(info *fileInfo, reg *registry, decl interfaceInfo, seen map[string]bool) bool {
179
+ key := info.moduleKey + "\x00" + strconv.Itoa(decl.pos)
180
+ if seen[key] {
181
+ return false
182
+ }
183
+ seen[key] = true
184
+ for _, prop := range interfaceFullProperties(info, reg, decl, map[string]bool{}) {
185
+ owner := info
186
+ if prop.owner != nil {
187
+ owner = prop.owner
188
+ }
189
+ if typeContainsAliasReference(owner, reg, prop.typeText, map[string]bool{}) {
190
+ return true
191
+ }
192
+ if typeContainsExternalImportReference(owner, reg, prop.typeText, map[string]bool{}) {
193
+ return true
194
+ }
195
+ if sourceTypeContainsDateType(owner, reg, prop.typeText, &typeContext{seen: map[string]bool{}, pos: decl.pos}, map[string]bool{}) {
196
+ return true
197
+ }
198
+ if sourceTypeNeedsInternalPropertyMetadata(owner, reg, prop.typeText, &typeContext{seen: map[string]bool{}, pos: decl.pos}, map[string]bool{}) {
199
+ return true
200
+ }
201
+ }
202
+ return false
203
+ }
204
+
205
+ func typeContainsAliasReference(info *fileInfo, reg *registry, raw string, seen map[string]bool) bool {
206
+ raw = strings.TrimSpace(trimParens(raw))
207
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
208
+ if raw == "" {
209
+ return false
210
+ }
211
+ key := info.moduleKey + "\x00alias-boundary\x00" + raw
212
+ if seen[key] {
213
+ return false
214
+ }
215
+ seen[key] = true
216
+ if isIdentifierName(raw) {
217
+ _, _, _, ok := resolveAliasRef(info, reg, raw)
218
+ return ok
219
+ }
220
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
221
+ return typeContainsAliasReferenceInParts(info, reg, parts, seen)
222
+ }
223
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
224
+ return typeContainsAliasReferenceInParts(info, reg, parts, seen)
225
+ }
226
+ if strings.HasSuffix(raw, "[]") {
227
+ return typeContainsAliasReference(info, reg, strings.TrimSuffix(raw, "[]"), seen)
228
+ }
229
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
230
+ return typeContainsAliasReferenceInParts(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), seen)
231
+ }
232
+ if isObjectLiteralTypeText(raw) {
233
+ for _, prop := range propertiesFromBody(strings.TrimSpace(raw[1 : len(raw)-1])) {
234
+ if typeContainsAliasReference(info, reg, prop.typeText, seen) {
235
+ return true
236
+ }
237
+ }
238
+ return false
239
+ }
240
+ if name, args, ok := generic(raw); ok {
241
+ if _, _, _, ok := resolveAliasRef(info, reg, name); ok {
242
+ return true
243
+ }
244
+ for _, arg := range args {
245
+ if typeContainsAliasReference(info, reg, arg, seen) {
246
+ return true
247
+ }
248
+ }
249
+ }
250
+ return false
251
+ }
252
+
253
+ func typeContainsAliasReferenceInParts(info *fileInfo, reg *registry, parts []string, seen map[string]bool) bool {
254
+ for _, part := range parts {
255
+ if typeContainsAliasReference(info, reg, part, seen) {
256
+ return true
257
+ }
258
+ }
259
+ return false
260
+ }
261
+
262
+ func typeContainsExternalImportReference(info *fileInfo, reg *registry, raw string, seen map[string]bool) bool {
263
+ raw = strings.TrimSpace(trimParens(raw))
264
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
265
+ if raw == "" {
266
+ return false
267
+ }
268
+ key := info.moduleKey + "\x00external-boundary\x00" + raw
269
+ if seen[key] {
270
+ return false
271
+ }
272
+ seen[key] = true
273
+ if isIdentifierName(raw) {
274
+ if ref, ok := info.imports[raw]; ok && isExternalImportRef(ref) && !isFoundationImportRef(ref) {
275
+ return true
276
+ }
277
+ }
278
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
279
+ return typeContainsExternalImportReferenceInParts(info, reg, parts, seen)
280
+ }
281
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
282
+ return typeContainsExternalImportReferenceInParts(info, reg, parts, seen)
283
+ }
284
+ if strings.HasSuffix(raw, "[]") {
285
+ return typeContainsExternalImportReference(info, reg, strings.TrimSuffix(raw, "[]"), seen)
286
+ }
287
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
288
+ return typeContainsExternalImportReferenceInParts(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), seen)
289
+ }
290
+ if isObjectLiteralTypeText(raw) {
291
+ for _, prop := range propertiesFromBody(strings.TrimSpace(raw[1 : len(raw)-1])) {
292
+ if typeContainsExternalImportReference(info, reg, prop.typeText, seen) {
293
+ return true
294
+ }
295
+ }
296
+ return false
297
+ }
298
+ if name, args, ok := generic(raw); ok {
299
+ if ref, ok := info.imports[name]; ok && isExternalImportRef(ref) && !isFoundationImportRef(ref) {
300
+ return true
301
+ }
302
+ for _, arg := range args {
303
+ if typeContainsExternalImportReference(info, reg, arg, seen) {
304
+ return true
305
+ }
306
+ }
307
+ }
308
+ return false
309
+ }
310
+
311
+ func typeContainsExternalImportReferenceInParts(info *fileInfo, reg *registry, parts []string, seen map[string]bool) bool {
312
+ for _, part := range parts {
313
+ if typeContainsExternalImportReference(info, reg, part, seen) {
314
+ return true
315
+ }
316
+ }
317
+ return false
318
+ }
319
+
320
+ func shouldUseTextTypeExpr(raw string) bool {
321
+ name, _, ok := generic(strings.TrimSpace(trimParens(raw)))
322
+ return ok && name == "FileUpload"
323
+ }
324
+
325
+ func typiaSourceNamedExpr(info *fileInfo, reg *registry, expr string, raw string) string {
326
+ raw = strings.TrimSpace(trimParens(raw))
327
+ if isIdentifierName(raw) {
328
+ if _, _, _, ok := resolveAliasRef(info, reg, raw); ok {
329
+ return withTypeName(expr, raw)
330
+ }
331
+ if ref, ok := info.imports[raw]; ok && isFoundationImportRef(ref) {
332
+ return withTypeName(expr, raw)
333
+ }
334
+ }
335
+ return expr
336
+ }
337
+
338
+ func cachedTypeExpr(info *fileInfo, reg *registry, raw string, node *shimast.Node, pos int, cached string) string {
339
+ if strings.TrimSpace(cached) != "" {
340
+ return cached
341
+ }
342
+ return typeExprForNode(info, reg, raw, node, pos)
343
+ }
344
+
345
+ func preferredWrapperTypeExprForNode(info *fileInfo, reg *registry, raw string, node *shimast.Node, pos int) (string, bool) {
346
+ raw = strings.TrimSpace(trimParens(raw))
347
+ if strings.HasSuffix(raw, "[]") {
348
+ element := strings.TrimSpace(strings.TrimSuffix(raw, "[]"))
349
+ return "{kind: 14, type: " + typeExprForNodePreferred(info, reg, element, nil, pos, true) + "}", true
350
+ }
351
+ name, args, ok := generic(raw)
352
+ if !ok {
353
+ return "", false
354
+ }
355
+ argExpr := func(index int) string {
356
+ return preferredTypeArgExpr(info, reg, args, node, index, pos)
357
+ }
358
+ argRaw := func(index int) string {
359
+ if index < len(args) {
360
+ return args[index]
361
+ }
362
+ return "unknown"
363
+ }
364
+ argNode := func(index int) *shimast.Node {
365
+ typeArgs := typeNodeArgs(node)
366
+ if index < len(typeArgs) {
367
+ return typeArgs[index]
368
+ }
369
+ return nil
370
+ }
371
+
372
+ switch name {
373
+ case "Array", "ReadonlyArray":
374
+ return "{kind: 14, type: " + argExpr(0) + "}", true
375
+ case "Promise":
376
+ return "{kind: 22, type: " + argExpr(0) + "}", true
377
+ case "ApiResponse":
378
+ body := argExpr(0)
379
+ status := literalArg("200")
380
+ if len(args) > 1 {
381
+ status = literalArg(args[1])
382
+ }
383
+ return "{kind: 22, typeName: \"ApiResponse\", type: " + body + ", typeArguments: [" + body + ", " + status + "]}", true
384
+ case "HttpBody":
385
+ return httpMarkerTypePreferred(info, reg, "HttpBody", "httpBody", argRaw(0), argNode(0), "{}", nil, pos), true
386
+ case "HttpQueries":
387
+ return httpMarkerTypePreferred(info, reg, "HttpQueries", "httpQueries", argRaw(0), argNode(0), "{}", nil, pos), true
388
+ case "HttpQuery":
389
+ return httpMarkerTypePreferred(info, reg, "HttpQuery", "httpQuery", argRaw(0), argNode(0), optionArg(args, 1), argNode(1), pos), true
390
+ case "HttpPath":
391
+ return httpMarkerTypePreferred(info, reg, "HttpPath", "httpPath", argRaw(0), argNode(0), optionArg(args, 1), argNode(1), pos), true
392
+ case "HttpHeader":
393
+ return httpMarkerTypePreferred(info, reg, "HttpHeader", "httpHeader", argRaw(0), argNode(0), optionArg(args, 1), argNode(1), pos), true
394
+ case "ApiType":
395
+ if len(args) < 2 {
396
+ return "{kind: 2, typeName: \"ApiType\"}", true
397
+ }
398
+ body := argExpr(1)
399
+ marker := typeAnnotationMarker("ApiName", "openapi:name", literalArg(args[0]))
400
+ return "{kind: 13, typeName: \"ApiType\", types: [" + body + ", " + marker + "]}", true
401
+ case "Record":
402
+ key := argExpr(0)
403
+ value := argExpr(1)
404
+ return "{kind: 18, typeName: \"Record\", utilityType: \"Record\", typeArguments: [" + key + ", " + value + "], index: " + value + ", types: []}", true
405
+ default:
406
+ return "", false
407
+ }
408
+ }
409
+
410
+ func preferredTypeArgExpr(info *fileInfo, reg *registry, args []string, node *shimast.Node, index int, pos int) string {
411
+ raw := "unknown"
412
+ if index < len(args) {
413
+ raw = args[index]
414
+ }
415
+ typeArgs := typeNodeArgs(node)
416
+ var argNode *shimast.Node
417
+ if index < len(typeArgs) {
418
+ argNode = typeArgs[index]
419
+ }
420
+ return typeExprForNodePreferred(info, reg, raw, argNode, pos, true)
421
+ }
422
+
423
+ func typeNodeArgs(node *shimast.Node) []*shimast.Node {
424
+ if node == nil {
425
+ return nil
426
+ }
427
+ switch node.Kind {
428
+ case shimast.KindTypeReference,
429
+ shimast.KindExpressionWithTypeArguments,
430
+ shimast.KindImportType,
431
+ shimast.KindTypeQuery:
432
+ return node.TypeArguments()
433
+ default:
434
+ return nil
435
+ }
436
+ }
437
+
438
+ func httpMarkerTypePreferred(info *fileInfo, reg *registry, typeName string, annotation string, valueRaw string, valueNode *shimast.Node, optionsRaw string, optionsNode *shimast.Node, pos int) string {
439
+ valueType := typeExprForNodePreferred(info, reg, valueRaw, valueNode, pos, true)
440
+ value := annotationOptionsWithTypeExpr(info, reg, optionsRaw, optionsNode, valueRaw, valueType, pos)
441
+ marker := typeAnnotationMarker(typeName, annotation, value)
442
+ return "{kind: 13, typeName: " + quote(typeName) + ", types: [" + valueType + ", " + marker + "]}"
443
+ }
444
+
445
+ func annotationOptionsWithTypeExpr(info *fileInfo, reg *registry, optionsRaw string, optionsNode *shimast.Node, valueRaw string, valueType string, pos int) string {
446
+ optionsRaw = strings.TrimSpace(optionsRaw)
447
+ props := []string{}
448
+ if optionsRaw != "" && optionsRaw != "{}" {
449
+ if isObjectLiteralTypeText(optionsRaw) {
450
+ ctx := &typeContext{seen: map[string]bool{}, pos: pos}
451
+ body := strings.TrimSpace(optionsRaw[1 : len(optionsRaw)-1])
452
+ props = append(props, objectLiteralProperties(info, reg, body, ctx)...)
453
+ } else {
454
+ ctx := &typeContext{seen: map[string]bool{}, pos: pos}
455
+ _ = optionsNode
456
+ return annotationValueExpr(info, reg, optionsRaw+" & { type: "+valueRaw+" }", ctx)
457
+ }
458
+ }
459
+ props = append(props, "{kind: 20, name: \"type\", type: "+valueType+", optional: false}")
460
+ return "{kind: 18, types: [" + strings.Join(props, ", ") + "]}"
461
+ }
462
+
463
+ func typiaTypeExprForNode(info *fileInfo, reg *registry, raw string, node *shimast.Node, pos int) (string, bool) {
464
+ if reg == nil || reg.checker == nil || node == nil {
465
+ return "", false
466
+ }
467
+ typ := reg.checker.GetTypeFromTypeNode(node)
468
+ return typiaTypeExprFromType(info, reg, typ, pos, raw)
469
+ }
470
+
471
+ func shouldUseTypiaType(info *fileInfo, reg *registry, raw string) bool {
472
+ return shouldUseTypiaTypeCtx(info, reg, raw, map[string]bool{})
473
+ }
474
+
475
+ func shouldUseTypiaTypeCtx(info *fileInfo, reg *registry, raw string, seen map[string]bool) bool {
476
+ raw = strings.TrimSpace(trimParens(raw))
477
+ if raw == "" || isFunctionTypeSyntax(raw) {
478
+ return false
479
+ }
480
+ key := info.moduleKey + "\x00" + raw
481
+ if seen[key] {
482
+ return false
483
+ }
484
+ seen[key] = true
485
+ defer delete(seen, key)
486
+
487
+ if hasTypiaPreferredSyntax(raw) {
488
+ return true
489
+ }
490
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
491
+ return shouldUseTypiaTypeInParts(info, reg, parts, seen)
492
+ }
493
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
494
+ return shouldUseTypiaTypeInParts(info, reg, parts, seen)
495
+ }
496
+ if strings.HasSuffix(raw, "[]") {
497
+ return shouldUseTypiaTypeCtx(info, reg, strings.TrimSuffix(raw, "[]"), seen)
498
+ }
499
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
500
+ return shouldUseTypiaTypeInParts(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), seen)
501
+ }
502
+ if isObjectLiteralTypeText(raw) {
503
+ body := strings.TrimSpace(raw[1 : len(raw)-1])
504
+ for _, prop := range propertiesFromBody(body) {
505
+ if shouldUseTypiaTypeCtx(info, reg, prop.typeText, seen) {
506
+ return true
507
+ }
508
+ }
509
+ return false
510
+ }
511
+ if name, args, ok := generic(raw); ok {
512
+ if alias, owner, _, ok := resolveAliasRef(info, reg, name); ok {
513
+ if hasTypiaPreferredSyntax(alias.body) || shouldUseTypiaTypeCtx(owner, reg, alias.body, seen) {
514
+ return true
515
+ }
516
+ }
517
+ if ref, ok := info.imports[name]; ok && isFoundationImportRef(ref) {
518
+ return true
519
+ }
520
+ for _, arg := range args {
521
+ if shouldUseTypiaTypeCtx(info, reg, arg, seen) {
522
+ return true
523
+ }
524
+ }
525
+ return false
526
+ }
527
+ if isIdentifierName(raw) {
528
+ if alias, owner, _, ok := resolveAliasRef(info, reg, raw); ok {
529
+ return hasTypiaPreferredSyntax(alias.body) || shouldUseTypiaTypeCtx(owner, reg, alias.body, seen)
530
+ }
531
+ if ref, ok := info.imports[raw]; ok && isFoundationImportRef(ref) {
532
+ return true
533
+ }
534
+ }
535
+ return false
536
+ }
537
+
538
+ func shouldUseTypiaTypeInParts(info *fileInfo, reg *registry, parts []string, seen map[string]bool) bool {
539
+ for _, part := range parts {
540
+ if shouldUseTypiaTypeCtx(info, reg, part, seen) {
541
+ return true
542
+ }
543
+ }
544
+ return false
545
+ }
546
+
547
+ func hasTypiaPreferredSyntax(raw string) bool {
548
+ raw = strings.TrimSpace(raw)
549
+ compact := compactTypePattern(raw)
550
+ if strings.Contains(raw, "typia.tag") ||
551
+ strings.Contains(raw, "TypiaTagBase") ||
552
+ strings.Contains(raw, "TypiaFormat") ||
553
+ strings.Contains(raw, "TsfTypia") ||
554
+ strings.Contains(raw, "TsfTypeTag") ||
555
+ strings.Contains(raw, "TsfValidatorTag") ||
556
+ strings.Contains(raw, "TsfDatabase") {
557
+ return true
558
+ }
559
+ if strings.Contains(compact, "inkeyof") {
560
+ return true
561
+ }
562
+ return strings.Contains(raw, " extends ") && strings.Contains(raw, " ? ") && strings.Contains(raw, " : ")
563
+ }
564
+
565
+ func canPreferTypiaType(info *fileInfo, reg *registry, raw string) bool {
566
+ if typeContainsExternalImportReference(info, reg, raw, map[string]bool{}) {
567
+ return false
568
+ }
569
+ return !hasFrameworkMetadataSyntaxDeep(info, reg, raw, map[string]bool{})
570
+ }
571
+
572
+ func canPreferTypiaTypeOnPreferredSurface(info *fileInfo, reg *registry, raw string) bool {
573
+ return canPreferTypiaTypeOnPreferredSurfaceAt(info, reg, raw, 0)
574
+ }
575
+
576
+ func canPreferTypiaTypeOnPreferredSurfaceAt(info *fileInfo, reg *registry, raw string, pos int) bool {
577
+ return !hasPreferredTypiaBlockerSyntaxDeep(info, reg, raw, true, pos, map[string]bool{})
578
+ }
579
+
580
+ func shouldPreferTypiaAliasMetadata(info *fileInfo, reg *registry, raw string, pos int) bool {
581
+ raw = strings.TrimSpace(trimParens(raw))
582
+ name, _, ok := generic(raw)
583
+ if !ok {
584
+ return false
585
+ }
586
+ ref, ok := info.imports[name]
587
+ return ok && isFoundationImportRef(ref) && !isRootInternalMetadataName(name) && canPreferTypiaTypeOnPreferredSurfaceAt(info, reg, raw, pos)
588
+ }
589
+
590
+ func hasPreferredTypiaBlockerSyntaxDeep(info *fileInfo, reg *registry, raw string, root bool, pos int, seen map[string]bool) bool {
591
+ raw = strings.TrimSpace(trimParens(raw))
592
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
593
+ if raw == "" || raw == "unknown" {
594
+ return false
595
+ }
596
+ if isFunctionTypeSyntax(raw) {
597
+ return true
598
+ }
599
+ if isPreferredTypiaHardBlockerName(raw) || (root && isRootInternalMetadataName(raw)) {
600
+ return true
601
+ }
602
+
603
+ key := info.moduleKey + "\x00preferred\x00" + raw
604
+ if seen[key] {
605
+ return false
606
+ }
607
+ seen[key] = true
608
+ defer delete(seen, key)
609
+
610
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
611
+ nonNullish := nonNullishTypeParts(parts)
612
+ if len(nonNullish) > 1 && (hasLiteralUnionSyntax(nonNullish) || hasTaggedMetadataSyntaxInParts(info, reg, nonNullish, seen)) {
613
+ return true
614
+ }
615
+ return hasPreferredTypiaBlockerSyntaxInParts(info, reg, parts, false, pos, seen)
616
+ }
617
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
618
+ if root && hasRootInternalMetadataIntersectionPart(parts) {
619
+ return true
620
+ }
621
+ return hasPreferredTypiaBlockerSyntaxInParts(info, reg, parts, false, pos, seen)
622
+ }
623
+ if strings.HasSuffix(raw, "[]") {
624
+ return hasPreferredTypiaBlockerSyntaxDeep(info, reg, strings.TrimSuffix(raw, "[]"), false, pos, seen)
625
+ }
626
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
627
+ return hasPreferredTypiaBlockerSyntaxInParts(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), false, pos, seen)
628
+ }
629
+ if isObjectLiteralTypeText(raw) {
630
+ body := strings.TrimSpace(raw[1 : len(raw)-1])
631
+ for _, prop := range propertiesFromBody(body) {
632
+ if hasPreferredTypiaBlockerSyntaxDeep(info, reg, prop.typeText, false, pos, seen) {
633
+ return true
634
+ }
635
+ }
636
+ if indexType, ok := indexSignatureType(body); ok {
637
+ return hasPreferredTypiaBlockerSyntaxDeep(info, reg, indexType, false, pos, seen)
638
+ }
639
+ return false
640
+ }
641
+ if strings.Contains(raw, "[") || strings.Contains(raw, "]") {
642
+ return false
643
+ }
644
+ if name, args, ok := generic(raw); ok {
645
+ if (name == "Pattern" || name == "Validate") && (len(args) == 0 || !isLiteralStringType(args[0])) {
646
+ return true
647
+ }
648
+ if name == "TsfValidatorTag" && len(args) > 0 && literalStringValue(args[0]) == "object" {
649
+ return true
650
+ }
651
+ if isPreferredTypiaHardBlockerName(name) || (root && isRootInternalMetadataName(name)) {
652
+ return true
653
+ }
654
+ if ref, ok := info.imports[name]; ok && isFoundationImportRef(ref) {
655
+ return false
656
+ }
657
+ if isInternalUtilityObjectTypeName(name) {
658
+ ctx := &typeContext{seen: map[string]bool{}}
659
+ if props, owner, ok := utilityTypeProperties(info, reg, name, args, ctx); ok {
660
+ for _, prop := range props {
661
+ propOwner := owner
662
+ if prop.owner != nil {
663
+ propOwner = prop.owner
664
+ }
665
+ propPos := pos
666
+ if prop.typeNode != nil {
667
+ propPos = prop.typeNode.Pos()
668
+ }
669
+ if hasPreferredTypiaBlockerSyntaxDeep(propOwner, reg, prop.typeText, false, propPos, seen) {
670
+ return true
671
+ }
672
+ }
673
+ return false
674
+ }
675
+ }
676
+ if alias, owner, _, ok := resolveAliasRef(info, reg, name); ok {
677
+ body := alias.body
678
+ for i := range alias.params {
679
+ body = replaceTypeParameter(body, aliasParamName(alias, i), aliasArg(alias, args, i))
680
+ }
681
+ if hasPreferredTypiaBlockerSyntaxDeep(owner, reg, body, root, alias.pos, seen) {
682
+ return true
683
+ }
684
+ }
685
+ for i, arg := range args {
686
+ if (name == "Pick" || name == "Omit") && i > 0 {
687
+ continue
688
+ }
689
+ if hasPreferredTypiaBlockerSyntaxDeep(info, reg, arg, false, pos, seen) {
690
+ return true
691
+ }
692
+ }
693
+ return false
694
+ }
695
+ if isIdentifierName(raw) {
696
+ if alias, owner, _, ok := resolveAliasRef(info, reg, raw); ok {
697
+ return hasPreferredTypiaBlockerSyntaxDeep(owner, reg, alias.body, root, alias.pos, seen)
698
+ }
699
+ if decl, owner, _, ok := resolveInterfaceDeclRefAt(info, reg, raw, pos); ok {
700
+ body := interfaceFullBody(owner, reg, decl, map[string]bool{})
701
+ return hasPreferredTypiaBlockerSyntaxDeep(owner, reg, "{"+body+"}", false, decl.pos, seen)
702
+ }
703
+ if class, owner, ok := resolveClassRefAt(info, reg, raw, pos); ok {
704
+ for _, prop := range class.properties {
705
+ propPos := pos
706
+ if prop.typeNode != nil {
707
+ propPos = prop.typeNode.Pos()
708
+ }
709
+ if hasPreferredTypiaBlockerSyntaxDeep(owner, reg, prop.typeText, false, propPos, seen) {
710
+ return true
711
+ }
712
+ }
713
+ }
714
+ }
715
+ return false
716
+ }
717
+
718
+ func isInternalUtilityObjectTypeName(name string) bool {
719
+ switch name {
720
+ case "Pick", "Omit", "Partial", "Required":
721
+ return true
722
+ default:
723
+ return false
724
+ }
725
+ }
726
+
727
+ func hasPreferredTypiaBlockerSyntaxInParts(info *fileInfo, reg *registry, parts []string, root bool, pos int, seen map[string]bool) bool {
728
+ for _, part := range parts {
729
+ if hasPreferredTypiaBlockerSyntaxDeep(info, reg, part, root, pos, seen) {
730
+ return true
731
+ }
732
+ }
733
+ return false
734
+ }
735
+
736
+ func nonNullishTypeParts(parts []string) []string {
737
+ out := []string{}
738
+ for _, part := range parts {
739
+ part = strings.TrimSpace(trimParens(part))
740
+ if part == "" || part == "null" || part == "undefined" {
741
+ continue
742
+ }
743
+ out = append(out, part)
744
+ }
745
+ return out
746
+ }
747
+
748
+ func hasRootInternalMetadataIntersectionPart(parts []string) bool {
749
+ for _, part := range parts {
750
+ name := strings.TrimSpace(trimParens(part))
751
+ if genericName, _, ok := generic(name); ok {
752
+ name = genericName
753
+ }
754
+ if isRootInternalMetadataName(name) {
755
+ return true
756
+ }
757
+ }
758
+ return false
759
+ }
760
+
761
+ func isPreferredTypiaHardBlockerName(name string) bool {
762
+ switch strings.TrimSpace(name) {
763
+ case "FileUpload":
764
+ return true
765
+ default:
766
+ return false
767
+ }
768
+ }
769
+
770
+ func isRootInternalMetadataName(name string) bool {
771
+ switch strings.TrimSpace(name) {
772
+ case "TypeAnnotation",
773
+ "ApiName",
774
+ "ApiType",
775
+ "HttpBody",
776
+ "HttpQueries",
777
+ "HttpQuery",
778
+ "HttpPath",
779
+ "HttpHeader",
780
+ "HttpRequest",
781
+ "HttpRequestStream",
782
+ "HttpResponse",
783
+ "ParsedJwt",
784
+ "JWT",
785
+ "RawResponseResult",
786
+ "Redirect",
787
+ "OkResponse",
788
+ "EmptyResponse",
789
+ "TsfDatabaseFieldTag",
790
+ "TsfDatabaseTag",
791
+ "DatabaseField",
792
+ "MySQL",
793
+ "Reference",
794
+ "Index",
795
+ "Unique",
796
+ "PrimaryKey",
797
+ "AutoIncrement":
798
+ return true
799
+ default:
800
+ return false
801
+ }
802
+ }
803
+
804
+ func hasFrameworkMetadataSyntaxDeep(info *fileInfo, reg *registry, raw string, seen map[string]bool) bool {
805
+ raw = strings.TrimSpace(trimParens(raw))
806
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
807
+ if raw == "" || raw == "unknown" {
808
+ return false
809
+ }
810
+ if isFunctionTypeSyntax(raw) {
811
+ return true
812
+ }
813
+ if isFrameworkMetadataName(raw) {
814
+ return true
815
+ }
816
+
817
+ key := info.moduleKey + "\x00" + raw
818
+ if seen[key] {
819
+ return false
820
+ }
821
+ seen[key] = true
822
+ defer delete(seen, key)
823
+
824
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
825
+ if hasLiteralUnionSyntax(parts) {
826
+ return true
827
+ }
828
+ if hasTaggedMetadataSyntaxInParts(info, reg, parts, seen) {
829
+ return true
830
+ }
831
+ return hasFrameworkMetadataSyntaxInParts(info, reg, parts, seen)
832
+ }
833
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
834
+ return hasFrameworkMetadataSyntaxInParts(info, reg, parts, seen)
835
+ }
836
+ if name, args, ok := generic(raw); ok {
837
+ if (name == "Pattern" || name == "Validate") && (len(args) == 0 || !isLiteralStringType(args[0])) {
838
+ return true
839
+ }
840
+ if isFrameworkMetadataName(name) {
841
+ return true
842
+ }
843
+ }
844
+ if hasTypiaPreferredSyntax(raw) {
845
+ return false
846
+ }
847
+ if strings.HasSuffix(raw, "[]") {
848
+ return hasFrameworkMetadataSyntaxDeep(info, reg, strings.TrimSuffix(raw, "[]"), seen)
849
+ }
850
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
851
+ return hasFrameworkMetadataSyntaxInParts(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), seen)
852
+ }
853
+ if strings.Contains(raw, "[") || strings.Contains(raw, "]") {
854
+ return true
855
+ }
856
+ if isObjectLiteralTypeText(raw) {
857
+ body := strings.TrimSpace(raw[1 : len(raw)-1])
858
+ for _, prop := range propertiesFromBody(body) {
859
+ if hasFrameworkMetadataSyntaxDeep(info, reg, prop.typeText, seen) {
860
+ return true
861
+ }
862
+ }
863
+ return false
864
+ }
865
+ if name, args, ok := generic(raw); ok {
866
+ if (name == "Pattern" || name == "Validate") && (len(args) == 0 || !isLiteralStringType(args[0])) {
867
+ return true
868
+ }
869
+ if isFrameworkMetadataName(name) {
870
+ return true
871
+ }
872
+ if alias, owner, _, ok := resolveAliasRef(info, reg, name); ok {
873
+ body := alias.body
874
+ for i := range alias.params {
875
+ body = replaceTypeParameter(body, aliasParamName(alias, i), aliasArg(alias, args, i))
876
+ }
877
+ if hasFrameworkMetadataSyntaxDeep(owner, reg, body, seen) {
878
+ return true
879
+ }
880
+ }
881
+ for i, arg := range args {
882
+ if (name == "Pick" || name == "Omit") && i > 0 {
883
+ continue
884
+ }
885
+ if hasFrameworkMetadataSyntaxDeep(info, reg, arg, seen) {
886
+ return true
887
+ }
888
+ }
889
+ return false
890
+ }
891
+ if isIdentifierName(raw) {
892
+ if isFoundationTypeIdentifier(info, raw) {
893
+ return true
894
+ }
895
+ if alias, owner, _, ok := resolveAliasRef(info, reg, raw); ok {
896
+ return hasFrameworkMetadataSyntaxDeep(owner, reg, alias.body, seen)
897
+ }
898
+ if decl, owner, _, ok := resolveInterfaceDeclRefAt(info, reg, raw, 0); ok {
899
+ body := interfaceFullBody(owner, reg, decl, map[string]bool{})
900
+ return hasFrameworkMetadataSyntaxDeep(owner, reg, "{"+body+"}", seen)
901
+ }
902
+ if class, owner, ok := resolveClassRefAt(info, reg, raw, 0); ok {
903
+ for _, prop := range class.properties {
904
+ if hasFrameworkMetadataSyntaxDeep(owner, reg, prop.typeText, seen) {
905
+ return true
906
+ }
907
+ }
908
+ }
909
+ }
910
+ return false
911
+ }
912
+
913
+ func hasTaggedMetadataSyntaxInParts(info *fileInfo, reg *registry, parts []string, seen map[string]bool) bool {
914
+ for _, part := range parts {
915
+ part = strings.TrimSpace(trimParens(part))
916
+ if part == "null" || part == "undefined" {
917
+ continue
918
+ }
919
+ if hasTaggedMetadataSyntaxDeep(info, reg, part, seen) {
920
+ return true
921
+ }
922
+ }
923
+ return false
924
+ }
925
+
926
+ func hasTaggedMetadataSyntaxDeep(info *fileInfo, reg *registry, raw string, seen map[string]bool) bool {
927
+ raw = strings.TrimSpace(trimParens(raw))
928
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
929
+ if raw == "" || raw == "unknown" {
930
+ return false
931
+ }
932
+ if hasTypiaPreferredSyntax(raw) || isFrameworkMetadataName(raw) {
933
+ return true
934
+ }
935
+ key := info.moduleKey + "\x00tagged\x00" + raw
936
+ if seen[key] {
937
+ return false
938
+ }
939
+ seen[key] = true
940
+ defer delete(seen, key)
941
+
942
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
943
+ return hasTaggedMetadataSyntaxInParts(info, reg, parts, seen)
944
+ }
945
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
946
+ return hasTaggedMetadataSyntaxInParts(info, reg, parts, seen)
947
+ }
948
+ if strings.HasSuffix(raw, "[]") {
949
+ return hasTaggedMetadataSyntaxDeep(info, reg, strings.TrimSuffix(raw, "[]"), seen)
950
+ }
951
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
952
+ return hasTaggedMetadataSyntaxInParts(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), seen)
953
+ }
954
+ if isObjectLiteralTypeText(raw) {
955
+ body := strings.TrimSpace(raw[1 : len(raw)-1])
956
+ for _, prop := range propertiesFromBody(body) {
957
+ if hasTaggedMetadataSyntaxDeep(info, reg, prop.typeText, seen) {
958
+ return true
959
+ }
960
+ }
961
+ return false
962
+ }
963
+ if name, args, ok := generic(raw); ok {
964
+ if alias, owner, _, ok := resolveAliasRef(info, reg, name); ok {
965
+ body := alias.body
966
+ for i := range alias.params {
967
+ body = replaceTypeParameter(body, aliasParamName(alias, i), aliasArg(alias, args, i))
968
+ }
969
+ if hasTaggedMetadataSyntaxDeep(owner, reg, body, seen) {
970
+ return true
971
+ }
972
+ }
973
+ for _, arg := range args {
974
+ if hasTaggedMetadataSyntaxDeep(info, reg, arg, seen) {
975
+ return true
976
+ }
977
+ }
978
+ return false
979
+ }
980
+ if isIdentifierName(raw) {
981
+ if alias, owner, _, ok := resolveAliasRef(info, reg, raw); ok {
982
+ return hasTaggedMetadataSyntaxDeep(owner, reg, alias.body, seen)
983
+ }
984
+ if decl, owner, _, ok := resolveInterfaceDeclRefAt(info, reg, raw, 0); ok {
985
+ body := interfaceFullBody(owner, reg, decl, map[string]bool{})
986
+ return hasTaggedMetadataSyntaxDeep(owner, reg, "{"+body+"}", seen)
987
+ }
988
+ if class, owner, ok := resolveClassRefAt(info, reg, raw, 0); ok {
989
+ for _, prop := range class.properties {
990
+ if hasTaggedMetadataSyntaxDeep(owner, reg, prop.typeText, seen) {
991
+ return true
992
+ }
993
+ }
994
+ }
995
+ }
996
+ return false
997
+ }
998
+
999
+ func hasFrameworkMetadataSyntaxInParts(info *fileInfo, reg *registry, parts []string, seen map[string]bool) bool {
1000
+ for _, part := range parts {
1001
+ if hasFrameworkMetadataSyntaxDeep(info, reg, part, seen) {
1002
+ return true
1003
+ }
1004
+ }
1005
+ return false
1006
+ }
1007
+
1008
+ func hasLiteralUnionSyntax(parts []string) bool {
1009
+ for _, part := range parts {
1010
+ part = strings.TrimSpace(trimParens(part))
1011
+ if strings.HasPrefix(part, "\"") ||
1012
+ strings.HasPrefix(part, "'") ||
1013
+ part == "true" ||
1014
+ part == "false" {
1015
+ return true
1016
+ }
1017
+ if _, err := strconv.ParseFloat(part, 64); err == nil {
1018
+ return true
1019
+ }
1020
+ }
1021
+ return false
1022
+ }
1023
+
1024
+ func isFrameworkMetadataName(name string) bool {
1025
+ switch strings.TrimSpace(name) {
1026
+ case "TypeAnnotation",
1027
+ "ApiName",
1028
+ "ApiType",
1029
+ "HttpBody",
1030
+ "HttpQueries",
1031
+ "HttpQuery",
1032
+ "HttpPath",
1033
+ "HttpHeader",
1034
+ "HttpRequest",
1035
+ "HttpRequestStream",
1036
+ "HttpResponse",
1037
+ "ParsedJwt",
1038
+ "JWT",
1039
+ "FileUpload",
1040
+ "RawResponseResult",
1041
+ "Redirect",
1042
+ "OkResponse",
1043
+ "EmptyResponse",
1044
+ "Indexed",
1045
+ "TsfDatabaseFieldTag",
1046
+ "TsfDatabaseTag",
1047
+ "DatabaseField",
1048
+ "MySQL",
1049
+ "Reference",
1050
+ "Index",
1051
+ "Unique",
1052
+ "PrimaryKey",
1053
+ "AutoIncrement",
1054
+ "Date",
1055
+ "ValidDate":
1056
+ return true
1057
+ default:
1058
+ return false
1059
+ }
1060
+ }
1061
+
1062
+ func typiaTypeExprFromType(info *fileInfo, reg *registry, typ *shimchecker.Type, pos int, raw string) (string, bool) {
1063
+ if typ == nil || typ.IsTypeParameter() {
1064
+ return "", false
1065
+ }
1066
+ if reg.typiaCache == nil {
1067
+ reg.typiaCache = map[typiaCacheKey]string{}
1068
+ }
1069
+ if reg.typiaFailures == nil {
1070
+ reg.typiaFailures = map[*shimchecker.Type]bool{}
1071
+ }
1072
+ cacheKey := typiaCacheKey{typ: typ, moduleKey: info.moduleKey, raw: strings.TrimSpace(raw), pos: pos}
1073
+ if expr, ok := reg.typiaCache[cacheKey]; ok {
1074
+ return expr, true
1075
+ }
1076
+ if reg.typiaFailures[typ] {
1077
+ return "", false
1078
+ }
1079
+ components := schemametadata.NewMetadataCollection()
1080
+ result := typiafactories.MetadataFactory.Analyze(typiafactories.MetadataFactory_IProps{
1081
+ Checker: reg.checker,
1082
+ Options: typiafactories.MetadataFactory_IOptions{
1083
+ Absorb: true,
1084
+ Constant: true,
1085
+ Escape: true,
1086
+ },
1087
+ Components: components,
1088
+ Type: typ,
1089
+ })
1090
+ if !result.Success || result.Data == nil {
1091
+ reg.typiaFailures[typ] = true
1092
+ return "", false
1093
+ }
1094
+ expr := typiaMetadataExpr(info, reg, result.Data, true, newTypiaRenderStateForSource(pos, raw))
1095
+ reg.typiaCache[cacheKey] = expr
1096
+ return expr, true
1097
+ }
1098
+
1099
+ type typiaRenderState struct {
1100
+ metadata map[*schemametadata.MetadataSchema]bool
1101
+ aliases map[*schemametadata.MetadataAliasType]bool
1102
+ arrays map[*schemametadata.MetadataArrayType]bool
1103
+ tuples map[*schemametadata.MetadataTupleType]bool
1104
+ objects map[*schemametadata.MetadataObjectType]bool
1105
+ pos int
1106
+ sourceRaw string
1107
+ }
1108
+
1109
+ func newTypiaRenderState(pos ...int) *typiaRenderState {
1110
+ state := &typiaRenderState{
1111
+ metadata: map[*schemametadata.MetadataSchema]bool{},
1112
+ aliases: map[*schemametadata.MetadataAliasType]bool{},
1113
+ arrays: map[*schemametadata.MetadataArrayType]bool{},
1114
+ tuples: map[*schemametadata.MetadataTupleType]bool{},
1115
+ objects: map[*schemametadata.MetadataObjectType]bool{},
1116
+ }
1117
+ if len(pos) > 0 {
1118
+ state.pos = pos[0]
1119
+ }
1120
+ return state
1121
+ }
1122
+
1123
+ func newTypiaRenderStateForSource(pos int, sourceRaw string) *typiaRenderState {
1124
+ state := newTypiaRenderState(pos)
1125
+ state.sourceRaw = sourceRaw
1126
+ return state
1127
+ }
1128
+
1129
+ func typiaMetadataExpr(info *fileInfo, reg *registry, meta *schemametadata.MetadataSchema, includeOptional bool, state *typiaRenderState) string {
1130
+ if meta == nil {
1131
+ return "{kind: 2}"
1132
+ }
1133
+ if state == nil {
1134
+ state = newTypiaRenderState()
1135
+ }
1136
+ if state.metadata[meta] {
1137
+ return "{kind: 2, typeName: " + quote(meta.GetDisplayName()) + "}"
1138
+ }
1139
+ state.metadata[meta] = true
1140
+ defer delete(state.metadata, meta)
1141
+
1142
+ types := []string{}
1143
+ if meta.Any {
1144
+ types = append(types, "{kind: 1}")
1145
+ }
1146
+ if meta.Escaped != nil && meta.Escaped.Returns != nil {
1147
+ types = append(types, typiaMetadataExpr(info, reg, meta.Escaped.Returns, includeOptional, state))
1148
+ }
1149
+ if meta.Rest != nil {
1150
+ types = append(types, "{kind: 14, type: "+typiaMetadataExpr(info, reg, meta.Rest, true, state)+"}")
1151
+ }
1152
+ for _, atomic := range meta.Atomics {
1153
+ if expr, ok := typiaAtomicExpr(atomic); ok {
1154
+ types = append(types, expr)
1155
+ }
1156
+ }
1157
+ for _, constant := range meta.Constants {
1158
+ for _, value := range constant.Values {
1159
+ if value != nil {
1160
+ types = append(types, typiaTaggedExpr("{kind: 10, literal: "+typiaLiteralExpr(value.Value)+"}", value.Tags))
1161
+ }
1162
+ }
1163
+ }
1164
+ for _, template := range meta.Templates {
1165
+ if template != nil {
1166
+ types = append(types, typiaTaggedExpr("{kind: 23, typeName: "+quote(template.GetName())+"}", template.Tags))
1167
+ }
1168
+ }
1169
+ for _, array := range meta.Arrays {
1170
+ types = append(types, typiaArrayExpr(info, reg, array, state))
1171
+ }
1172
+ for _, tuple := range meta.Tuples {
1173
+ types = append(types, typiaTupleExpr(info, reg, tuple, state))
1174
+ }
1175
+ for _, object := range meta.Objects {
1176
+ types = append(types, typiaObjectExpr(info, reg, object, state))
1177
+ }
1178
+ for _, alias := range meta.Aliases {
1179
+ types = append(types, typiaAliasExpr(info, reg, alias, state))
1180
+ }
1181
+ for _, native := range meta.Natives {
1182
+ types = append(types, typiaNativeExpr(info, reg, native))
1183
+ }
1184
+ for range meta.Functions {
1185
+ types = append(types, "{kind: 21}")
1186
+ }
1187
+ for _, set := range meta.Sets {
1188
+ if set != nil && set.Value != nil {
1189
+ types = append(types, typiaTaggedExpr("{kind: 2, typeName: \"Set\", typeArguments: ["+typiaMetadataExpr(info, reg, set.Value, true, state)+"]}", set.Tags))
1190
+ }
1191
+ }
1192
+ for _, m := range meta.Maps {
1193
+ if m != nil {
1194
+ key := "{kind: 2}"
1195
+ value := "{kind: 2}"
1196
+ if m.Key != nil {
1197
+ key = typiaMetadataExpr(info, reg, m.Key, true, state)
1198
+ }
1199
+ if m.Value != nil {
1200
+ value = typiaMetadataExpr(info, reg, m.Value, true, state)
1201
+ }
1202
+ types = append(types, typiaTaggedExpr("{kind: 2, typeName: \"Map\", typeArguments: ["+key+", "+value+"]}", m.Tags))
1203
+ }
1204
+ }
1205
+ if meta.Nullable {
1206
+ types = append(types, "{kind: 5}")
1207
+ }
1208
+ if includeOptional && !meta.IsRequired() {
1209
+ types = append(types, "{kind: 4}")
1210
+ }
1211
+ if len(types) == 0 {
1212
+ if meta.Empty() && meta.Required && !meta.Nullable && !meta.Optional {
1213
+ return "{kind: 0}"
1214
+ }
1215
+ return "{kind: 2, typeName: " + quote(meta.GetDisplayName()) + "}"
1216
+ }
1217
+ return typiaUnionExpr(types)
1218
+ }
1219
+
1220
+ func typiaAtomicExpr(atomic *schemametadata.MetadataAtomic) (string, bool) {
1221
+ if atomic == nil {
1222
+ return "", false
1223
+ }
1224
+ switch atomic.Type {
1225
+ case "string":
1226
+ return typiaTaggedExpr("{kind: 6}", atomic.Tags), true
1227
+ case "number":
1228
+ return typiaTaggedExpr("{kind: 7}", atomic.Tags), true
1229
+ case "boolean":
1230
+ return typiaTaggedExpr("{kind: 8}", atomic.Tags), true
1231
+ case "bigint":
1232
+ return typiaTaggedExpr("{kind: 9}", atomic.Tags), true
1233
+ default:
1234
+ return typiaTaggedExpr("{kind: 2, typeName: "+quote(atomic.GetName())+"}", atomic.Tags), true
1235
+ }
1236
+ }
1237
+
1238
+ func typiaArrayExpr(info *fileInfo, reg *registry, array *schemametadata.MetadataArray, state *typiaRenderState) string {
1239
+ if array == nil || array.Type == nil {
1240
+ return "{kind: 14, type: {kind: 2}}"
1241
+ }
1242
+ if state.arrays[array.Type] {
1243
+ return "{kind: 14, type: {kind: 2}}"
1244
+ }
1245
+ state.arrays[array.Type] = true
1246
+ defer delete(state.arrays, array.Type)
1247
+
1248
+ value := "{kind: 2}"
1249
+ if array.Type.Value != nil {
1250
+ value = typiaMetadataExpr(info, reg, array.Type.Value, true, state)
1251
+ }
1252
+ return typiaTaggedExpr("{kind: 14, type: "+value+"}", array.Tags)
1253
+ }
1254
+
1255
+ func typiaTupleExpr(info *fileInfo, reg *registry, tuple *schemametadata.MetadataTuple, state *typiaRenderState) string {
1256
+ if tuple == nil || tuple.Type == nil {
1257
+ return "{kind: 15, types: []}"
1258
+ }
1259
+ if state.tuples[tuple.Type] {
1260
+ return "{kind: 15, typeName: " + quote(tuple.Type.GetDisplayName()) + ", types: []}"
1261
+ }
1262
+ state.tuples[tuple.Type] = true
1263
+ defer delete(state.tuples, tuple.Type)
1264
+
1265
+ items := []string{}
1266
+ for _, element := range tuple.Type.Elements {
1267
+ items = append(items, "{type: "+typiaMetadataExpr(info, reg, element, true, state)+"}")
1268
+ }
1269
+ return typiaTaggedExpr("{kind: 15, typeName: "+quote(tuple.Type.GetDisplayName())+", types: ["+strings.Join(items, ", ")+"]}", tuple.Tags)
1270
+ }
1271
+
1272
+ func typiaObjectExpr(info *fileInfo, reg *registry, object *schemametadata.MetadataObject, state *typiaRenderState) string {
1273
+ if object == nil || object.Type == nil {
1274
+ return "{kind: 18, types: []}"
1275
+ }
1276
+ obj := object.Type
1277
+ name, named := typiaObjectTypeName(info, reg, obj, state.pos)
1278
+ if named {
1279
+ if expr, ok := typiaNamedObjectInternalOverrideExpr(info, reg, name, state.pos); ok {
1280
+ return typiaTaggedExpr(expr, object.Tags)
1281
+ }
1282
+ }
1283
+ if obj.IsClass && isIdentifierName(obj.Name) {
1284
+ runtimeName := obj.Name
1285
+ if obj.ValueRef != "" {
1286
+ runtimeName = obj.ValueRef
1287
+ }
1288
+ return typiaTaggedExpr("{kind: 16, typeName: "+quote(name)+", classType: () => "+runtimeValueExpr(info, reg, runtimeName)+"}", object.Tags)
1289
+ }
1290
+ if state.objects[obj] {
1291
+ if named {
1292
+ return "{kind: 18, typeName: " + quote(name) + ", types: []}"
1293
+ }
1294
+ return "{kind: 18, types: []}"
1295
+ }
1296
+ state.objects[obj] = true
1297
+ defer delete(state.objects, obj)
1298
+
1299
+ properties := []string{}
1300
+ indexExpr := ""
1301
+ for _, prop := range obj.Properties {
1302
+ if prop == nil || prop.Key == nil || prop.Value == nil {
1303
+ continue
1304
+ }
1305
+ if expr, ok := typiaIndexPropertyExpr(info, reg, prop, state); ok {
1306
+ if indexExpr == "" {
1307
+ indexExpr = expr
1308
+ }
1309
+ continue
1310
+ }
1311
+ propName := typiaPropertyName(prop)
1312
+ if propName == "" {
1313
+ continue
1314
+ }
1315
+ optional := !prop.Value.IsRequired()
1316
+ valueExpr := typiaMetadataExpr(info, reg, prop.Value, true, state)
1317
+ overrideSources := []string{name}
1318
+ if display := strings.TrimSpace(obj.GetDisplayName()); display != "" && display != name {
1319
+ overrideSources = append(overrideSources, display)
1320
+ }
1321
+ overrideSources = append(overrideSources, state.sourceRaw)
1322
+ if override, ok := typiaSourcePropertyOverrideExpr(info, reg, "", propName, state.pos, overrideSources...); ok {
1323
+ valueExpr = override
1324
+ }
1325
+ properties = append(properties, "{kind: 20, name: "+quote(propName)+", type: "+valueExpr+", optional: "+boolLit(optional)+"}")
1326
+ }
1327
+ items := []string{"kind: 18"}
1328
+ if named {
1329
+ items = append(items, "typeName: "+quote(name))
1330
+ }
1331
+ if indexExpr != "" {
1332
+ items = append(items, "index: "+indexExpr)
1333
+ }
1334
+ items = append(items, "types: ["+strings.Join(properties, ", ")+"]")
1335
+ return typiaTaggedExpr("{"+strings.Join(items, ", ")+"}", object.Tags)
1336
+ }
1337
+
1338
+ func typiaNamedObjectInternalOverrideExpr(info *fileInfo, reg *registry, name string, pos int) (string, bool) {
1339
+ name = strings.TrimSpace(name)
1340
+ if !isIdentifierName(name) {
1341
+ return "", false
1342
+ }
1343
+ internalExpr := typeExprCtx(info, reg, name, &typeContext{seen: map[string]bool{}, pos: pos})
1344
+ if decl, owner, _, ok := resolveInterfaceDeclRefAt(info, reg, name, pos); ok {
1345
+ if sourcePropertiesNeedInternalObjectMetadata(owner, reg, interfaceFullProperties(owner, reg, decl, map[string]bool{}), pos) {
1346
+ return internalExpr, true
1347
+ }
1348
+ }
1349
+ if alias, owner, _, ok := resolveAliasRef(info, reg, name); ok && len(alias.params) == 0 {
1350
+ if sourceObjectTextNeedsInternalObjectMetadata(owner, reg, alias.body, pos) {
1351
+ return internalExpr, true
1352
+ }
1353
+ }
1354
+ if isResolvedInternalNamedObjectExpr(internalExpr, name) && internalObjectExprCarriesSourceMetadata(internalExpr) {
1355
+ return internalExpr, true
1356
+ }
1357
+ return "", false
1358
+ }
1359
+
1360
+ func isResolvedInternalNamedObjectExpr(expr string, name string) bool {
1361
+ expr = strings.TrimSpace(expr)
1362
+ return strings.Contains(expr, "kind: 18") &&
1363
+ strings.Contains(expr, "typeName: "+quote(name)) &&
1364
+ !isUnresolvedInternalTypeExpr(expr, name)
1365
+ }
1366
+
1367
+ func internalObjectExprCarriesSourceMetadata(expr string) bool {
1368
+ return strings.Contains(expr, "literal:") ||
1369
+ strings.Contains(expr, "classType: () => Date") ||
1370
+ strings.Contains(expr, "annotations:")
1371
+ }
1372
+
1373
+ func sourceObjectTextNeedsInternalObjectMetadata(info *fileInfo, reg *registry, raw string, pos int) bool {
1374
+ raw = strings.TrimSpace(trimParens(raw))
1375
+ if isObjectLiteralTypeText(raw) {
1376
+ return sourcePropertiesNeedInternalObjectMetadata(info, reg, propertiesFromBody(strings.TrimSpace(raw[1:len(raw)-1])), pos)
1377
+ }
1378
+ return sourceTypeContainsIndexedAccessSyntax(raw, map[string]bool{})
1379
+ }
1380
+
1381
+ func sourcePropertiesNeedInternalObjectMetadata(info *fileInfo, reg *registry, props []utilityProperty, pos int) bool {
1382
+ for _, prop := range props {
1383
+ if sourceTypeContainsIndexedAccessSyntax(prop.typeText, map[string]bool{}) {
1384
+ return true
1385
+ }
1386
+ if sourceTypeNeedsInternalPropertyMetadata(info, reg, prop.typeText, &typeContext{seen: map[string]bool{}, pos: pos}, map[string]bool{}) {
1387
+ return true
1388
+ }
1389
+ }
1390
+ return false
1391
+ }
1392
+
1393
+ func typiaObjectTypeName(info *fileInfo, reg *registry, obj *schemametadata.MetadataObjectType, pos int) (string, bool) {
1394
+ name := strings.TrimSpace(obj.GetDisplayName())
1395
+ if name == "" || isAnonymousTypiaObjectName(name) {
1396
+ return "", false
1397
+ }
1398
+ if obj.IsClass && isIdentifierName(obj.Name) {
1399
+ return name, true
1400
+ }
1401
+ if genericName, _, ok := generic(name); ok && isIdentifierName(genericName) {
1402
+ return name, true
1403
+ }
1404
+ if isIdentifierName(name) || typiaObjectNameIsDeclared(info, reg, name, pos) || typiaObjectNameIsUtilityDisplay(name) {
1405
+ return name, true
1406
+ }
1407
+ if obj.DisplayName != "" {
1408
+ return "", false
1409
+ }
1410
+ rawName := strings.TrimSpace(obj.Name)
1411
+ if rawName != "" && rawName != name && typiaObjectNameIsDeclared(info, reg, rawName, pos) {
1412
+ return name, true
1413
+ }
1414
+ return "", false
1415
+ }
1416
+
1417
+ func isAnonymousTypiaObjectName(name string) bool {
1418
+ name = strings.TrimSpace(name)
1419
+ return name == "" || strings.HasPrefix(name, "{") || strings.HasPrefix(name, "__")
1420
+ }
1421
+
1422
+ func typiaObjectNameIsDeclared(info *fileInfo, reg *registry, name string, pos int) bool {
1423
+ if !isIdentifierName(name) {
1424
+ return false
1425
+ }
1426
+ if _, _, _, ok := resolveAliasRef(info, reg, name); ok {
1427
+ return true
1428
+ }
1429
+ if _, _, _, ok := resolveInterfaceDeclRefAt(info, reg, name, pos); ok {
1430
+ return true
1431
+ }
1432
+ if _, _, ok := resolveClassRefAt(info, reg, name, pos); ok {
1433
+ return true
1434
+ }
1435
+ if ref, ok := info.imports[name]; ok {
1436
+ return isFoundationImportRef(ref)
1437
+ }
1438
+ return false
1439
+ }
1440
+
1441
+ func typiaObjectNameIsUtilityDisplay(name string) bool {
1442
+ if genericName, _, ok := generic(name); ok {
1443
+ name = genericName
1444
+ }
1445
+ switch strings.TrimSpace(name) {
1446
+ case "Pick", "Omit", "Partial", "Required", "Readonly", "OptionalNulls", "Record":
1447
+ return true
1448
+ default:
1449
+ return false
1450
+ }
1451
+ }
1452
+
1453
+ func typiaSourcePropertyOverrideExpr(info *fileInfo, reg *registry, sourceName string, propName string, pos int, alternateSources ...string) (string, bool) {
1454
+ sourceName = strings.TrimSpace(sourceName)
1455
+ propName = strings.TrimSpace(propName)
1456
+ if propName == "" {
1457
+ return "", false
1458
+ }
1459
+ sources := []string{sourceName}
1460
+ sources = append(sources, alternateSources...)
1461
+ for _, source := range sources {
1462
+ source = strings.TrimSpace(source)
1463
+ if source == "" {
1464
+ continue
1465
+ }
1466
+ ctx := &typeContext{seen: map[string]bool{}, pos: pos}
1467
+ propType, owner, ok := propertyTypeText(info, reg, source, propName, ctx)
1468
+ if !ok {
1469
+ continue
1470
+ }
1471
+ propType = strings.TrimSpace(propType)
1472
+ valueExpr := typeExprCtx(owner, reg, propType, &typeContext{seen: map[string]bool{}, pos: pos})
1473
+ if sourceTypeContainsIndexedAccessSyntax(propType, map[string]bool{}) && !isUnresolvedInternalTypeExpr(valueExpr, propType) {
1474
+ return valueExpr, true
1475
+ }
1476
+ if !sourceTypeNeedsInternalPropertyMetadata(owner, reg, propType, &typeContext{seen: map[string]bool{}, pos: pos}, map[string]bool{}) &&
1477
+ !typeContainsAliasReference(owner, reg, propType, map[string]bool{}) {
1478
+ continue
1479
+ }
1480
+ return valueExpr, true
1481
+ }
1482
+ return "", false
1483
+ }
1484
+
1485
+ func isUnresolvedInternalTypeExpr(expr string, raw string) bool {
1486
+ return strings.TrimSpace(expr) == "{kind: 2, typeName: "+quote(strings.TrimSpace(raw))+"}"
1487
+ }
1488
+
1489
+ func sourceTypeContainsIndexedAccessSyntax(raw string, seen map[string]bool) bool {
1490
+ raw = strings.TrimSpace(trimParens(raw))
1491
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
1492
+ if raw == "" {
1493
+ return false
1494
+ }
1495
+ key := raw
1496
+ if seen[key] {
1497
+ return false
1498
+ }
1499
+ seen[key] = true
1500
+
1501
+ if _, _, ok := trailingIndexedAccess(raw); ok {
1502
+ return true
1503
+ }
1504
+ for _, sep := range []string{"|", "&"} {
1505
+ if parts := nonEmptyParts(splitTop(raw, sep)); len(parts) > 1 {
1506
+ for _, part := range parts {
1507
+ if sourceTypeContainsIndexedAccessSyntax(part, seen) {
1508
+ return true
1509
+ }
1510
+ }
1511
+ return false
1512
+ }
1513
+ }
1514
+ if strings.HasSuffix(raw, "[]") {
1515
+ return sourceTypeContainsIndexedAccessSyntax(strings.TrimSuffix(raw, "[]"), seen)
1516
+ }
1517
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
1518
+ for _, part := range splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ",") {
1519
+ if sourceTypeContainsIndexedAccessSyntax(part, seen) {
1520
+ return true
1521
+ }
1522
+ }
1523
+ return false
1524
+ }
1525
+ if isObjectLiteralTypeText(raw) {
1526
+ for _, prop := range propertiesFromBody(strings.TrimSpace(raw[1 : len(raw)-1])) {
1527
+ if sourceTypeContainsIndexedAccessSyntax(prop.typeText, seen) {
1528
+ return true
1529
+ }
1530
+ }
1531
+ return false
1532
+ }
1533
+ if _, args, ok := generic(raw); ok {
1534
+ for _, arg := range args {
1535
+ if sourceTypeContainsIndexedAccessSyntax(arg, seen) {
1536
+ return true
1537
+ }
1538
+ }
1539
+ }
1540
+ return false
1541
+ }
1542
+
1543
+ func sourceTypeNeedsInternalPropertyMetadata(info *fileInfo, reg *registry, raw string, ctx *typeContext, seen map[string]bool) bool {
1544
+ return sourceTypeContainsDateType(info, reg, raw, ctx, seen) ||
1545
+ sourceTypeContainsOrderedLiteralUnion(info, reg, raw, ctx, map[string]bool{}) ||
1546
+ typeContainsExternalImportReference(info, reg, raw, map[string]bool{}) ||
1547
+ sourceTypeContainsInternalMetadata(info, reg, raw, ctx, map[string]bool{})
1548
+ }
1549
+
1550
+ func sourceTypeContainsOrderedLiteralUnion(info *fileInfo, reg *registry, raw string, ctx *typeContext, seen map[string]bool) bool {
1551
+ raw = strings.TrimSpace(trimParens(raw))
1552
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
1553
+ if raw == "" {
1554
+ return false
1555
+ }
1556
+ if isIdentifierName(raw) && isFoundationTypeIdentifier(info, raw) {
1557
+ return true
1558
+ }
1559
+ if ctx == nil {
1560
+ ctx = &typeContext{seen: map[string]bool{}}
1561
+ }
1562
+ key := info.moduleKey + "\x00literal-union-source\x00" + raw
1563
+ if seen[key] {
1564
+ return false
1565
+ }
1566
+ seen[key] = true
1567
+
1568
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
1569
+ nonNullish := nonNullishTypeParts(parts)
1570
+ if len(nonNullish) > 1 && hasLiteralUnionSyntax(nonNullish) {
1571
+ return true
1572
+ }
1573
+ return sourcePartsContainOrderedLiteralUnion(info, reg, parts, ctx, seen)
1574
+ }
1575
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
1576
+ return sourcePartsContainOrderedLiteralUnion(info, reg, parts, ctx, seen)
1577
+ }
1578
+ if strings.HasSuffix(raw, "[]") {
1579
+ return sourceTypeContainsOrderedLiteralUnion(info, reg, strings.TrimSuffix(raw, "[]"), ctx, seen)
1580
+ }
1581
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
1582
+ return sourcePartsContainOrderedLiteralUnion(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), ctx, seen)
1583
+ }
1584
+ if isObjectLiteralTypeText(raw) {
1585
+ for _, prop := range propertiesFromBody(strings.TrimSpace(raw[1 : len(raw)-1])) {
1586
+ if sourceTypeContainsOrderedLiteralUnion(info, reg, prop.typeText, ctx, seen) {
1587
+ return true
1588
+ }
1589
+ }
1590
+ return false
1591
+ }
1592
+ if name, args, ok := generic(raw); ok {
1593
+ for i, arg := range args {
1594
+ if (name == "Pick" || name == "Omit") && i > 0 {
1595
+ continue
1596
+ }
1597
+ if sourceTypeContainsOrderedLiteralUnion(info, reg, arg, ctx, seen) {
1598
+ return true
1599
+ }
1600
+ }
1601
+ }
1602
+ if resolved, owner, ok := resolveTypeText(info, reg, raw, ctx); ok && strings.TrimSpace(resolved) != raw {
1603
+ return sourceTypeContainsOrderedLiteralUnion(owner, reg, resolved, ctx, seen)
1604
+ }
1605
+ return false
1606
+ }
1607
+
1608
+ func sourcePartsContainOrderedLiteralUnion(info *fileInfo, reg *registry, parts []string, ctx *typeContext, seen map[string]bool) bool {
1609
+ for _, part := range parts {
1610
+ if sourceTypeContainsOrderedLiteralUnion(info, reg, part, ctx, seen) {
1611
+ return true
1612
+ }
1613
+ }
1614
+ return false
1615
+ }
1616
+
1617
+ func sourceTypeContainsInternalMetadata(info *fileInfo, reg *registry, raw string, ctx *typeContext, seen map[string]bool) bool {
1618
+ raw = strings.TrimSpace(trimParens(raw))
1619
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
1620
+ if raw == "" {
1621
+ return false
1622
+ }
1623
+ if ctx == nil {
1624
+ ctx = &typeContext{seen: map[string]bool{}}
1625
+ }
1626
+ key := info.moduleKey + "\x00internal-metadata-source\x00" + raw
1627
+ if seen[key] {
1628
+ return false
1629
+ }
1630
+ seen[key] = true
1631
+
1632
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
1633
+ return sourcePartsContainInternalMetadata(info, reg, parts, ctx, seen)
1634
+ }
1635
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
1636
+ return sourcePartsContainInternalMetadata(info, reg, parts, ctx, seen)
1637
+ }
1638
+ if strings.HasSuffix(raw, "[]") {
1639
+ return sourceTypeContainsInternalMetadata(info, reg, strings.TrimSuffix(raw, "[]"), ctx, seen)
1640
+ }
1641
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
1642
+ return sourcePartsContainInternalMetadata(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), ctx, seen)
1643
+ }
1644
+ if isObjectLiteralTypeText(raw) {
1645
+ for _, prop := range propertiesFromBody(strings.TrimSpace(raw[1 : len(raw)-1])) {
1646
+ if sourceTypeContainsInternalMetadata(info, reg, prop.typeText, ctx, seen) {
1647
+ return true
1648
+ }
1649
+ }
1650
+ return false
1651
+ }
1652
+ if name, args, ok := generic(raw); ok {
1653
+ if isInternalPropertyMetadataName(name) || isInternalPropertyMetadataTypiaTag(name, args) {
1654
+ return true
1655
+ }
1656
+ for i, arg := range args {
1657
+ if (name == "Pick" || name == "Omit") && i > 0 {
1658
+ continue
1659
+ }
1660
+ if sourceTypeContainsInternalMetadata(info, reg, arg, ctx, seen) {
1661
+ return true
1662
+ }
1663
+ }
1664
+ }
1665
+ if resolved, owner, ok := resolveTypeText(info, reg, raw, ctx); ok && strings.TrimSpace(resolved) != raw {
1666
+ return sourceTypeContainsInternalMetadata(owner, reg, resolved, ctx, seen)
1667
+ }
1668
+ return false
1669
+ }
1670
+
1671
+ func sourcePartsContainInternalMetadata(info *fileInfo, reg *registry, parts []string, ctx *typeContext, seen map[string]bool) bool {
1672
+ for _, part := range parts {
1673
+ if sourceTypeContainsInternalMetadata(info, reg, part, ctx, seen) {
1674
+ return true
1675
+ }
1676
+ }
1677
+ return false
1678
+ }
1679
+
1680
+ func isInternalPropertyMetadataName(name string) bool {
1681
+ switch strings.TrimSpace(name) {
1682
+ case "TypeAnnotation",
1683
+ "ApiName",
1684
+ "ApiType",
1685
+ "TsfDatabaseFieldTag",
1686
+ "TsfDatabaseTag",
1687
+ "DatabaseField",
1688
+ "MySQL":
1689
+ return true
1690
+ default:
1691
+ return false
1692
+ }
1693
+ }
1694
+
1695
+ func isInternalPropertyMetadataTypiaTag(name string, args []string) bool {
1696
+ name = strings.TrimSpace(name)
1697
+ if name == "Validate" {
1698
+ return true
1699
+ }
1700
+ if name == "TsfValidatorTag" && len(args) > 0 && literalStringValue(args[0]) == "object" {
1701
+ return true
1702
+ }
1703
+ return false
1704
+ }
1705
+
1706
+ func sourceTypeContainsDateType(info *fileInfo, reg *registry, raw string, ctx *typeContext, seen map[string]bool) bool {
1707
+ raw = strings.TrimSpace(trimParens(raw))
1708
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
1709
+ if raw == "" {
1710
+ return false
1711
+ }
1712
+ if raw == "Date" || (raw == "ValidDate" && isFoundationTypeIdentifier(info, raw)) {
1713
+ return true
1714
+ }
1715
+ if ctx == nil {
1716
+ ctx = &typeContext{seen: map[string]bool{}}
1717
+ }
1718
+ key := info.moduleKey + "\x00date-source\x00" + raw
1719
+ if seen[key] {
1720
+ return false
1721
+ }
1722
+ seen[key] = true
1723
+
1724
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
1725
+ return sourcePartsContainDateType(info, reg, parts, ctx, seen)
1726
+ }
1727
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
1728
+ return sourcePartsContainDateType(info, reg, parts, ctx, seen)
1729
+ }
1730
+ if strings.HasSuffix(raw, "[]") {
1731
+ return sourceTypeContainsDateType(info, reg, strings.TrimSuffix(raw, "[]"), ctx, seen)
1732
+ }
1733
+ if strings.HasPrefix(raw, "[") && strings.HasSuffix(raw, "]") {
1734
+ return sourcePartsContainDateType(info, reg, splitTop(strings.TrimSpace(raw[1:len(raw)-1]), ","), ctx, seen)
1735
+ }
1736
+ if isObjectLiteralTypeText(raw) {
1737
+ for _, prop := range propertiesFromBody(strings.TrimSpace(raw[1 : len(raw)-1])) {
1738
+ if sourceTypeContainsDateType(info, reg, prop.typeText, ctx, seen) {
1739
+ return true
1740
+ }
1741
+ }
1742
+ return false
1743
+ }
1744
+ if name, args, ok := generic(raw); ok {
1745
+ if name == "Date" {
1746
+ return true
1747
+ }
1748
+ for _, arg := range args {
1749
+ if sourceTypeContainsDateType(info, reg, arg, ctx, seen) {
1750
+ return true
1751
+ }
1752
+ }
1753
+ }
1754
+ if resolved, owner, ok := resolveTypeText(info, reg, raw, ctx); ok && strings.TrimSpace(resolved) != raw {
1755
+ return sourceTypeContainsDateType(owner, reg, resolved, ctx, seen)
1756
+ }
1757
+ return false
1758
+ }
1759
+
1760
+ func sourceTypeIsDateRootType(info *fileInfo, reg *registry, raw string, ctx *typeContext, seen map[string]bool) bool {
1761
+ raw = strings.TrimSpace(trimParens(raw))
1762
+ raw = strings.TrimSpace(strings.TrimPrefix(raw, "readonly "))
1763
+ if raw == "" {
1764
+ return false
1765
+ }
1766
+ if raw == "Date" || (raw == "ValidDate" && isFoundationTypeIdentifier(info, raw)) {
1767
+ return true
1768
+ }
1769
+ if ctx == nil {
1770
+ ctx = &typeContext{seen: map[string]bool{}}
1771
+ }
1772
+ key := info.moduleKey + "\x00date-root\x00" + raw
1773
+ if seen[key] {
1774
+ return false
1775
+ }
1776
+ seen[key] = true
1777
+
1778
+ if parts := nonEmptyParts(splitTop(raw, "|")); len(parts) > 1 {
1779
+ nonNullish := nonNullishTypeParts(parts)
1780
+ if len(nonNullish) == 0 {
1781
+ return false
1782
+ }
1783
+ for _, part := range nonNullish {
1784
+ if !sourceTypeIsDateRootType(info, reg, part, ctx, seen) {
1785
+ return false
1786
+ }
1787
+ }
1788
+ return true
1789
+ }
1790
+ if parts := nonEmptyParts(splitTop(raw, "&")); len(parts) > 1 {
1791
+ hasDate := false
1792
+ for _, part := range parts {
1793
+ if sourceTypeIsDateRootType(info, reg, part, ctx, seen) {
1794
+ hasDate = true
1795
+ continue
1796
+ }
1797
+ if isMetadataOnlyIntersectionPart(part) {
1798
+ continue
1799
+ }
1800
+ return false
1801
+ }
1802
+ return hasDate
1803
+ }
1804
+ if name, args, ok := generic(raw); ok {
1805
+ if name == "Date" || (name == "ValidDate" && isFoundationTypeIdentifier(info, name)) {
1806
+ return true
1807
+ }
1808
+ if name == "NonNullable" {
1809
+ return sourceTypeIsDateRootType(info, reg, firstArg(args), ctx, seen)
1810
+ }
1811
+ }
1812
+ if resolved, owner, ok := resolveTypeText(info, reg, raw, ctx); ok && strings.TrimSpace(resolved) != raw {
1813
+ return sourceTypeIsDateRootType(owner, reg, resolved, ctx, seen)
1814
+ }
1815
+ return false
1816
+ }
1817
+
1818
+ func isFoundationTypeIdentifier(info *fileInfo, name string) bool {
1819
+ ref, ok := info.imports[name]
1820
+ return ok && isFoundationImportRef(ref)
1821
+ }
1822
+
1823
+ func sourcePartsContainDateType(info *fileInfo, reg *registry, parts []string, ctx *typeContext, seen map[string]bool) bool {
1824
+ for _, part := range parts {
1825
+ if sourceTypeContainsDateType(info, reg, part, ctx, seen) {
1826
+ return true
1827
+ }
1828
+ }
1829
+ return false
1830
+ }
1831
+
1832
+ func typiaIndexPropertyExpr(info *fileInfo, reg *registry, prop *schemametadata.MetadataProperty, state *typiaRenderState) (string, bool) {
1833
+ if prop == nil || prop.Key == nil || prop.Value == nil || prop.Key.GetSoleLiteral() != nil {
1834
+ return "", false
1835
+ }
1836
+ if prop.Key.Any ||
1837
+ prop.Key.Escaped != nil ||
1838
+ prop.Key.Rest != nil ||
1839
+ len(prop.Key.Templates) != 0 ||
1840
+ len(prop.Key.Constants) != 0 ||
1841
+ len(prop.Key.Arrays) != 0 ||
1842
+ len(prop.Key.Tuples) != 0 ||
1843
+ len(prop.Key.Objects) != 0 ||
1844
+ len(prop.Key.Aliases) != 0 ||
1845
+ len(prop.Key.Natives) != 0 ||
1846
+ len(prop.Key.Sets) != 0 ||
1847
+ len(prop.Key.Maps) != 0 ||
1848
+ len(prop.Key.Functions) != 0 ||
1849
+ len(prop.Key.Atomics) != 1 {
1850
+ return "", false
1851
+ }
1852
+ switch prop.Key.Atomics[0].Type {
1853
+ case "string", "number":
1854
+ return typiaMetadataExpr(info, reg, prop.Value, true, state), true
1855
+ default:
1856
+ return "", false
1857
+ }
1858
+ }
1859
+
1860
+ func typiaAliasExpr(info *fileInfo, reg *registry, alias *schemametadata.MetadataAlias, state *typiaRenderState) string {
1861
+ if alias == nil || alias.Type == nil {
1862
+ return "{kind: 2}"
1863
+ }
1864
+ if state.aliases[alias.Type] {
1865
+ return "{kind: 2, typeName: " + quote(alias.GetDisplayName()) + "}"
1866
+ }
1867
+ state.aliases[alias.Type] = true
1868
+ defer delete(state.aliases, alias.Type)
1869
+
1870
+ if alias.Type.Value == nil {
1871
+ return "{kind: 2, typeName: " + quote(alias.GetDisplayName()) + "}"
1872
+ }
1873
+ return typiaTaggedExpr(withTypeName(typiaMetadataExpr(info, reg, alias.Type.Value, true, state), alias.GetDisplayName()), alias.Tags)
1874
+ }
1875
+
1876
+ func typiaNativeExpr(info *fileInfo, reg *registry, native *schemametadata.MetadataNative) string {
1877
+ if native == nil {
1878
+ return "{kind: 2}"
1879
+ }
1880
+ name := native.Name
1881
+ if name == "" {
1882
+ name = native.GetName()
1883
+ }
1884
+ if isIdentifierName(name) {
1885
+ return typiaTaggedExpr("{kind: 16, typeName: "+quote(native.GetName())+", classType: () => "+runtimeValueExpr(info, reg, name)+"}", native.Tags)
1886
+ }
1887
+ return typiaTaggedExpr("{kind: 2, typeName: "+quote(native.GetName())+"}", native.Tags)
1888
+ }
1889
+
1890
+ func typiaTaggedExpr(base string, tags [][]schemametadata.IMetadataTypeTag) string {
1891
+ markers := typiaTagMarkerExprs(tags)
1892
+ if len(markers) == 0 {
1893
+ return base
1894
+ }
1895
+ types := append([]string{base}, markers...)
1896
+ return "{kind: 13, types: [" + strings.Join(types, ", ") + "]}"
1897
+ }
1898
+
1899
+ func typiaTagMarkerExprs(tags [][]schemametadata.IMetadataTypeTag) []string {
1900
+ out := []string{}
1901
+ seen := map[string]bool{}
1902
+ for _, row := range tags {
1903
+ for _, tag := range row {
1904
+ expr := typiaTagMarkerExpr(tag)
1905
+ if expr == "" || seen[expr] {
1906
+ continue
1907
+ }
1908
+ seen[expr] = true
1909
+ out = append(out, expr)
1910
+ }
1911
+ }
1912
+ return out
1913
+ }
1914
+
1915
+ func typiaTagMarkerExpr(tag schemametadata.IMetadataTypeTag) string {
1916
+ switch tag.Kind {
1917
+ case "minLength":
1918
+ return validationMarker("MinLength", "minLength", typiaNumericTagValueTypeExpr(tag.Value))
1919
+ case "maxLength":
1920
+ return validationMarker("MaxLength", "maxLength", typiaNumericTagValueTypeExpr(tag.Value))
1921
+ case "minimum":
1922
+ return validationMarker("Minimum", "minimum", typiaNumericTagValueTypeExpr(tag.Value))
1923
+ case "greaterThan":
1924
+ return validationMarker("GreaterThan", "greaterThan", typiaNumericTagValueTypeExpr(tag.Value))
1925
+ case "maximum":
1926
+ return validationMarker("Maximum", "maximum", typiaNumericTagValueTypeExpr(tag.Value))
1927
+ case "lessThan":
1928
+ return validationMarker("LessThan", "lessThan", typiaNumericTagValueTypeExpr(tag.Value))
1929
+ case "pattern":
1930
+ return validationMarker("Pattern", "pattern", typiaTagValueTypeExpr(tag.Value))
1931
+ case "format":
1932
+ if pattern := typiaFormatPatternArg(fmt.Sprint(tag.Value)); pattern != "" {
1933
+ return validationMarker("Format", "pattern", pattern)
1934
+ }
1935
+ return ""
1936
+ case "database:field":
1937
+ return "{kind: 2, typeName: \"DatabaseField\", database: {\"*\": " + typiaTagPayloadPlainValueExpr(tag) + "}}"
1938
+ case "database:mysql":
1939
+ return "{kind: 2, typeName: \"MySQL\", database: {mysql: " + typiaTagPayloadPlainValueExpr(tag) + "}}"
1940
+ case "database:primaryKey":
1941
+ return "{kind: 2, typeName: \"PrimaryKey\"}"
1942
+ case "database:autoIncrement":
1943
+ return "{kind: 2, typeName: \"AutoIncrement\"}"
1944
+ case "database:reference":
1945
+ return "{kind: 2, typeName: \"Reference\"}"
1946
+ case "database:index":
1947
+ return "{kind: 2, typeName: \"Index\"}"
1948
+ case "database:unique":
1949
+ return "{kind: 2, typeName: \"Unique\"}"
1950
+ default:
1951
+ if strings.HasPrefix(tag.Kind, "tsf:") || strings.HasPrefix(tag.Kind, "openapi:") {
1952
+ if tag.Kind == "tsf:length" {
1953
+ return typeAnnotationMarker("TypeAnnotation", tag.Kind, typiaNumericTagValueTypeExpr(tag.Value))
1954
+ }
1955
+ if tag.Kind == "tsf:validator" {
1956
+ return validationMarker("Validator", "validator", typiaTagValueTypeExpr(tag.Value))
1957
+ }
1958
+ return typeAnnotationMarker("TypeAnnotation", tag.Kind, typiaTagValueTypeExpr(tag.Value))
1959
+ }
1960
+ return ""
1961
+ }
1962
+ }
1963
+
1964
+ func typiaFormatPatternArg(format string) string {
1965
+ switch format {
1966
+ case "date":
1967
+ return "{kind: 10, literal: \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"}"
1968
+ case "email":
1969
+ return "{kind: 10, literal: \"^[a-zA-Z0-9_+.-]+@[a-zA-Z0-9-.]+\\\\.[a-zA-Z]+$\"}"
1970
+ case "uuid":
1971
+ return "{kind: 10, literal: \"^(?:urn:uuid:)?[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$\"}"
1972
+ default:
1973
+ return ""
1974
+ }
1975
+ }
1976
+
1977
+ func typiaTagValueTypeExpr(value any) string {
1978
+ switch v := value.(type) {
1979
+ case nil:
1980
+ return "{kind: 4}"
1981
+ case map[string]any:
1982
+ keys := make([]string, 0, len(v))
1983
+ for key := range v {
1984
+ keys = append(keys, key)
1985
+ }
1986
+ sort.Strings(keys)
1987
+ props := make([]string, 0, len(keys))
1988
+ for _, key := range keys {
1989
+ props = append(props, "{kind: 20, name: "+quote(key)+", type: "+typiaTagValueTypeExpr(v[key])+", optional: false}")
1990
+ }
1991
+ return "{kind: 18, types: [" + strings.Join(props, ", ") + "]}"
1992
+ case []any:
1993
+ items := make([]string, 0, len(v))
1994
+ for _, item := range v {
1995
+ items = append(items, "{type: "+typiaTagValueTypeExpr(item)+"}")
1996
+ }
1997
+ return "{kind: 15, types: [" + strings.Join(items, ", ") + "]}"
1998
+ default:
1999
+ return "{kind: 10, literal: " + typiaLiteralExpr(value) + "}"
2000
+ }
2001
+ }
2002
+
2003
+ func typiaNumericTagValueTypeExpr(value any) string {
2004
+ if value != nil {
2005
+ str := fmt.Sprint(value)
2006
+ if _, err := strconv.ParseFloat(str, 64); err == nil {
2007
+ return "{kind: 10, literal: " + str + "}"
2008
+ }
2009
+ }
2010
+ return typiaTagValueTypeExpr(value)
2011
+ }
2012
+
2013
+ func typiaTagPayloadPlainValueExpr(tag schemametadata.IMetadataTypeTag) string {
2014
+ if tag.Schema != nil {
2015
+ return typiaPlainValueExpr(tag.Schema)
2016
+ }
2017
+ return typiaPlainValueExpr(tag.Value)
2018
+ }
2019
+
2020
+ func typiaPlainValueExpr(value any) string {
2021
+ switch v := value.(type) {
2022
+ case nil:
2023
+ return "undefined"
2024
+ case map[string]any:
2025
+ keys := make([]string, 0, len(v))
2026
+ for key := range v {
2027
+ keys = append(keys, key)
2028
+ }
2029
+ sort.Strings(keys)
2030
+ props := make([]string, 0, len(keys))
2031
+ for _, key := range keys {
2032
+ props = append(props, quote(key)+": "+typiaPlainValueExpr(v[key]))
2033
+ }
2034
+ return "{" + strings.Join(props, ", ") + "}"
2035
+ case []any:
2036
+ items := make([]string, 0, len(v))
2037
+ for _, item := range v {
2038
+ items = append(items, typiaPlainValueExpr(item))
2039
+ }
2040
+ return "[" + strings.Join(items, ", ") + "]"
2041
+ default:
2042
+ return typiaLiteralExpr(value)
2043
+ }
2044
+ }
2045
+
2046
+ func typiaPropertyName(prop *schemametadata.MetadataProperty) string {
2047
+ if literal := prop.Key.GetSoleLiteral(); literal != nil {
2048
+ return *literal
2049
+ }
2050
+ name := strings.TrimSpace(prop.Key.GetName())
2051
+ if strings.HasPrefix(name, "\"") || strings.HasPrefix(name, "'") {
2052
+ return literalStringValue(name)
2053
+ }
2054
+ return name
2055
+ }
2056
+
2057
+ func typiaUnionExpr(types []string) string {
2058
+ out := make([]string, 0, len(types))
2059
+ seen := map[string]bool{}
2060
+ for _, typ := range types {
2061
+ typ = strings.TrimSpace(typ)
2062
+ if typ == "" || seen[typ] {
2063
+ continue
2064
+ }
2065
+ seen[typ] = true
2066
+ out = append(out, typ)
2067
+ }
2068
+ if len(out) == 0 {
2069
+ return "{kind: 2}"
2070
+ }
2071
+ if len(out) == 1 {
2072
+ return out[0]
2073
+ }
2074
+ return "{kind: 12, types: [" + strings.Join(out, ", ") + "]}"
2075
+ }
2076
+
2077
+ func typiaLiteralExpr(value any) string {
2078
+ switch v := value.(type) {
2079
+ case nil:
2080
+ return "null"
2081
+ case string:
2082
+ return quote(v)
2083
+ case bool:
2084
+ return boolLit(v)
2085
+ case int:
2086
+ return strconv.Itoa(v)
2087
+ case int8:
2088
+ return strconv.FormatInt(int64(v), 10)
2089
+ case int16:
2090
+ return strconv.FormatInt(int64(v), 10)
2091
+ case int32:
2092
+ return strconv.FormatInt(int64(v), 10)
2093
+ case int64:
2094
+ return strconv.FormatInt(v, 10)
2095
+ case uint:
2096
+ return strconv.FormatUint(uint64(v), 10)
2097
+ case uint8:
2098
+ return strconv.FormatUint(uint64(v), 10)
2099
+ case uint16:
2100
+ return strconv.FormatUint(uint64(v), 10)
2101
+ case uint32:
2102
+ return strconv.FormatUint(uint64(v), 10)
2103
+ case uint64:
2104
+ return strconv.FormatUint(v, 10)
2105
+ case float32:
2106
+ return typiaFloatLiteral(float64(v), 32)
2107
+ case float64:
2108
+ return typiaFloatLiteral(v, 64)
2109
+ default:
2110
+ return quote(fmt.Sprint(v))
2111
+ }
2112
+ }
2113
+
2114
+ func typiaFloatLiteral(value float64, bitSize int) string {
2115
+ if math.IsNaN(value) || math.IsInf(value, 0) {
2116
+ return quote(strconv.FormatFloat(value, 'g', -1, bitSize))
2117
+ }
2118
+ return strconv.FormatFloat(value, 'f', -1, bitSize)
2119
+ }