@book000/twitterts 0.49.6 → 0.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/README.md +6 -0
  2. package/dist/converter.d.ts +0 -45
  3. package/dist/converter.d.ts.map +1 -1
  4. package/dist/converter.js +0 -51
  5. package/dist/converter.js.map +1 -1
  6. package/dist/generate-types/custom-types-generator.d.ts +6 -45
  7. package/dist/generate-types/custom-types-generator.d.ts.map +1 -1
  8. package/dist/generate-types/custom-types-generator.js +299 -385
  9. package/dist/generate-types/custom-types-generator.js.map +1 -1
  10. package/dist/generate-types/endpoint-type-generator.d.ts +11 -60
  11. package/dist/generate-types/endpoint-type-generator.d.ts.map +1 -1
  12. package/dist/generate-types/endpoint-type-generator.js +54 -94
  13. package/dist/generate-types/endpoint-type-generator.js.map +1 -1
  14. package/dist/generate-types/types-generator.d.ts +3 -36
  15. package/dist/generate-types/types-generator.d.ts.map +1 -1
  16. package/dist/generate-types/types-generator.js +40 -40
  17. package/dist/generate-types/types-generator.js.map +1 -1
  18. package/dist/generate-types/utils.d.ts +0 -94
  19. package/dist/generate-types/utils.d.ts.map +1 -1
  20. package/dist/generate-types/utils.js +0 -168
  21. package/dist/generate-types/utils.js.map +1 -1
  22. package/dist/generate-types.js +16 -6
  23. package/dist/generate-types.js.map +1 -1
  24. package/dist/migrate-saved-response.d.ts +2 -0
  25. package/dist/migrate-saved-response.d.ts.map +1 -0
  26. package/dist/migrate-saved-response.js +178 -0
  27. package/dist/migrate-saved-response.js.map +1 -0
  28. package/dist/models/exceptions.d.ts +0 -33
  29. package/dist/models/exceptions.d.ts.map +1 -1
  30. package/dist/models/exceptions.js +0 -33
  31. package/dist/models/exceptions.js.map +1 -1
  32. package/dist/models/responses/custom/custom-graph-qltimeline-success-response.d.ts +0 -1
  33. package/dist/models/responses/custom/custom-graph-qltimeline-success-response.d.ts.map +1 -1
  34. package/dist/models/responses/custom/custom-graph-qltimeline-success-response.js +0 -1
  35. package/dist/models/responses/custom/custom-graph-qltimeline-success-response.js.map +1 -1
  36. package/dist/models/responses/custom/custom-search-timeline-entry.d.ts +0 -1
  37. package/dist/models/responses/custom/custom-search-timeline-entry.d.ts.map +1 -1
  38. package/dist/models/responses/custom/custom-search-timeline-entry.js +0 -1
  39. package/dist/models/responses/custom/custom-search-timeline-entry.js.map +1 -1
  40. package/dist/models/responses/custom/custom-timeline-tweet-entry.d.ts +0 -1
  41. package/dist/models/responses/custom/custom-timeline-tweet-entry.d.ts.map +1 -1
  42. package/dist/models/responses/custom/custom-timeline-tweet-entry.js +0 -1
  43. package/dist/models/responses/custom/custom-timeline-tweet-entry.js.map +1 -1
  44. package/dist/models/responses/custom/custom-tweet-legacy-object.d.ts +0 -1
  45. package/dist/models/responses/custom/custom-tweet-legacy-object.d.ts.map +1 -1
  46. package/dist/models/responses/custom/custom-tweet-legacy-object.js +0 -1
  47. package/dist/models/responses/custom/custom-tweet-legacy-object.js.map +1 -1
  48. package/dist/models/responses/custom/custom-tweet-object.d.ts +0 -1
  49. package/dist/models/responses/custom/custom-tweet-object.d.ts.map +1 -1
  50. package/dist/models/responses/custom/custom-tweet-object.js +0 -1
  51. package/dist/models/responses/custom/custom-tweet-object.js.map +1 -1
  52. package/dist/models/responses/custom/custom-user-legacy-object.d.ts +0 -1
  53. package/dist/models/responses/custom/custom-user-legacy-object.d.ts.map +1 -1
  54. package/dist/models/responses/custom/custom-user-legacy-object.js +0 -1
  55. package/dist/models/responses/custom/custom-user-legacy-object.js.map +1 -1
  56. package/dist/models/responses/custom/custom-user-like-tweet-entry.d.ts +0 -1
  57. package/dist/models/responses/custom/custom-user-like-tweet-entry.d.ts.map +1 -1
  58. package/dist/models/responses/custom/custom-user-like-tweet-entry.js +0 -1
  59. package/dist/models/responses/custom/custom-user-like-tweet-entry.js.map +1 -1
  60. package/dist/models/responses/custom/custom-user-tweet-entry.d.ts +0 -1
  61. package/dist/models/responses/custom/custom-user-tweet-entry.d.ts.map +1 -1
  62. package/dist/models/responses/custom/custom-user-tweet-entry.js +0 -1
  63. package/dist/models/responses/custom/custom-user-tweet-entry.js.map +1 -1
  64. package/dist/models/responses/endpoints.d.ts +0 -29
  65. package/dist/models/responses/endpoints.d.ts.map +1 -1
  66. package/dist/models/responses/graphql/get/article-nudge-domains-error.d.ts +0 -1
  67. package/dist/models/responses/graphql/get/article-nudge-domains-error.d.ts.map +1 -1
  68. package/dist/models/responses/graphql/get/article-nudge-domains-error.js +0 -1
  69. package/dist/models/responses/graphql/get/article-nudge-domains-error.js.map +1 -1
  70. package/dist/models/responses/graphql/get/article-nudge-domains-success.d.ts +0 -1
  71. package/dist/models/responses/graphql/get/article-nudge-domains-success.d.ts.map +1 -1
  72. package/dist/models/responses/graphql/get/article-nudge-domains-success.js +0 -1
  73. package/dist/models/responses/graphql/get/article-nudge-domains-success.js.map +1 -1
  74. package/dist/models/responses/graphql/get/audio-space-by-id-success.d.ts +0 -1
  75. package/dist/models/responses/graphql/get/audio-space-by-id-success.d.ts.map +1 -1
  76. package/dist/models/responses/graphql/get/audio-space-by-id-success.js +0 -1
  77. package/dist/models/responses/graphql/get/audio-space-by-id-success.js.map +1 -1
  78. package/dist/models/responses/graphql/get/authenticated-user-tflists-success.d.ts +0 -1
  79. package/dist/models/responses/graphql/get/authenticated-user-tflists-success.d.ts.map +1 -1
  80. package/dist/models/responses/graphql/get/authenticated-user-tflists-success.js +0 -1
  81. package/dist/models/responses/graphql/get/authenticated-user-tflists-success.js.map +1 -1
  82. package/dist/models/responses/graphql/get/bookmarks-success.d.ts +0 -1
  83. package/dist/models/responses/graphql/get/bookmarks-success.d.ts.map +1 -1
  84. package/dist/models/responses/graphql/get/bookmarks-success.js +0 -1
  85. package/dist/models/responses/graphql/get/bookmarks-success.js.map +1 -1
  86. package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.d.ts +0 -1
  87. package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.d.ts.map +1 -1
  88. package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.js +0 -1
  89. package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.js.map +1 -1
  90. package/dist/models/responses/graphql/get/connect-tab-timeline-success.d.ts +0 -1
  91. package/dist/models/responses/graphql/get/connect-tab-timeline-success.d.ts.map +1 -1
  92. package/dist/models/responses/graphql/get/connect-tab-timeline-success.js +0 -1
  93. package/dist/models/responses/graphql/get/connect-tab-timeline-success.js.map +1 -1
  94. package/dist/models/responses/graphql/get/data-saver-mode-error.d.ts +0 -1
  95. package/dist/models/responses/graphql/get/data-saver-mode-error.d.ts.map +1 -1
  96. package/dist/models/responses/graphql/get/data-saver-mode-error.js +0 -1
  97. package/dist/models/responses/graphql/get/data-saver-mode-error.js.map +1 -1
  98. package/dist/models/responses/graphql/get/data-saver-mode-success.d.ts +0 -1
  99. package/dist/models/responses/graphql/get/data-saver-mode-success.d.ts.map +1 -1
  100. package/dist/models/responses/graphql/get/data-saver-mode-success.js +0 -1
  101. package/dist/models/responses/graphql/get/data-saver-mode-success.js.map +1 -1
  102. package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.d.ts +0 -1
  103. package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.d.ts.map +1 -1
  104. package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.js +0 -1
  105. package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.js.map +1 -1
  106. package/dist/models/responses/graphql/get/follow-host-button-query-success.d.ts +0 -1
  107. package/dist/models/responses/graphql/get/follow-host-button-query-success.d.ts.map +1 -1
  108. package/dist/models/responses/graphql/get/follow-host-button-query-success.js +0 -1
  109. package/dist/models/responses/graphql/get/follow-host-button-query-success.js.map +1 -1
  110. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.d.ts +0 -1
  111. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.d.ts.map +1 -1
  112. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.js +0 -1
  113. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.js.map +1 -1
  114. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.d.ts +0 -1
  115. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.d.ts.map +1 -1
  116. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.js +0 -1
  117. package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.js.map +1 -1
  118. package/dist/models/responses/graphql/get/get-user-claims-error.d.ts +0 -1
  119. package/dist/models/responses/graphql/get/get-user-claims-error.d.ts.map +1 -1
  120. package/dist/models/responses/graphql/get/get-user-claims-error.js +0 -1
  121. package/dist/models/responses/graphql/get/get-user-claims-error.js.map +1 -1
  122. package/dist/models/responses/graphql/get/get-user-claims-success.d.ts +0 -1
  123. package/dist/models/responses/graphql/get/get-user-claims-success.d.ts.map +1 -1
  124. package/dist/models/responses/graphql/get/get-user-claims-success.js +0 -1
  125. package/dist/models/responses/graphql/get/get-user-claims-success.js.map +1 -1
  126. package/dist/models/responses/graphql/get/home-latest-timeline-success.d.ts +0 -1
  127. package/dist/models/responses/graphql/get/home-latest-timeline-success.d.ts.map +1 -1
  128. package/dist/models/responses/graphql/get/home-latest-timeline-success.js +0 -1
  129. package/dist/models/responses/graphql/get/home-latest-timeline-success.js.map +1 -1
  130. package/dist/models/responses/graphql/get/home-timeline-success.d.ts +0 -1
  131. package/dist/models/responses/graphql/get/home-timeline-success.d.ts.map +1 -1
  132. package/dist/models/responses/graphql/get/home-timeline-success.js +0 -1
  133. package/dist/models/responses/graphql/get/home-timeline-success.js.map +1 -1
  134. package/dist/models/responses/graphql/get/likes-error.d.ts +0 -1
  135. package/dist/models/responses/graphql/get/likes-error.d.ts.map +1 -1
  136. package/dist/models/responses/graphql/get/likes-error.js +0 -1
  137. package/dist/models/responses/graphql/get/likes-error.js.map +1 -1
  138. package/dist/models/responses/graphql/get/likes-success.d.ts +0 -1
  139. package/dist/models/responses/graphql/get/likes-success.d.ts.map +1 -1
  140. package/dist/models/responses/graphql/get/likes-success.js +0 -1
  141. package/dist/models/responses/graphql/get/likes-success.js.map +1 -1
  142. package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.d.ts +0 -1
  143. package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.d.ts.map +1 -1
  144. package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.js +0 -1
  145. package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.js.map +1 -1
  146. package/dist/models/responses/graphql/get/list-pins-error.d.ts +0 -1
  147. package/dist/models/responses/graphql/get/list-pins-error.d.ts.map +1 -1
  148. package/dist/models/responses/graphql/get/list-pins-error.js +0 -1
  149. package/dist/models/responses/graphql/get/list-pins-error.js.map +1 -1
  150. package/dist/models/responses/graphql/get/list-pins-success.d.ts +0 -1
  151. package/dist/models/responses/graphql/get/list-pins-success.d.ts.map +1 -1
  152. package/dist/models/responses/graphql/get/list-pins-success.js +0 -1
  153. package/dist/models/responses/graphql/get/list-pins-success.js.map +1 -1
  154. package/dist/models/responses/graphql/get/lists-management-page-timeline-success.d.ts +0 -1
  155. package/dist/models/responses/graphql/get/lists-management-page-timeline-success.d.ts.map +1 -1
  156. package/dist/models/responses/graphql/get/lists-management-page-timeline-success.js +0 -1
  157. package/dist/models/responses/graphql/get/lists-management-page-timeline-success.js.map +1 -1
  158. package/dist/models/responses/graphql/get/profile-spotlights-query-error.d.ts +0 -1
  159. package/dist/models/responses/graphql/get/profile-spotlights-query-error.d.ts.map +1 -1
  160. package/dist/models/responses/graphql/get/profile-spotlights-query-error.js +0 -1
  161. package/dist/models/responses/graphql/get/profile-spotlights-query-error.js.map +1 -1
  162. package/dist/models/responses/graphql/get/profile-spotlights-query-success.d.ts +0 -1
  163. package/dist/models/responses/graphql/get/profile-spotlights-query-success.d.ts.map +1 -1
  164. package/dist/models/responses/graphql/get/profile-spotlights-query-success.js +0 -1
  165. package/dist/models/responses/graphql/get/profile-spotlights-query-success.js.map +1 -1
  166. package/dist/models/responses/graphql/get/quick-promote-eligibility-success.d.ts +0 -1
  167. package/dist/models/responses/graphql/get/quick-promote-eligibility-success.d.ts.map +1 -1
  168. package/dist/models/responses/graphql/get/quick-promote-eligibility-success.js +0 -1
  169. package/dist/models/responses/graphql/get/quick-promote-eligibility-success.js.map +1 -1
  170. package/dist/models/responses/graphql/get/search-timeline-success.d.ts +0 -1
  171. package/dist/models/responses/graphql/get/search-timeline-success.d.ts.map +1 -1
  172. package/dist/models/responses/graphql/get/search-timeline-success.js +0 -1
  173. package/dist/models/responses/graphql/get/search-timeline-success.js.map +1 -1
  174. package/dist/models/responses/graphql/get/tweet-detail-error.d.ts +0 -1
  175. package/dist/models/responses/graphql/get/tweet-detail-error.d.ts.map +1 -1
  176. package/dist/models/responses/graphql/get/tweet-detail-error.js +0 -1
  177. package/dist/models/responses/graphql/get/tweet-detail-error.js.map +1 -1
  178. package/dist/models/responses/graphql/get/tweet-detail-success.d.ts +0 -1
  179. package/dist/models/responses/graphql/get/tweet-detail-success.d.ts.map +1 -1
  180. package/dist/models/responses/graphql/get/tweet-detail-success.js +0 -1
  181. package/dist/models/responses/graphql/get/tweet-detail-success.js.map +1 -1
  182. package/dist/models/responses/graphql/get/user-by-rest-id-success.d.ts +0 -1
  183. package/dist/models/responses/graphql/get/user-by-rest-id-success.d.ts.map +1 -1
  184. package/dist/models/responses/graphql/get/user-by-rest-id-success.js +0 -1
  185. package/dist/models/responses/graphql/get/user-by-rest-id-success.js.map +1 -1
  186. package/dist/models/responses/graphql/get/user-by-screen-name-error.d.ts +0 -1
  187. package/dist/models/responses/graphql/get/user-by-screen-name-error.d.ts.map +1 -1
  188. package/dist/models/responses/graphql/get/user-by-screen-name-error.js +0 -1
  189. package/dist/models/responses/graphql/get/user-by-screen-name-error.js.map +1 -1
  190. package/dist/models/responses/graphql/get/user-by-screen-name-success.d.ts +0 -1
  191. package/dist/models/responses/graphql/get/user-by-screen-name-success.d.ts.map +1 -1
  192. package/dist/models/responses/graphql/get/user-by-screen-name-success.js +0 -1
  193. package/dist/models/responses/graphql/get/user-by-screen-name-success.js.map +1 -1
  194. package/dist/models/responses/graphql/get/user-media-success.d.ts +0 -1
  195. package/dist/models/responses/graphql/get/user-media-success.d.ts.map +1 -1
  196. package/dist/models/responses/graphql/get/user-media-success.js +0 -1
  197. package/dist/models/responses/graphql/get/user-media-success.js.map +1 -1
  198. package/dist/models/responses/graphql/get/user-tweets-and-replies-success.d.ts +0 -1
  199. package/dist/models/responses/graphql/get/user-tweets-and-replies-success.d.ts.map +1 -1
  200. package/dist/models/responses/graphql/get/user-tweets-and-replies-success.js +0 -1
  201. package/dist/models/responses/graphql/get/user-tweets-and-replies-success.js.map +1 -1
  202. package/dist/models/responses/graphql/get/user-tweets-error.d.ts +0 -1
  203. package/dist/models/responses/graphql/get/user-tweets-error.d.ts.map +1 -1
  204. package/dist/models/responses/graphql/get/user-tweets-error.js +0 -1
  205. package/dist/models/responses/graphql/get/user-tweets-error.js.map +1 -1
  206. package/dist/models/responses/graphql/get/user-tweets-success.d.ts +0 -1
  207. package/dist/models/responses/graphql/get/user-tweets-success.d.ts.map +1 -1
  208. package/dist/models/responses/graphql/get/user-tweets-success.js +0 -1
  209. package/dist/models/responses/graphql/get/user-tweets-success.js.map +1 -1
  210. package/dist/models/responses/graphql/get/users-by-rest-ids-success.d.ts +0 -1
  211. package/dist/models/responses/graphql/get/users-by-rest-ids-success.d.ts.map +1 -1
  212. package/dist/models/responses/graphql/get/users-by-rest-ids-success.js +0 -1
  213. package/dist/models/responses/graphql/get/users-by-rest-ids-success.js.map +1 -1
  214. package/dist/models/responses/graphql/get/users-verified-avatars-success.d.ts +0 -1
  215. package/dist/models/responses/graphql/get/users-verified-avatars-success.d.ts.map +1 -1
  216. package/dist/models/responses/graphql/get/users-verified-avatars-success.js +0 -1
  217. package/dist/models/responses/graphql/get/users-verified-avatars-success.js.map +1 -1
  218. package/dist/models/responses/graphql/get/viewer-success.d.ts +0 -1
  219. package/dist/models/responses/graphql/get/viewer-success.d.ts.map +1 -1
  220. package/dist/models/responses/graphql/get/viewer-success.js +0 -1
  221. package/dist/models/responses/graphql/get/viewer-success.js.map +1 -1
  222. package/dist/models/responses/graphql/post/create-retweet-success.d.ts +0 -1
  223. package/dist/models/responses/graphql/post/create-retweet-success.d.ts.map +1 -1
  224. package/dist/models/responses/graphql/post/create-retweet-success.js +0 -1
  225. package/dist/models/responses/graphql/post/create-retweet-success.js.map +1 -1
  226. package/dist/models/responses/graphql/post/delete-retweet-success.d.ts +0 -1
  227. package/dist/models/responses/graphql/post/delete-retweet-success.d.ts.map +1 -1
  228. package/dist/models/responses/graphql/post/delete-retweet-success.js +0 -1
  229. package/dist/models/responses/graphql/post/delete-retweet-success.js.map +1 -1
  230. package/dist/models/responses/graphql/post/favorite-tweet-success.d.ts +0 -1
  231. package/dist/models/responses/graphql/post/favorite-tweet-success.d.ts.map +1 -1
  232. package/dist/models/responses/graphql/post/favorite-tweet-success.js +0 -1
  233. package/dist/models/responses/graphql/post/favorite-tweet-success.js.map +1 -1
  234. package/dist/models/responses/graphql/post/home-latest-timeline-error.d.ts +0 -1
  235. package/dist/models/responses/graphql/post/home-latest-timeline-error.d.ts.map +1 -1
  236. package/dist/models/responses/graphql/post/home-latest-timeline-error.js +0 -1
  237. package/dist/models/responses/graphql/post/home-latest-timeline-error.js.map +1 -1
  238. package/dist/models/responses/graphql/post/home-latest-timeline-success.d.ts +0 -1
  239. package/dist/models/responses/graphql/post/home-latest-timeline-success.d.ts.map +1 -1
  240. package/dist/models/responses/graphql/post/home-latest-timeline-success.js +0 -1
  241. package/dist/models/responses/graphql/post/home-latest-timeline-success.js.map +1 -1
  242. package/dist/models/responses/graphql/post/home-timeline-success.d.ts +0 -1
  243. package/dist/models/responses/graphql/post/home-timeline-success.d.ts.map +1 -1
  244. package/dist/models/responses/graphql/post/home-timeline-success.js +0 -1
  245. package/dist/models/responses/graphql/post/home-timeline-success.js.map +1 -1
  246. package/dist/models/responses/graphql/post/put-client-education-flag-success.d.ts +0 -1
  247. package/dist/models/responses/graphql/post/put-client-education-flag-success.d.ts.map +1 -1
  248. package/dist/models/responses/graphql/post/put-client-education-flag-success.js +0 -1
  249. package/dist/models/responses/graphql/post/put-client-education-flag-success.js.map +1 -1
  250. package/dist/models/responses/graphql/post/unfavorite-tweet-success.d.ts +0 -1
  251. package/dist/models/responses/graphql/post/unfavorite-tweet-success.d.ts.map +1 -1
  252. package/dist/models/responses/graphql/post/unfavorite-tweet-success.js +0 -1
  253. package/dist/models/responses/graphql/post/unfavorite-tweet-success.js.map +1 -1
  254. package/dist/options.d.ts +0 -72
  255. package/dist/options.d.ts.map +1 -1
  256. package/dist/options.js +0 -14
  257. package/dist/options.js.map +1 -1
  258. package/dist/parser/base.d.ts +0 -6
  259. package/dist/parser/base.d.ts.map +1 -1
  260. package/dist/parser/base.js +0 -6
  261. package/dist/parser/base.js.map +1 -1
  262. package/dist/parser/home-timeline-parser.d.ts +0 -11
  263. package/dist/parser/home-timeline-parser.d.ts.map +1 -1
  264. package/dist/parser/home-timeline-parser.js +0 -11
  265. package/dist/parser/home-timeline-parser.js.map +1 -1
  266. package/dist/parser/parser.test.js +77 -77
  267. package/dist/parser/parser.test.js.map +1 -1
  268. package/dist/parser/search-timeline.d.ts +0 -11
  269. package/dist/parser/search-timeline.d.ts.map +1 -1
  270. package/dist/parser/search-timeline.js +0 -11
  271. package/dist/parser/search-timeline.js.map +1 -1
  272. package/dist/parser/user-like-tweets.d.ts +0 -11
  273. package/dist/parser/user-like-tweets.d.ts.map +1 -1
  274. package/dist/parser/user-like-tweets.js +0 -11
  275. package/dist/parser/user-like-tweets.js.map +1 -1
  276. package/dist/parser/user-tweets.d.ts +0 -11
  277. package/dist/parser/user-tweets.d.ts.map +1 -1
  278. package/dist/parser/user-tweets.js +0 -11
  279. package/dist/parser/user-tweets.js.map +1 -1
  280. package/dist/save-responses.js +0 -4
  281. package/dist/save-responses.js.map +1 -1
  282. package/dist/saving-responses/index.d.ts +54 -0
  283. package/dist/saving-responses/index.d.ts.map +1 -0
  284. package/dist/saving-responses/index.js +189 -0
  285. package/dist/saving-responses/index.js.map +1 -0
  286. package/dist/saving-responses/response-entity.d.ts +17 -0
  287. package/dist/saving-responses/response-entity.d.ts.map +1 -0
  288. package/dist/saving-responses/response-entity.js +108 -0
  289. package/dist/saving-responses/response-entity.js.map +1 -0
  290. package/dist/scraper.d.ts +5 -229
  291. package/dist/scraper.d.ts.map +1 -1
  292. package/dist/scraper.js +67 -151
  293. package/dist/scraper.js.map +1 -1
  294. package/dist/scraper.test.js +1 -7
  295. package/dist/scraper.test.js.map +1 -1
  296. package/dist/tsconfig.build.tsbuildinfo +1 -1
  297. package/dist/twitter.d.ts +0 -119
  298. package/dist/twitter.d.ts.map +1 -1
  299. package/dist/twitter.js +1 -163
  300. package/dist/twitter.js.map +1 -1
  301. package/dist/twitter.test.js +0 -1
  302. package/dist/twitter.test.js.map +1 -1
  303. package/package.json +30 -29
  304. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -10,443 +10,361 @@ const json_schema_to_typescript_1 = require("json-schema-to-typescript");
