skuba 13.0.0-subpath-imports-20250730060533 → 13.0.0-subpath-imports-20251003052152

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.
Files changed (266) hide show
  1. package/README.md +1 -2
  2. package/config/tsconfig.json +2 -1
  3. package/jest/moduleNameMapper.js +3 -11
  4. package/lib/cli/build/assets.js +4 -8
  5. package/lib/cli/build/assets.js.map +2 -2
  6. package/lib/cli/build/esbuild.d.ts +2 -1
  7. package/lib/cli/build/esbuild.js +5 -4
  8. package/lib/cli/build/esbuild.js.map +2 -2
  9. package/lib/cli/build/index.js +9 -5
  10. package/lib/cli/build/index.js.map +2 -2
  11. package/lib/cli/build/tsc.d.ts +9 -2
  12. package/lib/cli/build/tsc.js +76 -40
  13. package/lib/cli/build/tsc.js.map +3 -3
  14. package/lib/cli/configure/analyseDependencies.d.ts +2 -2
  15. package/lib/cli/configure/analyseDependencies.js.map +1 -1
  16. package/lib/cli/configure/analysis/package.d.ts +1 -1
  17. package/lib/cli/configure/analysis/package.js +1 -1
  18. package/lib/cli/configure/analysis/package.js.map +2 -2
  19. package/lib/cli/configure/ensureTemplateCompletion.d.ts +2 -2
  20. package/lib/cli/configure/ensureTemplateCompletion.js.map +1 -1
  21. package/lib/cli/configure/getEntryPoint.d.ts +2 -2
  22. package/lib/cli/configure/getEntryPoint.js.map +1 -1
  23. package/lib/cli/configure/getProjectType.d.ts +2 -2
  24. package/lib/cli/configure/getProjectType.js.map +1 -1
  25. package/lib/cli/configure/processing/configFile.d.ts +1 -1
  26. package/lib/cli/configure/processing/configFile.js +48 -6
  27. package/lib/cli/configure/processing/configFile.js.map +2 -2
  28. package/lib/cli/configure/processing/package.js +8 -2
  29. package/lib/cli/configure/processing/package.js.map +2 -2
  30. package/lib/cli/init/getConfig.js +1 -1
  31. package/lib/cli/init/getConfig.js.map +2 -2
  32. package/lib/cli/init/git.js +1 -1
  33. package/lib/cli/init/git.js.map +2 -2
  34. package/lib/cli/init/index.js +4 -4
  35. package/lib/cli/init/index.js.map +3 -3
  36. package/lib/cli/lint/annotate/buildkite/eslint.js +1 -1
  37. package/lib/cli/lint/annotate/buildkite/eslint.js.map +2 -2
  38. package/lib/cli/lint/annotate/buildkite/index.js +1 -1
  39. package/lib/cli/lint/annotate/buildkite/index.js.map +2 -2
  40. package/lib/cli/lint/annotate/buildkite/internal.js +1 -1
  41. package/lib/cli/lint/annotate/buildkite/internal.js.map +2 -2
  42. package/lib/cli/lint/annotate/buildkite/prettier.js +1 -1
  43. package/lib/cli/lint/annotate/buildkite/prettier.js.map +2 -2
  44. package/lib/cli/lint/annotate/buildkite/tsc.js +1 -1
  45. package/lib/cli/lint/annotate/buildkite/tsc.js.map +2 -2
  46. package/lib/cli/lint/annotate/github/eslint.d.ts +1 -1
  47. package/lib/cli/lint/annotate/github/eslint.js.map +2 -2
  48. package/lib/cli/lint/annotate/github/index.js +3 -4
  49. package/lib/cli/lint/annotate/github/index.js.map +2 -2
  50. package/lib/cli/lint/annotate/github/internal.d.ts +1 -1
  51. package/lib/cli/lint/annotate/github/internal.js.map +2 -2
  52. package/lib/cli/lint/annotate/github/prettier.d.ts +1 -1
  53. package/lib/cli/lint/annotate/github/prettier.js.map +2 -2
  54. package/lib/cli/lint/annotate/github/tsc.d.ts +1 -1
  55. package/lib/cli/lint/annotate/github/tsc.js.map +2 -2
  56. package/lib/cli/lint/autofix.d.ts +1 -1
  57. package/lib/cli/lint/autofix.js +3 -3
  58. package/lib/cli/lint/autofix.js.map +2 -2
  59. package/lib/cli/lint/internal.js +1 -1
  60. package/lib/cli/lint/internal.js.map +2 -2
  61. package/lib/cli/lint/internalLints/patchRenovateConfig.js +3 -3
  62. package/lib/cli/lint/internalLints/patchRenovateConfig.js.map +2 -2
  63. package/lib/cli/lint/internalLints/refreshConfigFiles.js +5 -3
  64. package/lib/cli/lint/internalLints/refreshConfigFiles.js.map +2 -2
  65. package/lib/cli/lint/internalLints/upgrade/index.d.ts +2 -2
  66. package/lib/cli/lint/internalLints/upgrade/index.js.map +1 -1
  67. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/index.js +3 -3
  68. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/index.js.map +2 -2
  69. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/unhandledRejections.d.ts +4 -0
  70. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/unhandledRejections.js +162 -0
  71. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/unhandledRejections.js.map +7 -0
  72. package/lib/cli/lint/internalLints/upgrade/patches/12.1.1/index.d.ts +2 -0
  73. package/lib/{api/buildkite → cli/lint/internalLints/upgrade/patches/12.1.1}/index.js +12 -9
  74. package/lib/cli/lint/internalLints/upgrade/patches/12.1.1/index.js.map +7 -0
  75. package/lib/cli/lint/internalLints/upgrade/patches/12.1.1/patchJestSnapshots.d.ts +3 -0
  76. package/lib/cli/lint/internalLints/upgrade/patches/12.1.1/patchJestSnapshots.js +105 -0
  77. package/lib/cli/lint/internalLints/upgrade/patches/12.1.1/patchJestSnapshots.js.map +7 -0
  78. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/index.d.ts +2 -0
  79. package/lib/{api/git/statusMatrix.js → cli/lint/internalLints/upgrade/patches/12.3.0/index.js} +18 -25
  80. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/index.js.map +7 -0
  81. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/patchApiTokenFromEnvironment.d.ts +3 -0
  82. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/patchApiTokenFromEnvironment.js +100 -0
  83. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/patchApiTokenFromEnvironment.js.map +7 -0
  84. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/patchDockerfileSyntaxDirective.d.ts +3 -0
  85. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/patchDockerfileSyntaxDirective.js +99 -0
  86. package/lib/cli/lint/internalLints/upgrade/patches/12.3.0/patchDockerfileSyntaxDirective.js.map +7 -0
  87. package/lib/cli/lint/internalLints/upgrade/patches/12.4.0/index.d.ts +2 -0
  88. package/lib/{api/buildkite/md.js → cli/lint/internalLints/upgrade/patches/12.4.0/index.js} +13 -11
  89. package/lib/cli/lint/internalLints/upgrade/patches/12.4.0/index.js.map +7 -0
  90. package/lib/cli/lint/internalLints/upgrade/patches/12.4.0/patchDockerfileCIVariable.d.ts +3 -0
  91. package/lib/cli/lint/internalLints/upgrade/patches/12.4.0/patchDockerfileCIVariable.js +101 -0
  92. package/lib/cli/lint/internalLints/upgrade/patches/12.4.0/patchDockerfileCIVariable.js.map +7 -0
  93. package/lib/cli/lint/internalLints/upgrade/patches/13.0.0/index.d.ts +2 -0
  94. package/lib/{api/net → cli/lint/internalLints/upgrade/patches/13.0.0}/index.js +12 -6
  95. package/lib/cli/lint/internalLints/upgrade/patches/13.0.0/index.js.map +7 -0
  96. package/lib/cli/lint/internalLints/upgrade/patches/13.0.0/rewriteSrcImports.d.ts +13 -0
  97. package/lib/cli/lint/internalLints/upgrade/patches/13.0.0/rewriteSrcImports.js +221 -0
  98. package/lib/cli/lint/internalLints/upgrade/patches/13.0.0/rewriteSrcImports.js.map +7 -0
  99. package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.js +1 -1
  100. package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.js.map +2 -2
  101. package/lib/cli/node/index.js +6 -0
  102. package/lib/cli/node/index.js.map +2 -2
  103. package/lib/cli/start/index.js +6 -0
  104. package/lib/cli/start/index.js.map +2 -2
  105. package/lib/cli/test/index.d.ts +1 -1
  106. package/lib/cli/test/index.js +18 -4
  107. package/lib/cli/test/index.js.map +2 -2
  108. package/lib/cli/test/reporters/github/annotations.d.ts +1 -1
  109. package/lib/cli/test/reporters/github/annotations.js.map +1 -1
  110. package/lib/cli/test/reporters/github/index.js +3 -4
  111. package/lib/cli/test/reporters/github/index.js.map +2 -2
  112. package/lib/index.d.ts +4 -4
  113. package/lib/index.js +4 -4
  114. package/lib/index.js.map +2 -2
  115. package/lib/utils/args.d.ts +2 -0
  116. package/lib/utils/args.js +5 -0
  117. package/lib/utils/args.js.map +2 -2
  118. package/lib/utils/dir.js +2 -2
  119. package/lib/utils/dir.js.map +3 -3
  120. package/lib/utils/manifest.d.ts +6 -2
  121. package/lib/utils/manifest.js +17 -8
  122. package/lib/utils/manifest.js.map +2 -2
  123. package/lib/utils/template.d.ts +1 -1
  124. package/package.json +19 -21
  125. package/template/base/_.prettierrc.js +1 -1
  126. package/template/base/_eslint.config.js +1 -1
  127. package/template/base/_pnpm-workspace.yaml +11 -0
  128. package/template/base/jest.config.ts +4 -0
  129. package/template/base/jest.setup.ts +1 -1
  130. package/template/express-rest-api/.buildkite/pipeline.yml +6 -0
  131. package/template/express-rest-api/.env +1 -1
  132. package/template/express-rest-api/.gantry/dev.yml +5 -1
  133. package/template/express-rest-api/.gantry/prod.yml +5 -1
  134. package/template/express-rest-api/Dockerfile +2 -2
  135. package/template/express-rest-api/Dockerfile.dev-deps +0 -2
  136. package/template/express-rest-api/README.md +5 -5
  137. package/template/express-rest-api/gantry.apply.yml +17 -1
  138. package/template/express-rest-api/package.json +11 -5
  139. package/template/express-rest-api/src/api/healthCheck.ts +2 -2
  140. package/template/express-rest-api/src/config.ts +7 -7
  141. package/template/express-rest-api/src/framework/logging.ts +11 -7
  142. package/template/express-rest-api/src/framework/metrics.ts +1 -1
  143. package/template/express-rest-api/src/listen.ts +6 -0
  144. package/template/express-rest-api/src/tracing.ts +56 -0
  145. package/template/greeter/Dockerfile +0 -2
  146. package/template/greeter/README.md +2 -2
  147. package/template/greeter/package.json +2 -2
  148. package/template/koa-rest-api/.buildkite/pipeline.yml +6 -0
  149. package/template/koa-rest-api/.env +1 -1
  150. package/template/koa-rest-api/.gantry/dev.yml +3 -3
  151. package/template/koa-rest-api/.gantry/prod.yml +3 -3
  152. package/template/koa-rest-api/Dockerfile +1 -1
  153. package/template/koa-rest-api/Dockerfile.dev-deps +0 -2
  154. package/template/koa-rest-api/README.md +6 -6
  155. package/template/koa-rest-api/gantry.apply.yml +15 -3
  156. package/template/koa-rest-api/package.json +10 -11
  157. package/template/koa-rest-api/src/api/healthCheck.ts +2 -2
  158. package/template/koa-rest-api/src/config.ts +7 -7
  159. package/template/koa-rest-api/src/framework/logging.ts +12 -8
  160. package/template/koa-rest-api/src/framework/metrics.ts +1 -1
  161. package/template/koa-rest-api/src/framework/server.test.ts +7 -8
  162. package/template/koa-rest-api/src/framework/server.ts +1 -4
  163. package/template/koa-rest-api/src/listen.ts +6 -0
  164. package/template/lambda-sqs-worker-cdk/.buildkite/pipeline.yml +6 -2
  165. package/template/lambda-sqs-worker-cdk/.env +1 -1
  166. package/template/lambda-sqs-worker-cdk/Dockerfile +0 -2
  167. package/template/lambda-sqs-worker-cdk/README.md +8 -8
  168. package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +54 -26
  169. package/template/lambda-sqs-worker-cdk/infra/appStack.test.ts +5 -22
  170. package/template/lambda-sqs-worker-cdk/infra/appStack.ts +16 -9
  171. package/template/lambda-sqs-worker-cdk/infra/config.ts +34 -20
  172. package/template/lambda-sqs-worker-cdk/infra/index.ts +1 -1
  173. package/template/lambda-sqs-worker-cdk/package.json +7 -9
  174. package/template/lambda-sqs-worker-cdk/src/app.test.ts +91 -51
  175. package/template/lambda-sqs-worker-cdk/src/app.ts +10 -9
  176. package/template/lambda-sqs-worker-cdk/src/config.ts +11 -16
  177. package/template/lambda-sqs-worker-cdk/src/framework/handler.test.ts +10 -5
  178. package/template/lambda-sqs-worker-cdk/src/framework/handler.ts +48 -24
  179. package/template/lambda-sqs-worker-cdk/src/framework/logging.ts +23 -11
  180. package/template/lambda-sqs-worker-cdk/src/framework/metrics.ts +1 -4
  181. package/template/lambda-sqs-worker-cdk/src/testing/handler.ts +4 -1
  182. package/template/oss-npm-package/.github/workflows/release.yml +7 -8
  183. package/template/oss-npm-package/.github/workflows/validate.yml +6 -6
  184. package/template/oss-npm-package/README.md +1 -1
  185. package/template/oss-npm-package/_package.json +0 -3
  186. package/template/oss-npm-package/skuba.template.js +1 -1
  187. package/lib/api/buildkite/annotate.d.ts +0 -28
  188. package/lib/api/buildkite/annotate.js +0 -62
  189. package/lib/api/buildkite/annotate.js.map +0 -7
  190. package/lib/api/buildkite/index.d.ts +0 -3
  191. package/lib/api/buildkite/index.js.map +0 -7
  192. package/lib/api/buildkite/md.d.ts +0 -6
  193. package/lib/api/buildkite/md.js.map +0 -7
  194. package/lib/api/git/commit.d.ts +0 -15
  195. package/lib/api/git/commit.js +0 -52
  196. package/lib/api/git/commit.js.map +0 -7
  197. package/lib/api/git/commitAllChanges.d.ts +0 -19
  198. package/lib/api/git/commitAllChanges.js +0 -83
  199. package/lib/api/git/commitAllChanges.js.map +0 -7
  200. package/lib/api/git/currentBranch.d.ts +0 -10
  201. package/lib/api/git/currentBranch.js +0 -59
  202. package/lib/api/git/currentBranch.js.map +0 -7
  203. package/lib/api/git/findRoot.d.ts +0 -9
  204. package/lib/api/git/findRoot.js +0 -52
  205. package/lib/api/git/findRoot.js.map +0 -7
  206. package/lib/api/git/getChangedFiles.d.ts +0 -20
  207. package/lib/api/git/getChangedFiles.js +0 -81
  208. package/lib/api/git/getChangedFiles.js.map +0 -7
  209. package/lib/api/git/index.d.ts +0 -12
  210. package/lib/api/git/index.js +0 -61
  211. package/lib/api/git/index.js.map +0 -7
  212. package/lib/api/git/isFileGitIgnored.d.ts +0 -4
  213. package/lib/api/git/isFileGitIgnored.js +0 -49
  214. package/lib/api/git/isFileGitIgnored.js.map +0 -7
  215. package/lib/api/git/log.d.ts +0 -19
  216. package/lib/api/git/log.js +0 -71
  217. package/lib/api/git/log.js.map +0 -7
  218. package/lib/api/git/pull.d.ts +0 -35
  219. package/lib/api/git/pull.js +0 -69
  220. package/lib/api/git/pull.js.map +0 -7
  221. package/lib/api/git/push.d.ts +0 -52
  222. package/lib/api/git/push.js +0 -70
  223. package/lib/api/git/push.js.map +0 -7
  224. package/lib/api/git/remote.d.ts +0 -20
  225. package/lib/api/git/remote.js +0 -73
  226. package/lib/api/git/remote.js.map +0 -7
  227. package/lib/api/git/reset.d.ts +0 -12
  228. package/lib/api/git/reset.js +0 -62
  229. package/lib/api/git/reset.js.map +0 -7
  230. package/lib/api/git/statusMatrix.d.ts +0 -7
  231. package/lib/api/git/statusMatrix.js.map +0 -7
  232. package/lib/api/github/checkRun.d.ts +0 -44
  233. package/lib/api/github/checkRun.js +0 -81
  234. package/lib/api/github/checkRun.js.map +0 -7
  235. package/lib/api/github/environment.d.ts +0 -17
  236. package/lib/api/github/environment.js +0 -48
  237. package/lib/api/github/environment.js.map +0 -7
  238. package/lib/api/github/index.d.ts +0 -7
  239. package/lib/api/github/index.js +0 -48
  240. package/lib/api/github/index.js.map +0 -7
  241. package/lib/api/github/issueComment.d.ts +0 -61
  242. package/lib/api/github/issueComment.js +0 -99
  243. package/lib/api/github/issueComment.js.map +0 -7
  244. package/lib/api/github/octokit.d.ts +0 -6
  245. package/lib/api/github/octokit.js +0 -42
  246. package/lib/api/github/octokit.js.map +0 -7
  247. package/lib/api/github/pullRequest.d.ts +0 -21
  248. package/lib/api/github/pullRequest.js +0 -69
  249. package/lib/api/github/pullRequest.js.map +0 -7
  250. package/lib/api/github/push.d.ts +0 -85
  251. package/lib/api/github/push.js +0 -166
  252. package/lib/api/github/push.js.map +0 -7
  253. package/lib/api/net/compose.d.ts +0 -4
  254. package/lib/api/net/compose.js +0 -51
  255. package/lib/api/net/compose.js.map +0 -7
  256. package/lib/api/net/index.d.ts +0 -1
  257. package/lib/api/net/index.js.map +0 -7
  258. package/lib/api/net/socket.d.ts +0 -5
  259. package/lib/api/net/socket.js +0 -68
  260. package/lib/api/net/socket.js.map +0 -7
  261. package/lib/api/net/waitFor.d.ts +0 -22
  262. package/lib/api/net/waitFor.js +0 -40
  263. package/lib/api/net/waitFor.js.map +0 -7
  264. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/rewriteSrcImports.d.ts +0 -6
  265. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/rewriteSrcImports.js +0 -104
  266. package/lib/cli/lint/internalLints/upgrade/patches/12.0.2/rewriteSrcImports.js.map +0 -7
