@graphql-hive/federation-gateway-audit 0.0.0

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 (293) hide show
  1. package/.changeset/@graphql-hive_federation-gateway-audit-293-dependencies.md +5 -0
  2. package/.changeset/README.md +9 -0
  3. package/.changeset/config.json +18 -0
  4. package/.changeset/funky-times-cry.md +5 -0
  5. package/.github/CONTRIBUTING.md +9 -0
  6. package/.github/workflows/ci.yaml +97 -0
  7. package/.github/workflows/release.yml +58 -0
  8. package/LICENSE +21 -0
  9. package/README.md +113 -0
  10. package/REPORT.md +812 -0
  11. package/dist/cli.js +547 -0
  12. package/dist/env-Dj2M4ll3.cjs +15 -0
  13. package/dist/env-j1f_SZtG.js +13 -0
  14. package/dist/env-j1f_SZtG.mjs +13 -0
  15. package/dist/index--3rcSZqA.js +227 -0
  16. package/dist/index-0MDIXUzP.cjs +589 -0
  17. package/dist/index-19eD5lFk.mjs +163 -0
  18. package/dist/index-1ZtG04bN.js +222 -0
  19. package/dist/index-1nZTfbJn.cjs +168 -0
  20. package/dist/index-1smMXABT.mjs +227 -0
  21. package/dist/index-2oy7cA9A.js +225 -0
  22. package/dist/index-3BM15w2Y.mjs +234 -0
  23. package/dist/index-3CyAnc7j.js +234 -0
  24. package/dist/index-4Vj-ND7j.mjs +213 -0
  25. package/dist/index-4swHVe9x.cjs +507 -0
  26. package/dist/index-6itLA31k.js +382 -0
  27. package/dist/index-6qNpP2wc.mjs +238 -0
  28. package/dist/index-81CiuWlP.mjs +333 -0
  29. package/dist/index-8FxjbyOU.cjs +236 -0
  30. package/dist/index-A2YbwKzc.mjs +288 -0
  31. package/dist/index-B-YHHt9g.js +333 -0
  32. package/dist/index-B0coRevy.mjs +337 -0
  33. package/dist/index-B1NAc0TI.cjs +215 -0
  34. package/dist/index-B1WvIzTg.js +371 -0
  35. package/dist/index-B38OpRtf.js +166 -0
  36. package/dist/index-B3aDw4Tt.js +359 -0
  37. package/dist/index-B55AdoQy.js +273 -0
  38. package/dist/index-B7cr8XE-.js +194 -0
  39. package/dist/index-B7zN3YzE.cjs +683 -0
  40. package/dist/index-B8X923W3.mjs +262 -0
  41. package/dist/index-B958BFYC.cjs +224 -0
  42. package/dist/index-B9T896rB.mjs +163 -0
  43. package/dist/index-BA3ERnyq.mjs +234 -0
  44. package/dist/index-BDMi6sOm.cjs +252 -0
  45. package/dist/index-BDNWXFb_.mjs +304 -0
  46. package/dist/index-BEMScD_X.cjs +173 -0
  47. package/dist/index-BF0H5kP0.cjs +384 -0
  48. package/dist/index-BGC0_vWj.cjs +335 -0
  49. package/dist/index-BGNmWPAk.js +381 -0
  50. package/dist/index-BGUm947D.cjs +229 -0
  51. package/dist/index-BJB0tRA1.js +550 -0
  52. package/dist/index-BKcwbRZx.cjs +339 -0
  53. package/dist/index-BKpVb_h9.cjs +236 -0
  54. package/dist/index-BPFol6Ww.mjs +129 -0
  55. package/dist/index-BPza8i2Q.mjs +213 -0
  56. package/dist/index-BQQgQaGz.cjs +552 -0
  57. package/dist/index-BReFIfq_.cjs +361 -0
  58. package/dist/index-BS7JyQSU.js +250 -0
  59. package/dist/index-BSWSgZCO.cjs +252 -0
  60. package/dist/index-BStXx4OK.js +705 -0
  61. package/dist/index-BSwOAvti.js +288 -0
  62. package/dist/index-BWO8QbMB.mjs +587 -0
  63. package/dist/index-BYEdADrG.cjs +227 -0
  64. package/dist/index-B_eGT6oX.js +225 -0
  65. package/dist/index-B_u5Boud.js +333 -0
  66. package/dist/index-BaH3FI9i.cjs +361 -0
  67. package/dist/index-BaluTf1I.cjs +707 -0
  68. package/dist/index-BblYlZ3A.cjs +131 -0
  69. package/dist/index-BcZC0OIN.js +234 -0
  70. package/dist/index-Bcjyyjhh.mjs +259 -0
  71. package/dist/index-BcoW0aPo.cjs +165 -0
  72. package/dist/index-BdNZKlDU.js +284 -0
  73. package/dist/index-Bf81cAA1.mjs +444 -0
  74. package/dist/index-Bg3H3fgZ.js +259 -0
  75. package/dist/index-Bgl_1Y6Q.mjs +681 -0
  76. package/dist/index-BgmItHIB.mjs +129 -0
  77. package/dist/index-BgryMCqm.mjs +213 -0
  78. package/dist/index-Bh6a3eXK.mjs +227 -0
  79. package/dist/index-BhPDIfmU.js +304 -0
  80. package/dist/index-BiTzMTFn.js +304 -0
  81. package/dist/index-BjbmOyBP.cjs +215 -0
  82. package/dist/index-BjwZX2iS.mjs +273 -0
  83. package/dist/index-Bm8hqSRd.cjs +168 -0
  84. package/dist/index-BmOn6xYL.js +228 -0
  85. package/dist/index-BmQrhPXB.cjs +131 -0
  86. package/dist/index-Bnb8TpOO.js +280 -0
  87. package/dist/index-BndUB2KV.mjs +381 -0
  88. package/dist/index-Bo74nI4n.js +129 -0
  89. package/dist/index-BoGmP6Cy.cjs +230 -0
  90. package/dist/index-BodMjESw.mjs +250 -0
  91. package/dist/index-BpJZCoVH.mjs +250 -0
  92. package/dist/index-Br-Y1qC_.cjs +446 -0
  93. package/dist/index-BrFtcRgi.mjs +194 -0
  94. package/dist/index-BsPxDJAB.mjs +238 -0
  95. package/dist/index-Bu7pZnPO.cjs +170 -0
  96. package/dist/index-Bu8SXnTf.mjs +227 -0
  97. package/dist/index-BuNNRp3W.mjs +117 -0
  98. package/dist/index-Bwh8HVkw.cjs +384 -0
  99. package/dist/index-BxK3Y72_.js +227 -0
  100. package/dist/index-BxPUzymh.cjs +208 -0
  101. package/dist/index-ByUUB7Zn.js +250 -0
  102. package/dist/index-ByUr80PD.cjs +306 -0
  103. package/dist/index-ByZa9qm8.mjs +273 -0
  104. package/dist/index-BzPCjhuQ.cjs +264 -0
  105. package/dist/index-Bz_LTy1A.mjs +222 -0
  106. package/dist/index-C05_HMLC.js +225 -0
  107. package/dist/index-C15P-_1j.cjs +229 -0
  108. package/dist/index-C1GgHOiD.js +228 -0
  109. package/dist/index-C4Pk-zTm.mjs +227 -0
  110. package/dist/index-C4dnTlBf.js +262 -0
  111. package/dist/index-C6LW00iX.mjs +505 -0
  112. package/dist/index-C6nkQ480.js +225 -0
  113. package/dist/index-C8Mu4K9Q.cjs +383 -0
  114. package/dist/index-C8mB7yWC.mjs +288 -0
  115. package/dist/index-C9Eh7qBC.js +273 -0
  116. package/dist/index-CAJ9YPxc.js +681 -0
  117. package/dist/index-CD03pVUt.cjs +373 -0
  118. package/dist/index-CD8GiuIg.js +227 -0
  119. package/dist/index-CHB_0VqK.mjs +333 -0
  120. package/dist/index-CKEgb_R7.cjs +215 -0
  121. package/dist/index-CLsasg69.js +228 -0
  122. package/dist/index-CMdC_Cah.js +213 -0
  123. package/dist/index-CNOcqGKC.cjs +227 -0
  124. package/dist/index-CNvZCDZa.js +166 -0
  125. package/dist/index-CO0GiXGE.js +168 -0
  126. package/dist/index-COGhiFjk.mjs +284 -0
  127. package/dist/index-COIlelpZ.mjs +262 -0
  128. package/dist/index-CPph-RFN.mjs +168 -0
  129. package/dist/index-CPu_XkjY.mjs +304 -0
  130. package/dist/index-CQ5t4ZXm.js +117 -0
  131. package/dist/index-CQeQ1nto.js +681 -0
  132. package/dist/index-CSc_T8Lu.js +218 -0
  133. package/dist/index-CUFKuE64.js +550 -0
  134. package/dist/index-CW8h3l6M.js +262 -0
  135. package/dist/index-CWrng7Hd.mjs +550 -0
  136. package/dist/index-CWuObqnS.mjs +587 -0
  137. package/dist/index-CX7-wc6X.cjs +1837 -0
  138. package/dist/index-CXviN8qZ.cjs +224 -0
  139. package/dist/index-CY9mowWW.mjs +705 -0
  140. package/dist/index-C_pTgB_1.js +194 -0
  141. package/dist/index-C_qaNb-X.mjs +225 -0
  142. package/dist/index-Ca0FeU7u.js +505 -0
  143. package/dist/index-Cb3ImEjd.cjs +165 -0
  144. package/dist/index-Cbhvi8yk.cjs +229 -0
  145. package/dist/index-Cc3vrs6_.mjs +228 -0
  146. package/dist/index-CcIXvx40.mjs +171 -0
  147. package/dist/index-CdaeeF3f.cjs +306 -0
  148. package/dist/index-CddVoIp2.js +213 -0
  149. package/dist/index-CeiRxGcN.mjs +218 -0
  150. package/dist/index-ChefKWWr.mjs +381 -0
  151. package/dist/index-Cj2ocjXI.cjs +227 -0
  152. package/dist/index-CkWEXzTN.js +129 -0
  153. package/dist/index-Ckhb9QAu.cjs +264 -0
  154. package/dist/index-CklJfQlf.cjs +220 -0
  155. package/dist/index-Cmh7PJUd.mjs +372 -0
  156. package/dist/index-Cn0ZJkAv.mjs +280 -0
  157. package/dist/index-CqTzarV1.mjs +198 -0
  158. package/dist/index-CrUbbFxE.js +284 -0
  159. package/dist/index-CsKaFB2K.mjs +228 -0
  160. package/dist/index-Cu8Ii5r7.cjs +335 -0
  161. package/dist/index-Cuw9ylL-.mjs +371 -0
  162. package/dist/index-CwOULUAt.mjs +382 -0
  163. package/dist/index-CyVnRqjE.cjs +196 -0
  164. package/dist/index-D-1dDKiZ.mjs +227 -0
  165. package/dist/index-D00bnaJy.cjs +220 -0
  166. package/dist/index-D07xiOJ6.cjs +446 -0
  167. package/dist/index-D1Ip6ro6.js +458 -0
  168. package/dist/index-D1Ymvd2b.cjs +286 -0
  169. package/dist/index-D5jOBT3f.cjs +240 -0
  170. package/dist/index-D5tEp8IU.js +337 -0
  171. package/dist/index-D7WuGKYY.cjs +227 -0
  172. package/dist/index-D8Dp6TnQ.cjs +1837 -0
  173. package/dist/index-D9OKpqgG.js +381 -0
  174. package/dist/index-DBMI2EcB.cjs +170 -0
  175. package/dist/index-DBRUKV0U.mjs +225 -0
  176. package/dist/index-DEvExC5x.cjs +119 -0
  177. package/dist/index-DEzxU_gQ.cjs +507 -0
  178. package/dist/index-DFypMD6R.cjs +261 -0
  179. package/dist/index-DHRqE92a.cjs +290 -0
  180. package/dist/index-DISym5OL.js +198 -0
  181. package/dist/index-DJ3ndv3i.mjs +705 -0
  182. package/dist/index-DJXP-Gmp.js +218 -0
  183. package/dist/index-DJlXDQOY.cjs +200 -0
  184. package/dist/index-DLW4GEJl.cjs +229 -0
  185. package/dist/index-DLu9E2Vq.js +238 -0
  186. package/dist/index-DM4ddIL6.js +382 -0
  187. package/dist/index-DMgHLbwU.cjs +339 -0
  188. package/dist/index-DN-ScBql.mjs +458 -0
  189. package/dist/index-DOkkIHER.js +163 -0
  190. package/dist/index-DRY8sDun.cjs +165 -0
  191. package/dist/index-DS3cjugP.mjs +171 -0
  192. package/dist/index-DS86eFsI.mjs +1835 -0
  193. package/dist/index-DUlT8CJ2.js +458 -0
  194. package/dist/index-DV1F4nxP.js +372 -0
  195. package/dist/index-DXsAcJ-o.mjs +359 -0
  196. package/dist/index-DZws2w4w.cjs +229 -0
  197. package/dist/index-D_HiVe2_.cjs +200 -0
  198. package/dist/index-Da6L5V_Z.mjs +681 -0
  199. package/dist/index-Dbb-jnWf.js +206 -0
  200. package/dist/index-DdXy_-T9.js +444 -0
  201. package/dist/index-DddNFRG3.js +337 -0
  202. package/dist/index-DejhKwvw.cjs +173 -0
  203. package/dist/index-DfBdD-5Z.cjs +383 -0
  204. package/dist/index-Df_KCbC4.mjs +213 -0
  205. package/dist/index-DiDq1sL6.cjs +240 -0
  206. package/dist/index-DiuJQ9Mq.js +198 -0
  207. package/dist/index-Djqj3DWJ.js +171 -0
  208. package/dist/index-Dk0q-ENv.mjs +166 -0
  209. package/dist/index-DlFElztE.mjs +163 -0
  210. package/dist/index-DlkxQ-B5.mjs +359 -0
  211. package/dist/index-Dm5kpK9t.js +227 -0
  212. package/dist/index-Dp8mobro.js +444 -0
  213. package/dist/index-DpBWZa1x.cjs +683 -0
  214. package/dist/index-DrkXuLUZ.js +227 -0
  215. package/dist/index-Dsq1FK90.cjs +275 -0
  216. package/dist/index-DtmhGgM8.cjs +282 -0
  217. package/dist/index-Du5MxO_2.mjs +505 -0
  218. package/dist/index-DveYQLCZ.cjs +460 -0
  219. package/dist/index-DxHMqS-W.js +117 -0
  220. package/dist/index-DyTApTHI.cjs +282 -0
  221. package/dist/index-DyTSkAm4.cjs +208 -0
  222. package/dist/index-DygJOEne.mjs +550 -0
  223. package/dist/index-DzAewrkw.js +238 -0
  224. package/dist/index-ESWdD7ek.cjs +215 -0
  225. package/dist/index-EuKHpnHv.mjs +117 -0
  226. package/dist/index-F1A7LMlw.mjs +228 -0
  227. package/dist/index-FP6hvgSw.cjs +552 -0
  228. package/dist/index-GDSrKnPp.mjs +198 -0
  229. package/dist/index-GMCZo-KH.js +222 -0
  230. package/dist/index-IQJLr7nR.js +288 -0
  231. package/dist/index-IawHHRZX.mjs +206 -0
  232. package/dist/index-Jk7MG7tE.cjs +286 -0
  233. package/dist/index-JtGxTXPr.mjs +337 -0
  234. package/dist/index-KAC20a9r.js +359 -0
  235. package/dist/index-LVWQqV-v.js +163 -0
  236. package/dist/index-Ls2fI7y4.js +163 -0
  237. package/dist/index-NB1VDvjW.cjs +374 -0
  238. package/dist/index-NIEZaRYg.cjs +261 -0
  239. package/dist/index-PQXUx1ZR.mjs +1835 -0
  240. package/dist/index-PyaLRKuk.mjs +168 -0
  241. package/dist/index-QQGo-BV1.mjs +444 -0
  242. package/dist/index-QXYDkAsQ.cjs +119 -0
  243. package/dist/index-SmEIf5jz.mjs +259 -0
  244. package/dist/index-UJhFwnD_.mjs +284 -0
  245. package/dist/index-UVyXzNlG.js +705 -0
  246. package/dist/index-UgyHGpUU.mjs +163 -0
  247. package/dist/index-UhQiJabs.cjs +707 -0
  248. package/dist/index-VvuhRvnC.mjs +218 -0
  249. package/dist/index-WPXuueaq.mjs +194 -0
  250. package/dist/index-X4u6bs58.js +259 -0
  251. package/dist/index-XZiO6uje.cjs +275 -0
  252. package/dist/index-YOlsBREZ.cjs +230 -0
  253. package/dist/index-Ytb942t9.js +587 -0
  254. package/dist/index-_2dg_MWu.cjs +460 -0
  255. package/dist/index-eFEW10em.js +213 -0
  256. package/dist/index-eq8bbEej.mjs +225 -0
  257. package/dist/index-f7FiDQMk.js +171 -0
  258. package/dist/index-fBzI1kbw.mjs +225 -0
  259. package/dist/index-fdDnq3vQ.js +163 -0
  260. package/dist/index-fqmAgjhG.js +206 -0
  261. package/dist/index-ikGyewP-.cjs +165 -0
  262. package/dist/index-jft-1bQ6.cjs +230 -0
  263. package/dist/index-l8e8ip4U.js +168 -0
  264. package/dist/index-lkBiml03.js +1835 -0
  265. package/dist/index-mm-YMeoi.js +505 -0
  266. package/dist/index-o7g3iua7.cjs +290 -0
  267. package/dist/index-ojnncNWd.js +587 -0
  268. package/dist/index-q9SCjCJM.mjs +280 -0
  269. package/dist/index-rn-_7-wp.cjs +196 -0
  270. package/dist/index-s27DHpTG.js +1835 -0
  271. package/dist/index-s2HuXM4d.mjs +206 -0
  272. package/dist/index-sbc7nDv3.js +213 -0
  273. package/dist/index-tx0X6vuE.mjs +222 -0
  274. package/dist/index-uCwv2hr-.mjs +166 -0
  275. package/dist/index-vHngHSlz.js +280 -0
  276. package/dist/index-xOtG5E4u.cjs +589 -0
  277. package/dist/index-zJk-Nm6b.mjs +458 -0
  278. package/dist/index-zqxgDrLR.mjs +382 -0
  279. package/dist/index.cjs +233 -0
  280. package/dist/index.d.cts +9 -0
  281. package/dist/index.d.cts.map +1 -0
  282. package/dist/index.d.ts +9 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/index.js +230 -0
  285. package/dist/index.mjs +230 -0
  286. package/dist/testkit-BtZjdl4n.js +269 -0
  287. package/dist/testkit-BtZjdl4n.mjs +269 -0
  288. package/dist/testkit-C920qivh.js +281 -0
  289. package/dist/testkit-C920qivh.mjs +281 -0
  290. package/dist/testkit-CAf-AsDy.cjs +273 -0
  291. package/dist/testkit-D0rTQ6MD.cjs +286 -0
  292. package/makefile +47 -0
  293. package/package.json +89 -0
@@ -0,0 +1,381 @@
1
+ import { c as createSubgraph, a as createTest, s as serve } from './testkit-BtZjdl4n.js';
2
+ import '@apollo/composition';
3
+ import 'graphql';
4
+ import 'fets';
5
+ import '@apollo/subgraph';
6
+ import 'graphql-yoga';
7
+
8
+ let products = [];
9
+ let categories = [];
10
+ const numbers = {};
11
+ async function getProducts() {
12
+ return products;
13
+ }
14
+ function getCategories() {
15
+ return categories;
16
+ }
17
+ async function addProduct(name, price) {
18
+ const newProduct = {
19
+ id: "p-added-" + products.length,
20
+ name,
21
+ price
22
+ };
23
+ products.push(newProduct);
24
+ return newProduct;
25
+ }
26
+ async function addCategory(name, requestId) {
27
+ if (categories.some((c) => c.id === "c-added-" + requestId)) {
28
+ throw new Error("Category with this requestId was already added");
29
+ }
30
+ const newCategory = {
31
+ id: "c-added-" + requestId,
32
+ name
33
+ };
34
+ categories.push(newCategory);
35
+ return newCategory;
36
+ }
37
+ async function deleteProduct(id) {
38
+ const after = products.filter((p) => p.id !== id);
39
+ products = after;
40
+ }
41
+ function initProducts() {
42
+ const product = {
43
+ id: "p1",
44
+ name: "p1-name",
45
+ price: 9.99
46
+ };
47
+ if (products.some((p) => p.id === product.id)) {
48
+ return;
49
+ }
50
+ products.push(product);
51
+ }
52
+ function getNumber(requestId) {
53
+ const num = numbers[requestId];
54
+ return num ?? 0;
55
+ }
56
+ function addNumber(num, requestId) {
57
+ const existingNumber = getNumber(requestId);
58
+ const sum = existingNumber + num;
59
+ numbers[requestId] = sum;
60
+ return sum;
61
+ }
62
+ function multiplyNumber(by, requestId) {
63
+ const existingNumber = getNumber(requestId);
64
+ const result = existingNumber * by;
65
+ numbers[requestId] = result;
66
+ return result;
67
+ }
68
+ function deleteNumber(requestId) {
69
+ const num = getNumber(requestId);
70
+ if (typeof numbers[requestId] === "number") {
71
+ delete numbers[requestId];
72
+ }
73
+ return num;
74
+ }
75
+
76
+ var a = createSubgraph("a", {
77
+ typeDefs: (
78
+ /* GraphQL */
79
+ `
80
+ extend schema
81
+ @link(
82
+ url: "https://specs.apollo.dev/federation/v2.3"
83
+ import: ["@key", "@shareable"]
84
+ )
85
+
86
+ type Mutation {
87
+ addProduct(input: AddProductInput!): Product!
88
+ addCategory(name: String!, requestId: String!): Category! @shareable
89
+ multiply(by: Int!, requestId: String!): Int!
90
+ }
91
+
92
+ type Query {
93
+ product(id: ID!): Product!
94
+ products: [Product!]!
95
+ }
96
+
97
+ input AddProductInput {
98
+ name: String!
99
+ price: Float!
100
+ }
101
+
102
+ type Product @key(fields: "id") {
103
+ id: ID!
104
+ name: String!
105
+ price: Float!
106
+ }
107
+
108
+ type Category @key(fields: "id") {
109
+ id: ID!
110
+ }
111
+ `
112
+ ),
113
+ resolvers: {
114
+ Query: {
115
+ async product(_, { id }) {
116
+ initProducts();
117
+ const product = (await getProducts()).find((p) => p.id === id);
118
+ if (!product) {
119
+ return null;
120
+ }
121
+ return {
122
+ id: product.id,
123
+ name: product.name,
124
+ price: product.price
125
+ };
126
+ },
127
+ async products() {
128
+ initProducts();
129
+ return getProducts();
130
+ }
131
+ },
132
+ Mutation: {
133
+ async multiply(_, args) {
134
+ return multiplyNumber(args.by, args.requestId);
135
+ },
136
+ async addProduct(_, {
137
+ input
138
+ }) {
139
+ return addProduct(input.name, input.price);
140
+ },
141
+ async addCategory(_, {
142
+ name,
143
+ requestId
144
+ }) {
145
+ return addCategory(name, requestId);
146
+ }
147
+ },
148
+ Product: {
149
+ async __resolveReference(key) {
150
+ const products = await getProducts();
151
+ const product = products.find((p) => p.id === key.id);
152
+ if (!product) {
153
+ return null;
154
+ }
155
+ await deleteProduct(product.id);
156
+ return {
157
+ id: product.id,
158
+ name: product.name,
159
+ price: product.price
160
+ };
161
+ }
162
+ },
163
+ Category: {
164
+ __resolveReference(key) {
165
+ const categories = getCategories();
166
+ const category = categories.find((p) => p.id === key.id);
167
+ if (!category) {
168
+ return null;
169
+ }
170
+ return {
171
+ id: category.id
172
+ };
173
+ }
174
+ }
175
+ }
176
+ });
177
+
178
+ var b = createSubgraph("b", {
179
+ typeDefs: (
180
+ /* GraphQL */
181
+ `
182
+ extend schema
183
+ @link(
184
+ url: "https://specs.apollo.dev/federation/v2.3"
185
+ import: ["@key", "@external", "@requires", "@shareable"]
186
+ )
187
+
188
+ type Product @key(fields: "id") {
189
+ id: ID!
190
+ price: Float! @external
191
+ isExpensive: Boolean! @requires(fields: "price")
192
+ isAvailable: Boolean!
193
+ }
194
+
195
+ type Mutation {
196
+ delete(requestId: String!): Int!
197
+ addCategory(name: String!, requestId: String!): Category! @shareable
198
+ }
199
+
200
+ type Category @key(fields: "id") {
201
+ id: ID!
202
+ name: String!
203
+ }
204
+ `
205
+ ),
206
+ resolvers: {
207
+ Mutation: {
208
+ delete(_, args) {
209
+ return deleteNumber(args.requestId);
210
+ },
211
+ async addCategory(_, {
212
+ name,
213
+ requestId
214
+ }) {
215
+ return addCategory(name, requestId);
216
+ }
217
+ },
218
+ Product: {
219
+ async __resolveReference(key) {
220
+ const product = (await getProducts()).find(
221
+ (product2) => product2.id === key.id
222
+ );
223
+ if (!product) {
224
+ return null;
225
+ }
226
+ await deleteProduct(product.id);
227
+ if (typeof product.price === "number") {
228
+ return {
229
+ id: product.id,
230
+ isAvailable: true,
231
+ price: product.price
232
+ };
233
+ }
234
+ return {
235
+ id: product.id,
236
+ isAvailable: false
237
+ };
238
+ },
239
+ isExpensive(product) {
240
+ if (typeof product.price !== "number") {
241
+ throw new Error("Price is not available");
242
+ }
243
+ return product.price > 100;
244
+ }
245
+ },
246
+ Category: {
247
+ __resolveReference(key) {
248
+ const categories = getCategories();
249
+ const category = categories.find((p) => p.id === key.id);
250
+ if (!category) {
251
+ return null;
252
+ }
253
+ return {
254
+ id: category.id,
255
+ name: category.name
256
+ };
257
+ }
258
+ }
259
+ }
260
+ });
261
+
262
+ var c = createSubgraph("c", {
263
+ typeDefs: (
264
+ /* GraphQL */
265
+ `
266
+ extend schema
267
+ @link(url: "https://specs.apollo.dev/federation/v2.3", import: ["@key"])
268
+
269
+ type Mutation {
270
+ add(num: Int!, requestId: String!): Int!
271
+ }
272
+ `
273
+ ),
274
+ resolvers: {
275
+ Mutation: {
276
+ add(_, args) {
277
+ return addNumber(args.num, args.requestId);
278
+ }
279
+ }
280
+ }
281
+ });
282
+
283
+ var test = () => {
284
+ const randomId = Math.random().toString(16).substr(2);
285
+ return [
286
+ createTest(
287
+ /* GraphQL */
288
+ `
289
+ mutation {
290
+ addProduct(input: { name: "new", price: 599.99 }) {
291
+ name
292
+ price
293
+ isExpensive
294
+ isAvailable
295
+ }
296
+ }
297
+ `,
298
+ {
299
+ data: {
300
+ addProduct: {
301
+ name: "new",
302
+ price: 599.99,
303
+ isExpensive: true,
304
+ isAvailable: true
305
+ }
306
+ }
307
+ }
308
+ ),
309
+ createTest(
310
+ /* GraphQL */
311
+ `
312
+ query {
313
+ product(id: "p1") {
314
+ id
315
+ name
316
+ price
317
+ isExpensive
318
+ isAvailable
319
+ }
320
+ }
321
+ `,
322
+ {
323
+ data: {
324
+ product: {
325
+ id: "p1",
326
+ name: "p1-name",
327
+ price: 9.99,
328
+ isExpensive: false,
329
+ isAvailable: true
330
+ }
331
+ }
332
+ }
333
+ ),
334
+ // Test correct order of execution
335
+ // It obviously does not solve a problem with shared state and race conditions,
336
+ // but at least it reduces the risk a bit
337
+ createTest(
338
+ /* GraphQL */
339
+ `
340
+ mutation {
341
+ five: add(num: 5, requestId: "${randomId}")
342
+ ten: multiply(by: 2, requestId: "${randomId}")
343
+ twelve: add(num: 2, requestId: "${randomId}")
344
+ final: delete(requestId: "${randomId}")
345
+ }
346
+ `,
347
+ {
348
+ data: {
349
+ five: 5,
350
+ ten: 10,
351
+ twelve: 12,
352
+ final: 12
353
+ }
354
+ }
355
+ ),
356
+ // shared-root (mutation)
357
+ createTest(
358
+ /* GraphQL */
359
+ `
360
+ mutation {
361
+ addCategory(name: "new", requestId: "${randomId}") {
362
+ id
363
+ name
364
+ }
365
+ }
366
+ `,
367
+ {
368
+ data: {
369
+ addCategory: {
370
+ id: "c-added-" + randomId,
371
+ name: "new"
372
+ }
373
+ }
374
+ }
375
+ )
376
+ ];
377
+ };
378
+
379
+ var index = serve("mutations", [a, b, c], test);
380
+
381
+ export { index as default };
@@ -0,0 +1,229 @@
1
+ 'use strict';
2
+
3
+ var testkit = require('./testkit-D0rTQ6MD.cjs');
4
+ require('@apollo/composition');
5
+ require('graphql');
6
+ require('fets');
7
+ require('@apollo/subgraph');
8
+ require('graphql-yoga');
9
+
10
+ const medias = [
11
+ {
12
+ __typename: "Book",
13
+ id: "m1",
14
+ title: "Book 1"
15
+ },
16
+ {
17
+ __typename: "Movie",
18
+ id: "m2",
19
+ title: "Movie 1"
20
+ }
21
+ ];
22
+
23
+ var a = testkit.createSubgraph("a", {
24
+ typeDefs: (
25
+ /* GraphQL */
26
+ `
27
+ extend schema
28
+ @link(
29
+ url: "https://specs.apollo.dev/federation/v2.3"
30
+ import: ["@key", "@shareable", "@external"]
31
+ )
32
+
33
+ type Query {
34
+ media: [Media] @shareable
35
+ }
36
+
37
+ union Media = Book | Movie
38
+
39
+ type Book @key(fields: "id") {
40
+ id: ID!
41
+ }
42
+
43
+ type Movie @key(fields: "id") {
44
+ id: ID!
45
+ }
46
+ `
47
+ ),
48
+ resolvers: {
49
+ Query: {
50
+ media(_p, _a, context) {
51
+ if (testkit.shouldPunishForPoorPlans(context)) {
52
+ throw new Error("You should not be using the 'a' subgraph!");
53
+ }
54
+ return medias.map((media) => ({
55
+ __typename: media.__typename,
56
+ id: media.id
57
+ }));
58
+ }
59
+ }
60
+ }
61
+ });
62
+
63
+ var b = testkit.createSubgraph("b", {
64
+ typeDefs: (
65
+ /* GraphQL */
66
+ `
67
+ extend schema
68
+ @link(
69
+ url: "https://specs.apollo.dev/federation/v2.3"
70
+ import: ["@key", "@shareable", "@provides", "@external"]
71
+ )
72
+
73
+ type Query {
74
+ media: [Media] @shareable @provides(fields: "... on Book { title }")
75
+ }
76
+
77
+ union Media = Book | Movie
78
+
79
+ type Book @key(fields: "id") {
80
+ id: ID!
81
+ title: String @external
82
+ }
83
+
84
+ type Movie @key(fields: "id") {
85
+ id: ID!
86
+ }
87
+ `
88
+ ),
89
+ resolvers: {
90
+ Query: {
91
+ media() {
92
+ return medias.map((media) => {
93
+ if (media.__typename === "Book") {
94
+ return {
95
+ __typename: media.__typename,
96
+ id: media.id,
97
+ title: media.title
98
+ };
99
+ }
100
+ return {
101
+ __typename: media.__typename,
102
+ id: media.id
103
+ };
104
+ });
105
+ }
106
+ }
107
+ }
108
+ });
109
+
110
+ var c = testkit.createSubgraph("c", {
111
+ typeDefs: (
112
+ /* GraphQL */
113
+ `
114
+ extend schema
115
+ @link(
116
+ url: "https://specs.apollo.dev/federation/v2.3"
117
+ import: ["@key", "@shareable"]
118
+ )
119
+
120
+ type Book @key(fields: "id") {
121
+ id: ID!
122
+ title: String @shareable
123
+ }
124
+
125
+ type Movie @key(fields: "id") {
126
+ id: ID!
127
+ title: String @shareable
128
+ }
129
+ `
130
+ ),
131
+ resolvers: {
132
+ Book: {
133
+ __resolveReference(key, context) {
134
+ if (testkit.shouldPunishForPoorPlans(context)) {
135
+ throw new Error("You should be using the 'b' subgraph!");
136
+ }
137
+ const media = medias.find((media2) => media2.id === key.id);
138
+ if (!media) {
139
+ return null;
140
+ }
141
+ return {
142
+ __typename: media.__typename,
143
+ id: media.id,
144
+ title: media.title
145
+ };
146
+ }
147
+ },
148
+ Movie: {
149
+ __resolveReference(key) {
150
+ const media = medias.find((media2) => media2.id === key.id);
151
+ if (!media) {
152
+ return null;
153
+ }
154
+ return {
155
+ __typename: media.__typename,
156
+ id: media.id,
157
+ title: media.title
158
+ };
159
+ }
160
+ }
161
+ }
162
+ });
163
+
164
+ var test = [
165
+ testkit.createTest(
166
+ /* GraphQL */
167
+ `
168
+ query {
169
+ media {
170
+ ... on Book {
171
+ id
172
+ title
173
+ }
174
+ ... on Movie {
175
+ id
176
+ }
177
+ }
178
+ }
179
+ `,
180
+ {
181
+ data: {
182
+ media: [
183
+ {
184
+ id: "m1",
185
+ title: "Book 1"
186
+ },
187
+ {
188
+ id: "m2"
189
+ }
190
+ ]
191
+ }
192
+ }
193
+ ),
194
+ testkit.createTest(
195
+ /* GraphQL */
196
+ `
197
+ query {
198
+ media {
199
+ ... on Book {
200
+ id
201
+ title
202
+ }
203
+ ... on Movie {
204
+ id
205
+ title
206
+ }
207
+ }
208
+ }
209
+ `,
210
+ {
211
+ data: {
212
+ media: [
213
+ {
214
+ id: "m1",
215
+ title: "Book 1"
216
+ },
217
+ {
218
+ id: "m2",
219
+ title: "Movie 1"
220
+ }
221
+ ]
222
+ }
223
+ }
224
+ )
225
+ ];
226
+
227
+ var index = testkit.serve("provides-on-union", [a, b, c], test);
228
+
229
+ exports.default = index;