@aws-amplify/data-schema 1.2.6 → 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.
package/src/SchemaProcessor.ts
CHANGED
|
@@ -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
|
-
|
|
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);
|
|
@@ -1425,6 +1441,15 @@ function validateCustomOperations(
|
|
|
1425
1441
|
}
|
|
1426
1442
|
}
|
|
1427
1443
|
|
|
1444
|
+
if (
|
|
1445
|
+
typeDef.data.returnType === null &&
|
|
1446
|
+
(opType === 'Query' || opType === 'Mutation')
|
|
1447
|
+
) {
|
|
1448
|
+
throw new Error(
|
|
1449
|
+
`Invalid Custom ${opType} definition. A Custom ${opType} must include a return type. ${typeName} has no return type specified.`,
|
|
1450
|
+
);
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1428
1453
|
if (opType !== 'Subscription' && subscriptionSource.length > 0) {
|
|
1429
1454
|
throw new Error(
|
|
1430
1455
|
`The .for() modifier function can only be used with a custom subscription. ${typeName} is not a custom subscription.`,
|
|
@@ -1657,6 +1682,55 @@ function generateCustomOperationTypes({
|
|
|
1657
1682
|
return types;
|
|
1658
1683
|
}
|
|
1659
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
|
+
|
|
1660
1734
|
/**
|
|
1661
1735
|
* Returns API definition from ModelSchema or string schema
|
|
1662
1736
|
* @param arg - { schema }
|