@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
@@ -0,0 +1,24 @@
1
+ import { GitAdapterError } from '@commitspark/git-adapter';
2
+ import { createError, ErrorCode } from "../graphql/errors.js";
3
+ /**
4
+ * Converts an error thrown by a Git adapter to a GraphQL error, keeping the error code of a `GitAdapterError`.
5
+ */
6
+ export const toGraphQLError = (err) => {
7
+ if (err instanceof GitAdapterError) {
8
+ return createError(err.message, err.code, {});
9
+ }
10
+ const message = err instanceof Error ? err.message : String(err);
11
+ return createError(message, ErrorCode.INTERNAL_ERROR, {});
12
+ };
13
+ /**
14
+ * Runs a Git adapter operation and converts thrown errors to GraphQL errors.
15
+ */
16
+ export const callGitAdapter = async (operation) => {
17
+ try {
18
+ return await operation();
19
+ }
20
+ catch (err) {
21
+ throw toGraphQLError(err);
22
+ }
23
+ };
24
+ //# sourceMappingURL=git-adapter-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-adapter-call.js","sourceRoot":"","sources":["../../../src/persistence/git-adapter-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAY,EAAgB,EAAE;IAC3D,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;QACnC,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAChE,OAAO,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,SAA2B,EACf,EAAE;IACd,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { Entry } from '@commitspark/git-adapter';
2
+ import { ApolloContext } from '../client.ts';
3
+ export declare function getTypeById(context: ApolloContext, id: string): Promise<string>;
4
+ export declare function findById(context: ApolloContext, id: string): Promise<Entry>;
5
+ export declare function findByType(context: ApolloContext, type: string): Promise<Entry[]>;
6
+ export declare function findByTypeId(context: ApolloContext, type: string, id: string): Promise<Entry>;
7
+ /**
8
+ * Returns the version of an entry, which is the content hash of the entry reported by the Git adapter. It changes
9
+ * whenever the stored entry changes.
10
+ */
11
+ export declare function getEntryVersion(context: ApolloContext, id: string): Promise<string>;
12
+ /**
13
+ * Throws `CONFLICT` if an expected version is given and the entry has a different version at the current commit of
14
+ * the request. This lets callers detect that an entry was changed by someone else since they read it, e.g. while a
15
+ * user was editing the entry, instead of overwriting these changes.
16
+ */
17
+ export declare function assertExpectedVersion(context: ApolloContext, id: string, expectedVersion: string | null | undefined): Promise<void>;
18
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/persistence/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,KAAK,CAAC,CAchB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,KAAK,EAAE,CAAC,CAMlB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,KAAK,CAAC,CAehB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACzC,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -1,4 +1,4 @@
1
- import { createError } from "../graphql/errors.js";
1
+ import { createError, ErrorCode } from "../graphql/errors.js";
2
2
  export async function getTypeById(context, id) {
3
3
  const requestedEntry = await findById(context, id);
4
4
  return requestedEntry.metadata.type;
@@ -7,7 +7,7 @@ export async function findById(context, id) {
7
7
  const entriesRecord = await context.repositoryCache.getEntriesRecord(context, context.getCurrentHash());
8
8
  const requestedEntry = entriesRecord.byId.get(id);
9
9
  if (requestedEntry === undefined) {
10
- throw createError(`No entry with ID "${id}" exists.`, "NOT_FOUND" /* ErrorCode.NOT_FOUND */, {
10
+ throw createError(`No entry with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
11
11
  argumentName: 'id',
12
12
  argumentValue: id,
13
13
  });
@@ -21,7 +21,7 @@ export async function findByType(context, type) {
21
21
  export async function findByTypeId(context, type, id) {
22
22
  const entryById = await findById(context, id);
23
23
  if (entryById === undefined || entryById.metadata.type !== type) {
24
- throw createError(`No entry of type "${type}" with ID "${id}" exists.`, "NOT_FOUND" /* ErrorCode.NOT_FOUND */, {
24
+ throw createError(`No entry of type "${type}" with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
25
25
  typeName: type,
26
26
  argumentName: 'id',
27
27
  argumentValue: id,
@@ -29,4 +29,37 @@ export async function findByTypeId(context, type, id) {
29
29
  }
30
30
  return entryById;
31
31
  }
32
+ /**
33
+ * Returns the version of an entry, which is the content hash of the entry reported by the Git adapter. It changes
34
+ * whenever the stored entry changes.
35
+ */
36
+ export async function getEntryVersion(context, id) {
37
+ const entriesRecord = await context.repositoryCache.getEntriesRecord(context, context.getCurrentHash());
38
+ const version = entriesRecord.hashById.get(id);
39
+ if (version === undefined) {
40
+ throw createError(`No entry with ID "${id}" exists.`, ErrorCode.NOT_FOUND, {
41
+ argumentName: 'id',
42
+ argumentValue: id,
43
+ });
44
+ }
45
+ return version;
46
+ }
47
+ /**
48
+ * Throws `CONFLICT` if an expected version is given and the entry has a different version at the current commit of
49
+ * the request. This lets callers detect that an entry was changed by someone else since they read it, e.g. while a
50
+ * user was editing the entry, instead of overwriting these changes.
51
+ */
52
+ export async function assertExpectedVersion(context, id, expectedVersion) {
53
+ if (expectedVersion === undefined || expectedVersion === null) {
54
+ return;
55
+ }
56
+ const currentVersion = await getEntryVersion(context, id);
57
+ if (currentVersion !== expectedVersion) {
58
+ throw createError(`Entry with ID "${id}" has been changed: expected version "${expectedVersion}" but current version is ` +
59
+ `"${currentVersion}".`, ErrorCode.CONFLICT, {
60
+ argumentName: 'expectedVersion',
61
+ argumentValue: expectedVersion,
62
+ });
63
+ }
64
+ }
32
65
  //# sourceMappingURL=persistence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/persistence/persistence.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAa,MAAM,sBAAsB,CAAA;AAG7D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAsB,EACtB,EAAU;IAEV,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAClD,OAAO,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAA;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAsB,EACtB,EAAU;IAEV,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAClE,OAAO,EACP,OAAO,CAAC,cAAc,EAAE,CACzB,CAAA;IACD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,WAAW,CAAC,qBAAqB,EAAE,WAAW,yCAAuB;YACzE,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAsB,EACtB,IAAY;IAEZ,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAClE,OAAO,EACP,OAAO,CAAC,cAAc,EAAE,CACzB,CAAA;IACD,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAsB,EACtB,IAAY,EACZ,EAAU;IAEV,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC7C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,WAAW,CACf,qBAAqB,IAAI,cAAc,EAAE,WAAW,yCAEpD;YACE,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE;SAClB,CACF,CAAA;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC"}
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/persistence/persistence.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -9,13 +9,16 @@
9
9
  "gitops",
10
10
  "api"
11
11
  ],
12
- "version": "2.0.0-beta.3",
12
+ "version": "2.0.0-beta.5",
13
13
  "license": "ISC",
14
14
  "repository": {
15
15
  "type": "git",
16
16
  "url": "git+https://github.com/commitspark/graphql-api.git"
17
17
  },
18
18
  "private": false,
19
+ "engines": {
20
+ "node": ">=22.18.0"
21
+ },
19
22
  "files": [
20
23
  "dist/**",
21
24
  "!dist/**/*.tsbuildinfo",
@@ -27,46 +30,52 @@
27
30
  ],
28
31
  "main": "./dist/cjs/index.js",
29
32
  "module": "./dist/esm/index.js",
30
- "types": "./dist/types/index.d.ts",
33
+ "types": "./dist/cjs/index.d.ts",
31
34
  "exports": {
32
35
  ".": {
33
- "types": "./dist/types/index.d.ts",
34
- "require": "./dist/cjs/index.js",
35
- "import": "./dist/esm/index.js"
36
+ "import": {
37
+ "types": "./dist/esm/index.d.ts",
38
+ "default": "./dist/esm/index.js"
39
+ },
40
+ "require": {
41
+ "types": "./dist/cjs/index.d.ts",
42
+ "default": "./dist/cjs/index.js"
43
+ }
36
44
  }
37
45
  },
38
46
  "scripts": {
39
- "build": "npm run build:cjs && npm run build:esm && npm run build:types",
47
+ "build": "npm run build:cjs && npm run build:esm",
40
48
  "build:cjs": "tsc --project tsconfig.build.cjs.json",
41
49
  "build:esm": "tsc --project tsconfig.build.esm.json && echo '{\"type\":\"module\"}' > dist/esm/package.json",
42
- "build:types": "tsc --project tsconfig.build.types.json",
43
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
50
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
44
51
  "lint": "eslint \"{src,tests}/**/*.ts\"",
45
52
  "test": "jest",
53
+ "check:package": "attw --pack . && node -e \"require(process.env.npm_package_name)\" && node --input-type=module -e \"await import(process.env.npm_package_name)\"",
46
54
  "knip": "knip",
47
55
  "prepublishOnly": "npm run build"
48
56
  },
49
57
  "dependencies": {
50
58
  "@apollo/server": "^5.2.0",
51
- "@commitspark/git-adapter": "^2.0.0-beta.1",
59
+ "@commitspark/git-adapter": "^2.0.0-beta.4",
52
60
  "@commitspark/search-adapter": "^1.0.0-beta.1",
53
- "@graphql-tools/schema": "^9.0.0",
54
- "@graphql-tools/utils": "^9.0.0"
61
+ "@graphql-tools/schema": "^11.0.8",
62
+ "@graphql-tools/utils": "^13.2.1"
55
63
  },
56
64
  "peerDependencies": {
57
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
65
+ "graphql": "^16.11.0"
58
66
  },
59
67
  "devDependencies": {
60
- "@types/jest": "^29.5.2",
68
+ "@arethetypeswrong/cli": "^0.18.5",
69
+ "@types/jest": "^30.0.0",
61
70
  "@types/node": "^22.14.0",
62
71
  "eslint": "^9.24.0",
63
72
  "eslint-plugin-import": "^2.32.0",
64
- "globals": "^16.0.0",
65
- "jest": "^29.5.0",
66
- "jest-mock-extended": "^3.0.4",
73
+ "globals": "^16.5.0",
74
+ "jest": "^30.2.0",
75
+ "jest-mock-extended": "^4.0.1",
67
76
  "knip": "^5.46.5",
68
- "prettier": "^2.4.1",
69
- "ts-jest": "^29.1.0",
77
+ "prettier": "^3.1.1",
78
+ "ts-jest": "^29.4.6",
70
79
  "ts-node": "^10.9.2",
71
80
  "typescript": "^5.7.0",
72
81
  "typescript-eslint": "^8.29.0"
@@ -2,13 +2,14 @@ import { GraphQLError } from 'graphql'
2
2
  import { ErrorCode as GitAdapterErrorCode } from '@commitspark/git-adapter'
3
3
  import { ErrorCode as SearchAdapterErrorCode } from '@commitspark/search-adapter'
4
4
 
5
- export const enum ErrorCode {
5
+ export enum ErrorCode {
6
6
  BAD_USER_INPUT = 'BAD_USER_INPUT',
7
7
  NOT_FOUND = 'NOT_FOUND',
8
8
  BAD_REPOSITORY_DATA = 'BAD_REPOSITORY_DATA',
9
9
  BAD_SCHEMA = 'BAD_SCHEMA',
10
10
  INTERNAL_ERROR = 'INTERNAL_ERROR',
11
11
  IN_USE = 'IN_USE',
12
+ CONFLICT = 'CONFLICT',
12
13
  }
13
14
 
14
15
  export interface ErrorMetadata {
@@ -10,7 +10,6 @@ import {
10
10
  isListType,
11
11
  isNonNullType,
12
12
  isObjectType,
13
- isScalarType,
14
13
  isUnionType,
15
14
  } from 'graphql'
16
15
  import { SchemaAnalyzerResult } from './schema-analyzer.ts'
@@ -51,9 +50,7 @@ export function generateIdInputTypeStrings(
51
50
  schemaAnalyzerResult: SchemaAnalyzerResult,
52
51
  ): string[] {
53
52
  let typesWithIdField: (
54
- | GraphQLObjectType
55
- | GraphQLInterfaceType
56
- | GraphQLUnionType
53
+ GraphQLObjectType | GraphQLInterfaceType | GraphQLUnionType
57
54
  )[] = []
58
55
  typesWithIdField = typesWithIdField.concat(
59
56
  schemaAnalyzerResult.entryDirectiveTypes,
@@ -74,16 +71,13 @@ export function generateObjectInputTypeStrings(
74
71
  return objectTypes.map((objectType): string => {
75
72
  const name = objectType.name
76
73
  const inputTypeName = `${name}Input`
74
+ const isEntryType = hasDirective(objectType, ENTRY_DIRECTIVE_NAME)
77
75
  let inputType = `input ${inputTypeName} {\n`
78
76
  let inputTypeFieldStrings = ''
79
77
  for (const fieldsKey in objectType.getFields()) {
80
78
  const field = objectType.getFields()[fieldsKey]
81
- if (
82
- (isNonNullType(field.type) &&
83
- isScalarType(field.type.ofType) &&
84
- field.type.ofType.name === 'ID') ||
85
- (isScalarType(field.type) && field.type.name === 'ID')
86
- ) {
79
+ // the ID of an entry is passed as mutation argument instead of as part of the entry data
80
+ if (isEntryType && field.name === 'id') {
87
81
  continue
88
82
  }
89
83
  const inputTypeString = generateFieldInputTypeString(field.type)
@@ -105,12 +99,12 @@ export function generateObjectInputTypeStrings(
105
99
  export function generateUnionInputTypeStrings(
106
100
  unionTypes: GraphQLUnionType[],
107
101
  ): string[] {
108
- const typeStrings = unionTypes.map((unionType): string => {
102
+ return unionTypes.map((unionType): string => {
109
103
  if (buildsOnTypeWithEntryDirective(unionType)) {
110
104
  return ''
111
105
  }
112
106
 
113
- // see https://github.com/graphql/graphql-spec/pull/825
107
+ // `@oneOf` is a directive specified by GraphQL and built into graphql-js since 16.9
114
108
  let unionInputType = `input ${unionType.name}Input @oneOf {\n`
115
109
  for (const innerType of unionType.getTypes()) {
116
110
  unionInputType += ` ${innerType.name}: ${innerType.name}Input\n`
@@ -118,10 +112,4 @@ export function generateUnionInputTypeStrings(
118
112
  unionInputType += '}\n'
119
113
  return unionInputType
120
114
  })
121
-
122
- if (typeStrings.join('').length > 0) {
123
- typeStrings.push('directive @oneOf on INPUT_OBJECT\n')
124
- }
125
-
126
- return typeStrings
127
115
  }
@@ -7,11 +7,17 @@ import { mutationUpdateResolver } from './resolvers/query-mutation-resolvers/mut
7
7
  import { mutationDeleteResolver } from './resolvers/query-mutation-resolvers/mutation-delete-resolver.ts'
8
8
  import { queryTypeByIdResolver } from './resolvers/query-mutation-resolvers/query-type-by-id-resolver.ts'
9
9
  import { querySearchResolver } from './resolvers/query-mutation-resolvers/query-search-resolver.ts'
10
+ import { referencedByResolver } from './resolvers/field-resolvers/referenced-by-resolver.ts'
11
+ import { versionResolver } from './resolvers/field-resolvers/version-resolver.ts'
10
12
  import {
11
13
  QueryMutationResolver,
14
+ ReferencedByResolver,
12
15
  SearchQueryResolver,
16
+ VersionResolver,
13
17
  } from './resolvers/types.ts'
14
18
 
19
+ const commitInputTypeName = '_CommitInput'
20
+
15
21
  export function generateQueriesAndMutations(
16
22
  entryDirectiveTypes: GraphQLObjectType[],
17
23
  ): GeneratedSchema[] {
@@ -40,8 +46,20 @@ export function generateQueriesAndMutations(
40
46
  ) => queryByIdResolver(source, args, { ...context, type: objectType }, info)
41
47
 
42
48
  const inputTypeName = `${typeName}Input`
49
+ // mutations are printed with one argument per line, as indented within the generated root type
50
+ const commitArgument = (operation: string): string =>
51
+ ' """\n' +
52
+ ` Details of the commit. If no message is given, the message is '${operation} ${typeName} "<id>"'.\n` +
53
+ ' """\n' +
54
+ ` commit: ${commitInputTypeName}\n`
55
+ const expectedVersionArgument =
56
+ ' """\n' +
57
+ ' Version of the entry (field `_version`) that the change is based on. If given and the entry has a different\n' +
58
+ ' version, the mutation fails with error code CONFLICT instead of overwriting changes made since.\n' +
59
+ ' """\n' +
60
+ ' expectedVersion: String\n'
43
61
  const createMutationName = `create${typeName}`
44
- const createMutationString = `${createMutationName}(id: ID!, data: ${inputTypeName}!, commitMessage: String): ${typeName}`
62
+ const createMutationString = `${createMutationName}(\n id: ID!\n data: ${inputTypeName}!\n${commitArgument('Create')} ): ${typeName}`
45
63
  const createMutationResolver: QueryMutationResolver<EntryData> = (
46
64
  source,
47
65
  args,
@@ -56,7 +74,7 @@ export function generateQueriesAndMutations(
56
74
  )
57
75
 
58
76
  const updateMutationName = `update${typeName}`
59
- const updateMutationString = `${updateMutationName}(id: ID!, data: ${inputTypeName}!, commitMessage: String): ${typeName}`
77
+ const updateMutationString = `${updateMutationName}(\n id: ID!\n data: ${inputTypeName}!\n${expectedVersionArgument}${commitArgument('Update')} ): ${typeName}`
60
78
  const updateMutationResolver: QueryMutationResolver<EntryData> = (
61
79
  source,
62
80
  args,
@@ -71,7 +89,7 @@ export function generateQueriesAndMutations(
71
89
  )
72
90
 
73
91
  const deleteMutationName = `delete${typeName}`
74
- const deleteMutationString = `${deleteMutationName}(id: ID!, commitMessage: String): ID`
92
+ const deleteMutationString = `${deleteMutationName}(\n id: ID!\n${expectedVersionArgument}${commitArgument('Delete')} ): ID`
75
93
  const deleteMutationResolver: QueryMutationResolver<string> = (
76
94
  source,
77
95
  args,
@@ -115,6 +133,24 @@ export function generateQueriesAndMutations(
115
133
  })
116
134
  }
117
135
 
136
+ export function generateCommitInputType(): string {
137
+ return `"""
138
+ Details of the commit created by a mutation.
139
+ """
140
+ input ${commitInputTypeName} {
141
+ """
142
+ Commit message summarizing the change in a single line. Leading and trailing whitespace is removed, and messages
143
+ containing line breaks are rejected with error code BAD_USER_INPUT. If omitted or empty, a message is generated.
144
+ """
145
+ message: String
146
+ """
147
+ Optional details of the change, which may span multiple lines. Leading and trailing whitespace is removed.
148
+ """
149
+ body: String
150
+ }
151
+ `
152
+ }
153
+
118
154
  export function generateTypeNameQuery(): GeneratedQuery {
119
155
  const entryTypeQueryName = '_typeName'
120
156
  const entryTypeQueryString = `${entryTypeQueryName}(id: ID!): String!`
@@ -145,6 +181,36 @@ export function generateSearchQuery(): GeneratedSearchQuery {
145
181
  }
146
182
  }
147
183
 
184
+ export function generateEntryFields(
185
+ entryDirectiveTypes: GraphQLObjectType[],
186
+ ): GeneratedEntryFields[] {
187
+ const referencedByFieldName = '_referencedBy'
188
+ const versionFieldName = '_version'
189
+
190
+ return entryDirectiveTypes.map((objectType) => ({
191
+ typeName: objectType.name,
192
+ typeExtensionString: `extend type ${objectType.name} {
193
+ ${referencedByFieldName}: [ID!]!
194
+ """
195
+ Version of the entry, which changes whenever the stored entry changes. Pass it as \`expectedVersion\` to update
196
+ and delete mutations to prevent overwriting changes made since the entry was read.
197
+ """
198
+ ${versionFieldName}: String!
199
+ }
200
+ `,
201
+ resolvers: {
202
+ [referencedByFieldName]: referencedByResolver,
203
+ [versionFieldName]: versionResolver,
204
+ },
205
+ }))
206
+ }
207
+
208
+ interface GeneratedEntryFields {
209
+ typeName: string
210
+ typeExtensionString: string
211
+ resolvers: Record<string, ReferencedByResolver | VersionResolver>
212
+ }
213
+
148
214
  export interface GeneratedSearchQuery {
149
215
  name: string
150
216
  schemaString: string
@@ -0,0 +1,34 @@
1
+ import { CommitDraft } from '@commitspark/git-adapter'
2
+ import { createError, ErrorCode } from '../errors.ts'
3
+ import { CommitInput } from './types.ts'
4
+
5
+ type MutationOperation = 'Create' | 'Update' | 'Delete'
6
+
7
+ /**
8
+ * Determines message and body of the commit of a mutation from mutation argument `commit`. The message is trimmed and
9
+ * must be a single line; an omitted or empty message is replaced by a message generated from the mutation. The body
10
+ * is trimmed and omitted if empty.
11
+ */
12
+ export function getCommitMessage(
13
+ commit: CommitInput | null | undefined,
14
+ operation: MutationOperation,
15
+ typeName: string,
16
+ id: string,
17
+ ): Pick<CommitDraft, 'message' | 'body'> {
18
+ const message = commit?.message?.trim() ?? ''
19
+ if (/[\r\n]/.test(message)) {
20
+ throw createError(
21
+ 'Commit message must be a single line; use field "body" for details.',
22
+ ErrorCode.BAD_USER_INPUT,
23
+ { argumentName: 'commit.message', argumentValue: commit?.message },
24
+ )
25
+ }
26
+ const body = commit?.body?.trim() ?? ''
27
+
28
+ const commitMessage =
29
+ message !== '' ? message : `${operation} ${typeName} "${id}"`
30
+ if (body === '') {
31
+ return { message: commitMessage }
32
+ }
33
+ return { message: commitMessage, body: body }
34
+ }
@@ -0,0 +1,9 @@
1
+ import { getReferencingEntryIds } from '../../schema-utils/entry-reference-util.ts'
2
+ import { ReferencedByResolver } from '../types.ts'
3
+
4
+ export const referencedByResolver: ReferencedByResolver = async (
5
+ source,
6
+ _args,
7
+ context,
8
+ info,
9
+ ) => getReferencingEntryIds(context, info.schema, source.id)
@@ -0,0 +1,8 @@
1
+ import { getEntryVersion } from '../../../persistence/persistence.ts'
2
+ import { VersionResolver } from '../types.ts'
3
+
4
+ export const versionResolver: VersionResolver = async (
5
+ source,
6
+ _args,
7
+ context,
8
+ ) => getEntryVersion(context, source.id)
@@ -1,13 +1,15 @@
1
1
  import { findById, findByTypeId } from '../../../persistence/persistence.ts'
2
2
  import { isObjectType } from 'graphql'
3
- import { getReferencedEntryIds } from '../../schema-utils/entry-reference-util.ts'
3
+ import { validateEntryReferences } from '../../schema-utils/entry-reference-util.ts'
4
4
  import {
5
- ENTRY_ID_INVALID_CHARACTERS,
6
5
  EntryData,
7
6
  EntryDraft,
7
+ validateEntryId,
8
8
  } from '@commitspark/git-adapter'
9
9
  import { QueryMutationResolver } from '../types.ts'
10
10
  import { createError, ErrorCode } from '../../errors.ts'
11
+ import { getCommitMessage } from '../commit-message.ts'
12
+ import { commitWithRetry } from '../../../persistence/commit-with-retry.ts'
11
13
 
12
14
  export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
13
15
  source,
@@ -15,6 +17,7 @@ export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
15
17
  context,
16
18
  info,
17
19
  ) => {
20
+ void info
18
21
  if (!isObjectType(context.type)) {
19
22
  throw createError(
20
23
  `Entry of type "${context.type.name}" cannot be created as is not an ObjectType.`,
@@ -22,28 +25,14 @@ export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
22
25
  {},
23
26
  )
24
27
  }
28
+ // narrowed type, as narrowing does not apply within the callback below
29
+ const entryType = context.type
25
30
 
26
- const idValidationResult = args.id.match(ENTRY_ID_INVALID_CHARACTERS)
27
- if (idValidationResult) {
28
- throw createError(
29
- `Field "id" contains invalid characters "${idValidationResult.join(
30
- ', ',
31
- )}".`,
32
- ErrorCode.BAD_USER_INPUT,
33
- {
34
- argumentName: 'id',
35
- argumentValue: args.id,
36
- },
37
- )
38
- }
39
-
40
- let existingEntry
41
31
  try {
42
- existingEntry = await findById(context, args.id)
43
- } catch {}
44
- if (existingEntry) {
32
+ validateEntryId(args.id)
33
+ } catch (err) {
45
34
  throw createError(
46
- `An entry with id "${args.id}" already exists.`,
35
+ err instanceof Error ? err.message : String(err),
47
36
  ErrorCode.BAD_USER_INPUT,
48
37
  {
49
38
  argumentName: 'id',
@@ -51,50 +40,47 @@ export const mutationCreateResolver: QueryMutationResolver<EntryData> = async (
51
40
  },
52
41
  )
53
42
  }
54
-
55
- const referencedEntryIds = await getReferencedEntryIds(
56
- context.type,
57
- context,
58
- null,
59
- info.returnType,
60
- args.data ?? null,
43
+ const commitMessage = getCommitMessage(
44
+ args.commit,
45
+ 'Create',
46
+ context.type.name,
47
+ args.id,
61
48
  )
62
49
 
63
- const referencedEntryUpdates: EntryDraft[] = []
64
- for (const referencedEntryId of referencedEntryIds) {
65
- const referencedEntry = await findById(context, referencedEntryId)
66
- const newReferencedEntryIds: string[] = [
67
- ...(referencedEntry.metadata.referencedBy ?? []),
68
- args.id,
69
- ].sort()
70
- const newReferencedEntryDraft: EntryDraft = {
71
- ...referencedEntry,
50
+ await commitWithRetry(context, async () => {
51
+ let existingEntry
52
+ try {
53
+ existingEntry = await findById(context, args.id)
54
+ } catch {}
55
+ if (existingEntry) {
56
+ throw createError(
57
+ `An entry with id "${args.id}" already exists.`,
58
+ ErrorCode.BAD_USER_INPUT,
59
+ {
60
+ argumentName: 'id',
61
+ argumentValue: args.id,
62
+ },
63
+ )
64
+ }
65
+
66
+ await validateEntryReferences(entryType, context, args.data ?? null)
67
+
68
+ const newEntryDraft: EntryDraft = {
69
+ id: args.id,
72
70
  metadata: {
73
- ...referencedEntry.metadata,
74
- referencedBy: newReferencedEntryIds,
71
+ type: context.type.name,
75
72
  },
73
+ data: args.data ?? null,
76
74
  deletion: false,
77
75
  }
78
- referencedEntryUpdates.push(newReferencedEntryDraft)
79
- }
80
-
81
- const newEntryDraft: EntryDraft = {
82
- id: args.id,
83
- metadata: {
84
- type: context.type.name,
85
- referencedBy: [],
86
- },
87
- data: args.data ?? null,
88
- deletion: false,
89
- }
90
76
 
91
- const commit = await context.gitAdapter.createCommit({
92
- ref: context.branch,
93
- parentSha: context.getCurrentHash(),
94
- entries: [newEntryDraft, ...referencedEntryUpdates],
95
- message: args.commitMessage,
77
+ return {
78
+ ref: context.branch,
79
+ parentSha: context.getCurrentHash(),
80
+ entries: [newEntryDraft],
81
+ ...commitMessage,
82
+ }
96
83
  })
97
- context.setCurrentHash(commit.commitHash)
98
84
 
99
85
  const newEntry = await findByTypeId(context, context.type.name, args.id)
100
86
  return { ...newEntry.data, id: newEntry.id }