skuba 14.0.0-migrate-to-inquirer-20251031055743 → 14.0.0-node-24-20251204121724

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 (109) hide show
  1. package/lib/cli/adapter/eslint.js +3 -3
  2. package/lib/cli/adapter/eslint.js.map +3 -3
  3. package/lib/cli/build/assets.d.ts +3 -2
  4. package/lib/cli/build/assets.js +2 -2
  5. package/lib/cli/build/assets.js.map +3 -3
  6. package/lib/cli/build/index.js +3 -13
  7. package/lib/cli/build/index.js.map +3 -3
  8. package/lib/cli/build/tsc.js +1 -2
  9. package/lib/cli/build/tsc.js.map +2 -2
  10. package/lib/cli/configure/analysis/diff.js +3 -13
  11. package/lib/cli/configure/analysis/diff.js.map +3 -3
  12. package/lib/cli/configure/ensureTemplateCompletion.js +5 -2
  13. package/lib/cli/configure/ensureTemplateCompletion.js.map +3 -3
  14. package/lib/cli/configure/getEntryPoint.js +3 -3
  15. package/lib/cli/configure/getEntryPoint.js.map +3 -3
  16. package/lib/cli/configure/index.js +3 -3
  17. package/lib/cli/configure/index.js.map +2 -2
  18. package/lib/cli/format/index.js +4 -14
  19. package/lib/cli/format/index.js.map +3 -3
  20. package/lib/cli/init/getConfig.js +22 -25
  21. package/lib/cli/init/getConfig.js.map +3 -3
  22. package/lib/cli/init/prompts.d.ts +4 -4
  23. package/lib/cli/init/prompts.js +8 -8
  24. package/lib/cli/init/prompts.js.map +2 -2
  25. package/lib/cli/lint/eslint.js +2 -2
  26. package/lib/cli/lint/eslint.js.map +3 -3
  27. package/lib/cli/lint/index.js +1 -3
  28. package/lib/cli/lint/index.js.map +2 -2
  29. package/lib/cli/lint/internal.js +6 -14
  30. package/lib/cli/lint/internal.js.map +3 -3
  31. package/lib/cli/lint/internalLints/noSkubaTemplateJs.js +1 -3
  32. package/lib/cli/lint/internalLints/noSkubaTemplateJs.js.map +2 -2
  33. package/lib/cli/lint/internalLints/refreshConfigFiles.js +1 -3
  34. package/lib/cli/lint/internalLints/refreshConfigFiles.js.map +2 -2
  35. package/lib/cli/lint/internalLints/upgrade/index.js +1 -3
  36. package/lib/cli/lint/internalLints/upgrade/index.js.map +2 -2
  37. package/lib/cli/lint/internalLints/upgrade/patches/10.1.0/migrateNpmrcToPnpmWorkspace.js +14 -11
  38. package/lib/cli/lint/internalLints/upgrade/patches/10.1.0/migrateNpmrcToPnpmWorkspace.js.map +2 -2
  39. package/lib/cli/lint/internalLints/upgrade/patches/{9.1.0 → 13.1.1}/index.js +1 -1
  40. package/lib/cli/lint/internalLints/upgrade/patches/{9.1.0 → 13.1.1}/index.js.map +3 -3
  41. package/lib/cli/lint/internalLints/upgrade/patches/{9.1.0 → 13.1.1}/upgradeNode.js +2 -5
  42. package/lib/cli/lint/internalLints/upgrade/patches/13.1.1/upgradeNode.js.map +7 -0
  43. package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/index.js +0 -5
  44. package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/index.js.map +2 -2
  45. package/lib/cli/lint/prettier.js +2 -2
  46. package/lib/cli/lint/prettier.js.map +3 -3
  47. package/lib/cli/migrate/index.d.ts +5 -0
  48. package/lib/cli/migrate/index.js +38 -6
  49. package/lib/cli/migrate/index.js.map +2 -2
  50. package/lib/cli/migrate/nodeVersion/checks.d.ts +1 -14
  51. package/lib/cli/migrate/nodeVersion/checks.js +24 -133
  52. package/lib/cli/migrate/nodeVersion/checks.js.map +3 -3
  53. package/lib/cli/migrate/nodeVersion/index.d.ts +8 -2
  54. package/lib/cli/migrate/nodeVersion/index.js +187 -47
  55. package/lib/cli/migrate/nodeVersion/index.js.map +2 -2
  56. package/lib/cli/migrate/nodeVersion/upgrade.d.ts +8 -0
  57. package/lib/cli/migrate/nodeVersion/upgrade.js +144 -0
  58. package/lib/cli/migrate/nodeVersion/upgrade.js.map +7 -0
  59. package/lib/utils/exec.d.ts +3 -2
  60. package/lib/utils/exec.js +1 -1
  61. package/lib/utils/exec.js.map +2 -2
  62. package/lib/utils/fs.js +1 -1
  63. package/lib/utils/fs.js.map +2 -2
  64. package/lib/utils/logging.d.ts +9 -10
  65. package/lib/utils/logging.js +9 -19
  66. package/lib/utils/logging.js.map +3 -3
  67. package/lib/utils/logo.js +11 -18
  68. package/lib/utils/logo.js.map +3 -3
  69. package/lib/utils/worker.d.ts +3 -3
  70. package/lib/wrapper/http.d.ts +0 -6
  71. package/lib/wrapper/http.js +4 -12
  72. package/lib/wrapper/http.js.map +2 -2
  73. package/lib/wrapper/requestListener.js +3 -2
  74. package/lib/wrapper/requestListener.js.map +2 -2
  75. package/lib/wrapper/server.d.ts +7 -0
  76. package/lib/wrapper/server.js +35 -0
  77. package/lib/wrapper/server.js.map +7 -0
  78. package/package.json +16 -26
  79. package/template/base/_pnpm-workspace.yaml +2 -0
  80. package/template/express-rest-api/.buildkite/pipeline.yml +1 -1
  81. package/template/express-rest-api/.nvmrc +1 -1
  82. package/template/express-rest-api/package.json +6 -6
  83. package/template/greeter/.buildkite/pipeline.yml +1 -1
  84. package/template/greeter/.nvmrc +1 -1
  85. package/template/greeter/package.json +4 -4
  86. package/template/koa-rest-api/.buildkite/pipeline.yml +1 -1
  87. package/template/koa-rest-api/.nvmrc +1 -1
  88. package/template/koa-rest-api/package.json +6 -6
  89. package/template/lambda-sqs-worker-cdk/.buildkite/pipeline.yml +2 -2
  90. package/template/lambda-sqs-worker-cdk/.nvmrc +1 -1
  91. package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +2 -4
  92. package/template/lambda-sqs-worker-cdk/infra/appStack.ts +1 -1
  93. package/template/lambda-sqs-worker-cdk/infra/config.ts +2 -4
  94. package/template/lambda-sqs-worker-cdk/package.json +5 -4
  95. package/template/lambda-sqs-worker-cdk/skuba.template.js +12 -0
  96. package/template/oss-npm-package/.github/workflows/release.yml +1 -1
  97. package/template/oss-npm-package/.github/workflows/validate.yml +1 -1
  98. package/template/oss-npm-package/.nvmrc +1 -1
  99. package/template/private-npm-package/.nvmrc +1 -1
  100. package/template/private-npm-package/_package.json +1 -1
  101. package/template/private-npm-package/skuba.template.js +1 -1
  102. package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.d.ts +0 -2
  103. package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.js +0 -144
  104. package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.js.map +0 -7
  105. package/lib/cli/lint/internalLints/upgrade/patches/9.1.0/upgradeNode.js.map +0 -7
  106. package/lib/eslint.d.js +0 -2
  107. package/lib/eslint.d.js.map +0 -7
  108. /package/lib/cli/lint/internalLints/upgrade/patches/{9.1.0 → 13.1.1}/index.d.ts +0 -0
  109. /package/lib/cli/lint/internalLints/upgrade/patches/{9.1.0 → 13.1.1}/upgradeNode.d.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/migrate/nodeVersion/checks.ts"],
