skuba 0.0.0-beta-20231002015947

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 (579) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -0
  3. package/config/eslint.js +3 -0
  4. package/config/jest.js +1 -0
  5. package/config/prettier.d.ts +4 -0
  6. package/config/prettier.js +6 -0
  7. package/config/tsconfig.json +11 -0
  8. package/jest/moduleNameMapper.js +58 -0
  9. package/jest/moduleNameMapper.test.ts +64 -0
  10. package/jest/transform.js +50 -0
  11. package/jest/transform.test.ts +11 -0
  12. package/jest/tsConfig.js +26 -0
  13. package/jest-preset.js +40 -0
  14. package/lib/api/buildkite/annotate.d.ts +26 -0
  15. package/lib/api/buildkite/annotate.js +49 -0
  16. package/lib/api/buildkite/annotate.js.map +7 -0
  17. package/lib/api/buildkite/index.d.ts +3 -0
  18. package/lib/api/buildkite/index.js +32 -0
  19. package/lib/api/buildkite/index.js.map +7 -0
  20. package/lib/api/buildkite/md.d.ts +6 -0
  21. package/lib/api/buildkite/md.js +33 -0
  22. package/lib/api/buildkite/md.js.map +7 -0
  23. package/lib/api/git/commit.d.ts +15 -0
  24. package/lib/api/git/commit.js +52 -0
  25. package/lib/api/git/commit.js.map +7 -0
  26. package/lib/api/git/commitAllChanges.d.ts +19 -0
  27. package/lib/api/git/commitAllChanges.js +79 -0
  28. package/lib/api/git/commitAllChanges.js.map +7 -0
  29. package/lib/api/git/currentBranch.d.ts +10 -0
  30. package/lib/api/git/currentBranch.js +59 -0
  31. package/lib/api/git/currentBranch.js.map +7 -0
  32. package/lib/api/git/findRoot.d.ts +9 -0
  33. package/lib/api/git/findRoot.js +52 -0
  34. package/lib/api/git/findRoot.js.map +7 -0
  35. package/lib/api/git/getChangedFiles.d.ts +20 -0
  36. package/lib/api/git/getChangedFiles.js +63 -0
  37. package/lib/api/git/getChangedFiles.js.map +7 -0
  38. package/lib/api/git/index.d.ts +11 -0
  39. package/lib/api/git/index.js +58 -0
  40. package/lib/api/git/index.js.map +7 -0
  41. package/lib/api/git/log.d.ts +19 -0
  42. package/lib/api/git/log.js +71 -0
  43. package/lib/api/git/log.js.map +7 -0
  44. package/lib/api/git/pull.d.ts +35 -0
  45. package/lib/api/git/pull.js +69 -0
  46. package/lib/api/git/pull.js.map +7 -0
  47. package/lib/api/git/push.d.ts +43 -0
  48. package/lib/api/git/push.js +70 -0
  49. package/lib/api/git/push.js.map +7 -0
  50. package/lib/api/git/remote.d.ts +20 -0
  51. package/lib/api/git/remote.js +73 -0
  52. package/lib/api/git/remote.js.map +7 -0
  53. package/lib/api/git/reset.d.ts +12 -0
  54. package/lib/api/git/reset.js +62 -0
  55. package/lib/api/git/reset.js.map +7 -0
  56. package/lib/api/git/statusMatrix.d.ts +7 -0
  57. package/lib/api/git/statusMatrix.js +47 -0
  58. package/lib/api/git/statusMatrix.js.map +7 -0
  59. package/lib/api/github/checkRun.d.ts +44 -0
  60. package/lib/api/github/checkRun.js +81 -0
  61. package/lib/api/github/checkRun.js.map +7 -0
  62. package/lib/api/github/environment.d.ts +18 -0
  63. package/lib/api/github/environment.js +48 -0
  64. package/lib/api/github/environment.js.map +7 -0
  65. package/lib/api/github/index.d.ts +7 -0
  66. package/lib/api/github/index.js +48 -0
  67. package/lib/api/github/index.js.map +7 -0
  68. package/lib/api/github/issueComment.d.ts +59 -0
  69. package/lib/api/github/issueComment.js +83 -0
  70. package/lib/api/github/issueComment.js.map +7 -0
  71. package/lib/api/github/pullRequest.d.ts +21 -0
  72. package/lib/api/github/pullRequest.js +69 -0
  73. package/lib/api/github/pullRequest.js.map +7 -0
  74. package/lib/api/github/push.d.ts +79 -0
  75. package/lib/api/github/push.js +167 -0
  76. package/lib/api/github/push.js.map +7 -0
  77. package/lib/api/jest/index.d.ts +147 -0
  78. package/lib/api/jest/index.js +41 -0
  79. package/lib/api/jest/index.js.map +7 -0
  80. package/lib/api/net/compose.d.ts +4 -0
  81. package/lib/api/net/compose.js +50 -0
  82. package/lib/api/net/compose.js.map +7 -0
  83. package/lib/api/net/index.d.ts +1 -0
  84. package/lib/api/net/index.js +29 -0
  85. package/lib/api/net/index.js.map +7 -0
  86. package/lib/api/net/socket.d.ts +5 -0
  87. package/lib/api/net/socket.js +68 -0
  88. package/lib/api/net/socket.js.map +7 -0
  89. package/lib/api/net/waitFor.d.ts +22 -0
  90. package/lib/api/net/waitFor.js +40 -0
  91. package/lib/api/net/waitFor.js.map +7 -0
  92. package/lib/cli/adapter/eslint.d.ts +14 -0
  93. package/lib/cli/adapter/eslint.js +99 -0
  94. package/lib/cli/adapter/eslint.js.map +7 -0
  95. package/lib/cli/adapter/prettier.d.ts +52 -0
  96. package/lib/cli/adapter/prettier.js +176 -0
  97. package/lib/cli/adapter/prettier.js.map +7 -0
  98. package/lib/cli/build/args.d.ts +7 -0
  99. package/lib/cli/build/args.js +73 -0
  100. package/lib/cli/build/args.js.map +7 -0
  101. package/lib/cli/build/assets.d.ts +10 -0
  102. package/lib/cli/build/assets.js +107 -0
  103. package/lib/cli/build/assets.js.map +7 -0
  104. package/lib/cli/build/esbuild.d.ts +5 -0
  105. package/lib/cli/build/esbuild.js +98 -0
  106. package/lib/cli/build/esbuild.js.map +7 -0
  107. package/lib/cli/build/index.d.ts +1 -0
  108. package/lib/cli/build/index.js +83 -0
  109. package/lib/cli/build/index.js.map +7 -0
  110. package/lib/cli/build/tsc.d.ts +4 -0
  111. package/lib/cli/build/tsc.js +102 -0
  112. package/lib/cli/build/tsc.js.map +7 -0
  113. package/lib/cli/buildPackage.d.ts +1 -0
  114. package/lib/cli/buildPackage.js +69 -0
  115. package/lib/cli/buildPackage.js.map +7 -0
  116. package/lib/cli/configure/addEmptyExports.d.ts +6 -0
  117. package/lib/cli/configure/addEmptyExports.js +76 -0
  118. package/lib/cli/configure/addEmptyExports.js.map +7 -0
  119. package/lib/cli/configure/analyseConfiguration.d.ts +9 -0
  120. package/lib/cli/configure/analyseConfiguration.js +69 -0
  121. package/lib/cli/configure/analyseConfiguration.js.map +7 -0
  122. package/lib/cli/configure/analyseDependencies.d.ts +10 -0
  123. package/lib/cli/configure/analyseDependencies.js +136 -0
  124. package/lib/cli/configure/analyseDependencies.js.map +7 -0
  125. package/lib/cli/configure/analysis/diff.d.ts +1 -0
  126. package/lib/cli/configure/analysis/diff.js +45 -0
  127. package/lib/cli/configure/analysis/diff.js.map +7 -0
  128. package/lib/cli/configure/analysis/files.d.ts +1 -0
  129. package/lib/cli/configure/analysis/files.js +58 -0
  130. package/lib/cli/configure/analysis/files.js.map +7 -0
  131. package/lib/cli/configure/analysis/git.d.ts +1 -0
  132. package/lib/cli/configure/analysis/git.js +54 -0
  133. package/lib/cli/configure/analysis/git.js.map +7 -0
  134. package/lib/cli/configure/analysis/package.d.ts +13 -0
  135. package/lib/cli/configure/analysis/package.js +110 -0
  136. package/lib/cli/configure/analysis/package.js.map +7 -0
  137. package/lib/cli/configure/analysis/project.d.ts +3 -0
  138. package/lib/cli/configure/analysis/project.js +109 -0
  139. package/lib/cli/configure/analysis/project.js.map +7 -0
  140. package/lib/cli/configure/dependencies/index.d.ts +5 -0
  141. package/lib/cli/configure/dependencies/index.js +41 -0
  142. package/lib/cli/configure/dependencies/index.js.map +7 -0
  143. package/lib/cli/configure/dependencies/seekDatadogCustomMetrics.d.ts +2 -0
  144. package/lib/cli/configure/dependencies/seekDatadogCustomMetrics.js +59 -0
  145. package/lib/cli/configure/dependencies/seekDatadogCustomMetrics.js.map +7 -0
  146. package/lib/cli/configure/dependencies/seekKoala.d.ts +2 -0
  147. package/lib/cli/configure/dependencies/seekKoala.js +56 -0
  148. package/lib/cli/configure/dependencies/seekKoala.js.map +7 -0
  149. package/lib/cli/configure/dependencies/skuba.d.ts +2 -0
  150. package/lib/cli/configure/dependencies/skuba.js +52 -0
  151. package/lib/cli/configure/dependencies/skuba.js.map +7 -0
  152. package/lib/cli/configure/dependencies/skubaDeps.d.ts +2 -0
  153. package/lib/cli/configure/dependencies/skubaDeps.js +56 -0
  154. package/lib/cli/configure/dependencies/skubaDeps.js.map +7 -0
  155. package/lib/cli/configure/dependencies/skubaDive.d.ts +3 -0
  156. package/lib/cli/configure/dependencies/skubaDive.js +70 -0
  157. package/lib/cli/configure/dependencies/skubaDive.js.map +7 -0
  158. package/lib/cli/configure/ensureTemplateCompletion.d.ts +9 -0
  159. package/lib/cli/configure/ensureTemplateCompletion.js +77 -0
  160. package/lib/cli/configure/ensureTemplateCompletion.js.map +7 -0
  161. package/lib/cli/configure/getEntryPoint.d.ts +11 -0
  162. package/lib/cli/configure/getEntryPoint.js +73 -0
  163. package/lib/cli/configure/getEntryPoint.js.map +7 -0
  164. package/lib/cli/configure/getProjectType.d.ts +9 -0
  165. package/lib/cli/configure/getProjectType.js +52 -0
  166. package/lib/cli/configure/getProjectType.js.map +7 -0
  167. package/lib/cli/configure/index.d.ts +1 -0
  168. package/lib/cli/configure/index.js +148 -0
  169. package/lib/cli/configure/index.js.map +7 -0
  170. package/lib/cli/configure/modules/eslint.d.ts +2 -0
  171. package/lib/cli/configure/modules/eslint.js +61 -0
  172. package/lib/cli/configure/modules/eslint.js.map +7 -0
  173. package/lib/cli/configure/modules/ignore.d.ts +2 -0
  174. package/lib/cli/configure/modules/ignore.js +40 -0
  175. package/lib/cli/configure/modules/ignore.js.map +7 -0
  176. package/lib/cli/configure/modules/index.d.ts +2 -0
  177. package/lib/cli/configure/modules/index.js +54 -0
  178. package/lib/cli/configure/modules/index.js.map +7 -0
  179. package/lib/cli/configure/modules/jest.d.ts +2 -0
  180. package/lib/cli/configure/modules/jest.js +86 -0
  181. package/lib/cli/configure/modules/jest.js.map +7 -0
  182. package/lib/cli/configure/modules/nodemon.d.ts +2 -0
  183. package/lib/cli/configure/modules/nodemon.js +30 -0
  184. package/lib/cli/configure/modules/nodemon.js.map +7 -0
  185. package/lib/cli/configure/modules/package.d.ts +2 -0
  186. package/lib/cli/configure/modules/package.js +117 -0
  187. package/lib/cli/configure/modules/package.js.map +7 -0
  188. package/lib/cli/configure/modules/prettier.d.ts +2 -0
  189. package/lib/cli/configure/modules/prettier.js +52 -0
  190. package/lib/cli/configure/modules/prettier.js.map +7 -0
  191. package/lib/cli/configure/modules/renovate.d.ts +3 -0
  192. package/lib/cli/configure/modules/renovate.js +69 -0
  193. package/lib/cli/configure/modules/renovate.js.map +7 -0
  194. package/lib/cli/configure/modules/serverless.d.ts +2 -0
  195. package/lib/cli/configure/modules/serverless.js +36 -0
  196. package/lib/cli/configure/modules/serverless.js.map +7 -0
  197. package/lib/cli/configure/modules/skubaDive.d.ts +2 -0
  198. package/lib/cli/configure/modules/skubaDive.js +72 -0
  199. package/lib/cli/configure/modules/skubaDive.js.map +7 -0
  200. package/lib/cli/configure/modules/tsconfig.d.ts +2 -0
  201. package/lib/cli/configure/modules/tsconfig.js +87 -0
  202. package/lib/cli/configure/modules/tsconfig.js.map +7 -0
  203. package/lib/cli/configure/modules/tslint.d.ts +2 -0
  204. package/lib/cli/configure/modules/tslint.js +30 -0
  205. package/lib/cli/configure/modules/tslint.js.map +7 -0
  206. package/lib/cli/configure/patchDockerfile.d.ts +1 -0
  207. package/lib/cli/configure/patchDockerfile.js +65 -0
  208. package/lib/cli/configure/patchDockerfile.js.map +7 -0
  209. package/lib/cli/configure/patchRenovateConfig.d.ts +1 -0
  210. package/lib/cli/configure/patchRenovateConfig.js +138 -0
  211. package/lib/cli/configure/patchRenovateConfig.js.map +7 -0
  212. package/lib/cli/configure/patchServerListener.d.ts +3 -0
  213. package/lib/cli/configure/patchServerListener.js +87 -0
  214. package/lib/cli/configure/patchServerListener.js.map +7 -0
  215. package/lib/cli/configure/processing/deleteFiles.d.ts +5 -0
  216. package/lib/cli/configure/processing/deleteFiles.js +31 -0
  217. package/lib/cli/configure/processing/deleteFiles.js.map +7 -0
  218. package/lib/cli/configure/processing/ignoreFile.d.ts +8 -0
  219. package/lib/cli/configure/processing/ignoreFile.js +74 -0
  220. package/lib/cli/configure/processing/ignoreFile.js.map +7 -0
  221. package/lib/cli/configure/processing/javascript.d.ts +2 -0
  222. package/lib/cli/configure/processing/javascript.js +38 -0
  223. package/lib/cli/configure/processing/javascript.js.map +7 -0
  224. package/lib/cli/configure/processing/json.d.ts +2 -0
  225. package/lib/cli/configure/processing/json.js +57 -0
  226. package/lib/cli/configure/processing/json.js.map +7 -0
  227. package/lib/cli/configure/processing/loadFiles.d.ts +5 -0
  228. package/lib/cli/configure/processing/loadFiles.js +31 -0
  229. package/lib/cli/configure/processing/loadFiles.js.map +7 -0
  230. package/lib/cli/configure/processing/module.d.ts +10 -0
  231. package/lib/cli/configure/processing/module.js +39 -0
  232. package/lib/cli/configure/processing/module.js.map +7 -0
  233. package/lib/cli/configure/processing/package.d.ts +73 -0
  234. package/lib/cli/configure/processing/package.js +85 -0
  235. package/lib/cli/configure/processing/package.js.map +7 -0
  236. package/lib/cli/configure/processing/prettier.d.ts +4 -0
  237. package/lib/cli/configure/processing/prettier.js +44 -0
  238. package/lib/cli/configure/processing/prettier.js.map +7 -0
  239. package/lib/cli/configure/processing/record.d.ts +11 -0
  240. package/lib/cli/configure/processing/record.js +65 -0
  241. package/lib/cli/configure/processing/record.js.map +7 -0
  242. package/lib/cli/configure/processing/typescript.d.ts +23 -0
  243. package/lib/cli/configure/processing/typescript.js +205 -0
  244. package/lib/cli/configure/processing/typescript.js.map +7 -0
  245. package/lib/cli/configure/refreshIgnoreFiles.d.ts +3 -0
  246. package/lib/cli/configure/refreshIgnoreFiles.js +78 -0
  247. package/lib/cli/configure/refreshIgnoreFiles.js.map +7 -0
  248. package/lib/cli/configure/types.d.ts +26 -0
  249. package/lib/cli/configure/types.js +17 -0
  250. package/lib/cli/configure/types.js.map +7 -0
  251. package/lib/cli/format.d.ts +1 -0
  252. package/lib/cli/format.js +74 -0
  253. package/lib/cli/format.js.map +7 -0
  254. package/lib/cli/help.d.ts +1 -0
  255. package/lib/cli/help.js +34 -0
  256. package/lib/cli/help.js.map +7 -0
  257. package/lib/cli/init/getConfig.d.ts +26 -0
  258. package/lib/cli/init/getConfig.js +286 -0
  259. package/lib/cli/init/getConfig.js.map +7 -0
  260. package/lib/cli/init/git.d.ts +7 -0
  261. package/lib/cli/init/git.js +82 -0
  262. package/lib/cli/init/git.js.map +7 -0
  263. package/lib/cli/init/index.d.ts +1 -0
  264. package/lib/cli/init/index.js +146 -0
  265. package/lib/cli/init/index.js.map +7 -0
  266. package/lib/cli/init/prompts.d.ts +45 -0
  267. package/lib/cli/init/prompts.js +97 -0
  268. package/lib/cli/init/prompts.js.map +7 -0
  269. package/lib/cli/init/types.d.ts +28 -0
  270. package/lib/cli/init/types.js +65 -0
  271. package/lib/cli/init/types.js.map +7 -0
  272. package/lib/cli/init/validation.d.ts +8 -0
  273. package/lib/cli/init/validation.js +43 -0
  274. package/lib/cli/init/validation.js.map +7 -0
  275. package/lib/cli/init/writePackageJson.d.ts +13 -0
  276. package/lib/cli/init/writePackageJson.js +58 -0
  277. package/lib/cli/init/writePackageJson.js.map +7 -0
  278. package/lib/cli/lint/annotate/buildkite/eslint.d.ts +2 -0
  279. package/lib/cli/lint/annotate/buildkite/eslint.js +40 -0
  280. package/lib/cli/lint/annotate/buildkite/eslint.js.map +7 -0
  281. package/lib/cli/lint/annotate/buildkite/index.d.ts +4 -0
  282. package/lib/cli/lint/annotate/buildkite/index.js +58 -0
  283. package/lib/cli/lint/annotate/buildkite/index.js.map +7 -0
  284. package/lib/cli/lint/annotate/buildkite/prettier.d.ts +2 -0
  285. package/lib/cli/lint/annotate/buildkite/prettier.js +47 -0
  286. package/lib/cli/lint/annotate/buildkite/prettier.js.map +7 -0
  287. package/lib/cli/lint/annotate/buildkite/tsc.d.ts +2 -0
  288. package/lib/cli/lint/annotate/buildkite/tsc.js +45 -0
  289. package/lib/cli/lint/annotate/buildkite/tsc.js.map +7 -0
  290. package/lib/cli/lint/annotate/github/eslint.d.ts +3 -0
  291. package/lib/cli/lint/annotate/github/eslint.js +45 -0
  292. package/lib/cli/lint/annotate/github/eslint.js.map +7 -0
  293. package/lib/cli/lint/annotate/github/index.d.ts +4 -0
  294. package/lib/cli/lint/annotate/github/index.js +63 -0
  295. package/lib/cli/lint/annotate/github/index.js.map +7 -0
  296. package/lib/cli/lint/annotate/github/prettier.d.ts +3 -0
  297. package/lib/cli/lint/annotate/github/prettier.js +39 -0
  298. package/lib/cli/lint/annotate/github/prettier.js.map +7 -0
  299. package/lib/cli/lint/annotate/github/tsc.d.ts +3 -0
  300. package/lib/cli/lint/annotate/github/tsc.js +63 -0
  301. package/lib/cli/lint/annotate/github/tsc.js.map +7 -0
  302. package/lib/cli/lint/annotate/index.d.ts +4 -0
  303. package/lib/cli/lint/annotate/index.js +36 -0
  304. package/lib/cli/lint/annotate/index.js.map +7 -0
  305. package/lib/cli/lint/autofix.d.ts +10 -0
  306. package/lib/cli/lint/autofix.js +214 -0
  307. package/lib/cli/lint/autofix.js.map +7 -0
  308. package/lib/cli/lint/eslint.d.ts +4 -0
  309. package/lib/cli/lint/eslint.js +55 -0
  310. package/lib/cli/lint/eslint.js.map +7 -0
  311. package/lib/cli/lint/external.d.ts +10 -0
  312. package/lib/cli/lint/external.js +117 -0
  313. package/lib/cli/lint/external.js.map +7 -0
  314. package/lib/cli/lint/index.d.ts +2 -0
  315. package/lib/cli/lint/index.js +51 -0
  316. package/lib/cli/lint/index.js.map +7 -0
  317. package/lib/cli/lint/internal.d.ts +1 -0
  318. package/lib/cli/lint/internal.js +64 -0
  319. package/lib/cli/lint/internal.js.map +7 -0
  320. package/lib/cli/lint/prettier.d.ts +4 -0
  321. package/lib/cli/lint/prettier.js +55 -0
  322. package/lib/cli/lint/prettier.js.map +7 -0
  323. package/lib/cli/lint/tsc.d.ts +2 -0
  324. package/lib/cli/lint/tsc.js +58 -0
  325. package/lib/cli/lint/tsc.js.map +7 -0
  326. package/lib/cli/lint/types.d.ts +34 -0
  327. package/lib/cli/lint/types.js +17 -0
  328. package/lib/cli/lint/types.js.map +7 -0
  329. package/lib/cli/node.d.ts +1 -0
  330. package/lib/cli/node.js +77 -0
  331. package/lib/cli/node.js.map +7 -0
  332. package/lib/cli/release.d.ts +1 -0
  333. package/lib/cli/release.js +32 -0
  334. package/lib/cli/release.js.map +7 -0
  335. package/lib/cli/start.d.ts +1 -0
  336. package/lib/cli/start.js +69 -0
  337. package/lib/cli/start.js.map +7 -0
  338. package/lib/cli/test/index.d.ts +1 -0
  339. package/lib/cli/test/index.js +36 -0
  340. package/lib/cli/test/index.js.map +7 -0
  341. package/lib/cli/test/reporters/github/annotations.d.ts +9 -0
  342. package/lib/cli/test/reporters/github/annotations.js +102 -0
  343. package/lib/cli/test/reporters/github/annotations.js.map +7 -0
  344. package/lib/cli/test/reporters/github/index.d.ts +5 -0
  345. package/lib/cli/test/reporters/github/index.js +75 -0
  346. package/lib/cli/test/reporters/github/index.js.map +7 -0
  347. package/lib/cli/test/reporters/prettier/index.d.ts +4 -0
  348. package/lib/cli/test/reporters/prettier/index.js +67 -0
  349. package/lib/cli/test/reporters/prettier/index.js.map +7 -0
  350. package/lib/cli/version.d.ts +1 -0
  351. package/lib/cli/version.js +34 -0
  352. package/lib/cli/version.js.map +7 -0
  353. package/lib/enquirer.d.js +2 -0
  354. package/lib/enquirer.d.js.map +7 -0
  355. package/lib/index.d.ts +22 -0
  356. package/lib/index.js +51 -0
  357. package/lib/index.js.map +7 -0
  358. package/lib/skuba.d.ts +11 -0
  359. package/lib/skuba.js +53 -0
  360. package/lib/skuba.js.map +7 -0
  361. package/lib/utils/args.d.ts +43 -0
  362. package/lib/utils/args.js +114 -0
  363. package/lib/utils/args.js.map +7 -0
  364. package/lib/utils/command.d.ts +6 -0
  365. package/lib/utils/command.js +72 -0
  366. package/lib/utils/command.js.map +7 -0
  367. package/lib/utils/copy.d.ts +17 -0
  368. package/lib/utils/copy.js +105 -0
  369. package/lib/utils/copy.js.map +7 -0
  370. package/lib/utils/dir.d.ts +22 -0
  371. package/lib/utils/dir.js +91 -0
  372. package/lib/utils/dir.js.map +7 -0
  373. package/lib/utils/env.d.ts +5 -0
  374. package/lib/utils/env.js +29 -0
  375. package/lib/utils/env.js.map +7 -0
  376. package/lib/utils/error.d.ts +28 -0
  377. package/lib/utils/error.js +72 -0
  378. package/lib/utils/error.js.map +7 -0
  379. package/lib/utils/exec.d.ts +39 -0
  380. package/lib/utils/exec.js +163 -0
  381. package/lib/utils/exec.js.map +7 -0
  382. package/lib/utils/help.d.ts +1 -0
  383. package/lib/utils/help.js +34 -0
  384. package/lib/utils/help.js.map +7 -0
  385. package/lib/utils/logging.d.ts +27 -0
  386. package/lib/utils/logging.js +60 -0
  387. package/lib/utils/logging.js.map +7 -0
  388. package/lib/utils/logo.d.ts +9 -0
  389. package/lib/utils/logo.js +74 -0
  390. package/lib/utils/logo.js.map +7 -0
  391. package/lib/utils/manifest.d.ts +10 -0
  392. package/lib/utils/manifest.js +83 -0
  393. package/lib/utils/manifest.js.map +7 -0
  394. package/lib/utils/port.d.ts +2 -0
  395. package/lib/utils/port.js +48 -0
  396. package/lib/utils/port.js.map +7 -0
  397. package/lib/utils/template.d.ts +37 -0
  398. package/lib/utils/template.js +116 -0
  399. package/lib/utils/template.js.map +7 -0
  400. package/lib/utils/validation.d.ts +6 -0
  401. package/lib/utils/validation.js +44 -0
  402. package/lib/utils/validation.js.map +7 -0
  403. package/lib/utils/version.d.ts +13 -0
  404. package/lib/utils/version.js +89 -0
  405. package/lib/utils/version.js.map +7 -0
  406. package/lib/utils/wait.d.ts +17 -0
  407. package/lib/utils/wait.js +59 -0
  408. package/lib/utils/wait.js.map +7 -0
  409. package/lib/utils/worker.d.ts +20 -0
  410. package/lib/utils/worker.js +63 -0
  411. package/lib/utils/worker.js.map +7 -0
  412. package/lib/wrapper/function-arguments.d.js +2 -0
  413. package/lib/wrapper/function-arguments.d.js.map +7 -0
  414. package/lib/wrapper/functionHandler.d.ts +10 -0
  415. package/lib/wrapper/functionHandler.js +63 -0
  416. package/lib/wrapper/functionHandler.js.map +7 -0
  417. package/lib/wrapper/http.d.ts +20 -0
  418. package/lib/wrapper/http.js +79 -0
  419. package/lib/wrapper/http.js.map +7 -0
  420. package/lib/wrapper/index.d.ts +12 -0
  421. package/lib/wrapper/index.js +16 -0
  422. package/lib/wrapper/index.js.map +7 -0
  423. package/lib/wrapper/main.d.ts +1 -0
  424. package/lib/wrapper/main.js +47 -0
  425. package/lib/wrapper/main.js.map +7 -0
  426. package/lib/wrapper/requestListener.d.ts +11 -0
  427. package/lib/wrapper/requestListener.js +69 -0
  428. package/lib/wrapper/requestListener.js.map +7 -0
  429. package/package.json +170 -0
  430. package/template/base/.github/CODEOWNERS +1 -0
  431. package/template/base/.github/renovate.json5 +3 -0
  432. package/template/base/_.dockerignore +18 -0
  433. package/template/base/_.eslintignore +14 -0
  434. package/template/base/_.eslintrc.js +3 -0
  435. package/template/base/_.gitignore +23 -0
  436. package/template/base/_.prettierignore +8 -0
  437. package/template/base/_.prettierrc.js +1 -0
  438. package/template/base/jest.config.ts +15 -0
  439. package/template/base/jest.setup.ts +3 -0
  440. package/template/base/tsconfig.build.json +5 -0
  441. package/template/base/tsconfig.json +13 -0
  442. package/template/express-rest-api/.buildkite/pipeline.yml +105 -0
  443. package/template/express-rest-api/.env +1 -0
  444. package/template/express-rest-api/.gantry/common.yml +20 -0
  445. package/template/express-rest-api/.gantry/dev.yml +8 -0
  446. package/template/express-rest-api/.gantry/prod.yml +8 -0
  447. package/template/express-rest-api/.nvmrc +1 -0
  448. package/template/express-rest-api/Dockerfile +37 -0
  449. package/template/express-rest-api/Dockerfile.dev-deps +11 -0
  450. package/template/express-rest-api/README.md +106 -0
  451. package/template/express-rest-api/docker-compose.yml +22 -0
  452. package/template/express-rest-api/gantry.apply.yml +120 -0
  453. package/template/express-rest-api/gantry.build.yml +15 -0
  454. package/template/express-rest-api/package.json +30 -0
  455. package/template/express-rest-api/skuba.template.js +49 -0
  456. package/template/express-rest-api/src/api/healthCheck.ts +11 -0
  457. package/template/express-rest-api/src/api/smokeTest.ts +8 -0
  458. package/template/express-rest-api/src/app.test.ts +9 -0
  459. package/template/express-rest-api/src/app.ts +14 -0
  460. package/template/express-rest-api/src/config.ts +57 -0
  461. package/template/express-rest-api/src/framework/logging.ts +17 -0
  462. package/template/express-rest-api/src/listen.ts +23 -0
  463. package/template/express-rest-api/src/register.ts +1 -0
  464. package/template/greeter/.buildkite/pipeline.yml +37 -0
  465. package/template/greeter/.nvmrc +1 -0
  466. package/template/greeter/Dockerfile +11 -0
  467. package/template/greeter/README.md +96 -0
  468. package/template/greeter/docker-compose.yml +22 -0
  469. package/template/greeter/package.json +24 -0
  470. package/template/greeter/skuba.template.js +16 -0
  471. package/template/greeter/src/app.test.ts +5 -0
  472. package/template/greeter/src/app.ts +4 -0
  473. package/template/koa-rest-api/.buildkite/pipeline.yml +105 -0
  474. package/template/koa-rest-api/.env +1 -0
  475. package/template/koa-rest-api/.gantry/common.yml +20 -0
  476. package/template/koa-rest-api/.gantry/dev.yml +11 -0
  477. package/template/koa-rest-api/.gantry/prod.yml +11 -0
  478. package/template/koa-rest-api/.nvmrc +1 -0
  479. package/template/koa-rest-api/Dockerfile +37 -0
  480. package/template/koa-rest-api/Dockerfile.dev-deps +11 -0
  481. package/template/koa-rest-api/README.md +111 -0
  482. package/template/koa-rest-api/docker-compose.yml +22 -0
  483. package/template/koa-rest-api/gantry.apply.yml +127 -0
  484. package/template/koa-rest-api/gantry.build.yml +15 -0
  485. package/template/koa-rest-api/package.json +47 -0
  486. package/template/koa-rest-api/skuba.template.js +49 -0
  487. package/template/koa-rest-api/src/api/healthCheck.ts +13 -0
  488. package/template/koa-rest-api/src/api/index.ts +10 -0
  489. package/template/koa-rest-api/src/api/jobs/getJobs.test.ts +9 -0
  490. package/template/koa-rest-api/src/api/jobs/getJobs.ts +15 -0
  491. package/template/koa-rest-api/src/api/jobs/index.ts +10 -0
  492. package/template/koa-rest-api/src/api/jobs/postJob.test.ts +34 -0
  493. package/template/koa-rest-api/src/api/jobs/postJob.ts +19 -0
  494. package/template/koa-rest-api/src/api/smokeTest.ts +11 -0
  495. package/template/koa-rest-api/src/app.test.ts +21 -0
  496. package/template/koa-rest-api/src/app.ts +8 -0
  497. package/template/koa-rest-api/src/config.ts +57 -0
  498. package/template/koa-rest-api/src/framework/logging.ts +25 -0
  499. package/template/koa-rest-api/src/framework/metrics.ts +11 -0
  500. package/template/koa-rest-api/src/framework/middleware.ts +3 -0
  501. package/template/koa-rest-api/src/framework/server.test.ts +260 -0
  502. package/template/koa-rest-api/src/framework/server.ts +51 -0
  503. package/template/koa-rest-api/src/framework/validation.test.ts +72 -0
  504. package/template/koa-rest-api/src/framework/validation.ts +77 -0
  505. package/template/koa-rest-api/src/listen.ts +24 -0
  506. package/template/koa-rest-api/src/register.ts +1 -0
  507. package/template/koa-rest-api/src/storage/jobs.ts +28 -0
  508. package/template/koa-rest-api/src/testing/logging.ts +16 -0
  509. package/template/koa-rest-api/src/testing/metrics.ts +29 -0
  510. package/template/koa-rest-api/src/testing/server.ts +31 -0
  511. package/template/koa-rest-api/src/testing/types.ts +24 -0
  512. package/template/koa-rest-api/src/tracing.ts +56 -0
  513. package/template/koa-rest-api/src/types/jobs.ts +17 -0
  514. package/template/koa-rest-api/src/types/koa.ts +8 -0
  515. package/template/koa-rest-api/tsconfig.json +18 -0
  516. package/template/lambda-sqs-worker/.buildkite/pipeline.yml +98 -0
  517. package/template/lambda-sqs-worker/.env +1 -0
  518. package/template/lambda-sqs-worker/.nvmrc +1 -0
  519. package/template/lambda-sqs-worker/Dockerfile +12 -0
  520. package/template/lambda-sqs-worker/README.md +132 -0
  521. package/template/lambda-sqs-worker/docker-compose.yml +27 -0
  522. package/template/lambda-sqs-worker/package.json +44 -0
  523. package/template/lambda-sqs-worker/serverless.yml +202 -0
  524. package/template/lambda-sqs-worker/skuba.template.js +32 -0
  525. package/template/lambda-sqs-worker/src/app.test.ts +116 -0
  526. package/template/lambda-sqs-worker/src/app.ts +57 -0
  527. package/template/lambda-sqs-worker/src/config.ts +57 -0
  528. package/template/lambda-sqs-worker/src/framework/handler.test.ts +61 -0
  529. package/template/lambda-sqs-worker/src/framework/handler.ts +43 -0
  530. package/template/lambda-sqs-worker/src/framework/logging.ts +27 -0
  531. package/template/lambda-sqs-worker/src/framework/metrics.ts +14 -0
  532. package/template/lambda-sqs-worker/src/framework/validation.test.ts +84 -0
  533. package/template/lambda-sqs-worker/src/framework/validation.ts +10 -0
  534. package/template/lambda-sqs-worker/src/hooks.ts +96 -0
  535. package/template/lambda-sqs-worker/src/mapping/jobScorer.ts +22 -0
  536. package/template/lambda-sqs-worker/src/services/aws.ts +5 -0
  537. package/template/lambda-sqs-worker/src/services/jobScorer.test.ts +44 -0
  538. package/template/lambda-sqs-worker/src/services/jobScorer.ts +59 -0
  539. package/template/lambda-sqs-worker/src/services/pipelineEventSender.test.ts +40 -0
  540. package/template/lambda-sqs-worker/src/services/pipelineEventSender.ts +33 -0
  541. package/template/lambda-sqs-worker/src/testing/handler.ts +13 -0
  542. package/template/lambda-sqs-worker/src/testing/logging.ts +19 -0
  543. package/template/lambda-sqs-worker/src/testing/services.ts +28 -0
  544. package/template/lambda-sqs-worker/src/testing/types.ts +33 -0
  545. package/template/lambda-sqs-worker/src/types/jobScorer.ts +15 -0
  546. package/template/lambda-sqs-worker/src/types/pipelineEvents.ts +21 -0
  547. package/template/lambda-sqs-worker/tsconfig.json +13 -0
  548. package/template/lambda-sqs-worker-cdk/.buildkite/pipeline.yml +95 -0
  549. package/template/lambda-sqs-worker-cdk/.nvmrc +1 -0
  550. package/template/lambda-sqs-worker-cdk/Dockerfile +13 -0
  551. package/template/lambda-sqs-worker-cdk/cdk.json +25 -0
  552. package/template/lambda-sqs-worker-cdk/docker-compose.yml +28 -0
  553. package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +723 -0
  554. package/template/lambda-sqs-worker-cdk/infra/appStack.test.ts +34 -0
  555. package/template/lambda-sqs-worker-cdk/infra/appStack.ts +74 -0
  556. package/template/lambda-sqs-worker-cdk/infra/index.ts +14 -0
  557. package/template/lambda-sqs-worker-cdk/package.json +30 -0
  558. package/template/lambda-sqs-worker-cdk/shared/context-types.ts +21 -0
  559. package/template/lambda-sqs-worker-cdk/skuba.template.js +27 -0
  560. package/template/lambda-sqs-worker-cdk/src/app.ts +10 -0
  561. package/template/lambda-sqs-worker-cdk/tsconfig.json +13 -0
  562. package/template/oss-npm-package/.github/workflows/release.yml +36 -0
  563. package/template/oss-npm-package/.github/workflows/validate.yml +31 -0
  564. package/template/oss-npm-package/.nvmrc +1 -0
  565. package/template/oss-npm-package/LICENSE +21 -0
  566. package/template/oss-npm-package/README.md +128 -0
  567. package/template/oss-npm-package/_package.json +47 -0
  568. package/template/oss-npm-package/skuba.template.js +22 -0
  569. package/template/oss-npm-package/src/index.test.ts +5 -0
  570. package/template/oss-npm-package/src/index.ts +7 -0
  571. package/template/oss-npm-package/tsconfig.json +10 -0
  572. package/template/private-npm-package/.buildkite/pipeline.yml +5 -0
  573. package/template/private-npm-package/.nvmrc +1 -0
  574. package/template/private-npm-package/README.md +109 -0
  575. package/template/private-npm-package/_package.json +44 -0
  576. package/template/private-npm-package/skuba.template.js +24 -0
  577. package/template/private-npm-package/src/index.test.ts +5 -0
  578. package/template/private-npm-package/src/index.ts +7 -0
  579. package/template/private-npm-package/tsconfig.json +10 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "private": true,