10
10
  const node_path_1 = require("node:path");
11
11
  const node_fs_1 = __importDefault(require("node:fs"));
12
12
  const utils_1 = require("./utils");
13
- /**
14
- * カスタム型定義を生成するクラス
15
- */
16
13
  class CustomTypesGenerator {
17
- /**
18
- * @param results エンドポイントごとのレスポンス情報
19
- * @param schemaDirectory スキーマ保存ディレクトリ
20
- * @param typesDirectory 型定義保存ディレクトリ
21
- */
22
- constructor(results, schemaDirectory, typesDirectory) {
23
- this.results = results;
14
+ constructor(responseDatabase, schemaDirectory, typesDirectory) {
15
+ this.responseDatabase = responseDatabase;
24
16
  this.schemaDirectory = schemaDirectory;
25
17
  this.typesDirectory = typesDirectory;
26
18
  }
27
- /**
28
- * 検索タイムラインツイートモデル(CustomSearchTimelineEntry)のカスタム型定義を生成する
29
- */
30
19
  async runGraphQLSearchTimeline() {
31
- const results = this.results.filter((result) => result.type === 'graphql' &&
32
- result.name === 'SearchTimeline' &&
33
- result.method === 'GET' &&
34
- result.statusCode === '200');
35
- if (results.length === 0) {
36
- return;
37
- }
38
- const paths = results.flatMap((result) => result.paths);
39
- let schema;
40
- for (const path of paths) {
41
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
42
- const entries = response.data.search_by_raw_query.search_timeline.timeline.instructions
20
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runGraphQLSearchTimeline');
21
+ const schema = await this.createSchemaFromResponse({
22
+ endpointType: 'GRAPHQL',
23
+ endpoint: 'SearchTimeline',
24
+ method: 'GET',
25
+ statusCode: 200,
26
+ }, (response) => {
27
+ return response.data.search_by_raw_query.search_timeline.timeline.instructions
43
28
  .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
44
29
  .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
45
30
  entry.entryId.startsWith('promoted-tweet') ||
46
31
  entry.entryId.startsWith('promotedTweet')));
47
- const fileSchema = (0, dist_1.createCompoundSchema)(entries);
48
- schema = schema ? (0, dist_1.mergeSchemas)([schema, fileSchema]) : fileSchema;
49
- }
32
+ });
50
33
  if (!schema) {
34
+ logger.warn('⏭️ Schema not found. Skip');
51
35
  return;
52
36
  }
53
37
  await this.generateTypeFromSchema(schema, 'CustomSearchTimelineEntry', '検索タイムラインツイートモデル');
54
38
  }
