skuba 12.3.0-add-minimumReleaseAge-20250919032927 → 12.3.0

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.
@@ -33,7 +33,7 @@ __export(configFile_exports, {
33
33
  replaceManagedSection: () => replaceManagedSection
34
34
  });
35
35
  module.exports = __toCommonJS(configFile_exports);
36
- var import_v4 = __toESM(require("zod/v4"));
36
+ var z = __toESM(require("zod"));
37
37
  const OUTDATED_PATTERNS = ["node_modules_bak/", "tmp-*/"];
38
38
  const ASTERISKS = /\*/g;
39
39
  const LEADING_SLASH = /^\//;
@@ -57,36 +57,37 @@ const generateIgnoreFileSimpleVariants = (patterns) => {
57
57
  set.delete("");
58
58
  return set;
59
59
  };
60
- const ammendPnpmWorkspaceTemplate = (templateFile, packageJson) => {
61
- const lines = templateFile.split("\n");
62
- const result = [];
63
- for (const line of lines) {
64
- result.push(line);
65
- if (!packageJson || !line.startsWith("minimumReleaseAgeExclude:")) {
66
- continue;
67
- }
68
- let rawJSON;
69
- try {
70
- rawJSON = JSON.parse(packageJson);
71
- } catch {
72
- throw new Error("package.json is not valid JSON");
73
- }
74
- const parsed = import_v4.default.object({
75
- minimumReleaseAgeExcludeOverload: import_v4.default.array(import_v4.default.string()).optional()
76
- }).safeParse(rawJSON);
77
- const excludes = parsed.data?.minimumReleaseAgeExcludeOverload;
78
- if (!excludes || Array.isArray(excludes) === false || excludes.some((e) => typeof e !== "string")) {
79
- continue;
80
- }
81
- for (const exclude of excludes) {
82
- result.push(` - '${exclude}'`);
83
- }
60
+ const amendPnpmWorkspaceTemplate = (templateFile, packageJson) => {
61
+ if (!packageJson) {
62
+ return templateFile;
63
+ }
64
+ let rawJSON;
65
+ try {
66
+ rawJSON = JSON.parse(packageJson);
67
+ } catch {
68
+ throw new Error("package.json is not valid JSON");
69
+ }
70
+ const parsed = z.object({
71
+ minimumReleaseAgeExcludeOverload: z.array(z.string()).optional()
72
+ }).safeParse(rawJSON);
73
+ const excludes = parsed.data?.minimumReleaseAgeExcludeOverload;
74
+ if (!excludes || Array.isArray(excludes) === false || excludes.some((e) => typeof e !== "string")) {
75
+ return templateFile;
76
+ }
77
+ const targetKey = "minimumReleaseAgeExclude:";
78
+ const index = templateFile.indexOf(targetKey);
79
+ if (index === -1) {
80
+ return templateFile;
84
81
  }
85
- return result.join("\n");
82
+ const beforeKey = templateFile.substring(0, index);
83
+ const afterKey = templateFile.substring(index + targetKey.length);
84
+ const excludeLines = excludes.map((exclude) => ` - '${exclude}'`).join("\n");
85
+ return `${beforeKey + targetKey}
86
+ ${excludeLines}${afterKey}`;
86
87
  };
87
88
  const replaceManagedSection = (input, template) => input.replace(/# managed by skuba[\s\S]*# end managed by skuba/, template);
88
89
  const mergeWithConfigFile = (rawTemplateFile, fileType = "ignore", packageJson) => {
89
- const templateFile = fileType === "pnpm-workspace" ? ammendPnpmWorkspaceTemplate(rawTemplateFile.trim(), packageJson) : rawTemplateFile.trim();
90
+ const templateFile = fileType === "pnpm-workspace" ? amendPnpmWorkspaceTemplate(rawTemplateFile.trim(), packageJson) : rawTemplateFile.trim();
90
91
  let generator;
91
92
  switch (fileType) {
92
93
  case "ignore":
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/configure/processing/configFile.ts"],
4
- "sourcesContent": ["import z from 'zod/v4';\n\n/**\n * Patterns that are superseded by skuba's bundled ignore file patterns and are\n * non-trivial to derive using e.g. `generateSimpleVariants`.\n */\nconst OUTDATED_PATTERNS = ['node_modules_bak/', 'tmp-*/'];\n\nconst ASTERISKS = /\\*/g;\nconst LEADING_SLASH = /^\\//;\nconst TRAILING_SLASH = /\\/$/;\n\n/**\n * Generate simple variants of an ignore pattern for exact matching purposes.\n *\n * Note that these patterns are not actually equivalent (e.g. `lib` matches more\n * than `lib/`) but they generally represent the same _intent_.\n */\nexport const generateIgnoreFileSimpleVariants = (patterns: string[]) => {\n const set = new Set<string>();\n\n for (const pattern of patterns) {\n const deAsterisked = pattern.replace(ASTERISKS, '');\n const stripped = deAsterisked\n .replace(LEADING_SLASH, '')\n .replace(TRAILING_SLASH, '');\n\n set.add(pattern);\n set.add(deAsterisked);\n set.add(deAsterisked.replace(LEADING_SLASH, ''));\n set.add(deAsterisked.replace(TRAILING_SLASH, ''));\n set.add(stripped);\n\n if (stripped !== '') {\n set.add(`/${stripped}`);\n set.add(`${stripped}/`);\n set.add(`/${stripped}/`);\n }\n }\n\n set.delete('');\n\n return set;\n};\n\nconst ammendPnpmWorkspaceTemplate = (\n templateFile: string,\n packageJson?: string,\n) => {\n const lines = templateFile.split('\\n');\n const result: string[] = [];\n for (const line of lines) {\n result.push(line);\n if (!packageJson || !line.startsWith('minimumReleaseAgeExclude:')) {\n continue;\n }\n\n let rawJSON;\n try {\n rawJSON = JSON.parse(packageJson) as unknown;\n } catch {\n throw new Error('package.json is not valid JSON');\n }\n const parsed = z\n .object({\n minimumReleaseAgeExcludeOverload: z.array(z.string()).optional(),\n })\n .safeParse(rawJSON);\n\n const excludes = parsed.data?.minimumReleaseAgeExcludeOverload;\n\n if (\n !excludes ||\n Array.isArray(excludes) === false ||\n excludes.some((e) => typeof e !== 'string')\n ) {\n continue;\n }\n for (const exclude of excludes) {\n result.push(` - '${exclude}'`);\n }\n }\n\n return result.join('\\n');\n};\n\nexport const replaceManagedSection = (input: string, template: string) =>\n input.replace(/# managed by skuba[\\s\\S]*# end managed by skuba/, template);\n\nexport const mergeWithConfigFile = (\n rawTemplateFile: string,\n fileType: 'ignore' | 'pnpm-workspace' = 'ignore',\n packageJson?: string,\n) => {\n const templateFile =\n fileType === 'pnpm-workspace'\n ? ammendPnpmWorkspaceTemplate(rawTemplateFile.trim(), packageJson)\n : rawTemplateFile.trim();\n\n let generator: (s: string[], packageJson?: string) => Set<string>;\n\n switch (fileType) {\n case 'ignore':\n generator = generateIgnoreFileSimpleVariants;\n break;\n case 'pnpm-workspace':\n generator = () => new Set<string>();\n break;\n }\n\n const templatePatterns = generator(\n [\n ...OUTDATED_PATTERNS,\n ...templateFile.split('\\n').map((line) => line.trim()),\n ],\n packageJson,\n );\n\n return (rawInputFile?: string) => {\n if (rawInputFile === undefined) {\n return `${templateFile}\\n`;\n }\n\n const replacedFile = replaceManagedSection(\n rawInputFile.replace(/\\r?\\n/g, '\\n'),\n templateFile,\n );\n\n if (replacedFile.includes(templateFile)) {\n return replacedFile;\n }\n\n // Crunch the existing lines of a non-skuba config.\n const migratedFile = replacedFile\n .split('\\n')\n .filter((line) => !templatePatterns.has(line))\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n\n const outputFile = [templateFile, migratedFile].join('\\n\\n').trim();\n\n return `${outputFile}\\n`;\n };\n};\n"],
5
- "mappings": "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",
6
- "names": ["z"]
4
+ "sourcesContent": ["import * as z from 'zod';\n\n/**\n * Patterns that are superseded by skuba's bundled ignore file patterns and are\n * non-trivial to derive using e.g. `generateSimpleVariants`.\n */\nconst OUTDATED_PATTERNS = ['node_modules_bak/', 'tmp-*/'];\n\nconst ASTERISKS = /\\*/g;\nconst LEADING_SLASH = /^\\//;\nconst TRAILING_SLASH = /\\/$/;\n\n/**\n * Generate simple variants of an ignore pattern for exact matching purposes.\n *\n * Note that these patterns are not actually equivalent (e.g. `lib` matches more\n * than `lib/`) but they generally represent the same _intent_.\n */\nexport const generateIgnoreFileSimpleVariants = (patterns: string[]) => {\n const set = new Set<string>();\n\n for (const pattern of patterns) {\n const deAsterisked = pattern.replace(ASTERISKS, '');\n const stripped = deAsterisked\n .replace(LEADING_SLASH, '')\n .replace(TRAILING_SLASH, '');\n\n set.add(pattern);\n set.add(deAsterisked);\n set.add(deAsterisked.replace(LEADING_SLASH, ''));\n set.add(deAsterisked.replace(TRAILING_SLASH, ''));\n set.add(stripped);\n\n if (stripped !== '') {\n set.add(`/${stripped}`);\n set.add(`${stripped}/`);\n set.add(`/${stripped}/`);\n }\n }\n\n set.delete('');\n\n return set;\n};\n\nconst amendPnpmWorkspaceTemplate = (\n templateFile: string,\n packageJson?: string,\n) => {\n if (!packageJson) {\n return templateFile;\n }\n let rawJSON;\n try {\n rawJSON = JSON.parse(packageJson) as unknown;\n } catch {\n throw new Error('package.json is not valid JSON');\n }\n const parsed = z\n .object({\n minimumReleaseAgeExcludeOverload: z.array(z.string()).optional(),\n })\n .safeParse(rawJSON);\n\n const excludes = parsed.data?.minimumReleaseAgeExcludeOverload;\n if (\n !excludes ||\n Array.isArray(excludes) === false ||\n excludes.some((e) => typeof e !== 'string')\n ) {\n return templateFile;\n }\n\n const targetKey = 'minimumReleaseAgeExclude:';\n const index = templateFile.indexOf(targetKey);\n\n if (index === -1) {\n return templateFile;\n }\n\n const beforeKey = templateFile.substring(0, index);\n const afterKey = templateFile.substring(index + targetKey.length);\n const excludeLines = excludes.map((exclude) => ` - '${exclude}'`).join('\\n');\n\n return `${beforeKey + targetKey}\\n${excludeLines}${afterKey}`;\n};\n\nexport const replaceManagedSection = (input: string, template: string) =>\n input.replace(/# managed by skuba[\\s\\S]*# end managed by skuba/, template);\n\nexport const mergeWithConfigFile = (\n rawTemplateFile: string,\n fileType: 'ignore' | 'pnpm-workspace' = 'ignore',\n packageJson?: string,\n) => {\n const templateFile =\n fileType === 'pnpm-workspace'\n ? amendPnpmWorkspaceTemplate(rawTemplateFile.trim(), packageJson)\n : rawTemplateFile.trim();\n\n let generator: (s: string[], packageJson?: string) => Set<string>;\n\n switch (fileType) {\n case 'ignore':\n generator = generateIgnoreFileSimpleVariants;\n break;\n case 'pnpm-workspace':\n generator = () => new Set<string>();\n break;\n }\n\n const templatePatterns = generator(\n [\n ...OUTDATED_PATTERNS,\n ...templateFile.split('\\n').map((line) => line.trim()),\n ],\n packageJson,\n );\n\n return (rawInputFile?: string) => {\n if (rawInputFile === undefined) {\n return `${templateFile}\\n`;\n }\n\n const replacedFile = replaceManagedSection(\n rawInputFile.replace(/\\r?\\n/g, '\\n'),\n templateFile,\n );\n\n if (replacedFile.includes(templateFile)) {\n return replacedFile;\n }\n\n // Crunch the existing lines of a non-skuba config.\n const migratedFile = replacedFile\n .split('\\n')\n .filter((line) => !templatePatterns.has(line))\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n\n const outputFile = [templateFile, migratedFile].join('\\n\\n').trim();\n\n return `${outputFile}\\n`;\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skuba",
3
- "version": "12.3.0-add-minimumReleaseAge-20250919032927",
3
+ "version": "12.3.0",
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",
@@ -56,7 +56,7 @@
56
56
  "@octokit/graphql": "^9.0.0",
57
57
  "@octokit/graphql-schema": "^15.3.0",
58
58
  "@octokit/rest": "^22.0.0",
59
- "@octokit/types": "^14.0.0",
59
+ "@octokit/types": "^15.0.0",
60
60
  "@types/jest": "^30.0.0",
61
61
  "@types/node": "^22.0.0",
62
62
  "chalk": "^4.1.0",
@@ -97,10 +97,10 @@
97
97
  "tsx": "^4.16.2",
98
98
  "typescript": "~5.9.0",
99
99
  "zod": "^4.0.0",
100
- "eslint-config-skuba": "7.1.2-add-minimumReleaseAge-20250919032927"
100
+ "eslint-config-skuba": "7.1.2"
101
101
  },
102
102
  "devDependencies": {
103
- "@changesets/cli": "2.29.6",
103
+ "@changesets/cli": "2.29.7",
104
104
  "@changesets/get-github-info": "0.6.0",
105
105
  "@jest/reporters": "30.1.3",
106
106
  "@jest/test-result": "30.1.3",
@@ -118,11 +118,11 @@
118
118
  "@types/supertest": "6.0.3",
119
119
  "enhanced-resolve": "5.18.3",
120
120
  "express": "5.1.0",
121
- "fastify": "5.5.0",
121
+ "fastify": "5.6.1",
122
122
  "jest-diff": "30.1.2",
123
123
  "jsonfile": "6.2.0",
124
124
  "koa": "3.0.1",
125
- "memfs": "4.38.2",
125
+ "memfs": "4.43.0",
126
126
  "remark-cli": "12.0.1",
127
127
  "remark-preset-lint-recommended": "7.0.1",
128
128
  "semver": "7.7.2",
@@ -1,9 +1,13 @@
1
1
  # managed by skuba
2
- minimumReleaseAge: 1440
2
+ ignorePatchFailures: false
3
+ minimumReleaseAge: 4320 # 3 days
3
4
  minimumReleaseAgeExclude:
4
5
  - '@seek/*'
5
- - '*skuba*'
6
- - '*seek*'
6
+ - eslint-config-seek
7
+ - eslint-config-skuba
8
+ - eslint-plugin-skuba
9
+ - skuba
10
+ - tsconfig-seek
7
11
  packageManagerStrictVersion: true
8
12
  publicHoistPattern:
9
13
  - '@types*'
@@ -15,11 +15,11 @@
15
15
  "dependencies": {
16
16
  "@opentelemetry/api": "^1.9.0",
17
17
  "@opentelemetry/core": "^2.0.0",
18
- "@opentelemetry/exporter-trace-otlp-grpc": "^0.204.0",
19
- "@opentelemetry/instrumentation-aws-sdk": "^0.59.0",
20
- "@opentelemetry/instrumentation-http": "^0.204.0",
18
+ "@opentelemetry/exporter-trace-otlp-grpc": "^0.205.0",
19
+ "@opentelemetry/instrumentation-aws-sdk": "^0.60.0",
20
+ "@opentelemetry/instrumentation-http": "^0.205.0",
21
21
  "@opentelemetry/propagator-b3": "^2.0.0",
22
- "@opentelemetry/sdk-node": "^0.204.0",
22
+ "@opentelemetry/sdk-node": "^0.205.0",
23
23
  "@seek/logger": "^11.1.0",
24
24
  "express": "^5.0.0",
25
25
  "hot-shots": "^11.0.0",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/node": "^22.13.10",
20
- "skuba": "12.3.0-add-minimumReleaseAge-20250919032927"
20
+ "skuba": "*"
21
21
  },
22
22
  "packageManager": "pnpm@10.17.0",
23
23
  "engines": {
@@ -17,11 +17,11 @@
17
17
  "@koa/router": "^14.0.0",
18
18
  "@opentelemetry/api": "^1.9.0",
19
19
  "@opentelemetry/core": "^2.0.0",
20
- "@opentelemetry/exporter-trace-otlp-grpc": "^0.204.0",
21
- "@opentelemetry/instrumentation-aws-sdk": "^0.59.0",
22
- "@opentelemetry/instrumentation-http": "^0.204.0",
20
+ "@opentelemetry/exporter-trace-otlp-grpc": "^0.205.0",
21
+ "@opentelemetry/instrumentation-aws-sdk": "^0.60.0",
22
+ "@opentelemetry/instrumentation-http": "^0.205.0",
23
23
  "@opentelemetry/propagator-b3": "^2.0.0",
24
- "@opentelemetry/sdk-node": "^0.204.0",
24
+ "@opentelemetry/sdk-node": "^0.205.0",
25
25
  "@seek/logger": "^11.1.0",
26
26
  "hot-shots": "^11.0.0",
27
27
  "koa": "^3.0.1",
@@ -35,7 +35,7 @@
35
35
  "datadog-lambda-js": "^12.0.0",
36
36
  "dd-trace": "^5.0.0",
37
37
  "pino-pretty": "^13.0.0",
38
- "skuba": "12.3.0-add-minimumReleaseAge-20250919032927"
38
+ "skuba": "*"
39
39
  },
40
40
  "packageManager": "pnpm@10.17.0",
41
41
  "engines": {