renovate 43.72.0 → 43.73.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.
@@ -6,7 +6,7 @@ import { parseUrl } from "./url.js";
6
6
  import { hostType } from "./host-rules.js";
7
7
  import { isNumber } from "@sindresorhus/is";
8
8
  import JSON5 from "json5";
9
- import * as JSONC from "jsonc-parser";
9
+ import { parse } from "jsonc-weaver";
10
10
  //#region lib/util/common.ts
11
11
  /**
12
12
  * Tries to detect the `platform` from a url.
@@ -55,10 +55,7 @@ function parseJsonWithFallback(content, context) {
55
55
  return parsedJson;
56
56
  }
57
57
  function parseJsonc(content) {
58
- const errors = [];
59
- const value = JSONC.parse(content, errors, { allowTrailingComma: true });
60
- if (errors.length === 0) return value;
61
- throw new Error("Invalid JSONC");
58
+ return parse(content);
62
59
  }
63
60
  /**
64
61
  * Use only if an option is inherited + globalOnly
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":["hostType","hostRules.hostType"],"sources":["../../lib/util/common.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport * as JSONC from 'jsonc-parser';\nimport type { JsonValue } from 'type-fest';\nimport { GlobalConfig } from '../config/global.ts';\nimport { InheritConfig, NOT_PRESENT } from '../config/inherit.ts';\nimport type { GlobalInheritableConfig } from '../config/types.ts';\nimport {\n AZURE_API_USING_HOST_TYPES,\n BITBUCKET_API_USING_HOST_TYPES,\n BITBUCKET_SERVER_API_USING_HOST_TYPES,\n FORGEJO_API_USING_HOST_TYPES,\n GITEA_API_USING_HOST_TYPES,\n GITHUB_API_USING_HOST_TYPES,\n GITLAB_API_USING_HOST_TYPES,\n} from '../constants/index.ts';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\nimport * as hostRules from './host-rules.ts';\nimport { parseUrl } from './url.ts';\n\n/**\n * Tries to detect the `platform` from a url.\n *\n * @param url the url to detect `platform` from\n * @returns matched `platform` if found, otherwise `null`\n */\nexport function detectPlatform(\n url: string,\n):\n | 'azure'\n | 'bitbucket'\n | 'bitbucket-server'\n | 'forgejo'\n | 'gitea'\n | 'github'\n | 'gitlab'\n | null {\n const { hostname } = parseUrl(url) ?? {};\n if (hostname === 'dev.azure.com' || hostname?.endsWith('.visualstudio.com')) {\n return 'azure';\n }\n if (hostname === 'bitbucket.org' || hostname === 'bitbucket.com') {\n return 'bitbucket';\n }\n if (hostname?.includes('bitbucket')) {\n return 'bitbucket-server';\n }\n if (hostname?.includes('forgejo')) {\n return 'forgejo';\n }\n if (hostname && ['codeberg.org', 'codefloe.com'].includes(hostname)) {\n return 'forgejo';\n }\n if (\n hostname &&\n (['gitea.com'].includes(hostname) || hostname.includes('gitea'))\n ) {\n return 'gitea';\n }\n if (hostname === 'github.com' || hostname?.includes('github')) {\n return 'github';\n }\n if (hostname === 'gitlab.com' || hostname?.includes('gitlab')) {\n return 'gitlab';\n }\n\n const hostType = hostRules.hostType({ url });\n\n if (!hostType) {\n return null;\n }\n\n if (AZURE_API_USING_HOST_TYPES.includes(hostType)) {\n return 'azure';\n }\n\n if (BITBUCKET_SERVER_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket-server';\n }\n if (BITBUCKET_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket';\n }\n if (FORGEJO_API_USING_HOST_TYPES.includes(hostType)) {\n return 'forgejo';\n }\n if (GITEA_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitea';\n }\n if (GITHUB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'github';\n }\n if (GITLAB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function noLeadingAtSymbol(input: string): string {\n return input.startsWith('@') ? input.slice(1) : input;\n}\n\nexport function parseJson(\n content: Nullish<string>,\n filename: string,\n): JsonValue {\n if (!content) {\n return null;\n }\n\n if (filename.endsWith('.jsonc')) {\n return parseJsonc(content);\n }\n\n if (filename.endsWith('.json5')) {\n return JSON5.parse(content);\n }\n\n return parseJsonWithFallback(content, filename);\n}\n\nexport function parseJsonWithFallback(\n content: string,\n context: string,\n): JsonValue {\n let parsedJson: JsonValue;\n\n try {\n parsedJson = parseJsonc(content);\n } catch {\n // warn if json5 format used in json\n parsedJson = JSON5.parse(content);\n logger.warn(\n { context },\n 'File contents are invalid JSONC but parse using JSON5. Support for this will be removed in a future release so please change to a support .json5 file name or ensure correct JSON syntax.',\n );\n }\n\n return parsedJson;\n}\n\nexport function parseJsonc(content: string): JsonValue {\n const errors: JSONC.ParseError[] = [];\n const value = JSONC.parse(content, errors, { allowTrailingComma: true });\n if (errors.length === 0) {\n return value;\n }\n throw new Error('Invalid JSONC');\n}\n\n/**\n * Use only if an option is inherited + globalOnly\n * For globalOnly options use GlobalConfig.get\n */\nexport function getInheritedOrGlobal<Key extends keyof GlobalInheritableConfig>(\n key: Key,\n): GlobalInheritableConfig[Key] {\n const inheritedValue = InheritConfig.get(key);\n const globalValue = GlobalConfig.get(key);\n if (inheritedValue !== NOT_PRESENT) {\n // Don't allow inherited config to make `onboardingAutoCloseAge` a higher value than our global setting\n if (\n key === 'onboardingAutoCloseAge' &&\n isNumber(inheritedValue) &&\n isNumber(globalValue)\n ) {\n if (globalValue < inheritedValue) {\n return globalValue;\n }\n }\n\n return inheritedValue;\n }\n\n return globalValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA2BA,SAAgB,eACd,KASO;CACP,MAAM,EAAE,aAAa,SAAS,IAAI,IAAI,EAAE;AACxC,KAAI,aAAa,mBAAmB,UAAU,SAAS,oBAAoB,CACzE,QAAO;AAET,KAAI,aAAa,mBAAmB,aAAa,gBAC/C,QAAO;AAET,KAAI,UAAU,SAAS,YAAY,CACjC,QAAO;AAET,KAAI,UAAU,SAAS,UAAU,CAC/B,QAAO;AAET,KAAI,YAAY,CAAC,gBAAgB,eAAe,CAAC,SAAS,SAAS,CACjE,QAAO;AAET,KACE,aACC,CAAC,YAAY,CAAC,SAAS,SAAS,IAAI,SAAS,SAAS,QAAQ,EAE/D,QAAO;AAET,KAAI,aAAa,gBAAgB,UAAU,SAAS,SAAS,CAC3D,QAAO;AAET,KAAI,aAAa,gBAAgB,UAAU,SAAS,SAAS,CAC3D,QAAO;CAGT,MAAMA,aAAWC,SAAmB,EAAE,KAAK,CAAC;AAE5C,KAAI,CAACD,WACH,QAAO;AAGT,KAAI,2BAA2B,SAASA,WAAS,CAC/C,QAAO;AAGT,KAAI,sCAAsC,SAASA,WAAS,CAC1D,QAAO;AAET,KAAI,+BAA+B,SAASA,WAAS,CACnD,QAAO;AAET,KAAI,6BAA6B,SAASA,WAAS,CACjD,QAAO;AAET,KAAI,2BAA2B,SAASA,WAAS,CAC/C,QAAO;AAET,KAAI,4BAA4B,SAASA,WAAS,CAChD,QAAO;AAET,KAAI,4BAA4B,SAASA,WAAS,CAChD,QAAO;AAGT,QAAO;;AAGT,SAAgB,kBAAkB,OAAuB;AACvD,QAAO,MAAM,WAAW,IAAI,GAAG,MAAM,MAAM,EAAE,GAAG;;AAGlD,SAAgB,UACd,SACA,UACW;AACX,KAAI,CAAC,QACH,QAAO;AAGT,KAAI,SAAS,SAAS,SAAS,CAC7B,QAAO,WAAW,QAAQ;AAG5B,KAAI,SAAS,SAAS,SAAS,CAC7B,QAAO,MAAM,MAAM,QAAQ;AAG7B,QAAO,sBAAsB,SAAS,SAAS;;AAGjD,SAAgB,sBACd,SACA,SACW;CACX,IAAI;AAEJ,KAAI;AACF,eAAa,WAAW,QAAQ;SAC1B;AAEN,eAAa,MAAM,MAAM,QAAQ;AACjC,SAAO,KACL,EAAE,SAAS,EACX,4LACD;;AAGH,QAAO;;AAGT,SAAgB,WAAW,SAA4B;CACrD,MAAM,SAA6B,EAAE;CACrC,MAAM,QAAQ,MAAM,MAAM,SAAS,QAAQ,EAAE,oBAAoB,MAAM,CAAC;AACxE,KAAI,OAAO,WAAW,EACpB,QAAO;AAET,OAAM,IAAI,MAAM,gBAAgB;;;;;;AAOlC,SAAgB,qBACd,KAC8B;CAC9B,MAAM,iBAAiB,cAAc,IAAI,IAAI;CAC7C,MAAM,cAAc,aAAa,IAAI,IAAI;AACzC,KAAI,mBAAmB,aAAa;AAElC,MACE,QAAQ,4BACR,SAAS,eAAe,IACxB,SAAS,YAAY;OAEjB,cAAc,eAChB,QAAO;;AAIX,SAAO;;AAGT,QAAO"}
1
+ {"version":3,"file":"common.js","names":["hostType","hostRules.hostType","jsoncWeaverParse"],"sources":["../../lib/util/common.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { parse as jsoncWeaverParse } from 'jsonc-weaver';\nimport type { JsonValue } from 'type-fest';\nimport { GlobalConfig } from '../config/global.ts';\nimport { InheritConfig, NOT_PRESENT } from '../config/inherit.ts';\nimport type { GlobalInheritableConfig } from '../config/types.ts';\nimport {\n AZURE_API_USING_HOST_TYPES,\n BITBUCKET_API_USING_HOST_TYPES,\n BITBUCKET_SERVER_API_USING_HOST_TYPES,\n FORGEJO_API_USING_HOST_TYPES,\n GITEA_API_USING_HOST_TYPES,\n GITHUB_API_USING_HOST_TYPES,\n GITLAB_API_USING_HOST_TYPES,\n} from '../constants/index.ts';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\nimport * as hostRules from './host-rules.ts';\nimport { parseUrl } from './url.ts';\n\n/**\n * Tries to detect the `platform` from a url.\n *\n * @param url the url to detect `platform` from\n * @returns matched `platform` if found, otherwise `null`\n */\nexport function detectPlatform(\n url: string,\n):\n | 'azure'\n | 'bitbucket'\n | 'bitbucket-server'\n | 'forgejo'\n | 'gitea'\n | 'github'\n | 'gitlab'\n | null {\n const { hostname } = parseUrl(url) ?? {};\n if (hostname === 'dev.azure.com' || hostname?.endsWith('.visualstudio.com')) {\n return 'azure';\n }\n if (hostname === 'bitbucket.org' || hostname === 'bitbucket.com') {\n return 'bitbucket';\n }\n if (hostname?.includes('bitbucket')) {\n return 'bitbucket-server';\n }\n if (hostname?.includes('forgejo')) {\n return 'forgejo';\n }\n if (hostname && ['codeberg.org', 'codefloe.com'].includes(hostname)) {\n return 'forgejo';\n }\n if (\n hostname &&\n (['gitea.com'].includes(hostname) || hostname.includes('gitea'))\n ) {\n return 'gitea';\n }\n if (hostname === 'github.com' || hostname?.includes('github')) {\n return 'github';\n }\n if (hostname === 'gitlab.com' || hostname?.includes('gitlab')) {\n return 'gitlab';\n }\n\n const hostType = hostRules.hostType({ url });\n\n if (!hostType) {\n return null;\n }\n\n if (AZURE_API_USING_HOST_TYPES.includes(hostType)) {\n return 'azure';\n }\n\n if (BITBUCKET_SERVER_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket-server';\n }\n if (BITBUCKET_API_USING_HOST_TYPES.includes(hostType)) {\n return 'bitbucket';\n }\n if (FORGEJO_API_USING_HOST_TYPES.includes(hostType)) {\n return 'forgejo';\n }\n if (GITEA_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitea';\n }\n if (GITHUB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'github';\n }\n if (GITLAB_API_USING_HOST_TYPES.includes(hostType)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function noLeadingAtSymbol(input: string): string {\n return input.startsWith('@') ? input.slice(1) : input;\n}\n\nexport function parseJson(\n content: Nullish<string>,\n filename: string,\n): JsonValue {\n if (!content) {\n return null;\n }\n\n if (filename.endsWith('.jsonc')) {\n return parseJsonc(content);\n }\n\n if (filename.endsWith('.json5')) {\n return JSON5.parse(content);\n }\n\n return parseJsonWithFallback(content, filename);\n}\n\nexport function parseJsonWithFallback(\n content: string,\n context: string,\n): JsonValue {\n let parsedJson: JsonValue;\n\n try {\n parsedJson = parseJsonc(content);\n } catch {\n // warn if json5 format used in json\n parsedJson = JSON5.parse(content);\n logger.warn(\n { context },\n 'File contents are invalid JSONC but parse using JSON5. Support for this will be removed in a future release so please change to a support .json5 file name or ensure correct JSON syntax.',\n );\n }\n\n return parsedJson;\n}\n\nexport function parseJsonc(content: string): JsonValue {\n return jsoncWeaverParse(content);\n}\n\n/**\n * Use only if an option is inherited + globalOnly\n * For globalOnly options use GlobalConfig.get\n */\nexport function getInheritedOrGlobal<Key extends keyof GlobalInheritableConfig>(\n key: Key,\n): GlobalInheritableConfig[Key] {\n const inheritedValue = InheritConfig.get(key);\n const globalValue = GlobalConfig.get(key);\n if (inheritedValue !== NOT_PRESENT) {\n // Don't allow inherited config to make `onboardingAutoCloseAge` a higher value than our global setting\n if (\n key === 'onboardingAutoCloseAge' &&\n isNumber(inheritedValue) &&\n isNumber(globalValue)\n ) {\n if (globalValue < inheritedValue) {\n return globalValue;\n }\n }\n\n return inheritedValue;\n }\n\n return globalValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA2BA,SAAgB,eACd,KASO;CACP,MAAM,EAAE,aAAa,SAAS,IAAI,IAAI,EAAE;AACxC,KAAI,aAAa,mBAAmB,UAAU,SAAS,oBAAoB,CACzE,QAAO;AAET,KAAI,aAAa,mBAAmB,aAAa,gBAC/C,QAAO;AAET,KAAI,UAAU,SAAS,YAAY,CACjC,QAAO;AAET,KAAI,UAAU,SAAS,UAAU,CAC/B,QAAO;AAET,KAAI,YAAY,CAAC,gBAAgB,eAAe,CAAC,SAAS,SAAS,CACjE,QAAO;AAET,KACE,aACC,CAAC,YAAY,CAAC,SAAS,SAAS,IAAI,SAAS,SAAS,QAAQ,EAE/D,QAAO;AAET,KAAI,aAAa,gBAAgB,UAAU,SAAS,SAAS,CAC3D,QAAO;AAET,KAAI,aAAa,gBAAgB,UAAU,SAAS,SAAS,CAC3D,QAAO;CAGT,MAAMA,aAAWC,SAAmB,EAAE,KAAK,CAAC;AAE5C,KAAI,CAACD,WACH,QAAO;AAGT,KAAI,2BAA2B,SAASA,WAAS,CAC/C,QAAO;AAGT,KAAI,sCAAsC,SAASA,WAAS,CAC1D,QAAO;AAET,KAAI,+BAA+B,SAASA,WAAS,CACnD,QAAO;AAET,KAAI,6BAA6B,SAASA,WAAS,CACjD,QAAO;AAET,KAAI,2BAA2B,SAASA,WAAS,CAC/C,QAAO;AAET,KAAI,4BAA4B,SAASA,WAAS,CAChD,QAAO;AAET,KAAI,4BAA4B,SAASA,WAAS,CAChD,QAAO;AAGT,QAAO;;AAGT,SAAgB,kBAAkB,OAAuB;AACvD,QAAO,MAAM,WAAW,IAAI,GAAG,MAAM,MAAM,EAAE,GAAG;;AAGlD,SAAgB,UACd,SACA,UACW;AACX,KAAI,CAAC,QACH,QAAO;AAGT,KAAI,SAAS,SAAS,SAAS,CAC7B,QAAO,WAAW,QAAQ;AAG5B,KAAI,SAAS,SAAS,SAAS,CAC7B,QAAO,MAAM,MAAM,QAAQ;AAG7B,QAAO,sBAAsB,SAAS,SAAS;;AAGjD,SAAgB,sBACd,SACA,SACW;CACX,IAAI;AAEJ,KAAI;AACF,eAAa,WAAW,QAAQ;SAC1B;AAEN,eAAa,MAAM,MAAM,QAAQ;AACjC,SAAO,KACL,EAAE,SAAS,EACX,4LACD;;AAGH,QAAO;;AAGT,SAAgB,WAAW,SAA4B;AACrD,QAAOE,MAAiB,QAAQ;;;;;;AAOlC,SAAgB,qBACd,KAC8B;CAC9B,MAAM,iBAAiB,cAAc,IAAI,IAAI;CAC7C,MAAM,cAAc,aAAa,IAAI,IAAI;AACzC,KAAI,mBAAmB,aAAa;AAElC,MACE,QAAQ,4BACR,SAAS,eAAe,IACxB,SAAS,YAAY;OAEjB,cAAc,eAChB,QAAO;;AAIX,SAAO;;AAGT,QAAO"}
@@ -9,6 +9,7 @@ import "../../../../util/json-writer/index.js";
9
9
  import { detectRepoFileConfig } from "../../init/merge.js";
10
10
  import { isNumber } from "@sindresorhus/is";
11
11
  import JSON5 from "json5";
12
+ import { weave } from "jsonc-weaver";
12
13
  import upath from "upath";
13
14
  import detectIndent from "detect-indent";
14
15
  //#region lib/workers/repository/config-migration/branch/migrated-data.ts
@@ -76,11 +77,18 @@ var MigratedDataFactory = class {
76
77
  if (!isMigrated) return null;
77
78
  delete migratedConfig.errors;
78
79
  delete migratedConfig.warnings;
79
- const indent = detectIndent(await platform.getRawFile(configFileName) ?? "");
80
+ const raw = await platform.getRawFile(configFileName);
81
+ const indent = detectIndent(raw ?? "");
80
82
  const indentSpace = indent.indent ?? " ";
81
83
  const filename = configFileName;
82
84
  let content;
83
85
  if (filename.endsWith(".json5")) content = JSON5.stringify(migratedConfig, void 0, indentSpace);
86
+ else if (raw) try {
87
+ content = weave(raw, migratedConfig);
88
+ } catch (err) {
89
+ logger.warn({ err }, "Error weaving JSONC to preserve comments, falling back to JSON.stringify");
90
+ content = JSON.stringify(migratedConfig, void 0, indentSpace);
91
+ }
84
92
  else content = JSON.stringify(migratedConfig, void 0, indentSpace);
85
93
  if (!content.endsWith("\n")) content += "\n";
86
94
  res = {
@@ -1 +1 @@
1
- {"version":3,"file":"migrated-data.js","names":[],"sources":["../../../../../lib/workers/repository/config-migration/branch/migrated-data.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport detectIndent from 'detect-indent';\nimport JSON5 from 'json5';\nimport type { BuiltInParserName, Options } from 'prettier';\nimport upath from 'upath';\nimport { migrateConfig } from '../../../../config/migration.ts';\nimport { prettier } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport { EditorConfig } from '../../../../util/json-writer/index.ts';\nimport { detectRepoFileConfig } from '../../init/merge.ts';\n\nexport interface MigratedData {\n content: string;\n filename: string;\n indent: Indent;\n}\n\ninterface Indent {\n amount: number;\n indent: string;\n type?: string;\n}\n\nconst prettierConfigFilenames = new Set([\n '.prettierrc',\n '.prettierrc.json',\n '.prettierrc.yml',\n '.prettierrc.yaml',\n '.prettierrc.json5',\n '.prettierrc.js',\n '.prettierrc.cjs',\n '.prettierrc.mjs',\n 'prettier.config.js',\n 'prettier.config.cjs',\n 'prettier.config.mjs',\n '.prettierrc.toml',\n]);\n\nexport type PrettierParser = BuiltInParserName;\n\nexport async function applyPrettierFormatting(\n filename: string,\n content: string,\n parser: PrettierParser,\n indent?: Indent,\n): Promise<string> {\n try {\n logger.trace('applyPrettierFormatting - START');\n const fileList = await scm.getFileList();\n let prettierExists = fileList.some((file) =>\n prettierConfigFilenames.has(file),\n );\n\n const editorconfigExists = fileList.some(\n (file) => file === '.editorconfig',\n );\n\n if (!prettierExists) {\n try {\n const packageJsonContent = await readLocalFile('package.json', 'utf8');\n prettierExists =\n packageJsonContent && JSON.parse(packageJsonContent).prettier;\n } catch {\n logger.warn(\n 'applyPrettierFormatting - Error processing package.json file',\n );\n }\n }\n\n if (!prettierExists || !parser) {\n return content;\n }\n\n const options: Options = {\n parser,\n tabWidth: indent?.amount === 0 ? 2 : indent?.amount,\n useTabs: indent?.type === 'tab',\n };\n\n if (editorconfigExists) {\n const editorconf = await EditorConfig.getCodeFormat(filename);\n\n // https://github.com/prettier/prettier/blob/bab892242a1f9d8fcae50514b9304bf03f2e25ab/src/config/editorconfig/editorconfig-to-prettier.js#L47\n if (editorconf.maxLineLength) {\n options.printWidth = isNumber(editorconf.maxLineLength)\n ? editorconf.maxLineLength\n : Number.POSITIVE_INFINITY;\n }\n\n // TODO: support editor config `indent_style` and `indent_size`\n }\n\n return prettier().format(content, options);\n } finally {\n logger.trace('applyPrettierFormatting - END');\n }\n}\n\nexport class MigratedDataFactory {\n // singleton\n private static data: MigratedData | null;\n\n static async getAsync(): Promise<MigratedData | null> {\n if (this.data) {\n return this.data;\n }\n const migrated = await this.build();\n\n if (!migrated) {\n return null;\n }\n\n this.data = migrated;\n return this.data;\n }\n\n static reset(): void {\n this.data = null;\n }\n\n static applyPrettierFormatting({\n content,\n filename,\n indent,\n }: MigratedData): Promise<string> {\n const parser = upath.extname(filename).replace('.', '') as PrettierParser;\n return applyPrettierFormatting(filename, content, parser, indent);\n }\n\n private static async build(): Promise<MigratedData | null> {\n let res: MigratedData | null = null;\n try {\n const { configFileName, configFileParsed = {} } =\n await detectRepoFileConfig();\n\n // get migrated config\n const { isMigrated, migratedConfig } = migrateConfig(configFileParsed);\n if (!isMigrated) {\n return null;\n }\n\n delete migratedConfig.errors;\n delete migratedConfig.warnings;\n\n // TODO #22198\n const raw = await platform.getRawFile(configFileName!);\n const indent = detectIndent(raw ?? '');\n // indent defaults to 2 spaces\n const indentSpace = indent.indent ?? ' ';\n const filename = configFileName!;\n let content: string;\n\n if (filename.endsWith('.json5')) {\n content = JSON5.stringify(migratedConfig, undefined, indentSpace);\n } else {\n content = JSON.stringify(migratedConfig, undefined, indentSpace);\n }\n\n if (!content.endsWith('\\n')) {\n content += '\\n';\n }\n\n res = { content, filename, indent };\n } catch (err) {\n logger.debug(\n { err },\n 'MigratedDataFactory.getAsync() Error initializing renovate MigratedData',\n );\n }\n return res;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AA0BA,MAAM,0BAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAIF,eAAsB,wBACpB,UACA,SACA,QACA,QACiB;AACjB,KAAI;AACF,SAAO,MAAM,kCAAkC;EAC/C,MAAM,WAAW,MAAM,IAAI,aAAa;EACxC,IAAI,iBAAiB,SAAS,MAAM,SAClC,wBAAwB,IAAI,KAAK,CAClC;EAED,MAAM,qBAAqB,SAAS,MACjC,SAAS,SAAS,gBACpB;AAED,MAAI,CAAC,eACH,KAAI;GACF,MAAM,qBAAqB,MAAM,cAAc,gBAAgB,OAAO;AACtE,oBACE,sBAAsB,KAAK,MAAM,mBAAmB,CAAC;UACjD;AACN,UAAO,KACL,+DACD;;AAIL,MAAI,CAAC,kBAAkB,CAAC,OACtB,QAAO;EAGT,MAAM,UAAmB;GACvB;GACA,UAAU,QAAQ,WAAW,IAAI,IAAI,QAAQ;GAC7C,SAAS,QAAQ,SAAS;GAC3B;AAED,MAAI,oBAAoB;GACtB,MAAM,aAAa,MAAM,aAAa,cAAc,SAAS;AAG7D,OAAI,WAAW,cACb,SAAQ,aAAa,SAAS,WAAW,cAAc,GACnD,WAAW,gBACX,OAAO;;AAMf,SAAO,UAAU,CAAC,OAAO,SAAS,QAAQ;WAClC;AACR,SAAO,MAAM,gCAAgC;;;AAIjD,IAAa,sBAAb,MAAiC;CAE/B,OAAe;CAEf,aAAa,WAAyC;AACpD,MAAI,KAAK,KACP,QAAO,KAAK;EAEd,MAAM,WAAW,MAAM,KAAK,OAAO;AAEnC,MAAI,CAAC,SACH,QAAO;AAGT,OAAK,OAAO;AACZ,SAAO,KAAK;;CAGd,OAAO,QAAc;AACnB,OAAK,OAAO;;CAGd,OAAO,wBAAwB,EAC7B,SACA,UACA,UACgC;AAEhC,SAAO,wBAAwB,UAAU,SAD1B,MAAM,QAAQ,SAAS,CAAC,QAAQ,KAAK,GAAG,EACG,OAAO;;CAGnE,aAAqB,QAAsC;EACzD,IAAI,MAA2B;AAC/B,MAAI;GACF,MAAM,EAAE,gBAAgB,mBAAmB,EAAE,KAC3C,MAAM,sBAAsB;GAG9B,MAAM,EAAE,YAAY,mBAAmB,cAAc,iBAAiB;AACtE,OAAI,CAAC,WACH,QAAO;AAGT,UAAO,eAAe;AACtB,UAAO,eAAe;GAItB,MAAM,SAAS,aADH,MAAM,SAAS,WAAW,eAAgB,IACnB,GAAG;GAEtC,MAAM,cAAc,OAAO,UAAU;GACrC,MAAM,WAAW;GACjB,IAAI;AAEJ,OAAI,SAAS,SAAS,SAAS,CAC7B,WAAU,MAAM,UAAU,gBAAgB,KAAA,GAAW,YAAY;OAEjE,WAAU,KAAK,UAAU,gBAAgB,KAAA,GAAW,YAAY;AAGlE,OAAI,CAAC,QAAQ,SAAS,KAAK,CACzB,YAAW;AAGb,SAAM;IAAE;IAAS;IAAU;IAAQ;WAC5B,KAAK;AACZ,UAAO,MACL,EAAE,KAAK,EACP,0EACD;;AAEH,SAAO"}
1
+ {"version":3,"file":"migrated-data.js","names":[],"sources":["../../../../../lib/workers/repository/config-migration/branch/migrated-data.ts"],"sourcesContent":["import { isNumber } from '@sindresorhus/is';\nimport detectIndent from 'detect-indent';\nimport JSON5 from 'json5';\nimport { weave } from 'jsonc-weaver';\nimport type { BuiltInParserName, Options } from 'prettier';\nimport upath from 'upath';\nimport { migrateConfig } from '../../../../config/migration.ts';\nimport { prettier } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport { EditorConfig } from '../../../../util/json-writer/index.ts';\nimport { detectRepoFileConfig } from '../../init/merge.ts';\n\nexport interface MigratedData {\n content: string;\n filename: string;\n indent: Indent;\n}\n\ninterface Indent {\n amount: number;\n indent: string;\n type?: string;\n}\n\nconst prettierConfigFilenames = new Set([\n '.prettierrc',\n '.prettierrc.json',\n '.prettierrc.yml',\n '.prettierrc.yaml',\n '.prettierrc.json5',\n '.prettierrc.js',\n '.prettierrc.cjs',\n '.prettierrc.mjs',\n 'prettier.config.js',\n 'prettier.config.cjs',\n 'prettier.config.mjs',\n '.prettierrc.toml',\n]);\n\nexport type PrettierParser = BuiltInParserName;\n\nexport async function applyPrettierFormatting(\n filename: string,\n content: string,\n parser: PrettierParser,\n indent?: Indent,\n): Promise<string> {\n try {\n logger.trace('applyPrettierFormatting - START');\n const fileList = await scm.getFileList();\n let prettierExists = fileList.some((file) =>\n prettierConfigFilenames.has(file),\n );\n\n const editorconfigExists = fileList.some(\n (file) => file === '.editorconfig',\n );\n\n if (!prettierExists) {\n try {\n const packageJsonContent = await readLocalFile('package.json', 'utf8');\n prettierExists =\n packageJsonContent && JSON.parse(packageJsonContent).prettier;\n } catch {\n logger.warn(\n 'applyPrettierFormatting - Error processing package.json file',\n );\n }\n }\n\n if (!prettierExists || !parser) {\n return content;\n }\n\n const options: Options = {\n parser,\n tabWidth: indent?.amount === 0 ? 2 : indent?.amount,\n useTabs: indent?.type === 'tab',\n };\n\n if (editorconfigExists) {\n const editorconf = await EditorConfig.getCodeFormat(filename);\n\n // https://github.com/prettier/prettier/blob/bab892242a1f9d8fcae50514b9304bf03f2e25ab/src/config/editorconfig/editorconfig-to-prettier.js#L47\n if (editorconf.maxLineLength) {\n options.printWidth = isNumber(editorconf.maxLineLength)\n ? editorconf.maxLineLength\n : Number.POSITIVE_INFINITY;\n }\n\n // TODO: support editor config `indent_style` and `indent_size`\n }\n\n return prettier().format(content, options);\n } finally {\n logger.trace('applyPrettierFormatting - END');\n }\n}\n\nexport class MigratedDataFactory {\n // singleton\n private static data: MigratedData | null;\n\n static async getAsync(): Promise<MigratedData | null> {\n if (this.data) {\n return this.data;\n }\n const migrated = await this.build();\n\n if (!migrated) {\n return null;\n }\n\n this.data = migrated;\n return this.data;\n }\n\n static reset(): void {\n this.data = null;\n }\n\n static applyPrettierFormatting({\n content,\n filename,\n indent,\n }: MigratedData): Promise<string> {\n const parser = upath.extname(filename).replace('.', '') as PrettierParser;\n return applyPrettierFormatting(filename, content, parser, indent);\n }\n\n private static async build(): Promise<MigratedData | null> {\n let res: MigratedData | null = null;\n try {\n const { configFileName, configFileParsed = {} } =\n await detectRepoFileConfig();\n\n // get migrated config\n const { isMigrated, migratedConfig } = migrateConfig(configFileParsed);\n if (!isMigrated) {\n return null;\n }\n\n delete migratedConfig.errors;\n delete migratedConfig.warnings;\n\n // TODO #22198\n const raw = await platform.getRawFile(configFileName!);\n const indent = detectIndent(raw ?? '');\n // indent defaults to 2 spaces\n const indentSpace = indent.indent ?? ' ';\n const filename = configFileName!;\n let content: string;\n\n if (filename.endsWith('.json5')) {\n content = JSON5.stringify(migratedConfig, undefined, indentSpace);\n } else if (raw) {\n try {\n content = weave(raw, migratedConfig);\n } catch (err) {\n logger.warn(\n { err },\n 'Error weaving JSONC to preserve comments, falling back to JSON.stringify',\n );\n content = JSON.stringify(migratedConfig, undefined, indentSpace);\n }\n } else {\n content = JSON.stringify(migratedConfig, undefined, indentSpace);\n }\n\n if (!content.endsWith('\\n')) {\n content += '\\n';\n }\n\n res = { content, filename, indent };\n } catch (err) {\n logger.debug(\n { err },\n 'MigratedDataFactory.getAsync() Error initializing renovate MigratedData',\n );\n }\n return res;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA2BA,MAAM,0BAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAIF,eAAsB,wBACpB,UACA,SACA,QACA,QACiB;AACjB,KAAI;AACF,SAAO,MAAM,kCAAkC;EAC/C,MAAM,WAAW,MAAM,IAAI,aAAa;EACxC,IAAI,iBAAiB,SAAS,MAAM,SAClC,wBAAwB,IAAI,KAAK,CAClC;EAED,MAAM,qBAAqB,SAAS,MACjC,SAAS,SAAS,gBACpB;AAED,MAAI,CAAC,eACH,KAAI;GACF,MAAM,qBAAqB,MAAM,cAAc,gBAAgB,OAAO;AACtE,oBACE,sBAAsB,KAAK,MAAM,mBAAmB,CAAC;UACjD;AACN,UAAO,KACL,+DACD;;AAIL,MAAI,CAAC,kBAAkB,CAAC,OACtB,QAAO;EAGT,MAAM,UAAmB;GACvB;GACA,UAAU,QAAQ,WAAW,IAAI,IAAI,QAAQ;GAC7C,SAAS,QAAQ,SAAS;GAC3B;AAED,MAAI,oBAAoB;GACtB,MAAM,aAAa,MAAM,aAAa,cAAc,SAAS;AAG7D,OAAI,WAAW,cACb,SAAQ,aAAa,SAAS,WAAW,cAAc,GACnD,WAAW,gBACX,OAAO;;AAMf,SAAO,UAAU,CAAC,OAAO,SAAS,QAAQ;WAClC;AACR,SAAO,MAAM,gCAAgC;;;AAIjD,IAAa,sBAAb,MAAiC;CAE/B,OAAe;CAEf,aAAa,WAAyC;AACpD,MAAI,KAAK,KACP,QAAO,KAAK;EAEd,MAAM,WAAW,MAAM,KAAK,OAAO;AAEnC,MAAI,CAAC,SACH,QAAO;AAGT,OAAK,OAAO;AACZ,SAAO,KAAK;;CAGd,OAAO,QAAc;AACnB,OAAK,OAAO;;CAGd,OAAO,wBAAwB,EAC7B,SACA,UACA,UACgC;AAEhC,SAAO,wBAAwB,UAAU,SAD1B,MAAM,QAAQ,SAAS,CAAC,QAAQ,KAAK,GAAG,EACG,OAAO;;CAGnE,aAAqB,QAAsC;EACzD,IAAI,MAA2B;AAC/B,MAAI;GACF,MAAM,EAAE,gBAAgB,mBAAmB,EAAE,KAC3C,MAAM,sBAAsB;GAG9B,MAAM,EAAE,YAAY,mBAAmB,cAAc,iBAAiB;AACtE,OAAI,CAAC,WACH,QAAO;AAGT,UAAO,eAAe;AACtB,UAAO,eAAe;GAGtB,MAAM,MAAM,MAAM,SAAS,WAAW,eAAgB;GACtD,MAAM,SAAS,aAAa,OAAO,GAAG;GAEtC,MAAM,cAAc,OAAO,UAAU;GACrC,MAAM,WAAW;GACjB,IAAI;AAEJ,OAAI,SAAS,SAAS,SAAS,CAC7B,WAAU,MAAM,UAAU,gBAAgB,KAAA,GAAW,YAAY;YACxD,IACT,KAAI;AACF,cAAU,MAAM,KAAK,eAAe;YAC7B,KAAK;AACZ,WAAO,KACL,EAAE,KAAK,EACP,2EACD;AACD,cAAU,KAAK,UAAU,gBAAgB,KAAA,GAAW,YAAY;;OAGlE,WAAU,KAAK,UAAU,gBAAgB,KAAA,GAAW,YAAY;AAGlE,OAAI,CAAC,QAAQ,SAAS,KAAK,CACzB,YAAW;AAGb,SAAM;IAAE;IAAS;IAAU;IAAQ;WAC5B,KAAK;AACZ,UAAO,MACL,EAAE,KAAK,EACP,0EACD;;AAEH,SAAO"}
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": "43.72.0",
4
+ "version": "43.73.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -169,7 +169,7 @@
169
169
  "json-stringify-pretty-compact": "4.0.0",
170
170
  "json5": "2.2.3",
171
171
  "jsonata": "2.1.0",
172
- "jsonc-parser": "3.3.1",
172
+ "jsonc-weaver": "0.2.2",
173
173
  "klona": "2.0.6",
174
174
  "luxon": "3.7.2",
175
175
  "markdown-it": "14.1.1",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 43.72.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 43.73.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "43.72.0",
5
+ "x-renovate-version": "43.73.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "properties": {