skuba 8.0.1 → 8.1.0-main-20240625003658

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 (102) hide show
  1. package/lib/api/git/index.d.ts +1 -0
  2. package/lib/api/git/index.js +3 -0
  3. package/lib/api/git/index.js.map +2 -2
  4. package/lib/api/git/isFileGitIgnored.d.ts +4 -0
  5. package/lib/api/git/isFileGitIgnored.js +49 -0
  6. package/lib/api/git/isFileGitIgnored.js.map +7 -0
  7. package/lib/api/git/pull.js.map +2 -2
  8. package/lib/api/git/push.d.ts +10 -1
  9. package/lib/api/git/push.js.map +2 -2
  10. package/lib/api/github/environment.d.ts +0 -1
  11. package/lib/api/github/push.d.ts +7 -1
  12. package/lib/api/github/push.js.map +2 -2
  13. package/lib/api/jest/index.d.ts +1 -1
  14. package/lib/cli/adapter/eslint.d.ts +1 -1
  15. package/lib/cli/adapter/prettier.d.ts +2 -2
  16. package/lib/cli/configure/ensureTemplateCompletion.js +18 -2
  17. package/lib/cli/configure/ensureTemplateCompletion.js.map +2 -2
  18. package/lib/cli/configure/index.js +6 -3
  19. package/lib/cli/configure/index.js.map +2 -2
  20. package/lib/cli/configure/processing/configFile.d.ts +1 -1
  21. package/lib/cli/configure/processing/package.d.ts +56 -58
  22. package/lib/cli/init/getConfig.d.ts +2 -1
  23. package/lib/cli/init/getConfig.js +7 -1
  24. package/lib/cli/init/getConfig.js.map +2 -2
  25. package/lib/cli/init/index.js +15 -1
  26. package/lib/cli/init/index.js.map +2 -2
  27. package/lib/cli/init/prompts.d.ts +0 -1
  28. package/lib/cli/init/types.d.ts +22 -5
  29. package/lib/cli/lint/external.d.ts +0 -2
  30. package/lib/cli/lint/index.d.ts +0 -1
  31. package/lib/cli/lint/internal.d.ts +1 -1
  32. package/lib/cli/lint/internalLints/noSkubaTemplateJs.d.ts +1 -1
  33. package/lib/cli/lint/internalLints/patchRenovateConfig.d.ts +1 -1
  34. package/lib/cli/lint/internalLints/patchRenovateConfig.js +4 -1
  35. package/lib/cli/lint/internalLints/patchRenovateConfig.js.map +2 -2
  36. package/lib/cli/lint/internalLints/refreshConfigFiles.d.ts +2 -2
  37. package/lib/cli/lint/internalLints/refreshConfigFiles.js +14 -3
  38. package/lib/cli/lint/internalLints/refreshConfigFiles.js.map +2 -2
  39. package/lib/cli/lint/internalLints/upgrade/index.d.ts +10 -2
  40. package/lib/cli/lint/internalLints/upgrade/index.js +15 -5
  41. package/lib/cli/lint/internalLints/upgrade/index.js.map +2 -2
  42. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/addEmptyExports.js +1 -1
  43. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/addEmptyExports.js.map +2 -2
  44. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/moveNpmrcOutOfIgnoreManagedSection.d.ts +1 -1
  45. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/moveNpmrcOutOfIgnoreManagedSection.js +1 -1
  46. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/moveNpmrcOutOfIgnoreManagedSection.js.map +2 -2
  47. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchDockerfile.js +4 -1
  48. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchDockerfile.js.map +2 -2
  49. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchServerListener.js +4 -1
  50. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchServerListener.js.map +2 -2
  51. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/index.d.ts +2 -0
  52. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/index.js +35 -0
  53. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/index.js.map +7 -0
  54. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/patchPnpmPackageManager.d.ts +2 -0
  55. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/patchPnpmPackageManager.js +147 -0
  56. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/patchPnpmPackageManager.js.map +7 -0
  57. package/lib/cli/lint/types.d.ts +0 -1
  58. package/lib/utils/args.d.ts +0 -1
  59. package/lib/utils/copy.d.ts +1 -1
  60. package/lib/utils/env.d.ts +0 -1
  61. package/lib/utils/error.d.ts +0 -1
  62. package/lib/utils/exec.d.ts +0 -1
  63. package/lib/utils/packageManager.js +13 -8
  64. package/lib/utils/packageManager.js.map +3 -3
  65. package/lib/utils/template.d.ts +3 -3
  66. package/lib/wrapper/http.d.ts +0 -1
  67. package/package.json +19 -20
  68. package/template/base/.vscode/extensions.json +3 -0
  69. package/template/base/_.gitignore +1 -0
  70. package/template/base/_.prettierignore +1 -0
  71. package/template/express-rest-api/.gantry/dev.yml +0 -2
  72. package/template/express-rest-api/.gantry/prod.yml +0 -2
  73. package/template/express-rest-api/Dockerfile.dev-deps +1 -1
  74. package/template/express-rest-api/docker-compose.yml +0 -2
  75. package/template/express-rest-api/gantry.apply.yml +0 -7
  76. package/template/express-rest-api/package.json +5 -2
  77. package/template/express-rest-api/src/config.ts +14 -6
  78. package/template/express-rest-api/src/framework/logging.ts +1 -1
  79. package/template/express-rest-api/src/framework/metrics.ts +11 -0
  80. package/template/express-rest-api/src/listen.ts +2 -2
  81. package/template/greeter/Dockerfile +1 -1
  82. package/template/greeter/docker-compose.yml +0 -2
  83. package/template/greeter/package.json +3 -2
  84. package/template/koa-rest-api/.gantry/dev.yml +0 -2
  85. package/template/koa-rest-api/.gantry/prod.yml +0 -2
  86. package/template/koa-rest-api/Dockerfile.dev-deps +1 -1
  87. package/template/koa-rest-api/docker-compose.yml +0 -2
  88. package/template/koa-rest-api/gantry.apply.yml +0 -7
  89. package/template/koa-rest-api/package.json +12 -12
  90. package/template/koa-rest-api/src/config.ts +14 -4
  91. package/template/lambda-sqs-worker/Dockerfile +1 -1
  92. package/template/lambda-sqs-worker/docker-compose.yml +0 -2
  93. package/template/lambda-sqs-worker/package.json +3 -2
  94. package/template/lambda-sqs-worker/src/config.ts +9 -4
  95. package/template/lambda-sqs-worker-cdk/Dockerfile +1 -1
  96. package/template/lambda-sqs-worker-cdk/docker-compose.yml +0 -2
  97. package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +12 -0
  98. package/template/lambda-sqs-worker-cdk/infra/config.ts +14 -6
  99. package/template/lambda-sqs-worker-cdk/package.json +5 -2
  100. package/template/lambda-sqs-worker-cdk/src/app.ts +14 -2
  101. package/template/lambda-sqs-worker-cdk/src/config.ts +47 -0
  102. package/template/oss-npm-package/.github/workflows/validate.yml +1 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/7.3.1/moveNpmrcOutOfIgnoreManagedSection.ts"],
