@gqlkit-ts/cli 0.0.1 → 0.1.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 (325) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auto-type-generator/auto-type-generator.d.ts +46 -0
  3. package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -0
  4. package/dist/auto-type-generator/auto-type-generator.js +353 -0
  5. package/dist/auto-type-generator/auto-type-generator.js.map +1 -0
  6. package/dist/auto-type-generator/auto-type-generator.test.d.ts +2 -0
  7. package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +1 -0
  8. package/dist/auto-type-generator/auto-type-generator.test.js +613 -0
  9. package/dist/auto-type-generator/auto-type-generator.test.js.map +1 -0
  10. package/dist/auto-type-generator/index.d.ts +4 -0
  11. package/dist/auto-type-generator/index.d.ts.map +1 -0
  12. package/dist/auto-type-generator/index.js +3 -0
  13. package/dist/auto-type-generator/index.js.map +1 -0
  14. package/dist/auto-type-generator/name-collision-validator.d.ts +17 -0
  15. package/dist/auto-type-generator/name-collision-validator.d.ts.map +1 -0
  16. package/dist/auto-type-generator/name-collision-validator.js +68 -0
  17. package/dist/auto-type-generator/name-collision-validator.js.map +1 -0
  18. package/dist/auto-type-generator/name-collision-validator.test.d.ts +2 -0
  19. package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +1 -0
  20. package/dist/auto-type-generator/name-collision-validator.test.js +358 -0
  21. package/dist/auto-type-generator/name-collision-validator.test.js.map +1 -0
  22. package/dist/auto-type-generator/naming-convention.d.ts +40 -0
  23. package/dist/auto-type-generator/naming-convention.d.ts.map +1 -0
  24. package/dist/auto-type-generator/naming-convention.js +59 -0
  25. package/dist/auto-type-generator/naming-convention.js.map +1 -0
  26. package/dist/auto-type-generator/naming-convention.test.d.ts +2 -0
  27. package/dist/auto-type-generator/naming-convention.test.d.ts.map +1 -0
  28. package/dist/auto-type-generator/naming-convention.test.js +132 -0
  29. package/dist/auto-type-generator/naming-convention.test.js.map +1 -0
  30. package/dist/cli.d.ts +2 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +11 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/commands/gen.d.ts +32 -0
  35. package/dist/commands/gen.d.ts.map +1 -0
  36. package/dist/commands/gen.js +101 -0
  37. package/dist/commands/gen.js.map +1 -0
  38. package/dist/commands/gen.test.d.ts +2 -0
  39. package/dist/commands/gen.test.d.ts.map +1 -0
  40. package/dist/commands/gen.test.js +226 -0
  41. package/dist/commands/gen.test.js.map +1 -0
  42. package/dist/commands/main.d.ts +12 -0
  43. package/dist/commands/main.d.ts.map +1 -0
  44. package/dist/commands/main.js +5 -0
  45. package/dist/commands/main.js.map +1 -0
  46. package/dist/config/define-config.d.ts +26 -0
  47. package/dist/config/define-config.d.ts.map +1 -0
  48. package/dist/config/define-config.js +27 -0
  49. package/dist/config/define-config.js.map +1 -0
  50. package/dist/config/index.d.ts +3 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +2 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/config/types.d.ts +131 -0
  55. package/dist/config/types.d.ts.map +1 -0
  56. package/dist/config/types.js +2 -0
  57. package/dist/config/types.js.map +1 -0
  58. package/dist/config-loader/index.d.ts +3 -0
  59. package/dist/config-loader/index.d.ts.map +1 -0
  60. package/dist/config-loader/index.js +2 -0
  61. package/dist/config-loader/index.js.map +1 -0
  62. package/dist/config-loader/loader.d.ts +50 -0
  63. package/dist/config-loader/loader.d.ts.map +1 -0
  64. package/dist/config-loader/loader.js +78 -0
  65. package/dist/config-loader/loader.js.map +1 -0
  66. package/dist/config-loader/loader.test.d.ts +2 -0
  67. package/dist/config-loader/loader.test.d.ts.map +1 -0
  68. package/dist/config-loader/loader.test.js +123 -0
  69. package/dist/config-loader/loader.test.js.map +1 -0
  70. package/dist/config-loader/validator.d.ts +13 -0
  71. package/dist/config-loader/validator.d.ts.map +1 -0
  72. package/dist/config-loader/validator.js +497 -0
  73. package/dist/config-loader/validator.js.map +1 -0
  74. package/dist/config-loader/validator.test.d.ts +2 -0
  75. package/dist/config-loader/validator.test.d.ts.map +1 -0
  76. package/dist/config-loader/validator.test.js +846 -0
  77. package/dist/config-loader/validator.test.js.map +1 -0
  78. package/dist/gen-orchestrator/golden.test.d.ts +2 -0
  79. package/dist/gen-orchestrator/golden.test.d.ts.map +1 -0
  80. package/dist/gen-orchestrator/golden.test.js +102 -0
  81. package/dist/gen-orchestrator/golden.test.js.map +1 -0
  82. package/dist/gen-orchestrator/hook-executor/hook-executor.d.ts +25 -0
  83. package/dist/gen-orchestrator/hook-executor/hook-executor.d.ts.map +1 -0
  84. package/dist/gen-orchestrator/hook-executor/hook-executor.js +68 -0
  85. package/dist/gen-orchestrator/hook-executor/hook-executor.js.map +1 -0
  86. package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +2 -0
  87. package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +1 -0
  88. package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +167 -0
  89. package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +1 -0
  90. package/dist/gen-orchestrator/orchestrator.d.ts +30 -0
  91. package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -0
  92. package/dist/gen-orchestrator/orchestrator.js +407 -0
  93. package/dist/gen-orchestrator/orchestrator.js.map +1 -0
  94. package/dist/gen-orchestrator/reporter/diagnostic-reporter.d.ts +9 -0
  95. package/dist/gen-orchestrator/reporter/diagnostic-reporter.d.ts.map +1 -0
  96. package/dist/gen-orchestrator/reporter/diagnostic-reporter.js +32 -0
  97. package/dist/gen-orchestrator/reporter/diagnostic-reporter.js.map +1 -0
  98. package/dist/gen-orchestrator/reporter/progress-reporter.d.ts +19 -0
  99. package/dist/gen-orchestrator/reporter/progress-reporter.d.ts.map +1 -0
  100. package/dist/gen-orchestrator/reporter/progress-reporter.js +38 -0
  101. package/dist/gen-orchestrator/reporter/progress-reporter.js.map +1 -0
  102. package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +2 -0
  103. package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +1 -0
  104. package/dist/gen-orchestrator/reporter/progress-reporter.test.js +74 -0
  105. package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +1 -0
  106. package/dist/gen-orchestrator/writer/file-writer.d.ts +13 -0
  107. package/dist/gen-orchestrator/writer/file-writer.d.ts.map +1 -0
  108. package/dist/gen-orchestrator/writer/file-writer.js +22 -0
  109. package/dist/gen-orchestrator/writer/file-writer.js.map +1 -0
  110. package/dist/index.d.ts +3 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +2 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/resolver-extractor/extract-resolvers.d.ts +40 -0
  115. package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -0
  116. package/dist/resolver-extractor/extract-resolvers.js +2 -0
  117. package/dist/resolver-extractor/extract-resolvers.js.map +1 -0
  118. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +50 -0
  119. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -0
  120. package/dist/resolver-extractor/extractor/define-api-extractor.js +685 -0
  121. package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -0
  122. package/dist/resolver-extractor/index.d.ts +5 -0
  123. package/dist/resolver-extractor/index.d.ts.map +1 -0
  124. package/dist/resolver-extractor/index.js +2 -0
  125. package/dist/resolver-extractor/index.js.map +1 -0
  126. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +25 -0
  127. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -0
  128. package/dist/resolver-extractor/validator/abstract-resolver-validator.js +172 -0
  129. package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -0
  130. package/dist/resolver-extractor/validator/only-validator.d.ts +61 -0
  131. package/dist/resolver-extractor/validator/only-validator.d.ts.map +1 -0
  132. package/dist/resolver-extractor/validator/only-validator.js +76 -0
  133. package/dist/resolver-extractor/validator/only-validator.js.map +1 -0
  134. package/dist/resolver-extractor/validator/only-validator.test.d.ts +8 -0
  135. package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +1 -0
  136. package/dist/resolver-extractor/validator/only-validator.test.js +352 -0
  137. package/dist/resolver-extractor/validator/only-validator.test.js.map +1 -0
  138. package/dist/schema-generator/builder/ast-builder.d.ts +7 -0
  139. package/dist/schema-generator/builder/ast-builder.d.ts.map +1 -0
  140. package/dist/schema-generator/builder/ast-builder.js +417 -0
  141. package/dist/schema-generator/builder/ast-builder.js.map +1 -0
  142. package/dist/schema-generator/builder/ast-builder.test.d.ts +2 -0
  143. package/dist/schema-generator/builder/ast-builder.test.d.ts.map +1 -0
  144. package/dist/schema-generator/builder/ast-builder.test.js +469 -0
  145. package/dist/schema-generator/builder/ast-builder.test.js.map +1 -0
  146. package/dist/schema-generator/emitter/code-emitter.d.ts +7 -0
  147. package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -0
  148. package/dist/schema-generator/emitter/code-emitter.js +201 -0
  149. package/dist/schema-generator/emitter/code-emitter.js.map +1 -0
  150. package/dist/schema-generator/emitter/sdl-emitter.d.ts +7 -0
  151. package/dist/schema-generator/emitter/sdl-emitter.d.ts.map +1 -0
  152. package/dist/schema-generator/emitter/sdl-emitter.js +11 -0
  153. package/dist/schema-generator/emitter/sdl-emitter.js.map +1 -0
  154. package/dist/schema-generator/generate-schema.d.ts +26 -0
  155. package/dist/schema-generator/generate-schema.d.ts.map +1 -0
  156. package/dist/schema-generator/generate-schema.js +76 -0
  157. package/dist/schema-generator/generate-schema.js.map +1 -0
  158. package/dist/schema-generator/index.d.ts +4 -0
  159. package/dist/schema-generator/index.d.ts.map +1 -0
  160. package/dist/schema-generator/index.js +2 -0
  161. package/dist/schema-generator/index.js.map +1 -0
  162. package/dist/schema-generator/integrator/result-integrator.d.ts +93 -0
  163. package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -0
  164. package/dist/schema-generator/integrator/result-integrator.js +396 -0
  165. package/dist/schema-generator/integrator/result-integrator.js.map +1 -0
  166. package/dist/schema-generator/pruner/schema-pruner.d.ts +16 -0
  167. package/dist/schema-generator/pruner/schema-pruner.d.ts.map +1 -0
  168. package/dist/schema-generator/pruner/schema-pruner.js +66 -0
  169. package/dist/schema-generator/pruner/schema-pruner.js.map +1 -0
  170. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +24 -0
  171. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -0
  172. package/dist/schema-generator/resolver-collector/resolver-collector.js +61 -0
  173. package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -0
  174. package/dist/shared/constants.d.ts +70 -0
  175. package/dist/shared/constants.d.ts.map +1 -0
  176. package/dist/shared/constants.js +128 -0
  177. package/dist/shared/constants.js.map +1 -0
  178. package/dist/shared/default-value-detector.d.ts +40 -0
  179. package/dist/shared/default-value-detector.d.ts.map +1 -0
  180. package/dist/shared/default-value-detector.js +124 -0
  181. package/dist/shared/default-value-detector.js.map +1 -0
  182. package/dist/shared/diagnostics.d.ts +4 -0
  183. package/dist/shared/diagnostics.d.ts.map +1 -0
  184. package/dist/shared/diagnostics.js +25 -0
  185. package/dist/shared/diagnostics.js.map +1 -0
  186. package/dist/shared/directive-definition-extractor.d.ts +64 -0
  187. package/dist/shared/directive-definition-extractor.d.ts.map +1 -0
  188. package/dist/shared/directive-definition-extractor.js +399 -0
  189. package/dist/shared/directive-definition-extractor.js.map +1 -0
  190. package/dist/shared/directive-detector.d.ts +102 -0
  191. package/dist/shared/directive-detector.d.ts.map +1 -0
  192. package/dist/shared/directive-detector.js +422 -0
  193. package/dist/shared/directive-detector.js.map +1 -0
  194. package/dist/shared/file-scanner.d.ts +25 -0
  195. package/dist/shared/file-scanner.d.ts.map +1 -0
  196. package/dist/shared/file-scanner.js +99 -0
  197. package/dist/shared/file-scanner.js.map +1 -0
  198. package/dist/shared/file-scanner.test.d.ts +2 -0
  199. package/dist/shared/file-scanner.test.d.ts.map +1 -0
  200. package/dist/shared/file-scanner.test.js +138 -0
  201. package/dist/shared/file-scanner.test.js.map +1 -0
  202. package/dist/shared/index.d.ts +10 -0
  203. package/dist/shared/index.d.ts.map +1 -0
  204. package/dist/shared/index.js +8 -0
  205. package/dist/shared/index.js.map +1 -0
  206. package/dist/shared/inline-object-extractor.d.ts +13 -0
  207. package/dist/shared/inline-object-extractor.d.ts.map +1 -0
  208. package/dist/shared/inline-object-extractor.js +65 -0
  209. package/dist/shared/inline-object-extractor.js.map +1 -0
  210. package/dist/shared/inline-object-utils.d.ts +7 -0
  211. package/dist/shared/inline-object-utils.d.ts.map +1 -0
  212. package/dist/shared/inline-object-utils.js +23 -0
  213. package/dist/shared/inline-object-utils.js.map +1 -0
  214. package/dist/shared/interface-detector.d.ts +22 -0
  215. package/dist/shared/interface-detector.d.ts.map +1 -0
  216. package/dist/shared/interface-detector.js +90 -0
  217. package/dist/shared/interface-detector.js.map +1 -0
  218. package/dist/shared/interface-validator.d.ts +9 -0
  219. package/dist/shared/interface-validator.d.ts.map +1 -0
  220. package/dist/shared/interface-validator.js +152 -0
  221. package/dist/shared/interface-validator.js.map +1 -0
  222. package/dist/shared/interface-validator.test.d.ts +2 -0
  223. package/dist/shared/interface-validator.test.d.ts.map +1 -0
  224. package/dist/shared/interface-validator.test.js +145 -0
  225. package/dist/shared/interface-validator.test.js.map +1 -0
  226. package/dist/shared/metadata-detector.d.ts +65 -0
  227. package/dist/shared/metadata-detector.d.ts.map +1 -0
  228. package/dist/shared/metadata-detector.js +333 -0
  229. package/dist/shared/metadata-detector.js.map +1 -0
  230. package/dist/shared/program-factory.d.ts +14 -0
  231. package/dist/shared/program-factory.d.ts.map +1 -0
  232. package/dist/shared/program-factory.js +29 -0
  233. package/dist/shared/program-factory.js.map +1 -0
  234. package/dist/shared/source-location.d.ts +11 -0
  235. package/dist/shared/source-location.d.ts.map +1 -0
  236. package/dist/shared/source-location.js +15 -0
  237. package/dist/shared/source-location.js.map +1 -0
  238. package/dist/shared/tsconfig-loader.d.ts +13 -0
  239. package/dist/shared/tsconfig-loader.d.ts.map +1 -0
  240. package/dist/shared/tsconfig-loader.js +90 -0
  241. package/dist/shared/tsconfig-loader.js.map +1 -0
  242. package/dist/shared/tsdoc-parser.d.ts +12 -0
  243. package/dist/shared/tsdoc-parser.d.ts.map +1 -0
  244. package/dist/shared/tsdoc-parser.js +101 -0
  245. package/dist/shared/tsdoc-parser.js.map +1 -0
  246. package/dist/shared/type-converter.d.ts +3 -0
  247. package/dist/shared/type-converter.d.ts.map +1 -0
  248. package/dist/shared/type-converter.js +72 -0
  249. package/dist/shared/type-converter.js.map +1 -0
  250. package/dist/shared/typescript-utils.d.ts +55 -0
  251. package/dist/shared/typescript-utils.d.ts.map +1 -0
  252. package/dist/shared/typescript-utils.js +149 -0
  253. package/dist/shared/typescript-utils.js.map +1 -0
  254. package/dist/type-extractor/collector/result-collector.d.ts +7 -0
  255. package/dist/type-extractor/collector/result-collector.d.ts.map +1 -0
  256. package/dist/type-extractor/collector/result-collector.js +35 -0
  257. package/dist/type-extractor/collector/result-collector.js.map +1 -0
  258. package/dist/type-extractor/collector/scalar-collector.d.ts +108 -0
  259. package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -0
  260. package/dist/type-extractor/collector/scalar-collector.js +133 -0
  261. package/dist/type-extractor/collector/scalar-collector.js.map +1 -0
  262. package/dist/type-extractor/converter/field-eligibility.d.ts +34 -0
  263. package/dist/type-extractor/converter/field-eligibility.d.ts.map +1 -0
  264. package/dist/type-extractor/converter/field-eligibility.js +89 -0
  265. package/dist/type-extractor/converter/field-eligibility.js.map +1 -0
  266. package/dist/type-extractor/converter/graphql-converter.d.ts +7 -0
  267. package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -0
  268. package/dist/type-extractor/converter/graphql-converter.js +299 -0
  269. package/dist/type-extractor/converter/graphql-converter.js.map +1 -0
  270. package/dist/type-extractor/extract-types.d.ts +2 -0
  271. package/dist/type-extractor/extract-types.d.ts.map +1 -0
  272. package/dist/type-extractor/extract-types.js +2 -0
  273. package/dist/type-extractor/extract-types.js.map +1 -0
  274. package/dist/type-extractor/extractor/type-extractor.d.ts +27 -0
  275. package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -0
  276. package/dist/type-extractor/extractor/type-extractor.js +1116 -0
  277. package/dist/type-extractor/extractor/type-extractor.js.map +1 -0
  278. package/dist/type-extractor/index.d.ts +4 -0
  279. package/dist/type-extractor/index.d.ts.map +1 -0
  280. package/dist/type-extractor/index.js +2 -0
  281. package/dist/type-extractor/index.js.map +1 -0
  282. package/dist/type-extractor/types/diagnostics.d.ts +17 -0
  283. package/dist/type-extractor/types/diagnostics.d.ts.map +1 -0
  284. package/dist/type-extractor/types/diagnostics.js +2 -0
  285. package/dist/type-extractor/types/diagnostics.js.map +1 -0
  286. package/dist/type-extractor/types/graphql.d.ts +40 -0
  287. package/dist/type-extractor/types/graphql.d.ts.map +1 -0
  288. package/dist/type-extractor/types/graphql.js +2 -0
  289. package/dist/type-extractor/types/graphql.js.map +1 -0
  290. package/dist/type-extractor/types/index.d.ts +5 -0
  291. package/dist/type-extractor/types/index.d.ts.map +1 -0
  292. package/dist/type-extractor/types/index.js +2 -0
  293. package/dist/type-extractor/types/index.js.map +1 -0
  294. package/dist/type-extractor/types/typescript.d.ts +86 -0
  295. package/dist/type-extractor/types/typescript.d.ts.map +1 -0
  296. package/dist/type-extractor/types/typescript.js +2 -0
  297. package/dist/type-extractor/types/typescript.js.map +1 -0
  298. package/dist/type-extractor/types/typescript.test.d.ts +2 -0
  299. package/dist/type-extractor/types/typescript.test.d.ts.map +1 -0
  300. package/dist/type-extractor/types/typescript.test.js +287 -0
  301. package/dist/type-extractor/types/typescript.test.js.map +1 -0
  302. package/dist/type-extractor/validator/type-validator.d.ts +11 -0
  303. package/dist/type-extractor/validator/type-validator.d.ts.map +1 -0
  304. package/dist/type-extractor/validator/type-validator.js +53 -0
  305. package/dist/type-extractor/validator/type-validator.js.map +1 -0
  306. package/docs/configuration.md +163 -0
  307. package/docs/getting-started.md +117 -0
  308. package/docs/index.md +32 -0
  309. package/docs/integration/apollo.md +109 -0
  310. package/docs/integration/yoga.md +108 -0
  311. package/docs/schema/abstract-resolvers.md +146 -0
  312. package/docs/schema/directives.md +196 -0
  313. package/docs/schema/documentation.md +176 -0
  314. package/docs/schema/enums.md +162 -0
  315. package/docs/schema/fields.md +184 -0
  316. package/docs/schema/index.md +38 -0
  317. package/docs/schema/inputs.md +277 -0
  318. package/docs/schema/interfaces.md +178 -0
  319. package/docs/schema/objects.md +186 -0
  320. package/docs/schema/queries-mutations.md +205 -0
  321. package/docs/schema/scalars.md +194 -0
  322. package/docs/schema/unions.md +90 -0
  323. package/docs/what-is-gqlkit.md +22 -0
  324. package/package.json +59 -7
  325. package/README.md +0 -45
