Skip to content

Commit 29fe7de

Browse files
committed
feat: stronger types for SSM getParameter
1 parent 747a279 commit 29fe7de

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

Diff for: packages/parameters/src/ssm/SSMProvider.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import type {
1616
import type {
1717
SSMProviderOptions,
1818
SSMGetMultipleOptionsInterface,
19-
SSMGetOptionsInterface,
19+
SSMGetOptions,
20+
SSMGetOptionsUnion,
21+
SSMGetOutput,
2022
SSMGetParametersByNameOutputInterface,
2123
SSMGetParametersByNameOptionsInterface,
2224
SSMSplitBatchAndDecryptParametersOutputType,
@@ -315,11 +317,11 @@ class SSMProvider extends BaseProvider {
315317
* @param {SSMGetOptionsInterface} options - Options to configure the provider
316318
* @see https://awslabs.github.io/aws-lambda-powertools-typescript/latest/utilities/parameters/
317319
*/
318-
public async get(
320+
public async get<O extends SSMGetOptionsUnion | undefined = undefined>(
319321
name: string,
320-
options?: SSMGetOptionsInterface | undefined
321-
): Promise<string | Record<string, unknown> | undefined> {
322-
return super.get(name, options) as Promise<string | Record<string, unknown> | undefined>;
322+
options?: O & SSMGetOptions
323+
): Promise<SSMGetOutput<O> | undefined> {
324+
return super.get(name, options) as Promise<SSMGetOutput<O> | undefined>;
323325
}
324326

325327
/**
@@ -471,7 +473,7 @@ class SSMProvider extends BaseProvider {
471473
*/
472474
protected async _get(
473475
name: string,
474-
options?: SSMGetOptionsInterface
476+
options?: SSMGetOptions
475477
): Promise<string | undefined> {
476478
const sdkOptions: GetParameterCommandInput = {
477479
...(options?.sdkOptions || {}),

Diff for: packages/parameters/src/ssm/getParameter.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { SSMProvider, DEFAULT_PROVIDERS } from './SSMProvider';
2-
import type { SSMGetOptionsInterface } from '../types/SSMProvider';
2+
import type {
3+
SSMGetOptions,
4+
SSMGetOptionsUnion,
5+
SSMGetOutput,
6+
} from '../types/SSMProvider';
37

48
/**
59
* ## Intro
@@ -136,15 +140,15 @@ import type { SSMGetOptionsInterface } from '../types/SSMProvider';
136140
* @param {SSMGetOptionsInterface} options - Options to configure the provider
137141
* @see https://awslabs.github.io/aws-lambda-powertools-typescript/latest/utilities/parameters/
138142
*/
139-
const getParameter = (
143+
const getParameter = <O extends SSMGetOptionsUnion | undefined = undefined>(
140144
name: string,
141-
options?: SSMGetOptionsInterface
142-
): Promise<undefined | string | Record<string, unknown>> => {
145+
options?: O & SSMGetOptions
146+
): Promise<SSMGetOutput<O> | undefined> => {
143147
if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) {
144148
DEFAULT_PROVIDERS.ssm = new SSMProvider();
145149
}
146150

147-
return (DEFAULT_PROVIDERS.ssm as SSMProvider).get(name, options);
151+
return (DEFAULT_PROVIDERS.ssm as SSMProvider).get(name, options) as Promise<SSMGetOutput<O> | undefined>;
148152
};
149153

150154
export {

Diff for: packages/parameters/src/types/SSMProvider.ts

+25-2
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,32 @@ type SSMProviderOptions = SSMProviderOptionsWithClientConfig | SSMProviderOption
5454
* @property {TransformOptions} transform - Transform to be applied, can be 'json' or 'binary'.
5555
* @property {boolean} decrypt - If true, the parameter will be decrypted.
5656
*/
57-
interface SSMGetOptionsInterface extends GetOptionsInterface {
57+
interface SSMGetOptions extends GetOptionsInterface {
5858
decrypt?: boolean
5959
sdkOptions?: Partial<GetParameterCommandInput>
6060
}
6161

62+
interface SSMGetOptionsTransformJson extends SSMGetOptions {
63+
transform: 'json'
64+
}
65+
66+
interface SSMGetOptionsTransformBinary extends SSMGetOptions {
67+
transform: 'binary'
68+
}
69+
70+
interface SSMGetOptionsTransformNone extends SSMGetOptions {
71+
transform?: never
72+
}
73+
74+
type SSMGetOptionsUnion = SSMGetOptionsTransformJson | SSMGetOptionsTransformBinary | SSMGetOptionsTransformNone | undefined;
75+
76+
type SSMGetOutput<O = undefined> =
77+
undefined extends O ? string :
78+
O extends SSMGetOptionsTransformNone | SSMGetOptionsTransformBinary ? string :
79+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
80+
O extends SSMGetOptionsTransformJson ? Record<string, any> :
81+
never;
82+
6283
/**
6384
* Options for the SSMProvider getMultiple method.
6485
*
@@ -121,7 +142,9 @@ type SSMGetParametersByNameFromCacheOutputType = {
121142

122143
export type {
123144
SSMProviderOptions,
124-
SSMGetOptionsInterface,
145+
SSMGetOptions,
146+
SSMGetOptionsUnion,
147+
SSMGetOutput,
125148
SSMGetMultipleOptionsInterface,
126149
SSMGetParametersByNameOptionsInterface,
127150
SSMSplitBatchAndDecryptParametersOutputType,

0 commit comments

Comments
 (0)