3
+ "license": "UNLICENSED",
4
+ "scripts": {
5
+ "build": "skuba build",
6
+ "format": "skuba format",
7
+ "lint": "skuba lint",
8
+ "start": "skuba start",
9
+ "start:debug": "yarn start --inspect-brk",
10
+ "test": "skuba test",
11
+ "test:ci": "skuba test --coverage",
12
+ "test:watch": "skuba test --watch"
13
+ },
14
+ "dependencies": {
15
+ "skuba-dive": "^2.0.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^18.11.5",
19
+ "skuba": "*"
20
+ },
21
+ "engines": {
22
+ "node": ">=18.12"
23
+ }
24
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Run `skuba configure` to finish templating and remove this file.
3
+ */
4
+
5
+ module.exports = {
6
+ entryPoint: 'src/app.ts',
7
+ fields: [
8
+ {
9
+ name: 'prodBuildkiteQueueName',
10
+ message: 'Prod Buildkite queue',
11
+ initial: 'my-team-aws-account-prod:cicd',
12
+ validate: (value) => /^.+:.+$/.test(value),
13
+ },
14
+ ],
15
+ type: 'application',
16
+ };
@@ -0,0 +1,5 @@
1
+ import * as app from './app';
2
+
3
+ describe('app', () => {
4
+ it('is importable', () => expect(app).toEqual({}));
5
+ });
@@ -0,0 +1,4 @@
1
+ import 'skuba-dive/register';
2
+
3
+ /* eslint-disable-next-line no-console */
4
+ console.log('Hello world');
@@ -0,0 +1,105 @@
1
+ agents:
2
+ queue: <%- prodBuildkiteQueueName %>
3
+
4
+ configs:
5
+ plugins:
6
+ - &aws-sm
7
+ seek-oss/aws-sm#v2.3.1:
8
+ env:
9
+ NPM_READ_TOKEN: arn:aws:secretsmanager:ap-southeast-2:987872074697:secret:npm/npm-read-token
10
+
11
+ - &docker-ecr-cache
12
+ seek-oss/docker-ecr-cache#v2.1.0: &docker-ecr-cache-defaults
13
+ cache-on:
14
+ - package.json
15
+ - yarn.lock
16
+ dockerfile: Dockerfile.dev-deps
17
+ secrets: id=npm,src=.npmrc
18
+
19
+ - &private-npm
20
+ seek-oss/private-npm#v1.2.0:
21
+ env: NPM_READ_TOKEN
22
+
23
+ base-steps:
24
+ - &deploy
25
+ concurrency: 1
26
+ retry:
27
+ manual:
28
+ # Only use this if you need to roll back a deployment ASAP.
29
+ # Always follow up with a proper revert or fix in Git history.
30
+ permit_on_passed: true
31
+
32
+ steps:
33
+ - label: 🧖‍♀️ Warm Prod
34
+ command: ':'
35
+ key: warm-prod
36
+ plugins:
37
+ - *aws-sm
38
+ - *private-npm
39
+ - seek-oss/docker-ecr-cache#v2.1.0:
40
+ <<: *docker-ecr-cache-defaults
41
+ skip-pull-from-cache: true
42
+
43
+ - label: 🧪 Test & Lint
44
+ commands:
45
+ - echo '+++ yarn test:ci'
46
+ - yarn test:ci
47
+ - echo '--- yarn lint'
48
+ - yarn lint
49
+ depends_on: warm-prod
50
+ env:
51
+ GET_GITHUB_TOKEN: please
52
+ plugins:
53
+ - *aws-sm
54
+ - *private-npm
55
+ - *docker-ecr-cache
56
+ - docker-compose#v4.14.0:
57
+ run: app
58
+ timeout_in_minutes: 10
59
+
60
+ - label: 📦 Build & Package
61
+ depends_on: warm-prod
62
+ plugins:
63
+ - *aws-sm
64
+ - *private-npm
65
+ - *docker-ecr-cache
66
+ - seek-jobs/gantry#v2.0.0:
67
+ command: build
68
+ file: gantry.build.yml
69
+ region: <%- region %>
70
+ values: .gantry/common.yml
71
+
72
+ - wait
73
+ - block: 🙋🏻‍♀️ Deploy Dev
74
+ branches: '!${BUILDKITE_PIPELINE_DEFAULT_BRANCH}'
75
+
76
+ - <<: *deploy
77
+ agents:
78
+ queue: <%- devBuildkiteQueueName %>
79
+ label: 🤞 Deploy Dev
80
+ concurrency_group: <%- teamName %>/deploy/gantry/<%- devGantryEnvironmentName %>
81
+ key: deploy-dev
82
+ plugins:
83
+ - seek-jobs/gantry#v2.0.0:
84
+ command: apply
85
+ environment: <%- devGantryEnvironmentName %>
86
+ file: gantry.apply.yml
87
+ region: <%- region %>
88
+ values:
89
+ - .gantry/common.yml
90
+ - .gantry/dev.yml
91
+
92
+ - <<: *deploy
93
+ label: 🚀 Deploy Prod
94
+ branches: ${BUILDKITE_PIPELINE_DEFAULT_BRANCH}
95
+ concurrency_group: <%- teamName %>/deploy/gantry/<%- prodGantryEnvironmentName %>
96
+ depends_on: deploy-dev
97
+ plugins:
98
+ - seek-jobs/gantry#v2.0.0:
99
+ command: apply
100
+ environment: <%- prodGantryEnvironmentName %>
101
+ file: gantry.apply.yml
102
+ region: <%- region %>
103
+ values:
104
+ - .gantry/common.yml
105
+ - .gantry/prod.yml
@@ -0,0 +1 @@
1
+ ENVIRONMENT=local
@@ -0,0 +1,20 @@
1
+ prodAccountId: '<%- prodAwsAccountId %>'
2
+
3
+ image: '{{values "prodAccountId"}}.dkr.ecr.<%- region %>.amazonaws.com/{{values "service"}}:{{.BuildID}}'
4
+ service: '<%- serviceName %>'
5
+
6
+ # TODO: enable Datadog agent
7
+ # https://backstage.myseek.xyz/docs/default/component/gantry/v1/reference/resources/service/#datadogSecretId
8
+ # datadogSecretId: arn:aws:secretsmanager:<%- region %>:<aws-account-id>:secret:<secret-name>
9
+
10
+ tags:
11
+ # TODO: add data classification tags
12
+ # https://rfc.skinfra.xyz/RFC019-AWS-Tagging-Standard.html#seekdataconsumers
13
+ # seek:data:consumers: internal
14
+ # https://rfc.skinfra.xyz/RFC019-AWS-Tagging-Standard.html#seekdatatypes
15
+ # seek:data:types:restricted: job-ads
16
+ seek:env:label: '{{values "environment"}}'
17
+ seek:env:production: '{{values "isProduction"}}'
18
+ seek:owner:team: '<%- teamName %>'
19
+ seek:source:sha: '{{.CommitSHA}}'
20
+ seek:source:url: 'https://github.com/SEEK-Jobs/<%- repoName %>'
@@ -0,0 +1,11 @@
1
+ environment: dev
2
+ env:
3
+ SOME_ENVIRONMENT_VARIABLE: dev-value
4
+
5
+ isProduction: false
6
+
7
+ maxInstanceCount: 1
8
+ minInstanceCount: 1
9
+
10
+ openTelemetry:
11
+ enabled: false
@@ -0,0 +1,11 @@
1
+ environment: prod
2
+ env:
3
+ SOME_ENVIRONMENT_VARIABLE: prod-value
4
+
5
+ isProduction: true
6
+
7
+ maxInstanceCount: 10
8
+ minInstanceCount: 3
9
+
10
+ openTelemetry:
11
+ enabled: false
@@ -0,0 +1 @@
1
+ 18
@@ -0,0 +1,37 @@
1
+ ARG BASE_IMAGE
2
+ ARG BASE_TAG
3
+
4
+ ###
5
+
6
+ FROM ${BASE_IMAGE}:${BASE_TAG} AS deps
7
+
8
+ RUN yarn install --ignore-optional --ignore-scripts --non-interactive --offline --production
9
+
10
+ ###
11
+
12
+ FROM ${BASE_IMAGE}:${BASE_TAG} AS build
13
+
14
+ COPY . .
15
+
16
+ RUN yarn build
17
+
18
+ ###
19
+
20
+ FROM --platform=${BUILDPLATFORM:-<%- platformName %>} gcr.io/distroless/nodejs18-debian11 AS runtime
21
+
22
+ WORKDIR /workdir
23
+
24
+ COPY --from=build /workdir/lib lib
25
+
26
+ COPY --from=deps /workdir/node_modules node_modules
27
+
28
+ ENV NODE_ENV=production
29
+
30
+ # https://nodejs.org/api/cli.html#cli_node_options_options
31
+ ENV NODE_OPTIONS=--enable-source-maps
32
+
33
+ ARG PORT=8001
34
+ ENV PORT=${PORT}
35
+ EXPOSE ${PORT}
36
+
37
+ CMD ["--require", "./lib/tracing.js", "./lib/listen.js"]
@@ -0,0 +1,11 @@
1
+ # syntax=docker/dockerfile:1.2
2
+
3
+ FROM --platform=${BUILDPLATFORM:-<%- platformName %>} node:18-alpine AS dev-deps
4
+
5
+ WORKDIR /workdir
6
+
7
+ COPY package.json yarn.lock ./
8
+
9
+ RUN \
10
+ --mount=type=secret,id=npm,dst=/workdir/.npmrc \
11
+ yarn install --frozen-lockfile --ignore-optional --non-interactive
@@ -0,0 +1,111 @@
1
+ # <%- repoName %>
2
+
3
+ [![Powered by skuba](https://img.shields.io/badge/🤿%20skuba-powered-009DC4)](https://github.com/seek-oss/skuba)
4
+
5
+ Next steps:
6
+
7
+ 1. [ ] Finish templating if this was skipped earlier:
8
+
9
+ ```shell
10
+ yarn skuba configure
11
+ ```
12
+
13
+ 2. [ ] Create a new repository in the appropriate GitHub organisation.
14
+ 3. [ ] Add the repository to BuildAgency;
15
+ see [Builds at SEEK] for more information.
16
+ 4. [ ] Add Datadog configuration and data classification tags to [.gantry/common.yml](.gantry/common.yml);
17
+ see the [Gantry] documentation for more information.
18
+ 5. [ ] Push local commits to the upstream GitHub branch.
19
+ 6. [ ] Configure [GitHub repository settings].
20
+ 7. [ ] Delete this checklist 😌.
21
+
22
+ [builds at seek]: https://builds-at-seek.ssod.skinfra.xyz
23
+ [github repository settings]: https://github.com/<%-orgName%>/<%-repoName%>/settings
24
+
25
+ ## Design
26
+
27
+ <%-repoName %> is a Node.js HTTP server built in line with our [technology strategy].
28
+ It uses the [Koa] middleware framework and common SEEK packages.
29
+ Resource APIs enable synchronous interactions and serve as the backbone of SEEK's general service architecture.
30
+
31
+ The `koa-rest-api` template is modelled after a hypothetical service for posting and retrieving job advertisements.
32
+ It's stubbed out with in-memory [storage](src/storage) which can observed by standing up an environment with multiple instances.
33
+ Storage is local to each instance, so load balancing across the instances may render a read inconsistent with a previous write.
34
+ This would be replaced with an external data store in production.
35
+
36
+ This project is deployed as a containerised application with [Gantry].
37
+ A typical resource API instance does not require more than 1 vCPU,
38
+ so we eschew clustering configurations in favour of a single Node.js process per container.
39
+ Under load, we autoscale horizontally in terms of container count up to `autoScaling.maxCount`.
40
+
41
+ Gantry configures [CodeDeploy] for a blue-green deployment approach.
42
+ A smoke test is run against the new version before traffic is switched over,
43
+ providing an opportunity to test access and connectivity to online dependencies.
44
+ This defaults to an HTTP request to the `GET /smoke` endpoint.
45
+
46
+ ## Development
47
+
48
+ ### Test
49
+
50
+ ```shell
51
+ yarn test
52
+ ```
53
+
54
+ ### Lint
55
+
56
+ ```shell
57
+ # Fix issues
58
+ yarn format
59
+
60
+ # Check for issues
61
+ yarn lint
62
+ ```
63
+
64
+ ### Start
65
+
66
+ ```shell
67
+ # Start a local HTTP server
68
+ yarn start
69
+
70
+ # Start with Node.js Inspector enabled
71
+ yarn start:debug
72
+ ```
73
+
74
+ ### Deploy
75
+
76
+ This project is deployed through a [Buildkite pipeline](.buildkite/pipeline.yml).
77
+
78
+ - Commits to a feature branch can be deployed to the dev environment by unblocking a step in the Buildkite UI
79
+ - Commits to the default branch are automatically deployed to the dev and prod environments in sequence
80
+
81
+ To rapidly roll back a change,
82
+ retry an individual deployment step from the previous build in Buildkite.
83
+ Note that this will introduce drift between the head of the default Git branch and the live environment;
84
+ use with caution and always follow up with a proper revert or fix in Git history.
85
+
86
+ ## Support
87
+
88
+ ### Dev
89
+
90
+ TODO: add support links for the dev environment.
91
+
92
+ <!--
93
+ - CloudWatch dashboard
94
+ - Datadog dashboard
95
+ - Splunk logs
96
+ -->
97
+
98
+ ### Prod
99
+
100
+ TODO: add support links for the prod environment.
101
+
102
+ <!--
103
+ - CloudWatch dashboard
104
+ - Datadog dashboard
105
+ - Splunk logs
106
+ -->
107
+
108
+ [codedeploy]: https://docs.aws.amazon.com/codedeploy
109
+ [gantry]: https://backstage.myseek.xyz/docs/default/component/gantry/
110
+ [koa]: https://koajs.com
111
+ [technology strategy]: https://tech-strategy.ssod.skinfra.xyz
@@ -0,0 +1,22 @@
1
+ version: '3.7'
2
+
3
+ services:
4
+ app:
5
+ environment:
6
+ # Enable Buildkite + GitHub integrations.
7
+ - BUILDKITE
8
+ - BUILDKITE_AGENT_ACCESS_TOKEN
9
+ - BUILDKITE_BRANCH
10
+ - BUILDKITE_BUILD_NUMBER
11
+ - BUILDKITE_JOB_ID
12
+ - BUILDKITE_PIPELINE_DEFAULT_BRANCH
13
+ - BUILDKITE_STEP_ID
14
+ - GITHUB_API_TOKEN
15
+ image: ${BUILDKITE_PLUGIN_DOCKER_IMAGE:-''}
16
+ init: true
17
+ volumes:
18
+ - ./:/workdir
19
+ # Mount agent for Buildkite annotations.
20
+ - /usr/bin/buildkite-agent:/usr/bin/buildkite-agent
21
+ # Mount cached dependencies.
22
+ - /workdir/node_modules
@@ -0,0 +1,127 @@
1
+ kind: Service
2
+
3
+ schemaVersion: v0.0
4
+
5
+ name: '{{values "service"}}'
6
+
7
+ image: '{{values "image"}}'
8
+
9
+ env:
10
+ # https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html
11
+ AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1'
12
+
13
+ ENVIRONMENT: '{{values "environment"}}'
14
+ OPENTELEMETRY_ENABLED: '{{.Values.openTelemetry.enabled | default false}}'
15
+ SERVICE: '{{values "service"}}'
16
+
17
+ {{range $key, $value := .Values.env}}
18
+ {{$key}}: {{$value}}
19
+ {{end}}
20
+
21
+ {{if .Values.datadogSecretId}}
22
+ datadogSecretId: '{{values "datadogSecretId"}}'
23
+ {{end}}
24
+
25
+ openTelemetry:
26
+ enabled: {{.Values.openTelemetry.enabled | default false}}
27
+ {{if .Values.isProduction}}
28
+ datadogEnvironmentName: production
29
+ {{else}}
30
+ datadogEnvironmentName: development
31
+ {{end}}
32
+ {{if .Values.pagerDutyEndpoint}}
33
+ pagerDutyEndpoint: '{{values "pagerDutyEndpoint"}}'
34
+ {{end}}
35
+
36
+ authentication:
37
+ ignoreRoutes:
38
+ - /health
39
+ - /smoke
40
+
41
+ sslEnabled: true
42
+
43
+ autoScaling:
44
+ maxCount: {{values "maxInstanceCount"}}
45
+ minCount: {{values "minInstanceCount"}}
46
+
47
+ cpuThreshold: 50
48
+ memoryThreshold: 50
49
+
50
+ # Disable Gantry's request-based scaling; the load a request generates can be
51
+ # highly variable. Instead, scale out when *either* CPU or memory are above
52
+ # the threshold, and scale in when *both* are 5% below the threshold.
53
+ #
54
+ # See https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html
55
+ autoScalingPolicies:
56
+ CpuAutoScalingPolicy:
57
+ Type: AWS::ApplicationAutoScaling::ScalingPolicy
58
+ Properties:
59
+ PolicyName: CpuAutoScalingPolicy
60
+ PolicyType: TargetTrackingScaling
61
+ ScalingTargetId:
62
+ Ref: AutoScalingTarget
63
+ TargetTrackingScalingPolicyConfiguration:
64
+ ScaleInCooldown: 300
65
+ ScaleOutCooldown: 60
66
+ TargetValue:
67
+ Ref: CpuUtilisationAutoScalingThreshold
68
+ PredefinedMetricSpecification:
69
+ PredefinedMetricType: ECSServiceAverageCPUUtilization
70
+
71
+ MemoryAutoScalingPolicy:
72
+ Type: AWS::ApplicationAutoScaling::ScalingPolicy
73
+ Properties:
74
+ PolicyName: MemoryAutoScalingPolicy
75
+ PolicyType: TargetTrackingScaling
76
+ ScalingTargetId:
77
+ Ref: AutoScalingTarget
78
+ TargetTrackingScalingPolicyConfiguration:
79
+ ScaleInCooldown: 300
80
+ ScaleOutCooldown: 60
81
+ TargetValue:
82
+ Ref: MemoryUtilisationAutoScalingThreshold
83
+ PredefinedMetricSpecification:
84
+ PredefinedMetricType: ECSServiceAverageMemoryUtilization
85
+
86
+ RequestsScaleOutAlarm:
87
+ Type: AWS::CloudWatch::Alarm
88
+ Properties:
89
+ AlarmDescription: Stub alarm for Gantry to tag
90
+ Metrics:
91
+ - Id: missing
92
+ Expression: SUM(METRICS())
93
+ Period: 60
94
+ ReturnData: true
95
+ ActionsEnabled: false
96
+ EvaluationPeriods: 1
97
+ Threshold: 0
98
+ ComparisonOperator: LessThanThreshold
99
+
100
+ RequestsScaleInAlarm:
101
+ Type: AWS::CloudWatch::Alarm
102
+ Properties:
103
+ AlarmDescription: Stub alarm for Gantry to tag
104
+ Metrics:
105
+ - Id: missing
106
+ Expression: SUM(METRICS())
107
+ Period: 60
108
+ ReturnData: true
109
+ ActionsEnabled: false
110
+ EvaluationPeriods: 1
111
+ Threshold: 0
112
+ ComparisonOperator: LessThanThreshold
113
+
114
+ cpu: 256
115
+ memory: 512
116
+
117
+ deployment:
118
+ smokeTest:
119
+ path: /smoke
120
+ useExternalDns: true
121
+
122
+ tags:
123
+ {{range $key, $value := .Values.tags}}
124
+ {{$key}}: '{{$value}}'
125
+ {{end}}
126
+
127
+ cpuArchitecture: <%- platformName %>
@@ -0,0 +1,15 @@
1
+ kind: ContainerImage
2
+
3
+ schemaVersion: v0.0
4
+
5
+ image: '{{values "image"}}'
6
+
7
+ buildArgs:
8
+ # https://github.com/seek-oss/docker-ecr-cache-buildkite-plugin#building-on-the-resulting-image
9
+ BASE_IMAGE: '{{.Env.BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_EXPORT_IMAGE}}'
10
+ BASE_TAG: '{{.Env.BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_EXPORT_TAG}}'
11
+
12
+ # SEEK-Jobs/gantry#1661
13
+ failOnScanFindings: false
14
+
15
+ cpuArchitecture: <%- platformName %>
@@ -0,0 +1,47 @@
1
+ {
2
+ "private": true,
3
+ "license": "UNLICENSED",
4
+ "scripts": {
5
+ "build": "skuba build",
6
+ "format": "skuba format",
7
+ "lint": "skuba lint",
8
+ "start": "skuba start --port <%- port %>",
9
+ "start:debug": "yarn start --inspect-brk",
10
+ "test": "skuba test",
11
+ "test:ci": "skuba test --coverage",
12
+ "test:watch": "skuba test --watch"
13
+ },
14
+ "dependencies": {
15
+ "@koa/router": "^12.0.0",
16
+ "@opentelemetry/api": "^1.1.0",
17
+ "@opentelemetry/exporter-trace-otlp-grpc": "^0.43.0",
18
+ "@opentelemetry/instrumentation-aws-sdk": "^0.36.0",
19
+ "@opentelemetry/instrumentation-http": "^0.43.0",
20
+ "@opentelemetry/sdk-node": "^0.43.0",
21
+ "@seek/logger": "^6.0.0",
22
+ "aws-sdk": "^2.1039.0",
23
+ "hot-shots": "^10.0.0",
24
+ "koa": "^2.13.4",
25
+ "koa-bodyparser": "^4.3.0",
26
+ "koa-compose": "^4.2.0",
27
+ "seek-datadog-custom-metrics": "^4.2.1",
28
+ "seek-koala": "^7.0.0",
29
+ "skuba-dive": "^2.0.0",
30
+ "zod": "^3.19.1"
31
+ },
32
+ "devDependencies": {
33
+ "@types/chance": "^1.1.3",
34
+ "@types/koa": "^2.13.4",
35
+ "@types/koa-bodyparser": "^5.0.2",
36
+ "@types/koa__router": "^12.0.0",
37
+ "@types/node": "^18.11.5",
38
+ "@types/supertest": "^2.0.11",
39
+ "chance": "^1.1.8",
40
+ "pino-pretty": "^10.0.0",
41
+ "skuba": "*",
42
+ "supertest": "^6.1.6"
43
+ },
44
+ "engines": {
45
+ "node": ">=18.12"
46
+ }
47
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Run `skuba configure` to finish templating and remove this file.
3
+ */
4
+
5
+ module.exports = {
6
+ entryPoint: 'src/app.ts',
7
+ fields: [
8
+ {
9
+ name: 'serviceName',
10
+ message: 'Service slug',
11
+ initial: 'my-project',
12
+ },
13
+ {
14
+ name: 'devBuildkiteQueueName',
15
+ message: 'Dev Buildkite queue',
16
+ initial: 'my-team-aws-account-dev:cicd',
17
+ validate: (value) => /^.+:.+$/.test(value),
18
+ },
19
+ {
20
+ name: 'prodBuildkiteQueueName',
21
+ message: 'Prod Buildkite queue',
22
+ initial: 'my-team-aws-account-prod:cicd',
23
+ validate: (value) => /^.+:.+$/.test(value),
24
+ },
25
+ {
26
+ name: 'devGantryEnvironmentName',
27
+ message: 'Dev Gantry environment',
28
+ initial: 'my-gantry-dev',
29
+ },
30
+ {
31
+ name: 'prodGantryEnvironmentName',
32
+ message: 'Prod Gantry environment',
33
+ initial: 'my-gantry-prod',
34
+ },
35
+ {
36
+ name: 'prodAwsAccountId',
37
+ message: 'Prod AWS account',
38
+ initial: '123456789012',
39
+ validate: (value) => /^\d{12}$/.test(value),
40
+ },
41
+ {
42
+ name: 'region',
43
+ message: 'AWS region',
44
+ initial: 'my-region-0',
45
+ validate: (value) => /^[a-z]{2}-[a-z]+-\d+$/.test(value),
46
+ },
47
+ ],
48
+ type: 'application',
49
+ };
@@ -0,0 +1,13 @@
1
+ import type { Middleware } from 'src/types/koa';
2
+
3
+ /**
4
+ * Signifies that the API is available to serve requests.
5
+ *
6
+ * The deployment environment calls this endpoint to see if the container is
7
+ * unhealthy and needs to be recycled.
8
+ */
9
+ export const healthCheckHandler: Middleware = (ctx) => {
10
+ ctx.state.skipRequestLogging = true;
11
+
12
+ ctx.body = '';
13
+ };
@@ -0,0 +1,10 @@
1
+ import Router from '@koa/router';
2
+
3
+ import { healthCheckHandler } from './healthCheck';
4
+ import { jobRouter } from './jobs';
5
+ import { smokeTestHandler } from './smokeTest';
6
+
7
+ export const router = new Router()
8
+ .get('/health', healthCheckHandler)
9
+ .get('/smoke', smokeTestHandler)
10
+ .use('/jobs', jobRouter.routes());
@@ -0,0 +1,9 @@
1
+ import { agentFromRouter } from 'src/testing/server';
2
+
3
+ import { jobRouter } from '.';
4
+
5
+ const agent = agentFromRouter(jobRouter);
6
+
7
+ describe('getJobsHandler', () => {
8
+ it('provides no results on first load', () => agent.get('/').expect(200, []));
9
+ });