55
- /**
56
- * ユーザーツイートモデル(CustomUserTweetEntry)のカスタム型定義を生成する
57
- */
58
39
  async runGraphQLUserTweets() {
59
- const results = this.results.filter((result) => result.type === 'graphql' &&
60
- result.name === 'UserTweets' &&
61
- result.method === 'GET' &&
62
- result.statusCode === '200');
63
- if (results.length === 0) {
64
- return;
65
- }
66
- const paths = results.flatMap((result) => result.paths);
67
- let schema;
68
- for (const path of paths) {
69
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
70
- const entries = response.data.user.result.timeline_v2.timeline.instructions
40
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runGraphQLUserTweets');
41
+ const schema = await this.createSchemaFromResponse({
42
+ endpointType: 'GRAPHQL',
43
+ endpoint: 'UserTweets',
44
+ method: 'GET',
45
+ statusCode: 200,
46
+ }, (response) => {
47
+ if (!('data' in response)) {
48
+ return [];
49
+ }
50
+ return response.data.user.result.timeline_v2.timeline.instructions
71
51
  .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
72
52
  .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
73
53
  entry.entryId.startsWith('promoted-tweet') ||
74
54
  entry.entryId.startsWith('promotedTweet')));
75
- const fileSchema = (0, dist_1.createCompoundSchema)(entries);
76
- schema = schema ? (0, dist_1.mergeSchemas)([schema, fileSchema]) : fileSchema;
77
- }
55
+ });
78
56
  if (!schema) {
57
+ logger.warn('⏭️ Schema not found. Skip');
79
58
  return;
80
59
  }
