@aws-amplify/graphql-model-transformer 1.4.0 → 1.5.0-rds.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/API.md +15 -15
  2. package/CHANGELOG.md +11 -0
  3. package/lib/graphql-types/mutation.d.ts.map +1 -1
  4. package/lib/graphql-types/mutation.js +9 -2
  5. package/lib/graphql-types/mutation.js.map +1 -1
  6. package/lib/rds-lambda.zip +0 -0
  7. package/lib/rds-notification-lambda.zip +0 -0
  8. package/lib/rds-patching-lambda.zip +0 -0
  9. package/lib/resolvers/generators/dynamodb-vtl-generator.d.ts +6 -5
  10. package/lib/resolvers/generators/dynamodb-vtl-generator.d.ts.map +1 -1
  11. package/lib/resolvers/generators/dynamodb-vtl-generator.js +5 -5
  12. package/lib/resolvers/generators/dynamodb-vtl-generator.js.map +1 -1
  13. package/lib/resolvers/generators/rds-vtl-generator.d.ts +6 -5
  14. package/lib/resolvers/generators/rds-vtl-generator.d.ts.map +1 -1
  15. package/lib/resolvers/generators/rds-vtl-generator.js +10 -10
  16. package/lib/resolvers/generators/rds-vtl-generator.js.map +1 -1
  17. package/lib/resolvers/generators/vtl-generator.d.ts +6 -5
  18. package/lib/resolvers/generators/vtl-generator.d.ts.map +1 -1
  19. package/lib/resolvers/rds/mutation.d.ts +4 -3
  20. package/lib/resolvers/rds/mutation.d.ts.map +1 -1
  21. package/lib/resolvers/rds/mutation.js +7 -3
  22. package/lib/resolvers/rds/mutation.js.map +1 -1
  23. package/lib/resolvers/rds/query.d.ts +2 -1
  24. package/lib/resolvers/rds/query.d.ts.map +1 -1
  25. package/lib/resolvers/rds/query.js +3 -1
  26. package/lib/resolvers/rds/query.js.map +1 -1
  27. package/lib/resolvers/rds/resolver.d.ts +6 -2
  28. package/lib/resolvers/rds/resolver.d.ts.map +1 -1
  29. package/lib/resolvers/rds/resolver.js +39 -25
  30. package/lib/resolvers/rds/resolver.js.map +1 -1
  31. package/lib/resources/model-resource-generator.js +5 -5
  32. package/lib/resources/model-resource-generator.js.map +1 -1
  33. package/package.json +4 -4
  34. package/publish-notification-lambda/node_modules/.package-lock.json +13 -13
  35. package/publish-notification-lambda/node_modules/@smithy/protocol-http/package.json +2 -2
  36. package/publish-notification-lambda/node_modules/@smithy/types/README.md +37 -0
  37. package/publish-notification-lambda/node_modules/@smithy/types/package.json +3 -2
  38. package/publish-notification-lambda/node_modules/@types/node/README.md +2 -2
  39. package/publish-notification-lambda/node_modules/@types/node/package.json +2 -7
  40. package/publish-notification-lambda/node_modules/tslib/package.json +1 -1
  41. package/publish-notification-lambda/node_modules/tslib/tslib.es6.mjs +1 -1
  42. package/publish-notification-lambda/package-lock.json +13 -13
  43. package/rds-lambda/handler.ts +2 -1
  44. package/rds-lambda/node_modules/.package-lock.json +370 -345
  45. package/rds-lambda/node_modules/@babel/code-frame/README.md +1 -1
  46. package/rds-lambda/node_modules/@babel/code-frame/package.json +3 -2
  47. package/rds-lambda/node_modules/@babel/core/cjs-proxy.cjs +3 -1
  48. package/rds-lambda/node_modules/@babel/core/package.json +10 -10
  49. package/rds-lambda/node_modules/@babel/generator/package.json +3 -3
  50. package/rds-lambda/node_modules/@babel/helper-compilation-targets/package.json +1 -5
  51. package/rds-lambda/node_modules/@babel/helpers/package.json +6 -6
  52. package/rds-lambda/node_modules/@babel/highlight/README.md +1 -1
  53. package/rds-lambda/node_modules/@babel/highlight/package.json +2 -3
  54. package/rds-lambda/node_modules/@babel/parser/package.json +3 -3
  55. package/rds-lambda/node_modules/@babel/traverse/package.json +6 -5
  56. package/rds-lambda/node_modules/@babel/types/README.md +1 -1
  57. package/rds-lambda/node_modules/@babel/types/package.json +3 -4
  58. package/rds-lambda/node_modules/@jest/console/package.json +5 -5
  59. package/rds-lambda/node_modules/@jest/core/package.json +20 -20
  60. package/rds-lambda/node_modules/@jest/environment/package.json +4 -4
  61. package/rds-lambda/node_modules/@jest/expect/package.json +4 -4
  62. package/rds-lambda/node_modules/@jest/expect-utils/package.json +3 -3
  63. package/rds-lambda/node_modules/@jest/fake-timers/package.json +6 -6
  64. package/rds-lambda/node_modules/@jest/globals/package.json +5 -5
  65. package/rds-lambda/node_modules/@jest/reporters/package.json +10 -10
  66. package/rds-lambda/node_modules/@jest/test-result/package.json +5 -5
  67. package/rds-lambda/node_modules/@jest/test-sequencer/package.json +5 -5
  68. package/rds-lambda/node_modules/@jest/transform/package.json +6 -6
  69. package/rds-lambda/node_modules/@jridgewell/resolve-uri/package.json +2 -2
  70. package/rds-lambda/node_modules/@jridgewell/trace-mapping/package.json +3 -3
  71. package/rds-lambda/node_modules/@smithy/protocol-http/package.json +2 -2
  72. package/rds-lambda/node_modules/@smithy/types/README.md +37 -0
  73. package/rds-lambda/node_modules/@smithy/types/package.json +3 -2
  74. package/rds-lambda/node_modules/@types/node/README.md +2 -2
  75. package/rds-lambda/node_modules/@types/node/package.json +2 -7
  76. package/rds-lambda/node_modules/babel-jest/package.json +4 -4
  77. package/rds-lambda/node_modules/browserslist/package.json +4 -4
  78. package/rds-lambda/node_modules/caniuse-lite/package.json +1 -1
  79. package/rds-lambda/node_modules/dedent/README.md +56 -0
  80. package/rds-lambda/node_modules/dedent/dist/dedent.d.mts +17 -0
  81. package/rds-lambda/node_modules/dedent/dist/dedent.mjs +59 -0
  82. package/rds-lambda/node_modules/dedent/package.json +54 -10
  83. package/rds-lambda/node_modules/electron-to-chromium/full-chromium-versions.json +1 -1
  84. package/rds-lambda/node_modules/electron-to-chromium/full-versions.json +1 -1
  85. package/rds-lambda/node_modules/electron-to-chromium/package.json +1 -1
  86. package/rds-lambda/node_modules/electron-to-chromium/versions.json +1 -1
  87. package/rds-lambda/node_modules/expect/package.json +7 -7
  88. package/rds-lambda/node_modules/is-core-module/CHANGELOG.md +7 -0
  89. package/rds-lambda/node_modules/is-core-module/core.json +3 -3
  90. package/rds-lambda/node_modules/is-core-module/package.json +5 -5
  91. package/rds-lambda/node_modules/istanbul-lib-report/CHANGELOG.md +7 -0
  92. package/rds-lambda/node_modules/istanbul-lib-report/package.json +5 -6
  93. package/rds-lambda/node_modules/istanbul-reports/CHANGELOG.md +7 -0
  94. package/rds-lambda/node_modules/istanbul-reports/package.json +1 -1
  95. package/rds-lambda/node_modules/jest/package.json +4 -4
  96. package/rds-lambda/node_modules/jest-circus/package.json +13 -14
  97. package/rds-lambda/node_modules/jest-cli/package.json +7 -7
  98. package/rds-lambda/node_modules/jest-config/package.json +11 -11
  99. package/rds-lambda/node_modules/jest-diff/package.json +4 -4
  100. package/rds-lambda/node_modules/jest-each/package.json +4 -4
  101. package/rds-lambda/node_modules/jest-environment-node/package.json +7 -7
  102. package/rds-lambda/node_modules/jest-haste-map/package.json +4 -4
  103. package/rds-lambda/node_modules/jest-leak-detector/package.json +3 -3
  104. package/rds-lambda/node_modules/jest-matcher-utils/package.json +5 -5
  105. package/rds-lambda/node_modules/jest-message-util/package.json +3 -3
  106. package/rds-lambda/node_modules/jest-mock/package.json +3 -3
  107. package/rds-lambda/node_modules/jest-resolve/package.json +5 -5
  108. package/rds-lambda/node_modules/jest-resolve-dependencies/package.json +7 -7
  109. package/rds-lambda/node_modules/jest-runner/package.json +17 -17
  110. package/rds-lambda/node_modules/jest-runtime/package.json +15 -15
  111. package/rds-lambda/node_modules/jest-snapshot/package.json +12 -12
  112. package/rds-lambda/node_modules/jest-util/package.json +2 -2
  113. package/rds-lambda/node_modules/jest-validate/package.json +3 -3
  114. package/rds-lambda/node_modules/jest-watcher/package.json +4 -4
  115. package/rds-lambda/node_modules/jest-worker/package.json +4 -4
  116. package/rds-lambda/node_modules/make-dir/license +1 -1
  117. package/rds-lambda/node_modules/make-dir/node_modules/lru-cache/LICENSE +15 -0
  118. package/rds-lambda/node_modules/make-dir/node_modules/lru-cache/README.md +166 -0
  119. package/rds-lambda/node_modules/make-dir/node_modules/lru-cache/package.json +34 -0
  120. package/rds-lambda/node_modules/make-dir/node_modules/semver/LICENSE +15 -0
  121. package/rds-lambda/node_modules/make-dir/node_modules/semver/README.md +637 -0
  122. package/rds-lambda/node_modules/make-dir/node_modules/semver/package.json +87 -0
  123. package/rds-lambda/node_modules/make-dir/node_modules/semver/range.bnf +16 -0
  124. package/rds-lambda/node_modules/make-dir/node_modules/yallist/LICENSE +15 -0
  125. package/rds-lambda/node_modules/make-dir/node_modules/yallist/README.md +204 -0
  126. package/rds-lambda/node_modules/make-dir/node_modules/yallist/package.json +29 -0
  127. package/rds-lambda/node_modules/make-dir/package.json +15 -11
  128. package/rds-lambda/node_modules/make-dir/readme.md +1 -1
  129. package/rds-lambda/node_modules/pretty-format/package.json +3 -3
  130. package/rds-lambda/node_modules/resolve/lib/core.json +4 -1
  131. package/rds-lambda/node_modules/resolve/package.json +6 -6
  132. package/rds-lambda/node_modules/tslib/package.json +1 -1
  133. package/rds-lambda/node_modules/tslib/tslib.es6.mjs +1 -1
  134. package/rds-lambda/package-lock.json +370 -345
  135. package/rds-patching-lambda/node_modules/.package-lock.json +13 -13
  136. package/rds-patching-lambda/node_modules/@smithy/protocol-http/package.json +2 -2
  137. package/rds-patching-lambda/node_modules/@smithy/types/README.md +37 -0
  138. package/rds-patching-lambda/node_modules/@smithy/types/package.json +3 -2
  139. package/rds-patching-lambda/node_modules/@types/node/README.md +2 -2
  140. package/rds-patching-lambda/node_modules/@types/node/package.json +2 -7
  141. package/rds-patching-lambda/node_modules/tslib/package.json +1 -1
  142. package/rds-patching-lambda/node_modules/tslib/tslib.es6.mjs +1 -1
  143. package/rds-patching-lambda/package-lock.json +13 -13
  144. package/src/__tests__/__snapshots__/model-transformer.test.ts.snap +688 -0
  145. package/src/__tests__/model-transformer.test.ts +58 -1
  146. package/src/graphql-types/mutation.ts +11 -3
  147. package/src/resolvers/generators/dynamodb-vtl-generator.ts +7 -5
  148. package/src/resolvers/generators/rds-vtl-generator.ts +12 -10
  149. package/src/resolvers/generators/vtl-generator.ts +6 -5
  150. package/src/resolvers/rds/mutation.ts +18 -3
  151. package/src/resolvers/rds/query.ts +9 -1
  152. package/src/resolvers/rds/resolver.ts +45 -26
  153. package/src/resources/model-resource-generator.ts +5 -5
  154. package/tsconfig.tsbuildinfo +1 -1
  155. package/rds-lambda/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec/LICENSE +0 -21
  156. package/rds-lambda/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec/README.md +0 -200
  157. package/rds-lambda/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs +0 -164
  158. package/rds-lambda/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +0 -1
  159. package/rds-lambda/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec/package.json +0 -75
  160. package/rds-lambda/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts +0 -198
  161. package/rds-lambda/node_modules/@types/prettier/LICENSE +0 -21
  162. package/rds-lambda/node_modules/@types/prettier/README.md +0 -16
  163. package/rds-lambda/node_modules/@types/prettier/package.json +0 -65
@@ -6,7 +6,7 @@ import {
6
6
  SyncConfig,
7
7
  validateModelSchema,
8
8
  } from '@aws-amplify/graphql-transformer-core';
9
- import { InputObjectTypeDefinitionNode, InputValueDefinitionNode, ListValueNode, NamedTypeNode, parse } from 'graphql';
9
+ import { InputObjectTypeDefinitionNode, InputValueDefinitionNode, NamedTypeNode, parse } from 'graphql';
10
10
  import { getBaseType } from 'graphql-transformer-common';
11
11
  import { Template } from 'aws-cdk-lib/assertions';
12
12
  import {
@@ -89,6 +89,29 @@ describe('ModelTransformer: ', () => {
89
89
  expect(out.schema).toContain('input NonModelTypeInput');
90
90
  });
91
91
 
92
+ it('id with non string type should require the field on create mutation', async () => {
93
+ const validSchema = `
94
+ type Task @model {
95
+ id: Int!
96
+ title: String!
97
+ }
98
+ `;
99
+ const transformer = new GraphQLTransform({
100
+ transformers: [new ModelTransformer()],
101
+ });
102
+ const out = transformer.transform(validSchema);
103
+ expect(out).toBeDefined();
104
+
105
+ validateModelSchema(parse(out.schema));
106
+ const schema = parse(out.schema);
107
+ expect(out.schema).toMatchSnapshot();
108
+ const createTaskInput = getInputType(schema, 'CreateTaskInput');
109
+ expectFieldsOnInputType(createTaskInput!, ['id', 'title']);
110
+ const idField = createTaskInput!.fields!.find((f) => f.name.value === 'id');
111
+ expect(idField).toBeDefined();
112
+ expect(idField?.type.kind).toEqual('NonNullType');
113
+ });
114
+
92
115
  it('should support custom query overrides', () => {
93
116
  const validSchema = `type Post @model(queries: { get: "customGetPost", list: "customListPost" }) {
94
117
  id: ID!
@@ -1535,4 +1558,38 @@ describe('ModelTransformer: ', () => {
1535
1558
  validateModelSchema(parse(out.schema));
1536
1559
  parse(out.schema);
1537
1560
  });
1561
+
1562
+ it('should successfully transform rds schema with array and object fields', async () => {
1563
+ const validSchema = `
1564
+ type Note @model {
1565
+ id: ID!
1566
+ content: String!
1567
+ tags: [String!]
1568
+ attachments: Attachment
1569
+ }
1570
+
1571
+ type Attachment {
1572
+ report: String!
1573
+ image: String!
1574
+ }
1575
+ `;
1576
+
1577
+ const transformer = new GraphQLTransform({
1578
+ transformers: [new ModelTransformer()],
1579
+ });
1580
+ const modelToDatasourceMap = new Map<string, DatasourceType>();
1581
+ modelToDatasourceMap.set('Note', {
1582
+ dbType: 'MySQL',
1583
+ provisionDB: false,
1584
+ });
1585
+ const out = transformer.transform(validSchema, {
1586
+ modelToDatasourceMap,
1587
+ });
1588
+ expect(out).toBeDefined();
1589
+
1590
+ validateModelSchema(parse(out.schema));
1591
+ parse(out.schema);
1592
+ expect(out.schema).toMatchSnapshot();
1593
+ expect(out.resolvers).toMatchSnapshot();
1594
+ });
1538
1595
  });
@@ -1,6 +1,6 @@
1
1
  import { TransformerTransformSchemaStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
2
2
  import { DocumentNode, InputObjectTypeDefinitionNode, ObjectTypeDefinitionNode } from 'graphql';
3
- import { ModelResourceIDs, toPascalCase } from 'graphql-transformer-common';
3
+ import { ModelResourceIDs, getBaseType, toPascalCase } from 'graphql-transformer-common';
4
4
  import { InputFieldWrapper, InputObjectDefinitionWrapper, ObjectDefinitionWrapper } from '@aws-amplify/graphql-transformer-core';
5
5
  import { ModelDirectiveConfiguration } from '../directive';
6
6
  import { makeConditionFilterInput } from './common';
@@ -104,7 +104,15 @@ export const makeCreateInputField = (
104
104
  const typeName = objectWrapped.name;
105
105
  const name = ModelResourceIDs.ModelCreateInputObjectName(typeName);
106
106
 
107
- const hasIdField = objectWrapped.hasField('id');
107
+ const idFieldName = 'id';
108
+ const hasIdField = objectWrapped.hasField(idFieldName);
109
+ let shouldAutogenerateIdField = false;
110
+ if (hasIdField) {
111
+ const idField = objectWrapped.getField(idFieldName);
112
+ const idBaseType = getBaseType(idField.type);
113
+ shouldAutogenerateIdField = idBaseType === 'ID' || idBaseType === 'String';
114
+ }
115
+
108
116
  const fieldsToRemove = objectWrapped
109
117
  .fields!.filter((field) => {
110
118
  if (knownModelTypes.has(field.getTypeName())) {
@@ -126,7 +134,7 @@ export const makeCreateInputField = (
126
134
  input.addField(InputFieldWrapper.create('id', 'ID', true));
127
135
  } else {
128
136
  const idField = input.fields.find((f) => f.name === 'id');
129
- if (idField) {
137
+ if (idField && shouldAutogenerateIdField) {
130
138
  idField.makeNullable();
131
139
  }
132
140
  }
@@ -1,3 +1,4 @@
1
+ import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
1
2
  import {
2
3
  generateUpdateRequestTemplate,
3
4
  generateCreateRequestTemplate,
@@ -22,18 +23,19 @@ import {
22
23
  } from './vtl-generator';
23
24
 
24
25
  export class DynamoDBModelVTLGenerator implements ModelVTLGenerator {
25
- generateUpdateRequestTemplate(config: ModelUpdateRequestConfig): string {
26
+ generateUpdateRequestTemplate(config: ModelUpdateRequestConfig, ctx: TransformerContextProvider): string {
26
27
  return generateUpdateRequestTemplate(config.modelName, config.isSyncEnabled);
27
28
  }
28
29
 
29
- generateCreateRequestTemplate(config: ModelCreateRequestConfig): string {
30
+ generateCreateRequestTemplate(config: ModelCreateRequestConfig, ctx: TransformerContextProvider): string {
30
31
  return generateCreateRequestTemplate(config.modelName, config.modelIndexFields);
31
32
  }
33
+
32
34
  generateCreateInitSlotTemplate(config: ModelCreateInitSlotConfig, initializeIdField: boolean): string {
33
35
  return generateCreateInitSlotTemplate(config.modelConfig, initializeIdField);
34
36
  }
35
37
 
36
- generateDeleteRequestTemplate(config: ModelUpdateRequestConfig): string {
38
+ generateDeleteRequestTemplate(config: ModelUpdateRequestConfig, ctx: TransformerContextProvider): string {
37
39
  return generateDeleteRequestTemplate(config.modelName, config.isSyncEnabled);
38
40
  }
39
41
 
@@ -41,7 +43,7 @@ export class DynamoDBModelVTLGenerator implements ModelVTLGenerator {
41
43
  return generateUpdateInitSlotTemplate(config.modelConfig);
42
44
  }
43
45
 
44
- generateGetRequestTemplate(config: ModelRequestConfig): string {
46
+ generateGetRequestTemplate(config: ModelRequestConfig, ctx: TransformerContextProvider): string {
45
47
  return generateGetRequestTemplate();
46
48
  }
47
49
 
@@ -49,7 +51,7 @@ export class DynamoDBModelVTLGenerator implements ModelVTLGenerator {
49
51
  return generateGetResponseTemplate(config.isSyncEnabled);
50
52
  }
51
53
 
52
- generateListRequestTemplate(config: ModelRequestConfig): string {
54
+ generateListRequestTemplate(config: ModelRequestConfig, ctx: TransformerContextProvider): string {
53
55
  return generateListRequestTemplate();
54
56
  }
55
57
 
@@ -18,38 +18,40 @@ import {
18
18
  ModelUpdateRequestConfig,
19
19
  ModelVTLGenerator,
20
20
  } from './vtl-generator';
21
+ import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
21
22
 
22
23
  // TODO: This class is created only to show the class structure. This needs a revisit to generate correct resolvers for RDS.
23
24
  export class RDSModelVTLGenerator implements ModelVTLGenerator {
24
- generateUpdateRequestTemplate(config: ModelUpdateRequestConfig): string {
25
- return generateLambdaUpdateRequestTemplate(config.modelName, config.operationName, config.modelIndexFields ?? ['id']);
25
+ generateUpdateRequestTemplate(config: ModelUpdateRequestConfig, ctx: TransformerContextProvider): string {
26
+ return generateLambdaUpdateRequestTemplate(config.modelName, config.operationName, config.modelIndexFields ?? ['id'], ctx);
26
27
  }
27
28
 
28
- generateCreateRequestTemplate(config: ModelCreateRequestConfig): string {
29
- return generateLambdaCreateRequestTemplate(config.modelName, config.operationName);
29
+ generateCreateRequestTemplate(config: ModelCreateRequestConfig, ctx: TransformerContextProvider): string {
30
+ return generateLambdaCreateRequestTemplate(config.modelName, config.operationName, ctx);
30
31
  }
32
+
31
33
  generateCreateInitSlotTemplate(config: ModelCreateInitSlotConfig, initializeIdField: boolean): string {
32
34
  return generateCreateInitSlotTemplate(config.modelConfig, initializeIdField);
33
35
  }
34
36
 
35
- generateDeleteRequestTemplate(config: ModelUpdateRequestConfig): string {
36
- return generateLambdaDeleteRequestTemplate(config.modelName, config.operationName, config.modelIndexFields ?? ['id']);
37
+ generateDeleteRequestTemplate(config: ModelUpdateRequestConfig, ctx: TransformerContextProvider): string {
38
+ return generateLambdaDeleteRequestTemplate(config.modelName, config.operationName, config.modelIndexFields ?? ['id'], ctx);
37
39
  }
38
40
 
39
41
  generateUpdateInitSlotTemplate(config: ModelCreateInitSlotConfig): string {
40
42
  return generateUpdateInitSlotTemplate(config.modelConfig);
41
43
  }
42
44
 
43
- generateGetRequestTemplate(config: ModelRequestConfig): string {
44
- return generateLambdaRequestTemplate(config.modelName, config.operation, config.operationName);
45
+ generateGetRequestTemplate(config: ModelRequestConfig, ctx: TransformerContextProvider): string {
46
+ return generateLambdaRequestTemplate(config.modelName, config.operation, config.operationName, ctx);
45
47
  }
46
48
 
47
49
  generateGetResponseTemplate(config: ModelUpdateRequestConfig): string {
48
50
  return generateGetLambdaResponseTemplate(false);
49
51
  }
50
52
 
51
- generateListRequestTemplate(config: ModelRequestConfig): string {
52
- return generateLambdaListRequestTemplate(config.modelName, config.operation, config.operationName);
53
+ generateListRequestTemplate(config: ModelRequestConfig, ctx: TransformerContextProvider): string {
54
+ return generateLambdaListRequestTemplate(config.modelName, config.operation, config.operationName, ctx);
53
55
  }
54
56
 
55
57
  generateSyncRequestTemplate(config: ModelRequestConfig): string {
@@ -1,3 +1,4 @@
1
+ import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
1
2
  import { ModelDirectiveConfiguration } from '../../directive';
2
3
 
3
4
  export type ModelRequestConfig = {
@@ -31,14 +32,14 @@ export type ModelDefaultResponseConfig = ModelRequestConfig & {
31
32
  };
32
33
 
33
34
  export interface ModelVTLGenerator {
34
- generateUpdateRequestTemplate(config: ModelUpdateRequestConfig): string;
35
- generateCreateRequestTemplate(config: ModelCreateRequestConfig): string;
35
+ generateUpdateRequestTemplate(config: ModelUpdateRequestConfig, ctx: TransformerContextProvider): string;
36
+ generateCreateRequestTemplate(config: ModelCreateRequestConfig, ctx: TransformerContextProvider): string;
36
37
  generateCreateInitSlotTemplate(config: ModelCreateInitSlotConfig, initializeIdField: boolean): string;
37
- generateDeleteRequestTemplate(config: ModelDeleteRequestConfig): string;
38
+ generateDeleteRequestTemplate(config: ModelDeleteRequestConfig, ctx: TransformerContextProvider): string;
38
39
  generateUpdateInitSlotTemplate(config: ModelUpdateInitSlotConfig): string;
39
- generateGetRequestTemplate(config: ModelRequestConfig): string;
40
+ generateGetRequestTemplate(config: ModelRequestConfig, ctx: TransformerContextProvider): string;
40
41
  generateGetResponseTemplate(config: ModelGetResponseConfig): string;
41
- generateListRequestTemplate(config: ModelRequestConfig): string;
42
+ generateListRequestTemplate(config: ModelRequestConfig, ctx: TransformerContextProvider): string;
42
43
  generateSyncRequestTemplate(config: ModelRequestConfig): string;
43
44
  generateSubscriptionRequestTemplate(): string;
44
45
  generateSubscriptionResponseTemplate(): string;
@@ -12,7 +12,9 @@ import {
12
12
  str,
13
13
  toJson,
14
14
  } from 'graphql-mapping-template';
15
+ import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
15
16
  import { ModelDirectiveConfiguration } from '../../directive';
17
+ import { constructNonScalarFieldsStatement } from './resolver';
16
18
 
17
19
  /**
18
20
  * Generate mapping template that sets default values for create mutation
@@ -53,7 +55,7 @@ export const generateCreateInitSlotTemplate = (modelConfig: ModelDirectiveConfig
53
55
  return printBlock('Initialization default values')(compoundExpression(statements));
54
56
  };
55
57
 
56
- export const generateLambdaCreateRequestTemplate = (tableName: string, operationName: string): string =>
58
+ export const generateLambdaCreateRequestTemplate = (tableName: string, operationName: string, ctx: TransformerContextProvider): string =>
57
59
  printBlock('Invoke RDS Lambda data source')(
58
60
  compoundExpression([
59
61
  set(ref('lambdaInput'), obj({})),
@@ -63,6 +65,7 @@ export const generateLambdaCreateRequestTemplate = (tableName: string, operation
63
65
  set(ref('lambdaInput.operationName'), str(operationName)),
64
66
  set(ref('lambdaInput.args.metadata'), obj({})),
65
67
  set(ref('lambdaInput.args.metadata.keys'), list([])),
68
+ constructNonScalarFieldsStatement(tableName, ctx),
66
69
  qref(
67
70
  methodCall(ref('lambdaInput.args.metadata.keys.addAll'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.keys'), list([]))),
68
71
  ),
@@ -115,7 +118,12 @@ export const generateUpdateInitSlotTemplate = (modelConfig: ModelDirectiveConfig
115
118
  /**
116
119
  * Generate VTL template that calls the lambda for an Update mutation
117
120
  */
118
- export const generateLambdaUpdateRequestTemplate = (tableName: string, operationName: string, modelIndexFields: string[]): string =>
121
+ export const generateLambdaUpdateRequestTemplate = (
122
+ tableName: string,
123
+ operationName: string,
124
+ modelIndexFields: string[],
125
+ ctx: TransformerContextProvider,
126
+ ): string =>
119
127
  printBlock('Invoke RDS Lambda data source')(
120
128
  compoundExpression([
121
129
  set(ref('lambdaInput'), obj({})),
@@ -125,6 +133,7 @@ export const generateLambdaUpdateRequestTemplate = (tableName: string, operation
125
133
  set(ref('lambdaInput.operationName'), str(operationName)),
126
134
  set(ref('lambdaInput.args.metadata'), obj({})),
127
135
  set(ref('lambdaInput.args.metadata.keys'), list([])),
136
+ constructNonScalarFieldsStatement(tableName, ctx),
128
137
  qref(
129
138
  methodCall(ref('lambdaInput.args.metadata.keys.addAll'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.keys'), list([]))),
130
139
  ),
@@ -146,7 +155,12 @@ export const generateLambdaUpdateRequestTemplate = (tableName: string, operation
146
155
  /**
147
156
  * Generate VTL template that calls the lambda for a Delete mutation
148
157
  */
149
- export const generateLambdaDeleteRequestTemplate = (tableName: string, operationName: string, modelIndexFields: string[]): string =>
158
+ export const generateLambdaDeleteRequestTemplate = (
159
+ tableName: string,
160
+ operationName: string,
161
+ modelIndexFields: string[],
162
+ ctx: TransformerContextProvider,
163
+ ): string =>
150
164
  printBlock('Invoke RDS Lambda data source')(
151
165
  compoundExpression([
152
166
  set(ref('lambdaInput'), obj({})),
@@ -156,6 +170,7 @@ export const generateLambdaDeleteRequestTemplate = (tableName: string, operation
156
170
  set(ref('lambdaInput.operationName'), str(operationName)),
157
171
  set(ref('lambdaInput.args.metadata'), obj({})),
158
172
  set(ref('lambdaInput.args.metadata.keys'), list([])),
173
+ constructNonScalarFieldsStatement(tableName, ctx),
159
174
  qref(
160
175
  methodCall(ref('lambdaInput.args.metadata.keys.addAll'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.keys'), list([]))),
161
176
  ),
@@ -1,6 +1,13 @@
1
+ import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
1
2
  import { compoundExpression, list, methodCall, obj, printBlock, qref, ref, set, str } from 'graphql-mapping-template';
3
+ import { constructNonScalarFieldsStatement } from './resolver';
2
4
 
3
- export const generateLambdaListRequestTemplate = (tableName: string, operation: string, operationName: string): string => {
5
+ export const generateLambdaListRequestTemplate = (
6
+ tableName: string,
7
+ operation: string,
8
+ operationName: string,
9
+ ctx: TransformerContextProvider,
10
+ ): string => {
4
11
  return printBlock('Invoke RDS Lambda data source')(
5
12
  compoundExpression([
6
13
  set(ref('lambdaInput'), obj({})),
@@ -10,6 +17,7 @@ export const generateLambdaListRequestTemplate = (tableName: string, operation:
10
17
  set(ref('lambdaInput.operationName'), str(operationName)),
11
18
  set(ref('lambdaInput.args.metadata'), obj({})),
12
19
  set(ref('lambdaInput.args.metadata.keys'), list([])),
20
+ constructNonScalarFieldsStatement(tableName, ctx),
13
21
  qref(
14
22
  methodCall(ref('lambdaInput.args.metadata.keys.addAll'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.keys'), list([]))),
15
23
  ),
@@ -13,14 +13,15 @@ import {
13
13
  str,
14
14
  toJson,
15
15
  } from 'graphql-mapping-template';
16
- import { ResourceConstants } from 'graphql-transformer-common';
16
+ import { ResourceConstants, isArrayOrObject } from 'graphql-transformer-common';
17
17
  import { RDSConnectionSecrets } from '@aws-amplify/graphql-transformer-core';
18
- import { GraphQLAPIProvider, RDSLayerMapping } from '@aws-amplify/graphql-transformer-interfaces';
18
+ import { GraphQLAPIProvider, RDSLayerMapping, TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
19
19
  import { Effect, IRole, Policy, PolicyStatement, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
20
20
  import { IFunction, LayerVersion, Runtime } from 'aws-cdk-lib/aws-lambda';
21
21
  import { Construct } from 'constructs';
22
22
  import path from 'path';
23
23
  import { VpcConfig } from '@aws-amplify/graphql-transformer-interfaces/src';
24
+ import { EnumTypeDefinitionNode, FieldDefinitionNode, Kind, ObjectTypeDefinitionNode } from 'graphql';
24
25
 
25
26
  /**
26
27
  * Define RDS Lambda operations
@@ -44,6 +45,7 @@ const getLatestLayers = (latestLayers?: RDSLayerMapping): RDSLayerMapping => {
44
45
  if (latestLayers && Object.keys(latestLayers).length > 0) {
45
46
  return latestLayers;
46
47
  }
48
+ console.warn('Unable to load the latest RDS layer configuration, using local configuration.');
47
49
  const defaultLayerMapping = getDefaultLayerMapping();
48
50
  return defaultLayerMapping;
49
51
  };
@@ -52,73 +54,73 @@ const getLatestLayers = (latestLayers?: RDSLayerMapping): RDSLayerMapping => {
52
54
  // For prod use account '582037449441', layer name 'AmplifyRDSLayer' and layer version '3' as of 2023-06-20
53
55
  const getDefaultLayerMapping = (): RDSLayerMapping => ({
54
56
  'ap-northeast-1': {
55
- layerRegion: 'arn:aws:lambda:ap-northeast-1:582037449441:layer:AmplifyRDSLayer:5',
57
+ layerRegion: 'arn:aws:lambda:ap-northeast-1:582037449441:layer:AmplifyRDSLayer:11',
56
58
  },
57
59
  'us-east-1': {
58
- layerRegion: 'arn:aws:lambda:us-east-1:582037449441:layer:AmplifyRDSLayer:5',
60
+ layerRegion: 'arn:aws:lambda:us-east-1:582037449441:layer:AmplifyRDSLayer:11',
59
61
  },
60
62
  'ap-southeast-1': {
61
- layerRegion: 'arn:aws:lambda:ap-southeast-1:582037449441:layer:AmplifyRDSLayer:5',
63
+ layerRegion: 'arn:aws:lambda:ap-southeast-1:582037449441:layer:AmplifyRDSLayer:11',
62
64
  },
63
65
  'eu-west-1': {
64
- layerRegion: 'arn:aws:lambda:eu-west-1:582037449441:layer:AmplifyRDSLayer:5',
66
+ layerRegion: 'arn:aws:lambda:eu-west-1:582037449441:layer:AmplifyRDSLayer:11',
65
67
  },
66
68
  'us-west-1': {
67
- layerRegion: 'arn:aws:lambda:us-west-1:582037449441:layer:AmplifyRDSLayer:5',
69
+ layerRegion: 'arn:aws:lambda:us-west-1:582037449441:layer:AmplifyRDSLayer:11',
68
70
  },
69
71
  'ap-east-1': {
70
- layerRegion: 'arn:aws:lambda:ap-east-1:582037449441:layer:AmplifyRDSLayer:5',
72
+ layerRegion: 'arn:aws:lambda:ap-east-1:582037449441:layer:AmplifyRDSLayer:11',
71
73
  },
72
74
  'ap-northeast-2': {
73
- layerRegion: 'arn:aws:lambda:ap-northeast-2:582037449441:layer:AmplifyRDSLayer:5',
75
+ layerRegion: 'arn:aws:lambda:ap-northeast-2:582037449441:layer:AmplifyRDSLayer:11',
74
76
  },
75
77
  'ap-northeast-3': {
76
- layerRegion: 'arn:aws:lambda:ap-northeast-3:582037449441:layer:AmplifyRDSLayer:5',
78
+ layerRegion: 'arn:aws:lambda:ap-northeast-3:582037449441:layer:AmplifyRDSLayer:11',
77
79
  },
78
80
  'ap-south-1': {
79
- layerRegion: 'arn:aws:lambda:ap-south-1:582037449441:layer:AmplifyRDSLayer:5',
81
+ layerRegion: 'arn:aws:lambda:ap-south-1:582037449441:layer:AmplifyRDSLayer:11',
80
82
  },
81
83
  'ap-southeast-2': {
82
- layerRegion: 'arn:aws:lambda:ap-southeast-2:582037449441:layer:AmplifyRDSLayer:5',
84
+ layerRegion: 'arn:aws:lambda:ap-southeast-2:582037449441:layer:AmplifyRDSLayer:11',
83
85
  },
84
86
  'ca-central-1': {
85
- layerRegion: 'arn:aws:lambda:ca-central-1:582037449441:layer:AmplifyRDSLayer:5',
87
+ layerRegion: 'arn:aws:lambda:ca-central-1:582037449441:layer:AmplifyRDSLayer:11',
86
88
  },
87
89
  'eu-central-1': {
88
- layerRegion: 'arn:aws:lambda:eu-central-1:582037449441:layer:AmplifyRDSLayer:5',
90
+ layerRegion: 'arn:aws:lambda:eu-central-1:582037449441:layer:AmplifyRDSLayer:11',
89
91
  },
90
92
  'eu-north-1': {
91
- layerRegion: 'arn:aws:lambda:eu-north-1:582037449441:layer:AmplifyRDSLayer:5',
93
+ layerRegion: 'arn:aws:lambda:eu-north-1:582037449441:layer:AmplifyRDSLayer:11',
92
94
  },
93
95
  'eu-west-2': {
94
- layerRegion: 'arn:aws:lambda:eu-west-2:582037449441:layer:AmplifyRDSLayer:5',
96
+ layerRegion: 'arn:aws:lambda:eu-west-2:582037449441:layer:AmplifyRDSLayer:11',
95
97
  },
96
98
  'eu-west-3': {
97
- layerRegion: 'arn:aws:lambda:eu-west-3:582037449441:layer:AmplifyRDSLayer:5',
99
+ layerRegion: 'arn:aws:lambda:eu-west-3:582037449441:layer:AmplifyRDSLayer:11',
98
100
  },
99
101
  'sa-east-1': {
100
- layerRegion: 'arn:aws:lambda:sa-east-1:582037449441:layer:AmplifyRDSLayer:5',
102
+ layerRegion: 'arn:aws:lambda:sa-east-1:582037449441:layer:AmplifyRDSLayer:11',
101
103
  },
102
104
  'us-east-2': {
103
- layerRegion: 'arn:aws:lambda:us-east-2:582037449441:layer:AmplifyRDSLayer:5',
105
+ layerRegion: 'arn:aws:lambda:us-east-2:582037449441:layer:AmplifyRDSLayer:11',
104
106
  },
105
107
  'us-west-2': {
106
- layerRegion: 'arn:aws:lambda:us-west-2:582037449441:layer:AmplifyRDSLayer:5',
108
+ layerRegion: 'arn:aws:lambda:us-west-2:582037449441:layer:AmplifyRDSLayer:11',
107
109
  },
108
110
  'cn-north-1': {
109
- layerRegion: 'arn:aws:lambda:cn-north-1:582037449441:layer:AmplifyRDSLayer:5',
111
+ layerRegion: 'arn:aws:lambda:cn-north-1:582037449441:layer:AmplifyRDSLayer:11',
110
112
  },
111
113
  'cn-northwest-1': {
112
- layerRegion: 'arn:aws:lambda:cn-northwest-1:582037449441:layer:AmplifyRDSLayer:5',
114
+ layerRegion: 'arn:aws:lambda:cn-northwest-1:582037449441:layer:AmplifyRDSLayer:11',
113
115
  },
114
116
  'us-gov-west-1': {
115
- layerRegion: 'arn:aws:lambda:us-gov-west-1:582037449441:layer:AmplifyRDSLayer:5',
117
+ layerRegion: 'arn:aws:lambda:us-gov-west-1:582037449441:layer:AmplifyRDSLayer:11',
116
118
  },
117
119
  'us-gov-east-1': {
118
- layerRegion: 'arn:aws:lambda:us-gov-east-1:582037449441:layer:AmplifyRDSLayer:5',
120
+ layerRegion: 'arn:aws:lambda:us-gov-east-1:582037449441:layer:AmplifyRDSLayer:11',
119
121
  },
120
122
  'me-south-1': {
121
- layerRegion: 'arn:aws:lambda:me-south-1:582037449441:layer:AmplifyRDSLayer:5',
123
+ layerRegion: 'arn:aws:lambda:me-south-1:582037449441:layer:AmplifyRDSLayer:11',
122
124
  },
123
125
  });
124
126
 
@@ -293,7 +295,12 @@ export const createRdsPatchingLambdaRole = (roleName: string, stack: Construct,
293
295
  * @param operation string
294
296
  * @param operationName string
295
297
  */
296
- export const generateLambdaRequestTemplate = (tableName: string, operation: string, operationName: string): string =>
298
+ export const generateLambdaRequestTemplate = (
299
+ tableName: string,
300
+ operation: string,
301
+ operationName: string,
302
+ ctx: TransformerContextProvider,
303
+ ): string =>
297
304
  printBlock('Invoke RDS Lambda data source')(
298
305
  compoundExpression([
299
306
  set(ref('lambdaInput'), obj({})),
@@ -303,6 +310,7 @@ export const generateLambdaRequestTemplate = (tableName: string, operation: stri
303
310
  set(ref('lambdaInput.operationName'), str(operationName)),
304
311
  set(ref('lambdaInput.args.metadata'), obj({})),
305
312
  set(ref('lambdaInput.args.metadata.keys'), list([])),
313
+ constructNonScalarFieldsStatement(tableName, ctx),
306
314
  qref(
307
315
  methodCall(ref('lambdaInput.args.metadata.keys.addAll'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.keys'), list([]))),
308
316
  ),
@@ -364,3 +372,14 @@ export const generateDefaultLambdaResponseMappingTemplate = (isSyncEnabled: bool
364
372
 
365
373
  return printBlock('ResponseTemplate')(compoundExpression(statements));
366
374
  };
375
+
376
+ export const getNonScalarFields = (object: ObjectTypeDefinitionNode | undefined, ctx: TransformerContextProvider): string[] => {
377
+ if (!object) {
378
+ return [];
379
+ }
380
+ const enums = ctx.output.getTypeDefinitionsOfKind(Kind.ENUM_TYPE_DEFINITION) as EnumTypeDefinitionNode[];
381
+ return object.fields?.filter((f: FieldDefinitionNode) => isArrayOrObject(f.type, enums)).map((f) => f.name.value) || [];
382
+ };
383
+
384
+ export const constructNonScalarFieldsStatement = (tableName: string, ctx: TransformerContextProvider): Expression =>
385
+ set(ref('lambdaInput.args.metadata.nonScalarFields'), list(getNonScalarFields(ctx.output.getObject(tableName), ctx).map(str)));
@@ -252,7 +252,7 @@ export abstract class ModelResourceGenerator {
252
252
  resolverLogicalId,
253
253
  dataSource,
254
254
  MappingTemplate.s3MappingTemplateFromString(
255
- vtlGenerator.generateGetRequestTemplate(requestConfig),
255
+ vtlGenerator.generateGetRequestTemplate(requestConfig, ctx),
256
256
  `${typeName}.${fieldName}.req.vtl`,
257
257
  ),
258
258
  MappingTemplate.s3MappingTemplateFromString(
@@ -292,7 +292,7 @@ export abstract class ModelResourceGenerator {
292
292
  resolverLogicalId,
293
293
  dataSource,
294
294
  MappingTemplate.s3MappingTemplateFromString(
295
- vtlGenerator.generateListRequestTemplate(requestConfig),
295
+ vtlGenerator.generateListRequestTemplate(requestConfig, ctx),
296
296
  `${typeName}.${fieldName}.req.vtl`,
297
297
  ),
298
298
  MappingTemplate.s3MappingTemplateFromString(
@@ -338,7 +338,7 @@ export abstract class ModelResourceGenerator {
338
338
  resolverLogicalId,
339
339
  dataSource,
340
340
  MappingTemplate.s3MappingTemplateFromString(
341
- vtlGenerator.generateCreateRequestTemplate(requestConfig),
341
+ vtlGenerator.generateCreateRequestTemplate(requestConfig, ctx),
342
342
  `${typeName}.${fieldName}.req.vtl`,
343
343
  ),
344
344
  MappingTemplate.s3MappingTemplateFromString(
@@ -400,7 +400,7 @@ export abstract class ModelResourceGenerator {
400
400
  resolverLogicalId,
401
401
  dataSource,
402
402
  MappingTemplate.s3MappingTemplateFromString(
403
- vtlGenerator.generateUpdateRequestTemplate(requestConfig),
403
+ vtlGenerator.generateUpdateRequestTemplate(requestConfig, ctx),
404
404
  `${typeName}.${fieldName}.req.vtl`,
405
405
  ),
406
406
  MappingTemplate.s3MappingTemplateFromString(
@@ -461,7 +461,7 @@ export abstract class ModelResourceGenerator {
461
461
  resolverLogicalId,
462
462
  dataSource,
463
463
  MappingTemplate.s3MappingTemplateFromString(
464
- vtlGenerator.generateDeleteRequestTemplate(requestConfig),
464
+ vtlGenerator.generateDeleteRequestTemplate(requestConfig, ctx),
465
465
  `${typeName}.${fieldName}.req.vtl`,
466
466
  ),
467
467
  MappingTemplate.s3MappingTemplateFromString(