skuba 8.1.0-pm-20240506055052 → 8.1.0-skuba-dive-secret-20240522031929
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/template/base/.vscode/extensions.json +3 -0
- package/template/base/_.gitignore +1 -0
- package/template/express-rest-api/package.json +2 -0
- package/template/express-rest-api/src/config.ts +14 -6
- package/template/express-rest-api/src/framework/logging.ts +1 -1
- package/template/express-rest-api/src/framework/metrics.ts +11 -0
- package/template/express-rest-api/src/listen.ts +2 -2
- package/template/koa-rest-api/package.json +1 -1
- package/template/koa-rest-api/src/config.ts +14 -4
- package/template/lambda-sqs-worker/src/config.ts +9 -4
- package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +12 -0
- package/template/lambda-sqs-worker-cdk/infra/config.ts +14 -6
- package/template/lambda-sqs-worker-cdk/package.json +2 -0
- package/template/lambda-sqs-worker-cdk/src/app.ts +14 -2
- package/template/lambda-sqs-worker-cdk/src/config.ts +47 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skuba",
|
|
3
|
-
"version": "8.1.0-
|
|
3
|
+
"version": "8.1.0-skuba-dive-secret-20240522031929",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "SEEK development toolkit for backend applications and packages",
|
|
6
6
|
"homepage": "https://github.com/seek-oss/skuba#readme",
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
"type-fest": "2.19.0"
|
|
133
133
|
},
|
|
134
134
|
"peerDependencies": {
|
|
135
|
-
"skuba-dive": "1
|
|
135
|
+
"skuba-dive": "2.0.1-skuba-dive-secret-20240522031929"
|
|
136
136
|
},
|
|
137
137
|
"peerDependenciesMeta": {
|
|
138
138
|
"skuba-dive": {
|
|
@@ -7,8 +7,8 @@ interface Config {
|
|
|
7
7
|
name: string;
|
|
8
8
|
version: string;
|
|
9
9
|
|
|
10
|
-
metricsServer
|
|
11
|
-
port
|
|
10
|
+
metricsServer: string | null;
|
|
11
|
+
port: number | null;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
type Environment = (typeof environments)[number];
|
|
@@ -26,19 +26,27 @@ const configs: Record<Environment, () => Omit<Config, 'environment'>> = {
|
|
|
26
26
|
logLevel: 'debug',
|
|
27
27
|
name: '<%- serviceName %>',
|
|
28
28
|
version: 'local',
|
|
29
|
+
|
|
30
|
+
metricsServer: null,
|
|
31
|
+
port: null,
|
|
29
32
|
}),
|
|
30
33
|
|
|
31
34
|
test: () => ({
|
|
32
|
-
...configs.local(),
|
|
33
|
-
|
|
34
35
|
logLevel: Env.string('LOG_LEVEL', { default: 'silent' }),
|
|
36
|
+
name: '<%- serviceName %>',
|
|
35
37
|
version: 'test',
|
|
38
|
+
|
|
39
|
+
metricsServer: null,
|
|
40
|
+
port: null,
|
|
36
41
|
}),
|
|
37
42
|
|
|
38
43
|
[dev]: () => ({
|
|
39
|
-
...configs[prod](),
|
|
40
|
-
|
|
41
44
|
logLevel: 'debug',
|
|
45
|
+
name: Env.string('SERVICE'),
|
|
46
|
+
version: Env.string('VERSION'),
|
|
47
|
+
|
|
48
|
+
metricsServer: 'localhost',
|
|
49
|
+
port: Env.nonNegativeInteger('PORT'),
|
|
42
50
|
}),
|
|
43
51
|
|
|
44
52
|
[prod]: () => ({
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { StatsD } from 'hot-shots';
|
|
2
|
+
import { createStatsDClient } from 'seek-datadog-custom-metrics';
|
|
3
|
+
|
|
4
|
+
import { config } from 'src/config';
|
|
5
|
+
|
|
6
|
+
import { logger } from './logging';
|
|
7
|
+
|
|
8
|
+
/* istanbul ignore next: StatsD client is not our responsibility */
|
|
9
|
+
export const metricsClient = createStatsDClient(StatsD, config, (err) =>
|
|
10
|
+
logger.error({ err }, 'StatsD error'),
|
|
11
|
+
);
|
|
@@ -2,7 +2,7 @@ import './register';
|
|
|
2
2
|
|
|
3
3
|
import app from './app';
|
|
4
4
|
import { config } from './config';
|
|
5
|
-
import {
|
|
5
|
+
import { logger } from './framework/logging';
|
|
6
6
|
|
|
7
7
|
// If your application is deployed with more than 1 vCPU you can delete this
|
|
8
8
|
// file and use a clustering utility to run `lib/app`.
|
|
@@ -11,7 +11,7 @@ const listener = app.listen(config.port, () => {
|
|
|
11
11
|
const address = listener.address();
|
|
12
12
|
|
|
13
13
|
if (typeof address === 'object' && address) {
|
|
14
|
-
|
|
14
|
+
logger.debug(`listening on port ${address.port}`);
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
|
|
@@ -7,8 +7,8 @@ interface Config {
|
|
|
7
7
|
name: string;
|
|
8
8
|
version: string;
|
|
9
9
|
|
|
10
|
-
metricsServer
|
|
11
|
-
port
|
|
10
|
+
metricsServer: string | null;
|
|
11
|
+
port: number | null;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
type Environment = (typeof environments)[number];
|
|
@@ -26,19 +26,29 @@ const configs: Record<Environment, () => Omit<Config, 'environment'>> = {
|
|
|
26
26
|
logLevel: 'debug',
|
|
27
27
|
name: '<%- serviceName %>',
|
|
28
28
|
version: 'local',
|
|
29
|
+
|
|
30
|
+
metricsServer: null,
|
|
31
|
+
port: null,
|
|
29
32
|
}),
|
|
30
33
|
|
|
31
34
|
test: () => ({
|
|
32
|
-
...configs.local(),
|
|
33
|
-
|
|
34
35
|
logLevel: Env.string('LOG_LEVEL', { default: 'silent' }),
|
|
36
|
+
name: '<%- serviceName %>',
|
|
35
37
|
version: 'test',
|
|
38
|
+
|
|
39
|
+
metricsServer: null,
|
|
40
|
+
port: null,
|
|
36
41
|
}),
|
|
37
42
|
|
|
38
43
|
[dev]: () => ({
|
|
39
44
|
...configs[prod](),
|
|
40
45
|
|
|
41
46
|
logLevel: 'debug',
|
|
47
|
+
name: Env.string('SERVICE'),
|
|
48
|
+
version: Env.string('VERSION'),
|
|
49
|
+
|
|
50
|
+
metricsServer: 'localhost',
|
|
51
|
+
port: Env.nonNegativeInteger('PORT'),
|
|
42
52
|
}),
|
|
43
53
|
|
|
44
54
|
[prod]: () => ({
|
|
@@ -29,16 +29,21 @@ const configs: Record<Environment, () => Omit<Config, 'environment'>> = {
|
|
|
29
29
|
}),
|
|
30
30
|
|
|
31
31
|
test: () => ({
|
|
32
|
-
...configs.local(),
|
|
33
|
-
|
|
34
32
|
logLevel: Env.string('LOG_LEVEL', { default: 'silent' }),
|
|
33
|
+
metrics: false,
|
|
34
|
+
name: '<%- serviceName %>',
|
|
35
35
|
version: 'test',
|
|
36
|
+
|
|
37
|
+
destinationSnsTopicArn: 'arn:aws:sns:us-east-2:123456789012:destination',
|
|
36
38
|
}),
|
|
37
39
|
|
|
38
40
|
dev: () => ({
|
|
39
|
-
...configs.prod(),
|
|
40
|
-
|
|
41
41
|
logLevel: 'debug',
|
|
42
|
+
metrics: true,
|
|
43
|
+
name: Env.string('SERVICE'),
|
|
44
|
+
version: Env.string('VERSION'),
|
|
45
|
+
|
|
46
|
+
destinationSnsTopicArn: Env.string('DESTINATION_SNS_TOPIC_ARN'),
|
|
42
47
|
}),
|
|
43
48
|
|
|
44
49
|
prod: () => ({
|
|
@@ -451,6 +451,8 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
|
|
|
451
451
|
"ENVIRONMENT": "dev",
|
|
452
452
|
"NODE_ENV": "production",
|
|
453
453
|
"NODE_OPTIONS": "--enable-source-maps",
|
|
454
|
+
"SERVICE": "serviceName",
|
|
455
|
+
"VERSION": "local",
|
|
454
456
|
},
|
|
455
457
|
},
|
|
456
458
|
"FunctionName": "serviceName",
|
|
@@ -644,6 +646,8 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
|
|
|
644
646
|
},
|
|
645
647
|
"NODE_ENV": "production",
|
|
646
648
|
"NODE_OPTIONS": "--enable-source-maps",
|
|
649
|
+
"SERVICE": "serviceName",
|
|
650
|
+
"VERSION": "local",
|
|
647
651
|
},
|
|
648
652
|
},
|
|
649
653
|
"FunctionName": "serviceName-post-hook",
|
|
@@ -796,6 +800,8 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
|
|
|
796
800
|
},
|
|
797
801
|
"NODE_ENV": "production",
|
|
798
802
|
"NODE_OPTIONS": "--enable-source-maps",
|
|
803
|
+
"SERVICE": "serviceName",
|
|
804
|
+
"VERSION": "local",
|
|
799
805
|
},
|
|
800
806
|
},
|
|
801
807
|
"FunctionName": "serviceName-pre-hook",
|
|
@@ -1493,6 +1499,8 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
|
|
|
1493
1499
|
"ENVIRONMENT": "prod",
|
|
1494
1500
|
"NODE_ENV": "production",
|
|
1495
1501
|
"NODE_OPTIONS": "--enable-source-maps",
|
|
1502
|
+
"SERVICE": "serviceName",
|
|
1503
|
+
"VERSION": "local",
|
|
1496
1504
|
},
|
|
1497
1505
|
},
|
|
1498
1506
|
"FunctionName": "serviceName",
|
|
@@ -1686,6 +1694,8 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
|
|
|
1686
1694
|
},
|
|
1687
1695
|
"NODE_ENV": "production",
|
|
1688
1696
|
"NODE_OPTIONS": "--enable-source-maps",
|
|
1697
|
+
"SERVICE": "serviceName",
|
|
1698
|
+
"VERSION": "local",
|
|
1689
1699
|
},
|
|
1690
1700
|
},
|
|
1691
1701
|
"FunctionName": "serviceName-post-hook",
|
|
@@ -1838,6 +1848,8 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
|
|
|
1838
1848
|
},
|
|
1839
1849
|
"NODE_ENV": "production",
|
|
1840
1850
|
"NODE_OPTIONS": "--enable-source-maps",
|
|
1851
|
+
"SERVICE": "serviceName",
|
|
1852
|
+
"VERSION": "local",
|
|
1841
1853
|
},
|
|
1842
1854
|
},
|
|
1843
1855
|
"FunctionName": "serviceName-pre-hook",
|
|
@@ -1,27 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Env } from 'skuba-dive';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const ENVIRONMENTS = ['dev', 'prod'] as const;
|
|
4
4
|
|
|
5
|
-
type Environment = typeof
|
|
5
|
+
type Environment = (typeof ENVIRONMENTS)[number];
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
const environment = Env.oneOf(ENVIRONMENTS)('ENVIRONMENT');
|
|
8
|
+
|
|
9
|
+
interface Config {
|
|
8
10
|
appName: string;
|
|
9
11
|
workerLambda: {
|
|
10
12
|
reservedConcurrency: number;
|
|
11
13
|
environment: {
|
|
12
14
|
ENVIRONMENT: Environment;
|
|
15
|
+
SERVICE: string;
|
|
16
|
+
VERSION: string;
|
|
13
17
|
};
|
|
14
18
|
};
|
|
15
19
|
sourceSnsTopicArn: string;
|
|
16
20
|
}
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
const configs: Record<Environment, Config> = {
|
|
19
23
|
dev: {
|
|
20
24
|
appName: '<%- serviceName %>',
|
|
21
25
|
workerLambda: {
|
|
22
26
|
reservedConcurrency: 2,
|
|
23
27
|
environment: {
|
|
24
28
|
ENVIRONMENT: 'dev',
|
|
29
|
+
SERVICE: '<%- serviceName %>',
|
|
30
|
+
VERSION: Env.string('VERSION', { default: 'local' }),
|
|
25
31
|
},
|
|
26
32
|
},
|
|
27
33
|
sourceSnsTopicArn: 'TODO: sourceSnsTopicArn',
|
|
@@ -32,10 +38,12 @@ export const configs: Record<Environment, Config> = {
|
|
|
32
38
|
reservedConcurrency: 20,
|
|
33
39
|
environment: {
|
|
34
40
|
ENVIRONMENT: 'prod',
|
|
41
|
+
SERVICE: '<%- serviceName %>',
|
|
42
|
+
VERSION: Env.string('VERSION', { default: 'local' }),
|
|
35
43
|
},
|
|
36
44
|
},
|
|
37
45
|
sourceSnsTopicArn: 'TODO: sourceSnsTopicArn',
|
|
38
46
|
},
|
|
39
47
|
};
|
|
40
48
|
|
|
41
|
-
export const config = configs[environment];
|
|
49
|
+
export const config: Config = configs[environment];
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"@aws-sdk/client-lambda": "^3.363.0",
|
|
17
17
|
"@aws-sdk/client-sns": "^3.363.0",
|
|
18
18
|
"@seek/logger": "^6.0.0",
|
|
19
|
+
"skuba-dive": "^2.0.0",
|
|
19
20
|
"zod": "^3.19.1"
|
|
20
21
|
},
|
|
21
22
|
"devDependencies": {
|
|
@@ -24,6 +25,7 @@
|
|
|
24
25
|
"aws-cdk": "^2.109.0",
|
|
25
26
|
"aws-cdk-lib": "^2.109.0",
|
|
26
27
|
"constructs": "^10.0.17",
|
|
28
|
+
"pino-pretty": "^11.0.0",
|
|
27
29
|
"skuba": "*"
|
|
28
30
|
},
|
|
29
31
|
"packageManager": "pnpm@9.0.2",
|
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import createLogger from '@seek/logger';
|
|
2
2
|
import type { SQSEvent, SQSHandler } from 'aws-lambda';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { config } from './config';
|
|
5
|
+
|
|
6
|
+
export const logger = createLogger({
|
|
7
|
+
base: {
|
|
8
|
+
environment: config.environment,
|
|
9
|
+
version: config.version,
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
level: config.logLevel,
|
|
13
|
+
|
|
14
|
+
name: config.name,
|
|
15
|
+
|
|
16
|
+
transport:
|
|
17
|
+
config.environment === 'local' ? { target: 'pino-pretty' } : undefined,
|
|
6
18
|
});
|
|
7
19
|
|
|
8
20
|
/**
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Env } from 'skuba-dive';
|
|
2
|
+
|
|
3
|
+
interface Config {
|
|
4
|
+
environment: Environment;
|
|
5
|
+
|
|
6
|
+
logLevel: string;
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type Environment = (typeof environments)[number];
|
|
12
|
+
|
|
13
|
+
const environments = ['local', 'test', 'dev', 'prod'] as const;
|
|
14
|
+
|
|
15
|
+
const environment = Env.oneOf(environments)('ENVIRONMENT');
|
|
16
|
+
|
|
17
|
+
/* istanbul ignore next: config verification makes more sense in a smoke test */
|
|
18
|
+
const configs: Record<Environment, () => Omit<Config, 'environment'>> = {
|
|
19
|
+
local: () => ({
|
|
20
|
+
logLevel: 'debug',
|
|
21
|
+
name: '<%- serviceName %>',
|
|
22
|
+
version: 'local',
|
|
23
|
+
}),
|
|
24
|
+
|
|
25
|
+
test: () => ({
|
|
26
|
+
logLevel: Env.string('LOG_LEVEL', { default: 'silent' }),
|
|
27
|
+
name: '<%- serviceName %>',
|
|
28
|
+
version: 'test',
|
|
29
|
+
}),
|
|
30
|
+
|
|
31
|
+
dev: () => ({
|
|
32
|
+
logLevel: 'debug',
|
|
33
|
+
name: Env.string('SERVICE'),
|
|
34
|
+
version: Env.string('VERSION'),
|
|
35
|
+
}),
|
|
36
|
+
|
|
37
|
+
prod: () => ({
|
|
38
|
+
logLevel: 'info',
|
|
39
|
+
name: Env.string('SERVICE'),
|
|
40
|
+
version: Env.string('VERSION'),
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const config: Config = {
|
|
45
|
+
...configs[environment](),
|
|
46
|
+
environment,
|
|
47
|
+
};
|