renovate 44.99.0 → 44.100.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.
@@ -1,21 +1,9 @@
1
- import { newlineRegex, regEx } from "../../../util/regex.js";
1
+ import { regEx } from "../../../util/regex.js";
2
2
  import { logger } from "../../../logger/index.js";
3
3
  import { api } from "../../versioning/apk/index.js";
4
4
  import { ApkDatasource } from "../../datasource/apk/index.js";
5
- import { split } from "shlex";
5
+ import { parseRunCommands } from "./run-command.js";
6
6
  //#region lib/modules/manager/dockerfile/apk.ts
7
- /** Shell operators which start a new command */
8
- const commandSeparators = [
9
- "&&",
10
- "||",
11
- ";",
12
- "|",
13
- "&",
14
- "(",
15
- ")",
16
- "{",
17
- "}"
18
- ];
19
7
  /**
20
8
  * `apk` options which consume the following argument, so that the argument is
21
9
  * not mistaken for a package name.
@@ -107,12 +95,6 @@ function extractApkAddArgs(tokens) {
107
95
  return deps;
108
96
  }
109
97
  /**
110
- * The `RUN` keyword and its flags, e.g. `RUN --mount=type=cache,target=/x `.
111
- *
112
- * Stripping these leaves the shell command that the instruction runs.
113
- */
114
- const runPrefixRegex = regEx(/^[ \t]*(?:ONBUILD[ \t]+)?RUN[ \t]+(?:--[a-z]\S*[ \t]+)*/i);
115
- /**
116
98
  * Extracts APK packages pinned by `apk add` in a `RUN` instruction, e.g.
117
99
  *
118
100
  * ```dockerfile
@@ -125,51 +107,7 @@ const runPrefixRegex = regEx(/^[ \t]*(?:ONBUILD[ \t]+)?RUN[ \t]+(?:--[a-z]\S*[ \
125
107
  * @param escapeChar the Dockerfile escape character, already regex-escaped
126
108
  */