81
60
  await this.generateTypeFromSchema(schema, 'CustomUserTweetEntry', 'ユーザーツイートモデル');
82
61
  }
83
- /**
84
- * ユーザーいいねツイートモデル(CustomUserLikeTweetEntry)のカスタム型定義を生成する
85
- */
86
62
  async runGraphQLUserLikeTweets() {
87
- const results = this.results.filter((result) => result.type === 'graphql' &&
88
- result.name === 'Likes' &&
89
- result.method === 'GET' &&
90
- result.statusCode === '200');
91
- if (results.length === 0) {
92
- return;
93
- }
94
- const paths = results.flatMap((result) => result.paths);
95
- let schema;
96
- for (const path of paths) {
97
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
98
- const entries = response.data.user.result.timeline_v2.timeline.instructions
63
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runGraphQLUserLikeTweets');
64
+ const schema = await this.createSchemaFromResponse({
65
+ endpointType: 'GRAPHQL',
66
+ endpoint: 'Likes',
67
+ method: 'GET',
68
+ statusCode: 200,
69
+ }, (response) => {
70
+ if (!('data' in response)) {
71
+ return [];
72
+ }
73
+ return response.data.user.result.timeline_v2.timeline.instructions
99
74
  .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
100
75
  .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
101
76
  entry.entryId.startsWith('promoted-tweet') ||
102
77
  entry.entryId.startsWith('promotedTweet')));
103
- const fileSchema = (0, dist_1.createCompoundSchema)(entries);
104
- schema = schema ? (0, dist_1.mergeSchemas)([schema, fileSchema]) : fileSchema;
105
- }
78
+ });
106
79
  if (!schema) {
80
+ logger.warn('⏭️ Schema not found. Skip');
107
81
  return;
108
82
  }