4
- "sourcesContent": ["import findUp from 'find-up';\nimport fs from 'fs-extra';\nimport { coerce, lte, satisfies } from 'semver';\nimport * as z from 'zod/v4';\n\nimport { log } from '../../../utils/logging.js';\n\nconst getParentFile = async (file: string, cwd: string = process.cwd()) => {\n const path = await findUp(file, { cwd });\n if (!path) {\n return undefined;\n }\n return {\n fileContent: await fs.readFile(path, 'utf-8'),\n path,\n };\n};\n\nexport const extractFromParentPackageJson = async <T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n currentPath: string,\n) => {\n const file = await getParentFile('package.json', currentPath);\n if (!file) {\n return { packageJson: undefined, packageJsonRelativePath: undefined };\n }\n const { fileContent: packageJson, path } = file;\n let rawJSON;\n try {\n rawJSON = JSON.parse(packageJson) as unknown;\n } catch {\n throw new Error(`${path} is not valid JSON`);\n }\n const result = schema.safeParse(rawJSON);\n if (!result.success) {\n return { packageJson: undefined, packageJsonRelativePath: path };\n }\n\n return { packageJson: result.data, packageJsonRelativePath: path };\n};\n\nexport const isPatchableServerlessVersion = async (\n currentPath: string,\n): Promise<boolean> => {\n const { packageJson, packageJsonRelativePath } =\n await extractFromParentPackageJson(\n z.object({\n devDependencies: z.object({\n serverless: z.string().optional(),\n }),\n }),\n currentPath,\n );\n if (!packageJson) {\n log.warn('package.json not found, ensure it is in the correct location');\n return false;\n }\n\n const serverlessVersion = packageJson?.devDependencies.serverless;\n\n if (!serverlessVersion) {\n log.subtle(\n `Serverless version not found in ${packageJsonRelativePath}, assuming it is not a dependency`,\n );\n return true;\n }\n\n if (!satisfies(serverlessVersion, '4.x.x')) {\n log.warn(\n `Serverless version ${serverlessVersion} cannot be migrated; use Serverless 4.x to automatically migrate Serverless files`,\n );\n return false;\n }\n\n log.ok(\n `Proceeding with migration of Serverless version ${serverlessVersion}`,\n );\n return true;\n};\n\nexport const isPatchableSkubaType = async (\n currentPath: string,\n): Promise<boolean> => {\n const { packageJson, packageJsonRelativePath } =\n await extractFromParentPackageJson(\n z.object({\n skuba: z\n .object({\n type: z.string().optional(),\n })\n .optional(),\n files: z.string().array().optional(),\n }),\n currentPath,\n );\n\n if (!packageJson) {\n log.warn('package.json not found, ensure it is in the correct location');\n return false;\n }\n\n if (packageJson.files) {\n log.warn(\n 'Migrations are not supported for packages; update manually to ensure major runtime deprecations are intended',\n );\n return false;\n }\n\n const type = packageJson?.skuba?.type;\n\n if (!type) {\n log.warn(\n `skuba project type not found in ${packageJsonRelativePath}; add a package.json#/skuba/type to ensure the correct migration can be applied`,\n );\n return false;\n }\n if (type === 'package') {\n log.warn(\n 'Migrations are not supported for packages; update manually to ensure major runtime deprecations are intended',\n );\n return false;\n }\n\n log.ok(`Proceeding with migration of skuba project type ${type}`);\n return true;\n};\n\nexport const isPatchableNodeVersion = async (\n targetNodeVersion: number,\n currentPath: string,\n): Promise<boolean> => {\n const nvmrcFile = await getParentFile('.nvmrc');\n const nodeVersionFile = await getParentFile('.node-version');\n const { packageJson } = await extractFromParentPackageJson(\n z.object({\n engines: z.object({\n node: z.string(),\n }),\n }),\n currentPath,\n );\n\n const nvmrcNodeVersion = nvmrcFile?.fileContent;\n const nodeVersion = nodeVersionFile?.fileContent;\n const engineVersion = packageJson?.engines.node;\n\n const currentNodeVersion = nvmrcNodeVersion || nodeVersion || engineVersion;\n\n const coercedTargetVersion = coerce(targetNodeVersion.toString())?.version;\n const coercedCurrentVersion = coerce(currentNodeVersion)?.version;\n\n const isNodeVersionValid =\n coercedTargetVersion &&\n coercedCurrentVersion &&\n lte(coercedCurrentVersion, coercedTargetVersion);\n\n if (!isNodeVersionValid) {\n log.warn(\n `Node.js version ${coercedCurrentVersion ?? 'unknown'} cannot be migrated to ${coercedTargetVersion}`,\n );\n return false;\n }\n\n log.ok(\n `Proceeding with migration from Node.js ${coercedCurrentVersion} to ${coercedTargetVersion}`,\n );\n return true;\n};\n"],
5
- "mappings": "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",
6
- "names": ["findUp", "fs"]
4
+ "sourcesContent": ["import { log } from '../../../utils/logging.js';\nimport { getConsumerManifest } from '../../../utils/manifest.js';\nimport type { SkubaPackageJson } from '../../init/writePackageJson.js';\n\nexport const isLikelyPackage = async (\n currentPath: string,\n): Promise<boolean> => {\n const nearestPackageJsonResult = await getConsumerManifest(currentPath);\n if (!nearestPackageJsonResult) {\n log.warn('package.json not found');\n return false;\n }\n\n const { packageJson } = nearestPackageJsonResult;\n\n const type = (packageJson.skuba as SkubaPackageJson)?.type;\n\n if (type === 'application') {\n return false;\n }\n\n if (type === 'package') {\n return true;\n }\n\n if (typeof packageJson.sideEffects === 'boolean') {\n return true;\n }\n\n if (\n typeof packageJson.types === 'string' &&\n typeof packageJson.module === 'string' &&\n typeof packageJson.main === 'string'\n ) {\n return true;\n }\n\n if (typeof packageJson.exports === 'object') {\n return true;\n }\n\n if (typeof packageJson.types === 'string') {\n return true;\n }\n\n if (typeof packageJson.module === 'string') {\n return true;\n }\n\n // private true would imply this is either an internal package or application\n // either way internal packages would normally be not published or bundled in by an application within the repo\n // so we can safely assume it is a package for migration purposes\n if (packageJson.private === true) {\n return false;\n }\n\n return false;\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,sBAAoC;AAG7B,MAAM,kBAAkB,OAC7B,gBACqB;AACrB,QAAM,2BAA2B,UAAM,qCAAoB,WAAW;AACtE,MAAI,CAAC,0BAA0B;AAC7B,uBAAI,KAAK,wBAAwB;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,YAAY,IAAI;AAExB,QAAM,OAAQ,YAAY,OAA4B;AAEtD,MAAI,SAAS,eAAe;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,gBAAgB,WAAW;AAChD,WAAO;AAAA,EACT;AAEA,MACE,OAAO,YAAY,UAAU,YAC7B,OAAO,YAAY,WAAW,YAC9B,OAAO,YAAY,SAAS,UAC5B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,UAAU,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,WAAW,UAAU;AAC1C,WAAO;AAAA,EACT;AAKA,MAAI,YAAY,YAAY,MAAM;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;",
6
+ "names": []
7
7
  }
