@aws-amplify/data-schema 0.15.0 → 0.16.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 (375) hide show
  1. package/{lib-esm/src → dist/cjs}/Authorization.js +149 -31
  2. package/dist/cjs/Authorization.js.map +1 -0
  3. package/{lib-esm/src → dist/cjs}/ClientSchema.js +3 -1
  4. package/dist/cjs/ClientSchema.js.map +1 -0
  5. package/{lib-esm/src → dist/cjs}/CombineSchema.js +3 -2
  6. package/dist/cjs/CombineSchema.js.map +1 -0
  7. package/{lib-esm/src → dist/cjs}/CustomOperation.js +7 -3
  8. package/dist/cjs/CustomOperation.js.map +1 -0
  9. package/{lib-esm/src → dist/cjs}/CustomType.js +3 -1
  10. package/dist/cjs/CustomType.js.map +1 -0
  11. package/{lib-esm/src → dist/cjs}/EnumType.js +3 -1
  12. package/dist/cjs/EnumType.js.map +1 -0
  13. package/{lib-esm/src → dist/cjs}/Handler.js +3 -1
  14. package/dist/cjs/Handler.js.map +1 -0
  15. package/{lib-esm/src → dist/cjs}/MappedTypes/CustomOperations.js +3 -1
  16. package/dist/cjs/MappedTypes/CustomOperations.js.map +1 -0
  17. package/dist/cjs/MappedTypes/ExtractNonModelTypes.js +4 -0
  18. package/dist/cjs/MappedTypes/ExtractNonModelTypes.js.map +1 -0
  19. package/dist/cjs/MappedTypes/ImplicitFieldInjector.js +4 -0
  20. package/dist/cjs/MappedTypes/ImplicitFieldInjector.js.map +1 -0
  21. package/{lib-esm/src → dist/cjs}/MappedTypes/MapSecondaryIndexes.js +3 -1
  22. package/dist/cjs/MappedTypes/MapSecondaryIndexes.js.map +1 -0
  23. package/{lib-esm/src → dist/cjs}/MappedTypes/ModelMetadata.js +3 -1
  24. package/dist/cjs/MappedTypes/ModelMetadata.js.map +1 -0
  25. package/dist/cjs/MappedTypes/ResolveFieldProperties.js +4 -0
  26. package/dist/cjs/MappedTypes/ResolveFieldProperties.js.map +1 -0
  27. package/{lib-esm/src → dist/cjs}/MappedTypes/ResolveSchema.js +3 -1
  28. package/dist/cjs/MappedTypes/ResolveSchema.js.map +1 -0
  29. package/{lib-esm/src → dist/cjs}/ModelField.js +8 -3
  30. package/dist/cjs/ModelField.js.map +1 -0
  31. package/{lib-esm/src → dist/cjs}/ModelIndex.js +3 -1
  32. package/dist/cjs/ModelIndex.js.map +1 -0
  33. package/{lib-esm/src → dist/cjs}/ModelRelationalField.js +7 -10
  34. package/dist/cjs/ModelRelationalField.js.map +1 -0
  35. package/{lib-esm/src → dist/cjs}/ModelSchema.js +10 -5
  36. package/dist/cjs/ModelSchema.js.map +1 -0
  37. package/{lib-esm/src → dist/cjs}/ModelType.js +8 -3
  38. package/dist/cjs/ModelType.js.map +1 -0
  39. package/{lib-esm/src → dist/cjs}/RefType.js +8 -5
  40. package/dist/cjs/RefType.js.map +1 -0
  41. package/{lib-esm/src → dist/cjs}/SchemaProcessor.js +15 -61
  42. package/dist/cjs/SchemaProcessor.js.map +1 -0
  43. package/{lib-esm/src/index.js → dist/cjs/a.js} +4 -4
  44. package/dist/cjs/a.js.map +1 -0
  45. package/dist/cjs/index.js +8 -0
  46. package/dist/cjs/index.js.map +1 -0
  47. package/{lib-esm/src → dist/cjs}/internals/index.js +3 -1
  48. package/dist/cjs/internals/index.js.map +1 -0
  49. package/dist/cjs/runtime/addSchemaToClient.js +17 -0
  50. package/dist/cjs/runtime/addSchemaToClient.js.map +1 -0
  51. package/dist/cjs/runtime/addSchemaToClientWithInstance.js +22 -0
  52. package/dist/cjs/runtime/addSchemaToClientWithInstance.js.map +1 -0
  53. package/dist/cjs/runtime/bridge-types.js +15 -0
  54. package/dist/cjs/runtime/bridge-types.js.map +1 -0
  55. package/dist/cjs/runtime/client/index.js +17 -0
  56. package/dist/cjs/runtime/client/index.js.map +1 -0
  57. package/dist/cjs/runtime/client/index.v3.js +7 -0
  58. package/dist/cjs/runtime/client/index.v3.js.map +1 -0
  59. package/dist/cjs/runtime/index.js +13 -0
  60. package/dist/cjs/runtime/index.js.map +1 -0
  61. package/dist/cjs/runtime/index.v3.js +13 -0
  62. package/dist/cjs/runtime/index.v3.js.map +1 -0
  63. package/dist/cjs/runtime/internals/APIClient.js +740 -0
  64. package/dist/cjs/runtime/internals/APIClient.js.map +1 -0
  65. package/dist/cjs/runtime/internals/clientUtils.js +29 -0
  66. package/dist/cjs/runtime/internals/clientUtils.js.map +1 -0
  67. package/dist/cjs/runtime/internals/generateCustomOperationsProperty.js +49 -0
  68. package/dist/cjs/runtime/internals/generateCustomOperationsProperty.js.map +1 -0
  69. package/dist/cjs/runtime/internals/index.js +21 -0
  70. package/dist/cjs/runtime/internals/index.js.map +1 -0
  71. package/dist/cjs/runtime/internals/operations/custom.js +356 -0
  72. package/dist/cjs/runtime/internals/operations/custom.js.map +1 -0
  73. package/dist/cjs/runtime/internals/operations/get.js +62 -0
  74. package/dist/cjs/runtime/internals/operations/get.js.map +1 -0
  75. package/dist/cjs/runtime/internals/operations/indexQuery.js +75 -0
  76. package/dist/cjs/runtime/internals/operations/indexQuery.js.map +1 -0
  77. package/dist/cjs/runtime/internals/operations/list.js +74 -0
  78. package/dist/cjs/runtime/internals/operations/list.js.map +1 -0
  79. package/dist/cjs/runtime/internals/operations/observeQuery.js +121 -0
  80. package/dist/cjs/runtime/internals/operations/observeQuery.js.map +1 -0
  81. package/dist/cjs/runtime/internals/operations/subscription.js +31 -0
  82. package/dist/cjs/runtime/internals/operations/subscription.js.map +1 -0
  83. package/dist/cjs/runtime/internals/server/generateModelsProperty.js +53 -0
  84. package/dist/cjs/runtime/internals/server/generateModelsProperty.js.map +1 -0
  85. package/dist/cjs/runtime/internals/server/index.js +8 -0
  86. package/dist/cjs/runtime/internals/server/index.js.map +1 -0
  87. package/dist/cjs/runtime/internals/utils/clientProperties/generateEnumsProperty.js +21 -0
  88. package/dist/cjs/runtime/internals/utils/clientProperties/generateEnumsProperty.js.map +1 -0
  89. package/dist/cjs/runtime/internals/utils/clientProperties/generateModelsProperty.js +45 -0
  90. package/dist/cjs/runtime/internals/utils/clientProperties/generateModelsProperty.js.map +1 -0
  91. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js +11 -0
  92. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js.map +1 -0
  93. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js +11 -0
  94. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js.map +1 -0
  95. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js +15 -0
  96. package/dist/cjs/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js.map +1 -0
  97. package/dist/cjs/runtime/utils/findIndexByFields.js +25 -0
  98. package/dist/cjs/runtime/utils/findIndexByFields.js.map +1 -0
  99. package/dist/cjs/runtime/utils/index.js +11 -0
  100. package/dist/cjs/runtime/utils/index.js.map +1 -0
  101. package/dist/cjs/runtime/utils/resolveOwnerFields.js +48 -0
  102. package/dist/cjs/runtime/utils/resolveOwnerFields.js.map +1 -0
  103. package/dist/cjs/runtime/utils/resolvePKFields.js +17 -0
  104. package/dist/cjs/runtime/utils/resolvePKFields.js.map +1 -0
  105. package/{lib-esm/src → dist/cjs}/util/Brand.js +3 -1
  106. package/dist/cjs/util/Brand.js.map +1 -0
  107. package/{lib-esm/src → dist/cjs}/util/IndexLimit.js +3 -1
  108. package/dist/cjs/util/IndexLimit.js.map +1 -0
  109. package/{lib-esm/src → dist/cjs}/util/SpreadTuple.js +3 -1
  110. package/dist/cjs/util/SpreadTuple.js.map +1 -0
  111. package/{lib-esm/src → dist/cjs}/util/index.js +3 -1
  112. package/dist/cjs/util/index.js.map +1 -0
  113. package/{lib-esm/src → dist/esm}/Authorization.d.ts +105 -31
  114. package/dist/esm/Authorization.mjs +446 -0
  115. package/dist/esm/Authorization.mjs.map +1 -0
  116. package/{lib-esm/src → dist/esm}/ClientSchema.d.ts +1 -2
  117. package/dist/esm/ClientSchema.mjs +2 -0
  118. package/dist/esm/ClientSchema.mjs.map +1 -0
  119. package/{lib-esm/src → dist/esm}/CombineSchema.d.ts +0 -1
  120. package/dist/esm/CombineSchema.mjs +39 -0
  121. package/dist/esm/CombineSchema.mjs.map +1 -0
  122. package/{lib-esm/src → dist/esm}/CustomOperation.d.ts +2 -3
  123. package/dist/esm/CustomOperation.mjs +67 -0
  124. package/dist/esm/CustomOperation.mjs.map +1 -0
  125. package/{lib-esm/src → dist/esm}/CustomType.d.ts +0 -1
  126. package/dist/esm/CustomType.mjs +13 -0
  127. package/dist/esm/CustomType.mjs.map +1 -0
  128. package/{lib-esm/src → dist/esm}/EnumType.d.ts +0 -1
  129. package/dist/esm/EnumType.mjs +16 -0
  130. package/dist/esm/EnumType.mjs.map +1 -0
  131. package/{lib-esm/src → dist/esm}/Handler.d.ts +0 -1
  132. package/dist/esm/Handler.mjs +48 -0
  133. package/dist/esm/Handler.mjs.map +1 -0
  134. package/{lib-esm/src → dist/esm}/MappedTypes/CustomOperations.d.ts +0 -1
  135. package/dist/esm/MappedTypes/CustomOperations.mjs +2 -0
  136. package/dist/esm/MappedTypes/CustomOperations.mjs.map +1 -0
  137. package/{lib-esm/src → dist/esm}/MappedTypes/ExtractNonModelTypes.d.ts +0 -1
  138. package/dist/esm/MappedTypes/ExtractNonModelTypes.mjs +2 -0
  139. package/dist/esm/MappedTypes/ExtractNonModelTypes.mjs.map +1 -0
  140. package/{lib-esm/src → dist/esm}/MappedTypes/ImplicitFieldInjector.d.ts +0 -1
  141. package/dist/esm/MappedTypes/ImplicitFieldInjector.mjs +2 -0
  142. package/dist/esm/MappedTypes/ImplicitFieldInjector.mjs.map +1 -0
  143. package/{lib-esm/src → dist/esm}/MappedTypes/MapSecondaryIndexes.d.ts +0 -1
  144. package/dist/esm/MappedTypes/MapSecondaryIndexes.mjs +2 -0
  145. package/dist/esm/MappedTypes/MapSecondaryIndexes.mjs.map +1 -0
  146. package/{lib-esm/src → dist/esm}/MappedTypes/ModelMetadata.d.ts +0 -1
  147. package/dist/esm/MappedTypes/ModelMetadata.mjs +2 -0
  148. package/dist/esm/MappedTypes/ModelMetadata.mjs.map +1 -0
  149. package/{lib-esm/src → dist/esm}/MappedTypes/ResolveFieldProperties.d.ts +0 -1
  150. package/dist/esm/MappedTypes/ResolveFieldProperties.mjs +2 -0
  151. package/dist/esm/MappedTypes/ResolveFieldProperties.mjs.map +1 -0
  152. package/{lib-esm/src → dist/esm}/MappedTypes/ResolveSchema.d.ts +0 -1
  153. package/dist/esm/MappedTypes/ResolveSchema.mjs +2 -0
  154. package/dist/esm/MappedTypes/ResolveSchema.mjs.map +1 -0
  155. package/{lib-esm/src → dist/esm}/ModelField.d.ts +2 -3
  156. package/dist/esm/ModelField.mjs +199 -0
  157. package/dist/esm/ModelField.mjs.map +1 -0
  158. package/{lib-esm/src → dist/esm}/ModelIndex.d.ts +0 -1
  159. package/dist/esm/ModelIndex.mjs +33 -0
  160. package/dist/esm/ModelIndex.mjs.map +1 -0
  161. package/{lib-esm/src → dist/esm}/ModelRelationalField.d.ts +3 -4
  162. package/dist/esm/ModelRelationalField.mjs +88 -0
  163. package/dist/esm/ModelRelationalField.mjs.map +1 -0
  164. package/{lib-esm/src → dist/esm}/ModelSchema.d.ts +3 -4
  165. package/dist/esm/ModelSchema.mjs +163 -0
  166. package/dist/esm/ModelSchema.mjs.map +1 -0
  167. package/{lib-esm/src → dist/esm}/ModelType.d.ts +2 -3
  168. package/dist/esm/ModelType.mjs +66 -0
  169. package/dist/esm/ModelType.mjs.map +1 -0
  170. package/{lib-esm/src → dist/esm}/RefType.d.ts +2 -3
  171. package/dist/esm/RefType.mjs +48 -0
  172. package/dist/esm/RefType.mjs.map +1 -0
  173. package/{lib-esm/src → dist/esm}/SchemaProcessor.d.ts +0 -1
  174. package/dist/esm/SchemaProcessor.mjs +926 -0
  175. package/dist/esm/SchemaProcessor.mjs.map +1 -0
  176. package/{lib-esm/src/index.d.ts → dist/esm/a.d.ts} +1 -3
  177. package/dist/esm/a.mjs +11 -0
  178. package/dist/esm/a.mjs.map +1 -0
  179. package/dist/esm/index.d.ts +4 -0
  180. package/dist/esm/index.mjs +3 -0
  181. package/dist/esm/index.mjs.map +1 -0
  182. package/dist/esm/internals/index.d.ts +2 -0
  183. package/dist/esm/internals/index.mjs +2 -0
  184. package/dist/esm/internals/index.mjs.map +1 -0
  185. package/dist/esm/runtime/addSchemaToClient.d.ts +3 -0
  186. package/dist/esm/runtime/addSchemaToClient.mjs +17 -0
  187. package/dist/esm/runtime/addSchemaToClient.mjs.map +1 -0
  188. package/dist/esm/runtime/addSchemaToClientWithInstance.d.ts +3 -0
  189. package/dist/esm/runtime/addSchemaToClientWithInstance.mjs +22 -0
  190. package/dist/esm/runtime/addSchemaToClientWithInstance.mjs.map +1 -0
  191. package/dist/esm/runtime/bridge-types.d.ts +281 -0
  192. package/dist/esm/runtime/bridge-types.mjs +13 -0
  193. package/dist/esm/runtime/bridge-types.mjs.map +1 -0
  194. package/dist/esm/runtime/client/index.d.ts +571 -0
  195. package/dist/esm/runtime/client/index.mjs +2 -0
  196. package/dist/esm/runtime/client/index.mjs.map +1 -0
  197. package/dist/esm/runtime/client/index.v3.d.ts +15 -0
  198. package/dist/esm/runtime/client/index.v3.mjs +2 -0
  199. package/dist/esm/runtime/client/index.v3.mjs.map +1 -0
  200. package/dist/esm/runtime/index.d.ts +4 -0
  201. package/dist/esm/runtime/index.mjs +4 -0
  202. package/dist/esm/runtime/index.mjs.map +1 -0
  203. package/dist/esm/runtime/index.v3.d.ts +4 -0
  204. package/dist/esm/runtime/index.v3.mjs +4 -0
  205. package/dist/esm/runtime/index.v3.mjs.map +1 -0
  206. package/dist/esm/runtime/internals/APIClient.d.ts +125 -0
  207. package/dist/esm/runtime/internals/APIClient.mjs +728 -0
  208. package/dist/esm/runtime/internals/APIClient.mjs.map +1 -0
  209. package/dist/esm/runtime/internals/clientUtils.d.ts +6 -0
  210. package/dist/esm/runtime/internals/clientUtils.mjs +26 -0
  211. package/dist/esm/runtime/internals/clientUtils.mjs.map +1 -0
  212. package/dist/esm/runtime/internals/generateCustomOperationsProperty.d.ts +8 -0
  213. package/dist/esm/runtime/internals/generateCustomOperationsProperty.mjs +44 -0
  214. package/dist/esm/runtime/internals/generateCustomOperationsProperty.mjs.map +1 -0
  215. package/dist/esm/runtime/internals/index.d.ts +6 -0
  216. package/dist/esm/runtime/internals/index.mjs +7 -0
  217. package/dist/esm/runtime/internals/index.mjs.map +1 -0
  218. package/dist/esm/runtime/internals/operations/custom.d.ts +61 -0
  219. package/dist/esm/runtime/internals/operations/custom.mjs +354 -0
  220. package/dist/esm/runtime/internals/operations/custom.mjs.map +1 -0
  221. package/dist/esm/runtime/internals/operations/get.d.ts +3 -0
  222. package/dist/esm/runtime/internals/operations/get.mjs +60 -0
  223. package/dist/esm/runtime/internals/operations/get.mjs.map +1 -0
  224. package/dist/esm/runtime/internals/operations/indexQuery.d.ts +7 -0
  225. package/dist/esm/runtime/internals/operations/indexQuery.mjs +73 -0
  226. package/dist/esm/runtime/internals/operations/indexQuery.mjs.map +1 -0
  227. package/dist/esm/runtime/internals/operations/list.d.ts +2 -0
  228. package/dist/esm/runtime/internals/operations/list.mjs +72 -0
  229. package/dist/esm/runtime/internals/operations/list.mjs.map +1 -0
  230. package/dist/esm/runtime/internals/operations/observeQuery.d.ts +3 -0
  231. package/dist/esm/runtime/internals/operations/observeQuery.mjs +120 -0
  232. package/dist/esm/runtime/internals/operations/observeQuery.mjs.map +1 -0
  233. package/dist/esm/runtime/internals/operations/subscription.d.ts +3 -0
  234. package/dist/esm/runtime/internals/operations/subscription.mjs +29 -0
  235. package/dist/esm/runtime/internals/operations/subscription.mjs.map +1 -0
  236. package/dist/esm/runtime/internals/server/generateModelsProperty.d.ts +3 -0
  237. package/dist/esm/runtime/internals/server/generateModelsProperty.mjs +51 -0
  238. package/dist/esm/runtime/internals/server/generateModelsProperty.mjs.map +1 -0
  239. package/dist/esm/runtime/internals/server/index.d.ts +1 -0
  240. package/dist/esm/runtime/internals/server/index.mjs +2 -0
  241. package/dist/esm/runtime/internals/server/index.mjs.map +1 -0
  242. package/dist/esm/runtime/internals/utils/clientProperties/generateEnumsProperty.d.ts +3 -0
  243. package/dist/esm/runtime/internals/utils/clientProperties/generateEnumsProperty.mjs +18 -0
  244. package/dist/esm/runtime/internals/utils/clientProperties/generateEnumsProperty.mjs.map +1 -0
  245. package/dist/esm/runtime/internals/utils/clientProperties/generateModelsProperty.d.ts +3 -0
  246. package/dist/esm/runtime/internals/utils/clientProperties/generateModelsProperty.mjs +43 -0
  247. package/dist/esm/runtime/internals/utils/clientProperties/generateModelsProperty.mjs.map +1 -0
  248. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.d.ts +2 -0
  249. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs +8 -0
  250. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs.map +1 -0
  251. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.d.ts +8 -0
  252. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs +8 -0
  253. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs.map +1 -0
  254. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.d.ts +2 -0
  255. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs +12 -0
  256. package/dist/esm/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs.map +1 -0
  257. package/dist/esm/runtime/utils/findIndexByFields.d.ts +9 -0
  258. package/dist/esm/runtime/utils/findIndexByFields.mjs +22 -0
  259. package/dist/esm/runtime/utils/findIndexByFields.mjs.map +1 -0
  260. package/dist/esm/runtime/utils/index.d.ts +2 -0
  261. package/dist/esm/runtime/utils/index.mjs +3 -0
  262. package/dist/esm/runtime/utils/index.mjs.map +1 -0
  263. package/dist/esm/runtime/utils/resolveOwnerFields.d.ts +12 -0
  264. package/dist/esm/runtime/utils/resolveOwnerFields.mjs +45 -0
  265. package/dist/esm/runtime/utils/resolveOwnerFields.mjs.map +1 -0
  266. package/dist/esm/runtime/utils/resolvePKFields.d.ts +13 -0
  267. package/dist/esm/runtime/utils/resolvePKFields.mjs +14 -0
  268. package/dist/esm/runtime/utils/resolvePKFields.mjs.map +1 -0
  269. package/{lib-esm/src → dist/esm}/util/Brand.d.ts +0 -1
  270. package/dist/esm/util/Brand.mjs +30 -0
  271. package/dist/esm/util/Brand.mjs.map +1 -0
  272. package/{lib-esm/src → dist/esm}/util/IndexLimit.d.ts +0 -1
  273. package/dist/esm/util/IndexLimit.mjs +2 -0
  274. package/dist/esm/util/IndexLimit.mjs.map +1 -0
  275. package/{lib-esm/src → dist/esm}/util/SpreadTuple.d.ts +0 -1
  276. package/dist/esm/util/SpreadTuple.mjs +2 -0
  277. package/dist/esm/util/SpreadTuple.mjs.map +1 -0
  278. package/{lib-esm/src → dist/esm}/util/index.d.ts +0 -1
  279. package/dist/esm/util/index.mjs +2 -0
  280. package/dist/esm/util/index.mjs.map +1 -0
  281. package/dist/meta/cjs.tsbuildinfo +1 -0
  282. package/internals/package.json +7 -5
  283. package/package.json +31 -14
  284. package/runtime/package.json +8 -0
  285. package/src/Authorization.ts +684 -0
  286. package/src/ClientSchema.ts +118 -0
  287. package/src/CombineSchema.ts +58 -0
  288. package/src/CustomOperation.ts +286 -0
  289. package/src/CustomType.ts +67 -0
  290. package/src/EnumType.ts +36 -0
  291. package/src/Handler.ts +127 -0
  292. package/src/MappedTypes/CustomOperations.ts +256 -0
  293. package/src/MappedTypes/ExtractNonModelTypes.ts +154 -0
  294. package/src/MappedTypes/ImplicitFieldInjector.ts +69 -0
  295. package/src/MappedTypes/MapSecondaryIndexes.ts +100 -0
  296. package/src/MappedTypes/ModelMetadata.ts +87 -0
  297. package/src/MappedTypes/ResolveFieldProperties.ts +254 -0
  298. package/src/MappedTypes/ResolveSchema.ts +148 -0
  299. package/src/ModelField.ts +304 -0
  300. package/src/ModelIndex.ts +91 -0
  301. package/src/ModelRelationalField.ts +263 -0
  302. package/src/ModelSchema.ts +437 -0
  303. package/src/ModelType.ts +345 -0
  304. package/src/RefType.ts +139 -0
  305. package/src/SchemaProcessor.ts +1516 -0
  306. package/src/a.ts +58 -0
  307. package/src/index.ts +6 -0
  308. package/src/internals/index.ts +2 -0
  309. package/src/runtime/addSchemaToClient.ts +45 -0
  310. package/src/runtime/addSchemaToClientWithInstance.ts +46 -0
  311. package/src/runtime/bridge-types.ts +382 -0
  312. package/src/runtime/client/index.ts +923 -0
  313. package/src/runtime/client/index.v3.ts +52 -0
  314. package/src/runtime/index.ts +7 -0
  315. package/src/runtime/index.v3.ts +7 -0
  316. package/src/runtime/internals/APIClient.ts +1082 -0
  317. package/src/runtime/internals/clientUtils.ts +37 -0
  318. package/src/runtime/internals/generateCustomOperationsProperty.ts +116 -0
  319. package/src/runtime/internals/index.ts +12 -0
  320. package/src/runtime/internals/operations/custom.ts +497 -0
  321. package/src/runtime/internals/operations/get.ts +150 -0
  322. package/src/runtime/internals/operations/indexQuery.ts +178 -0
  323. package/src/runtime/internals/operations/list.ts +143 -0
  324. package/src/runtime/internals/operations/observeQuery.ts +146 -0
  325. package/src/runtime/internals/operations/subscription.ts +78 -0
  326. package/src/runtime/internals/server/generateModelsProperty.ts +94 -0
  327. package/src/runtime/internals/server/index.ts +4 -0
  328. package/src/runtime/internals/utils/clientProperties/generateEnumsProperty.ts +34 -0
  329. package/src/runtime/internals/utils/clientProperties/generateModelsProperty.ts +88 -0
  330. package/src/runtime/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.ts +10 -0
  331. package/src/runtime/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.ts +13 -0
  332. package/src/runtime/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.ts +15 -0
  333. package/src/runtime/utils/findIndexByFields.ts +31 -0
  334. package/src/runtime/utils/index.ts +5 -0
  335. package/src/runtime/utils/resolveOwnerFields.ts +77 -0
  336. package/src/runtime/utils/resolvePKFields.ts +23 -0
  337. package/src/util/Brand.ts +45 -0
  338. package/src/util/IndexLimit.ts +12 -0
  339. package/src/util/SpreadTuple.ts +10 -0
  340. package/src/util/index.ts +3 -0
  341. package/lib-esm/index.d.ts +0 -5
  342. package/lib-esm/index.d.ts.map +0 -1
  343. package/lib-esm/index.js +0 -28
  344. package/lib-esm/src/Authorization.d.ts.map +0 -1
  345. package/lib-esm/src/ClientSchema.d.ts.map +0 -1
  346. package/lib-esm/src/CombineSchema.d.ts.map +0 -1
  347. package/lib-esm/src/CustomOperation.d.ts.map +0 -1
  348. package/lib-esm/src/CustomType.d.ts.map +0 -1
  349. package/lib-esm/src/EnumType.d.ts.map +0 -1
  350. package/lib-esm/src/Handler.d.ts.map +0 -1
  351. package/lib-esm/src/MappedTypes/CustomOperations.d.ts.map +0 -1
  352. package/lib-esm/src/MappedTypes/ExtractNonModelTypes.d.ts.map +0 -1
  353. package/lib-esm/src/MappedTypes/ExtractNonModelTypes.js +0 -2
  354. package/lib-esm/src/MappedTypes/ImplicitFieldInjector.d.ts.map +0 -1
  355. package/lib-esm/src/MappedTypes/ImplicitFieldInjector.js +0 -2
  356. package/lib-esm/src/MappedTypes/MapSecondaryIndexes.d.ts.map +0 -1
  357. package/lib-esm/src/MappedTypes/ModelMetadata.d.ts.map +0 -1
  358. package/lib-esm/src/MappedTypes/ResolveFieldProperties.d.ts.map +0 -1
  359. package/lib-esm/src/MappedTypes/ResolveFieldProperties.js +0 -2
  360. package/lib-esm/src/MappedTypes/ResolveSchema.d.ts.map +0 -1
  361. package/lib-esm/src/ModelField.d.ts.map +0 -1
  362. package/lib-esm/src/ModelIndex.d.ts.map +0 -1
  363. package/lib-esm/src/ModelRelationalField.d.ts.map +0 -1
  364. package/lib-esm/src/ModelSchema.d.ts.map +0 -1
  365. package/lib-esm/src/ModelType.d.ts.map +0 -1
  366. package/lib-esm/src/RefType.d.ts.map +0 -1
  367. package/lib-esm/src/SchemaProcessor.d.ts.map +0 -1
  368. package/lib-esm/src/index.d.ts.map +0 -1
  369. package/lib-esm/src/internals/index.d.ts +0 -2
  370. package/lib-esm/src/internals/index.d.ts.map +0 -1
  371. package/lib-esm/src/util/Brand.d.ts.map +0 -1
  372. package/lib-esm/src/util/IndexLimit.d.ts.map +0 -1
  373. package/lib-esm/src/util/SpreadTuple.d.ts.map +0 -1
  374. package/lib-esm/src/util/index.d.ts.map +0 -1
  375. package/lib-esm/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,1082 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+