109
83
  await this.generateTypeFromSchema(schema, 'CustomUserLikeTweetEntry', 'ユーザーいいねツイートエントリモデル');
110
84
  }
111
- /**
112
- * GET・POSTメソッド共通のホームタイムラインモデルのカスタム型定義を生成する
113
- */
114
85
  async runGraphQLTimeline() {
115
- const homeTimelineResults = this.results.filter((result) => result.type === 'graphql' &&
116
- (result.name === 'HomeTimeline' ||
117
- result.name === 'HomeLatestTimeline') &&
118
- (result.method === 'GET' || result.method === 'POST') &&
119
- result.statusCode === '200');
120
- if (homeTimelineResults.length === 0) {
121
- return;
122
- }
123
- const hometimelinePaths = homeTimelineResults.flatMap((result) => result.paths);
124
- let schema;
125
- for (const path of hometimelinePaths) {
126
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
127
- const fileSchema = (0, dist_1.createSchema)(response);
128
- schema = schema ? (0, dist_1.mergeSchemas)([schema, fileSchema]) : fileSchema;
86
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runGraphQLTimeline');
87
+ const endpoints = [
88
+ {
89
+ endpointType: 'GRAPHQL',
90
+ endpoint: 'HomeTimeline',
91
+ method: 'GET',
92
+ statusCode: 200,
93
+ },
94
+ {
95
+ endpointType: 'GRAPHQL',
96
+ endpoint: 'HomeTimeline',
97
+ method: 'POST',
98
+ statusCode: 200,
99
+ },
100
+ {
101
+ endpointType: 'GRAPHQL',
102
+ endpoint: 'HomeLatestTimeline',
103
+ method: 'GET',
104
+ statusCode: 200,
105
+ },
106
+ {
107
+ endpointType: 'GRAPHQL',
108
+ endpoint: 'HomeLatestTimeline',
109
+ method: 'POST',
110
+ statusCode: 200,
111
+ },
112
+ ];
113
+ const schemas = [];
114
+ for (const endpoint of endpoints) {
115
+ const endpointSchema = await this.createSchemaFromResponse(endpoint);
116
+ if (!endpointSchema) {
117
+ logger.warn(`⏭️ ${endpoint.method} ${endpoint.endpoint} Schema not found. Skip`);
118
+ continue;
119
+ }
120
+ schemas.push(endpointSchema);
129
121
  }
130
- if (!schema) {
122
+ if (schemas.length === 0) {
123
+ logger.warn('⏭️ Schema not found. Skip');
131
124
  return;
132
125
  }
133
- await this.generateTypeFromSchema(schema, 'CustomGraphQLTimelineSuccessResponse', 'ホームタイムラインモデル');
126
+ await this.generateTypeFromSchema((0, dist_1.mergeSchemas)(schemas), 'CustomGraphQLTimelineSuccessResponse', 'ホームタイムラインモデル');
134
127
  }
135
- /**
136
- * タイムラインツイートモデル(CustomTimelineTweetEntry)のカスタム型定義を生成する
137
- */
138
128
  async runGraphQLTimelineTweetEntry() {
139
- const homeTimelineResults = this.results.filter((result) => result.type === 'graphql' &&
140
- (result.name === 'HomeTimeline' ||
141
- result.name === 'HomeLatestTimeline') &&
142
- (result.method === 'GET' || result.method === 'POST') &&
143
- result.statusCode === '200');
144
- if (homeTimelineResults.length === 0) {
145
- return;
146
- }
147
- const hometimelinePaths = homeTimelineResults.flatMap((result) => result.paths);
148
- let schema;
149
- for (const path of hometimelinePaths) {
150
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
151
- const entries = response.data.home.home_timeline_urt.instructions
152
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
153
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
154
- entry.entryId.startsWith('promoted-tweet') ||
155
- entry.entryId.startsWith('promotedTweet')));
156
- const fileSchema = (0, dist_1.createCompoundSchema)(entries);
157
- schema = schema ? (0, dist_1.mergeSchemas)([schema, fileSchema]) : fileSchema;
158
- }
159
- if (!schema) {
160
- return;
161
- }
162
- await this.generateTypeFromSchema(schema, 'CustomTimelineTweetEntry', 'ホームタイムラインツイートエントリモデル');
163
- }
164
- // --- twitter-d 変換用オブジェクト
165
- /**
166
- * レスポンスツイートオブジェクト(CustomTweetObject)のカスタム型定義を生成する
167
- */
168
- async runTweetObject() {
169
- // 各レスポンスからツイートオブジェクトを抽出
170
- const schemas = [
171
- // HomeTimeline
172
- this.results
173
- .filter((result) => result.type === 'graphql' &&
174
- result.name === 'HomeTimeline' &&
175
- result.method === 'GET' &&
176
- result.statusCode === '200')
177
- .flatMap((result) => result.paths)
178
- .flatMap((path) => {
179
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
180
- return response.data.home.home_timeline_urt.instructions
181
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
182
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
183
- entry.entryId.startsWith('promoted-tweet') ||
184
- entry.entryId.startsWith('promotedTweet')));
185
- })
186
- .map((entry) => {
187
- return entry.content.itemContent
188
- .tweet_results.result;
189
- })
190
- .filter((entry) => !!entry)
191
- .map((entry) => {
192
- return {
193
- ...entry,
194
- __entryId: 'string',
195
- };
196
- })
197
- .map((entry) => (0, dist_1.createSchema)(entry)),
198
- // HomeLatestTimeline
199
- this.results
200
- .filter((result) => result.type === 'graphql' &&
201
- result.name === 'HomeLatestTimeline' &&
202
- result.method === 'GET' &&
203
- result.statusCode === '200')
204
- .flatMap((result) => result.paths)
205
- .flatMap((path) => {
206
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
129
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runGraphQLTimelineTweetEntry');
130
+ const endpoints = [
131
+ {
132
+ endpointType: 'GRAPHQL',
133
+ endpoint: 'HomeTimeline',
134
+ method: 'GET',
135
+ statusCode: 200,
136
+ },
137
+ {
138
+ endpointType: 'GRAPHQL',
139
+ endpoint: 'HomeTimeline',
140
+ method: 'POST',
141
+ statusCode: 200,
142
+ },
143
+ {
144
+ endpointType: 'GRAPHQL',
145
+ endpoint: 'HomeLatestTimeline',
146
+ method: 'GET',
147
+ statusCode: 200,
148
+ },
149
+ {
150
+ endpointType: 'GRAPHQL',
151
+ endpoint: 'HomeLatestTimeline',
152
+ method: 'POST',
153
+ statusCode: 200,
154
+ },
155
+ ];
156
+ const schemas = [];
157
+ for (const endpoint of endpoints) {
158
+ const endpointSchema = await this.createSchemaFromResponse(endpoint, (response) => {
159
+ if (!('data' in response)) {
160
+ return [];
161
+ }
207
162
  return response.data.home.home_timeline_urt.instructions
208
163
  .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
209
164
  .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
210
165
  entry.entryId.startsWith('promoted-tweet') ||
211
166
  entry.entryId.startsWith('promotedTweet')));
212
- })
213
- .map((entry) => {
214
- return entry.content.itemContent
215
- .tweet_results.result;
216
- })
217
- .filter((entry) => !!entry)
218
- .map((entry) => {
219
- return {
220
- ...entry,
221
- __entryId: 'string',
222
- };
223
- })
224
- .map((entry) => (0, dist_1.createSchema)(entry)),
225
- // SearchTimeline
226
- this.results
227
- .filter((result) => result.type === 'graphql' &&
228
- result.name === 'SearchTimeline' &&
229
- result.method === 'GET' &&
230
- result.statusCode === '200')
231
- .flatMap((result) => result.paths)
232
- .flatMap((path) => {
233
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
234
- return response.data.search_by_raw_query.search_timeline.timeline.instructions
235
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
236
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
237
- entry.entryId.startsWith('promoted-tweet') ||
238
- entry.entryId.startsWith('promotedTweet')));
239
- })
240
- .map((entry) => {
241
- return entry.content.itemContent
242
- .tweet_results.result;
243
- })
244
- .filter((entry) => !!entry)
245
- .map((entry) => {
246
- return {
247
- ...entry,
248
- __entryId: 'string',
249
- };
250
- })
251
- .map((entry) => (0, dist_1.createSchema)(entry)),
252
- // UserTweets
253
- this.results
254
- .filter((result) => result.type === 'graphql' &&
255
- result.name === 'UserTweets' &&
256
- result.method === 'GET' &&
257
- result.statusCode === '200')
258
- .flatMap((result) => result.paths)
259
- .flatMap((path) => {
260
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
261
- return response.data.user.result.timeline_v2.timeline.instructions
262
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
263
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
264
- entry.entryId.startsWith('promoted-tweet') ||
265
- entry.entryId.startsWith('promotedTweet')));
266
- })
267
- .map((entry) => {
268
- return entry.content.itemContent
269
- .tweet_results.result;
270
- })
271
- .filter((entry) => !!entry)
272
- .map((entry) => {
273
- return {
274
- ...entry,
275
- __entryId: 'string',
276
- };
277
- })
278
- .map((entry) => (0, dist_1.createSchema)(entry)),
279
- // Likes
280
- this.results
281
- .filter((result) => result.type === 'graphql' &&
282
- result.name === 'Likes' &&
283
- result.method === 'GET' &&
284
- result.statusCode === '200')
285
- .flatMap((result) => result.paths)
286
- .flatMap((path) => {
287
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
288
- return response.data.user.result.timeline_v2.timeline.instructions
289
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
290
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
291
- entry.entryId.startsWith('promoted-tweet') ||
292
- entry.entryId.startsWith('promotedTweet')));
293
- })
294
- .map((entry) => {
295
- return entry.content.itemContent
296
- .tweet_results.result;
297
- })
298
- .filter((entry) => !!entry)
299
- .map((entry) => {
300
- return {
301
- ...entry,
302
- __entryId: 'string',
303
- };
304
- })
305
- .map((entry) => (0, dist_1.createSchema)(entry)),
306
- // TweetDetail
307
- this.results
308
- .filter((result) => result.type === 'graphql' &&
309
- result.name === 'TweetDetail' &&
310
- result.method === 'GET' &&
311
- result.statusCode === '200')
312
- .flatMap((result) => result.paths)
313
- .map((path) => {
314
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
315
- const tweetEntries = response.data.threaded_conversation_with_injections_v2
316
- .instructions[0].entries;
317
- if (!tweetEntries) {
318
- return null;
167
+ });
168
+ if (!endpointSchema) {
169
+ logger.warn(`⏭️ ${endpoint.method} ${endpoint.endpoint} Schema not found. Skip`);
170
+ continue;
171
+ }
172
+ schemas.push(endpointSchema);
173
+ }
174
+ if (schemas.length === 0) {
175
+ logger.warn('⏭️ Schema not found. Skip');
176
+ return;
177
+ }
178
+ await this.generateTypeFromSchema((0, dist_1.mergeSchemas)(schemas), 'CustomTimelineTweetEntry', 'ホームタイムラインツイートエントリモデル');
179
+ }
180
+ async runTweetObject() {
181
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runTweetObject');
182
+ const promises = await Promise.all([
183
+ this.createSchemaFromResponse({
184
+ endpointType: 'GRAPHQL',
185
+ endpoint: 'HomeTimeline',
186
+ method: 'GET',
187
+ statusCode: 200,
188
+ }, (response) => this.getTweetObjectsFromInstructions(response.data.home.home_timeline_urt.instructions).flat()),
189
+ this.createSchemaFromResponse({
190
+ endpointType: 'GRAPHQL',
191
+ endpoint: 'HomeLatestTimeline',
192
+ method: 'GET',
193
+ statusCode: 200,
194
+ }, (response) => this.getTweetObjectsFromInstructions(response.data.home.home_timeline_urt.instructions).flat()),
195
+ this.createSchemaFromResponse({
196
+ endpointType: 'GRAPHQL',
197
+ endpoint: 'SearchTimeline',
198
+ method: 'GET',
199
+ statusCode: 200,
200
+ }, (response) => this.getTweetObjectsFromInstructions(response.data.search_by_raw_query.search_timeline.timeline
201
+ .instructions).flat()),
202
+ this.createSchemaFromResponse({
203
+ endpointType: 'GRAPHQL',
204
+ endpoint: 'UserTweets',
205
+ method: 'GET',
206
+ statusCode: 200,
207
+ }, (response) => {
208
+ if (!('data' in response)) {
209
+ return [];
319
210
  }
320
- const tweetResult = tweetEntries[0].content.itemContent?.tweet_results;
321
- if (!tweetResult) {
322
- return null;
211
+ return this.getTweetObjectsFromInstructions(response.data.user.result.timeline_v2.timeline.instructions).flat();
212
+ }),
213
+ this.createSchemaFromResponse({
214
+ endpointType: 'GRAPHQL',
215
+ endpoint: 'Likes',
216
+ method: 'GET',
217
+ statusCode: 200,
218
+ }, (response) => {
219
+ if (!('data' in response)) {
220
+ return [];
323
221
  }
324
- return tweetResult.result;
325
- })
326
- .filter((entry) => !!entry)
327
- .map((entry) => {
328
- return {
329
- ...entry,
330
- __entryId: 'string',
331
- };
332
- })
333
- .map((entry) => (0, dist_1.createSchema)(entry)),
334
- ].flat();
222
+ return this.getTweetObjectsFromInstructions(response.data.user.result.timeline_v2.timeline.instructions).flat();
223
+ }),
224
+ this.createSchemaFromResponse({
225
+ endpointType: 'GRAPHQL',
226
+ endpoint: 'TweetDetail',
227
+ method: 'GET',
228
+ statusCode: 200,
229
+ }, (response) => {
230
+ if (!('data' in response)) {
231
+ return [];
232
+ }
233
+ return this.getTweetObjectsFromInstructions(response.data.threaded_conversation_with_injections_v2.instructions).flat();
234
+ }),
235
+ ]);
236
+ const schemas = promises.filter((schema) => !!schema);
237
+ if (schemas.length === 0) {
238
+ logger.warn('⏭️ Schema not found. Skip');
239
+ return;
240
+ }
335
241
  await this.generateTypeFromSchema((0, dist_1.mergeSchemas)(schemas), 'CustomTweetObject', 'レスポンスツイートオブジェクト');
