skuba 8.1.0-patch-pnpm-package-20240411042949 → 8.1.0-pm-20240506055052

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 (47) 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/cli/init/index.js +1 -15
  8. package/lib/cli/init/index.js.map +2 -2
  9. package/lib/cli/lint/internalLints/patchRenovateConfig.d.ts +1 -1
  10. package/lib/cli/lint/internalLints/patchRenovateConfig.js +1 -4
  11. package/lib/cli/lint/internalLints/patchRenovateConfig.js.map +2 -2
  12. package/lib/cli/lint/internalLints/refreshConfigFiles.js +14 -3
  13. package/lib/cli/lint/internalLints/refreshConfigFiles.js.map +2 -2
  14. package/lib/cli/lint/internalLints/upgrade/index.d.ts +1 -9
  15. package/lib/cli/lint/internalLints/upgrade/index.js +5 -15
  16. package/lib/cli/lint/internalLints/upgrade/index.js.map +2 -2
  17. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/addEmptyExports.js +1 -1
  18. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/addEmptyExports.js.map +2 -2
  19. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/moveNpmrcOutOfIgnoreManagedSection.d.ts +1 -1
  20. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/moveNpmrcOutOfIgnoreManagedSection.js +1 -1
  21. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/moveNpmrcOutOfIgnoreManagedSection.js.map +2 -2
  22. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchDockerfile.js +1 -4
  23. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchDockerfile.js.map +2 -2
  24. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchServerListener.js +1 -4
  25. package/lib/cli/lint/internalLints/upgrade/patches/7.3.1/patchServerListener.js.map +2 -2
  26. package/lib/utils/packageManager.js +13 -8
  27. package/lib/utils/packageManager.js.map +3 -3
  28. package/package.json +5 -6
  29. package/template/base/_.prettierignore +1 -0
  30. package/template/express-rest-api/package.json +1 -1
  31. package/template/greeter/package.json +1 -1
  32. package/template/koa-rest-api/package.json +1 -1
  33. package/template/lambda-sqs-worker/package.json +1 -1
  34. package/template/lambda-sqs-worker-cdk/cdk.json +0 -23
  35. package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +6 -6
  36. package/template/lambda-sqs-worker-cdk/infra/appStack.test.ts +18 -20
  37. package/template/lambda-sqs-worker-cdk/infra/appStack.ts +15 -14
  38. package/template/lambda-sqs-worker-cdk/infra/config.ts +41 -0
  39. package/template/lambda-sqs-worker-cdk/infra/index.ts +2 -5
  40. package/template/lambda-sqs-worker-cdk/package.json +2 -2
  41. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/index.d.ts +0 -2
  42. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/index.js +0 -35
  43. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/index.js.map +0 -7
  44. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/patchPnpmPackageManager.d.ts +0 -2
  45. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/patchPnpmPackageManager.js +0 -147
  46. package/lib/cli/lint/internalLints/upgrade/patches/8.0.0/patchPnpmPackageManager.js.map +0 -7
  47. package/template/lambda-sqs-worker-cdk/shared/context-types.ts +0 -22
@@ -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,\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;",
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;",
6
6
  "names": ["fs"]
7
7
  }
@@ -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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skuba",
3
- "version": "8.1.0-patch-pnpm-package-20240411042949",
3
+ "version": "8.1.0-pm-20240506055052",
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,7 +60,6 @@
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",
@@ -68,6 +67,7 @@
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",
@@ -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
  }
@@ -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
@@ -25,7 +25,7 @@
25
25
  "skuba": "*",
26
26
  "supertest": "^6.1.6"
27
27
  },
28
- "packageManager": "pnpm@8.15.6",
28
+ "packageManager": "pnpm@9.0.2",
29
29
  "engines": {
30
30
  "node": ">=20"
31
31
  }
@@ -18,7 +18,7 @@
18
18
  "@types/node": "^20.9.0",
19
19
  "skuba": "*"
20
20
  },
21
- "packageManager": "pnpm@8.15.6",
21
+ "packageManager": "pnpm@9.0.2",
22
22
  "engines": {
23
23
  "node": ">=20"
24
24
  }
@@ -44,7 +44,7 @@
44
44
  "skuba": "*",
45
45
  "supertest": "^6.1.6"
46
46
  },