4
- "sourcesContent": ["import path from 'path';\nimport { inspect } from 'util';\n\nimport fs from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\nimport { NPMRC_LINES } from '../../../../../../utils/npmrc';\nimport { createDestinationFileReader } from '../../../../../configure/analysis/project';\n\nconst NPMRC_IGNORE_SECTION = `\n\n# Ignore .npmrc. This is no longer managed by skuba as pnpm projects use a managed .npmrc.\n# IMPORTANT: if migrating to pnpm, remove this line and add an .npmrc IN THE SAME COMMIT.\n# You can use \\`skuba format\\` to generate the file or otherwise commit an empty file.\n# Doing so will conflict with a local .npmrc and make it more difficult to unintentionally commit auth secrets.\n.npmrc\n`;\n\nconst moveNpmrcOutOfIgnoreManagedSection = async (\n mode: 'format' | 'lint',\n dir: string,\n fileName: '.gitignore' | '.dockerignore',\n): Promise<PatchReturnType> => {\n const readFile = createDestinationFileReader(dir);\n\n const ignoreFile = await readFile(fileName);\n\n if (!ignoreFile) {\n return { result: 'skip', reason: `no ${fileName} file found` };\n }\n\n let isIgnored: { inManaged: boolean } | undefined;\n let currentlyInManagedSection = false;\n\n for (const line of ignoreFile.split('\\n')) {\n if (line.trim() === '# managed by skuba') {\n currentlyInManagedSection = true;\n } else if (line.trim() === '# end managed by skuba') {\n currentlyInManagedSection = false;\n }\n\n if (line.trim() === '.npmrc' || line.trim() === '/.npmrc') {\n isIgnored = { inManaged: currentlyInManagedSection };\n }\n\n if (line.trim() === '!.npmrc' || line.trim() === '!/.npmrc') {\n isIgnored = undefined;\n }\n }\n\n if (isIgnored && !isIgnored.inManaged) {\n return { result: 'skip', reason: 'already ignored in unmanaged section' };\n }\n\n if (!isIgnored) {\n return { result: 'skip', reason: 'not ignored' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n const newIgnoreFile =\n ignoreFile\n .split('\\n')\n .filter((line) => !NPMRC_LINES.includes(line.trim()))\n .join('\\n')\n .trim() + NPMRC_IGNORE_SECTION;\n\n await fs.promises.writeFile(path.join(dir, fileName), newIgnoreFile);\n\n return { result: 'apply' };\n};\n\nexport const tryMoveNpmrcOutOfIgnoreManagedSection = (\n type: '.gitignore' | '.dockerignore',\n) =>\n (async (mode: 'format' | 'lint', dir = process.cwd()) => {\n try {\n return await moveNpmrcOutOfIgnoreManagedSection(mode, dir, type);\n } catch (err) {\n log.warn(`Failed to move .npmrc out of ${type} managed sections.`);\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n }) satisfies PatchFunction;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,kBAAwB;AAExB,sBAAe;AAGf,qBAAoB;AACpB,mBAA4B;AAC5B,qBAA4C;AAE5C,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS7B,MAAM,qCAAqC,OACzC,MACA,KACA,aAC6B;AAC7B,QAAM,eAAW,4CAA4B,GAAG;AAEhD,QAAM,aAAa,MAAM,SAAS,QAAQ;AAE1C,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,cAAc;AAAA,EAC/D;AAEA,MAAI;AACJ,MAAI,4BAA4B;AAEhC,aAAW,QAAQ,WAAW,MAAM,IAAI,GAAG;AACzC,QAAI,KAAK,KAAK,MAAM,sBAAsB;AACxC,kCAA4B;AAAA,IAC9B,WAAW,KAAK,KAAK,MAAM,0BAA0B;AACnD,kCAA4B;AAAA,IAC9B;AAEA,QAAI,KAAK,KAAK,MAAM,YAAY,KAAK,KAAK,MAAM,WAAW;AACzD,kBAAY,EAAE,WAAW,0BAA0B;AAAA,IACrD;AAEA,QAAI,KAAK,KAAK,MAAM,aAAa,KAAK,KAAK,MAAM,YAAY;AAC3D,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,aAAa,CAAC,UAAU,WAAW;AACrC,WAAO,EAAE,QAAQ,QAAQ,QAAQ,uCAAuC;AAAA,EAC1E;AAEA,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,QAAQ,QAAQ,QAAQ,cAAc;AAAA,EACjD;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,QAAM,gBACJ,WACG,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,CAAC,yBAAY,SAAS,KAAK,KAAK,CAAC,CAAC,EACnD,KAAK,IAAI,EACT,KAAK,IAAI;AAEd,QAAM,gBAAAA,QAAG,SAAS,UAAU,YAAAC,QAAK,KAAK,KAAK,QAAQ,GAAG,aAAa;AAEnE,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,wCAAwC,CACnD,SAEC,OAAO,MAAyB,MAAM,QAAQ,IAAI,MAAM;AACvD,MAAI;AACF,WAAO,MAAM,mCAAmC,MAAM,KAAK,IAAI;AAAA,EACjE,SAAS,KAAK;AACZ,uBAAI,KAAK,gCAAgC,IAAI,oBAAoB;AACjE,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
4
+ "sourcesContent": ["import path from 'path';\nimport { inspect } from 'util';\n\nimport fs from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\nimport { NPMRC_LINES } from '../../../../../../utils/npmrc';\nimport { createDestinationFileReader } from '../../../../../configure/analysis/project';\n\nconst NPMRC_IGNORE_SECTION = `\n\n# Ignore .npmrc. This is no longer managed by skuba as pnpm projects use a managed .npmrc.\n# IMPORTANT: if migrating to pnpm, remove this line and add an .npmrc IN THE SAME COMMIT.\n# You can use \\`skuba format\\` to generate the file or otherwise commit an empty file.\n# Doing so will conflict with a local .npmrc and make it more difficult to unintentionally commit auth secrets.\n.npmrc\n`;\n\nconst moveNpmrcOutOfIgnoreManagedSection = async (\n mode: 'format' | 'lint',\n dir: string,\n fileName: '.gitignore' | '.dockerignore',\n): Promise<PatchReturnType> => {\n const readFile = createDestinationFileReader(dir);\n\n const ignoreFile = await readFile(fileName);\n\n if (!ignoreFile) {\n return { result: 'skip', reason: `no ${fileName} file found` };\n }\n\n let isIgnored: { inManaged: boolean } | undefined;\n let currentlyInManagedSection = false;\n\n for (const line of ignoreFile.split('\\n')) {\n if (line.trim() === '# managed by skuba') {\n currentlyInManagedSection = true;\n } else if (line.trim() === '# end managed by skuba') {\n currentlyInManagedSection = false;\n }\n\n if (line.trim() === '.npmrc' || line.trim() === '/.npmrc') {\n isIgnored = { inManaged: currentlyInManagedSection };\n }\n\n if (line.trim() === '!.npmrc' || line.trim() === '!/.npmrc') {\n isIgnored = undefined;\n }\n }\n\n if (isIgnored && !isIgnored.inManaged) {\n return { result: 'skip', reason: 'already ignored in unmanaged section' };\n }\n\n if (!isIgnored) {\n return { result: 'skip', reason: 'not ignored' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n const newIgnoreFile =\n ignoreFile\n .split('\\n')\n .filter((line) => !NPMRC_LINES.includes(line.trim()))\n .join('\\n')\n .trim() + NPMRC_IGNORE_SECTION;\n\n await fs.promises.writeFile(path.join(dir, fileName), newIgnoreFile);\n\n return { result: 'apply' };\n};\n\nexport const tryMoveNpmrcOutOfIgnoreManagedSection = (\n type: '.gitignore' | '.dockerignore',\n) =>\n (async ({ mode, dir = process.cwd() }) => {\n try {\n return await moveNpmrcOutOfIgnoreManagedSection(mode, dir, type);\n } catch (err) {\n log.warn(`Failed to move .npmrc out of ${type} managed sections.`);\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n }) satisfies PatchFunction;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,kBAAwB;AAExB,sBAAe;AAGf,qBAAoB;AACpB,mBAA4B;AAC5B,qBAA4C;AAE5C,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS7B,MAAM,qCAAqC,OACzC,MACA,KACA,aAC6B;AAC7B,QAAM,eAAW,4CAA4B,GAAG;AAEhD,QAAM,aAAa,MAAM,SAAS,QAAQ;AAE1C,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,cAAc;AAAA,EAC/D;AAEA,MAAI;AACJ,MAAI,4BAA4B;AAEhC,aAAW,QAAQ,WAAW,MAAM,IAAI,GAAG;AACzC,QAAI,KAAK,KAAK,MAAM,sBAAsB;AACxC,kCAA4B;AAAA,IAC9B,WAAW,KAAK,KAAK,MAAM,0BAA0B;AACnD,kCAA4B;AAAA,IAC9B;AAEA,QAAI,KAAK,KAAK,MAAM,YAAY,KAAK,KAAK,MAAM,WAAW;AACzD,kBAAY,EAAE,WAAW,0BAA0B;AAAA,IACrD;AAEA,QAAI,KAAK,KAAK,MAAM,aAAa,KAAK,KAAK,MAAM,YAAY;AAC3D,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,aAAa,CAAC,UAAU,WAAW;AACrC,WAAO,EAAE,QAAQ,QAAQ,QAAQ,uCAAuC;AAAA,EAC1E;AAEA,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,QAAQ,QAAQ,QAAQ,cAAc;AAAA,EACjD;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,QAAM,gBACJ,WACG,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,CAAC,yBAAY,SAAS,KAAK,KAAK,CAAC,CAAC,EACnD,KAAK,IAAI,EACT,KAAK,IAAI;AAEd,QAAM,gBAAAA,QAAG,SAAS,UAAU,YAAAC,QAAK,KAAK,KAAK,QAAQ,GAAG,aAAa;AAEnE,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,wCAAwC,CACnD,SAEC,OAAO,EAAE,MAAM,MAAM,QAAQ,IAAI,EAAE,MAAM;AACxC,MAAI;AACF,WAAO,MAAM,mCAAmC,MAAM,KAAK,IAAI;AAAA,EACjE,SAAS,KAAK;AACZ,uBAAI,KAAK,gCAAgC,IAAI,oBAAoB;AACjE,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
6
6
  "names": ["fs", "path"]
7
7
  }
@@ -55,7 +55,10 @@ const patchDockerfile = async (mode, dir) => {
55
55
  await import_fs_extra.default.promises.writeFile(DOCKERFILE_FILENAME, patched);
56
56
  return { result: "apply" };
57
57
  };
58
- const tryPatchDockerfile = async (mode, dir = process.cwd()) => {
58
+ const tryPatchDockerfile = async ({
59
+ mode,
60
+ dir = process.cwd()
61
+ }) => {
59
62
  try {
60
63
  return await patchDockerfile(mode, dir);
61
64
  } catch (err) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/7.3.1/patchDockerfile.ts"],
4
- "sourcesContent": ["import { inspect } from 'util';\n\nimport fs from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\nimport { createDestinationFileReader } from '../../../../../configure/analysis/project';\n\nconst DOCKERFILE_FILENAME = 'Dockerfile';\n\nconst NON_DEBIAN_REGEX = /gcr.io\\/distroless\\/nodejs:(18|20)/g;\nconst DEBIAN_REGEX = /gcr.io\\/distroless\\/nodejs(18|20)-debian11/g;\nconst VERSION_DEBIAN_REPLACE = 'gcr.io/distroless/nodejs$1-debian12';\n\nconst patchDockerfile = async (\n mode: 'format' | 'lint',\n dir: string,\n): Promise<PatchReturnType> => {\n const readFile = createDestinationFileReader(dir);\n\n const maybeDockerfile = await readFile(DOCKERFILE_FILENAME);\n\n if (!maybeDockerfile) {\n return { result: 'skip', reason: 'no Dockerfile found' };\n }\n\n const patched = maybeDockerfile\n .replaceAll(NON_DEBIAN_REGEX, VERSION_DEBIAN_REPLACE)\n .replaceAll(DEBIAN_REGEX, VERSION_DEBIAN_REPLACE);\n\n if (patched === maybeDockerfile) {\n return { result: 'skip' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n await fs.promises.writeFile(DOCKERFILE_FILENAME, patched);\n\n return { result: 'apply' };\n};\n\nexport const tryPatchDockerfile: PatchFunction = async (\n mode: 'format' | 'lint',\n dir = process.cwd(),\n) => {\n try {\n return await patchDockerfile(mode, dir);\n } catch (err) {\n log.warn('Failed to patch Dockerfile.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,sBAAe;AAGf,qBAAoB;AACpB,qBAA4C;AAE5C,MAAM,sBAAsB;AAE5B,MAAM,mBAAmB;AACzB,MAAM,eAAe;AACrB,MAAM,yBAAyB;AAE/B,MAAM,kBAAkB,OACtB,MACA,QAC6B;AAC7B,QAAM,eAAW,4CAA4B,GAAG;AAEhD,QAAM,kBAAkB,MAAM,SAAS,mBAAmB;AAE1D,MAAI,CAAC,iBAAiB;AACpB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,sBAAsB;AAAA,EACzD;AAEA,QAAM,UAAU,gBACb,WAAW,kBAAkB,sBAAsB,EACnD,WAAW,cAAc,sBAAsB;AAElD,MAAI,YAAY,iBAAiB;AAC/B,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,QAAM,gBAAAA,QAAG,SAAS,UAAU,qBAAqB,OAAO;AAExD,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,qBAAoC,OAC/C,MACA,MAAM,QAAQ,IAAI,MACf;AACH,MAAI;AACF,WAAO,MAAM,gBAAgB,MAAM,GAAG;AAAA,EACxC,SAAS,KAAK;AACZ,uBAAI,KAAK,6BAA6B;AACtC,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
4
+ "sourcesContent": ["import { inspect } from 'util';\n\nimport fs from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\nimport { createDestinationFileReader } from '../../../../../configure/analysis/project';\n\nconst DOCKERFILE_FILENAME = 'Dockerfile';\n\nconst NON_DEBIAN_REGEX = /gcr.io\\/distroless\\/nodejs:(18|20)/g;\nconst DEBIAN_REGEX = /gcr.io\\/distroless\\/nodejs(18|20)-debian11/g;\nconst VERSION_DEBIAN_REPLACE = 'gcr.io/distroless/nodejs$1-debian12';\n\nconst patchDockerfile = async (\n mode: 'format' | 'lint',\n dir: string,\n): Promise<PatchReturnType> => {\n const readFile = createDestinationFileReader(dir);\n\n const maybeDockerfile = await readFile(DOCKERFILE_FILENAME);\n\n if (!maybeDockerfile) {\n return { result: 'skip', reason: 'no Dockerfile found' };\n }\n\n const patched = maybeDockerfile\n .replaceAll(NON_DEBIAN_REGEX, VERSION_DEBIAN_REPLACE)\n .replaceAll(DEBIAN_REGEX, VERSION_DEBIAN_REPLACE);\n\n if (patched === maybeDockerfile) {\n return { result: 'skip' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n await fs.promises.writeFile(DOCKERFILE_FILENAME, patched);\n\n return { result: 'apply' };\n};\n\nexport const tryPatchDockerfile: PatchFunction = async ({\n mode,\n dir = process.cwd(),\n}) => {\n try {\n return await patchDockerfile(mode, dir);\n } catch (err) {\n log.warn('Failed to patch Dockerfile.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,sBAAe;AAGf,qBAAoB;AACpB,qBAA4C;AAE5C,MAAM,sBAAsB;AAE5B,MAAM,mBAAmB;AACzB,MAAM,eAAe;AACrB,MAAM,yBAAyB;AAE/B,MAAM,kBAAkB,OACtB,MACA,QAC6B;AAC7B,QAAM,eAAW,4CAA4B,GAAG;AAEhD,QAAM,kBAAkB,MAAM,SAAS,mBAAmB;AAE1D,MAAI,CAAC,iBAAiB;AACpB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,sBAAsB;AAAA,EACzD;AAEA,QAAM,UAAU,gBACb,WAAW,kBAAkB,sBAAsB,EACnD,WAAW,cAAc,sBAAsB;AAElD,MAAI,YAAY,iBAAiB;AAC/B,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,QAAM,gBAAAA,QAAG,SAAS,UAAU,qBAAqB,OAAO;AAExD,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,qBAAoC,OAAO;AAAA,EACtD;AAAA,EACA,MAAM,QAAQ,IAAI;AACpB,MAAM;AACJ,MAAI;AACF,WAAO,MAAM,gBAAgB,MAAM,GAAG;AAAA,EACxC,SAAS,KAAK;AACZ,uBAAI,KAAK,6BAA6B;AACtC,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
6
6
  "names": ["fs"]
7
7
  }
@@ -75,7 +75,10 @@ const patchServerListener = async (mode, dir) => {
75
75
  );
76
76
  return { result: "apply" };
77
77
  };
78
- const tryPatchServerListener = async (mode, dir = process.cwd()) => {
78
+ const tryPatchServerListener = async ({
79
+ mode,
80
+ dir = process.cwd()
81
+ }) => {
79
82
  try {
80
83
  return await patchServerListener(mode, dir);
81
84
  } catch (err) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/7.3.1/patchServerListener.ts"],
4
- "sourcesContent": ["import { inspect } from 'util';\n\nimport fs from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\nimport { createDestinationFileReader } from '../../../../../configure/analysis/project';\nimport { formatPrettier } from '../../../../../configure/processing/prettier';\n\nconst SERVER_LISTENER_FILENAME = 'src/listen.ts';\n\nconst KEEP_ALIVE_CODE = `\n// Gantry ALB default idle timeout is 30 seconds\n// https://nodejs.org/docs/latest-v20.x/api/http.html#serverkeepalivetimeout\n// Node default is 5 seconds\n// https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout\n// AWS recommends setting an application timeout larger than the load balancer\nlistener.keepAliveTimeout = 31000;\n`;\n\nconst patchServerListener = async (\n mode: 'format' | 'lint',\n dir: string,\n): Promise<PatchReturnType> => {\n const readFile = createDestinationFileReader(dir);\n\n let listener = await readFile(SERVER_LISTENER_FILENAME);\n if (!listener) {\n return { result: 'skip', reason: 'no listener file found' };\n }\n\n if (listener.includes('keepAliveTimeout')) {\n return { result: 'skip', reason: 'keepAliveTimeout already configured' };\n }\n\n if (listener.includes('\\napp.listen(')) {\n listener = listener.replace(\n '\\napp.listen(',\n '\\nconst listener = app.listen(',\n );\n }\n\n if (!listener.includes('\\nconst listener = app.listen(')) {\n return { result: 'skip', reason: 'no server listener found' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n listener = `${listener}${KEEP_ALIVE_CODE}`;\n\n await fs.promises.writeFile(\n SERVER_LISTENER_FILENAME,\n await formatPrettier(listener, {\n parser: 'typescript',\n }),\n );\n\n return { result: 'apply' };\n};\n\nexport const tryPatchServerListener: PatchFunction = async (\n mode: 'format' | 'lint',\n dir = process.cwd(),\n) => {\n try {\n return await patchServerListener(mode, dir);\n } catch (err) {\n log.warn('Failed to patch server listener.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,sBAAe;AAGf,qBAAoB;AACpB,qBAA4C;AAC5C,sBAA+B;AAE/B,MAAM,2BAA2B;AAEjC,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASxB,MAAM,sBAAsB,OAC1B,MACA,QAC6B;AAC7B,QAAM,eAAW,4CAA4B,GAAG;AAEhD,MAAI,WAAW,MAAM,SAAS,wBAAwB;AACtD,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,QAAQ,QAAQ,QAAQ,yBAAyB;AAAA,EAC5D;AAEA,MAAI,SAAS,SAAS,kBAAkB,GAAG;AACzC,WAAO,EAAE,QAAQ,QAAQ,QAAQ,sCAAsC;AAAA,EACzE;AAEA,MAAI,SAAS,SAAS,eAAe,GAAG;AACtC,eAAW,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,SAAS,gCAAgC,GAAG;AACxD,WAAO,EAAE,QAAQ,QAAQ,QAAQ,2BAA2B;AAAA,EAC9D;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,aAAW,GAAG,QAAQ,GAAG,eAAe;AAExC,QAAM,gBAAAA,QAAG,SAAS;AAAA,IAChB;AAAA,IACA,UAAM,gCAAe,UAAU;AAAA,MAC7B,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,yBAAwC,OACnD,MACA,MAAM,QAAQ,IAAI,MACf;AACH,MAAI;AACF,WAAO,MAAM,oBAAoB,MAAM,GAAG;AAAA,EAC5C,SAAS,KAAK;AACZ,uBAAI,KAAK,kCAAkC;AAC3C,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
4
+ "sourcesContent": ["import { inspect } from 'util';\n\nimport fs from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\nimport { createDestinationFileReader } from '../../../../../configure/analysis/project';\nimport { formatPrettier } from '../../../../../configure/processing/prettier';\n\nconst SERVER_LISTENER_FILENAME = 'src/listen.ts';\n\nconst KEEP_ALIVE_CODE = `\n// Gantry ALB default idle timeout is 30 seconds\n// https://nodejs.org/docs/latest-v20.x/api/http.html#serverkeepalivetimeout\n// Node default is 5 seconds\n// https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout\n// AWS recommends setting an application timeout larger than the load balancer\nlistener.keepAliveTimeout = 31000;\n`;\n\nconst patchServerListener = async (\n mode: 'format' | 'lint',\n dir: string,\n): Promise<PatchReturnType> => {\n const readFile = createDestinationFileReader(dir);\n\n let listener = await readFile(SERVER_LISTENER_FILENAME);\n if (!listener) {\n return { result: 'skip', reason: 'no listener file found' };\n }\n\n if (listener.includes('keepAliveTimeout')) {\n return { result: 'skip', reason: 'keepAliveTimeout already configured' };\n }\n\n if (listener.includes('\\napp.listen(')) {\n listener = listener.replace(\n '\\napp.listen(',\n '\\nconst listener = app.listen(',\n );\n }\n\n if (!listener.includes('\\nconst listener = app.listen(')) {\n return { result: 'skip', reason: 'no server listener found' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n listener = `${listener}${KEEP_ALIVE_CODE}`;\n\n await fs.promises.writeFile(\n SERVER_LISTENER_FILENAME,\n await formatPrettier(listener, {\n parser: 'typescript',\n }),\n );\n\n return { result: 'apply' };\n};\n\nexport const tryPatchServerListener: PatchFunction = async ({\n mode,\n dir = process.cwd(),\n}) => {\n try {\n return await patchServerListener(mode, dir);\n } catch (err) {\n log.warn('Failed to patch server listener.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,sBAAe;AAGf,qBAAoB;AACpB,qBAA4C;AAC5C,sBAA+B;AAE/B,MAAM,2BAA2B;AAEjC,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASxB,MAAM,sBAAsB,OAC1B,MACA,QAC6B;AAC7B,QAAM,eAAW,4CAA4B,GAAG;AAEhD,MAAI,WAAW,MAAM,SAAS,wBAAwB;AACtD,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,QAAQ,QAAQ,QAAQ,yBAAyB;AAAA,EAC5D;AAEA,MAAI,SAAS,SAAS,kBAAkB,GAAG;AACzC,WAAO,EAAE,QAAQ,QAAQ,QAAQ,sCAAsC;AAAA,EACzE;AAEA,MAAI,SAAS,SAAS,eAAe,GAAG;AACtC,eAAW,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,SAAS,gCAAgC,GAAG;AACxD,WAAO,EAAE,QAAQ,QAAQ,QAAQ,2BAA2B;AAAA,EAC9D;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,aAAW,GAAG,QAAQ,GAAG,eAAe;AAExC,QAAM,gBAAAA,QAAG,SAAS;AAAA,IAChB;AAAA,IACA,UAAM,gCAAe,UAAU;AAAA,MAC7B,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,yBAAwC,OAAO;AAAA,EAC1D;AAAA,EACA,MAAM,QAAQ,IAAI;AACpB,MAAM;AACJ,MAAI;AACF,WAAO,MAAM,oBAAoB,MAAM,GAAG;AAAA,EAC5C,SAAS,KAAK;AACZ,uBAAI,KAAK,kCAAkC;AAC3C,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
6
6
  "names": ["fs"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import type { Patches } from '../..';
2
+ export declare const patches: Patches;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var __exports = {};
20
+ __export(__exports, {
21
+ patches: () => patches
22
+ });
23
+ module.exports = __toCommonJS(__exports);
24
+ var import_patchPnpmPackageManager = require("./patchPnpmPackageManager");
25
+ const patches = [
26
+ {
27
+ apply: import_patchPnpmPackageManager.tryPatchPnpmPackageManager,
28
+ description: "Ensure the pnpm package manager version specified in package.json is used in Dockerfiles"
29
+ }
30
+ ];
31
+ // Annotate the CommonJS export names for ESM import in node:
32
+ 0 && (module.exports = {
33
+ patches
34
+ });
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/8.0.0/index.ts"],
4
+ "sourcesContent": ["import type { Patches } from '../..';\n\nimport { tryPatchPnpmPackageManager } from './patchPnpmPackageManager';\n\nexport const patches: Patches = [\n {\n apply: tryPatchPnpmPackageManager,\n description:\n 'Ensure the pnpm package manager version specified in package.json is used in Dockerfiles',\n },\n];\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qCAA2C;AAEpC,MAAM,UAAmB;AAAA,EAC9B;AAAA,IACE,OAAO;AAAA,IACP,aACE;AAAA,EACJ;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import type { PatchFunction } from '../..';
2
+ export declare const tryPatchPnpmPackageManager: PatchFunction;
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var patchPnpmPackageManager_exports = {};
30
+ __export(patchPnpmPackageManager_exports, {
31
+ tryPatchPnpmPackageManager: () => tryPatchPnpmPackageManager
32
+ });
33
+ module.exports = __toCommonJS(patchPnpmPackageManager_exports);
34
+ var import_util = require("util");
35
+ var import_fast_glob = __toESM(require("fast-glob"));
36
+ var import_fs_extra = require("fs-extra");
37
+ var import_semver = require("semver");
38
+ var import_logging = require("../../../../../../utils/logging");
39
+ const DOCKERFILE_COREPACK_COMMAND = "RUN corepack enable pnpm";
40
+ const PACKAGE_JSON_MOUNT = `RUN --mount=type=bind,source=package.json,target=package.json \\
41
+ corepack enable pnpm && corepack install`;
42
+ const PACKAGE_JSON_CACHE = "- package.json#.packageManager";
43
+ const BEFORE_PIPELINE_REGEX = /(\s*cache-on:\s*\n\s*-\s*\.npmrc\s*\n)((\s*)-\s*pnpm-lock\.yaml)/gm;
44
+ const ECR_REGEX = /seek-oss\/docker-ecr-cache#v([\d\.]+)/gm;
45
+ const fetchFiles = async (files) => Promise.all(
46
+ files.map(async (file) => {
47
+ const contents = await (0, import_fs_extra.readFile)(file, "utf8");
48
+ return {
49
+ file,
50
+ contents
51
+ };
52
+ })
53
+ );
54
+ const patchPnpmPackageManager = async ({
55
+ mode,
56
+ manifest,
57
+ packageManager
58
+ }) => {
59
+ if (packageManager.command !== "pnpm") {
60
+ return {
61
+ result: "skip",
62
+ reason: "not using pnpm"
63
+ };
64
+ }
65
+ if (!manifest.packageJson.packageManager?.includes("pnpm")) {
66
+ return {
67
+ result: "skip",
68
+ reason: "no packageManager declaration in package.json found"
69
+ };
70
+ }
71
+ const [maybeDockerfiles, maybePipelines] = await Promise.all([
72
+ (0, import_fast_glob.default)(["Dockerfile*"]),
73
+ (0, import_fast_glob.default)([".buildkite/*.yml"])
74
+ ]);
75
+ if (!maybeDockerfiles.length || !maybePipelines.length) {
76
+ return {
77
+ result: "skip",
78
+ reason: "Either dockerfiles or pipelines were not found"
79
+ };
80
+ }
81
+ const [dockerfiles, pipelines] = await Promise.all([
82
+ fetchFiles(maybeDockerfiles),
83
+ fetchFiles(maybePipelines)
84
+ ]);
85
+ const dockerFilesToPatch = dockerfiles.filter(
86
+ ({ contents }) => contents.includes(DOCKERFILE_COREPACK_COMMAND) && !contents.includes("target=package.json")
87
+ );
88
+ const pipelinesToPatch = pipelines.filter(
89
+ ({ contents }) => Boolean(BEFORE_PIPELINE_REGEX.exec(contents))
90
+ );
91
+ if (!dockerFilesToPatch.length && !pipelinesToPatch.length) {
92
+ return {
93
+ result: "skip",
94
+ reason: "no pipeline or dockerfiles to patch"
95
+ };
96
+ }
97
+ if (mode === "lint") {
98
+ return { result: "apply" };
99
+ }
100
+ if (dockerFilesToPatch.length) {
101
+ await Promise.all(
102
+ dockerFilesToPatch.map(async ({ file, contents }) => {
103
+ const patchedContent = contents.replace(
104
+ DOCKERFILE_COREPACK_COMMAND,
105
+ PACKAGE_JSON_MOUNT
106
+ );
107
+ await (0, import_fs_extra.writeFile)(file, patchedContent);
108
+ })
109
+ );
110
+ }
111
+ if (pipelinesToPatch.length) {
112
+ await Promise.all(
113
+ pipelinesToPatch.map(async ({ file, contents }) => {
114
+ const patchedContent = contents.replace(
115
+ BEFORE_PIPELINE_REGEX,
116
+ `$1$3${PACKAGE_JSON_CACHE}
117
+ $2`
118
+ );
119
+ const patchedEcrContent = patchedContent.replace(
120
+ ECR_REGEX,
121
+ (match, version) => {
122
+ if (typeof version === "string" && (0, import_semver.lt)(version, "2.2.0")) {
123
+ return "seek-oss/docker-ecr-cache#v2.2.0";
124
+ }
125
+ return match;
126
+ }
127
+ );
128
+ await (0, import_fs_extra.writeFile)(file, patchedEcrContent);
129
+ })
130
+ );
131
+ }
132
+ return { result: "apply" };
133
+ };
134
+ const tryPatchPnpmPackageManager = async (config) => {
135
+ try {
136
+ return await patchPnpmPackageManager(config);
137
+ } catch (err) {
138
+ import_logging.log.warn("Failed to patch pnpm packageManager CI configuration.");
139
+ import_logging.log.subtle((0, import_util.inspect)(err));
140
+ return { result: "skip", reason: "due to an error" };
141
+ }
142
+ };
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ tryPatchPnpmPackageManager
146
+ });
147
+ //# sourceMappingURL=patchPnpmPackageManager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/8.0.0/patchPnpmPackageManager.ts"],
4
+ "sourcesContent": ["import { inspect } from 'util';\n\nimport fg from 'fast-glob';\nimport { readFile, writeFile } from 'fs-extra';\nimport { lt } from 'semver';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\n\nconst DOCKERFILE_COREPACK_COMMAND = 'RUN corepack enable pnpm';\nconst PACKAGE_JSON_MOUNT = `RUN --mount=type=bind,source=package.json,target=package.json \\\\\n corepack enable pnpm && corepack install`;\nconst PACKAGE_JSON_CACHE = '- package.json#.packageManager';\n\nconst BEFORE_PIPELINE_REGEX =\n /(\\s*cache-on:\\s*\\n\\s*-\\s*\\.npmrc\\s*\\n)((\\s*)-\\s*pnpm-lock\\.yaml)/gm;\nconst ECR_REGEX = /seek-oss\\/docker-ecr-cache#v([\\d\\.]+)/gm;\n\nconst fetchFiles = async (files: string[]) =>\n Promise.all(\n files.map(async (file) => {\n const contents = await readFile(file, 'utf8');\n\n return {\n file,\n contents,\n };\n }),\n );\n\nconst patchPnpmPackageManager: PatchFunction = async ({\n mode,\n manifest,\n packageManager,\n}): Promise<PatchReturnType> => {\n if (packageManager.command !== 'pnpm') {\n return {\n result: 'skip',\n reason: 'not using pnpm',\n };\n }\n\n if (\n !(\n manifest.packageJson as { packageManager?: string }\n ).packageManager?.includes('pnpm')\n ) {\n return {\n result: 'skip',\n reason: 'no packageManager declaration in package.json found',\n };\n }\n\n const [maybeDockerfiles, maybePipelines] = await Promise.all([\n fg(['Dockerfile*']),\n fg(['.buildkite/*.yml']),\n ]);\n\n if (!maybeDockerfiles.length || !maybePipelines.length) {\n return {\n result: 'skip',\n reason: 'Either dockerfiles or pipelines were not found',\n };\n }\n\n const [dockerfiles, pipelines] = await Promise.all([\n fetchFiles(maybeDockerfiles),\n fetchFiles(maybePipelines),\n ]);\n\n const dockerFilesToPatch = dockerfiles.filter(\n ({ contents }) =>\n contents.includes(DOCKERFILE_COREPACK_COMMAND) &&\n !contents.includes('target=package.json'),\n );\n\n const pipelinesToPatch = pipelines.filter(({ contents }) =>\n Boolean(BEFORE_PIPELINE_REGEX.exec(contents)),\n );\n\n if (!dockerFilesToPatch.length && !pipelinesToPatch.length) {\n return {\n result: 'skip',\n reason: 'no pipeline or dockerfiles to patch',\n };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n if (dockerFilesToPatch.length) {\n await Promise.all(\n dockerFilesToPatch.map(async ({ file, contents }) => {\n const patchedContent = contents.replace(\n DOCKERFILE_COREPACK_COMMAND,\n PACKAGE_JSON_MOUNT,\n );\n await writeFile(file, patchedContent);\n }),\n );\n }\n\n if (pipelinesToPatch.length) {\n await Promise.all(\n pipelinesToPatch.map(async ({ file, contents }) => {\n const patchedContent = contents.replace(\n BEFORE_PIPELINE_REGEX,\n `$1$3${PACKAGE_JSON_CACHE}\\n$2`,\n );\n\n const patchedEcrContent = patchedContent.replace(\n ECR_REGEX,\n (match, version) => {\n if (typeof version === 'string' && lt(version, '2.2.0')) {\n return 'seek-oss/docker-ecr-cache#v2.2.0';\n }\n return match;\n },\n );\n\n await writeFile(file, patchedEcrContent);\n }),\n );\n }\n\n return { result: 'apply' };\n};\n\nexport const tryPatchPnpmPackageManager: PatchFunction = async (config) => {\n try {\n return await patchPnpmPackageManager(config);\n } catch (err) {\n log.warn('Failed to patch pnpm packageManager CI configuration.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,uBAAe;AACf,sBAAoC;AACpC,oBAAmB;AAGnB,qBAAoB;AAEpB,MAAM,8BAA8B;AACpC,MAAM,qBAAqB;AAAA;AAE3B,MAAM,qBAAqB;AAE3B,MAAM,wBACJ;AACF,MAAM,YAAY;AAElB,MAAM,aAAa,OAAO,UACxB,QAAQ;AAAA,EACN,MAAM,IAAI,OAAO,SAAS;AACxB,UAAM,WAAW,UAAM,0BAAS,MAAM,MAAM;AAE5C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEF,MAAM,0BAAyC,OAAO;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AACF,MAAgC;AAC9B,MAAI,eAAe,YAAY,QAAQ;AACrC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MACE,CACE,SAAS,YACT,gBAAgB,SAAS,MAAM,GACjC;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,CAAC,kBAAkB,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC3D,iBAAAA,SAAG,CAAC,aAAa,CAAC;AAAA,QAClB,iBAAAA,SAAG,CAAC,kBAAkB,CAAC;AAAA,EACzB,CAAC;AAED,MAAI,CAAC,iBAAiB,UAAU,CAAC,eAAe,QAAQ;AACtD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IACjD,WAAW,gBAAgB;AAAA,IAC3B,WAAW,cAAc;AAAA,EAC3B,CAAC;AAED,QAAM,qBAAqB,YAAY;AAAA,IACrC,CAAC,EAAE,SAAS,MACV,SAAS,SAAS,2BAA2B,KAC7C,CAAC,SAAS,SAAS,qBAAqB;AAAA,EAC5C;AAEA,QAAM,mBAAmB,UAAU;AAAA,IAAO,CAAC,EAAE,SAAS,MACpD,QAAQ,sBAAsB,KAAK,QAAQ,CAAC;AAAA,EAC9C;AAEA,MAAI,CAAC,mBAAmB,UAAU,CAAC,iBAAiB,QAAQ;AAC1D,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,MAAI,mBAAmB,QAAQ;AAC7B,UAAM,QAAQ;AAAA,MACZ,mBAAmB,IAAI,OAAO,EAAE,MAAM,SAAS,MAAM;AACnD,cAAM,iBAAiB,SAAS;AAAA,UAC9B;AAAA,UACA;AAAA,QACF;AACA,kBAAM,2BAAU,MAAM,cAAc;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,iBAAiB,QAAQ;AAC3B,UAAM,QAAQ;AAAA,MACZ,iBAAiB,IAAI,OAAO,EAAE,MAAM,SAAS,MAAM;AACjD,cAAM,iBAAiB,SAAS;AAAA,UAC9B;AAAA,UACA,OAAO,kBAAkB;AAAA;AAAA,QAC3B;AAEA,cAAM,oBAAoB,eAAe;AAAA,UACvC;AAAA,UACA,CAAC,OAAO,YAAY;AAClB,gBAAI,OAAO,YAAY,gBAAY,kBAAG,SAAS,OAAO,GAAG;AACvD,qBAAO;AAAA,YACT;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,kBAAM,2BAAU,MAAM,iBAAiB;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,6BAA4C,OAAO,WAAW;AACzE,MAAI;AACF,WAAO,MAAM,wBAAwB,MAAM;AAAA,EAC7C,SAAS,KAAK;AACZ,uBAAI,KAAK,uDAAuD;AAChE,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
6
+ "names": ["fg"]
7
+ }
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import type { Writable } from 'stream';
3
2
  export interface Input {
4
3
  /**
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  export declare const hasDebugFlag: (args?: string[]) => boolean;
3
2
  export declare const hasSerialFlag: (args?: string[], env?: NodeJS.ProcessEnv) => boolean;
4
3
  /**
@@ -1,5 +1,5 @@
1
1
  export type TextProcessor = (contents: string) => string;
2
- export declare const copyFile: (sourcePath: string, destinationPath: string, { overwrite, processors, }: Pick<CopyFilesOptions, 'overwrite' | 'processors'>) => Promise<void>;
2
+ export declare const copyFile: (sourcePath: string, destinationPath: string, { overwrite, processors, }: Pick<CopyFilesOptions, "overwrite" | "processors">) => Promise<void>;
3
3
  interface CopyFilesOptions {
4
4
  sourceRoot: string;
5
5
  destinationRoot: string;
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  /**
3
2
  * Whether the code is executing in a CI environment.
4
3
  */
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { inspect } from 'util';
3
2
  import { z } from 'zod';
4
3
  export type ConcurrentlyErrors = z.infer<typeof concurrentlyErrorsSchema>;
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import stream from 'stream';
3
2
  import type { Color } from 'chalk';
4
3
  import execa, { type ExecaChildProcess } from 'execa';
@@ -34,7 +34,7 @@ __export(packageManager_exports, {
34
34
  packageManagerSchema: () => packageManagerSchema
35
35
  });
36
36
  module.exports = __toCommonJS(packageManager_exports);
37
- var import_detect_package_manager = require("detect-package-manager");
37
+ var import_find_up = __toESM(require("find-up"));
38
38
  var import_is_installed_globally = __toESM(require("is-installed-globally"));
39
39
  var import_zod = require("zod");
40
40
  var import_logging = require("./logging");
@@ -59,10 +59,15 @@ const configForPackageManager = (packageManager) => ({
59
59
  });
60
60
  const detectPackageManager = async (cwd) => {
61
61
  let packageManager = DEFAULT_PACKAGE_MANAGER;
62
- let raw;
63
62
  try {
64
- raw = await (0, import_detect_package_manager.detect)({ cwd, includeGlobalBun: false });
65
- packageManager = packageManagerSchema.parse(raw);
63
+ const [yarnDepth, pnpmDepth] = await Promise.all([
64
+ findDepth("yarn.lock", cwd),
65
+ findDepth("pnpm-lock.yaml", cwd)
66
+ ]);
67
+ if (yarnDepth === void 0 && pnpmDepth === void 0) {
68
+ throw new Error("No package manager lockfile found.");
69
+ }
70
+ packageManager = (pnpmDepth ?? -1) > (yarnDepth ?? -1) ? "pnpm" : "yarn";
66
71
  } catch (err) {
67
72
  import_logging.log.warn(
68
73
  `Failed to detect package manager; defaulting to ${import_logging.log.bold(
@@ -72,10 +77,6 @@ const detectPackageManager = async (cwd) => {
72
77
  import_logging.log.subtle(
73
78
  (() => {
74
79
  switch (true) {
75
- case err instanceof import_zod.ZodError:
76
- return `Expected ${Object.keys(PACKAGE_MANAGERS).join(
77
- "|"
78
- )}, received ${raw}`;
79
80
  case err instanceof Error:
80
81
  return err.message;
81
82
  default:
@@ -86,6 +87,10 @@ const detectPackageManager = async (cwd) => {
86
87
  }
87
88
  return configForPackageManager(packageManager);
88
89
  };
90
+ const findDepth = async (filename, cwd) => {
91
+ const path = await (0, import_find_up.default)(filename, { cwd });
92
+ return path ? path.split("/").length : void 0;
93
+ };
89
94
  const packageManagerSchema = import_zod.z.enum(["pnpm", "yarn"]).default(DEFAULT_PACKAGE_MANAGER);
90
95
  // Annotate the CommonJS export names for ESM import in node:
91
96
  0 && (module.exports = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/packageManager.ts"],
4
- "sourcesContent": ["import { detect } from 'detect-package-manager';\nimport isInstalledGlobally from 'is-installed-globally';\nimport { ZodError, z } from 'zod';\n\nimport { log } from './logging';\n\n// TODO: consider changing to this to `pnpm` in a future major version.\nexport const DEFAULT_PACKAGE_MANAGER = 'yarn';\n\nexport type PackageManagerConfig =\n (typeof PACKAGE_MANAGERS)[keyof typeof PACKAGE_MANAGERS] & {\n command: PackageManager;\n };\n\nconst PACKAGE_MANAGERS = {\n pnpm: {\n exec: 'pnpm exec',\n install: 'pnpm install',\n runSilent: 'pnpm --silent run',\n update: isInstalledGlobally ? 'pnpm update --global' : 'pnpm update',\n },\n yarn: {\n exec: 'yarn',\n install: 'yarn install',\n runSilent: 'yarn -s',\n update: isInstalledGlobally ? 'yarn global upgrade' : 'yarn upgrade',\n },\n};\n\nexport const configForPackageManager = (\n packageManager: PackageManager,\n): PackageManagerConfig => ({\n ...PACKAGE_MANAGERS[packageManager],\n command: packageManager,\n});\n\nexport const detectPackageManager = async (\n cwd?: string,\n): Promise<PackageManagerConfig> => {\n let packageManager: PackageManager = DEFAULT_PACKAGE_MANAGER;\n\n let raw: string | undefined;\n try {\n raw = await detect({ cwd, includeGlobalBun: false });\n\n packageManager = packageManagerSchema.parse(raw);\n } catch (err) {\n log.warn(\n `Failed to detect package manager; defaulting to ${log.bold(\n DEFAULT_PACKAGE_MANAGER,\n )}.`,\n );\n log.subtle(\n (() => {\n switch (true) {\n case err instanceof ZodError:\n return `Expected ${Object.keys(PACKAGE_MANAGERS).join(\n '|',\n )}, received ${raw}`;\n\n case err instanceof Error:\n return err.message;\n\n default:\n return String(err);\n }\n })(),\n );\n }\n\n return configForPackageManager(packageManager);\n};\n\nexport type PackageManager = z.infer<typeof packageManagerSchema>;\n\nexport const packageManagerSchema = z\n .enum(['pnpm', 'yarn'])\n .default(DEFAULT_PACKAGE_MANAGER);\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAuB;AACvB,mCAAgC;AAChC,iBAA4B;AAE5B,qBAAoB;AAGb,MAAM,0BAA0B;AAOvC,MAAM,mBAAmB;AAAA,EACvB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ,6BAAAA,UAAsB,yBAAyB;AAAA,EACzD;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ,6BAAAA,UAAsB,wBAAwB;AAAA,EACxD;AACF;AAEO,MAAM,0BAA0B,CACrC,oBAC0B;AAAA,EAC1B,GAAG,iBAAiB,cAAc;AAAA,EAClC,SAAS;AACX;AAEO,MAAM,uBAAuB,OAClC,QACkC;AAClC,MAAI,iBAAiC;AAErC,MAAI;AACJ,MAAI;AACF,UAAM,UAAM,sCAAO,EAAE,KAAK,kBAAkB,MAAM,CAAC;AAEnD,qBAAiB,qBAAqB,MAAM,GAAG;AAAA,EACjD,SAAS,KAAK;AACZ,uBAAI;AAAA,MACF,mDAAmD,mBAAI;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AACA,uBAAI;AAAA,OACD,MAAM;AACL,gBAAQ,MAAM;AAAA,UACZ,KAAK,eAAe;AAClB,mBAAO,YAAY,OAAO,KAAK,gBAAgB,EAAE;AAAA,cAC/C;AAAA,YACF,CAAC,cAAc,GAAG;AAAA,UAEpB,KAAK,eAAe;AAClB,mBAAO,IAAI;AAAA,UAEb;AACE,mBAAO,OAAO,GAAG;AAAA,QACrB;AAAA,MACF,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO,wBAAwB,cAAc;AAC/C;AAIO,MAAM,uBAAuB,aACjC,KAAK,CAAC,QAAQ,MAAM,CAAC,EACrB,QAAQ,uBAAuB;",
6
- "names": ["isInstalledGlobally"]
4
+ "sourcesContent": ["import findUp from 'find-up';\nimport isInstalledGlobally from 'is-installed-globally';\nimport { z } from 'zod';\n\nimport { log } from './logging';\n\n// TODO: consider changing to this to `pnpm` in a future major version.\nexport const DEFAULT_PACKAGE_MANAGER = 'yarn';\n\nexport type PackageManagerConfig =\n (typeof PACKAGE_MANAGERS)[keyof typeof PACKAGE_MANAGERS] & {\n command: PackageManager;\n };\n\nconst PACKAGE_MANAGERS = {\n pnpm: {\n exec: 'pnpm exec',\n install: 'pnpm install',\n runSilent: 'pnpm --silent run',\n update: isInstalledGlobally ? 'pnpm update --global' : 'pnpm update',\n },\n yarn: {\n exec: 'yarn',\n install: 'yarn install',\n runSilent: 'yarn -s',\n update: isInstalledGlobally ? 'yarn global upgrade' : 'yarn upgrade',\n },\n};\n\nexport const configForPackageManager = (\n packageManager: PackageManager,\n): PackageManagerConfig => ({\n ...PACKAGE_MANAGERS[packageManager],\n command: packageManager,\n});\n\nexport const detectPackageManager = async (\n cwd?: string,\n): Promise<PackageManagerConfig> => {\n let packageManager: PackageManager = DEFAULT_PACKAGE_MANAGER;\n\n try {\n const [yarnDepth, pnpmDepth] = await Promise.all([\n findDepth('yarn.lock', cwd),\n findDepth('pnpm-lock.yaml', cwd),\n ]);\n\n if (yarnDepth === undefined && pnpmDepth === undefined) {\n throw new Error('No package manager lockfile found.');\n }\n\n packageManager = (pnpmDepth ?? -1) > (yarnDepth ?? -1) ? 'pnpm' : 'yarn';\n } catch (err) {\n log.warn(\n `Failed to detect package manager; defaulting to ${log.bold(\n DEFAULT_PACKAGE_MANAGER,\n )}.`,\n );\n log.subtle(\n (() => {\n switch (true) {\n case err instanceof Error:\n return err.message;\n\n default:\n return String(err);\n }\n })(),\n );\n }\n\n return configForPackageManager(packageManager);\n};\n\nconst findDepth = async (filename: string, cwd?: string) => {\n const path = await findUp(filename, { cwd });\n return path ? path.split('/').length : undefined;\n};\n\nexport type PackageManager = z.infer<typeof packageManagerSchema>;\n\nexport const packageManagerSchema = z\n .enum(['pnpm', 'yarn'])\n .default(DEFAULT_PACKAGE_MANAGER);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAmB;AACnB,mCAAgC;AAChC,iBAAkB;AAElB,qBAAoB;AAGb,MAAM,0BAA0B;AAOvC,MAAM,mBAAmB;AAAA,EACvB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ,6BAAAA,UAAsB,yBAAyB;AAAA,EACzD;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ,6BAAAA,UAAsB,wBAAwB;AAAA,EACxD;AACF;AAEO,MAAM,0BAA0B,CACrC,oBAC0B;AAAA,EAC1B,GAAG,iBAAiB,cAAc;AAAA,EAClC,SAAS;AACX;AAEO,MAAM,uBAAuB,OAClC,QACkC;AAClC,MAAI,iBAAiC;AAErC,MAAI;AACF,UAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/C,UAAU,aAAa,GAAG;AAAA,MAC1B,UAAU,kBAAkB,GAAG;AAAA,IACjC,CAAC;AAED,QAAI,cAAc,UAAa,cAAc,QAAW;AACtD,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,sBAAkB,aAAa,OAAO,aAAa,MAAM,SAAS;AAAA,EACpE,SAAS,KAAK;AACZ,uBAAI;AAAA,MACF,mDAAmD,mBAAI;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AACA,uBAAI;AAAA,OACD,MAAM;AACL,gBAAQ,MAAM;AAAA,UACZ,KAAK,eAAe;AAClB,mBAAO,IAAI;AAAA,UAEb;AACE,mBAAO,OAAO,GAAG;AAAA,QACrB;AAAA,MACF,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO,wBAAwB,cAAc;AAC/C;AAEA,MAAM,YAAY,OAAO,UAAkB,QAAiB;AAC1D,QAAM,OAAO,UAAM,eAAAC,SAAO,UAAU,EAAE,IAAI,CAAC;AAC3C,SAAO,OAAO,KAAK,MAAM,GAAG,EAAE,SAAS;AACzC;AAIO,MAAM,uBAAuB,aACjC,KAAK,CAAC,QAAQ,MAAM,CAAC,EACrB,QAAQ,uBAAuB;",
6
+ "names": ["isInstalledGlobally", "findUp"]
7
7
  }
@@ -47,9 +47,9 @@ export declare const templateConfigSchema: z.ZodObject<{
47
47
  validate?: ((args_0: string, ...args_1: unknown[]) => string | boolean) | undefined;
48
48
  }[];
49
49
  packageManager: "yarn" | "pnpm";
50
+ type?: "package" | "application" | undefined;
50
51
  entryPoint?: string | undefined;
51
52
  noSkip?: boolean | undefined;
52
- type?: "package" | "application" | undefined;
53
53
  }, {
54
54
  fields: {
55
55
  message: string;
@@ -57,10 +57,10 @@ export declare const templateConfigSchema: z.ZodObject<{
57
57
  initial: string;
58
58
  validate?: ((args_0: string, ...args_1: unknown[]) => string | boolean) | undefined;
59
59
  }[];
60
+ type?: "package" | "application" | undefined;
60
61
  entryPoint?: string | undefined;
61
- noSkip?: boolean | undefined;
62
62
  packageManager?: "yarn" | "pnpm" | undefined;
63
- type?: "package" | "application" | undefined;
63
+ noSkip?: boolean | undefined;
64
64
  }>;
65
65
  export declare const TEMPLATE_CONFIG_FILENAME = "skuba.template.js";
66
66
  export declare const TEMPLATE_DIR: string;
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import http from 'http';
3
2
  /**
4
3
  * Create an HTTP request listener based on the supplied function.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skuba",
3
- "version": "8.0.1",
3
+ "version": "8.1.0-main-20240625003658",
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",
@@ -60,14 +60,14 @@
60
60
  "@types/node": ">=18.12",
61
61
  "chalk": "^4.1.0",
62
62
  "concurrently": "^8.0.0",
63
- "detect-package-manager": "^3.0.1",
64
63
  "dotenv": "^16.0.0",
65
64
  "ejs": "^3.1.6",
66
65
  "enquirer": "^2.3.6",
67
- "esbuild": "~0.20.0",
66
+ "esbuild": "~0.21.0",
68
67
  "eslint": "^8.56.0",
69
68
  "execa": "^5.0.0",
70
69
  "fast-glob": "^3.3.2",
70
+ "find-up": "^5.0.0",
71
71
  "fs-extra": "^11.0.0",
72
72
  "function-arguments": "^1.0.9",
73
73
  "get-port": "^5.1.1",
@@ -84,7 +84,7 @@
84
84
  "npm-run-path": "^4.0.1",
85
85
  "npm-which": "^3.0.1",
86
86
  "picomatch": "^4.0.0",
87
- "prettier": "~3.2.5",
87
+ "prettier": "~3.3.0",
88
88
  "prettier-plugin-packagejson": "^2.4.10",
89
89
  "read-pkg-up": "^7.0.1",
90
90
  "semantic-release": "^22.0.12",
@@ -97,20 +97,20 @@
97
97
  "ts-node-dev": "^2.0.0",
98
98
  "tsconfig-paths": "^4.0.0",
99
99
  "tsconfig-seek": "2.0.0",
100
- "typescript": "~5.4.0",
100
+ "typescript": "~5.5.0",
101
101
  "validate-npm-package-name": "^5.0.0",
102
102
  "zod": "^3.22.4",
103
- "eslint-config-skuba": "4.0.0"
103
+ "eslint-config-skuba": "4.1.0-main-20240625003658"
104
104
  },
105
105
  "devDependencies": {
106
- "@changesets/cli": "2.27.1",
106
+ "@changesets/cli": "2.27.5",
107
107
  "@changesets/get-github-info": "0.6.0",
108
108
  "@jest/reporters": "29.7.0",
109
109
  "@jest/test-result": "29.7.0",
110
110
  "@types/ejs": "3.1.5",
111
111
  "@types/express": "4.17.21",
112
112
  "@types/fs-extra": "11.0.4",
113
- "@types/koa": "2.14.0",
113
+ "@types/koa": "2.15.0",
114
114
  "@types/libnpmsearch": "2.0.7",
115
115
  "@types/lodash.mergewith": "4.6.9",
116
116
  "@types/module-alias": "2.0.4",
@@ -118,17 +118,17 @@
118
118
  "@types/picomatch": "2.3.3",
119
119
  "@types/supertest": "6.0.2",
120
120
  "@types/validate-npm-package-name": "4.0.2",
121
- "enhanced-resolve": "5.15.0",
121
+ "enhanced-resolve": "5.17.0",
122
122
  "express": "4.19.2",
123
- "fastify": "4.26.1",
123
+ "fastify": "4.28.0",
124
124
  "jest-diff": "29.7.0",
125
125
  "jsonfile": "6.1.0",
126
- "koa": "2.15.0",
127
- "memfs": "4.6.0",
128
- "remark-cli": "12.0.0",
129
- "remark-preset-lint-recommended": "6.1.3",
130
- "semver": "7.6.0",
131
- "supertest": "6.3.4",
126
+ "koa": "2.15.3",
127
+ "memfs": "4.9.3",
128
+ "remark-cli": "12.0.1",
129
+ "remark-preset-lint-recommended": "7.0.0",
130
+ "semver": "7.6.2",
131
+ "supertest": "7.0.0",
132
132
  "type-fest": "2.19.0"
133
133
  },
134
134
  "peerDependencies": {
@@ -139,7 +139,6 @@
139
139
  "optional": true
140
140
  }
141
141
  },
142
- "packageManager": "pnpm@8.15.6",
143
142
  "engines": {
144
143
  "node": ">=18.18.0"
145
144
  },
@@ -162,11 +161,11 @@
162
161
  "lint:md": "remark --frail --quiet .",
163
162
  "release": "pnpm --silent build && changeset publish",
164
163
  "skuba": "pnpm --silent build && pnpm --silent skuba:exec",
165
- "skuba:exec": "node --env-file=.env lib/skuba",
164
+ "skuba:exec": "node --experimental-vm-modules lib/skuba",
166
165
  "stage": "changeset version && node ./.changeset/inject.js && pnpm format",
167
- "test": "pnpm --silent skuba test --selectProjects unit",
166
+ "test": "pnpm --silent skuba test --selectProjects unit --",
168
167
  "test:ci": "pnpm --silent skuba test --runInBand",
169
- "test:int": "pnpm --silent skuba test --runInBand --selectProjects integration",
168
+ "test:int": "pnpm --silent skuba test --selectProjects integration --runInBand",
170
169
  "test:template": "scripts/test-template.sh",
171
170
  "test:watch": "pnpm --silent skuba test --runInBand --watch"
172
171
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
3
+ }
@@ -1,6 +1,7 @@
1
1
  # managed by skuba
2
2
  .idea/*
3
3
  .vscode/*
4
+ !.vscode/extensions.json
4
5
 
5
6
  .cdk.staging/
6
7
  .serverless/
@@ -5,4 +5,5 @@
5
5
  gantry*.yaml
6
6
  gantry*.yml
7
7
  pnpm-lock.yaml
8
+ coverage
8
9
  # end managed by skuba
@@ -1,6 +1,4 @@
1
1
  environment: dev
2
- env:
3
- SOME_ENVIRONMENT_VARIABLE: dev-value
4
2
 
5
3
  maxInstanceCount: 1
6
4
  minInstanceCount: 1
@@ -1,6 +1,4 @@
1
1
  environment: prod
2
- env:
3
- SOME_ENVIRONMENT_VARIABLE: prod-value
4
2
 
5
3
  maxInstanceCount: 10
6
4
  minInstanceCount: 3
@@ -1,4 +1,4 @@
1
- # syntax=docker/dockerfile:1.7
1
+ # syntax=docker/dockerfile:1.8
2
2
 
3
3
  FROM --platform=<%- platformName %> node:20-alpine AS dev-deps
4
4
 
@@ -1,5 +1,3 @@
1
- version: '3.7'
2
-
3
1
  services:
4
2
  app:
5
3
  image: ${BUILDKITE_PLUGIN_DOCKER_IMAGE:-''}