336
242
  }
337
- /**
338
- * レスポンスツイートレガシーオブジェクト(CustomTweetLegacyObject)のカスタム型定義を生成する
339
- */
243
+ getTweetObjectsFromInstructions(instructions) {
244
+ return instructions
245
+ .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
246
+ .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
247
+ entry.entryId.startsWith('promoted-tweet') ||
248
+ entry.entryId.startsWith('promotedTweet')))
249
+ .map((entry) => {
250
+ return entry?.content.itemContent?.tweet_results?.result;
251
+ })
252
+ .filter((entry) => !!entry)
253
+ .map((entry) => {
254
+ return {
255
+ ...entry,
256
+ __entryId: 'string',
257
+ };
258
+ });
259
+ }
340
260
  async runTweetLegacyObject() {
341
- // 各レスポンスからレガシーツイートオブジェクトを抽出
342
- const schemas = [
343
- // SearchTimeline
344
- this.results
345
- .filter((result) => result.type === 'graphql' &&
346
- result.name === 'SearchTimeline' &&
347
- result.method === 'GET' &&
348
- result.statusCode === '200')
349
- .flatMap((result) => result.paths)
350
- .flatMap((path) => {
351
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
352
- return response.data.search_by_raw_query.search_timeline.timeline.instructions
353
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
354
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
355
- entry.entryId.startsWith('promoted-tweet') ||
356
- entry.entryId.startsWith('promotedTweet')));
357
- })
358
- .map((entry) => {
359
- return entry.content.itemContent
360
- .tweet_results.result.legacy;
361
- })
362
- .map((entry) => (0, dist_1.createSchema)(entry)),
363
- // UserTweets: tweet_results.result.legacy
364
- this.results
365
- .filter((result) => result.type === 'graphql' &&
366
- result.name === 'UserTweets' &&
367
- result.method === 'GET' &&
368
- result.statusCode === '200')
369
- .flatMap((result) => result.paths)
370
- .flatMap((path) => {
371
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
372
- return response.data.user.result.timeline_v2.timeline.instructions
373
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
374
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
375
- entry.entryId.startsWith('promoted-tweet') ||
376
- entry.entryId.startsWith('promotedTweet')));
377
- })
378
- .filter((entry) => entry.content.itemContent.tweet_results
379
- .result.legacy !== undefined)
380
- .map((entry) => {
381
- return entry.content.itemContent
382
- .tweet_results.result.legacy;
383
- })
384
- .map((entry) => (0, dist_1.createSchema)(entry)),
385
- // UserTweets: tweet_results.result.tweet?.legacy
386
- this.results
387
- .filter((result) => result.type === 'graphql' &&
388
- result.name === 'UserTweets' &&
389
- result.method === 'GET' &&
390
- result.statusCode === '200')
391
- .flatMap((result) => result.paths)
392
- .flatMap((path) => {
393
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
394
- return response.data.user.result.timeline_v2.timeline.instructions
395
- .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
396
- .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
397
- entry.entryId.startsWith('promoted-tweet') ||
398
- entry.entryId.startsWith('promotedTweet')));
399
- })
400
- .filter((entry) => entry.content.itemContent.tweet_results
401
- .result.tweet?.legacy !== undefined)
402
- .map((entry) => {
403
- return entry.content.itemContent
404
- .tweet_results.result.tweet?.legacy;
405
- })
406
- .map((entry) => (0, dist_1.createSchema)(entry)),
407
- ].flat();
261
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runTweetLegacyObject');
262
+ const promises = await Promise.all([
263
+ this.createSchemaFromResponse({
264
+ endpointType: 'GRAPHQL',
265
+ endpoint: 'SearchTimeline',
266
+ method: 'GET',
267
+ statusCode: 200,
268
+ }, (response) => this.getTweetLegacyObjectsFromInstructions(response.data.search_by_raw_query.search_timeline.timeline
269
+ .instructions).flat()),
270
+ this.createSchemaFromResponse({
271
+ endpointType: 'GRAPHQL',
272
+ endpoint: 'UserTweets',
273
+ method: 'GET',
274
+ statusCode: 200,
275
+ }, (response) => {
276
+ if (!('data' in response)) {
277
+ return [];
278
+ }
279
+ return this.getTweetLegacyObjectsFromInstructions(response.data.user.result.timeline_v2.timeline.instructions).flat();
280
+ }),
281
+ ]);
282
+ const schemas = promises.filter((schema) => !!schema);
283
+ if (schemas.length === 0) {
284
+ logger.warn('⏭️ Schema not found. Skip');
285
+ return;
286
+ }
408
287
  await this.generateTypeFromSchema((0, dist_1.mergeSchemas)(schemas), 'CustomTweetLegacyObject', 'レスポンスツイートレガシーオブジェクト');
