Skip to content

Commit 8244950

Browse files
Merge pull request #54 from ServerlessLife/47-sam-config
fix: [#47] SAM config parameters
2 parents db4228d + 595e119 commit 8244950

File tree

27 files changed

+692
-34
lines changed

27 files changed

+692
-34
lines changed

.github/workflows/common-test.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,57 @@ jobs:
314314
- name: Test - observable mode
315315
run: OBSERVABLE_MODE=true npx vitest --retry 1 test/sam-basic.test.ts
316316

317+
test-sam-alt:
318+
runs-on: ubuntu-latest
319+
concurrency:
320+
group: test-sam-alt
321+
steps:
322+
- uses: actions/checkout@v4
323+
- uses: aws-actions/setup-sam@v2
324+
with:
325+
use-installer: true
326+
token: ${{ secrets.GITHUB_TOKEN }}
327+
- name: Use Node.js
328+
uses: actions/setup-node@v4
329+
with:
330+
node-version: ${{ env.node_version }}
331+
registry-url: 'https://registry.npmjs.org'
332+
- name: Install dependencies
333+
run: npm ci
334+
- name: Download build artifact
335+
uses: actions/download-artifact@v4
336+
if: ${{ inputs.mode == 'build' }}
337+
with:
338+
name: dist
339+
path: dist
340+
- name: Install lambda-live-debugger globally
341+
if: ${{ inputs.mode == 'global' }}
342+
run: |
343+
npm i lambda-live-debugger -g
344+
working-directory: test
345+
- name: Install lambda-live-debugger locally
346+
if: ${{ inputs.mode == 'local' }}
347+
run: |
348+
npm i lambda-live-debugger
349+
working-directory: test
350+
- name: Configure AWS Credentials
351+
uses: aws-actions/configure-aws-credentials@v4
352+
with:
353+
aws-region: eu-west-1
354+
role-to-assume: ${{ secrets.AWS_ROLE }}
355+
role-session-name: GitHubActions
356+
- name: Destroy
357+
run: npm run destroy
358+
working-directory: test/sam-alt
359+
continue-on-error: true
360+
- name: Deploy
361+
run: npm run deploy
362+
working-directory: test/sam-alt
363+
- name: Test
364+
run: npx vitest --retry 1 test/sam-alt.test.ts
365+
- name: Test - observable mode
366+
run: OBSERVABLE_MODE=true npx vitest --retry 1 test/sam-alt.test.ts
367+
317368
test-terraform-basic:
318369
runs-on: ubuntu-latest
319370
concurrency:

.vscode/launch.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,37 @@
125125
"type": "node",
126126
"cwd": "${workspaceRoot}/test/sam-basic"
127127
},
128+
{
129+
"name": "LLDebugger - SAM alt",
130+
"program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs",
131+
"args": [
132+
"../../src/lldebugger.ts",
133+
"--config-env=test",
134+
"--sam-config-file=alt-samconfig.yaml",
135+
"--sam-template-file=alt-template.yaml"
136+
],
137+
"request": "launch",
138+
"skipFiles": ["<node_internals>/**"],
139+
"console": "integratedTerminal",
140+
"type": "node",
141+
"cwd": "${workspaceRoot}/test/sam-alt"
142+
},
143+
{
144+
"name": "LLDebugger - SAM alt - observable",
145+
"program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs",
146+
"args": [
147+
"../../src/lldebugger.ts",
148+
"--config-env=test",
149+
"-o",
150+
"--sam-config-file=alt-samconfig.yaml",
151+
"--sam-template-file=alt-template.yaml"
152+
],
153+
"request": "launch",
154+
"skipFiles": ["<node_internals>/**"],
155+
"console": "integratedTerminal",
156+
"type": "node",
157+
"cwd": "${workspaceRoot}/test/sam-alt"
158+
},
128159
{
129160
"name": "LLDebugger - Terraform basic",
130161
"program": "${workspaceRoot}/node_modules/tsx/dist/cli.mjs",

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ The configuration is saved to `lldebugger.config.ts`.
109109
-o, --observable Observable mode
110110
-i --interval <interval> Observable mode interval (default: "3000")
111111
--config-env <evironment> SAM environment
112+
--sam-config-file <file> SAM configuration file
113+
--sam-template-file <file> SAM template file
112114
--profile <profile> AWS profile to use
113115
--region <region> AWS region to use
114116
--role <role> AWS role to use

package-lock.json

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

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
"test-sls-esbuild-esm-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sls-esbuild-esm.test.ts",
6060
"test-sam-basic": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/sam-basic.test.ts",
6161
"test-sam-basic-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sam-basic.test.ts",
62+
"test-sam-alt": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/sam-alt.test.ts",
63+
"test-sam-alt-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/sam-alt.test.ts",
6264
"test-terraform-basic": "npm run build && RUN_TEST_FROM_CLI=true vitest run test/terraform-basic.test.ts",
6365
"test-terraform-basic-observable": "npm run build && RUN_TEST_FROM_CLI=true OBSERVABLE_MODE=true vitest run test/terraform-basic.test.ts",
6466
"docs:dev": "vitepress dev",
@@ -137,6 +139,7 @@
137139
"test/sls-basic",
138140
"test/sls-esbuild",
139141
"test/sam-basic",
142+
"test/sam-alt",
140143
"test/terraform-basic"
141144
]
142145
}

