Skip to content

Commit c5b06ff

Browse files
jbl428imdudu1
andcommitted
feat: add default value option to decorators
Co-authored-by: imdudu1 <[email protected]>
1 parent fb18b2a commit c5b06ff

13 files changed

+138
-55
lines changed

lib/builders/request-body.builder.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ describe('RequestBodyBuilder', () => {
1414
expect(actual).toBe('{"keyword":"search"}');
1515
});
1616

17+
test('should build json string with explicit key and default', () => {
18+
// given
19+
const builder = new RequestBodyBuilder(0, 'keyword', 1234);
20+
const args = [null];
21+
22+
// when
23+
const actual = builder.build(args);
24+
25+
// then
26+
expect(actual).toBe('{"keyword":1234}');
27+
});
28+
1729
test('should build json string without key', () => {
1830
// given
1931
const builder = new RequestBodyBuilder(1);

lib/builders/request-body.builder.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
import { TupleArrayBuilder } from './tuple-array.builder';
22

33
export class RequestBodyBuilder {
4-
metadata: Array<[index: number, key: string | undefined]> = [];
4+
metadata: Array<
5+
[index: number, value: [key: string | undefined, defaultValue: unknown]]
6+
> = [];
57

6-
constructor(index: number, key?: string) {
7-
this.add(index, key);
8+
constructor(index: number, key?: string, defaultValue?: unknown) {
9+
this.add(index, key, defaultValue);
810
}
911

10-
add(index: number, key?: string): void {
11-
this.metadata.push([index, key]);
12+
add(index: number, key?: string, defaultValue?: unknown): void {
13+
this.metadata.push([index, [key, defaultValue]]);
1214
}
1315

1416
build(args: any[]): string {
1517
const result = this.metadata.reduce<Record<string, any>>(
16-
(acc, [index, key]) => {
18+
(acc, [index, [key, defaultValue]]) => {
1719
if (key != null) {
18-
acc[key] = args[index];
20+
acc[key] = args[index] ?? defaultValue;
1921
return acc;
2022
}
2123

lib/builders/request-form.builder.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ describe('RequestFormBuilder', () => {
1414
expect([...actual.entries()]).toEqual([['keyword', 'search']]);
1515
});
1616

17+
test('should build form data with explicit key and default', () => {
18+
// given
19+
const builder = new RequestFormBuilder(0, 'keyword', 'search');
20+
const args = [null];
21+
22+
// when
23+
const actual = builder.build(args);
24+
25+
// then
26+
expect([...actual.entries()]).toEqual([['keyword', 'search']]);
27+
});
28+
1729
test('should build form data without key', () => {
1830
// given
1931
const builder = new RequestFormBuilder(1);

lib/builders/request-form.builder.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
import { TupleArrayBuilder } from './tuple-array.builder';
22

33
export class RequestFormBuilder {
4-
metadata: Array<[index: number, key: string | undefined]> = [];
4+
metadata: Array<
5+
[
6+
index: number,
7+
value: [key: string | undefined, defaultValue: string | undefined],
8+
]
9+
> = [];
510

6-
constructor(index: number, key?: string) {
7-
this.add(index, key);
11+
constructor(index: number, key?: string, defaultValue?: string) {
12+
this.add(index, key, defaultValue);
813
}
914

10-
add(index: number, key?: string): void {
11-
this.metadata.push([index, key]);
15+
add(index: number, key?: string, defaultValue?: string): void {
16+
this.metadata.push([index, [key, defaultValue]]);
1217
}
1318

1419
build(args: any[]): FormData {
1520
const form = new FormData();
1621

17-
this.metadata.forEach(([index, key]) => {
22+
this.metadata.forEach(([index, [key, defaultValue]]) => {
1823
if (key != null) {
19-
form.append(key, String(args[index]));
24+
form.append(key, String(args[index] ?? defaultValue ?? ''));
2025
return;
2126
}
2227

lib/builders/request-header.builder.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ describe('RequestHeaderBuilder', () => {
1414
expect(actual).toEqual({ keyword: 'search' });
1515
});
1616

17+
test('should build header with explicit key and default', () => {
18+
// given
19+
const builder = new RequestHeaderBuilder(0, 'keyword', 'search');
20+
const args = [null];
21+
22+
// when
23+
const actual = builder.build(args);
24+
25+
// then
26+
expect(actual).toEqual({ keyword: 'search' });
27+
});
28+
1729
test('should build header without key', () => {
1830
// given
1931
const builder = new RequestHeaderBuilder(1);
Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,38 @@
11
import { TupleArrayBuilder } from './tuple-array.builder';
22

33
export class RequestHeaderBuilder {
4-
metadata: Array<[index: number, key: string | undefined]> = [];
4+
metadata: Array<
5+
[
6+
index: number,
7+
value: [key: string | undefined, defaultValue: string | undefined],
8+
]
9+
> = [];
510

6-
constructor(index: number, key?: string) {
7-
this.add(index, key);
11+
constructor(index: number, key?: string, defaultValue?: string) {
12+
this.add(index, key, defaultValue);
813
}
914

10-
add(index: number, key?: string): void {
11-
this.metadata.push([index, key]);
15+
add(index: number, key?: string, defaultValue?: string): void {
16+
this.metadata.push([index, [key, defaultValue]]);
1217
}
1318

1419
build(args: any[]): HeadersInit {
15-
return this.metadata.reduce<Record<string, string>>((acc, [index, key]) => {
16-
if (key != null) {
17-
acc[key] = String(args[index]);
18-
return acc;
19-
}
20+
return this.metadata.reduce<Record<string, string>>(
21+
(acc, [index, [key, defaultValue]]) => {
22+
if (key != null) {
23+
acc[key] = String(args[index] ?? defaultValue ?? '');
24+
return acc;
25+
}
2026

21-
TupleArrayBuilder.of<string, unknown>(args[index]).forEach(
22-
([key, value]) => {
23-
acc[key] = String(value);
24-
},
25-
);
27+
TupleArrayBuilder.of<string, unknown>(args[index]).forEach(
28+
([key, value]) => {
29+
acc[key] = String(value);
30+
},
31+
);
2632

27-
return acc;
28-
}, {});
33+
return acc;
34+
},
35+
{},
36+
);
2937
}
3038
}

lib/decorators/request-body.decorator.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ describe('RequestBody', () => {
4040
);
4141

4242
// then
43-
expect(result.metadata).toEqual([[0, undefined]]);
43+
expect(result.metadata).toEqual([[0, [undefined, undefined]]]);
4444
});
4545

4646
test('should set request body metadata with key', () => {
@@ -59,14 +59,14 @@ describe('RequestBody', () => {
5959
);
6060

6161
// then
62-
expect(result.metadata).toEqual([[0, 'foo']]);
62+
expect(result.metadata).toEqual([[0, ['foo', undefined]]]);
6363
});
6464

6565
test('should set request body metadata with multiple decorator', () => {
6666
// given
6767
class TestService {
6868
request(
69-
@RequestBody('foo') foo: string,
69+
@RequestBody('foo', 'default') foo: string,
7070
@RequestBody() bar: { bar: string },
7171
): string {
7272
return foo;
@@ -82,8 +82,8 @@ describe('RequestBody', () => {
8282

8383
// then
8484
expect(result.metadata).toEqual([
85-
[1, undefined],
86-
[0, 'foo'],
85+
[1, [undefined, undefined]],
86+
[0, ['foo', 'default']],
8787
]);
8888
});
8989
});

lib/decorators/request-body.decorator.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { REQUEST_BODY_METADATA } from './constants';
22
import { RequestBodyBuilder } from '../builders/request-body.builder';
33

4-
export function RequestBody(key?: string): ParameterDecorator {
4+
export function RequestBody(
5+
key?: string,
6+
defaultValue?: unknown,
7+
): ParameterDecorator {
58
return (target, propertyKey, parameterIndex) => {
69
if (propertyKey == null) {
710
return;
@@ -14,13 +17,13 @@ export function RequestBody(key?: string): ParameterDecorator {
1417
);
1518

1619
if (builder != null) {
17-
builder.add(parameterIndex, key);
20+
builder.add(parameterIndex, key, defaultValue);
1821
return;
1922
}
2023

2124
Reflect.defineMetadata(
2225
REQUEST_BODY_METADATA,
23-
new RequestBodyBuilder(parameterIndex, key),
26+
new RequestBodyBuilder(parameterIndex, key, defaultValue),
2427
target,
2528
propertyKey,
2629
);

lib/decorators/request-form.decorator.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ describe('RequestForm', () => {
4040
);
4141

4242
// then
43-
expect(result.metadata).toEqual([[0, undefined]]);
43+
expect(result.metadata).toEqual([[0, [undefined, undefined]]]);
4444
});
4545

4646
test('should set request form metadata with key', () => {
@@ -59,14 +59,14 @@ describe('RequestForm', () => {
5959
);
6060

6161
// then
62-
expect(result.metadata).toEqual([[0, 'foo']]);
62+
expect(result.metadata).toEqual([[0, ['foo', undefined]]]);
6363
});
6464

6565
test('should set request form metadata with multiple decorator', () => {
6666
// given
6767
class TestService {
6868
request(
69-
@RequestForm('foo') foo: string,
69+
@RequestForm('foo', 'default') foo: string,
7070
@RequestForm() bar: { bar: string },
7171
): string {
7272
return foo;
@@ -82,8 +82,8 @@ describe('RequestForm', () => {
8282

8383
// then
8484
expect(result.metadata).toEqual([
85-
[1, undefined],
86-
[0, 'foo'],
85+
[1, [undefined, undefined]],
86+
[0, ['foo', 'default']],
8787
]);
8888
});
8989
});

lib/decorators/request-form.decorator.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { REQUEST_FORM_METADATA } from './constants';
22
import { RequestFormBuilder } from '../builders/request-form.builder';
33

4-
export function RequestForm(key?: string): ParameterDecorator {
4+
export function RequestForm(
5+
key?: string,
6+
defaultValue?: string,
7+
): ParameterDecorator {
58
return (target, propertyKey, parameterIndex) => {
69
if (propertyKey == null) {
710
return;
@@ -14,13 +17,13 @@ export function RequestForm(key?: string): ParameterDecorator {
1417
);
1518

1619
if (builder != null) {
17-
builder.add(parameterIndex, key);
20+
builder.add(parameterIndex, key, defaultValue);
1821
return;
1922
}
2023

2124
Reflect.defineMetadata(
2225
REQUEST_FORM_METADATA,
23-
new RequestFormBuilder(parameterIndex, key),
26+
new RequestFormBuilder(parameterIndex, key, defaultValue),
2427
target,
2528
propertyKey,
2629
);

0 commit comments

Comments
 (0)