Skip to content

Commit 54262de

Browse files
committed
fix(graphql-transformer-core): use addResourceDependency on aws-cdk-lib >= 2.262.0 to silence deprecation warning
1 parent 4148c5d commit 54262de

7 files changed

Lines changed: 72 additions & 7 deletions

File tree

packages/amplify-graphql-model-transformer/src/resources/dynamo-model-resource-generator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as cdk from 'aws-cdk-lib';
22
import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
33
import { ModelResourceIDs, ResourceConstants, SyncResourceIDs } from 'graphql-transformer-common';
44
import { ObjectTypeDefinitionNode } from 'graphql';
5-
import { SyncUtils, setResourceName } from '@aws-amplify/graphql-transformer-core';
5+
import { SyncUtils, setResourceName, addCfnResourceDependency } from '@aws-amplify/graphql-transformer-core';
66
import { AttributeType, CfnTable, ITable, StreamViewType, Table, TableEncryption } from 'aws-cdk-lib/aws-dynamodb';
77
import { CfnDataSource } from 'aws-cdk-lib/aws-appsync';
88
import * as iam from 'aws-cdk-lib/aws-iam';
@@ -139,7 +139,7 @@ export class DynamoModelResourceGenerator extends ModelResourceGenerator {
139139
);
140140

141141
const cfnDataSource = dataSource.node.defaultChild as CfnDataSource;
142-
cfnDataSource.addDependency(role.node.defaultChild as CfnRole);
142+
addCfnResourceDependency(cfnDataSource, role.node.defaultChild as CfnRole);
143143

144144
if (context.isProjectUsingDataStore()) {
145145
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { App, Stack, CfnResource } from 'aws-cdk-lib';
2+
import { Template } from 'aws-cdk-lib/assertions';
3+
import { addCfnResourceDependency } from '../utils/cfn-dependency';
4+
5+
const makePair = () => {
6+
const stack = new Stack(new App(), 'TestStack');
7+
const target = new CfnResource(stack, 'Target', { type: 'AWS::IAM::Role', properties: {} });
8+
const source = new CfnResource(stack, 'Source', { type: 'AWS::AppSync::DataSource', properties: {} });
9+
return { stack, source, target };
10+
};
11+
12+
describe('addCfnResourceDependency', () => {
13+
it('emits a CloudFormation DependsOn entry', () => {
14+
const { stack, source, target } = makePair();
15+
addCfnResourceDependency(source, target);
16+
const resources = Template.fromStack(stack).toJSON().Resources;
17+
expect(resources.Source.DependsOn).toEqual([stack.resolve(target.logicalId)]);
18+
});
19+
20+
it('prefers addResourceDependency when the installed CDK exposes it', () => {
21+
const { source, target } = makePair();
22+
const spy = jest.fn();
23+
(source as unknown as Record<string, unknown>).addResourceDependency = spy;
24+
const legacy = jest.spyOn(source, 'addDependency');
25+
addCfnResourceDependency(source, target);
26+
expect(spy).toHaveBeenCalledWith(target);
27+
expect(legacy).not.toHaveBeenCalled();
28+
});
29+
30+
it('falls back to addDependency on CDK versions without addResourceDependency', () => {
31+
const { source, target } = makePair();
32+
const capable = source as unknown as { addResourceDependency?: unknown };
33+
const original = capable.addResourceDependency;
34+
capable.addResourceDependency = undefined;
35+
const legacy = jest.spyOn(source, 'addDependency');
36+
addCfnResourceDependency(source, target);
37+
expect(legacy).toHaveBeenCalledWith(target);
38+
capable.addResourceDependency = original;
39+
});
40+
});

packages/amplify-graphql-transformer-core/src/appsync-function.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { BackedDataSource, BaseDataSource, CfnFunctionConfiguration } from 'aws-
33
import { Construct } from 'constructs';
44
import { InlineTemplate } from './cdk-compat/template-asset';
55
import { GraphQLApi } from './graphql-api';
6-
import { setResourceName } from './utils';
6+
import { addCfnResourceDependency, setResourceName } from './utils';
77
import { getRuntimeSpecificFunctionProps } from './utils/function-runtime';
88

99
export interface BaseFunctionConfigurationProps {
@@ -66,7 +66,7 @@ export class AppSyncFunctionConfiguration extends Construct {
6666
setResourceName(this.function, { name: id });
6767
props.api.addSchemaDependency(this.function);
6868
if (props.dataSource instanceof BackedDataSource) {
69-
this.function.addDependency(props.dataSource?.ds);
69+
addCfnResourceDependency(this.function, props.dataSource?.ds);
7070
}
7171
this.arn = this.function.attrFunctionArn;
7272
this.functionId = this.function.attrFunctionId;

packages/amplify-graphql-transformer-core/src/graphql-api.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { Construct } from 'constructs';
2222
import { LogRetention, RetentionDays } from 'aws-cdk-lib/aws-logs';
2323
import { TransformerSchema } from './cdk-compat/schema-asset';
2424
import { DefaultTransformHost } from './transform-host';
25-
import { setResourceName } from './utils';
25+
import { addCfnResourceDependency, setResourceName } from './utils';
2626

2727
export interface GraphqlApiProps {
2828
/**
@@ -194,7 +194,7 @@ export class GraphQLApi extends GraphqlApiBase implements GraphQLAPIProvider {
194194
(mode: AuthorizationMode) => mode.authorizationType === AuthorizationType.API_KEY && mode.apiKeyConfig,
195195
)?.apiKeyConfig;
196196
this.apiKeyResource = this.createAPIKey(config);
197-
this.apiKeyResource.addDependency(this.schemaResource);
197+
addCfnResourceDependency(this.apiKeyResource, this.schemaResource);
198198
this.apiKey = this.apiKeyResource.attrApiKey;
199199
}
200200

@@ -297,7 +297,7 @@ export class GraphQLApi extends GraphqlApiBase implements GraphQLAPIProvider {
297297
}
298298

299299
public addSchemaDependency(construct: CfnResource): boolean {
300-
construct.addDependency(this.schemaResource);
300+
addCfnResourceDependency(construct, this.schemaResource);
301301
return true;
302302
}
303303

packages/amplify-graphql-transformer-core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export {
7575
isSqlStrategy,
7676
normalizeDbType,
7777
setResourceName,
78+
addCfnResourceDependency,
7879
SQLLambdaResourceNames,
7980
} from './utils';
8081
export type { SetResourceNameProps } from './utils';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { CfnResource } from 'aws-cdk-lib';
2+
3+
type ResourceDependencyCapable = { addResourceDependency?: (target: CfnResource) => void };
4+
5+
/**
6+
* Declares that `source` depends on `target`, emitting a CloudFormation `DependsOn` entry.
7+
*
8+
* aws-cdk-lib >= 2.262.0 renamed `CfnResource#addDependency` to `addResourceDependency` and
9+
* deprecated the old name (jsii emits a runtime deprecation warning). Older versions do not
10+
* expose `addResourceDependency` at all. Feature-detecting at runtime keeps this library
11+
* warning-free on new CDK while remaining compatible with older supported versions.
12+
*
13+
* @param source the resource that depends on `target`
14+
* @param target the resource that must be created first
15+
*/
16+
export const addCfnResourceDependency = (source: CfnResource, target: CfnResource): void => {
17+
const candidate = source as unknown as ResourceDependencyCapable;
18+
if (typeof candidate.addResourceDependency === 'function') {
19+
candidate.addResourceDependency(target);
20+
} else {
21+
source.addDependency(target);
22+
}
23+
};

packages/amplify-graphql-transformer-core/src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export {
2020
getNonScalarFields,
2121
getParameterStoreSecretPath,
2222
} from './rds-util';
23+
export { addCfnResourceDependency } from './cfn-dependency';
2324
export const APICategory = 'api';
2425
export {
2526
setResourceName,

0 commit comments

Comments
 (0)