From 3aca7b89f530c536c28a53b7290fdab877b2260b Mon Sep 17 00:00:00 2001 From: Tim Schmelter Date: Wed, 29 Jan 2025 13:42:38 -0800 Subject: [PATCH 1/4] fix(gen2): transform directives on fields of supported extended types (#3127) --- codebuild_specs/e2e_workflow.yml | 126 ++++---- .../package.json | 1 + .../custom-query-mutation-extension/app.ts | 68 +++++ .../authorizer.ts | 8 + .../hello-apigw.ts | 7 + .../hello-resolver.ts | 3 + .../custom-query-mutation-extension.test.ts | 165 ++++++++++ .../amplify-graphql-auth-transformer/API.md | 5 +- .../src/__tests__/extended-types.test.ts | 284 ++++++++++++++++++ .../src/graphql-auth-transformer.ts | 21 +- .../src/utils/schema.ts | 52 ++-- .../src/utils/validations.ts | 15 +- .../API.md | 5 +- .../src/__tests__/extended-types.test.ts | 85 ++++++ .../src/graphql-function-transformer.ts | 22 +- .../amplify-graphql-http-transformer/API.md | 5 +- .../__snapshots__/extended-types.test.ts.snap | 172 +++++++++++ .../src/__tests__/extended-types.test.ts | 80 +++++ .../src/graphql-http-transformer.ts | 54 ++-- .../amplify-graphql-transformer-core/API.md | 4 +- .../src/transformation/transform.ts | 98 ++++-- .../src/transformation/utils.ts | 30 +- .../src/utils/graphql-utils.ts | 24 +- .../API.md | 2 + .../src/transformer-plugin-provider.ts | 19 +- scripts/split-e2e-tests.ts | 1 + 26 files changed, 1193 insertions(+), 163 deletions(-) create mode 100644 packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/app.ts create mode 100644 packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/authorizer.ts create mode 100644 packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-apigw.ts create mode 100644 packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-resolver.ts create mode 100644 packages/amplify-graphql-api-construct-tests/src/__tests__/custom-query-mutation-extension.test.ts create mode 100644 packages/amplify-graphql-auth-transformer/src/__tests__/extended-types.test.ts create mode 100644 packages/amplify-graphql-function-transformer/src/__tests__/extended-types.test.ts create mode 100644 packages/amplify-graphql-http-transformer/src/__tests__/__snapshots__/extended-types.test.ts.snap create mode 100644 packages/amplify-graphql-http-transformer/src/__tests__/extended-types.test.ts diff --git a/codebuild_specs/e2e_workflow.yml b/codebuild_specs/e2e_workflow.yml index 1cdfb88beb..1e4bfbaa29 100644 --- a/codebuild_specs/e2e_workflow.yml +++ b/codebuild_specs/e2e_workflow.yml @@ -743,7 +743,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=14848' TEST_SUITE: >- src/__tests__/utils.test.ts|src/__tests__/log-config.test.ts|src/__tests__/ddb-iam-access.test.ts|src/__tests__/data-construct.test.ts|src/__tests__/custom-logic.test.ts - CLI_REGION: eu-west-3 + CLI_REGION: me-south-1 depend-on: - publish_to_local_registry - identifier: >- @@ -755,7 +755,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=14848' TEST_SUITE: >- src/__tests__/amplify-table-5.test.ts|src/__tests__/add-resources.test.ts|src/__tests__/migration/references-migration.test.ts|src/__tests__/migration/migration-validation.test.ts|src/__tests__/migration/many-to-many-migration.test.ts - CLI_REGION: ap-southeast-2 + CLI_REGION: ca-central-1 depend-on: - publish_to_local_registry - identifier: >- @@ -767,7 +767,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=14848' TEST_SUITE: >- src/__tests__/migration/base-migration.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/single-gsi-single-record.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/single-gsi-empty-table.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/single-gsi-1k-records.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/single-gsi-10k-records.test.ts - CLI_REGION: ap-south-1 + CLI_REGION: ap-southeast-1 depend-on: - publish_to_local_registry - identifier: >- @@ -779,7 +779,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=14848' TEST_SUITE: >- src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-update-attr-single-record.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-update-attr-empty-table.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-update-attr-1k-records.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-update-attr-10k-records.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-single-record.test.ts - CLI_REGION: ap-southeast-1 + CLI_REGION: ap-southeast-2 depend-on: - publish_to_local_registry - identifier: >- @@ -791,7 +791,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=14848' TEST_SUITE: >- src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-empty-table.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-1k-records.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/replace-2-gsis-10k-records.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/3-gsis-single-record.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/3-gsis-empty-table.test.ts - CLI_REGION: ap-southeast-2 + CLI_REGION: ca-central-1 depend-on: - publish_to_local_registry - identifier: 3_gsis_1k_records_3_gsis_10k_records @@ -802,7 +802,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=14848' TEST_SUITE: >- src/__tests__/deploy-velocity-temporarily-disabled/3-gsis-1k-records.test.ts|src/__tests__/deploy-velocity-temporarily-disabled/3-gsis-10k-records.test.ts - CLI_REGION: ca-central-1 + CLI_REGION: eu-central-1 depend-on: - publish_to_local_registry - identifier: sql_pg_userpool_auth @@ -926,6 +926,16 @@ batch: CLI_REGION: eu-west-3 depend-on: - publish_to_local_registry + - identifier: custom_query_mutation_extension + buildspec: codebuild_specs/run_cdk_tests.yml + env: + compute-type: BUILD_GENERAL1_MEDIUM + variables: + NODE_OPTIONS: '--max-old-space-size=6656' + TEST_SUITE: src/__tests__/custom-query-mutation-extension.test.ts + CLI_REGION: me-south-1 + depend-on: + - publish_to_local_registry - identifier: base_cdk_ap_east_1 buildspec: codebuild_specs/run_cdk_tests.yml env: @@ -1133,7 +1143,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/amplify-table-4.test.ts - CLI_REGION: sa-east-1 + CLI_REGION: us-east-1 depend-on: - publish_to_local_registry - identifier: amplify_table_3 @@ -1143,7 +1153,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/amplify-table-3.test.ts - CLI_REGION: us-east-1 + CLI_REGION: us-east-2 depend-on: - publish_to_local_registry - identifier: amplify_table_2 @@ -1153,7 +1163,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/amplify-table-2.test.ts - CLI_REGION: us-east-2 + CLI_REGION: us-west-1 depend-on: - publish_to_local_registry - identifier: amplify_table_1 @@ -1163,7 +1173,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/amplify-table-1.test.ts - CLI_REGION: us-west-1 + CLI_REGION: us-west-2 depend-on: - publish_to_local_registry - identifier: amplify_ddb_canary @@ -1173,7 +1183,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/amplify-ddb-canary.test.ts - CLI_REGION: us-west-2 + CLI_REGION: ap-east-1 depend-on: - publish_to_local_registry - identifier: all_auth_modes @@ -1183,7 +1193,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/all-auth-modes.test.ts - CLI_REGION: ap-east-1 + CLI_REGION: ap-northeast-1 depend-on: - publish_to_local_registry - identifier: admin_role @@ -1193,7 +1203,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/admin-role.test.ts - CLI_REGION: ap-northeast-1 + CLI_REGION: ap-northeast-2 depend-on: - publish_to_local_registry - identifier: sql_custom_ssl @@ -1203,7 +1213,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/sql-custom-ssl/sql-custom-ssl.test.ts - CLI_REGION: eu-north-1 + CLI_REGION: eu-west-1 depend-on: - publish_to_local_registry - identifier: restricted_field_auth_gen2 @@ -1214,7 +1224,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/restricted-field-auth/restricted-field-auth-gen2.test.ts - CLI_REGION: ap-southeast-2 + CLI_REGION: ca-central-1 depend-on: - publish_to_local_registry - identifier: restricted_field_auth_gen1 @@ -1225,7 +1235,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/restricted-field-auth/restricted-field-auth-gen1.test.ts - CLI_REGION: ca-central-1 + CLI_REGION: eu-central-1 depend-on: - publish_to_local_registry - identifier: restricted_field_auth_gen2_subscriptions_off @@ -1236,7 +1246,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/restricted-field-auth/subscriptions-off/restricted-field-auth-gen2-subscriptions-off.test.ts - CLI_REGION: eu-central-1 + CLI_REGION: eu-north-1 depend-on: - publish_to_local_registry - identifier: restricted_field_auth_gen1_subscriptions_off @@ -1247,7 +1257,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/restricted-field-auth/subscriptions-off/restricted-field-auth-gen1-subscriptions-off.test.ts - CLI_REGION: eu-north-1 + CLI_REGION: eu-south-1 depend-on: - publish_to_local_registry - identifier: references_sqlprimary_sqlrelated @@ -1258,7 +1268,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/references/references-sqlprimary-sqlrelated.test.ts - CLI_REGION: ca-central-1 + CLI_REGION: eu-central-1 depend-on: - publish_to_local_registry - identifier: references_sqlprimary_ddbrelated @@ -1269,7 +1279,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/references/references-sqlprimary-ddbrelated.test.ts - CLI_REGION: eu-central-1 + CLI_REGION: eu-north-1 depend-on: - publish_to_local_registry - identifier: references_ddbprimary_sqlrelated @@ -1280,7 +1290,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/references/references-ddbprimary-sqlrelated.test.ts - CLI_REGION: eu-north-1 + CLI_REGION: eu-south-1 depend-on: - publish_to_local_registry - identifier: references_ddbprimary_ddbrelated @@ -1291,7 +1301,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/references/references-ddbprimary-ddbrelated.test.ts - CLI_REGION: eu-south-1 + CLI_REGION: eu-west-1 depend-on: - publish_to_local_registry - identifier: recursive_relationships_sql @@ -1302,7 +1312,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/recursive/recursive-relationships-sql.test.ts - CLI_REGION: eu-west-1 + CLI_REGION: eu-west-2 depend-on: - publish_to_local_registry - identifier: recursive_relationships_ddb @@ -1313,7 +1323,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/recursive/recursive-relationships-ddb.test.ts - CLI_REGION: eu-west-2 + CLI_REGION: eu-west-3 depend-on: - publish_to_local_registry - identifier: uuid_pk_sqlprimary_sqlrelated @@ -1324,7 +1334,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/postgres-uuid-pk/uuid-pk-sqlprimary-sqlrelated.test.ts - CLI_REGION: eu-west-3 + CLI_REGION: me-south-1 depend-on: - publish_to_local_registry - identifier: uuid_pk_sqlprimary_ddbrelated @@ -1335,7 +1345,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/postgres-uuid-pk/uuid-pk-sqlprimary-ddbrelated.test.ts - CLI_REGION: me-south-1 + CLI_REGION: sa-east-1 depend-on: - publish_to_local_registry - identifier: uuid_pk_ddbprimary_sqlrelated @@ -1346,7 +1356,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/postgres-uuid-pk/uuid-pk-ddbprimary-sqlrelated.test.ts - CLI_REGION: sa-east-1 + CLI_REGION: us-east-1 depend-on: - publish_to_local_registry - identifier: multi_relationship_sqlprimary_sqlrelated @@ -1357,7 +1367,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/multi-relationship/multi-relationship-sqlprimary-sqlrelated.test.ts - CLI_REGION: us-east-1 + CLI_REGION: us-east-2 depend-on: - publish_to_local_registry - identifier: multi_relationship_sqlprimary_ddbrelated @@ -1368,7 +1378,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/multi-relationship/multi-relationship-sqlprimary-ddbrelated.test.ts - CLI_REGION: us-east-2 + CLI_REGION: us-west-1 depend-on: - publish_to_local_registry - identifier: multi_relationship_ddbprimary_sqlrelated @@ -1379,7 +1389,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/multi-relationship/multi-relationship-ddbprimary-sqlrelated.test.ts - CLI_REGION: us-west-1 + CLI_REGION: us-west-2 depend-on: - publish_to_local_registry - identifier: multi_relationship_ddbprimary_ddbrelated @@ -1390,7 +1400,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/relationships/multi-relationship/multi-relationship-ddbprimary-ddbrelated.test.ts - CLI_REGION: us-west-2 + CLI_REGION: ap-east-1 depend-on: - publish_to_local_registry - identifier: relationships_gen1 @@ -1400,7 +1410,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/relationships/gen1/relationships-gen1.test.ts - CLI_REGION: ap-east-1 + CLI_REGION: ap-northeast-1 depend-on: - publish_to_local_registry - identifier: assoc_field_subscriptions_off @@ -1411,7 +1421,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/owner-auth/subscriptions-off/assoc-field-subscriptions-off.test.ts - CLI_REGION: ap-southeast-1 + CLI_REGION: ap-southeast-2 depend-on: - publish_to_local_registry - identifier: bind_sql_ids @@ -1421,7 +1431,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/owner-auth/bind-sql-ids/bind-sql-ids.test.ts - CLI_REGION: ap-southeast-2 + CLI_REGION: ca-central-1 depend-on: - publish_to_local_registry - identifier: assoc_field_sqlprimary_sqlrelated @@ -1432,7 +1442,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/owner-auth/assoc-field/assoc-field-sqlprimary-sqlrelated.test.ts - CLI_REGION: ca-central-1 + CLI_REGION: eu-central-1 depend-on: - publish_to_local_registry - identifier: assoc_field_sqlprimary_ddbrelated @@ -1443,7 +1453,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/owner-auth/assoc-field/assoc-field-sqlprimary-ddbrelated.test.ts - CLI_REGION: eu-central-1 + CLI_REGION: eu-north-1 depend-on: - publish_to_local_registry - identifier: assoc_field_ddbprimary_sqlrelated @@ -1454,7 +1464,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/owner-auth/assoc-field/assoc-field-ddbprimary-sqlrelated.test.ts - CLI_REGION: eu-north-1 + CLI_REGION: eu-south-1 depend-on: - publish_to_local_registry - identifier: assoc_field_ddbprimary_ddbrelated @@ -1465,7 +1475,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/owner-auth/assoc-field/assoc-field-ddbprimary-ddbrelated.test.ts - CLI_REGION: eu-south-1 + CLI_REGION: eu-west-1 depend-on: - publish_to_local_registry - identifier: static_group_auth_sqlprimary_sqlrelated_subscriptions_off @@ -1476,7 +1486,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/static-group-auth/static-group-auth-sqlprimary-sqlrelated-subscriptions-off.test.ts - CLI_REGION: eu-west-2 + CLI_REGION: eu-west-3 depend-on: - publish_to_local_registry - identifier: static_group_auth_sqlprimary_ddbrelated_subscriptions_off @@ -1487,7 +1497,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/static-group-auth/static-group-auth-sqlprimary-ddbrelated-subscriptions-off.test.ts - CLI_REGION: eu-west-3 + CLI_REGION: me-south-1 depend-on: - publish_to_local_registry - identifier: static_group_auth_ddbprimary_sqlrelated_subscriptions_off @@ -1498,7 +1508,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/static-group-auth/static-group-auth-ddbprimary-sqlrelated-subscriptions-off.test.ts - CLI_REGION: me-south-1 + CLI_REGION: sa-east-1 depend-on: - publish_to_local_registry - identifier: static_group_auth_ddbprimary_ddbrelated_subscriptions_off @@ -1509,7 +1519,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/static-group-auth/static-group-auth-ddbprimary-ddbrelated-subscriptions-off.test.ts - CLI_REGION: sa-east-1 + CLI_REGION: us-east-1 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_sqlprimary_sqlrelated_subscriptions_off @@ -1520,7 +1530,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/dynamic-group-auth/dynamic-group-auth-sqlprimary-sqlrelated-subscriptions-off.test.ts - CLI_REGION: us-east-1 + CLI_REGION: us-east-2 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_sqlprimary_ddbrelated_subscriptions_off @@ -1531,7 +1541,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/dynamic-group-auth/dynamic-group-auth-sqlprimary-ddbrelated-subscriptions-off.test.ts - CLI_REGION: us-east-2 + CLI_REGION: us-west-1 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_ddbprimary_sqlrelated_subscriptions_off @@ -1542,7 +1552,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/dynamic-group-auth/dynamic-group-auth-ddbprimary-sqlrelated-subscriptions-off.test.ts - CLI_REGION: us-west-1 + CLI_REGION: us-west-2 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_ddbprimary_ddbrelated_subscriptions_off @@ -1553,7 +1563,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/subscriptions-off/dynamic-group-auth/dynamic-group-auth-ddbprimary-ddbrelated-subscriptions-off.test.ts - CLI_REGION: us-west-2 + CLI_REGION: ap-northeast-1 depend-on: - publish_to_local_registry - identifier: static_group_auth_sqlprimary_sqlrelated @@ -1564,7 +1574,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/static-group-auth/static-group-auth-sqlprimary-sqlrelated.test.ts - CLI_REGION: ap-northeast-1 + CLI_REGION: ap-northeast-2 depend-on: - publish_to_local_registry - identifier: static_group_auth_sqlprimary_ddbrelated @@ -1575,7 +1585,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/static-group-auth/static-group-auth-sqlprimary-ddbrelated.test.ts - CLI_REGION: ap-northeast-2 + CLI_REGION: ap-northeast-3 depend-on: - publish_to_local_registry - identifier: static_group_auth_ddbprimary_sqlrelated @@ -1586,7 +1596,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/static-group-auth/static-group-auth-ddbprimary-sqlrelated.test.ts - CLI_REGION: ap-northeast-3 + CLI_REGION: ap-south-1 depend-on: - publish_to_local_registry - identifier: static_group_auth_ddbprimary_ddbrelated @@ -1597,7 +1607,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/static-group-auth/static-group-auth-ddbprimary-ddbrelated.test.ts - CLI_REGION: ap-south-1 + CLI_REGION: ap-southeast-1 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_sqlprimary_sqlrelated @@ -1608,7 +1618,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/dynamic-group-auth/dynamic-group-auth-sqlprimary-sqlrelated.test.ts - CLI_REGION: ap-southeast-1 + CLI_REGION: ap-southeast-2 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_sqlprimary_ddbrelated @@ -1619,7 +1629,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/dynamic-group-auth/dynamic-group-auth-sqlprimary-ddbrelated.test.ts - CLI_REGION: ap-southeast-2 + CLI_REGION: ca-central-1 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_ddbprimary_sqlrelated @@ -1630,7 +1640,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/dynamic-group-auth/dynamic-group-auth-ddbprimary-sqlrelated.test.ts - CLI_REGION: ca-central-1 + CLI_REGION: eu-central-1 depend-on: - publish_to_local_registry - identifier: dynamic_group_auth_ddbprimary_ddbrelated @@ -1641,7 +1651,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/group-auth/dynamic-group-auth/dynamic-group-auth-ddbprimary-ddbrelated.test.ts - CLI_REGION: eu-central-1 + CLI_REGION: eu-north-1 depend-on: - publish_to_local_registry - identifier: generation @@ -1662,7 +1672,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/deploy-velocity/single-gsi-100k-records.test.ts - CLI_REGION: eu-central-1 + CLI_REGION: eu-north-1 depend-on: - publish_to_local_registry - identifier: replace_2_gsis_update_attr_100k_records @@ -1673,7 +1683,7 @@ batch: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: >- src/__tests__/deploy-velocity/replace-2-gsis-update-attr-100k-records.test.ts - CLI_REGION: eu-north-1 + CLI_REGION: eu-south-1 depend-on: - publish_to_local_registry - identifier: replace_2_gsis_100k_records @@ -1683,7 +1693,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/deploy-velocity/replace-2-gsis-100k-records.test.ts - CLI_REGION: eu-south-1 + CLI_REGION: eu-west-1 depend-on: - publish_to_local_registry - identifier: 3_gsis_100k_records @@ -1693,7 +1703,7 @@ batch: variables: NODE_OPTIONS: '--max-old-space-size=6656' TEST_SUITE: src/__tests__/deploy-velocity/3-gsis-100k-records.test.ts - CLI_REGION: eu-west-1 + CLI_REGION: eu-west-2 depend-on: - publish_to_local_registry - identifier: conversation diff --git a/packages/amplify-graphql-api-construct-tests/package.json b/packages/amplify-graphql-api-construct-tests/package.json index 98d15d0d04..fe66a8764d 100644 --- a/packages/amplify-graphql-api-construct-tests/package.json +++ b/packages/amplify-graphql-api-construct-tests/package.json @@ -41,6 +41,7 @@ "aws-appsync": "^4.1.1", "fs-extra": "^8.1.0", "generate-password": "~1.7.0", + "graphql": "^15.5.0", "node-fetch": "^2.6.7", "ws": "^8.18.0" }, diff --git a/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/app.ts b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/app.ts new file mode 100644 index 0000000000..783ec37ded --- /dev/null +++ b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/app.ts @@ -0,0 +1,68 @@ +#!/usr/bin/env node +// eslint-disable-next-line import/no-extraneous-dependencies +import 'source-map-support/register'; +import * as path from 'path'; +import { App, Stack, Duration } from 'aws-cdk-lib'; +import { AmplifyGraphqlApi, AmplifyGraphqlDefinition } from '@aws-amplify/graphql-api-construct'; +import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; +import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const packageJson = require('../package.json'); + +const app = new App(); +const stack = new Stack(app, packageJson.name.replace(/_/g, '-'), { + env: { region: process.env.CLI_REGION || 'us-west-2' }, +}); + +const helloFn = new NodejsFunction(stack, 'HelloApiGwFunction', { entry: path.join(__dirname, 'hello-apigw.ts') }); + +const restApi = new LambdaRestApi(stack, 'HelloApi', { + handler: helloFn, + proxy: false, +}); + +const restApiUrl = restApi.url; + +const helloResource = restApi.root.addResource('hello'); +helloResource.addMethod('GET'); + +new AmplifyGraphqlApi(stack, 'ExtensionTest', { + definition: AmplifyGraphqlDefinition.fromString(/* GraphQL */ ` + type Query { + myFunctionQueryBase: String @function(name: "myFunctionQueryBase") @auth(rules: [{ allow: custom }]) + myHttpQueryBase: String @http(url: "${restApiUrl}/hello") @auth(rules: [{ allow: custom }]) + } + + extend type Query { + myFunctionQueryExtended: String @function(name: "myFunctionQueryExtended") @auth(rules: [{ allow: custom }]) + myHttpQueryExtended: String @http(url: "${restApiUrl}/hello") @auth(rules: [{ allow: custom }]) + } + + type Mutation { + myFunctionMutationBase: String @function(name: "myFunctionQueryBase") @auth(rules: [{ allow: custom }]) + myHttpMutationBase: String @http(url: "${restApiUrl}/hello") @auth(rules: [{ allow: custom }]) + } + + extend type Mutation { + myFunctionMutationExtended: String @function(name: "myFunctionQueryExtended") @auth(rules: [{ allow: custom }]) + myHttpMutationExtended: String @http(url: "${restApiUrl}/hello") @auth(rules: [{ allow: custom }]) + } + `), + + functionNameMap: { + myFunctionQueryBase: new NodejsFunction(stack, 'FunctionQueryBase', { entry: path.join(__dirname, 'hello-resolver.ts') }), + myFunctionQueryExtended: new NodejsFunction(stack, 'FunctionQueryExtended', { entry: path.join(__dirname, 'hello-resolver.ts') }), + }, + + authorizationModes: { + // Make sure we keep API Key as the default auth mode. The tests include specific assertions that we do not fall back to the API's + // default auth mode + defaultAuthorizationMode: 'API_KEY', + apiKeyConfig: { expires: Duration.days(2) }, + lambdaConfig: { + function: new NodejsFunction(stack, 'Authorizer', { entry: path.join(__dirname, 'authorizer.ts') }), + ttl: Duration.minutes(0), + }, + }, +}); diff --git a/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/authorizer.ts b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/authorizer.ts new file mode 100644 index 0000000000..c51cd29607 --- /dev/null +++ b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/authorizer.ts @@ -0,0 +1,8 @@ +exports.handler = async (event) => { + const { authorizationToken } = event; + const response = { + isAuthorized: authorizationToken === 'custom-authorized', + ttlOverride: 0, + }; + return response; +}; diff --git a/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-apigw.ts b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-apigw.ts new file mode 100644 index 0000000000..b37465d534 --- /dev/null +++ b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-apigw.ts @@ -0,0 +1,7 @@ +exports.handler = async () => { + return { + statusCode: 200, + headers: { 'Content-Type': 'text/plain' }, + body: JSON.stringify({ message: 'Hello from API Gateway' }), + }; +}; diff --git a/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-resolver.ts b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-resolver.ts new file mode 100644 index 0000000000..3a0d6a6a89 --- /dev/null +++ b/packages/amplify-graphql-api-construct-tests/src/__tests__/backends/custom-query-mutation-extension/hello-resolver.ts @@ -0,0 +1,3 @@ +exports.handler = async () => { + return 'Hello from Lambda resolver'; +}; diff --git a/packages/amplify-graphql-api-construct-tests/src/__tests__/custom-query-mutation-extension.test.ts b/packages/amplify-graphql-api-construct-tests/src/__tests__/custom-query-mutation-extension.test.ts new file mode 100644 index 0000000000..066b445d10 --- /dev/null +++ b/packages/amplify-graphql-api-construct-tests/src/__tests__/custom-query-mutation-extension.test.ts @@ -0,0 +1,165 @@ +import * as path from 'path'; +import { createNewProjectDir, deleteProjectDir } from 'amplify-category-api-e2e-core'; +import AWSAppSyncClient, { AUTH_TYPE } from 'aws-appsync'; +import { parse } from 'graphql'; +import { initCDKProject, cdkDeploy, cdkDestroy } from '../commands'; + +import { DURATION_1_HOUR } from '../utils/duration-constants'; + +jest.setTimeout(DURATION_1_HOUR); + +describe('custom queries and mutations in type extensions', () => { + let projRoot: string; + const projFolderName = 'typeext'; + + const queryOnBaseType = /* GraphQL */ ` + query MyQuery { + myFunctionQueryBase + myHttpQueryBase + } + `; + + const queryOnExtendedType = /* GraphQL */ ` + query MyQuery { + myFunctionQueryExtended + myHttpQueryExtended + } + `; + + const mutationOnBaseType = /* GraphQL */ ` + mutation MyMutation { + myFunctionMutationBase + myHttpMutationBase + } + `; + + const mutationOnExtendedType = /* GraphQL */ ` + mutation MyMutation { + myFunctionMutationExtended + myHttpMutationExtended + } + `; + + const region = process.env.CLI_REGION ?? 'us-west-2'; + + let apiKeyAppSyncClient: AWSAppSyncClient; + let lambdaAppSyncClient: AWSAppSyncClient; + + beforeAll(async () => { + projRoot = await createNewProjectDir(projFolderName); + const templatePath = path.resolve(path.join(__dirname, 'backends', 'custom-query-mutation-extension')); + const name = await initCDKProject(projRoot, templatePath); + const outputs = await cdkDeploy(projRoot, '--all'); + const apiEndpoint = outputs[name].awsAppsyncApiEndpoint; + const apiKey = outputs[name].awsAppsyncApiKey; + + // All fields allow Lambda authorization, so we expect both to succeed + lambdaAppSyncClient = new AWSAppSyncClient({ + url: apiEndpoint, + region, + disableOffline: true, + auth: { + type: AUTH_TYPE.AWS_LAMBDA, + token: 'custom-authorized', + }, + }); + + // No field allows API key authorization, so we expect all to fail, even though the API's default authorization mode is API_KEY + apiKeyAppSyncClient = new AWSAppSyncClient({ + url: apiEndpoint, + region, + disableOffline: true, + auth: { type: AUTH_TYPE.API_KEY, apiKey }, + }); + }); + + afterAll(async () => { + try { + await cdkDestroy(projRoot, '--all'); + } catch (err) { + console.log(`Error invoking 'cdk destroy': ${err}`); + } + + deleteProjectDir(projRoot); + }); + + test('authorized clients can access base Query fields', async () => { + const lambdaBaseTypeQueryResult: any = await lambdaAppSyncClient.query({ + query: parse(queryOnBaseType), + fetchPolicy: 'no-cache', + }); + const { myFunctionQueryBase, myHttpQueryBase } = lambdaBaseTypeQueryResult.data; + expect(myFunctionQueryBase).toContain('Hello from Lambda resolver'); + expect(myHttpQueryBase).toContain('Hello from API Gateway'); + }); + + test('authorized clients can access extended Query fields', async () => { + const lambdaExtendedTypeQueryResult: any = await lambdaAppSyncClient.query({ + query: parse(queryOnExtendedType), + fetchPolicy: 'no-cache', + }); + const { myFunctionQueryExtended, myHttpQueryExtended } = lambdaExtendedTypeQueryResult.data; + expect(myFunctionQueryExtended).toContain('Hello from Lambda resolver'); + expect(myHttpQueryExtended).toContain('Hello from API Gateway'); + }); + + test('authorized clients can access base Mutation fields', async () => { + const lambdaBaseTypeMutationResult: any = await lambdaAppSyncClient.mutate({ + mutation: parse(mutationOnBaseType), + fetchPolicy: 'no-cache', + }); + const { myFunctionMutationBase, myHttpMutationBase } = lambdaBaseTypeMutationResult.data; + expect(myFunctionMutationBase).toContain('Hello from Lambda resolver'); + expect(myHttpMutationBase).toContain('Hello from API Gateway'); + }); + + test('authorized clients can access extended Mutation fields', async () => { + const lambdaExtendedTypeMutationResult: any = await lambdaAppSyncClient.mutate({ + mutation: parse(mutationOnExtendedType), + fetchPolicy: 'no-cache', + }); + const { myFunctionMutationExtended, myHttpMutationExtended } = lambdaExtendedTypeMutationResult.data; + expect(myFunctionMutationExtended).toContain('Hello from Lambda resolver'); + expect(myHttpMutationExtended).toContain('Hello from API Gateway'); + }); + + test('unauthorized clients cannot access base Query fields', async () => { + await expect( + async () => + await apiKeyAppSyncClient.query({ + query: parse(queryOnBaseType), + fetchPolicy: 'no-cache', + }), + ).rejects.toThrow('GraphQL error: Not Authorized to access myFunctionQueryBase on type Query'); + }); + + test('unauthorized clients cannot access extended Query fields', async () => { + await expect( + async () => + await apiKeyAppSyncClient.query({ + query: parse(queryOnExtendedType), + fetchPolicy: 'no-cache', + }), + ).rejects.toThrow('GraphQL error: Not Authorized to access myFunctionQueryExtended on type Query'); + }); + + test('unauthorized clients cannot access base Mutation fields', async () => { + await expect( + async () => + await apiKeyAppSyncClient.mutate({ + mutation: parse(mutationOnBaseType), + fetchPolicy: 'no-cache', + }), + ).rejects.toThrow('GraphQL error: Not Authorized to access myFunctionMutationBase on type Mutation'); + }); + + test('unauthorized clients cannot access extended Mutation fields', async () => { + await expect( + async () => + await apiKeyAppSyncClient.mutate({ + mutation: parse(mutationOnExtendedType), + fetchPolicy: 'no-cache', + }), + ).rejects.toThrow('GraphQL error: Not Authorized to access myFunctionMutationExtended on type Mutation'); + }); +}); diff --git a/packages/amplify-graphql-auth-transformer/API.md b/packages/amplify-graphql-auth-transformer/API.md index 755b401dd4..bca6de7a0b 100644 --- a/packages/amplify-graphql-auth-transformer/API.md +++ b/packages/amplify-graphql-auth-transformer/API.md @@ -10,6 +10,7 @@ import { FieldDefinitionNode } from 'graphql'; import { GetArgumentsOptions } from '@aws-amplify/graphql-transformer-core'; import { InterfaceTypeDefinitionNode } from 'graphql'; import { ObjectTypeDefinitionNode } from 'graphql'; +import { ObjectTypeExtensionNode } from 'graphql'; import { TransformerAuthBase } from '@aws-amplify/graphql-transformer-core'; import { TransformerAuthProvider } from '@aws-amplify/graphql-transformer-interfaces'; import { TransformerBeforeStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces'; @@ -120,7 +121,9 @@ export class AuthTransformer extends TransformerAuthBase implements TransformerA // (undocumented) before: (context: TransformerBeforeStepContextProvider) => void; // (undocumented) - field: (parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, field: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider) => void; + field: (parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, field: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider) => void; + // (undocumented) + fieldOfExtendedType: (parent: ObjectTypeExtensionNode, field: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider) => void; // (undocumented) generateResolvers: (context: TransformerContextProvider) => void; // (undocumented) diff --git a/packages/amplify-graphql-auth-transformer/src/__tests__/extended-types.test.ts b/packages/amplify-graphql-auth-transformer/src/__tests__/extended-types.test.ts new file mode 100644 index 0000000000..e1e1dca68e --- /dev/null +++ b/packages/amplify-graphql-auth-transformer/src/__tests__/extended-types.test.ts @@ -0,0 +1,284 @@ +import { ModelTransformer } from '@aws-amplify/graphql-model-transformer'; +import { testTransform } from '@aws-amplify/graphql-transformer-test-utils'; +import { AppSyncAuthConfiguration } from '@aws-amplify/graphql-transformer-interfaces'; +import { DocumentNode, FieldDefinitionNode, Kind, ObjectTypeDefinitionNode, parse } from 'graphql'; +import { AuthTransformer } from '../graphql-auth-transformer'; + +describe('@auth directive on extended types', () => { + const authConfig: AppSyncAuthConfiguration = { + defaultAuthentication: { + authenticationType: 'AMAZON_COGNITO_USER_POOLS', + }, + additionalAuthenticationProviders: [{ authenticationType: 'AWS_IAM' }], + }; + + const getObjectType = (doc: DocumentNode, type: string): ObjectTypeDefinitionNode | undefined => { + return doc.definitions.find((def) => def.kind === Kind.OBJECT_TYPE_DEFINITION && def.name.value === type) as + | ObjectTypeDefinitionNode + | undefined; + }; + + const expectNoDirectives = (fieldOrType: ObjectTypeDefinitionNode | FieldDefinitionNode | undefined): void => { + expect(fieldOrType?.directives?.length).toEqual(0); + }; + + const expectOneDirective = (fieldOrType: ObjectTypeDefinitionNode | FieldDefinitionNode | undefined, directiveName: string): void => { + expect(fieldOrType?.directives?.length).toEqual(1); + expect(fieldOrType?.directives?.find((d) => d.name.value === directiveName)).toBeDefined(); + }; + + const expectDirectiveWithName = ( + fieldOrType: ObjectTypeDefinitionNode | FieldDefinitionNode | undefined, + directiveName: string, + ): void => { + expect(fieldOrType?.directives?.find((d) => d.name.value === directiveName)).toBeDefined(); + }; + + const getField = (type: ObjectTypeDefinitionNode | undefined, name: string): FieldDefinitionNode | undefined => + type?.fields?.find((f) => f.name.value === name); + + test('supports @auth directive on a type that has been extended', () => { + const schema = /* GraphQL */ ` + type Todo @model @auth(rules: [{ allow: public, provider: iam }]) { + id: ID! + description: String + } + + extend type Todo { + extendedField: String! + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new ModelTransformer(), new AuthTransformer()], + }; + + const out = testTransform(testTransformParams); + expect(out).toBeDefined(); + + const transformedSchema = out.schema; + const doc = parse(transformedSchema); + + const todoType = getObjectType(doc, 'Todo'); + expect(todoType).toBeDefined(); + expectDirectiveWithName(todoType, 'aws_iam'); + }); + + test('does not support @auth directive on the model type extension itself', () => { + const schema = /* GraphQL */ ` + type Todo @model { + id: ID! + description: String + } + + extend type Todo @auth(rules: [{ allow: public, provider: iam }]) { + extendedField: String! + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new ModelTransformer(), new AuthTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow( + "Directives are not supported on object or interface extensions. See the '@auth' directive on 'Todo'", + ); + }); + + test('does not support @auth directive on fields of model type extensions', () => { + const schema = /* GraphQL */ ` + type Todo @model { + id: ID! + description: String + } + + extend type Todo @auth(rules: [{ allow: public, provider: iam }]) { + extendedField: String! + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new ModelTransformer(), new AuthTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow( + "Directives are not supported on object or interface extensions. See the '@auth' directive on 'Todo'", + ); + }); + + test.each(['Query', 'Mutation', 'Subscription'])('supports @auth directive on fields of %s type extensions', (builtInType: string) => { + const schema = /* GraphQL */ ` + type ${builtInType} { + customOperation1: String! @auth(rules: [{ allow: public, provider: iam }]) + } + + extend type ${builtInType} { + customOperation2: String! @auth(rules: [{ allow: public, provider: iam }]) + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new AuthTransformer()], + }; + + const out = testTransform(testTransformParams); + expect(out).toBeDefined(); + + const transformedSchema = out.schema; + const doc = parse(transformedSchema); + + const operationType = getObjectType(doc, builtInType); + expect(operationType).toBeDefined(); + expectNoDirectives(operationType!); + expectOneDirective(getField(operationType, 'customOperation1'), 'aws_iam'); + expectOneDirective(getField(operationType, 'customOperation2'), 'aws_iam'); + }); + + test.each(['Query', 'Mutation', 'Subscription'])( + 'does not support @auth directive on %s object extension itself', + (builtInType: string) => { + const schema = /* GraphQL */ ` + type ${builtInType} { + customOperation1: String! @auth(rules: [{ allow: public, provider: iam }]) + } + + extend type ${builtInType} @auth(rules: [{ allow: public, provider: iam }]) { + customOperation2: String! + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new AuthTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow( + `Directives are not supported on object or interface extensions. See the '@auth' directive on '${builtInType}'`, + ); + }, + ); + + test('does not support @auth directive on fields of non-model type extensions', () => { + const schema = /* GraphQL */ ` + type Foo { + customField1: String! @auth(rules: [{ allow: public, provider: iam }]) + } + + extend type Foo { + customField2: String! @auth(rules: [{ allow: public, provider: iam }]) + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new AuthTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow( + "The '@auth' directive cannot be used on fields of type extensions other than 'Query', 'Mutation', and 'Subscription'. See Foo.customField2", + ); + }); + + test('supports @aws_ directives on model types', () => { + const schema = /* GraphQL */ ` + type Todo @model @auth(rules: [{ allow: public, provider: iam }]) { + id: ID! + description: String + } + + extend type Todo { + extendedField: String! @aws_cognito_user_pools + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new ModelTransformer(), new AuthTransformer()], + }; + + const out = testTransform(testTransformParams); + expect(out).toBeDefined(); + + const transformedSchema = out.schema; + const doc = parse(transformedSchema); + + const todoType = getObjectType(doc, 'Todo'); + expect(todoType).toBeDefined(); + + const extendedField = todoType?.fields?.find((f) => f.name.value === 'extendedField'); + expectDirectiveWithName(extendedField, 'aws_cognito_user_pools'); + }); + + test('does not support duplicate field names on Query extensions', () => { + const schema = /* GraphQL */ ` + type Query { + customField1: String! @auth(rules: [{ allow: public, provider: iam }]) + } + + extend type Query { + customField1: Int @auth(rules: [{ allow: public, provider: iam }]) + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new AuthTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow("Object type extension 'Query' cannot redeclare field customField1"); + }); + + test('does not support duplicate field names on @model type extensions', () => { + const schema = /* GraphQL */ ` + type Todo @model @auth(rules: [{ allow: public, provider: iam }]) { + id: ID! + description: String + } + + extend type Todo { + description: Int + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new AuthTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow("Object type extension 'Todo' cannot redeclare field description"); + }); + + test('does not support duplicate field names on non-model type extensions', () => { + const schema = /* GraphQL */ ` + type Foo { + id: ID! + description: String + } + + extend type Foo { + description: Int + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new AuthTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow("Object type extension 'Foo' cannot redeclare field description"); + }); +}); diff --git a/packages/amplify-graphql-auth-transformer/src/graphql-auth-transformer.ts b/packages/amplify-graphql-auth-transformer/src/graphql-auth-transformer.ts index 4ac4990c89..28fb22d0cd 100644 --- a/packages/amplify-graphql-auth-transformer/src/graphql-auth-transformer.ts +++ b/packages/amplify-graphql-auth-transformer/src/graphql-auth-transformer.ts @@ -36,6 +36,7 @@ import { TypeDefinitionNode, ListValueNode, StringValueNode, + ObjectTypeExtensionNode, } from 'graphql'; import { merge } from 'lodash'; import { @@ -260,14 +261,14 @@ export class AuthTransformer extends TransformerAuthBase implements TransformerA }; field = ( - parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, + parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, field: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider, ): void => { if (parent.kind === Kind.INTERFACE_TYPE_DEFINITION) { throw new InvalidDirectiveError( - `The @auth directive cannot be placed on an interface's field. See ${parent.name.value}${field.name.value}`, + `The @auth directive cannot be placed on an interface's field. See ${parent.name.value}.${field.name.value}`, ); } const isParentTypeBuiltinType = @@ -344,6 +345,15 @@ export class AuthTransformer extends TransformerAuthBase implements TransformerA } }; + fieldOfExtendedType = ( + parent: ObjectTypeExtensionNode, + field: FieldDefinitionNode, + directive: DirectiveNode, + context: TransformerSchemaVisitStepContextProvider, + ): void => { + this.field(parent, field, directive, context); + }; + /** * Adds custom Queries, Mutations, and Subscriptions to the authNonModelConfig map to ensure they are included when adding implicit * aws_iam auth directives. @@ -746,11 +756,12 @@ export class AuthTransformer extends TransformerAuthBase implements TransformerA typeName: string, field: FieldDefinitionNode, fieldRoles: Array, - needsFieldResolver: boolean = false, + needsFieldResolver = false, ): void => { let fieldAuthExpression: string; let relatedAuthExpression: string; - // Relational field redaction is default to `needsFieldResolver`, which stays consistent with current behavior of always redacting relational field when field resolver is needed + // Relational field redaction is default to `needsFieldResolver`, which stays consistent with current behavior of always redacting + // relational field when field resolver is needed let redactRelationalField: boolean = needsFieldResolver; const fieldIsRequired = field.type.kind === Kind.NON_NULL_TYPE; if (fieldIsRequired) { @@ -805,7 +816,7 @@ export class AuthTransformer extends TransformerAuthBase implements TransformerA * Once there is one role detected to have access on both side, the auth role definitions will be compared to determine whether * to redac the field or not */ - for (let fieldRole of fieldReadRoleDefinitions) { + for (const fieldRole of fieldReadRoleDefinitions) { // When two role definitions have an overlap if (isFieldRoleHavingAccessToBothSide(fieldRole, filteredRelatedModelReadRoleDefinitions)) { // Check if two role definitions are identical without dynamic auth role or custom auth role diff --git a/packages/amplify-graphql-auth-transformer/src/utils/schema.ts b/packages/amplify-graphql-auth-transformer/src/utils/schema.ts index e7d7a22b79..cfcac3ce70 100644 --- a/packages/amplify-graphql-auth-transformer/src/utils/schema.ts +++ b/packages/amplify-graphql-auth-transformer/src/utils/schema.ts @@ -15,7 +15,7 @@ import { TransformerContextProvider, } from '@aws-amplify/graphql-transformer-interfaces'; import type { TransformParameters } from '@aws-amplify/graphql-transformer-interfaces'; -import { ObjectTypeDefinitionNode, FieldDefinitionNode, DirectiveNode, NamedTypeNode } from 'graphql'; +import { ObjectTypeDefinitionNode, FieldDefinitionNode, DirectiveNode, NamedTypeNode, ObjectTypeExtensionNode } from 'graphql'; import { blankObjectExtension, extendFieldWithDirectives, @@ -34,19 +34,19 @@ import { RelationalPrimaryMapConfig, SearchableConfig } from './definitions'; import { RoleDefinition } from './role-definition'; /** - * collectFieldNames + * Return an array of the field names in `object` */ -export const collectFieldNames = (object: ObjectTypeDefinitionNode): Array => +export const collectFieldNames = (object: ObjectTypeDefinitionNode | ObjectTypeExtensionNode): Array => object.fields!.map((field: FieldDefinitionNode) => field.name.value); /** - * fieldIsList + * Return true if the `fieldName` element of `fields` is a list type. */ -export const fieldIsList = (fields: ReadonlyArray, fieldName: string) => +export const fieldIsList = (fields: ReadonlyArray, fieldName: string): boolean => fields.some((field) => field.name.value === fieldName && isListType(field.type)); /** - * getModelConfig + * Construct a {@link ModelDirectiveConfiguration} for the specified typeName. */ export const getModelConfig = ( directive: DirectiveNode, @@ -102,6 +102,7 @@ export const getSearchableConfig = ( ); return options; }; + /* This handles the scenario where a @auth field is also included in the key schema of a related @model since a filter expression cannot contain partition key or sort key attributes. We need to run auth on the query expression @@ -133,6 +134,7 @@ export const getRelationalPrimaryMap = ( }, generateGetArgumentsInput(ctx.transformParameters), ); + // we only generate a primary map if a index name or field is specified // if both are undefined then @hasMany will create a new gsi with a new readonly field // we don't need a primary map since this readonly field is not a auth field @@ -162,16 +164,17 @@ export const getRelationalPrimaryMap = ( generateGetArgumentsInput(ctx.transformParameters), ); const relatedPrimaryFields = getKeyFields(ctx, relatedModel); - // the fields provided by the directive (implicit/explicit) need to match the total amount of fields used for the primary key in the related table - // otherwise the get request is incomplete + + // the fields provided by the directive (implicit/explicit) need to match the total amount of fields used for the primary key in the + // related table otherwise the get request is incomplete if (args.fields.length !== relatedPrimaryFields.length) { throw new InvalidDirectiveError( `Invalid @${relationalDirective.name.value} on ${def.name.value}:${field.name.value}. ` + `Provided fields do not match the size of primary key(s) for ${relatedModel.name.value}`, ); } - relatedPrimaryFields.forEach((field, idx) => { - primaryFieldMap.set(field, { + relatedPrimaryFields.forEach((relatedPrimaryField, idx) => { + primaryFieldMap.set(relatedPrimaryField, { claim: 'source', field: args.fields[idx], }); @@ -181,19 +184,18 @@ export const getRelationalPrimaryMap = ( }; /** - * + * Return true if the specified field has any relational directive (hasOne, hasMany, belongsTo, manyToMany) */ export const hasRelationalDirective = (field: FieldDefinitionNode): boolean => field.directives && field.directives.some((dir) => RELATIONAL_DIRECTIVES.includes(dir.name.value)); /** - * - * given the keySchema from a DynamoDBDataSource it will return the partitionKey + * Given the keySchema from a DynamoDBDataSource, return the partitionKey */ export const getPartitionKey = (ks: any): string => ks.find((att: any) => att.keyType === 'HASH')!.attributeName; /** - * extendTypeWithDirectives + * Create a new extension type for `typeName`, and adds the specified directives to it. Mutates the relevant output objects of `ctx`. */ export const extendTypeWithDirectives = ( ctx: TransformerTransformSchemaStepContextProvider, @@ -206,14 +208,14 @@ export const extendTypeWithDirectives = ( }; /** - * addDirectivesToField + * Add the specified directives to `{typeName}.{fieldName}`. Mutates the relevant output objects of `ctx`. */ export const addDirectivesToField = ( ctx: TransformerTransformSchemaStepContextProvider, typeName: string, fieldName: string, directives: Array, -) => { +): void => { const type = ctx.output.getType(typeName) as ObjectTypeDefinitionNode; if (type) { const field = type.fields?.find((f) => f.name.value === fieldName); @@ -231,14 +233,15 @@ export const addDirectivesToField = ( }; /** - * addSubscriptionArguments + * Adds subscription filter arguments to `Subscription.{operationName}` based on the supplied `subscriptionRoles`. For example, if + * `subscriptionRoles` contains an owner rule, this method adds an input definition for the specified owner field. Mutates the relevant + * output objects of `ctx`. */ -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type export const addSubscriptionArguments = ( ctx: TransformerTransformSchemaStepContextProvider, operationName: string, subscriptionRoles: Array, -) => { +): void => { let subscription = ctx.output.getSubscription()!; let createField: FieldDefinitionNode = subscription!.fields!.find((field) => field.name.value === operationName) as FieldDefinitionNode; const subscriptionArgumentList = subscriptionRoles.map((role) => makeInputValueDefinition(role.entity!, makeNamedType('String'))); @@ -254,14 +257,15 @@ export const addSubscriptionArguments = ( }; /** - * addDirectivesToOperation + * Add specified directives to both the field `{typeName}.{operationName}`, and the result type of that field. Mutates the relevant output + * objects of `ctx`. */ export const addDirectivesToOperation = ( ctx: TransformerTransformSchemaStepContextProvider, typeName: string, operationName: string, directives: Array, -) => { +): void => { // add directives to the given operation addDirectivesToField(ctx, typeName, operationName, directives); @@ -283,7 +287,7 @@ export const addDirectivesToOperation = ( }; /** - * getQueryFieldNames + * Return all fields of the `Query` type for the specified model */ export const getQueryFieldNames = ( modelDirectiveConfig: ModelDirectiveConfiguration, @@ -316,7 +320,7 @@ export const getQueryFieldNames = ( }; /** - * getMutationFieldNames + * Return all fields of the `Mutation` type for the specified model */ export const getMutationFieldNames = ( modelDirectiveConfig: ModelDirectiveConfiguration, @@ -350,7 +354,7 @@ export const getMutationFieldNames = ( }; /** - * getSubscriptionFieldNames + * Return all fields of the `Subscription` type for the specified model */ export const getSubscriptionFieldNames = ( modelDirectiveConfig: ModelDirectiveConfiguration, diff --git a/packages/amplify-graphql-auth-transformer/src/utils/validations.ts b/packages/amplify-graphql-auth-transformer/src/utils/validations.ts index f1f50544ce..815a779749 100644 --- a/packages/amplify-graphql-auth-transformer/src/utils/validations.ts +++ b/packages/amplify-graphql-auth-transformer/src/utils/validations.ts @@ -5,13 +5,10 @@ import { isModelType, isSqlModel, } from '@aws-amplify/graphql-transformer-core'; -import type { - TransformParameters, - TransformerContextProvider, - DataSourceStrategiesProvider, -} from '@aws-amplify/graphql-transformer-interfaces'; -import { ObjectTypeDefinitionNode, InterfaceTypeDefinitionNode } from 'graphql'; +import type { TransformParameters, DataSourceStrategiesProvider } from '@aws-amplify/graphql-transformer-interfaces'; +import { ObjectTypeDefinitionNode, InterfaceTypeDefinitionNode, ObjectTypeExtensionNode } from 'graphql'; import { AuthRule, ConfiguredAuthProviders } from './definitions'; +// eslint-disable-next-line import/no-cycle import { isAuthProviderEqual } from './index'; export const validateRuleAuthStrategy = (rule: AuthRule, configuredAuthProviders: ConfiguredAuthProviders) => { @@ -24,7 +21,7 @@ export const validateRuleAuthStrategy = (rule: AuthRule, configuredAuthProviders ); } if (rule.allow === 'groups' && !rule.groups && !rule.groupsField) { - throw new InvalidDirectiveError(`@auth directive with 'groups' should have a defined groups list or a groupsField.`); + throw new InvalidDirectiveError("@auth directive with 'groups' should have a defined groups list or a groupsField."); } // @@ -158,7 +155,7 @@ export const validateFieldRules = ( parentHasModelDirective: boolean, fieldName: string, transformParameters: TransformParameters, - parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, + parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, dataSourceStrategies: DataSourceStrategiesProvider, ): void => { const rules = authDir.getArguments<{ rules: Array }>({ rules: [] }, generateGetArgumentsInput(transformParameters)).rules; @@ -187,7 +184,7 @@ operations will be generated by the CLI.`, }; // common rule validation between obj and field -export const commonRuleValidation = (rule: AuthRule) => { +export const commonRuleValidation = (rule: AuthRule): void => { const { identityClaim, allow, groups, groupsField, groupClaim } = rule; if (allow === 'groups' && identityClaim) { throw new InvalidDirectiveError(` diff --git a/packages/amplify-graphql-function-transformer/API.md b/packages/amplify-graphql-function-transformer/API.md index 1c2a6e0df4..c68c3afd89 100644 --- a/packages/amplify-graphql-function-transformer/API.md +++ b/packages/amplify-graphql-function-transformer/API.md @@ -9,6 +9,7 @@ import { FieldDefinitionNode } from 'graphql'; import { InterfaceTypeDefinitionNode } from 'graphql'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import { ObjectTypeDefinitionNode } from 'graphql'; +import { ObjectTypeExtensionNode } from 'graphql'; import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces'; import { TransformerPluginBase } from '@aws-amplify/graphql-transformer-core'; import { TransformerSchemaVisitStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces'; @@ -17,7 +18,9 @@ import { TransformerSchemaVisitStepContextProvider } from '@aws-amplify/graphql- export class FunctionTransformer extends TransformerPluginBase { constructor(functionNameMap?: Record | undefined); // (undocumented) - field: (parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, definition: FieldDefinitionNode, directive: DirectiveNode, acc: TransformerSchemaVisitStepContextProvider) => void; + field: (parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, definition: FieldDefinitionNode, directive: DirectiveNode, acc: TransformerSchemaVisitStepContextProvider) => void; + // (undocumented) + fieldOfExtendedType: (parent: ObjectTypeExtensionNode, field: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider) => void; // (undocumented) generateResolvers: (context: TransformerContextProvider) => void; } diff --git a/packages/amplify-graphql-function-transformer/src/__tests__/extended-types.test.ts b/packages/amplify-graphql-function-transformer/src/__tests__/extended-types.test.ts new file mode 100644 index 0000000000..e8d197dd16 --- /dev/null +++ b/packages/amplify-graphql-function-transformer/src/__tests__/extended-types.test.ts @@ -0,0 +1,85 @@ +import { testTransform } from '@aws-amplify/graphql-transformer-test-utils'; +import { AppSyncAuthConfiguration } from '@aws-amplify/graphql-transformer-interfaces'; +import { FunctionTransformer } from '..'; + +describe('@function directive on extended types', () => { + const authConfig: AppSyncAuthConfiguration = { + defaultAuthentication: { + authenticationType: 'AMAZON_COGNITO_USER_POOLS', + }, + additionalAuthenticationProviders: [{ authenticationType: 'AWS_IAM' }], + }; + + test.each(['Query', 'Mutation', 'Subscription'])( + 'supports @function directive on fields of %s type extensions', + (builtInType: string) => { + const schema = /* GraphQL */ ` + type ${builtInType} { + customOperation1: String! @function(name: "foo1") + } + + extend type ${builtInType} { + customOperation2: String! @function(name: "foo2") + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new FunctionTransformer()], + }; + + const out = testTransform(testTransformParams); + expect(out).toBeDefined(); + + expect(out.resolvers['InvokeFoo1LambdaDataSource.req.vtl']).toBeDefined(); + expect(out.resolvers['InvokeFoo2LambdaDataSource.req.vtl']).toBeDefined(); + }, + ); + + test.each(['Query', 'Mutation', 'Subscription'])( + 'does not support @function directive on %s object extension itself', + (builtInType: string) => { + const schema = /* GraphQL */ ` + type ${builtInType} { + customOperation1: String! @function(name: "foo") + } + + extend type ${builtInType} @function(name: "foo") { + customOperation2: String! + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new FunctionTransformer()], + }; + + // The GraphQL parser actually catches this case, but we'll leave it here for completeness + expect(() => testTransform(testTransformParams)).toThrow('Directive "@function" may not be used on OBJECT.'); + }, + ); + + test('does not support @function directive on fields of non-model type extensions', () => { + const schema = /* GraphQL */ ` + type Foo { + customField1: String! @function(name: "foo") + } + + extend type Foo { + customField2: String! @function(name: "foo") + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new FunctionTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow( + "The '@function' directive cannot be used on fields of type extensions other than 'Query', 'Mutation', and 'Subscription'. See Foo.customField2", + ); + }); +}); diff --git a/packages/amplify-graphql-function-transformer/src/graphql-function-transformer.ts b/packages/amplify-graphql-function-transformer/src/graphql-function-transformer.ts index 601fb0fc4f..26ee3ada9c 100644 --- a/packages/amplify-graphql-function-transformer/src/graphql-function-transformer.ts +++ b/packages/amplify-graphql-function-transformer/src/graphql-function-transformer.ts @@ -14,16 +14,17 @@ import * as cdk from 'aws-cdk-lib'; import { obj, str, ref, printBlock, compoundExpression, qref, raw, iff, Expression, set, bool } from 'graphql-mapping-template'; import { FunctionResourceIDs, ResolverResourceIDs, ResourceConstants } from 'graphql-transformer-common'; import { + ArgumentNode, DirectiveNode, - ObjectTypeDefinitionNode, - InterfaceTypeDefinitionNode, + DocumentNode, FieldDefinitionNode, + InputValueDefinitionNode, + InterfaceTypeDefinitionNode, Kind, - DocumentNode, + ObjectTypeDefinitionNode, + ObjectTypeExtensionNode, TypeNode, valueFromASTUntyped, - ArgumentNode, - InputValueDefinitionNode, } from 'graphql'; type FunctionDirectiveConfiguration = { @@ -45,7 +46,7 @@ export class FunctionTransformer extends TransformerPluginBase { } field = ( - parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, + parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, definition: FieldDefinitionNode, directive: DirectiveNode, acc: TransformerSchemaVisitStepContextProvider, @@ -71,6 +72,15 @@ export class FunctionTransformer extends TransformerPluginBase { resolver.push(args); }; + fieldOfExtendedType = ( + parent: ObjectTypeExtensionNode, + field: FieldDefinitionNode, + directive: DirectiveNode, + context: TransformerSchemaVisitStepContextProvider, + ): void => { + this.field(parent, field, directive, context); + }; + generateResolvers = (context: TransformerContextProvider): void => { if (this.resolverGroups.size === 0) { return; diff --git a/packages/amplify-graphql-http-transformer/API.md b/packages/amplify-graphql-http-transformer/API.md index af64ff5b70..77e0f26f1d 100644 --- a/packages/amplify-graphql-http-transformer/API.md +++ b/packages/amplify-graphql-http-transformer/API.md @@ -8,6 +8,7 @@ import { DirectiveNode } from 'graphql'; import { FieldDefinitionNode } from 'graphql'; import { InterfaceTypeDefinitionNode } from 'graphql'; import { ObjectTypeDefinitionNode } from 'graphql'; +import { ObjectTypeExtensionNode } from 'graphql'; import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces'; import { TransformerPluginBase } from '@aws-amplify/graphql-transformer-core'; import { TransformerSchemaVisitStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces'; @@ -16,7 +17,9 @@ import { TransformerSchemaVisitStepContextProvider } from '@aws-amplify/graphql- export class HttpTransformer extends TransformerPluginBase { constructor(); // (undocumented) - field: (parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, definition: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider) => void; + field: (parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, definition: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider) => void; + // (undocumented) + fieldOfExtendedType: (parent: ObjectTypeExtensionNode, definition: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider) => void; // (undocumented) generateResolvers: (context: TransformerContextProvider) => void; } diff --git a/packages/amplify-graphql-http-transformer/src/__tests__/__snapshots__/extended-types.test.ts.snap b/packages/amplify-graphql-http-transformer/src/__tests__/__snapshots__/extended-types.test.ts.snap new file mode 100644 index 0000000000..5eb3a67ba4 --- /dev/null +++ b/packages/amplify-graphql-http-transformer/src/__tests__/__snapshots__/extended-types.test.ts.snap @@ -0,0 +1,172 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`@http directive on extended types supports @http directive on fields of Mutation type extensions 1`] = ` +Object { + "Mutation.customOperation1.DataResolver.req.vtl": "## [Start] Create request. ** +#set( $headers = $utils.http.copyHeaders($ctx.request.headers) ) +$util.qr($headers.put(\\"accept-encoding\\", \\"application/json\\")) +{ + \\"version\\": \\"2018-05-29\\", + \\"method\\": \\"GET\\", + \\"resourcePath\\": \\"/foo1\\", + \\"params\\": { + \\"headers\\": $util.toJson($headers), + \\"query\\": $util.toJson($ctx.args.query) + } +} +## [End] Create request. **", + "Mutation.customOperation1.DataResolver.res.vtl": "## [Start] Process response. ** +#if( $ctx.result.statusCode == 200 ) + #if( $ctx.result.headers.get(\\"Content-Type\\").toLowerCase().contains(\\"xml\\") ) +$utils.xml.toJsonString($ctx.result.body) + #else +$ctx.result.body + #end +#else +$util.qr($util.appendError($ctx.result.body, $ctx.result.statusCode)) +#end +## [End] Process response. **", + "Mutation.customOperation1.res.vtl": "$util.toJson($ctx.prev.result)", + "Mutation.customOperation2.DataResolver.req.vtl": "## [Start] Create request. ** +#set( $headers = $utils.http.copyHeaders($ctx.request.headers) ) +$util.qr($headers.put(\\"accept-encoding\\", \\"application/json\\")) +{ + \\"version\\": \\"2018-05-29\\", + \\"method\\": \\"GET\\", + \\"resourcePath\\": \\"/foo2\\", + \\"params\\": { + \\"headers\\": $util.toJson($headers), + \\"query\\": $util.toJson($ctx.args.query) + } +} +## [End] Create request. **", + "Mutation.customOperation2.DataResolver.res.vtl": "## [Start] Process response. ** +#if( $ctx.result.statusCode == 200 ) + #if( $ctx.result.headers.get(\\"Content-Type\\").toLowerCase().contains(\\"xml\\") ) +$utils.xml.toJsonString($ctx.result.body) + #else +$ctx.result.body + #end +#else +$util.qr($util.appendError($ctx.result.body, $ctx.result.statusCode)) +#end +## [End] Process response. **", + "Mutation.customOperation2.res.vtl": "$util.toJson($ctx.prev.result)", +} +`; + +exports[`@http directive on extended types supports @http directive on fields of Mutation type extensions 2`] = `Object {}`; + +exports[`@http directive on extended types supports @http directive on fields of Query type extensions 1`] = ` +Object { + "Query.customOperation1.DataResolver.req.vtl": "## [Start] Create request. ** +#set( $headers = $utils.http.copyHeaders($ctx.request.headers) ) +$util.qr($headers.put(\\"accept-encoding\\", \\"application/json\\")) +{ + \\"version\\": \\"2018-05-29\\", + \\"method\\": \\"GET\\", + \\"resourcePath\\": \\"/foo1\\", + \\"params\\": { + \\"headers\\": $util.toJson($headers), + \\"query\\": $util.toJson($ctx.args.query) + } +} +## [End] Create request. **", + "Query.customOperation1.DataResolver.res.vtl": "## [Start] Process response. ** +#if( $ctx.result.statusCode == 200 ) + #if( $ctx.result.headers.get(\\"Content-Type\\").toLowerCase().contains(\\"xml\\") ) +$utils.xml.toJsonString($ctx.result.body) + #else +$ctx.result.body + #end +#else +$util.qr($util.appendError($ctx.result.body, $ctx.result.statusCode)) +#end +## [End] Process response. **", + "Query.customOperation1.res.vtl": "$util.toJson($ctx.prev.result)", + "Query.customOperation2.DataResolver.req.vtl": "## [Start] Create request. ** +#set( $headers = $utils.http.copyHeaders($ctx.request.headers) ) +$util.qr($headers.put(\\"accept-encoding\\", \\"application/json\\")) +{ + \\"version\\": \\"2018-05-29\\", + \\"method\\": \\"GET\\", + \\"resourcePath\\": \\"/foo2\\", + \\"params\\": { + \\"headers\\": $util.toJson($headers), + \\"query\\": $util.toJson($ctx.args.query) + } +} +## [End] Create request. **", + "Query.customOperation2.DataResolver.res.vtl": "## [Start] Process response. ** +#if( $ctx.result.statusCode == 200 ) + #if( $ctx.result.headers.get(\\"Content-Type\\").toLowerCase().contains(\\"xml\\") ) +$utils.xml.toJsonString($ctx.result.body) + #else +$ctx.result.body + #end +#else +$util.qr($util.appendError($ctx.result.body, $ctx.result.statusCode)) +#end +## [End] Process response. **", + "Query.customOperation2.res.vtl": "$util.toJson($ctx.prev.result)", +} +`; + +exports[`@http directive on extended types supports @http directive on fields of Query type extensions 2`] = `Object {}`; + +exports[`@http directive on extended types supports @http directive on fields of Subscription type extensions 1`] = ` +Object { + "Subscription.customOperation1.DataResolver.req.vtl": "## [Start] Create request. ** +#set( $headers = $utils.http.copyHeaders($ctx.request.headers) ) +$util.qr($headers.put(\\"accept-encoding\\", \\"application/json\\")) +{ + \\"version\\": \\"2018-05-29\\", + \\"method\\": \\"GET\\", + \\"resourcePath\\": \\"/foo1\\", + \\"params\\": { + \\"headers\\": $util.toJson($headers), + \\"query\\": $util.toJson($ctx.args.query) + } +} +## [End] Create request. **", + "Subscription.customOperation1.DataResolver.res.vtl": "## [Start] Process response. ** +#if( $ctx.result.statusCode == 200 ) + #if( $ctx.result.headers.get(\\"Content-Type\\").toLowerCase().contains(\\"xml\\") ) +$utils.xml.toJsonString($ctx.result.body) + #else +$ctx.result.body + #end +#else +$util.qr($util.appendError($ctx.result.body, $ctx.result.statusCode)) +#end +## [End] Process response. **", + "Subscription.customOperation1.res.vtl": "$util.toJson($ctx.prev.result)", + "Subscription.customOperation2.DataResolver.req.vtl": "## [Start] Create request. ** +#set( $headers = $utils.http.copyHeaders($ctx.request.headers) ) +$util.qr($headers.put(\\"accept-encoding\\", \\"application/json\\")) +{ + \\"version\\": \\"2018-05-29\\", + \\"method\\": \\"GET\\", + \\"resourcePath\\": \\"/foo2\\", + \\"params\\": { + \\"headers\\": $util.toJson($headers), + \\"query\\": $util.toJson($ctx.args.query) + } +} +## [End] Create request. **", + "Subscription.customOperation2.DataResolver.res.vtl": "## [Start] Process response. ** +#if( $ctx.result.statusCode == 200 ) + #if( $ctx.result.headers.get(\\"Content-Type\\").toLowerCase().contains(\\"xml\\") ) +$utils.xml.toJsonString($ctx.result.body) + #else +$ctx.result.body + #end +#else +$util.qr($util.appendError($ctx.result.body, $ctx.result.statusCode)) +#end +## [End] Process response. **", + "Subscription.customOperation2.res.vtl": "$util.toJson($ctx.prev.result)", +} +`; + +exports[`@http directive on extended types supports @http directive on fields of Subscription type extensions 2`] = `Object {}`; diff --git a/packages/amplify-graphql-http-transformer/src/__tests__/extended-types.test.ts b/packages/amplify-graphql-http-transformer/src/__tests__/extended-types.test.ts new file mode 100644 index 0000000000..a5011975d1 --- /dev/null +++ b/packages/amplify-graphql-http-transformer/src/__tests__/extended-types.test.ts @@ -0,0 +1,80 @@ +import { testTransform } from '@aws-amplify/graphql-transformer-test-utils'; +import { AppSyncAuthConfiguration } from '@aws-amplify/graphql-transformer-interfaces'; +import { parse } from 'graphql'; +import { HttpTransformer } from '..'; + +describe('@http directive on extended types', () => { + const authConfig: AppSyncAuthConfiguration = { + defaultAuthentication: { + authenticationType: 'AMAZON_COGNITO_USER_POOLS', + }, + additionalAuthenticationProviders: [{ authenticationType: 'AWS_IAM' }], + }; + + test.each(['Query', 'Mutation', 'Subscription'])('supports @http directive on fields of %s type extensions', (builtInType: string) => { + const schema = /* GraphQL */ ` + type ${builtInType} { + customOperation1: String! @http(url: "https://www.api.com/foo1") + } + + extend type ${builtInType} { + customOperation2: String! @http(url: "https://www.api.com/foo2") + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new HttpTransformer()], + }; + + const out = testTransform(testTransformParams); + expect(out).toBeDefined(); + expect(out.resolvers).toMatchSnapshot(); + expect(out.pipelineFunctions).toMatchSnapshot(); + parse(out.schema); + }); + + test.each(['Query', 'Mutation'])('does not support @http directive on %s object extension itself', (builtInType: string) => { + const schema = /* GraphQL */ ` + type ${builtInType} { + customOperation1: String! @http(url: "https://www.api.com/foo1") + } + + extend type ${builtInType} @http(url: "https://www.api.com/foo2") { + customOperation2: String! + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new HttpTransformer()], + }; + + // The GraphQL parser actually catches this case, but we'll leave it here for completeness + expect(() => testTransform(testTransformParams)).toThrow('Directive "@http" may not be used on OBJECT.'); + }); + + test('does not support @http directive on fields of non-model type extensions', () => { + const schema = /* GraphQL */ ` + type Foo { + customField1: String! @http(url: "https://www.api.com/foo1") + } + + extend type Foo { + customField2: String! @http(url: "https://www.api.com/foo2") + } + `; + + const testTransformParams = { + schema: schema, + authConfig, + transformers: [new HttpTransformer()], + }; + + expect(() => testTransform(testTransformParams)).toThrow( + "The '@http' directive cannot be used on fields of type extensions other than 'Query', 'Mutation', and 'Subscription'. See Foo.customField2", + ); + }); +}); diff --git a/packages/amplify-graphql-http-transformer/src/graphql-http-transformer.ts b/packages/amplify-graphql-http-transformer/src/graphql-http-transformer.ts index c762f79f5f..6962a9f915 100644 --- a/packages/amplify-graphql-http-transformer/src/graphql-http-transformer.ts +++ b/packages/amplify-graphql-http-transformer/src/graphql-http-transformer.ts @@ -7,7 +7,7 @@ import { } from '@aws-amplify/graphql-transformer-core'; import { TransformerContextProvider, TransformerSchemaVisitStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces'; import { HttpDirective } from '@aws-amplify/graphql-directives'; -import { AuthorizationType } from 'aws-cdk-lib/aws-appsync'; +import { AuthorizationType, CfnResolver } from 'aws-cdk-lib/aws-appsync'; import * as cdk from 'aws-cdk-lib'; import { DirectiveNode, @@ -17,6 +17,7 @@ import { InterfaceTypeDefinitionNode, Kind, ObjectTypeDefinitionNode, + ObjectTypeExtensionNode, } from 'graphql'; import { HttpResourceIDs, @@ -25,7 +26,6 @@ import { makeNamedType, makeNonNullType, ModelResourceIDs, - ResourceConstants, unwrapNonNull, } from 'graphql-transformer-common'; import { @@ -79,7 +79,7 @@ export class HttpTransformer extends TransformerPluginBase { } field = ( - parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, + parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, definition: FieldDefinitionNode, directive: DirectiveNode, context: TransformerSchemaVisitStepContextProvider, @@ -115,7 +115,7 @@ export class HttpTransformer extends TransformerPluginBase { } const newFieldArgsArray: InputValueDefinitionNode[] = []; - let params = args.path.match(/:\w+/g); + const params = args.path.match(/:\w+/g); if (params) { const paramsMap = params.map((p) => p.replace(':', '')); @@ -128,8 +128,8 @@ export class HttpTransformer extends TransformerPluginBase { // Replace each URL parameter with $ctx.args.params.parameter_name for // use in the resolver template. - args.path = args.path.replace(/:\w+/g, (str: string) => { - return `\$\{ctx.args.params.${str.replace(':', '')}\}`; + args.path = args.path.replace(/:\w+/g, (s: string) => { + return `\$\{ctx.args.params.${s.replace(':', '')}\}`; }); const urlParamInputObject = makeUrlParamInputObject(args, paramsMap); @@ -152,8 +152,8 @@ export class HttpTransformer extends TransformerPluginBase { newFieldArgsArray.push(makeHttpArgument('query', queryInputObject, makeNonNull)); if (args.supportsBody) { - const name = ModelResourceIDs.HttpBodyInputObjectName(parent.name.value, definition.name.value); - const bodyInputObject = makeHttpInputObject(name, args.queryAndBodyArgs, true); + const objName = ModelResourceIDs.HttpBodyInputObjectName(parent.name.value, definition.name.value); + const bodyInputObject = makeHttpInputObject(objName, args.queryAndBodyArgs, true); context.output.addInput(bodyInputObject); newFieldArgsArray.push(makeHttpArgument('body', bodyInputObject, makeNonNull)); @@ -168,7 +168,7 @@ export class HttpTransformer extends TransformerPluginBase { }; const mostRecentParent = context.output.getType(parent.name.value) as ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode; - let updatedFieldsInParent = mostRecentParent.fields!.filter((f) => f.name.value !== definition.name.value); + const updatedFieldsInParent = mostRecentParent.fields!.filter((f) => f.name.value !== definition.name.value); updatedFieldsInParent.push(updatedField); const updatedParentType = { @@ -182,6 +182,15 @@ export class HttpTransformer extends TransformerPluginBase { this.directiveList.push(args); }; + fieldOfExtendedType = ( + parent: ObjectTypeExtensionNode, + definition: FieldDefinitionNode, + directive: DirectiveNode, + context: TransformerSchemaVisitStepContextProvider, + ): void => { + this.field(parent, definition, directive, context); + }; + generateResolvers = (context: TransformerContextProvider): void => { if (this.directiveList.length === 0) { return; @@ -208,7 +217,12 @@ export class HttpTransformer extends TransformerPluginBase { }; } -function createResolver(stack: cdk.Stack, dataSourceId: string, context: TransformerContextProvider, config: HttpDirectiveConfiguration) { +const createResolver = ( + stack: cdk.Stack, + dataSourceId: string, + context: TransformerContextProvider, + config: HttpDirectiveConfiguration, +): CfnResolver => { const env = context.synthParameters.amplifyEnvironmentName; const region = stack.region; @@ -328,17 +342,19 @@ function createResolver(stack: cdk.Stack, dataSourceId: string, context: Transfo [appsyncFunction.functionId], stack, ); -} +}; -function replaceEnvAndRegion(env: string, region: string, value: string): string { +const replaceEnvAndRegion = (env: string, region: string, value: string): string => { const vars: { [key: string]: string; } = {}; + // eslint-disable-next-line no-template-curly-in-string if (value.includes('${env}')) { vars.env = env as unknown as string; } + // eslint-disable-next-line no-template-curly-in-string if (value.includes('${aws_region}')) { vars.aws_region = region; } @@ -348,9 +364,9 @@ function replaceEnvAndRegion(env: string, region: string, value: string): string } return cdk.Fn.sub(value, vars); -} +}; -function makeUrlParamInputObject(directive: HttpDirectiveConfiguration, urlParams: string[]): InputObjectTypeDefinitionNode { +const makeUrlParamInputObject = (directive: HttpDirectiveConfiguration, urlParams: string[]): InputObjectTypeDefinitionNode => { return { kind: 'InputObjectTypeDefinition', name: { @@ -362,14 +378,14 @@ function makeUrlParamInputObject(directive: HttpDirectiveConfiguration, urlParam }), directives: [], }; -} +}; -function makeHttpArgument(name: string, inputType: InputObjectTypeDefinitionNode, makeNonNull: boolean): InputValueDefinitionNode { +const makeHttpArgument = (name: string, inputType: InputObjectTypeDefinitionNode, makeNonNull: boolean): InputValueDefinitionNode => { const type = makeNonNull ? makeNonNullType(makeNamedType(inputType.name.value)) : makeNamedType(inputType.name.value); return makeInputValueDefinition(name, type); -} +}; -function makeHttpInputObject(name: string, argArray: InputValueDefinitionNode[], makeNonNull: boolean): InputObjectTypeDefinitionNode { +const makeHttpInputObject = (name: string, argArray: InputValueDefinitionNode[], makeNonNull: boolean): InputObjectTypeDefinitionNode => { // Unwrap all the non-nulls in the argument array if the flag is set. const fields: InputValueDefinitionNode[] = makeNonNull ? argArray.map((arg: InputValueDefinitionNode) => { @@ -388,4 +404,4 @@ function makeHttpInputObject(name: string, argArray: InputValueDefinitionNode[], fields, directives: [], }; -} +}; diff --git a/packages/amplify-graphql-transformer-core/API.md b/packages/amplify-graphql-transformer-core/API.md index 63961bf041..57c05a0e18 100644 --- a/packages/amplify-graphql-transformer-core/API.md +++ b/packages/amplify-graphql-transformer-core/API.md @@ -197,7 +197,7 @@ export class EnumWrapper { } // @public (undocumented) -export const fieldsWithSqlDirective: (obj: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode) => FieldDefinitionNode[]; +export const fieldsWithSqlDirective: (obj: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode) => FieldDefinitionNode[]; // Warning: (ae-forgotten-export) The symbol "GenericFieldWrapper" needs to be exported by the entry point index.d.ts // @@ -489,7 +489,7 @@ export const isMutationNode: (obj: DefinitionNode) => obj is (ObjectTypeDefiniti }; // @public (undocumented) -export const isObjectTypeDefinitionNode: (obj: DefinitionNode) => obj is ObjectTypeDefinitionNode; +export const isObjectTypeDefinitionNode: (obj: DefinitionNode) => obj is ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode; // @public (undocumented) export const isPostgresDbType: (dbType: ModelDataSourceStrategyDbType) => dbType is "POSTGRES"; diff --git a/packages/amplify-graphql-transformer-core/src/transformation/transform.ts b/packages/amplify-graphql-transformer-core/src/transformation/transform.ts index 0a5ce84ed0..5bac800ce5 100644 --- a/packages/amplify-graphql-transformer-core/src/transformation/transform.ts +++ b/packages/amplify-graphql-transformer-core/src/transformation/transform.ts @@ -35,10 +35,10 @@ import { UnionTypeDefinitionNode, } from 'graphql'; import _ from 'lodash'; -import { DocumentNode } from 'graphql/language'; +import { DocumentNode, ObjectTypeExtensionNode } from 'graphql/language'; import { Construct } from 'constructs'; import { ResolverConfig } from '../config/transformer-config'; -import { InvalidTransformerError, SchemaValidationError, UnknownDirectiveError } from '../errors'; +import { InvalidDirectiveError, InvalidTransformerError, SchemaValidationError, UnknownDirectiveError } from '../errors'; import { GraphQLApi } from '../graphql-api'; import { TransformerContext, NONE_DATA_SOURCE_NAME } from '../transformer-context'; import { TransformerOutput } from '../transformer-context/output'; @@ -46,6 +46,7 @@ import { adoptAuthModes } from '../utils/authType'; import { MappingTemplate } from '../cdk-compat'; import { TransformerPreProcessContext } from '../transformer-context/pre-process-context'; import { defaultTransformParameters } from '../transformer-context/transform-parameters'; +import { isBuiltInGraphqlNode } from '../utils'; import * as SyncUtils from './sync-utils'; import { UserDefinedSlot } from './types'; import { @@ -258,6 +259,10 @@ export class GraphQLTransform { this.transformObject(transformer, def, validDirectiveNameMap, context); // Walk the fields and call field transformers. break; + case 'ObjectTypeExtension': + // Invokes `transformer.extendedObject` if present, and walks the fields of the extended types to call field transformers. + this.transformObject(transformer, def, validDirectiveNameMap, context); + break; case 'InterfaceTypeDefinition': this.transformInterface(transformer, def, validDirectiveNameMap, context); // Walk the fields and call field transformers. @@ -438,9 +443,14 @@ export class GraphQLTransform { } } + /** + * For each directive on the object or extended type, invoke the appropriate transformer. The transformer must implement `object` (for + * {@link ObjectTypeDefinitionNode}s) or `extendedObject` (for {@link ObjectTypeExtensionNode}s). Then, invoke the field transformer for + * each field in the object. + */ private transformObject( transformer: TransformerPluginProvider, - def: ObjectTypeDefinitionNode, + def: ObjectTypeDefinitionNode | ObjectTypeExtensionNode, validDirectiveNameMap: { [k: string]: boolean }, context: TransformerContext, ): void { @@ -451,19 +461,38 @@ export class GraphQLTransform { `Unknown directive '${dir.name.value}'. Either remove the directive from the schema or add a transformer to handle it.`, ); } - if (matchDirective(transformer.directive, dir, def)) { - if (isFunction(transformer.object)) { - const transformKey = makeSeenTransformationKey(dir, def, undefined, undefined, index); - if (!this.seenTransformations[transformKey]) { - transformer.object(def, dir, context); - this.seenTransformations[transformKey] = true; - } - } else { + + // Wrapping all this in a try/finally so we can reliably remember to increment `index` in all of our early exit conditions. That lets + // us use early-exit guards and flattens the control flow. (TS doesn't have the equivalent of a Golang/swift `defer` clause, so this + // is a workaround for that pattern.) + try { + if (!matchDirective(transformer.directive, dir, def)) { + continue; + } + + const transformKey = makeSeenTransformationKey(dir, def, undefined, undefined, index); + if (this.seenTransformations[transformKey]) { + continue; + } + + if (def.kind === Kind.OBJECT_TYPE_EXTENSION) { + // This should be caught by `matchDirective`, but we'll leave it here for safety. + throw new InvalidTransformerError( + `Directives are not supported on object or interface extensions. See the '@${dir.name.value}' directive on '${def.name.value}'`, + ); + } + + if (!isFunction(transformer.object)) { throw new InvalidTransformerError(`The transformer '${transformer.name}' must implement the 'object()' method`); } + + transformer.object(def, dir, context); + this.seenTransformations[transformKey] = true; + } finally { + index++; } - index++; } + for (const field of def.fields ?? []) { this.transformField(transformer, def, field, validDirectiveNameMap, context); } @@ -471,7 +500,7 @@ export class GraphQLTransform { private transformField( transformer: TransformerPluginProvider, - parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, + parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, def: FieldDefinitionNode, validDirectiveNameMap: { [k: string]: boolean }, context: TransformerContext, @@ -483,19 +512,44 @@ export class GraphQLTransform { `Unknown directive '${dir.name.value}'. Either remove the directive from the schema or add a transformer to handle it.`, ); } - if (matchFieldDirective(transformer.directive, dir, def)) { - if (isFunction(transformer.field)) { - const transformKey = makeSeenTransformationKey(dir, parent, def, undefined, index); - if (!this.seenTransformations[transformKey]) { - transformer.field(parent, def, dir, context); - this.seenTransformations[transformKey] = true; + + // Wrapping all this in a try/finally so we can reliably remember to increment `index` in all of our early exit conditions. That lets + // us use early-exit guards and flattens the control flow. (TS doesn't have the equivalent of a Golang/swift `defer` clause, so this + // is a workaround for that pattern.) + try { + if (!matchFieldDirective(transformer.directive, dir, def)) { + continue; + } + + const transformKey = makeSeenTransformationKey(dir, parent, def, undefined, index); + if (this.seenTransformations[transformKey]) { + continue; + } + + if (parent.kind === Kind.OBJECT_TYPE_EXTENSION) { + if (!isFunction(transformer.fieldOfExtendedType)) { + throw new InvalidTransformerError(`The '@${dir.name.value}' directive is not supported on fields of extended types`); + } + + // We only support directives on fields of Query, Mutation, and Subscription type extensions + if (!isBuiltInGraphqlNode(parent)) { + throw new InvalidDirectiveError( + `The '@${dir.name.value}' directive cannot be used on fields of type extensions other than 'Query', 'Mutation', and 'Subscription'. See ${parent.name.value}.${def.name.value}`, + ); } + transformer.fieldOfExtendedType(parent, def, dir, context); } else { - throw new InvalidTransformerError(`The transformer '${transformer.name}' must implement the 'field()' method`); + if (!isFunction(transformer.field)) { + throw new InvalidTransformerError(`The transformer '${transformer.name}' must implement the 'field()' method`); + } + transformer.field(parent, def, dir, context); } + this.seenTransformations[transformKey] = true; + } finally { + index++; } - index++; } + for (const arg of def.arguments ?? []) { this.transformArgument(transformer, parent, def, arg, validDirectiveNameMap, context); } @@ -503,7 +557,7 @@ export class GraphQLTransform { private transformArgument( transformer: TransformerPluginProvider, - parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, + parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, field: FieldDefinitionNode, arg: InputValueDefinitionNode, validDirectiveNameMap: { [k: string]: boolean }, diff --git a/packages/amplify-graphql-transformer-core/src/transformation/utils.ts b/packages/amplify-graphql-transformer-core/src/transformation/utils.ts index 8e247de7c5..371ec3d61e 100644 --- a/packages/amplify-graphql-transformer-core/src/transformation/utils.ts +++ b/packages/amplify-graphql-transformer-core/src/transformation/utils.ts @@ -11,21 +11,23 @@ import { print, StringValueNode, TypeDefinitionNode, + TypeExtensionNode, TypeSystemDefinitionNode, + TypeSystemExtensionNode, } from 'graphql'; import { ModelDataSourceStrategy, SqlDirectiveDataSourceStrategy, - SQLLambdaModelDataSourceStrategy, TransformerPluginProvider, TransformerPluginType, } from '@aws-amplify/graphql-transformer-interfaces'; import _ from 'lodash'; import { fieldsWithSqlDirective, isMutationNode, isQueryNode, isSqlStrategy } from '../utils'; +import { InvalidDirectiveError } from '../errors'; export const makeSeenTransformationKey = ( directive: DirectiveNode, - type: TypeDefinitionNode, + type: TypeDefinitionNode | TypeExtensionNode, field?: FieldDefinitionNode | InputValueDefinitionNode | EnumValueDefinitionNode, arg?: InputValueDefinitionNode, index?: number, @@ -48,10 +50,15 @@ export const makeSeenTransformationKey = ( /** * If this instance of the directive validates against its definition return true. * If the definition does not apply to the instance return false. - * @param directive The directive definition to validate against. - * @param nodeKind The kind of the current node where the directive was found. + * @param definition The directive definition to validate against. + * @param directive The directive declaration to be validated. + * @param node The node where the directive was found. */ -export const matchDirective = (definition: DirectiveDefinitionNode, directive: DirectiveNode, node: TypeSystemDefinitionNode): boolean => { +export const matchDirective = ( + definition: DirectiveDefinitionNode, + directive: DirectiveNode, + node: TypeSystemDefinitionNode | TypeSystemExtensionNode, +): boolean => { if (!directive) { return false; } @@ -60,6 +67,19 @@ export const matchDirective = (definition: DirectiveDefinitionNode, directive: D return false; } let isValidLocation = false; + + // At this point, we know that the directive applied to the node matches the definition. Before we validate the location, we need to + // explicitly disallow directives on extended types. + // + // Per https://spec.graphql.org/October2021/#sec-Type-System.Directives, this is not supported (the locations enum does not include any + // type extensions), but the `graphql.parse()` function does not throw an error when parsing. + // when encountering an extended type. So we need to explicitly check for extended types here. + if (node.kind === Kind.OBJECT_TYPE_EXTENSION || node.kind === Kind.INTERFACE_TYPE_EXTENSION) { + throw new InvalidDirectiveError( + `Directives are not supported on object or interface extensions. See the '@${directive.name.value}' directive on '${node.name.value}'`, + ); + } + for (const location of definition.locations) { // tslint:disable-next-line: switch-default switch (location.value) { diff --git a/packages/amplify-graphql-transformer-core/src/utils/graphql-utils.ts b/packages/amplify-graphql-transformer-core/src/utils/graphql-utils.ts index 5de1ac9bbd..705ba24fa1 100644 --- a/packages/amplify-graphql-transformer-core/src/utils/graphql-utils.ts +++ b/packages/amplify-graphql-transformer-core/src/utils/graphql-utils.ts @@ -1,11 +1,21 @@ -import { DefinitionNode, DocumentNode, FieldDefinitionNode, InterfaceTypeDefinitionNode, Kind, ObjectTypeDefinitionNode } from 'graphql'; +import { + DefinitionNode, + DocumentNode, + FieldDefinitionNode, + InterfaceTypeDefinitionNode, + Kind, + ObjectTypeDefinitionNode, + ObjectTypeExtensionNode, +} from 'graphql'; const SQL_DIRECTIVE_NAME = 'sql'; -export const isObjectTypeDefinitionNode = (obj: DefinitionNode): obj is ObjectTypeDefinitionNode => { +export const isObjectTypeDefinitionNode = (obj: DefinitionNode): obj is ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode => { return obj.kind === Kind.OBJECT_TYPE_DEFINITION || obj.kind === Kind.INTERFACE_TYPE_DEFINITION; }; +export const isObjectTypeExtensionNode = (obj: DefinitionNode): obj is ObjectTypeExtensionNode => obj.kind === Kind.OBJECT_TYPE_EXTENSION; + export const isMutationType = (typeName: string): typeName is 'Mutation' => typeName === 'Mutation'; export const isQueryType = (typeName: string): typeName is 'Query' => typeName === 'Query'; @@ -18,19 +28,19 @@ export const isBuiltInGraphqlType = (typeName: string): typeName is 'Mutation' | export const isMutationNode = ( obj: DefinitionNode, ): obj is (ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode) & { name: { value: 'Mutation' } } => { - return isObjectTypeDefinitionNode(obj) && isMutationType(obj.name.value); + return (isObjectTypeDefinitionNode(obj) || isObjectTypeExtensionNode(obj)) && isMutationType(obj.name.value); }; export const isQueryNode = ( obj: DefinitionNode, ): obj is (ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode) & { name: { value: 'Query' } } => { - return isObjectTypeDefinitionNode(obj) && isQueryType(obj.name.value); + return (isObjectTypeDefinitionNode(obj) || isObjectTypeExtensionNode(obj)) && isQueryType(obj.name.value); }; export const isSubscriptionNode = ( obj: DefinitionNode, ): obj is (ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode) & { name: { value: 'Subscription' } } => { - return isObjectTypeDefinitionNode(obj) && isSubscriptionType(obj.name.value); + return (isObjectTypeDefinitionNode(obj) || isObjectTypeExtensionNode(obj)) && isSubscriptionType(obj.name.value); }; export const isBuiltInGraphqlNode = ( @@ -39,7 +49,9 @@ export const isBuiltInGraphqlNode = ( return isMutationNode(obj) || isQueryNode(obj) || isSubscriptionNode(obj); }; -export const fieldsWithSqlDirective = (obj: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode): FieldDefinitionNode[] => { +export const fieldsWithSqlDirective = ( + obj: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | ObjectTypeExtensionNode, +): FieldDefinitionNode[] => { return obj.fields?.filter((field) => field.directives?.some((directive) => directive.name.value === SQL_DIRECTIVE_NAME)) ?? []; }; diff --git a/packages/amplify-graphql-transformer-interfaces/API.md b/packages/amplify-graphql-transformer-interfaces/API.md index ee40c5067a..ba15479165 100644 --- a/packages/amplify-graphql-transformer-interfaces/API.md +++ b/packages/amplify-graphql-transformer-interfaces/API.md @@ -748,6 +748,8 @@ export interface TransformerPluginProvider { // (undocumented) field?: (parent: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, definition: FieldDefinitionNode, directive: DirectiveNode, acc: TransformerSchemaVisitStepContextProvider) => void; // (undocumented) + fieldOfExtendedType?: (parent: ObjectTypeExtensionNode, definition: FieldDefinitionNode, directive: DirectiveNode, acc: TransformerSchemaVisitStepContextProvider) => void; + // (undocumented) generateResolvers?: (context: TransformerContextProvider) => void; // (undocumented) getLogs?: () => TransformerLog[]; diff --git a/packages/amplify-graphql-transformer-interfaces/src/transformer-plugin-provider.ts b/packages/amplify-graphql-transformer-interfaces/src/transformer-plugin-provider.ts index b3e02d3a52..8ae2c77a27 100644 --- a/packages/amplify-graphql-transformer-interfaces/src/transformer-plugin-provider.ts +++ b/packages/amplify-graphql-transformer-interfaces/src/transformer-plugin-provider.ts @@ -12,7 +12,9 @@ import { DirectiveDefinitionNode, TypeDefinitionNode, DocumentNode, + ObjectTypeExtensionNode, } from 'graphql'; +// eslint-disable-next-line import/no-cycle import { TransformerBeforeStepContextProvider, TransformerContextProvider, @@ -66,15 +68,13 @@ export interface TransformerPluginProvider { /** * A transformer implements a single function per location that its directive can be applied. - * This method handles transforming directives on objects type definitions. This includes type - * extensions. + * This method handles transforming directives on object type definitions. */ object?: (definition: ObjectTypeDefinitionNode, directive: DirectiveNode, acc: TransformerSchemaVisitStepContextProvider) => void; /** * A transformer implements a single function per location that its directive can be applied. - * This method handles transforming directives on objects type definitions. This includes type - * extensions. + * This method handles transforming directives on interface type definitions. */ interface?: (definition: InterfaceTypeDefinitionNode, directive: DirectiveNode, acc: TransformerSchemaVisitStepContextProvider) => void; @@ -89,6 +89,17 @@ export interface TransformerPluginProvider { acc: TransformerSchemaVisitStepContextProvider, ) => void; + /** + * A transformer implements a single function per location that its directive can be applied. This method handles transforming directives + * on fields of extended types. + */ + fieldOfExtendedType?: ( + parent: ObjectTypeExtensionNode, + definition: FieldDefinitionNode, + directive: DirectiveNode, + acc: TransformerSchemaVisitStepContextProvider, + ) => void; + /** * A transformer implements a single function per location that its directive can be applied. * This method handles transforming directives on object or input argument definitions. diff --git a/scripts/split-e2e-tests.ts b/scripts/split-e2e-tests.ts index d2879ff624..3b96d2c76e 100644 --- a/scripts/split-e2e-tests.ts +++ b/scripts/split-e2e-tests.ts @@ -145,6 +145,7 @@ const RUN_SOLO: (string | RegExp)[] = [ 'src/__tests__/amplify-table-3.test.ts', 'src/__tests__/amplify-table-4.test.ts', 'src/__tests__/api_canary.test.ts', + 'src/__tests__/custom-query-mutation-extension.test.ts', 'src/__tests__/default-ddb-canary.test.ts', /src\/__tests__\/group-auth\/.*\.test\.ts/, /src\/__tests__\/owner-auth\/.*\.test\.ts/, From b5ff8c808bb1defd13addcc38f6de87546459b0d Mon Sep 17 00:00:00 2001 From: amplify-data-ci Date: Thu, 30 Jan 2025 18:05:51 +0000 Subject: [PATCH 2/4] chore(release): Publish [ci skip] - @aws-amplify/data-construct@1.14.7 - amplify-category-api-e2e-tests@4.1.5 - amplify-graphql-api-construct-tests@1.13.9 - @aws-amplify/graphql-api-construct@1.18.7 - @aws-amplify/graphql-auth-transformer@4.1.11 - @aws-amplify/graphql-conversation-transformer@1.1.6 - @aws-amplify/graphql-default-value-transformer@3.1.8 - @aws-amplify/graphql-function-transformer@3.1.10 - @aws-amplify/graphql-generation-transformer@1.1.4 - @aws-amplify/graphql-http-transformer@3.0.13 - @aws-amplify/graphql-index-transformer@3.0.13 - @aws-amplify/graphql-model-transformer@3.1.5 - @aws-amplify/graphql-maps-to-transformer@4.0.13 - @aws-amplify/graphql-predictions-transformer@3.0.13 - @aws-amplify/graphql-relational-transformer@3.1.5 - @aws-amplify/graphql-schema-generator@0.11.6 - @aws-amplify/graphql-schema-test-library@3.0.13 - @aws-amplify/graphql-searchable-transformer@3.0.13 - @aws-amplify/graphql-sql-transformer@0.4.13 - @aws-amplify/graphql-transformer-core@3.3.5 - @aws-amplify/graphql-transformer-interfaces@4.2.2 - @aws-amplify/graphql-transformer-test-utils@1.0.12 - @aws-amplify/graphql-transformer@2.2.6 - amplify-category-api-graphql-transformers-e2e-tests@9.0.12 --- packages/amplify-data-construct/CHANGELOG.md | 4 +++ packages/amplify-data-construct/package.json | 36 +++++++++---------- packages/amplify-e2e-tests/CHANGELOG.md | 4 +++ packages/amplify-e2e-tests/package.json | 8 ++--- .../CHANGELOG.md | 6 ++++ .../package.json | 8 ++--- .../CHANGELOG.md | 4 +++ .../package.json | 36 +++++++++---------- .../CHANGELOG.md | 6 ++++ .../package.json | 20 +++++------ .../CHANGELOG.md | 4 +++ .../package.json | 14 ++++---- .../CHANGELOG.md | 4 +++ .../package.json | 10 +++--- .../CHANGELOG.md | 6 ++++ .../package.json | 8 ++--- .../CHANGELOG.md | 4 +++ .../package.json | 8 ++--- .../CHANGELOG.md | 6 ++++ .../package.json | 8 ++--- .../CHANGELOG.md | 4 +++ .../package.json | 10 +++--- .../CHANGELOG.md | 4 +++ .../package.json | 8 ++--- .../CHANGELOG.md | 4 +++ .../package.json | 16 ++++----- .../CHANGELOG.md | 4 +++ .../package.json | 8 ++--- .../CHANGELOG.md | 4 +++ .../package.json | 12 +++---- .../CHANGELOG.md | 4 +++ .../package.json | 6 ++-- .../CHANGELOG.md | 4 +++ .../package.json | 26 +++++++------- .../CHANGELOG.md | 4 +++ .../package.json | 10 +++--- .../CHANGELOG.md | 4 +++ .../package.json | 10 +++--- .../CHANGELOG.md | 6 ++++ .../package.json | 4 +-- .../CHANGELOG.md | 6 ++++ .../package.json | 2 +- .../CHANGELOG.md | 4 +++ .../package.json | 6 ++-- .../amplify-graphql-transformer/CHANGELOG.md | 4 +++ .../amplify-graphql-transformer/package.json | 34 +++++++++--------- .../CHANGELOG.md | 4 +++ .../package.json | 20 +++++------ 48 files changed, 272 insertions(+), 164 deletions(-) diff --git a/packages/amplify-data-construct/CHANGELOG.md b/packages/amplify-data-construct/CHANGELOG.md index 602fd51dcd..4c72241e39 100644 --- a/packages/amplify-data-construct/CHANGELOG.md +++ b/packages/amplify-data-construct/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.14.7](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/data-construct@1.14.6...@aws-amplify/data-construct@1.14.7) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/data-construct + ## [1.14.6](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/data-construct@1.14.3...@aws-amplify/data-construct@1.14.6) (2025-01-16) ### Bug Fixes diff --git a/packages/amplify-data-construct/package.json b/packages/amplify-data-construct/package.json index fb85eb184b..331ed75fda 100644 --- a/packages/amplify-data-construct/package.json +++ b/packages/amplify-data-construct/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/data-construct", - "version": "1.14.6", + "version": "1.14.7", "description": "AppSync GraphQL Api Construct using Amplify GraphQL Transformer - Aliased to use `Data` name scheme.", "repository": { "type": "git", @@ -160,24 +160,24 @@ "@aws-amplify/ai-constructs": "^1.0.0", "@aws-amplify/backend-output-schemas": "^1.0.0", "@aws-amplify/backend-output-storage": "^1.0.0", - "@aws-amplify/graphql-api-construct": "1.18.6", - "@aws-amplify/graphql-auth-transformer": "4.1.10", - "@aws-amplify/graphql-conversation-transformer": "1.1.5", - "@aws-amplify/graphql-default-value-transformer": "3.1.7", + "@aws-amplify/graphql-api-construct": "1.18.7", + "@aws-amplify/graphql-auth-transformer": "4.1.11", + "@aws-amplify/graphql-conversation-transformer": "1.1.6", + "@aws-amplify/graphql-default-value-transformer": "3.1.8", "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-function-transformer": "3.1.9", - "@aws-amplify/graphql-generation-transformer": "1.1.3", - "@aws-amplify/graphql-http-transformer": "3.0.12", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-maps-to-transformer": "4.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-predictions-transformer": "3.0.12", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-sql-transformer": "0.4.12", - "@aws-amplify/graphql-transformer": "2.2.5", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-function-transformer": "3.1.10", + "@aws-amplify/graphql-generation-transformer": "1.1.4", + "@aws-amplify/graphql-http-transformer": "3.0.13", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-maps-to-transformer": "4.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-predictions-transformer": "3.0.13", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-sql-transformer": "0.4.13", + "@aws-amplify/graphql-transformer": "2.2.6", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@aws-amplify/platform-core": "^1.0.0", "@aws-amplify/plugin-types": "^1.0.0", "@aws-crypto/crc32": "5.2.0", diff --git a/packages/amplify-e2e-tests/CHANGELOG.md b/packages/amplify-e2e-tests/CHANGELOG.md index 4823e89289..83054f37b5 100644 --- a/packages/amplify-e2e-tests/CHANGELOG.md +++ b/packages/amplify-e2e-tests/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.1.5](https://github.com/aws-amplify/amplify-category-api/compare/amplify-category-api-e2e-tests@4.1.4...amplify-category-api-e2e-tests@4.1.5) (2025-01-30) + +**Note:** Version bump only for package amplify-category-api-e2e-tests + ## [4.1.4](https://github.com/aws-amplify/amplify-category-api/compare/amplify-category-api-e2e-tests@4.1.2...amplify-category-api-e2e-tests@4.1.4) (2025-01-16) **Note:** Version bump only for package amplify-category-api-e2e-tests diff --git a/packages/amplify-e2e-tests/package.json b/packages/amplify-e2e-tests/package.json index 3899db6e03..d82709c4ca 100644 --- a/packages/amplify-e2e-tests/package.json +++ b/packages/amplify-e2e-tests/package.json @@ -1,6 +1,6 @@ { "name": "amplify-category-api-e2e-tests", - "version": "4.1.4", + "version": "4.1.5", "description": "E2e test suite", "repository": { "type": "git", @@ -25,8 +25,8 @@ }, "dependencies": { "@aws-amplify/amplify-app": "^5.0.35", - "@aws-amplify/graphql-schema-generator": "0.11.5", - "@aws-amplify/graphql-transformer-core": "3.3.4", + "@aws-amplify/graphql-schema-generator": "0.11.6", + "@aws-amplify/graphql-transformer-core": "3.3.5", "amplify-category-api-e2e-core": "5.0.7", "aws-amplify": "^4.2.8", "aws-appsync": "^4.1.1", @@ -52,7 +52,7 @@ "@aws-amplify/amplify-cli-core": "^4.3.9" }, "devDependencies": { - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@types/lodash": "^4.14.149", "@types/ws": "^7.4.4", "ts-node": "^8.10.2" diff --git a/packages/amplify-graphql-api-construct-tests/CHANGELOG.md b/packages/amplify-graphql-api-construct-tests/CHANGELOG.md index a6036bf0e8..5c0bf26162 100644 --- a/packages/amplify-graphql-api-construct-tests/CHANGELOG.md +++ b/packages/amplify-graphql-api-construct-tests/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.13.9](https://github.com/aws-amplify/amplify-category-api/compare/amplify-graphql-api-construct-tests@1.13.8...amplify-graphql-api-construct-tests@1.13.9) (2025-01-30) + +### Bug Fixes + +- **gen2:** transform directives on fields of supported extended types ([#3127](https://github.com/aws-amplify/amplify-category-api/issues/3127)) ([3aca7b8](https://github.com/aws-amplify/amplify-category-api/commit/3aca7b89f530c536c28a53b7290fdab877b2260b)) + ## [1.13.8](https://github.com/aws-amplify/amplify-category-api/compare/amplify-graphql-api-construct-tests@1.13.5...amplify-graphql-api-construct-tests@1.13.8) (2025-01-16) ### Bug Fixes diff --git a/packages/amplify-graphql-api-construct-tests/package.json b/packages/amplify-graphql-api-construct-tests/package.json index fe66a8764d..c24db50e14 100644 --- a/packages/amplify-graphql-api-construct-tests/package.json +++ b/packages/amplify-graphql-api-construct-tests/package.json @@ -1,6 +1,6 @@ { "name": "amplify-graphql-api-construct-tests", - "version": "1.13.8", + "version": "1.13.9", "description": "E2e test suite", "repository": { "type": "git", @@ -24,7 +24,7 @@ "dependencies": { "@aws-amplify/auth-construct": "^1.0.0", "@aws-amplify/core": "^2.1.0", - "@aws-amplify/graphql-api-construct": "1.18.6", + "@aws-amplify/graphql-api-construct": "1.18.7", "@aws-cdk/aws-cognito-identitypool-alpha": "2.152.0-alpha.0", "@aws-sdk/client-appsync": "3.624.0", "@aws-sdk/client-cloudformation": "3.624.0", @@ -49,8 +49,8 @@ "@aws-amplify/amplify-cli-core": "^4.3.9" }, "devDependencies": { - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@types/node": "^18.0.0", "aws-cdk-lib": "2.168.0", "constructs": "10.3.0", diff --git a/packages/amplify-graphql-api-construct/CHANGELOG.md b/packages/amplify-graphql-api-construct/CHANGELOG.md index bf04251b24..5f20fd8f2f 100644 --- a/packages/amplify-graphql-api-construct/CHANGELOG.md +++ b/packages/amplify-graphql-api-construct/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.18.7](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-api-construct@1.18.6...@aws-amplify/graphql-api-construct@1.18.7) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-api-construct + ## [1.18.6](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-api-construct@1.18.3...@aws-amplify/graphql-api-construct@1.18.6) (2025-01-16) ### Bug Fixes diff --git a/packages/amplify-graphql-api-construct/package.json b/packages/amplify-graphql-api-construct/package.json index 8ca7025398..3c02c457ed 100644 --- a/packages/amplify-graphql-api-construct/package.json +++ b/packages/amplify-graphql-api-construct/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-api-construct", - "version": "1.18.6", + "version": "1.18.7", "description": "AppSync GraphQL Api Construct using Amplify GraphQL Transformer.", "repository": { "type": "git", @@ -161,23 +161,23 @@ "@aws-amplify/ai-constructs": "^1.0.0", "@aws-amplify/backend-output-schemas": "^1.0.0", "@aws-amplify/backend-output-storage": "^1.0.0", - "@aws-amplify/graphql-auth-transformer": "4.1.10", - "@aws-amplify/graphql-conversation-transformer": "1.1.5", - "@aws-amplify/graphql-default-value-transformer": "3.1.7", + "@aws-amplify/graphql-auth-transformer": "4.1.11", + "@aws-amplify/graphql-conversation-transformer": "1.1.6", + "@aws-amplify/graphql-default-value-transformer": "3.1.8", "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-function-transformer": "3.1.9", - "@aws-amplify/graphql-generation-transformer": "1.1.3", - "@aws-amplify/graphql-http-transformer": "3.0.12", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-maps-to-transformer": "4.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-predictions-transformer": "3.0.12", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-sql-transformer": "0.4.12", - "@aws-amplify/graphql-transformer": "2.2.5", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-function-transformer": "3.1.10", + "@aws-amplify/graphql-generation-transformer": "1.1.4", + "@aws-amplify/graphql-http-transformer": "3.0.13", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-maps-to-transformer": "4.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-predictions-transformer": "3.0.13", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-sql-transformer": "0.4.13", + "@aws-amplify/graphql-transformer": "2.2.6", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@aws-amplify/platform-core": "^1.0.0", "@aws-amplify/plugin-types": "^1.0.0", "@aws-crypto/crc32": "5.2.0", @@ -282,7 +282,7 @@ "zod": "^3.22.2" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "@types/fs-extra": "^8.0.1", "@types/node": "^18.0.0", "aws-cdk-lib": "2.168.0", diff --git a/packages/amplify-graphql-auth-transformer/CHANGELOG.md b/packages/amplify-graphql-auth-transformer/CHANGELOG.md index 771dd0c4a2..c6b894c029 100644 --- a/packages/amplify-graphql-auth-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-auth-transformer/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.1.11](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-auth-transformer@4.1.10...@aws-amplify/graphql-auth-transformer@4.1.11) (2025-01-30) + +### Bug Fixes + +- **gen2:** transform directives on fields of supported extended types ([#3127](https://github.com/aws-amplify/amplify-category-api/issues/3127)) ([3aca7b8](https://github.com/aws-amplify/amplify-category-api/commit/3aca7b89f530c536c28a53b7290fdab877b2260b)) + ## [4.1.10](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-auth-transformer@4.1.8...@aws-amplify/graphql-auth-transformer@4.1.10) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-auth-transformer diff --git a/packages/amplify-graphql-auth-transformer/package.json b/packages/amplify-graphql-auth-transformer/package.json index 56e55e1405..cbd4ea2fbf 100644 --- a/packages/amplify-graphql-auth-transformer/package.json +++ b/packages/amplify-graphql-auth-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-auth-transformer", - "version": "4.1.10", + "version": "4.1.11", "description": "Amplify GraphQL @auth transformer", "repository": { "type": "git", @@ -31,10 +31,10 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2", @@ -42,11 +42,11 @@ "md5": "^2.3.0" }, "devDependencies": { - "@aws-amplify/graphql-function-transformer": "3.1.9", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-sql-transformer": "0.4.12", - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-function-transformer": "3.1.10", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-sql-transformer": "0.4.13", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "@types/node": "^18.0.0" }, "peerDependencies": { diff --git a/packages/amplify-graphql-conversation-transformer/CHANGELOG.md b/packages/amplify-graphql-conversation-transformer/CHANGELOG.md index 802928a1d0..2234a3ca5c 100644 --- a/packages/amplify-graphql-conversation-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-conversation-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.6](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-conversation-transformer@1.1.5...@aws-amplify/graphql-conversation-transformer@1.1.6) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-conversation-transformer + ## [1.1.5](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-conversation-transformer@1.1.3...@aws-amplify/graphql-conversation-transformer@1.1.5) (2025-01-16) ### Bug Fixes diff --git a/packages/amplify-graphql-conversation-transformer/package.json b/packages/amplify-graphql-conversation-transformer/package.json index d95c5c7c24..ccf477196e 100644 --- a/packages/amplify-graphql-conversation-transformer/package.json +++ b/packages/amplify-graphql-conversation-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-conversation-transformer", - "version": "1.1.5", + "version": "1.1.6", "description": "Amplify GraphQL @conversation transformer", "repository": { "type": "git", @@ -26,11 +26,11 @@ "dependencies": { "@aws-amplify/ai-constructs": "^1.0.0", "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@aws-amplify/plugin-types": "^1.0.0", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", @@ -39,7 +39,7 @@ "semver": "^7.6.3" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "esbuild": "^0.24.0" }, "peerDependencies": { diff --git a/packages/amplify-graphql-default-value-transformer/CHANGELOG.md b/packages/amplify-graphql-default-value-transformer/CHANGELOG.md index 38efde1855..06a50deb40 100644 --- a/packages/amplify-graphql-default-value-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-default-value-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.8](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-default-value-transformer@3.1.7...@aws-amplify/graphql-default-value-transformer@3.1.8) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-default-value-transformer + ## [3.1.7](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-default-value-transformer@3.1.5...@aws-amplify/graphql-default-value-transformer@3.1.7) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-default-value-transformer diff --git a/packages/amplify-graphql-default-value-transformer/package.json b/packages/amplify-graphql-default-value-transformer/package.json index ff920c048c..4025d2e48b 100644 --- a/packages/amplify-graphql-default-value-transformer/package.json +++ b/packages/amplify-graphql-default-value-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-default-value-transformer", - "version": "3.1.7", + "version": "3.1.8", "description": "Amplify GraphQL default value transformer", "repository": { "type": "git", @@ -31,15 +31,15 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2", "libphonenumber-js": "1.9.47" }, "devDependencies": { - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" } } diff --git a/packages/amplify-graphql-function-transformer/CHANGELOG.md b/packages/amplify-graphql-function-transformer/CHANGELOG.md index 886a224f6b..5dd3dc843a 100644 --- a/packages/amplify-graphql-function-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-function-transformer/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.10](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-function-transformer@3.1.9...@aws-amplify/graphql-function-transformer@3.1.10) (2025-01-30) + +### Bug Fixes + +- **gen2:** transform directives on fields of supported extended types ([#3127](https://github.com/aws-amplify/amplify-category-api/issues/3127)) ([3aca7b8](https://github.com/aws-amplify/amplify-category-api/commit/3aca7b89f530c536c28a53b7290fdab877b2260b)) + ## [3.1.9](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-function-transformer@3.1.7...@aws-amplify/graphql-function-transformer@3.1.9) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-function-transformer diff --git a/packages/amplify-graphql-function-transformer/package.json b/packages/amplify-graphql-function-transformer/package.json index 3101a509ea..ebffd1d973 100644 --- a/packages/amplify-graphql-function-transformer/package.json +++ b/packages/amplify-graphql-function-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-function-transformer", - "version": "3.1.9", + "version": "3.1.10", "description": "Amplify GraphQL @function transformer", "repository": { "type": "git", @@ -30,14 +30,14 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" }, "peerDependencies": { "aws-cdk-lib": "^2.168.0", diff --git a/packages/amplify-graphql-generation-transformer/CHANGELOG.md b/packages/amplify-graphql-generation-transformer/CHANGELOG.md index c306290644..e0ca13a2dc 100644 --- a/packages/amplify-graphql-generation-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-generation-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.4](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-generation-transformer@1.1.3...@aws-amplify/graphql-generation-transformer@1.1.4) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-generation-transformer + ## [1.1.3](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-generation-transformer@1.1.1...@aws-amplify/graphql-generation-transformer@1.1.3) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-generation-transformer diff --git a/packages/amplify-graphql-generation-transformer/package.json b/packages/amplify-graphql-generation-transformer/package.json index 57772f40a0..7ec13877ae 100644 --- a/packages/amplify-graphql-generation-transformer/package.json +++ b/packages/amplify-graphql-generation-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-generation-transformer", - "version": "1.1.3", + "version": "1.1.4", "description": "Amplify GraphQL @generation transformer", "repository": { "type": "git", @@ -25,15 +25,15 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2", "immer": "^9.0.12" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" }, "peerDependencies": { "aws-cdk-lib": "^2.168.0", diff --git a/packages/amplify-graphql-http-transformer/CHANGELOG.md b/packages/amplify-graphql-http-transformer/CHANGELOG.md index 0683bf499a..e46fe5efb2 100644 --- a/packages/amplify-graphql-http-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-http-transformer/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.13](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-http-transformer@3.0.12...@aws-amplify/graphql-http-transformer@3.0.13) (2025-01-30) + +### Bug Fixes + +- **gen2:** transform directives on fields of supported extended types ([#3127](https://github.com/aws-amplify/amplify-category-api/issues/3127)) ([3aca7b8](https://github.com/aws-amplify/amplify-category-api/commit/3aca7b89f530c536c28a53b7290fdab877b2260b)) + ## [3.0.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-http-transformer@3.0.10...@aws-amplify/graphql-http-transformer@3.0.12) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-http-transformer diff --git a/packages/amplify-graphql-http-transformer/package.json b/packages/amplify-graphql-http-transformer/package.json index 38aa28897d..b908cee214 100644 --- a/packages/amplify-graphql-http-transformer/package.json +++ b/packages/amplify-graphql-http-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-http-transformer", - "version": "3.0.12", + "version": "3.0.13", "description": "Amplify GraphQL @http transformer", "repository": { "type": "git", @@ -30,14 +30,14 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" }, "peerDependencies": { "aws-cdk-lib": "^2.168.0", diff --git a/packages/amplify-graphql-index-transformer/CHANGELOG.md b/packages/amplify-graphql-index-transformer/CHANGELOG.md index a09f24f87b..dfadd7abe8 100644 --- a/packages/amplify-graphql-index-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-index-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.13](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-index-transformer@3.0.12...@aws-amplify/graphql-index-transformer@3.0.13) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-index-transformer + ## [3.0.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-index-transformer@3.0.10...@aws-amplify/graphql-index-transformer@3.0.12) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-index-transformer diff --git a/packages/amplify-graphql-index-transformer/package.json b/packages/amplify-graphql-index-transformer/package.json index 782c04165d..ba56a7239f 100644 --- a/packages/amplify-graphql-index-transformer/package.json +++ b/packages/amplify-graphql-index-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-index-transformer", - "version": "3.0.12", + "version": "3.0.13", "description": "Amplify GraphQL index and key transformers", "repository": { "type": "git", @@ -30,15 +30,15 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" }, "peerDependencies": { "aws-cdk-lib": "^2.168.0", diff --git a/packages/amplify-graphql-model-transformer/CHANGELOG.md b/packages/amplify-graphql-model-transformer/CHANGELOG.md index e727f9ab5f..29c51d8eec 100644 --- a/packages/amplify-graphql-model-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-model-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.5](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-model-transformer@3.1.4...@aws-amplify/graphql-model-transformer@3.1.5) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-model-transformer + ## [3.1.4](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-model-transformer@3.1.2...@aws-amplify/graphql-model-transformer@3.1.4) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-model-transformer diff --git a/packages/amplify-graphql-model-transformer/package.json b/packages/amplify-graphql-model-transformer/package.json index 18b790b64d..e6f629fc70 100644 --- a/packages/amplify-graphql-model-transformer/package.json +++ b/packages/amplify-graphql-model-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-model-transformer", - "version": "3.1.4", + "version": "3.1.5", "description": "Amplify graphql @model transformer", "repository": { "type": "git", @@ -35,8 +35,8 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" @@ -46,7 +46,7 @@ "constructs": "^10.3.0" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "@aws-sdk/client-dynamodb": "^3.624.0", "@aws-sdk/client-lambda": "^3.624.0", "@aws-sdk/client-sfn": "^3.624.0", diff --git a/packages/amplify-graphql-name-mapping-transformer/CHANGELOG.md b/packages/amplify-graphql-name-mapping-transformer/CHANGELOG.md index 6a6d7342dd..6bfa624891 100644 --- a/packages/amplify-graphql-name-mapping-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-name-mapping-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.0.13](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-maps-to-transformer@4.0.12...@aws-amplify/graphql-maps-to-transformer@4.0.13) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-maps-to-transformer + ## [4.0.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-maps-to-transformer@4.0.10...@aws-amplify/graphql-maps-to-transformer@4.0.12) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-maps-to-transformer diff --git a/packages/amplify-graphql-name-mapping-transformer/package.json b/packages/amplify-graphql-name-mapping-transformer/package.json index 51401149ee..607157d343 100644 --- a/packages/amplify-graphql-name-mapping-transformer/package.json +++ b/packages/amplify-graphql-name-mapping-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-maps-to-transformer", - "version": "4.0.12", + "version": "4.0.13", "description": "Amplify GraphQL @mapsTo transformer", "repository": { "type": "git", @@ -32,8 +32,8 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" }, @@ -42,11 +42,11 @@ "constructs": "^10.3.0" }, "devDependencies": { - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "graphql": "^15.5.0" } } diff --git a/packages/amplify-graphql-predictions-transformer/CHANGELOG.md b/packages/amplify-graphql-predictions-transformer/CHANGELOG.md index 90a83d8121..07b6a4a190 100644 --- a/packages/amplify-graphql-predictions-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-predictions-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.13](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-predictions-transformer@3.0.12...@aws-amplify/graphql-predictions-transformer@3.0.13) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-predictions-transformer + ## [3.0.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-predictions-transformer@3.0.10...@aws-amplify/graphql-predictions-transformer@3.0.12) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-predictions-transformer diff --git a/packages/amplify-graphql-predictions-transformer/package.json b/packages/amplify-graphql-predictions-transformer/package.json index 0f45b3a8dc..5c56262926 100644 --- a/packages/amplify-graphql-predictions-transformer/package.json +++ b/packages/amplify-graphql-predictions-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-predictions-transformer", - "version": "3.0.12", + "version": "3.0.13", "description": "Amplify GraphQL @predictions transformer", "repository": { "type": "git", @@ -30,8 +30,8 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" @@ -41,7 +41,7 @@ "constructs": "^10.3.0" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "bestzip": "^2.1.5" } } diff --git a/packages/amplify-graphql-relational-transformer/CHANGELOG.md b/packages/amplify-graphql-relational-transformer/CHANGELOG.md index 19d083cf31..c1b3f2ecb6 100644 --- a/packages/amplify-graphql-relational-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-relational-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.5](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-relational-transformer@3.1.4...@aws-amplify/graphql-relational-transformer@3.1.5) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-relational-transformer + ## [3.1.4](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-relational-transformer@3.1.2...@aws-amplify/graphql-relational-transformer@3.1.4) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-relational-transformer diff --git a/packages/amplify-graphql-relational-transformer/package.json b/packages/amplify-graphql-relational-transformer/package.json index c6768ac022..fd988bcd01 100644 --- a/packages/amplify-graphql-relational-transformer/package.json +++ b/packages/amplify-graphql-relational-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-relational-transformer", - "version": "3.1.4", + "version": "3.1.5", "description": "Amplify GraphQL relational modeling transformers", "repository": { "type": "git", @@ -30,17 +30,17 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2", "immer": "^9.0.12" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" }, "peerDependencies": { "aws-cdk-lib": "^2.168.0", diff --git a/packages/amplify-graphql-schema-generator/CHANGELOG.md b/packages/amplify-graphql-schema-generator/CHANGELOG.md index 93664c02c7..6efaa6a7d3 100644 --- a/packages/amplify-graphql-schema-generator/CHANGELOG.md +++ b/packages/amplify-graphql-schema-generator/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.11.6](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-schema-generator@0.11.5...@aws-amplify/graphql-schema-generator@0.11.6) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-schema-generator + ## [0.11.5](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-schema-generator@0.11.3...@aws-amplify/graphql-schema-generator@0.11.5) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-schema-generator diff --git a/packages/amplify-graphql-schema-generator/package.json b/packages/amplify-graphql-schema-generator/package.json index 2b96052c4b..9e2c325429 100644 --- a/packages/amplify-graphql-schema-generator/package.json +++ b/packages/amplify-graphql-schema-generator/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-schema-generator", - "version": "0.11.5", + "version": "0.11.6", "description": "Amplify GraphQL schema generator", "repository": { "type": "git", @@ -30,8 +30,8 @@ "extract-api": "ts-node ../../scripts/extract-api.ts" }, "dependencies": { - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@aws-sdk/client-ec2": "3.624.0", "@aws-sdk/client-iam": "3.624.0", "@aws-sdk/client-lambda": "3.624.0", diff --git a/packages/amplify-graphql-schema-test-library/CHANGELOG.md b/packages/amplify-graphql-schema-test-library/CHANGELOG.md index 994414f912..9b03a30af9 100644 --- a/packages/amplify-graphql-schema-test-library/CHANGELOG.md +++ b/packages/amplify-graphql-schema-test-library/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.13](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-schema-test-library@3.0.12...@aws-amplify/graphql-schema-test-library@3.0.13) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-schema-test-library + ## [3.0.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-schema-test-library@3.0.10...@aws-amplify/graphql-schema-test-library@3.0.12) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-schema-test-library diff --git a/packages/amplify-graphql-schema-test-library/package.json b/packages/amplify-graphql-schema-test-library/package.json index a38d2e28cb..87ae7f8ff7 100644 --- a/packages/amplify-graphql-schema-test-library/package.json +++ b/packages/amplify-graphql-schema-test-library/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-schema-test-library", - "version": "3.0.12", + "version": "3.0.13", "description": "Library of valid and unsupported Amplify GraphQL Transformer schemas", "repository": { "type": "git", @@ -29,17 +29,17 @@ "test": "jest" }, "devDependencies": { - "@aws-amplify/graphql-auth-transformer": "4.1.10", - "@aws-amplify/graphql-default-value-transformer": "3.1.7", - "@aws-amplify/graphql-function-transformer": "3.1.9", - "@aws-amplify/graphql-http-transformer": "3.0.12", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-predictions-transformer": "3.0.12", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-auth-transformer": "4.1.11", + "@aws-amplify/graphql-default-value-transformer": "3.1.8", + "@aws-amplify/graphql-function-transformer": "3.1.10", + "@aws-amplify/graphql-http-transformer": "3.0.13", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-predictions-transformer": "3.0.13", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" } } diff --git a/packages/amplify-graphql-searchable-transformer/CHANGELOG.md b/packages/amplify-graphql-searchable-transformer/CHANGELOG.md index 3db5c7fe44..276765b89d 100644 --- a/packages/amplify-graphql-searchable-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-searchable-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.13](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-searchable-transformer@3.0.12...@aws-amplify/graphql-searchable-transformer@3.0.13) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-searchable-transformer + ## [3.0.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-searchable-transformer@3.0.10...@aws-amplify/graphql-searchable-transformer@3.0.12) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-searchable-transformer diff --git a/packages/amplify-graphql-searchable-transformer/package.json b/packages/amplify-graphql-searchable-transformer/package.json index e26ca5a024..6532f96d06 100644 --- a/packages/amplify-graphql-searchable-transformer/package.json +++ b/packages/amplify-graphql-searchable-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-searchable-transformer", - "version": "3.0.12", + "version": "3.0.13", "description": "Amplfy GraphQL @searchable transformer", "repository": { "type": "git", @@ -30,9 +30,9 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" @@ -42,7 +42,7 @@ "constructs": "^10.3.0" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "@types/node": "^18.0.0" } } diff --git a/packages/amplify-graphql-sql-transformer/CHANGELOG.md b/packages/amplify-graphql-sql-transformer/CHANGELOG.md index 2bd51f6e83..e4bdb92c29 100644 --- a/packages/amplify-graphql-sql-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-sql-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.4.13](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-sql-transformer@0.4.12...@aws-amplify/graphql-sql-transformer@0.4.13) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-sql-transformer + ## [0.4.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-sql-transformer@0.4.10...@aws-amplify/graphql-sql-transformer@0.4.12) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-sql-transformer diff --git a/packages/amplify-graphql-sql-transformer/package.json b/packages/amplify-graphql-sql-transformer/package.json index f1125b43d4..b2bd07abca 100644 --- a/packages/amplify-graphql-sql-transformer/package.json +++ b/packages/amplify-graphql-sql-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-sql-transformer", - "version": "0.4.12", + "version": "0.4.13", "description": "Amplify GraphQL @sql transformer", "repository": { "type": "git", @@ -30,15 +30,15 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", "graphql-transformer-common": "5.1.2" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11" + "@aws-amplify/graphql-transformer-test-utils": "1.0.12" }, "peerDependencies": { "aws-cdk-lib": "^2.168.0", diff --git a/packages/amplify-graphql-transformer-core/CHANGELOG.md b/packages/amplify-graphql-transformer-core/CHANGELOG.md index 69e8fa81b1..64694eea7e 100644 --- a/packages/amplify-graphql-transformer-core/CHANGELOG.md +++ b/packages/amplify-graphql-transformer-core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.3.5](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer-core@3.3.4...@aws-amplify/graphql-transformer-core@3.3.5) (2025-01-30) + +### Bug Fixes + +- **gen2:** transform directives on fields of supported extended types ([#3127](https://github.com/aws-amplify/amplify-category-api/issues/3127)) ([3aca7b8](https://github.com/aws-amplify/amplify-category-api/commit/3aca7b89f530c536c28a53b7290fdab877b2260b)) + ## [3.3.4](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer-core@3.3.2...@aws-amplify/graphql-transformer-core@3.3.4) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-transformer-core diff --git a/packages/amplify-graphql-transformer-core/package.json b/packages/amplify-graphql-transformer-core/package.json index 1d12e4ab75..1f0e24475f 100644 --- a/packages/amplify-graphql-transformer-core/package.json +++ b/packages/amplify-graphql-transformer-core/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-transformer-core", - "version": "3.3.4", + "version": "3.3.5", "description": "A framework to transform from GraphQL SDL to AWS CloudFormation.", "repository": { "type": "git", @@ -30,7 +30,7 @@ }, "dependencies": { "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "fs-extra": "^8.1.0", "graphql": "^15.5.0", "graphql-mapping-template": "5.0.2", diff --git a/packages/amplify-graphql-transformer-interfaces/CHANGELOG.md b/packages/amplify-graphql-transformer-interfaces/CHANGELOG.md index 4d2a8cf6b4..2fc55054d3 100644 --- a/packages/amplify-graphql-transformer-interfaces/CHANGELOG.md +++ b/packages/amplify-graphql-transformer-interfaces/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.2.2](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer-interfaces@4.2.1...@aws-amplify/graphql-transformer-interfaces@4.2.2) (2025-01-30) + +### Bug Fixes + +- **gen2:** transform directives on fields of supported extended types ([#3127](https://github.com/aws-amplify/amplify-category-api/issues/3127)) ([3aca7b8](https://github.com/aws-amplify/amplify-category-api/commit/3aca7b89f530c536c28a53b7290fdab877b2260b)) + ## [4.2.1](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer-interfaces@4.2.0...@aws-amplify/graphql-transformer-interfaces@4.2.1) (2024-12-17) **Note:** Version bump only for package @aws-amplify/graphql-transformer-interfaces diff --git a/packages/amplify-graphql-transformer-interfaces/package.json b/packages/amplify-graphql-transformer-interfaces/package.json index f4ff03c1c1..65d294bdba 100644 --- a/packages/amplify-graphql-transformer-interfaces/package.json +++ b/packages/amplify-graphql-transformer-interfaces/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-transformer-interfaces", - "version": "4.2.1", + "version": "4.2.2", "description": "Amplify GraphQL transformer interface definitions", "repository": { "type": "git", diff --git a/packages/amplify-graphql-transformer-test-utils/CHANGELOG.md b/packages/amplify-graphql-transformer-test-utils/CHANGELOG.md index 4f71e8188e..96758df463 100644 --- a/packages/amplify-graphql-transformer-test-utils/CHANGELOG.md +++ b/packages/amplify-graphql-transformer-test-utils/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.12](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer-test-utils@1.0.11...@aws-amplify/graphql-transformer-test-utils@1.0.12) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-transformer-test-utils + ## [1.0.11](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer-test-utils@1.0.9...@aws-amplify/graphql-transformer-test-utils@1.0.11) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-transformer-test-utils diff --git a/packages/amplify-graphql-transformer-test-utils/package.json b/packages/amplify-graphql-transformer-test-utils/package.json index 0c42395bd7..97a0a47fa1 100644 --- a/packages/amplify-graphql-transformer-test-utils/package.json +++ b/packages/amplify-graphql-transformer-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-transformer-test-utils", - "version": "1.0.11", + "version": "1.0.12", "description": "Test utils for graphql transformers", "repository": { "type": "git", @@ -30,8 +30,8 @@ "access": "public" }, "dependencies": { - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1" + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2" }, "devDependencies": { "@types/node": "^18.0.0", diff --git a/packages/amplify-graphql-transformer/CHANGELOG.md b/packages/amplify-graphql-transformer/CHANGELOG.md index ce573dd822..8237c142be 100644 --- a/packages/amplify-graphql-transformer/CHANGELOG.md +++ b/packages/amplify-graphql-transformer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.2.6](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer@2.2.5...@aws-amplify/graphql-transformer@2.2.6) (2025-01-30) + +**Note:** Version bump only for package @aws-amplify/graphql-transformer + ## [2.2.5](https://github.com/aws-amplify/amplify-category-api/compare/@aws-amplify/graphql-transformer@2.2.3...@aws-amplify/graphql-transformer@2.2.5) (2025-01-16) **Note:** Version bump only for package @aws-amplify/graphql-transformer diff --git a/packages/amplify-graphql-transformer/package.json b/packages/amplify-graphql-transformer/package.json index c8749c140d..6402dd96d1 100644 --- a/packages/amplify-graphql-transformer/package.json +++ b/packages/amplify-graphql-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-amplify/graphql-transformer", - "version": "2.2.5", + "version": "2.2.6", "description": "Amplify GraphQL Transformer Root Package", "repository": { "type": "git", @@ -29,25 +29,25 @@ "access": "public" }, "dependencies": { - "@aws-amplify/graphql-auth-transformer": "4.1.10", - "@aws-amplify/graphql-conversation-transformer": "1.1.5", - "@aws-amplify/graphql-default-value-transformer": "3.1.7", - "@aws-amplify/graphql-function-transformer": "3.1.9", - "@aws-amplify/graphql-generation-transformer": "1.1.3", - "@aws-amplify/graphql-http-transformer": "3.0.12", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-maps-to-transformer": "4.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-predictions-transformer": "3.0.12", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-sql-transformer": "0.4.12", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-auth-transformer": "4.1.11", + "@aws-amplify/graphql-conversation-transformer": "1.1.6", + "@aws-amplify/graphql-default-value-transformer": "3.1.8", + "@aws-amplify/graphql-function-transformer": "3.1.10", + "@aws-amplify/graphql-generation-transformer": "1.1.4", + "@aws-amplify/graphql-http-transformer": "3.0.13", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-maps-to-transformer": "4.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-predictions-transformer": "3.0.13", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-sql-transformer": "0.4.13", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@aws-amplify/plugin-types": "^1.0.0" }, "devDependencies": { - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "@types/node": "^18.0.0", "fs-extra": "^8.1.0", "rimraf": "^3.0.0" diff --git a/packages/graphql-transformers-e2e-tests/CHANGELOG.md b/packages/graphql-transformers-e2e-tests/CHANGELOG.md index a6b925d22d..a96ef43735 100644 --- a/packages/graphql-transformers-e2e-tests/CHANGELOG.md +++ b/packages/graphql-transformers-e2e-tests/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [9.0.12](https://github.com/aws-amplify/amplify-category-api/compare/amplify-category-api-graphql-transformers-e2e-tests@9.0.11...amplify-category-api-graphql-transformers-e2e-tests@9.0.12) (2025-01-30) + +**Note:** Version bump only for package amplify-category-api-graphql-transformers-e2e-tests + ## [9.0.11](https://github.com/aws-amplify/amplify-category-api/compare/amplify-category-api-graphql-transformers-e2e-tests@9.0.9...amplify-category-api-graphql-transformers-e2e-tests@9.0.11) (2025-01-16) **Note:** Version bump only for package amplify-category-api-graphql-transformers-e2e-tests diff --git a/packages/graphql-transformers-e2e-tests/package.json b/packages/graphql-transformers-e2e-tests/package.json index 38c67cdee8..55f1176d80 100644 --- a/packages/graphql-transformers-e2e-tests/package.json +++ b/packages/graphql-transformers-e2e-tests/package.json @@ -1,6 +1,6 @@ { "name": "amplify-category-api-graphql-transformers-e2e-tests", - "version": "9.0.11", + "version": "9.0.12", "description": "End to end functional tests for appsync supported transformers.", "private": true, "repository": { @@ -22,8 +22,8 @@ "build-tests": "yarn tsc --build tsconfig.tests.json" }, "dependencies": { - "@aws-amplify/graphql-auth-transformer": "4.1.10", - "@aws-amplify/graphql-relational-transformer": "3.1.4", + "@aws-amplify/graphql-auth-transformer": "4.1.11", + "@aws-amplify/graphql-relational-transformer": "3.1.5", "axios": "^1.6.0", "cloudform-types": "^4.2.0", "graphql": "^15.5.0", @@ -34,13 +34,13 @@ "devDependencies": { "@aws-amplify/amplify-appsync-simulator": "2.16.7", "@aws-amplify/core": "^2.1.0", - "@aws-amplify/graphql-default-value-transformer": "3.1.7", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-maps-to-transformer": "4.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", - "@aws-amplify/graphql-transformer-test-utils": "1.0.11", + "@aws-amplify/graphql-default-value-transformer": "3.1.8", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-maps-to-transformer": "4.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", + "@aws-amplify/graphql-transformer-test-utils": "1.0.12", "@types/node": "^18.0.0", "aws-amplify": "^4.2.8", "aws-appsync": "^4.1.1", From b5fa6a97acf7ed846341b02cfcc7c8e67d527f69 Mon Sep 17 00:00:00 2001 From: amplify-data-ci Date: Thu, 30 Jan 2025 18:06:07 +0000 Subject: [PATCH 3/4] chore: update .jsii assembly --- packages/amplify-graphql-api-construct/.jsii | 36 ++++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/amplify-graphql-api-construct/.jsii b/packages/amplify-graphql-api-construct/.jsii index 4fe837602c..3eb887c461 100644 --- a/packages/amplify-graphql-api-construct/.jsii +++ b/packages/amplify-graphql-api-construct/.jsii @@ -9,23 +9,23 @@ "@aws-amplify/ai-constructs": "^1.0.0", "@aws-amplify/backend-output-schemas": "^1.0.0", "@aws-amplify/backend-output-storage": "^1.0.0", - "@aws-amplify/graphql-auth-transformer": "4.1.10", - "@aws-amplify/graphql-conversation-transformer": "1.1.5", - "@aws-amplify/graphql-default-value-transformer": "3.1.7", + "@aws-amplify/graphql-auth-transformer": "4.1.11", + "@aws-amplify/graphql-conversation-transformer": "1.1.6", + "@aws-amplify/graphql-default-value-transformer": "3.1.8", "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-function-transformer": "3.1.9", - "@aws-amplify/graphql-generation-transformer": "1.1.3", - "@aws-amplify/graphql-http-transformer": "3.0.12", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-maps-to-transformer": "4.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-predictions-transformer": "3.0.12", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-sql-transformer": "0.4.12", - "@aws-amplify/graphql-transformer": "2.2.5", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-function-transformer": "3.1.10", + "@aws-amplify/graphql-generation-transformer": "1.1.4", + "@aws-amplify/graphql-http-transformer": "3.0.13", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-maps-to-transformer": "4.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-predictions-transformer": "3.0.13", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-sql-transformer": "0.4.13", + "@aws-amplify/graphql-transformer": "2.2.6", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@aws-amplify/platform-core": "^1.0.0", "@aws-amplify/plugin-types": "^1.0.0", "@aws-crypto/crc32": "5.2.0", @@ -9403,6 +9403,6 @@ "symbolId": "src/model-datasource-strategy-types:VpcConfig" } }, - "version": "1.18.6", - "fingerprint": "CkBvAje6QOmb4x8HMAg2BEXUJC2nd8eLWvTsLcXKhTM=" + "version": "1.18.7", + "fingerprint": "tD0sXbwu94bkf1Gr4ba3zQeQU7BQPh89YJdssCzLZ/E=" } \ No newline at end of file From 677a19f9e161dfc1e1ef5f5e5ef9ee9a45f27698 Mon Sep 17 00:00:00 2001 From: amplify-data-ci Date: Thu, 30 Jan 2025 18:06:18 +0000 Subject: [PATCH 4/4] chore: update .jsii assembly --- packages/amplify-data-construct/.jsii | 38 +++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/amplify-data-construct/.jsii b/packages/amplify-data-construct/.jsii index fb810ee7de..29587182a5 100644 --- a/packages/amplify-data-construct/.jsii +++ b/packages/amplify-data-construct/.jsii @@ -9,23 +9,23 @@ "@aws-amplify/ai-constructs": "^1.0.0", "@aws-amplify/backend-output-schemas": "^1.0.0", "@aws-amplify/backend-output-storage": "^1.0.0", - "@aws-amplify/graphql-auth-transformer": "4.1.10", - "@aws-amplify/graphql-conversation-transformer": "1.1.5", - "@aws-amplify/graphql-default-value-transformer": "3.1.7", + "@aws-amplify/graphql-auth-transformer": "4.1.11", + "@aws-amplify/graphql-conversation-transformer": "1.1.6", + "@aws-amplify/graphql-default-value-transformer": "3.1.8", "@aws-amplify/graphql-directives": "2.6.1", - "@aws-amplify/graphql-function-transformer": "3.1.9", - "@aws-amplify/graphql-generation-transformer": "1.1.3", - "@aws-amplify/graphql-http-transformer": "3.0.12", - "@aws-amplify/graphql-index-transformer": "3.0.12", - "@aws-amplify/graphql-maps-to-transformer": "4.0.12", - "@aws-amplify/graphql-model-transformer": "3.1.4", - "@aws-amplify/graphql-predictions-transformer": "3.0.12", - "@aws-amplify/graphql-relational-transformer": "3.1.4", - "@aws-amplify/graphql-searchable-transformer": "3.0.12", - "@aws-amplify/graphql-sql-transformer": "0.4.12", - "@aws-amplify/graphql-transformer": "2.2.5", - "@aws-amplify/graphql-transformer-core": "3.3.4", - "@aws-amplify/graphql-transformer-interfaces": "4.2.1", + "@aws-amplify/graphql-function-transformer": "3.1.10", + "@aws-amplify/graphql-generation-transformer": "1.1.4", + "@aws-amplify/graphql-http-transformer": "3.0.13", + "@aws-amplify/graphql-index-transformer": "3.0.13", + "@aws-amplify/graphql-maps-to-transformer": "4.0.13", + "@aws-amplify/graphql-model-transformer": "3.1.5", + "@aws-amplify/graphql-predictions-transformer": "3.0.13", + "@aws-amplify/graphql-relational-transformer": "3.1.5", + "@aws-amplify/graphql-searchable-transformer": "3.0.13", + "@aws-amplify/graphql-sql-transformer": "0.4.13", + "@aws-amplify/graphql-transformer": "2.2.6", + "@aws-amplify/graphql-transformer-core": "3.3.5", + "@aws-amplify/graphql-transformer-interfaces": "4.2.2", "@aws-amplify/platform-core": "^1.0.0", "@aws-amplify/plugin-types": "^1.0.0", "@aws-crypto/crc32": "5.2.0", @@ -130,7 +130,7 @@ "zod": "^3.22.2" }, "dependencies": { - "@aws-amplify/graphql-api-construct": "1.18.6", + "@aws-amplify/graphql-api-construct": "1.18.7", "aws-cdk-lib": "^2.168.0", "constructs": "^10.3.0" }, @@ -4065,6 +4065,6 @@ } }, "types": {}, - "version": "1.14.6", - "fingerprint": "C00m//Kh7rxY5kn+1X3sokNk3ZUI8wbWmb8/Wv1D2Hs=" + "version": "1.14.7", + "fingerprint": "3KNic2f/LBzOhbkrlDygq77KpfW40uR+Tf7LghDN2W4=" } \ No newline at end of file