@snowtop/ent 0.1.0-alpha160-test5 → 0.1.0-alpha160-test7

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 (317) hide show
  1. package/dist/package.json +64 -0
  2. package/package.json +52 -7
  3. package/src/action/action.ts +330 -0
  4. package/src/action/executor.ts +453 -0
  5. package/src/action/experimental_action.ts +277 -0
  6. package/src/action/index.ts +31 -0
  7. package/src/action/operations.ts +967 -0
  8. package/src/action/orchestrator.ts +1527 -0
  9. package/src/action/privacy.ts +37 -0
  10. package/src/action/relative_value.ts +242 -0
  11. package/src/action/transaction.ts +38 -0
  12. package/src/auth/auth.ts +77 -0
  13. package/src/auth/index.ts +8 -0
  14. package/src/core/base.ts +367 -0
  15. package/src/core/clause.ts +1065 -0
  16. package/src/core/config.ts +219 -0
  17. package/src/core/const.ts +5 -0
  18. package/src/core/context.ts +135 -0
  19. package/src/core/convert.ts +106 -0
  20. package/src/core/date.ts +23 -0
  21. package/src/core/db.ts +498 -0
  22. package/src/core/ent.ts +1740 -0
  23. package/src/core/global_schema.ts +49 -0
  24. package/src/core/loaders/assoc_count_loader.ts +99 -0
  25. package/src/core/loaders/assoc_edge_loader.ts +250 -0
  26. package/src/core/loaders/index.ts +12 -0
  27. package/src/core/loaders/loader.ts +66 -0
  28. package/src/core/loaders/object_loader.ts +489 -0
  29. package/src/core/loaders/query_loader.ts +314 -0
  30. package/src/core/loaders/raw_count_loader.ts +175 -0
  31. package/src/core/logger.ts +49 -0
  32. package/src/core/privacy.ts +660 -0
  33. package/src/core/query/assoc_query.ts +240 -0
  34. package/src/core/query/custom_clause_query.ts +174 -0
  35. package/src/core/query/custom_query.ts +302 -0
  36. package/src/core/query/index.ts +9 -0
  37. package/src/core/query/query.ts +674 -0
  38. package/src/core/query_impl.ts +32 -0
  39. package/src/core/viewer.ts +52 -0
  40. package/src/ent.code-workspace +73 -0
  41. package/src/graphql/builtins/connection.ts +25 -0
  42. package/src/graphql/builtins/edge.ts +16 -0
  43. package/src/graphql/builtins/node.ts +12 -0
  44. package/src/graphql/graphql.ts +891 -0
  45. package/src/graphql/graphql_field_helpers.ts +221 -0
  46. package/src/graphql/index.ts +42 -0
  47. package/src/graphql/mutations/union.ts +39 -0
  48. package/src/graphql/node_resolver.ts +122 -0
  49. package/src/graphql/query/connection_type.ts +113 -0
  50. package/src/graphql/query/edge_connection.ts +171 -0
  51. package/src/graphql/query/page_info.ts +34 -0
  52. package/src/graphql/query/shared_edge_connection.ts +287 -0
  53. package/src/graphql/scalars/orderby_direction.ts +13 -0
  54. package/src/graphql/scalars/time.ts +38 -0
  55. package/src/imports/dataz/example1/_auth.ts +51 -0
  56. package/src/imports/dataz/example1/_viewer.ts +35 -0
  57. package/src/imports/index.ts +213 -0
  58. package/src/index.ts +145 -0
  59. package/src/parse_schema/parse.ts +585 -0
  60. package/src/schema/base_schema.ts +224 -0
  61. package/src/schema/field.ts +1087 -0
  62. package/src/schema/index.ts +53 -0
  63. package/src/schema/json_field.ts +94 -0
  64. package/src/schema/schema.ts +1028 -0
  65. package/src/schema/struct_field.ts +234 -0
  66. package/src/schema/union_field.ts +105 -0
  67. package/src/scripts/custom_compiler.ts +331 -0
  68. package/src/scripts/custom_graphql.ts +550 -0
  69. package/src/scripts/migrate_v0.1.ts +41 -0
  70. package/src/scripts/move_types.ts +131 -0
  71. package/src/scripts/read_schema.ts +67 -0
  72. package/src/setupPackage.js +42 -0
  73. package/src/testutils/action/complex_schemas.ts +517 -0
  74. package/src/testutils/builder.ts +422 -0
  75. package/src/testutils/context/test_context.ts +25 -0
  76. package/src/testutils/db/fixture.ts +32 -0
  77. package/src/testutils/db/temp_db.ts +941 -0
  78. package/src/testutils/db/value.ts +294 -0
  79. package/src/testutils/db_mock.ts +351 -0
  80. package/src/testutils/db_time_zone.ts +40 -0
  81. package/src/testutils/ent-graphql-tests/index.ts +653 -0
  82. package/src/testutils/fake_comms.ts +50 -0
  83. package/src/testutils/fake_data/const.ts +64 -0
  84. package/src/testutils/fake_data/events_query.ts +145 -0
  85. package/src/testutils/fake_data/fake_contact.ts +150 -0
  86. package/src/testutils/fake_data/fake_event.ts +150 -0
  87. package/src/testutils/fake_data/fake_tag.ts +139 -0
  88. package/src/testutils/fake_data/fake_user.ts +232 -0
  89. package/src/testutils/fake_data/index.ts +1 -0
  90. package/src/testutils/fake_data/internal.ts +8 -0
  91. package/src/testutils/fake_data/tag_query.ts +56 -0
  92. package/src/testutils/fake_data/test_helpers.ts +388 -0
  93. package/src/testutils/fake_data/user_query.ts +524 -0
  94. package/src/testutils/fake_log.ts +52 -0
  95. package/src/testutils/mock_date.ts +10 -0
  96. package/src/testutils/mock_log.ts +39 -0
  97. package/src/testutils/parse_sql.ts +685 -0
  98. package/src/testutils/test_edge_global_schema.ts +49 -0
  99. package/src/testutils/write.ts +70 -0
  100. package/src/tsc/ast.ts +351 -0
  101. package/src/tsc/compilerOptions.ts +85 -0
  102. package/src/tsc/move_generated.ts +191 -0
  103. package/src/tsc/transform.ts +226 -0
  104. package/src/tsc/transform_action.ts +224 -0
  105. package/src/tsc/transform_ent.ts +66 -0
  106. package/src/tsc/transform_schema.ts +546 -0
  107. package/tsconfig.json +20 -0
  108. package/core/query/shared_assoc_test.d.ts +0 -2
  109. package/core/query/shared_assoc_test.js +0 -804
  110. package/core/query/shared_test.d.ts +0 -21
  111. package/core/query/shared_test.js +0 -736
  112. package/graphql/query/shared_assoc_test.d.ts +0 -1
  113. package/graphql/query/shared_assoc_test.js +0 -203
  114. /package/{action → dist/action}/action.d.ts +0 -0
  115. /package/{action → dist/action}/action.js +0 -0
  116. /package/{action → dist/action}/executor.d.ts +0 -0
  117. /package/{action → dist/action}/executor.js +0 -0
  118. /package/{action → dist/action}/experimental_action.d.ts +0 -0
  119. /package/{action → dist/action}/experimental_action.js +0 -0
  120. /package/{action → dist/action}/index.d.ts +0 -0
  121. /package/{action → dist/action}/index.js +0 -0
  122. /package/{action → dist/action}/operations.d.ts +0 -0
  123. /package/{action → dist/action}/operations.js +0 -0
  124. /package/{action → dist/action}/orchestrator.d.ts +0 -0
  125. /package/{action → dist/action}/orchestrator.js +0 -0
  126. /package/{action → dist/action}/privacy.d.ts +0 -0
  127. /package/{action → dist/action}/privacy.js +0 -0
  128. /package/{action → dist/action}/relative_value.d.ts +0 -0
  129. /package/{action → dist/action}/relative_value.js +0 -0
  130. /package/{action → dist/action}/transaction.d.ts +0 -0
  131. /package/{action → dist/action}/transaction.js +0 -0
  132. /package/{auth → dist/auth}/auth.d.ts +0 -0
  133. /package/{auth → dist/auth}/auth.js +0 -0
  134. /package/{auth → dist/auth}/index.d.ts +0 -0
  135. /package/{auth → dist/auth}/index.js +0 -0
  136. /package/{core → dist/core}/base.d.ts +0 -0
  137. /package/{core → dist/core}/base.js +0 -0
  138. /package/{core → dist/core}/clause.d.ts +0 -0
  139. /package/{core → dist/core}/clause.js +0 -0
  140. /package/{core → dist/core}/config.d.ts +0 -0
  141. /package/{core → dist/core}/config.js +0 -0
  142. /package/{core → dist/core}/const.d.ts +0 -0
  143. /package/{core → dist/core}/const.js +0 -0
  144. /package/{core → dist/core}/context.d.ts +0 -0
  145. /package/{core → dist/core}/context.js +0 -0
  146. /package/{core → dist/core}/convert.d.ts +0 -0
  147. /package/{core → dist/core}/convert.js +0 -0
  148. /package/{core → dist/core}/date.d.ts +0 -0
  149. /package/{core → dist/core}/date.js +0 -0
  150. /package/{core → dist/core}/db.d.ts +0 -0
  151. /package/{core → dist/core}/db.js +0 -0
  152. /package/{core → dist/core}/ent.d.ts +0 -0
  153. /package/{core → dist/core}/ent.js +0 -0
  154. /package/{core → dist/core}/global_schema.d.ts +0 -0
  155. /package/{core → dist/core}/global_schema.js +0 -0
  156. /package/{core → dist/core}/loaders/assoc_count_loader.d.ts +0 -0
  157. /package/{core → dist/core}/loaders/assoc_count_loader.js +0 -0
  158. /package/{core → dist/core}/loaders/assoc_edge_loader.d.ts +0 -0
  159. /package/{core → dist/core}/loaders/assoc_edge_loader.js +0 -0
  160. /package/{core → dist/core}/loaders/index.d.ts +0 -0
  161. /package/{core → dist/core}/loaders/index.js +0 -0
  162. /package/{core → dist/core}/loaders/loader.d.ts +0 -0
  163. /package/{core → dist/core}/loaders/loader.js +0 -0
  164. /package/{core → dist/core}/loaders/object_loader.d.ts +0 -0
  165. /package/{core → dist/core}/loaders/object_loader.js +0 -0
  166. /package/{core → dist/core}/loaders/query_loader.d.ts +0 -0
  167. /package/{core → dist/core}/loaders/query_loader.js +0 -0
  168. /package/{core → dist/core}/loaders/raw_count_loader.d.ts +0 -0
  169. /package/{core → dist/core}/loaders/raw_count_loader.js +0 -0
  170. /package/{core → dist/core}/logger.d.ts +0 -0
  171. /package/{core → dist/core}/logger.js +0 -0
  172. /package/{core → dist/core}/privacy.d.ts +0 -0
  173. /package/{core → dist/core}/privacy.js +0 -0
  174. /package/{core → dist/core}/query/assoc_query.d.ts +0 -0
  175. /package/{core → dist/core}/query/assoc_query.js +0 -0
  176. /package/{core → dist/core}/query/custom_clause_query.d.ts +0 -0
  177. /package/{core → dist/core}/query/custom_clause_query.js +0 -0
  178. /package/{core → dist/core}/query/custom_query.d.ts +0 -0
  179. /package/{core → dist/core}/query/custom_query.js +0 -0
  180. /package/{core → dist/core}/query/index.d.ts +0 -0
  181. /package/{core → dist/core}/query/index.js +0 -0
  182. /package/{core → dist/core}/query/query.d.ts +0 -0
  183. /package/{core → dist/core}/query/query.js +0 -0
  184. /package/{core → dist/core}/query_impl.d.ts +0 -0
  185. /package/{core → dist/core}/query_impl.js +0 -0
  186. /package/{core → dist/core}/viewer.d.ts +0 -0
  187. /package/{core → dist/core}/viewer.js +0 -0
  188. /package/{graphql → dist/graphql}/builtins/connection.d.ts +0 -0
  189. /package/{graphql → dist/graphql}/builtins/connection.js +0 -0
  190. /package/{graphql → dist/graphql}/builtins/edge.d.ts +0 -0
  191. /package/{graphql → dist/graphql}/builtins/edge.js +0 -0
  192. /package/{graphql → dist/graphql}/builtins/node.d.ts +0 -0
  193. /package/{graphql → dist/graphql}/builtins/node.js +0 -0
  194. /package/{graphql → dist/graphql}/graphql.d.ts +0 -0
  195. /package/{graphql → dist/graphql}/graphql.js +0 -0
  196. /package/{graphql → dist/graphql}/graphql_field_helpers.d.ts +0 -0
  197. /package/{graphql → dist/graphql}/graphql_field_helpers.js +0 -0
  198. /package/{graphql → dist/graphql}/index.d.ts +0 -0
  199. /package/{graphql → dist/graphql}/index.js +0 -0
  200. /package/{graphql → dist/graphql}/mutations/union.d.ts +0 -0
  201. /package/{graphql → dist/graphql}/mutations/union.js +0 -0
  202. /package/{graphql → dist/graphql}/node_resolver.d.ts +0 -0
  203. /package/{graphql → dist/graphql}/node_resolver.js +0 -0
  204. /package/{graphql → dist/graphql}/query/connection_type.d.ts +0 -0
  205. /package/{graphql → dist/graphql}/query/connection_type.js +0 -0
  206. /package/{graphql → dist/graphql}/query/edge_connection.d.ts +0 -0
  207. /package/{graphql → dist/graphql}/query/edge_connection.js +0 -0
  208. /package/{graphql → dist/graphql}/query/page_info.d.ts +0 -0
  209. /package/{graphql → dist/graphql}/query/page_info.js +0 -0
  210. /package/{graphql → dist/graphql}/query/shared_edge_connection.d.ts +0 -0
  211. /package/{graphql → dist/graphql}/query/shared_edge_connection.js +0 -0
  212. /package/{graphql → dist/graphql}/scalars/orderby_direction.d.ts +0 -0
  213. /package/{graphql → dist/graphql}/scalars/orderby_direction.js +0 -0
  214. /package/{graphql → dist/graphql}/scalars/time.d.ts +0 -0
  215. /package/{graphql → dist/graphql}/scalars/time.js +0 -0
  216. /package/{imports → dist/imports}/dataz/example1/_auth.d.ts +0 -0
  217. /package/{imports → dist/imports}/dataz/example1/_auth.js +0 -0
  218. /package/{imports → dist/imports}/dataz/example1/_viewer.d.ts +0 -0
  219. /package/{imports → dist/imports}/dataz/example1/_viewer.js +0 -0
  220. /package/{imports → dist/imports}/index.d.ts +0 -0
  221. /package/{imports → dist/imports}/index.js +0 -0
  222. /package/{index.d.ts → dist/index.d.ts} +0 -0
  223. /package/{index.js → dist/index.js} +0 -0
  224. /package/{parse_schema → dist/parse_schema}/parse.d.ts +0 -0
  225. /package/{parse_schema → dist/parse_schema}/parse.js +0 -0
  226. /package/{schema → dist/schema}/base_schema.d.ts +0 -0
  227. /package/{schema → dist/schema}/base_schema.js +0 -0
  228. /package/{schema → dist/schema}/field.d.ts +0 -0
  229. /package/{schema → dist/schema}/field.js +0 -0
  230. /package/{schema → dist/schema}/index.d.ts +0 -0
  231. /package/{schema → dist/schema}/index.js +0 -0
  232. /package/{schema → dist/schema}/json_field.d.ts +0 -0
  233. /package/{schema → dist/schema}/json_field.js +0 -0
  234. /package/{schema → dist/schema}/schema.d.ts +0 -0
  235. /package/{schema → dist/schema}/schema.js +0 -0
  236. /package/{schema → dist/schema}/struct_field.d.ts +0 -0
  237. /package/{schema → dist/schema}/struct_field.js +0 -0
  238. /package/{schema → dist/schema}/union_field.d.ts +0 -0
  239. /package/{schema → dist/schema}/union_field.js +0 -0
  240. /package/{scripts → dist/scripts}/custom_compiler.d.ts +0 -0
  241. /package/{scripts → dist/scripts}/custom_compiler.js +0 -0
  242. /package/{scripts → dist/scripts}/custom_graphql.d.ts +0 -0
  243. /package/{scripts → dist/scripts}/custom_graphql.js +0 -0
  244. /package/{scripts → dist/scripts}/migrate_v0.1.d.ts +0 -0
  245. /package/{scripts → dist/scripts}/migrate_v0.1.js +0 -0
  246. /package/{scripts → dist/scripts}/move_types.d.ts +0 -0
  247. /package/{scripts → dist/scripts}/move_types.js +0 -0
  248. /package/{scripts → dist/scripts}/read_schema.d.ts +0 -0
  249. /package/{scripts → dist/scripts}/read_schema.js +0 -0
  250. /package/{testutils → dist/testutils}/action/complex_schemas.d.ts +0 -0
  251. /package/{testutils → dist/testutils}/action/complex_schemas.js +0 -0
  252. /package/{testutils → dist/testutils}/builder.d.ts +0 -0
  253. /package/{testutils → dist/testutils}/builder.js +0 -0
  254. /package/{testutils → dist/testutils}/context/test_context.d.ts +0 -0
  255. /package/{testutils → dist/testutils}/context/test_context.js +0 -0
  256. /package/{testutils → dist/testutils}/db/fixture.d.ts +0 -0
  257. /package/{testutils → dist/testutils}/db/fixture.js +0 -0
  258. /package/{testutils → dist/testutils}/db/temp_db.d.ts +0 -0
  259. /package/{testutils → dist/testutils}/db/temp_db.js +0 -0
  260. /package/{testutils → dist/testutils}/db/value.d.ts +0 -0
  261. /package/{testutils → dist/testutils}/db/value.js +0 -0
  262. /package/{testutils → dist/testutils}/db_mock.d.ts +0 -0
  263. /package/{testutils → dist/testutils}/db_mock.js +0 -0
  264. /package/{testutils → dist/testutils}/db_time_zone.d.ts +0 -0
  265. /package/{testutils → dist/testutils}/db_time_zone.js +0 -0
  266. /package/{testutils → dist/testutils}/ent-graphql-tests/index.d.ts +0 -0
  267. /package/{testutils → dist/testutils}/ent-graphql-tests/index.js +0 -0
  268. /package/{testutils → dist/testutils}/fake_comms.d.ts +0 -0
  269. /package/{testutils → dist/testutils}/fake_comms.js +0 -0
  270. /package/{testutils → dist/testutils}/fake_data/const.d.ts +0 -0
  271. /package/{testutils → dist/testutils}/fake_data/const.js +0 -0
  272. /package/{testutils → dist/testutils}/fake_data/events_query.d.ts +0 -0
  273. /package/{testutils → dist/testutils}/fake_data/events_query.js +0 -0
  274. /package/{testutils → dist/testutils}/fake_data/fake_contact.d.ts +0 -0
  275. /package/{testutils → dist/testutils}/fake_data/fake_contact.js +0 -0
  276. /package/{testutils → dist/testutils}/fake_data/fake_event.d.ts +0 -0
  277. /package/{testutils → dist/testutils}/fake_data/fake_event.js +0 -0
  278. /package/{testutils → dist/testutils}/fake_data/fake_tag.d.ts +0 -0
  279. /package/{testutils → dist/testutils}/fake_data/fake_tag.js +0 -0
  280. /package/{testutils → dist/testutils}/fake_data/fake_user.d.ts +0 -0
  281. /package/{testutils → dist/testutils}/fake_data/fake_user.js +0 -0
  282. /package/{testutils → dist/testutils}/fake_data/index.d.ts +0 -0
  283. /package/{testutils → dist/testutils}/fake_data/index.js +0 -0
  284. /package/{testutils → dist/testutils}/fake_data/internal.d.ts +0 -0
  285. /package/{testutils → dist/testutils}/fake_data/internal.js +0 -0
  286. /package/{testutils → dist/testutils}/fake_data/tag_query.d.ts +0 -0
  287. /package/{testutils → dist/testutils}/fake_data/tag_query.js +0 -0
  288. /package/{testutils → dist/testutils}/fake_data/test_helpers.d.ts +0 -0
  289. /package/{testutils → dist/testutils}/fake_data/test_helpers.js +0 -0
  290. /package/{testutils → dist/testutils}/fake_data/user_query.d.ts +0 -0
  291. /package/{testutils → dist/testutils}/fake_data/user_query.js +0 -0
  292. /package/{testutils → dist/testutils}/fake_log.d.ts +0 -0
  293. /package/{testutils → dist/testutils}/fake_log.js +0 -0
  294. /package/{testutils → dist/testutils}/mock_date.d.ts +0 -0
  295. /package/{testutils → dist/testutils}/mock_date.js +0 -0
  296. /package/{testutils → dist/testutils}/mock_log.d.ts +0 -0
  297. /package/{testutils → dist/testutils}/mock_log.js +0 -0
  298. /package/{testutils → dist/testutils}/parse_sql.d.ts +0 -0
  299. /package/{testutils → dist/testutils}/parse_sql.js +0 -0
  300. /package/{testutils → dist/testutils}/test_edge_global_schema.d.ts +0 -0
  301. /package/{testutils → dist/testutils}/test_edge_global_schema.js +0 -0
  302. /package/{testutils → dist/testutils}/write.d.ts +0 -0
  303. /package/{testutils → dist/testutils}/write.js +0 -0
  304. /package/{tsc → dist/tsc}/ast.d.ts +0 -0
  305. /package/{tsc → dist/tsc}/ast.js +0 -0
  306. /package/{tsc → dist/tsc}/compilerOptions.d.ts +0 -0
  307. /package/{tsc → dist/tsc}/compilerOptions.js +0 -0
  308. /package/{tsc → dist/tsc}/move_generated.d.ts +0 -0
  309. /package/{tsc → dist/tsc}/move_generated.js +0 -0
  310. /package/{tsc → dist/tsc}/transform.d.ts +0 -0
  311. /package/{tsc → dist/tsc}/transform.js +0 -0
  312. /package/{tsc → dist/tsc}/transform_action.d.ts +0 -0
  313. /package/{tsc → dist/tsc}/transform_action.js +0 -0
  314. /package/{tsc → dist/tsc}/transform_ent.d.ts +0 -0
  315. /package/{tsc → dist/tsc}/transform_ent.js +0 -0
  316. /package/{tsc → dist/tsc}/transform_schema.d.ts +0 -0
  317. /package/{tsc → dist/tsc}/transform_schema.js +0 -0
