@aws-amplify/data-schema 1.2.7 → 1.2.8

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.
@@ -1245,13 +1245,29 @@ const schemaPreprocessor = (
1245
1245
  getRefType,
1246
1246
  );
1247
1247
 
1248
+ topLevelTypes.push(...implicitTypes);
1249
+
1248
1250
  mergeCustomTypeAuthRules(
1249
1251
  customTypeInheritedAuthRules,
1250
1252
  customTypeAuthRules,
1251
1253
  );
1252
- Object.assign(lambdaFunctions, lambdaFunctionDefinition);
1253
1254
 
1254
- topLevelTypes.push(...implicitTypes);
1255
+ if (customTypeAuthRules) {
1256
+ const nestedCustomTypeNames = extractNestedCustomTypeNames(
1257
+ customTypeAuthRules,
1258
+ topLevelTypes,
1259
+ getRefType,
1260
+ );
1261
+
1262
+ for (const nestedCustomType of nestedCustomTypeNames) {
1263
+ mergeCustomTypeAuthRules(customTypeInheritedAuthRules, {
1264
+ typeName: nestedCustomType,
1265
+ authRules: customTypeAuthRules.authRules, // apply the same auth rules as the top-level custom type
1266
+ });
1267
+ }
1268
+ }
1269
+
1270
+ Object.assign(lambdaFunctions, lambdaFunctionDefinition);
1255
1271
 
1256
1272
  if (jsFunctionForField) {
1257
1273
  jsFunctions.push(jsFunctionForField);
@@ -1666,6 +1682,55 @@ function generateCustomOperationTypes({
1666
1682
  return types;
1667
1683
  }
1668
1684
 
1685
+ function extractNestedCustomTypeNames(
1686
+ customTypeAuthRules: CustomTypeAuthRules,
1687
+ topLevelTypes: [string, any][],
1688
+ getRefType: ReturnType<typeof getRefTypeForSchema>,
1689
+ ): string[] {
1690
+ if (!customTypeAuthRules) {
1691
+ return [];
1692
+ }
1693
+
1694
+ const [_, customTypeDef] = topLevelTypes.find(
1695
+ ([topLevelTypeName]) => customTypeAuthRules.typeName === topLevelTypeName,
1696
+ )!;
1697
+
1698
+ // traverse the custom type's fields and extract any nested custom type names.
1699
+ // Those nested custom types also inherit the custom op's auth configuration.
1700
+ // Supports both inline custom types and refs to custom types
1701
+ const traverseCustomTypeFields = (
1702
+ name: string,
1703
+ typeDef: any,
1704
+ namesList: string[] = [],
1705
+ ) => {
1706
+ const fields = typeDef.data.fields as Record<string, any>;
1707
+
1708
+ for (const [fieldName, fieldDef] of Object.entries(fields)) {
1709
+ if (isCustomType(fieldDef)) {
1710
+ const customTypeName = `${capitalize(name)}${capitalize(fieldName)}`;
1711
+ namesList.push(customTypeName);
1712
+ traverseCustomTypeFields(customTypeName, fieldDef, namesList);
1713
+ } else if (isRefField(fieldDef)) {
1714
+ const refType = getRefType(fieldDef.data.link, name);
1715
+
1716
+ if (refType.type === 'CustomType') {
1717
+ namesList.push(fieldDef.data.link);
1718
+ traverseCustomTypeFields(fieldDef.data.link, refType.def, namesList);
1719
+ }
1720
+ }
1721
+ }
1722
+
1723
+ return namesList;
1724
+ };
1725
+
1726
+ const nestedCustomTypeNames = traverseCustomTypeFields(
1727
+ customTypeAuthRules.typeName,
1728
+ customTypeDef,
1729
+ );
1730
+
1731
+ return nestedCustomTypeNames;
1732
+ }
1733
+
1669
1734
  /**
1670
1735
  * Returns API definition from ModelSchema or string schema
1671
1736
  * @param arg - { schema }