@@ -0,0 +1,146 @@
1
+ # Abstract Type Resolution
2
+
3
+ GraphQL abstract types (unions and interfaces) require runtime type resolution to determine the concrete type of returned values. gqlkit provides `defineResolveType` and `defineIsTypeOf` to handle this.
4
+
5
+ ## Overview
6
+
7
+ When a GraphQL query returns an abstract type, the server needs to determine which concrete type to use. There are two approaches:
8
+
9
+ | Approach | Defined On | Returns | Use Case |
10
+ |----------|------------|---------|----------|
11
+ | `resolveType` | Abstract type (union/interface) | Type name string | Single resolver decides the type |
12
+ | `isTypeOf` | Object type | Boolean | Each type checks if value matches |
13
+
14
+ ## Using resolveType
15
+
16
+ Define a `resolveType` resolver on a union or interface type to determine the concrete type.
17
+
18
+ ### Union Example
19
+
20
+ ```typescript
21
+ import { defineResolveType } from "../gqlkit";
22
+
23
+ export interface User {
24
+ id: string;
25
+ name: string;
26
+ }
27
+
28
+ export interface Post {
29
+ id: string;
30
+ title: string;
31
+ }
32
+
33
+ export type SearchResult = User | Post;
34
+
35
+ export const searchResultResolveType = defineResolveType<SearchResult>(
36
+ (value) => {
37
+ if ("name" in value) {
38
+ return "User";
39
+ }
40
+ return "Post";
41
+ }
42
+ );
43
+ ```
44
+
45
+ ### Interface Example
46
+
47
+ ```typescript
48
+ import { defineResolveType } from "../gqlkit";
49
+ import { type GqlInterface, type IDString } from "@gqlkit-ts/runtime";
50
+
51
+ export type Node = GqlInterface<{
52
+ id: IDString;
53
+ }>;
54
+
55
+ export const nodeResolveType = defineResolveType<Node>((value) => {
56
+ if ("name" in value) {
57
+ return "User";
58
+ }
59
+ if ("title" in value) {
60
+ return "Post";
61
+ }
62
+ throw new Error("Unknown Node type");
63
+ });
64
+ ```
65
+
66
+ ### Resolver Function Signature
67
+
68
+ ```typescript
69
+ (value: TAbstract, context: TContext, info: GraphQLResolveInfo) => string | Promise<string>
70
+ ```
71
+
72
+ | Argument | Description |
73
+ |----------|-------------|
74
+ | `value` | The resolved value to determine the type of |
75
+ | `context` | The context object |
76
+ | `info` | GraphQL resolve info |
77
+
78
+ ### Type Parameters
79
+
80
+ `defineResolveType<TAbstract>`:
81
+
82
+ | Parameter | Description |
83
+ |-----------|-------------|
84
+ | `TAbstract` | The abstract type (union or interface) to resolve |
85
+
86
+ ## Using isTypeOf
87
+
88
+ Define an `isTypeOf` resolver on an object type to check if a value is of that type.
89
+
90
+ ### Basic Usage
91
+
92
+ ```typescript
93
+ import { defineIsTypeOf } from "../gqlkit";
94
+
95
+ export interface Dog {
96
+ kind: string;
97
+ name: string;
98
+ breed: string;
99
+ }
100
+
101
+ export interface Cat {
102
+ kind: string;
103
+ name: string;
104
+ indoor: boolean;
105
+ }
106
+
107
+ export type Animal = Dog | Cat;
108
+
109
+ export const dogIsTypeOf = defineIsTypeOf<Dog>((value) => {
110
+ return (
111
+ typeof value === "object" &&
112
+ value !== null &&
113
+ "kind" in value &&
114
+ value.kind === "dog"
115
+ );
116
+ });
117
+
118
+ export const catIsTypeOf = defineIsTypeOf<Cat>((value) => {
119
+ return (
120
+ typeof value === "object" &&
121
+ value !== null &&
122
+ "kind" in value &&
123
+ value.kind === "cat"
124
+ );
125
+ });
126
+ ```
127
+
128
+ ### Resolver Function Signature
129
+
130
+ ```typescript
131
+ (value: unknown, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>
132
+ ```
133
+
134
+ | Argument | Description |
135
+ |----------|-------------|
136
+ | `value` | The value to check (typed as `unknown`) |
137
+ | `context` | The context object |
138
+ | `info` | GraphQL resolve info |
139
+
140
+ ### Type Parameters
141
+
142
+ `defineIsTypeOf<TObject>`:
143
+
144
+ | Parameter | Description |
145
+ |-----------|-------------|
146
+ | `TObject` | The object type to check against |
@@ -0,0 +1,196 @@
1
+ # Custom Directives
2
+
3
+ Define custom directives using the `GqlDirective` utility type and attach them using `GqlField` or `GqlObject`.
4
+
5
+ ## Defining Directives
6
+
7
+ ```typescript
8
+ // src/gqlkit/schema/directives.ts
9
+ import { type GqlDirective } from "@gqlkit-ts/runtime";
10
+
11
+ export type Role = "USER" | "ADMIN";
12
+
13
+ // Directive with typed arguments
14
+ export type AuthDirective<TArgs extends { role: Role[] }> = GqlDirective<
15
+ "auth",
16
+ TArgs,
17
+ "FIELD_DEFINITION"
18
+ >;
19
+
20
+ // Directive with multiple locations
21
+ export type CacheDirective<TArgs extends { maxAge: number }> = GqlDirective<
22
+ "cache",
23
+ TArgs,
24
+ ["FIELD_DEFINITION", "OBJECT"]
25
+ >;
26
+ ```
27
+
28
+ Generates:
29
+
30
+ ```graphql
31
+ directive @auth(role: [Role!]!) on FIELD_DEFINITION
32
+ directive @cache(maxAge: Float!) on FIELD_DEFINITION | OBJECT
33
+ ```
34
+
35
+ ## GqlDirective Type Parameters
36
+
37
+ `GqlDirective<Name, Args, Location>`:
38
+
39
+ | Parameter | Description |
40
+ |-----------|-------------|
41
+ | `Name` | The directive name (without `@`) |
42
+ | `Args` | The directive arguments type |
43
+ | `Location` | Where the directive can be used (single or array) |
44
+
45
+ ### Directive Locations
46
+
47
+ Common directive locations:
48
+
49
+ | Location | Description |
50
+ |----------|-------------|
51
+ | `FIELD_DEFINITION` | Object type fields |
52
+ | `OBJECT` | Object types |
53
+ | `INPUT_FIELD_DEFINITION` | Input type fields |
54
+ | `ARGUMENT_DEFINITION` | Field arguments |
55
+ | `ENUM_VALUE` | Enum values |
56
+ | `INTERFACE` | Interface types |
57
+
58
+ ## Attaching Directives to Fields
59
+
60
+ Use `GqlField` to attach directives to object type fields:
61
+
62
+ ```typescript
63
+ import { type GqlField, type IDString } from "@gqlkit-ts/runtime";
64
+ import { type AuthDirective } from "./directives.js";
65
+
66
+ export type User = {
67
+ id: IDString;
68
+ name: string;
69
+ // Field with directive
70
+ email: GqlField<string, { directives: [AuthDirective<{ role: ["ADMIN"] }>] }>;
71
+ // Nullable field with directive
72
+ phone: GqlField<string | null, { directives: [AuthDirective<{ role: ["USER"] }>] }>;
73
+ };
74
+ ```
75
+
76
+ Generates:
77
+
78
+ ```graphql
79
+ type User {
80
+ id: ID!
81
+ name: String!
82
+ email: String! @auth(role: [ADMIN])
83
+ phone: String @auth(role: [USER])
84
+ }
85
+ ```
86
+
87
+ ## Attaching Directives to Types
88
+
89
+ Use `GqlObject` to attach directives to type definitions:
90
+
91
+ ```typescript
92
+ import { type GqlObject, type IDString } from "@gqlkit-ts/runtime";
93
+ import { type CacheDirective } from "./directives.js";
94
+
95
+ export type Post = GqlObject<
96
+ {
97
+ id: IDString;
98
+ title: string;
99
+ },
100
+ { directives: [CacheDirective<{ maxAge: 60 }>] }
101
+ >;
102
+ ```
103
+
104
+ Generates:
105
+
106
+ ```graphql
107
+ type Post @cache(maxAge: 60) {
108
+ id: ID!
109
+ title: String!
110
+ }
111
+ ```
112
+
113
+ ## Attaching Directives to Query/Mutation Fields
114
+
115
+ Add a third type parameter to `defineQuery`, `defineMutation`, or `defineField`:
116
+
117
+ ```typescript
118
+ import { defineQuery } from "../gqlkit";
119
+ import type { NoArgs } from "@gqlkit-ts/runtime";
120
+ import { type AuthDirective } from "./directives.js";
121
+ import type { User } from "./user.js";
122
+
123
+ // Query field with directive
124
+ export const me = defineQuery<
125
+ NoArgs,
126
+ User,
127
+ [AuthDirective<{ role: ["USER"] }>]
128
+ >((_root, _args, ctx) => ctx.currentUser);
129
+ ```
130
+
131
+ Generates:
132
+
133
+ ```graphql
134
+ type Query {
135
+ me: User! @auth(role: [USER])
136
+ }
137
+ ```
138
+
139
+ ## Attaching Directives to Field Resolvers
140
+
141
+ ```typescript
142
+ import { defineField } from "../gqlkit";
143
+ import type { NoArgs } from "@gqlkit-ts/runtime";
144
+ import { type AuthDirective } from "./directives.js";
145
+
146
+ export const email = defineField<
147
+ User,
148
+ NoArgs,
149
+ string,
150
+ [AuthDirective<{ role: ["ADMIN"] }>]
151
+ >((parent) => parent.email);
152
+ ```
153
+
154
+ ## Multiple Directives
155
+
156
+ Attach multiple directives by adding them to the array:
157
+
158
+ ```typescript
159
+ export type Post = GqlObject<
160
+ {
161
+ id: IDString;
162
+ title: string;
163
+ },
164
+ {
165
+ directives: [
166
+ CacheDirective<{ maxAge: 60 }>,
167
+ AuthDirective<{ role: ["USER"] }>
168
+ ]
169
+ }
170
+ >;
171
+ ```
172
+
173
+ ## Combining with Other Options
174
+
175
+ Combine directives with `implements` and `defaultValue`:
176
+
177
+ ```typescript
178
+ export type Post = GqlObject<
179
+ {
180
+ id: IDString;
181
+ title: string;
182
+ createdAt: DateTime;
183
+ },
184
+ {
185
+ implements: [Node, Timestamped],
186
+ directives: [CacheDirective<{ maxAge: 60 }>]
187
+ }
188
+ >;
189
+
190
+ export type CreatePostInput = {
191
+ title: GqlField<string, {
192
+ defaultValue: "Untitled";
193
+ directives: [LengthDirective<{ min: 1; max: 200 }>];
194
+ }>;
195
+ };
196
+ ```
@@ -0,0 +1,176 @@
1
+ # Documentation
2
+
3
+ gqlkit extracts TSDoc/JSDoc comments and converts them to GraphQL descriptions.
4
+
5
+ ## Type Descriptions
6
+
7
+ Add descriptions to types using TSDoc/JSDoc comments:
8
+
9
+ ```typescript
10
+ /**
11
+ * A user in the system
12
+ */
13
+ export type User = {
14
+ /** Unique identifier */
15
+ id: IDString;
16
+ /** Display name */
17
+ name: string;
18
+ };
19
+ ```
20
+
21
+ Generates:
22
+
23
+ ```graphql
24
+ """
25
+ A user in the system
26
+
27
+ Defined in: src/gqlkit/schema/user.ts
28
+ """
29
+ type User {
30
+ """Unique identifier"""
31
+ id: ID!
32
+ """Display name"""
33
+ name: String!
34
+ }
35
+ ```
36
+
37
+ ## Field Descriptions
38
+
39
+ Add descriptions to individual fields:
40
+
41
+ ```typescript
42
+ export type User = {
43
+ /** Unique identifier for the user */
44
+ id: IDString;
45
+
46
+ /**
47
+ * The user's display name.
48
+ * This is shown in the UI and can be changed by the user.
49
+ */
50
+ name: string;
51
+
52
+ /** Email address (null if not verified) */
53
+ email: string | null;
54
+ };
55
+ ```
56
+
57
+ ## Resolver Descriptions
58
+
59
+ Add descriptions to Query, Mutation, and Field resolvers:
60
+
61
+ ```typescript
62
+ /** Get the currently authenticated user */
63
+ export const me = defineQuery<NoArgs, User | null>(
64
+ (_root, _args, ctx) => ctx.currentUser
65
+ );
66
+
67
+ /** Create a new user account */
68
+ export const createUser = defineMutation<{ input: CreateUserInput }, User>(
69
+ (_root, args, ctx) => ctx.db.createUser(args.input)
70
+ );
71
+
72
+ /** Get user's profile URL */
73
+ export const profileUrl = defineField<User, NoArgs, string>(
74
+ (parent) => `https://example.com/users/${parent.id}`
75
+ );
76
+ ```
77
+
78
+ ## @deprecated Directive
79
+
80
+ Mark fields and enum values as deprecated using the `@deprecated` JSDoc tag:
81
+
82
+ ### Deprecating Fields
83
+
84
+ ```typescript
85
+ export type User = {
86
+ id: IDString;
87
+ name: string;
88
+ /**
89
+ * Legacy username
90
+ * @deprecated Use `name` field instead
91
+ */
92
+ username: string | null;
93
+ };
94
+ ```
95
+
96
+ Generates:
97
+
98
+ ```graphql
99
+ type User {
100
+ id: ID!
101
+ name: String!
102
+ """Legacy username"""
103
+ username: String @deprecated(reason: "Use `name` field instead")
104
+ }
105
+ ```
106
+
107
+ ### Deprecating Enum Values
108
+
109
+ ```typescript
110
+ export enum UserStatus {
111
+ Active = "ACTIVE",
112
+ /**
113
+ * @deprecated Use `Inactive` instead
114
+ */
115
+ Pending = "PENDING",
116
+ Inactive = "INACTIVE",
117
+ }
118
+ ```
119
+
120
+ Generates:
121
+
122
+ ```graphql
123
+ enum UserStatus {
124
+ ACTIVE
125
+ PENDING @deprecated(reason: "Use `Inactive` instead")
126
+ INACTIVE
127
+ }
128
+ ```
129
+
130
+ ### Deprecating Resolvers
131
+
132
+ ```typescript
133
+ /**
134
+ * Get user by username
135
+ * @deprecated Use `user(id: ID!)` instead
136
+ */
137
+ export const userByUsername = defineQuery<{ username: string }, User | null>(
138
+ (_root, args, ctx) => ctx.db.findUserByUsername(args.username)
139
+ );
140
+ ```
141
+
142
+ ## Multi-line Descriptions
143
+
144
+ Multi-line comments are preserved:
145
+
146
+ ```typescript
147
+ /**
148
+ * Represents a blog post.
149
+ *
150
+ * Posts can be in draft or published state.
151
+ * Only published posts are visible to other users.
152
+ */
153
+ export type Post = {
154
+ id: IDString;
155
+ title: string;
156
+ content: string;
157
+ };
158
+ ```
159
+
160
+ Generates:
161
+
162
+ ```graphql
163
+ """
164
+ Represents a blog post.
165
+
166
+ Posts can be in draft or published state.
167
+ Only published posts are visible to other users.
168
+
169
+ Defined in: src/gqlkit/schema/post.ts
170
+ """
171
+ type Post {
172
+ id: ID!
173
+ title: String!
174
+ content: String!
175
+ }
176
+ ```
@@ -0,0 +1,162 @@
1
+ # Enum Types
2
+
3
+ gqlkit converts TypeScript string literal unions and enums to GraphQL enum types.
4
+
5
+ ## String Literal Unions
6
+
7
+ String literal unions are automatically converted to GraphQL enum types:
8
+
9
+ ```typescript
10
+ /**
11
+ * User account status
12
+ */
13
+ export type UserStatus = "ACTIVE" | "INACTIVE" | "PENDING";
14
+ ```
15
+
16
+ Generates:
17
+
18
+ ```graphql
19
+ """User account status"""
20
+ enum UserStatus {
21
+ ACTIVE
22
+ INACTIVE
23
+ PENDING
24
+ }
25
+ ```
26
+
27
+ ## TypeScript Enums
28
+
29
+ TypeScript string enums are also supported:
30
+
31
+ ```typescript
32
+ export enum UserStatus {
33
+ Active = "ACTIVE",
34
+ Inactive = "INACTIVE",
35
+ Pending = "PENDING",
36
+ }
37
+ ```
38
+
39
+ Generates:
40
+
41
+ ```graphql
42
+ enum UserStatus {
43
+ ACTIVE
44
+ INACTIVE
45
+ PENDING
46
+ }
47
+ ```
48
+
49
+ ## Deprecating Enum Values
50
+
51
+ Use the `@deprecated` JSDoc tag to mark enum values as deprecated:
52
+
53
+ ```typescript
54
+ export enum UserStatus {
55
+ Active = "ACTIVE",
56
+ /**
57
+ * @deprecated Use `Inactive` instead
58
+ */
59
+ Pending = "PENDING",
60
+ Inactive = "INACTIVE",
61
+ }
62
+ ```
63
+
64
+ For string literal unions, use a separate type with JSDoc:
65
+
66
+ ```typescript
67
+ /**
68
+ * User account status
69
+ */
70
+ export type UserStatus =
71
+ | "ACTIVE"
72
+ | /** @deprecated Use INACTIVE instead */ "PENDING"
73
+ | "INACTIVE";
74
+ ```
75
+
76
+ Generates:
77
+
78
+ ```graphql
79
+ enum UserStatus {
80
+ ACTIVE
81
+ PENDING @deprecated(reason: "Use INACTIVE instead")
82
+ INACTIVE
83
+ }
84
+ ```
85
+
86
+ ## Using Enums in Types
87
+
88
+ ```typescript
89
+ export type User = {
90
+ id: string;
91
+ name: string;
92
+ status: UserStatus;
93
+ };
94
+
95
+ export type UpdateUserInput = {
96
+ status: UserStatus | null;
97
+ };
98
+ ```
99
+
100
+ Generates:
101
+
102
+ ```graphql
103
+ type User {
104
+ id: String!
105
+ name: String!
106
+ status: UserStatus!
107
+ }
108
+
109
+ input UpdateUserInput {
110
+ status: UserStatus
111
+ }
112
+ ```
113
+
114
+ ## Invalid Enum Values
115
+
116
+ Enum values that are not valid GraphQL identifiers are automatically skipped with a warning. gqlkit converts enum values to `SCREAMING_SNAKE_CASE`, and the converted name must:
117
+
118
+ - Match the pattern `/^[_A-Za-z][_0-9A-Za-z]*$/`
119
+ - Not start with `__` (reserved for GraphQL introspection)
120
+
121
+ ### String Literal Unions
122
+
123
+ ```typescript
124
+ export type Status =
125
+ | "active" // ✅ Converts to ACTIVE
126
+ | "inProgress" // ✅ Converts to IN_PROGRESS
127
+ | "0pending" // ⚠️ Skipped: converts to 0PENDING (starts with number)
128
+ | "__internal"; // ⚠️ Skipped: converts to __INTERNAL (starts with __)
129
+ ```
130
+
131
+ Generates:
132
+
133
+ ```graphql
134
+ enum Status {
135
+ ACTIVE
136
+ IN_PROGRESS
137
+ }
138
+ ```
139
+
140
+ ### TypeScript Enums
141
+
142
+ ```typescript
143
+ export enum Priority {
144
+ HIGH = "HIGH", // ✅ Valid
145
+ MEDIUM = "MEDIUM", // ✅ Valid
146
+ LOW = "LOW", // ✅ Valid
147
+ "0INVALID" = "0INVALID", // ⚠️ Skipped: starts with number
148
+ __RESERVED = "__RESERVED", // ⚠️ Skipped: starts with __
149
+ }
150
+ ```
151
+
152
+ Generates:
153
+
154
+ ```graphql
155
+ enum Priority {
156
+ HIGH
157
+ MEDIUM
158
+ LOW
159
+ }
160
+ ```
161
+
162
+ When enum values are skipped, gqlkit outputs a warning with the original name, converted name, and location.