This repository was archived by the owner on Jul 9, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsettings.ts
92 lines (87 loc) · 1.76 KB
/
settings.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import {
GetParametersByPathCommand,
SSMClient,
PutParameterCommand,
DeleteParameterCommand,
} from '@aws-sdk/client-ssm'
type Scopes = 'context' | 'cellGeoLocation' | 'codebuild'
type Systems = 'stack' | 'unwiredlabs' | 'github' | 'nrfconnectforcloud'
export const getSettings =
<Settings extends Record<string, string>>({
ssm,
stackName,
scope,
system,
}: {
ssm: SSMClient
stackName: string
scope: Scopes
system: Systems
}) =>
async (): Promise<Settings> => {
const Path = `/${stackName}/${scope}/${system}`
const { Parameters } = await ssm.send(
new GetParametersByPathCommand({
Path,
Recursive: true,
}),
)
if (Parameters === undefined)
throw new Error(`System not configured: ${Path}!`)
return Parameters.map(({ Name, ...rest }) => ({
...rest,
Name: Name?.replace(`${Path}/`, ''),
})).reduce(
(settings, { Name, Value }) => ({
...settings,
[Name ?? '']: Value ?? '',
}),
{} as Settings,
)
}
export const putSettings =
({
ssm,
stackName,
scope,
system,
}: {
ssm: SSMClient
stackName: string
scope: Scopes
system: Systems
}) =>
async ({
property,
value,
deleteBeforeUpdate,
}: {
property: string
value: string
/**
* Useful when depending on the parameter having version 1, e.g. for use in CloudFormation
*/
deleteBeforeUpdate?: boolean
}): Promise<{ name: string }> => {
const Name = `/${stackName}/${scope}/${system}/${property}`
if (deleteBeforeUpdate ?? false) {
try {
await ssm.send(
new DeleteParameterCommand({
Name,
}),
)
} catch {
// pass
}
}
await ssm.send(
new PutParameterCommand({
Name,
Value: value,
Type: 'String',
Overwrite: !(deleteBeforeUpdate ?? false),
}),
)
return { name: Name }
}