3
+ // SPDX-License-Identifier: Apache-2.0
4
+
5
+ import {
6
+ AmplifyServer,
7
+ AssociationBelongsTo,
8
+ AssociationHasOne,
9
+ AuthModeParams,
10
+ BaseClient,
11
+ GraphQLAuthMode,
12
+ ClientInternalsGetter,
13
+ ListArgs,
14
+ ModelFieldType,
15
+ ModelIntrospectionSchema,
16
+ NonModelFieldType,
17
+ QueryArgs,
18
+ SchemaModel,
19
+ SchemaNonModel,
20
+ } from '../bridge-types';
21
+
22
+ import { CustomHeaders } from '../client';
23
+ import { resolveOwnerFields } from '../utils/resolveOwnerFields';
24
+
25
+ import type { IndexMeta } from './operations/indexQuery';
26
+
27
+ interface LazyLoadOptions {
28
+ authMode?: GraphQLAuthMode;
29
+ authToken?: string | undefined;
30
+ limit?: number | undefined;
31
+ nextToken?: string | undefined | null;
32
+ headers?: CustomHeaders | undefined;
33
+ }
34
+
35
+ const connectionType = {
36
+ HAS_ONE: 'HAS_ONE',
37
+ HAS_MANY: 'HAS_MANY',
38
+ BELONGS_TO: 'BELONGS_TO',
39
+ };
40
+
41
+ /**
42
+ *
43
+ * @param GraphQL response object
44
+ * @returns response object with `items` properties flattened
45
+ */
46
+ export const flattenItems = (obj: Record<string, any>): Record<string, any> => {
47
+ const res: Record<string, any> = {};
48
+
49
+ Object.entries(obj).forEach(([prop, value]) => {
50
+ if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
51
+ if (value.items !== undefined) {
52
+ res[prop] = value.items.map((item: Record<string, any>) =>
53
+ flattenItems(item),
54
+ );
55
+
56
+ return;
57
+ }
58
+ res[prop] = flattenItems(value);
59
+
60
+ return;
61
+ }
62
+
63
+ res[prop] = value;
64
+ });
65
+
66
+ return res;
67
+ };
68
+
69
+ // TODO: this should accept single result to support CRUD methods; create helper for array/list
70
+ export function initializeModel(
71
+ client: BaseClient,
72
+ modelName: string,
73
+ result: any[],
74
+ modelIntrospection: ModelIntrospectionSchema,
75
+ authMode: GraphQLAuthMode | undefined,
76
+ authToken: string | undefined,
77
+ context = false,
78
+ ): any[] {
79
+ const introModel = modelIntrospection.models[modelName];
80
+ const introModelFields = introModel.fields;
81
+
82
+ const modelFields: string[] = Object.entries(introModelFields)
83
+ .filter(([_, field]: [string, any]) => field?.type?.model !== undefined)
84
+ .map(([fieldName]) => fieldName);
85
+
86
+ return result.map((record) => {
87
+ const initializedRelationalFields: Record<string, any> = {};
88
+
89
+ for (const fieldName of modelFields) {
90
+ const modelField = introModelFields[fieldName];
91
+ const modelFieldType = modelField?.type as ModelFieldType;
92
+
93
+ const relatedModelName = modelFieldType.model;
94
+ const relatedModel = modelIntrospection.models[relatedModelName!];
95
+
96
+ const relatedModelPKFieldName =
97
+ relatedModel.primaryKeyInfo.primaryKeyFieldName;
98
+
99
+ const relatedModelSKFieldNames =
100
+ relatedModel.primaryKeyInfo.sortKeyFieldNames;
101
+
102
+ const relationType = modelField.association?.connectionType;
103
+
104
+ let connectionFields: string[] = [];
105
+ if (
106
+ modelField.association &&
107
+ 'associatedWith' in modelField.association
108
+ ) {
109
+ connectionFields = modelField.association.associatedWith;
110
+ }
111
+
112
+ const targetNames: string[] = [];
113
+ if (modelField.association && 'targetNames' in modelField.association) {
114
+ targetNames.push(...modelField.association.targetNames);
115
+ }
116
+
117
+ switch (relationType) {
118
+ case connectionType.HAS_ONE:
119
+ case connectionType.BELONGS_TO: {
120
+ const sortKeyValues = relatedModelSKFieldNames.reduce(
121
+ // TODO(Eslint): is this implementation correct?
122
+ // eslint-disable-next-line array-callback-return
123
+ (acc: Record<string, any>, curVal) => {
124
+ if (record[curVal]) {
125
+ return (acc[curVal] = record[curVal]);
126
+ }
127
+ },
128
+ {},
129
+ );
130
+
131
+ if (context) {
132
+ initializedRelationalFields[fieldName] = (
133
+ contextSpec: AmplifyServer.ContextSpec,
134
+ options?: LazyLoadOptions,
135
+ ) => {
136
+ if (record[targetNames[0]]) {
137
+ return (client as any).models[relatedModelName].get(
138
+ contextSpec,
139
+ {
140
+ [relatedModelPKFieldName]: record[targetNames[0]],
141
+ ...sortKeyValues,
142
+ },
143
+ {
144
+ authMode: options?.authMode || authMode,
145
+ authToken: options?.authToken || authToken,
146
+ },
147
+ );
148
+ }
149
+
150
+ return undefined;
151
+ };
152
+ } else {
153
+ initializedRelationalFields[fieldName] = (
154
+ options?: LazyLoadOptions,
155
+ ) => {
156
+ if (record[targetNames[0]]) {
157
+ return (client as any).models[relatedModelName].get(
158
+ {
159
+ [relatedModelPKFieldName]: record[targetNames[0]],
160
+ ...sortKeyValues,
161
+ },
162
+ {
163
+ authMode: options?.authMode || authMode,
164
+ authToken: options?.authToken || authToken,
165
+ },
166
+ );
167
+ }
168
+
169
+ return undefined;
170
+ };
171
+ }
172
+
173
+ break;
174
+ }
175
+ case connectionType.HAS_MANY: {
176
+ const parentPk = introModel.primaryKeyInfo.primaryKeyFieldName;
177
+ const parentSK = introModel.primaryKeyInfo.sortKeyFieldNames;
178
+
179
+ // M:N check - TODO: refactor
180
+ const relatedModelField = relatedModel.fields[connectionFields[0]];
181
+ const relatedModelFieldType =
182
+ relatedModelField.type as ModelFieldType;
183
+ if (relatedModelFieldType.model) {
184
+ let relatedTargetNames: string[] = [];
185
+ if (
186
+ relatedModelField.association &&
187
+ 'targetNames' in relatedModelField.association
188
+ ) {
189
+ relatedTargetNames = relatedModelField.association?.targetNames;
190
+ }
191
+
192
+ const hasManyFilter: Record<string, any> = relatedTargetNames.map(
193
+ (field, idx) => {
194
+ if (idx === 0) {
195
+ return { [field]: { eq: record[parentPk] } };
196
+ }
197
+
198
+ return { [field]: { eq: record[parentSK[idx - 1]] } };
199
+ },
200
+ );
201
+
202
+ if (context) {
203
+ initializedRelationalFields[fieldName] = (
204
+ contextSpec: AmplifyServer.ContextSpec,
205
+ options?: LazyLoadOptions,
206
+ ) => {
207
+ if (record[parentPk]) {
208
+ return (client as any).models[relatedModelName].list(
209
+ contextSpec,
210
+ {
211
+ filter: { and: hasManyFilter },
212
+ limit: options?.limit,
213
+ nextToken: options?.nextToken,
214
+ authMode: options?.authMode || authMode,
215
+ authToken: options?.authToken || authToken,
216
+ },
217
+ );
218
+ }
219
+
220
+ return [];
221
+ };
222
+ } else {
223
+ initializedRelationalFields[fieldName] = (
224
+ options?: LazyLoadOptions,
225
+ ) => {
226
+ if (record[parentPk]) {
227
+ return (client as any).models[relatedModelName].list({
228
+ filter: { and: hasManyFilter },
229
+ limit: options?.limit,
230
+ nextToken: options?.nextToken,
231
+ authMode: options?.authMode || authMode,
232
+ authToken: options?.authToken || authToken,
233
+ });
234
+ }
235
+
236
+ return [];
237
+ };
238
+ }
239
+
240
+ break;
241
+ }
242
+
243
+ const hasManyFilter: Record<string, any> = connectionFields.map(
244
+ (field, idx) => {
245
+ if (idx === 0) {
246
+ return { [field]: { eq: record[parentPk] } };
247
+ }
248
+
249
+ return { [field]: { eq: record[parentSK[idx - 1]] } };
250
+ },
251
+ );
252
+
253
+ if (context) {
254
+ initializedRelationalFields[fieldName] = (
255
+ contextSpec: AmplifyServer.ContextSpec,
256
+ options?: LazyLoadOptions,
257
+ ) => {
258
+ if (record[parentPk]) {
259
+ return (client as any).models[relatedModelName].list(
260
+ contextSpec,
261
+ {
262
+ filter: { and: hasManyFilter },
263
+ limit: options?.limit,
264
+ nextToken: options?.nextToken,
265
+ authMode: options?.authMode || authMode,
266
+ authToken: options?.authToken || authToken,
267
+ },
268
+ );
269
+ }
270
+
271
+ return [];
272
+ };
273
+ } else {
274
+ initializedRelationalFields[fieldName] = (
275
+ options?: LazyLoadOptions,
276
+ ) => {
277
+ if (record[parentPk]) {
278
+ return (client as any).models[relatedModelName].list({
279
+ filter: { and: hasManyFilter },
280
+ limit: options?.limit,
281
+ nextToken: options?.nextToken,
282
+ authMode: options?.authMode || authMode,
283
+ authToken: options?.authToken || authToken,
284
+ });
285
+ }
286
+
287
+ return [];
288
+ };
289
+ }
290
+
291
+ break;
292
+ }
293
+ default:
294
+ break;
295
+ }
296
+ }
297
+
298
+ return { ...record, ...initializedRelationalFields };
299
+ });
300
+ }
301
+
302
+ export const graphQLOperationsInfo = {
303
+ CREATE: { operationPrefix: 'create', usePlural: false },
304
+ READ: { operationPrefix: 'get', usePlural: false },
305
+ UPDATE: { operationPrefix: 'update', usePlural: false },
306
+ DELETE: { operationPrefix: 'delete', usePlural: false },
307
+ LIST: { operationPrefix: 'list', usePlural: true },
308
+ INDEX_QUERY: { operationPrefix: '', usePlural: false },
309
+ ONCREATE: { operationPrefix: 'onCreate', usePlural: false },
310
+ ONUPDATE: { operationPrefix: 'onUpdate', usePlural: false },
311
+ ONDELETE: { operationPrefix: 'onDelete', usePlural: false },
312
+ OBSERVE_QUERY: { operationPrefix: 'observeQuery', usePlural: false },
313
+ } as const;
314
+ export type ModelOperation = keyof typeof graphQLOperationsInfo;
315
+
316
+ const SELECTION_SET_WILDCARD = '*';
317
+
318
+ export const getDefaultSelectionSetForNonModelWithIR = (
319
+ nonModelDefinition: SchemaNonModel,
320
+ modelIntrospection: ModelIntrospectionSchema,
321
+ ): Record<string, unknown> => {
322
+ const { fields } = nonModelDefinition;
323
+ const mappedFields = Object.values(fields)
324
+ .map(({ type, name }) => {
325
+ if (typeof (type as { enum: string }).enum === 'string') {
326
+ return [name, FIELD_IR];
327
+ }
328
+
329
+ if (typeof (type as NonModelFieldType).nonModel === 'string') {
330
+ return [
331
+ name,
332
+ getDefaultSelectionSetForNonModelWithIR(
333
+ modelIntrospection.nonModels[(type as NonModelFieldType).nonModel],
334
+ modelIntrospection,
335
+ ),
336
+ ];
337
+ }
338
+
339
+ if (typeof type === 'string') {
340
+ return [name, FIELD_IR];
341
+ }
342
+
343
+ return undefined;
344
+ })
345
+ .filter(
346
+ (
347
+ pair: (string | Record<string, unknown>)[] | undefined,
348
+ ): pair is (string | Record<string, unknown>)[] => pair !== undefined,
349
+ );
350
+
351
+ return Object.fromEntries(mappedFields);
352
+ };
353
+
354
+ const getDefaultSelectionSetForModelWithIR = (
355
+ modelDefinition: SchemaModel,
356
+ modelIntrospection: ModelIntrospectionSchema,
357
+ ): Record<string, unknown> => {
358
+ const { fields } = modelDefinition;
359
+ const mappedFields = Object.values(fields)
360
+ .map(({ type, name }) => {
361
+ if (
362
+ typeof (type as { enum: string }).enum === 'string' ||
363
+ typeof type === 'string'
364
+ ) {
365
+ return [name, FIELD_IR];
366
+ }
367
+
368
+ if (typeof (type as NonModelFieldType).nonModel === 'string') {
369
+ return [
370
+ name,
371
+ getDefaultSelectionSetForNonModelWithIR(
372
+ modelIntrospection.nonModels[(type as NonModelFieldType).nonModel],
373
+ modelIntrospection,
374
+ ),
375
+ ];
376
+ }
377
+
378
+ return undefined;
379
+ })
380
+ .filter(
381
+ (
382
+ pair: (string | Record<string, unknown>)[] | undefined,
383
+ ): pair is (string | Record<string, unknown>)[] => pair !== undefined,
384
+ );
385
+
386
+ const ownerFields = resolveOwnerFields(modelDefinition).map((field) => [
387
+ field,
388
+ FIELD_IR,
389
+ ]);
390
+
391
+ return Object.fromEntries(mappedFields.concat(ownerFields));
392
+ };
393
+
394
+ function defaultSelectionSetForModel(modelDefinition: SchemaModel): string[] {
395
+ // fields that are explicitly part of the graphql schema; not
396
+ // inferred from owner auth rules.
397
+ const { fields } = modelDefinition;
398
+ const explicitFields = Object.values<any>(fields)
399
+ // Default selection set omits model fields
400
+ .map(({ type, name }) => {
401
+ if (typeof type === 'string') return name;
402
+
403
+ if (typeof type === 'object') {
404
+ if (typeof type?.enum === 'string') {
405
+ return name;
406
+ } else if (typeof type?.nonModel === 'string') {
407
+ return `${name}.${SELECTION_SET_WILDCARD}`;
408
+ }
409
+ }
410
+
411
+ return undefined;
412
+ })
413
+ .filter(Boolean);
414
+
415
+ // fields used for owner auth rules that may or may not also
416
+ // be explicit on the model.
417
+ const ownerFields = resolveOwnerFields(modelDefinition);
418
+
419
+ return Array.from(new Set(explicitFields.concat(ownerFields)));
420
+ }
421
+
422
+ const FIELD_IR = '';
423
+
424
+ /**
425
+ * Generates nested Custom Selection Set IR from path
426
+ *
427
+ * @param modelDefinitions
428
+ * @param modelName
429
+ * @param selectionSet - array of object paths
430
+ * @example
431
+ * ### Given
432
+ * `selectionSet = ['id', 'comments.post.id']`
433
+ * ### Returns
434
+ * ```ts
435
+ * {
436
+ * id: '',
437
+ * comments: {
438
+ * items: { post: { id: '' } }
439
+ * }
440
+ * }
441
+ * ```
442
+ */
443
+ export function customSelectionSetToIR(
444
+ modelIntrospection: ModelIntrospectionSchema,
445
+ modelName: string,
446
+ selectionSet: string[],
447
+ ): Record<string, string | object> {
448
+ const dotNotationToObject = (path: string, modelOrNonModelName: string) => {
449
+ const [fieldName, ...rest] = path.split('.');
450
+
451
+ const nested = rest[0];
452
+ const modelOrNonModelDefinition =
453
+ modelIntrospection.models[modelOrNonModelName] ??
454
+ modelIntrospection.nonModels[modelOrNonModelName];
455
+
456
+ const modelOrNonModelFields = modelOrNonModelDefinition?.fields;
457
+ const relatedModel = (
458
+ modelOrNonModelFields?.[fieldName]?.type as ModelFieldType
459
+ )?.model;
460
+
461
+ const relatedModelDefinition = modelIntrospection.models[relatedModel];
462
+ const relatedNonModel = (
463
+ modelOrNonModelFields?.[fieldName]?.type as NonModelFieldType
464
+ )?.nonModel;
465
+ const relatedNonModelDefinition =
466
+ modelIntrospection.nonModels[relatedNonModel];
467
+
468
+ const isModelOrNonModelOrFieldType = relatedModelDefinition
469
+ ? 'model'
470
+ : relatedNonModelDefinition
471
+ ? 'nonModel'
472
+ : 'field';
473
+
474
+ if (isModelOrNonModelOrFieldType === 'nonModel') {
475
+ let result: Record<string, any> = {};
476
+
477
+ if (!nested) {
478
+ throw Error(
479
+ `${fieldName} must declare a wildcard (*) or a field of custom type ${relatedNonModel}`,
480
+ );
481
+ }
482
+
483
+ if (nested === SELECTION_SET_WILDCARD) {
484
+ result = {
485
+ [fieldName]: getDefaultSelectionSetForNonModelWithIR(
486
+ relatedNonModelDefinition,
487
+ modelIntrospection,
488
+ ),
489
+ };
490
+ } else {
491
+ result = {
492
+ [fieldName]: dotNotationToObject(rest.join('.'), relatedNonModel),
493
+ };
494
+ }
495
+
496
+ return result;
497
+ } else if (isModelOrNonModelOrFieldType === 'model') {
498
+ let result: Record<string, any> = {};
499
+
500
+ if (!nested) {
501
+ throw Error(
502
+ `${fieldName} must declare a wildcard (*) or a field of model ${relatedModel}`,
503
+ );
504
+ }
505
+
506
+ if (nested === SELECTION_SET_WILDCARD) {
507
+ const nestedRelatedModelDefinition =
508
+ modelIntrospection.models[relatedModel];
509
+
510
+ result = {
511
+ [fieldName]: getDefaultSelectionSetForModelWithIR(
512
+ nestedRelatedModelDefinition,
513
+ modelIntrospection,
514
+ ),
515
+ };
516
+ } else {
517
+ result = {
518
+ [fieldName]: dotNotationToObject(rest.join('.'), relatedModel),
519
+ };
520
+ }
521
+
522
+ if (modelOrNonModelFields[fieldName]?.isArray) {
523
+ result = {
524
+ [fieldName]: {
525
+ items: result[fieldName],
526
+ },
527
+ };
528
+ }
529
+
530
+ return result;
531
+ } else {
532
+ const modelField = modelOrNonModelFields?.[fieldName];
533
+
534
+ const nonModelDefinition =
535
+ modelIntrospection.nonModels[modelOrNonModelName];
536
+ const nonModelField = nonModelDefinition?.fields?.[fieldName];
537
+
538
+ if (!nonModelDefinition) {
539
+ const isOwnerField = resolveOwnerFields(
540
+ modelOrNonModelDefinition,
541
+ ).includes(fieldName);
542
+
543
+ if (!modelField && !isOwnerField) {
544
+ throw Error(
545
+ `${fieldName} is not a field of model ${modelOrNonModelName}`,
546
+ );
547
+ }
548
+ } else {
549
+ if (!nonModelField) {
550
+ throw Error(
551
+ `${fieldName} is not a field of custom type ${modelOrNonModelName}`,
552
+ );
553
+ }
554
+ }
555
+
556
+ return { [fieldName]: FIELD_IR };
557
+ }
558
+ };
559
+
560
+ return selectionSet.reduce(
561
+ (resultObj, path) =>
562
+ deepMergeSelectionSetObjects(
563
+ dotNotationToObject(path, modelName),
564
+ resultObj,
565
+ ),
566
+ {} as Record<string, any>,
567
+ );
568
+ }
569
+
570
+ /**
571
+ * Stringifies selection set IR
572
+ * * @example
573
+ * ### Given
574
+ * ```ts
575
+ * {
576
+ * id: '',
577
+ * comments: {
578
+ * items: { post: { id: '' } }
579
+ * }
580
+ * }
581
+ * ```
582
+ * ### Returns
583
+ * `'id comments { items { post { id } } }'`
584
+ */
585
+ export function selectionSetIRToString(
586
+ obj: Record<string, string | any>,
587
+ ): string {
588
+ const res: string[] = [];
589
+
590
+ Object.entries(obj).forEach(([fieldName, value]) => {
591
+ if (value === FIELD_IR) {
592
+ res.push(fieldName);
593
+ } else if (typeof value === 'object' && value !== null) {
594
+ if (value?.items) {
595
+ res.push(
596
+ fieldName,
597
+ '{',
598
+ 'items',
599
+ '{',
600
+ selectionSetIRToString(value.items),
601
+ '}',
602
+ '}',
603
+ );
604
+ } else {
605
+ res.push(fieldName, '{', selectionSetIRToString(value), '}');
606
+ }
607
+ }
608
+ });
609
+
610
+ return res.join(' ');
611
+ }
612
+
613
+ /**
614
+ * Recursively merges selection set objects from `source` onto `target`.
615
+ *
616
+ * `target` will be updated. `source` will be left alone.
617
+ *
618
+ * @param source The object to merge into target.
619
+ * @param target The object to be mutated.
620
+ */
621
+ function deepMergeSelectionSetObjects<T extends Record<string, any>>(
622
+ source: T,
623
+ target: T,
624
+ ) {
625
+ const isObject = (obj: any) => obj && typeof obj === 'object';
626
+
627
+ for (const key in source) {
628
+ // This verification avoids 'Prototype Pollution' issue
629
+ if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
630
+
631
+ if (
632
+ Object.prototype.hasOwnProperty.call(target, key) &&
633
+ isObject(target[key])
634
+ ) {
635
+ deepMergeSelectionSetObjects(source[key], target[key]);
636
+ } else {
637
+ target[key] = source[key];
638
+ }
639
+ }
640
+
641
+ return target;
642
+ }
643
+
644
+ export function generateSelectionSet(
645
+ modelIntrospection: ModelIntrospectionSchema,
646
+ modelName: string,
647
+ selectionSet?: string[],
648
+ ) {
649
+ const modelDefinition = modelIntrospection.models[modelName];
650
+
651
+ const selSetIr = customSelectionSetToIR(
652
+ modelIntrospection,
653
+ modelName,
654
+ selectionSet ?? defaultSelectionSetForModel(modelDefinition),
655
+ );
656
+ const selSetString = selectionSetIRToString(selSetIr);
657
+
658
+ return selSetString;
659
+ }
660
+
661
+ export function generateGraphQLDocument(
662
+ modelIntrospection: ModelIntrospectionSchema,
663
+ modelName: string,
664
+ modelOperation: ModelOperation,
665
+ listArgs?: ListArgs | QueryArgs,
666
+ indexMeta?: IndexMeta,
667
+ ): string {
668
+ const modelDefinition = modelIntrospection.models[modelName];
669
+
670
+ const {
671
+ name,
672
+ pluralName,
673
+ fields,
674
+ primaryKeyInfo: {
675
+ isCustomPrimaryKey,
676
+ primaryKeyFieldName,
677
+ sortKeyFieldNames,
678
+ },
679
+ } = modelDefinition;
680
+
681
+ const { operationPrefix, usePlural } = graphQLOperationsInfo[modelOperation];
682
+
683
+ const { selectionSet } = listArgs || {};
684
+
685
+ let graphQLFieldName;
686
+ let indexQueryArgs: Record<string, string>;
687
+
688
+ if (operationPrefix) {
689
+ graphQLFieldName = `${operationPrefix}${usePlural ? pluralName : name}`;
690
+ } else if (indexMeta) {
691
+ const { queryField, pk, sk = [] } = indexMeta;
692
+ graphQLFieldName = queryField;
693
+
694
+ const skQueryArgs = sk.reduce((acc: Record<string, any>, fieldName) => {
695
+ const fieldType = fields[fieldName].type;
696
+ acc[fieldName] = `Model${fieldType}KeyConditionInput`;
697
+
698
+ return acc;
699
+ }, {});
700
+
701
+ indexQueryArgs = {
702
+ [pk]: `${fields[pk].type}!`,
703
+ ...skQueryArgs,
704
+ };
705
+ } else {
706
+ throw new Error(
707
+ 'Error generating GraphQL Document - invalid operation name',
708
+ );
709
+ }
710
+
711
+ let graphQLOperationType: 'mutation' | 'query' | 'subscription' | undefined;
712
+ let graphQLSelectionSet: string | undefined;
713
+ let graphQLArguments: Record<string, any> | undefined;
714
+
715
+ const selectionSetFields = generateSelectionSet(
716
+ modelIntrospection,
717
+ modelName,
718
+ selectionSet as ListArgs['selectionSet'],
719
+ );
720
+
721
+ // default PK args for get and list operations
722
+ // modified below for CPK
723
+ const getPkArgs = {
724
+ [primaryKeyFieldName]: `${fields[primaryKeyFieldName].type}!`,
725
+ };
726
+ const listPkArgs = {};
727
+
728
+ const generateSkArgs = (op: 'get' | 'list') => {
729
+ return sortKeyFieldNames.reduce(
730
+ (acc: Record<string, any>, fieldName: string) => {
731
+ const fieldType = fields[fieldName].type;
732
+
733
+ if (op === 'get') {
734
+ acc[fieldName] = `${fieldType}!`;
735
+ } else if (op === 'list') {
736
+ acc[fieldName] = `Model${fieldType}KeyConditionInput`;
737
+ }
738
+
739
+ return acc;
740
+ },
741
+ {},
742
+ );
743
+ };
744
+
745
+ if (isCustomPrimaryKey) {
746
+ Object.assign(getPkArgs, generateSkArgs('get'));
747
+
748
+ Object.assign(
749
+ listPkArgs,
750
+ {
751
+ // PK is only included in list query field args in the generated GQL
752
+ // when explicitly specifying PK with .identifier(['fieldName']) or @primaryKey in the schema definition
753
+ [primaryKeyFieldName]: `${fields[primaryKeyFieldName].type}`, // PK is always a nullable arg for list (no `!` after the type)
754
+ sortDirection: 'ModelSortDirection',
755
+ },
756
+ generateSkArgs('list'),
757
+ );
758
+ }
759
+
760
+ switch (modelOperation) {
761
+ case 'CREATE':
762
+ case 'UPDATE':
763
+ case 'DELETE':
764
+ graphQLArguments ??
765
+ (graphQLArguments = {
766
+ input: `${
767
+ operationPrefix.charAt(0).toLocaleUpperCase() +
768
+ operationPrefix.slice(1)
769
+ }${name}Input!`,
770
+ });
771
+ graphQLOperationType ?? (graphQLOperationType = 'mutation');
772
+ // TODO(Eslint): this this case clause correct without the break statement?
773
+ // eslint-disable-next-line no-fallthrough
774
+ case 'READ':
775
+ graphQLArguments ?? (graphQLArguments = getPkArgs);
776
+ graphQLSelectionSet ?? (graphQLSelectionSet = selectionSetFields);
777
+ // TODO(Eslint): this this case clause correct without the break statement?
778
+ // eslint-disable-next-line no-fallthrough
779
+ case 'LIST':
780
+ graphQLArguments ??
781
+ (graphQLArguments = {
782
+ ...listPkArgs,
783
+ // eslint doesn't like the ts-ignore, because it thinks it's unnecessary.
784
+ // But TS doesn't like the `filter: ...` because it think it will always be
785
+ // overwritten. (it won't be.) so, we need to ignore the TS error and then
786
+ // ignore the eslint error on the ts-ignore.
787
+ // eslint-disable-next-line
788
+ // @ts-ignore
789
+ filter: `Model${name}FilterInput`,
790
+ limit: 'Int',
791
+ nextToken: 'String',
792
+ });
793
+ graphQLOperationType ?? (graphQLOperationType = 'query');
794
+ graphQLSelectionSet ??
795
+ (graphQLSelectionSet = `items { ${selectionSetFields} } nextToken __typename`);
796
+ // TODO(Eslint): this this case clause correct without the break statement?
797
+ // eslint-disable-next-line no-fallthrough
798
+ case 'INDEX_QUERY':
799
+ graphQLArguments ??
800
+ (graphQLArguments = {
801
+ ...indexQueryArgs!,
802
+ filter: `Model${name}FilterInput`,
803
+ sortDirection: 'ModelSortDirection',
804
+ limit: 'Int',
805
+ nextToken: 'String',
806
+ });
807
+ graphQLOperationType ?? (graphQLOperationType = 'query');
808
+ graphQLSelectionSet ??
809
+ (graphQLSelectionSet = `items { ${selectionSetFields} } nextToken __typename`);
810
+ // TODO(Eslint): this this case clause correct without the break statement?
811
+ // eslint-disable-next-line no-fallthrough
812
+ case 'ONCREATE':
813
+ case 'ONUPDATE':
814
+ case 'ONDELETE':
815
+ graphQLArguments ??
816
+ (graphQLArguments = {
817
+ filter: `ModelSubscription${name}FilterInput`,
818
+ });
819
+ graphQLOperationType ?? (graphQLOperationType = 'subscription');
820
+ graphQLSelectionSet ?? (graphQLSelectionSet = selectionSetFields);
821
+ break;
822
+ case 'OBSERVE_QUERY':
823
+ default:
824
+ throw new Error(
825
+ 'Internal error: Attempted to generate graphql document for observeQuery. Please report this error.',
826
+ );
827
+ }
828
+
829
+ const graphQLDocument = `${graphQLOperationType}${
830
+ graphQLArguments
831
+ ? `(${Object.entries(graphQLArguments).map(
832
+ ([fieldName, type]) => `$${fieldName}: ${type}`,
833
+ )})`
834
+ : ''
835
+ } { ${graphQLFieldName}${
836
+ graphQLArguments
837
+ ? `(${Object.keys(graphQLArguments).map(
838
+ (fieldName) => `${fieldName}: $${fieldName}`,
839
+ )})`
840
+ : ''
841
+ } { ${graphQLSelectionSet} } }`;
842
+
843
+ return graphQLDocument;
844
+ }
845
+
846
+ export function buildGraphQLVariables(
847
+ modelDefinition: SchemaModel,
848
+ operation: ModelOperation,
849
+ arg: QueryArgs | undefined,
850
+ modelIntrospection: ModelIntrospectionSchema,
851
+ indexMeta?: IndexMeta,
852
+ ): object {
853
+ const {
854
+ fields,
855
+ primaryKeyInfo: {
856
+ isCustomPrimaryKey,
857
+ primaryKeyFieldName,
858
+ sortKeyFieldNames,
859
+ },
860
+ } = modelDefinition;
861
+
862
+ let variables: Record<string, any> = {};
863
+
864
+ // TODO: process input
865
+ switch (operation) {
866
+ case 'CREATE':
867
+ variables = {
868
+ input: arg
869
+ ? normalizeMutationInput(arg, modelDefinition, modelIntrospection)
870
+ : {},
871
+ };
872
+ break;
873
+ case 'UPDATE':
874
+ // readonly fields are not updated
875
+ variables = {
876
+ input: arg
877
+ ? Object.fromEntries(
878
+ Object.entries(
879
+ normalizeMutationInput(
880
+ arg,
881
+ modelDefinition,
882
+ modelIntrospection,
883
+ ),
884
+ ).filter(([fieldName]) => {
885
+ const { isReadOnly } = fields[fieldName];
886
+
887
+ return !isReadOnly;
888
+ }),
889
+ )
890
+ : {},
891
+ };
892
+ break;
893
+ case 'READ':
894
+ case 'DELETE':
895
+ // only identifiers are sent
896
+ if (arg) {
897
+ variables = isCustomPrimaryKey
898
+ ? [primaryKeyFieldName, ...sortKeyFieldNames].reduce(
899
+ (acc: Record<string, any>, fieldName) => {
900
+ acc[fieldName] = arg[fieldName];
901
+
902
+ return acc;
903
+ },
904
+ {},
905
+ )
906
+ : { [primaryKeyFieldName]: arg[primaryKeyFieldName] };
907
+ }
908
+
909
+ if (operation === 'DELETE') {
910
+ variables = { input: variables };
911
+ }
912
+ break;
913
+ case 'LIST':
914
+ if (arg?.filter) {
915
+ variables.filter = arg.filter;
916
+ }
917
+ if (arg?.sortDirection) {
918
+ variables.sortDirection = arg.sortDirection;
919
+ variables[primaryKeyFieldName] = arg[primaryKeyFieldName];
920
+ }
921
+ if (arg?.nextToken) {
922
+ variables.nextToken = arg.nextToken;
923
+ }
924
+ if (arg?.limit) {
925
+ variables.limit = arg.limit;
926
+ }
927
+ break;
928
+ case 'INDEX_QUERY': {
929
+ const { pk, sk = [] } = indexMeta!;
930
+
931
+ variables[pk] = arg![pk];
932
+
933
+ for (const skField of sk) {
934
+ variables[skField] = arg![skField];
935
+ }
936
+
937
+ if (arg?.filter) {
938
+ variables.filter = arg.filter;
939
+ }
940
+
941
+ if (arg?.sortDirection) {
942
+ variables.sortDirection = arg.sortDirection;
943
+ }
944
+
945
+ if (arg?.nextToken) {
946
+ variables.nextToken = arg.nextToken;
947
+ }
948
+ if (arg?.limit) {
949
+ variables.limit = arg.limit;
950
+ }
951
+ break;
952
+ }
953
+ case 'ONCREATE':
954
+ case 'ONUPDATE':
955
+ case 'ONDELETE':
956
+ if (arg?.filter) {
957
+ variables = { filter: arg.filter };
958
+ }
959
+ break;
960
+ case 'OBSERVE_QUERY':
961
+ throw new Error(
962
+ 'Internal error: Attempted to build variables for observeQuery. Please report this error.',
963
+ );
964
+ break;
965
+ default: {
966
+ const exhaustiveCheck: never = operation;
967
+ throw new Error(`Unhandled operation case: ${exhaustiveCheck}`);
968
+ }
969
+ }
970
+
971
+ return variables;
972
+ }
973
+
974
+ /**
975
+ * Iterates over mutation input values and resolves any model inputs to their corresponding join fields/values
976
+ *
977
+ * @example
978
+ * ### Usage
979
+ * ```ts
980
+ * const result = normalizeMutationInput({ post: post }, model, modelDefinition);
981
+ * ```
982
+ * ### Result
983
+ * ```ts
984
+ * { postId: "abc123" }
985
+ * ```
986
+ *
987
+ */
988
+ export function normalizeMutationInput(
989
+ mutationInput: QueryArgs,
990
+ model: SchemaModel,
991
+ modelIntrospection: ModelIntrospectionSchema,
992
+ ): QueryArgs {
993
+ const { fields } = model;
994
+
995
+ const normalized: Record<string, unknown> = {};
996
+
997
+ Object.entries(mutationInput).forEach(([inputFieldName, inputValue]) => {
998
+ const fieldType = fields[inputFieldName]?.type as ModelFieldType;
999
+ const relatedModelName = fieldType?.model;
1000
+
1001
+ if (relatedModelName) {
1002
+ const association = fields[inputFieldName]?.association;
1003
+ const relatedModelDef = modelIntrospection.models[relatedModelName];
1004
+ const relatedModelPkInfo = relatedModelDef.primaryKeyInfo;
1005
+
1006
+ if (association?.connectionType === connectionType.HAS_ONE) {
1007
+ const associationHasOne = association as AssociationHasOne;
1008
+ associationHasOne.targetNames.forEach((targetName, idx) => {
1009
+ const associatedFieldName = associationHasOne.associatedWith[idx];
1010
+ normalized[targetName] = (inputValue as Record<string, unknown>)[
1011
+ associatedFieldName
1012
+ ];
1013
+ });
1014
+ }
1015
+
1016
+ if (association?.connectionType === connectionType.BELONGS_TO) {
1017
+ const associationBelongsTo = association as AssociationBelongsTo;
1018
+ associationBelongsTo.targetNames.forEach((targetName, idx) => {
1019
+ if (idx === 0) {
1020
+ const associatedFieldName = relatedModelPkInfo.primaryKeyFieldName;
1021
+ normalized[targetName] = (inputValue as Record<string, unknown>)[
1022
+ associatedFieldName
1023
+ ];
1024
+ } else {
1025
+ const associatedFieldName =
1026
+ relatedModelPkInfo.sortKeyFieldNames[idx - 1];
1027
+ normalized[targetName] = (inputValue as Record<string, unknown>)[
1028
+ associatedFieldName
1029
+ ];
1030
+ }
1031
+ });
1032
+ }
1033
+ } else {
1034
+ normalized[inputFieldName] = inputValue;
1035
+ }
1036
+ });
1037
+
1038
+ return normalized;
1039
+ }
1040
+
1041
+ /**
1042
+ * Produces a parameter object that can contains auth mode/token overrides
1043
+ * only if present in either `options` (first) or configured on the `client`
1044
+ * as a fallback.
1045
+ *
1046
+ * @param client Configured client from `generateClient`
1047
+ * @param options Args/Options object from call site.
1048
+ * @returns
1049
+ */
1050
+ export function authModeParams(
1051
+ client: BaseClient,
1052
+ getInternals: ClientInternalsGetter,
1053
+ options: AuthModeParams = {},
1054
+ ): AuthModeParams {
1055
+ const internals = getInternals(client);
1056
+ return {
1057
+ authMode: options.authMode || internals.authMode,
1058
+ authToken: options.authToken || internals.authToken,
1059
+ };
1060
+ }
1061
+
1062
+ /**
1063
+ * Retrieves custom headers from either the client or request options.
1064
+ * @param client V6Client | V6ClientSSRRequest | V6ClientSSRCookies - for extracting client headers
1065
+ * @param requestHeaders {@link CustomHeaders} - request headers
1066
+ * @returns custom headers as {@link CustomHeaders}
1067
+ */
1068
+ export function getCustomHeaders(
1069
+ client: BaseClient,
1070
+ getInternals: ClientInternalsGetter,
1071
+ requestHeaders?: CustomHeaders,
1072
+ ): CustomHeaders {
1073
+ let headers: CustomHeaders = getInternals(client).headers || {};
1074
+
1075
+ // Individual request headers will take precedence over client headers.
1076
+ // We intentionally do *not* merge client and request headers.
1077
+ if (requestHeaders) {
1078
+ headers = requestHeaders;
1079
+ }
1080
+
1081
+ return headers;
1082
+ }