@@ -32,7 +32,6 @@ describe('createApp', () => {
32
32
 
33
33
  expect(stdoutMock.calls).toHaveLength(0);
34
34
 
35
- metricsClient.expectTagSubset(['env:test', 'version:test']);
36
35
  metricsClient.expectTagSubset([
37
36
  'http_method:get',
38
37
  'http_status:200',
@@ -133,7 +132,7 @@ describe('createApp', () => {
133
132
 
134
133
  expect(stdoutMock.calls).toMatchObject([
135
134
  {
136
- err: {
135
+ error: {
137
136
  statusCode: 400,
138
137
  type: 'BadRequestError',
139
138
  },
@@ -167,7 +166,7 @@ describe('createApp', () => {
167
166
 
168
167
  expect(stdoutMock.calls).toMatchObject([
169
168
  {
170
- err: {
169
+ error: {
171
170
  statusCode: 500,
172
171
  type: 'InternalServerError',
173
172
  },
@@ -203,7 +202,7 @@ describe('createApp', () => {
203
202
 
204
203
  expect(stdoutMock.calls).toMatchObject([
205
204
  {
206
- err: {
205
+ error: {
207
206
  message: err.message,
208
207
  type: 'Error',
209
208
  },
@@ -237,7 +236,7 @@ describe('createApp', () => {
237
236
 
238
237
  expect(stdoutMock.calls).toMatchObject([
239
238
  {
240
- err: null,
239
+ error: null,
241
240
  level: 50,
242
241
  method: 'GET',
243
242
  msg: 'Server error',
@@ -256,10 +255,10 @@ describe('createApp', () => {
256
255
  });
257
256
 
258
257
  it('handles string error', async () => {
259
- const err = chance.sentence();
258
+ const error = chance.sentence();
260
259
 
261
260
  middleware.mockImplementation(() => {
262
- throw err;
261
+ throw error;
263
262
  });
264
263
 
265
264
  await agent
@@ -270,7 +269,7 @@ describe('createApp', () => {
270
269
 
271
270
  expect(stdoutMock.calls).toMatchObject([
272
271
  {
273
- err,
272
+ error,
274
273
  level: 50,
275
274
  method: 'GET',
276
275
  msg: 'Server error',
@@ -30,10 +30,7 @@ const requestLogging = RequestLogging.createMiddleware((ctx, fields, err) => {
30
30
  : logger.error(fields, 'Server error');
31
31
  });
32
32
 
33
- const version = VersionMiddleware.create({
34
- name: config.name,
35
- version: config.version,
36
- });
33
+ const version = VersionMiddleware.create(config);
37
34
 
38
35
  export const createApp = <State, Context>(
39
36
  ...middleware: Array<Koa.Middleware<State, Context>>
@@ -20,3 +20,9 @@ const listener = app.listen(config.port, () => {
20
20
  // https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout
21
21
  // AWS recommends setting an application timeout larger than the load balancer
22
22
  listener.keepAliveTimeout = 31000;
23
+
24
+ // Report unhandled rejections instead of crashing the process
25
+ // Make sure to monitor these reports and alert as appropriate
26
+ process.on('unhandledRejection', (err) =>
27
+ logger.error(err, 'Unhandled promise rejection'),
28
+ );
@@ -81,7 +81,9 @@ steps:
81
81
  agents:
82
82
  queue: <%- devBuildkiteQueueName %>
83
83
  env:
84
- ENVIRONMENT: dev
84
+ DD_DEPLOYMENT_ENVIRONMENT: development
85
+ DD_DEPLOYMENT_SERVICE: <%- serviceName %>
86
+ DEPLOYMENT: dev
85
87
  GET_NPM_TOKEN: please
86
88
  label: 🤞 Deploy Dev
87
89
  concurrency_group: '<%- repoName %>/deploy/dev'
@@ -89,7 +91,9 @@ steps:
89
91
 
90
92
  - <<: *deploy
91
93
  env:
92
- ENVIRONMENT: prod
94
+ DD_DEPLOYMENT_ENVIRONMENT: production
95
+ DD_DEPLOYMENT_SERVICE: <%- serviceName %>
96
+ DEPLOYMENT: prod
93
97
  GET_NPM_TOKEN: please
94
98
  label: 🚀 Deploy Prod
95
99
  branches: ${BUILDKITE_PIPELINE_DEFAULT_BRANCH}
@@ -1 +1 @@
1
- ENVIRONMENT=local
1
+ DEPLOYMENT=local
@@ -1,5 +1,3 @@
1
- # syntax=docker/dockerfile:1.17
2
-
3
1
  FROM public.ecr.aws/docker/library/node:22-alpine AS dev-deps
4
2
 
5
3
  # Needed for cdk
@@ -54,7 +54,7 @@ pnpm test
54
54
  awsauth
55
55
 
56
56
  # Run smoke test against deployed application
57
- ENVIRONMENT=dev pnpm smoke
57
+ DEPLOYMENT=dev pnpm smoke
58
58
  ```
59
59
 
60
60
  ### Lint
@@ -88,8 +88,8 @@ curl --data '[{}, {"awsRequestId": "local"}]' --include localhost:<%- port %>
88
88
 
89
89
  This project is deployed through a [Buildkite pipeline](.buildkite/pipeline.yml).
90
90
 
91
- - Commits to a feature branch can be deployed to the dev environment by unblocking a step in the Buildkite UI
92
- - Commits to the default branch are automatically deployed to the dev and prod environments in sequence
91
+ - Commits to a feature branch can be deployed to the development environment by unblocking a step in the Buildkite UI
92
+ - Commits to the default branch are automatically deployed to the development and production environments in sequence
93
93
 
94
94
  To deploy locally:
95
95
 
@@ -97,7 +97,7 @@ To deploy locally:
97
97
  # Authenticate to dev account
98
98
  awsauth
99
99
 
100
- ENVIRONMENT=dev pnpm run deploy
100
+ DEPLOYMENT=dev pnpm run deploy
101
101
  ```
102
102
 
103
103
  A hotswap deploy enables faster deployment but come with caveats such as requiring a Lambda to be rebuilt with every build.
@@ -108,19 +108,19 @@ To deploy a [hotswap]:
108
108
  # Authenticate to dev account
109
109
  awsauth
110
110
 
111
- ENVIRONMENT=dev pnpm run deploy:hotswap
111
+ DEPLOYMENT=dev pnpm run deploy:hotswap
112
112
  ```
113
113
 
114
114
  To rapidly roll back a change,
115
115
  retry an individual deployment step from the previous build in Buildkite.
116
- Note that this will introduce drift between the head of the default Git branch and the live environment;
116
+ Note that this will introduce drift between the head of the default Git branch and the live deployment;
117
117
  use with caution and always follow up with a proper revert or fix in Git history.
118
118
 
119
119
  ## Support
120
120
 
121
121
  ### Dev
122
122
 
123
- TODO: add support links for the dev environment.
123
+ TODO: add support links for the dev deployment.
124
124
 
125
125
  <!--
126
126
  - CloudWatch dashboard
@@ -130,7 +130,7 @@ TODO: add support links for the dev environment.
130
130
 
131
131
  ### Prod
132
132
 
133
- TODO: add support links for the prod environment.
133
+ TODO: add support links for the prod deployment.
134
134
 
135
135
  <!--
136
136
  - CloudWatch dashboard
@@ -1,4 +1,4 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
1
+ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
2
2
 
3
3
  exports[`returns expected CloudFormation stack for dev 1`] = `
4
4
  {
@@ -173,35 +173,35 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
173
173
  },
174
174
  "S3Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.zip",
175
175
  },
176
- "Description": "Updated at 1212-12-12T12:12:12.121Z",
177
176
  "Environment": {
178
177
  "Variables": {
179
178
  "DD_API_KEY_SECRET_ARN": {
180
179
  "Ref": "datadogapikeysecret046FEF06",
181
180
  },
182
181
  "DD_CAPTURE_LAMBDA_PAYLOAD": "false",
182
+ "DD_ENV": "development",
183
183
  "DD_FLUSH_TO_LOG": "false",
184
184
  "DD_LAMBDA_HANDLER": "index.handler",
185
185
  "DD_LOGS_INJECTION": "false",
186
186
  "DD_MERGE_XRAY_TRACES": "false",
187
187
  "DD_SERVERLESS_APPSEC_ENABLED": "false",
188
188
  "DD_SERVERLESS_LOGS_ENABLED": "false",
189
+ "DD_SERVICE": "serviceName",
189
190
  "DD_SITE": "datadoghq.com",
190
191
  "DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING": "$.*",
191
192
  "DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING": "$.*",
192
193
  "DD_TRACE_ENABLED": "true",
194
+ "DD_VERSION": "local",
195
+ "DEPLOYMENT": "dev",
193
196
  "DESTINATION_SNS_TOPIC_ARN": {
194
197
  "Ref": "destinationtopicDCE2E0B8",
195
198
  },
196
- "ENVIRONMENT": "dev",
197
199
  "NODE_ENV": "production",
198
200
  "NODE_OPTIONS": "--enable-source-maps",
199
- "SERVICE": "serviceName",
200
- "VERSION": "local",
201
201
  },
202
202
  },
203
203
  "FunctionName": "serviceName",
204
- "Handler": "node_modules/datadog-lambda-js/dist/handler.handler",
204
+ "Handler": "/opt/nodejs/node_modules/datadog-lambda-js/handler.handler",
205
205
  "KmsKeyArn": {
206
206
  "Fn::GetAtt": [
207
207
  "kmskey49FBC3B3",
@@ -209,6 +209,18 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
209
209
  ],
210
210
  },
211
211
  "Layers": [
212
+ {
213
+ "Fn::Join": [
214
+ "",
215
+ [
216
+ "arn:aws:lambda:",
217
+ {
218
+ "Ref": "AWS::Region",
219
+ },
220
+ ":464622532012:layer:Datadog-Node22-x:x",
221
+ ],
222
+ ],
223
+ },
212
224
  {
213
225
  "Fn::Join": [
214
226
  "",
@@ -222,7 +234,8 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
222
234
  ],
223
235
  },
224
236
  ],
225
- "ReservedConcurrentExecutions": 2,
237
+ "MemorySize": 512,
238
+ "ReservedConcurrentExecutions": 3,
226
239
  "Role": {
227
240
  "Fn::GetAtt": [
228
241
  "workerServiceRole2130CC7F",
@@ -332,6 +345,7 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
332
345
  },
333
346
  "workerAliasLiveSqsEventSourceappStackworkerqueue8281B9F443B0CF93": {
334
347
  "Properties": {
348
+ "BatchSize": 10,
335
349
  "EventSourceArn": {
336
350
  "Fn::GetAtt": [
337
351
  "workerqueueA05CE5C6",
@@ -359,6 +373,12 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
359
373
  ],
360
374
  ],
361
375
  },
376
+ "FunctionResponseTypes": [
377
+ "ReportBatchItemFailures",
378
+ ],
379
+ "ScalingConfig": {
380
+ "MaximumConcurrency": 2,
381
+ },
362
382
  "Tags": [
363
383
  {
364
384
  "Key": "aws-codedeploy-hooks",
@@ -743,14 +763,6 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
743
763
  },
744
764
  },
745
765
  "Resources": {
746
- "datadogapikeysecret046FEF06": {
747
- "DeletionPolicy": "Delete",
748
- "Properties": {
749
- "GenerateSecretString": {},
750
- },
751
- "Type": "AWS::SecretsManager::Secret",
752
- "UpdateReplacePolicy": "Delete",
753
- },
754
766
  "destinationtopicDCE2E0B8": {
755
767
  "Properties": {
756
768
  "KmsMasterKeyId": {
@@ -906,35 +918,33 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
906
918
  },
907
919
  "S3Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.zip",
908
920
  },
909
- "Description": "Updated at 1212-12-12T12:12:12.121Z",
910
921
  "Environment": {
911
922
  "Variables": {
912
- "DD_API_KEY_SECRET_ARN": {
913
- "Ref": "datadogapikeysecret046FEF06",
914
- },
923
+ "DD_API_KEY_SECRET_ARN": "arn:aws:secretsmanager:<Region>:<AccountId>:secret:TODO_SECRET_NAME",
915
924
  "DD_CAPTURE_LAMBDA_PAYLOAD": "false",
925
+ "DD_ENV": "production",
916
926
  "DD_FLUSH_TO_LOG": "false",
917
927
  "DD_LAMBDA_HANDLER": "index.handler",
918
928
  "DD_LOGS_INJECTION": "false",
919
929
  "DD_MERGE_XRAY_TRACES": "false",
920
930
  "DD_SERVERLESS_APPSEC_ENABLED": "false",
921
931
  "DD_SERVERLESS_LOGS_ENABLED": "false",
932
+ "DD_SERVICE": "serviceName",
922
933
  "DD_SITE": "datadoghq.com",
923
934
  "DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING": "$.*",
924
935
  "DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING": "$.*",
925
936
  "DD_TRACE_ENABLED": "true",
937
+ "DD_VERSION": "local",
938
+ "DEPLOYMENT": "prod",
926
939
  "DESTINATION_SNS_TOPIC_ARN": {
927
940
  "Ref": "destinationtopicDCE2E0B8",
928
941
  },
929
- "ENVIRONMENT": "prod",
930
942
  "NODE_ENV": "production",
931
943
  "NODE_OPTIONS": "--enable-source-maps",
932
- "SERVICE": "serviceName",
933
- "VERSION": "local",
934
944
  },
935
945
  },
936
946
  "FunctionName": "serviceName",
937
- "Handler": "node_modules/datadog-lambda-js/dist/handler.handler",
947
+ "Handler": "/opt/nodejs/node_modules/datadog-lambda-js/handler.handler",
938
948
  "KmsKeyArn": {
939
949
  "Fn::GetAtt": [
940
950
  "kmskey49FBC3B3",
@@ -942,6 +952,18 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
942
952
  ],
943
953
  },
944
954
  "Layers": [
955
+ {
956
+ "Fn::Join": [
957
+ "",
958
+ [
959
+ "arn:aws:lambda:",
960
+ {
961
+ "Ref": "AWS::Region",
962
+ },
963
+ ":464622532012:layer:Datadog-Node22-x:x",
964
+ ],
965
+ ],
966
+ },
945
967
  {
946
968
  "Fn::Join": [
947
969
  "",
@@ -955,6 +977,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
955
977
  ],
956
978
  },
957
979
  ],
980
+ "MemorySize": 512,
958
981
  "ReservedConcurrentExecutions": 20,
959
982
  "Role": {
960
983
  "Fn::GetAtt": [
@@ -1065,6 +1088,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
1065
1088
  },
1066
1089
  "workerAliasLiveSqsEventSourceappStackworkerqueue8281B9F443B0CF93": {
1067
1090
  "Properties": {
1091
+ "BatchSize": 10,
1068
1092
  "EventSourceArn": {
1069
1093
  "Fn::GetAtt": [
1070
1094
  "workerqueueA05CE5C6",
@@ -1092,6 +1116,12 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
1092
1116
  ],
1093
1117
  ],
1094
1118
  },
1119
+ "FunctionResponseTypes": [
1120
+ "ReportBatchItemFailures",
1121
+ ],
1122
+ "ScalingConfig": {
1123
+ "MaximumConcurrency": 19,
1124
+ },
1095
1125
  "Tags": [
1096
1126
  {
1097
1127
  "Key": "aws-codedeploy-hooks",
@@ -1354,9 +1384,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
1354
1384
  "secretsmanager:DescribeSecret",
1355
1385
  ],
1356
1386
  "Effect": "Allow",
1357
- "Resource": {
1358
- "Ref": "datadogapikeysecret046FEF06",
1359
- },
1387
+ "Resource": "arn:aws:secretsmanager:<Region>:<AccountId>:secret:TODO_SECRET_NAME-??????",
1360
1388
  },
1361
1389
  {
1362
1390
  "Action": [
@@ -1,25 +1,11 @@
1
1
  import { App, aws_secretsmanager, aws_sns } from 'aws-cdk-lib';
2
2
  import { Template } from 'aws-cdk-lib/assertions';
3
3
 
4
- const currentDate = '1212-12-12T12:12:12.121Z';
5
-
6
- jest.useFakeTimers({
7
- legacyFakeTimers: false,
8
- doNotFake: [
9
- 'nextTick',
10
- 'setInterval',
11
- 'clearInterval',
12
- 'setTimeout',
13
- 'clearTimeout',
14
- ],
15
- now: new Date(currentDate),
16
- });
17
-
18
- const originalEnv = process.env.ENVIRONMENT;
4
+ const originalDeployment = process.env.DEPLOYMENT;
19
5
  const originalVersion = process.env.VERSION;
20
6
 
21
7
  afterAll(() => {
22
- process.env.ENVIRONMENT = originalEnv;
8
+ process.env.DEPLOYMENT = originalDeployment;
23
9
  process.env.VERSION = originalVersion;
24
10
  });
25
11
 
@@ -29,8 +15,8 @@ afterEach(() => {
29
15
 
30
16
  it.each(['dev', 'prod'])(
31
17
  'returns expected CloudFormation stack for %s',
32
- async (env) => {
33
- process.env.ENVIRONMENT = env;
18
+ async (deployment) => {
19
+ process.env.DEPLOYMENT = deployment;
34
20
  process.env.VERSION = 'local';
35
21
 
36
22
  const { AppStack } = await import('./appStack.js');
@@ -69,10 +55,7 @@ it.each(['dev', 'prod'])(
69
55
  /"DD_TAGS":"git.commit.sha:([0-9a-f]+),git.repository_url:([^\"]+)",/g,
70
56
  '',
71
57
  )
72
- .replaceAll(
73
- /(layer:Datadog-Extension-.+?:)\d+/g,
74
- (_, layer) => `${layer}x`,
75
- );
58
+ .replaceAll(/(layer:Datadog-[^-]+-.+?:)\d+/g, (_, layer) => `${layer}x`);
76
59
  expect(JSON.parse(json)).toMatchSnapshot();
77
60
  },
78
61
  );
@@ -19,7 +19,10 @@ import { DatadogLambda } from 'datadog-cdk-constructs-v2';
19
19
  import { config } from './config.js';
20
20
 
21
21
  // Updated by https://github.com/seek-oss/rynovate
22
- const DATADOG_EXTENSION_LAYER_VERSION = 64;
22
+ const DATADOG_EXTENSION_LAYER_VERSION = 87;
23
+
24
+ // Updated by https://github.com/seek-oss/rynovate
25
+ const DATADOG_NODE_LAYER_VERSION = 126;
23
26
 
24
27
  export class AppStack extends Stack {
25
28
  constructor(scope: Construct, id: string, props?: StackProps) {
@@ -84,6 +87,7 @@ export class AppStack extends Stack {
84
87
  const worker = new aws_lambda_nodejs.NodejsFunction(this, 'worker', {
85
88
  architecture: aws_lambda.Architecture[architecture],
86
89
  runtime: aws_lambda.Runtime.NODEJS_22_X,
90
+ memorySize: 512,
87
91
  environmentEncryption: kmsKey,
88
92
  // aws-sdk-v3 sets this to true by default, so it is not necessary to set the environment variable
89
93
  // https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html
@@ -95,7 +99,6 @@ export class AppStack extends Stack {
95
99
  target: 'node22',
96
100
  // aws-sdk-v3 is set as an external module by default, but we want it to be bundled with the function
97
101
  externalModules: [],
98
- nodeModules: ['datadog-lambda-js', 'dd-trace'],
99
102
  },
100
103
  functionName: '<%- serviceName %>',
101
104
  environment: {
@@ -111,10 +114,6 @@ export class AppStack extends Stack {
111
114
  }
112
115
  : {}),
113
116
  },
114
- // https://github.com/aws/aws-cdk/issues/28237
115
- // This forces the lambda to be updated on every deployment
116
- // If you do not wish to use hotswap, you can remove the new Date().toISOString() from the description
117
- description: `Updated at ${new Date().toISOString()}`,
118
117
  reservedConcurrentExecutions: config.workerLambda.reservedConcurrency,
119
118
  });
120
119
 
@@ -127,11 +126,15 @@ export class AppStack extends Stack {
127
126
  );
128
127
 
129
128
  const datadog = new DatadogLambda(this, 'datadog', {
129
+ env: config.env,
130
+ service: config.service,
131
+ version: config.version,
132
+
130
133
  apiKeySecret: datadogSecret,
131
- addLayers: false,
132
134
  enableDatadogLogs: false,
133
- flushMetricsToLogs: false,
134
135
  extensionLayerVersion: DATADOG_EXTENSION_LAYER_VERSION,
136
+ flushMetricsToLogs: false,
137
+ nodeLayerVersion: DATADOG_NODE_LAYER_VERSION,
135
138
  });
136
139
 
137
140
  datadog.addLambdaFunctions([worker]);
@@ -141,7 +144,11 @@ export class AppStack extends Stack {
141
144
  });
142
145
 
143
146
  workerDeployment.alias.addEventSource(
144
- new aws_lambda_event_sources.SqsEventSource(queue),
147
+ new aws_lambda_event_sources.SqsEventSource(queue, {
148
+ batchSize: config.workerLambda.batchSize,
149
+ maxConcurrency: config.workerLambda.reservedConcurrency - 1, // Ensure we have capacity reserved for our blue/green deployment
150
+ reportBatchItemFailures: true,
151
+ }),
145
152
  );
146
153
  }
147
154
  }
@@ -1,52 +1,66 @@
1
1
  import { Env } from 'skuba-dive';
2
2
 
3
- const ENVIRONMENTS = ['dev', 'prod'] as const;
3
+ type Deployment = (typeof deployments)[number];
4
4
 
5
- type Environment = (typeof ENVIRONMENTS)[number];
5
+ const deployments = ['dev', 'prod'] as const;
6
6
 
7
- const environment = Env.oneOf(ENVIRONMENTS)('ENVIRONMENT');
7
+ const deployment = Env.oneOf(deployments)('DEPLOYMENT');
8
8
 
9
9
  interface Config {
10
- appName: string;
10
+ env: 'development' | 'production';
11
+ service: string;
12
+ version: string;
13
+
11
14
  workerLambda: {
15
+ batchSize: number;
12
16
  reservedConcurrency: number;
13
17
  environment: {
14
- ENVIRONMENT: Environment;
15
- SERVICE: string;
16
- VERSION: string;
18
+ DEPLOYMENT: Deployment;
17
19
  };
18
20
  };
21
+
19
22
  datadogApiKeySecretArn: string;
20
23
  sourceSnsTopicArn: string;
21
24
  }
22
25
 
23
- const configs: Record<Environment, Config> = {
26
+ const service = '<%- serviceName %>';
27
+ const version = Env.string('VERSION');
28
+
29
+ const configs: Record<Deployment, Config> = {
24
30
  dev: {
25
- appName: '<%- serviceName %>',
31
+ env: 'development',
32
+ service,
33
+ version,
34
+
26
35
  workerLambda: {
27
- reservedConcurrency: 2,
36
+ batchSize: 10,
37
+ reservedConcurrency: 3,
28
38
  environment: {
29
- ENVIRONMENT: 'dev',
30
- SERVICE: '<%- serviceName %>',
31
- VERSION: Env.string('VERSION', { default: 'local' }),
39
+ DEPLOYMENT: 'dev',
32
40
  },
33
41
  },
34
- datadogApiKeySecretArn: 'TODO: datadogApiKeySecretArn',
42
+
43
+ datadogApiKeySecretArn:
44
+ 'arn:aws:secretsmanager:<Region>:<AccountId>:secret:TODO_SECRET_NAME',
35
45
  sourceSnsTopicArn: 'TODO: sourceSnsTopicArn',
36
46
  },
37
47
  prod: {
38
- appName: '<%- serviceName %>',
48
+ env: 'production',
49
+ service,
50
+ version,
51
+
39
52
  workerLambda: {
53
+ batchSize: 10,
40
54
  reservedConcurrency: 20,
41
55
  environment: {
42
- ENVIRONMENT: 'prod',
43
- SERVICE: '<%- serviceName %>',
44
- VERSION: Env.string('VERSION', { default: 'local' }),
56
+ DEPLOYMENT: 'prod',
45
57
  },
46
58
  },
47
- datadogApiKeySecretArn: 'TODO: datadogApiKeySecretArn',
59
+
60
+ datadogApiKeySecretArn:
61
+ 'arn:aws:secretsmanager:<Region>:<AccountId>:secret:TODO_SECRET_NAME',
48
62
  sourceSnsTopicArn: 'TODO: sourceSnsTopicArn',
49
63
  },
50
64
  };
51
65
 
52
- export const config: Config = configs[environment];
66
+ export const config: Config = configs[deployment];
@@ -7,7 +7,7 @@ import { config } from './config.js';
7
7
  const app = new App();
8
8
 
9
9
  const appStack = new AppStack(app, 'appStack', {
10
- stackName: config.appName,
10
+ stackName: config.service,
11
11
  tags: {
12
12
  'seek:source:url': 'https://github.com/SEEK-Jobs/<%- repoName %>',
13
13
  // 'seek:system:name': 'TODO: https://rfc.skinfra.xyz/RFC051-AWS-Tagging-Standard.html#tagging-schema',
@@ -10,8 +10,6 @@
10
10
  },
11
11
  "scripts": {
12
12
  "deploy": "cdk deploy appStack --require-approval never",
13
- "deploy:hotswap": "pnpm --silent run deploy --hotswap",
14
- "deploy:watch": "pnpm --silent deploy:hotswap --watch",
15
13
  "format": "skuba format",
16
14
  "lint": "skuba lint",
17
15
  "start": "skuba start --port <%- port %>",
@@ -24,11 +22,9 @@
24
22
  "@aws-sdk/client-lambda": "^3.363.0",
25
23
  "@aws-sdk/client-sns": "^3.363.0",
26
24
  "@seek/aws-codedeploy-hooks": "^2.0.0",
27
- "@seek/logger": "^10.0.0",
28
- "datadog-lambda-js": "^10.0.0",
29
- "dd-trace": "^5.0.0",
25
+ "@seek/logger": "^11.1.0",
30
26
  "skuba-dive": "^2.0.0",
31
- "zod": "^3.25.67"
27
+ "zod": "^4.0.0"
32
28
  },
33
29
  "devDependencies": {
34
30
  "@seek/aws-codedeploy-infra": "^3.0.0",
@@ -41,11 +37,13 @@
41
37
  "aws-sdk-client-mock-jest": "^4.0.0",
42
38
  "chance": "^1.1.8",
43
39
  "constructs": "^10.0.17",
44
- "datadog-cdk-constructs-v2": "^2.0.0",
40
+ "datadog-cdk-constructs-v2": "^3.0.0",
41
+ "datadog-lambda-js": "^12.0.0",
42
+ "dd-trace": "^5.0.0",
45
43
  "pino-pretty": "^13.0.0",
46
- "skuba": "13.0.0-subpath-imports-20250730060533"
44
+ "skuba": "13.0.0-subpath-imports-20251003052152"
47
45
  },
48
- "packageManager": "pnpm@10.12.4",
46
+ "packageManager": "pnpm@10.17.1",
49
47
  "engines": {
50
48
  "node": ">=22"
51
49
  }