127
109
  function extractApkDeps(instruction, escapeChar) {
128
- const joined = instruction.split(newlineRegex).filter((line) => !regEx(/^[ \t]*#/).test(line)).join("\n").replace(regEx(`${escapeChar}[ \\t]*\\r?\\n`, "g"), " ");
129
- const runPrefix = runPrefixRegex.exec(joined)?.[0];
130
- if (!runPrefix) return [];
131
- const command = joined.slice(runPrefix.length);
132
- if (!command.includes("apk")) return [];
133
- let tokens;
134
- try {
135
- tokens = split(command);
136
- } catch (err) {
137
- logger.debug({
138
- err,
139
- command
140
- }, "Failed to tokenize Dockerfile RUN command");
141
- return [];
142
- }
143
- const deps = [];
144
- let current = [];
145
- for (const token of tokens) {
146
- if (token.startsWith("#")) break;
147
- if (commandSeparators.includes(token)) {
148
- deps.push(...extractApkCommand(current));
149
- current = [];
150
- continue;
151
- }
152
- if (token.endsWith(";")) {
153
- current.push(token.slice(0, -1));
154
- deps.push(...extractApkCommand(current));
155
- current = [];
156
- continue;
157
- }
158
- current.push(token);
159
- }
160
- deps.push(...extractApkCommand(current));
161
- return deps;
162
- }
163
- /**
164
- * Finds the `apk` invocation in the tokens of a shell command, wherever it
165
- * sits - so it's found whether it's prefixed by a shell keyword
166
- * (`do`/`then`/...), a variable assignment (`DEBUG=1 apk add ...`), or a
167
- * wrapper program (`sudo`/`chroot /mnt`/`timeout 30`/...).
168
- */
169
- function extractApkCommand(tokens) {
170
- const index = tokens.findIndex((token) => token === "apk" || token.endsWith("/apk"));
171
- if (index === -1) return [];
172
- return extractApkAddArgs(tokens.slice(index + 1));
110
+ return parseRunCommands(instruction, escapeChar, ["apk"]).flatMap(extractApkAddArgs);
173
111
  }
174
112
  //#endregion
175
113
  export { extractApkDeps };
@@ -1 +1 @@
1
- {"version":3,"file":"apk.js","names":["apkVersioning"],"sources":["../../../../lib/modules/manager/dockerfile/apk.ts"],"sourcesContent":["import { split } from 'shlex';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ApkDatasource } from '../../datasource/apk/index.ts';\nimport { api as apkVersioning } from '../../versioning/apk/index.ts';\nimport type { PackageDependency } from '../types.ts';\n\n/** Shell operators which start a new command */\nconst commandSeparators = ['&&', '||', ';', '|', '&', '(', ')', '{', '}'];\n\n/**\n * `apk` options which consume the following argument, so that the argument is\n * not mistaken for a package name.\n *\n * Options given as `--opt=value` are a single token, so they need no entry here.\n */\nconst optionsWithValue = new Set([\n '-X',\n '--repository',\n '-t',\n '--virtual',\n '-p',\n '--root',\n '--arch',\n '--cache-dir',\n '--cache-max-age',\n '--keys-dir',\n '--repositories-file',\n '--progress-fd',\n '--timeout',\n '--wait',\n]);\n\n/**\n * An `apk` package specification, e.g. `bash`, `bash=5.2.37-r2`, `bash>5.2` or\n * `nodejs@edge=22.13.1-r0`.\n *\n * `apk` builds the constraint operator from its characters, so they may be\n * given in any order and may repeat - see the `apk` versioning module.\n *\n * The `@repoTag` suffix pins the package to a tagged repository from\n * `/etc/apk/repositories`, and is part of the spec rather than of the name.\n */\nconst apkSpecRegex = regEx(\n /^(?<name>[a-zA-Z0-9][\\w.+-]*)(?:@(?<repoTag>[\\w.-]+))?(?:(?<operator>[<>=~]+)(?<version>.+))?$/,\n);\n\nfunction parseSpec(spec: string): PackageDependency | null {\n const groups = apkSpecRegex.exec(spec)?.groups;\n if (!groups) {\n logger.trace({ spec }, 'Skipping unparseable apk package spec');\n return null;\n }\n\n const { name, operator, version } = groups;\n // the `apk` datasource defaults to `apk` versioning, so the constraint is\n // read the same way here as it is during the lookup\n const dep: PackageDependency = {\n datasource: ApkDatasource.id,\n depName: name,\n };\n\n if (!operator) {\n // Renovate has nothing to update until the user constrains the version\n dep.skipReason = 'unspecified-version';\n return dep;\n }\n\n if (version.includes('$')) {\n dep.skipReason = 'contains-variable';\n return dep;\n }\n\n // rejects an unparseable version, and the `><` identity hash operator\n const constraint = operator + version;\n if (!apkVersioning.isValid(constraint)) {\n dep.skipReason = 'unsupported-version';\n return dep;\n }\n\n // An exact pin reads better as a plain version, so the `=` stays in the\n // replaceString rather than becoming part of the value we report\n const isPin = apkVersioning.isSingleVersion(constraint);\n const currentValue = isPin ? version : constraint;\n\n dep.currentValue = currentValue;\n dep.replaceString = spec;\n // Only the value is templated, so a `@repoTag` in the spec is preserved\n dep.autoReplaceStringTemplate = `${spec.slice(0, -currentValue.length)}{{{newValue}}}`;\n return dep;\n}\n\n/** Package specs which are not registry lookups, and so are silently ignored */\nfunction isIgnoredSpec(spec: string): boolean {\n return (\n // conflict markers, e.g. `apk add foo !bar`\n spec.startsWith('!') ||\n // virtual package names, e.g. `apk add .build-deps`\n spec.startsWith('.') ||\n // local or remote `.apk` files, e.g. `apk add ./foo-1.2.3-r0.apk`\n spec.includes('/') ||\n // provider dependencies, e.g. `so:libc.musl-x86_64.so.1`, `cmd:node`\n spec.includes(':')\n );\n}\n\nfunction extractApkAddArgs(tokens: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n let subCommandFound = false;\n\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n\n if (token.startsWith('-')) {\n if (optionsWithValue.has(token)) {\n i += 1;\n }\n continue;\n }\n\n if (!subCommandFound) {\n // `apk` accepts global options before the sub-command, so the first\n // non-option token is the sub-command\n if (token !== 'add') {\n return [];\n }\n subCommandFound = true;\n continue;\n }\n\n if (isIgnoredSpec(token)) {\n logger.trace({ spec: token }, 'Skipping apk package spec');\n continue;\n }\n\n const dep = parseSpec(token);\n if (dep) {\n deps.push(dep);\n }\n }\n\n return deps;\n}\n\n/**\n * The `RUN` keyword and its flags, e.g. `RUN --mount=type=cache,target=/x `.\n *\n * Stripping these leaves the shell command that the instruction runs.\n */\nconst runPrefixRegex = regEx(\n /^[ \\t]*(?:ONBUILD[ \\t]+)?RUN[ \\t]+(?:--[a-z]\\S*[ \\t]+)*/i,\n);\n\n/**\n * Extracts APK packages pinned by `apk add` in a `RUN` instruction, e.g.\n *\n * ```dockerfile\n * RUN apk add --no-cache \\\n * bash=5.2.37-r2 \\\n * rsyslog=8.2412.0-r1\n * ```\n *\n * @param instruction the full `RUN` instruction, including any line continuations\n * @param escapeChar the Dockerfile escape character, already regex-escaped\n */\nexport function extractApkDeps(\n instruction: string,\n escapeChar: string,\n): PackageDependency[] {\n // A `#` line inside a line continuation is a Dockerfile comment, and is\n // dropped before the shell ever sees it\n const joined = instruction\n .split(newlineRegex)\n .filter((line) => !regEx(/^[ \\t]*#/).test(line))\n .join('\\n')\n .replace(regEx(`${escapeChar}[ \\\\t]*\\\\r?\\\\n`, 'g'), ' ');\n\n const runPrefix = runPrefixRegex.exec(joined)?.[0];\n if (!runPrefix) {\n return [];\n }\n\n const command = joined.slice(runPrefix.length);\n if (!command.includes('apk')) {\n return [];\n }\n\n let tokens: string[];\n try {\n tokens = split(command);\n } catch (err) {\n logger.debug({ err, command }, 'Failed to tokenize Dockerfile RUN command');\n return [];\n }\n\n const deps: PackageDependency[] = [];\n // Split the shell command into the individual commands it runs, so that only\n // the arguments of an `apk` invocation are considered\n let current: string[] = [];\n for (const token of tokens) {\n if (token.startsWith('#')) {\n // the rest of the command is a shell comment\n break;\n }\n if (commandSeparators.includes(token)) {\n deps.push(...extractApkCommand(current));\n current = [];\n continue;\n }\n // e.g. the `{1..10};` of `for iter in {1..10}; do apk add ...`, which shlex\n // keeps as one token because no whitespace precedes the `;`\n if (token.endsWith(';')) {\n current.push(token.slice(0, -1));\n deps.push(...extractApkCommand(current));\n current = [];\n continue;\n }\n current.push(token);\n }\n deps.push(...extractApkCommand(current));\n\n return deps;\n}\n\n/**\n * Finds the `apk` invocation in the tokens of a shell command, wherever it\n * sits - so it's found whether it's prefixed by a shell keyword\n * (`do`/`then`/...), a variable assignment (`DEBUG=1 apk add ...`), or a\n * wrapper program (`sudo`/`chroot /mnt`/`timeout 30`/...).\n */\nfunction extractApkCommand(tokens: string[]): PackageDependency[] {\n const index = tokens.findIndex(\n (token) => token === 'apk' || token.endsWith('/apk'),\n );\n if (index === -1) {\n return [];\n }\n return extractApkAddArgs(tokens.slice(index + 1));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"apk.js","names":["apkVersioning"],"sources":["../../../../lib/modules/manager/dockerfile/apk.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ApkDatasource } from '../../datasource/apk/index.ts';\nimport { api as apkVersioning } from '../../versioning/apk/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { parseRunCommands } from './run-command.ts';\n\n/**\n * `apk` options which consume the following argument, so that the argument is\n * not mistaken for a package name.\n *\n * Options given as `--opt=value` are a single token, so they need no entry here.\n */\nconst optionsWithValue = new Set([\n '-X',\n '--repository',\n '-t',\n '--virtual',\n '-p',\n '--root',\n '--arch',\n '--cache-dir',\n '--cache-max-age',\n '--keys-dir',\n '--repositories-file',\n '--progress-fd',\n '--timeout',\n '--wait',\n]);\n\n/**\n * An `apk` package specification, e.g. `bash`, `bash=5.2.37-r2`, `bash>5.2` or\n * `nodejs@edge=22.13.1-r0`.\n *\n * `apk` builds the constraint operator from its characters, so they may be\n * given in any order and may repeat - see the `apk` versioning module.\n *\n * The `@repoTag` suffix pins the package to a tagged repository from\n * `/etc/apk/repositories`, and is part of the spec rather than of the name.\n */\nconst apkSpecRegex = regEx(\n /^(?<name>[a-zA-Z0-9][\\w.+-]*)(?:@(?<repoTag>[\\w.-]+))?(?:(?<operator>[<>=~]+)(?<version>.+))?$/,\n);\n\nfunction parseSpec(spec: string): PackageDependency | null {\n const groups = apkSpecRegex.exec(spec)?.groups;\n if (!groups) {\n logger.trace({ spec }, 'Skipping unparseable apk package spec');\n return null;\n }\n\n const { name, operator, version } = groups;\n // the `apk` datasource defaults to `apk` versioning, so the constraint is\n // read the same way here as it is during the lookup\n const dep: PackageDependency = {\n datasource: ApkDatasource.id,\n depName: name,\n };\n\n if (!operator) {\n // Renovate has nothing to update until the user constrains the version\n dep.skipReason = 'unspecified-version';\n return dep;\n }\n\n if (version.includes('$')) {\n dep.skipReason = 'contains-variable';\n return dep;\n }\n\n // rejects an unparseable version, and the `><` identity hash operator\n const constraint = operator + version;\n if (!apkVersioning.isValid(constraint)) {\n dep.skipReason = 'unsupported-version';\n return dep;\n }\n\n // An exact pin reads better as a plain version, so the `=` stays in the\n // replaceString rather than becoming part of the value we report\n const isPin = apkVersioning.isSingleVersion(constraint);\n const currentValue = isPin ? version : constraint;\n\n dep.currentValue = currentValue;\n dep.replaceString = spec;\n // Only the value is templated, so a `@repoTag` in the spec is preserved\n dep.autoReplaceStringTemplate = `${spec.slice(0, -currentValue.length)}{{{newValue}}}`;\n return dep;\n}\n\n/** Package specs which are not registry lookups, and so are silently ignored */\nfunction isIgnoredSpec(spec: string): boolean {\n return (\n // conflict markers, e.g. `apk add foo !bar`\n spec.startsWith('!') ||\n // virtual package names, e.g. `apk add .build-deps`\n spec.startsWith('.') ||\n // local or remote `.apk` files, e.g. `apk add ./foo-1.2.3-r0.apk`\n spec.includes('/') ||\n // provider dependencies, e.g. `so:libc.musl-x86_64.so.1`, `cmd:node`\n spec.includes(':')\n );\n}\n\nfunction extractApkAddArgs(tokens: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n let subCommandFound = false;\n\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n\n if (token.startsWith('-')) {\n if (optionsWithValue.has(token)) {\n i += 1;\n }\n continue;\n }\n\n if (!subCommandFound) {\n // `apk` accepts global options before the sub-command, so the first\n // non-option token is the sub-command\n if (token !== 'add') {\n return [];\n }\n subCommandFound = true;\n continue;\n }\n\n if (isIgnoredSpec(token)) {\n logger.trace({ spec: token }, 'Skipping apk package spec');\n continue;\n }\n\n const dep = parseSpec(token);\n if (dep) {\n deps.push(dep);\n }\n }\n\n return deps;\n}\n\n/**\n * Extracts APK packages pinned by `apk add` in a `RUN` instruction, e.g.\n *\n * ```dockerfile\n * RUN apk add --no-cache \\\n * bash=5.2.37-r2 \\\n * rsyslog=8.2412.0-r1\n * ```\n *\n * @param instruction the full `RUN` instruction, including any line continuations\n * @param escapeChar the Dockerfile escape character, already regex-escaped\n */\nexport function extractApkDeps(\n instruction: string,\n escapeChar: string,\n): PackageDependency[] {\n return parseRunCommands(instruction, escapeChar, ['apk']).flatMap(\n extractApkAddArgs,\n );\n}\n"],"mappings":";;;;;;;;;;;;AAaA,MAAM,mCAAmB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;;;;AAYD,MAAM,eAAe,MACnB,gGACF;AAEA,SAAS,UAAU,MAAwC;CACzD,MAAM,SAAS,aAAa,KAAK,IAAI,CAAC,EAAE;CACxC,IAAI,CAAC,QAAQ;EACX,OAAO,MAAM,EAAE,KAAK,GAAG,uCAAuC;EAC9D,OAAO;CACT;CAEA,MAAM,EAAE,MAAM,UAAU,YAAY;CAGpC,MAAM,MAAyB;EAC7B,YAAY,cAAc;EAC1B,SAAS;CACX;CAEA,IAAI,CAAC,UAAU;EAEb,IAAI,aAAa;EACjB,OAAO;CACT;CAEA,IAAI,QAAQ,SAAS,GAAG,GAAG;EACzB,IAAI,aAAa;EACjB,OAAO;CACT;CAGA,MAAM,aAAa,WAAW;CAC9B,IAAI,CAACA,IAAc,QAAQ,UAAU,GAAG;EACtC,IAAI,aAAa;EACjB,OAAO;CACT;CAKA,MAAM,eADQA,IAAc,gBAAgB,UACnB,IAAI,UAAU;CAEvC,IAAI,eAAe;CACnB,IAAI,gBAAgB;CAEpB,IAAI,4BAA4B,GAAG,KAAK,MAAM,GAAG,CAAC,aAAa,MAAM,EAAE;CACvE,OAAO;AACT;;AAGA,SAAS,cAAc,MAAuB;CAC5C,OAEE,KAAK,WAAW,GAAG,KAEnB,KAAK,WAAW,GAAG,KAEnB,KAAK,SAAS,GAAG,KAEjB,KAAK,SAAS,GAAG;AAErB;AAEA,SAAS,kBAAkB,QAAuC;CAChE,MAAM,OAA4B,CAAC;CACnC,IAAI,kBAAkB;CAEtB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;EACzC,MAAM,QAAQ,OAAO;EAErB,IAAI,MAAM,WAAW,GAAG,GAAG;GACzB,IAAI,iBAAiB,IAAI,KAAK,GAC5B,KAAK;GAEP;EACF;EAEA,IAAI,CAAC,iBAAiB;GAGpB,IAAI,UAAU,OACZ,OAAO,CAAC;GAEV,kBAAkB;GAClB;EACF;EAEA,IAAI,cAAc,KAAK,GAAG;GACxB,OAAO,MAAM,EAAE,MAAM,MAAM,GAAG,2BAA2B;GACzD;EACF;EAEA,MAAM,MAAM,UAAU,KAAK;EAC3B,IAAI,KACF,KAAK,KAAK,GAAG;CAEjB;CAEA,OAAO;AACT;;;;;;;;;;;;;AAcA,SAAgB,eACd,aACA,YACqB;CACrB,OAAO,iBAAiB,aAAa,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,QACxD,iBACF;AACF"}
@@ -0,0 +1,108 @@
1
+ import { regEx } from "../../../util/regex.js";
2
+ import { logger } from "../../../logger/index.js";
3
+ import { api } from "../../versioning/deb/index.js";
4
+ import { DebDatasource } from "../../datasource/deb/index.js";
5
+ import { parseRunCommands } from "./run-command.js";
6
+ //#region lib/modules/manager/dockerfile/deb.ts
7
+ /**
8
+ * `apt` options which consume the following argument, so that the argument is
9
+ * not mistaken for a package name.
10
+ *
11
+ * Options given as `--opt=value` are a single token, so they need no entry here.
12
+ */
13
+ const optionsWithValue = /* @__PURE__ */ new Set([
14
+ "-o",
15
+ "--option",
16
+ "-c",
17
+ "--config-file",
18
+ "-t",
19
+ "--target-release",
20
+ "--default-release",
21
+ "-a",
22
+ "--host-architecture",
23
+ "--build-profiles"
24
+ ]);
25
+ /**
26
+ * An `apt` package specification, e.g. `curl`, `curl=8.5.0-2ubuntu10.6`,
27
+ * `curl:amd64=8.5.0-2ubuntu10.6` or `curl/bookworm-backports`.
28
+ *
29
+ * The `:arch` qualifier selects the architecture to install for, and the
30
+ * `/release` suffix picks the suite to install from - both are part of the
31
+ * spec rather than of the package name.
32
+ */
33
+ const debSpecRegex = regEx(/^(?<name>[a-z0-9][a-z0-9+.-]*)(?::(?<arch>[a-z0-9][a-z0-9-]*))?(?:=(?<version>.+)|\/(?<release>[a-z0-9][\w.-]*))?$/);
34
+ function parseSpec(spec) {
35
+ const groups = debSpecRegex.exec(spec)?.groups;
36
+ if (!groups) {
37
+ logger.trace({ spec }, "Skipping unparseable apt package spec");
38
+ return null;
39
+ }
40
+ const { name, version } = groups;
41
+ const dep = {
42
+ datasource: DebDatasource.id,
43
+ depName: name
44
+ };
45
+ if (!version) {
46
+ dep.skipReason = "unspecified-version";
47
+ return dep;
48
+ }
49
+ if (version.includes("$")) {
50
+ dep.skipReason = "contains-variable";
51
+ return dep;
52
+ }
53
+ if (!api.isSingleVersion(version)) {
54
+ dep.skipReason = "unsupported-version";
55
+ return dep;
56
+ }
57
+ dep.currentValue = version;
58
+ dep.replaceString = spec;
59
+ dep.autoReplaceStringTemplate = `${spec.slice(0, -version.length)}{{{newValue}}}`;
60
+ return dep;
61
+ }
62
+ /** Package specs which are not registry lookups, and so are silently ignored */
63
+ function isIgnoredSpec(spec) {
64
+ return spec.endsWith(".deb") || spec.startsWith(".") || spec.startsWith("/") || spec.endsWith("-") || spec.endsWith("+");
65
+ }
66
+ function extractAptInstallArgs(tokens) {
67
+ const deps = [];
68
+ let subCommandFound = false;
69
+ for (let i = 0; i < tokens.length; i += 1) {
70
+ const token = tokens[i];
71
+ if (token.startsWith("-")) {
72
+ if (optionsWithValue.has(token)) i += 1;
73
+ continue;
74
+ }
75
+ if (!subCommandFound) {
76
+ if (token !== "install") return [];
77
+ subCommandFound = true;
78
+ continue;
79
+ }
80
+ if (isIgnoredSpec(token)) {
81
+ logger.trace({ spec: token }, "Skipping apt package spec");
82
+ continue;
83
+ }
84
+ const dep = parseSpec(token);
85
+ if (dep) deps.push(dep);
86
+ }
87
+ return deps;
88
+ }
89
+ /**
90
+ * Extracts Debian packages pinned by `apt install` or `apt-get install` in a
91
+ * `RUN` instruction, e.g.
92
+ *
93
+ * ```dockerfile
94
+ * RUN apt-get update && apt-get install -y --no-install-recommends \
95
+ * curl=8.5.0-2ubuntu10.6 \
96
+ * git=1:2.43.0-1ubuntu7.3
97
+ * ```
98
+ *
99
+ * @param instruction the full `RUN` instruction, including any line continuations
100
+ * @param escapeChar the Dockerfile escape character, already regex-escaped
101
+ */
102
+ function extractDebDeps(instruction, escapeChar) {
103
+ return parseRunCommands(instruction, escapeChar, ["apt", "apt-get"]).flatMap(extractAptInstallArgs);
104
+ }
105
+ //#endregion
106
+ export { extractDebDeps };
107
+
108
+ //# sourceMappingURL=deb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deb.js","names":["debVersioning"],"sources":["../../../../lib/modules/manager/dockerfile/deb.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { DebDatasource } from '../../datasource/deb/index.ts';\nimport { api as debVersioning } from '../../versioning/deb/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { parseRunCommands } from './run-command.ts';\n\n/**\n * `apt` options which consume the following argument, so that the argument is\n * not mistaken for a package name.\n *\n * Options given as `--opt=value` are a single token, so they need no entry here.\n */\nconst optionsWithValue = new Set([\n '-o',\n '--option',\n '-c',\n '--config-file',\n '-t',\n '--target-release',\n '--default-release',\n '-a',\n '--host-architecture',\n '--build-profiles',\n]);\n\n/**\n * An `apt` package specification, e.g. `curl`, `curl=8.5.0-2ubuntu10.6`,\n * `curl:amd64=8.5.0-2ubuntu10.6` or `curl/bookworm-backports`.\n *\n * The `:arch` qualifier selects the architecture to install for, and the\n * `/release` suffix picks the suite to install from - both are part of the\n * spec rather than of the package name.\n */\nconst debSpecRegex = regEx(\n /^(?<name>[a-z0-9][a-z0-9+.-]*)(?::(?<arch>[a-z0-9][a-z0-9-]*))?(?:=(?<version>.+)|\\/(?<release>[a-z0-9][\\w.-]*))?$/,\n);\n\nfunction parseSpec(spec: string): PackageDependency | null {\n const groups = debSpecRegex.exec(spec)?.groups;\n if (!groups) {\n logger.trace({ spec }, 'Skipping unparseable apt package spec');\n return null;\n }\n\n const { name, version } = groups;\n const dep: PackageDependency = {\n datasource: DebDatasource.id,\n depName: name,\n };\n\n if (!version) {\n // a bare name, or one only pinned to a suite, leaves Renovate nothing to\n // update\n dep.skipReason = 'unspecified-version';\n return dep;\n }\n\n if (version.includes('$')) {\n dep.skipReason = 'contains-variable';\n return dep;\n }\n\n // `apt` also accepts a wildcard such as `curl=8.5.*`, which is not a version\n // we can compare against the releases we find\n if (!debVersioning.isSingleVersion(version)) {\n dep.skipReason = 'unsupported-version';\n return dep;\n }\n\n dep.currentValue = version;\n dep.replaceString = spec;\n // Only the version is templated, so an `:arch` in the spec is preserved\n dep.autoReplaceStringTemplate = `${spec.slice(0, -version.length)}{{{newValue}}}`;\n return dep;\n}\n\n/** Package specs which are not registry lookups, and so are silently ignored */\nfunction isIgnoredSpec(spec: string): boolean {\n return (\n // local or remote `.deb` files, e.g. `apt install ./curl_8.5.0-2_amd64.deb`\n spec.endsWith('.deb') ||\n spec.startsWith('.') ||\n spec.startsWith('/') ||\n // the `-` removes a package and the `+` installs one, e.g.\n // `apt install curl vim-`\n spec.endsWith('-') ||\n spec.endsWith('+')\n );\n}\n\nfunction extractAptInstallArgs(tokens: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n let subCommandFound = false;\n\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n\n if (token.startsWith('-')) {\n if (optionsWithValue.has(token)) {\n i += 1;\n }\n continue;\n }\n\n if (!subCommandFound) {\n // `apt` accepts global options before the sub-command, so the first\n // non-option token is the sub-command\n if (token !== 'install') {\n return [];\n }\n subCommandFound = true;\n continue;\n }\n\n if (isIgnoredSpec(token)) {\n logger.trace({ spec: token }, 'Skipping apt package spec');\n continue;\n }\n\n const dep = parseSpec(token);\n if (dep) {\n deps.push(dep);\n }\n }\n\n return deps;\n}\n\n/**\n * Extracts Debian packages pinned by `apt install` or `apt-get install` in a\n * `RUN` instruction, e.g.\n *\n * ```dockerfile\n * RUN apt-get update && apt-get install -y --no-install-recommends \\\n * curl=8.5.0-2ubuntu10.6 \\\n * git=1:2.43.0-1ubuntu7.3\n * ```\n *\n * @param instruction the full `RUN` instruction, including any line continuations\n * @param escapeChar the Dockerfile escape character, already regex-escaped\n */\nexport function extractDebDeps(\n instruction: string,\n escapeChar: string,\n): PackageDependency[] {\n return parseRunCommands(instruction, escapeChar, ['apt', 'apt-get']).flatMap(\n extractAptInstallArgs,\n );\n}\n"],"mappings":";;;;;;;;;;;;AAaA,MAAM,mCAAmB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;;AAUD,MAAM,eAAe,MACnB,oHACF;AAEA,SAAS,UAAU,MAAwC;CACzD,MAAM,SAAS,aAAa,KAAK,IAAI,CAAC,EAAE;CACxC,IAAI,CAAC,QAAQ;EACX,OAAO,MAAM,EAAE,KAAK,GAAG,uCAAuC;EAC9D,OAAO;CACT;CAEA,MAAM,EAAE,MAAM,YAAY;CAC1B,MAAM,MAAyB;EAC7B,YAAY,cAAc;EAC1B,SAAS;CACX;CAEA,IAAI,CAAC,SAAS;EAGZ,IAAI,aAAa;EACjB,OAAO;CACT;CAEA,IAAI,QAAQ,SAAS,GAAG,GAAG;EACzB,IAAI,aAAa;EACjB,OAAO;CACT;CAIA,IAAI,CAACA,IAAc,gBAAgB,OAAO,GAAG;EAC3C,IAAI,aAAa;EACjB,OAAO;CACT;CAEA,IAAI,eAAe;CACnB,IAAI,gBAAgB;CAEpB,IAAI,4BAA4B,GAAG,KAAK,MAAM,GAAG,CAAC,QAAQ,MAAM,EAAE;CAClE,OAAO;AACT;;AAGA,SAAS,cAAc,MAAuB;CAC5C,OAEE,KAAK,SAAS,MAAM,KACpB,KAAK,WAAW,GAAG,KACnB,KAAK,WAAW,GAAG,KAGnB,KAAK,SAAS,GAAG,KACjB,KAAK,SAAS,GAAG;AAErB;AAEA,SAAS,sBAAsB,QAAuC;CACpE,MAAM,OAA4B,CAAC;CACnC,IAAI,kBAAkB;CAEtB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;EACzC,MAAM,QAAQ,OAAO;EAErB,IAAI,MAAM,WAAW,GAAG,GAAG;GACzB,IAAI,iBAAiB,IAAI,KAAK,GAC5B,KAAK;GAEP;EACF;EAEA,IAAI,CAAC,iBAAiB;GAGpB,IAAI,UAAU,WACZ,OAAO,CAAC;GAEV,kBAAkB;GAClB;EACF;EAEA,IAAI,cAAc,KAAK,GAAG;GACxB,OAAO,MAAM,EAAE,MAAM,MAAM,GAAG,2BAA2B;GACzD;EACF;EAEA,MAAM,MAAM,UAAU,KAAK;EAC3B,IAAI,KACF,KAAK,KAAK,GAAG;CAEjB;CAEA,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAgB,eACd,aACA,YACqB;CACrB,OAAO,iBAAiB,aAAa,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,QACnE,qBACF;AACF"}
@@ -6,6 +6,7 @@ import { api, id } from "../../versioning/debian/index.js";
6
6
  import { id as id$1 } from "../../versioning/ubuntu/index.js";
7
7
  import { DockerDatasource } from "../../datasource/docker/index.js";
8
8
  import { extractApkDeps } from "./apk.js";
9
+ import { extractDebDeps } from "./deb.js";
9
10
  import { isNonEmptyStringAndNotWhitespace, isNumericString, isString } from "@sindresorhus/is";
10
11
  //#region lib/modules/manager/dockerfile/extract.ts
11
12
  const variableMarker = "$";
@@ -239,7 +240,7 @@ function extractPackageFile(content, _packageFile, config) {
239
240
  deps.push(dep);
240
241
  }
241
242
  }
242
- for (const dep of extractApkDeps(instruction, escapeChar)) {
243
+ for (const dep of [...extractApkDeps(instruction, escapeChar), ...extractDebDeps(instruction, escapeChar)]) {
243
244
  dep.depType = "install";
244
245
  deps.push(dep);
245
246
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import {\n isNonEmptyStringAndNotWhitespace,\n isNumericString,\n isString,\n} from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { extractApkDeps } from './apk.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(coerceObject(registryAliases))) {\n // Allow `${VAR}`/`${VAR:-...}` keys to match without a trailing slash\n // (`}` is an unambiguous boundary). Bare identifier keys like\n // `$CI_REGISTRY` still require `/` so they can't eat `$CI_REGISTRY_IMAGE/`.\n const matchedWithSlash = currentFrom.startsWith(`${name}/`);\n const matchedAtBoundary =\n name.endsWith('}') && currentFrom.startsWith(name);\n if (!matchedWithSlash && !matchedAtBoundary) {\n continue;\n }\n const depName = currentFrom.slice(\n matchedWithSlash ? name.length + 1 : name.length,\n );\n // An empty alias value means \"no registry prefix\", i.e. Docker Hub.\n const valueWithSlash = value ? ensureTrailingSlash(value) : '';\n const dep = getDep(`${valueWithSlash}${depName}`, false);\n // TODO: when the inner getDep strips a `library/` prefix (or similar)\n // the depName no longer starts with `valueWithSlash` and the alias-rooted\n // depName is not restored.\n if (dep.depName?.startsWith(valueWithSlash)) {\n dep.packageName = dep.depName;\n const [imageAndTag] = currentFrom.split('@');\n dep.depName = dep.currentValue\n ? imageAndTag.substring(0, imageAndTag.lastIndexOf(':'))\n : imageAndTag;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length;) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (\n (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) ||\n (argMatchValue.startsWith(\"'\") && argMatchValue.endsWith(\"'\"))\n ) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = regEx(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n );\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = regEx(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n );\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (isNumericString(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n } else {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n for (const dep of extractApkDeps(instruction, escapeChar)) {\n dep.depType = 'install';\n deps.push(dep);\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n // find the last `stage`, and treat it as the `final` stage\n const lastStage = deps.filter((d) => d.depType === 'stage').at(-1);\n if (lastStage) {\n lastStage.depType = 'final';\n }\n return { deps };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import {\n isNonEmptyStringAndNotWhitespace,\n isNumericString,\n isString,\n} from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { extractApkDeps } from './apk.ts';\nimport { extractDebDeps } from './deb.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(coerceObject(registryAliases))) {\n // Allow `${VAR}`/`${VAR:-...}` keys to match without a trailing slash\n // (`}` is an unambiguous boundary). Bare identifier keys like\n // `$CI_REGISTRY` still require `/` so they can't eat `$CI_REGISTRY_IMAGE/`.\n const matchedWithSlash = currentFrom.startsWith(`${name}/`);\n const matchedAtBoundary =\n name.endsWith('}') && currentFrom.startsWith(name);\n if (!matchedWithSlash && !matchedAtBoundary) {\n continue;\n }\n const depName = currentFrom.slice(\n matchedWithSlash ? name.length + 1 : name.length,\n );\n // An empty alias value means \"no registry prefix\", i.e. Docker Hub.\n const valueWithSlash = value ? ensureTrailingSlash(value) : '';\n const dep = getDep(`${valueWithSlash}${depName}`, false);\n // TODO: when the inner getDep strips a `library/` prefix (or similar)\n // the depName no longer starts with `valueWithSlash` and the alias-rooted\n // depName is not restored.\n if (dep.depName?.startsWith(valueWithSlash)) {\n dep.packageName = dep.depName;\n const [imageAndTag] = currentFrom.split('@');\n dep.depName = dep.currentValue\n ? imageAndTag.substring(0, imageAndTag.lastIndexOf(':'))\n : imageAndTag;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length;) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (\n (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) ||\n (argMatchValue.startsWith(\"'\") && argMatchValue.endsWith(\"'\"))\n ) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = regEx(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n );\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = regEx(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n );\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (isNumericString(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n } else {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n for (const dep of [\n ...extractApkDeps(instruction, escapeChar),\n ...extractDebDeps(instruction, escapeChar),\n ]) {\n dep.depType = 'install';\n deps.push(dep);\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n // find the last `stage`, and treat it as the `final` stage\n const lastStage = deps.filter((d) => d.depType === 'stage').at(-1);\n if (lastStage) {\n lastStage.depType = 'final';\n }\n return { deps };\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { __exportAll } from "../../../_virtual/_rolldown/runtime.js";
2
2
  import { ApkDatasource } from "../../datasource/apk/index.js";
3
+ import { DebDatasource } from "../../datasource/deb/index.js";
3
4
  import { DockerDatasource } from "../../datasource/docker/index.js";
4
5
  import { extractPackageFile } from "./extract.js";
5
6
  import { knownDepTypes } from "./dep-types.js";
@@ -15,7 +16,11 @@ var dockerfile_exports = /* @__PURE__ */ __exportAll({
15
16
  const url = "https://docs.docker.com/build/concepts/dockerfile";
16
17
  const categories = ["docker"];
17
18
  const defaultConfig = { managerFilePatterns: ["/(^|/|\\.)([Dd]ocker|[Cc]ontainer)file$/", "/(^|/)([Dd]ocker|[Cc]ontainer)file[^/]*$/"] };
18
- const supportedDatasources = [ApkDatasource.id, DockerDatasource.id];
19
+ const supportedDatasources = [
20
+ ApkDatasource.id,
21
+ DebDatasource.id,
22
+ DockerDatasource.id
23
+ ];
19
24
  //#endregion
20
25
  export { categories, defaultConfig, dockerfile_exports, extractPackageFile, knownDepTypes, supportedDatasources, url };
21
26
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/dockerfile/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { ApkDatasource } from '../../datasource/apk/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { extractPackageFile } from './extract.ts';\n\nexport { knownDepTypes } from './dep-types.ts';\nexport { extractPackageFile };\n\nexport const url = 'https://docs.docker.com/build/concepts/dockerfile';\nexport const categories: Category[] = ['docker'];\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '/(^|/|\\\\.)([Dd]ocker|[Cc]ontainer)file$/',\n '/(^|/)([Dd]ocker|[Cc]ontainer)file[^/]*$/',\n ],\n};\n\nexport const supportedDatasources = [ApkDatasource.id, DockerDatasource.id];\n"],"mappings":";;;;;;;;;;;;;;AAQA,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,gBAAgB,EAC3B,qBAAqB,CACnB,4CACA,2CACF,EACF;AAEA,MAAa,uBAAuB,CAAC,cAAc,IAAI,iBAAiB,EAAE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/dockerfile/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { ApkDatasource } from '../../datasource/apk/index.ts';\nimport { DebDatasource } from '../../datasource/deb/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { extractPackageFile } from './extract.ts';\n\nexport { knownDepTypes } from './dep-types.ts';\nexport { extractPackageFile };\n\nexport const url = 'https://docs.docker.com/build/concepts/dockerfile';\nexport const categories: Category[] = ['docker'];\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '/(^|/|\\\\.)([Dd]ocker|[Cc]ontainer)file$/',\n '/(^|/)([Dd]ocker|[Cc]ontainer)file[^/]*$/',\n ],\n};\n\nexport const supportedDatasources = [\n ApkDatasource.id,\n DebDatasource.id,\n DockerDatasource.id,\n];\n"],"mappings":";;;;;;;;;;;;;;;AASA,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,gBAAgB,EAC3B,qBAAqB,CACnB,4CACA,2CACF,EACF;AAEA,MAAa,uBAAuB;CAClC,cAAc;CACd,cAAc;CACd,iBAAiB;AACnB"}
@@ -0,0 +1,92 @@
1
+ import { newlineRegex, regEx } from "../../../util/regex.js";
2
+ import { logger } from "../../../logger/index.js";
3
+ import { split } from "shlex";
4
+ //#region lib/modules/manager/dockerfile/run-command.ts
5
+ /** Shell operators which start a new command */
6
+ const commandSeparators = [
7
+ "&&",
8
+ "||",
9
+ ";",
10
+ "|",
11
+ "&",
12
+ "(",
13
+ ")",
14
+ "{",
15
+ "}"
16
+ ];
17
+ /**
18
+ * The `RUN` keyword and its flags, e.g. `RUN --mount=type=cache,target=/x `.
19
+ *
20
+ * Stripping these leaves the shell command that the instruction runs.
21
+ */
22
+ const runPrefixRegex = regEx(/^[ \t]*(?:ONBUILD[ \t]+)?RUN[ \t]+(?:--[a-z]\S*[ \t]+)*/i);
23
+ function matchesCommand(token, name) {
24
+ return token === name || !!token?.endsWith(`/${name}`);
25
+ }
26
+ /**
27
+ * Returns the arguments of the command, or `null` if none of the given
28
+ * commands were run.
29
+ *
30
+ * The command is found by its name alone, wherever it sits in the tokens -
31
+ * so it's found whether it's prefixed by a shell keyword (`do`/`then`/...),
32
+ * a variable assignment (`DEBUG=1 apk add ...`), or a wrapper program
33
+ * (`sudo`/`chroot /mnt`/`timeout 30`/...).
34
+ */
35
+ function matchCommand(tokens, names) {
36
+ const index = tokens.findIndex((token) => names.some((name) => matchesCommand(token, name)));
37
+ if (index === -1) return null;
38
+ return tokens.slice(index + 1);
39
+ }
40
+ /**
41
+ * Finds the invocations of the given commands in a `RUN` instruction, e.g. the
42
+ * `add --no-cache bash=5.2.37-r2` of
43
+ *
44
+ * ```dockerfile
45
+ * RUN apk update && apk add --no-cache bash=5.2.37-r2
46
+ * ```
47
+ *
48
+ * @param instruction the full `RUN` instruction, including any line continuations
49
+ * @param escapeChar the Dockerfile escape character, already regex-escaped
50
+ * @param names the commands to look for, e.g. `['apt', 'apt-get']`
51
+ * @returns the arguments of each invocation, in the order they were run
52
+ */
53
+ function parseRunCommands(instruction, escapeChar, names) {
54
+ const joined = instruction.split(newlineRegex).filter((line) => !regEx(/^[ \t]*#/).test(line)).join("\n").replace(regEx(`${escapeChar}[ \\t]*\\r?\\n`, "g"), " ");
55
+ const runPrefix = runPrefixRegex.exec(joined)?.[0];
56
+ if (!runPrefix) return [];
57
+ const command = joined.slice(runPrefix.length);
58
+ if (!names.some((name) => command.includes(name))) return [];
59
+ let tokens;
60
+ try {
61
+ tokens = split(command);
62
+ } catch (err) {
63
+ logger.debug({
64
+ err,
65
+ command
66
+ }, "Failed to tokenize Dockerfile RUN command");
67
+ return [];
68
+ }
69
+ const commands = [];
70
+ let current = [];
71
+ for (const token of tokens) {
72
+ if (token.startsWith("#")) break;
73
+ if (commandSeparators.includes(token)) {
74
+ commands.push(current);
75
+ current = [];
76
+ continue;
77
+ }
78
+ if (token.endsWith(";")) {
79
+ current.push(token.slice(0, -1));
80
+ commands.push(current);
81
+ current = [];
82
+ continue;
83
+ }
84
+ current.push(token);
85
+ }
86
+ commands.push(current);
87
+ return commands.map((command) => matchCommand(command, names)).filter((args) => args !== null);
88
+ }
89
+ //#endregion
90
+ export { parseRunCommands };
91
+
92
+ //# sourceMappingURL=run-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-command.js","names":[],"sources":["../../../../lib/modules/manager/dockerfile/run-command.ts"],"sourcesContent":["import { split } from 'shlex';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\n\n/** Shell operators which start a new command */\nconst commandSeparators = ['&&', '||', ';', '|', '&', '(', ')', '{', '}'];\n\n/**\n * The `RUN` keyword and its flags, e.g. `RUN --mount=type=cache,target=/x `.\n *\n * Stripping these leaves the shell command that the instruction runs.\n */\nconst runPrefixRegex = regEx(\n /^[ \\t]*(?:ONBUILD[ \\t]+)?RUN[ \\t]+(?:--[a-z]\\S*[ \\t]+)*/i,\n);\n\nfunction matchesCommand(token: string | undefined, name: string): boolean {\n return token === name || !!token?.endsWith(`/${name}`);\n}\n\n/**\n * Returns the arguments of the command, or `null` if none of the given\n * commands were run.\n *\n * The command is found by its name alone, wherever it sits in the tokens -\n * so it's found whether it's prefixed by a shell keyword (`do`/`then`/...),\n * a variable assignment (`DEBUG=1 apk add ...`), or a wrapper program\n * (`sudo`/`chroot /mnt`/`timeout 30`/...).\n */\nfunction matchCommand(tokens: string[], names: string[]): string[] | null {\n const index = tokens.findIndex((token) =>\n names.some((name) => matchesCommand(token, name)),\n );\n if (index === -1) {\n return null;\n }\n return tokens.slice(index + 1);\n}\n\n/**\n * Finds the invocations of the given commands in a `RUN` instruction, e.g. the\n * `add --no-cache bash=5.2.37-r2` of\n *\n * ```dockerfile\n * RUN apk update && apk add --no-cache bash=5.2.37-r2\n * ```\n *\n * @param instruction the full `RUN` instruction, including any line continuations\n * @param escapeChar the Dockerfile escape character, already regex-escaped\n * @param names the commands to look for, e.g. `['apt', 'apt-get']`\n * @returns the arguments of each invocation, in the order they were run\n */\nexport function parseRunCommands(\n instruction: string,\n escapeChar: string,\n names: string[],\n): string[][] {\n // A `#` line inside a line continuation is a Dockerfile comment, and is\n // dropped before the shell ever sees it\n const joined = instruction\n .split(newlineRegex)\n .filter((line) => !regEx(/^[ \\t]*#/).test(line))\n .join('\\n')\n .replace(regEx(`${escapeChar}[ \\\\t]*\\\\r?\\\\n`, 'g'), ' ');\n\n const runPrefix = runPrefixRegex.exec(joined)?.[0];\n if (!runPrefix) {\n return [];\n }\n\n const command = joined.slice(runPrefix.length);\n if (!names.some((name) => command.includes(name))) {\n return [];\n }\n\n let tokens: string[];\n try {\n tokens = split(command);\n } catch (err) {\n logger.debug({ err, command }, 'Failed to tokenize Dockerfile RUN command');\n return [];\n }\n\n // Split the shell command into the individual commands it runs, so that only\n // the arguments of a matching invocation are considered\n const commands: string[][] = [];\n let current: string[] = [];\n for (const token of tokens) {\n if (token.startsWith('#')) {\n // the rest of the command is a shell comment\n break;\n }\n if (commandSeparators.includes(token)) {\n commands.push(current);\n current = [];\n continue;\n }\n // e.g. the `{1..10};` of `for iter in {1..10}; do apk add ...`, which shlex\n // keeps as one token because no whitespace precedes the `;`\n if (token.endsWith(';')) {\n current.push(token.slice(0, -1));\n commands.push(current);\n current = [];\n continue;\n }\n current.push(token);\n }\n commands.push(current);\n\n return commands\n .map((command) => matchCommand(command, names))\n .filter((args) => args !== null);\n}\n"],"mappings":";;;;;AAKA,MAAM,oBAAoB;CAAC;CAAM;CAAM;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG;;;;;;AAOxE,MAAM,iBAAiB,MACrB,0DACF;AAEA,SAAS,eAAe,OAA2B,MAAuB;CACxE,OAAO,UAAU,QAAQ,CAAC,CAAC,OAAO,SAAS,IAAI,MAAM;AACvD;;;;;;;;;;AAWA,SAAS,aAAa,QAAkB,OAAkC;CACxE,MAAM,QAAQ,OAAO,WAAW,UAC9B,MAAM,MAAM,SAAS,eAAe,OAAO,IAAI,CAAC,CAClD;CACA,IAAI,UAAU,IACZ,OAAO;CAET,OAAO,OAAO,MAAM,QAAQ,CAAC;AAC/B;;;;;;;;;;;;;;AAeA,SAAgB,iBACd,aACA,YACA,OACY;CAGZ,MAAM,SAAS,YACZ,MAAM,YAAY,CAAC,CACnB,QAAQ,SAAS,CAAC,MAAM,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAC/C,KAAK,IAAI,CAAC,CACV,QAAQ,MAAM,GAAG,WAAW,iBAAiB,GAAG,GAAG,GAAG;CAEzD,MAAM,YAAY,eAAe,KAAK,MAAM,CAAC,GAAG;CAChD,IAAI,CAAC,WACH,OAAO,CAAC;CAGV,MAAM,UAAU,OAAO,MAAM,UAAU,MAAM;CAC7C,IAAI,CAAC,MAAM,MAAM,SAAS,QAAQ,SAAS,IAAI,CAAC,GAC9C,OAAO,CAAC;CAGV,IAAI;CACJ,IAAI;EACF,SAAS,MAAM,OAAO;CACxB,SAAS,KAAK;EACZ,OAAO,MAAM;GAAE;GAAK;EAAQ,GAAG,2CAA2C;EAC1E,OAAO,CAAC;CACV;CAIA,MAAM,WAAuB,CAAC;CAC9B,IAAI,UAAoB,CAAC;CACzB,KAAK,MAAM,SAAS,QAAQ;EAC1B,IAAI,MAAM,WAAW,GAAG,GAEtB;EAEF,IAAI,kBAAkB,SAAS,KAAK,GAAG;GACrC,SAAS,KAAK,OAAO;GACrB,UAAU,CAAC;GACX;EACF;EAGA,IAAI,MAAM,SAAS,GAAG,GAAG;GACvB,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC;GAC/B,SAAS,KAAK,OAAO;GACrB,UAAU,CAAC;GACX;EACF;EACA,QAAQ,KAAK,KAAK;CACpB;CACA,SAAS,KAAK,OAAO;CAErB,OAAO,SACJ,KAAK,YAAY,aAAa,SAAS,KAAK,CAAC,CAAC,CAC9C,QAAQ,SAAS,SAAS,IAAI;AACnC"}
@@ -37,7 +37,7 @@ hashMap.set("deps-edn", "06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee
37
37
  hashMap.set("devbox", "a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9");
38
38
  hashMap.set("devcontainer", "24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec");
39
39
  hashMap.set("docker-compose", "fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9");
40
- hashMap.set("dockerfile", "e0bbb007c6fe2a7a135de4514be7af6b32ade599ddd8eec5e4aecd92d5237b4b");
40
+ hashMap.set("dockerfile", "78cb1e8b58653289dd4b73425c45495a4c4b41badd3614b8345aaf8ab73de09c");
41
41
  hashMap.set("droneci", "661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998");
42
42
  hashMap.set("fleet", "4942d52e82f35c41e2d46cf76f426e2d91b350338cfc0bbcb97e8aaae2a1ac0b");
43
43
  hashMap.set("flux", "aad8c786c4a2b5820663027452eeb8fe84c3af8c8399261e85f0eade2e484fe8");
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','0a264d6be73953d801510fdeff271e4071c274339569c6dab4e2a128eaf4869f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','bdb6931cc03f4ac02ebfdb56c4b3483bb6c5250fa952545f1a25584d502bbffd');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','a051fe5e7e4fef8208b5864131a2b52b4ae319936f1dd8ee5a4e1ef11359ec09');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c31bc0a0e23d32726bcc09aa67533ebc5058124bf89c88e09c837419f550801a');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','8ec4c3c8080a55e93b741cfa97779b47291734dc24d80529c887d3b2b823fc44');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','fe8136135c895dd08819f91a60cf105f8b951251b057092700101ace991ae1d7');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','f1294fb3866ff65a75d98fdef80b1df3d3a8856535b8c690d1799e1205e4b639');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','10ae4d7f8ff35faf3a3f9f25bf4c969ea960e19aaf8c012aee11f93f4d10533e');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','917fdbfbad58fd7f57933646a760d91768368df563ce5eaf34a2bba165164a12');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','e0bbb007c6fe2a7a135de4514be7af6b32ade599ddd8eec5e4aecd92d5237b4b');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','4942d52e82f35c41e2d46cf76f426e2d91b350338cfc0bbcb97e8aaae2a1ac0b');\nhashMap.set('flux','aad8c786c4a2b5820663027452eeb8fe84c3af8c8399261e85f0eade2e484fe8');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','df8bb92b2906d8cddda2d4b302ee503f8002e3554d32d74cef2f584fe891f38f');\nhashMap.set('github-actions','7adddc8e590786084855ffe53292bff3098ac672f91c21cc39d45bcf0af2271f');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','de042f3b5a900346c5f2df41f793f1716dc12145c38705c3064c6a7150b49495');\nhashMap.set('gradle','9e3ff52ce4ad2555929acdd4d32c417c4ef8714c23a92f2893ecc580fa4d6064');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','7ee9dace4c036dfe113c0c0e46369d8b83a739caa831660142ca98d3236a180a');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','28572dd24b6746ca7065ee467aa13bbc8c3e8c0f88ae48e33bce88468c600100');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','4a3cf47072978eb131d70cd13f3d0bbd4408b0290be2a798a4cbf6103189269b');\nhashMap.set('hermit','0fb25b7766c3a264fbb765ff75b1542b24136c4c9f933696d4a5aecfed637071');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','aa830c27302555e12d7f04e342c96125d68c231028a2d3c459c4431516382584');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','279da4690751c3abee10badd12eb4ac6ef31d824c6bd3ada824859eca3109ebe');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','0f80f0b81f2197a7e588be5c115a32a826fc184593f4e879f7b60fafd97a977e');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','30c78bc1c29eeecbdedb4eacc52bd93eedfb07279fd385f893193dcac6196466');\nhashMap.set('nuget','b81fb0ca6cfeb86b004592b38ce176673e056d6a2ed41a9807afb0eb7ad405d2');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','52450676f8b0e05134b3e8947b832195ef40bcaec1ce43d71351a2f797b80d75');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','7e418b8bdaeed38c1372eb19e0ae1c64999000e128d8754e37368638037b4c5c');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','cd974eadd649ba8c9c2e3c7b564a49c8bb2ce95d6df043a7e942364f574c7613');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','b2b917c200d25e01a3a198deb3bf33353535f27430142111cfab816c03bb966d');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','dfaf3f03ddaf70c332f7916106648f36dbfa6a36dd76d15dd27fa116ab3c174c');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','6932c904b0d18ad4845c46ce3f7d4c54dd8e411e16c31a782b399fe0b7dc550b');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','5b0037e4a88e06efe6f006eff15c24d9e1fefdda40d282aa99f54c2637d21c4d');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','7db907b3b77ef5f3465f3c4339fbab56bbcdfd1bf34b3d33e4c178d2e07e23e7');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','0a264d6be73953d801510fdeff271e4071c274339569c6dab4e2a128eaf4869f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','bdb6931cc03f4ac02ebfdb56c4b3483bb6c5250fa952545f1a25584d502bbffd');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','a051fe5e7e4fef8208b5864131a2b52b4ae319936f1dd8ee5a4e1ef11359ec09');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c31bc0a0e23d32726bcc09aa67533ebc5058124bf89c88e09c837419f550801a');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','8ec4c3c8080a55e93b741cfa97779b47291734dc24d80529c887d3b2b823fc44');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','fe8136135c895dd08819f91a60cf105f8b951251b057092700101ace991ae1d7');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','f1294fb3866ff65a75d98fdef80b1df3d3a8856535b8c690d1799e1205e4b639');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','10ae4d7f8ff35faf3a3f9f25bf4c969ea960e19aaf8c012aee11f93f4d10533e');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','917fdbfbad58fd7f57933646a760d91768368df563ce5eaf34a2bba165164a12');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','78cb1e8b58653289dd4b73425c45495a4c4b41badd3614b8345aaf8ab73de09c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','4942d52e82f35c41e2d46cf76f426e2d91b350338cfc0bbcb97e8aaae2a1ac0b');\nhashMap.set('flux','aad8c786c4a2b5820663027452eeb8fe84c3af8c8399261e85f0eade2e484fe8');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','df8bb92b2906d8cddda2d4b302ee503f8002e3554d32d74cef2f584fe891f38f');\nhashMap.set('github-actions','7adddc8e590786084855ffe53292bff3098ac672f91c21cc39d45bcf0af2271f');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','de042f3b5a900346c5f2df41f793f1716dc12145c38705c3064c6a7150b49495');\nhashMap.set('gradle','9e3ff52ce4ad2555929acdd4d32c417c4ef8714c23a92f2893ecc580fa4d6064');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','7ee9dace4c036dfe113c0c0e46369d8b83a739caa831660142ca98d3236a180a');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','28572dd24b6746ca7065ee467aa13bbc8c3e8c0f88ae48e33bce88468c600100');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','4a3cf47072978eb131d70cd13f3d0bbd4408b0290be2a798a4cbf6103189269b');\nhashMap.set('hermit','0fb25b7766c3a264fbb765ff75b1542b24136c4c9f933696d4a5aecfed637071');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','aa830c27302555e12d7f04e342c96125d68c231028a2d3c459c4431516382584');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','279da4690751c3abee10badd12eb4ac6ef31d824c6bd3ada824859eca3109ebe');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','0f80f0b81f2197a7e588be5c115a32a826fc184593f4e879f7b60fafd97a977e');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','30c78bc1c29eeecbdedb4eacc52bd93eedfb07279fd385f893193dcac6196466');\nhashMap.set('nuget','b81fb0ca6cfeb86b004592b38ce176673e056d6a2ed41a9807afb0eb7ad405d2');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','52450676f8b0e05134b3e8947b832195ef40bcaec1ce43d71351a2f797b80d75');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','7e418b8bdaeed38c1372eb19e0ae1c64999000e128d8754e37368638037b4c5c');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','cd974eadd649ba8c9c2e3c7b564a49c8bb2ce95d6df043a7e942364f574c7613');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','b2b917c200d25e01a3a198deb3bf33353535f27430142111cfab816c03bb966d');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','dfaf3f03ddaf70c332f7916106648f36dbfa6a36dd76d15dd27fa116ab3c174c');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','6932c904b0d18ad4845c46ce3f7d4c54dd8e411e16c31a782b399fe0b7dc550b');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','5b0037e4a88e06efe6f006eff15c24d9e1fefdda40d282aa99f54c2637d21c4d');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','7db907b3b77ef5f3465f3c4339fbab56bbcdfd1bf34b3d33e4c178d2e07e23e7');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.99.0",
4
+ "version": "44.100.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.99.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.100.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.99.0",
5
+ "x-renovate-version": "44.100.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {