Skip to content

Commit 1edd71b

Browse files
authored
Merge pull request #15 from bboure/feature/substitutions
Implement Template Substitutions
2 parents 09e4e2c + f576a8b commit 1edd71b

File tree

3 files changed

+813
-2027
lines changed

3 files changed

+813
-2027
lines changed

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
"/lib"
2020
],
2121
"dependencies": {
22-
"amplify-appsync-simulator": "^1.5.0",
23-
"amplify-util-mock": "^3.5.0",
22+
"amplify-appsync-simulator": "^1.13.1",
23+
"amplify-util-mock": "^3.13.1",
2424
"aws-sdk": "^2.585.0",
2525
"axios": "^0.19.0",
26-
"cfn-resolver-lib": "^1.1.2",
26+
"cfn-resolver-lib": "^1.1.5",
2727
"dataloader": "^2.0.0",
2828
"lodash": "^4.17.15"
2929
},

src/getAppSyncConfig.js

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
} from 'amplify-appsync-simulator';
44
import { invoke } from 'amplify-util-mock/lib/utils/lambda/invoke';
55
import fs from 'fs';
6-
import { find } from 'lodash';
6+
import { forEach } from 'lodash';
77
import path from 'path';
88

99
export default function getAppSyncConfig(context, appSyncConfig) {
@@ -15,8 +15,8 @@ export default function getAppSyncConfig(context, appSyncConfig) {
1515
dataSources: (appSyncConfig.dataSources || []).flat(),
1616
};
1717

18-
const getFileMap = (basePath, filePath) => ({
19-
path: filePath,
18+
const getFileMap = (basePath, filePath, substitutionPath = null) => ({
19+
path: substitutionPath || filePath,
2020
content: fs.readFileSync(path.join(basePath, filePath), { encoding: 'utf8' }),
2121
});
2222

@@ -94,21 +94,26 @@ export default function getAppSyncConfig(context, appSyncConfig) {
9494
}
9595
};
9696

97+
const getDefaultTemplatePrefix = (template) => {
98+
const { name, type, field } = template;
99+
return name ? `${name}` : `${type}.${field}`;
100+
};
101+
97102
const makeResolver = (resolver) => ({
98103
kind: resolver.kind || 'UNIT',
99104
fieldName: resolver.field,
100105
typeName: resolver.type,
101106
dataSourceName: resolver.dataSource,
102107
functions: resolver.functions,
103-
requestMappingTemplateLocation: resolver.request || `${resolver.type}.${resolver.field}.request.vtl`,
104-
responseMappingTemplateLocation: resolver.response || `${resolver.type}.${resolver.field}.response.vtl`,
108+
requestMappingTemplateLocation: `${getDefaultTemplatePrefix(resolver)}.request.vtl`,
109+
responseMappingTemplateLocation: `${getDefaultTemplatePrefix(resolver)}.response.vtl`,
105110
});
106111

107112
const makeFunctionConfiguration = (functionConfiguration) => ({
108113
dataSourceName: functionConfiguration.dataSource,
109114
name: functionConfiguration.name,
110-
requestMappingTemplateLocation: functionConfiguration.request,
111-
responseMappingTemplateLocation: functionConfiguration.response,
115+
requestMappingTemplateLocation: `${getDefaultTemplatePrefix(functionConfiguration)}.request.vtl`,
116+
responseMappingTemplateLocation: `${getDefaultTemplatePrefix(functionConfiguration)}.response.vtl`,
112117
});
113118

114119
const makeAuthType = (authType) => {
@@ -143,23 +148,42 @@ export default function getAppSyncConfig(context, appSyncConfig) {
143148
cfg.mappingTemplatesLocation || 'mapping-templates',
144149
);
145150

151+
const makeMappingTemplate = (filePath, substitutionPath = null, substitutions = {}) => {
152+
const mapping = getFileMap(mappingTemplatesLocation, filePath, substitutionPath);
153+
154+
forEach(substitutions, (value, variable) => {
155+
const regExp = new RegExp(`\\$\{?${variable}}?`, 'g');
156+
mapping.content = mapping.content.replace(regExp, value);
157+
});
158+
159+
return mapping;
160+
};
161+
146162
const makeMappingTemplates = (config) => {
147163
const sources = [].concat(
148164
config.mappingTemplates,
149165
config.functionConfigurations,
150166
);
151167

152168
return sources.reduce((acc, template) => {
153-
const requestTemplate = template.request || `${template.type}.${template.field}.request.vtl`;
154-
if (!find(acc, (e) => e.path === requestTemplate)) {
155-
acc.push(getFileMap(mappingTemplatesLocation, requestTemplate));
156-
}
157-
const responseTemplate = template.response || `${template.type}.${template.field}.response.vtl`;
158-
if (!find(acc, (e) => e.path === responseTemplate)) {
159-
acc.push(getFileMap(mappingTemplatesLocation, responseTemplate));
160-
}
161-
162-
return acc;
169+
const {
170+
substitutions = {},
171+
request,
172+
response,
173+
} = template;
174+
175+
const defaultTemplatePrefix = getDefaultTemplatePrefix(template);
176+
177+
const requestTemplate = request || `${defaultTemplatePrefix}.request.vtl`;
178+
const responseTemplate = response || `${defaultTemplatePrefix}.response.vtl`;
179+
180+
// Substitutions
181+
const allSubstitutions = { ...config.substitutions, ...substitutions };
182+
return [
183+
...acc,
184+
makeMappingTemplate(requestTemplate, `${defaultTemplatePrefix}.request.vtl`, allSubstitutions),
185+
makeMappingTemplate(responseTemplate, `${defaultTemplatePrefix}.response.vtl`, allSubstitutions),
186+
];
163187
}, []);
164188
};
165189

0 commit comments

Comments
 (0)