@@ -1,4 +1,10 @@
1
- export declare const nodeVersionMigration: ({ nodeVersion, ECMAScriptVersion, }: {
2
- nodeVersion: number;
1
+ export declare const nodeVersionMigration: ({ nodeVersion, ECMAScriptVersion, packageNodeVersion, packageEMCAScriptVersion, infraPackages, }: {
2
+ nodeVersion: string;
3
3
  ECMAScriptVersion: string;
4
+ packageNodeVersion: string;
5
+ packageEMCAScriptVersion: string;
6
+ infraPackages: Array<{
7
+ name: string;
8
+ version: string;
9
+ }>;
4
10
  }, dir?: string) => Promise<void>;
@@ -34,81 +34,199 @@ module.exports = __toCommonJS(nodeVersion_exports);
34
34
  var import_util = require("util");
35
35
  var import_fast_glob = require("fast-glob");
36
36
  var import_fs_extra = __toESM(require("fs-extra"));
37
+ var import_semver = require("semver");
37
38
  var import_logging = require("../../../utils/logging.js");
38
39
  var import_project = require("../../configure/analysis/project.js");
39
40
  var import_checks = require("./checks.js");
41
+ var import_upgrade = require("./upgrade.js");
40
42
  const subPatches = ({
41
43
  nodeVersion,
42
- ECMAScriptVersion
44
+ ECMAScriptVersion,
45
+ packageEMCAScriptVersion,
46
+ packageNodeVersion
43
47
  }) => [
44
- { file: ".nvmrc", replace: `${nodeVersion}
45
- ` },
46
48
  {
49
+ type: "nodejs",
50
+ file: ".nvmrc",
51
+ regex: () => /.*([0-9.]+).*/gm,
52
+ replace: {
53
+ default: {
54
+ captureGroup: 1,
55
+ string: nodeVersion,
56
+ version: nodeVersion
57
+ }
58
+ }
59
+ },
60
+ {
61
+ type: "nodejs",
47
62
  files: "**/Dockerfile*",
48
63
  regex: () => /^FROM(.*) (public.ecr.aws\/docker\/library\/)?node:([0-9]+(?:\.[0-9]+(?:\.[0-9]+)?)?)(-[a-z0-9]+)?(@sha256:[a-f0-9]{64})?( .*)?$/gm,
49
- replace: `FROM$1 $2node:${nodeVersion}$4$6`
64
+ replace: {
65
+ default: {
66
+ captureGroup: 3,
67
+ string: `FROM$1 $2node:${nodeVersion}$4$6`,
68
+ version: nodeVersion
69
+ }
70
+ }
50
71
  },
51
72
  {
73
+ type: "nodejs",
52
74
  files: "**/Dockerfile*",
53
- regex: () => /^FROM(.*) gcr.io\/distroless\/nodejs\d+-debian(\d+)(@sha256:[a-f0-9]{64})?(\.[^- \n]+)?(-[^ \n]+)?( .+|)$/gm,
54
- replace: `FROM$1 gcr.io/distroless/nodejs${nodeVersion}-debian$2$4$5$6`
75
+ regex: () => /^FROM(.*) gcr.io\/distroless\/nodejs(\d+)-debian(\d+)(@sha256:[a-f0-9]{64})?(\.[^- \n]+)?(-[^ \n]+)?( .+|)$/gm,
76
+ replace: {
77
+ default: {
78
+ captureGroup: 2,
79
+ string: `FROM$1 gcr.io/distroless/nodejs${nodeVersion}-debian$3$6$7`,
80
+ version: nodeVersion
81
+ }
82
+ }
55
83
  },
56
84
  {
85
+ type: "nodejs",
57
86
  files: "**/serverless*.y*ml",
58
- regex: () => /\bnodejs\d+.x\b/gm,
59
- tests: [import_checks.isPatchableServerlessVersion],
60
- replace: `nodejs${nodeVersion}.x`
87
+ regex: () => /\bnodejs(\d+).x\b/gm,
88
+ replace: {
89
+ default: {
90
+ captureGroup: 1,
91
+ string: `nodejs${nodeVersion}.x`,
92
+ version: nodeVersion
93
+ }
94
+ }
61
95
  },
62
96
  {
97
+ type: "nodejs",
63
98
  files: "**/serverless*.y*ml",
64
- regex: () => /\bnode\d+\b/gm,
65
- tests: [import_checks.isPatchableServerlessVersion],
66
- replace: `node${nodeVersion}`
99
+ regex: () => /\bnode(\d+)\b/gm,
100
+ replace: {
101
+ default: {
102
+ captureGroup: 1,
103
+ string: `node${nodeVersion}`,
104
+ version: nodeVersion
105
+ }
106
+ }
67
107
  },
68
108
  {
109
+ type: "nodejs",
69
110
  files: "**/infra/**/*.ts",
70
- regex: () => /NODEJS_\d+_X/g,
71
- replace: `NODEJS_${nodeVersion}_X`
111
+ regex: () => /NODEJS_(\d+)_X/g,
112
+ replace: {
113
+ default: {
114
+ captureGroup: 1,
115
+ string: `NODEJS_${nodeVersion}_X`,
116
+ version: nodeVersion
117
+ }
118
+ }
72
119
  },
73
120
  {
121
+ type: "nodejs",
74
122
  files: "**/infra/**/*.ts",
75
123
  regex: () => /(target:\s*'node)(\d+)(.+)$/gm,
76
- replace: `$1${nodeVersion}$3`
124
+ replace: {
125
+ default: {
126
+ captureGroup: 2,
127
+ string: `$1${nodeVersion}$3`,
128
+ version: nodeVersion
129
+ }
130
+ }
77
131
  },
78
132
  {
133
+ type: "nodejs",
79
134
  files: "**/.buildkite/*",
80
- regex: () => /(image: )(public.ecr.aws\/docker\/library\/)?(node:)[0-9.]+(\.[^- \n]+)?(-[^ \n]+)?$/gm,
81
- replace: `$1$2$3${nodeVersion}$5`
135
+ regex: () => /(image: )(public.ecr.aws\/docker\/library\/)?(node:)([0-9.]+)(\.[^- \n]+)?(-[^ \n]+)?$/gm,
136
+ replace: {
137
+ default: {
138
+ captureGroup: 4,
139
+ string: `$1$2$3${nodeVersion}$5$6`,
140
+ version: nodeVersion
141
+ }
142
+ }
82
143
  },
83
144
  {
145
+ type: "nodejs",
84
146
  files: ".node-version*",
85
147
  regex: () => /(\d+(?:\.\d+)*)/g,
86
- replace: `${nodeVersion}`
148
+ replace: {
149
+ default: {
150
+ captureGroup: 1,
151
+ string: `${nodeVersion}`,
152
+ version: nodeVersion
153
+ }
154
+ }
87
155
  },
88
156
  {
157
+ type: "nodejs",
89
158
  files: "**/package.json",
90
159
  regex: () => /(["']engines["']:\s*{[\s\S]*?["']node["']:\s*["']>=)(\d+(?:\.\d+)*)(['"]\s*})/gm,
91
- tests: [import_checks.isPatchableServerlessVersion, import_checks.isPatchableSkubaType],
92
- replace: `$1${nodeVersion}$3`
160
+ replace: {
161
+ package: {
162
+ string: `$1${packageNodeVersion}$3`,
163
+ version: packageNodeVersion,
164
+ captureGroup: 2
165
+ },
166
+ default: {
167
+ string: `$1${nodeVersion}$3`,
168
+ version: nodeVersion,
169
+ captureGroup: 2
170
+ }
171
+ }
93
172
  },
94
173
  {
174
+ type: "nodejs",
175
+ files: "**/docker-compose*.y*ml",
176
+ regex: () => /(image: )(public.ecr.aws\/docker\/library\/)?(node:)([0-9.]+)(\.[^- \n]+)?(-[^ \n]+)?$/gm,
177
+ replace: {
178
+ default: {
179
+ captureGroup: 4,
180
+ string: `$1$2$3${nodeVersion}$5$6`,
181
+ version: nodeVersion
182
+ }
183
+ }
184
+ },
185
+ {
186
+ type: "emcascript",
95
187
  files: "**/tsconfig*.json",
96
188
  regex: () => /("target":\s*")(ES\d+)"/gim,
97
- tests: [import_checks.isPatchableServerlessVersion, import_checks.isPatchableSkubaType],
98
- replace: `$1${ECMAScriptVersion}"`
189
+ replace: {
190
+ package: {
191
+ string: `$1${packageEMCAScriptVersion}"`,
192
+ version: packageEMCAScriptVersion,
193
+ captureGroup: 2
194
+ },
195
+ default: {
196
+ string: `$1${ECMAScriptVersion}"`,
197
+ version: ECMAScriptVersion,
198
+ captureGroup: 2
199
+ }
200
+ }
99
201
  },
100
202
  {
203
+ type: "emcascript",
101
204
  files: "**/tsconfig*.json",
102
205
  regex: () => /("lib":\s*\[)([\S\s]*?)(ES\d+)([\S\s]*?)(\])/gim,
103
- tests: [import_checks.isPatchableServerlessVersion, import_checks.isPatchableSkubaType],
104
- replace: `$1$2${ECMAScriptVersion}$4$5`
105
- },
106
- {
107
- files: "**/docker-compose*.y*ml",
108
- regex: () => /(image: )(public.ecr.aws\/docker\/library\/)?(node:)[0-9.]+(\.[^- \n]+)?(-[^ \n]+)?$/gm,
109
- replace: `$1$2$3${nodeVersion}$5`
206
+ replace: {
207
+ package: {
208
+ string: `$1$2${packageEMCAScriptVersion}$4$5`,
209
+ version: packageEMCAScriptVersion,
210
+ captureGroup: 3
211
+ },
212
+ default: {
213
+ string: `$1$2${ECMAScriptVersion}$4$5`,
214
+ version: ECMAScriptVersion,
215
+ captureGroup: 3
216
+ }
217
+ }
110
218
  }
111
219
  ];
220
+ const getTemplatedReplace = async (path, replace) => {
221
+ if (!replace.package) {
222
+ return replace.default;
223
+ }
224
+ const isPackage = await (0, import_checks.isLikelyPackage)(path);
225
+ if (isPackage) {
226
+ return replace.package;
227
+ }
228
+ return replace.default;
229
+ };
112
230
  const runSubPatch = async (dir, patch) => {
113
231
  const readFile = (0, import_project.createDestinationFileReader)(dir);
114
232
  const paths = patch.file ? [patch.file] : await (0, import_fast_glob.glob)(patch.files ?? [], {
@@ -121,35 +239,48 @@ const runSubPatch = async (dir, patch) => {
121
239
  if (!contents) {
122
240
  return;
123
241
  }
124
- if (patch.regex && !patch.regex().test(contents)) {
242
+ const regexResult = patch.regex().exec(contents);
243
+ if (!regexResult) {
125
244
  return;
126
245
  }
127
- if (patch.tests) {
128
- const results = await Promise.all(
129
- patch.tests.map((test) => test(path))
130
- );
131
- if (!results.every(Boolean)) {
132
- return;
133
- }
246
+ const templateReplace = await getTemplatedReplace(path, patch.replace);
247
+ if (!lessThan(
248
+ regexResult[templateReplace.captureGroup],
249
+ templateReplace.version
250
+ )) {
251
+ return;
134
252
  }
135
253
  await writePatchedContents({
136
254
  path,
137
255
  contents,
138
- templated: patch.replace,
256
+ templated: templateReplace.string,
139
257
  regex: patch.regex
140
258
  });
141
259
  })
142
260
  );
143
261
  };
262
+ const lessThan = (versionA, versionB) => {
263
+ if (versionA.toLowerCase().startsWith("es")) {
264
+ return Number(versionA.slice(2)) < Number(versionB.slice(2));
265
+ }
266
+ const coersedA = (0, import_semver.coerce)(versionA);
267
+ const coersedB = (0, import_semver.coerce)(versionB);
268
+ if (!coersedA || !coersedB) {
269
+ throw new Error(
270
+ `Unable to coerce versions for comparison: "${versionA}" and "${versionB}"`
271
+ );
272
+ }
273
+ return (0, import_semver.lt)(coersedA, coersedB);
274
+ };
144
275
  const writePatchedContents = async ({
145
276
  path,
146
277
  contents,
147
278
  templated,
148
279
  regex
149
- }) => await import_fs_extra.default.promises.writeFile(
150
- path,
151
- regex ? contents.replaceAll(regex(), templated) : templated
152
- );
280
+ }) => {
281
+ const modified = contents.replaceAll(regex(), templated);
282
+ await import_fs_extra.default.promises.writeFile(path, modified);
283
+ };
153
284
  const upgrade = async (versions, dir) => {
154
285
  for (const subPatch of subPatches(versions)) {
155
286
  await runSubPatch(dir, subPatch);
@@ -157,14 +288,23 @@ const upgrade = async (versions, dir) => {
157
288
  };
158
289
  const nodeVersionMigration = async ({
159
290
  nodeVersion,
160
- ECMAScriptVersion
291
+ ECMAScriptVersion,
292
+ packageNodeVersion,
293
+ packageEMCAScriptVersion,
294
+ infraPackages
161
295
  }, dir = process.cwd()) => {
162
296
  import_logging.log.ok(`Upgrading to Node.js ${nodeVersion}`);
163
297
  try {
164
- if (!await (0, import_checks.isPatchableNodeVersion)(nodeVersion, dir)) {
165
- throw new Error("Node.js version is not patchable");
166
- }
167
- await upgrade({ nodeVersion, ECMAScriptVersion }, dir);
298
+ await (0, import_upgrade.upgradeInfraPackages)("format", infraPackages);
299
+ await upgrade(
300
+ {
301
+ nodeVersion,
302
+ ECMAScriptVersion,
303
+ packageNodeVersion,
304
+ packageEMCAScriptVersion
305
+ },
306
+ dir
307
+ );
168
308
  import_logging.log.ok("Upgraded to Node.js", nodeVersion);
169
309
  } catch (error) {
170
310
  import_logging.log.err("Failed to upgrade");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/migrate/nodeVersion/index.ts"],
4
- "sourcesContent": ["import { inspect } from 'util';\n\nimport { glob } from 'fast-glob';\nimport fs from 'fs-extra';\n\nimport { log } from '../../../utils/logging.js';\nimport { createDestinationFileReader } from '../../configure/analysis/project.js';\n\nimport {\n isPatchableNodeVersion,\n isPatchableServerlessVersion,\n isPatchableSkubaType,\n} from './checks.js';\n\ntype FileSelector =\n | { files: string; file?: never }\n | { file: string; files?: never };\n\ntype SubPatch = FileSelector & {\n tests?: Array<(path: string) => Promise<boolean>>;\n regex?: () => RegExp;\n replace: string;\n};\n\nconst subPatches = ({\n nodeVersion,\n ECMAScriptVersion,\n}: Versions): SubPatch[] => [\n { file: '.nvmrc', replace: `${nodeVersion}\\n` },\n {\n files: '**/Dockerfile*',\n\n regex: () =>\n /^FROM(.*) (public.ecr.aws\\/docker\\/library\\/)?node:([0-9]+(?:\\.[0-9]+(?:\\.[0-9]+)?)?)(-[a-z0-9]+)?(@sha256:[a-f0-9]{64})?( .*)?$/gm,\n replace: `FROM$1 $2node:${nodeVersion}$4$6`,\n },\n {\n files: '**/Dockerfile*',\n regex: () =>\n /^FROM(.*) gcr.io\\/distroless\\/nodejs\\d+-debian(\\d+)(@sha256:[a-f0-9]{64})?(\\.[^- \\n]+)?(-[^ \\n]+)?( .+|)$/gm,\n replace: `FROM$1 gcr.io/distroless/nodejs${nodeVersion}-debian$2$4$5$6`,\n },\n\n {\n files: '**/serverless*.y*ml',\n regex: () => /\\bnodejs\\d+.x\\b/gm,\n tests: [isPatchableServerlessVersion],\n replace: `nodejs${nodeVersion}.x`,\n },\n {\n files: '**/serverless*.y*ml',\n regex: () => /\\bnode\\d+\\b/gm,\n tests: [isPatchableServerlessVersion],\n replace: `node${nodeVersion}`,\n },\n\n {\n files: '**/infra/**/*.ts',\n regex: () => /NODEJS_\\d+_X/g,\n replace: `NODEJS_${nodeVersion}_X`,\n },\n {\n files: '**/infra/**/*.ts',\n regex: () => /(target:\\s*'node)(\\d+)(.+)$/gm,\n replace: `$1${nodeVersion}$3`,\n },\n\n {\n files: '**/.buildkite/*',\n regex: () =>\n /(image: )(public.ecr.aws\\/docker\\/library\\/)?(node:)[0-9.]+(\\.[^- \\n]+)?(-[^ \\n]+)?$/gm,\n replace: `$1$2$3${nodeVersion}$5`,\n },\n {\n files: '.node-version*',\n regex: () => /(\\d+(?:\\.\\d+)*)/g,\n replace: `${nodeVersion}`,\n },\n\n {\n files: '**/package.json',\n regex: () =>\n /([\"']engines[\"']:\\s*{[\\s\\S]*?[\"']node[\"']:\\s*[\"']>=)(\\d+(?:\\.\\d+)*)(['\"]\\s*})/gm,\n tests: [isPatchableServerlessVersion, isPatchableSkubaType],\n replace: `$1${nodeVersion}$3`,\n },\n\n {\n files: '**/tsconfig*.json',\n regex: () => /(\"target\":\\s*\")(ES\\d+)\"/gim,\n tests: [isPatchableServerlessVersion, isPatchableSkubaType],\n replace: `$1${ECMAScriptVersion}\"`,\n },\n {\n files: '**/tsconfig*.json',\n regex: () => /(\"lib\":\\s*\\[)([\\S\\s]*?)(ES\\d+)([\\S\\s]*?)(\\])/gim,\n tests: [isPatchableServerlessVersion, isPatchableSkubaType],\n replace: `$1$2${ECMAScriptVersion}$4$5`,\n },\n\n {\n files: '**/docker-compose*.y*ml',\n regex: () =>\n /(image: )(public.ecr.aws\\/docker\\/library\\/)?(node:)[0-9.]+(\\.[^- \\n]+)?(-[^ \\n]+)?$/gm,\n\n replace: `$1$2$3${nodeVersion}$5`,\n },\n];\n\ntype Versions = {\n nodeVersion: number;\n ECMAScriptVersion: string;\n};\n\nconst runSubPatch = async (dir: string, patch: SubPatch) => {\n const readFile = createDestinationFileReader(dir);\n const paths = patch.file\n ? [patch.file]\n : await glob(patch.files ?? [], {\n cwd: dir,\n ignore: ['**/node_modules/**'],\n });\n\n await Promise.all(\n paths.map(async (path) => {\n const contents = await readFile(path);\n if (!contents) {\n return;\n }\n\n if (patch.regex && !patch.regex().test(contents)) {\n return;\n }\n\n if (patch.tests) {\n const results = await Promise.all(\n patch.tests.map((test) => test(path)),\n );\n if (!results.every(Boolean)) {\n return;\n }\n }\n\n await writePatchedContents({\n path,\n contents,\n templated: patch.replace,\n regex: patch.regex,\n });\n }),\n );\n};\n\nconst writePatchedContents = async ({\n path,\n contents,\n templated,\n regex,\n}: {\n path: string;\n contents: string;\n templated: string;\n regex?: () => RegExp;\n}) =>\n await fs.promises.writeFile(\n path,\n regex ? contents.replaceAll(regex(), templated) : templated,\n );\n\nconst upgrade = async (versions: Versions, dir: string) => {\n for (const subPatch of subPatches(versions)) {\n await runSubPatch(dir, subPatch);\n }\n};\n\nexport const nodeVersionMigration = async (\n {\n nodeVersion,\n ECMAScriptVersion,\n }: {\n nodeVersion: number;\n ECMAScriptVersion: string;\n },\n dir = process.cwd(),\n) => {\n log.ok(`Upgrading to Node.js ${nodeVersion}`);\n try {\n if (!(await isPatchableNodeVersion(nodeVersion, dir))) {\n throw new Error('Node.js version is not patchable');\n }\n\n await upgrade({ nodeVersion, ECMAScriptVersion }, dir);\n\n log.ok('Upgraded to Node.js', nodeVersion);\n } catch (error) {\n log.err('Failed to upgrade');\n log.subtle(inspect(error));\n process.exitCode = 1;\n }\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { inspect } from 'util';\n\nimport { glob } from 'fast-glob';\nimport fs from 'fs-extra';\nimport { coerce, lt } from 'semver';\n\nimport { log } from '../../../utils/logging.js';\nimport { createDestinationFileReader } from '../../configure/analysis/project.js';\n\nimport { isLikelyPackage } from './checks.js';\nimport { upgradeInfraPackages } from './upgrade.js';\n\ntype FileSelector =\n | { files: string; file?: never }\n | { file: string; files?: never };\n\ntype ReplaceOptions = {\n version: string;\n string: string;\n captureGroup: number;\n};\n\ntype SubPatch = FileSelector & {\n type: 'nodejs' | 'emcascript';\n regex: () => RegExp;\n replace: {\n package?: ReplaceOptions;\n default: ReplaceOptions;\n };\n};\n\nconst subPatches = ({\n nodeVersion,\n ECMAScriptVersion,\n packageEMCAScriptVersion,\n packageNodeVersion,\n}: Versions): SubPatch[] => [\n {\n type: 'nodejs',\n file: '.nvmrc',\n regex: () => /.*([0-9.]+).*/gm,\n replace: {\n default: {\n captureGroup: 1,\n string: nodeVersion,\n version: nodeVersion,\n },\n },\n },\n {\n type: 'nodejs',\n files: '**/Dockerfile*',\n\n regex: () =>\n /^FROM(.*) (public.ecr.aws\\/docker\\/library\\/)?node:([0-9]+(?:\\.[0-9]+(?:\\.[0-9]+)?)?)(-[a-z0-9]+)?(@sha256:[a-f0-9]{64})?( .*)?$/gm,\n replace: {\n default: {\n captureGroup: 3,\n string: `FROM$1 $2node:${nodeVersion}$4$6`,\n version: nodeVersion,\n },\n },\n },\n {\n type: 'nodejs',\n files: '**/Dockerfile*',\n regex: () =>\n /^FROM(.*) gcr.io\\/distroless\\/nodejs(\\d+)-debian(\\d+)(@sha256:[a-f0-9]{64})?(\\.[^- \\n]+)?(-[^ \\n]+)?( .+|)$/gm,\n replace: {\n default: {\n captureGroup: 2,\n string: `FROM$1 gcr.io/distroless/nodejs${nodeVersion}-debian$3$6$7`,\n version: nodeVersion,\n },\n },\n },\n\n {\n type: 'nodejs',\n files: '**/serverless*.y*ml',\n regex: () => /\\bnodejs(\\d+).x\\b/gm,\n replace: {\n default: {\n captureGroup: 1,\n string: `nodejs${nodeVersion}.x`,\n version: nodeVersion,\n },\n },\n },\n {\n type: 'nodejs',\n files: '**/serverless*.y*ml',\n regex: () => /\\bnode(\\d+)\\b/gm,\n replace: {\n default: {\n captureGroup: 1,\n string: `node${nodeVersion}`,\n version: nodeVersion,\n },\n },\n },\n\n {\n type: 'nodejs',\n files: '**/infra/**/*.ts',\n regex: () => /NODEJS_(\\d+)_X/g,\n replace: {\n default: {\n captureGroup: 1,\n string: `NODEJS_${nodeVersion}_X`,\n version: nodeVersion,\n },\n },\n },\n {\n type: 'nodejs',\n files: '**/infra/**/*.ts',\n regex: () => /(target:\\s*'node)(\\d+)(.+)$/gm,\n replace: {\n default: {\n captureGroup: 2,\n string: `$1${nodeVersion}$3`,\n version: nodeVersion,\n },\n },\n },\n\n {\n type: 'nodejs',\n files: '**/.buildkite/*',\n regex: () =>\n /(image: )(public.ecr.aws\\/docker\\/library\\/)?(node:)([0-9.]+)(\\.[^- \\n]+)?(-[^ \\n]+)?$/gm,\n replace: {\n default: {\n captureGroup: 4,\n string: `$1$2$3${nodeVersion}$5$6`,\n version: nodeVersion,\n },\n },\n },\n {\n type: 'nodejs',\n files: '.node-version*',\n regex: () => /(\\d+(?:\\.\\d+)*)/g,\n replace: {\n default: {\n captureGroup: 1,\n string: `${nodeVersion}`,\n version: nodeVersion,\n },\n },\n },\n\n {\n type: 'nodejs',\n files: '**/package.json',\n regex: () =>\n /([\"']engines[\"']:\\s*{[\\s\\S]*?[\"']node[\"']:\\s*[\"']>=)(\\d+(?:\\.\\d+)*)(['\"]\\s*})/gm,\n replace: {\n package: {\n string: `$1${packageNodeVersion}$3`,\n version: packageNodeVersion,\n captureGroup: 2,\n },\n default: {\n string: `$1${nodeVersion}$3`,\n version: nodeVersion,\n captureGroup: 2,\n },\n },\n },\n {\n type: 'nodejs',\n files: '**/docker-compose*.y*ml',\n regex: () =>\n /(image: )(public.ecr.aws\\/docker\\/library\\/)?(node:)([0-9.]+)(\\.[^- \\n]+)?(-[^ \\n]+)?$/gm,\n\n replace: {\n default: {\n captureGroup: 4,\n string: `$1$2$3${nodeVersion}$5$6`,\n version: nodeVersion,\n },\n },\n },\n {\n type: 'emcascript',\n files: '**/tsconfig*.json',\n regex: () => /(\"target\":\\s*\")(ES\\d+)\"/gim,\n replace: {\n package: {\n string: `$1${packageEMCAScriptVersion}\"`,\n version: packageEMCAScriptVersion,\n captureGroup: 2,\n },\n default: {\n string: `$1${ECMAScriptVersion}\"`,\n version: ECMAScriptVersion,\n captureGroup: 2,\n },\n },\n },\n {\n type: 'emcascript',\n files: '**/tsconfig*.json',\n regex: () => /(\"lib\":\\s*\\[)([\\S\\s]*?)(ES\\d+)([\\S\\s]*?)(\\])/gim,\n replace: {\n package: {\n string: `$1$2${packageEMCAScriptVersion}$4$5`,\n version: packageEMCAScriptVersion,\n captureGroup: 3,\n },\n default: {\n string: `$1$2${ECMAScriptVersion}$4$5`,\n version: ECMAScriptVersion,\n captureGroup: 3,\n },\n },\n },\n];\n\ntype Versions = {\n nodeVersion: string;\n ECMAScriptVersion: string;\n packageNodeVersion: string;\n packageEMCAScriptVersion: string;\n};\n\nconst getTemplatedReplace = async (\n path: string,\n replace: SubPatch['replace'],\n): Promise<ReplaceOptions> => {\n if (!replace.package) {\n return replace.default;\n }\n\n const isPackage = await isLikelyPackage(path);\n\n if (isPackage) {\n return replace.package;\n }\n\n return replace.default;\n};\n\nconst runSubPatch = async (dir: string, patch: SubPatch) => {\n const readFile = createDestinationFileReader(dir);\n const paths = patch.file\n ? [patch.file]\n : await glob(patch.files ?? [], {\n cwd: dir,\n ignore: ['**/node_modules/**'],\n });\n\n await Promise.all(\n paths.map(async (path) => {\n const contents = await readFile(path);\n if (!contents) {\n return;\n }\n\n const regexResult = patch.regex().exec(contents);\n\n if (!regexResult) {\n return;\n }\n\n const templateReplace = await getTemplatedReplace(path, patch.replace);\n\n if (\n !lessThan(\n regexResult[templateReplace.captureGroup] as string,\n templateReplace.version,\n )\n ) {\n return;\n }\n\n await writePatchedContents({\n path,\n contents,\n templated: templateReplace.string,\n regex: patch.regex,\n });\n }),\n );\n};\n\nconst lessThan = (versionA: string, versionB: string) => {\n if (versionA.toLowerCase().startsWith('es')) {\n return Number(versionA.slice(2)) < Number(versionB.slice(2));\n }\n\n const coersedA = coerce(versionA);\n const coersedB = coerce(versionB);\n\n if (!coersedA || !coersedB) {\n throw new Error(\n `Unable to coerce versions for comparison: \"${versionA}\" and \"${versionB}\"`,\n );\n }\n\n return lt(coersedA, coersedB);\n};\n\nconst writePatchedContents = async ({\n path,\n contents,\n templated,\n regex,\n}: {\n path: string;\n contents: string;\n templated: string;\n regex: () => RegExp;\n}) => {\n const modified = contents.replaceAll(regex(), templated);\n await fs.promises.writeFile(path, modified);\n};\n\nconst upgrade = async (versions: Versions, dir: string) => {\n for (const subPatch of subPatches(versions)) {\n await runSubPatch(dir, subPatch);\n }\n};\n\nexport const nodeVersionMigration = async (\n {\n nodeVersion,\n ECMAScriptVersion,\n packageNodeVersion,\n packageEMCAScriptVersion,\n infraPackages,\n }: {\n nodeVersion: string;\n ECMAScriptVersion: string;\n packageNodeVersion: string;\n packageEMCAScriptVersion: string;\n infraPackages: Array<{ name: string; version: string }>;\n },\n dir = process.cwd(),\n) => {\n log.ok(`Upgrading to Node.js ${nodeVersion}`);\n try {\n await upgradeInfraPackages('format', infraPackages);\n await upgrade(\n {\n nodeVersion,\n ECMAScriptVersion,\n packageNodeVersion,\n packageEMCAScriptVersion,\n },\n dir,\n );\n\n log.ok('Upgraded to Node.js', nodeVersion);\n } catch (error) {\n log.err('Failed to upgrade');\n log.subtle(inspect(error));\n process.exitCode = 1;\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["fs"]
7
7
  }
@@ -0,0 +1,8 @@
1
+ import type { PatchReturnType } from '../../lint/internalLints/upgrade/index.js';
2
+ type PackageInfo = {
3
+ name: string;
4
+ version: string;
5
+ };
6
+ export declare const upgradeInfraPackages: (mode: "lint" | "format", packages: PackageInfo[]) => Promise<PatchReturnType>;
7
+ export declare const tryUpgradeInfraPackages: (mode: "lint" | "format", packages: PackageInfo[]) => Promise<PatchReturnType>;
8
+ export {};
@@ -0,0 +1,144 @@
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 upgrade_exports = {};
30
+ __export(upgrade_exports, {
31
+ tryUpgradeInfraPackages: () => tryUpgradeInfraPackages,
32
+ upgradeInfraPackages: () => upgradeInfraPackages
33
+ });
34
+ module.exports = __toCommonJS(upgrade_exports);
35
+ var import_fast_glob = require("fast-glob");
36
+ var import_fs_extra = __toESM(require("fs-extra"));
37
+ var import_semver = require("semver");
38
+ var import_exec = require("../../../utils/exec.js");
39
+ var import_logging = require("../../../utils/logging.js");
40
+ var import_packageManager = require("../../../utils/packageManager.js");
41
+ const packageVersionRegex = (packageName) => new RegExp(`"${packageName}"\\s*:\\s*"([^"]+)"`, "g");
42
+ const yamlPackageVersionRegex = (packageName) => new RegExp(`${packageName}:\\s*([^\\s]+)`, "g");
43
+ const upgradeInfraPackages = async (mode, packages) => {
44
+ const [packageJsonPaths, pnpmWorkSpacePaths] = await Promise.all([
45
+ (0, import_fast_glob.glob)(["**/package.json"], {
46
+ ignore: ["**/.git", "**/node_modules"]
47
+ }),
48
+ (0, import_fast_glob.glob)("**/pnpm-workspace.yaml", {
49
+ ignore: ["**/.git", "**/node_modules"]
50
+ })
51
+ ]);
52
+ if (packageJsonPaths.length === 0 && pnpmWorkSpacePaths.length === 0) {
53
+ return {
54
+ result: "skip",
55
+ reason: "no package.json files found"
56
+ };
57
+ }
58
+ const [packageJsons, pnpmWorkspaces] = await Promise.all([
59
+ Promise.all(
60
+ packageJsonPaths.map(async (file) => {
61
+ const contents = await import_fs_extra.default.readFile(file, "utf8");
62
+ return {
63
+ file,
64
+ contents
65
+ };
66
+ })
67
+ ),
68
+ Promise.all(
69
+ pnpmWorkSpacePaths.map(async (file) => {
70
+ const contents = await import_fs_extra.default.readFile(file, "utf8");
71
+ return {
72
+ file,
73
+ contents
74
+ };
75
+ })
76
+ )
77
+ ]);
78
+ const patchedPackageJsons = packageJsons.map((file) => {
79
+ const updated = packages.reduce((contents, packageName) => {
80
+ const regex = packageVersionRegex(packageName.name);
81
+ return contents.replaceAll(regex, (match, currentVersion) => {
82
+ const versionPrefix = ["^", "~"].includes(currentVersion[0]) ? currentVersion[0] : "";
83
+ const prefixLessCurrentVersion = versionPrefix ? currentVersion.slice(1) : currentVersion;
84
+ return (0, import_semver.lt)(prefixLessCurrentVersion, packageName.version) ? `"${packageName.name}":"${versionPrefix}${packageName.version}"` : match;
85
+ });
86
+ }, file.contents);
87
+ return {
88
+ ...file,
89
+ updated
90
+ };
91
+ }).filter(({ contents, updated }) => contents !== updated);
92
+ const patchedPnpmWorkspaces = pnpmWorkspaces.map((file) => {
93
+ const updated = packages.reduce((contents, packageName) => {
94
+ const regex = yamlPackageVersionRegex(packageName.name);
95
+ return contents.replace(regex, (match, currentVersion) => {
96
+ const versionPrefix = ["^", "~"].includes(currentVersion[0]) ? currentVersion[0] : "";
97
+ const prefixLessCurrentVersion = versionPrefix ? currentVersion.slice(1) : currentVersion;
98
+ return (0, import_semver.lt)(prefixLessCurrentVersion, packageName.version) ? `${packageName.name}: ${versionPrefix}${packageName.version}` : match;
99
+ });
100
+ }, file.contents);
101
+ return {
102
+ ...file,
103
+ updated
104
+ };
105
+ }).filter(({ contents, updated }) => contents !== updated);
106
+ if (patchedPackageJsons.length === 0 && patchedPnpmWorkspaces.length === 0) {
107
+ return {
108
+ result: "skip",
109
+ reason: "no package.json or pnpm-workspace.yaml files to patch"
110
+ };
111
+ }
112
+ if (mode === "lint") {
113
+ return {
114
+ result: "apply"
115
+ };
116
+ }
117
+ await Promise.all(
118
+ [...patchedPackageJsons, ...patchedPnpmWorkspaces].map(
119
+ async ({ file, updated }) => {
120
+ await import_fs_extra.default.writeFile(file, updated, "utf8");
121
+ }
122
+ )
123
+ );
124
+ const packageManager = await (0, import_packageManager.detectPackageManager)();
125
+ await (0, import_exec.exec)(packageManager.command, "install");
126
+ return {
127
+ result: "apply"
128
+ };
129
+ };
130
+ const tryUpgradeInfraPackages = async (mode, packages) => {
131
+ try {
132
+ return await upgradeInfraPackages(mode, packages);
133
+ } catch (err) {
134
+ import_logging.log.err("Failed to upgrade infrastructure packages");
135
+ import_logging.log.err(err);
136
+ return { result: "skip", reason: "due to an error" };
137
+ }
138
+ };
139
+ // Annotate the CommonJS export names for ESM import in node:
140
+ 0 && (module.exports = {
141
+ tryUpgradeInfraPackages,
142
+ upgradeInfraPackages
143
+ });
144
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cli/migrate/nodeVersion/upgrade.ts"],
4
+ "sourcesContent": ["import { glob } from 'fast-glob';\nimport fs from 'fs-extra';\nimport { lt } from 'semver';\n\nimport { exec } from '../../../utils/exec.js';\nimport { log } from '../../../utils/logging.js';\nimport { detectPackageManager } from '../../../utils/packageManager.js';\nimport type { PatchReturnType } from '../../lint/internalLints/upgrade/index.js';\n\nconst packageVersionRegex = (packageName: string) =>\n new RegExp(`\"${packageName}\"\\\\s*:\\\\s*\"([^\"]+)\"`, 'g');\n\nconst yamlPackageVersionRegex = (packageName: string) =>\n new RegExp(`${packageName}:\\\\s*([^\\\\s]+)`, 'g');\n\ntype PackageInfo = {\n name: string;\n version: string;\n};\n\nexport const upgradeInfraPackages = async (\n mode: 'lint' | 'format',\n packages: PackageInfo[],\n): Promise<PatchReturnType> => {\n const [packageJsonPaths, pnpmWorkSpacePaths] = await Promise.all([\n glob(['**/package.json'], {\n ignore: ['**/.git', '**/node_modules'],\n }),\n glob('**/pnpm-workspace.yaml', {\n ignore: ['**/.git', '**/node_modules'],\n }),\n ]);\n\n if (packageJsonPaths.length === 0 && pnpmWorkSpacePaths.length === 0) {\n return {\n result: 'skip',\n reason: 'no package.json files found',\n };\n }\n\n const [packageJsons, pnpmWorkspaces] = await Promise.all([\n Promise.all(\n packageJsonPaths.map(async (file) => {\n const contents = await fs.readFile(file, 'utf8');\n\n return {\n file,\n contents,\n };\n }),\n ),\n Promise.all(\n pnpmWorkSpacePaths.map(async (file) => {\n const contents = await fs.readFile(file, 'utf8');\n\n return {\n file,\n contents,\n };\n }),\n ),\n ]);\n\n const patchedPackageJsons = packageJsons\n .map((file) => {\n const updated = packages.reduce((contents, packageName) => {\n const regex = packageVersionRegex(packageName.name);\n return contents.replaceAll(regex, (match, currentVersion: string) => {\n const versionPrefix = ['^', '~'].includes(currentVersion[0] as string)\n ? currentVersion[0]\n : '';\n const prefixLessCurrentVersion = versionPrefix\n ? currentVersion.slice(1)\n : currentVersion;\n\n return lt(prefixLessCurrentVersion, packageName.version)\n ? `\"${packageName.name}\":\"${versionPrefix}${packageName.version}\"`\n : match;\n });\n }, file.contents);\n\n return {\n ...file,\n updated,\n };\n })\n .filter(({ contents, updated }) => contents !== updated);\n\n const patchedPnpmWorkspaces = pnpmWorkspaces\n .map((file) => {\n const updated = packages.reduce((contents, packageName) => {\n const regex = yamlPackageVersionRegex(packageName.name);\n return contents.replace(regex, (match, currentVersion: string) => {\n const versionPrefix = ['^', '~'].includes(currentVersion[0] as string)\n ? currentVersion[0]\n : '';\n const prefixLessCurrentVersion = versionPrefix\n ? currentVersion.slice(1)\n : currentVersion;\n\n return lt(prefixLessCurrentVersion, packageName.version)\n ? `${packageName.name}: ${versionPrefix}${packageName.version}`\n : match;\n });\n }, file.contents);\n\n return {\n ...file,\n updated,\n };\n })\n .filter(({ contents, updated }) => contents !== updated);\n\n if (patchedPackageJsons.length === 0 && patchedPnpmWorkspaces.length === 0) {\n return {\n result: 'skip',\n reason: 'no package.json or pnpm-workspace.yaml files to patch',\n };\n }\n\n if (mode === 'lint') {\n return {\n result: 'apply',\n };\n }\n\n await Promise.all(\n [...patchedPackageJsons, ...patchedPnpmWorkspaces].map(\n async ({ file, updated }) => {\n await fs.writeFile(file, updated, 'utf8');\n },\n ),\n );\n\n const packageManager = await detectPackageManager();\n\n await exec(packageManager.command, 'install');\n\n return {\n result: 'apply',\n };\n};\n\nexport const tryUpgradeInfraPackages = async (\n mode: 'lint' | 'format',\n packages: PackageInfo[],\n): Promise<PatchReturnType> => {\n try {\n return await upgradeInfraPackages(mode, packages);\n } catch (err) {\n log.err('Failed to upgrade infrastructure packages');\n log.err(err);\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["fs"]
7
+ }
@@ -1,12 +1,13 @@
1
+ import type { styleText } from 'node:util';
1
2
  import stream from 'stream';
2
- import type { Color } from 'chalk';
3
3
  import execa, { type ExecaChildProcess } from 'execa';
4
4
  import type { PackageManager } from './packageManager.js';
5
+ type StyleColor = Parameters<typeof styleText>[0];
5
6
  export type Exec = (command: string, ...args: string[]) => ExecaChildProcess<string>;
6
7
  interface ExecConcurrentlyCommand {
7
8
  command: string;
8
9
  name: string;
9
- prefixColor?: typeof Color;
10
+ prefixColor?: StyleColor;
10
11
  }
11
12
  interface ExecConcurrentlyOptions {
12
13
  /**
package/lib/utils/exec.js CHANGED
@@ -107,7 +107,7 @@ const execConcurrently = async (commands, { maxProcesses, nameLength, outputStre
107
107
  command,
108
108
  env: envWithPath,
109
109
  name: name.padEnd(maxNameLength),
110
- prefixColor
110
+ prefixColor: Array.isArray(prefixColor) ? prefixColor[0] : prefixColor
111
111
  })),
112
112
  {
113
113
  maxProcesses: maxProcesses ?? (0, import_os.cpus)().length,