src/configuration.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ async function readConfig() {
2323
const configFromCliArgs = await getConfigFromCliArgs(supportedFrameworks);
2424
Configuration.setConfig(configFromCliArgs as any); // not complete config
2525

26-
const currentFramework = await ResourceDiscovery.getCurrentFrameworkName();
26+
const currentFramework = await ResourceDiscovery.getCurrentFrameworkName(
27+
configFromCliArgs as LldConfig,
28+
);
2729

2830
Logger.setVerbose(configFromCliArgs.verbose === true);
2931

src/configuration/getConfigFromCliArgs.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ export async function getConfigFromCliArgs(
4848
defaultObservableInterval.toString(),
4949
);
5050
program.option('--config-env <evironment>', 'SAM environment');
51+
program.option('--sam-config-file <file>', 'SAM configuration file');
52+
program.option('--sam-template-file <file>', 'SAM template file');
5153
program.option('--profile <profile>', 'AWS profile to use');
5254
program.option('--region <region>', 'AWS region to use');
5355
program.option('--role <role>', 'AWS role to use');

src/configuration/getConfigFromWizard.ts

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,22 @@ export async function getConfigFromWizard({
121121
message: 'Would you like to enter SAM environment?',
122122
default: configFromCliArgs.configEnv ?? currentConfig?.configEnv,
123123
},
124+
{
125+
type: 'input',
126+
name: 'samConfigFile',
127+
message:
128+
'Would you like to enter SAM configuration file (default = samconfig.toml)?',
129+
default:
130+
configFromCliArgs.samConfigFile ?? currentConfig?.samConfigFile,
131+
},
132+
{
133+
type: 'input',
134+
name: 'samTemplateFile',
135+
message:
136+
'Would you like to enter SAM template file (default = template.yaml)?',
137+
default:
138+
configFromCliArgs.samTemplateFile ?? currentConfig?.samTemplateFile,
139+
},
124140
]);
125141

126142
answers = { ...answers, ...samAnswers };
@@ -150,10 +166,9 @@ export async function getConfigFromWizard({
150166
name: 'observable',
151167
message:
152168
'Do you want to use observable mode, which just sends events to the debugger and do not use the respose?',
153-
default:
154-
configFromCliArgs.observable !== undefined
155-
? configFromCliArgs.observable
156-
: currentConfig?.observable,
169+
default: !!(configFromCliArgs.observable !== undefined
170+
? configFromCliArgs.observable
171+
: currentConfig?.observable),
157172
},
158173
]);
159174

