Skip to content

Commit f94d31c

Browse files
committed
fix: update documentation links and remove test comment in main.tf
1 parent cc5eec2 commit f94d31c

File tree

6 files changed

+79
-7
lines changed

6 files changed

+79
-7
lines changed

__tests__/utils/string.test.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,68 @@ describe('utils/string', () => {
176176
const result = renderTemplate(template, variables);
177177
expect(result).toBe('Item first and second');
178178
});
179+
180+
it('should handle undefined values by leaving placeholders unchanged', () => {
181+
const template = 'Hello, {{name}} and {{greeting}}!';
182+
const variables = { name: 'World', greeting: undefined };
183+
const result = renderTemplate(template, variables);
184+
expect(result).toBe('Hello, World and {{greeting}}!');
185+
});
186+
187+
it('should handle all undefined values', () => {
188+
const template = '{{greeting}}, {{name}}!';
189+
const variables = { greeting: undefined, name: undefined };
190+
const result = renderTemplate(template, variables);
191+
expect(result).toBe('{{greeting}}, {{name}}!');
192+
});
193+
194+
it('should handle mixed defined and undefined values', () => {
195+
const template = 'Module: {{module}}, Version: {{version}}, Author: {{author}}';
196+
const variables = { module: 'vpc-endpoint', version: undefined, author: 'TechPivot' };
197+
const result = renderTemplate(template, variables);
198+
expect(result).toBe('Module: vpc-endpoint, Version: {{version}}, Author: TechPivot');
199+
});
200+
201+
it('should handle empty string vs undefined distinction', () => {
202+
const template = 'A{{key1}}B{{key2}}C';
203+
const variables = { key1: '', key2: undefined };
204+
const result = renderTemplate(template, variables);
205+
expect(result).toBe('AB{{key2}}C');
206+
});
207+
208+
it('should handle undefined values in complex templates', () => {
209+
const template = 'Path: {{path}}, Command: {{cmd}}, Options: {{opts}}';
210+
const variables = { path: '/opt/bin/terraform', cmd: undefined, opts: '--verbose' };
211+
const result = renderTemplate(template, variables);
212+
expect(result).toBe('Path: /opt/bin/terraform, Command: {{cmd}}, Options: --verbose');
213+
});
214+
215+
it('should handle null values by leaving placeholders unchanged', () => {
216+
const template = 'Hello, {{name}} and {{greeting}}!';
217+
const variables = { name: 'World', greeting: null };
218+
const result = renderTemplate(template, variables);
219+
expect(result).toBe('Hello, World and {{greeting}}!');
220+
});
221+
222+
it('should handle all null values', () => {
223+
const template = '{{greeting}}, {{name}}!';
224+
const variables = { greeting: null, name: null };
225+
const result = renderTemplate(template, variables);
226+
expect(result).toBe('{{greeting}}, {{name}}!');
227+
});
228+
229+
it('should handle mixed null, undefined, and defined values', () => {
230+
const template = 'Module: {{module}}, Version: {{version}}, Author: {{author}}, License: {{license}}';
231+
const variables = { module: 'vpc-endpoint', version: null, author: 'TechPivot', license: undefined };
232+
const result = renderTemplate(template, variables);
233+
expect(result).toBe('Module: vpc-endpoint, Version: {{version}}, Author: TechPivot, License: {{license}}');
234+
});
235+
236+
it('should handle empty string vs null vs undefined distinction', () => {
237+
const template = 'A{{key1}}B{{key2}}C{{key3}}D';
238+
const variables = { key1: '', key2: null, key3: undefined };
239+
const result = renderTemplate(template, variables);
240+
expect(result).toBe('AB{{key2}}C{{key3}}D');
241+
});
179242
});
180243
});

src/types/metadata.types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import type { Config } from '@/types/config.types';
1414
* comprehensive mapping of all action inputs, which then drives the automatic
1515
* config generation process.
1616
*
17-
* @see {@link /workspaces/terraform-module-releaser/src/utils/metadata.ts} for usage
17+
* @see utils/metadata.ts for usage
1818
* @see {@link https://docs.github.com/en/actions/reference/metadata-syntax-for-github-actions#inputs} GitHub Actions input reference
1919
*/
2020
export interface ActionInputMetadata {

src/utils/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* - `modules_aws_s3_bucket_v1.0.0` (using '_')
1111
* - `modules.aws.s3.bucket.v1.0.0` (using '.')
1212
*
13-
* The default separator is '/' as defined in action.yml.dddd
13+
* The default separator is '/' as defined in action.yml.
1414
*/
1515
export const VALID_TAG_DIRECTORY_SEPARATORS = ['-', '_', '/', '.'];
1616

src/utils/string.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export function removeLeadingCharacters(input: string, charactersToRemove: strin
6161
*
6262
* @param template The template string containing placeholders in the format `{{key}}`.
6363
* @param variables An object where keys correspond to placeholder names and values are their replacements.
64+
* If a value is undefined or null, the placeholder will be left unchanged.
6465
* @returns The rendered string with placeholders replaced.
6566
*
6667
* @example
@@ -70,9 +71,18 @@ export function removeLeadingCharacters(input: string, charactersToRemove: strin
7071
* @example
7172
* // Returns "Hi, There!"
7273
* renderTemplate("{{greeting}}, {{name}}!", { greeting: "Hi", name: "There" })
74+
*
75+
* @example
76+
* // Returns "Hello, {{name}}!" (undefined value leaves placeholder unchanged)
77+
* renderTemplate("Hello, {{name}}!", { name: undefined })
78+
*
79+
* @example
80+
* // Returns "Hello, {{name}}!" (null value leaves placeholder unchanged)
81+
* renderTemplate("Hello, {{name}}!", { name: null })
7382
*/
74-
export function renderTemplate(template: string, variables: Record<string, string>): string {
83+
export function renderTemplate(template: string, variables: Record<string, string | undefined | null>): string {
7584
return template.replace(/\{\{(\w+)\}\}/g, (placeholder, key) => {
76-
return key in variables ? variables[key] : placeholder;
85+
const value = variables[key];
86+
return value !== undefined && value !== null ? value : placeholder;
7787
});
7888
}

src/wiki.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,8 @@ async function generateWikiTerraformModule(terraformModule: TerraformModule): Pr
309309

310310
const usage = renderTemplate(config.wikiUsageTemplate, {
311311
module_name: terraformModule.name,
312-
latest_tag: terraformModule.getLatestTag() ?? '',
313-
latest_tag_version_number: terraformModule.getLatestTagVersionNumber() ?? '',
312+
latest_tag: terraformModule.getLatestTag(),
313+
latest_tag_version_number: terraformModule.getLatestTagVersionNumber(),
314314
module_source: moduleSource,
315315
module_name_terraform: terraformModule.name.replace(/[^a-zA-Z0-9]/g, '_').toLowerCase(),
316316
});

tf-modules/vpc-endpoint/main.tf

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# Noop
2-
# Test
32

43
locals {
54
endpoints = { for k, v in var.endpoints : k => v }

0 commit comments

Comments
 (0)