@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,926 @@
1
+ import { string } from './ModelField.mjs';
2
+ import { accessData, accessSchemaData } from './Authorization.mjs';
3
+ import { CustomOperationNames } from './CustomOperation.mjs';
4
+ import { getBrand } from './util/Brand.mjs';
5
+ import { getHandlerData } from './Handler.mjs';
6
+ import * as os from 'os';
7
+ import * as path from 'path';
8
+
9
+ function isInternalModel(model) {
10
+ if (model.data &&
11
+ !isCustomType(model) &&
12
+ !isCustomOperation(model)) {
13
+ return true;
14
+ }
15
+ return false;
16
+ }
17
+ function isEnumType(data) {
18
+ if (data?.type === 'enum') {
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+ function isCustomType(data) {
24
+ if (data?.data?.type === 'customType') {
25
+ return true;
26
+ }
27
+ return false;
28
+ }
29
+ function isCustomOperation(type) {
30
+ if (CustomOperationNames.includes(type?.data?.typeName)) {
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ function isModelFieldDef(data) {
36
+ return data?.fieldType === 'model';
37
+ }
38
+ function isScalarFieldDef(data) {
39
+ return data?.fieldType !== 'model';
40
+ }
41
+ function isRefFieldDef(data) {
42
+ return data?.type === 'ref';
43
+ }
44
+ function isModelField(field) {
45
+ return isModelFieldDef(field?.data);
46
+ }
47
+ function dataSourceIsRef(dataSource) {
48
+ return (typeof dataSource !== 'string' &&
49
+ dataSource?.data &&
50
+ dataSource.data.type === 'ref');
51
+ }
52
+ function isScalarField(field) {
53
+ return isScalarFieldDef(field?.data);
54
+ }
55
+ function isRefField(field) {
56
+ return isRefFieldDef(field?.data);
57
+ }
58
+ function scalarFieldToGql(fieldDef, identifier, secondaryIndexes = []) {
59
+ const { fieldType, required, array, arrayRequired, default: _default, } = fieldDef;
60
+ let field = fieldType;
61
+ if (identifier !== undefined) {
62
+ field += '!';
63
+ if (identifier.length > 1) {
64
+ const [_pk, ...sk] = identifier;
65
+ field += ` @primaryKey(sortKeyFields: [${sk
66
+ .map((sk) => `"${sk}"`)
67
+ .join(', ')}])`;
68
+ }
69
+ else {
70
+ field += ' @primaryKey';
71
+ }
72
+ for (const index of secondaryIndexes) {
73
+ field += ` ${index}`;
74
+ }
75
+ return field;
76
+ }
77
+ if (required === true) {
78
+ field += '!';
79
+ }
80
+ if (array) {
81
+ field = `[${field}]`;
82
+ if (arrayRequired === true) {
83
+ field += '!';
84
+ }
85
+ }
86
+ if (_default !== undefined) {
87
+ field += ` @default(value: "${_default?.toString()}")`;
88
+ }
89
+ for (const index of secondaryIndexes) {
90
+ field += ` ${index}`;
91
+ }
92
+ return field;
93
+ }
94
+ function modelFieldToGql(fieldDef) {
95
+ const { type, relatedModel, array, valueRequired, arrayRequired, references, } = fieldDef;
96
+ let field = relatedModel;
97
+ if (valueRequired === true) {
98
+ field += '!';
99
+ }
100
+ if (array) {
101
+ field = `[${field}]`;
102
+ }
103
+ if (arrayRequired === true) {
104
+ field += '!';
105
+ }
106
+ if (references && Array.isArray(references) && references.length > 0) {
107
+ field += ` @${type}(references: [${references.map((s) => `"${String(s)}"`)}])`;
108
+ }
109
+ else {
110
+ field += ` @${type}`;
111
+ }
112
+ return field;
113
+ }
114
+ function refFieldToGql(fieldDef) {
115
+ const { link, valueRequired, array, arrayRequired } = fieldDef;
116
+ let field = link;
117
+ if (valueRequired === true) {
118
+ field += '!';
119
+ }
120
+ if (array === true) {
121
+ field = `[${field}]`;
122
+ }
123
+ if (arrayRequired === true) {
124
+ field += '!';
125
+ }
126
+ return field;
127
+ }
128
+ function transformFunctionHandler(handlers, functionFieldName) {
129
+ let gqlHandlerContent = '';
130
+ const lambdaFunctionDefinition = {};
131
+ handlers.forEach((handler, idx) => {
132
+ const handlerData = getHandlerData(handler);
133
+ if (typeof handlerData === 'string') {
134
+ gqlHandlerContent += `@function(name: "${handlerData}") `;
135
+ }
136
+ else if (typeof handlerData.getInstance === 'function') {
137
+ const fnName = `Fn${capitalize(functionFieldName)}${idx === 0 ? '' : `${idx + 1}`}`;
138
+ lambdaFunctionDefinition[fnName] = handlerData;
139
+ gqlHandlerContent += `@function(name: "${fnName}") `;
140
+ }
141
+ else {
142
+ throw new Error(`Invalid value specified for ${functionFieldName} handler.function(). Expected: defineFunction or string.`);
143
+ }
144
+ });
145
+ return { gqlHandlerContent, lambdaFunctionDefinition };
146
+ }
147
+ function customOperationToGql(typeName, typeDef, authorization, isCustom = false, databaseType, getRefType) {
148
+ const { arguments: fieldArgs, typeName: opType, returnType, functionRef, handlers, subscriptionSource, } = typeDef.data;
149
+ let callSignature = typeName;
150
+ const implicitModels = [];
151
+ const { authString } = isCustom
152
+ ? calculateCustomAuth(authorization)
153
+ : calculateAuth(authorization);
154
+ /**
155
+ *
156
+ * @param returnType The return type from the `data` field of a customer operation.
157
+ * @param refererTypeName The type the refers {@link returnType} by `a.ref()`.
158
+ * @param shouldAddCustomTypeToImplicitModels A flag indicates wether it should push
159
+ * the return type resolved CustomType to the `implicitModels` list.
160
+ * @returns
161
+ */
162
+ const resolveReturnTypeNameFromReturnType = (returnType, { refererTypeName, shouldAddCustomTypeToImplicitModels = true, }) => {
163
+ if (isRefField(returnType)) {
164
+ return refFieldToGql(returnType?.data);
165
+ }
166
+ else if (isCustomType(returnType)) {
167
+ const returnTypeName = `${capitalize(refererTypeName)}ReturnType`;
168
+ if (shouldAddCustomTypeToImplicitModels) {
169
+ implicitModels.push([returnTypeName, returnType]);
170
+ }
171
+ return returnTypeName;
172
+ }
173
+ else if (isScalarField(returnType)) {
174
+ return scalarFieldToGql(returnType?.data);
175
+ }
176
+ else {
177
+ throw new Error(`Unrecognized return type on ${typeName}`);
178
+ }
179
+ };
180
+ let returnTypeName;
181
+ if (opType === 'Subscription' && returnType === null) {
182
+ // up to this point, we've validated that each subscription resource resolves
183
+ // the same return type, so it's safe to use subscriptionSource[0] here.
184
+ const { type, def } = getRefType(subscriptionSource[0].data.link, typeName);
185
+ if (type === 'CustomOperation') {
186
+ returnTypeName = resolveReturnTypeNameFromReturnType(def.data.returnType, {
187
+ refererTypeName: subscriptionSource[0].data.link,
188
+ shouldAddCustomTypeToImplicitModels: false,
189
+ });
190
+ }
191
+ else {
192
+ returnTypeName = refFieldToGql(subscriptionSource[0].data);
193
+ }
194
+ }
195
+ else {
196
+ returnTypeName = resolveReturnTypeNameFromReturnType(returnType, {
197
+ refererTypeName: typeName,
198
+ });
199
+ }
200
+ if (Object.keys(fieldArgs).length > 0) {
201
+ const { gqlFields, models } = processFields(typeName, fieldArgs, {}, {});
202
+ callSignature += `(${gqlFields.join(', ')})`;
203
+ implicitModels.push(...models);
204
+ }
205
+ const handler = handlers && handlers[0];
206
+ const brand = handler && getBrand(handler);
207
+ let gqlHandlerContent = '';
208
+ let lambdaFunctionDefinition = {};
209
+ let customSqlDataSourceStrategy;
210
+ if (isFunctionHandler(handlers)) {
211
+ ({ gqlHandlerContent, lambdaFunctionDefinition } = transformFunctionHandler(handlers, typeName));
212
+ }
213
+ else if (functionRef) {
214
+ gqlHandlerContent = `@function(name: "${functionRef}") `;
215
+ }
216
+ else if (databaseType === 'sql' && handler && brand === 'inlineSql') {
217
+ gqlHandlerContent = `@sql(statement: ${escapeGraphQlString(String(getHandlerData(handler)))}) `;
218
+ customSqlDataSourceStrategy = {
219
+ typeName: opType,
220
+ fieldName: typeName,
221
+ };
222
+ }
223
+ else if (isSqlReferenceHandler(handlers)) {
224
+ const handlerData = getHandlerData(handlers[0]);
225
+ const entry = resolveEntryPath(handlerData, 'Could not determine import path to construct absolute code path for sql reference handler. Consider using an absolute path instead.');
226
+ const reference = typeof entry === 'string' ? entry : entry.relativePath;
227
+ customSqlDataSourceStrategy = {
228
+ typeName: opType,
229
+ fieldName: typeName,
230
+ entry,
231
+ };
232
+ gqlHandlerContent = `@sql(reference: "${reference}") `;
233
+ }
234
+ if (opType === 'Subscription') {
235
+ const subscriptionSources = subscriptionSource
236
+ .flatMap((source) => {
237
+ const refTarget = source.data.link;
238
+ const { type } = getRefType(refTarget, typeName);
239
+ if (type === 'CustomOperation') {
240
+ return refTarget;
241
+ }
242
+ if (type === 'Model') {
243
+ return source.data.mutationOperations.map(
244
+ // capitalize explicitly in case customer used lowercase model name
245
+ (op) => `${op}${capitalize(refTarget)}`);
246
+ }
247
+ })
248
+ .join('", "');
249
+ gqlHandlerContent += `@aws_subscribe(mutations: ["${subscriptionSources}"]) `;
250
+ }
251
+ const gqlField = `${callSignature}: ${returnTypeName} ${gqlHandlerContent}${authString}`;
252
+ return {
253
+ gqlField,
254
+ models: implicitModels,
255
+ lambdaFunctionDefinition,
256
+ customSqlDataSourceStrategy,
257
+ };
258
+ }
259
+ /**
260
+ * Escape a string that will be used inside of a graphql string.
261
+ * @param str The input string to be escaped
262
+ * @returns The string with special charactars escaped
263
+ */
264
+ function escapeGraphQlString(str) {
265
+ return JSON.stringify(str);
266
+ }
267
+ /**
268
+ * Tests whether two ModelField definitions are in conflict.
269
+ *
270
+ * This is a shallow check intended to catch conflicts between defined fields
271
+ * and fields implied by authorization rules. Hence, it only compares type
272
+ * and plurality.
273
+ *
274
+ * @param left
275
+ * @param right
276
+ * @returns
277
+ */
278
+ function areConflicting(left, right) {
279
+ // These are the only props we care about for this comparison, because the others
280
+ // (required, arrayRequired, etc) are not specified on auth or FK directives.
281
+ const relevantProps = ['array', 'fieldType'];
282
+ for (const prop of relevantProps) {
283
+ if (left.data[prop] !== right.data[prop]) {
284
+ return true;
285
+ }
286
+ }
287
+ return false;
288
+ }
289
+ /**
290
+ * Merges one field defition object onto an existing one, performing
291
+ * validation (conflict detection) along the way.
292
+ *
293
+ * @param existing An existing field map
294
+ * @param additions A field map to merge in
295
+ */
296
+ function addFields(existing, additions) {
297
+ for (const [k, addition] of Object.entries(additions)) {
298
+ if (!existing[k]) {
299
+ existing[k] = addition;
300
+ }
301
+ else if (areConflicting(existing[k], addition)) {
302
+ throw new Error(`Field ${k} defined twice with conflicting definitions.`);
303
+ }
304
+ else ;
305
+ }
306
+ }
307
+ /**
308
+ * Validate that no implicit fields are used by the model definition
309
+ *
310
+ * @param existing An existing field map
311
+ * @param implicitFields A field map inferred from other schema usage
312
+ *
313
+ * @throws An error when an undefined field is used or when a field is used in a way that conflicts with its generated definition
314
+ */
315
+ function validateStaticFields(existing, implicitFields) {
316
+ if (implicitFields === undefined) {
317
+ return;
318
+ }
319
+ for (const [k, field] of Object.entries(implicitFields)) {
320
+ if (!existing[k]) {
321
+ throw new Error(`Field ${k} isn't defined.`);
322
+ }
323
+ else if (areConflicting(existing[k], field)) {
324
+ throw new Error(`Field ${k} defined twice with conflicting definitions.`);
325
+ }
326
+ }
327
+ }
328
+ /**
329
+ * Validate that no implicit fields conflict with explicitly defined fields.
330
+ *
331
+ * @param existing An existing field map
332
+ * @param implicitFields A field map inferred from other schema usage
333
+ *
334
+ * @throws An error when an undefined field is used or when a field is used in a way that conflicts with its generated definition
335
+ */
336
+ function validateImpliedFields(existing, implicitFields) {
337
+ if (implicitFields === undefined) {
338
+ return;
339
+ }
340
+ for (const [k, field] of Object.entries(implicitFields)) {
341
+ if (existing[k] && areConflicting(existing[k], field)) {
342
+ throw new Error(`Implicit field ${k} conflicts with the explicit field definition.`);
343
+ }
344
+ }
345
+ }
346
+ /**
347
+ * Given a list of authorization rules, produces a set of the implied owner and/or
348
+ * group fields, along with the associated graphql `@auth` string directive.
349
+ *
350
+ * This is intended to be called for each model and field to collect the implied
351
+ * fields and directives from that individual "item's" auth rules.
352
+ *
353
+ * The computed directives are intended to be appended to the graphql field definition.
354
+ *
355
+ * The computed fields will be used to confirm no conflicts between explicit field definitions
356
+ * and implicit auth fields.
357
+ *
358
+ * @param authorization A list of authorization rules.
359
+ * @returns
360
+ */
361
+ function calculateAuth(authorization) {
362
+ const authFields = {};
363
+ const rules = [];
364
+ for (const entry of authorization) {
365
+ const rule = accessData(entry);
366
+ const ruleParts = [];
367
+ if (rule.strategy) {
368
+ ruleParts.push([`allow: ${rule.strategy}`]);
369
+ }
370
+ else {
371
+ return {
372
+ authFields,
373
+ authString: '',
374
+ };
375
+ }
376
+ if (rule.provider) {
377
+ ruleParts.push(`provider: ${rule.provider}`);
378
+ }
379
+ if (rule.operations) {
380
+ ruleParts.push(`operations: [${rule.operations.join(', ')}]`);
381
+ }
382
+ if (rule.groupOrOwnerField) {
383
+ // directive attribute, depending whether it's owner or group auth
384
+ if (rule.strategy === 'groups') {
385
+ // does this need to be escaped?
386
+ ruleParts.push(`groupsField: "${rule.groupOrOwnerField}"`);
387
+ }
388
+ else {
389
+ // does this need to be escaped?
390
+ ruleParts.push(`ownerField: "${rule.groupOrOwnerField}"`);
391
+ }
392
+ // model field dep, type of which depends on whether multiple owner/group
393
+ // is required.
394
+ if (rule.multiOwner) {
395
+ addFields(authFields, { [rule.groupOrOwnerField]: string().array() });
396
+ }
397
+ else {
398
+ addFields(authFields, { [rule.groupOrOwnerField]: string() });
399
+ }
400
+ }
401
+ if (rule.groups) {
402
+ // does `group` need to be escaped?
403
+ ruleParts.push(`groups: [${rule.groups.map((group) => `"${group}"`).join(', ')}]`);
404
+ }
405
+ // identityClaim
406
+ if (rule.identityClaim) {
407
+ // does this need to be escaped?
408
+ ruleParts.push(`identityClaim: "${rule.identityClaim}"`);
409
+ }
410
+ // groupClaim
411
+ if (rule.groupClaim) {
412
+ // does this need to be escaped?
413
+ ruleParts.push(`groupClaim: "${rule.groupClaim}"`);
414
+ }
415
+ rules.push(`{${ruleParts.join(', ')}}`);
416
+ }
417
+ const authString = rules.length > 0 ? `@auth(rules: [${rules.join(',\n ')}])` : '';
418
+ return { authString, authFields };
419
+ }
420
+ function validateCustomAuthRule(rule) {
421
+ if (rule.groups && rule.provider === 'oidc') {
422
+ throw new Error('OIDC group auth is not supported with a.handler.custom');
423
+ }
424
+ }
425
+ function getCustomAuthProvider(rule) {
426
+ const strategyDict = {
427
+ public: {
428
+ default: '@aws_api_key',
429
+ apiKey: '@aws_api_key',
430
+ iam: '@aws_iam',
431
+ },
432
+ private: {
433
+ default: '@aws_cognito_user_pools',
434
+ userPools: '@aws_cognito_user_pools',
435
+ oidc: '@aws_oidc',
436
+ iam: '@aws_iam',
437
+ },
438
+ groups: {
439
+ default: '@aws_cognito_user_pools',
440
+ userPools: '@aws_cognito_user_pools',
441
+ },
442
+ custom: {
443
+ default: '@aws_lambda',
444
+ function: '@aws_lambda',
445
+ },
446
+ };
447
+ const stratProviders = strategyDict[rule.strategy];
448
+ if (stratProviders === undefined) {
449
+ throw new Error(`Unsupported auth strategy for custom handlers: ${rule.strategy}`);
450
+ }
451
+ const provider = rule.provider || 'default';
452
+ const stratProvider = stratProviders[provider];
453
+ if (stratProvider === undefined) {
454
+ throw new Error(`Unsupported provider for custom handlers: ${rule.provider}`);
455
+ }
456
+ return stratProvider;
457
+ }
458
+ function calculateCustomAuth(authorization) {
459
+ const rules = [];
460
+ for (const entry of authorization) {
461
+ const rule = accessData(entry);
462
+ validateCustomAuthRule(rule);
463
+ const provider = getCustomAuthProvider(rule);
464
+ if (rule.groups) {
465
+ // example: (cognito_groups: ["Bloggers", "Readers"])
466
+ rules.push(`${provider}(cognito_groups: [${rule.groups
467
+ .map((group) => `"${group}"`)
468
+ .join(', ')}])`);
469
+ }
470
+ else {
471
+ rules.push(provider);
472
+ }
473
+ }
474
+ const authString = rules.join(' ');
475
+ return { authString };
476
+ }
477
+ function capitalize(s) {
478
+ return `${s[0].toUpperCase()}${s.slice(1)}`;
479
+ }
480
+ function processFieldLevelAuthRules(fields, authFields) {
481
+ const fieldLevelAuthRules = {};
482
+ for (const [fieldName, fieldDef] of Object.entries(fields)) {
483
+ const fieldAuth = fieldDef?.data?.authorization || [];
484
+ const { authString, authFields: fieldAuthField } = calculateAuth(fieldAuth);
485
+ if (authString)
486
+ fieldLevelAuthRules[fieldName] = authString;
487
+ if (fieldAuthField) {
488
+ addFields(authFields, fieldAuthField);
489
+ }
490
+ }
491
+ return fieldLevelAuthRules;
492
+ }
493
+ function processFields(typeName, fields, impliedFields, fieldLevelAuthRules, identifier, partitionKey, secondaryIndexes = {}) {
494
+ const gqlFields = [];
495
+ const models = [];
496
+ validateImpliedFields(fields, impliedFields);
497
+ for (const [fieldName, fieldDef] of Object.entries(fields)) {
498
+ const fieldAuth = fieldLevelAuthRules[fieldName]
499
+ ? ` ${fieldLevelAuthRules[fieldName]}`
500
+ : '';
501
+ if (isModelField(fieldDef)) {
502
+ gqlFields.push(`${fieldName}: ${modelFieldToGql(fieldDef.data)}${fieldAuth}`);
503
+ }
504
+ else if (isScalarField(fieldDef)) {
505
+ if (fieldName === partitionKey) {
506
+ gqlFields.push(`${fieldName}: ${scalarFieldToGql(fieldDef.data, identifier, secondaryIndexes[fieldName])}${fieldAuth}`);
507
+ }
508
+ else if (isRefField(fieldDef)) {
509
+ gqlFields.push(`${fieldName}: ${refFieldToGql(fieldDef.data)}${fieldAuth}`);
510
+ }
511
+ else if (isEnumType(fieldDef)) {
512
+ // The inline enum type name should be `<TypeName><FieldName>` to avoid
513
+ // enum type name conflicts
514
+ const enumName = `${capitalize(typeName)}${capitalize(fieldName)}`;
515
+ models.push([enumName, fieldDef]);
516
+ gqlFields.push(`${fieldName}: ${enumName}`);
517
+ }
518
+ else if (isCustomType(fieldDef)) {
519
+ // The inline CustomType name should be `<TypeName><FieldName>` to avoid
520
+ // CustomType name conflicts
521
+ const customTypeName = `${capitalize(typeName)}${capitalize(fieldName)}`;
522
+ models.push([customTypeName, fieldDef]);
523
+ gqlFields.push(`${fieldName}: ${customTypeName}`);
524
+ }
525
+ else {
526
+ gqlFields.push(`${fieldName}: ${scalarFieldToGql(fieldDef.data, undefined, secondaryIndexes[fieldName])}${fieldAuth}`);
527
+ }
528
+ }
529
+ else {
530
+ throw new Error(`Unexpected field definition: ${fieldDef}`);
531
+ }
532
+ }
533
+ return { gqlFields, models };
534
+ }
535
+ /**
536
+ *
537
+ * @param pk - partition key field name
538
+ * @param sk - (optional) array of sort key field names
539
+ * @returns default query field name
540
+ */
541
+ const secondaryIndexDefaultQueryField = (pk, sk) => {
542
+ const skName = sk?.length ? 'And' + sk?.map(capitalize).join('And') : '';
543
+ const queryField = `listBy${capitalize(pk)}${skName}`;
544
+ return queryField;
545
+ };
546
+ /**
547
+ * Given InternalModelIndexType[] returns a map where the key is the model field to be annotated with an @index directive
548
+ * and the value is an array of transformed Amplify @index directives with all supplied attributes
549
+ */
550
+ const transformedSecondaryIndexesForModel = (secondaryIndexes) => {
551
+ const indexDirectiveWithAttributes = (partitionKey, sortKeys, indexName, queryField) => {
552
+ if (!sortKeys.length && !indexName && !queryField) {
553
+ return `@index(queryField: "${secondaryIndexDefaultQueryField(partitionKey)}")`;
554
+ }
555
+ const attributes = [];
556
+ if (indexName) {
557
+ attributes.push(`name: "${indexName}"`);
558
+ }
559
+ if (sortKeys.length) {
560
+ attributes.push(`sortKeyFields: [${sortKeys.map((sk) => `"${sk}"`).join(', ')}]`);
561
+ }
562
+ if (queryField) {
563
+ attributes.push(`queryField: "${queryField}"`);
564
+ }
565
+ else {
566
+ attributes.push(`queryField: "${secondaryIndexDefaultQueryField(partitionKey, sortKeys)}"`);
567
+ }
568
+ return `@index(${attributes.join(', ')})`;
569
+ };
570
+ return secondaryIndexes.reduce((acc, { data: { partitionKey, sortKeys, indexName, queryField } }) => {
571
+ acc[partitionKey] = acc[partitionKey] || [];
572
+ acc[partitionKey].push(indexDirectiveWithAttributes(partitionKey, sortKeys, indexName, queryField));
573
+ return acc;
574
+ }, {});
575
+ };
576
+ const ruleIsResourceAuth = (authRule) => {
577
+ const data = accessSchemaData(authRule);
578
+ return data.strategy === 'resource';
579
+ };
580
+ /**
581
+ * Separates out lambda resource auth rules from remaining schema rules.
582
+ *
583
+ * @param authRules schema auth rules
584
+ */
585
+ const extractFunctionSchemaAccess = (authRules) => {
586
+ const schemaAuth = [];
587
+ const functionSchemaAccess = [];
588
+ const defaultActions = [
589
+ 'query',
590
+ 'mutate',
591
+ 'listen',
592
+ ];
593
+ for (const rule of authRules) {
594
+ if (ruleIsResourceAuth(rule)) {
595
+ const ruleData = accessSchemaData(rule);
596
+ const fnAccess = {
597
+ resourceProvider: ruleData.resource,
598
+ actions: ruleData.operations || defaultActions,
599
+ };
600
+ functionSchemaAccess.push(fnAccess);
601
+ }
602
+ else {
603
+ schemaAuth.push(rule);
604
+ }
605
+ }
606
+ return { schemaAuth, functionSchemaAccess };
607
+ };
608
+ /**
609
+ * Returns a closure for retrieving reference type and definition from schema
610
+ */
611
+ const getRefTypeForSchema = (schema) => {
612
+ const getRefType = (source, target) => {
613
+ const typeDef = schema.data.types[source];
614
+ if (typeDef === undefined) {
615
+ throw new Error(`Invalid ref. ${target} is referencing ${source} which is not defined in the schema`);
616
+ }
617
+ if (isInternalModel(typeDef)) {
618
+ return { type: 'Model', def: typeDef };
619
+ }
620
+ if (isCustomOperation(typeDef)) {
621
+ return { type: 'CustomOperation', def: typeDef };
622
+ }
623
+ if (isCustomType(typeDef)) {
624
+ return { type: 'CustomType', def: typeDef };
625
+ }
626
+ if (isEnumType(typeDef)) {
627
+ return { type: 'Enum', def: typeDef };
628
+ }
629
+ throw new Error(`Invalid ref. ${target} is referencing ${source} which is neither a Model, Custom Operation, Custom Type, or Enum`);
630
+ };
631
+ return getRefType;
632
+ };
633
+ const schemaPreprocessor = (schema) => {
634
+ const gqlModels = [];
635
+ const customQueries = [];
636
+ const customMutations = [];
637
+ const customSubscriptions = [];
638
+ const jsFunctions = [];
639
+ const lambdaFunctions = {};
640
+ const customSqlDataSourceStrategies = [];
641
+ const databaseType = schema.data.configuration.database.engine === 'dynamodb'
642
+ ? 'dynamodb'
643
+ : 'sql';
644
+ const staticSchema = schema.data.configuration.database.engine === 'dynamodb' ? false : true;
645
+ const topLevelTypes = Object.entries(schema.data.types);
646
+ const { schemaAuth, functionSchemaAccess } = extractFunctionSchemaAccess(schema.data.authorization);
647
+ const getRefType = getRefTypeForSchema(schema);
648
+ for (const [typeName, typeDef] of topLevelTypes) {
649
+ const mostRelevantAuthRules = typeDef.data?.authorization?.length > 0
650
+ ? typeDef.data.authorization
651
+ : schemaAuth;
652
+ if (!isInternalModel(typeDef)) {
653
+ if (isEnumType(typeDef)) {
654
+ if (typeDef.values.some((value) => /\s/.test(value))) {
655
+ throw new Error(`Values of the enum type ${typeName} should not contain any whitespace.`);
656
+ }
657
+ const enumType = `enum ${typeName} {\n ${typeDef.values.join('\n ')}\n}`;
658
+ gqlModels.push(enumType);
659
+ }
660
+ else if (isCustomType(typeDef)) {
661
+ const fields = typeDef.data.fields;
662
+ const fieldAuthApplicableFields = Object.fromEntries(Object.entries(fields).filter((pair) => isModelField(pair[1])));
663
+ const authString = '';
664
+ const authFields = {};
665
+ const fieldLevelAuthRules = processFieldLevelAuthRules(fieldAuthApplicableFields, authFields);
666
+ const { gqlFields, models } = processFields(typeName, fields, authFields, fieldLevelAuthRules);
667
+ topLevelTypes.push(...models);
668
+ const joined = gqlFields.join('\n ');
669
+ const model = `type ${typeName} ${authString}\n{\n ${joined}\n}`;
670
+ gqlModels.push(model);
671
+ }
672
+ else if (isCustomOperation(typeDef)) {
673
+ const { typeName: opType } = typeDef.data;
674
+ const { gqlField, models, jsFunctionForField, lambdaFunctionDefinition, customSqlDataSourceStrategy, } = transformCustomOperations(typeDef, typeName, mostRelevantAuthRules, databaseType, getRefType);
675
+ Object.assign(lambdaFunctions, lambdaFunctionDefinition);
676
+ topLevelTypes.push(...models);
677
+ if (jsFunctionForField) {
678
+ jsFunctions.push(jsFunctionForField);
679
+ }
680
+ if (customSqlDataSourceStrategy) {
681
+ customSqlDataSourceStrategies.push(customSqlDataSourceStrategy);
682
+ }
683
+ switch (opType) {
684
+ case 'Query':
685
+ customQueries.push(gqlField);
686
+ break;
687
+ case 'Mutation':
688
+ customMutations.push(gqlField);
689
+ break;
690
+ case 'Subscription':
691
+ customSubscriptions.push(gqlField);
692
+ break;
693
+ }
694
+ }
695
+ }
696
+ else if (staticSchema) {
697
+ const fields = { ...typeDef.data.fields };
698
+ const identifier = typeDef.data.identifier;
699
+ const [partitionKey] = identifier;
700
+ const { authString, authFields } = calculateAuth(mostRelevantAuthRules);
701
+ if (authString == '') {
702
+ throw new Error(`Model \`${typeName}\` is missing authorization rules. Add global rules to the schema or ensure every model has its own rules.`);
703
+ }
704
+ const fieldLevelAuthRules = processFieldLevelAuthRules(fields, authFields);
705
+ validateStaticFields(fields, authFields);
706
+ const { gqlFields, models } = processFields(typeName, fields, authFields, fieldLevelAuthRules, identifier, partitionKey);
707
+ topLevelTypes.push(...models);
708
+ const joined = gqlFields.join('\n ');
709
+ // TODO: update @model(timestamps: null) once a longer term solution gets
710
+ // determined.
711
+ //
712
+ // Context: SQL schema should not be automatically inserted with timestamp fields,
713
+ // passing (timestamps: null) to @model to suppress this behavior as a short
714
+ // term solution.
715
+ const model = `type ${typeName} @model(timestamps: null) ${authString}\n{\n ${joined}\n}`;
716
+ gqlModels.push(model);
717
+ }
718
+ else {
719
+ const fields = typeDef.data.fields;
720
+ const identifier = typeDef.data.identifier;
721
+ const [partitionKey] = identifier;
722
+ const transformedSecondaryIndexes = transformedSecondaryIndexesForModel(typeDef.data.secondaryIndexes);
723
+ const { authString, authFields } = calculateAuth(mostRelevantAuthRules);
724
+ if (authString == '') {
725
+ throw new Error(`Model \`${typeName}\` is missing authorization rules. Add global rules to the schema or ensure every model has its own rules.`);
726
+ }
727
+ const fieldLevelAuthRules = processFieldLevelAuthRules(fields, authFields);
728
+ const { gqlFields, models } = processFields(typeName, fields, authFields, fieldLevelAuthRules, identifier, partitionKey, transformedSecondaryIndexes);
729
+ topLevelTypes.push(...models);
730
+ const joined = gqlFields.join('\n ');
731
+ const model = `type ${typeName} @model ${authString}\n{\n ${joined}\n}`;
732
+ gqlModels.push(model);
733
+ }
734
+ }
735
+ const customOperations = {
736
+ queries: customQueries,
737
+ mutations: customMutations,
738
+ subscriptions: customSubscriptions,
739
+ };
740
+ gqlModels.push(...generateCustomOperationTypes(customOperations));
741
+ const processedSchema = gqlModels.join('\n\n');
742
+ return {
743
+ schema: processedSchema,
744
+ jsFunctions,
745
+ functionSchemaAccess,
746
+ lambdaFunctions,
747
+ customSqlDataSourceStrategies,
748
+ };
749
+ };
750
+ function validateCustomOperations(typeDef, typeName, authRules, getRefType) {
751
+ const { functionRef, handlers, typeName: opType, subscriptionSource, } = typeDef.data;
752
+ // TODO: remove `functionRef` after deprecating
753
+ const handlerConfigured = functionRef !== null || handlers?.length;
754
+ const authConfigured = authRules.length > 0;
755
+ if ((authConfigured && !handlerConfigured) ||
756
+ (handlerConfigured && !authConfigured)) {
757
+ // Deploying a custom operation with auth and no handler reference OR
758
+ // with a handler reference but no auth
759
+ // causes the CFN stack to reach an unrecoverable state. Ideally, this should be fixed
760
+ // in the CDK construct, but we're catching it early here as a stopgap
761
+ throw new Error(`Custom operation ${typeName} requires both an authorization rule and a handler reference`);
762
+ }
763
+ // Handlers must all be of the same type
764
+ if (handlers?.length) {
765
+ const configuredHandlers = new Set();
766
+ for (const handler of handlers) {
767
+ configuredHandlers.add(getBrand(handler));
768
+ }
769
+ if (configuredHandlers.size > 1) {
770
+ const configuredHandlersStr = JSON.stringify(Array.from(configuredHandlers));
771
+ throw new Error(`Field handlers must be of the same type. ${typeName} has been configured with ${configuredHandlersStr}`);
772
+ }
773
+ }
774
+ if (opType === 'Subscription') {
775
+ if (subscriptionSource.length < 1) {
776
+ throw new Error(`${typeName} is missing a mutation source. Custom subscriptions must reference a mutation source via subscription().for(a.ref('ModelOrOperationName')) `);
777
+ }
778
+ let expectedReturnType;
779
+ for (const source of subscriptionSource) {
780
+ const sourceName = source.data.link;
781
+ const { type, def } = getRefType(sourceName, typeName);
782
+ if (type !== 'Model' && source.data.mutationOperations.length > 0) {
783
+ throw new Error(`Invalid subscription definition. .mutations() modifier can only be used with a Model ref. ${typeName} is referencing ${type}`);
784
+ }
785
+ let resolvedReturnType;
786
+ if (type === 'Model') {
787
+ if (source.data.mutationOperations.length === 0) {
788
+ throw new Error(`Invalid subscription definition. .mutations() modifier must be used with a Model ref subscription source. ${typeName} is referencing ${sourceName} without specifying a mutation`);
789
+ }
790
+ else {
791
+ resolvedReturnType = def;
792
+ }
793
+ }
794
+ if (type === 'CustomOperation') {
795
+ if (def.data.typeName !== 'Mutation') {
796
+ throw new Error(`Invalid subscription definition. .for() can only reference a mutation. ${typeName} is referencing ${sourceName} which is a ${def.data.typeName}`);
797
+ }
798
+ else {
799
+ const returnType = def.data.returnType;
800
+ if (isRefField(returnType)) {
801
+ ({ def: resolvedReturnType } = getRefType(returnType.data.link, typeName));
802
+ }
803
+ else {
804
+ resolvedReturnType = returnType;
805
+ }
806
+ }
807
+ }
808
+ expectedReturnType = expectedReturnType ?? resolvedReturnType;
809
+ // As the return types are resolved from the root `schema` object and they should
810
+ // not be mutated, we compare by references here.
811
+ if (expectedReturnType !== resolvedReturnType) {
812
+ throw new Error(`Invalid subscription definition. .for() can only reference resources that have the same return type. ${typeName} is referencing resources that have different return types.`);
813
+ }
814
+ }
815
+ }
816
+ }
817
+ const isSqlReferenceHandler = (handler) => {
818
+ return Array.isArray(handler) && getBrand(handler[0]) === 'sqlReference';
819
+ };
820
+ const isCustomHandler = (handler) => {
821
+ return Array.isArray(handler) && getBrand(handler[0]) === 'customHandler';
822
+ };
823
+ const isFunctionHandler = (handler) => {
824
+ return Array.isArray(handler) && getBrand(handler[0]) === 'functionHandler';
825
+ };
826
+ const normalizeDataSourceName = (dataSource) => {
827
+ // default data source
828
+ const noneDataSourceName = 'NONE_DS';
829
+ if (dataSource === undefined) {
830
+ return noneDataSourceName;
831
+ }
832
+ if (dataSourceIsRef(dataSource)) {
833
+ return `${dataSource.data.link}Table`;
834
+ }
835
+ return dataSource;
836
+ };
837
+ const sanitizeStackTrace = (stackTrace) => {
838
+ // normalize EOL to \n so that parsing is consistent across platforms
839
+ const normalizedStackTrace = stackTrace.replace(new RegExp(os.EOL), '\n');
840
+ return (normalizedStackTrace
841
+ .split('\n')
842
+ .map((line) => line.trim())
843
+ // filters out noise not relevant to the stack trace. All stack trace lines begin with 'at'
844
+ .filter((line) => line.startsWith('at')) || []);
845
+ };
846
+ // copied from the defineFunction path resolution impl:
847
+ // https://github.com/aws-amplify/amplify-backend/blob/main/packages/backend-function/src/get_caller_directory.ts
848
+ const resolveEntryPath = (data, errorMessage) => {
849
+ if (path.isAbsolute(data.entry)) {
850
+ return data.entry;
851
+ }
852
+ if (!data.stack) {
853
+ throw new Error(errorMessage);
854
+ }
855
+ const stackTraceLines = sanitizeStackTrace(data.stack);
856
+ if (stackTraceLines.length < 2) {
857
+ throw new Error(errorMessage);
858
+ }
859
+ const stackTraceImportLine = stackTraceLines[1]; // the first entry is the file where the error was initialized (our code). The second entry is where the customer called our code which is what we are interested in
860
+ // if entry is relative, compute with respect to the caller directory
861
+ return { relativePath: data.entry, importLine: stackTraceImportLine };
862
+ };
863
+ const handleCustom = (handlers, opType, typeName) => {
864
+ const transformedHandlers = handlers.map((handler) => {
865
+ const handlerData = getHandlerData(handler);
866
+ return {
867
+ dataSource: normalizeDataSourceName(handlerData.dataSource),
868
+ entry: resolveEntryPath(handlerData, 'Could not determine import path to construct absolute code path for custom handler. Consider using an absolute path instead.'),
869
+ };
870
+ });
871
+ const jsFn = {
872
+ typeName: opType,
873
+ fieldName: typeName,
874
+ handlers: transformedHandlers,
875
+ };
876
+ return jsFn;
877
+ };
878
+ function transformCustomOperations(typeDef, typeName, authRules, databaseType, getRefType) {
879
+ const { typeName: opType, handlers } = typeDef.data;
880
+ let jsFunctionForField = undefined;
881
+ validateCustomOperations(typeDef, typeName, authRules, getRefType);
882
+ if (isCustomHandler(handlers)) {
883
+ jsFunctionForField = handleCustom(handlers, opType, typeName);
884
+ }
885
+ const isCustom = Boolean(jsFunctionForField);
886
+ const { gqlField, models, lambdaFunctionDefinition, customSqlDataSourceStrategy, } = customOperationToGql(typeName, typeDef, authRules, isCustom, databaseType, getRefType);
887
+ return {
888
+ gqlField,
889
+ models,
890
+ jsFunctionForField,
891
+ lambdaFunctionDefinition,
892
+ customSqlDataSourceStrategy,
893
+ };
894
+ }
895
+ function generateCustomOperationTypes({ queries, mutations, subscriptions, }) {
896
+ const types = [];
897
+ if (mutations.length > 0) {
898
+ types.push(`type Mutation {\n ${mutations.join('\n ')}\n}`);
899
+ }
900
+ if (queries.length > 0) {
901
+ types.push(`type Query {\n ${queries.join('\n ')}\n}`);
902
+ }
903
+ if (subscriptions.length > 0) {
904
+ types.push(`type Subscription {\n ${subscriptions.join('\n ')}\n}`);
905
+ }
906
+ return types;
907
+ }
908
+ /**
909
+ * Returns API definition from ModelSchema or string schema
910
+ * @param arg - { schema }
911
+ * @returns DerivedApiDefinition that conforms to IAmplifyGraphqlDefinition
912
+ */
913
+ function processSchema(arg) {
914
+ const { schema, jsFunctions, functionSchemaAccess, lambdaFunctions, customSqlDataSourceStrategies, } = schemaPreprocessor(arg.schema);
915
+ return {
916
+ schema,
917
+ functionSlots: [],
918
+ jsFunctions,
919
+ functionSchemaAccess,
920
+ lambdaFunctions,
921
+ customSqlDataSourceStrategies,
922
+ };
923
+ }
924
+
925
+ export { processSchema };
926
+ //# sourceMappingURL=SchemaProcessor.mjs.map