409
288
  }
410
- /**
411
- * レスポンスユーザーレガシーオブジェクト(CustomUserLegacyObject)のカスタム型定義を生成する
412
- */
289
+ getTweetLegacyObjectsFromInstructions(instructions) {
290
+ return instructions
291
+ .filter((instruction) => instruction.type === 'TimelineAddEntries' && instruction.entries)
292
+ .flatMap((instruction) => instruction.entries?.filter((entry) => entry.entryId.startsWith('tweet-') ||
293
+ entry.entryId.startsWith('promoted-tweet') ||
294
+ entry.entryId.startsWith('promotedTweet')))
295
+ .flatMap((entry) => {
296
+ return [
297
+ entry?.content.itemContent?.tweet_results?.result?.legacy,
298
+ entry?.content.itemContent?.tweet_results?.result?.tweet?.legacy,
299
+ ];
300
+ })
301
+ .filter((legacy) => !!legacy);
302
+ }
413
303
  async runUserLegacyObject() {
414
- // 各レスポンスからレガシーユーザーオブジェクトを抽出
415
- const schemas = [
416
- // UserByRestId
417
- this.results
418
- .filter((result) => result.type === 'graphql' &&
419
- result.name === 'UserByRestId' &&
420
- result.method === 'GET' &&
421
- result.statusCode === '200')
422
- .flatMap((result) => result.paths)
423
- .flatMap((path) => {
424
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
425
- return response.data.user.result.legacy;
426
- })
427
- .map((entry) => (0, dist_1.createSchema)(entry)),
428
- // UserByScreenName
429
- this.results
430
- .filter((result) => result.type === 'graphql' &&
431
- result.name === 'UserByScreenName' &&
432
- result.method === 'GET' &&
433
- result.statusCode === '200')
434
- .flatMap((result) => result.paths)
435
- .flatMap((path) => {
436
- const response = utils_1.Utils.parseJsonc(node_fs_1.default.readFileSync(path, 'utf8'));
304
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator:runUserLegacyObject');
305
+ const endpoints = [
306
+ {
307
+ endpointType: 'GRAPHQL',
308
+ endpoint: 'UserByRestId',
309
+ method: 'GET',
310
+ statusCode: 200,
311
+ },
312
+ {
313
+ endpointType: 'GRAPHQL',
314
+ endpoint: 'UserByScreenName',
315
+ method: 'GET',
316
+ statusCode: 200,
317
+ },
318
+ ];
319
+ const schemas = [];
320
+ for (const endpoint of endpoints) {
321
+ const endpointSchema = await this.createSchemaFromResponse(endpoint, (response) => {
437
322
  return response.data.user.result.legacy;
438
- })
439
- .map((entry) => (0, dist_1.createSchema)(entry)),
440
- ].flat();
323
+ });
324
+ if (!endpointSchema) {
325
+ logger.warn(`⏭️ ${endpoint.method} ${endpoint.endpoint} Schema not found. Skip`);
326
+ continue;
327
+ }
328
+ schemas.push(endpointSchema);
329
+ }
330
+ if (schemas.length === 0) {
331
+ logger.warn('⏭️ Schema not found. Skip');
332
+ return;
333
+ }
441
334
  await this.generateTypeFromSchema((0, dist_1.mergeSchemas)(schemas), 'CustomUserLegacyObject', 'レスポンスユーザーレガシーオブジェクト');
442
335
  }