@@ -349,7 +364,7 @@ import { type LldConfigTs } from "lambda-live-debugger";
349364
export default {
350365
// Framework to use
351366
framework: "${config.framework}",
352-
// AWS CDK context
367+
// AWS CDK framework context
353368
context: ${config.context ? JSON.stringify(config.context) : undefined},
354369
// Serverless Framework stage
355370
stage: "${config.stage}",
@@ -363,8 +378,12 @@ export default {
363378
region: "${config.region}",
364379
// AWS role
365380
role: "${config.role}",
366-
// SAM environment
381+
// SAM framework environment
367382
configEnv: "${config.configEnv}",
383+
// SAM framework configuration file
384+
samConfigFile: "${config.samConfigFile}",
385+
// SAM framework template file
386+
samTemplateFile: "${config.samTemplateFile}",
368387
// Observable mode
369388
observable: ${config.observable},
370389
// Observable mode interval
@@ -408,6 +427,8 @@ function getConfigFromAnswers(answers: any): LldConfigCliArgs {
408427
region: answers.region,
409428
role: answers.role,
410429
configEnv: answers.configEnv,
430+
samConfigFile: answers.samConfigFile,
431+
samTemplateFile: answers.samTemplateFile,
411432
observable: answers.observable,
412433
interval:
413434
answers.interval !== undefined

src/frameworks/iFrameworks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface IFramework {
1414
* Can this class handle the current project
1515
* @returns
1616
*/
17-
canHandle(): Promise<boolean>;
17+
canHandle(config: LldConfigBase): Promise<boolean>;
1818

1919
/**
2020
* Get Lambda functions

src/frameworks/samFramework.ts

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ import { Logger } from '../logger.js';
1515
* Support for AWS SAM framework
1616
*/
1717
export class SamFramework implements IFramework {
18-
protected samConfigFile = 'samconfig.toml';
19-
protected samTemplateFile = 'template.yaml';
20-
2118
/**
2219
* Framework name
2320
*/
@@ -29,28 +26,44 @@ export class SamFramework implements IFramework {
2926
* Can this class handle the current project
3027
* @returns
3128
*/
32-
public async canHandle(): Promise<boolean> {
29+
public async canHandle(config: LldConfigBase): Promise<boolean> {
30+
const { samConfigFile, samTemplateFile } = this.getConfigFiles(config);
31+
3332
try {
34-
await fs.access(path.resolve(this.samConfigFile), constants.F_OK);
33+
await fs.access(samConfigFile, constants.F_OK);
3534
} catch {
3635
Logger.verbose(
37-
`[SAM] This is not a SAM framework project. ${path.resolve(this.samConfigFile)} not found.`,
36+
`[SAM] This is not a SAM framework project. ${samConfigFile} not found.`,
3837
);
3938
return false;
4039
}
4140

4241
try {
43-
await fs.access(path.resolve(this.samTemplateFile), constants.F_OK);
42+
await fs.access(samTemplateFile, constants.F_OK);
4443
} catch {
4544
Logger.verbose(
46-
`[SAM] This is not a SAM framework project. ${path.resolve(this.samTemplateFile)} not found.`,
45+
`[SAM] This is not a SAM framework project. ${samTemplateFile} not found.`,
4746
);
4847
return false;
4948
}
5049

5150
return true;
5251
}
5352

53+
/**
54+
* Get configuration files
55+
* @param config Configuration
56+
* @returns Configuration files
57+
*/
58+
private getConfigFiles(config: LldConfigBase) {
59+
const samConfigFile = config.samConfigFile ?? 'samconfig.toml';
60+
const samTemplateFile = config.samTemplateFile ?? 'template.yaml';
61+
return {
62+
samConfigFile: path.resolve(samConfigFile),
63+
samTemplateFile: path.resolve(samTemplateFile),
64+
};
65+
}
66+
5467
/**
5568
* Get Lambda functions
5669
* @param config Configuration
@@ -63,24 +76,28 @@ export class SamFramework implements IFramework {
6376
role: config.role,
6477
};
6578

79+
const { samConfigFile, samTemplateFile } = this.getConfigFiles(config);
80+
6681
const environment = config.configEnv ?? 'default';
6782

68-
const samConfigContent = await fs.readFile(
69-
path.resolve(this.samConfigFile),
70-
'utf-8',
71-
);
83+
const samConfigContent = await fs.readFile(samConfigFile, 'utf-8');
84+
85+
let samConfig: any;
86+
// is toml extension
87+
if (samConfigFile.endsWith('.toml')) {
88+
samConfig = toml.parse(samConfigContent);
89+
} else {
90+
samConfig = yaml.parse(samConfigContent);
91+
}
7292

73-
const samConfig = toml.parse(samConfigContent);
7493
const stackName = samConfig[environment]?.global?.parameters?.stack_name;
7594

7695
if (!stackName) {
77-
throw new Error(
78-
`Stack name not found in ${path.resolve(this.samConfigFile)}`,
79-
);
96+
throw new Error(`Stack name not found in ${samConfigFile}`);
8097
}
8198

8299
const samTemplateContent = await fs.readFile(
83-
path.resolve(this.samTemplateFile),
100+
path.resolve(samTemplateFile),
84101
'utf-8',
85102
);
86103
const template = yaml.parse(samTemplateContent);

0 commit comments

Comments
 (0)