renovate 43.263.0 → 43.263.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/app-strings.js +1 -1
- package/dist/config/app-strings.js.map +1 -1
- package/dist/config/decrypt/bcpgp.js +7 -4
- package/dist/config/decrypt/bcpgp.js.map +1 -1
- package/dist/config/migration.js +4 -6
- package/dist/config/migration.js.map +1 -1
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/validation-helpers/match-base-branches.js +4 -6
- package/dist/config/validation-helpers/match-base-branches.js.map +1 -1
- package/dist/config/validation-helpers/regex-glob-matchers.js +4 -6
- package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
- package/dist/config/validation-helpers/utils.js +2 -4
- package/dist/config/validation-helpers/utils.js.map +1 -1
- package/dist/config/validation.js +4 -6
- package/dist/config/validation.js.map +1 -1
- package/dist/config-validator.js +1 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +6 -8
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/aws-machine-image/index.js +1 -2
- package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
- package/dist/modules/datasource/azure-pipelines-tasks/index.js +2 -3
- package/dist/modules/datasource/azure-pipelines-tasks/index.js.map +1 -1
- package/dist/modules/datasource/conda/index.js +1 -3
- package/dist/modules/datasource/conda/index.js.map +1 -1
- package/dist/modules/datasource/dart-version/index.js +1 -2
- package/dist/modules/datasource/dart-version/index.js.map +1 -1
- package/dist/modules/datasource/datasource.js +1 -3
- package/dist/modules/datasource/datasource.js.map +1 -1
- package/dist/modules/datasource/devbox/index.js +1 -3
- package/dist/modules/datasource/devbox/index.js.map +1 -1
- package/dist/modules/datasource/docker/ecr.js +2 -1
- package/dist/modules/datasource/docker/ecr.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +1 -1
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/galaxy-collection/index.js +1 -1
- package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +2 -2
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/java-version/index.js +1 -3
- package/dist/modules/datasource/java-version/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +2 -1
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/nuget/common.js +6 -4
- package/dist/modules/datasource/nuget/common.js.map +1 -1
- package/dist/modules/datasource/util.js +3 -2
- package/dist/modules/datasource/util.js.map +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
- package/dist/modules/manager/bazel/extract.js +1 -3
- package/dist/modules/manager/bazel/extract.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +1 -1
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/buildpacks/extract.js +1 -1
- package/dist/modules/manager/buildpacks/extract.js.map +1 -1
- package/dist/modules/manager/bundler/common.js +23 -25
- package/dist/modules/manager/bundler/common.js.map +1 -1
- package/dist/modules/manager/bundler/extract.js +2 -6
- package/dist/modules/manager/bundler/extract.js.map +1 -1
- package/dist/modules/manager/cargo/extract.js +4 -6
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +3 -3
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +13 -13
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +2 -1
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/parse.js +1 -1
- package/dist/modules/manager/github-actions/parse.js.map +1 -1
- package/dist/modules/manager/gradle/extract/catalog.js +4 -3
- package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
- package/dist/modules/manager/gradle/extract.js +2 -2
- package/dist/modules/manager/gradle/extract.js.map +1 -1
- package/dist/modules/manager/gradle/parser/common.js +1 -1
- package/dist/modules/manager/gradle/parser/common.js.map +1 -1
- package/dist/modules/manager/gradle/parser/handlers.js +1 -1
- package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
- package/dist/modules/manager/helm-values/extract.js.map +1 -1
- package/dist/modules/manager/helmfile/extract.js +1 -1
- package/dist/modules/manager/helmfile/extract.js.map +1 -1
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven/update.js +2 -1
- package/dist/modules/manager/maven/update.js.map +1 -1
- package/dist/modules/manager/mise/utils.js +5 -7
- package/dist/modules/manager/mise/utils.js.map +1 -1
- package/dist/modules/manager/mix/extract.js +3 -6
- package/dist/modules/manager/mix/extract.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/overrides.js +1 -1
- package/dist/modules/manager/npm/extract/common/overrides.js.map +1 -1
- package/dist/modules/manager/npm/extract/yarn.js +1 -1
- package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
- package/dist/modules/manager/npm/npmrc.js +1 -3
- package/dist/modules/manager/npm/npmrc.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/common.js +2 -3
- package/dist/modules/manager/npm/update/dependency/common.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/pnpm.js +1 -1
- package/dist/modules/manager/npm/update/dependency/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/yarn.js +1 -1
- package/dist/modules/manager/npm/update/dependency/yarn.js.map +1 -1
- package/dist/modules/manager/osgi/extract.js +1 -1
- package/dist/modules/manager/osgi/extract.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +1 -1
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pep621/schema.js.map +1 -1
- package/dist/modules/manager/pip_setup/extract.js +1 -1
- package/dist/modules/manager/pip_setup/extract.js.map +1 -1
- package/dist/modules/manager/pipenv/artifacts.js.map +1 -1
- package/dist/modules/manager/poetry/schema.js +2 -2
- package/dist/modules/manager/poetry/schema.js.map +1 -1
- package/dist/modules/manager/pub/artifacts.js +4 -6
- package/dist/modules/manager/pub/artifacts.js.map +1 -1
- package/dist/modules/manager/pub/utils.js +2 -2
- package/dist/modules/manager/pub/utils.js.map +1 -1
- package/dist/modules/manager/puppet/common.js +4 -6
- package/dist/modules/manager/puppet/common.js.map +1 -1
- package/dist/modules/manager/sbt/extract.js +1 -1
- package/dist/modules/manager/sbt/extract.js.map +1 -1
- package/dist/modules/manager/sbt/util.js +4 -2
- package/dist/modules/manager/sbt/util.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/util.js +1 -1
- package/dist/modules/manager/terraform/lockfile/util.js.map +1 -1
- package/dist/modules/platform/azure/index.js +15 -19
- package/dist/modules/platform/azure/index.js.map +1 -1
- package/dist/modules/platform/azure/issue.js +67 -17
- package/dist/modules/platform/azure/issue.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +1 -3
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/forgejo/index.js +5 -3
- package/dist/modules/platform/forgejo/index.js.map +1 -1
- package/dist/modules/platform/forgejo/utils.js +1 -1
- package/dist/modules/platform/forgejo/utils.js.map +1 -1
- package/dist/modules/platform/gerrit/scm.js +5 -7
- package/dist/modules/platform/gerrit/scm.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +5 -3
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/utils.js +1 -1
- package/dist/modules/platform/gitea/utils.js.map +1 -1
- package/dist/modules/platform/github/index.js +5 -7
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/pr.js +1 -1
- package/dist/modules/platform/github/pr.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +2 -1
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/utils/pr-body.js +2 -1
- package/dist/modules/platform/utils/pr-body.js.map +1 -1
- package/dist/modules/versioning/apk/index.js +3 -3
- package/dist/modules/versioning/apk/index.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +4 -7
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/conan/common.js +4 -6
- package/dist/modules/versioning/conan/common.js.map +1 -1
- package/dist/modules/versioning/conan/index.js +1 -3
- package/dist/modules/versioning/conan/index.js.map +1 -1
- package/dist/modules/versioning/conan/range.js +4 -5
- package/dist/modules/versioning/conan/range.js.map +1 -1
- package/dist/modules/versioning/conda/index.js +1 -1
- package/dist/modules/versioning/conda/index.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +7 -3
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/hermit/index.js +2 -2
- package/dist/modules/versioning/hermit/index.js.map +1 -1
- package/dist/modules/versioning/ivy/index.js +1 -1
- package/dist/modules/versioning/ivy/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +4 -6
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/npm/range.js +5 -7
- package/dist/modules/versioning/npm/range.js.map +1 -1
- package/dist/modules/versioning/nuget/version.js +6 -6
- package/dist/modules/versioning/nuget/version.js.map +1 -1
- package/dist/modules/versioning/pep440/index.js +1 -1
- package/dist/modules/versioning/pep440/index.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +2 -6
- package/dist/modules/versioning/pep440/range.js.map +1 -1
- package/dist/modules/versioning/poetry/index.js +1 -1
- package/dist/modules/versioning/poetry/index.js.map +1 -1
- package/dist/modules/versioning/pvp/index.js +2 -2
- package/dist/modules/versioning/pvp/index.js.map +1 -1
- package/dist/modules/versioning/rpm/index.js +4 -3
- package/dist/modules/versioning/rpm/index.js.map +1 -1
- package/dist/modules/versioning/ruby/range.js +2 -2
- package/dist/modules/versioning/ruby/range.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/bump.js +1 -1
- package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
- package/dist/modules/versioning/ruby/strategies/replace.js +13 -12
- package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
- package/dist/modules/versioning/ruby/version.js +1 -1
- package/dist/modules/versioning/ruby/version.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/index.js +1 -1
- package/dist/modules/versioning/rust-release-channel/index.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/util.js +4 -4
- package/dist/modules/versioning/rust-release-channel/util.js.map +1 -1
- package/dist/util/common.js +1 -3
- package/dist/util/common.js.map +1 -1
- package/dist/util/exec/common.js +4 -6
- package/dist/util/exec/common.js.map +1 -1
- package/dist/util/exec/containerbase.js +1 -3
- package/dist/util/exec/containerbase.js.map +1 -1
- package/dist/util/git/instrument.js +3 -3
- package/dist/util/git/instrument.js.map +1 -1
- package/dist/util/github/graphql/datasource-fetcher.js +5 -4
- package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
- package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
- package/dist/util/http/github.js +3 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/http.d.ts +1 -1
- package/dist/util/http/http.js.map +1 -1
- package/dist/util/result.d.ts +8 -8
- package/dist/util/result.js +1 -1
- package/dist/util/result.js.map +1 -1
- package/dist/util/url.js +2 -2
- package/dist/util/url.js.map +1 -1
- package/dist/workers/global/config/parse/cli.js +18 -20
- package/dist/workers/global/config/parse/cli.js.map +1 -1
- package/dist/workers/global/config/parse/env.js +3 -5
- package/dist/workers/global/config/parse/env.js.map +1 -1
- package/dist/workers/repository/config-migration/branch/index.js +3 -5
- package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
- package/dist/workers/repository/init/merge.js +2 -3
- package/dist/workers/repository/init/merge.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/check.js +7 -9
- package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/index.js +4 -8
- package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js +2 -2
- package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js.map +1 -1
- package/dist/workers/repository/process/fetch.js.map +1 -1
- package/dist/workers/repository/process/libyear.js +1 -3
- package/dist/workers/repository/process/libyear.js.map +1 -1
- package/dist/workers/repository/process/lookup/filter-checks.js +9 -11
- package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
- package/dist/workers/repository/process/lookup/index.js +5 -8
- package/dist/workers/repository/process/lookup/index.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +3 -3
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/reconfigure/index.js +3 -5
- package/dist/workers/repository/reconfigure/index.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
- package/dist/workers/repository/update/branch/get-updated.js +3 -5
- package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
- package/dist/workers/repository/update/pr/body/updates-table.js +1 -3
- package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +6 -7
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/dist/workers/repository/updates/flatten.js +1 -1
- package/dist/workers/repository/updates/flatten.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +1 -1
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
package/dist/util/result.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.js","names":[],"sources":["../../lib/util/result.ts"],"sourcesContent":["import type { ZodError, output as ZodOutput, ZodType } from 'zod/v4';\nimport { NEVER } from 'zod/v4';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\n\ntype Val = NonNullable<unknown>;\n\n// ZodSafeParseResult is not exported from zod/v4 public API, derive from safeParse return type\ntype ZodSafeParseResult<T> = ReturnType<ZodType<T>['safeParse']>;\n\ninterface Ok<T extends Val> {\n readonly ok: true;\n readonly val: T;\n readonly err?: never;\n}\n\ninterface Err<E extends Val> {\n readonly ok: false;\n readonly err: E;\n readonly val?: never;\n\n /**\n * Internal flag to indicate that the error was thrown during `.transform()`\n * and will be re-thrown on `.unwrap()`.\n */\n readonly _uncaught?: true;\n}\n\ntype Res<T extends Val, E extends Val> = Ok<T> | Err<E>;\n\nfunction isZodResult<Output extends Val>(\n input: unknown,\n): input is ZodSafeParseResult<Output> {\n if (\n typeof input !== 'object' ||\n input === null ||\n Object.keys(input).length !== 2 ||\n !('success' in input) ||\n typeof input.success !== 'boolean'\n ) {\n return false;\n }\n\n if (input.success) {\n return (\n 'data' in input &&\n typeof input.data !== 'undefined' &&\n input.data !== null\n );\n } else {\n return 'error' in input;\n }\n}\n\nfunction fromZodResult<ZodOutput extends Val>(\n input: ZodSafeParseResult<ZodOutput>,\n): Result<ZodOutput, ZodError<unknown>> {\n return input.success ? Result.ok(input.data) : Result.err(input.error);\n}\n\n/**\n * All non-nullable values that also are not Promises nor Zod results.\n * It's useful for restricting Zod results to not return `null` or `undefined`.\n */\ntype RawValue<T extends Val> = Exclude<\n T,\n ZodSafeParseResult<T> | Promise<unknown>\n>;\n\nfunction fromNullable<\n T extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n>(\n input: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n): Result<T, ErrForNull | ErrForUndefined> {\n if (input === null) {\n return Result.err(errForNull);\n }\n\n if (input === undefined) {\n return Result.err(errForUndefined);\n }\n\n return Result.ok(input);\n}\n\n/**\n * Class for representing a result that can fail.\n *\n * The mental model:\n * - `.wrap()` and `.wrapNullable()` are sinks\n * - `.transform()` are pipes which can be chained\n * - `.unwrap()` is the point of consumption\n */\nexport class Result<T extends Val, E extends Val = Error> {\n private readonly res: Res<T, E>;\n\n private constructor(res: Res<T, E>) {\n this.res = res;\n }\n\n static ok<T extends Val>(val: T): Result<T, never> {\n return new Result({ ok: true, val });\n }\n\n static err<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err });\n }\n\n static _uncaught<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err, _uncaught: true });\n }\n\n /**\n * Wrap a callback or promise in a Result in such a way that any thrown errors\n * are caught and wrapped with `Result.err()` (and hence never re-thrown).\n *\n * In case of a promise, the `AsyncResult` is returned.\n * Use `.unwrap()` to get the `Promise<Result<T, E>>` from `AsyncResult`.\n *\n * ```ts\n *\n * // SYNC\n * const parse = (json: string) => Result.wrap(() => JSON.parse(json));\n *\n * const { val, err } = parse('{\"foo\": \"bar\"}').unwrap();\n * expect(val).toEqual({ foo: 'bar' });\n * expect(err).toBeUndefined();\n *\n * const { val, err } = parse('!!!').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBeInstanceOf(SyntaxError);\n *\n * // ASYNC\n * const request = (url: string) => Result.wrap(http.get(url));\n *\n * const { val, err } = await request('https://example.com').unwrap();\n * expect(val).toBeString();\n * expect(err).toBeUndefined();\n *\n * ```\n */\n static wrap<T extends Val>(\n zodResult: ZodSafeParseResult<T>,\n ): Result<T, ZodError<unknown>>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => RawValue<T>,\n ): Result<T, E>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise: Promise<Result<T, EE>>,\n ): AsyncResult<T, E | EE>;\n static wrap<T extends Val, E extends Val = Error>(\n promise: Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n input:\n | ZodSafeParseResult<T>\n | (() => RawValue<T>)\n | (() => Promise<RawValue<T>>)\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n ): Result<T, ZodError<unknown>> | Result<T, E | EE> | AsyncResult<T, E | EE> {\n if (isZodResult<T>(input)) {\n return fromZodResult<T>(input);\n }\n\n if (input instanceof Promise) {\n return AsyncResult.wrap(input as never);\n }\n\n try {\n const result = input();\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result);\n }\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n /**\n * Similar to `Result.wrap()`, but helps to undo the billion dollar mistake by\n * replacing `null` or `undefined` with an error of provided type.\n *\n * Errors thrown inside the callback or promise are caught and wrapped with `Result.err()`,\n * hence never re-thrown.\n *\n * Since functions and promises returning nullable can't be wrapped with `Result.wrap()`\n * because `val` is constrained by being `NonNullable`, `null` and `undefined`\n * must be converted to some sort of `err` value.\n *\n * This method does exactly this, i.g. it is the feature-rich shorthand for:\n *\n * ```ts\n * const { val, err } = Result.wrap(() => {\n * const result = callback();\n * return result === null || result === undefined\n * ? Result.err('oops')\n * : Result.ok(result);\n * }).unwrap();\n * ```\n *\n * In case of a promise, the `AsyncResult` is returned.\n *\n * ```ts\n *\n * // SYNC\n * const getHostname = (url: string) =>\n * Result.wrapNullable(\n * () => parseUrl(url)?.hostname,\n * 'invalid-url' as const\n * );\n * const { val, err } = getHostname('foobar').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBe('invalid-url');\n *\n * // ASYNC\n * const { val, err } = await Result.wrapNullable(\n * readLocalFile('yarn.lock'),\n * 'file-read-error' as const\n * ).unwrap();\n *\n * ```\n */\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNullable: ErrForNullable,\n ): AsyncResult<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n value: Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n value: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n input: (() => Nullish<T>) | Promise<Nullish<T>> | Nullish<T>,\n arg2: ErrForNull,\n arg3?: ErrForUndefined,\n ):\n | Result<T, E | ErrForNull | ErrForUndefined>\n | AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n const errForNull = arg2;\n const errForUndefined = arg3 ?? arg2;\n\n if (input instanceof Promise) {\n return AsyncResult.wrapNullable(input, errForNull, errForUndefined);\n }\n\n if (input instanceof Function) {\n try {\n const result = input();\n return fromNullable(result, errForNull, errForUndefined);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n return fromNullable(input, errForNull, errForUndefined);\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const { val, err } = Result.ok('foo').unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Res<T, E> {\n if (this.res.ok) {\n return this.res;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return this.res;\n }\n\n /**\n * Returns a success value or a fallback value.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const value = Result.err('bar').unwrapOr('foo');\n * expect(val).toBe('foo');\n *\n * ```\n */\n unwrapOr(fallback: T): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return fallback;\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n unwrapOrThrow(): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n /**\n * Returns the ok-value or `null`.\n * When error was uncaught during transformation, it's being re-thrown here.\n */\n unwrapOrNull(): T | null {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return null;\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * // SYNC\n * const { val, err } = Result.ok('foo')\n * .transform((x) => x.length)\n * .unwrap();\n * expect(val).toBe(3);\n *\n * // ASYNC\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): Result<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): Result<U, E | ZodError<unknown>>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError<unknown>>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): Result<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ):\n | Result<U, E | EE | ZodError<unknown>>\n | AsyncResult<U, E | EE | ZodError<unknown>> {\n if (!this.res.ok) {\n return Result.err(this.res.err);\n }\n\n try {\n const result = fn(this.res.val);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn({ err }, 'Result: unhandled async transform error');\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'Result: unhandled transform error');\n return Result._uncaught(err);\n }\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE>,\n ): Result<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): Result<T | U, EE> | AsyncResult<T | U, EE> {\n if (this.res.ok) {\n return this as never;\n }\n\n if (this.res._uncaught) {\n return this as never;\n }\n\n try {\n const result = fn(this.res.err);\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'Result: unexpected error in async catch handler',\n );\n return Result._uncaught(err);\n });\n }\n\n return result;\n } catch (err) {\n logger.warn({ err }, 'Result: unexpected error in catch handler');\n return Result._uncaught(err);\n }\n }\n\n /**\n * Given a `schema` and `input`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n static parse<Schema extends ZodType<any, any, any>>(\n input: unknown,\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, ZodError<unknown>> {\n const parseResult = schema\n .transform((result, ctx): NonNullable<ZodOutput<Schema>> => {\n if (result === undefined) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to undefined`,\n });\n return NEVER;\n }\n\n if (result === null) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to null`,\n });\n return NEVER;\n }\n\n return result;\n })\n .safeParse(input);\n\n return fromZodResult<NonNullable<ZodOutput<Schema>>>(parseResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, E | ZodError<unknown>> {\n if (this.res.ok) {\n return Result.parse(this.res.val, schema);\n }\n\n const err = this.res.err;\n\n if (this.res._uncaught) {\n return Result._uncaught(err);\n }\n\n return Result.err(err);\n }\n\n /**\n * Call `fn` on the `val` if the result is ok.\n */\n onValue(fn: (value: T) => void): Result<T, E> {\n if (this.res.ok) {\n try {\n fn(this.res.val);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n\n /**\n * Call `fn` on the `err` if the result is err.\n */\n onError(fn: (err: E) => void): Result<T, E> {\n if (!this.res.ok) {\n try {\n fn(this.res.err);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n}\n\n/**\n * This class is being used when `Result` methods encounter async code.\n * It isn't meant to be used directly, but exported for usage in type annotations.\n *\n * All the methods resemble `Result` methods, but work asynchronously.\n */\nexport class AsyncResult<T extends Val, E extends Val> implements PromiseLike<\n Result<T, E>\n> {\n private asyncResult: Promise<Result<T, E>>;\n\n private constructor(asyncResult: Promise<Result<T, E>>) {\n this.asyncResult = asyncResult;\n }\n\n // oxlint-disable-next-line unicorn/no-thenable -- required to implement PromiseLike\n then<TResult1 = Result<T, E>>(\n onfulfilled?:\n | ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>)\n | null,\n ): PromiseLike<TResult1> {\n return this.asyncResult.then(onfulfilled);\n }\n\n static ok<T extends Val>(val: T): AsyncResult<T, never> {\n return new AsyncResult(Promise.resolve(Result.ok(val)));\n }\n\n static err<E extends Val>(err: NonNullable<E>): AsyncResult<never, E> {\n return new AsyncResult(Promise.resolve(Result.err(err)));\n }\n\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise:\n | Promise<ZodSafeParseResult<T>>\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n onErr?: (err: NonNullable<E>) => Result<T, E>,\n ): AsyncResult<T, E | EE> {\n return new AsyncResult(\n promise\n .then((value) => {\n if (value instanceof Result) {\n return value;\n }\n\n if (isZodResult<T>(value)) {\n return fromZodResult<T>(value);\n }\n\n return Result.ok(value);\n })\n .catch((err) => {\n if (onErr) {\n return onErr(err);\n }\n return Result.err(err);\n }),\n );\n }\n\n static wrapNullable<\n T extends Val,\n E extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: NonNullable<ErrForNull>,\n errForUndefined: NonNullable<ErrForUndefined>,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n return new AsyncResult(\n promise\n .then((value) => fromNullable(value, errForNull, errForUndefined))\n .catch((err) => Result.err(err)),\n );\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(readFile('foo.txt')).unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Promise<Res<T, E>> {\n return this.asyncResult.then<Res<T, E>>((res) => res.unwrap());\n }\n\n /**\n * Returns a success value or a fallback value.\n *\n * ```ts\n *\n * const val = await Result.wrap(readFile('foo.txt')).unwrapOr('bar');\n * expect(val).toBe('bar');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrapOr(fallback: T): Promise<T> {\n return this.asyncResult.then<T>((res) => res.unwrapOr(fallback));\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n async unwrapOrThrow(): Promise<T> {\n const result = await this.asyncResult;\n return result.unwrapOrThrow();\n }\n\n /**\n * Returns the ok-value or `null`.\n */\n unwrapOrNull(): Promise<T | null> {\n return this.asyncResult.then<T | null>((res) => res.unwrapOrNull());\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): AsyncResult<U, E | ZodError<unknown>>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError<unknown>>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): AsyncResult<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): AsyncResult<U, E | EE | ZodError<unknown>> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => {\n const { ok, val: value, err: error } = oldResult.unwrap();\n if (!ok) {\n return Result.err(error);\n }\n\n try {\n const result = fn(value);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'AsyncResult: unhandled async transform error',\n );\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'AsyncResult: unhandled transform error');\n return Result._uncaught(err);\n }\n })\n .catch((err) => {\n // Happens when `.unwrap()` of `oldResult` throws\n return Result._uncaught(err);\n }),\n );\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Result<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (\n err: NonNullable<E>,\n ) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE> {\n const caughtAsyncResult: Promise<Result<T, EE>> = this.asyncResult.then(\n (result) => result.catch(fn as never),\n );\n return AsyncResult.wrap(caughtAsyncResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): AsyncResult<NonNullable<ZodOutput<Schema>>, E | ZodError<unknown>> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => oldResult.parse(schema))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onValue(fn: (value: T) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onValue(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onError(fn: (err: E) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onError(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"result.js","names":[],"sources":["../../lib/util/result.ts"],"sourcesContent":["import type { ZodError, output as ZodOutput, ZodType } from 'zod/v4';\nimport { NEVER } from 'zod/v4';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\n\ntype Val = NonNullable<unknown>;\n\n// ZodSafeParseResult is not exported from zod/v4 public API, derive from safeParse return type\ntype ZodSafeParseResult<T> = ReturnType<ZodType<T>['safeParse']>;\n\ninterface Ok<T extends Val> {\n readonly ok: true;\n readonly val: T;\n readonly err?: never;\n}\n\ninterface Err<E extends Val> {\n readonly ok: false;\n readonly err: E;\n readonly val?: never;\n\n /**\n * Internal flag to indicate that the error was thrown during `.transform()`\n * and will be re-thrown on `.unwrap()`.\n */\n readonly _uncaught?: true;\n}\n\ntype Res<T extends Val, E extends Val> = Ok<T> | Err<E>;\n\nfunction isZodResult<Output extends Val>(\n input: unknown,\n): input is ZodSafeParseResult<Output> {\n if (\n typeof input !== 'object' ||\n input === null ||\n Object.keys(input).length !== 2 ||\n !('success' in input) ||\n typeof input.success !== 'boolean'\n ) {\n return false;\n }\n\n if (input.success) {\n return (\n 'data' in input &&\n typeof input.data !== 'undefined' &&\n input.data !== null\n );\n }\n return 'error' in input;\n}\n\nfunction fromZodResult<ZodOutput extends Val>(\n input: ZodSafeParseResult<ZodOutput>,\n): Result<ZodOutput, ZodError> {\n return input.success ? Result.ok(input.data) : Result.err(input.error);\n}\n\n/**\n * All non-nullable values that also are not Promises nor Zod results.\n * It's useful for restricting Zod results to not return `null` or `undefined`.\n */\ntype RawValue<T extends Val> = Exclude<\n T,\n ZodSafeParseResult<T> | Promise<unknown>\n>;\n\nfunction fromNullable<\n T extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n>(\n input: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n): Result<T, ErrForNull | ErrForUndefined> {\n if (input === null) {\n return Result.err(errForNull);\n }\n\n if (input === undefined) {\n return Result.err(errForUndefined);\n }\n\n return Result.ok(input);\n}\n\n/**\n * Class for representing a result that can fail.\n *\n * The mental model:\n * - `.wrap()` and `.wrapNullable()` are sinks\n * - `.transform()` are pipes which can be chained\n * - `.unwrap()` is the point of consumption\n */\nexport class Result<T extends Val, E extends Val = Error> {\n private readonly res: Res<T, E>;\n\n private constructor(res: Res<T, E>) {\n this.res = res;\n }\n\n static ok<T extends Val>(val: T): Result<T, never> {\n return new Result({ ok: true, val });\n }\n\n static err<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err });\n }\n\n static _uncaught<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err, _uncaught: true });\n }\n\n /**\n * Wrap a callback or promise in a Result in such a way that any thrown errors\n * are caught and wrapped with `Result.err()` (and hence never re-thrown).\n *\n * In case of a promise, the `AsyncResult` is returned.\n * Use `.unwrap()` to get the `Promise<Result<T, E>>` from `AsyncResult`.\n *\n * ```ts\n *\n * // SYNC\n * const parse = (json: string) => Result.wrap(() => JSON.parse(json));\n *\n * const { val, err } = parse('{\"foo\": \"bar\"}').unwrap();\n * expect(val).toEqual({ foo: 'bar' });\n * expect(err).toBeUndefined();\n *\n * const { val, err } = parse('!!!').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBeInstanceOf(SyntaxError);\n *\n * // ASYNC\n * const request = (url: string) => Result.wrap(http.get(url));\n *\n * const { val, err } = await request('https://example.com').unwrap();\n * expect(val).toBeString();\n * expect(err).toBeUndefined();\n *\n * ```\n */\n static wrap<T extends Val>(\n zodResult: ZodSafeParseResult<T>,\n ): Result<T, ZodError>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => RawValue<T>,\n ): Result<T, E>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise: Promise<Result<T, EE>>,\n ): AsyncResult<T, E | EE>;\n static wrap<T extends Val, E extends Val = Error>(\n promise: Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n input:\n | ZodSafeParseResult<T>\n | (() => RawValue<T>)\n | (() => Promise<RawValue<T>>)\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n ): Result<T, ZodError> | Result<T, E | EE> | AsyncResult<T, E | EE> {\n if (isZodResult<T>(input)) {\n return fromZodResult<T>(input);\n }\n\n if (input instanceof Promise) {\n return AsyncResult.wrap(input as never);\n }\n\n try {\n const result = input();\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result);\n }\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n /**\n * Similar to `Result.wrap()`, but helps to undo the billion dollar mistake by\n * replacing `null` or `undefined` with an error of provided type.\n *\n * Errors thrown inside the callback or promise are caught and wrapped with `Result.err()`,\n * hence never re-thrown.\n *\n * Since functions and promises returning nullable can't be wrapped with `Result.wrap()`\n * because `val` is constrained by being `NonNullable`, `null` and `undefined`\n * must be converted to some sort of `err` value.\n *\n * This method does exactly this, i.g. it is the feature-rich shorthand for:\n *\n * ```ts\n * const { val, err } = Result.wrap(() => {\n * const result = callback();\n * return result === null || result === undefined\n * ? Result.err('oops')\n * : Result.ok(result);\n * }).unwrap();\n * ```\n *\n * In case of a promise, the `AsyncResult` is returned.\n *\n * ```ts\n *\n * // SYNC\n * const getHostname = (url: string) =>\n * Result.wrapNullable(\n * () => parseUrl(url)?.hostname,\n * 'invalid-url' as const\n * );\n * const { val, err } = getHostname('foobar').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBe('invalid-url');\n *\n * // ASYNC\n * const { val, err } = await Result.wrapNullable(\n * readLocalFile('yarn.lock'),\n * 'file-read-error' as const\n * ).unwrap();\n *\n * ```\n */\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNullable: ErrForNullable,\n ): AsyncResult<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n value: Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n value: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n input: (() => Nullish<T>) | Promise<Nullish<T>> | Nullish<T>,\n arg2: ErrForNull,\n arg3?: ErrForUndefined,\n ):\n | Result<T, E | ErrForNull | ErrForUndefined>\n | AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n const errForNull = arg2;\n const errForUndefined = arg3 ?? arg2;\n\n if (input instanceof Promise) {\n return AsyncResult.wrapNullable(input, errForNull, errForUndefined);\n }\n\n if (input instanceof Function) {\n try {\n const result = input();\n return fromNullable(result, errForNull, errForUndefined);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n return fromNullable(input, errForNull, errForUndefined);\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const { val, err } = Result.ok('foo').unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Res<T, E> {\n if (this.res.ok) {\n return this.res;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return this.res;\n }\n\n /**\n * Returns a success value or a fallback value.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const value = Result.err('bar').unwrapOr('foo');\n * expect(val).toBe('foo');\n *\n * ```\n */\n unwrapOr(fallback: T): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return fallback;\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n unwrapOrThrow(): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n /**\n * Returns the ok-value or `null`.\n * When error was uncaught during transformation, it's being re-thrown here.\n */\n unwrapOrNull(): T | null {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return null;\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * // SYNC\n * const { val, err } = Result.ok('foo')\n * .transform((x) => x.length)\n * .unwrap();\n * expect(val).toBe(3);\n *\n * // ASYNC\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): Result<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): Result<U, E | ZodError>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): Result<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): Result<U, E | EE | ZodError> | AsyncResult<U, E | EE | ZodError> {\n if (!this.res.ok) {\n return Result.err(this.res.err);\n }\n\n try {\n const result = fn(this.res.val);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn({ err }, 'Result: unhandled async transform error');\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'Result: unhandled transform error');\n return Result._uncaught(err);\n }\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE>,\n ): Result<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): Result<T | U, EE> | AsyncResult<T | U, EE> {\n if (this.res.ok) {\n return this as never;\n }\n\n if (this.res._uncaught) {\n return this as never;\n }\n\n try {\n const result = fn(this.res.err);\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'Result: unexpected error in async catch handler',\n );\n return Result._uncaught(err);\n });\n }\n\n return result;\n } catch (err) {\n logger.warn({ err }, 'Result: unexpected error in catch handler');\n return Result._uncaught(err);\n }\n }\n\n /**\n * Given a `schema` and `input`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n static parse<Schema extends ZodType<any, any, any>>(\n input: unknown,\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, ZodError> {\n const parseResult = schema\n .transform((result, ctx): NonNullable<ZodOutput<Schema>> => {\n if (result === undefined) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to undefined`,\n });\n return NEVER;\n }\n\n if (result === null) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to null`,\n });\n return NEVER;\n }\n\n return result;\n })\n .safeParse(input);\n\n return fromZodResult<NonNullable<ZodOutput<Schema>>>(parseResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, E | ZodError> {\n if (this.res.ok) {\n return Result.parse(this.res.val, schema);\n }\n\n const err = this.res.err;\n\n if (this.res._uncaught) {\n return Result._uncaught(err);\n }\n\n return Result.err(err);\n }\n\n /**\n * Call `fn` on the `val` if the result is ok.\n */\n onValue(fn: (value: T) => void): Result<T, E> {\n if (this.res.ok) {\n try {\n fn(this.res.val);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n\n /**\n * Call `fn` on the `err` if the result is err.\n */\n onError(fn: (err: E) => void): Result<T, E> {\n if (!this.res.ok) {\n try {\n fn(this.res.err);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n}\n\n/**\n * This class is being used when `Result` methods encounter async code.\n * It isn't meant to be used directly, but exported for usage in type annotations.\n *\n * All the methods resemble `Result` methods, but work asynchronously.\n */\nexport class AsyncResult<T extends Val, E extends Val> implements PromiseLike<\n Result<T, E>\n> {\n private asyncResult: Promise<Result<T, E>>;\n\n private constructor(asyncResult: Promise<Result<T, E>>) {\n this.asyncResult = asyncResult;\n }\n\n // oxlint-disable-next-line unicorn/no-thenable -- required to implement PromiseLike\n then<TResult1 = Result<T, E>>(\n onfulfilled?:\n | ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>)\n | null,\n ): PromiseLike<TResult1> {\n return this.asyncResult.then(onfulfilled);\n }\n\n static ok<T extends Val>(val: T): AsyncResult<T, never> {\n return new AsyncResult(Promise.resolve(Result.ok(val)));\n }\n\n static err<E extends Val>(err: NonNullable<E>): AsyncResult<never, E> {\n return new AsyncResult(Promise.resolve(Result.err(err)));\n }\n\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise:\n | Promise<ZodSafeParseResult<T>>\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n onErr?: (err: NonNullable<E>) => Result<T, E>,\n ): AsyncResult<T, E | EE> {\n return new AsyncResult(\n promise\n .then((value) => {\n if (value instanceof Result) {\n return value;\n }\n\n if (isZodResult<T>(value)) {\n return fromZodResult<T>(value);\n }\n\n return Result.ok(value);\n })\n .catch((err) => {\n if (onErr) {\n return onErr(err);\n }\n return Result.err(err);\n }),\n );\n }\n\n static wrapNullable<\n T extends Val,\n E extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: NonNullable<ErrForNull>,\n errForUndefined: NonNullable<ErrForUndefined>,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n return new AsyncResult(\n promise\n .then((value) => fromNullable(value, errForNull, errForUndefined))\n .catch((err) => Result.err(err)),\n );\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(readFile('foo.txt')).unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Promise<Res<T, E>> {\n return this.asyncResult.then<Res<T, E>>((res) => res.unwrap());\n }\n\n /**\n * Returns a success value or a fallback value.\n *\n * ```ts\n *\n * const val = await Result.wrap(readFile('foo.txt')).unwrapOr('bar');\n * expect(val).toBe('bar');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrapOr(fallback: T): Promise<T> {\n return this.asyncResult.then<T>((res) => res.unwrapOr(fallback));\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n async unwrapOrThrow(): Promise<T> {\n const result = await this.asyncResult;\n return result.unwrapOrThrow();\n }\n\n /**\n * Returns the ok-value or `null`.\n */\n unwrapOrNull(): Promise<T | null> {\n return this.asyncResult.then<T | null>((res) => res.unwrapOrNull());\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): AsyncResult<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): AsyncResult<U, E | EE | ZodError> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => {\n const { ok, val: value, err: error } = oldResult.unwrap();\n if (!ok) {\n return Result.err(error);\n }\n\n try {\n const result = fn(value);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'AsyncResult: unhandled async transform error',\n );\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'AsyncResult: unhandled transform error');\n return Result._uncaught(err);\n }\n })\n .catch((err) => {\n // Happens when `.unwrap()` of `oldResult` throws\n return Result._uncaught(err);\n }),\n );\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Result<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (\n err: NonNullable<E>,\n ) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE> {\n const caughtAsyncResult: Promise<Result<T, EE>> = this.asyncResult.then(\n (result) => result.catch(fn as never),\n );\n return AsyncResult.wrap(caughtAsyncResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): AsyncResult<NonNullable<ZodOutput<Schema>>, E | ZodError> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => oldResult.parse(schema))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onValue(fn: (value: T) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onValue(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onError(fn: (err: E) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onError(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/util/url.js
CHANGED
|
@@ -94,8 +94,8 @@ function parseLinkHeader(linkHeader) {
|
|
|
94
94
|
*/
|
|
95
95
|
function massageHostUrl(url) {
|
|
96
96
|
if (!url.includes("://") && url.includes("/")) return `https://${url}`;
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
if (!url.includes("://") && url.includes(":")) return `https://${url}`;
|
|
98
|
+
return url;
|
|
99
99
|
}
|
|
100
100
|
//#endregion
|
|
101
101
|
export { createURLFromHostOrURL, ensurePathPrefix, ensureTrailingSlash, getQueryString, isHttpUrl, joinUrlParts, massageHostUrl, parseLinkHeader, parseUrl, replaceUrlPath, resolveBaseUrl, trimLeadingSlash, trimSlashes, trimTrailingSlash };
|
package/dist/util/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","names":[],"sources":["../../lib/util/url.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyString,\n isString,\n isUrlInstance,\n} from '@sindresorhus/is';\n// oxlint-disable-next-line no-restricted-imports\nimport _parseLinkHeader from 'parse-link-header';\nimport urlJoin from 'url-join';\nimport { logger } from '../logger/index.ts';\nimport { regEx } from './regex.ts';\n\nexport function joinUrlParts(...parts: string[]): string {\n return urlJoin(...parts);\n}\n\nexport function ensurePathPrefix(url: string, prefix: string): string {\n const parsed = new URL(url);\n const fullPath = parsed.pathname + parsed.search;\n if (fullPath.startsWith(prefix)) {\n return url;\n }\n return parsed.origin + prefix + fullPath;\n}\n\nexport function ensureTrailingSlash(url: string): string {\n return url.replace(/\\/?$/, '/'); // TODO #12875 adds slash at the front when re2 is used\n}\n\nexport function trimTrailingSlash(url: string): string {\n return url.replace(regEx(/\\/+$/), '');\n}\n\nexport function trimLeadingSlash(path: string): string {\n return path.replace(/^\\/+/, '');\n}\n\nexport function trimSlashes(path: string): string {\n return trimLeadingSlash(trimTrailingSlash(path));\n}\n\n/**\n * Resolves an input path against a base URL\n *\n * @param baseUrl - base URL to resolve against\n * @param input - input path (if this is a full URL, it will be returned)\n */\nexport function resolveBaseUrl(baseUrl: string, input: string | URL): string {\n const inputString = input.toString();\n\n let host;\n let pathname;\n try {\n ({ host, pathname } = new URL(inputString));\n } catch {\n pathname = inputString;\n }\n\n return host ? inputString : urlJoin(baseUrl, pathname || '');\n}\n\n/**\n * Replaces the path of a URL with a new path\n *\n * @param baseUrl - source URL\n * @param path - replacement path (if this is a full URL, it will be returned)\n */\nexport function replaceUrlPath(baseUrl: string | URL, path: string): string {\n if (parseUrl(path)) {\n return path;\n }\n\n const { origin } = isString(baseUrl) ? new URL(baseUrl) : baseUrl;\n return urlJoin(origin, path);\n}\n\nexport function getQueryString(params: Record<string, any>): string {\n const usp = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (isArray<object>(v)) {\n for (const item of v) {\n // TODO: fix me?\n // oxlint-disable-next-line typescript/no-base-to-string\n usp.append(k, item.toString());\n }\n } else {\n usp.append(k, v.toString());\n }\n }\n return usp.toString();\n}\n\nexport function isHttpUrl(url: unknown): boolean {\n if (!isNonEmptyString(url) && !isUrlInstance(url)) {\n return false;\n }\n const protocol = parseUrl(url)?.protocol;\n return protocol === 'https:' || protocol === 'http:';\n}\n\nexport function parseUrl(url: URL | string | undefined | null): URL | null {\n if (!url) {\n return null;\n }\n\n if (url instanceof URL) {\n return url;\n }\n\n try {\n return new URL(url);\n } catch {\n return null;\n }\n}\n\n/**\n * Tries to create an URL object from either a full URL string or a hostname\n * @param url either the full url or a hostname\n * @returns an URL object or null\n */\nexport function createURLFromHostOrURL(url: string): URL | null {\n return parseUrl(url) ?? parseUrl(`https://${url}`);\n}\n\nexport type LinkHeaderLinks = _parseLinkHeader.Links;\n\nexport function parseLinkHeader(\n linkHeader: string | null | undefined,\n): LinkHeaderLinks | null {\n if (!isNonEmptyString(linkHeader)) {\n return null;\n }\n if (linkHeader.length > 2000) {\n logger.warn({ linkHeader }, 'Link header too long.');\n return null;\n }\n return _parseLinkHeader(linkHeader);\n}\n\n/**\n * prefix https:// to hosts with port or path\n */\nexport function massageHostUrl(url: string): string {\n if (!url.includes('://') && url.includes('/')) {\n return `https://${url}`;\n }
|
|
1
|
+
{"version":3,"file":"url.js","names":[],"sources":["../../lib/util/url.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyString,\n isString,\n isUrlInstance,\n} from '@sindresorhus/is';\n// oxlint-disable-next-line no-restricted-imports\nimport _parseLinkHeader from 'parse-link-header';\nimport urlJoin from 'url-join';\nimport { logger } from '../logger/index.ts';\nimport { regEx } from './regex.ts';\n\nexport function joinUrlParts(...parts: string[]): string {\n return urlJoin(...parts);\n}\n\nexport function ensurePathPrefix(url: string, prefix: string): string {\n const parsed = new URL(url);\n const fullPath = parsed.pathname + parsed.search;\n if (fullPath.startsWith(prefix)) {\n return url;\n }\n return parsed.origin + prefix + fullPath;\n}\n\nexport function ensureTrailingSlash(url: string): string {\n return url.replace(/\\/?$/, '/'); // TODO #12875 adds slash at the front when re2 is used\n}\n\nexport function trimTrailingSlash(url: string): string {\n return url.replace(regEx(/\\/+$/), '');\n}\n\nexport function trimLeadingSlash(path: string): string {\n return path.replace(/^\\/+/, '');\n}\n\nexport function trimSlashes(path: string): string {\n return trimLeadingSlash(trimTrailingSlash(path));\n}\n\n/**\n * Resolves an input path against a base URL\n *\n * @param baseUrl - base URL to resolve against\n * @param input - input path (if this is a full URL, it will be returned)\n */\nexport function resolveBaseUrl(baseUrl: string, input: string | URL): string {\n const inputString = input.toString();\n\n let host;\n let pathname;\n try {\n ({ host, pathname } = new URL(inputString));\n } catch {\n pathname = inputString;\n }\n\n return host ? inputString : urlJoin(baseUrl, pathname || '');\n}\n\n/**\n * Replaces the path of a URL with a new path\n *\n * @param baseUrl - source URL\n * @param path - replacement path (if this is a full URL, it will be returned)\n */\nexport function replaceUrlPath(baseUrl: string | URL, path: string): string {\n if (parseUrl(path)) {\n return path;\n }\n\n const { origin } = isString(baseUrl) ? new URL(baseUrl) : baseUrl;\n return urlJoin(origin, path);\n}\n\nexport function getQueryString(params: Record<string, any>): string {\n const usp = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (isArray<object>(v)) {\n for (const item of v) {\n // TODO: fix me?\n // oxlint-disable-next-line typescript/no-base-to-string\n usp.append(k, item.toString());\n }\n } else {\n usp.append(k, v.toString());\n }\n }\n return usp.toString();\n}\n\nexport function isHttpUrl(url: unknown): boolean {\n if (!isNonEmptyString(url) && !isUrlInstance(url)) {\n return false;\n }\n const protocol = parseUrl(url)?.protocol;\n return protocol === 'https:' || protocol === 'http:';\n}\n\nexport function parseUrl(url: URL | string | undefined | null): URL | null {\n if (!url) {\n return null;\n }\n\n if (url instanceof URL) {\n return url;\n }\n\n try {\n return new URL(url);\n } catch {\n return null;\n }\n}\n\n/**\n * Tries to create an URL object from either a full URL string or a hostname\n * @param url either the full url or a hostname\n * @returns an URL object or null\n */\nexport function createURLFromHostOrURL(url: string): URL | null {\n return parseUrl(url) ?? parseUrl(`https://${url}`);\n}\n\nexport type LinkHeaderLinks = _parseLinkHeader.Links;\n\nexport function parseLinkHeader(\n linkHeader: string | null | undefined,\n): LinkHeaderLinks | null {\n if (!isNonEmptyString(linkHeader)) {\n return null;\n }\n if (linkHeader.length > 2000) {\n logger.warn({ linkHeader }, 'Link header too long.');\n return null;\n }\n return _parseLinkHeader(linkHeader);\n}\n\n/**\n * prefix https:// to hosts with port or path\n */\nexport function massageHostUrl(url: string): string {\n if (!url.includes('://') && url.includes('/')) {\n return `https://${url}`;\n }\n if (!url.includes('://') && url.includes(':')) {\n return `https://${url}`;\n }\n return url;\n}\n"],"mappings":";;;;;;AAYA,SAAgB,aAAa,GAAG,OAAyB;CACvD,OAAO,QAAQ,GAAG,KAAK;AACzB;AAEA,SAAgB,iBAAiB,KAAa,QAAwB;CACpE,MAAM,SAAS,IAAI,IAAI,GAAG;CAC1B,MAAM,WAAW,OAAO,WAAW,OAAO;CAC1C,IAAI,SAAS,WAAW,MAAM,GAC5B,OAAO;CAET,OAAO,OAAO,SAAS,SAAS;AAClC;AAEA,SAAgB,oBAAoB,KAAqB;CACvD,OAAO,IAAI,QAAQ,QAAQ,GAAG;AAChC;AAEA,SAAgB,kBAAkB,KAAqB;CACrD,OAAO,IAAI,QAAQ,MAAM,MAAM,GAAG,EAAE;AACtC;AAEA,SAAgB,iBAAiB,MAAsB;CACrD,OAAO,KAAK,QAAQ,QAAQ,EAAE;AAChC;AAEA,SAAgB,YAAY,MAAsB;CAChD,OAAO,iBAAiB,kBAAkB,IAAI,CAAC;AACjD;;;;;;;AAQA,SAAgB,eAAe,SAAiB,OAA6B;CAC3E,MAAM,cAAc,MAAM,SAAS;CAEnC,IAAI;CACJ,IAAI;CACJ,IAAI;EACF,CAAC,CAAE,MAAM,YAAa,IAAI,IAAI,WAAW;CAC3C,QAAQ;EACN,WAAW;CACb;CAEA,OAAO,OAAO,cAAc,QAAQ,SAAS,YAAY,EAAE;AAC7D;;;;;;;AAQA,SAAgB,eAAe,SAAuB,MAAsB;CAC1E,IAAI,SAAS,IAAI,GACf,OAAO;CAGT,MAAM,EAAE,WAAW,SAAS,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI;CAC1D,OAAO,QAAQ,QAAQ,IAAI;AAC7B;AAEA,SAAgB,eAAe,QAAqC;CAClE,MAAM,MAAM,IAAI,gBAAgB;CAChC,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,GACxC,IAAI,QAAgB,CAAC,GACnB,KAAK,MAAM,QAAQ,GAGjB,IAAI,OAAO,GAAG,KAAK,SAAS,CAAC;MAG/B,IAAI,OAAO,GAAG,EAAE,SAAS,CAAC;CAG9B,OAAO,IAAI,SAAS;AACtB;AAEA,SAAgB,UAAU,KAAuB;CAC/C,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,cAAc,GAAG,GAC9C,OAAO;CAET,MAAM,WAAW,SAAS,GAAG,CAAC,EAAE;CAChC,OAAO,aAAa,YAAY,aAAa;AAC/C;AAEA,SAAgB,SAAS,KAAkD;CACzE,IAAI,CAAC,KACH,OAAO;CAGT,IAAI,eAAe,KACjB,OAAO;CAGT,IAAI;EACF,OAAO,IAAI,IAAI,GAAG;CACpB,QAAQ;EACN,OAAO;CACT;AACF;;;;;;AAOA,SAAgB,uBAAuB,KAAyB;CAC9D,OAAO,SAAS,GAAG,KAAK,SAAS,WAAW,KAAK;AACnD;AAIA,SAAgB,gBACd,YACwB;CACxB,IAAI,CAAC,iBAAiB,UAAU,GAC9B,OAAO;CAET,IAAI,WAAW,SAAS,KAAM;EAC5B,OAAO,KAAK,EAAE,WAAW,GAAG,uBAAuB;EACnD,OAAO;CACT;CACA,OAAO,iBAAiB,UAAU;AACpC;;;;AAKA,SAAgB,eAAe,KAAqB;CAClD,IAAI,CAAC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,GAAG,GAC1C,OAAO,WAAW;CAEpB,IAAI,CAAC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,GAAG,GAC1C,OAAO,WAAW;CAEpB,OAAO;AACT"}
|
|
@@ -48,26 +48,24 @@ function getConfig(input) {
|
|
|
48
48
|
const config = {};
|
|
49
49
|
createProgram().action((repositories, opts) => {
|
|
50
50
|
if (repositories?.length) config.repositories = repositories;
|
|
51
|
-
for (const option of options) if (option.cli !== false) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (option.name === "
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (option.name === "
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
config[option.name] = "optional";
|
|
70
|
-
}
|
|
51
|
+
for (const option of options) if (option.cli !== false && opts[option.name] !== void 0) {
|
|
52
|
+
config[option.name] = opts[option.name];
|
|
53
|
+
if (option.name === "dryRun") {
|
|
54
|
+
if (config[option.name] === "true") {
|
|
55
|
+
logger.warn("cli config dryRun property has been changed to full");
|
|
56
|
+
config[option.name] = "full";
|
|
57
|
+
} else if (config[option.name] === "false") {
|
|
58
|
+
logger.warn("cli config dryRun property has been changed to null");
|
|
59
|
+
config[option.name] = null;
|
|
60
|
+
} else if (config[option.name] === "null") config[option.name] = null;
|
|
61
|
+
}
|
|
62
|
+
if (option.name === "requireConfig") {
|
|
63
|
+
if (config[option.name] === "true") {
|
|
64
|
+
logger.warn("cli config requireConfig property has been changed to required");
|
|
65
|
+
config[option.name] = "required";
|
|
66
|
+
} else if (config[option.name] === "false") {
|
|
67
|
+
logger.warn("cli config requireConfig property has been changed to optional");
|
|
68
|
+
config[option.name] = "optional";
|
|
71
69
|
}
|
|
72
70
|
}
|
|
73
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/cli.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { coersions } from './coersions.ts';\nimport type { ParseConfigOptions } from './types.ts';\n\nexport function getCliName(option: ParseConfigOptions): string {\n if (option.cli === false) {\n return '';\n }\n const nameWithHyphens = option.name.replace(regEx(/([A-Z])/g), '-$1');\n return `--${nameWithHyphens.toLowerCase()}`;\n}\n\nfunction createProgram(): Command<[string[]]> {\n const options = getOptions();\n\n let program = new Command().arguments('[repositories...]');\n\n options.forEach((option) => {\n if (option.cli !== false) {\n const param = `<${option.type}>`.replace('<boolean>', '[boolean]');\n const optionString = `${getCliName(option)} ${param}`;\n program = program.option(\n optionString,\n option.description,\n coersions[option.type],\n );\n }\n });\n\n /* oxlint-disable no-console -- intentional: CLI help output */\n /* istanbul ignore next */\n function helpConsole(): void {\n console.log(' Examples:');\n console.log('');\n console.log(' $ renovate --token 123test singapore/lint-condo');\n console.log(\n ' $ LOG_LEVEL=debug renovate --labels=renovate,dependency --ignore-unstable=false singapore/lint-condo',\n );\n console.log(' $ renovate singapore/lint-condo singapore/package-test');\n console.log(\n ` $ renovate singapore/lint-condo --onboarding-config='{\"extends\":[\"config:recommended\"]}'`,\n );\n /* oxlint-enable no-console */\n }\n\n return program\n .version(pkg.version, '-v, --version')\n .on('--help', helpConsole);\n}\n\n/**\n * Massage migrated configuration keys.\n * This must run before any Commander parse call so that\n * deprecated/bare flags like `--dry-run` (no value) are rewritten\n * before Commander tries to consume them.\n */\nfunction migrateArgs(input: string[]): string[] {\n return input\n .map((a) =>\n a\n .replace(\n '--allow-post-upgrade-command-templating',\n '--allow-command-templating',\n )\n .replace('--allowed-post-upgrade-commands', '--allowed-commands')\n .replace('--endpoints=', '--host-rules=')\n .replace('--expose-env=true', '--trust-level=high')\n .replace('--expose-env', '--trust-level=high')\n .replace('--renovate-fork', '--include-forks')\n .replace('\"platform\":\"', '\"hostType\":\"')\n .replace('\"endpoint\":\"', '\"matchHost\":\"')\n .replace('\"host\":\"', '\"matchHost\":\"')\n .replace('--azure-auto-complete', '--platform-automerge') // migrate: azureAutoComplete\n .replace('--git-lab-automerge', '--platform-automerge') // migrate: gitLabAutomerge\n .replace(/^--dry-run$/, '--dry-run=true')\n .replace(/^--require-config$/, '--require-config=true')\n .replace('--aliases', '--registry-aliases')\n .replace('--include-forks=true', '--fork-processing=enabled')\n .replace('--include-forks', '--fork-processing=enabled')\n .replace('--recreate-closed=false', '--recreate-when=auto')\n .replace('--recreate-closed=true', '--recreate-when=always')\n .replace('--recreate-closed', '--recreate-when=always'),\n )\n .filter((a) => !a.startsWith('--git-fs'));\n}\n\nexport function parseEarlyFlags(input: string[] = process.argv): void {\n createProgram()\n .allowUnknownOption()\n .allowExcessArguments()\n .parse(migrateArgs(input));\n}\n\nexport function getConfig(input: string[]): AllConfig {\n const argv = migrateArgs(input);\n const options = getOptions();\n\n const config: Record<string, any> = {};\n\n createProgram()\n .action((repositories: string[], opts: Record<string, unknown>) => {\n if (repositories?.length) {\n config.repositories = repositories;\n }\n\n for (const option of options) {\n if (option.cli !== false
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/cli.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { coersions } from './coersions.ts';\nimport type { ParseConfigOptions } from './types.ts';\n\nexport function getCliName(option: ParseConfigOptions): string {\n if (option.cli === false) {\n return '';\n }\n const nameWithHyphens = option.name.replace(regEx(/([A-Z])/g), '-$1');\n return `--${nameWithHyphens.toLowerCase()}`;\n}\n\nfunction createProgram(): Command<[string[]]> {\n const options = getOptions();\n\n let program = new Command().arguments('[repositories...]');\n\n options.forEach((option) => {\n if (option.cli !== false) {\n const param = `<${option.type}>`.replace('<boolean>', '[boolean]');\n const optionString = `${getCliName(option)} ${param}`;\n program = program.option(\n optionString,\n option.description,\n coersions[option.type],\n );\n }\n });\n\n /* oxlint-disable no-console -- intentional: CLI help output */\n /* istanbul ignore next */\n function helpConsole(): void {\n console.log(' Examples:');\n console.log('');\n console.log(' $ renovate --token 123test singapore/lint-condo');\n console.log(\n ' $ LOG_LEVEL=debug renovate --labels=renovate,dependency --ignore-unstable=false singapore/lint-condo',\n );\n console.log(' $ renovate singapore/lint-condo singapore/package-test');\n console.log(\n ` $ renovate singapore/lint-condo --onboarding-config='{\"extends\":[\"config:recommended\"]}'`,\n );\n /* oxlint-enable no-console */\n }\n\n return program\n .version(pkg.version, '-v, --version')\n .on('--help', helpConsole);\n}\n\n/**\n * Massage migrated configuration keys.\n * This must run before any Commander parse call so that\n * deprecated/bare flags like `--dry-run` (no value) are rewritten\n * before Commander tries to consume them.\n */\nfunction migrateArgs(input: string[]): string[] {\n return input\n .map((a) =>\n a\n .replace(\n '--allow-post-upgrade-command-templating',\n '--allow-command-templating',\n )\n .replace('--allowed-post-upgrade-commands', '--allowed-commands')\n .replace('--endpoints=', '--host-rules=')\n .replace('--expose-env=true', '--trust-level=high')\n .replace('--expose-env', '--trust-level=high')\n .replace('--renovate-fork', '--include-forks')\n .replace('\"platform\":\"', '\"hostType\":\"')\n .replace('\"endpoint\":\"', '\"matchHost\":\"')\n .replace('\"host\":\"', '\"matchHost\":\"')\n .replace('--azure-auto-complete', '--platform-automerge') // migrate: azureAutoComplete\n .replace('--git-lab-automerge', '--platform-automerge') // migrate: gitLabAutomerge\n .replace(/^--dry-run$/, '--dry-run=true')\n .replace(/^--require-config$/, '--require-config=true')\n .replace('--aliases', '--registry-aliases')\n .replace('--include-forks=true', '--fork-processing=enabled')\n .replace('--include-forks', '--fork-processing=enabled')\n .replace('--recreate-closed=false', '--recreate-when=auto')\n .replace('--recreate-closed=true', '--recreate-when=always')\n .replace('--recreate-closed', '--recreate-when=always'),\n )\n .filter((a) => !a.startsWith('--git-fs'));\n}\n\nexport function parseEarlyFlags(input: string[] = process.argv): void {\n createProgram()\n .allowUnknownOption()\n .allowExcessArguments()\n .parse(migrateArgs(input));\n}\n\nexport function getConfig(input: string[]): AllConfig {\n const argv = migrateArgs(input);\n const options = getOptions();\n\n const config: Record<string, any> = {};\n\n createProgram()\n .action((repositories: string[], opts: Record<string, unknown>) => {\n if (repositories?.length) {\n config.repositories = repositories;\n }\n\n for (const option of options) {\n if (option.cli !== false && opts[option.name] !== undefined) {\n config[option.name] = opts[option.name];\n if (option.name === 'dryRun') {\n if (config[option.name] === 'true') {\n logger.warn(\n 'cli config dryRun property has been changed to full',\n );\n config[option.name] = 'full';\n } else if (config[option.name] === 'false') {\n logger.warn(\n 'cli config dryRun property has been changed to null',\n );\n config[option.name] = null;\n } else if (config[option.name] === 'null') {\n config[option.name] = null;\n }\n }\n if (option.name === 'requireConfig') {\n if (config[option.name] === 'true') {\n logger.warn(\n 'cli config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if (config[option.name] === 'false') {\n logger.warn(\n 'cli config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n }\n }\n })\n .parse(argv);\n\n return config;\n}\n"],"mappings":"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"}
|
|
@@ -54,11 +54,9 @@ function massageEnvKeyValues(env) {
|
|
|
54
54
|
const result = { ...env };
|
|
55
55
|
for (const { oldName, newName, from, to } of migratedKeysWithValues) {
|
|
56
56
|
const key = getEnvName({ name: oldName });
|
|
57
|
-
if (env[key] !== void 0) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
result[getEnvName({ name: newName })] = to;
|
|
61
|
-
}
|
|
57
|
+
if (env[key] !== void 0 && result[key] === from) {
|
|
58
|
+
delete result[key];
|
|
59
|
+
result[getEnvName({ name: newName })] = to;
|
|
62
60
|
}
|
|
63
61
|
}
|
|
64
62
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined) {\n if (result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = parsed;\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = coerce(envVal);\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal({ err }, `Could not parse ${configEnvKey}`);\n process.exit(1);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined && result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = parsed;\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = coerce(envVal);\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal({ err }, `Could not parse ${configEnvKey}`);\n process.exit(1);\n }\n}\n"],"mappings":"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"}
|
|
@@ -11,11 +11,9 @@ import { isUndefined } from "@sindresorhus/is";
|
|
|
11
11
|
async function checkConfigMigrationBranch(config, migratedConfigData) {
|
|
12
12
|
logger.debug("checkConfigMigrationBranch()");
|
|
13
13
|
const configMigrationCheckboxState = config.dependencyDashboardChecks?.configMigrationCheckboxState;
|
|
14
|
-
if (!config.configMigration) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return { result: "no-migration-branch" };
|
|
18
|
-
}
|
|
14
|
+
if (!config.configMigration && (isUndefined(configMigrationCheckboxState) || configMigrationCheckboxState === "no-checkbox" || configMigrationCheckboxState === "unchecked")) {
|
|
15
|
+
logger.debug("Config migration needed but config migration is disabled and checkbox not checked or not present.");
|
|
16
|
+
return { result: "no-migration-branch" };
|
|
19
17
|
}
|
|
20
18
|
const configMigrationBranch = getMigrationBranchName(config);
|
|
21
19
|
const branchPr = await migrationPrExists(configMigrationBranch, config.baseBranch);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/config-migration/branch/index.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type { FindPRConfig, Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { getMigrationBranchName } from '../common.ts';\nimport { ConfigMigrationCommitMessageFactory } from './commit-message.ts';\nimport { createConfigMigrationBranch } from './create.ts';\nimport type { MigratedData } from './migrated-data.ts';\nimport { rebaseMigrationBranch } from './rebase.ts';\n\nexport type CheckConfigMigrationBranchResult =\n | { result: 'no-migration-branch' }\n | {\n result: 'migration-branch-exists' | 'migration-branch-modified';\n migrationBranch: string;\n };\n\nexport async function checkConfigMigrationBranch(\n config: RenovateConfig,\n migratedConfigData: MigratedData,\n): Promise<CheckConfigMigrationBranchResult> {\n logger.debug('checkConfigMigrationBranch()');\n const configMigrationCheckboxState =\n config.dependencyDashboardChecks?.configMigrationCheckboxState;\n\n if (!config.configMigration
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/config-migration/branch/index.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type { FindPRConfig, Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { getMigrationBranchName } from '../common.ts';\nimport { ConfigMigrationCommitMessageFactory } from './commit-message.ts';\nimport { createConfigMigrationBranch } from './create.ts';\nimport type { MigratedData } from './migrated-data.ts';\nimport { rebaseMigrationBranch } from './rebase.ts';\n\nexport type CheckConfigMigrationBranchResult =\n | { result: 'no-migration-branch' }\n | {\n result: 'migration-branch-exists' | 'migration-branch-modified';\n migrationBranch: string;\n };\n\nexport async function checkConfigMigrationBranch(\n config: RenovateConfig,\n migratedConfigData: MigratedData,\n): Promise<CheckConfigMigrationBranchResult> {\n logger.debug('checkConfigMigrationBranch()');\n const configMigrationCheckboxState =\n config.dependencyDashboardChecks?.configMigrationCheckboxState;\n\n if (\n !config.configMigration &&\n (isUndefined(configMigrationCheckboxState) ||\n configMigrationCheckboxState === 'no-checkbox' ||\n configMigrationCheckboxState === 'unchecked')\n ) {\n logger.debug(\n 'Config migration needed but config migration is disabled and checkbox not checked or not present.',\n );\n return { result: 'no-migration-branch' };\n }\n\n const configMigrationBranch = getMigrationBranchName(config);\n\n const branchPr = await migrationPrExists(\n configMigrationBranch,\n config.baseBranch,\n ); // handles open/autoclosed PRs\n\n if (!branchPr) {\n const commitMessageFactory = new ConfigMigrationCommitMessageFactory(\n config,\n migratedConfigData.filename,\n );\n const prTitle = commitMessageFactory.getPrTitle();\n const closedPrConfig: FindPRConfig = {\n branchName: configMigrationBranch,\n prTitle,\n state: 'closed',\n targetBranch: config.baseBranch,\n };\n\n // handles closed PR\n const closedPr = await platform.findPr(closedPrConfig);\n\n // found closed migration PR\n if (closedPr) {\n logger.debug('Closed config migration PR found.');\n\n // if a closed pr exists and the checkbox for config migration is not checked\n // return no-migration-branch result so that the checkbox gets added again\n // we only want to create a config migration pr if the checkbox is checked\n if (configMigrationCheckboxState !== 'checked') {\n logger.debug(\n 'Config migration is enabled and needed. But a closed pr exists and checkbox is not checked. Skipping migration branch creation.',\n );\n return { result: 'no-migration-branch' };\n }\n\n logger.debug(\n 'Closed migration PR found and checkbox is checked. Try to delete this old branch and create a new one.',\n );\n await handlePr(config, closedPr);\n }\n }\n\n let result: CheckConfigMigrationBranchResult['result'];\n\n if (branchPr) {\n logger.debug('Config Migration PR already exists');\n\n if (await isMigrationBranchModified(config, configMigrationBranch)) {\n logger.debug(\n 'Config Migration branch has been modified. Skipping branch rebase.',\n );\n result = 'migration-branch-modified';\n } else {\n await rebaseMigrationBranch(config, migratedConfigData);\n if (platform.refreshPr) {\n const configMigrationPr = await platform.getBranchPr(\n configMigrationBranch,\n config.baseBranch,\n );\n if (configMigrationPr) {\n await platform.refreshPr(configMigrationPr.number);\n }\n }\n result = 'migration-branch-exists';\n }\n } else {\n logger.debug('Config Migration PR does not exist');\n logger.debug('Need to create migration PR');\n await createConfigMigrationBranch(config, migratedConfigData);\n result = 'migration-branch-exists';\n }\n if (!GlobalConfig.get('dryRun')) {\n await scm.checkoutBranch(configMigrationBranch);\n }\n return {\n migrationBranch: configMigrationBranch,\n result,\n };\n}\n\nexport async function migrationPrExists(\n branchName: string,\n targetBranch?: string,\n): Promise<Pr | null> {\n return await platform.getBranchPr(branchName, targetBranch);\n}\n\nasync function handlePr(config: RenovateConfig, pr: Pr): Promise<void> {\n if (await scm.branchExists(pr.sourceBranch)) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would delete branch ${pr.sourceBranch}`);\n } else {\n await scm.deleteBranch(pr.sourceBranch);\n }\n }\n}\n\nasync function isMigrationBranchModified(\n config: RenovateConfig,\n configMigrationBranch: string,\n): Promise<boolean> {\n const baseBranch = config.defaultBranch!;\n return await scm.isBranchModified(configMigrationBranch, baseBranch);\n}\n"],"mappings":";;;;;;;;;;AAoBA,eAAsB,2BACpB,QACA,oBAC2C;CAC3C,OAAO,MAAM,8BAA8B;CAC3C,MAAM,+BACJ,OAAO,2BAA2B;CAEpC,IACE,CAAC,OAAO,oBACP,YAAY,4BAA4B,KACvC,iCAAiC,iBACjC,iCAAiC,cACnC;EACA,OAAO,MACL,mGACF;EACA,OAAO,EAAE,QAAQ,sBAAsB;CACzC;CAEA,MAAM,wBAAwB,uBAAuB,MAAM;CAE3D,MAAM,WAAW,MAAM,kBACrB,uBACA,OAAO,UACT;CAEA,IAAI,CAAC,UAAU;EAMb,MAAM,iBAA+B;GACnC,YAAY;GACZ,SAHc,IAJiB,oCAC/B,QACA,mBAAmB,QAEc,CAAC,CAAC,WAG7B;GACN,OAAO;GACP,cAAc,OAAO;EACvB;EAGA,MAAM,WAAW,MAAM,SAAS,OAAO,cAAc;EAGrD,IAAI,UAAU;GACZ,OAAO,MAAM,mCAAmC;GAKhD,IAAI,iCAAiC,WAAW;IAC9C,OAAO,MACL,iIACF;IACA,OAAO,EAAE,QAAQ,sBAAsB;GACzC;GAEA,OAAO,MACL,wGACF;GACA,MAAM,SAAS,QAAQ,QAAQ;EACjC;CACF;CAEA,IAAI;CAEJ,IAAI,UAAU;EACZ,OAAO,MAAM,oCAAoC;EAEjD,IAAI,MAAM,0BAA0B,QAAQ,qBAAqB,GAAG;GAClE,OAAO,MACL,oEACF;GACA,SAAS;EACX,OAAO;GACL,MAAM,sBAAsB,QAAQ,kBAAkB;GACtD,IAAI,SAAS,WAAW;IACtB,MAAM,oBAAoB,MAAM,SAAS,YACvC,uBACA,OAAO,UACT;IACA,IAAI,mBACF,MAAM,SAAS,UAAU,kBAAkB,MAAM;GAErD;GACA,SAAS;EACX;CACF,OAAO;EACL,OAAO,MAAM,oCAAoC;EACjD,OAAO,MAAM,6BAA6B;EAC1C,MAAM,4BAA4B,QAAQ,kBAAkB;EAC5D,SAAS;CACX;CACA,IAAI,CAAC,aAAa,IAAI,QAAQ,GAC5B,MAAM,IAAI,eAAe,qBAAqB;CAEhD,OAAO;EACL,iBAAiB;EACjB;CACF;AACF;AAEA,eAAsB,kBACpB,YACA,cACoB;CACpB,OAAO,MAAM,SAAS,YAAY,YAAY,YAAY;AAC5D;AAEA,eAAe,SAAS,QAAwB,IAAuB;CACrE,IAAI,MAAM,IAAI,aAAa,GAAG,YAAY,GACxC,IAAI,aAAa,IAAI,QAAQ,GAC3B,OAAO,KAAK,gCAAgC,GAAG,cAAc;MAE7D,MAAM,IAAI,aAAa,GAAG,YAAY;AAG5C;AAEA,eAAe,0BACb,QACA,uBACkB;CAClB,MAAM,aAAa,OAAO;CAC1B,OAAO,MAAM,IAAI,iBAAiB,uBAAuB,UAAU;AACrE"}
|
|
@@ -64,10 +64,9 @@ async function detectRepoFileConfig(branchName) {
|
|
|
64
64
|
configFileName,
|
|
65
65
|
configFileParsed
|
|
66
66
|
};
|
|
67
|
-
} else {
|
|
68
|
-
logger.debug("Existing config file no longer exists");
|
|
69
|
-
delete cache.configFileName;
|
|
70
67
|
}
|
|
68
|
+
logger.debug("Existing config file no longer exists");
|
|
69
|
+
delete cache.configFileName;
|
|
71
70
|
}
|
|
72
71
|
if (OnboardingState.onboardingCacheValid) configFileName = getOnboardingFileNameFromCache();
|
|
73
72
|
else configFileName = coerceString(await detectConfigFile());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.js","names":["presets.resolveConfigPresets","configValidation.validateConfig"],"sources":["../../../../lib/workers/repository/init/merge.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyObject,\n isNonEmptyString,\n isString,\n} from '@sindresorhus/is';\nimport { getConfigFileNames } from '../../../config/app-strings.ts';\nimport { decryptConfig } from '../../../config/decrypt.ts';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { migrateAndValidate } from '../../../config/migrate-validate.ts';\nimport { migrateConfig } from '../../../config/migration.ts';\nimport { parseFileConfig } from '../../../config/parse.ts';\nimport * as presets from '../../../config/presets/index.ts';\nimport { applySecretsAndVariablesToConfig } from '../../../config/secrets.ts';\nimport type { AllConfig, RenovateConfig } from '../../../config/types.ts';\nimport * as configValidation from '../../../config/validation.ts';\nimport {\n CONFIG_VALIDATION,\n REPOSITORY_CHANGED,\n} from '../../../constants/error-messages.ts';\nimport { pkg } from '../../../expose.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as npmApi from '../../../modules/datasource/npm/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { getInheritedOrGlobal, parseJson } from '../../../util/common.ts';\nimport { setUserEnv } from '../../../util/env.ts';\nimport { readLocalFile, readSystemFile } from '../../../util/fs/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport * as queue from '../../../util/http/queue.ts';\nimport * as throttle from '../../../util/http/throttle.ts';\nimport { maskToken } from '../../../util/mask.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { getOnboardingConfig } from '../onboarding/branch/config.ts';\nimport {\n getOnboardingConfigFromCache,\n getOnboardingFileNameFromCache,\n setOnboardingConfigDetails,\n} from '../onboarding/branch/onboarding-branch-cache.ts';\nimport {\n OnboardingState,\n getDefaultConfigFileName,\n} from '../onboarding/common.ts';\nimport type { RepoFileConfig, RepositoryWorkerConfig } from './types.ts';\n\nexport async function detectConfigFile(): Promise<string | null> {\n const fileList = await scm.getFileList();\n for (const fileName of getConfigFileNames()) {\n if (fileName === 'package.json') {\n try {\n const pJson = JSON.parse(\n (await readLocalFile('package.json', 'utf8'))!,\n );\n if (pJson.renovate) {\n logger.warn(\n 'Using package.json for Renovate config is deprecated - please use a dedicated configuration file instead',\n );\n return 'package.json';\n }\n } catch {\n // Do nothing\n }\n } else if (fileList.includes(fileName)) {\n return fileName;\n }\n }\n return null;\n}\n\nexport async function detectRepoFileConfig(\n branchName?: string,\n): Promise<RepoFileConfig> {\n const cache = getCache();\n let { configFileName } = cache;\n if (isNonEmptyString(configFileName)) {\n let configFileRaw: string | null;\n try {\n configFileRaw = await platform.getRawFile(\n configFileName,\n undefined,\n branchName,\n );\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n }\n configFileRaw = null;\n }\n if (configFileRaw) {\n let configFileParsed = parseJson(configFileRaw, configFileName) as any;\n if (configFileName === 'package.json') {\n configFileParsed = configFileParsed.renovate;\n }\n return { configFileName, configFileParsed };\n } else {\n logger.debug('Existing config file no longer exists');\n delete cache.configFileName;\n }\n }\n\n if (OnboardingState.onboardingCacheValid) {\n configFileName = getOnboardingFileNameFromCache();\n } else {\n configFileName = coerceString(await detectConfigFile());\n }\n\n if (!configFileName) {\n logger.debug('No renovate config file found');\n cache.configFileName = '';\n return {};\n }\n cache.configFileName = configFileName;\n logger.debug(`Found ${configFileName} config file`);\n // TODO #22198\n let configFileParsed: any;\n let configFileRaw: string | undefined | null;\n\n if (OnboardingState.onboardingCacheValid) {\n const cachedConfig = getOnboardingConfigFromCache();\n const parsedConfig = cachedConfig ? JSON.parse(cachedConfig) : undefined;\n if (parsedConfig) {\n setOnboardingConfigDetails(configFileName, JSON.stringify(parsedConfig));\n return { configFileName, configFileParsed: parsedConfig };\n }\n }\n\n if (configFileName === 'package.json') {\n // We already know it parses\n configFileParsed = JSON.parse(\n // TODO #22198\n (await readLocalFile('package.json', 'utf8'))!,\n ).renovate;\n if (isString(configFileParsed)) {\n logger.debug('Massaging string renovate config to extends array');\n configFileParsed = { extends: [configFileParsed] };\n }\n logger.debug({ config: configFileParsed }, 'package.json>renovate config');\n } else {\n configFileRaw = await readLocalFile(configFileName, 'utf8');\n // istanbul ignore if\n if (!isString(configFileRaw)) {\n logger.warn({ configFileName }, 'Null contents when reading config file');\n throw new Error(REPOSITORY_CHANGED);\n }\n // istanbul ignore if\n if (!configFileRaw.length) {\n configFileRaw = '{}';\n }\n\n const parseResult = parseFileConfig(configFileName, configFileRaw);\n\n if (!parseResult.success) {\n return {\n configFileName,\n configFileParseError: {\n validationError: parseResult.validationError,\n validationMessage: parseResult.validationMessage,\n },\n };\n }\n configFileParsed = parseResult.parsedContents;\n logger.debug(\n { fileName: configFileName, config: configFileParsed },\n 'Repository config',\n );\n }\n\n setOnboardingConfigDetails(configFileName, JSON.stringify(configFileParsed));\n return { configFileName, configFileParsed };\n}\n\nexport function checkForRepoConfigError(repoConfig: RepoFileConfig): void {\n if (!repoConfig.configFileParseError) {\n return;\n }\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = repoConfig.configFileName;\n error.validationError = repoConfig.configFileParseError.validationError;\n error.validationMessage = repoConfig.configFileParseError.validationMessage;\n throw error;\n}\n\n// Check for repository config\nexport async function mergeRenovateConfig(\n config: RepositoryWorkerConfig,\n branchName?: string,\n): Promise<RenovateConfig> {\n let returnConfig: RepositoryWorkerConfig = { ...config };\n let repoConfig: RepoFileConfig = {};\n if (getInheritedOrGlobal('requireConfig') !== 'ignored') {\n repoConfig = await detectRepoFileConfig(branchName);\n }\n if (!repoConfig.configFileParsed && config.mode === 'silent') {\n logger.debug(\n 'When mode=silent and repo has no config file, we use the onboarding config as repo config',\n );\n const configFileName = getDefaultConfigFileName();\n repoConfig = {\n configFileName,\n configFileParsed: await getOnboardingConfig(config),\n };\n }\n const configFileParsed = coerceObject(repoConfig?.configFileParsed);\n const resolvedRepoConfig = await resolveStaticRepoConfig(\n configFileParsed,\n process.env.RENOVATE_X_STATIC_REPO_CONFIG_FILE,\n );\n\n // Apply the repositories[] object-entry config between global config and\n // repository file config.\n // Must run after repository file config is loaded so its `ignorePresets` can\n // be included when resolving object-entry presets.\n const repoEntryConfig = returnConfig.repositoryEntryConfig;\n delete returnConfig.repositoryEntryConfig;\n\n if (isNonEmptyObject(repoEntryConfig)) {\n const repoEntry = repoEntryConfig as RenovateConfig;\n const toResolve: RenovateConfig = {\n ...repoEntry,\n extends: [\n ...coerceArray(returnConfig.extends),\n ...coerceArray(repoEntry.extends),\n ],\n ignorePresets: [\n ...coerceArray(returnConfig.ignorePresets),\n ...coerceArray(repoEntry.ignorePresets),\n ...coerceArray(resolvedRepoConfig.ignorePresets),\n ],\n };\n delete returnConfig.extends;\n\n const { config: resolvedRepoEntry } = await presets.resolveConfigPresets(\n toResolve,\n config,\n );\n\n applyNpmrc(resolvedRepoEntry, 'resolvedRepoEntry');\n\n const resolvedRepoEntryWithSecrets = applySecretsAndVariablesToConfig({\n config: resolvedRepoEntry,\n secrets: config.secrets,\n variables: config.variables,\n });\n\n applyHostRules(resolvedRepoEntryWithSecrets);\n returnConfig = mergeChildConfig(returnConfig, resolvedRepoEntryWithSecrets);\n }\n\n if (isNonEmptyArray(returnConfig.extends)) {\n resolvedRepoConfig.extends = [\n ...coerceArray(returnConfig.extends),\n ...coerceArray(resolvedRepoConfig.extends),\n ];\n delete returnConfig.extends;\n }\n checkForRepoConfigError(repoConfig);\n const migratedConfig = await migrateAndValidate(config, resolvedRepoConfig);\n if (migratedConfig.errors?.length) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = repoConfig.configFileName;\n error.validationError =\n 'The renovate configuration file contains some invalid settings';\n error.validationMessage = migratedConfig.errors\n .map((e) => e.message)\n .join(', ');\n throw error;\n }\n if (migratedConfig.warnings) {\n returnConfig.warnings = [\n ...coerceArray(returnConfig.warnings),\n ...migratedConfig.warnings,\n ];\n }\n delete migratedConfig.errors;\n delete migratedConfig.warnings;\n // TODO #22198\n const repository = config.repository!;\n // Decrypt before resolving in case we need npm authentication for any presets\n const decryptedConfig = await decryptConfig(migratedConfig, repository);\n applyNpmrc(decryptedConfig, 'decrypted');\n\n // NOTE that this should not be used with any other configuration (`resolvedConfig`, etc) below, as they will include addditionally merged configuration\n // Decrypted secrets are sanitised, so should be safe to log\n await logShallowConfig(decryptedConfig, config);\n\n // Decrypt after resolving in case the preset contains npm authentication instead\n const { config: configToDecrypt } = await presets.resolveConfigPresets(\n decryptedConfig,\n config,\n config.ignorePresets,\n );\n let resolvedConfig = await decryptConfig(configToDecrypt, repository);\n logger.trace({ config: resolvedConfig }, 'resolved config');\n const migrationResult = migrateConfig(resolvedConfig);\n if (migrationResult.isMigrated) {\n logger.debug('Resolved config needs migrating');\n logger.trace({ config: resolvedConfig }, 'resolved config after migrating');\n resolvedConfig = migrationResult.migratedConfig;\n }\n if (isString(resolvedConfig.npmrc)) {\n logger.debug(\n 'Ignoring any .npmrc files in repository due to configured npmrc',\n );\n }\n applyNpmrc(resolvedConfig, 'resolved');\n resolvedConfig = applySecretsAndVariablesToConfig({\n config: resolvedConfig,\n secrets: mergeChildConfig(\n coerceObject(config.secrets),\n coerceObject(resolvedConfig.secrets),\n ),\n variables: mergeChildConfig(\n coerceObject(config.variables),\n coerceObject(resolvedConfig.variables),\n ),\n });\n\n applyHostRules(resolvedConfig);\n returnConfig = mergeChildConfig(returnConfig, resolvedConfig);\n ({ config: returnConfig } = await presets.resolveConfigPresets(\n returnConfig,\n config,\n ));\n returnConfig.renovateJsonPresent = true;\n // istanbul ignore if\n if (returnConfig.ignorePaths?.length) {\n logger.debug(\n { ignorePaths: returnConfig.ignorePaths },\n `Found repo ignorePaths`,\n );\n }\n\n setUserEnv(returnConfig.env);\n delete returnConfig.env;\n\n return returnConfig;\n}\n\nexport function applyNpmrc(\n config: RenovateConfig,\n configType?: 'resolved' | 'resolvedRepoEntry' | 'decrypted',\n): void {\n setNpmTokenInNpmrc(config);\n if (!isString(config.npmrc)) {\n return;\n }\n logger.debug(\n `Setting npmrc from ${configType ? `${configType} ` : ''}config`,\n );\n npmApi.setNpmrc(config.npmrc);\n}\n\nexport function applyHostRules(config: RenovateConfig): void {\n if (!config.hostRules) {\n return;\n }\n\n logger.debug('Setting hostRules from config');\n for (const rule of config.hostRules) {\n try {\n hostRules.add(rule);\n } catch (err) {\n logger.warn({ err, config: rule }, 'Error setting hostRule from config');\n }\n }\n // host rules can change concurrency\n queue.clear();\n throttle.clear();\n delete config.hostRules;\n}\n\n/** needed when using portal secrets for npmToken */\nexport function setNpmTokenInNpmrc(config: RenovateConfig): void {\n if (!isString(config.npmToken)) {\n return;\n }\n\n const token = config.npmToken;\n logger.debug({ npmToken: maskToken(token) }, 'Migrating npmToken to npmrc');\n\n if (!isString(config.npmrc)) {\n logger.debug('Adding npmrc to config');\n config.npmrc = `//registry.npmjs.org/:_authToken=${token}\\n`;\n delete config.npmToken;\n return;\n }\n\n if (config.npmrc.includes(`\\${NPM_TOKEN}`)) {\n logger.debug(`Replacing \\${NPM_TOKEN} with npmToken`);\n config.npmrc = config.npmrc.replace(regEx(/\\${NPM_TOKEN}/g), token);\n } else {\n logger.debug('Appending _authToken= to end of existing npmrc');\n config.npmrc = config.npmrc.replace(\n regEx(/\\n?$/),\n `\\n_authToken=${token}\\n`,\n );\n }\n\n delete config.npmToken;\n}\n\nexport async function resolveStaticRepoConfig(\n config: AllConfig,\n filename: string | undefined,\n): Promise<AllConfig> {\n if (!isNonEmptyString(filename)) {\n return config;\n }\n\n let staticRepoConfig: AllConfig;\n\n try {\n staticRepoConfig = await tryReadStaticRepoFileConfig(filename);\n } catch (err) {\n logger.fatal({ err }, 'Failed to load static repository config file');\n process.exit(1);\n }\n\n if (!isNonEmptyObject(staticRepoConfig)) {\n return config;\n }\n\n return mergeStaticConfig(config, staticRepoConfig);\n}\n\nexport async function tryReadStaticRepoFileConfig(\n staticRepoConfigFile: string,\n): Promise<AllConfig> {\n logger.debug(`Reading static repo config file from ${staticRepoConfigFile}`);\n\n let staticRepoConfigRaw: string;\n try {\n staticRepoConfigRaw = await readSystemFile(staticRepoConfigFile, 'utf8');\n } catch (err) {\n throw new Error(\n `Failed to read static repo config file: \"${staticRepoConfigFile}\"`,\n { cause: err },\n );\n }\n\n const staticRepoConfig = parseJson(\n staticRepoConfigRaw,\n staticRepoConfigFile,\n ) as AllConfig;\n\n // validate and log issues here to preserve context, caller handles migration and full validation.\n const { errors, warnings } = await configValidation.validateConfig(\n 'repo',\n staticRepoConfig,\n );\n\n if (isNonEmptyArray(errors) || isNonEmptyArray(warnings)) {\n logger.info(\n { errors, warnings },\n 'Static repo config validation issues detected',\n );\n } else {\n logger.debug(\n { staticRepoConfig },\n 'Static repository config file successfully parsed and validated',\n );\n }\n\n return staticRepoConfig;\n}\n\nexport function mergeStaticConfig(\n config: AllConfig,\n staticRepoConfig: AllConfig,\n): AllConfig {\n // merge extends\n if (isNonEmptyArray(staticRepoConfig.extends)) {\n config.extends = [\n ...staticRepoConfig.extends,\n ...coerceArray(config.extends),\n ];\n delete staticRepoConfig.extends;\n }\n\n // renovate repo config overrides RENOVATE_STATIC_REPO_CONFIG[_FILE]\n return mergeChildConfig(staticRepoConfig, config);\n}\n\n/**\n * Resolve everything but internal Renovate presets and log it out.\n *\n* This allows users to understand the fully resolved configuration, including any `github>`, `local>`, etc presets, but excluding anything that's internal to Renovate (which can be verbose and/or less relevant), and provides useful output for debugging purposes.\n\n* This is also known as the \"shallow\" config.\n\n* Due to caching, this doesn't add any additional requests.\n */\nasync function logShallowConfig(\n _decryptedConfig: RenovateConfig,\n _config: RepositoryWorkerConfig,\n): Promise<void> {\n // make sure we clone the existing config, so we don't modify the existing settings when resolving this in a shallow fashion\n const decryptedConfig = clone(_decryptedConfig);\n const config = clone(_config);\n\n const { config: resolvedConfig, visitedPresets } =\n await presets.resolveConfigPresets(\n clone(decryptedConfig),\n clone(config),\n [],\n [],\n false,\n );\n logger.debug(\n {\n renovateVersion: pkg.version,\n config: resolvedConfig,\n visitedPresets,\n },\n 'Resolved shallow config, without merging internal presets',\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"merge.js","names":["presets.resolveConfigPresets","configValidation.validateConfig"],"sources":["../../../../lib/workers/repository/init/merge.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyObject,\n isNonEmptyString,\n isString,\n} from '@sindresorhus/is';\nimport { getConfigFileNames } from '../../../config/app-strings.ts';\nimport { decryptConfig } from '../../../config/decrypt.ts';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { migrateAndValidate } from '../../../config/migrate-validate.ts';\nimport { migrateConfig } from '../../../config/migration.ts';\nimport { parseFileConfig } from '../../../config/parse.ts';\nimport * as presets from '../../../config/presets/index.ts';\nimport { applySecretsAndVariablesToConfig } from '../../../config/secrets.ts';\nimport type { AllConfig, RenovateConfig } from '../../../config/types.ts';\nimport * as configValidation from '../../../config/validation.ts';\nimport {\n CONFIG_VALIDATION,\n REPOSITORY_CHANGED,\n} from '../../../constants/error-messages.ts';\nimport { pkg } from '../../../expose.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as npmApi from '../../../modules/datasource/npm/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { getInheritedOrGlobal, parseJson } from '../../../util/common.ts';\nimport { setUserEnv } from '../../../util/env.ts';\nimport { readLocalFile, readSystemFile } from '../../../util/fs/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport * as queue from '../../../util/http/queue.ts';\nimport * as throttle from '../../../util/http/throttle.ts';\nimport { maskToken } from '../../../util/mask.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport { getOnboardingConfig } from '../onboarding/branch/config.ts';\nimport {\n getOnboardingConfigFromCache,\n getOnboardingFileNameFromCache,\n setOnboardingConfigDetails,\n} from '../onboarding/branch/onboarding-branch-cache.ts';\nimport {\n OnboardingState,\n getDefaultConfigFileName,\n} from '../onboarding/common.ts';\nimport type { RepoFileConfig, RepositoryWorkerConfig } from './types.ts';\n\nexport async function detectConfigFile(): Promise<string | null> {\n const fileList = await scm.getFileList();\n for (const fileName of getConfigFileNames()) {\n if (fileName === 'package.json') {\n try {\n const pJson = JSON.parse(\n (await readLocalFile('package.json', 'utf8'))!,\n );\n if (pJson.renovate) {\n logger.warn(\n 'Using package.json for Renovate config is deprecated - please use a dedicated configuration file instead',\n );\n return 'package.json';\n }\n } catch {\n // Do nothing\n }\n } else if (fileList.includes(fileName)) {\n return fileName;\n }\n }\n return null;\n}\n\nexport async function detectRepoFileConfig(\n branchName?: string,\n): Promise<RepoFileConfig> {\n const cache = getCache();\n let { configFileName } = cache;\n if (isNonEmptyString(configFileName)) {\n let configFileRaw: string | null;\n try {\n configFileRaw = await platform.getRawFile(\n configFileName,\n undefined,\n branchName,\n );\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n }\n configFileRaw = null;\n }\n if (configFileRaw) {\n let configFileParsed = parseJson(configFileRaw, configFileName) as any;\n if (configFileName === 'package.json') {\n configFileParsed = configFileParsed.renovate;\n }\n return { configFileName, configFileParsed };\n }\n logger.debug('Existing config file no longer exists');\n delete cache.configFileName;\n }\n\n if (OnboardingState.onboardingCacheValid) {\n configFileName = getOnboardingFileNameFromCache();\n } else {\n configFileName = coerceString(await detectConfigFile());\n }\n\n if (!configFileName) {\n logger.debug('No renovate config file found');\n cache.configFileName = '';\n return {};\n }\n cache.configFileName = configFileName;\n logger.debug(`Found ${configFileName} config file`);\n // TODO #22198\n let configFileParsed: any;\n let configFileRaw: string | undefined | null;\n\n if (OnboardingState.onboardingCacheValid) {\n const cachedConfig = getOnboardingConfigFromCache();\n const parsedConfig = cachedConfig ? JSON.parse(cachedConfig) : undefined;\n if (parsedConfig) {\n setOnboardingConfigDetails(configFileName, JSON.stringify(parsedConfig));\n return { configFileName, configFileParsed: parsedConfig };\n }\n }\n\n if (configFileName === 'package.json') {\n // We already know it parses\n configFileParsed = JSON.parse(\n // TODO #22198\n (await readLocalFile('package.json', 'utf8'))!,\n ).renovate;\n if (isString(configFileParsed)) {\n logger.debug('Massaging string renovate config to extends array');\n configFileParsed = { extends: [configFileParsed] };\n }\n logger.debug({ config: configFileParsed }, 'package.json>renovate config');\n } else {\n configFileRaw = await readLocalFile(configFileName, 'utf8');\n // istanbul ignore if\n if (!isString(configFileRaw)) {\n logger.warn({ configFileName }, 'Null contents when reading config file');\n throw new Error(REPOSITORY_CHANGED);\n }\n // istanbul ignore if\n if (!configFileRaw.length) {\n configFileRaw = '{}';\n }\n\n const parseResult = parseFileConfig(configFileName, configFileRaw);\n\n if (!parseResult.success) {\n return {\n configFileName,\n configFileParseError: {\n validationError: parseResult.validationError,\n validationMessage: parseResult.validationMessage,\n },\n };\n }\n configFileParsed = parseResult.parsedContents;\n logger.debug(\n { fileName: configFileName, config: configFileParsed },\n 'Repository config',\n );\n }\n\n setOnboardingConfigDetails(configFileName, JSON.stringify(configFileParsed));\n return { configFileName, configFileParsed };\n}\n\nexport function checkForRepoConfigError(repoConfig: RepoFileConfig): void {\n if (!repoConfig.configFileParseError) {\n return;\n }\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = repoConfig.configFileName;\n error.validationError = repoConfig.configFileParseError.validationError;\n error.validationMessage = repoConfig.configFileParseError.validationMessage;\n throw error;\n}\n\n// Check for repository config\nexport async function mergeRenovateConfig(\n config: RepositoryWorkerConfig,\n branchName?: string,\n): Promise<RenovateConfig> {\n let returnConfig: RepositoryWorkerConfig = { ...config };\n let repoConfig: RepoFileConfig = {};\n if (getInheritedOrGlobal('requireConfig') !== 'ignored') {\n repoConfig = await detectRepoFileConfig(branchName);\n }\n if (!repoConfig.configFileParsed && config.mode === 'silent') {\n logger.debug(\n 'When mode=silent and repo has no config file, we use the onboarding config as repo config',\n );\n const configFileName = getDefaultConfigFileName();\n repoConfig = {\n configFileName,\n configFileParsed: await getOnboardingConfig(config),\n };\n }\n const configFileParsed = coerceObject(repoConfig?.configFileParsed);\n const resolvedRepoConfig = await resolveStaticRepoConfig(\n configFileParsed,\n process.env.RENOVATE_X_STATIC_REPO_CONFIG_FILE,\n );\n\n // Apply the repositories[] object-entry config between global config and\n // repository file config.\n // Must run after repository file config is loaded so its `ignorePresets` can\n // be included when resolving object-entry presets.\n const repoEntryConfig = returnConfig.repositoryEntryConfig;\n delete returnConfig.repositoryEntryConfig;\n\n if (isNonEmptyObject(repoEntryConfig)) {\n const repoEntry = repoEntryConfig as RenovateConfig;\n const toResolve: RenovateConfig = {\n ...repoEntry,\n extends: [\n ...coerceArray(returnConfig.extends),\n ...coerceArray(repoEntry.extends),\n ],\n ignorePresets: [\n ...coerceArray(returnConfig.ignorePresets),\n ...coerceArray(repoEntry.ignorePresets),\n ...coerceArray(resolvedRepoConfig.ignorePresets),\n ],\n };\n delete returnConfig.extends;\n\n const { config: resolvedRepoEntry } = await presets.resolveConfigPresets(\n toResolve,\n config,\n );\n\n applyNpmrc(resolvedRepoEntry, 'resolvedRepoEntry');\n\n const resolvedRepoEntryWithSecrets = applySecretsAndVariablesToConfig({\n config: resolvedRepoEntry,\n secrets: config.secrets,\n variables: config.variables,\n });\n\n applyHostRules(resolvedRepoEntryWithSecrets);\n returnConfig = mergeChildConfig(returnConfig, resolvedRepoEntryWithSecrets);\n }\n\n if (isNonEmptyArray(returnConfig.extends)) {\n resolvedRepoConfig.extends = [\n ...coerceArray(returnConfig.extends),\n ...coerceArray(resolvedRepoConfig.extends),\n ];\n delete returnConfig.extends;\n }\n checkForRepoConfigError(repoConfig);\n const migratedConfig = await migrateAndValidate(config, resolvedRepoConfig);\n if (migratedConfig.errors?.length) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = repoConfig.configFileName;\n error.validationError =\n 'The renovate configuration file contains some invalid settings';\n error.validationMessage = migratedConfig.errors\n .map((e) => e.message)\n .join(', ');\n throw error;\n }\n if (migratedConfig.warnings) {\n returnConfig.warnings = [\n ...coerceArray(returnConfig.warnings),\n ...migratedConfig.warnings,\n ];\n }\n delete migratedConfig.errors;\n delete migratedConfig.warnings;\n // TODO #22198\n const repository = config.repository!;\n // Decrypt before resolving in case we need npm authentication for any presets\n const decryptedConfig = await decryptConfig(migratedConfig, repository);\n applyNpmrc(decryptedConfig, 'decrypted');\n\n // NOTE that this should not be used with any other configuration (`resolvedConfig`, etc) below, as they will include addditionally merged configuration\n // Decrypted secrets are sanitised, so should be safe to log\n await logShallowConfig(decryptedConfig, config);\n\n // Decrypt after resolving in case the preset contains npm authentication instead\n const { config: configToDecrypt } = await presets.resolveConfigPresets(\n decryptedConfig,\n config,\n config.ignorePresets,\n );\n let resolvedConfig = await decryptConfig(configToDecrypt, repository);\n logger.trace({ config: resolvedConfig }, 'resolved config');\n const migrationResult = migrateConfig(resolvedConfig);\n if (migrationResult.isMigrated) {\n logger.debug('Resolved config needs migrating');\n logger.trace({ config: resolvedConfig }, 'resolved config after migrating');\n resolvedConfig = migrationResult.migratedConfig;\n }\n if (isString(resolvedConfig.npmrc)) {\n logger.debug(\n 'Ignoring any .npmrc files in repository due to configured npmrc',\n );\n }\n applyNpmrc(resolvedConfig, 'resolved');\n resolvedConfig = applySecretsAndVariablesToConfig({\n config: resolvedConfig,\n secrets: mergeChildConfig(\n coerceObject(config.secrets),\n coerceObject(resolvedConfig.secrets),\n ),\n variables: mergeChildConfig(\n coerceObject(config.variables),\n coerceObject(resolvedConfig.variables),\n ),\n });\n\n applyHostRules(resolvedConfig);\n returnConfig = mergeChildConfig(returnConfig, resolvedConfig);\n ({ config: returnConfig } = await presets.resolveConfigPresets(\n returnConfig,\n config,\n ));\n returnConfig.renovateJsonPresent = true;\n // istanbul ignore if\n if (returnConfig.ignorePaths?.length) {\n logger.debug(\n { ignorePaths: returnConfig.ignorePaths },\n `Found repo ignorePaths`,\n );\n }\n\n setUserEnv(returnConfig.env);\n delete returnConfig.env;\n\n return returnConfig;\n}\n\nexport function applyNpmrc(\n config: RenovateConfig,\n configType?: 'resolved' | 'resolvedRepoEntry' | 'decrypted',\n): void {\n setNpmTokenInNpmrc(config);\n if (!isString(config.npmrc)) {\n return;\n }\n logger.debug(\n `Setting npmrc from ${configType ? `${configType} ` : ''}config`,\n );\n npmApi.setNpmrc(config.npmrc);\n}\n\nexport function applyHostRules(config: RenovateConfig): void {\n if (!config.hostRules) {\n return;\n }\n\n logger.debug('Setting hostRules from config');\n for (const rule of config.hostRules) {\n try {\n hostRules.add(rule);\n } catch (err) {\n logger.warn({ err, config: rule }, 'Error setting hostRule from config');\n }\n }\n // host rules can change concurrency\n queue.clear();\n throttle.clear();\n delete config.hostRules;\n}\n\n/** needed when using portal secrets for npmToken */\nexport function setNpmTokenInNpmrc(config: RenovateConfig): void {\n if (!isString(config.npmToken)) {\n return;\n }\n\n const token = config.npmToken;\n logger.debug({ npmToken: maskToken(token) }, 'Migrating npmToken to npmrc');\n\n if (!isString(config.npmrc)) {\n logger.debug('Adding npmrc to config');\n config.npmrc = `//registry.npmjs.org/:_authToken=${token}\\n`;\n delete config.npmToken;\n return;\n }\n\n if (config.npmrc.includes(`\\${NPM_TOKEN}`)) {\n logger.debug(`Replacing \\${NPM_TOKEN} with npmToken`);\n config.npmrc = config.npmrc.replace(regEx(/\\${NPM_TOKEN}/g), token);\n } else {\n logger.debug('Appending _authToken= to end of existing npmrc');\n config.npmrc = config.npmrc.replace(\n regEx(/\\n?$/),\n `\\n_authToken=${token}\\n`,\n );\n }\n\n delete config.npmToken;\n}\n\nexport async function resolveStaticRepoConfig(\n config: AllConfig,\n filename: string | undefined,\n): Promise<AllConfig> {\n if (!isNonEmptyString(filename)) {\n return config;\n }\n\n let staticRepoConfig: AllConfig;\n\n try {\n staticRepoConfig = await tryReadStaticRepoFileConfig(filename);\n } catch (err) {\n logger.fatal({ err }, 'Failed to load static repository config file');\n process.exit(1);\n }\n\n if (!isNonEmptyObject(staticRepoConfig)) {\n return config;\n }\n\n return mergeStaticConfig(config, staticRepoConfig);\n}\n\nexport async function tryReadStaticRepoFileConfig(\n staticRepoConfigFile: string,\n): Promise<AllConfig> {\n logger.debug(`Reading static repo config file from ${staticRepoConfigFile}`);\n\n let staticRepoConfigRaw: string;\n try {\n staticRepoConfigRaw = await readSystemFile(staticRepoConfigFile, 'utf8');\n } catch (err) {\n throw new Error(\n `Failed to read static repo config file: \"${staticRepoConfigFile}\"`,\n { cause: err },\n );\n }\n\n const staticRepoConfig = parseJson(\n staticRepoConfigRaw,\n staticRepoConfigFile,\n ) as AllConfig;\n\n // validate and log issues here to preserve context, caller handles migration and full validation.\n const { errors, warnings } = await configValidation.validateConfig(\n 'repo',\n staticRepoConfig,\n );\n\n if (isNonEmptyArray(errors) || isNonEmptyArray(warnings)) {\n logger.info(\n { errors, warnings },\n 'Static repo config validation issues detected',\n );\n } else {\n logger.debug(\n { staticRepoConfig },\n 'Static repository config file successfully parsed and validated',\n );\n }\n\n return staticRepoConfig;\n}\n\nexport function mergeStaticConfig(\n config: AllConfig,\n staticRepoConfig: AllConfig,\n): AllConfig {\n // merge extends\n if (isNonEmptyArray(staticRepoConfig.extends)) {\n config.extends = [\n ...staticRepoConfig.extends,\n ...coerceArray(config.extends),\n ];\n delete staticRepoConfig.extends;\n }\n\n // renovate repo config overrides RENOVATE_STATIC_REPO_CONFIG[_FILE]\n return mergeChildConfig(staticRepoConfig, config);\n}\n\n/**\n * Resolve everything but internal Renovate presets and log it out.\n *\n* This allows users to understand the fully resolved configuration, including any `github>`, `local>`, etc presets, but excluding anything that's internal to Renovate (which can be verbose and/or less relevant), and provides useful output for debugging purposes.\n\n* This is also known as the \"shallow\" config.\n\n* Due to caching, this doesn't add any additional requests.\n */\nasync function logShallowConfig(\n _decryptedConfig: RenovateConfig,\n _config: RepositoryWorkerConfig,\n): Promise<void> {\n // make sure we clone the existing config, so we don't modify the existing settings when resolving this in a shallow fashion\n const decryptedConfig = clone(_decryptedConfig);\n const config = clone(_config);\n\n const { config: resolvedConfig, visitedPresets } =\n await presets.resolveConfigPresets(\n clone(decryptedConfig),\n clone(config),\n [],\n [],\n false,\n );\n logger.debug(\n {\n renovateVersion: pkg.version,\n config: resolvedConfig,\n visitedPresets,\n },\n 'Resolved shallow config, without merging internal presets',\n );\n}\n"],"mappings":"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"}
|