Skip to content

Commit eb41f64

Browse files
committed
feat: Add backend-function runtime behavior to get the data config
1 parent 5d873a1 commit eb41f64

10 files changed

+425
-30
lines changed

.changeset/brave-cheetahs-repeat.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@aws-amplify/backend': patch
3+
'@aws-amplify/backend-function': patch
4+
---
5+
6+
feat: Add backend-function runtime behavior to get the data config

package-lock.json

Lines changed: 28 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend-function/package.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
"types": "./lib/index.d.ts",
1111
"import": "./lib/index.js",
1212
"require": "./lib/index.js"
13+
},
14+
"./runtime": {
15+
"types": "./lib/runtime/index.d.ts",
16+
"import": "./lib/runtime/index.js",
17+
"require": "./lib/runtime/index.js"
1318
}
1419
},
1520
"main": "lib/index.js",
@@ -22,11 +27,13 @@
2227
"@aws-amplify/backend-output-schemas": "^1.4.0",
2328
"@aws-amplify/backend-output-storage": "^1.1.3",
2429
"@aws-amplify/plugin-types": "^1.4.0",
30+
"@aws-sdk/client-s3": "^3.624.0",
2531
"execa": "^8.0.1"
2632
},
2733
"devDependencies": {
2834
"@aws-amplify/backend-platform-test-stubs": "^0.3.6",
2935
"@aws-amplify/platform-core": "^1.1.0",
36+
"@aws-sdk/client-s3": "^3.624.0",
3037
"@aws-sdk/client-ssm": "^3.624.0",
3138
"aws-sdk": "^2.1550.0",
3239
"uuid": "^9.0.1"

packages/backend-function/src/factory.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { FunctionEnvironmentTranslator } from './function_env_translator.js';
4444
import { FunctionEnvironmentTypeGenerator } from './function_env_type_generator.js';
4545
import { FunctionLayerArnParser } from './layer_parser.js';
4646
import { convertFunctionSchedulesToRuleSchedules } from './schedule_parser.js';
47+
import { FunctionDataConfigGenerator } from './function_data_config_generator.js';
4748

4849
const functionStackType = 'function-Lambda';
4950

@@ -425,6 +426,10 @@ class AmplifyFunction
425426
// This will be overwritten with the typed file at the end of synthesis
426427
functionEnvironmentTypeGenerator.generateProcessEnvShim();
427428

429+
const functionClientConfigGenerator = new FunctionDataConfigGenerator(id);
430+
431+
functionClientConfigGenerator.generateDataConfigShim();
432+
428433
let functionLambda: NodejsFunction;
429434
try {
430435
functionLambda = new NodejsFunction(scope, `${id}-lambda`, {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { describe, it, mock } from 'node:test';
2+
import fs from 'fs';
3+
import { FunctionDataConfigGenerator } from './function_data_config_generator.js';
4+
import assert from 'assert';
5+
import { pathToFileURL } from 'url';
6+
import { FunctionEnvironmentTypeGenerator } from './function_env_type_generator.js';
7+
8+
void describe('FunctionDataConfigGenerator', () => {
9+
void it('generates a type definition file', () => {
10+
const fsOpenSyncMock = mock.method(fs, 'openSync');
11+
const fsWriteFileSyncMock = mock.method(fs, 'writeFileSync', () => null);
12+
fsOpenSyncMock.mock.mockImplementation(() => 0);
13+
const functionDataConfigGenerator = new FunctionDataConfigGenerator(
14+
'testFunction'
15+
);
16+
const configExport =
17+
'export const { libraryOptions, resourceConfig } = await internalGetAmplifyClientConfiguration(env);';
18+
19+
functionDataConfigGenerator.generateDataConfigShim();
20+
21+
// assert type definition file path
22+
assert.equal(
23+
fsWriteFileSyncMock.mock.calls[0].arguments[0],
24+
`${process.cwd()}/.amplify/generated/data-config/testFunction.ts`
25+
);
26+
27+
// assert content
28+
assert.ok(
29+
fsWriteFileSyncMock.mock.calls[0].arguments[1]
30+
?.toString()
31+
.includes(configExport)
32+
);
33+
34+
mock.restoreAll();
35+
});
36+
37+
void it('generated data configuration file has valid syntax', async () => {
38+
const functionDataConfigGenerator = new FunctionDataConfigGenerator(
39+
'testFunction'
40+
);
41+
const filePath = `${process.cwd()}/.amplify/generated/data-config/testFunction.ts`;
42+
43+
functionDataConfigGenerator.generateDataConfigShim();
44+
45+
// The data config shim depends upon the env shim, so we need to build it for the config to be importable
46+
const functionEnvironmentTypeGenerator =
47+
new FunctionEnvironmentTypeGenerator('testFunction');
48+
functionEnvironmentTypeGenerator.generateTypedProcessEnvShim(['TEST_ENV']);
49+
50+
// import to validate syntax of data config file
51+
await import(pathToFileURL(filePath).toString());
52+
});
53+
});
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import fs from 'fs';
2+
import path from 'path';
3+
4+
const lambdaDataConfigTemplate = (
5+
functionName: string
6+
) => `// This file is auto-generated by Amplify. Edits will be overwritten.
7+
import { internalGetAmplifyClientConfiguration } from "@aws-amplify/backend-function/runtime";
8+
import { env } from "../env/${functionName}";
9+
export const { libraryOptions, resourceConfig } = await internalGetAmplifyClientConfiguration(env);
10+
`;
11+
12+
/**
13+
* Generates the data configuration imports
14+
*/
15+
export class FunctionDataConfigGenerator {
16+
private typeDefFilePath: string;
17+
18+
private indentation: string = ' ';
19+
20+
/**
21+
* Initialize data configuration file name and location
22+
*/
23+
constructor(private readonly functionName: string) {
24+
this.typeDefFilePath = `${process.cwd()}/.amplify/generated/data-config/${
25+
this.functionName
26+
}.ts`;
27+
}
28+
29+
/**
30+
* Generate data-config shim
31+
*/
32+
generateDataConfigShim = () => {
33+
this.writeShimFile(lambdaDataConfigTemplate(this.functionName));
34+
};
35+
36+
private writeShimFile = (content: string) => {
37+
const typeDefFileDirname = path.dirname(this.typeDefFilePath);
38+
39+
if (!fs.existsSync(typeDefFileDirname)) {
40+
fs.mkdirSync(typeDefFileDirname, { recursive: true });
41+
}
42+
43+
fs.writeFileSync(this.typeDefFilePath, content);
44+
};
45+
}

packages/backend-function/src/function_env_type_generator.test.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { describe, it, mock } from 'node:test';
22
import fs from 'fs';
3-
import fsp from 'fs/promises';
43
import { FunctionEnvironmentTypeGenerator } from './function_env_type_generator.js';
54
import assert from 'assert';
65
import { pathToFileURL } from 'url';
@@ -57,7 +56,6 @@ void describe('FunctionEnvironmentTypeGenerator', () => {
5756
});
5857

5958
void it('generated type definition file has valid syntax', async () => {
60-
const targetDirectory = await fsp.mkdtemp('func_env_type_gen_test');
6159
const functionEnvironmentTypeGenerator =
6260
new FunctionEnvironmentTypeGenerator('testFunction');
6361
const filePath = `${process.cwd()}/.amplify/generated/env/testFunction.ts`;
@@ -66,8 +64,6 @@ void describe('FunctionEnvironmentTypeGenerator', () => {
6664

6765
// import to validate syntax of type definition file
6866
await import(pathToFileURL(filePath).toString());
69-
70-
await fsp.rm(targetDirectory, { recursive: true, force: true });
7167
});
7268

7369
void it('does not generate duplicate environment variables', () => {

0 commit comments

Comments
 (0)