From cc236ef21f72a32e3bf445fa64d04bde217c6c7b Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Thu, 26 Feb 2026 14:53:18 -0500 Subject: [PATCH 01/15] feat: add new resolver support --- .../Query.listProducts.res.vtl | 11 +++++++ .../product-catalog/configure.sh | 3 +- .../product-catalog/schema.graphql | 19 +++++------- .../product-catalog/src/App.tsx | 31 +++++++++++++++++-- .../product-catalog/src/graphql/queries.ts | 2 ++ 5 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 amplify-migration-apps/product-catalog/Query.listProducts.res.vtl diff --git a/amplify-migration-apps/product-catalog/Query.listProducts.res.vtl b/amplify-migration-apps/product-catalog/Query.listProducts.res.vtl new file mode 100644 index 00000000000..d1cbb2ec701 --- /dev/null +++ b/amplify-migration-apps/product-catalog/Query.listProducts.res.vtl @@ -0,0 +1,11 @@ +## Add 10% discount to all products +#foreach($item in $ctx.result.items) + #if($item.price) + #set($discount = $item.price * 0.10) + #set($discountedPrice = $item.price - $discount) + $util.qr($item.put("discountedPrice", $discountedPrice)) + $util.qr($item.put("savings", $discount)) + #end +#end + +$util.toJson($ctx.result) diff --git a/amplify-migration-apps/product-catalog/configure.sh b/amplify-migration-apps/product-catalog/configure.sh index b4f6510f709..bcc220bf42a 100755 --- a/amplify-migration-apps/product-catalog/configure.sh +++ b/amplify-migration-apps/product-catalog/configure.sh @@ -9,4 +9,5 @@ cp -f lowstockproducts.js ./amplify/backend/function/lowstockproducts/src/index. cp -f lowstockproducts.package.json ./amplify/backend/function/lowstockproducts/src/package.json cp -f onimageuploaded.js ./amplify/backend/function/${s3_trigger_function_name}/src/index.js cp -f onimageuploaded.package.json ./amplify/backend/function/${s3_trigger_function_name}/src/package.json -cp -f custom-roles.json ./amplify/backend/api/productcatalog/custom-roles.json \ No newline at end of file +cp -f custom-roles.json ./amplify/backend/api/productcatalog/custom-roles.json +cp -f Query.listProducts.res.vtl ./amplify/backend/api/productcatalog/resolvers/Query.listProducts.res.vtl diff --git a/amplify-migration-apps/product-catalog/schema.graphql b/amplify-migration-apps/product-catalog/schema.graphql index 68493ba9e31..4b06f11fe8c 100644 --- a/amplify-migration-apps/product-catalog/schema.graphql +++ b/amplify-migration-apps/product-catalog/schema.graphql @@ -4,10 +4,7 @@ enum UserRole { VIEWER } -type User @model @auth(rules: [ - { allow: private, provider: iam }, - { allow: owner, ownerField: "id" } -]) { +type User @model @auth(rules: [{ allow: private, provider: iam }, { allow: owner, ownerField: "id" }]) { id: ID! email: String! name: String! @@ -30,15 +27,14 @@ type Product @model @auth(rules: [{ allow: private, provider: iam }]) { images: [String] createdBy: String updatedBy: String + discountedPrice: Float + savings: Float createdAt: AWSDateTime! updatedAt: AWSDateTime! comments: [Comment] @hasMany(indexName: "byProduct", fields: ["id"]) } -type Comment @model @auth(rules: [ - { allow: private, provider: iam }, - { allow: owner, ownerField: "authorId" } -]) { +type Comment @model @auth(rules: [{ allow: private, provider: iam }, { allow: owner, ownerField: "authorId" }]) { id: ID! productId: ID! @index(name: "byProduct") authorId: String! @@ -59,8 +55,7 @@ type LowStockResponse { } type Query { - checkLowStock: LowStockResponse @function(name: "lowstockproducts-${env}") @auth(rules: [ - { allow: private, provider: iam }, - { allow: public, provider: apiKey } - ]) + checkLowStock: LowStockResponse + @function(name: "lowstockproducts-${env}") + @auth(rules: [{ allow: private, provider: iam }, { allow: public, provider: apiKey }]) } diff --git a/amplify-migration-apps/product-catalog/src/App.tsx b/amplify-migration-apps/product-catalog/src/App.tsx index c3a0d58606e..331f3551200 100644 --- a/amplify-migration-apps/product-catalog/src/App.tsx +++ b/amplify-migration-apps/product-catalog/src/App.tsx @@ -1175,9 +1175,34 @@ function App({ signOut, user }: AppProps) { {product.price && ( - - ${product.price} - + + {(product as any).discountedPrice && ( + <> + + ${product.price.toFixed(2)} + + + ${(product as any).discountedPrice.toFixed(2)} + + + Save ${(product as any).savings.toFixed(2)} + + + )} + {!(product as any).discountedPrice && ( + + ${product.price} + + )} + )} diff --git a/amplify-migration-apps/product-catalog/src/graphql/queries.ts b/amplify-migration-apps/product-catalog/src/graphql/queries.ts index 7537a612694..746d531f2f1 100644 --- a/amplify-migration-apps/product-catalog/src/graphql/queries.ts +++ b/amplify-migration-apps/product-catalog/src/graphql/queries.ts @@ -53,6 +53,8 @@ export const listProducts = /* GraphQL */ `query ListProducts( images createdBy updatedBy + discountedPrice + savings createdAt updatedAt __typename From 5500d2af13e3dd8b1d087e3dc07c73ff07c186db Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Thu, 26 Feb 2026 15:48:03 -0500 Subject: [PATCH 02/15] chore: update README --- amplify-migration-apps/product-catalog/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/amplify-migration-apps/product-catalog/README.md b/amplify-migration-apps/product-catalog/README.md index 7e42f22d01a..e6fa684409e 100644 --- a/amplify-migration-apps/product-catalog/README.md +++ b/amplify-migration-apps/product-catalog/README.md @@ -344,6 +344,18 @@ On the AppSync AWS Console, locate the ID of Gen1 API, it will be named `product + export async function handler(event) { ``` +```diff +- const crypto = require('@aws-crypto/sha256-js'); +- const { defaultProvider } = require('@aws-sdk/credential-provider-node'); +- const { SignatureV4 } = require('@aws-sdk/signature-v4'); +- const { HttpRequest } = require('@aws-sdk/protocol-http'); +- const Sha256 = crypto.Sha256; ++ import { Sha256 } from '@aws-crypto/sha256-js'; ++ import { defaultProvider } from '@aws-sdk/credential-provider-node'; ++ import { SignatureV4 } from '@aws-sdk/signature-v4'; ++ import { HttpRequest } from '@aws-sdk/protocol-http'; +``` + **Edit in `./src/main.tsx`:** ```diff From 69829cb151fc608e0aaa844488094a3423aa94f5 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 15:13:28 -0500 Subject: [PATCH 03/15] feat: add interfaces for resolvers --- .../generate/backend/synthesizer.ts | 1 + .../generate/core/migration-pipeline.ts | 1 + .../generate/generators/data/index.ts | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts index 61c78629844..f11306c27c7 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts @@ -28,6 +28,7 @@ export interface BackendRenderParameters { importFrom: string; additionalAuthProviders?: AdditionalAuthProvider[]; restApis?: RestApiDefinition[]; + hasResolvers?: boolean; }; auth?: { importFrom: string; diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts index eb1c24b33c5..1560a896543 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts @@ -497,6 +497,7 @@ export const createGen2Renderer = ({ importFrom: './data/resource', additionalAuthProviders: data.additionalAuthProviders, restApis: data.restApis, + hasResolvers: data.resolvers?.hasResolvers, }; } diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts index 6473d3f0686..b926ae09260 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts @@ -4,6 +4,14 @@ import { AppSyncClient, paginateListGraphqlApis } from '@aws-sdk/client-appsync' import type { ConstructFactory, AmplifyFunction } from '@aws-amplify/plugin-types'; import type { AuthorizationModes, DataLoggingOptions } from '@aws-amplify/backend-data'; import { RestApiDefinition } from '../../codegen-head/data_definition_fetcher'; +/** + * Resolver configuration for GraphQL API + */ +export interface ResolverConfig { + /** Whether resolvers directory was found and copied */ + hasResolvers: boolean; +} + export interface AdditionalAuthProvider { authenticationType: 'API_KEY' | 'AWS_IAM' | 'OPENID_CONNECT' | 'AMAZON_COGNITO_USER_POOLS' | 'AWS_LAMBDA'; userPoolConfig?: { @@ -102,6 +110,8 @@ export type DataDefinition = { logging?: DataLoggingOptions; /* REST API definitions */ restApis?: RestApiDefinition[]; + /* Resolver configuration */ + resolvers?: ResolverConfig; }; /** Key name for the migrated table mappings property in the generated data resource */ @@ -138,6 +148,14 @@ export const generateDataSource = async (gen1Env: string, dataDefinition?: DataD if (!dataDefinition.schema && (!dataDefinition.restApis || dataDefinition.restApis.length === 0)) { return undefined; } + + // Handle resolver copying if GraphQL API exists + if (dataDefinition.schema) { + const resolversCopied = handleResolversCopy(); + if (resolversCopied) { + dataDefinition.resolvers = { hasResolvers: true }; + } + } // Properties for the defineData() function call const dataRenderProperties: ObjectLiteralElementLike[] = []; From a4b04643ac1d22c8f5a364fa1361e15925b94b98 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 15:23:24 -0500 Subject: [PATCH 04/15] feat: add resolver support --- .../generate/generators/data/index.ts | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts index b926ae09260..0011fe6cd19 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts @@ -4,6 +4,11 @@ import { AppSyncClient, paginateListGraphqlApis } from '@aws-sdk/client-appsync' import type { ConstructFactory, AmplifyFunction } from '@aws-amplify/plugin-types'; import type { AuthorizationModes, DataLoggingOptions } from '@aws-amplify/backend-data'; import { RestApiDefinition } from '../../codegen-head/data_definition_fetcher'; + +import fs from 'fs'; +import path from 'path'; +import { pathManager } from '@aws-amplify/amplify-cli-core'; + /** * Resolver configuration for GraphQL API */ @@ -19,6 +24,26 @@ export interface AdditionalAuthProvider { }; } +/** + * Checks if GraphQL API has resolvers directory with VTL files and copies them + */ +const copyResolvers = (): boolean => { + const rootDir = pathManager.findProjectRoot(); + const projectName = getProjectName(); + if (!projectName) return false; + + const resolversPath = path.join(rootDir, 'amplify', 'backend', 'api', projectName, 'resolvers'); + if (!fs.existsSync(resolversPath)) return false; + + const files = fs.readdirSync(resolversPath); + if (!files.some((file) => file.endsWith('.vtl'))) return false; + + const targetPath = path.join(rootDir, 'amplify', 'data', 'resolvers'); + fs.mkdirSync(path.dirname(targetPath), { recursive: true }); + fs.cpSync(resolversPath, targetPath, { recursive: true }); + return true; +}; + const factory = ts.factory; /** @@ -151,7 +176,7 @@ export const generateDataSource = async (gen1Env: string, dataDefinition?: DataD // Handle resolver copying if GraphQL API exists if (dataDefinition.schema) { - const resolversCopied = handleResolversCopy(); + const resolversCopied = copyResolvers(); if (resolversCopied) { dataDefinition.resolvers = { hasResolvers: true }; } From cdf383df78e0f7dac34714cd4247c6bdbdb45236 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 15:25:54 -0500 Subject: [PATCH 05/15] chore: remove unnecessary check --- .../commands/gen2-migration/generate/generators/data/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts index 0011fe6cd19..289c458b2da 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts @@ -30,7 +30,6 @@ export interface AdditionalAuthProvider { const copyResolvers = (): boolean => { const rootDir = pathManager.findProjectRoot(); const projectName = getProjectName(); - if (!projectName) return false; const resolversPath = path.join(rootDir, 'amplify', 'backend', 'api', projectName, 'resolvers'); if (!fs.existsSync(resolversPath)) return false; From 9d8107037fd3c0e1b25f52c830224a6e8472fc0c Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 15:32:50 -0500 Subject: [PATCH 06/15] feat: add escape hatch code --- .../generate/backend/synthesizer.ts | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts index f11306c27c7..dc51c5f19af 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts @@ -2416,6 +2416,257 @@ export class BackendSynthesizer { }); } + // Generate resolver override escape hatches if resolvers exist + if (renderArgs.data?.hasResolvers) { + // Add required imports for resolver overrides + imports.push(this.createImportStatement([factory.createIdentifier('readdirSync'), factory.createIdentifier('readFileSync')], 'fs')); + imports.push(this.createImportStatement([factory.createIdentifier('join'), factory.createIdentifier('dirname')], 'path')); + imports.push(this.createImportStatement([factory.createIdentifier('fileURLToPath')], 'url')); + + // Generate __dirname equivalent for ES modules + const dirnameStatement = factory.createVariableStatement( + [], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + '__dirname', + undefined, + undefined, + factory.createCallExpression(factory.createIdentifier('dirname'), undefined, [ + factory.createCallExpression(factory.createIdentifier('fileURLToPath'), undefined, [ + factory.createPropertyAccessExpression(factory.createIdentifier('import'), factory.createIdentifier('meta.url')), + ]), + ]), + ), + ], + ts.NodeFlags.Const, + ), + ); + nodes.push(dirnameStatement); + + // Generate resolver override logic + const resolversDirStatement = factory.createVariableStatement( + [], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + 'resolversDir', + undefined, + undefined, + factory.createCallExpression(factory.createIdentifier('join'), undefined, [ + factory.createIdentifier('__dirname'), + factory.createStringLiteral('data/resolvers'), + ]), + ), + ], + ts.NodeFlags.Const, + ), + ); + nodes.push(resolversDirStatement); + + const resolverFilesStatement = factory.createVariableStatement( + [], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + 'resolverFiles', + undefined, + undefined, + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createCallExpression(factory.createIdentifier('readdirSync'), undefined, [ + factory.createIdentifier('resolversDir'), + ]), + factory.createIdentifier('filter'), + ), + undefined, + [ + factory.createArrowFunction( + undefined, + undefined, + [factory.createParameterDeclaration(undefined, undefined, factory.createIdentifier('f'))], + undefined, + factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + factory.createCallExpression( + factory.createPropertyAccessExpression(factory.createIdentifier('f'), factory.createIdentifier('endsWith')), + undefined, + [factory.createStringLiteral('.res.vtl')], + ), + ), + ], + ), + ), + ], + ts.NodeFlags.Const, + ), + ); + nodes.push(resolverFilesStatement); + + // Generate for loop to process resolver files + const forOfStatement = factory.createForOfStatement( + undefined, + factory.createVariableDeclarationList( + [factory.createVariableDeclaration('file', undefined, undefined, undefined)], + ts.NodeFlags.Const, + ), + factory.createIdentifier('resolverFiles'), + factory.createBlock( + [ + // Parse file name + factory.createVariableStatement( + [], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createArrayBindingPattern([ + factory.createBindingElement(undefined, undefined, 'typeName'), + factory.createBindingElement(undefined, undefined, 'fieldName'), + ]), + undefined, + undefined, + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createCallExpression( + factory.createPropertyAccessExpression(factory.createIdentifier('file'), factory.createIdentifier('replace')), + undefined, + [factory.createStringLiteral('.res.vtl'), factory.createStringLiteral('')], + ), + factory.createIdentifier('split'), + ), + undefined, + [factory.createStringLiteral('.')], + ), + ), + ], + ts.NodeFlags.Const, + ), + ), + // Generate function ID + factory.createVariableStatement( + [], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + 'functionId', + undefined, + undefined, + factory.createTemplateExpression(factory.createTemplateHead(''), [ + factory.createTemplateSpan(factory.createIdentifier('typeName'), factory.createTemplateMiddle('')), + factory.createTemplateSpan( + factory.createBinaryExpression( + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createIdentifier('fieldName'), + factory.createIdentifier('charAt'), + ), + undefined, + [factory.createNumericLiteral('0')], + ), + factory.createIdentifier('toUpperCase'), + ), + undefined, + [], + ), + factory.createToken(ts.SyntaxKind.PlusToken), + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createIdentifier('fieldName'), + factory.createIdentifier('slice'), + ), + undefined, + [factory.createNumericLiteral('1')], + ), + ), + factory.createTemplateTail('DataResolverFn'), + ), + ]), + ), + ], + ts.NodeFlags.Const, + ), + ), + // Get pipeline function + factory.createVariableStatement( + [], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + 'pipelineFunction', + undefined, + undefined, + factory.createElementAccessExpression( + factory.createPropertyAccessExpression( + factory.createIdentifier('backend.data.resources.cfnResources'), + factory.createIdentifier('cfnFunctionConfigurations'), + ), + factory.createIdentifier('functionId'), + ), + ), + ], + ts.NodeFlags.Const, + ), + ), + // If statement to check if pipeline function exists + factory.createIfStatement( + factory.createIdentifier('pipelineFunction'), + factory.createBlock( + [ + // Read template file + factory.createVariableStatement( + [], + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + 'template', + undefined, + undefined, + factory.createCallExpression(factory.createIdentifier('readFileSync'), undefined, [ + factory.createCallExpression(factory.createIdentifier('join'), undefined, [ + factory.createIdentifier('resolversDir'), + factory.createIdentifier('file'), + ]), + factory.createStringLiteral('utf8'), + ]), + ), + ], + ts.NodeFlags.Const, + ), + ), + // Clear S3 location + factory.createExpressionStatement( + factory.createBinaryExpression( + factory.createPropertyAccessExpression( + factory.createIdentifier('pipelineFunction'), + factory.createIdentifier('responseMappingTemplateS3Location'), + ), + factory.createToken(ts.SyntaxKind.EqualsToken), + factory.createIdentifier('undefined'), + ), + ), + // Set inline template + factory.createExpressionStatement( + factory.createBinaryExpression( + factory.createPropertyAccessExpression( + factory.createIdentifier('pipelineFunction'), + factory.createIdentifier('responseMappingTemplate'), + ), + factory.createToken(ts.SyntaxKind.EqualsToken), + factory.createIdentifier('template'), + ), + ), + ], + true, + ), + ), + ], + true, + ), + ); + nodes.push(forOfStatement); + } + // returns backend.ts file return factory.createNodeArray([...imports, newLineIdentifier, ...errors, newLineIdentifier, backendStatement, ...nodes], true); } From 159df50933cd630763ef0829782ee9b98dd8d8ed Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 15:35:00 -0500 Subject: [PATCH 07/15] chore: add comments --- .../generate/backend/synthesizer.ts | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts index dc51c5f19af..e147a5453bf 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts @@ -2416,7 +2416,7 @@ export class BackendSynthesizer { }); } - // Generate resolver override escape hatches if resolvers exist + // Override resolver templates from data/resolvers folder if (renderArgs.data?.hasResolvers) { // Add required imports for resolver overrides imports.push(this.createImportStatement([factory.createIdentifier('readdirSync'), factory.createIdentifier('readFileSync')], 'fs')); @@ -2444,7 +2444,7 @@ export class BackendSynthesizer { ); nodes.push(dirnameStatement); - // Generate resolver override logic + // Get resolvers directory path const resolversDirStatement = factory.createVariableStatement( [], factory.createVariableDeclarationList( @@ -2464,6 +2464,7 @@ export class BackendSynthesizer { ); nodes.push(resolversDirStatement); + // Filter for .res.vtl files const resolverFilesStatement = factory.createVariableStatement( [], factory.createVariableDeclarationList( @@ -2502,7 +2503,7 @@ export class BackendSynthesizer { ); nodes.push(resolverFilesStatement); - // Generate for loop to process resolver files + // Process each resolver file const forOfStatement = factory.createForOfStatement( undefined, factory.createVariableDeclarationList( @@ -2512,7 +2513,7 @@ export class BackendSynthesizer { factory.createIdentifier('resolverFiles'), factory.createBlock( [ - // Parse file name + // Extract type and field names from filename (e.g., Query.listProducts.res.vtl) factory.createVariableStatement( [], factory.createVariableDeclarationList( @@ -2541,7 +2542,7 @@ export class BackendSynthesizer { ts.NodeFlags.Const, ), ), - // Generate function ID + // Build pipeline function ID (e.g., QueryListProductsDataResolverFn) factory.createVariableStatement( [], factory.createVariableDeclarationList( @@ -2587,7 +2588,7 @@ export class BackendSynthesizer { ts.NodeFlags.Const, ), ), - // Get pipeline function + // Get the pipeline function configuration factory.createVariableStatement( [], factory.createVariableDeclarationList( @@ -2608,12 +2609,12 @@ export class BackendSynthesizer { ts.NodeFlags.Const, ), ), - // If statement to check if pipeline function exists + // Override the response mapping template if pipeline function exists factory.createIfStatement( factory.createIdentifier('pipelineFunction'), factory.createBlock( [ - // Read template file + // Read the VTL template content factory.createVariableStatement( [], factory.createVariableDeclarationList( @@ -2634,7 +2635,7 @@ export class BackendSynthesizer { ts.NodeFlags.Const, ), ), - // Clear S3 location + // Clear the S3 template location to use inline template factory.createExpressionStatement( factory.createBinaryExpression( factory.createPropertyAccessExpression( @@ -2645,7 +2646,7 @@ export class BackendSynthesizer { factory.createIdentifier('undefined'), ), ), - // Set inline template + // Set the inline response mapping template factory.createExpressionStatement( factory.createBinaryExpression( factory.createPropertyAccessExpression( From 50b4e85e6ba444445b3af976547005c015d73aa7 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 16:14:42 -0500 Subject: [PATCH 08/15] chore: refactor code --- .../codegen-head/data_definition_fetcher.ts | 30 ++++++++++++++++++- .../generate/generators/data/index.ts | 29 +----------------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts index e261c0ca2c0..ca73b3e32e5 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts @@ -4,7 +4,7 @@ import glob from 'glob'; import assert from 'node:assert'; import { DataDefinition } from '../core/migration-pipeline'; -import { AdditionalAuthProvider } from '../generators/data'; +import { AdditionalAuthProvider, ResolverConfig, getProjectName } from '../generators/data'; import { pathManager } from '@aws-amplify/amplify-cli-core'; // Source - amplify-category-api/packages/amplify-graphql-transformer-core/src/graphql-api.ts @@ -130,6 +130,29 @@ export class DataDefinitionFetcher { */ constructor(private backendEnvironmentResolver: BackendEnvironmentResolver, private ccbFetcher: BackendDownloader) {} + /** + * Checks if GraphQL API has resolvers directory with VTL files and copies them + */ + private copyResolvers = (): boolean => { + const rootDir = pathManager.findProjectRoot(); + const projectName = getProjectName(); + + const resolversPath = path.join(rootDir, 'amplify', 'backend', 'api', projectName, 'resolvers'); + + if (!require('fs').existsSync(resolversPath)) return false; + + const files = require('fs').readdirSync(resolversPath); + + if (!files.some((file: string) => file.endsWith('.vtl'))) return false; + + const targetPath = path.join(rootDir, 'amplify', 'data', 'resolvers'); + + require('fs').mkdirSync(path.dirname(targetPath), { recursive: true }); + require('fs').cpSync(resolversPath, targetPath, { recursive: true }); + + return true; + }; + /** * Reads and parses a JSON file. * @@ -462,6 +485,10 @@ export class DataDefinitionFetcher { const additionalAuthProviders = apiId ? await this.getAdditionalAuthProvidersFromConsole(apiId) : []; const logging = apiId ? await this.getLoggingConfigFromConsole(apiId) : undefined; + // Handle resolver copying + const resolversCopied = this.copyResolvers(); + const resolvers: ResolverConfig | undefined = resolversCopied ? { hasResolvers: true } : undefined; + return { tableMappings: undefined, schema, @@ -469,6 +496,7 @@ export class DataDefinitionFetcher { additionalAuthProviders: additionalAuthProviders.length > 0 ? additionalAuthProviders : undefined, logging, restApis: restApis.length > 0 ? restApis : undefined, + resolvers, }; } diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts index 289c458b2da..ec87c037c28 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts @@ -24,25 +24,6 @@ export interface AdditionalAuthProvider { }; } -/** - * Checks if GraphQL API has resolvers directory with VTL files and copies them - */ -const copyResolvers = (): boolean => { - const rootDir = pathManager.findProjectRoot(); - const projectName = getProjectName(); - - const resolversPath = path.join(rootDir, 'amplify', 'backend', 'api', projectName, 'resolvers'); - if (!fs.existsSync(resolversPath)) return false; - - const files = fs.readdirSync(resolversPath); - if (!files.some((file) => file.endsWith('.vtl'))) return false; - - const targetPath = path.join(rootDir, 'amplify', 'data', 'resolvers'); - fs.mkdirSync(path.dirname(targetPath), { recursive: true }); - fs.cpSync(resolversPath, targetPath, { recursive: true }); - return true; -}; - const factory = ts.factory; /** @@ -78,7 +59,7 @@ const extractModelsFromSchema = (schema: string): string[] => { return models; }; -const getProjectName = (): string | undefined => { +export const getProjectName = (): string | undefined => { try { const fs = require('fs'); const path = require('path'); @@ -172,14 +153,6 @@ export const generateDataSource = async (gen1Env: string, dataDefinition?: DataD if (!dataDefinition.schema && (!dataDefinition.restApis || dataDefinition.restApis.length === 0)) { return undefined; } - - // Handle resolver copying if GraphQL API exists - if (dataDefinition.schema) { - const resolversCopied = copyResolvers(); - if (resolversCopied) { - dataDefinition.resolvers = { hasResolvers: true }; - } - } // Properties for the defineData() function call const dataRenderProperties: ObjectLiteralElementLike[] = []; From ef0340d07b868e565f774c478972abe5f49808ed Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 16:20:36 -0500 Subject: [PATCH 09/15] chore: refactor code --- .../codegen-head/data_definition_fetcher.ts | 7 ++++++- .../generate/generators/data/index.ts | 14 +------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts index ca73b3e32e5..cc3deaa7117 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts @@ -4,7 +4,7 @@ import glob from 'glob'; import assert from 'node:assert'; import { DataDefinition } from '../core/migration-pipeline'; -import { AdditionalAuthProvider, ResolverConfig, getProjectName } from '../generators/data'; +import { AdditionalAuthProvider, getProjectName } from '../generators/data'; import { pathManager } from '@aws-amplify/amplify-cli-core'; // Source - amplify-category-api/packages/amplify-graphql-transformer-core/src/graphql-api.ts @@ -103,6 +103,11 @@ export interface CorsConfiguration { maxAge?: number; } +// Add locally in the fetcher +export interface ResolverConfig { + hasResolvers: boolean; +} + import { BackendEnvironmentResolver } from './backend_environment_selector'; import { BackendDownloader } from './backend_downloader'; import { fileOrDirectoryExists } from './directory_exists'; diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts index ec87c037c28..e9a4d954833 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/generators/data/index.ts @@ -3,19 +3,7 @@ import { renderResourceTsFile } from '../../resource/resource'; import { AppSyncClient, paginateListGraphqlApis } from '@aws-sdk/client-appsync'; import type { ConstructFactory, AmplifyFunction } from '@aws-amplify/plugin-types'; import type { AuthorizationModes, DataLoggingOptions } from '@aws-amplify/backend-data'; -import { RestApiDefinition } from '../../codegen-head/data_definition_fetcher'; - -import fs from 'fs'; -import path from 'path'; -import { pathManager } from '@aws-amplify/amplify-cli-core'; - -/** - * Resolver configuration for GraphQL API - */ -export interface ResolverConfig { - /** Whether resolvers directory was found and copied */ - hasResolvers: boolean; -} +import { RestApiDefinition, ResolverConfig } from '../../codegen-head/data_definition_fetcher'; export interface AdditionalAuthProvider { authenticationType: 'API_KEY' | 'AWS_IAM' | 'OPENID_CONNECT' | 'AMAZON_COGNITO_USER_POOLS' | 'AWS_LAMBDA'; From e0272baec7032200bb5997c3a9209b57e1d42075 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 16:41:44 -0500 Subject: [PATCH 10/15] chore: refactor --- .../generate/backend/synthesizer.ts | 3 +++ .../codegen-head/data_definition_fetcher.ts | 20 ++++++----------- .../generate/core/migration-pipeline.ts | 22 +++++++++++++++++++ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts index e147a5453bf..59a768c041e 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts @@ -2423,6 +2423,9 @@ export class BackendSynthesizer { imports.push(this.createImportStatement([factory.createIdentifier('join'), factory.createIdentifier('dirname')], 'path')); imports.push(this.createImportStatement([factory.createIdentifier('fileURLToPath')], 'url')); + const blankLine = ts.factory.createExpressionStatement(ts.factory.createIdentifier('')); + nodes.push(blankLine); + // Generate __dirname equivalent for ES modules const dirnameStatement = factory.createVariableStatement( [], diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts index cc3deaa7117..2c7bddc1059 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts @@ -112,6 +112,7 @@ import { BackendEnvironmentResolver } from './backend_environment_selector'; import { BackendDownloader } from './backend_downloader'; import { fileOrDirectoryExists } from './directory_exists'; import { AppSyncClient, GetGraphqlApiCommand } from '@aws-sdk/client-appsync'; +import { hasRestParameter } from 'typescript'; /** * Fetches and processes data definitions from Amplify Gen1 projects for migration to Gen2. @@ -136,9 +137,9 @@ export class DataDefinitionFetcher { constructor(private backendEnvironmentResolver: BackendEnvironmentResolver, private ccbFetcher: BackendDownloader) {} /** - * Checks if GraphQL API has resolvers directory with VTL files and copies them + * Checks if GraphQL API has resolvers directory with VTL files */ - private copyResolvers = (): boolean => { + private hasResolvers = (): boolean => { const rootDir = pathManager.findProjectRoot(); const projectName = getProjectName(); @@ -148,14 +149,7 @@ export class DataDefinitionFetcher { const files = require('fs').readdirSync(resolversPath); - if (!files.some((file: string) => file.endsWith('.vtl'))) return false; - - const targetPath = path.join(rootDir, 'amplify', 'data', 'resolvers'); - - require('fs').mkdirSync(path.dirname(targetPath), { recursive: true }); - require('fs').cpSync(resolversPath, targetPath, { recursive: true }); - - return true; + return files.some((file: string) => file.endsWith('.vtl')); }; /** @@ -490,9 +484,9 @@ export class DataDefinitionFetcher { const additionalAuthProviders = apiId ? await this.getAdditionalAuthProvidersFromConsole(apiId) : []; const logging = apiId ? await this.getLoggingConfigFromConsole(apiId) : undefined; - // Handle resolver copying - const resolversCopied = this.copyResolvers(); - const resolvers: ResolverConfig | undefined = resolversCopied ? { hasResolvers: true } : undefined; + // Handle resolver checking + const hasResolvers = this.hasResolvers(); + const resolvers: ResolverConfig | undefined = hasResolvers ? { hasResolvers: true } : undefined; return { tableMappings: undefined, diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts index 1560a896543..65d7394b43b 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts @@ -58,8 +58,10 @@ import { } from '../generators/storage'; import { DataDefinition, DataTableMapping, generateDataSource } from '../generators/data/index'; +import { getProjectName } from '../generators/data'; import { DataModelTableAccess } from '../codegen-head/data_model_access_parser'; import { ApiTriggerDetector } from '../adapters/functions/api-trigger-detector'; +import { pathManager } from '@aws-amplify/amplify-cli-core'; import { FunctionDefinition, renderFunctions } from '../generators/functions/index'; import assert from 'assert'; @@ -116,6 +118,22 @@ export interface Gen2RenderingOptions { /** Custom file writer function for testing or alternative output methods */ fileWriter?: (content: string, path: string) => Promise; } +/** + * Copies resolver files from Gen1 to Gen2 structure + */ +const copyResolverFiles = (outputDir: string): Renderer => ({ + render: async () => { + const rootDir = pathManager.findProjectRoot(); + const projectName = getProjectName(); + const resolversPath = path.join(rootDir, 'amplify', 'backend', 'api', projectName, 'resolvers'); + const targetPath = path.join(outputDir, 'amplify', 'data', 'resolvers'); + + if (require('fs').existsSync(resolversPath)) { + require('fs').cpSync(resolversPath, targetPath, { recursive: true }); + } + }, +}); + /** * Creates a file writer function for the specified path * @param path - File path to write to @@ -487,6 +505,10 @@ export const createGen2Renderer = ({ // Process data (GraphQL/DynamoDB) configuration - only if table mappings exist for the environment if (data) { renderers.push(new EnsureDirectory(path.join(outputDir, 'amplify', 'data'))); + if (data.resolvers?.hasResolvers) { + renderers.push(new EnsureDirectory(path.join(outputDir, 'amplify', 'data', 'resolvers'))); + renderers.push(copyResolverFiles(outputDir)); + } renderers.push( new TypescriptNodeArrayRenderer( async () => generateDataSource(backendEnvironmentName, data), From 3f1e2f86a8ced5ad94a3c7a74bc3e20a2888e073 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 16:45:10 -0500 Subject: [PATCH 11/15] chore: refactor --- .../generate/codegen-head/data_definition_fetcher.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts index 2c7bddc1059..becd04e43c5 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/codegen-head/data_definition_fetcher.ts @@ -6,6 +6,10 @@ import assert from 'node:assert'; import { DataDefinition } from '../core/migration-pipeline'; import { AdditionalAuthProvider, getProjectName } from '../generators/data'; import { pathManager } from '@aws-amplify/amplify-cli-core'; +import { BackendEnvironmentResolver } from './backend_environment_selector'; +import { BackendDownloader } from './backend_downloader'; +import { fileOrDirectoryExists } from './directory_exists'; +import { AppSyncClient, GetGraphqlApiCommand } from '@aws-sdk/client-appsync'; // Source - amplify-category-api/packages/amplify-graphql-transformer-core/src/graphql-api.ts interface Gen1AuthConfig { @@ -108,12 +112,6 @@ export interface ResolverConfig { hasResolvers: boolean; } -import { BackendEnvironmentResolver } from './backend_environment_selector'; -import { BackendDownloader } from './backend_downloader'; -import { fileOrDirectoryExists } from './directory_exists'; -import { AppSyncClient, GetGraphqlApiCommand } from '@aws-sdk/client-appsync'; -import { hasRestParameter } from 'typescript'; - /** * Fetches and processes data definitions from Amplify Gen1 projects for migration to Gen2. * From 687085cac25abac3391a37821ba0570c0864d2d8 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 16:49:46 -0500 Subject: [PATCH 12/15] feat: copy only vtl files --- .../gen2-migration/generate/core/migration-pipeline.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts index 65d7394b43b..c2d0206b5d6 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/core/migration-pipeline.ts @@ -129,7 +129,14 @@ const copyResolverFiles = (outputDir: string): Renderer => ({ const targetPath = path.join(outputDir, 'amplify', 'data', 'resolvers'); if (require('fs').existsSync(resolversPath)) { - require('fs').cpSync(resolversPath, targetPath, { recursive: true }); + const files = require('fs').readdirSync(resolversPath); + const vtlFiles = files.filter((file: string) => file.endsWith('.vtl')); + + for (const file of vtlFiles) { + const srcFile = path.join(resolversPath, file); + const destFile = path.join(targetPath, file); + require('fs').copyFileSync(srcFile, destFile); + } } }, }); From 595c268dbdf1123682cb32d67a9facc4ff52bb0f Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 16:55:36 -0500 Subject: [PATCH 13/15] chore: mid work --- .../commands/gen2-migration/generate/backend/synthesizer.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts index 59a768c041e..2f295b998ac 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts @@ -2423,8 +2423,7 @@ export class BackendSynthesizer { imports.push(this.createImportStatement([factory.createIdentifier('join'), factory.createIdentifier('dirname')], 'path')); imports.push(this.createImportStatement([factory.createIdentifier('fileURLToPath')], 'url')); - const blankLine = ts.factory.createExpressionStatement(ts.factory.createIdentifier('')); - nodes.push(blankLine); + nodes.push(factory.createEmptyStatement()); // Generate __dirname equivalent for ES modules const dirnameStatement = factory.createVariableStatement( From 158debd11db0f5b199cac8d8037e01bdaefafc33 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Fri, 27 Feb 2026 16:58:19 -0500 Subject: [PATCH 14/15] chore: mid work --- .../src/commands/gen2-migration/generate/backend/synthesizer.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts index 2f295b998ac..e147a5453bf 100644 --- a/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts +++ b/packages/amplify-cli/src/commands/gen2-migration/generate/backend/synthesizer.ts @@ -2423,8 +2423,6 @@ export class BackendSynthesizer { imports.push(this.createImportStatement([factory.createIdentifier('join'), factory.createIdentifier('dirname')], 'path')); imports.push(this.createImportStatement([factory.createIdentifier('fileURLToPath')], 'url')); - nodes.push(factory.createEmptyStatement()); - // Generate __dirname equivalent for ES modules const dirnameStatement = factory.createVariableStatement( [], From cb98674bef3de8fa5a0388b3a432170059d69a46 Mon Sep 17 00:00:00 2001 From: dgandhi62 Date: Wed, 4 Mar 2026 14:25:30 -0500 Subject: [PATCH 15/15] chore: add support for extended resolver --- .../Query.listProducts.postDataLoad.1.res.vtl | 14 +++++ .../product-catalog/configure.sh | 1 + .../product-catalog/schema.graphql | 3 +- .../product-catalog/src/App.tsx | 62 +++++++++---------- .../product-catalog/src/graphql/queries.ts | 1 + 5 files changed, 47 insertions(+), 34 deletions(-) create mode 100644 amplify-migration-apps/product-catalog/Query.listProducts.postDataLoad.1.res.vtl diff --git a/amplify-migration-apps/product-catalog/Query.listProducts.postDataLoad.1.res.vtl b/amplify-migration-apps/product-catalog/Query.listProducts.postDataLoad.1.res.vtl new file mode 100644 index 00000000000..fa9ee985c6e --- /dev/null +++ b/amplify-migration-apps/product-catalog/Query.listProducts.postDataLoad.1.res.vtl @@ -0,0 +1,14 @@ +#set($items = $ctx.prev.result.items) +#foreach($item in $items) + #set($stock = 0) + #if($item.stock) + #set($stock = $item.stock) + #end + #set($price = 0) + #if($item.price) + #set($price = $item.price) + #end + #set($total = $price * $stock) + $util.qr($item.put("totalValue", $total)) +#end +$util.toJson($ctx.prev.result) diff --git a/amplify-migration-apps/product-catalog/configure.sh b/amplify-migration-apps/product-catalog/configure.sh index bcc220bf42a..44ae517146f 100755 --- a/amplify-migration-apps/product-catalog/configure.sh +++ b/amplify-migration-apps/product-catalog/configure.sh @@ -11,3 +11,4 @@ cp -f onimageuploaded.js ./amplify/backend/function/${s3_trigger_function_name}/ cp -f onimageuploaded.package.json ./amplify/backend/function/${s3_trigger_function_name}/src/package.json cp -f custom-roles.json ./amplify/backend/api/productcatalog/custom-roles.json cp -f Query.listProducts.res.vtl ./amplify/backend/api/productcatalog/resolvers/Query.listProducts.res.vtl +cp -f Query.listProducts.postDataLoad.1.res.vtl ./amplify/backend/api/productcatalog/resolvers/Query.listProducts.postDataLoad.1.res.vtl diff --git a/amplify-migration-apps/product-catalog/schema.graphql b/amplify-migration-apps/product-catalog/schema.graphql index 4b06f11fe8c..a77f0d27cd0 100644 --- a/amplify-migration-apps/product-catalog/schema.graphql +++ b/amplify-migration-apps/product-catalog/schema.graphql @@ -27,11 +27,10 @@ type Product @model @auth(rules: [{ allow: private, provider: iam }]) { images: [String] createdBy: String updatedBy: String - discountedPrice: Float - savings: Float createdAt: AWSDateTime! updatedAt: AWSDateTime! comments: [Comment] @hasMany(indexName: "byProduct", fields: ["id"]) + totalValue: Float } type Comment @model @auth(rules: [{ allow: private, provider: iam }, { allow: owner, ownerField: "authorId" }]) { diff --git a/amplify-migration-apps/product-catalog/src/App.tsx b/amplify-migration-apps/product-catalog/src/App.tsx index 331f3551200..c62c0cf2989 100644 --- a/amplify-migration-apps/product-catalog/src/App.tsx +++ b/amplify-migration-apps/product-catalog/src/App.tsx @@ -1175,34 +1175,9 @@ function App({ signOut, user }: AppProps) { {product.price && ( - - {(product as any).discountedPrice && ( - <> - - ${product.price.toFixed(2)} - - - ${(product as any).discountedPrice.toFixed(2)} - - - Save ${(product as any).savings.toFixed(2)} - - - )} - {!(product as any).discountedPrice && ( - - ${product.price} - - )} - + + ${product.price} + )} @@ -1233,17 +1208,40 @@ function App({ signOut, user }: AppProps) { {product.brand} )} - {product.stock !== undefined && product.stock !== null && ( + {(product as any).stockStatus && ( + + {(product as any).stockStatus.replace('_', ' ')} + + )} + {(product as any).totalValue && ( 0 ? '#dcfce7' : '#fef3c7', - color: (product.stock || 0) > 0 ? '#166534' : '#92400e', + backgroundColor: '#f0f9ff', + color: '#0369a1', fontWeight: '600', borderRadius: '6px', padding: '0.25rem 0.75rem', }} > - {(product.stock || 0) > 0 ? `${product.stock} in stock` : 'Out of stock'} + Total: ${(product as any).totalValue} )} diff --git a/amplify-migration-apps/product-catalog/src/graphql/queries.ts b/amplify-migration-apps/product-catalog/src/graphql/queries.ts index 746d531f2f1..d3f731014ab 100644 --- a/amplify-migration-apps/product-catalog/src/graphql/queries.ts +++ b/amplify-migration-apps/product-catalog/src/graphql/queries.ts @@ -57,6 +57,7 @@ export const listProducts = /* GraphQL */ `query ListProducts( savings createdAt updatedAt + totalValue __typename } nextToken