@commitspark/graphql-api 2.0.0-beta.3 → 2.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +165 -88
  3. package/dist/cjs/client.d.ts +1 -0
  4. package/dist/cjs/graphql/apollo-config-factory.d.ts +1 -0
  5. package/dist/cjs/graphql/errors.d.ts +4 -2
  6. package/dist/cjs/graphql/errors.d.ts.map +1 -0
  7. package/dist/cjs/graphql/errors.js +11 -1
  8. package/dist/cjs/graphql/errors.js.map +1 -1
  9. package/dist/cjs/graphql/input-type-generator.d.ts +1 -0
  10. package/dist/cjs/graphql/input-type-generator.d.ts.map +1 -0
  11. package/dist/cjs/graphql/input-type-generator.js +5 -10
  12. package/dist/cjs/graphql/input-type-generator.js.map +1 -1
  13. package/dist/cjs/graphql/queries-mutations-generator.d.ts +10 -1
  14. package/dist/cjs/graphql/queries-mutations-generator.d.ts.map +1 -0
  15. package/dist/cjs/graphql/queries-mutations-generator.js +55 -3
  16. package/dist/cjs/graphql/queries-mutations-generator.js.map +1 -1
  17. package/dist/cjs/graphql/resolvers/commit-message.d.ts +11 -0
  18. package/dist/cjs/graphql/resolvers/commit-message.d.ts.map +1 -0
  19. package/dist/cjs/graphql/resolvers/commit-message.js +22 -0
  20. package/dist/cjs/graphql/resolvers/commit-message.js.map +1 -0
  21. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +1 -0
  22. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js +2 -2
  23. package/dist/cjs/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  24. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +1 -0
  25. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js +3 -3
  26. package/dist/cjs/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  27. package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts +3 -0
  28. package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts.map +1 -0
  29. package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.js +7 -0
  30. package/dist/cjs/graphql/resolvers/field-resolvers/referenced-by-resolver.js.map +1 -0
  31. package/dist/cjs/graphql/resolvers/field-resolvers/types.d.ts +1 -0
  32. package/dist/cjs/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +1 -0
  33. package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.d.ts +3 -0
  34. package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.d.ts.map +1 -0
  35. package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.js +7 -0
  36. package/dist/cjs/graphql/resolvers/field-resolvers/version-resolver.js.map +1 -0
  37. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +1 -0
  38. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js +1 -1
  39. package/dist/cjs/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  40. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +1 -0
  41. package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -1
  42. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +33 -42
  43. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  44. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +1 -0
  45. package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -1
  46. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +28 -40
  47. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  48. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +1 -0
  49. package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -1
  50. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +26 -43
  51. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  52. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +1 -0
  53. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +1 -0
  54. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts +1 -0
  55. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js +5 -5
  56. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js.map +1 -1
  57. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +1 -0
  58. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +1 -0
  59. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +1 -1
  60. package/dist/cjs/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  61. package/dist/cjs/graphql/resolvers/types.d.ts +14 -2
  62. package/dist/cjs/graphql/resolvers/types.d.ts.map +1 -0
  63. package/dist/cjs/graphql/schema-analyzer.d.ts +1 -0
  64. package/dist/cjs/graphql/schema-generator.d.ts +1 -0
  65. package/dist/cjs/graphql/schema-generator.d.ts.map +1 -0
  66. package/dist/cjs/graphql/schema-generator.js +12 -1
  67. package/dist/cjs/graphql/schema-generator.js.map +1 -1
  68. package/dist/cjs/graphql/schema-root-type-generator.d.ts +1 -0
  69. package/dist/cjs/graphql/schema-utils/directive-util.d.ts +1 -0
  70. package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts +5 -2
  71. package/dist/cjs/graphql/schema-utils/entry-reference-util.d.ts.map +1 -0
  72. package/dist/cjs/graphql/schema-utils/entry-reference-util.js +94 -121
  73. package/dist/cjs/graphql/schema-utils/entry-reference-util.js.map +1 -1
  74. package/dist/cjs/graphql/schema-utils/entry-type-util.d.ts +1 -0
  75. package/dist/cjs/graphql/schema-utils/searchable-field-util.d.ts +1 -0
  76. package/dist/cjs/graphql/schema-utils/union-type-util.d.ts +1 -0
  77. package/dist/cjs/graphql/schema-utils/union-type-util.js +2 -2
  78. package/dist/cjs/graphql/schema-utils/union-type-util.js.map +1 -1
  79. package/dist/cjs/graphql/schema-validator.d.ts +1 -0
  80. package/dist/{types → cjs}/graphql/schema-validator.d.ts.map +1 -1
  81. package/dist/cjs/graphql/schema-validator.js +16 -0
  82. package/dist/cjs/graphql/schema-validator.js.map +1 -1
  83. package/dist/cjs/graphql/util.d.ts +1 -0
  84. package/dist/cjs/index.d.ts +1 -0
  85. package/dist/cjs/index.js +3 -0
  86. package/dist/cjs/index.js.map +1 -1
  87. package/dist/cjs/persistence/cache.d.ts +4 -1
  88. package/dist/cjs/persistence/cache.d.ts.map +1 -0
  89. package/dist/cjs/persistence/cache.js +8 -17
  90. package/dist/cjs/persistence/cache.js.map +1 -1
  91. package/dist/cjs/persistence/commit-with-retry.d.ts +16 -0
  92. package/dist/cjs/persistence/commit-with-retry.d.ts.map +1 -0
  93. package/dist/cjs/persistence/commit-with-retry.js +39 -0
  94. package/dist/cjs/persistence/commit-with-retry.js.map +1 -0
  95. package/dist/cjs/persistence/git-adapter-call.d.ts +10 -0
  96. package/dist/cjs/persistence/git-adapter-call.d.ts.map +1 -0
  97. package/dist/cjs/persistence/git-adapter-call.js +29 -0
  98. package/dist/cjs/persistence/git-adapter-call.js.map +1 -0
  99. package/dist/cjs/persistence/persistence.d.ts +12 -0
  100. package/dist/{types → cjs}/persistence/persistence.d.ts.map +1 -1
  101. package/dist/cjs/persistence/persistence.js +37 -2
  102. package/dist/cjs/persistence/persistence.js.map +1 -1
  103. package/dist/esm/client.d.ts.map +1 -0
  104. package/dist/esm/graphql/apollo-config-factory.d.ts.map +1 -0
  105. package/dist/{types → esm}/graphql/errors.d.ts +3 -2
  106. package/dist/esm/graphql/errors.d.ts.map +1 -0
  107. package/dist/esm/graphql/errors.js +10 -0
  108. package/dist/esm/graphql/errors.js.map +1 -1
  109. package/dist/esm/graphql/input-type-generator.d.ts.map +1 -0
  110. package/dist/esm/graphql/input-type-generator.js +6 -11
  111. package/dist/esm/graphql/input-type-generator.js.map +1 -1
  112. package/dist/{types → esm}/graphql/queries-mutations-generator.d.ts +9 -1
  113. package/dist/esm/graphql/queries-mutations-generator.d.ts.map +1 -0
  114. package/dist/esm/graphql/queries-mutations-generator.js +53 -3
  115. package/dist/esm/graphql/queries-mutations-generator.js.map +1 -1
  116. package/dist/esm/graphql/resolvers/commit-message.d.ts +11 -0
  117. package/dist/esm/graphql/resolvers/commit-message.d.ts.map +1 -0
  118. package/dist/esm/graphql/resolvers/commit-message.js +19 -0
  119. package/dist/esm/graphql/resolvers/commit-message.js.map +1 -0
  120. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +1 -0
  121. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js +3 -3
  122. package/dist/esm/graphql/resolvers/field-resolvers/entry-reference-resolver.js.map +1 -1
  123. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +1 -0
  124. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js +4 -4
  125. package/dist/esm/graphql/resolvers/field-resolvers/field-default-value-resolver.js.map +1 -1
  126. package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts +3 -0
  127. package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.d.ts.map +1 -0
  128. package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.js +3 -0
  129. package/dist/esm/graphql/resolvers/field-resolvers/referenced-by-resolver.js.map +1 -0
  130. package/dist/esm/graphql/resolvers/field-resolvers/types.d.ts.map +1 -0
  131. package/dist/esm/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +1 -0
  132. package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.d.ts +3 -0
  133. package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.d.ts.map +1 -0
  134. package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.js +3 -0
  135. package/dist/esm/graphql/resolvers/field-resolvers/version-resolver.js.map +1 -0
  136. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +1 -0
  137. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js +2 -2
  138. package/dist/esm/graphql/resolvers/object-type-field-default-value-resolver-generator.js.map +1 -1
  139. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts.map +1 -0
  140. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js +36 -45
  141. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.js.map +1 -1
  142. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts.map +1 -0
  143. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js +31 -43
  144. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.js.map +1 -1
  145. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts.map +1 -0
  146. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js +29 -46
  147. package/dist/esm/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.js.map +1 -1
  148. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +1 -0
  149. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +1 -0
  150. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts.map +1 -0
  151. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js +6 -6
  152. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-search-resolver.js.map +1 -1
  153. package/dist/esm/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +1 -0
  154. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +1 -0
  155. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js +2 -2
  156. package/dist/esm/graphql/resolvers/query-mutation-resolvers/union-type-resolver.js.map +1 -1
  157. package/dist/{types → esm}/graphql/resolvers/types.d.ts +13 -2
  158. package/dist/esm/graphql/resolvers/types.d.ts.map +1 -0
  159. package/dist/esm/graphql/schema-analyzer.d.ts.map +1 -0
  160. package/dist/esm/graphql/schema-generator.d.ts.map +1 -0
  161. package/dist/esm/graphql/schema-generator.js +14 -3
  162. package/dist/esm/graphql/schema-generator.js.map +1 -1
  163. package/dist/esm/graphql/schema-root-type-generator.d.ts.map +1 -0
  164. package/dist/esm/graphql/schema-utils/directive-util.d.ts.map +1 -0
  165. package/dist/esm/graphql/schema-utils/entry-reference-util.d.ts +6 -0
  166. package/dist/esm/graphql/schema-utils/entry-reference-util.d.ts.map +1 -0
  167. package/dist/esm/graphql/schema-utils/entry-reference-util.js +93 -121
  168. package/dist/esm/graphql/schema-utils/entry-reference-util.js.map +1 -1
  169. package/dist/esm/graphql/schema-utils/entry-type-util.d.ts.map +1 -0
  170. package/dist/esm/graphql/schema-utils/searchable-field-util.d.ts.map +1 -0
  171. package/dist/esm/graphql/schema-utils/union-type-util.d.ts.map +1 -0
  172. package/dist/esm/graphql/schema-utils/union-type-util.js +3 -3
  173. package/dist/esm/graphql/schema-utils/union-type-util.js.map +1 -1
  174. package/dist/esm/graphql/schema-validator.d.ts.map +1 -0
  175. package/dist/esm/graphql/schema-validator.js +17 -1
  176. package/dist/esm/graphql/schema-validator.js.map +1 -1
  177. package/dist/esm/graphql/util.d.ts.map +1 -0
  178. package/dist/esm/index.d.ts.map +1 -0
  179. package/dist/esm/index.js +2 -0
  180. package/dist/esm/index.js.map +1 -1
  181. package/dist/{types → esm}/persistence/cache.d.ts +3 -1
  182. package/dist/esm/persistence/cache.d.ts.map +1 -0
  183. package/dist/esm/persistence/cache.js +6 -15
  184. package/dist/esm/persistence/cache.js.map +1 -1
  185. package/dist/esm/persistence/commit-with-retry.d.ts +16 -0
  186. package/dist/esm/persistence/commit-with-retry.d.ts.map +1 -0
  187. package/dist/esm/persistence/commit-with-retry.js +35 -0
  188. package/dist/esm/persistence/commit-with-retry.js.map +1 -0
  189. package/dist/esm/persistence/git-adapter-call.d.ts +10 -0
  190. package/dist/esm/persistence/git-adapter-call.d.ts.map +1 -0
  191. package/dist/esm/persistence/git-adapter-call.js +24 -0
  192. package/dist/esm/persistence/git-adapter-call.js.map +1 -0
  193. package/dist/esm/persistence/persistence.d.ts +18 -0
  194. package/dist/esm/persistence/persistence.d.ts.map +1 -0
  195. package/dist/esm/persistence/persistence.js +36 -3
  196. package/dist/esm/persistence/persistence.js.map +1 -1
  197. package/package.json +27 -18
  198. package/src/graphql/errors.ts +2 -1
  199. package/src/graphql/input-type-generator.ts +6 -18
  200. package/src/graphql/queries-mutations-generator.ts +69 -3
  201. package/src/graphql/resolvers/commit-message.ts +34 -0
  202. package/src/graphql/resolvers/field-resolvers/referenced-by-resolver.ts +9 -0
  203. package/src/graphql/resolvers/field-resolvers/version-resolver.ts +8 -0
  204. package/src/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.ts +43 -57
  205. package/src/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.ts +45 -60
  206. package/src/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.ts +38 -67
  207. package/src/graphql/resolvers/types.ts +26 -2
  208. package/src/graphql/schema-generator.ts +19 -0
  209. package/src/graphql/schema-utils/entry-reference-util.ts +147 -191
  210. package/src/graphql/schema-validator.ts +21 -0
  211. package/src/persistence/cache.ts +8 -14
  212. package/src/persistence/commit-with-retry.ts +47 -0
  213. package/src/persistence/git-adapter-call.ts +27 -0
  214. package/src/persistence/persistence.ts +50 -0
  215. package/dist/types/graphql/errors.d.ts.map +0 -1
  216. package/dist/types/graphql/input-type-generator.d.ts.map +0 -1
  217. package/dist/types/graphql/queries-mutations-generator.d.ts.map +0 -1
  218. package/dist/types/graphql/resolvers/types.d.ts.map +0 -1
  219. package/dist/types/graphql/schema-generator.d.ts.map +0 -1
  220. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts +0 -4
  221. package/dist/types/graphql/schema-utils/entry-reference-util.d.ts.map +0 -1
  222. package/dist/types/persistence/cache.d.ts.map +0 -1
  223. package/dist/types/persistence/persistence.d.ts +0 -7
  224. /package/dist/{types → cjs}/client.d.ts.map +0 -0
  225. /package/dist/{types → cjs}/graphql/apollo-config-factory.d.ts.map +0 -0
  226. /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts.map +0 -0
  227. /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts.map +0 -0
  228. /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/types.d.ts.map +0 -0
  229. /package/dist/{types → cjs}/graphql/resolvers/field-resolvers/union-value-resolver.d.ts.map +0 -0
  230. /package/dist/{types → cjs}/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts.map +0 -0
  231. /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts.map +0 -0
  232. /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts.map +0 -0
  233. /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts.map +0 -0
  234. /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts.map +0 -0
  235. /package/dist/{types → cjs}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts.map +0 -0
  236. /package/dist/{types → cjs}/graphql/schema-analyzer.d.ts.map +0 -0
  237. /package/dist/{types → cjs}/graphql/schema-root-type-generator.d.ts.map +0 -0
  238. /package/dist/{types → cjs}/graphql/schema-utils/directive-util.d.ts.map +0 -0
  239. /package/dist/{types → cjs}/graphql/schema-utils/entry-type-util.d.ts.map +0 -0
  240. /package/dist/{types → cjs}/graphql/schema-utils/searchable-field-util.d.ts.map +0 -0
  241. /package/dist/{types → cjs}/graphql/schema-utils/union-type-util.d.ts.map +0 -0
  242. /package/dist/{types → cjs}/graphql/util.d.ts.map +0 -0
  243. /package/dist/{types → cjs}/index.d.ts.map +0 -0
  244. /package/dist/{types → esm}/client.d.ts +0 -0
  245. /package/dist/{types → esm}/graphql/apollo-config-factory.d.ts +0 -0
  246. /package/dist/{types → esm}/graphql/input-type-generator.d.ts +0 -0
  247. /package/dist/{types → esm}/graphql/resolvers/field-resolvers/entry-reference-resolver.d.ts +0 -0
  248. /package/dist/{types → esm}/graphql/resolvers/field-resolvers/field-default-value-resolver.d.ts +0 -0
  249. /package/dist/{types → esm}/graphql/resolvers/field-resolvers/types.d.ts +0 -0
  250. /package/dist/{types → esm}/graphql/resolvers/field-resolvers/union-value-resolver.d.ts +0 -0
  251. /package/dist/{types → esm}/graphql/resolvers/object-type-field-default-value-resolver-generator.d.ts +0 -0
  252. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-create-resolver.d.ts +0 -0
  253. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-delete-resolver.d.ts +0 -0
  254. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/mutation-update-resolver.d.ts +0 -0
  255. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-by-id-resolver.d.ts +0 -0
  256. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-every-resolver.d.ts +0 -0
  257. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-search-resolver.d.ts +0 -0
  258. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/query-type-by-id-resolver.d.ts +0 -0
  259. /package/dist/{types → esm}/graphql/resolvers/query-mutation-resolvers/union-type-resolver.d.ts +0 -0
  260. /package/dist/{types → esm}/graphql/schema-analyzer.d.ts +0 -0
  261. /package/dist/{types → esm}/graphql/schema-generator.d.ts +0 -0
  262. /package/dist/{types → esm}/graphql/schema-root-type-generator.d.ts +0 -0
  263. /package/dist/{types → esm}/graphql/schema-utils/directive-util.d.ts +0 -0
  264. /package/dist/{types → esm}/graphql/schema-utils/entry-type-util.d.ts +0 -0
  265. /package/dist/{types → esm}/graphql/schema-utils/searchable-field-util.d.ts +0 -0
  266. /package/dist/{types → esm}/graphql/schema-utils/union-type-util.d.ts +0 -0
  267. /package/dist/{types → esm}/graphql/schema-validator.d.ts +0 -0
  268. /package/dist/{types → esm}/graphql/util.d.ts +0 -0
  269. /package/dist/{types → esm}/index.d.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  GraphQLNullableType,