443
- /**
444
- * カスタム型定義を、スキーマを元に生成する
445
- *
446
- * @param schema スキーマ
447
- * @param name 型名
448
- * @param tsDocument 型定義の tsdoc(1 行で記述)
449
- */
336
+ async createSchemaFromResponse(endpoint, customizer) {
337
+ const logger = node_utils_1.Logger.configure('CustomTypesGenerator.createSchemaFromResponse');
338
+ const count = await this.responseDatabase.getResponseCount(endpoint);
339
+ if (count === 0) {
340
+ logger.info(`⏭️ Skip ${endpoint.method} ${endpoint.endpoint}`);
341
+ return null;
342
+ }
343
+ const limit = 100;
344
+ const maxPage = Math.ceil(count / limit) + 1;
345
+ let schema;
346
+ for (let page = 1; page <= maxPage; page++) {
347
+ logger.info(`📖 Reading: ${endpoint.method} ${endpoint.endpoint} (page: ${page}/${maxPage})`);
348
+ const responses = await this.responseDatabase.getResponses(endpoint, {
349
+ page,
350
+ limit,
351
+ });
352
+ let responseBodys = responses
353
+ .filter((response) => response.responseType === 'JSON')
354
+ .map((response) => response.responseBody)
355
+ .filter((body) => body.length > 0)
356
+ .map((body) => JSON.parse(body));
357
+ if (customizer) {
358
+ responseBodys = responseBodys.flatMap((body) => customizer(body));
359
+ }
360
+ const pageSchema = (0, dist_1.createCompoundSchema)(responseBodys);
361
+ schema = schema ? (0, dist_1.mergeSchemas)([schema, pageSchema]) : pageSchema;
362
+ }
363
+ if (!schema) {
364
+ throw new Error('No schema found');
365
+ }
366
+ return schema;
367
+ }
450
368
  async generateTypeFromSchema(schema, name, tsDocument) {
451
369
  const logger = node_utils_1.Logger.configure('CustomTypeGenerator.generateTypeFromSchema');
452
370
  if (!schema) {
@@ -462,9 +380,6 @@ class CustomTypesGenerator {
462
380
  node_fs_1.default.writeFileSync(typesPath, types);
463
381
  logger.info(`📝 ${name}`);
464
382
  }
465
- /**
466
- * カスタム型定義を生成する
467
- */
468
383
  async generate(parallel) {
469
384
  const generators = [
470
385
  this.runGraphQLSearchTimeline.bind(this),
@@ -473,7 +388,6 @@ class CustomTypesGenerator {
473
388
  this.runGraphQLTimeline.bind(this),
474
389
  this.runGraphQLTimelineTweetEntry.bind(this),
475
390
  this.runTweetObject.bind(this),
476
- // twitter-d 変換用オブジェクト
477
391
  this.runTweetLegacyObject.bind(this),
478
392
  this.runUserLegacyObject.bind(this),
479
393
  ];