Skip to content

Commit 738fc52

Browse files
committed
Update to function generate data-config files
1 parent 7003c8a commit 738fc52

File tree

4 files changed

+106
-0
lines changed

4 files changed

+106
-0
lines changed

packages/backend-function/package.json

Lines changed: 5 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",

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: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { describe, it, mock } from 'node:test';
2+
import fs from 'fs';
3+
import fsp from 'fs/promises';
4+
import { FunctionDataConfigGenerator } from './function_data_config_generator.js';
5+
import assert from 'assert';
6+
import { pathToFileURL } from 'url';
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 getAmplifyClientsConfiguration(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 type definition file has valid syntax', async () => {
38+
const targetDirectory = await fsp.mkdtemp('func_data_config_gen_test');
39+
const functionDataConfigGenerator = new FunctionDataConfigGenerator(
40+
'testFunction'
41+
);
42+
const filePath = `${process.cwd()}/.amplify/generated/data-config/testFunction.ts`;
43+
44+
functionDataConfigGenerator.generateDataConfigShim();
45+
46+
// import to validate syntax of type definition file
47+
await import(pathToFileURL(filePath).toString());
48+
49+
await fsp.rm(targetDirectory, { recursive: true, force: true });
50+
});
51+
});
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 { getAmplifyClientsConfiguration } from "@aws-amplify/backend-function/runtime";
8+
import { env } from "../env/${functionName}";
9+
export const { libraryOptions, resourceConfig } = await getAmplifyClientsConfiguration(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+
}

0 commit comments

Comments
 (0)