47
- "packageManager": "pnpm@8.15.6",
47
+ "packageManager": "pnpm@9.0.2",
48
48
  "engines": {
49
49
  "node": ">=20"
50
50
  }
@@ -37,7 +37,7 @@
37
37
  "serverless-prune-plugin": "^2.0.0",
38
38
  "skuba": "*"
39
39
  },
40
- "packageManager": "pnpm@8.15.6",
40
+ "packageManager": "pnpm@9.0.2",
41
41
  "engines": {
42
42
  "node": ">=20"
43
43
  }
@@ -1,28 +1,5 @@
1
1
  {
2
2
  "app": "pnpm exec skuba node infra/index.ts",
3
- "context": {
4
- "global": {
5
- "appName": "<%- serviceName %>"
6
- },
7
- "dev": {
8
- "workerLambda": {
9
- "reservedConcurrency": 2,
10
- "environment": {
11
- "ENVIRONMENT": "dev"
12
- }
13
- },
14
- "sourceSnsTopicArn": "TODO: sourceSnsTopicArn"
15
- },
16
- "prod": {
17
- "workerLambda": {
18
- "reservedConcurrency": 20,
19
- "environment": {
20
- "ENVIRONMENT": "prod"
21
- }
22
- },
23
- "sourceSnsTopicArn": "TODO: sourceSnsTopicArn"
24
- }
25
- },
26
3
  "progress": "events",
27
4
  "watch": {
28
5
  "include": "src/**/*.ts",
@@ -934,7 +934,7 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
934
934
  "RedrivePolicy": {
935
935
  "deadLetterTargetArn": {
936
936
  "Fn::GetAtt": [
937
- "workerqueuedlq42262778",
937
+ "workerqueuedeadletters83F3505C",
938
938
  "Arn",
939
939
  ],
940
940
  },
@@ -997,7 +997,7 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
997
997
  },
998
998
  "Type": "AWS::SNS::Subscription",
999
999
  },
1000
- "workerqueuedlq42262778": {
1000
+ "workerqueuedeadletters83F3505C": {
1001
1001
  "DeletionPolicy": "Delete",
1002
1002
  "Properties": {
1003
1003
  "KmsMasterKeyId": {
@@ -1006,7 +1006,7 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
1006
1006
  "Arn",
1007
1007
  ],
1008
1008
  },
1009
- "QueueName": "serviceName-dlq",
1009
+ "QueueName": "serviceName-dead-letters",
1010
1010
  },
1011
1011
  "Type": "AWS::SQS::Queue",
1012
1012
  "UpdateReplacePolicy": "Delete",
@@ -1976,7 +1976,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
1976
1976
  "RedrivePolicy": {
1977
1977
  "deadLetterTargetArn": {
1978
1978
  "Fn::GetAtt": [
1979
- "workerqueuedlq42262778",
1979
+ "workerqueuedeadletters83F3505C",
1980
1980
  "Arn",
1981
1981
  ],
1982
1982
  },
@@ -2039,7 +2039,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
2039
2039
  },
2040
2040
  "Type": "AWS::SNS::Subscription",
2041
2041
  },
2042
- "workerqueuedlq42262778": {
2042
+ "workerqueuedeadletters83F3505C": {
2043
2043
  "DeletionPolicy": "Delete",
2044
2044
  "Properties": {
2045
2045
  "KmsMasterKeyId": {
@@ -2048,7 +2048,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
2048
2048
  "Arn",
2049
2049
  ],
2050
2050
  },
2051
- "QueueName": "serviceName-dlq",
2051
+ "QueueName": "serviceName-dead-letters",
2052
2052
  },
2053
2053
  "Type": "AWS::SQS::Queue",
2054
2054
  "UpdateReplacePolicy": "Delete",
@@ -1,22 +1,6 @@
1
1
  import { App, aws_sns } from 'aws-cdk-lib';
2
2
  import { Template } from 'aws-cdk-lib/assertions';
3
3
 
4
- import cdkJson from '../cdk.json';
5
-
6
- import { AppStack } from './appStack';
7
-
8
- const contexts = [
9
- {
10
- stage: 'dev',
11
- ...cdkJson.context,
12
- },
13
-
14
- {
15
- stage: 'prod',
16
- ...cdkJson.context,
17
- },
18
- ];
19
-
20
4
  const currentDate = '1212-12-12T12:12:12.121Z';
21
5
 
22
6
  jest.useFakeTimers({
@@ -31,14 +15,28 @@ jest.useFakeTimers({
31
15
  now: new Date(currentDate),
32
16
  });
33
17
 
34
- it.each(contexts)(
35
- 'returns expected CloudFormation stack for $stage',
36
- (context) => {
18
+ const originalEnv = process.env.ENVIRONMENT;
19
+
20
+ afterAll(() => {
21
+ process.env.ENVIRONMENT = originalEnv;
22
+ });
23
+
24
+ afterEach(() => {
25
+ jest.resetModules();
26
+ });
27
+
28
+ it.each(['dev', 'prod'])(
29
+ 'returns expected CloudFormation stack for %s',
30
+ async (env) => {
31
+ process.env.ENVIRONMENT = env;
32
+
33
+ const { AppStack } = await import('./appStack');
34
+
37
35
  jest
38
36
  .spyOn(aws_sns.Topic, 'fromTopicArn')
39
37
  .mockImplementation((scope, id) => new aws_sns.Topic(scope, id));
40
38
 
41
- const app = new App({ context });
39
+ const app = new App();
42
40
 
43
41
  const stack = new AppStack(app, 'appStack');
44
42
 
@@ -15,15 +15,12 @@ import {
15
15
  } from 'aws-cdk-lib';
16
16
  import type { Construct } from 'constructs';
17
17
 
18
- import { EnvContextSchema, StageContextSchema } from '../shared/context-types';
18
+ import { config } from './config';
19
19
 
20
20
  export class AppStack extends Stack {
21
21
  constructor(scope: Construct, id: string, props?: StackProps) {
22
22
  super(scope, id, props);
23
23
 
24
- const stage = StageContextSchema.parse(this.node.tryGetContext('stage'));
25
- const context = EnvContextSchema.parse(this.node.tryGetContext(stage));
26
-
27
24
  const accountPrincipal = new aws_iam.AccountPrincipal(this.account);
28
25
 
29
26
  const kmsKey = new aws_kms.Key(this, 'kms-key', {
@@ -35,10 +32,14 @@ export class AppStack extends Stack {
35
32
 
36
33
  kmsKey.grantEncrypt(accountPrincipal);
37
34
 
38
- const deadLetterQueue = new aws_sqs.Queue(this, 'worker-queue-dlq', {
39
- queueName: '<%- serviceName %>-dlq',
40
- encryptionMasterKey: kmsKey,
41
- });
35
+ const deadLetterQueue = new aws_sqs.Queue(
36
+ this,
37
+ 'worker-queue-dead-letters',
38
+ {
39
+ queueName: '<%- serviceName %>-dead-letters',
40
+ encryptionMasterKey: kmsKey,
41
+ },
42
+ );
42
43
 
43
44
  const queue = new aws_sqs.Queue(this, 'worker-queue', {
44
45
  queueName: '<%- serviceName %>',
@@ -52,7 +53,7 @@ export class AppStack extends Stack {
52
53
  const topic = aws_sns.Topic.fromTopicArn(
53
54
  this,
54
55
  'source-topic',
55
- context.sourceSnsTopicArn,
56
+ config.sourceSnsTopicArn,
56
57
  );
57
58
 
58
59
  topic.addSubscription(new aws_sns_subscriptions.SqsSubscription(queue));
@@ -89,13 +90,13 @@ export class AppStack extends Stack {
89
90
  functionName: '<%- serviceName %>',
90
91
  environment: {
91
92
  ...defaultWorkerEnvironment,
92
- ...context.workerLambda.environment,
93
+ ...config.workerLambda.environment,
93
94
  },
94
95
  // https://github.com/aws/aws-cdk/issues/28237
95
96
  // This forces the lambda to be updated on every deployment
96
97
  // If you do not wish to use hotswap, you can remove the new Date().toISOString() from the description
97
98
  description: `Updated at ${new Date().toISOString()}`,
98
- reservedConcurrentExecutions: context.workerLambda.reservedConcurrency,
99
+ reservedConcurrentExecutions: config.workerLambda.reservedConcurrency,
99
100
  });
100
101
 
101
102
  const alias = worker.addAlias('live', {
@@ -104,7 +105,7 @@ export class AppStack extends Stack {
104
105
 
105
106
  alias.addEventSource(
106
107
  new aws_lambda_event_sources.SqsEventSource(queue, {
107
- maxConcurrency: context.workerLambda.reservedConcurrency,
108
+ maxConcurrency: config.workerLambda.reservedConcurrency,
108
109
  }),
109
110
  );
110
111
 
@@ -119,7 +120,7 @@ export class AppStack extends Stack {
119
120
  functionName: '<%- serviceName %>-pre-hook',
120
121
  environment: {
121
122
  ...defaultWorkerEnvironment,
122
- ...context.workerLambda.environment,
123
+ ...config.workerLambda.environment,
123
124
  FUNCTION_NAME_TO_INVOKE: worker.functionName,
124
125
  },
125
126
  },
@@ -138,7 +139,7 @@ export class AppStack extends Stack {
138
139
  functionName: '<%- serviceName %>-post-hook',
139
140
  environment: {
140
141
  ...defaultWorkerEnvironment,
141
- ...context.workerLambda.environment,
142
+ ...config.workerLambda.environment,
142
143
  FUNCTION_NAME_TO_PRUNE: worker.functionName,
143
144
  },
144
145
  },
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+
3
+ const environment = z.enum(['dev', 'prod']).parse(process.env.ENVIRONMENT);
4
+
5
+ type Environment = typeof environment;
6
+
7
+ export interface Config {
8
+ appName: string;
9
+ workerLambda: {
10
+ reservedConcurrency: number;
11
+ environment: {
12
+ ENVIRONMENT: Environment;
13
+ };
14
+ };
15
+ sourceSnsTopicArn: string;
16
+ }
17
+
18
+ export const configs: Record<Environment, Config> = {
19
+ dev: {
20
+ appName: '<%- serviceName %>',
21
+ workerLambda: {
22
+ reservedConcurrency: 2,
23
+ environment: {
24
+ ENVIRONMENT: 'dev',
25
+ },
26
+ },
27
+ sourceSnsTopicArn: 'TODO: sourceSnsTopicArn',
28
+ },
29
+ prod: {
30
+ appName: '<%- serviceName %>',
31
+ workerLambda: {
32
+ reservedConcurrency: 20,
33
+ environment: {
34
+ ENVIRONMENT: 'prod',
35
+ },
36
+ },
37
+ sourceSnsTopicArn: 'TODO: sourceSnsTopicArn',
38
+ },
39
+ };
40
+
41
+ export const config = configs[environment];
@@ -1,14 +1,11 @@
1
1
  import { App } from 'aws-cdk-lib';
2
2
 
3
- import { GlobalContextSchema } from '../shared/context-types';
4
-
5
3
  import { AppStack } from './appStack';
4
+ import { config } from './config';
6
5
 
7
6
  const app = new App();
8
7
 
9
- const context = GlobalContextSchema.parse(app.node.tryGetContext('global'));
10
-
11
8
  // eslint-disable-next-line no-new
12
9
  new AppStack(app, 'appStack', {
13
- stackName: context.appName,
10
+ stackName: config.appName,
14
11
  });
@@ -2,7 +2,7 @@
2
2
  "private": true,
3
3
  "license": "UNLICENSED",
4
4
  "scripts": {
5
- "deploy": "cdk deploy appStack --require-approval never --context stage=${ENVIRONMENT}",
5
+ "deploy": "cdk deploy appStack --require-approval never",
6
6
  "deploy:hotswap": "pnpm --silent deploy --hotswap",
7
7
  "deploy:watch": "pnpm --silent deploy:hotswap --watch",
8
8
  "format": "skuba format",
@@ -26,7 +26,7 @@
26
26
  "constructs": "^10.0.17",
27
27
  "skuba": "*"
28
28
  },
29
- "packageManager": "pnpm@8.15.6",
29
+ "packageManager": "pnpm@9.0.2",
30
30
  "engines": {
31
31
  "node": ">=20"
32
32
  }
@@ -1,2 +0,0 @@
1
- import type { Patches } from '../..';
2
- export declare const patches: Patches;
@@ -1,35 +0,0 @@
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
@@ -1,7 +0,0 @@
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
- }
@@ -1,2 +0,0 @@
1
- import type { PatchFunction } from '../..';
2
- export declare const tryPatchPnpmPackageManager: PatchFunction;