skuba 14.0.0-node-24-20251215224735 → 14.0.0-node-upgrade-tweaks-20260114223652
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.
- package/lib/cli/build/esbuild.d.ts +4 -2
- package/lib/cli/build/esbuild.js +19 -2
- package/lib/cli/build/esbuild.js.map +2 -2
- package/lib/cli/build/index.js +9 -1
- package/lib/cli/build/index.js.map +2 -2
- package/lib/cli/lint/autofix.d.ts +5 -0
- package/lib/cli/lint/autofix.js +8 -4
- package/lib/cli/lint/autofix.js.map +2 -2
- package/lib/cli/lint/internalLints/upgrade/index.d.ts +1 -1
- package/lib/cli/lint/internalLints/upgrade/index.js +51 -16
- package/lib/cli/lint/internalLints/upgrade/index.js.map +2 -2
- package/lib/cli/migrate/nodeVersion/index.js +12 -0
- package/lib/cli/migrate/nodeVersion/index.js.map +2 -2
- package/lib/cli/migrate/nodeVersion/upgrade.js +28 -5
- package/lib/cli/migrate/nodeVersion/upgrade.js.map +3 -3
- package/package.json +11 -11
- package/template/express-rest-api/Dockerfile +1 -1
- package/template/express-rest-api/Dockerfile.dev-deps +1 -1
- package/template/express-rest-api/package.json +6 -6
- package/template/greeter/Dockerfile +1 -1
- package/template/greeter/package.json +3 -3
- package/template/koa-rest-api/Dockerfile +1 -1
- package/template/koa-rest-api/Dockerfile.dev-deps +1 -1
- package/template/koa-rest-api/package.json +7 -8
- package/template/lambda-sqs-worker-cdk/Dockerfile +1 -1
- package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +4 -4
- package/template/lambda-sqs-worker-cdk/infra/appStack.ts +3 -3
- package/template/lambda-sqs-worker-cdk/package.json +3 -3
- package/template/oss-npm-package/tsconfig.json +2 -2
- package/template/private-npm-package/tsconfig.json +2 -2
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { type BuildOptions } from 'esbuild';
|
|
2
|
+
export type EsbuildConfig = Pick<BuildOptions, 'external' | 'minify' | 'bundle' | 'splitting' | 'treeShaking'>;
|
|
3
|
+
interface EsbuildParameters extends EsbuildConfig {
|
|
2
4
|
debug: boolean;
|
|
3
5
|
type: string | undefined;
|
|
4
6
|
}
|
|
5
|
-
export declare const esbuild: ({ debug, type }: EsbuildParameters, args?: string[]) => Promise<void>;
|
|
7
|
+
export declare const esbuild: ({ debug, type, external, bundle, minify, splitting, treeShaking, }: EsbuildParameters, args?: string[]) => Promise<void>;
|
|
6
8
|
export {};
|
package/lib/cli/build/esbuild.js
CHANGED
|
@@ -28,7 +28,15 @@ var import_typescript = require("typescript");
|
|
|
28
28
|
var import_logging = require("../../utils/logging.js");
|
|
29
29
|
var import_args = require("./args.js");
|
|
30
30
|
var import_tsc = require("./tsc.js");
|
|
31
|
-
const esbuild = async ({
|
|
31
|
+
const esbuild = async ({
|
|
32
|
+
debug,
|
|
33
|
+
type,
|
|
34
|
+
external,
|
|
35
|
+
bundle,
|
|
36
|
+
minify,
|
|
37
|
+
splitting,
|
|
38
|
+
treeShaking
|
|
39
|
+
}, args = process.argv.slice(2)) => {
|
|
32
40
|
const log = (0, import_logging.createLogger)({ debug });
|
|
33
41
|
const tscArgs = (0, import_args.parseTscArgs)(args);
|
|
34
42
|
const customConditions = (0, import_tsc.getCustomConditions)();
|
|
@@ -49,10 +57,19 @@ const esbuild = async ({ debug, type }, args = process.argv.slice(2)) => {
|
|
|
49
57
|
log.debug(log.bold("Compiler options"));
|
|
50
58
|
log.debug((0, import_util.inspect)(compilerOptions));
|
|
51
59
|
const start = process.hrtime.bigint();
|
|
52
|
-
const bundle = false;
|
|
53
60
|
const isEsm = compilerOptions.module !== import_typescript.ModuleKind.CommonJS && type === "module";
|
|
61
|
+
const canSplit = bundle && isEsm && Boolean(compilerOptions.outDir);
|
|
62
|
+
if (splitting && !canSplit) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
"Splitting requires bundling to be enabled, ESM output format, and outDir to be configured"
|
|
65
|
+
);
|
|
66
|
+
}
|
|
54
67
|
await (0, import_esbuild.build)({
|
|
55
68
|
bundle,
|
|
69
|
+
minify: bundle && minify,
|
|
70
|
+
splitting: canSplit && splitting,
|
|
71
|
+
treeShaking: bundle && treeShaking,
|
|
72
|
+
external,
|
|
56
73
|
entryPoints,
|
|
57
74
|
format: !isEsm ? "cjs" : void 0,
|
|
58
75
|
outdir: compilerOptions.outDir,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/build/esbuild.ts"],
|
|
4
|
-
"sourcesContent": ["import { inspect } from 'util';\n\nimport { TsconfigPathsPlugin } from '@esbuild-plugins/tsconfig-paths';\nimport { build } from 'esbuild';\nimport { ModuleKind, ModuleResolutionKind, ScriptTarget } from 'typescript';\n\nimport { createLogger } from '../../utils/logging.js';\n\nimport { parseTscArgs } from './args.js';\nimport { getCustomConditions, readTsBuildConfig, tsc } from './tsc.js';\n\ninterface EsbuildParameters {\n debug: boolean;\n type: string | undefined;\n}\n\nexport const esbuild = async (\n {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,4BAAoC;AACpC,
|
|
4
|
+
"sourcesContent": ["import { inspect } from 'util';\n\nimport { TsconfigPathsPlugin } from '@esbuild-plugins/tsconfig-paths';\nimport { type BuildOptions, build } from 'esbuild';\nimport { ModuleKind, ModuleResolutionKind, ScriptTarget } from 'typescript';\n\nimport { createLogger } from '../../utils/logging.js';\n\nimport { parseTscArgs } from './args.js';\nimport { getCustomConditions, readTsBuildConfig, tsc } from './tsc.js';\n\nexport type EsbuildConfig = Pick<\n BuildOptions,\n 'external' | 'minify' | 'bundle' | 'splitting' | 'treeShaking'\n>;\n\ninterface EsbuildParameters extends EsbuildConfig {\n debug: boolean;\n type: string | undefined;\n}\n\nexport const esbuild = async (\n {\n debug,\n type,\n external,\n bundle,\n minify,\n splitting,\n treeShaking,\n }: EsbuildParameters,\n args = process.argv.slice(2),\n) => {\n const log = createLogger({ debug });\n\n const tscArgs = parseTscArgs(args);\n\n const customConditions = getCustomConditions();\n\n if (tscArgs.build) {\n log.err(\n 'skuba does not currently support the tsc --build flag with esbuild',\n );\n process.exitCode = 1;\n return;\n }\n\n const parsedCommandLine = readTsBuildConfig(args, log);\n\n if (!parsedCommandLine || process.exitCode) {\n return;\n }\n\n const { fileNames: entryPoints, options: compilerOptions } =\n parsedCommandLine;\n\n log.debug(log.bold('Files'));\n entryPoints.forEach((filepath) => log.debug(filepath));\n\n log.debug(log.bold('Compiler options'));\n log.debug(inspect(compilerOptions));\n\n const start = process.hrtime.bigint();\n\n const isEsm =\n compilerOptions.module !== ModuleKind.CommonJS && type === 'module';\n\n const canSplit = bundle && isEsm && Boolean(compilerOptions.outDir);\n\n if (splitting && !canSplit) {\n throw new Error(\n 'Splitting requires bundling to be enabled, ESM output format, and outDir to be configured',\n );\n }\n\n await build({\n bundle,\n minify: bundle && minify,\n splitting: canSplit && splitting,\n treeShaking: bundle && treeShaking,\n external,\n entryPoints,\n format: !isEsm ? 'cjs' : undefined,\n outdir: compilerOptions.outDir,\n logLevel: debug ? 'debug' : 'info',\n logLimit: 0,\n platform:\n compilerOptions.moduleResolution === ModuleResolutionKind.NodeJs ||\n compilerOptions.moduleResolution === ModuleResolutionKind.Node16\n ? 'node'\n : undefined,\n plugins: bundle\n ? []\n : [\n // evanw/esbuild#394\n // eslint-disable-next-line new-cap\n TsconfigPathsPlugin({\n tsconfig: { baseUrl: compilerOptions.baseUrl, compilerOptions },\n }),\n ],\n sourcemap: compilerOptions.sourceMap,\n // TODO: as of 0.18, the esbuild CLI no longer infers the target property to\n // avoid ambiguity where multiple `tsconfig.json`s are involved in a build.\n // This would be unusual for a typical SEEK project but we can still explore\n // an explicit setting once we implement `skuba.config.ts` (#1167).\n target: compilerOptions.target\n ? ScriptTarget[compilerOptions.target].toLocaleLowerCase()\n : undefined,\n tsconfig: tscArgs.pathname,\n conditions: customConditions?.length ? customConditions : undefined,\n });\n\n const end = process.hrtime.bigint();\n\n log.plain(`Built in ${log.timing(start, end)}.`);\n\n if (compilerOptions.declaration) {\n await tsc([\n '--declaration',\n '--emitDeclarationOnly',\n ...(tscArgs.project ? ['--project', tscArgs.project] : []),\n ]);\n }\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,4BAAoC;AACpC,qBAAyC;AACzC,wBAA+D;AAE/D,qBAA6B;AAE7B,kBAA6B;AAC7B,iBAA4D;AAYrD,MAAM,UAAU,OACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA,OAAO,QAAQ,KAAK,MAAM,CAAC,MACxB;AACH,QAAM,UAAM,6BAAa,EAAE,MAAM,CAAC;AAElC,QAAM,cAAU,0BAAa,IAAI;AAEjC,QAAM,uBAAmB,gCAAoB;AAE7C,MAAI,QAAQ,OAAO;AACjB,QAAI;AAAA,MACF;AAAA,IACF;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,wBAAoB,8BAAkB,MAAM,GAAG;AAErD,MAAI,CAAC,qBAAqB,QAAQ,UAAU;AAC1C;AAAA,EACF;AAEA,QAAM,EAAE,WAAW,aAAa,SAAS,gBAAgB,IACvD;AAEF,MAAI,MAAM,IAAI,KAAK,OAAO,CAAC;AAC3B,cAAY,QAAQ,CAAC,aAAa,IAAI,MAAM,QAAQ,CAAC;AAErD,MAAI,MAAM,IAAI,KAAK,kBAAkB,CAAC;AACtC,MAAI,UAAM,qBAAQ,eAAe,CAAC;AAElC,QAAM,QAAQ,QAAQ,OAAO,OAAO;AAEpC,QAAM,QACJ,gBAAgB,WAAW,6BAAW,YAAY,SAAS;AAE7D,QAAM,WAAW,UAAU,SAAS,QAAQ,gBAAgB,MAAM;AAElE,MAAI,aAAa,CAAC,UAAU;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,YAAM,sBAAM;AAAA,IACV;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB,WAAW,YAAY;AAAA,IACvB,aAAa,UAAU;AAAA,IACvB;AAAA,IACA;AAAA,IACA,QAAQ,CAAC,QAAQ,QAAQ;AAAA,IACzB,QAAQ,gBAAgB;AAAA,IACxB,UAAU,QAAQ,UAAU;AAAA,IAC5B,UAAU;AAAA,IACV,UACE,gBAAgB,qBAAqB,uCAAqB,UAC1D,gBAAgB,qBAAqB,uCAAqB,SACtD,SACA;AAAA,IACN,SAAS,SACL,CAAC,IACD;AAAA;AAAA;AAAA,UAGE,2CAAoB;AAAA,QAClB,UAAU,EAAE,SAAS,gBAAgB,SAAS,gBAAgB;AAAA,MAChE,CAAC;AAAA,IACH;AAAA,IACJ,WAAW,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,IAK3B,QAAQ,gBAAgB,SACpB,+BAAa,gBAAgB,MAAM,EAAE,kBAAkB,IACvD;AAAA,IACJ,UAAU,QAAQ;AAAA,IAClB,YAAY,kBAAkB,SAAS,mBAAmB;AAAA,EAC5D,CAAC;AAED,QAAM,MAAM,QAAQ,OAAO,OAAO;AAElC,MAAI,MAAM,YAAY,IAAI,OAAO,OAAO,GAAG,CAAC,GAAG;AAE/C,MAAI,gBAAgB,aAAa;AAC/B,cAAM,gBAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,UAAU,CAAC,aAAa,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/lib/cli/build/index.js
CHANGED
|
@@ -33,8 +33,16 @@ const build = async (args = process.argv.slice(2)) => {
|
|
|
33
33
|
switch (manifest?.value) {
|
|
34
34
|
case "esbuild": {
|
|
35
35
|
const debug = (0, import_args.hasDebugFlag)(args);
|
|
36
|
+
const esbuildConfig = await (0, import_manifest.getManifestProperties)("esbuildConfig");
|
|
36
37
|
import_logging.log.plain((0, import_node_util.styleText)("yellow", "esbuild"));
|
|
37
|
-
await (0, import_esbuild.esbuild)(
|
|
38
|
+
await (0, import_esbuild.esbuild)(
|
|
39
|
+
{
|
|
40
|
+
debug,
|
|
41
|
+
type: manifest.type,
|
|
42
|
+
...esbuildConfig?.value
|
|
43
|
+
},
|
|
44
|
+
args
|
|
45
|
+
);
|
|
38
46
|
break;
|
|
39
47
|
}
|
|
40
48
|
// TODO: flip the default case over to `esbuild` in skuba vNext.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/build/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { styleText } from 'node:util';\n\nimport { hasDebugFlag } from '../../utils/args.js';\nimport { log } from '../../utils/logging.js';\nimport { getManifestProperties } from '../../utils/manifest.js';\n\nimport { copyAssets } from './assets.js';\nimport { esbuild } from './esbuild.js';\nimport { readTsBuildConfig, tsc } from './tsc.js';\n\nexport const build = async (args = process.argv.slice(2)) => {\n // TODO: define a unified `package.json#/skuba` schema and parser so we don't\n // need all these messy lookups.\n const manifest = await getManifestProperties('build');\n\n switch (manifest?.value) {\n case 'esbuild': {\n const debug = hasDebugFlag(args);\n\n log.plain(styleText('yellow', 'esbuild'));\n await esbuild({
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA0B;AAE1B,kBAA6B;AAC7B,qBAAoB;AACpB,sBAAsC;AAEtC,oBAA2B;AAC3B,
|
|
4
|
+
"sourcesContent": ["import { styleText } from 'node:util';\n\nimport { hasDebugFlag } from '../../utils/args.js';\nimport { log } from '../../utils/logging.js';\nimport { getManifestProperties } from '../../utils/manifest.js';\n\nimport { copyAssets } from './assets.js';\nimport { type EsbuildConfig, esbuild } from './esbuild.js';\nimport { readTsBuildConfig, tsc } from './tsc.js';\n\nexport const build = async (args = process.argv.slice(2)) => {\n // TODO: define a unified `package.json#/skuba` schema and parser so we don't\n // need all these messy lookups.\n const manifest = await getManifestProperties('build');\n\n switch (manifest?.value) {\n case 'esbuild': {\n const debug = hasDebugFlag(args);\n const esbuildConfig = await getManifestProperties<\n 'esbuildConfig',\n EsbuildConfig\n >('esbuildConfig');\n\n log.plain(styleText('yellow', 'esbuild'));\n await esbuild(\n {\n debug,\n type: manifest.type,\n ...esbuildConfig?.value,\n },\n args,\n );\n break;\n }\n\n // TODO: flip the default case over to `esbuild` in skuba vNext.\n case undefined:\n case 'tsc': {\n log.plain(styleText('blue', 'tsc'));\n await tsc(args);\n break;\n }\n\n default: {\n log.err(\n 'We don\u2019t support the build tool specified in your',\n log.bold('package.json'),\n 'yet:',\n );\n log.err(\n log.subtle(\n JSON.stringify({ skuba: { build: manifest?.value } }, null, 2),\n ),\n );\n process.exitCode = 1;\n return;\n }\n }\n\n const parsedCommandLine = readTsBuildConfig(args, log);\n\n if (!parsedCommandLine || process.exitCode) {\n return;\n }\n\n const { options: compilerOptions } = parsedCommandLine;\n\n if (!compilerOptions.outDir) {\n return;\n }\n\n await copyAssets(compilerOptions.outDir);\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA0B;AAE1B,kBAA6B;AAC7B,qBAAoB;AACpB,sBAAsC;AAEtC,oBAA2B;AAC3B,qBAA4C;AAC5C,iBAAuC;AAEhC,MAAM,QAAQ,OAAO,OAAO,QAAQ,KAAK,MAAM,CAAC,MAAM;AAG3D,QAAM,WAAW,UAAM,uCAAsB,OAAO;AAEpD,UAAQ,UAAU,OAAO;AAAA,IACvB,KAAK,WAAW;AACd,YAAM,YAAQ,0BAAa,IAAI;AAC/B,YAAM,gBAAgB,UAAM,uCAG1B,eAAe;AAEjB,yBAAI,UAAM,4BAAU,UAAU,SAAS,CAAC;AACxC,gBAAM;AAAA,QACJ;AAAA,UACE;AAAA,UACA,MAAM,SAAS;AAAA,UACf,GAAG,eAAe;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AAAA;AAAA,IAGA,KAAK;AAAA,IACL,KAAK,OAAO;AACV,yBAAI,UAAM,4BAAU,QAAQ,KAAK,CAAC;AAClC,gBAAM,gBAAI,IAAI;AACd;AAAA,IACF;AAAA,IAEA,SAAS;AACP,yBAAI;AAAA,QACF;AAAA,QACA,mBAAI,KAAK,cAAc;AAAA,QACvB;AAAA,MACF;AACA,yBAAI;AAAA,QACF,mBAAI;AAAA,UACF,KAAK,UAAU,EAAE,OAAO,EAAE,OAAO,UAAU,MAAM,EAAE,GAAG,MAAM,CAAC;AAAA,QAC/D;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,wBAAoB,8BAAkB,MAAM,kBAAG;AAErD,MAAI,CAAC,qBAAqB,QAAQ,UAAU;AAC1C;AAAA,EACF;AAEA,QAAM,EAAE,SAAS,gBAAgB,IAAI;AAErC,MAAI,CAAC,gBAAgB,QAAQ;AAC3B;AAAA,EACF;AAEA,YAAM,0BAAW,gBAAgB,MAAM;AACzC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,11 @@ import type { Input } from './types.js';
|
|
|
2
2
|
import * as Git from '@skuba-lib/api/git';
|
|
3
3
|
export declare const AUTOFIX_IGNORE_FILES_BASE: Git.ChangedFile[];
|
|
4
4
|
export declare const AUTOFIX_IGNORE_FILES_NPMRC: Git.ChangedFile[];
|
|
5
|
+
export declare const shouldCommit: ({ currentBranch, dir, }: {
|
|
6
|
+
currentBranch?: string;
|
|
7
|
+
dir: string;
|
|
8
|
+
}) => Promise<boolean>;
|
|
9
|
+
export declare const getIgnores: (dir: string) => Promise<Git.ChangedFile[]>;
|
|
5
10
|
interface AutofixParameters {
|
|
6
11
|
debug: Input['debug'];
|
|
7
12
|
eslint: boolean;
|
package/lib/cli/lint/autofix.js
CHANGED
|
@@ -30,7 +30,9 @@ var autofix_exports = {};
|
|
|
30
30
|
__export(autofix_exports, {
|
|
31
31
|
AUTOFIX_IGNORE_FILES_BASE: () => AUTOFIX_IGNORE_FILES_BASE,
|
|
32
32
|
AUTOFIX_IGNORE_FILES_NPMRC: () => AUTOFIX_IGNORE_FILES_NPMRC,
|
|
33
|
-
autofix: () => autofix
|
|
33
|
+
autofix: () => autofix,
|
|
34
|
+
getIgnores: () => getIgnores,
|
|
35
|
+
shouldCommit: () => shouldCommit
|
|
34
36
|
});
|
|
35
37
|
module.exports = __toCommonJS(autofix_exports);
|
|
36
38
|
var import_util = require("util");
|
|
@@ -64,7 +66,7 @@ const AUTOFIX_IGNORE_FILES_NPMRC = [
|
|
|
64
66
|
state: "modified"
|
|
65
67
|
}
|
|
66
68
|
];
|
|
67
|
-
const
|
|
69
|
+
const shouldCommit = async ({
|
|
68
70
|
currentBranch,
|
|
69
71
|
dir
|
|
70
72
|
}) => {
|
|
@@ -118,7 +120,7 @@ const autofix = async (params) => {
|
|
|
118
120
|
currentBranch = await Git.currentBranch({ dir });
|
|
119
121
|
} catch {
|
|
120
122
|
}
|
|
121
|
-
if (!await
|
|
123
|
+
if (!await shouldCommit({ currentBranch, dir })) {
|
|
122
124
|
return;
|
|
123
125
|
}
|
|
124
126
|
try {
|
|
@@ -186,6 +188,8 @@ const autofix = async (params) => {
|
|
|
186
188
|
0 && (module.exports = {
|
|
187
189
|
AUTOFIX_IGNORE_FILES_BASE,
|
|
188
190
|
AUTOFIX_IGNORE_FILES_NPMRC,
|
|
189
|
-
autofix
|
|
191
|
+
autofix,
|
|
192
|
+
getIgnores,
|
|
193
|
+
shouldCommit
|
|
190
194
|
});
|
|
191
195
|
//# sourceMappingURL=autofix.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/lint/autofix.ts"],
|
|
4
|
-
"sourcesContent": ["import { inspect } from 'util';\n\nimport { simpleGit } from 'simple-git';\n\nimport { isCiEnv } from '../../utils/env.js';\nimport { createLogger, log } from '../../utils/logging.js';\nimport { hasNpmrcSecret } from '../../utils/npmrc.js';\nimport { throwOnTimeout } from '../../utils/wait.js';\nimport { runESLint } from '../adapter/eslint.js';\nimport { runPrettier } from '../adapter/prettier.js';\nimport { createDestinationFileReader } from '../configure/analysis/project.js';\n\nimport { internalLint } from './internal.js';\nimport type { Input } from './types.js';\n\nimport * as Buildkite from '@skuba-lib/api/buildkite';\nimport * as Git from '@skuba-lib/api/git';\nimport * as GitHub from '@skuba-lib/api/github';\n\nconst RENOVATE_DEFAULT_PREFIX = 'renovate';\n\nconst AUTOFIX_COMMIT_MESSAGE = 'Run `skuba format`';\n\nexport const AUTOFIX_IGNORE_FILES_BASE: Git.ChangedFile[] = [\n {\n path: 'Dockerfile-incunabulum',\n state: 'added',\n },\n];\n\nexport const AUTOFIX_IGNORE_FILES_NPMRC: Git.ChangedFile[] = [\n {\n path: '.npmrc',\n state: 'added',\n },\n {\n path: '.npmrc',\n state: 'modified',\n },\n];\n\
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,wBAA0B;AAE1B,iBAAwB;AACxB,qBAAkC;AAClC,mBAA+B;AAC/B,kBAA+B;AAC/B,oBAA0B;AAC1B,sBAA4B;AAC5B,qBAA4C;AAE5C,sBAA6B;AAG7B,gBAA2B;AAC3B,UAAqB;AACrB,aAAwB;AAExB,MAAM,0BAA0B;AAEhC,MAAM,yBAAyB;AAExB,MAAM,4BAA+C;AAAA,EAC1D;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEO,MAAM,6BAAgD;AAAA,EAC3D;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;
|
|
4
|
+
"sourcesContent": ["import { inspect } from 'util';\n\nimport { simpleGit } from 'simple-git';\n\nimport { isCiEnv } from '../../utils/env.js';\nimport { createLogger, log } from '../../utils/logging.js';\nimport { hasNpmrcSecret } from '../../utils/npmrc.js';\nimport { throwOnTimeout } from '../../utils/wait.js';\nimport { runESLint } from '../adapter/eslint.js';\nimport { runPrettier } from '../adapter/prettier.js';\nimport { createDestinationFileReader } from '../configure/analysis/project.js';\n\nimport { internalLint } from './internal.js';\nimport type { Input } from './types.js';\n\nimport * as Buildkite from '@skuba-lib/api/buildkite';\nimport * as Git from '@skuba-lib/api/git';\nimport * as GitHub from '@skuba-lib/api/github';\n\nconst RENOVATE_DEFAULT_PREFIX = 'renovate';\n\nconst AUTOFIX_COMMIT_MESSAGE = 'Run `skuba format`';\n\nexport const AUTOFIX_IGNORE_FILES_BASE: Git.ChangedFile[] = [\n {\n path: 'Dockerfile-incunabulum',\n state: 'added',\n },\n];\n\nexport const AUTOFIX_IGNORE_FILES_NPMRC: Git.ChangedFile[] = [\n {\n path: '.npmrc',\n state: 'added',\n },\n {\n path: '.npmrc',\n state: 'modified',\n },\n];\n\nexport const shouldCommit = async ({\n currentBranch,\n dir,\n}: {\n currentBranch?: string;\n dir: string;\n}) => {\n if (!isCiEnv()) {\n // We're not running in a CI environment so we don't need to push autofixes.\n // Ideally we'd drive this off of repository write permissions, but that is\n // non-trivial to infer without attempting an actual write.\n return false;\n }\n\n const isDefaultBuildkiteBranch =\n currentBranch &&\n [process.env.BUILDKITE_PIPELINE_DEFAULT_BRANCH, 'master', 'main'].includes(\n currentBranch,\n );\n\n const isProtectedGitHubBranch = process.env.GITHUB_REF_PROTECTED === 'true';\n\n if (isDefaultBuildkiteBranch || isProtectedGitHubBranch) {\n // The current branch is a protected branch.\n // We respect GitHub Flow; avoid pushing directly to the default branch.\n return false;\n }\n\n if (currentBranch?.startsWith(RENOVATE_DEFAULT_PREFIX)) {\n try {\n await GitHub.getPullRequestNumber();\n } catch {\n const warning =\n 'An autofix is available, but it was not pushed because an open pull request for this Renovate branch could not be found. If a pull request has since been created, retry the lint step to push the fix.';\n log.warn(warning);\n try {\n await Buildkite.annotate(Buildkite.md.terminal(warning));\n } catch {}\n\n return false;\n }\n }\n\n let headCommitMessage;\n try {\n headCommitMessage = await Git.getHeadCommitMessage({ dir });\n } catch {}\n\n if (headCommitMessage?.startsWith(AUTOFIX_COMMIT_MESSAGE)) {\n // Short circuit when the head commit appears to be one of our autofixes.\n // Repeating the same operation is unlikely to correct outstanding issues.\n return false;\n }\n\n // Allow the push attempt to go ahead if our guards have been cleared.\n return true;\n};\n\nexport const getIgnores = async (dir: string): Promise<Git.ChangedFile[]> => {\n const contents = await createDestinationFileReader(dir)('.npmrc');\n\n // If an .npmrc has secrets, we need to ignore it\n if (hasNpmrcSecret(contents ?? '')) {\n return [...AUTOFIX_IGNORE_FILES_BASE, ...AUTOFIX_IGNORE_FILES_NPMRC];\n }\n\n return AUTOFIX_IGNORE_FILES_BASE;\n};\n\ninterface AutofixParameters {\n debug: Input['debug'];\n\n eslint: boolean;\n prettier: boolean;\n internal: boolean;\n\n eslintConfigFile?: string;\n}\n\nexport const autofix = async (params: AutofixParameters): Promise<void> => {\n const dir = process.cwd();\n\n if (!params.eslint && !params.prettier && !params.internal) {\n return;\n }\n\n let currentBranch;\n try {\n currentBranch = await Git.currentBranch({ dir });\n } catch {}\n\n if (!(await shouldCommit({ currentBranch, dir }))) {\n return;\n }\n\n try {\n log.newline();\n\n log.warn(\n `Attempting to autofix issues (${[\n params.internal ? 'skuba' : undefined,\n params.internal || params.eslint ? 'ESLint' : undefined,\n 'Prettier', // Prettier is always run\n ]\n .filter((s) => s !== undefined)\n .join(', ')})...`,\n );\n\n const logger = createLogger({ debug: params.debug });\n\n if (params.internal) {\n await internalLint('format');\n }\n\n if (params.internal || params.eslint) {\n await runESLint('format', logger, params.eslintConfigFile);\n }\n\n // Unconditionally re-run Prettier; reaching here means we have pre-existing\n // format violations or may have created new ones through ESLint/internal fixes.\n await runPrettier('format', logger);\n\n if (process.env.GITHUB_ACTIONS) {\n // GitHub runners have Git installed locally\n const ref = await Git.commitAllChanges({\n dir,\n message: AUTOFIX_COMMIT_MESSAGE,\n\n ignore: await getIgnores(dir),\n });\n\n if (!ref) {\n return log.warn('No autofixes detected.');\n }\n\n await throwOnTimeout(simpleGit().push(), { s: 30 });\n log.warn(`Pushed fix commit ${ref}.`);\n return;\n }\n\n // Other CI Environments, use GitHub API\n if (!currentBranch) {\n log.warn('Could not determine the current branch.');\n log.warn(\n 'Please propagate BUILDKITE_BRANCH, GITHUB_HEAD_REF, GITHUB_REF_NAME, or the .git directory to your container.',\n );\n return;\n }\n\n const ref = await throwOnTimeout(\n GitHub.uploadAllFileChanges({\n branch: currentBranch,\n dir,\n messageHeadline: AUTOFIX_COMMIT_MESSAGE,\n\n ignore: await getIgnores(dir),\n }),\n { s: 30 },\n );\n\n if (!ref) {\n return log.warn('No autofixes detected.');\n }\n\n log.warn(`Pushed fix commit ${ref}.`);\n } catch (err) {\n log.warn(log.bold('Failed to push fix commit.'));\n log.warn(\n log.bold(\n 'Does your CI environment have write access to your Git repository?',\n ),\n );\n log.subtle(inspect(err));\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ref"]
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReadResult } from 'read-pkg-up';
|
|
2
|
-
import type
|
|
2
|
+
import { type Logger } from '../../../../utils/logging.js';
|
|
3
3
|
import { type PackageManagerConfig } from '../../../../utils/packageManager.js';
|
|
4
4
|
import type { InternalLintResult } from '../../internal.js';
|
|
5
5
|
export type Patches = Patch[];
|
|
@@ -34,10 +34,13 @@ module.exports = __toCommonJS(upgrade_exports);
|
|
|
34
34
|
var import_path = __toESM(require("path"));
|
|
35
35
|
var import_fs_extra = __toESM(require("fs-extra"));
|
|
36
36
|
var import_semver = require("semver");
|
|
37
|
+
var import_logging = require("../../../../utils/logging.js");
|
|
37
38
|
var import_manifest = require("../../../../utils/manifest.js");
|
|
38
39
|
var import_packageManager = require("../../../../utils/packageManager.js");
|
|
39
40
|
var import_version = require("../../../../utils/version.js");
|
|
40
41
|
var import_package = require("../../../configure/processing/package.js");
|
|
42
|
+
var import_autofix = require("../../autofix.js");
|
|
43
|
+
var import_api = require("@skuba-lib/api");
|
|
41
44
|
const getPatches = async (manifestVersion) => {
|
|
42
45
|
const patches = await import_fs_extra.default.readdir(import_path.default.join(__dirname, "patches"), {
|
|
43
46
|
withFileTypes: true
|
|
@@ -51,7 +54,14 @@ const getPatches = async (manifestVersion) => {
|
|
|
51
54
|
)
|
|
52
55
|
)
|
|
53
56
|
);
|
|
54
|
-
return
|
|
57
|
+
return new Map(
|
|
58
|
+
await Promise.all(
|
|
59
|
+
patchesForVersion.map(async (version) => {
|
|
60
|
+
const resolved = await resolvePatches(version);
|
|
61
|
+
return [version, resolved];
|
|
62
|
+
})
|
|
63
|
+
)
|
|
64
|
+
);
|
|
55
65
|
};
|
|
56
66
|
const fileExtensions = ["js", "ts"];
|
|
57
67
|
const resolvePatches = async (version) => {
|
|
@@ -78,12 +88,13 @@ const upgradeSkuba = async (mode, logger, additionalFlags = []) => {
|
|
|
78
88
|
return { ok: true, fixable: false };
|
|
79
89
|
}
|
|
80
90
|
const patches = await getPatches(manifestVersion);
|
|
81
|
-
if (patches.
|
|
91
|
+
if (patches.size === 0) {
|
|
82
92
|
return { ok: true, fixable: false };
|
|
83
93
|
}
|
|
84
94
|
if (mode === "lint") {
|
|
95
|
+
const allPatches = Array.from(patches.values()).flat();
|
|
85
96
|
const results = await Promise.all(
|
|
86
|
-
|
|
97
|
+
allPatches.map(
|
|
87
98
|
async ({ apply }) => await apply({
|
|
88
99
|
mode,
|
|
89
100
|
manifest,
|
|
@@ -113,19 +124,43 @@ const upgradeSkuba = async (mode, logger, additionalFlags = []) => {
|
|
|
113
124
|
};
|
|
114
125
|
}
|
|
115
126
|
logger.plain("Updating skuba...");
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
127
|
+
const dir = process.cwd();
|
|
128
|
+
let currentBranch;
|
|
129
|
+
try {
|
|
130
|
+
currentBranch = await import_api.Git.currentBranch({ dir });
|
|
131
|
+
} catch {
|
|
132
|
+
}
|
|
133
|
+
const shouldCommitChanges = await (0, import_autofix.shouldCommit)({ currentBranch, dir });
|
|
134
|
+
for (const version of patches.keys()) {
|
|
135
|
+
const patchesForVersion = patches.get(version);
|
|
136
|
+
if (!patchesForVersion) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
for (const { apply, description } of patchesForVersion) {
|
|
140
|
+
const result = await apply({
|
|
141
|
+
mode,
|
|
142
|
+
manifest,
|
|
143
|
+
packageManager
|
|
144
|
+
});
|
|
145
|
+
logger.newline();
|
|
146
|
+
if (result.result === "skip") {
|
|
147
|
+
logger.plain(
|
|
148
|
+
`Patch skipped: ${description}${result.reason ? ` - ${result.reason}` : ""}`
|
|
149
|
+
);
|
|
150
|
+
} else {
|
|
151
|
+
logger.plain(`Patch applied: ${description}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (shouldCommitChanges) {
|
|
155
|
+
const ref = await import_api.Git.commitAllChanges({
|
|
156
|
+
dir,
|
|
157
|
+
message: `Apply skuba ${version} patches`,
|
|
158
|
+
ignore: await (0, import_autofix.getIgnores)(dir)
|
|
159
|
+
});
|
|
160
|
+
if (!ref) {
|
|
161
|
+
import_logging.log.warn("No autofixes detected.");
|
|
162
|
+
return { ok: true, fixable: false };
|
|
163
|
+
}
|
|
129
164
|
}
|
|
130
165
|
}
|
|
131
166
|
const updatedManifest = await (0, import_manifest.getConsumerManifest)();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lint/internalLints/upgrade/index.ts"],
|
|
4
|
-
"sourcesContent": ["import path from 'path';\n\nimport fs from 'fs-extra';\nimport type { ReadResult } from 'read-pkg-up';\nimport { gte, sort } from 'semver';\n\nimport type
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AAEjB,sBAAe;AAEf,oBAA0B;
|
|
4
|
+
"sourcesContent": ["import path from 'path';\n\nimport fs from 'fs-extra';\nimport type { ReadResult } from 'read-pkg-up';\nimport { gte, sort } from 'semver';\n\nimport { type Logger, log } from '../../../../utils/logging.js';\nimport { getConsumerManifest } from '../../../../utils/manifest.js';\nimport {\n type PackageManagerConfig,\n detectPackageManager,\n} from '../../../../utils/packageManager.js';\nimport { getSkubaVersion } from '../../../../utils/version.js';\nimport { formatPackage } from '../../../configure/processing/package.js';\nimport type { SkubaPackageJson } from '../../../init/writePackageJson.js';\nimport { getIgnores, shouldCommit } from '../../autofix.js';\nimport type { InternalLintResult } from '../../internal.js';\n\nimport { Git } from '@skuba-lib/api';\n\nexport type Patches = Patch[];\nexport type Patch = {\n apply: PatchFunction;\n description: string;\n};\nexport type PatchReturnType =\n | { result: 'apply' }\n | { result: 'skip'; reason?: string };\n\nexport type PatchConfig = {\n mode: 'format' | 'lint';\n manifest: ReadResult;\n packageManager: PackageManagerConfig;\n dir?: string;\n};\n\nexport type PatchFunction = (config: PatchConfig) => Promise<PatchReturnType>;\n\nconst getPatches = async (\n manifestVersion: string,\n): Promise<Map<string, Patches>> => {\n const patches = await fs.readdir(path.join(__dirname, 'patches'), {\n withFileTypes: true,\n });\n\n // The patches are sorted by the version they were added from.\n // Only return patches that are newer or equal to the current version.\n const patchesForVersion = sort(\n patches.flatMap((patch) =>\n // Is a directory rather than a JavaScript source file\n patch.isDirectory() &&\n // Has been added since the last patch run on the project\n gte(patch.name, manifestVersion)\n ? patch.name\n : [],\n ),\n );\n\n return new Map<string, Patches>(\n await Promise.all(\n patchesForVersion.map(async (version) => {\n const resolved = await resolvePatches(version);\n return [version, resolved] as const;\n }),\n ),\n );\n};\n\nconst fileExtensions = ['js', 'ts'];\n\n// Hack to allow our Jest environment/transform to resolve the patches\n// In normal scenarios this will resolve immediately after the .js import\nconst resolvePatches = async (version: string): Promise<Patches> => {\n for (const extension of fileExtensions) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access\n return (await import(`./patches/${version}/index.${extension}`)).patches;\n } catch {\n // Ignore\n }\n }\n throw new Error(`Could not resolve patches for ${version}`);\n};\n\nexport const upgradeSkuba = async (\n mode: 'lint' | 'format',\n logger: Logger,\n additionalFlags: string[] = [],\n): Promise<InternalLintResult> => {\n const [currentVersion, manifest, packageManager] = await Promise.all([\n getSkubaVersion(),\n getConsumerManifest(),\n detectPackageManager(),\n ]);\n\n if (!manifest) {\n throw new Error('Could not find a package json for this project');\n }\n\n manifest.packageJson.skuba ??= { version: '1.0.0' };\n\n const manifestVersion = additionalFlags.includes('--force-apply-all-patches')\n ? '1.0.0'\n : (manifest.packageJson.skuba as SkubaPackageJson).version;\n\n // We are up to date, skip patches\n if (gte(manifestVersion, currentVersion)) {\n return { ok: true, fixable: false };\n }\n\n const patches = await getPatches(manifestVersion);\n // No patches to apply even if version out of date. Early exit to avoid unnecessary commits.\n if (patches.size === 0) {\n return { ok: true, fixable: false };\n }\n\n if (mode === 'lint') {\n const allPatches = Array.from(patches.values()).flat();\n const results = await Promise.all(\n allPatches.map(\n async ({ apply }) =>\n await apply({\n mode,\n manifest,\n packageManager,\n }),\n ),\n );\n\n // No patches are applicable. Early exit to avoid unnecessary commits.\n if (results.every(({ result }) => result === 'skip')) {\n return { ok: true, fixable: false };\n }\n\n logger.warn(\n `skuba has patches to apply. Run ${logger.bold(\n `${packageManager.print.exec} skuba format`,\n )} to run them.`,\n );\n\n return {\n ok: false,\n fixable: true,\n annotations: [\n {\n // package.json as likely skuba version has changed\n // TODO: locate the \"skuba\": {} config in the package.json and annotate on the version property\n path: manifest.path,\n message: `skuba has patches to apply. Run ${packageManager.print.exec} skuba format to run them.`,\n },\n ],\n };\n }\n\n logger.plain('Updating skuba...');\n\n const dir = process.cwd();\n let currentBranch;\n try {\n currentBranch = await Git.currentBranch({ dir });\n } catch {}\n\n const shouldCommitChanges = await shouldCommit({ currentBranch, dir });\n\n // Run these in series in case a subsequent patch relies on a previous patch\n for (const version of patches.keys()) {\n const patchesForVersion = patches.get(version);\n if (!patchesForVersion) {\n continue;\n }\n\n for (const { apply, description } of patchesForVersion) {\n const result = await apply({\n mode,\n manifest,\n packageManager,\n });\n logger.newline();\n if (result.result === 'skip') {\n logger.plain(\n `Patch skipped: ${description}${\n result.reason ? ` - ${result.reason}` : ''\n }`,\n );\n } else {\n logger.plain(`Patch applied: ${description}`);\n }\n }\n\n if (shouldCommitChanges) {\n // Only commit changes here, each version should have a separate commit and they should all be pushed together at the end\n const ref = await Git.commitAllChanges({\n dir,\n message: `Apply skuba ${version} patches`,\n\n ignore: await getIgnores(dir),\n });\n\n if (!ref) {\n log.warn('No autofixes detected.');\n return { ok: true, fixable: false };\n }\n }\n }\n\n const updatedManifest = await getConsumerManifest();\n if (!updatedManifest) {\n throw new Error('Could not find a package json for this project');\n }\n\n (updatedManifest.packageJson.skuba as SkubaPackageJson).version =\n currentVersion;\n\n const updatedPackageJson = await formatPackage(updatedManifest.packageJson);\n\n await fs.writeFile(updatedManifest.path, updatedPackageJson);\n logger.newline();\n logger.plain('skuba update complete.');\n logger.newline();\n\n return {\n ok: true,\n fixable: false,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fs", "path"]
|
|
7
7
|
}
|
|
@@ -105,6 +105,18 @@ const subPatches = ({
|
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
107
|
},
|
|
108
|
+
{
|
|
109
|
+
type: "nodejs",
|
|
110
|
+
files: "**/__snapshots__/**/*.snap",
|
|
111
|
+
regex: () => /"Runtime":\s*"nodejs(\d+).x"/gm,
|
|
112
|
+
replace: {
|
|
113
|
+
default: {
|
|
114
|
+
captureGroup: 1,
|
|
115
|
+
string: `"Runtime": "nodejs${nodeVersion}.x"`,
|
|
116
|
+
version: nodeVersion
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
108
120
|
{
|
|
109
121
|
type: "nodejs",
|
|
110
122
|
files: "**/infra/**/*.ts",
|
|
@@ -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';\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 { tryUpgradeInfraPackages } 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' | 'ecmascript';\n regex: () => RegExp;\n replace: {\n package?: ReplaceOptions;\n default: ReplaceOptions;\n };\n};\n\nconst subPatches = ({\n nodeVersion,\n ECMAScriptVersion,\n packageECMAScriptVersion,\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: 'ecmascript',\n files: '**/tsconfig*.json',\n regex: () => /(\"target\":\\s*\")(ES\\d+)\"/gim,\n replace: {\n package: {\n string: `$1${packageECMAScriptVersion}\"`,\n version: packageECMAScriptVersion,\n captureGroup: 2,\n },\n default: {\n string: `$1${ECMAScriptVersion}\"`,\n version: ECMAScriptVersion,\n captureGroup: 2,\n },\n },\n },\n {\n type: 'ecmascript',\n files: '**/tsconfig*.json',\n regex: () => /(\"lib\":\\s*\\[)([\\S\\s]*?)(ES\\d+)([\\S\\s]*?)(\\])/gim,\n replace: {\n package: {\n string: `$1$2${packageECMAScriptVersion}$4$5`,\n version: packageECMAScriptVersion,\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 packageECMAScriptVersion: 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 packageECMAScriptVersion,\n infraPackages,\n }: {\n nodeVersion: string;\n ECMAScriptVersion: string;\n packageNodeVersion: string;\n packageECMAScriptVersion: string;\n infraPackages: Array<{ name: string; version: string }>;\n },\n dir = process.cwd(),\n) => {\n log.ok(\n `Upgrading project to Node.js ${nodeVersion} and package targets to Node.js ${packageNodeVersion}`,\n );\n\n try {\n await tryUpgradeInfraPackages('format', infraPackages);\n await upgrade(\n {\n nodeVersion,\n ECMAScriptVersion,\n packageNodeVersion,\n packageECMAScriptVersion,\n },\n dir,\n );\n\n log.ok(\n `Upgraded project to Node.js ${nodeVersion} and package targets to Node.js ${packageNodeVersion}`,\n );\n } catch (error) {\n log.err('Failed to upgrade');\n log.subtle(inspect(error));\n process.exitCode = 1;\n }\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,uBAAqB;AACrB,sBAAe;AACf,oBAA2B;AAE3B,qBAAoB;AACpB,qBAA4C;AAE5C,oBAAgC;AAChC,qBAAwC;AAqBxC,MAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAAA,EAC1B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,QACP,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IAEP,OAAO,MACL;AAAA,IACF,SAAS;AAAA,MACP,SAAS;AAAA,QACP,cAAc;AAAA,QACd,QAAQ,iBAAiB,WAAW;AAAA,QACpC,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO,MACL;AAAA,IACF,SAAS;AAAA,MACP,SAAS;AAAA,QACP,cAAc;AAAA,QACd,QAAQ,kCAAkC,WAAW;AAAA,QACrD,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO,MAAM;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,QACP,cAAc;AAAA,QACd,QAAQ,SAAS,WAAW;AAAA,QAC5B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO,MAAM;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,QACP,cAAc;AAAA,QACd,QAAQ,OAAO,WAAW;AAAA,QAC1B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,
|
|
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 { tryUpgradeInfraPackages } 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' | 'ecmascript';\n regex: () => RegExp;\n replace: {\n package?: ReplaceOptions;\n default: ReplaceOptions;\n };\n};\n\nconst subPatches = ({\n nodeVersion,\n ECMAScriptVersion,\n packageECMAScriptVersion,\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 type: 'nodejs',\n files: '**/__snapshots__/**/*.snap',\n regex: () => /\"Runtime\":\\s*\"nodejs(\\d+).x\"/gm,\n replace: {\n default: {\n captureGroup: 1,\n string: `\"Runtime\": \"nodejs${nodeVersion}.x\"`,\n version: nodeVersion,\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: 'ecmascript',\n files: '**/tsconfig*.json',\n regex: () => /(\"target\":\\s*\")(ES\\d+)\"/gim,\n replace: {\n package: {\n string: `$1${packageECMAScriptVersion}\"`,\n version: packageECMAScriptVersion,\n captureGroup: 2,\n },\n default: {\n string: `$1${ECMAScriptVersion}\"`,\n version: ECMAScriptVersion,\n captureGroup: 2,\n },\n },\n },\n {\n type: 'ecmascript',\n files: '**/tsconfig*.json',\n regex: () => /(\"lib\":\\s*\\[)([\\S\\s]*?)(ES\\d+)([\\S\\s]*?)(\\])/gim,\n replace: {\n package: {\n string: `$1$2${packageECMAScriptVersion}$4$5`,\n version: packageECMAScriptVersion,\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 packageECMAScriptVersion: 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 packageECMAScriptVersion,\n infraPackages,\n }: {\n nodeVersion: string;\n ECMAScriptVersion: string;\n packageNodeVersion: string;\n packageECMAScriptVersion: string;\n infraPackages: Array<{ name: string; version: string }>;\n },\n dir = process.cwd(),\n) => {\n log.ok(\n `Upgrading project to Node.js ${nodeVersion} and package targets to Node.js ${packageNodeVersion}`,\n );\n\n try {\n await tryUpgradeInfraPackages('format', infraPackages);\n await upgrade(\n {\n nodeVersion,\n ECMAScriptVersion,\n packageNodeVersion,\n packageECMAScriptVersion,\n },\n dir,\n );\n\n log.ok(\n `Upgraded project to Node.js ${nodeVersion} and package targets to Node.js ${packageNodeVersion}`,\n );\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
|
}
|
|
@@ -43,19 +43,42 @@ const packageVersionRegex = (packageName) => new RegExp(`"\\b${packageName}\\b"\
|
|
|
43
43
|
const yamlPackageVersionRegex = (packageName) => new RegExp(`\\b${packageName}\\b:\\s*([^\\s]+)`, "g");
|
|
44
44
|
const normalizeVersionRange = (currentVersion, newVersion) => {
|
|
45
45
|
if (currentVersion.startsWith("^")) {
|
|
46
|
-
|
|
46
|
+
const coercedCurrent2 = (0, import_semver.coerce)(currentVersion);
|
|
47
|
+
if (coercedCurrent2 && (0, import_semver.lt)(coercedCurrent2, newVersion)) {
|
|
48
|
+
return `^${newVersion}`;
|
|
49
|
+
}
|
|
50
|
+
return currentVersion;
|
|
47
51
|
}
|
|
48
52
|
if (currentVersion.startsWith("~")) {
|
|
49
|
-
|
|
53
|
+
const coercedCurrent2 = (0, import_semver.coerce)(currentVersion);
|
|
54
|
+
if (coercedCurrent2 && (0, import_semver.lt)(coercedCurrent2, newVersion)) {
|
|
55
|
+
return `~${newVersion}`;
|
|
56
|
+
}
|
|
57
|
+
return currentVersion;
|
|
58
|
+
}
|
|
59
|
+
if (currentVersion.startsWith(">=") || currentVersion.startsWith(">")) {
|
|
60
|
+
const coercedCurrent2 = (0, import_semver.coerce)(currentVersion);
|
|
61
|
+
if (coercedCurrent2 && (0, import_semver.lt)(coercedCurrent2, newVersion)) {
|
|
62
|
+
return `^${newVersion}`;
|
|
63
|
+
}
|
|
64
|
+
return currentVersion;
|
|
50
65
|
}
|
|
51
|
-
if (currentVersion.startsWith("
|
|
66
|
+
if (currentVersion.startsWith("<=") || currentVersion.startsWith("<")) {
|
|
52
67
|
return `^${newVersion}`;
|
|
53
68
|
}
|
|
54
69
|
if (currentVersion.includes("x") || currentVersion.includes("X")) {
|
|
55
|
-
|
|
70
|
+
const coercedCurrent2 = (0, import_semver.coerce)(currentVersion);
|
|
71
|
+
if (coercedCurrent2 && (0, import_semver.lt)(coercedCurrent2, newVersion)) {
|
|
72
|
+
return `^${newVersion}`;
|
|
73
|
+
}
|
|
74
|
+
return currentVersion;
|
|
56
75
|
}
|
|
57
76
|
if (currentVersion.includes(" - ")) {
|
|
58
|
-
|
|
77
|
+
const coercedCurrent2 = (0, import_semver.coerce)(currentVersion);
|
|
78
|
+
if (coercedCurrent2 && (0, import_semver.lt)(coercedCurrent2, newVersion)) {
|
|
79
|
+
return `^${newVersion}`;
|
|
80
|
+
}
|
|
81
|
+
return currentVersion;
|
|
59
82
|
}
|
|
60
83
|
const coercedCurrent = (0, import_semver.coerce)(currentVersion);
|
|
61
84
|
if (coercedCurrent && (0, import_semver.lt)(coercedCurrent, newVersion)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/migrate/nodeVersion/upgrade.ts"],
|
|
4
|
-
"sourcesContent": ["import { inspect } from 'node:util';\n\nimport { glob } from 'fast-glob';\nimport fs from 'fs-extra';\nimport { coerce, 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(`\"\\\\b${packageName}\\\\b\"\\\\s*:\\\\s*\"([^\"]+)\"`, 'g');\n\nconst yamlPackageVersionRegex = (packageName: string) =>\n new RegExp(`\\\\b${packageName}\\\\b:\\\\s*([^\\\\s]+)`, 'g');\n\nconst normalizeVersionRange = (\n currentVersion: string,\n newVersion: string,\n): string => {\n if (currentVersion.startsWith('^')) {\n return `^${newVersion}`;\n }\n\n if (currentVersion.startsWith('~')) {\n return `~${newVersion}`;\n }\n\n // >=1.2.3, >1.2.3
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAwB;AAExB,uBAAqB;AACrB,sBAAe;AACf,oBAA2B;AAE3B,kBAAqB;AACrB,qBAAoB;AACpB,4BAAqC;AAGrC,MAAM,sBAAsB,CAAC,gBAC3B,IAAI,OAAO,OAAO,WAAW,0BAA0B,GAAG;AAE5D,MAAM,0BAA0B,CAAC,gBAC/B,IAAI,OAAO,MAAM,WAAW,qBAAqB,GAAG;AAEtD,MAAM,wBAAwB,CAC5B,gBACA,eACW;AACX,MAAI,eAAe,WAAW,GAAG,GAAG;AAClC,
|
|
6
|
-
"names": ["fs"]
|
|
4
|
+
"sourcesContent": ["import { inspect } from 'node:util';\n\nimport { glob } from 'fast-glob';\nimport fs from 'fs-extra';\nimport { coerce, 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(`\"\\\\b${packageName}\\\\b\"\\\\s*:\\\\s*\"([^\"]+)\"`, 'g');\n\nconst yamlPackageVersionRegex = (packageName: string) =>\n new RegExp(`\\\\b${packageName}\\\\b:\\\\s*([^\\\\s]+)`, 'g');\n\nconst normalizeVersionRange = (\n currentVersion: string,\n newVersion: string,\n): string => {\n if (currentVersion.startsWith('^')) {\n const coercedCurrent = coerce(currentVersion);\n if (coercedCurrent && lt(coercedCurrent, newVersion)) {\n return `^${newVersion}`;\n }\n return currentVersion;\n }\n\n if (currentVersion.startsWith('~')) {\n const coercedCurrent = coerce(currentVersion);\n if (coercedCurrent && lt(coercedCurrent, newVersion)) {\n return `~${newVersion}`;\n }\n return currentVersion;\n }\n\n // >=1.2.3, >1.2.3\n if (currentVersion.startsWith('>=') || currentVersion.startsWith('>')) {\n const coercedCurrent = coerce(currentVersion);\n if (coercedCurrent && lt(coercedCurrent, newVersion)) {\n return `^${newVersion}`;\n }\n return currentVersion;\n }\n\n // <=1.2.3, <1.2.3 - always convert since they don't guarantee target version\n if (currentVersion.startsWith('<=') || currentVersion.startsWith('<')) {\n return `^${newVersion}`;\n }\n\n // 1.x, 1.2.x, 1.x.x\n if (currentVersion.includes('x') || currentVersion.includes('X')) {\n const coercedCurrent = coerce(currentVersion);\n if (coercedCurrent && lt(coercedCurrent, newVersion)) {\n return `^${newVersion}`;\n }\n return currentVersion;\n }\n\n // 1.0.0 - 2.0.0\n if (currentVersion.includes(' - ')) {\n const coercedCurrent = coerce(currentVersion);\n if (coercedCurrent && lt(coercedCurrent, newVersion)) {\n return `^${newVersion}`;\n }\n return currentVersion;\n }\n\n const coercedCurrent = coerce(currentVersion);\n if (coercedCurrent && lt(coercedCurrent, newVersion)) {\n return newVersion;\n }\n\n return currentVersion;\n};\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 or pnpm-workspace.yaml 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 if (\n currentVersion.startsWith('*') ||\n currentVersion.startsWith('workspace:') ||\n currentVersion.startsWith('link:') ||\n currentVersion.startsWith('file:') ||\n currentVersion.startsWith('catalog:')\n ) {\n return match;\n }\n\n const newVersion = normalizeVersionRange(\n currentVersion,\n packageName.version,\n );\n\n return newVersion === currentVersion\n ? match\n : `\"${packageName.name}\":\"${newVersion}\"`;\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 newVersion = normalizeVersionRange(\n currentVersion,\n packageName.version,\n );\n\n return newVersion === currentVersion\n ? match\n : `${packageName.name}: ${newVersion}`;\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(\n packageManager.command,\n 'install',\n '--frozen-lockfile=false',\n '--prefer-offline',\n );\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.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["coercedCurrent", "fs"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skuba",
|
|
3
|
-
"version": "14.0.0-node-
|
|
3
|
+
"version": "14.0.0-node-upgrade-tweaks-20260114223652",
|
|
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",
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
]
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@ast-grep/lang-json": "^0.0.
|
|
59
|
-
"@ast-grep/napi": "^0.40.
|
|
58
|
+
"@ast-grep/lang-json": "^0.0.6",
|
|
59
|
+
"@ast-grep/napi": "^0.40.5",
|
|
60
60
|
"@esbuild-plugins/tsconfig-paths": "^0.1.0",
|
|
61
61
|
"@inquirer/prompts": "^7.9.0",
|
|
62
62
|
"@jest/types": "^30.0.0",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"@octokit/rest": "^22.0.0",
|
|
66
66
|
"@octokit/types": "^16.0.0",
|
|
67
67
|
"@types/jest": "^30.0.0",
|
|
68
|
-
"@types/node": "^
|
|
68
|
+
"@types/node": "^24.10.2",
|
|
69
69
|
"concurrently": "^9.0.0",
|
|
70
70
|
"ejs": "^3.1.6",
|
|
71
71
|
"esbuild": "~0.27.0",
|
|
@@ -102,8 +102,8 @@
|
|
|
102
102
|
"tsx": "^4.21.0",
|
|
103
103
|
"typescript": "~5.9.0",
|
|
104
104
|
"zod": "^4.0.0",
|
|
105
|
-
"@skuba-lib/api": "^2.0.0-node-
|
|
106
|
-
"eslint-config-skuba": "
|
|
105
|
+
"@skuba-lib/api": "^2.0.0-node-upgrade-tweaks-20260114223652",
|
|
106
|
+
"eslint-config-skuba": "8.0.0-node-upgrade-tweaks-20260114223652"
|
|
107
107
|
},
|
|
108
108
|
"devDependencies": {
|
|
109
109
|
"@changesets/cli": "2.29.8",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"@jest/reporters": "30.2.0",
|
|
112
112
|
"@jest/test-result": "30.2.0",
|
|
113
113
|
"@types/ejs": "3.1.5",
|
|
114
|
-
"@types/express": "5.0.
|
|
114
|
+
"@types/express": "5.0.6",
|
|
115
115
|
"@types/fs-extra": "11.0.4",
|
|
116
116
|
"@types/koa": "3.0.1",
|
|
117
117
|
"@types/lodash.mergewith": "4.6.9",
|
|
@@ -122,17 +122,17 @@
|
|
|
122
122
|
"@types/picomatch": "4.0.2",
|
|
123
123
|
"@types/semver": "7.7.1",
|
|
124
124
|
"@types/supertest": "6.0.3",
|
|
125
|
-
"enhanced-resolve": "5.18.
|
|
126
|
-
"express": "5.1
|
|
125
|
+
"enhanced-resolve": "5.18.4",
|
|
126
|
+
"express": "5.2.1",
|
|
127
127
|
"fastify": "5.6.2",
|
|
128
128
|
"jest-diff": "30.2.0",
|
|
129
129
|
"jsonfile": "6.2.0",
|
|
130
130
|
"koa": "3.1.1",
|
|
131
|
-
"memfs": "4.51.
|
|
131
|
+
"memfs": "4.51.1",
|
|
132
132
|
"remark-cli": "12.0.1",
|
|
133
133
|
"remark-preset-lint-recommended": "7.0.1",
|
|
134
134
|
"semver": "7.7.3",
|
|
135
|
-
"supertest": "7.
|
|
135
|
+
"supertest": "7.2.2",
|
|
136
136
|
"type-fest": "2.19.0"
|
|
137
137
|
},
|
|
138
138
|
"engines": {
|
|
@@ -20,15 +20,15 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@opentelemetry/api": "^1.9.0",
|
|
23
|
-
"@opentelemetry/core": "
|
|
24
|
-
"@opentelemetry/exporter-trace-otlp-grpc": "
|
|
23
|
+
"@opentelemetry/core": "~2.2.0",
|
|
24
|
+
"@opentelemetry/exporter-trace-otlp-grpc": "~0.208.0",
|
|
25
25
|
"@opentelemetry/instrumentation-aws-sdk": "^0.64.0",
|
|
26
|
-
"@opentelemetry/instrumentation-http": "
|
|
26
|
+
"@opentelemetry/instrumentation-http": "~0.208.0",
|
|
27
27
|
"@opentelemetry/propagator-b3": "^2.0.0",
|
|
28
|
-
"@opentelemetry/sdk-node": "
|
|
28
|
+
"@opentelemetry/sdk-node": "~0.208.0",
|
|
29
29
|
"@seek/logger": "^11.1.0",
|
|
30
30
|
"express": "^5.0.0",
|
|
31
|
-
"hot-shots": "^
|
|
31
|
+
"hot-shots": "^12.0.0",
|
|
32
32
|
"seek-datadog-custom-metrics": "^6.0.0",
|
|
33
33
|
"skuba-dive": "^3.0.0"
|
|
34
34
|
},
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"skuba": "*",
|
|
41
41
|
"supertest": "^7.0.0"
|
|
42
42
|
},
|
|
43
|
-
"packageManager": "pnpm@10.
|
|
43
|
+
"packageManager": "pnpm@10.28.0",
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=24"
|
|
46
46
|
}
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
"test:watch": "skuba test --watch"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"skuba-dive": "4.0.0-node-
|
|
22
|
+
"skuba-dive": "4.0.0-node-upgrade-tweaks-20260114223652"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/node": "^22.13.10",
|
|
26
|
-
"skuba": "14.0.0-node-
|
|
26
|
+
"skuba": "14.0.0-node-upgrade-tweaks-20260114223652"
|
|
27
27
|
},
|
|
28
|
-
"packageManager": "pnpm@10.
|
|
28
|
+
"packageManager": "pnpm@10.28.0",
|
|
29
29
|
"engines": {
|
|
30
30
|
"node": ">=24"
|
|
31
31
|
}
|
|
@@ -20,16 +20,16 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@koa/bodyparser": "^6.0.0",
|
|
23
|
-
"@koa/router": "
|
|
23
|
+
"@koa/router": "15.2.0",
|
|
24
24
|
"@opentelemetry/api": "^1.9.0",
|
|
25
|
-
"@opentelemetry/core": "
|
|
26
|
-
"@opentelemetry/exporter-trace-otlp-grpc": "
|
|
25
|
+
"@opentelemetry/core": "~2.2.0",
|
|
26
|
+
"@opentelemetry/exporter-trace-otlp-grpc": "~0.208.0",
|
|
27
27
|
"@opentelemetry/instrumentation-aws-sdk": "^0.64.0",
|
|
28
|
-
"@opentelemetry/instrumentation-http": "
|
|
28
|
+
"@opentelemetry/instrumentation-http": "~0.208.0",
|
|
29
29
|
"@opentelemetry/propagator-b3": "^2.0.0",
|
|
30
|
-
"@opentelemetry/sdk-node": "
|
|
30
|
+
"@opentelemetry/sdk-node": "~0.208.0",
|
|
31
31
|
"@seek/logger": "^11.1.0",
|
|
32
|
-
"hot-shots": "^
|
|
32
|
+
"hot-shots": "^12.0.0",
|
|
33
33
|
"koa": "^3.0.1",
|
|
34
34
|
"koa-compose": "^4.1.0",
|
|
35
35
|
"seek-datadog-custom-metrics": "^6.0.0",
|
|
@@ -41,7 +41,6 @@
|
|
|
41
41
|
"@types/chance": "^1.1.3",
|
|
42
42
|
"@types/co-body": "^6.1.3",
|
|
43
43
|
"@types/koa": "^3.0.0",
|
|
44
|
-
"@types/koa__router": "^12.0.0",
|
|
45
44
|
"@types/node": "^22.13.10",
|
|
46
45
|
"@types/supertest": "^6.0.0",
|
|
47
46
|
"chance": "^1.1.8",
|
|
@@ -49,7 +48,7 @@
|
|
|
49
48
|
"skuba": "*",
|
|
50
49
|
"supertest": "^7.0.0"
|
|
51
50
|
},
|
|
52
|
-
"packageManager": "pnpm@10.
|
|
51
|
+
"packageManager": "pnpm@10.28.0",
|
|
53
52
|
"engines": {
|
|
54
53
|
"node": ">=24"
|
|
55
54
|
}
|
|
@@ -216,7 +216,7 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
|
|
|
216
216
|
{
|
|
217
217
|
"Ref": "AWS::Region",
|
|
218
218
|
},
|
|
219
|
-
":464622532012:layer:Datadog-
|
|
219
|
+
":464622532012:layer:Datadog-Node24-x:x",
|
|
220
220
|
],
|
|
221
221
|
],
|
|
222
222
|
},
|
|
@@ -241,7 +241,7 @@ exports[`returns expected CloudFormation stack for dev 1`] = `
|
|
|
241
241
|
"Arn",
|
|
242
242
|
],
|
|
243
243
|
},
|
|
244
|
-
"Runtime": "
|
|
244
|
+
"Runtime": "nodejs24.x",
|
|
245
245
|
"Tags": [
|
|
246
246
|
{
|
|
247
247
|
"Key": "aws-codedeploy-hooks",
|
|
@@ -958,7 +958,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
|
|
|
958
958
|
{
|
|
959
959
|
"Ref": "AWS::Region",
|
|
960
960
|
},
|
|
961
|
-
":464622532012:layer:Datadog-
|
|
961
|
+
":464622532012:layer:Datadog-Node24-x:x",
|
|
962
962
|
],
|
|
963
963
|
],
|
|
964
964
|
},
|
|
@@ -983,7 +983,7 @@ exports[`returns expected CloudFormation stack for prod 1`] = `
|
|
|
983
983
|
"Arn",
|
|
984
984
|
],
|
|
985
985
|
},
|
|
986
|
-
"Runtime": "
|
|
986
|
+
"Runtime": "nodejs24.x",
|
|
987
987
|
"Tags": [
|
|
988
988
|
{
|
|
989
989
|
"Key": "aws-codedeploy-hooks",
|
|
@@ -19,7 +19,7 @@ import { DatadogLambda } from 'datadog-cdk-constructs-v2';
|
|
|
19
19
|
import { config } from './config.js';
|
|
20
20
|
|
|
21
21
|
// Updated by https://github.com/seek-oss/rynovate
|
|
22
|
-
const DATADOG_EXTENSION_LAYER_VERSION =
|
|
22
|
+
const DATADOG_EXTENSION_LAYER_VERSION = 91;
|
|
23
23
|
|
|
24
24
|
// Updated by https://github.com/seek-oss/rynovate
|
|
25
25
|
const DATADOG_NODE_LAYER_VERSION = 126;
|
|
@@ -86,7 +86,7 @@ export class AppStack extends Stack {
|
|
|
86
86
|
|
|
87
87
|
const worker = new aws_lambda_nodejs.NodejsFunction(this, 'worker', {
|
|
88
88
|
architecture: aws_lambda.Architecture[architecture],
|
|
89
|
-
runtime: aws_lambda.Runtime.
|
|
89
|
+
runtime: aws_lambda.Runtime.NODEJS_24_X,
|
|
90
90
|
memorySize: 512,
|
|
91
91
|
environmentEncryption: kmsKey,
|
|
92
92
|
// aws-sdk-v3 sets this to true by default, so it is not necessary to set the environment variable
|
|
@@ -96,7 +96,7 @@ export class AppStack extends Stack {
|
|
|
96
96
|
timeout: Duration.seconds(30),
|
|
97
97
|
bundling: {
|
|
98
98
|
sourceMap: true,
|
|
99
|
-
target: '
|
|
99
|
+
target: 'node24',
|
|
100
100
|
// aws-sdk-v3 is set as an external module by default, but we want it to be bundled with the function
|
|
101
101
|
externalModules: [],
|
|
102
102
|
esbuildArgs: {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@aws-sdk/client-sns": "^3.363.0",
|
|
25
25
|
"@seek/aws-codedeploy-hooks": "^2.0.0",
|
|
26
26
|
"@seek/logger": "^11.1.0",
|
|
27
|
-
"skuba-dive": "4.0.0-node-
|
|
27
|
+
"skuba-dive": "4.0.0-node-upgrade-tweaks-20260114223652",
|
|
28
28
|
"zod": "^4.0.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"datadog-lambda-js": "^12.0.0",
|
|
43
43
|
"dd-trace": "^5.0.0",
|
|
44
44
|
"pino-pretty": "^13.0.0",
|
|
45
|
-
"skuba": "14.0.0-node-
|
|
45
|
+
"skuba": "14.0.0-node-upgrade-tweaks-20260114223652"
|
|
46
46
|
},
|
|
47
|
-
"packageManager": "pnpm@10.
|
|
47
|
+
"packageManager": "pnpm@10.28.0",
|
|
48
48
|
"engines": {
|
|
49
49
|
"node": ">=24"
|
|
50
50
|
}
|