@@ -0,0 +1,34 @@
1
+ import {
2
+ GraphQLBoolean,
3
+ GraphQLFieldConfigMap,
4
+ GraphQLNonNull,
5
+ GraphQLString,
6
+ GraphQLObjectType,
7
+ } from "graphql";
8
+ import { RequestContext } from "../../core/context";
9
+ import { PaginationInfo } from "../../core/query/query";
10
+
11
+ // NB: if this changes, need to update renderer.go also
12
+ export const GraphQLPageInfo = new GraphQLObjectType({
13
+ name: "PageInfo",
14
+ fields: (): GraphQLFieldConfigMap<PaginationInfo, RequestContext> => ({
15
+ hasNextPage: {
16
+ type: new GraphQLNonNull(GraphQLBoolean),
17
+ resolve: (source: PaginationInfo) => {
18
+ return source.hasNextPage || false;
19
+ },
20
+ },
21
+ hasPreviousPage: {
22
+ type: new GraphQLNonNull(GraphQLBoolean),
23
+ resolve: (source: PaginationInfo) => {
24
+ return source.hasPreviousPage || false;
25
+ },
26
+ },
27
+ startCursor: {
28
+ type: new GraphQLNonNull(GraphQLString),
29
+ },
30
+ endCursor: {
31
+ type: new GraphQLNonNull(GraphQLString),
32
+ },
33
+ }),
34
+ });
@@ -0,0 +1,287 @@
1
+ import { IDViewer } from "../../core/viewer";
2
+ import { Viewer, Data, Ent } from "../../core/base";
3
+ import { getCursor } from "../../core/ent";
4
+ import { GraphQLEdgeConnection } from "./edge_connection";
5
+ import { FakeUser, FakeContact } from "../../testutils/fake_data/index";
6
+ import {
7
+ inputs,
8
+ createAllContacts,
9
+ } from "../../testutils/fake_data/test_helpers";
10
+ import { EdgeQuery } from "../../core/query/query";
11
+
12
+ class TestConnection<TEdge extends Data> {
13
+ private user: FakeUser;
14
+ private allContacts: FakeContact[];
15
+ private filteredContacts: FakeContact[] = [];
16
+
17
+ conn: GraphQLEdgeConnection<Ent, TEdge>;
18
+ constructor(
19
+ private getQuery: (
20
+ v: Viewer,
21
+ user: FakeUser,
22
+ ) => EdgeQuery<FakeContact, Ent, TEdge>,
23
+ private ents: (contacts: FakeContact[]) => FakeContact[],
24
+ private filter?: (
25
+ conn: GraphQLEdgeConnection<Ent, TEdge>,
26
+ user: FakeUser,
27
+ contacts: FakeContact[],
28
+ ) => void,
29
+ ) {}
30
+
31
+ async beforeEach() {
32
+ [this.user, this.allContacts] = await createAllContacts();
33
+ this.allContacts = this.allContacts.reverse();
34
+ this.conn = new GraphQLEdgeConnection<Ent, TEdge>(
35
+ new IDViewer(this.user.id),
36
+ this.user,
37
+ (v, user: FakeUser) => this.getQuery(v, user),
38
+ );
39
+ if (this.filter) {
40
+ this.filter(this.conn, this.user, this.allContacts);
41
+ }
42
+ this.filteredContacts = this.ents(this.allContacts);
43
+ }
44
+
45
+ async testTotalCount() {
46
+ const count = await this.conn.queryTotalCount();
47
+ expect(count).toBe(inputs.length);
48
+ }
49
+
50
+ async testNodes() {
51
+ const nodes = await this.conn.queryNodes();
52
+ expect(nodes.length).toBe(this.filteredContacts.length);
53
+ for (let i = 0; i < this.filteredContacts.length; i++) {
54
+ expect(nodes[i].id).toBe(this.filteredContacts[i].id);
55
+ }
56
+ }
57
+
58
+ async testEdges() {
59
+ const edges = await this.conn.queryEdges();
60
+ expect(edges.length).toBe(this.filteredContacts.length);
61
+ for (let i = 0; i < this.filteredContacts.length; i++) {
62
+ const edge = edges[i];
63
+ expect(edge.node.id).toBe(this.filteredContacts[i].id);
64
+ expect(this.conn.query.dataToID(edge.edge)).toBe(
65
+ this.filteredContacts[i].id,
66
+ );
67
+ }
68
+ }
69
+ }
70
+
71
+ interface options<TEnt extends Ent, TEdge extends Data> {
72
+ getQuery: (v: Viewer, src: Ent) => EdgeQuery<TEnt, Ent, TEdge>;
73
+ tableName: string;
74
+ sortCol: string;
75
+ }
76
+
77
+ export const commonTests = <TEdge extends Data>(
78
+ opts: options<FakeContact, TEdge>,
79
+ ) => {
80
+ function getCursorFrom(contacts: FakeContact[], idx: number) {
81
+ return getCursor({
82
+ row: contacts[idx],
83
+ col: "id",
84
+ });
85
+ }
86
+
87
+ describe("no filters", () => {
88
+ const filter = new TestConnection(
89
+ (v, user: FakeUser) => opts.getQuery(v, user),
90
+ (contacts) => contacts,
91
+ );
92
+
93
+ beforeEach(async () => {
94
+ await filter.beforeEach();
95
+ });
96
+
97
+ test("totalCount", async () => {
98
+ await filter.testTotalCount();
99
+ });
100
+
101
+ test("nodes", async () => {
102
+ await filter.testNodes();
103
+ });
104
+
105
+ test("edges", async () => {
106
+ await filter.testEdges();
107
+ });
108
+
109
+ test("pagination", async () => {
110
+ const pagination = await filter.conn.queryPageInfo();
111
+ expect(pagination.hasNextPage).toBe(false);
112
+ expect(pagination.hasPreviousPage).toBe(false);
113
+ });
114
+ });
115
+
116
+ describe("filters. firstN", () => {
117
+ const filter = new TestConnection(
118
+ (v, user: FakeUser) => opts.getQuery(v, user),
119
+ (contacts) => contacts.slice(0, 2),
120
+ (conn: GraphQLEdgeConnection<Ent, TEdge>) => {
121
+ conn.first(2);
122
+ },
123
+ );
124
+
125
+ beforeEach(async () => {
126
+ await filter.beforeEach();
127
+ });
128
+
129
+ test("totalCount", async () => {
130
+ await filter.testTotalCount();
131
+ });
132
+
133
+ test("nodes", async () => {
134
+ await filter.testNodes();
135
+ });
136
+
137
+ test("edges", async () => {
138
+ await filter.testEdges();
139
+ });
140
+
141
+ test("pagination", async () => {
142
+ const [pagination, edges] = await Promise.all([
143
+ filter.conn.queryPageInfo(),
144
+ filter.conn.queryEdges(),
145
+ ]);
146
+ expect(pagination.hasNextPage).toBe(true);
147
+ expect(pagination.hasPreviousPage).toBe(false);
148
+ expect(edges.length).toBe(2);
149
+ expect(edges[0].cursor).toBe(pagination.startCursor);
150
+ expect(edges[1].cursor).toBe(pagination.endCursor);
151
+ });
152
+ });
153
+
154
+ describe("filters. firstN + cursor", () => {
155
+ const idx = 1;
156
+ const N = 3;
157
+ const filter = new TestConnection(
158
+ (v, user: FakeUser) => opts.getQuery(v, user),
159
+ // get the next 2
160
+ (contacts) => contacts.slice(idx + 1, idx + N),
161
+ (
162
+ conn: GraphQLEdgeConnection<Ent, TEdge>,
163
+ user: FakeUser,
164
+ contacts: FakeContact[],
165
+ ) => {
166
+ const cursor = getCursorFrom(contacts, idx);
167
+ conn.first(2, cursor);
168
+ },
169
+ );
170
+
171
+ beforeEach(async () => {
172
+ await filter.beforeEach();
173
+ });
174
+
175
+ test("totalCount", async () => {
176
+ await filter.testTotalCount();
177
+ });
178
+
179
+ test("nodes", async () => {
180
+ await filter.testNodes();
181
+ });
182
+
183
+ test("edges", async () => {
184
+ await filter.testEdges();
185
+ });
186
+
187
+ test("pagination", async () => {
188
+ const [pagination, edges] = await Promise.all([
189
+ filter.conn.queryPageInfo(),
190
+ filter.conn.queryEdges(),
191
+ ]);
192
+ expect(pagination.hasNextPage).toBe(true);
193
+ expect(pagination.hasPreviousPage).toBe(false);
194
+ expect(edges.length).toBe(2);
195
+ expect(edges[0].cursor).toBe(pagination.startCursor);
196
+ expect(edges[1].cursor).toBe(pagination.endCursor);
197
+ });
198
+ });
199
+
200
+ describe("filters. before cursor", () => {
201
+ const filter = new TestConnection(
202
+ (v, user: FakeUser) => opts.getQuery(v, user),
203
+ (contacts) => contacts.slice(2, 4).reverse(),
204
+ (
205
+ conn: GraphQLEdgeConnection<Ent, TEdge>,
206
+ user: FakeUser,
207
+ contacts: FakeContact[],
208
+ ) => {
209
+ // get the 2 before it
210
+ const cursor = getCursorFrom(contacts, 4);
211
+
212
+ conn.last(2, cursor);
213
+ },
214
+ );
215
+
216
+ beforeEach(async () => {
217
+ await filter.beforeEach();
218
+ });
219
+
220
+ test("totalCount", async () => {
221
+ await filter.testTotalCount();
222
+ });
223
+
224
+ test("nodes", async () => {
225
+ await filter.testNodes();
226
+ });
227
+
228
+ test("edges", async () => {
229
+ await filter.testEdges();
230
+ });
231
+
232
+ test("pagination", async () => {
233
+ const [pagination, edges] = await Promise.all([
234
+ filter.conn.queryPageInfo(),
235
+ filter.conn.queryEdges(),
236
+ ]);
237
+ expect(pagination.hasNextPage).toBe(false);
238
+ expect(pagination.hasPreviousPage).toBe(true);
239
+ expect(edges.length).toBe(2);
240
+ expect(edges[0].cursor).toBe(pagination.startCursor);
241
+ expect(edges[1].cursor).toBe(pagination.endCursor);
242
+ });
243
+ });
244
+
245
+ describe("no source", () => {
246
+ test("no filter", async () => {
247
+ const [user, allContacts] = await createAllContacts();
248
+
249
+ const conn = new GraphQLEdgeConnection<FakeContact, TEdge>(
250
+ new IDViewer(user.id),
251
+ (v) => opts.getQuery(v, user),
252
+ );
253
+ allContacts.reverse();
254
+
255
+ const nodes = await conn.queryNodes();
256
+ expect(nodes.length).toBe(allContacts.length);
257
+ for (let i = 0; i < allContacts.length; i++) {
258
+ expect(nodes[i].id).toBe(allContacts[i].id);
259
+ }
260
+
261
+ const pagination = await conn.queryPageInfo();
262
+ expect(pagination.hasNextPage).toBe(false);
263
+ expect(pagination.hasPreviousPage).toBe(false);
264
+ });
265
+
266
+ test("with filter", async () => {
267
+ const [user, allContacts] = await createAllContacts();
268
+
269
+ const conn = new GraphQLEdgeConnection<Ent, TEdge>(
270
+ new IDViewer(user.id),
271
+ (v) => opts.getQuery(v, user).first(2),
272
+ );
273
+ allContacts.reverse();
274
+ const filtered = allContacts.slice(0, 2);
275
+
276
+ const nodes = await conn.queryNodes();
277
+ expect(nodes.length).toBe(filtered.length);
278
+ for (let i = 0; i < filtered.length; i++) {
279
+ expect(nodes[i].id).toBe(filtered[i].id);
280
+ }
281
+
282
+ const pagination = await conn.queryPageInfo();
283
+ expect(pagination.hasNextPage).toBe(true);
284
+ expect(pagination.hasPreviousPage).toBe(false);
285
+ });
286
+ });
287
+ };
@@ -0,0 +1,13 @@
1
+ import { GraphQLEnumType } from "graphql";
2
+
3
+ export const GraphQLOrderByDirection = new GraphQLEnumType({
4
+ name: "OrderByDirection",
5
+ values: {
6
+ ASC: {
7
+ value: "ASC",
8
+ },
9
+ DESC: {
10
+ value: "DESC",
11
+ },
12
+ },
13
+ });
@@ -0,0 +1,38 @@
1
+ import { GraphQLScalarType, GraphQLError } from "graphql";
2
+ import { Kind, ValueNode } from "graphql/language";
3
+ import { DateTime } from "luxon";
4
+ import { parseDate } from "../../core/date";
5
+
6
+ // Time refers to a Timestamp or Date scalar
7
+
8
+ function parseValue(input: any): Date {
9
+ return parseDate(input, (msg: string) => {
10
+ return new GraphQLError(msg);
11
+ }).toJSDate();
12
+ }
13
+
14
+ // Date or Timestamp
15
+ // Need feedback. should this be renamed to Timestamp?
16
+ // This is called Time but only supports Date and Timestamp values
17
+ // and `Time` isn't supported. that's a string
18
+ export const GraphQLTime = new GraphQLScalarType({
19
+ name: "Time",
20
+ description: "Time scalar type",
21
+ serialize: (outputValue: any) => {
22
+ if (outputValue instanceof Date) {
23
+ return outputValue.toISOString();
24
+ } else if (outputValue instanceof DateTime) {
25
+ return outputValue.toUTC().toISO();
26
+ }
27
+ return parseValue(outputValue).toISOString();
28
+ },
29
+ parseValue: parseValue,
30
+ parseLiteral: (ast: ValueNode) => {
31
+ // console.log("literal", ast);
32
+ if (ast.kind === Kind.INT) {
33
+ return new Date(+ast.value);
34
+ }
35
+ // TODO?
36
+ throw new GraphQLError(`Time cannot represent literal value ${ast}`);
37
+ },
38
+ });
@@ -0,0 +1,51 @@
1
+ import {
2
+ gqlInputObjectType,
3
+ gqlField,
4
+ gqlMutation,
5
+ gqlObjectType,
6
+ } from "../../../graphql/graphql";
7
+ import { ID } from "../../../core/base";
8
+ import { GraphQLID, GraphQLString } from "graphql";
9
+
10
+ @gqlInputObjectType()
11
+ class UserAuthInput {
12
+ @gqlField({
13
+ class: "UserAuthInput",
14
+ type: GraphQLString,
15
+ })
16
+ emailAddress: string;
17
+ @gqlField({
18
+ class: "UserAuthInput",
19
+ type: GraphQLString,
20
+ })
21
+ password: string;
22
+ }
23
+
24
+ @gqlObjectType()
25
+ class UserAuthResponse {
26
+ @gqlField({
27
+ class: "UserAuthResponse",
28
+ type: GraphQLString,
29
+ })
30
+ token: string;
31
+
32
+ @gqlField({ class: "UserAuthResponses", type: GraphQLID })
33
+ viewerID: ID;
34
+ }
35
+
36
+ class AuthResolver {
37
+ @gqlMutation({
38
+ class: "AuthResolver",
39
+ name: "userAuth",
40
+ type: UserAuthResponse,
41
+ args: [
42
+ {
43
+ name: "input",
44
+ type: UserAuthInput,
45
+ },
46
+ ],
47
+ })
48
+ async userAuth(input: UserAuthInput): Promise<UserAuthResponse> {
49
+ throw new Error("not implemented");
50
+ }
51
+ }
@@ -0,0 +1,35 @@
1
+ import {
2
+ gqlField,
3
+ gqlObjectType,
4
+ gqlContextType,
5
+ gqlQuery,
6
+ } from "../../../graphql/graphql";
7
+ import { Viewer } from "../../../core/base";
8
+ import { GraphQLID } from "graphql";
9
+ import { RequestContext } from "../../../core/context";
10
+
11
+ @gqlObjectType({ name: "Viewer" })
12
+ class ViewerType {
13
+ constructor(private viewer: Viewer) {}
14
+
15
+ @gqlField({
16
+ class: "ViewerType",
17
+ type: GraphQLID,
18
+ nullable: true,
19
+ })
20
+ get viewerID() {
21
+ return this.viewer.viewerID;
22
+ }
23
+ }
24
+
25
+ export default class ViewerResolver {
26
+ @gqlQuery({
27
+ class: "ViewerResolver",
28
+ name: "viewer",
29
+ type: ViewerType,
30
+ args: [gqlContextType()],
31
+ })
32
+ viewer(context: RequestContext): ViewerType {
33
+ return new ViewerType(context.getViewer());
34
+ }
35
+ }
@@ -0,0 +1,213 @@
1
+ import * as glob from "glob";
2
+ import ts from "typescript";
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { readCompilerOptions } from "../tsc/compilerOptions";
6
+
7
+ function getFiles(filePath: string, opts?: Options): string[] {
8
+ if (!path.isAbsolute(filePath)) {
9
+ throw new Error("absolute file path required");
10
+ }
11
+ // graphql path should be passed to this
12
+ // this is more agnostic about what it expect here
13
+
14
+ let pattern = `${filePath}/**/*.ts`;
15
+ if (opts?.justCurrentDir) {
16
+ pattern = `${filePath}/**.ts`;
17
+ }
18
+ let files = glob.sync(pattern, {
19
+ ignore: opts?.ignore,
20
+ });
21
+ if (opts?.filter) {
22
+ files = files.filter(opts.filter);
23
+ }
24
+ return files;
25
+ }
26
+
27
+ export interface Options {
28
+ filter?: (file: string, index: number, array: string[]) => boolean;
29
+ justCurrentDir?: boolean;
30
+ ignore?: string | string[] | undefined;
31
+ }
32
+
33
+ export interface PathResult {
34
+ m: Map<string, file[]>;
35
+ // throws if there's more than one class that maps to this
36
+ getInfoForClass(className: string): classResult;
37
+ }
38
+
39
+ interface classResult {
40
+ class: classInfo;
41
+ file: file;
42
+ }
43
+
44
+ interface ParseInput {
45
+ root: string;
46
+ opts?: Options;
47
+ }
48
+
49
+ export function parseCustomImports(
50
+ filePath: string,
51
+ inputs: ParseInput[],
52
+ ): PathResult {
53
+ const files: string[] = [];
54
+ // simplifies tests and other simple callsites
55
+ if (inputs.length === 0) {
56
+ inputs.push({ root: filePath });
57
+ }
58
+ for (const input of inputs) {
59
+ files.push(...getFiles(input.root, input.opts));
60
+ }
61
+ const options = readCompilerOptions(filePath);
62
+
63
+ let classMap = new Map<string, file[]>();
64
+
65
+ files.forEach((file) => {
66
+ const sourceFile = ts.createSourceFile(
67
+ file,
68
+ fs.readFileSync(file).toString(),
69
+ options.target || ts.ScriptTarget.ES2015,
70
+ );
71
+
72
+ let f: file = {
73
+ path: sourceFile.fileName,
74
+ imports: new Map(),
75
+ classes: new Map(),
76
+ };
77
+ traverse(sourceFile, f, classMap);
78
+ //console.log(f);
79
+ // console.log(classMap);
80
+ });
81
+
82
+ return {
83
+ m: classMap,
84
+ getInfoForClass: (className: string) => {
85
+ let files = classMap.get(className);
86
+ if (files?.length !== 1) {
87
+ throw new Error(
88
+ `expected 1 class with name ${className}, got ${
89
+ files?.length || 0
90
+ } classes instead`,
91
+ );
92
+ }
93
+ let f = files[0];
94
+ let info = f.classes.get(className);
95
+ if (!info) {
96
+ throw new Error(
97
+ `expected to find info for class ${className} in file ${f.path}`,
98
+ );
99
+ }
100
+ return {
101
+ class: info,
102
+ file: f,
103
+ };
104
+ },
105
+ };
106
+ }
107
+
108
+ export interface importInfo {
109
+ name: string; // name in the file
110
+ importPath: string; // where it's imported from
111
+ defaultImport?: boolean; // default import?
112
+ }
113
+
114
+ export interface classInfo {
115
+ name: string;
116
+ exported: boolean;
117
+ defaultExport: boolean;
118
+ }
119
+
120
+ export interface file {
121
+ path: string; // path to file
122
+ imports: Map<string, importInfo>; // imported things, mapping from name to importInfo
123
+ classes: Map<string, classInfo>; // classInfo
124
+ }
125
+
126
+ function traverse(
127
+ sourceFile: ts.SourceFile,
128
+ f: file,
129
+ classMap: Map<string, file[]>,
130
+ ) {
131
+ ts.forEachChild(sourceFile, function (node: ts.Node) {
132
+ switch (node.kind) {
133
+ case ts.SyntaxKind.ImportDeclaration:
134
+ let importNode = node as ts.ImportDeclaration;
135
+ let text = importNode.moduleSpecifier.getText(sourceFile);
136
+ // remove quotes
137
+ text = text.slice(1, -1);
138
+
139
+ let imported = importNode.importClause?.namedBindings;
140
+ if (imported) {
141
+ if (imported?.kind === ts.SyntaxKind.NamedImports) {
142
+ imported.elements.forEach((el) => {
143
+ f.imports.set(el.name.text, {
144
+ name: el.name.text,
145
+ importPath: text,
146
+ });
147
+ });
148
+ } else {
149
+ // TODO
150
+ // console.log("ttt?", sourceFile.fileName, text, imported.name);
151
+ }
152
+ } else {
153
+ let name = importNode.importClause?.name?.text;
154
+ if (name) {
155
+ f.imports.set(name, {
156
+ name,
157
+ importPath: text,
158
+ defaultImport: true,
159
+ });
160
+ }
161
+ }
162
+
163
+ break;
164
+ case ts.SyntaxKind.ClassDeclaration:
165
+ let classNode = node as ts.ClassDeclaration;
166
+ // console.log(classNode);
167
+ let exported = false;
168
+ let defaultExport = false;
169
+ if (classNode.modifiers?.length) {
170
+ classNode.modifiers.forEach((modifier) => {
171
+ if (modifier.kind === ts.SyntaxKind.ExportKeyword) {
172
+ exported = true;
173
+ }
174
+ if (modifier.kind === ts.SyntaxKind.DefaultKeyword) {
175
+ defaultExport = true;
176
+ }
177
+ });
178
+ }
179
+ let name = classNode.name?.text;
180
+ if (name) {
181
+ f.classes.set(name, {
182
+ name,
183
+ exported,
184
+ defaultExport,
185
+ });
186
+ if (classMap.has(name)) {
187
+ let files = classMap.get(name)!;
188
+ files.push(f);
189
+ } else {
190
+ let files = [f];
191
+ classMap.set(name, files);
192
+ }
193
+ }
194
+ // TODO functions and other things from files incase needed to disambiguate duplicate classes
195
+ // console.log(classNode.name?.text, exported, defaultExport);
196
+ // classNode.members.forEach((member) => {
197
+ // member.decorators?.forEach((decorator) => {
198
+ // console.log(decorator.expression.getText(sourceFile));
199
+ // });
200
+ // console.log(
201
+ // classNode.name?.text,
202
+ // member.name?.getText(sourceFile),
203
+ // member.decorators?.length,
204
+ // );
205
+ // });
206
+
207
+ // console.log(classNode.modifiers);
208
+ // console.log(classNode);
209
+ // classNode.members.map((member) => console.log(member));
210
+ break;
211
+ }
212
+ });
213
+ }