@theguild/federation-composition 0.0.0-alpha-20230916192321-bb37b43

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 (355) hide show
  1. package/LICENSE +18 -0
  2. package/cjs/compose.js +85 -0
  3. package/cjs/graphql/helpers.js +32 -0
  4. package/cjs/graphql/printer.js +248 -0
  5. package/cjs/graphql/type-node-info.js +142 -0
  6. package/cjs/index.js +22 -0
  7. package/cjs/package.json +1 -0
  8. package/cjs/specifications/federation.js +211 -0
  9. package/cjs/specifications/inaccessible.js +10 -0
  10. package/cjs/specifications/join.js +35 -0
  11. package/cjs/specifications/link.js +222 -0
  12. package/cjs/specifications/tag.js +12 -0
  13. package/cjs/subgraph/helpers.js +255 -0
  14. package/cjs/subgraph/state.js +1154 -0
  15. package/cjs/subgraph/validation/rules/elements/compose-directive.js +41 -0
  16. package/cjs/subgraph/validation/rules/elements/extends.js +34 -0
  17. package/cjs/subgraph/validation/rules/elements/external.js +57 -0
  18. package/cjs/subgraph/validation/rules/elements/field-set.js +37 -0
  19. package/cjs/subgraph/validation/rules/elements/inaccessible.js +112 -0
  20. package/cjs/subgraph/validation/rules/elements/key.js +148 -0
  21. package/cjs/subgraph/validation/rules/elements/override.js +56 -0
  22. package/cjs/subgraph/validation/rules/elements/provides.js +173 -0
  23. package/cjs/subgraph/validation/rules/elements/requires.js +119 -0
  24. package/cjs/subgraph/validation/rules/elements/shareable.js +43 -0
  25. package/cjs/subgraph/validation/rules/elements/tag.js +120 -0
  26. package/cjs/subgraph/validation/rules/known-argument-names-on-directives-rule.js +34 -0
  27. package/cjs/subgraph/validation/rules/known-directives-rule.js +105 -0
  28. package/cjs/subgraph/validation/rules/known-federation-directive-rule.js +34 -0
  29. package/cjs/subgraph/validation/rules/known-root-type-rule.js +25 -0
  30. package/cjs/subgraph/validation/rules/known-type-names-rule.js +34 -0
  31. package/cjs/subgraph/validation/rules/lone-schema-definition-rule.js +20 -0
  32. package/cjs/subgraph/validation/rules/provided-arguments-on-directives-rule.js +104 -0
  33. package/cjs/subgraph/validation/rules/provided-required-arguments-on-directives-rule.js +46 -0
  34. package/cjs/subgraph/validation/rules/query-root-type-inaccessible-rule.js +33 -0
  35. package/cjs/subgraph/validation/rules/reserved-subgraph-name-rule.js +15 -0
  36. package/cjs/subgraph/validation/rules/root-type-used-rule.js +59 -0
  37. package/cjs/subgraph/validation/rules/unique-argument-definition-names-rule.js +42 -0
  38. package/cjs/subgraph/validation/rules/unique-argument-names-rule.js +27 -0
  39. package/cjs/subgraph/validation/rules/unique-directive-names-rule.js +24 -0
  40. package/cjs/subgraph/validation/rules/unique-directives-per-location-rule.js +52 -0
  41. package/cjs/subgraph/validation/rules/unique-enum-value-names-rule.js +33 -0
  42. package/cjs/subgraph/validation/rules/unique-field-definition-names-rule.js +37 -0
  43. package/cjs/subgraph/validation/rules/unique-input-field-names-rule.js +37 -0
  44. package/cjs/subgraph/validation/rules/unique-operation-types-rule.js +29 -0
  45. package/cjs/subgraph/validation/rules/unique-type-names-rule.js +29 -0
  46. package/cjs/subgraph/validation/validate-state.js +476 -0
  47. package/cjs/subgraph/validation/validate-subgraph.js +329 -0
  48. package/cjs/subgraph/validation/validation-context.js +267 -0
  49. package/cjs/supergraph/composition/ast.js +779 -0
  50. package/cjs/supergraph/composition/common.js +7 -0
  51. package/cjs/supergraph/composition/directive.js +93 -0
  52. package/cjs/supergraph/composition/enum-type.js +132 -0
  53. package/cjs/supergraph/composition/input-object-type.js +119 -0
  54. package/cjs/supergraph/composition/interface-type.js +226 -0
  55. package/cjs/supergraph/composition/object-type.js +380 -0
  56. package/cjs/supergraph/composition/scalar-type.js +63 -0
  57. package/cjs/supergraph/composition/union-type.js +64 -0
  58. package/cjs/supergraph/composition/visitor.js +62 -0
  59. package/cjs/supergraph/state.js +249 -0
  60. package/cjs/supergraph/validation/rules/default-value-uses-inaccessible-rule.js +35 -0
  61. package/cjs/supergraph/validation/rules/directive-composition-rule.js +98 -0
  62. package/cjs/supergraph/validation/rules/enum-values-rule.js +59 -0
  63. package/cjs/supergraph/validation/rules/extension-with-base.js +31 -0
  64. package/cjs/supergraph/validation/rules/external-argument-missing-rule.js +32 -0
  65. package/cjs/supergraph/validation/rules/external-missing-on-base-rule.js +48 -0
  66. package/cjs/supergraph/validation/rules/external-type-mismatch-rule.js +52 -0
  67. package/cjs/supergraph/validation/rules/field-argument-default-mismatch-rule.js +40 -0
  68. package/cjs/supergraph/validation/rules/field-arguments-of-the-same-type-rule.js +49 -0
  69. package/cjs/supergraph/validation/rules/fields-of-the-same-type-rule.js +89 -0
  70. package/cjs/supergraph/validation/rules/input-field-default-mismatch-rule.js +40 -0
  71. package/cjs/supergraph/validation/rules/input-object-values-rule.js +25 -0
  72. package/cjs/supergraph/validation/rules/interface-key-missing-implementation-type.js +46 -0
  73. package/cjs/supergraph/validation/rules/invalid-field-sharing-rule.js +45 -0
  74. package/cjs/supergraph/validation/rules/only-inaccessible-children-rule.js +40 -0
  75. package/cjs/supergraph/validation/rules/override-source-has-override.js +36 -0
  76. package/cjs/supergraph/validation/rules/referenced-inaccessible-rule.js +44 -0
  77. package/cjs/supergraph/validation/rules/required-argument-missing-in-some-subgraph-rule.js +32 -0
  78. package/cjs/supergraph/validation/rules/required-input-field-missing-in-some-subgraph-rule.js +32 -0
  79. package/cjs/supergraph/validation/rules/required-query-rule.js +14 -0
  80. package/cjs/supergraph/validation/rules/satisfiablity-rule.js +866 -0
  81. package/cjs/supergraph/validation/rules/subgraph-name-rule.js +18 -0
  82. package/cjs/supergraph/validation/rules/types-of-the-same-kind-rule.js +54 -0
  83. package/cjs/supergraph/validation/validate-supergraph.js +77 -0
  84. package/cjs/supergraph/validation/validation-context.js +25 -0
  85. package/cjs/types.js +0 -0
  86. package/cjs/utils/dependency-graph.js +227 -0
  87. package/cjs/utils/format.js +27 -0
  88. package/cjs/utils/helpers.js +7 -0
  89. package/cjs/utils/state.js +23 -0
  90. package/cjs/validate.js +117 -0
  91. package/esm/compose.js +78 -0
  92. package/esm/graphql/helpers.js +27 -0
  93. package/esm/graphql/printer.js +244 -0
  94. package/esm/graphql/type-node-info.js +137 -0
  95. package/esm/index.js +4 -0
  96. package/esm/specifications/federation.js +204 -0
  97. package/esm/specifications/inaccessible.js +7 -0
  98. package/esm/specifications/join.js +32 -0
  99. package/esm/specifications/link.js +210 -0
  100. package/esm/specifications/tag.js +9 -0
  101. package/esm/subgraph/helpers.js +245 -0
  102. package/esm/subgraph/state.js +1148 -0
  103. package/esm/subgraph/validation/rules/elements/compose-directive.js +37 -0
  104. package/esm/subgraph/validation/rules/elements/extends.js +30 -0
  105. package/esm/subgraph/validation/rules/elements/external.js +53 -0
  106. package/esm/subgraph/validation/rules/elements/field-set.js +33 -0
  107. package/esm/subgraph/validation/rules/elements/inaccessible.js +108 -0
  108. package/esm/subgraph/validation/rules/elements/key.js +144 -0
  109. package/esm/subgraph/validation/rules/elements/override.js +52 -0
  110. package/esm/subgraph/validation/rules/elements/provides.js +169 -0
  111. package/esm/subgraph/validation/rules/elements/requires.js +115 -0
  112. package/esm/subgraph/validation/rules/elements/shareable.js +39 -0
  113. package/esm/subgraph/validation/rules/elements/tag.js +116 -0
  114. package/esm/subgraph/validation/rules/known-argument-names-on-directives-rule.js +30 -0
  115. package/esm/subgraph/validation/rules/known-directives-rule.js +101 -0
  116. package/esm/subgraph/validation/rules/known-federation-directive-rule.js +30 -0
  117. package/esm/subgraph/validation/rules/known-root-type-rule.js +21 -0
  118. package/esm/subgraph/validation/rules/known-type-names-rule.js +30 -0
  119. package/esm/subgraph/validation/rules/lone-schema-definition-rule.js +16 -0
  120. package/esm/subgraph/validation/rules/provided-arguments-on-directives-rule.js +100 -0
  121. package/esm/subgraph/validation/rules/provided-required-arguments-on-directives-rule.js +42 -0
  122. package/esm/subgraph/validation/rules/query-root-type-inaccessible-rule.js +29 -0
  123. package/esm/subgraph/validation/rules/reserved-subgraph-name-rule.js +11 -0
  124. package/esm/subgraph/validation/rules/root-type-used-rule.js +55 -0
  125. package/esm/subgraph/validation/rules/unique-argument-definition-names-rule.js +38 -0
  126. package/esm/subgraph/validation/rules/unique-argument-names-rule.js +23 -0
  127. package/esm/subgraph/validation/rules/unique-directive-names-rule.js +20 -0
  128. package/esm/subgraph/validation/rules/unique-directives-per-location-rule.js +48 -0
  129. package/esm/subgraph/validation/rules/unique-enum-value-names-rule.js +29 -0
  130. package/esm/subgraph/validation/rules/unique-field-definition-names-rule.js +33 -0
  131. package/esm/subgraph/validation/rules/unique-input-field-names-rule.js +33 -0
  132. package/esm/subgraph/validation/rules/unique-operation-types-rule.js +25 -0
  133. package/esm/subgraph/validation/rules/unique-type-names-rule.js +25 -0
  134. package/esm/subgraph/validation/validate-state.js +463 -0
  135. package/esm/subgraph/validation/validate-subgraph.js +323 -0
  136. package/esm/subgraph/validation/validation-context.js +262 -0
  137. package/esm/supergraph/composition/ast.js +765 -0
  138. package/esm/supergraph/composition/common.js +3 -0
  139. package/esm/supergraph/composition/directive.js +89 -0
  140. package/esm/supergraph/composition/enum-type.js +128 -0
  141. package/esm/supergraph/composition/input-object-type.js +115 -0
  142. package/esm/supergraph/composition/interface-type.js +222 -0
  143. package/esm/supergraph/composition/object-type.js +375 -0
  144. package/esm/supergraph/composition/scalar-type.js +59 -0
  145. package/esm/supergraph/composition/union-type.js +60 -0
  146. package/esm/supergraph/composition/visitor.js +58 -0
  147. package/esm/supergraph/state.js +245 -0
  148. package/esm/supergraph/validation/rules/default-value-uses-inaccessible-rule.js +31 -0
  149. package/esm/supergraph/validation/rules/directive-composition-rule.js +94 -0
  150. package/esm/supergraph/validation/rules/enum-values-rule.js +55 -0
  151. package/esm/supergraph/validation/rules/extension-with-base.js +27 -0
  152. package/esm/supergraph/validation/rules/external-argument-missing-rule.js +28 -0
  153. package/esm/supergraph/validation/rules/external-missing-on-base-rule.js +44 -0
  154. package/esm/supergraph/validation/rules/external-type-mismatch-rule.js +48 -0
  155. package/esm/supergraph/validation/rules/field-argument-default-mismatch-rule.js +36 -0
  156. package/esm/supergraph/validation/rules/field-arguments-of-the-same-type-rule.js +45 -0
  157. package/esm/supergraph/validation/rules/fields-of-the-same-type-rule.js +85 -0
  158. package/esm/supergraph/validation/rules/input-field-default-mismatch-rule.js +36 -0
  159. package/esm/supergraph/validation/rules/input-object-values-rule.js +21 -0
  160. package/esm/supergraph/validation/rules/interface-key-missing-implementation-type.js +42 -0
  161. package/esm/supergraph/validation/rules/invalid-field-sharing-rule.js +41 -0
  162. package/esm/supergraph/validation/rules/only-inaccessible-children-rule.js +36 -0
  163. package/esm/supergraph/validation/rules/override-source-has-override.js +32 -0
  164. package/esm/supergraph/validation/rules/referenced-inaccessible-rule.js +40 -0
  165. package/esm/supergraph/validation/rules/required-argument-missing-in-some-subgraph-rule.js +28 -0
  166. package/esm/supergraph/validation/rules/required-input-field-missing-in-some-subgraph-rule.js +28 -0
  167. package/esm/supergraph/validation/rules/required-query-rule.js +10 -0
  168. package/esm/supergraph/validation/rules/satisfiablity-rule.js +862 -0
  169. package/esm/supergraph/validation/rules/subgraph-name-rule.js +14 -0
  170. package/esm/supergraph/validation/rules/types-of-the-same-kind-rule.js +50 -0
  171. package/esm/supergraph/validation/validate-supergraph.js +73 -0
  172. package/esm/supergraph/validation/validation-context.js +21 -0
  173. package/esm/types.js +0 -0
  174. package/esm/utils/dependency-graph.js +222 -0
  175. package/esm/utils/format.js +23 -0
  176. package/esm/utils/helpers.js +3 -0
  177. package/esm/utils/state.js +15 -0
  178. package/esm/validate.js +113 -0
  179. package/package.json +46 -0
  180. package/typings/compose.d.cts +16 -0
  181. package/typings/compose.d.ts +16 -0
  182. package/typings/graphql/helpers.d.cts +4 -0
  183. package/typings/graphql/helpers.d.ts +4 -0
  184. package/typings/graphql/printer.d.cts +3 -0
  185. package/typings/graphql/printer.d.ts +3 -0
  186. package/typings/graphql/type-node-info.d.cts +19 -0
  187. package/typings/graphql/type-node-info.d.ts +19 -0
  188. package/typings/index.d.cts +5 -0
  189. package/typings/index.d.ts +5 -0
  190. package/typings/specifications/federation.d.cts +45 -0
  191. package/typings/specifications/federation.d.ts +45 -0
  192. package/typings/specifications/inaccessible.d.cts +4 -0
  193. package/typings/specifications/inaccessible.d.ts +4 -0
  194. package/typings/specifications/join.d.cts +2 -0
  195. package/typings/specifications/join.d.ts +2 -0
  196. package/typings/specifications/link.d.cts +61 -0
  197. package/typings/specifications/link.d.ts +61 -0
  198. package/typings/specifications/tag.d.cts +4 -0
  199. package/typings/specifications/tag.d.ts +4 -0
  200. package/typings/subgraph/helpers.d.cts +44 -0
  201. package/typings/subgraph/helpers.d.ts +44 -0
  202. package/typings/subgraph/state.d.cts +322 -0
  203. package/typings/subgraph/state.d.ts +322 -0
  204. package/typings/subgraph/validation/rules/elements/compose-directive.d.cts +4 -0
  205. package/typings/subgraph/validation/rules/elements/compose-directive.d.ts +4 -0
  206. package/typings/subgraph/validation/rules/elements/extends.d.cts +4 -0
  207. package/typings/subgraph/validation/rules/elements/extends.d.ts +4 -0
  208. package/typings/subgraph/validation/rules/elements/external.d.cts +4 -0
  209. package/typings/subgraph/validation/rules/elements/external.d.ts +4 -0
  210. package/typings/subgraph/validation/rules/elements/field-set.d.cts +4 -0
  211. package/typings/subgraph/validation/rules/elements/field-set.d.ts +4 -0
  212. package/typings/subgraph/validation/rules/elements/inaccessible.d.cts +4 -0
  213. package/typings/subgraph/validation/rules/elements/inaccessible.d.ts +4 -0
  214. package/typings/subgraph/validation/rules/elements/key.d.cts +4 -0
  215. package/typings/subgraph/validation/rules/elements/key.d.ts +4 -0
  216. package/typings/subgraph/validation/rules/elements/override.d.cts +4 -0
  217. package/typings/subgraph/validation/rules/elements/override.d.ts +4 -0
  218. package/typings/subgraph/validation/rules/elements/provides.d.cts +4 -0
  219. package/typings/subgraph/validation/rules/elements/provides.d.ts +4 -0
  220. package/typings/subgraph/validation/rules/elements/requires.d.cts +4 -0
  221. package/typings/subgraph/validation/rules/elements/requires.d.ts +4 -0
  222. package/typings/subgraph/validation/rules/elements/shareable.d.cts +4 -0
  223. package/typings/subgraph/validation/rules/elements/shareable.d.ts +4 -0
  224. package/typings/subgraph/validation/rules/elements/tag.d.cts +4 -0
  225. package/typings/subgraph/validation/rules/elements/tag.d.ts +4 -0
  226. package/typings/subgraph/validation/rules/known-argument-names-on-directives-rule.d.cts +6 -0
  227. package/typings/subgraph/validation/rules/known-argument-names-on-directives-rule.d.ts +6 -0
  228. package/typings/subgraph/validation/rules/known-directives-rule.d.cts +6 -0
  229. package/typings/subgraph/validation/rules/known-directives-rule.d.ts +6 -0
  230. package/typings/subgraph/validation/rules/known-federation-directive-rule.d.cts +4 -0
  231. package/typings/subgraph/validation/rules/known-federation-directive-rule.d.ts +4 -0
  232. package/typings/subgraph/validation/rules/known-root-type-rule.d.cts +4 -0
  233. package/typings/subgraph/validation/rules/known-root-type-rule.d.ts +4 -0
  234. package/typings/subgraph/validation/rules/known-type-names-rule.d.cts +4 -0
  235. package/typings/subgraph/validation/rules/known-type-names-rule.d.ts +4 -0
  236. package/typings/subgraph/validation/rules/lone-schema-definition-rule.d.cts +5 -0
  237. package/typings/subgraph/validation/rules/lone-schema-definition-rule.d.ts +5 -0
  238. package/typings/subgraph/validation/rules/provided-arguments-on-directives-rule.d.cts +4 -0
  239. package/typings/subgraph/validation/rules/provided-arguments-on-directives-rule.d.ts +4 -0
  240. package/typings/subgraph/validation/rules/provided-required-arguments-on-directives-rule.d.cts +4 -0
  241. package/typings/subgraph/validation/rules/provided-required-arguments-on-directives-rule.d.ts +4 -0
  242. package/typings/subgraph/validation/rules/query-root-type-inaccessible-rule.d.cts +4 -0
  243. package/typings/subgraph/validation/rules/query-root-type-inaccessible-rule.d.ts +4 -0
  244. package/typings/subgraph/validation/rules/reserved-subgraph-name-rule.d.cts +4 -0
  245. package/typings/subgraph/validation/rules/reserved-subgraph-name-rule.d.ts +4 -0
  246. package/typings/subgraph/validation/rules/root-type-used-rule.d.cts +4 -0
  247. package/typings/subgraph/validation/rules/root-type-used-rule.d.ts +4 -0
  248. package/typings/subgraph/validation/rules/unique-argument-definition-names-rule.d.cts +5 -0
  249. package/typings/subgraph/validation/rules/unique-argument-definition-names-rule.d.ts +5 -0
  250. package/typings/subgraph/validation/rules/unique-argument-names-rule.d.cts +5 -0
  251. package/typings/subgraph/validation/rules/unique-argument-names-rule.d.ts +5 -0
  252. package/typings/subgraph/validation/rules/unique-directive-names-rule.d.cts +5 -0
  253. package/typings/subgraph/validation/rules/unique-directive-names-rule.d.ts +5 -0
  254. package/typings/subgraph/validation/rules/unique-directives-per-location-rule.d.cts +6 -0
  255. package/typings/subgraph/validation/rules/unique-directives-per-location-rule.d.ts +6 -0
  256. package/typings/subgraph/validation/rules/unique-enum-value-names-rule.d.cts +5 -0
  257. package/typings/subgraph/validation/rules/unique-enum-value-names-rule.d.ts +5 -0
  258. package/typings/subgraph/validation/rules/unique-field-definition-names-rule.d.cts +5 -0
  259. package/typings/subgraph/validation/rules/unique-field-definition-names-rule.d.ts +5 -0
  260. package/typings/subgraph/validation/rules/unique-input-field-names-rule.d.cts +5 -0
  261. package/typings/subgraph/validation/rules/unique-input-field-names-rule.d.ts +5 -0
  262. package/typings/subgraph/validation/rules/unique-operation-types-rule.d.cts +5 -0
  263. package/typings/subgraph/validation/rules/unique-operation-types-rule.d.ts +5 -0
  264. package/typings/subgraph/validation/rules/unique-type-names-rule.d.cts +5 -0
  265. package/typings/subgraph/validation/rules/unique-type-names-rule.d.ts +5 -0
  266. package/typings/subgraph/validation/validate-state.d.cts +13 -0
  267. package/typings/subgraph/validation/validate-state.d.ts +13 -0
  268. package/typings/subgraph/validation/validate-subgraph.d.cts +43 -0
  269. package/typings/subgraph/validation/validate-subgraph.d.ts +43 -0
  270. package/typings/subgraph/validation/validation-context.d.cts +182 -0
  271. package/typings/subgraph/validation/validation-context.d.ts +182 -0
  272. package/typings/supergraph/composition/ast.d.cts +216 -0
  273. package/typings/supergraph/composition/ast.d.ts +216 -0
  274. package/typings/supergraph/composition/common.d.cts +19 -0
  275. package/typings/supergraph/composition/common.d.ts +19 -0
  276. package/typings/supergraph/composition/directive.d.cts +32 -0
  277. package/typings/supergraph/composition/directive.d.ts +32 -0
  278. package/typings/supergraph/composition/enum-type.d.cts +32 -0
  279. package/typings/supergraph/composition/enum-type.d.ts +32 -0
  280. package/typings/supergraph/composition/input-object-type.d.cts +32 -0
  281. package/typings/supergraph/composition/input-object-type.d.ts +32 -0
  282. package/typings/supergraph/composition/interface-type.d.cts +61 -0
  283. package/typings/supergraph/composition/interface-type.d.ts +61 -0
  284. package/typings/supergraph/composition/object-type.d.cts +79 -0
  285. package/typings/supergraph/composition/object-type.d.ts +79 -0
  286. package/typings/supergraph/composition/scalar-type.d.cts +20 -0
  287. package/typings/supergraph/composition/scalar-type.d.ts +20 -0
  288. package/typings/supergraph/composition/union-type.d.cts +17 -0
  289. package/typings/supergraph/composition/union-type.d.ts +17 -0
  290. package/typings/supergraph/composition/visitor.d.cts +18 -0
  291. package/typings/supergraph/composition/visitor.d.ts +18 -0
  292. package/typings/supergraph/state.d.cts +51 -0
  293. package/typings/supergraph/state.d.ts +51 -0
  294. package/typings/supergraph/validation/rules/default-value-uses-inaccessible-rule.d.cts +5 -0
  295. package/typings/supergraph/validation/rules/default-value-uses-inaccessible-rule.d.ts +5 -0
  296. package/typings/supergraph/validation/rules/directive-composition-rule.d.cts +5 -0
  297. package/typings/supergraph/validation/rules/directive-composition-rule.d.ts +5 -0
  298. package/typings/supergraph/validation/rules/enum-values-rule.d.cts +4 -0
  299. package/typings/supergraph/validation/rules/enum-values-rule.d.ts +4 -0
  300. package/typings/supergraph/validation/rules/extension-with-base.d.cts +4 -0
  301. package/typings/supergraph/validation/rules/extension-with-base.d.ts +4 -0
  302. package/typings/supergraph/validation/rules/external-argument-missing-rule.d.cts +4 -0
  303. package/typings/supergraph/validation/rules/external-argument-missing-rule.d.ts +4 -0
  304. package/typings/supergraph/validation/rules/external-missing-on-base-rule.d.cts +4 -0
  305. package/typings/supergraph/validation/rules/external-missing-on-base-rule.d.ts +4 -0
  306. package/typings/supergraph/validation/rules/external-type-mismatch-rule.d.cts +4 -0
  307. package/typings/supergraph/validation/rules/external-type-mismatch-rule.d.ts +4 -0
  308. package/typings/supergraph/validation/rules/field-argument-default-mismatch-rule.d.cts +4 -0
  309. package/typings/supergraph/validation/rules/field-argument-default-mismatch-rule.d.ts +4 -0
  310. package/typings/supergraph/validation/rules/field-arguments-of-the-same-type-rule.d.cts +4 -0
  311. package/typings/supergraph/validation/rules/field-arguments-of-the-same-type-rule.d.ts +4 -0
  312. package/typings/supergraph/validation/rules/fields-of-the-same-type-rule.d.cts +4 -0
  313. package/typings/supergraph/validation/rules/fields-of-the-same-type-rule.d.ts +4 -0
  314. package/typings/supergraph/validation/rules/input-field-default-mismatch-rule.d.cts +4 -0
  315. package/typings/supergraph/validation/rules/input-field-default-mismatch-rule.d.ts +4 -0
  316. package/typings/supergraph/validation/rules/input-object-values-rule.d.cts +4 -0
  317. package/typings/supergraph/validation/rules/input-object-values-rule.d.ts +4 -0
  318. package/typings/supergraph/validation/rules/interface-key-missing-implementation-type.d.cts +4 -0
  319. package/typings/supergraph/validation/rules/interface-key-missing-implementation-type.d.ts +4 -0
  320. package/typings/supergraph/validation/rules/invalid-field-sharing-rule.d.cts +4 -0
  321. package/typings/supergraph/validation/rules/invalid-field-sharing-rule.d.ts +4 -0
  322. package/typings/supergraph/validation/rules/only-inaccessible-children-rule.d.cts +4 -0
  323. package/typings/supergraph/validation/rules/only-inaccessible-children-rule.d.ts +4 -0
  324. package/typings/supergraph/validation/rules/override-source-has-override.d.cts +4 -0
  325. package/typings/supergraph/validation/rules/override-source-has-override.d.ts +4 -0
  326. package/typings/supergraph/validation/rules/referenced-inaccessible-rule.d.cts +5 -0
  327. package/typings/supergraph/validation/rules/referenced-inaccessible-rule.d.ts +5 -0
  328. package/typings/supergraph/validation/rules/required-argument-missing-in-some-subgraph-rule.d.cts +4 -0
  329. package/typings/supergraph/validation/rules/required-argument-missing-in-some-subgraph-rule.d.ts +4 -0
  330. package/typings/supergraph/validation/rules/required-input-field-missing-in-some-subgraph-rule.d.cts +4 -0
  331. package/typings/supergraph/validation/rules/required-input-field-missing-in-some-subgraph-rule.d.ts +4 -0
  332. package/typings/supergraph/validation/rules/required-query-rule.d.cts +3 -0
  333. package/typings/supergraph/validation/rules/required-query-rule.d.ts +3 -0
  334. package/typings/supergraph/validation/rules/satisfiablity-rule.d.cts +5 -0
  335. package/typings/supergraph/validation/rules/satisfiablity-rule.d.ts +5 -0
  336. package/typings/supergraph/validation/rules/subgraph-name-rule.d.cts +3 -0
  337. package/typings/supergraph/validation/rules/subgraph-name-rule.d.ts +3 -0
  338. package/typings/supergraph/validation/rules/types-of-the-same-kind-rule.d.cts +3 -0
  339. package/typings/supergraph/validation/rules/types-of-the-same-kind-rule.d.ts +3 -0
  340. package/typings/supergraph/validation/validate-supergraph.d.cts +6 -0
  341. package/typings/supergraph/validation/validate-supergraph.d.ts +6 -0
  342. package/typings/supergraph/validation/validation-context.d.cts +10 -0
  343. package/typings/supergraph/validation/validation-context.d.ts +10 -0
  344. package/typings/types.d.cts +7 -0
  345. package/typings/types.d.ts +7 -0
  346. package/typings/utils/dependency-graph.d.cts +31 -0
  347. package/typings/utils/dependency-graph.d.ts +31 -0
  348. package/typings/utils/format.d.cts +2 -0
  349. package/typings/utils/format.d.ts +2 -0
  350. package/typings/utils/helpers.d.cts +2 -0
  351. package/typings/utils/helpers.d.ts +2 -0
  352. package/typings/utils/state.d.cts +6 -0
  353. package/typings/utils/state.d.ts +6 -0
  354. package/typings/validate.d.cts +37 -0
  355. package/typings/validate.d.ts +37 -0