3
3
  GraphQLObjectType,
4
+ GraphQLSchema,
4
5
  GraphQLUnionType,
5
6
  isListType,
6
7
  isNonNullType,
@@ -10,6 +11,7 @@ import {
10
11
  } from 'graphql'
11
12
  import { ApolloContext } from '../../client.ts'
12
13
  import { getTypeById } from '../../persistence/persistence.ts'
14
+ import { EntriesRecord } from '../../persistence/cache.ts'
13
15
  import {
14
16
  getUnionTypeNameFromFieldValue,
15
17
  getUnionValue,
@@ -20,173 +22,172 @@ import { createError, ErrorCode } from '../errors.ts'
20
22
  import { EntryData } from '@commitspark/git-adapter'
21
23
  import { isEntryData } from '../util.ts'
22
24
 
23
- function isPermittedReferenceType(
24
- referencedTypeName: string,
25
- fieldType: GraphQLNullableType,
26
- ): boolean {
27
- if (isNonNullType(fieldType)) {
28
- return isPermittedReferenceType(referencedTypeName, fieldType.ofType)
29
- } else if (isListType(fieldType)) {
30
- return isPermittedReferenceType(referencedTypeName, fieldType.ofType)
31
- } else if (isUnionType(fieldType)) {
32
- return fieldType
33
- .getTypes()
34
- .map((concreteType) => concreteType.name)
35
- .includes(referencedTypeName)
36
- } else if (isObjectType(fieldType)) {
37
- return fieldType.name === referencedTypeName
38
- }
39
- return false
25
+ interface EntryReference {
26
+ id: string
27
+ fieldName: string
28
+ fieldType: GraphQLObjectType | GraphQLUnionType
40
29
  }
41
30
 
42
- async function validateReference(
31
+ type ReferencedByIndex = Map<string, string[]>
32
+
33
+ // commits are immutable, so an index built from the cached entries of a commit stays valid for as long as these
34
+ // entries remain cached
35
+ const referencedByIndexes = new WeakMap<EntriesRecord, ReferencedByIndex>()
36
+
37
+ export async function validateEntryReferences(
38
+ entryType: GraphQLObjectType,
43
39
  context: ApolloContext,
44
- fieldName: string,
45
- fieldType: GraphQLNullableType,
46
- fieldValue: EntryData,
40
+ data: EntryData,
47
41
  ): Promise<void> {
48
- if (isNonNullType(fieldType)) {
49
- await validateReference(context, fieldName, fieldType.ofType, fieldValue)
50
- return
51
- }
52
-
53
- if (isListType(fieldType)) {
54
- if (!Array.isArray(fieldValue)) {
42
+ for (const reference of getEntryReferences(entryType, data)) {
43
+ let referencedTypeName
44
+ try {
45
+ referencedTypeName = await getTypeById(context, reference.id)
46
+ } catch {
55
47
  throw createError(
56
- `Expected array while validation references for field "${fieldName}".`,
57
- ErrorCode.BAD_REPOSITORY_DATA,
48
+ `Failed to resolve entry reference "${reference.id}".`,
49
+ ErrorCode.BAD_USER_INPUT,
58
50
  {
59
- fieldName: fieldName,
60
- fieldValue: fieldValue,
51
+ fieldName: reference.fieldName,
52
+ fieldValue: reference.id,
61
53
  },
62
54
  )
63
55
  }
64
- for (const fieldListElement of fieldValue) {
65
- await validateReference(
66
- context,
67
- fieldName,
68
- fieldType.ofType,
69
- fieldListElement,
56
+ if (!isPermittedReferenceType(referencedTypeName, reference.fieldType)) {
57
+ throw createError(
58
+ `Reference with ID "${reference.id}" points to entry of incompatible type "${referencedTypeName}".`,
59
+ ErrorCode.BAD_USER_INPUT,
60
+ {
61
+ fieldName: reference.fieldName,
62
+ fieldValue: reference.id,
63
+ },
70
64
  )
71
65
  }
72
- return
73
66
  }
67
+ }
74
68
 
75
- if (isUnionType(fieldType) || isObjectType(fieldType)) {
69
+ export async function getReferencingEntryIds(
70
+ context: ApolloContext,
71
+ schema: GraphQLSchema,
72
+ id: string,
73
+ ): Promise<string[]> {
74
+ const entriesRecord = await context.repositoryCache.getEntriesRecord(
75
+ context,
76
+ context.getCurrentHash(),
77
+ )
78
+ let referencedByIndex = referencedByIndexes.get(entriesRecord)
79
+ if (referencedByIndex === undefined) {
80
+ referencedByIndex = buildReferencedByIndex(schema, entriesRecord)
81
+ referencedByIndexes.set(entriesRecord, referencedByIndex)
82
+ }
83
+ return referencedByIndex.get(id) ?? []
84
+ }
85
+
86
+ function buildReferencedByIndex(
87
+ schema: GraphQLSchema,
88
+ entriesRecord: EntriesRecord,
89
+ ): ReferencedByIndex {
90
+ const referencedByIndex: ReferencedByIndex = new Map()
91
+ for (const entry of entriesRecord.byId.values()) {
92
+ const entryType = schema.getType(entry.metadata.type)
76
93
  if (
77
- fieldValue === null ||
78
- !('id' in fieldValue) ||
79
- typeof fieldValue.id !== 'string'
94
+ !isObjectType(entryType) ||
95
+ !hasDirective(entryType, ENTRY_DIRECTIVE_NAME)
80
96
  ) {
81
97
  throw createError(
82
- `Expected key "id" with value of type string in data while validating reference for field "${fieldName}".`,
98
+ `Entry "${entry.id}" is of type "${entry.metadata.type}", which is not a type with directive ` +
99
+ `@${ENTRY_DIRECTIVE_NAME} in the schema.`,
83
100
  ErrorCode.BAD_REPOSITORY_DATA,
84
101
  {
85
- fieldName: fieldName,
86
- fieldValue: fieldValue,
102
+ typeName: entry.metadata.type,
103
+ fieldValue: entry.id,
87
104
  },
88
105
  )
89
106
  }
90
107
 
91
- const referencedId = fieldValue.id
92
- let referencedTypeName
93
- try {
94
- referencedTypeName = await getTypeById(context, referencedId)
95
- } catch {
96
- throw createError(
97
- `Failed to resolve entry reference "${referencedId}".`,
98
- ErrorCode.BAD_USER_INPUT,
99
- {
100
- fieldName: fieldName,
101
- fieldValue: referencedId,
102
- },
103
- )
104
- }
105
- if (!isPermittedReferenceType(referencedTypeName, fieldType)) {
106
- throw createError(
107
- `Reference with ID "${referencedId}" points to entry of incompatible type "${referencedTypeName}".`,
108
- ErrorCode.BAD_USER_INPUT,
109
- {
110
- fieldName: fieldName,
111
- fieldValue: referencedId,
112
- },
113
- )
108
+ const referencedIds = new Set(
109
+ getEntryReferences(entryType, entry.data ?? null).map(
110
+ (reference) => reference.id,
111
+ ),
112
+ )
113
+ for (const referencedId of referencedIds) {
114
+ const referencingIds = referencedByIndex.get(referencedId) ?? []
115
+ referencingIds.push(entry.id)
116
+ referencedByIndex.set(referencedId, referencingIds)
114
117
  }
115
118
  }
119
+
120
+ for (const referencingIds of referencedByIndex.values()) {
121
+ referencingIds.sort()
122
+ }
123
+ return referencedByIndex
116
124
  }
117
125
 
118
- export async function getReferencedEntryIds(
119
- rootType: GraphQLObjectType,
120
- context: ApolloContext,
121
- fieldName: string | null,
126
+ function getEntryReferences(
127
+ entryType: GraphQLObjectType,
128
+ data: EntryData,
129
+ ): EntryReference[] {
130
+ // the fields of the entry itself are traversed directly, so that any nested @Entry type is treated as reference,
131
+ // including references to entries of the same type
132
+ return getReferencesInObjectFields(entryType, data)
133
+ }
134
+
135
+ function getReferencesInObjectFields(
136
+ type: GraphQLObjectType,
137
+ data: unknown,
138
+ ): EntryReference[] {
139
+ if (data === null || data === undefined) {
140
+ return []
141
+ }
142
+ // expect our object type to hold EntryData (i.e. an object)
143
+ if (!isEntryData(data) || data === null) {
144
+ throw createError(
145
+ `Expected object as data for type "${type.name}".`,
146
+ ErrorCode.BAD_REPOSITORY_DATA,
147
+ {
148
+ typeName: type.name,
149
+ fieldValue: data,
150
+ },
151
+ )
152
+ }
153
+
154
+ return Object.entries(type.getFields()).flatMap(([fieldName, field]) =>
155
+ getReferencesInField(fieldName, field.type, data[fieldName]),
156
+ )
157
+ }
158
+
159
+ function getReferencesInField(
160
+ fieldName: string,
122
161
  type: GraphQLNullableType,
123
162
  data: unknown,
124
- ): Promise<string[]> {
163
+ ): EntryReference[] {
125
164
  if (data === null || data === undefined || isScalarType(type)) {
126
165
  return []
127
166
  }
128
167
 
129
168
  if (isNonNullType(type)) {
130
- return getReferencedEntryIds(
131
- rootType,
132
- context,
133
- fieldName,
134
- type.ofType,
135
- data,
136
- )
169
+ return getReferencesInField(fieldName, type.ofType, data)
137
170
  }
138
171
 
139
172
  if (isListType(type)) {
140
173
  if (!Array.isArray(data)) {
141
174
  throw createError(
142
- `Expected array as data for field "${fieldName}". `,
175
+ `Expected array as data for field "${fieldName}".`,
143
176
  ErrorCode.BAD_REPOSITORY_DATA,
144
177
  {
145
- fieldName: fieldName ? fieldName : undefined,
178
+ fieldName: fieldName,
146
179
  fieldValue: data,
147
180
  },
148
181
  )
149
182
  }
150
-
151
- let referencedEntryIds: string[] = []
152
- for (const element of data) {
153
- referencedEntryIds = [
154
- ...referencedEntryIds,
155
- ...(await getReferencedEntryIds(
156
- rootType,
157
- context,
158
- fieldName,
159
- type.ofType,
160
- element,
161
- )),
162
- ]
163
- }
164
- // deduplicate
165
- referencedEntryIds = [...new Set(referencedEntryIds)]
166
- return referencedEntryIds
183
+ return data.flatMap((element) =>
184
+ getReferencesInField(fieldName, type.ofType, element),
185
+ )
167
186
  }
168
187
 
169
188
  if (isUnionType(type)) {
170
- if (!isEntryData(data)) {
171
- throw createError(
172
- `Expected object as data for type "${type.name}".`,
173
- ErrorCode.BAD_REPOSITORY_DATA,
174
- {
175
- typeName: type.name,
176
- fieldName: fieldName ? fieldName : undefined,
177
- fieldValue: data,
178
- },
179
- )
180
- }
181
-
182
189
  if (isUnionOfEntryTypes(type)) {
183
- const referenceId = await getValidatedReferenceId(
184
- context,
185
- fieldName,
186
- type,
187
- data,
188
- )
189
- return [referenceId]
190
+ return [createEntryReference(fieldName, type, data)]
190
191
  }
191
192
 
192
193
  const requestedUnionTypeName = getUnionTypeNameFromFieldValue(data)
@@ -203,104 +204,59 @@ export async function getReferencedEntryIds(
203
204
  ErrorCode.BAD_REPOSITORY_DATA,
204
205
  {
205
206
  typeName: type.name,
206
- fieldName: fieldName ? fieldName : undefined,
207
+ fieldName: fieldName,
207
208
  fieldValue: data,
208
209
  },
209
210
  )
210
211
  }
211
- const unionValue = getUnionValue(data)
212
- return getReferencedEntryIds(
213
- rootType,
214
- context,
215
- fieldName,
212
+ return getReferencesInObjectFields(
216
213
  concreteFieldUnionType,
217
- unionValue,
214
+ getUnionValue(data),
218
215
  )
219
216
  }
220
217
 
221
218
  if (isObjectType(type)) {
222
- if (
223
- type.name !== rootType.name &&
224
- hasDirective(type, ENTRY_DIRECTIVE_NAME)
225
- ) {
226
- const referenceId = await getValidatedReferenceId(
227
- context,
228
- fieldName,
229
- type,
230
- data,
231
- )
232
- return [referenceId]
233
- } else {
234
- let referencedEntryIds: string[] = []
235
- for (const [fieldsKey, field] of Object.entries(type.getFields())) {
236
- // expect our object type to hold EntryData (i.e. an object)
237
- if (Array.isArray(data) || !isEntryData(data)) {
238
- throw createError(
239
- `Expected object as data for type "${type.name}".`,
240
- ErrorCode.BAD_REPOSITORY_DATA,
241
- {
242
- typeName: type.name,
243
- fieldName: field.name ? field.name : undefined,
244
- },
245
- )
246
- }
247
-
248
- // recursively get referenced IDs in nested data
249
- const nestedResult = await getReferencedEntryIds(
250
- rootType,
251
- context,
252
- fieldsKey,
253
- field.type,
254
- data[fieldsKey],
255
- )
256
- referencedEntryIds = [...referencedEntryIds, ...nestedResult]
257
- }
258
- // deduplicate
259
- referencedEntryIds = [...new Set(referencedEntryIds)]
260
- return referencedEntryIds
219
+ if (hasDirective(type, ENTRY_DIRECTIVE_NAME)) {
220
+ return [createEntryReference(fieldName, type, data)]
261
221
  }
222
+ return getReferencesInObjectFields(type, data)
262
223
  }
263
224
 
264
225
  return []
265
226
  }
266
227
 
267
- async function getValidatedReferenceId(
268
- context: ApolloContext,
269
- fieldName: string | null,
270
- type: GraphQLUnionType | GraphQLObjectType,
228
+ function createEntryReference(
229
+ fieldName: string,
230
+ fieldType: GraphQLObjectType | GraphQLUnionType,
271
231
  data: unknown,
272
- ): Promise<string> {
232
+ ): EntryReference {
273
233
  if (
234
+ typeof data !== 'object' ||
274
235
  data === null ||
275
- data === undefined ||
276
- !isEntryData(data) ||
277
- Array.isArray(data)
236
+ !('id' in data) ||
237
+ typeof data.id !== 'string'
278
238
  ) {
279
239
  throw createError(
280
- `Expected object as data for field "${fieldName}" of type "${type.name}".`,
240
+ `Expected key "id" with value of type string in data of field "${fieldName}" of type "${fieldType.name}".`,
281
241
  ErrorCode.BAD_REPOSITORY_DATA,
282
242
  {
283
- typeName: type.name,
284
- fieldName: fieldName ? fieldName : undefined,
243
+ typeName: fieldType.name,
244
+ fieldName: fieldName,
285
245
  fieldValue: data,
286
246
  },
287
247
  )
288
248
  }
289
- await validateReference(context, fieldName ? fieldName : '', type, data)
249
+ return { id: data.id, fieldName, fieldType }
250
+ }
290
251
 
291
- let referencedId = null
292
- if (typeof (referencedId = data.id) !== 'string') {
293
- throw createError(
294
- `Expected a key "id" with value of type string in data of field "${fieldName}" of type "${type.name}"` +
295
- ` after this reference was just verified to be valid.`,
296
- ErrorCode.INTERNAL_ERROR,
297
- {
298
- typeName: type.name,
299
- fieldName: fieldName ? fieldName : undefined,
300
- fieldValue: data,
301
- },
302
- )
252
+ function isPermittedReferenceType(
253
+ referencedTypeName: string,
254
+ fieldType: GraphQLObjectType | GraphQLUnionType,
255
+ ): boolean {
256
+ if (isUnionType(fieldType)) {
257
+ return fieldType
258
+ .getTypes()
259
+ .some((concreteType) => concreteType.name === referencedTypeName)
303
260
  }
304
-
305
- return referencedId
261
+ return fieldType.name === referencedTypeName
306
262
  }
@@ -2,6 +2,7 @@ import {
2
2
  getNamedType,
3
3
  GraphQLSchema,
4
4
  GraphQLUnionType,
5
+ isNonNullType,
5
6
  isObjectType,
6
7
  isScalarType,
7
8
  Kind,
@@ -59,8 +60,28 @@ function checkSearchableDirectiveOnlyOnStringFields(
59
60
  return ''
60
61
  }
61
62
 
63
+ function checkEntryTypesHaveIdField(schema: GraphQLSchema): string {
64
+ for (const type of Object.values(schema.getTypeMap())) {
65
+ if (!isObjectType(type) || !hasDirective(type, ENTRY_DIRECTIVE_NAME)) {
66
+ continue
67
+ }
68
+ const idField = type.getFields()['id']
69
+ if (
70
+ idField === undefined ||
71
+ !isNonNullType(idField.type) ||
72
+ !isScalarType(idField.type.ofType) ||
73
+ idField.type.ofType.name !== 'ID'
74
+ ) {
75
+ return `Type "${type.name}" must have a field "id" of type "ID!" to use "@${ENTRY_DIRECTIVE_NAME}" directive.`
76
+ }
77
+ }
78
+
79
+ return ''
80
+ }
81
+
62
82
  export function getValidationResult(schema: GraphQLSchema): string[] {
63
83
  const results = []
84
+ results.push(checkEntryTypesHaveIdField(schema))
64
85
  results.push(checkUnionMembersConsistentUseOfEntryDirective(schema))
65
86
  results.push(checkSearchableDirectiveOnlyOnStringFields(schema))
66
87
  return results.filter((result) => result !== '')
@@ -1,6 +1,7 @@
1
- import { Entry, GitAdapterError } from '@commitspark/git-adapter'
1
+ import { Entry } from '@commitspark/git-adapter'
2
2
  import { ApolloContext } from '../client.ts'
3
3
  import { createError, ErrorCode } from '../graphql/errors.ts'
4
+ import { callGitAdapter } from './git-adapter-call.ts'
4
5
 
5
6
  type Ref = string
6
7
  type ContentHash = string
@@ -11,9 +12,11 @@ type ContentCache = Map<ContentHash, EntryContent>
11
12
  type SchemaCache = Map<Ref, string>
12
13
  type InflightEntries = Map<Ref, Promise<EntriesRecord>>
13
14
 
14
- interface EntriesRecord {
15
+ export interface EntriesRecord {
15
16
  byId: Map<string, Entry>
16
17
  byType: Map<string, Entry[]>
18
+ // content hash of each entry as reported by the Git adapter, exposed to callers as entry version
19
+ hashById: Map<string, ContentHash>
17
20
  }
18
21
 
19
22
  interface CommitCacheRecord {
@@ -113,7 +116,9 @@ const fetchAndCacheEntries = async (
113
116
 
114
117
  const entriesById = new Map<string, Entry>()
115
118
  const entriesByType = new Map<string, Entry[]>()
119
+ const hashesById = new Map<string, ContentHash>()
116
120
  for (const { id, hash } of entryHashes) {
121
+ hashesById.set(id, hash)
117
122
  const entry: Entry = {
118
123
  id: id,
119
124
  ...(contentByHash.get(hash) as EntryContent),
@@ -128,6 +133,7 @@ const fetchAndCacheEntries = async (
128
133
  entriesRecord: {
129
134
  byType: entriesByType,
130
135
  byId: entriesById,
136
+ hashById: hashesById,
131
137
  },
132
138
  contentHashes: [...contentByHash.keys()],
133
139
  }
@@ -174,18 +180,6 @@ const removeUnreferencedContent = (
174
180
  }
175
181
  }
176
182
 
177
- const callGitAdapter = async <T>(operation: () => Promise<T>): Promise<T> => {
178
- try {
179
- return await operation()
180
- } catch (err) {
181
- if (err instanceof GitAdapterError) {
182
- throw createError(err.message, err.code, {})
183
- }
184
- const message = err instanceof Error ? err.message : String(err)
185
- throw createError(message, ErrorCode.INTERNAL_ERROR, {})
186
- }
187
- }
188
-
189
183
  const getSchemaStringByRef = async (
190
184
  schemaCache: SchemaCache,
191
185
  cacheSize: number,
@@ -0,0 +1,47 @@
1
+ import {
2
+ CommitDraft,
3
+ ErrorCode as GitAdapterErrorCode,
4
+ GitAdapterError,
5
+ } from '@commitspark/git-adapter'
6
+ import { ApolloContext } from '../client.ts'
7
+ import { callGitAdapter, toGraphQLError } from './git-adapter-call.ts'
8
+
9
+ const MAX_COMMIT_ATTEMPTS = 3
10
+
11
+ /**
12
+ * Commits a draft that `createDraft` validates against the current commit of the request, guaranteeing that the
13
+ * draft is only committed on top of the exact commit it was validated against.
14
+ *
15
+ * Git adapters only move a branch if it still points to `parentSha` and otherwise throw `CONFLICT`. As most adapters
16
+ * can only check this for the branch as a whole, any concurrent commit to the branch between reading and committing
17
+ * leads to `CONFLICT`, even if it changed unrelated entries. In this case, the current commit of the request is moved
18
+ * to the new branch head and the draft is created and validated again, including expected entry versions and
19
+ * references, so that only actual conflicts are reported to the caller.
20
+ *
21
+ * Errors thrown by `createDraft` are not retried, as the draft was validated against the latest known state.
22
+ */
23
+ export const commitWithRetry = async (
24
+ context: ApolloContext,
25
+ createDraft: () => Promise<CommitDraft>,
26
+ ): Promise<void> => {
27
+ for (let attempt = 1; ; attempt++) {
28
+ const commitDraft = await createDraft()
29
+ try {
30
+ const commit = await context.gitAdapter.createCommit(commitDraft)
31
+ context.setCurrentHash(commit.commitHash)
32
+ return
33
+ } catch (err) {
34
+ const isConflict =
35
+ err instanceof GitAdapterError &&
36
+ err.code === GitAdapterErrorCode.CONFLICT
37
+ if (!isConflict || attempt >= MAX_COMMIT_ATTEMPTS) {
38
+ throw toGraphQLError(err)
39
+ }
40
+ }
41
+
42
+ const headCommitHash = await callGitAdapter(() =>
43
+ context.gitAdapter.getLatestCommitHash(context.branch),
44
+ )
45
+ context.setCurrentHash(headCommitHash)
46
+ }
47
+ }
@@ -0,0 +1,27 @@
1
+ import { GitAdapterError } from '@commitspark/git-adapter'
2
+ import { GraphQLError } from 'graphql'
3
+ import { createError, ErrorCode } from '../graphql/errors.ts'
4
+
5
+ /**
6
+ * Converts an error thrown by a Git adapter to a GraphQL error, keeping the error code of a `GitAdapterError`.
7
+ */
8
+ export const toGraphQLError = (err: unknown): GraphQLError => {
9
+ if (err instanceof GitAdapterError) {
10
+ return createError(err.message, err.code, {})
11
+ }
12
+ const message = err instanceof Error ? err.message : String(err)
13
+ return createError(message, ErrorCode.INTERNAL_ERROR, {})
14
+ }
15
+
16
+ /**
17
+ * Runs a Git adapter operation and converts thrown errors to GraphQL errors.
18
+ */
19
+ export const callGitAdapter = async <T>(
20
+ operation: () => Promise<T>,
21
+ ): Promise<T> => {
22
+ try {
23
+ return await operation()
24
+ } catch (err) {
25
+ throw toGraphQLError(err)
26
+ }
27
+ }
@@ -60,3 +60,53 @@ export async function findByTypeId(
60
60
 
61
61
  return entryById
62
62
  }
63
+
64
+ /**
65
+ * Returns the version of an entry, which is the content hash of the entry reported by the Git adapter. It changes
66
+ * whenever the stored entry changes.
67
+ */
68
+ export async function getEntryVersion(
69
+ context: ApolloContext,
70
+ id: string,
71
+ ): Promise<string> {
72
+ const entriesRecord = await context.repositoryCache.getEntriesRecord(
73
+ context,
74
+ context.getCurrentHash(),
75
+ )
76
+ const version = entriesRecord.hashById.get(id)
77
+ if (version === undefined) {
78
+ throw createError(`No entry with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
79
+ argumentName: 'id',
80
+ argumentValue: id,
81
+ })
82
+ }
83
+
84
+ return version
85
+ }
86
+
87
+ /**
88
+ * Throws `CONFLICT` if an expected version is given and the entry has a different version at the current commit of
89
+ * the request. This lets callers detect that an entry was changed by someone else since they read it, e.g. while a
90
+ * user was editing the entry, instead of overwriting these changes.
91
+ */
92
+ export async function assertExpectedVersion(
93
+ context: ApolloContext,
94
+ id: string,
95
+ expectedVersion: string | null | undefined,
96
+ ): Promise<void> {
97
+ if (expectedVersion === undefined || expectedVersion === null) {
98
+ return
99
+ }
100
+ const currentVersion = await getEntryVersion(context, id)
101
+ if (currentVersion !== expectedVersion) {
102
+ throw createError(
103
+ `Entry with ID "${id}" has been changed: expected version "${expectedVersion}" but current version is ` +
104
+ `"${currentVersion}".`,
105
+ ErrorCode.CONFLICT,
106
+ {
107
+ argumentName: 'expectedVersion',
108
+ argumentValue: expectedVersion,
109
+ },
110
+ )
111
+ }
112
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/graphql/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,SAAS,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAAE,SAAS,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEjF,0BAAkB,SAAS;IACzB,cAAc,mBAAmB;IACjC,SAAS,cAAc;IACvB,mBAAmB,wBAAwB;IAC3C,UAAU,eAAe;IACzB,cAAc,mBAAmB;IACjC,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,MAAM,SAAS,GAAG,mBAAmB,GAAG,sBAAsB,EAC9D,UAAU,aAAa,KACtB,YAiBF,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"input-type-generator.d.ts","sourceRoot":"","sources":["../../../src/graphql/input-type-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,iBAAiB,EAEjB,gBAAgB,EAOjB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAkC3D,wBAAgB,0BAA0B,CACxC,oBAAoB,EAAE,oBAAoB,GACzC,MAAM,EAAE,CAiBV;AAED,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,iBAAiB,EAAE,GAC/B,MAAM,EAAE,CA8BV;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,gBAAgB,EAAE,GAC7B,MAAM,EAAE,CAoBV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queries-mutations-generator.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries-mutations-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAQ3C,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,sBAAsB,CAAA;AAE7B,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,iBAAiB,EAAE,GACvC,eAAe,EAAE,CAmGnB;AAED,wBAAgB,qBAAqB,IAAI,cAAc,CAStD;AAED,wBAAgB,mBAAmB,IAAI,oBAAoB,CAiB1D;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,QAAQ,EAAE,mBAAmB,CAAA;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,cAAc,CAAA;IAC1B,SAAS,EAAE,cAAc,CAAA;IACzB,cAAc,EAAE,cAAc,CAAA;IAC9B,cAAc,EAAE,cAAc,CAAA;IAC9B,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,qBAAqB,CAAC,SAAS,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC,CAAA;CAClE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/graphql/resolvers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,MAAM,WAAW,4BAA6B,SAAQ,aAAa;IACjE,IAAI,EAAE,gBAAgB,CAAA;CACvB;AAED,MAAM,MAAM,qBAAqB,CAAC,UAAU,IAAI,oBAAoB,CAClE,OAAO,EACP,4BAA4B,EAC5B;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EACvD,OAAO,CAAC,UAAU,CAAC,CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CACjD,2BAA2B,EAC3B,aAAa,CACd,CAAA;AAED,KAAK,2BAA2B,GAAG,SAAS,GAAG;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CACpD,OAAO,EACP,aAAa,EACb;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjE,OAAO,CAAC,SAAS,EAAE,CAAC,CACrB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,CACzD,SAAS,EACT,aAAa,EACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CACnC,CAAA"}