@@ -0,0 +1,27 @@
1
+ import { Kind, visit } from 'graphql';
2
+ export function isDirectiveDefinition(node) {
3
+ return node.kind === Kind.DIRECTIVE_DEFINITION;
4
+ }
5
+ export function stripFederationFromSupergraph(supergraph) {
6
+ function remove() {
7
+ return null;
8
+ }
9
+ return visit(supergraph, {
10
+ DirectiveDefinition: remove,
11
+ Directive: remove,
12
+ SchemaDefinition: remove,
13
+ SchemaExtension: remove,
14
+ EnumTypeDefinition: node => {
15
+ if (node.name.value === 'core__Purpose' || node.name.value === 'join__Graph') {
16
+ return null;
17
+ }
18
+ return node;
19
+ },
20
+ ScalarTypeDefinition: node => {
21
+ if (node.name.value === '_FieldSet') {
22
+ return null;
23
+ }
24
+ return node;
25
+ },
26
+ });
27
+ }
@@ -0,0 +1,244 @@
1
+ function printString(string) {
2
+ return JSON.stringify(string);
3
+ }
4
+ function printBlockString(string) {
5
+ return '"""\n' + string.replace(/"""/g, '\\"""') + '\n"""';
6
+ }
7
+ const nodes = {
8
+ Document(node) {
9
+ return node.definitions?.length > 0 ? node.definitions.map(print).join('\n\n') : '';
10
+ },
11
+ OperationDefinition(node) {
12
+ if (node.operation === 'query' &&
13
+ !node.name &&
14
+ !node.variableDefinitions?.length &&
15
+ !node.directives?.length) {
16
+ return print(node.selectionSet);
17
+ }
18
+ return (join([
19
+ node.operation,
20
+ print(node.name) + wrap('(', join(node.variableDefinitions?.map(print), ', '), ')'),
21
+ join(node.directives?.map(print), ' '),
22
+ ], ' ') + print(node.selectionSet));
23
+ },
24
+ VariableDefinition(node) {
25
+ return [
26
+ print(node.variable),
27
+ ':',
28
+ print(node.type),
29
+ wrap(' = ', print(node.defaultValue)),
30
+ join(node.directives?.map(print), ' '),
31
+ ].join(' ');
32
+ },
33
+ Field(node) {
34
+ return (join([
35
+ (node.alias ? node.alias.value + ': ' : '') + node.name.value + printArgs(node.arguments),
36
+ join(node.directives?.map(print), ' '),
37
+ ], ' ') + print(node.selectionSet));
38
+ },
39
+ StringValue(node) {
40
+ return node.block ? printBlockString(node.value) : printString(node.value);
41
+ },
42
+ BooleanValue(node) {
43
+ return '' + node.value;
44
+ },
45
+ NullValue(_node) {
46
+ return 'null';
47
+ },
48
+ IntValue(node) {
49
+ return node.value;
50
+ },
51
+ FloatValue(node) {
52
+ return node.value;
53
+ },
54
+ EnumValue(node) {
55
+ return node.value;
56
+ },
57
+ Name(node) {
58
+ return node.value;
59
+ },
60
+ Variable(node) {
61
+ return '$' + node.name.value;
62
+ },
63
+ ListValue(node) {
64
+ return '[' + node.values.map(print).join(', ') + ']';
65
+ },
66
+ ObjectValue(node) {
67
+ return '{' + node.fields.map(print).join(', ') + '}';
68
+ },
69
+ ObjectField(node) {
70
+ return node.name.value + ': ' + print(node.value);
71
+ },
72
+ SelectionSet(node) {
73
+ return block(node.selections.map(print));
74
+ },
75
+ Argument(node) {
76
+ return node.name.value + ': ' + print(node.value);
77
+ },
78
+ FragmentSpread(node) {
79
+ return join(['...', print(node.name), join(node.directives?.map(print), ' ')], ' ');
80
+ },
81
+ InlineFragment(node) {
82
+ return join([
83
+ '...',
84
+ node.typeCondition ? 'on ' + node.typeCondition.name.value : '',
85
+ join(node.directives?.map(print), ' '),
86
+ print(node.selectionSet),
87
+ ], ' ');
88
+ },
89
+ FragmentDefinition(node) {
90
+ return join([
91
+ 'fragment',
92
+ print(node.name),
93
+ 'on',
94
+ node.typeCondition.name.value,
95
+ join(node.directives?.map(print), ' '),
96
+ print(node.selectionSet),
97
+ ]);
98
+ },
99
+ Directive(node) {
100
+ return '@' + node.name.value + printArgs(node.arguments);
101
+ },
102
+ NamedType(node) {
103
+ return node.name.value;
104
+ },
105
+ ListType(node) {
106
+ return '[' + print(node.type) + ']';
107
+ },
108
+ NonNullType(node) {
109
+ return print(node.type) + '!';
110
+ },
111
+ SchemaDefinition(node) {
112
+ return join(['schema', join(node.directives?.map(print), ' '), block(node.operationTypes?.map(print))], ' ');
113
+ },
114
+ OperationTypeDefinition(node) {
115
+ return node.operation + ': ' + print(node.type);
116
+ },
117
+ ScalarTypeDefinition(node) {
118
+ return (wrap('', print(node.description), '\n') +
119
+ join(['scalar', print(node.name), join(node.directives?.map(print), ' ')], ' '));
120
+ },
121
+ ObjectTypeDefinition(node) {
122
+ return (wrap('', print(node.description), '\n') +
123
+ join([
124
+ 'type',
125
+ print(node.name),
126
+ wrap('implements ', join(node.interfaces?.map(print), ' & ')),
127
+ join(node.directives?.map(print), ' '),
128
+ block(node.fields?.map(print)),
129
+ ], ' '));
130
+ },
131
+ InterfaceTypeDefinition(node) {
132
+ return (wrap('', print(node.description), '\n') +
133
+ join([
134
+ 'interface',
135
+ print(node.name),
136
+ wrap('implements ', join(node.interfaces?.map(print), ' & ')),
137
+ join(node.directives?.map(print), ' '),
138
+ block(node.fields?.map(print)),
139
+ ], ' '));
140
+ },
141
+ InputObjectTypeDefinition(node) {
142
+ return (wrap('', print(node.description), '\n') +
143
+ join([
144
+ 'input',
145
+ print(node.name),
146
+ join(node.directives?.map(print), ' '),
147
+ block(node.fields?.map(print)),
148
+ ], ' '));
149
+ },
150
+ UnionTypeDefinition(node) {
151
+ return (wrap('', print(node.description), '\n') +
152
+ join([
153
+ 'union',
154
+ print(node.name),
155
+ join(node.directives?.map(print), ' '),
156
+ wrap('= ', join(node.types?.map(print), ' | ')),
157
+ ], ' '));
158
+ },
159
+ EnumTypeDefinition(node) {
160
+ return (wrap('', print(node.description), '\n') +
161
+ join([
162
+ 'enum',
163
+ print(node.name),
164
+ join(node.directives?.map(print), ' '),
165
+ block(node.values?.map(print)),
166
+ ], ' '));
167
+ },
168
+ EnumValueDefinition(node) {
169
+ return (wrap('', print(node.description), '\n') +
170
+ join([print(node.name), join(node.directives?.map(print), ' ')], ' '));
171
+ },
172
+ FieldDefinition(node) {
173
+ return (wrap('', print(node.description), '\n') +
174
+ print(node.name) +
175
+ printArgs(node.arguments) +
176
+ ': ' +
177
+ print(node.type) +
178
+ wrap(' ', join(node.directives?.map(print), ' ')));
179
+ },
180
+ InputValueDefinition(node) {
181
+ return (wrap('', print(node.description), '\n') +
182
+ join([
183
+ print(node.name) + ': ' + print(node.type),
184
+ wrap('= ', print(node.defaultValue)),
185
+ join(node.directives?.map(print), ' '),
186
+ ], ' '));
187
+ },
188
+ DirectiveDefinition(node) {
189
+ return (wrap('', print(node.description), '\n') +
190
+ 'directive @' +
191
+ print(node.name) +
192
+ printArgs(node.arguments) +
193
+ (node.repeatable ? ' repeatable' : '') +
194
+ ' on ' +
195
+ join(node.locations?.map(print), ' | '));
196
+ },
197
+ SchemaExtension() {
198
+ return '';
199
+ },
200
+ ScalarTypeExtension() {
201
+ return '';
202
+ },
203
+ ObjectTypeExtension() {
204
+ return '';
205
+ },
206
+ InterfaceTypeExtension() {
207
+ return '';
208
+ },
209
+ UnionTypeExtension() {
210
+ return '';
211
+ },
212
+ EnumTypeExtension() {
213
+ return '';
214
+ },
215
+ InputObjectTypeExtension() {
216
+ return '';
217
+ },
218
+ };
219
+ export function print(node) {
220
+ if (!node) {
221
+ return '';
222
+ }
223
+ return nodes[node.kind] ? nodes[node.kind](node) : '';
224
+ }
225
+ function printArgs(nodes) {
226
+ if (!nodes || nodes.length === 0) {
227
+ return '';
228
+ }
229
+ const args = nodes.map(print);
230
+ const argsLine = '(' + args.join(', ') + ') ';
231
+ return argsLine.length > 80 ? '(\n ' + args.join('\n').replace(/\n/g, '\n ') + '\n)' : argsLine;
232
+ }
233
+ function block(array) {
234
+ return wrap('{\n', indent(join(array, '\n')), '\n}');
235
+ }
236
+ function indent(str) {
237
+ return wrap(' ', str.replaceAll('\n', '\n '));
238
+ }
239
+ function wrap(start, maybeString, end = '') {
240
+ return maybeString != null && maybeString !== '' ? start + maybeString + end : '';
241
+ }
242
+ function join(maybeArray, separator = '') {
243
+ return maybeArray?.filter(x => x).join(separator) ?? '';
244
+ }
@@ -0,0 +1,137 @@
1
+ import { Kind, } from 'graphql';
2
+ function getEnterLeaveForKind(visitor, kind) {
3
+ const kindVisitor = visitor[kind];
4
+ if (typeof kindVisitor === 'object') {
5
+ return kindVisitor;
6
+ }
7
+ if (typeof kindVisitor === 'function') {
8
+ return { enter: kindVisitor, leave: undefined };
9
+ }
10
+ return { enter: visitor.enter, leave: visitor.leave };
11
+ }
12
+ function isNode(maybeNode) {
13
+ const maybeKind = maybeNode?.kind;
14
+ return typeof maybeKind === 'string';
15
+ }
16
+ export class TypeNodeInfo {
17
+ _type;
18
+ _field;
19
+ _arg;
20
+ _value;
21
+ constructor() {
22
+ this._type = undefined;
23
+ this._field = undefined;
24
+ this._arg = undefined;
25
+ this._value = undefined;
26
+ }
27
+ get [Symbol.toStringTag]() {
28
+ return 'TypeNodeInfo';
29
+ }
30
+ getTypeDef() {
31
+ return this._type;
32
+ }
33
+ getFieldDef() {
34
+ return this._field;
35
+ }
36
+ getArgumentDef() {
37
+ return this._arg;
38
+ }
39
+ getValueDef() {
40
+ return this._value;
41
+ }
42
+ enter(node) {
43
+ switch (node.kind) {
44
+ case Kind.OBJECT_TYPE_DEFINITION:
45
+ case Kind.OBJECT_TYPE_EXTENSION:
46
+ case Kind.INTERFACE_TYPE_DEFINITION:
47
+ case Kind.INTERFACE_TYPE_EXTENSION:
48
+ case Kind.UNION_TYPE_DEFINITION:
49
+ case Kind.UNION_TYPE_EXTENSION:
50
+ case Kind.ENUM_TYPE_DEFINITION:
51
+ case Kind.ENUM_TYPE_EXTENSION:
52
+ case Kind.INPUT_OBJECT_TYPE_DEFINITION:
53
+ case Kind.INPUT_OBJECT_TYPE_EXTENSION:
54
+ case Kind.SCALAR_TYPE_DEFINITION:
55
+ case Kind.SCALAR_TYPE_EXTENSION:
56
+ case Kind.DIRECTIVE_DEFINITION:
57
+ this._type = node;
58
+ break;
59
+ case Kind.ENUM_VALUE_DEFINITION:
60
+ this._value = node;
61
+ break;
62
+ case Kind.FIELD_DEFINITION:
63
+ this._field = node;
64
+ break;
65
+ case Kind.INPUT_VALUE_DEFINITION:
66
+ if (this._field) {
67
+ this._arg = node;
68
+ }
69
+ else {
70
+ this._field = node;
71
+ }
72
+ break;
73
+ default:
74
+ }
75
+ }
76
+ leave(node) {
77
+ switch (node.kind) {
78
+ case Kind.OBJECT_TYPE_DEFINITION:
79
+ case Kind.OBJECT_TYPE_EXTENSION:
80
+ case Kind.INTERFACE_TYPE_DEFINITION:
81
+ case Kind.INTERFACE_TYPE_EXTENSION:
82
+ case Kind.UNION_TYPE_DEFINITION:
83
+ case Kind.UNION_TYPE_EXTENSION:
84
+ case Kind.ENUM_TYPE_DEFINITION:
85
+ case Kind.ENUM_TYPE_EXTENSION:
86
+ case Kind.INPUT_OBJECT_TYPE_DEFINITION:
87
+ case Kind.INPUT_OBJECT_TYPE_EXTENSION:
88
+ case Kind.SCALAR_TYPE_DEFINITION:
89
+ case Kind.SCALAR_TYPE_EXTENSION:
90
+ case Kind.DIRECTIVE_DEFINITION:
91
+ this._type = undefined;
92
+ break;
93
+ case Kind.FIELD_DEFINITION:
94
+ this._field = undefined;
95
+ break;
96
+ case Kind.ENUM_VALUE_DEFINITION:
97
+ this._value = undefined;
98
+ break;
99
+ case Kind.INPUT_VALUE_DEFINITION:
100
+ if (this._arg) {
101
+ this._arg = undefined;
102
+ }
103
+ else {
104
+ this._field = undefined;
105
+ }
106
+ break;
107
+ default:
108
+ }
109
+ }
110
+ }
111
+ export function visitWithTypeNodeInfo(typeInfo, visitor) {
112
+ return {
113
+ enter(node, key, parent, path, ancestors) {
114
+ typeInfo.enter(node);
115
+ const fn = getEnterLeaveForKind(visitor, node.kind).enter;
116
+ if (fn) {
117
+ const result = fn.call(visitor, node, key, parent, path, ancestors);
118
+ if (result !== undefined) {
119
+ typeInfo.leave(node);
120
+ if (isNode(result)) {
121
+ typeInfo.enter(result);
122
+ }
123
+ }
124
+ return result;
125
+ }
126
+ },
127
+ leave(node, key, parent, path, ancestors) {
128
+ const fn = getEnterLeaveForKind(visitor, node.kind).leave;
129
+ let result;
130
+ if (fn) {
131
+ result = fn.call(visitor, node, key, parent, path, ancestors);
132
+ }
133
+ typeInfo.leave(node);
134
+ return result;
135
+ },
136
+ };
137
+ }
package/esm/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './compose.js';
2
+ export * from './types.js';
3
+ export * from './validate.js';
4
+ export { stripFederationFromSupergraph } from './graphql/helpers.js';
@@ -0,0 +1,204 @@
1
+ import { GraphQLError, Kind, parse, specifiedDirectives, specifiedScalarTypes, } from 'graphql';
2
+ import { print } from '../graphql/printer.js';
3
+ import { directive as inaccessibleDirective } from './inaccessible.js';
4
+ import { parseLink } from './link.js';
5
+ import { directive as tagDirective } from './tag.js';
6
+ export function isFederationVersion(version) {
7
+ return version in federationSpecFactory;
8
+ }
9
+ export function createSpecSchema(version, imports) {
10
+ if (!isFederationVersion(version)) {
11
+ throw new GraphQLError(`Invalid version ${version} for the federation feature in @link direction on schema`, {
12
+ extensions: {
13
+ code: 'UNKNOWN_FEDERATION_LINK_VERSION',
14
+ },
15
+ });
16
+ }
17
+ if (version !== 'v1.0') {
18
+ const spec = federationSpecFactory[version]('', imports);
19
+ const namespacedSpec = federationSpecFactory[version]('federation__');
20
+ return {
21
+ directives: spec.directives.concat(namespacedSpec.directives),
22
+ types: spec.types.concat(namespacedSpec.types),
23
+ };
24
+ }
25
+ const spec = federationSpecFactory[version]('');
26
+ return {
27
+ directives: spec.directives.concat([tagDirective, inaccessibleDirective]),
28
+ types: spec.types,
29
+ };
30
+ }
31
+ const federationSpecFactory = {
32
+ 'v1.0': (prefix) => createTypeDefinitions(`
33
+ directive @key(
34
+ fields: _FieldSet!
35
+ resolvable: Boolean = true
36
+ ) repeatable on OBJECT | INTERFACE
37
+ directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
38
+ directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
39
+ directive @external on OBJECT | FIELD_DEFINITION
40
+ directive @extends on OBJECT | INTERFACE
41
+ # @override is not supported in v1 but somehow it's supported by Apollo Composition
42
+ directive @override(from: String!) on FIELD_DEFINITION
43
+ scalar _FieldSet
44
+ `, prefix),
45
+ 'v2.0': (prefix, imports) => createTypeDefinitions(`
46
+ directive @key(
47
+ fields: FieldSet!
48
+ resolvable: Boolean = true
49
+ ) repeatable on OBJECT | INTERFACE
50
+ directive @requires(fields: FieldSet!) on FIELD_DEFINITION
51
+ directive @provides(fields: FieldSet!) on FIELD_DEFINITION
52
+ directive @external on OBJECT | FIELD_DEFINITION
53
+ directive @shareable on FIELD_DEFINITION | OBJECT
54
+ directive @extends on OBJECT | INTERFACE
55
+ directive @override(from: String!) on FIELD_DEFINITION
56
+ directive @inaccessible on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ENUM | ENUM_VALUE | SCALAR | INPUT_OBJECT | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION
57
+ directive @tag(
58
+ name: String!
59
+ ) repeatable on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION
60
+ scalar FieldSet
61
+ `, prefix, imports),
62
+ 'v2.1': (prefix, imports) => createTypeDefinitions(`
63
+ directive @composeDirective(name: String!) repeatable on SCHEMA
64
+ directive @extends on OBJECT | INTERFACE
65
+ directive @external on OBJECT | FIELD_DEFINITION
66
+ directive @key(
67
+ fields: FieldSet!
68
+ resolvable: Boolean = true
69
+ ) repeatable on OBJECT | INTERFACE
70
+ directive @inaccessible on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ENUM | ENUM_VALUE | SCALAR | INPUT_OBJECT | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION
71
+ directive @override(from: String!) on FIELD_DEFINITION
72
+ directive @provides(fields: FieldSet!) on FIELD_DEFINITION
73
+ directive @requires(fields: FieldSet!) on FIELD_DEFINITION
74
+ directive @shareable on FIELD_DEFINITION | OBJECT
75
+ directive @tag(
76
+ name: String!
77
+ ) repeatable on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION
78
+ scalar FieldSet
79
+ `, prefix, imports),
80
+ 'v2.2': (prefix, imports) => createTypeDefinitions(`
81
+ directive @composeDirective(name: String!) repeatable on SCHEMA
82
+ directive @extends on OBJECT | INTERFACE
83
+ directive @external on OBJECT | FIELD_DEFINITION
84
+ directive @key(
85
+ fields: FieldSet!
86
+ resolvable: Boolean = true
87
+ ) repeatable on OBJECT | INTERFACE
88
+ directive @inaccessible on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ENUM | ENUM_VALUE | SCALAR | INPUT_OBJECT | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION
89
+ directive @override(from: String!) on FIELD_DEFINITION
90
+ directive @provides(fields: FieldSet!) on FIELD_DEFINITION
91
+ directive @requires(fields: FieldSet!) on FIELD_DEFINITION
92
+ directive @shareable repeatable on FIELD_DEFINITION | OBJECT
93
+ directive @tag(
94
+ name: String!
95
+ ) repeatable on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION
96
+ scalar FieldSet
97
+ `, prefix, imports),
98
+ 'v2.3': (prefix, imports) => createTypeDefinitions(`
99
+ directive @composeDirective(name: String!) repeatable on SCHEMA
100
+ directive @extends on OBJECT | INTERFACE
101
+ directive @external on OBJECT | FIELD_DEFINITION
102
+ directive @key(
103
+ fields: FieldSet!
104
+ resolvable: Boolean = true
105
+ ) repeatable on OBJECT | INTERFACE
106
+ directive @inaccessible on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ENUM | ENUM_VALUE | SCALAR | INPUT_OBJECT | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION
107
+ directive @interfaceObject on OBJECT
108
+ directive @override(from: String!) on FIELD_DEFINITION
109
+ directive @provides(fields: FieldSet!) on FIELD_DEFINITION
110
+ directive @requires(fields: FieldSet!) on FIELD_DEFINITION
111
+ directive @shareable repeatable on FIELD_DEFINITION | OBJECT
112
+ directive @tag(
113
+ name: String!
114
+ ) repeatable on FIELD_DEFINITION | INTERFACE | OBJECT | UNION | ARGUMENT_DEFINITION | SCALAR | ENUM | ENUM_VALUE | INPUT_OBJECT | INPUT_FIELD_DEFINITION
115
+ scalar FieldSet
116
+ `, prefix, imports),
117
+ };
118
+ function createTypeDefinitions(doc, prefix, imports) {
119
+ const shouldFilter = !!imports;
120
+ const toInclude = new Set(imports?.map(i => i.name.replace(/^@/, '')));
121
+ const docAST = parse(doc, {
122
+ noLocation: true,
123
+ });
124
+ if (!imports?.length ||
125
+ toInclude.has('key') ||
126
+ toInclude.has('requires') ||
127
+ toInclude.has('provides')) {
128
+ toInclude.add('FieldSet');
129
+ toInclude.add('federation__FieldSet');
130
+ }
131
+ const directives = [];
132
+ const types = [];
133
+ for (const node of docAST.definitions) {
134
+ if (isDirectiveDefinitionNode(node)) {
135
+ directives.push(applyPrefix(node, prefix));
136
+ }
137
+ else {
138
+ types.push(applyPrefix(node, prefix));
139
+ }
140
+ }
141
+ return {
142
+ directives: directives.filter(d => !specifiedDirectives.some(sd => sd.name === d.name.value) &&
143
+ (!shouldFilter || toInclude.has(d.name.value))),
144
+ types: types.filter(t => toInclude.has(t.name.value)),
145
+ };
146
+ }
147
+ function isDirectiveDefinitionNode(node) {
148
+ return node.kind === Kind.DIRECTIVE_DEFINITION;
149
+ }
150
+ function applyPrefix(node, prefix) {
151
+ if (prefix.length === 0) {
152
+ return node;
153
+ }
154
+ node.name.value = `${prefix}${node.name.value}`;
155
+ if (isDirectiveDefinitionNode(node)) {
156
+ node.arguments?.forEach(arg => {
157
+ const nameNode = resolveNamedType(arg.type);
158
+ if (!specifiedScalarTypes.some(t => t.name === nameNode.value)) {
159
+ nameNode.value = `${prefix}${nameNode.value}`;
160
+ }
161
+ });
162
+ }
163
+ return node;
164
+ }
165
+ function resolveNamedType(node) {
166
+ if (node.kind === Kind.LIST_TYPE) {
167
+ return resolveNamedType(node.type);
168
+ }
169
+ if (node.kind === Kind.NON_NULL_TYPE) {
170
+ return resolveNamedType(node.type);
171
+ }
172
+ return node.name;
173
+ }
174
+ export function isFederationLink(link) {
175
+ return link.identity === 'https://specs.apollo.dev/federation';
176
+ }
177
+ export function detectFederationVersion(typeDefs) {
178
+ for (const definition of typeDefs.definitions) {
179
+ if (definition.kind === Kind.SCHEMA_EXTENSION || definition.kind === Kind.SCHEMA_DEFINITION) {
180
+ const links = definition.directives?.filter(directive => directive.name.value === 'link');
181
+ if (links?.length) {
182
+ const parsedLinks = links.map(l => {
183
+ const url = l.arguments?.find(a => a.name.value === 'url');
184
+ const importArg = l.arguments?.find(a => a.name.value === 'import');
185
+ if (!url) {
186
+ throw new Error('Invalid @link directive');
187
+ }
188
+ return parseLink(url.value.value, importArg ? print(importArg.value) : '[]');
189
+ });
190
+ const fedLink = parsedLinks.find(l => l.identity === 'https://specs.apollo.dev/federation');
191
+ if (fedLink?.version) {
192
+ if (!isFederationVersion(fedLink.version)) {
193
+ throw new Error(`Unsupported federation version: ${fedLink.version}`);
194
+ }
195
+ return {
196
+ version: fedLink.version,
197
+ imports: fedLink.imports,
198
+ };
199
+ }
200
+ }
201
+ }
202
+ }
203
+ return { version: 'v1.0', imports: [] };
204
+ }
@@ -0,0 +1,7 @@
1
+ import { parse } from 'graphql';
2
+ import { isDirectiveDefinition } from '../graphql/helpers.js';
3
+ export const sdl = `
4
+ directive @inaccessible on FIELD_DEFINITION | OBJECT | INTERFACE | UNION | ENUM | ENUM_VALUE | SCALAR | INPUT_OBJECT | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION
5
+ `;
6
+ export const typeDefs = parse(sdl);
7
+ export const directive = typeDefs.definitions.filter(isDirectiveDefinition)[0];
@@ -0,0 +1,32 @@
1
+ export const sdl = `
2
+ directive @join__enumValue(graph: join__Graph!) repeatable on ENUM_VALUE
3
+
4
+ directive @join__field(
5
+ graph: join__Graph
6
+ requires: join__FieldSet
7
+ provides: join__FieldSet
8
+ type: String
9
+ external: Boolean
10
+ override: String
11
+ usedOverridden: Boolean
12
+ ) repeatable on FIELD_DEFINITION | INPUT_FIELD_DEFINITION
13
+
14
+ directive @join__graph(name: String!, url: String!) on ENUM_VALUE
15
+
16
+ directive @join__implements(
17
+ graph: join__Graph!
18
+ interface: String!
19
+ ) repeatable on OBJECT | INTERFACE
20
+
21
+ directive @join__type(
22
+ graph: join__Graph!
23
+ key: join__FieldSet
24
+ extension: Boolean! = false
25
+ resolvable: Boolean! = true
26
+ isInterfaceObject: Boolean! = false
27
+ ) repeatable on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT | SCALAR
28
+
29
+ directive @join__unionMember(graph: join__Graph!, member: String!) repeatable on UNION
30
+
31
+ scalar join__FieldSet
32
+ `;