@halospv3/hce.shared-config 3.5.3-develop.2 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +33 -10
- package/dotnet/.github/workflows/_unit_test.yml +1 -1
- package/dotnet/.github/workflows/dotnet-release.yml +1 -1
- package/dotnet/.github/workflows/sample-dotnet-build.yml +1 -1
- package/dotnet/CleanupWpfTmp.targets +15 -0
- package/dotnet/HCE.Shared.targets +3 -0
- package/mjs/CaseInsensitiveMap.mjs.map +1 -1
- package/mjs/commitlintConfig.mjs.map +1 -1
- package/mjs/debug.mjs.map +1 -1
- package/mjs/dotnet/GithubNugetRegistryInfo.d.mts +5 -5
- package/mjs/dotnet/GithubNugetRegistryInfo.d.mts.map +1 -1
- package/mjs/dotnet/GithubNugetRegistryInfo.mjs +7 -7
- package/mjs/dotnet/GithubNugetRegistryInfo.mjs.map +1 -1
- package/mjs/dotnet/GitlabNugetRegistryInfo.d.mts +6 -6
- package/mjs/dotnet/GitlabNugetRegistryInfo.d.mts.map +1 -1
- package/mjs/dotnet/GitlabNugetRegistryInfo.mjs +14 -14
- package/mjs/dotnet/GitlabNugetRegistryInfo.mjs.map +1 -1
- package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.mjs +5 -5
- package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.mjs.map +1 -1
- package/mjs/dotnet/MSBuildProject.d.mts +28 -28
- package/mjs/dotnet/MSBuildProject.d.mts.map +1 -1
- package/mjs/dotnet/MSBuildProject.mjs +88 -66
- package/mjs/dotnet/MSBuildProject.mjs.map +1 -1
- package/mjs/dotnet/MSBuildProjectProperties.d.mts.map +1 -1
- package/mjs/dotnet/MSBuildProjectProperties.mjs +1 -1
- package/mjs/dotnet/MSBuildProjectProperties.mjs.map +1 -1
- package/mjs/dotnet/NugetProjectProperties.d.mts +3 -3
- package/mjs/dotnet/NugetProjectProperties.d.mts.map +1 -1
- package/mjs/dotnet/NugetProjectProperties.mjs +7 -9
- package/mjs/dotnet/NugetProjectProperties.mjs.map +1 -1
- package/mjs/dotnet/NugetRegistryInfo.d.mts +40 -40
- package/mjs/dotnet/NugetRegistryInfo.d.mts.map +1 -1
- package/mjs/dotnet/NugetRegistryInfo.mjs +170 -148
- package/mjs/dotnet/NugetRegistryInfo.mjs.map +1 -1
- package/mjs/dotnet/helpers.d.mts.map +1 -1
- package/mjs/dotnet/helpers.mjs +33 -34
- package/mjs/dotnet/helpers.mjs.map +1 -1
- package/mjs/eslintConfig.mjs.map +1 -1
- package/mjs/insertPlugins.mjs +2 -2
- package/mjs/insertPlugins.mjs.map +1 -1
- package/mjs/semantic-release__commit-analyzer.d.mts.map +1 -1
- package/mjs/semantic-release__exec.d.mts.map +1 -1
- package/mjs/semantic-release__git.d.mts.map +1 -1
- package/mjs/semantic-release__github.d.mts +1 -0
- package/mjs/semantic-release__github.d.mts.map +1 -1
- package/mjs/semanticReleaseConfig.d.mts.map +1 -1
- package/mjs/semanticReleaseConfig.mjs.map +1 -1
- package/mjs/semanticReleaseConfigDotnet.d.mts.map +1 -1
- package/mjs/semanticReleaseConfigDotnet.mjs +23 -16
- package/mjs/semanticReleaseConfigDotnet.mjs.map +1 -1
- package/mjs/setupGitPluginSpec.d.mts.map +1 -1
- package/mjs/setupGitPluginSpec.default.mjs.map +1 -1
- package/mjs/setupGitPluginSpec.mjs +19 -19
- package/mjs/setupGitPluginSpec.mjs.map +1 -1
- package/mjs/utils/Exact.d.mts.map +1 -1
- package/mjs/utils/GracefulRecursion.d.mts.map +1 -1
- package/mjs/utils/env.d.mts.map +1 -1
- package/mjs/utils/env.mjs.map +1 -1
- package/mjs/utils/execAsync.d.mts +3 -3
- package/mjs/utils/execAsync.d.mts.map +1 -1
- package/mjs/utils/execAsync.mjs +14 -12
- package/mjs/utils/execAsync.mjs.map +1 -1
- package/mjs/utils/isError.mjs.map +1 -1
- package/mjs/utils/miscTypes.d.mts.map +1 -1
- package/mjs/utils/miscTypes.mjs.map +1 -1
- package/mjs/utils/reflection/FunctionLike.d.mts +1 -0
- package/mjs/utils/reflection/FunctionLike.d.mts.map +1 -1
- package/mjs/utils/reflection/GetterDescriptor.d.mts.map +1 -1
- package/mjs/utils/reflection/InstancePropertyDescriptorMap.d.mts.map +1 -1
- package/mjs/utils/reflection/InstanceTypeOrSelfPropertyDescriptorMap.d.mts +1 -1
- package/mjs/utils/reflection/InstanceTypeOrSelfPropertyDescriptorMap.d.mts.map +1 -1
- package/mjs/utils/reflection/OwnGetterDescriptorMap.d.mts +1 -1
- package/mjs/utils/reflection/OwnGetterDescriptorMap.d.mts.map +1 -1
- package/mjs/utils/reflection/OwnKeyOf.d.mts +1 -1
- package/mjs/utils/reflection/OwnKeyOf.d.mts.map +1 -1
- package/mjs/utils/reflection/OwnPropertyDescriptorMap.d.mts.map +1 -1
- package/mjs/utils/reflection/PropertyDescriptorMap.d.mts +1 -1
- package/mjs/utils/reflection/PropertyDescriptorMap.d.mts.map +1 -1
- package/mjs/utils/reflection/filterForGetters.d.mts.map +1 -1
- package/mjs/utils/reflection/filterForGetters.mjs.map +1 -1
- package/mjs/utils/reflection/getOwnPropertyDescriptors.d.mts.map +1 -1
- package/mjs/utils/reflection/getOwnPropertyDescriptors.mjs.map +1 -1
- package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.d.mts.map +1 -1
- package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.mjs +3 -3
- package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.mjs.map +1 -1
- package/mjs/utils/reflection/getPrototypeChainOf.d.mts +2 -2
- package/mjs/utils/reflection/getPrototypeChainOf.d.mts.map +1 -1
- package/mjs/utils/reflection/getPrototypeChainOf.mjs +1 -2
- package/mjs/utils/reflection/getPrototypeChainOf.mjs.map +1 -1
- package/mjs/utils/reflection/getPrototypeOf.d.mts.map +1 -1
- package/mjs/utils/reflection/getPrototypeOf.mjs.map +1 -1
- package/mjs/utils/reflection/inheritance.d.mts +4 -4
- package/mjs/utils/reflection/inheritance.d.mts.map +1 -1
- package/mjs/utils/reflection/inheritance.mjs.map +1 -1
- package/mjs/utils/reflection/isConstructor.d.mts +3 -3
- package/mjs/utils/reflection/isConstructor.d.mts.map +1 -1
- package/mjs/utils/reflection/isConstructor.mjs +7 -7
- package/mjs/utils/reflection/isConstructor.mjs.map +1 -1
- package/mjs/utils/reflection/isGetterDescriptor.d.mts.map +1 -1
- package/mjs/utils/reflection/isGetterDescriptor.mjs.map +1 -1
- package/mjs/utils/reflection/listOwnGetters.d.mts.map +1 -1
- package/mjs/utils/reflection/listOwnGetters.mjs +4 -2
- package/mjs/utils/reflection/listOwnGetters.mjs.map +1 -1
- package/mjs/utils/reflection.d.mts +1 -1
- package/package.json +25 -24
- package/src/dotnet/GithubNugetRegistryInfo.ts +18 -15
- package/src/dotnet/GitlabNugetRegistryInfo.ts +28 -26
- package/src/dotnet/IsNextVersionAlreadyPublished.cli.ts +6 -6
- package/src/dotnet/MSBuildProject.ts +103 -106
- package/src/dotnet/MSBuildProjectProperties.ts +1 -1
- package/src/dotnet/NugetProjectProperties.ts +13 -18
- package/src/dotnet/NugetRegistryInfo.ts +287 -243
- package/src/dotnet/helpers.ts +58 -58
- package/src/insertPlugins.ts +3 -3
- package/src/semantic-release__github.d.ts +1 -0
- package/src/semanticReleaseConfigDotnet.ts +52 -54
- package/src/setupGitPluginSpec.ts +25 -26
- package/src/utils/env.ts +1 -0
- package/src/utils/execAsync.ts +16 -13
- package/src/utils/reflection/FunctionLike.d.ts +1 -0
- package/src/utils/reflection/InstancePropertyDescriptorMap.d.ts +4 -4
- package/src/utils/reflection/InstanceTypeOrSelfPropertyDescriptorMap.d.ts +6 -6
- package/src/utils/reflection/OwnGetterDescriptorMap.d.ts +2 -2
- package/src/utils/reflection/OwnKeyOf.d.ts +3 -3
- package/src/utils/reflection/OwnPropertyDescriptorMap.d.ts +3 -3
- package/src/utils/reflection/PropertyDescriptorMap.d.ts +3 -3
- package/src/utils/reflection/filterForGetters.ts +10 -10
- package/src/utils/reflection/getOwnPropertyDescriptors.ts +2 -2
- package/src/utils/reflection/getOwnPropertyDescriptorsRecursively.ts +13 -13
- package/src/utils/reflection/getPrototypeChainOf.ts +17 -17
- package/src/utils/reflection/getPrototypeOf.ts +2 -2
- package/src/utils/reflection/inheritance.ts +5 -4
- package/src/utils/reflection/isConstructor.ts +7 -7
- package/src/utils/reflection/listOwnGetters.ts +8 -8
- package/tsconfig.base.json +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NugetRegistryInfo.mjs","names":["configDotenv"],"sources":["../../src/dotnet/NugetRegistryInfo.ts"],"sourcesContent":["/* JSDoc Types */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { SemanticReleaseConfigDotnet as _srcd } from '../semanticReleaseConfigDotnet.ts';\nimport type { NugetProjectProperties } from './NugetProjectProperties.ts';\n/* eslint-enable @typescript-eslint/no-unused-vars */\n\nimport { config as configDotenv } from '@dotenvx/dotenvx';\nimport { type, type Type } from 'arktype';\nimport { detectFile, detectFileSync } from 'chardet';\nimport { ok } from 'node:assert/strict';\nimport type { ExecException } from 'node:child_process';\nimport { existsSync, writeFileSync } from 'node:fs';\nimport { writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\n// eslint-disable-next-line unicorn/import-style\nimport * as node_path from 'node:path';\nimport { cwd, env } from 'node:process';\nimport { setTimeout } from 'node:timers/promises';\nimport { isError } from '../utils/isError.ts';\nimport sanitizeFileName from 'sanitize-filename';\nimport { getEnvVarValue } from '../utils/env.ts';\nimport { execAsync } from '../utils/execAsync.ts';\nimport { catchEBUSY, MSBuildEvaluationOutput, MSBuildProject } from './MSBuildProject.ts';\nimport type { Default } from 'arktype/internal/attributes.ts';\n\ntype TmpDirNamespace_Unix = `${ReturnType<typeof tmpdir>}/HCE.Shared/.NET/Dummies`;\ntype TmpDirNamespace_Win = `${ReturnType<typeof tmpdir>}\\\\HCE.Shared\\\\.NET\\\\Dummies`;\nconst tmpDirNamespace = node_path.join(tmpdir(), 'HCE.Shared', '.NET', 'Dummies') as TmpDirNamespace_Unix | TmpDirNamespace_Win;\nconst defaultNugetSource = 'https://api.nuget.org/v3/index.json';\nconst key_OutputPackItems = '_OutputPackItems';\n/**\n * Read the contents of $GITHUB_OUTPUT (if its value is a file path) or $TEMP/GITHUB_OUTPUT.\n * If the file doesn't exist, it is created.\n * @returns If successful, a promised object with a parsed key.\n */\nexport async function getGithubOutput(): Promise<ReturnType<typeof configDotenv>['parsed']> {\n if (env['GITHUB_OUTPUT'] === undefined || !existsSync(env['GITHUB_OUTPUT'])) {\n const githubOutputPath: string = node_path.join(tmpdir(), 'GITHUB_OUTPUT');\n if (!existsSync(githubOutputPath))\n await writeFile(githubOutputPath, '');\n env['GITHUB_OUTPUT'] = githubOutputPath;\n }\n\n const encoding = await detectFile(env['GITHUB_OUTPUT']);\n const envOutput = configDotenv({\n path: env['GITHUB_OUTPUT'],\n override: true,\n encoding: encoding ?? undefined,\n processEnv: {},\n });\n\n if (isError(envOutput.error))\n throw envOutput.error;\n return envOutput.parsed;\n}\n\n/**\n * Read the contents of $GITHUB_OUTPUT (if its value is a file path) or $TEMP/GITHUB_OUTPUT.\n * If the file doesn't exist, it is created.\n * @returns An object with a parsed key if successful.\n */\nexport function getGithubOutputSync(): NonNullable<ReturnType<typeof configDotenv>['parsed']> {\n if (env['GITHUB_OUTPUT'] === undefined || !existsSync(env['GITHUB_OUTPUT'])) {\n const githubOutputPath: string = node_path.join(tmpdir(), 'GITHUB_OUTPUT');\n if (!existsSync(githubOutputPath))\n writeFileSync(githubOutputPath, '');\n env['GITHUB_OUTPUT'] = githubOutputPath;\n }\n\n const encoding = detectFileSync(env['GITHUB_OUTPUT']);\n const envOutput = configDotenv({\n path: env['GITHUB_OUTPUT'],\n override: true,\n encoding: encoding ?? undefined,\n processEnv: {},\n }) as { error: Error }\n | { parsed: NonNullable<ReturnType<typeof configDotenv>['parsed']> };\n\n if ('error' in envOutput)\n throw envOutput.error;\n return envOutput.parsed;\n}\n\ntype DummiesDir<T> = T extends undefined\n ? `${TmpDirNamespace_Unix}/` | `${TmpDirNamespace_Win}\\\\`\n : T extends MSBuildProject\n ? `${TmpDirNamespace_Unix}/${T['Properties']['PackageId']}/` | `${TmpDirNamespace_Win}\\\\${T['Properties']['PackageId']}\\\\`\n : never;\n\nfunction getDummiesDir<T extends MSBuildProject | undefined = undefined>(project?: T): DummiesDir<T>;\nfunction getDummiesDir<T extends MSBuildProject>(project: T): DummiesDir<T>;\n/**\n * Get HCE.Shared's temporary directory for .NET projects' dummy packages.\n * @param project The MSBuild project whose PackageId will be used to create a\n * directory for its dummy packages.\n * @returns a platform-specific path like\n * `${tmpdir()}/HCE.Shared/.NET/Dummies/${project.Properties.PackageId}` if\n * {@link project} is defined. Else `${tmpdir()}/HCE.Shared/.NET/Dummies`\n */\nfunction getDummiesDir<T extends MSBuildProject | undefined = undefined>(project?: T): DummiesDir<typeof project> {\n switch (true) {\n case project === undefined: {\n return node_path.join(tmpDirNamespace, node_path.sep) as\n DummiesDir<typeof project> satisfies\n ReturnType<typeof getDummiesDir>;\n }\n case project instanceof MSBuildProject: {\n return node_path.join(tmpDirNamespace, project.Properties.PackageId, node_path.sep) as\n DummiesDir<typeof project> satisfies\n ReturnType<typeof getDummiesDir<MSBuildProject>>;\n }\n default: {\n throw new Error('The type of argument `project` must be `undefined` or `MSBuildProject`.');\n }\n }\n}\n\n/**\n * Get the environment variables as key-value pairs.\n * @param tokenEnvVars The name of the environment variables whose values are\n * NuGet API keys.\n * @returns an array of key-value pairs of the given environment variables and\n * their values, filtered to only those whose values are not undefined.\n * @throws {Error} when none of the provided environment variables are defined.\n */\nfunction _GetTokenEnvVariables(tokenEnvVars: readonly string[]): undefined | [readonly [string, string], ...readonly [string, string][]] {\n const definedTokens = Object.freeze(\n tokenEnvVars\n .map((key: string) => [key, getEnvVarValue(key)] as const)\n .filter((envVarTuple: readonly [string, string | undefined]): envVarTuple is [string, string] =>\n envVarTuple[1] !== undefined,\n ),\n );\n\n if (definedTokens.length > 0)\n return definedTokens as [readonly [string, string], ...readonly [string, string][]];\n return undefined;\n}\n\nexport class NugetRegistryInfo {\n private _canPushPackagesToSource: Promise<true> | undefined = undefined;\n private readonly _project: MSBuildProject;\n private readonly _resolvedEnvVariable: string | undefined;\n private readonly _source: string;\n\n public static readonly DefaultTokenEnvVars: readonly ['NUGET_TOKEN']\n = Object.freeze(['NUGET_TOKEN'] as const);\n\n /**\n * Convert a URL string to a filesystem folder name.\n *\n * Intended usage: modify the output path of `dotnet pack` based on the NuGet\n * Source the package should be pushed to. This is extra work is usually\n * unnecessary and you'd typically push the same file to multiple sources.\n * This is for the edge-case scenario of creating multiple nupkgs and signing\n * each one with a different certificate corresponding to a given NuGet\n * Source. This is only useful if the Sources have different certificates\n * registered for a given package/user/organization.\n * @param source The URL of the NuGet Source\n * @returns A string suitable for a local filesystem folder name, formatted as\n * `${hostname}_${pathname.replace('/', '_')}`.\n */\n static GetDirNameForSource(source: string): string {\n return sanitizeFileName(\n source.replaceAll(/\\/index.json$/g, ''),\n { replacement: '_' },\n );\n }\n\n /**\n * Creates an instance of NugetRegistryInfo.\\\n * This class enables the ability to push a given {@link project}'s\n * package(s) to the {@link source} of a given NuGet Source's API endpoint with\n * a user-defined API key. This API key, herein referred to as a \"token\", is\n * derived from the {@link tokenEnvVars} array. This array is iterated through\n * until one of the items is discovered to be an existing environment variable\n * (or is defined in a file named '.env' in the current working directory for\n * LOCAL TESTING ONLY! Do NOT `git add` your private keys!).\n * \\\n * WARNING:\n * - The token value is stored privately within this class, but it is plain text.\n * - This private key may be copied to command line strings stored in Semantic\n * Release's config object for later use by `@semantic-release/exec`.\n * - Other EcmaScript modules can access the environment variable(s) and steal\n * your key. Be aware of malicious dependencies!\n * @param opts The input type of {@link NRIOpts.from}\n * @param opts.project The project whose package(s) will be\n * pushed.\\\n * - Its {@link NugetProjectProperties#PackageId} will be read.\\\n * - Its {@link NugetProjectProperties#PackageVersion} will be overridden via CLI args when creating a dummy package. The real package's\n * `PackageVersion` will *not* be overridden.\n * @param [opts.tokenEnvVars] The environment variables\n * whose values are tokens with permission to push a package to the NuGet\n * package registry. The array is iterated through until one token is found.\n * If none of the environment variables are defined, this constructor will\n * throw an {@link Error}.\n * @param [opts.source] A NuGet package registry's API endpoint URL or name. Default: 'https://api.nuget.org/v3/index.json'\n */\n constructor(opts: typeof NRIOpts['inferIn']) {\n // note: you can reassign `opts` only when typeof `inferOut` is assignable\n // to typeof `inferIn`.\n const validOpts = NRIOpts.from(opts);\n this._project = validOpts.project;\n /**\n * May throw! Assign key of the first key-value pair to\n * {@link resolvedEnvVariable}\n */\n const tokenVars = _GetTokenEnvVariables(validOpts.tokenEnvVars);\n if (tokenVars)\n this._resolvedEnvVariable = tokenVars[0][0];\n this._source = validOpts.source;\n }\n\n public get project(): MSBuildProject {\n return this._project;\n }\n\n /**\n * This is not useful without it being executed as part of a Semantic Release\n * plugin. Deferring this to `@semantic-release/exec`'s prepareCmd is possible,\n * but impractical. You'd need to configure prepareCmd to invoke something\n * like `node customScriptFile.mjs`. It's not worth the hassle.\n * @returns `true` if the token can be used to push nupkg to the given Nuget registry\n * @throws {TypeError | Error | import('../utils/execAsync.js').ChildProcessSpawnException }\n * - {@link Error} | {@link module:utils/execAsync:ChildProcessSpawnException ChildProcessSpawnException}\n * - The token is invalid, of the wrong token type, or lacks permission to push packages\n * - The URL does not exist or a connection could not be established\n * - The command line string is malformed.\n * @deprecated Call during the `verifyConditions` step of Semantic Release! Additionally, {@link GetIsNextVersionAlreadyPublishedCommand}'s return value should be assigned to `prepareCmd` to prevent package version collision errors.\n */\n public get canPushPackagesToSource(): Promise<true> {\n if (this._canPushPackagesToSource !== undefined)\n return this._canPushPackagesToSource;\n\n let tokenValue: string | undefined;\n if (this.resolvedEnvVariable !== undefined)\n tokenValue = NRI._GetTokenValue(this.resolvedEnvVariable);\n\n if (tokenValue?.startsWith('github_pat_')) {\n const errMsg = `The value of the token in 'resolvedEnvVariable' ${String(this.resolvedEnvVariable)} begins with 'github_pat_', indicating it's a Fine-Grained token. At the time of writing, GitHub Fine-Grained tokens cannot push packages. If you believe this is statement is outdated, report the issue at https://github.com/halospv3/hce.shared/issues/new. For more information, see https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry.`;\n const err = new Error(errMsg);\n return this._canPushPackagesToSource = Promise.reject(err);\n }\n\n return this._canPushPackagesToSource = this.PackDummyPackage({})\n .then(async () => await this._PushDummyPackages({\n apiKey: tokenValue,\n }))\n .then<true>((execAsyncReturn) => {\n ok(execAsyncReturn);\n return true as const;\n });\n }\n\n /**\n * The first environment variable found to have a defined value. Set by\n * {@link _GetTokenEnvVariables} in the constructor.\n * @returns The first environment variable found to have a defined value.\n */\n get resolvedEnvVariable(): string | undefined {\n return this._resolvedEnvVariable;\n }\n\n get source(): string {\n return this._source;\n }\n\n /**\n * Get the API token from {@link NugetRegistryInfo#resolvedEnvVariable}\n * @param resolvedEnvVariable The name of the environment variable(s) whose\n * value is a NuGet API key. Typically, the value of\n * {@link NugetRegistryInfo#resolvedEnvVariable}.\n * @returns The value of the first defined environment variable.\n * @throws {Error} when none of the provided environment variables are defined.\n */\n private static _GetTokenValue(resolvedEnvVariable: string): string {\n type.string.assert(resolvedEnvVariable);\n\n const tokenValue = getEnvVarValue(resolvedEnvVariable);\n if (tokenValue === undefined) {\n throw new Error(`\\\nThe environment variable ${resolvedEnvVariable} was specified \\\nas the source of the token to push a NuGet package, \\\nbut the environment variable is empty or undefined.`);\n }\n return tokenValue;\n }\n\n // #region Pack\n\n /**\n * The type for options and arguments of `dotnet pack`. See https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack.\n *\n * {@link NRI.PackPackagesOptionsType.t.propertyOverrides `propertyOverrides`}\n * is a wrapper for MSBuild's `-property:<n>=<v>` properties override arg.\n */\n static readonly PackPackagesOptionsType: Type<{\n propertyOverrides?: Record<string, string> | undefined;\n artifactsPath?: string | undefined;\n configuration?: 'Release' | 'Debug' | undefined;\n disableBuildServers?: boolean | undefined;\n force?: boolean | undefined;\n includeSource?: boolean | undefined;\n includeSymbols?: boolean | undefined;\n interactive?: boolean | undefined;\n noBuild?: boolean | undefined;\n noLogo?: boolean | undefined;\n noRestore?: boolean | undefined;\n output?: string | undefined;\n runtime?: string | undefined;\n serviceable?: boolean | undefined;\n terminalLogger?: 'auto' | 'on' | 'off' | undefined;\n useCurrentRuntime?: boolean | undefined;\n verbosity?: 'quiet' | 'minimal' | 'normal' | 'detailed' | 'diagnostic' | undefined;\n versionSuffix?: string | undefined;\n '-GetItem'?: readonly string[] | string[] | undefined;\n }> = Object.freeze(\n type({\n /**\n * a custom arg for handling MSBuild's `-property:<n>=<v>` argument for overriding MSBuild properties.\n */\n 'propertyOverrides?': type('Record<string,string>'),\n 'artifactsPath?': 'string',\n 'configuration?': '\"Release\" | \"Debug\"',\n 'disableBuildServers?': 'boolean',\n 'force?': 'boolean',\n 'includeSource?': 'boolean',\n 'includeSymbols?': 'boolean',\n 'interactive?': 'boolean',\n 'noBuild?': 'boolean',\n 'noLogo?': 'boolean',\n 'noRestore?': 'boolean',\n 'output?': 'string',\n 'runtime?': 'string',\n 'serviceable?': 'boolean',\n 'terminalLogger?': '\"auto\" | \"on\" | \"off\"',\n 'useCurrentRuntime?': 'boolean',\n 'verbosity?': '\"quiet\" | \"minimal\" | \"normal\" | \"detailed\" | \"diagnostic\"',\n 'versionSuffix?': 'string',\n /**\n * MSBuild evaluation option. Added to get the output Nupkgs' file paths.\n * @todo consider adding -GetProperty, -GetTarget\n */\n '-GetItem?': type.string.array().readonly().or('string[]'),\n }),\n );\n\n public static readonly PackDummyPackagesOptionsType: Type<{\n propertyOverrides?: Record<string, string> | undefined;\n artifactsPath?: string | undefined;\n configuration?: 'Release' | 'Debug' | undefined;\n disableBuildServers?: boolean | undefined;\n force?: boolean | undefined;\n includeSource?: boolean | undefined;\n includeSymbols?: boolean | undefined;\n interactive?: boolean | undefined;\n noBuild?: boolean | undefined;\n noLogo?: boolean | undefined;\n noRestore?: boolean | undefined;\n runtime?: string | undefined;\n serviceable?: boolean | undefined;\n terminalLogger?: 'auto' | 'on' | 'off' | undefined;\n useCurrentRuntime?: boolean | undefined;\n verbosity?: 'quiet' | 'minimal' | 'normal' | 'detailed' | 'diagnostic' | undefined;\n versionSuffix?: string | undefined;\n '-GetItem'?: readonly string[] | string[] | undefined;\n }>\n = this.PackPackagesOptionsType.omit('output');\n\n /**\n * Get a `dotnet pack` command line string, outputting the package(s) to a\n * path determined by this method's parameters.\n * When pushing the package(s), you only need to supply the main .nupkg's path\n * or its directory to the dotnet CLI—by default, it will also push the\n * symbols package, if present.\n * @param opts Options passed to\n * `dotnet pack`, excluding the required `<PROJECT | SOLUTION>` argument. The\n * {@link PackPackagesOptionsType.t.output} path is modified according to the\n * {@link usePerSourceSubfolder} and {@link usePerPackageIdSubfolder}\n * arguments.\n * @param usePerSourceSubfolder If true, the path of the package output will\n * include a subfolder named after the NuGet Source.\n * @param usePerPackageIdSubfolder If true, the path of the package output\n * will include a subfolder named after the NuGet package's ID.\n * @returns `dotnet pack \"${this.project.Properties.MSBuildProjectFullPath}\"\n * -o \"${outDir}\"` where outDir may be `${cwd()}/publish/${NugetRegistryInfo.GetNameForURL(this.source)}/${this._project.Properties.PackageId}`\n */\n GetPackCommand(\n opts: typeof NRI.PackPackagesOptionsType.inferIn,\n usePerSourceSubfolder = false,\n usePerPackageIdSubfolder = false,\n ): string {\n const validOpts = NRI.PackPackagesOptionsType.from(opts);\n type.boolean.assert(usePerSourceSubfolder);\n type.boolean.assert(usePerPackageIdSubfolder);\n\n validOpts.output ??= node_path.join(cwd(), 'publish');\n if (usePerSourceSubfolder)\n validOpts.output = node_path.join(validOpts.output, NugetRegistryInfo.GetDirNameForSource(this.source), node_path.sep);\n if (usePerPackageIdSubfolder)\n validOpts.output = node_path.join(validOpts.output, this._project.Properties.PackageId, node_path.sep);\n\n const packCmdArr: string[] = [\n 'dotnet',\n 'pack',\n `\"${this._project.Properties.MSBuildProjectFullPath}\"`,\n ];\n if (validOpts.artifactsPath !== undefined)\n packCmdArr.push('--artifactsPath', `\"${validOpts.artifactsPath}\"`);\n if (validOpts.configuration !== undefined)\n packCmdArr.push('--configuration', validOpts.configuration);\n if (validOpts.disableBuildServers === true)\n packCmdArr.push('--disable-build-servers');\n if (validOpts.force === true) packCmdArr.push('--force');\n if (validOpts.includeSource === true) packCmdArr.push('--include-source');\n if (validOpts.includeSymbols === true) packCmdArr.push('--include-symbols');\n if (validOpts.interactive === true) packCmdArr.push('--interactive');\n if (validOpts.noBuild === true) packCmdArr.push('--no-build');\n if (validOpts.noLogo === true) packCmdArr.push('--nologo');\n if (validOpts.noRestore === true) packCmdArr.push('--no-restore');\n if (validOpts.runtime !== undefined)\n packCmdArr.push('--runtime', validOpts.runtime);\n if (validOpts.serviceable === true) packCmdArr.push('--serviceable');\n if (validOpts.terminalLogger !== undefined)\n packCmdArr.push('--tl', validOpts.terminalLogger);\n if (validOpts.useCurrentRuntime === true)\n packCmdArr.push('--use-current-runtime');\n if (validOpts.verbosity !== undefined)\n packCmdArr.push('--verbosity', validOpts.verbosity);\n if (validOpts.versionSuffix !== undefined)\n packCmdArr.push('--version-suffix', validOpts.versionSuffix);\n /**\n * Haphazard. I need to override the Version and I'm not considering side\n * effects of arbitrary overrides.\n */\n if (validOpts.propertyOverrides) {\n /** convert propertyOverrides record to \"-p:n0=v0;n1=v1;n2=v2\" et cetera */\n const assignments: string = '-p:' + Object.entries(validOpts.propertyOverrides)\n .map(v => `${v[0]}=${v[1]}`).join(';');\n packCmdArr.push(`\"${assignments}\"`);\n }\n if (validOpts['-GetItem'] && validOpts['-GetItem'].length > 0) {\n // -GetItem:_OutputPackItems,MyCustomItem\n packCmdArr.push(`-GetItem:${validOpts['-GetItem'].join(',')}`);\n }\n // MSBuild parses everything after -o as the path.\n packCmdArr.push('-o', `\"${validOpts.output}\"`);\n\n return packCmdArr.join(' ');\n }\n\n /**\n * !Not ready for use! Remove private modifier and commit as `feat(dotnet)` when ready for release!\n * Blocking Issue: convert all dotnet-related functionality to a Semantic Release plugin!\n * The current {@link _srcd SemanticReleaseConfigDotnet} leverages\n * `@semantic-release/exec` to invoke dotnet commands. This is fine for\n * relatively short command lines, but chaining commands with ' && ' results\n * in quickly-growing complexity.\n * NuGet packages should be created during the `prepare` step, but complex\n * configuration of `dotnet pack` via command lines intended to be invoked by\n * `@semantic-release/exec` is impractical.\n * @param opts `dotnet pack` options. See `dotnet pack -h`,\n * https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack, and\n * {@link PackPackagesOptionsType}.\n * {@link opts['-GetItem']} will _always_ have '_OutputPackItems'.\n * @param [usePerSourceSubfolder] If `true`, modify the output path to\n * include a subfolder bearing a path-safe encoding of the NuGet Source that\n * will receive the nupkg.\n * @param [usePerPackageIdSubfolder] If `true`, modify the output path\n * to include a subfolder named after the the PackageId.\n * @returns a string[] containing the full file paths of all new packages i.e.\n * .nupkg, .symbols.nupkg, .snupkg\n */\n // @ts-expect-error Todo: publicize to dismiss this \"unused\" error.\n private async _PackPackages(\n opts: typeof NRI.PackPackagesOptionsType.inferIn,\n usePerSourceSubfolder = false,\n usePerPackageIdSubfolder = false,\n ): Promise<string[]> {\n opts['-GetItem'] = [...opts['-GetItem'] ?? [], key_OutputPackItems];\n\n const packCmd = this.GetPackCommand(\n opts,\n usePerSourceSubfolder,\n usePerPackageIdSubfolder,\n );\n let packOutput: undefined | { stdout: string; stderr: string } = undefined;\n while (packOutput === undefined) {\n packOutput = await setTimeout(\n 1000,\n execAsync(packCmd, true),\n )\n .then(async p => await p)\n .catch<undefined>(catchEBUSY);\n }\n // may include .snupkg\n const nupkgFullPaths: string[] | undefined = new MSBuildEvaluationOutput(packOutput.stdout)\n .Items\n ?.[key_OutputPackItems]\n ?.filter(item => item.Extension !== '.nuspec')\n .map(item => item.FullPath);\n return nupkgFullPaths ?? [];\n }\n\n /**\n * Create a dummy package for the current {@link project} by executing a\n * command line like \\``dotnet pack ${this.project.Properties.MSBuildProjectFullPath} -p:Version=0.0.1-DUMMY -output ${getDummiesDir(this._project)}/${GetNameForURL(this.source)}`\\`\n * @param opts Options passed to\n * `dotnet pack`, excluding the required `<PROJECT | SOLUTION>` argument.\n * - The `output` field is ignored and overwritten. It is replaced with\n * ${{@link getDummiesDir}({@link project})}/${{@link GetDirNameForSource}({@link source})}\n * - The `output` path will be affixed with a folder named after this\n * {@link NugetRegistryInfo#source}, but will not include a subfolder for the\n * {@link NugetRegistryInfo#project NugetRegistryInfo.project}.{@link MSBuildProject#Properties Properties}.{@link MSBuildProject#Properties#PackageId PackageId}.\n * @returns the full paths of all nupkg, symbols.nupkg, and snupkg files\n * created by the Pack target, as extracted from the dotnet process's STDOUT.\n * If mixed with other nupkgs, filter for the {@link NugetProjectProperties#PackageId}\n */\n public async PackDummyPackage(\n opts: typeof NRI.PackDummyPackagesOptionsType.inferIn,\n ): Promise<string[]> {\n const packCmd: string = this.GetPackCommand(\n {\n ...opts,\n output: getDummiesDir(this._project),\n propertyOverrides: { ...opts.propertyOverrides, Version: '0.0.1-DUMMY', UpdateVersionProperties: 'false' },\n '-GetItem': [...opts['-GetItem'] ?? [], key_OutputPackItems],\n },\n true,\n );\n\n let packOutput: undefined | { stdout: string; stderr: string } = undefined;\n while (packOutput === undefined) {\n packOutput = await setTimeout(\n 1000,\n execAsync(packCmd, true),\n )\n .then(async p => await p)\n .catch<undefined>(catchEBUSY);\n }\n // may include .snupkg\n const nupkgFullPaths: string[] | undefined = new MSBuildEvaluationOutput(packOutput.stdout)\n .Items\n ?.[key_OutputPackItems]\n ?.filter(item => item.Extension !== '.nuspec')\n .map(item => item.FullPath);\n return nupkgFullPaths ?? [];\n }\n\n // #endregion Pack\n // #region Push\n\n /**\n * Also includes required argument 'ROOT': the directory in which packages\n * should be present and ready to be pushed the default or specified Source.\n * The ROOT may also include wildcards e.g. `*.nupkg`, `**\\\\*.nupkg`\n * See https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-push\n *\n * Specific to this API:\n * If you want to use this API's default root value (\\`${cwd()}/publish`), assign an empty string.\n */\n static readonly PushPackagesOptionsType: Type<{\n root: string;\n apiKey?: string | undefined;\n configFile?: string | undefined;\n disableBuffering?: boolean | undefined;\n forceEnglishOutput?: boolean | undefined;\n interactive?: boolean | undefined;\n noServiceEndpoint?: boolean | undefined;\n noSymbols?: boolean | undefined;\n skipDuplicate?: boolean | undefined;\n source?: string | undefined;\n symbolApiKey?: string | undefined;\n symbolSource?: string | undefined;\n timeout?: number | undefined;\n }> = Object.freeze(\n type({\n /** If an empty string is passed, this property is overridden to `./publish` */\n root: 'string',\n /** The API key for the server. NOTE: if `undefined` or an empty string, the `dotnet nuget` client will lookup credentials set via `dotnet nuget {add|update} source`. */\n 'apiKey?': 'string',\n /** The NuGet configuration file (nuget.config) to use. If specified, only the settings from this file will be used. If not specified, the hierarchy of configuration files from the current directory will be used. For more information, see {@link https://learn.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior Common NuGet Configurations}. */\n 'configFile?': 'string',\n /** Disables buffering when pushing to an HTTP(S) server to reduce memory usage. */\n 'disableBuffering?': 'boolean',\n /** Forces the application to run using an invariant, English-based culture. */\n 'forceEnglishOutput?': 'boolean',\n /** Allows the command to stop and wait for user input or action. For example, to complete authentication. Available since .NET Core 3.0 SDK. */\n 'interactive?': 'boolean',\n /** Doesn't append \"api/v2/package\" to the source URL. */\n 'noServiceEndpoint?': 'boolean',\n 'noSymbols?': 'boolean',\n /** When pushing multiple packages to an HTTP(S) server, treats any 409 Conflict response as a warning so that other pushes can continue. */\n 'skipDuplicate?': 'boolean',\n /**\n * Specifies the server URL. NuGet identifies a UNC or local folder source and simply copies the file there instead of pushing it using HTTP.\n *\n * ### Important\n * > Starting with NuGet 3.4.2, this is a mandatory parameter unless the NuGet config file specifies a `DefaultPushSource` value. For more information, see {@link https://learn.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior Configuring NuGet behavior}.\n */\n 'source?': 'string',\n /** The API key for the symbol server. NOTE: if `undefined`, the `dotnet nuget` client will lookup credentials set via `dotnet nuget {add|update} source`.` */\n 'symbolApiKey?': 'string',\n /** Specifies the symbol server URL. */\n 'symbolSource?': 'string',\n /** Specifies the timeout for pushing to a server in seconds. Defaults to 300 seconds (5 minutes). Specifying 0 applies the default value. */\n 'timeout?': 'number',\n }),\n );\n\n /**\n * {@link NRI.PushPackagesOptionsType} sans {@link NRI.PushPackagesOptionsType.t.root}.\n * The result of {@link getDummiesDir} is used, instead.\n */\n public static readonly PushDummyPackagesOptionsType: Type<{\n apiKey?: string | undefined;\n configFile?: string | undefined;\n disableBuffering?: boolean | undefined;\n forceEnglishOutput?: boolean | undefined;\n interactive?: boolean | undefined;\n noServiceEndpoint?: boolean | undefined;\n noSymbols?: boolean | undefined;\n source?: string | undefined;\n symbolApiKey?: string | undefined;\n symbolSource?: string | undefined;\n timeout?: number | undefined;\n skipDuplicate: Default<true, true>;\n }>\n = NugetRegistryInfo.PushPackagesOptionsType.merge({\n skipDuplicate: 'true = true',\n }).omit('root');\n\n /**\n * Create a `dotnet nuget push` command line from the given options and\n * optional boolean parameters.\n * @param opts See {@link PushPackagesOptionsType}\n * @param usePerSourceSubfolder If `true`, the NuGet Source name or URL is formatted\n * to a folder name and appended to the ROOT as a subfolder. Do not use\n * wildcards in ROOT with this set to `true`!\n * @param usePerPackageIdSubfolder If `true`, the\n * {@link project}'s {@link NugetProjectProperties#PackageId}\n * is appended to the ROOT as a subfolder. Do not use wildcards in\n * ROOT with this set to `true`!\n * @returns A `dotnet nuget push` command line formatted with the\n * appropriate arguments.\n */\n GetPushCommand(\n opts: typeof NRI.PushPackagesOptionsType.inferIn,\n usePerSourceSubfolder = false,\n usePerPackageIdSubfolder = false,\n ): string {\n const validOpts = NRI.PushPackagesOptionsType.from(opts);\n type.boolean.assert(usePerSourceSubfolder);\n type.boolean.assert(usePerPackageIdSubfolder);\n\n validOpts.root = validOpts.root === '' ? `${cwd()}/publish` : validOpts.root;\n if (usePerSourceSubfolder)\n validOpts.root = node_path.join(validOpts.root, NugetRegistryInfo.GetDirNameForSource(this.source), node_path.sep);\n if (usePerPackageIdSubfolder)\n validOpts.root = node_path.join(validOpts.root, this._project.Properties.PackageId, node_path.sep);\n\n const packCmdArr: string[] = [\n 'dotnet',\n 'nuget',\n 'push',\n `\"${node_path.join(validOpts.root, '*.nupkg')}\"`,\n ];\n\n if (this.resolvedEnvVariable)\n validOpts.apiKey ??= NRI._GetTokenValue(this.resolvedEnvVariable);\n /**\n * If apiKey is an empty string, defer to the dotnet CLI's NuGet client\n * ability to lookup API keys saved via `dotnet nuget add source` or NuGet config\n * files.\n */\n if (validOpts.apiKey && validOpts.apiKey !== '')\n packCmdArr.push('--api-key', validOpts.apiKey);\n if (validOpts.configFile)\n packCmdArr.push('--configfile', validOpts.configFile);\n if (validOpts.disableBuffering === true)\n packCmdArr.push('--disable-buffering');\n if (validOpts.forceEnglishOutput === true)\n packCmdArr.push('--force-english-output');\n if (validOpts.interactive === true)\n packCmdArr.push('--interactive');\n if (validOpts.noServiceEndpoint === true)\n packCmdArr.push('--no-service-endpoint');\n if (validOpts.noSymbols === true)\n packCmdArr.push('--no-symbols');\n if (validOpts.skipDuplicate === true)\n packCmdArr.push('--skip-duplicate');\n validOpts.source ??= this.source;\n packCmdArr.push('--source', validOpts.source);\n if (validOpts.symbolApiKey !== undefined)\n packCmdArr.push('--symbol-api-key', validOpts.symbolApiKey);\n if (validOpts.symbolSource !== undefined)\n packCmdArr.push('--symbol-source', validOpts.symbolSource);\n if (validOpts.timeout !== undefined)\n packCmdArr.push('--timeout', validOpts.timeout.toString());\n\n return packCmdArr.join(' ');\n }\n\n /**\n * Immediately push packages. The input path may be modified according to the\n * {@link usePerSourceSubfolder} and {@link usePerPackageIdSubfolder}\n * arguments.\n * @param opts The `dotnet nuget push` command line options, including the\n * ROOT argument, the directory containing local nuget packages ready to be\n * pushed.\n * @param usePerSourceSubfolder If `true`, the NuGet Source name or URL is formatted\n * to a folder name and appended to the ROOT as a subfolder. Do not use\n * wildcards in ROOT with this set to `true`!\n * @param usePerPackageIdSubfolder If `true`, the current {@link project}'s\n * PackageId is appended to the ROOT as a subfolder. Do not use wildcards in\n * ROOT with this set to `true`!\n */\n // @ts-expect-error Todo: publicize to dismiss this \"unused\" error.\n private async _PushPackages(\n opts: typeof NRI.PushPackagesOptionsType.inferIn,\n usePerSourceSubfolder = false,\n usePerPackageIdSubfolder = false,\n ) {\n // const pushOutput =\n await execAsync(\n this.GetPushCommand(\n opts,\n usePerSourceSubfolder,\n usePerPackageIdSubfolder,\n ),\n true,\n ).catch((error: unknown) => {\n const _error: Error = isError(error) ? error : new Error(JSON.stringify(error));\n throw opts.apiKey\n ? _censorTokenInError(_error, opts.apiKey)\n : _error;\n });\n }\n\n /**\n *\n * Get a `dotnet nuget push` command for pushing one or more nupkg/snupkg\n * files created by {@link GetPackCommand} or {@link _PackPackages}.\\\n * Like {@link PackDummyPackage}, the output/ROOT path will include a\n * folder named after this NRI instance's {@link NugetRegistryInfo#source},\n * but will not include a subfolder for the\n * {@link NugetRegistryInfo#project NugetRegistryInfo.project}.{@link MSBuildProject#Properties Properties}.{@link MSBuildProject#Properties#PackageId PackageId}\n * @example\n * ```ts\n * const packAndPushDummyCmd = [\n * nri.GetPackCommand(\n * NugetRegistryInfo.PackPackagesOptionsType.from({ root: '' }),\n * false,\n * false,\n * ),\n * nri.GetPushDummyPackageCommand(pushOpts, false, false),\n * ].join(' && ')\n * ```\n * @param opts options for `dotnet nuget push`. The following\n * fields are overwritten:\n * - root: getDummiesDir(this.project)\n * - skipDuplicates: true\n * @returns a `dotnet nuget push` command to push a dummy package\n * (created by executing {@link PackDummyPackage}) to {@link source}\n */\n GetPushDummyCommand(\n opts: typeof NRI.PushDummyPackagesOptionsType.inferIn,\n ): string {\n return this.GetPushCommand(\n {\n ...NRI.PushDummyPackagesOptionsType.from(opts),\n root: getDummiesDir(this._project),\n },\n true,\n );\n }\n\n /**\n * Call {@link GetPushDummyCommand} and immediately execute it.\n * @throws {Error} when the process exits with an error code indicating\n * failure i.e. the command line is invalid, the process fails to start,\n * the push fails, et cetera.\n * @param opts the ROOT arg and options for `dotnet nuget push`. The following\n * fields are overwritten:\n * - root: getDummiesDir(this.project)\n * - skipDuplicates: true\n * @returns The return type of {@link execAsync} i.e. a {@link Promise} resolving to `{ stdout: string; stderr: string }`.\n */\n private async _PushDummyPackages(\n opts: typeof NRI.PushDummyPackagesOptionsType.inferIn,\n ): ReturnType<typeof execAsync> {\n const pushCmd: string = this.GetPushDummyCommand(opts);\n return await execAsync(pushCmd, true)\n .catch((error: unknown) => {\n const _error: Error = isError(error) ? error : new Error(String(error));\n throw opts.apiKey\n ? _censorTokenInError(_error, opts.apiKey)\n : _error;\n });\n }\n\n // #endregion Push\n\n // if non-exact-match is needed, learn how to make a parameter-driven type.\n private static readonly _NugetSearchReturnTypes = {\n ExactMatch: {\n v2: type({\n version: '2',\n problems: 'unknown[]',\n searchResult: [\n {\n sourceName: 'string',\n packages: type({\n id: 'string',\n version: type.keywords.string.semver,\n }).array(),\n },\n ],\n }),\n },\n };\n\n private static readonly _ParseNugetSearchReturn = type(\n 'string.json.parse',\n ).to(this._NugetSearchReturnTypes.ExactMatch.v2);\n\n /**\n * !WARNING: this method requires the Nuget Source to be configured via `dotnet nuget add source` or `dotnet nuget update source`. `NUGET_TOKEN` works, but it may be vulnerable to supply chain attacks.\\\n * Call during the `prepare` step of a Semantic Release run.\\\n * Determine if the `nextVersion` generated during the `analyze` Semantic\n * Release step was already published to the NuGet {@link source}.\n * @param source The name or URI of the NuGet Source to search. If this API\n * endpoint does not support searches, the operation will fail. If this API\n * endpoint requires authentication (e.g. GitHub), it must be configured via\n * `dotnet nuget add source` or `dotnet nuget update source` before calling\n * this method.\n * @param packageId The ID of the NuGet package to search for.\n * @param nextVersion The nextVersion value generated by semantic-release's hidden [\"Create Git tag\" step](https://semantic-release.gitbook.io/semantic-release#:~:text=the%20last%20release.-,Create%20Git%20tag,-Create%20a%20Git).\n * @returns A promised boolean.\n * If the promise resolves to `true`, the semantic release run should be\n * cancelled immediately.\n * Otherwise, the release should proceed.\n * @todo utilize in custom plugin inserted at the beginning of `prepare`\n */\n static async IsNextVersionAlreadyPublished(\n source: string,\n packageId: string,\n nextVersion: string,\n ): Promise<boolean> {\n if (nextVersion === '')\n throw new Error('The value of nextVersion is empty');\n return await execAsync(\n `dotnet package search --format JSON --exact-match --source ${source} --prerelease ${packageId}`,\n true,\n )\n .then(stdPair => stdPair.stdout)\n .then(json => this._ParseNugetSearchReturn(json))\n .then(errsOrObj => errsOrObj instanceof type.errors ? errsOrObj.throw() : errsOrObj)\n .then(obj => obj.searchResult)\n .then(results => results[0].packages)\n .then(pkgs =>\n pkgs.find(p => p.version === type('string.semver').from(nextVersion)),\n )\n .then(pkg => pkg !== undefined);\n }\n\n /**\n * !WARNING: GITHUB_OUTPUT must be the full path to an environment file.\n * The plugin \"semantic-release-output-variables\" next-release-version\n *\n * !WARNING: NuGet Source API Key mus tbe configured via `dotnet nuget add source` or `dotnet nuget update source`.\n * Some Sources (e.g. GitHub) require authentication for package searches.\n *\n * # Authenticating NuGet Package Searches\n *\n * ## GitHub NuGet Registry authentication\n * - {@link https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry#authenticating-in-a-github-actions-workflow Authenticating in a GitHub Actions workflow}\n * - {@link https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry#authenticating-with-a-personal-access-token Authenticating with a personal access token}.\n * ## For GitLab NuGet Registry authentication, see\n * - {@link https://docs.gitlab.com/ee/user/packages/nuget_repository/#add-a-source-with-the-net-cli Add a source with the .NET CLI}\n * @returns a string containing a Node.JS command line invoking {@link ./IsNextVersionAlreadyPublished.cli.ts}\n * @see {@link ./IsNextVersionAlreadyPublished.cli.ts}, {@link ./IsNextVersionAlreadyPublished.cli.js}\n */\n GetIsNextVersionAlreadyPublishedCommand(): string {\n // if GITHUB_OUTPUT unset or its file does not exist, create it. ''\n getGithubOutputSync();\n // The script will run\n return `node ${node_path.join(import.meta.dirname, './IsNextVersionAlreadyPublished.cli.js')} --packageId ${this._project.Properties.PackageId} --source ${this.source}`;\n }\n\n /*\n * Copy https://github.com/joelharkes/nuget-push when we split off our dotnet\n * modules to a semantic-release plugin.\n */\n\n /*\n * If you want a deterministic nupkg, do so with a custom MSBuild target with\n * AfterTargets=\"Pack\" to restore and execute the dotnet tool \"Kuinox.NupkgDeterministicator\" .\n */\n}\n\n// shorthand/alias for NugetRegistryInfo\nconst NRI: typeof NugetRegistryInfo = NugetRegistryInfo;\n\n/**\n * The base type for {@link NRIOpts} and related types. Extend this type while\n * overriding member types via {@link NRIOptsBase.merge}\n */\nexport const NRIOptsBase: Type<{\n project: MSBuildProject | {\n readonly Items: Readonly<Required<MSBuildEvaluationOutput>['Items']>;\n readonly Properties: Readonly<NugetProjectProperties>;\n readonly Targets: readonly string[];\n readonly TargetResults: Required<MSBuildEvaluationOutput>['TargetResults'][];\n };\n source: string;\n tokenEnvVars: readonly string[];\n}> = type({\n /**\n * The environment variables whose values are tokens with permission to push a\n * package to the NuGet package registry. The array is iterated through until\n * one token is found. If none of the environment variables are defined,\n * {@link NugetRegistryInfo}'s constructor will throw an {@link Error}.\n */\n project: type\n .instanceOf(MSBuildProject)\n .or(type.instanceOf(MSBuildProject).readonly()),\n /**\n * A NuGet package registry's API endpoint URL -OR- the name assigned via the\n * client e.g. `dotnet nuget add source --name ${source} ${source's URL}`\n */\n source: type.string,\n /**\n * WARNING: If possible, set credentials via `dotnet nuget {add|update}\n * source` as recommended by Microsoft! This is more secure than exposing\n * credentials to the Node.JS runtime and all its loaded modules.\n *\n * The environment variables whose values are tokens with permission to push a\n * package to the NuGet package registry.The array is iterated through until\n * one token is found.If none of the environment variables are defined,\n * {@link NugetRegistryInfo}'s constructor will throw an {@link Error}.\n *\n * If none of these are defined in the `.env` or process environment variables (.vault.env is impractical in CI), the `--api-key/-k` argument is excluded from `dotnet nuget push` commands.\n * Instead, the NuGet client relies on credentials configured for the\n * given NuGet source. If the NuGet client does not find credentials saved for the\n * NuGet {@link NRIOptsBase.t.source source} and they are required, the command will fail.\n *\n * Use the `dotnet` CLI to configure credentials for existing NuGet sources\n * ({@link https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-update-source `dotnet nuget update source`})\n * -OR- configure credentials for non-default NuGet sources\n * ({@link https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-add-source `dotnet nuget add source`}).\\\n * Alternatively, use the `nuget.exe` CLI to add/update sources. See\n * {@link https://learn.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-sources `nuget sources` (NuGet CLI)}.\n *\n * The credentials will be validated during the `verifyConditions` step of Semantic Release.\n */\n tokenEnvVars: type.string.array().readonly(),\n});\n\n/**\n * The type of the parameter for {@link NugetRegistryInfo}'s constructor.\n */\nexport const NRIOpts: Type<{\n project: MSBuildProject | {\n readonly Items: Readonly<Required<MSBuildEvaluationOutput>['Items']>;\n readonly Properties: Readonly<NugetProjectProperties>;\n readonly Targets: readonly string[];\n readonly TargetResults: Required<MSBuildEvaluationOutput>['TargetResults'][];\n };\n tokenEnvVars: Default<readonly string[], readonly ['NUGET_TOKEN']>;\n source: Default<string, string>;\n}> = NRIOptsBase.merge({\n /**\n * Defaults to {@link NugetRegistryInfo.DefaultTokenEnvVars}\n * @see {@link NRIOptsBase.t.tokenEnvVars}\n */\n tokenEnvVars: NRIOptsBase.get('tokenEnvVars').default(\n () => NugetRegistryInfo.DefaultTokenEnvVars,\n ),\n /**\n * A NuGet package registry's API endpoint URL -OR- the name assigned to it\n * via your NuGet client.\n * @default 'https://api.nuget.org/v3/index.json' (name: 'nuget.org')\n * @see {@link NRIOptsBase.t.source}\n */\n source: NRIOptsBase.get('source').default(() => defaultNugetSource),\n});\n\n// #region token censorship\n\n/**\n * Replace all occurrences of {@link token} in the {@link string} with '***'.\n * @param string The string in which a {@link token} may be found.\n * @param token The NuGet API token you definitely don't want to leak!\n * @returns A modified copy of the {@link string} with all occurrences of the\n * {@link token} replaced with '***'.\n */\nfunction _censorToken(string: string, token: string): string {\n return string.replaceAll(token, '***');\n}\n\n/**\n * Censor all occurrences of an API {@link token} in an {@link error}.\n * @param error A {@link ExecException} in which the NuGet API {@link token} may be found.\n * @param token The value of the NuGet API token\n * @returns A modified copy of the provided exception sans any occurrence of the\n * NuGet API token.\n */\nfunction _censorTokenInError(error: ExecException, token: string): ExecException {\n return Object.assign(\n error,\n JSON.parse(\n _censorToken(\n JSON.stringify({\n ...error,\n message: error.message,\n stack: error.stack,\n }),\n token,\n ),\n ) as ExecException,\n );\n}\n\n// #endregion token censorship\n"],"mappings":";;;;;;;;;;;;;;;;AA2BA,MAAM,kBAAkB,UAAU,KAAK,QAAQ,EAAE,cAAc,QAAQ,UAAU;AACjF,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;;;;;;AAM5B,eAAsB,kBAAsE;CAC1F,IAAI,IAAI,qBAAqB,KAAA,KAAa,CAAC,WAAW,IAAI,iBAAiB,EAAE;EAC3E,MAAM,mBAA2B,UAAU,KAAK,QAAQ,EAAE,gBAAgB;EAC1E,IAAI,CAAC,WAAW,iBAAiB,EAC/B,MAAM,UAAU,kBAAkB,GAAG;EACvC,IAAI,mBAAmB;;CAGzB,MAAM,WAAW,MAAM,WAAW,IAAI,iBAAiB;CACvD,MAAM,YAAYA,OAAa;EAC7B,MAAM,IAAI;EACV,UAAU;EACV,UAAU,YAAY,KAAA;EACtB,YAAY,EAAE;EACf,CAAC;CAEF,IAAI,QAAQ,UAAU,MAAM,EAC1B,MAAM,UAAU;CAClB,OAAO,UAAU;;;;;;;AAQnB,SAAgB,sBAA8E;CAC5F,IAAI,IAAI,qBAAqB,KAAA,KAAa,CAAC,WAAW,IAAI,iBAAiB,EAAE;EAC3E,MAAM,mBAA2B,UAAU,KAAK,QAAQ,EAAE,gBAAgB;EAC1E,IAAI,CAAC,WAAW,iBAAiB,EAC/B,cAAc,kBAAkB,GAAG;EACrC,IAAI,mBAAmB;;CAGzB,MAAM,WAAW,eAAe,IAAI,iBAAiB;CACrD,MAAM,YAAYA,OAAa;EAC7B,MAAM,IAAI;EACV,UAAU;EACV,UAAU,YAAY,KAAA;EACtB,YAAY,EAAE;EACf,CAAC;CAGF,IAAI,WAAW,WACb,MAAM,UAAU;CAClB,OAAO,UAAU;;;;;;;;;;AAmBnB,SAAS,cAAgE,SAAyC;CAChH,QAAQ,MAAR;EACE,KAAK,YAAY,KAAA,GACf,OAAO,UAAU,KAAK,iBAAiB,UAAU,IAAI;EAIvD,KAAK,mBAAmB,gBACtB,OAAO,UAAU,KAAK,iBAAiB,QAAQ,WAAW,WAAW,UAAU,IAAI;EAIrF,SACE,MAAM,IAAI,MAAM,0EAA0E;;;;;;;;;;;AAahG,SAAS,sBAAsB,cAA0G;CACvI,MAAM,gBAAgB,OAAO,OAC3B,aACG,KAAK,QAAgB,CAAC,KAAK,eAAe,IAAI,CAAC,CAAU,CACzD,QAAQ,gBACP,YAAY,OAAO,KAAA,EACpB,CACJ;CAED,IAAI,cAAc,SAAS,GACzB,OAAO;;AAIX,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,2BAA8D,KAAA;CAC9D;CACA;CACA;CAEA,OAAuB,sBACnB,OAAO,OAAO,CAAC,cAAc,CAAU;;;;;;;;;;;;;;;CAgB3C,OAAO,oBAAoB,QAAwB;EACjD,OAAO,iBACL,OAAO,WAAW,kBAAkB,GAAG,EACvC,EAAE,aAAa,KAAK,CACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCH,YAAY,MAAiC;EAG3C,MAAM,YAAY,QAAQ,KAAK,KAAK;EACpC,KAAK,WAAW,UAAU;;;;;EAK1B,MAAM,YAAY,sBAAsB,UAAU,aAAa;EAC/D,IAAI,WACF,KAAK,uBAAuB,UAAU,GAAG;EAC3C,KAAK,UAAU,UAAU;;CAG3B,IAAW,UAA0B;EACnC,OAAO,KAAK;;;;;;;;;;;;;;;CAgBd,IAAW,0BAAyC;EAClD,IAAI,KAAK,6BAA6B,KAAA,GACpC,OAAO,KAAK;EAEd,IAAI;EACJ,IAAI,KAAK,wBAAwB,KAAA,GAC/B,aAAa,IAAI,eAAe,KAAK,oBAAoB;EAE3D,IAAI,YAAY,WAAW,cAAc,EAAE;GACzC,MAAM,SAAS,mDAAmD,OAAO,KAAK,oBAAoB,CAAC;GACnG,MAAM,MAAM,IAAI,MAAM,OAAO;GAC7B,OAAO,KAAK,2BAA2B,QAAQ,OAAO,IAAI;;EAG5D,OAAO,KAAK,2BAA2B,KAAK,iBAAiB,EAAE,CAAC,CAC7D,KAAK,YAAY,MAAM,KAAK,mBAAmB,EAC9C,QAAQ,YACT,CAAC,CAAC,CACF,MAAY,oBAAoB;GAC/B,GAAG,gBAAgB;GACnB,OAAO;IACP;;;;;;;CAQN,IAAI,sBAA0C;EAC5C,OAAO,KAAK;;CAGd,IAAI,SAAiB;EACnB,OAAO,KAAK;;;;;;;;;;CAWd,OAAe,eAAe,qBAAqC;EACjE,KAAK,OAAO,OAAO,oBAAoB;EAEvC,MAAM,aAAa,eAAe,oBAAoB;EACtD,IAAI,eAAe,KAAA,GACjB,MAAM,IAAI,MAAM;2BACK,oBAAoB;;qDAEM;EAEjD,OAAO;;;;;;;;CAWT,OAAgB,0BAoBX,OAAO,OACV,KAAK;;;;EAIH,sBAAsB,KAAK,wBAAwB;EACnD,kBAAkB;EAClB,kBAAkB;EAClB,wBAAwB;EACxB,UAAU;EACV,kBAAkB;EAClB,mBAAmB;EACnB,gBAAgB;EAChB,YAAY;EACZ,WAAW;EACX,cAAc;EACd,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,mBAAmB;EACnB,sBAAsB;EACtB,cAAc;EACd,kBAAkB;;;;;EAKlB,aAAa,KAAK,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,WAAW;EAC3D,CAAC,CACH;CAED,OAAuB,+BAoBnB,KAAK,wBAAwB,KAAK,SAAS;;;;;;;;;;;;;;;;;;;CAoB/C,eACE,MACA,wBAAwB,OACxB,2BAA2B,OACnB;EACR,MAAM,YAAY,IAAI,wBAAwB,KAAK,KAAK;EACxD,KAAK,QAAQ,OAAO,sBAAsB;EAC1C,KAAK,QAAQ,OAAO,yBAAyB;EAE7C,UAAU,WAAW,UAAU,KAAK,KAAK,EAAE,UAAU;EACrD,IAAI,uBACF,UAAU,SAAS,UAAU,KAAK,UAAU,QAAQ,kBAAkB,oBAAoB,KAAK,OAAO,EAAE,UAAU,IAAI;EACxH,IAAI,0BACF,UAAU,SAAS,UAAU,KAAK,UAAU,QAAQ,KAAK,SAAS,WAAW,WAAW,UAAU,IAAI;EAExG,MAAM,aAAuB;GAC3B;GACA;GACA,IAAI,KAAK,SAAS,WAAW,uBAAuB;GACrD;EACD,IAAI,UAAU,kBAAkB,KAAA,GAC9B,WAAW,KAAK,mBAAmB,IAAI,UAAU,cAAc,GAAG;EACpE,IAAI,UAAU,kBAAkB,KAAA,GAC9B,WAAW,KAAK,mBAAmB,UAAU,cAAc;EAC7D,IAAI,UAAU,wBAAwB,MACpC,WAAW,KAAK,0BAA0B;EAC5C,IAAI,UAAU,UAAU,MAAM,WAAW,KAAK,UAAU;EACxD,IAAI,UAAU,kBAAkB,MAAM,WAAW,KAAK,mBAAmB;EACzE,IAAI,UAAU,mBAAmB,MAAM,WAAW,KAAK,oBAAoB;EAC3E,IAAI,UAAU,gBAAgB,MAAM,WAAW,KAAK,gBAAgB;EACpE,IAAI,UAAU,YAAY,MAAM,WAAW,KAAK,aAAa;EAC7D,IAAI,UAAU,WAAW,MAAM,WAAW,KAAK,WAAW;EAC1D,IAAI,UAAU,cAAc,MAAM,WAAW,KAAK,eAAe;EACjE,IAAI,UAAU,YAAY,KAAA,GACxB,WAAW,KAAK,aAAa,UAAU,QAAQ;EACjD,IAAI,UAAU,gBAAgB,MAAM,WAAW,KAAK,gBAAgB;EACpE,IAAI,UAAU,mBAAmB,KAAA,GAC/B,WAAW,KAAK,QAAQ,UAAU,eAAe;EACnD,IAAI,UAAU,sBAAsB,MAClC,WAAW,KAAK,wBAAwB;EAC1C,IAAI,UAAU,cAAc,KAAA,GAC1B,WAAW,KAAK,eAAe,UAAU,UAAU;EACrD,IAAI,UAAU,kBAAkB,KAAA,GAC9B,WAAW,KAAK,oBAAoB,UAAU,cAAc;;;;;EAK9D,IAAI,UAAU,mBAAmB;;GAE/B,MAAM,cAAsB,QAAQ,OAAO,QAAQ,UAAU,kBAAkB,CAC5E,KAAI,MAAK,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI;GACxC,WAAW,KAAK,IAAI,YAAY,GAAG;;EAErC,IAAI,UAAU,eAAe,UAAU,YAAY,SAAS,GAE1D,WAAW,KAAK,YAAY,UAAU,YAAY,KAAK,IAAI,GAAG;EAGhE,WAAW,KAAK,MAAM,IAAI,UAAU,OAAO,GAAG;EAE9C,OAAO,WAAW,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;CA0B7B,MAAc,cACZ,MACA,wBAAwB,OACxB,2BAA2B,OACR;EACnB,KAAK,cAAc,CAAC,GAAG,KAAK,eAAe,EAAE,EAAE,oBAAoB;EAEnE,MAAM,UAAU,KAAK,eACnB,MACA,uBACA,yBACD;EACD,IAAI,aAA6D,KAAA;EACjE,OAAO,eAAe,KAAA,GACpB,aAAa,MAAM,WACjB,KACA,UAAU,SAAS,KAAK,CACzB,CACE,KAAK,OAAM,MAAK,MAAM,EAAE,CACxB,MAAiB,WAAW;EAQjC,OAL6C,IAAI,wBAAwB,WAAW,OAAO,CACxF,QACE,sBACD,QAAO,SAAQ,KAAK,cAAc,UAAU,CAC7C,KAAI,SAAQ,KAAK,SAAS,IACJ,EAAE;;;;;;;;;;;;;;;;CAiB7B,MAAa,iBACX,MACmB;EACnB,MAAM,UAAkB,KAAK,eAC3B;GACE,GAAG;GACH,QAAQ,cAAc,KAAK,SAAS;GACpC,mBAAmB;IAAE,GAAG,KAAK;IAAmB,SAAS;IAAe,yBAAyB;IAAS;GAC1G,YAAY,CAAC,GAAG,KAAK,eAAe,EAAE,EAAE,oBAAoB;GAC7D,EACD,KACD;EAED,IAAI,aAA6D,KAAA;EACjE,OAAO,eAAe,KAAA,GACpB,aAAa,MAAM,WACjB,KACA,UAAU,SAAS,KAAK,CACzB,CACE,KAAK,OAAM,MAAK,MAAM,EAAE,CACxB,MAAiB,WAAW;EAQjC,OAL6C,IAAI,wBAAwB,WAAW,OAAO,CACxF,QACE,sBACD,QAAO,SAAQ,KAAK,cAAc,UAAU,CAC7C,KAAI,SAAQ,KAAK,SAAS,IACJ,EAAE;;;;;;;;;;;CAe7B,OAAgB,0BAcX,OAAO,OACV,KAAK;;EAEH,MAAM;;EAEN,WAAW;;EAEX,eAAe;;EAEf,qBAAqB;;EAErB,uBAAuB;;EAEvB,gBAAgB;;EAEhB,sBAAsB;EACtB,cAAc;;EAEd,kBAAkB;;;;;;;EAOlB,WAAW;;EAEX,iBAAiB;;EAEjB,iBAAiB;;EAEjB,YAAY;EACb,CAAC,CACH;;;;;CAMD,OAAuB,+BAcnB,kBAAkB,wBAAwB,MAAM,EAChD,eAAe,eAChB,CAAC,CAAC,KAAK,OAAO;;;;;;;;;;;;;;;CAgBjB,eACE,MACA,wBAAwB,OACxB,2BAA2B,OACnB;EACR,MAAM,YAAY,IAAI,wBAAwB,KAAK,KAAK;EACxD,KAAK,QAAQ,OAAO,sBAAsB;EAC1C,KAAK,QAAQ,OAAO,yBAAyB;EAE7C,UAAU,OAAO,UAAU,SAAS,KAAK,GAAG,KAAK,CAAC,YAAY,UAAU;EACxE,IAAI,uBACF,UAAU,OAAO,UAAU,KAAK,UAAU,MAAM,kBAAkB,oBAAoB,KAAK,OAAO,EAAE,UAAU,IAAI;EACpH,IAAI,0BACF,UAAU,OAAO,UAAU,KAAK,UAAU,MAAM,KAAK,SAAS,WAAW,WAAW,UAAU,IAAI;EAEpG,MAAM,aAAuB;GAC3B;GACA;GACA;GACA,IAAI,UAAU,KAAK,UAAU,MAAM,UAAU,CAAC;GAC/C;EAED,IAAI,KAAK,qBACP,UAAU,WAAW,IAAI,eAAe,KAAK,oBAAoB;;;;;;EAMnE,IAAI,UAAU,UAAU,UAAU,WAAW,IAC3C,WAAW,KAAK,aAAa,UAAU,OAAO;EAChD,IAAI,UAAU,YACZ,WAAW,KAAK,gBAAgB,UAAU,WAAW;EACvD,IAAI,UAAU,qBAAqB,MACjC,WAAW,KAAK,sBAAsB;EACxC,IAAI,UAAU,uBAAuB,MACnC,WAAW,KAAK,yBAAyB;EAC3C,IAAI,UAAU,gBAAgB,MAC5B,WAAW,KAAK,gBAAgB;EAClC,IAAI,UAAU,sBAAsB,MAClC,WAAW,KAAK,wBAAwB;EAC1C,IAAI,UAAU,cAAc,MAC1B,WAAW,KAAK,eAAe;EACjC,IAAI,UAAU,kBAAkB,MAC9B,WAAW,KAAK,mBAAmB;EACrC,UAAU,WAAW,KAAK;EAC1B,WAAW,KAAK,YAAY,UAAU,OAAO;EAC7C,IAAI,UAAU,iBAAiB,KAAA,GAC7B,WAAW,KAAK,oBAAoB,UAAU,aAAa;EAC7D,IAAI,UAAU,iBAAiB,KAAA,GAC7B,WAAW,KAAK,mBAAmB,UAAU,aAAa;EAC5D,IAAI,UAAU,YAAY,KAAA,GACxB,WAAW,KAAK,aAAa,UAAU,QAAQ,UAAU,CAAC;EAE5D,OAAO,WAAW,KAAK,IAAI;;;;;;;;;;;;;;;;CAkB7B,MAAc,cACZ,MACA,wBAAwB,OACxB,2BAA2B,OAC3B;EAEA,MAAM,UACJ,KAAK,eACH,MACA,uBACA,yBACD,EACD,KACD,CAAC,OAAO,UAAmB;GAC1B,MAAM,SAAgB,QAAQ,MAAM,GAAG,QAAQ,IAAI,MAAM,KAAK,UAAU,MAAM,CAAC;GAC/E,MAAM,KAAK,SACP,oBAAoB,QAAQ,KAAK,OAAO,GACxC;IACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BJ,oBACE,MACQ;EACR,OAAO,KAAK,eACV;GACE,GAAG,IAAI,6BAA6B,KAAK,KAAK;GAC9C,MAAM,cAAc,KAAK,SAAS;GACnC,EACD,KACD;;;;;;;;;;;;;CAcH,MAAc,mBACZ,MAC8B;EAE9B,OAAO,MAAM,UADW,KAAK,oBAAoB,KACnB,EAAE,KAAK,CAClC,OAAO,UAAmB;GACzB,MAAM,SAAgB,QAAQ,MAAM,GAAG,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;GACvE,MAAM,KAAK,SACP,oBAAoB,QAAQ,KAAK,OAAO,GACxC;IACJ;;CAMN,OAAwB,0BAA0B,EAChD,YAAY,EACV,IAAI,KAAK;EACP,SAAS;EACT,UAAU;EACV,cAAc,CACZ;GACE,YAAY;GACZ,UAAU,KAAK;IACb,IAAI;IACJ,SAAS,KAAK,SAAS,OAAO;IAC/B,CAAC,CAAC,OAAO;GACX,CACF;EACF,CAAC,EACH,EACF;CAED,OAAwB,0BAA0B,KAChD,oBACD,CAAC,GAAG,KAAK,wBAAwB,WAAW,GAAG;;;;;;;;;;;;;;;;;;;CAoBhD,aAAa,8BACX,QACA,WACA,aACkB;EAClB,IAAI,gBAAgB,IAClB,MAAM,IAAI,MAAM,oCAAoC;EACtD,OAAO,MAAM,UACX,8DAA8D,OAAO,gBAAgB,aACrF,KACD,CACE,MAAK,YAAW,QAAQ,OAAO,CAC/B,MAAK,SAAQ,KAAK,wBAAwB,KAAK,CAAC,CAChD,MAAK,cAAa,qBAAqB,KAAK,SAAS,UAAU,OAAO,GAAG,UAAU,CACnF,MAAK,QAAO,IAAI,aAAa,CAC7B,MAAK,YAAW,QAAQ,GAAG,SAAS,CACpC,MAAK,SACJ,KAAK,MAAK,MAAK,EAAE,YAAY,KAAK,gBAAgB,CAAC,KAAK,YAAY,CAAC,CACtE,CACA,MAAK,QAAO,QAAQ,KAAA,EAAU;;;;;;;;;;;;;;;;;;;CAoBnC,0CAAkD;EAEhD,qBAAqB;EAErB,OAAO,QAAQ,UAAU,KAAK,OAAO,KAAK,SAAS,yCAAyC,CAAC,eAAe,KAAK,SAAS,WAAW,UAAU,YAAY,KAAK;;;AAepK,MAAM,MAAgC;;;;;AAMtC,MAAa,cASR,KAAK;;;;;;;CAOR,SAAS,KACN,WAAW,eAAe,CAC1B,GAAG,KAAK,WAAW,eAAe,CAAC,UAAU,CAAC;;;;;CAKjD,QAAQ,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,cAAc,KAAK,OAAO,OAAO,CAAC,UAAU;CAC7C,CAAC;;;;AAKF,MAAa,UASR,YAAY,MAAM;;;;;CAKrB,cAAc,YAAY,IAAI,eAAe,CAAC,cACtC,kBAAkB,oBACzB;;;;;;;CAOD,QAAQ,YAAY,IAAI,SAAS,CAAC,cAAc,mBAAmB;CACpE,CAAC;;;;;;;;AAWF,SAAS,aAAa,QAAgB,OAAuB;CAC3D,OAAO,OAAO,WAAW,OAAO,MAAM;;;;;;;;;AAUxC,SAAS,oBAAoB,OAAsB,OAA8B;CAC/E,OAAO,OAAO,OACZ,OACA,KAAK,MACH,aACE,KAAK,UAAU;EACb,GAAG;EACH,SAAS,MAAM;EACf,OAAO,MAAM;EACd,CAAC,EACF,MACD,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"NugetRegistryInfo.mjs","names":["configDotenv","getEnvironmentVariableValue"],"sources":["../../src/dotnet/NugetRegistryInfo.ts"],"sourcesContent":["/* JSDoc Types */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { SemanticReleaseConfigDotnet as _srcd } from '../semanticReleaseConfigDotnet.ts';\nimport type { NugetProjectProperties } from './NugetProjectProperties.ts';\n/* eslint-enable @typescript-eslint/no-unused-vars */\n\nimport { config as configDotenv } from '@dotenvx/dotenvx';\nimport { type, type Type } from 'arktype';\nimport { detectFile, detectFileSync } from 'chardet';\nimport { ok } from 'node:assert/strict';\nimport type { ExecException } from 'node:child_process';\nimport { existsSync, writeFileSync } from 'node:fs';\nimport { writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\n// eslint-disable-next-line unicorn/import-style\nimport * as node_path from 'node:path';\nimport { cwd, env } from 'node:process';\nimport { setTimeout } from 'node:timers/promises';\nimport { isError } from '../utils/isError.ts';\nimport sanitizeFileName from 'sanitize-filename';\nimport { getEnvVarValue as getEnvironmentVariableValue } from '../utils/env.ts';\nimport { execAsync } from '../utils/execAsync.ts';\nimport { catchEBUSY, MSBuildEvaluationOutput, MSBuildProject } from './MSBuildProject.ts';\nimport type { Default } from 'arktype/internal/attributes.ts';\n\ntype TemporaryDirectoryNamespace_Unix = `${ReturnType<typeof tmpdir>}/HCE.Shared/.NET/Dummies`;\ntype TemporaryDirectoryNamespace_Win = `${ReturnType<typeof tmpdir>}\\\\HCE.Shared\\\\.NET\\\\Dummies`;\nconst temporaryDirectoryNamespace = node_path.join(tmpdir(), 'HCE.Shared', '.NET', 'Dummies') as TemporaryDirectoryNamespace_Unix | TemporaryDirectoryNamespace_Win;\nconst defaultNugetSource = 'https://api.nuget.org/v3/index.json';\nconst key_OutputPackItems = '_OutputPackItems';\n/**\n * Read the contents of $GITHUB_OUTPUT (if its value is a file path) or $TEMP/GITHUB_OUTPUT.\n * If the file doesn't exist, it is created.\n * @returns If successful, a promised object with a parsed key.\n */\nexport async function getGithubOutput(): Promise<ReturnType<typeof configDotenv>['parsed']> {\n if (env['GITHUB_OUTPUT'] === undefined || !existsSync(env['GITHUB_OUTPUT'])) {\n const githubOutputPath: string = node_path.join(tmpdir(), 'GITHUB_OUTPUT');\n if (!existsSync(githubOutputPath))\n await writeFile(githubOutputPath, '');\n env['GITHUB_OUTPUT'] = githubOutputPath;\n }\n\n const encoding = await detectFile(env['GITHUB_OUTPUT']);\n const environmentOutput = configDotenv({\n path: env['GITHUB_OUTPUT'],\n override: true,\n encoding: encoding ?? undefined,\n processEnv: {},\n });\n\n if (isError(environmentOutput.error))\n throw environmentOutput.error;\n return environmentOutput.parsed;\n}\n\n/**\n * Read the contents of $GITHUB_OUTPUT (if its value is a file path) or $TEMP/GITHUB_OUTPUT.\n * If the file doesn't exist, it is created.\n * @returns An object with a parsed key if successful.\n */\nexport function getGithubOutputSync(): NonNullable<ReturnType<typeof configDotenv>['parsed']> {\n if (env['GITHUB_OUTPUT'] === undefined || !existsSync(env['GITHUB_OUTPUT'])) {\n const githubOutputPath: string = node_path.join(tmpdir(), 'GITHUB_OUTPUT');\n if (!existsSync(githubOutputPath))\n writeFileSync(githubOutputPath, '');\n env['GITHUB_OUTPUT'] = githubOutputPath;\n }\n\n const encoding = detectFileSync(env['GITHUB_OUTPUT']);\n const environmentOutput = configDotenv({\n path: env['GITHUB_OUTPUT'],\n override: true,\n encoding: encoding ?? undefined,\n processEnv: {},\n }) as { error: Error }\n | { parsed: NonNullable<ReturnType<typeof configDotenv>['parsed']> };\n\n if ('error' in environmentOutput)\n throw environmentOutput.error;\n return environmentOutput.parsed;\n}\n\ntype DummiesDirectory<T> = T extends undefined\n ? `${TemporaryDirectoryNamespace_Unix}/` | `${TemporaryDirectoryNamespace_Win}\\\\`\n : T extends MSBuildProject\n ? `${TemporaryDirectoryNamespace_Unix}/${T['Properties']['PackageId']}/` | `${TemporaryDirectoryNamespace_Win}\\\\${T['Properties']['PackageId']}\\\\`\n : never;\n\nfunction getDummiesDirectory<T extends MSBuildProject | undefined = undefined>(project?: T): DummiesDirectory<T>;\nfunction getDummiesDirectory<T extends MSBuildProject>(project: T): DummiesDirectory<T>;\n/**\n * Get HCE.Shared's temporary directory for .NET projects' dummy packages.\n * @param project The MSBuild project whose PackageId will be used to create a\n * directory for its dummy packages.\n * @returns a platform-specific path like\n * `${tmpdir()}/HCE.Shared/.NET/Dummies/${project.Properties.PackageId}` if\n * {@link project} is defined. Else `${tmpdir()}/HCE.Shared/.NET/Dummies`\n */\nfunction getDummiesDirectory<T extends MSBuildProject | undefined = undefined>(project?: T): DummiesDirectory<typeof project> {\n switch (true) {\n case project === undefined: {\n return node_path.join(temporaryDirectoryNamespace, node_path.sep) as\n DummiesDirectory<typeof project> satisfies\n ReturnType<typeof getDummiesDirectory>;\n }\n case project instanceof MSBuildProject: {\n return node_path.join(temporaryDirectoryNamespace, project.Properties.PackageId, node_path.sep) as\n DummiesDirectory<typeof project> satisfies\n ReturnType<typeof getDummiesDirectory<MSBuildProject>>;\n }\n default: {\n throw new Error('The type of argument `project` must be `undefined` or `MSBuildProject`.');\n }\n }\n}\n\n/**\n * Get the environment variables as key-value pairs.\n * @param tokenEnvironmentVariables The name of the environment variables whose values are\n * NuGet API keys.\n * @returns an array of key-value pairs of the given environment variables and\n * their values, filtered to only those whose values are not undefined.\n * @throws {Error} when none of the provided environment variables are defined.\n */\nfunction _GetTokenEnvironmentVariables(tokenEnvironmentVariables: readonly string[]): undefined | [readonly [string, string], ...readonly [string, string][]] {\n const definedTokens = Object.freeze(\n tokenEnvironmentVariables\n .map((key: string) => [key, getEnvironmentVariableValue(key)] as const)\n .filter((environmentVariableTuple: readonly [string, string | undefined]): environmentVariableTuple is [string, string] =>\n environmentVariableTuple[1] !== undefined,\n ),\n );\n\n if (definedTokens.length > 0)\n return definedTokens as [readonly [string, string], ...readonly [string, string][]];\n return undefined;\n}\n\nexport class NugetRegistryInfo {\n public static readonly DefaultTokenEnvVars: readonly ['NUGET_TOKEN']\n = Object.freeze(['NUGET_TOKEN'] as const);\n\n /**\n * Get the API token from {@link NugetRegistryInfo#resolvedEnvVariable}\n * @param resolvedEnvironmentVariable The name of the environment variable(s) whose\n * value is a NuGet API key. Typically, the value of\n * {@link NugetRegistryInfo#resolvedEnvVariable}.\n * @returns The value of the first defined environment variable.\n * @throws {Error} when none of the provided environment variables are defined.\n */\n private static _GetTokenValue(resolvedEnvironmentVariable: string): string {\n type.string.assert(resolvedEnvironmentVariable);\n\n const tokenValue = getEnvironmentVariableValue(resolvedEnvironmentVariable);\n if (tokenValue === undefined) {\n throw new Error(`\\\nThe environment variable ${resolvedEnvironmentVariable} was specified \\\nas the source of the token to push a NuGet package, \\\nbut the environment variable is empty or undefined.`);\n }\n return tokenValue;\n }\n\n /**\n * Convert a URL string to a filesystem folder name.\n *\n * Intended usage: modify the output path of `dotnet pack` based on the NuGet\n * Source the package should be pushed to. This is extra work is usually\n * unnecessary and you'd typically push the same file to multiple sources.\n * This is for the edge-case scenario of creating multiple nupkgs and signing\n * each one with a different certificate corresponding to a given NuGet\n * Source. This is only useful if the Sources have different certificates\n * registered for a given package/user/organization.\n * @param source The URL of the NuGet Source\n * @returns A string suitable for a local filesystem folder name, formatted as\n * `${hostname}_${pathname.replace('/', '_')}`.\n */\n static GetDirNameForSource(source: string): string {\n return sanitizeFileName(\n source.replaceAll(/\\/index.json$/g, ''),\n { replacement: '_' },\n );\n }\n\n private _canPushPackagesToSource: Promise<true> | undefined = undefined;\n private readonly _project: MSBuildProject;\n private readonly _resolvedEnvVariable: string | undefined;\n private readonly _source: string;\n\n /**\n * Creates an instance of NugetRegistryInfo.\\\n * This class enables the ability to push a given {@link project}'s\n * package(s) to the {@link source} of a given NuGet Source's API endpoint with\n * a user-defined API key. This API key, herein referred to as a \"token\", is\n * derived from the {@link tokenEnvVars} array. This array is iterated through\n * until one of the items is discovered to be an existing environment variable\n * (or is defined in a file named '.env' in the current working directory for\n * LOCAL TESTING ONLY! Do NOT `git add` your private keys!).\n * \\\n * WARNING:\n * - The token value is stored privately within this class, but it is plain text.\n * - This private key may be copied to command line strings stored in Semantic\n * Release's config object for later use by `@semantic-release/exec`.\n * - Other EcmaScript modules can access the environment variable(s) and steal\n * your key. Be aware of malicious dependencies!\n * @param options The input type of {@link NRIOpts.from}\n * @param options.project The project whose package(s) will be\n * pushed.\\\n * - Its {@link NugetProjectProperties#PackageId} will be read.\\\n * - Its {@link NugetProjectProperties#PackageVersion} will be overridden via CLI args when creating a dummy package. The real package's\n * `PackageVersion` will *not* be overridden.\n * @param [options.tokenEnvVars] The environment variables\n * whose values are tokens with permission to push a package to the NuGet\n * package registry. The array is iterated through until one token is found.\n * If none of the environment variables are defined, this constructor will\n * throw an {@link Error}.\n * @param [options.source] A NuGet package registry's API endpoint URL or name. Default: 'https://api.nuget.org/v3/index.json'\n */\n constructor(options: typeof NRIOpts['inferIn']) {\n // note: you can reassign `options` only when typeof `inferOut` is assignable\n // to typeof `inferIn`.\n const validOptions = NRIOpts.from(options);\n this._project = validOptions.project;\n /**\n * May throw! Assign key of the first key-value pair to\n * {@link resolvedEnvVariable}\n */\n const tokenVariables = _GetTokenEnvironmentVariables(validOptions.tokenEnvVars);\n if (tokenVariables)\n this._resolvedEnvVariable = tokenVariables[0][0];\n this._source = validOptions.source;\n }\n\n public get project(): MSBuildProject {\n return this._project;\n }\n\n /**\n * This is not useful without it being executed as part of a Semantic Release\n * plugin. Deferring this to `@semantic-release/exec`'s prepareCmd is possible,\n * but impractical. You'd need to configure prepareCmd to invoke something\n * like `node customScriptFile.mjs`. It's not worth the hassle.\n * @returns `true` if the token can be used to push nupkg to the given Nuget registry\n * @throws {TypeError | Error | import('../utils/execAsync.js').ChildProcessSpawnException }\n * - {@link Error} | {@link module:utils/execAsync:ChildProcessSpawnException ChildProcessSpawnException}\n * - The token is invalid, of the wrong token type, or lacks permission to push packages\n * - The URL does not exist or a connection could not be established\n * - The command line string is malformed.\n * @deprecated Call during the `verifyConditions` step of Semantic Release! Additionally, {@link GetIsNextVersionAlreadyPublishedCommand}'s return value should be assigned to `prepareCmd` to prevent package version collision errors.\n */\n public get canPushPackagesToSource(): Promise<true> {\n if (this._canPushPackagesToSource !== undefined)\n return this._canPushPackagesToSource;\n\n let tokenValue: string | undefined;\n if (this.resolvedEnvVariable !== undefined)\n tokenValue = NRI._GetTokenValue(this.resolvedEnvVariable);\n\n if (tokenValue?.startsWith('github_pat_')) {\n const errorMessage = `The value of the token in 'resolvedEnvVariable' ${String(this.resolvedEnvVariable)} begins with 'github_pat_', indicating it's a Fine-Grained token. At the time of writing, GitHub Fine-Grained tokens cannot push packages. If you believe this is statement is outdated, report the issue at https://github.com/halospv3/hce.shared/issues/new. For more information, see https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry.`;\n const error = new Error(errorMessage);\n return this._canPushPackagesToSource = Promise.reject(error);\n }\n\n return this._canPushPackagesToSource = this.PackDummyPackage({})\n // eslint-disable-next-line unicorn/prefer-await\n .then(async () => await this._PushDummyPackages({\n apiKey: tokenValue,\n }))\n // eslint-disable-next-line unicorn/prefer-await\n .then<true>((execAsyncReturn) => {\n ok(execAsyncReturn);\n return true as const;\n });\n }\n\n /**\n * The first environment variable found to have a defined value. Set by\n * {@link _GetTokenEnvVariables} in the constructor.\n * @returns The first environment variable found to have a defined value.\n */\n get resolvedEnvVariable(): string | undefined {\n return this._resolvedEnvVariable;\n }\n\n get source(): string {\n return this._source;\n }\n\n // #region Pack\n\n /**\n * The type for options and arguments of `dotnet pack`. See https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack.\n *\n * {@link NRI.PackPackagesOptionsType.t.propertyOverrides `propertyOverrides`}\n * is a wrapper for MSBuild's `-property:<n>=<v>` properties override arg.\n */\n // eslint-disable-next-line unicorn/consistent-class-member-order\n static readonly PackPackagesOptionsType: Type<{\n propertyOverrides?: Record<string, string> | undefined;\n artifactsPath?: string | undefined;\n configuration?: 'Release' | 'Debug' | undefined;\n disableBuildServers?: boolean | undefined;\n force?: boolean | undefined;\n includeSource?: boolean | undefined;\n includeSymbols?: boolean | undefined;\n interactive?: boolean | undefined;\n noBuild?: boolean | undefined;\n noLogo?: boolean | undefined;\n noRestore?: boolean | undefined;\n output?: string | undefined;\n runtime?: string | undefined;\n serviceable?: boolean | undefined;\n terminalLogger?: 'auto' | 'on' | 'off' | undefined;\n useCurrentRuntime?: boolean | undefined;\n verbosity?: 'quiet' | 'minimal' | 'normal' | 'detailed' | 'diagnostic' | undefined;\n versionSuffix?: string | undefined;\n '-GetItem'?: readonly string[] | string[] | undefined;\n }> = Object.freeze(\n type({\n /**\n * a custom arg for handling MSBuild's `-property:<n>=<v>` argument for overriding MSBuild properties.\n */\n 'propertyOverrides?': type('Record<string,string>'),\n 'artifactsPath?': 'string',\n 'configuration?': '\"Release\" | \"Debug\"',\n 'disableBuildServers?': 'boolean',\n 'force?': 'boolean',\n 'includeSource?': 'boolean',\n 'includeSymbols?': 'boolean',\n 'interactive?': 'boolean',\n 'noBuild?': 'boolean',\n 'noLogo?': 'boolean',\n 'noRestore?': 'boolean',\n 'output?': 'string',\n 'runtime?': 'string',\n 'serviceable?': 'boolean',\n 'terminalLogger?': '\"auto\" | \"on\" | \"off\"',\n 'useCurrentRuntime?': 'boolean',\n 'verbosity?': '\"quiet\" | \"minimal\" | \"normal\" | \"detailed\" | \"diagnostic\"',\n 'versionSuffix?': 'string',\n /**\n * MSBuild evaluation option. Added to get the output Nupkgs' file paths.\n * @todo consider adding -GetProperty, -GetTarget\n */\n '-GetItem?': type.string.array().readonly().or('string[]'),\n }),\n );\n\n public static readonly PackDummyPackagesOptionsType: Type<{\n propertyOverrides?: Record<string, string> | undefined;\n artifactsPath?: string | undefined;\n configuration?: 'Release' | 'Debug' | undefined;\n disableBuildServers?: boolean | undefined;\n force?: boolean | undefined;\n includeSource?: boolean | undefined;\n includeSymbols?: boolean | undefined;\n interactive?: boolean | undefined;\n noBuild?: boolean | undefined;\n noLogo?: boolean | undefined;\n noRestore?: boolean | undefined;\n runtime?: string | undefined;\n serviceable?: boolean | undefined;\n terminalLogger?: 'auto' | 'on' | 'off' | undefined;\n useCurrentRuntime?: boolean | undefined;\n verbosity?: 'quiet' | 'minimal' | 'normal' | 'detailed' | 'diagnostic' | undefined;\n versionSuffix?: string | undefined;\n '-GetItem'?: readonly string[] | string[] | undefined;\n }>\n = this.PackPackagesOptionsType.omit('output');\n\n /**\n * Get a `dotnet pack` command line string, outputting the package(s) to a\n * path determined by this method's parameters.\n * When pushing the package(s), you only need to supply the main .nupkg's path\n * or its directory to the dotnet CLI—by default, it will also push the\n * symbols package, if present.\n * @param options Options passed to\n * `dotnet pack`, excluding the required `<PROJECT | SOLUTION>` argument. The\n * {@link PackPackagesOptionsType.t.output} path is modified according to the\n * {@link shouldUsePerSourceSubfolder} and {@link shouldUsePerPackageIdSubfolder}\n * arguments.\n * @param shouldUsePerSourceSubfolder If true, the path of the package output will\n * include a subfolder named after the NuGet Source.\n * @param shouldUsePerPackageIdSubfolder If true, the path of the package output\n * will include a subfolder named after the NuGet package's ID.\n * @returns `dotnet pack \"${this.project.Properties.MSBuildProjectFullPath}\"\n * -o \"${outDir}\"` where outDir may be `${cwd()}/publish/${NugetRegistryInfo.GetNameForURL(this.source)}/${this._project.Properties.PackageId}`\n */\n GetPackCommand(\n options: typeof NRI.PackPackagesOptionsType.inferIn,\n shouldUsePerSourceSubfolder = false,\n shouldUsePerPackageIdSubfolder = false,\n ): string {\n const validOptions = NRI.PackPackagesOptionsType.from(options);\n type.boolean.assert(shouldUsePerSourceSubfolder);\n type.boolean.assert(shouldUsePerPackageIdSubfolder);\n\n validOptions.output ??= node_path.join(cwd(), 'publish');\n if (shouldUsePerSourceSubfolder)\n validOptions.output = node_path.join(validOptions.output, NugetRegistryInfo.GetDirNameForSource(this.source), node_path.sep);\n if (shouldUsePerPackageIdSubfolder)\n validOptions.output = node_path.join(validOptions.output, this._project.Properties.PackageId, node_path.sep);\n\n const packCommandArray: string[] = [\n 'dotnet',\n 'pack',\n `\"${this._project.Properties.MSBuildProjectFullPath}\"`,\n ];\n if (validOptions.artifactsPath !== undefined)\n packCommandArray.push('--artifactsPath', `\"${validOptions.artifactsPath}\"`);\n if (validOptions.configuration !== undefined)\n packCommandArray.push('--configuration', validOptions.configuration);\n if (validOptions.disableBuildServers === true)\n packCommandArray.push('--disable-build-servers');\n if (validOptions.force === true) packCommandArray.push('--force');\n if (validOptions.includeSource === true) packCommandArray.push('--include-source');\n if (validOptions.includeSymbols === true) packCommandArray.push('--include-symbols');\n if (validOptions.interactive === true) packCommandArray.push('--interactive');\n if (validOptions.noBuild === true) packCommandArray.push('--no-build');\n if (validOptions.noLogo === true) packCommandArray.push('--nologo');\n if (validOptions.noRestore === true) packCommandArray.push('--no-restore');\n if (validOptions.runtime !== undefined)\n packCommandArray.push('--runtime', validOptions.runtime);\n if (validOptions.serviceable === true) packCommandArray.push('--serviceable');\n if (validOptions.terminalLogger !== undefined)\n packCommandArray.push('--tl', validOptions.terminalLogger);\n if (validOptions.useCurrentRuntime === true)\n packCommandArray.push('--use-current-runtime');\n if (validOptions.verbosity !== undefined)\n packCommandArray.push('--verbosity', validOptions.verbosity);\n if (validOptions.versionSuffix !== undefined)\n packCommandArray.push('--version-suffix', validOptions.versionSuffix);\n /**\n * Haphazard. I need to override the Version and I'm not considering side\n * effects of arbitrary overrides.\n */\n if (validOptions.propertyOverrides) {\n /** convert propertyOverrides record to \"-p:n0=v0;n1=v1;n2=v2\" et cetera */\n const assignments: string = '-p:' + Object.entries(validOptions.propertyOverrides)\n .map(v => `${v[0]}=${v[1]}`).join(';');\n packCommandArray.push(`\"${assignments}\"`);\n }\n if (validOptions['-GetItem'] && validOptions['-GetItem'].length > 0) {\n // -GetItem:_OutputPackItems,MyCustomItem\n packCommandArray.push(`-GetItem:${validOptions['-GetItem'].join(',')}`);\n }\n // MSBuild parses everything after -o as the path.\n packCommandArray.push('-o', `\"${validOptions.output}\"`);\n\n return packCommandArray.join(' ');\n }\n\n /**\n * !Not ready for use! Remove private modifier and commit as `feat(dotnet)` when ready for release!\n * Blocking Issue: convert all dotnet-related functionality to a Semantic Release plugin!\n * The current {@link _srcd SemanticReleaseConfigDotnet} leverages\n * `@semantic-release/exec` to invoke dotnet commands. This is fine for\n * relatively short command lines, but chaining commands with ' && ' results\n * in quickly-growing complexity.\n * NuGet packages should be created during the `prepare` step, but complex\n * configuration of `dotnet pack` via command lines intended to be invoked by\n * `@semantic-release/exec` is impractical.\n * @param options `dotnet pack` options. See `dotnet pack -h`,\n * https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack, and\n * {@link PackPackagesOptionsType}.\n * {@link options['-GetItem']} will _always_ have '_OutputPackItems'.\n * @param [shouldUsePerSourceSubfolder] If `true`, modify the output path to\n * include a subfolder bearing a path-safe encoding of the NuGet Source that\n * will receive the nupkg.\n * @param [shouldUsePerPackageIdSubfolder] If `true`, modify the output path\n * to include a subfolder named after the the PackageId.\n * @returns a string[] containing the full file paths of all new packages i.e.\n * .nupkg, .symbols.nupkg, .snupkg\n */\n // @ts-expect-error Todo: publicize to dismiss this \"unused\" error.\n private async _PackPackages(\n options: typeof NRI.PackPackagesOptionsType.inferIn,\n shouldUsePerSourceSubfolder = false,\n shouldUsePerPackageIdSubfolder = false,\n ): Promise<string[]> {\n options['-GetItem'] = [...options['-GetItem'] ?? [], key_OutputPackItems];\n\n const packCommand = this.GetPackCommand(\n options,\n shouldUsePerSourceSubfolder,\n shouldUsePerPackageIdSubfolder,\n );\n let packOutput: undefined | { stdout: string; stderr: string };\n while (packOutput === undefined) {\n try {\n packOutput = await setTimeout(\n 1000,\n execAsync(packCommand, true),\n );\n }\n catch (error: unknown) {\n catchEBUSY(error);\n }\n }\n // may include .snupkg\n const nupkgFullPaths: string[] | undefined = new MSBuildEvaluationOutput(packOutput.stdout)\n .Items\n ?.[key_OutputPackItems]\n ?.filter(item => item.Extension !== '.nuspec')\n .map(item => item.FullPath);\n return nupkgFullPaths ?? [];\n }\n\n /**\n * Create a dummy package for the current {@link project} by executing a\n * command line like \\``dotnet pack ${this.project.Properties.MSBuildProjectFullPath} -p:Version=0.0.1-DUMMY -output ${getDummiesDir(this._project)}/${GetNameForURL(this.source)}`\\`\n * @param options Options passed to\n * `dotnet pack`, excluding the required `<PROJECT | SOLUTION>` argument.\n * - The `output` field is ignored and overwritten. It is replaced with\n * ${{@link getDummiesDir}({@link project})}/${{@link GetDirNameForSource}({@link source})}\n * - The `output` path will be affixed with a folder named after this\n * {@link NugetRegistryInfo#source}, but will not include a subfolder for the\n * {@link NugetRegistryInfo#project NugetRegistryInfo.project}.{@link MSBuildProject#Properties Properties}.{@link MSBuildProject#Properties#PackageId PackageId}.\n * @returns the full paths of all nupkg, symbols.nupkg, and snupkg files\n * created by the Pack target, as extracted from the dotnet process's STDOUT.\n * If mixed with other nupkgs, filter for the {@link NugetProjectProperties#PackageId}\n */\n public async PackDummyPackage(\n options: typeof NRI.PackDummyPackagesOptionsType.inferIn,\n ): Promise<string[]> {\n const packCommand: string = this.GetPackCommand(\n {\n ...options,\n output: getDummiesDirectory(this._project),\n propertyOverrides: { ...options.propertyOverrides, Version: '0.0.1-DUMMY', UpdateVersionProperties: 'false' },\n '-GetItem': [...options['-GetItem'] ?? [], key_OutputPackItems],\n },\n true,\n );\n\n let packOutput: undefined | { stdout: string; stderr: string };\n let delay = 0;\n while (packOutput === undefined) {\n try {\n packOutput = await setTimeout(\n delay,\n execAsync(packCommand, true),\n );\n }\n catch (error: unknown) {\n if (delay <= 10_000 /* milliseconds */) {\n catchEBUSY(error);\n }\n else {\n throw new Error(\n 'Unable to pack dummy package; (10/10) Maximum retries reached.',\n { cause: error });\n }\n // If the delay is pushed back to 10 seconds, then...\n // A) A project's intermediate output (`obj/**`) is in use by a build system or language server\n // B) something horrible has happened\n }\n // back-off\n delay += 1000;\n }\n // may include .snupkg\n const nupkgFullPaths: string[] | undefined = new MSBuildEvaluationOutput(packOutput.stdout)\n .Items\n ?.[key_OutputPackItems]\n ?.filter(item => item.Extension !== '.nuspec')\n .map(item => item.FullPath);\n return nupkgFullPaths ?? [];\n }\n\n // #endregion Pack\n // #region Push\n\n /**\n * Also includes required argument 'ROOT': the directory in which packages\n * should be present and ready to be pushed the default or specified Source.\n * The ROOT may also include wildcards e.g. `*.nupkg`, `**\\\\*.nupkg`\n * See https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-push\n *\n * Specific to this API:\n * If you want to use this API's default root value (\\`${cwd()}/publish`), assign an empty string.\n */\n static readonly PushPackagesOptionsType: Type<{\n root: string;\n apiKey?: string | undefined;\n configFile?: string | undefined;\n disableBuffering?: boolean | undefined;\n forceEnglishOutput?: boolean | undefined;\n interactive?: boolean | undefined;\n noServiceEndpoint?: boolean | undefined;\n noSymbols?: boolean | undefined;\n skipDuplicate?: boolean | undefined;\n source?: string | undefined;\n symbolApiKey?: string | undefined;\n symbolSource?: string | undefined;\n timeout?: number | undefined;\n }> = Object.freeze(\n type({\n /** If an empty string is passed, this property is overridden to `./publish` */\n root: 'string',\n /** The API key for the server. NOTE: if `undefined` or an empty string, the `dotnet nuget` client will lookup credentials set via `dotnet nuget {add|update} source`. */\n 'apiKey?': 'string',\n /** The NuGet configuration file (nuget.config) to use. If specified, only the settings from this file will be used. If not specified, the hierarchy of configuration files from the current directory will be used. For more information, see {@link https://learn.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior Common NuGet Configurations}. */\n 'configFile?': 'string',\n /** Disables buffering when pushing to an HTTP(S) server to reduce memory usage. */\n 'disableBuffering?': 'boolean',\n /** Forces the application to run using an invariant, English-based culture. */\n 'forceEnglishOutput?': 'boolean',\n /** Allows the command to stop and wait for user input or action. For example, to complete authentication. Available since .NET Core 3.0 SDK. */\n 'interactive?': 'boolean',\n /** Doesn't append \"api/v2/package\" to the source URL. */\n 'noServiceEndpoint?': 'boolean',\n 'noSymbols?': 'boolean',\n /** When pushing multiple packages to an HTTP(S) server, treats any 409 Conflict response as a warning so that other pushes can continue. */\n 'skipDuplicate?': 'boolean',\n /**\n * Specifies the server URL. NuGet identifies a UNC or local folder source and simply copies the file there instead of pushing it using HTTP.\n *\n * ### Important\n * > Starting with NuGet 3.4.2, this is a mandatory parameter unless the NuGet config file specifies a `DefaultPushSource` value. For more information, see {@link https://learn.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior Configuring NuGet behavior}.\n */\n 'source?': 'string',\n /** The API key for the symbol server. NOTE: if `undefined`, the `dotnet nuget` client will lookup credentials set via `dotnet nuget {add|update} source`.` */\n 'symbolApiKey?': 'string',\n /** Specifies the symbol server URL. */\n 'symbolSource?': 'string',\n /** Specifies the timeout for pushing to a server in seconds. Defaults to 300 seconds (5 minutes). Specifying 0 applies the default value. */\n 'timeout?': 'number',\n }),\n );\n\n /**\n * {@link NRI.PushPackagesOptionsType} sans {@link NRI.PushPackagesOptionsType.t.root}.\n * The result of {@link getDummiesDir} is used, instead.\n */\n public static readonly PushDummyPackagesOptionsType: Type<{\n apiKey?: string | undefined;\n configFile?: string | undefined;\n disableBuffering?: boolean | undefined;\n forceEnglishOutput?: boolean | undefined;\n interactive?: boolean | undefined;\n noServiceEndpoint?: boolean | undefined;\n noSymbols?: boolean | undefined;\n source?: string | undefined;\n symbolApiKey?: string | undefined;\n symbolSource?: string | undefined;\n timeout?: number | undefined;\n skipDuplicate: Default<true, true>;\n }>\n = NugetRegistryInfo.PushPackagesOptionsType.merge({\n skipDuplicate: 'true = true',\n }).omit('root');\n\n /**\n * Create a `dotnet nuget push` command line from the given options and\n * optional boolean parameters.\n * @param options See {@link PushPackagesOptionsType}\n * @param shouldUsePerSourceSubfolder If `true`, the NuGet Source name or URL is formatted\n * to a folder name and appended to the ROOT as a subfolder. Do not use\n * wildcards in ROOT with this set to `true`!\n * @param shouldUsePerPackageIdSubfolder If `true`, the\n * {@link project}'s {@link NugetProjectProperties#PackageId}\n * is appended to the ROOT as a subfolder. Do not use wildcards in\n * ROOT with this set to `true`!\n * @returns A `dotnet nuget push` command line formatted with the\n * appropriate arguments.\n */\n GetPushCommand(\n options: typeof NRI.PushPackagesOptionsType.inferIn,\n shouldUsePerSourceSubfolder = false,\n shouldUsePerPackageIdSubfolder = false,\n ): string {\n const validOptions = NRI.PushPackagesOptionsType.from(options);\n type.boolean.assert(shouldUsePerSourceSubfolder);\n type.boolean.assert(shouldUsePerPackageIdSubfolder);\n\n validOptions.root = validOptions.root === '' ? `${cwd()}/publish` : validOptions.root;\n if (shouldUsePerSourceSubfolder)\n validOptions.root = node_path.join(validOptions.root, NugetRegistryInfo.GetDirNameForSource(this.source), node_path.sep);\n if (shouldUsePerPackageIdSubfolder)\n validOptions.root = node_path.join(validOptions.root, this._project.Properties.PackageId, node_path.sep);\n\n const packCommandArray: string[] = [\n 'dotnet',\n 'nuget',\n 'push',\n `\"${node_path.join(validOptions.root, '*.nupkg')}\"`,\n ];\n\n if (this.resolvedEnvVariable)\n validOptions.apiKey ??= NRI._GetTokenValue(this.resolvedEnvVariable);\n /**\n * If apiKey is an empty string, defer to the dotnet CLI's NuGet client\n * ability to lookup API keys saved via `dotnet nuget add source` or NuGet config\n * files.\n */\n if (validOptions.apiKey && validOptions.apiKey !== '')\n packCommandArray.push('--api-key', validOptions.apiKey);\n if (validOptions.configFile)\n packCommandArray.push('--configfile', validOptions.configFile);\n if (validOptions.disableBuffering === true)\n packCommandArray.push('--disable-buffering');\n if (validOptions.forceEnglishOutput === true)\n packCommandArray.push('--force-english-output');\n if (validOptions.interactive === true)\n packCommandArray.push('--interactive');\n if (validOptions.noServiceEndpoint === true)\n packCommandArray.push('--no-service-endpoint');\n if (validOptions.noSymbols === true)\n packCommandArray.push('--no-symbols');\n if (validOptions.skipDuplicate === true)\n packCommandArray.push('--skip-duplicate');\n validOptions.source ??= this.source;\n packCommandArray.push('--source', validOptions.source);\n if (validOptions.symbolApiKey !== undefined)\n packCommandArray.push('--symbol-api-key', validOptions.symbolApiKey);\n if (validOptions.symbolSource !== undefined)\n packCommandArray.push('--symbol-source', validOptions.symbolSource);\n if (validOptions.timeout !== undefined)\n packCommandArray.push('--timeout', validOptions.timeout.toString());\n\n return packCommandArray.join(' ');\n }\n\n /**\n * Immediately push packages. The input path may be modified according to the\n * {@link shouldUsePerSourceSubfolder} and {@link shouldUsePerPackageIdSubfolder}\n * arguments.\n * @param options The `dotnet nuget push` command line options, including the\n * ROOT argument, the directory containing local nuget packages ready to be\n * pushed.\n * @param shouldUsePerSourceSubfolder If `true`, the NuGet Source name or URL is formatted\n * to a folder name and appended to the ROOT as a subfolder. Do not use\n * wildcards in ROOT with this set to `true`!\n * @param shouldUsePerPackageIdSubfolder If `true`, the current {@link project}'s\n * PackageId is appended to the ROOT as a subfolder. Do not use wildcards in\n * ROOT with this set to `true`!\n */\n // @ts-expect-error Todo: publicize to dismiss this \"unused\" error.\n private async _PushPackages(\n options: typeof NRI.PushPackagesOptionsType.inferIn,\n shouldUsePerSourceSubfolder = false,\n shouldUsePerPackageIdSubfolder = false,\n ) {\n let command = '';\n try {\n await execAsync(\n command = this.GetPushCommand(\n options,\n shouldUsePerSourceSubfolder,\n shouldUsePerPackageIdSubfolder,\n ),\n true,\n );\n }\n catch (error: unknown) {\n const _error: ExecException = Object.assign(\n isError(error)\n ? error\n : new Error(JSON.stringify(error)),\n { cmd: command },\n );\n\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw options.apiKey\n ? _censorTokenInError(_error, options.apiKey)\n : _error;\n };\n\n // const pushOutput =.catch((error: unknown) => {\n }\n\n /**\n *\n * Get a `dotnet nuget push` command for pushing one or more nupkg/snupkg\n * files created by {@link GetPackCommand} or {@link _PackPackages}.\\\n * Like {@link PackDummyPackage}, the output/ROOT path will include a\n * folder named after this NRI instance's {@link NugetRegistryInfo#source},\n * but will not include a subfolder for the\n * {@link NugetRegistryInfo#project NugetRegistryInfo.project}.{@link MSBuildProject#Properties Properties}.{@link MSBuildProject#Properties#PackageId PackageId}\n * @example\n * ```ts\n * const packAndPushDummyCmd = [\n * nri.GetPackCommand(\n * NugetRegistryInfo.PackPackagesOptionsType.from({ root: '' }),\n * false,\n * false,\n * ),\n * nri.GetPushDummyPackageCommand(pushOpts, false, false),\n * ].join(' && ')\n * ```\n * @param options options for `dotnet nuget push`. The following\n * fields are overwritten:\n * - root: getDummiesDir(this.project)\n * - skipDuplicates: true\n * @returns a `dotnet nuget push` command to push a dummy package\n * (created by executing {@link PackDummyPackage}) to {@link source}\n */\n GetPushDummyCommand(\n options: typeof NRI.PushDummyPackagesOptionsType.inferIn,\n ): string {\n return this.GetPushCommand(\n {\n ...NRI.PushDummyPackagesOptionsType.from(options),\n root: getDummiesDirectory(this._project),\n },\n true,\n );\n }\n\n /**\n * Call {@link GetPushDummyCommand} and immediately execute it.\n * @throws {Error} when the process exits with an error code indicating\n * failure i.e. the command line is invalid, the process fails to start,\n * the push fails, et cetera.\n * @param options the ROOT arg and options for `dotnet nuget push`. The following\n * fields are overwritten:\n * - root: getDummiesDir(this.project)\n * - skipDuplicates: true\n * @returns The return type of {@link execAsync} i.e. a {@link Promise} resolving to `{ stdout: string; stderr: string }`.\n */\n private async _PushDummyPackages(\n options: typeof NRI.PushDummyPackagesOptionsType.inferIn,\n ): ReturnType<typeof execAsync> {\n const pushCommand: string = this.GetPushDummyCommand(options);\n try {\n return await execAsync(pushCommand, true);\n }\n catch (error: unknown) {\n const _error: ExecException = Object.assign(\n isError(error)\n ? error\n : new Error(JSON.stringify(error)),\n { cmd: pushCommand },\n );\n\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw options.apiKey\n ? _censorTokenInError(_error, options.apiKey)\n : _error;\n }\n }\n\n // #endregion Push\n\n // if non-exact-match is needed, learn how to make a parameter-driven type.\n private static readonly _NugetSearchReturnTypes = {\n ExactMatch: {\n v2: type({\n version: '2',\n problems: 'unknown[]',\n searchResult: [\n {\n sourceName: 'string',\n packages: type({\n id: 'string',\n version: type.keywords.string.semver,\n }).array(),\n },\n ],\n }),\n },\n };\n\n private static readonly _ParseNugetSearchReturn = type(\n 'string.json.parse',\n ).to(this._NugetSearchReturnTypes.ExactMatch.v2);\n\n /**\n * !WARNING: this method requires the Nuget Source to be configured via `dotnet nuget add source` or `dotnet nuget update source`. `NUGET_TOKEN` works, but it may be vulnerable to supply chain attacks.\\\n * Call during the `prepare` step of a Semantic Release run.\\\n * Determine if the `nextVersion` generated during the `analyze` Semantic\n * Release step was already published to the NuGet {@link source}.\n * @param source The name or URI of the NuGet Source to search. If this API\n * endpoint does not support searches, the operation will fail. If this API\n * endpoint requires authentication (e.g. GitHub), it must be configured via\n * `dotnet nuget add source` or `dotnet nuget update source` before calling\n * this method.\n * @param packageId The ID of the NuGet package to search for.\n * @param nextVersion The nextVersion value generated by semantic-release's hidden [\"Create Git tag\" step](https://semantic-release.gitbook.io/semantic-release#:~:text=the%20last%20release.-,Create%20Git%20tag,-Create%20a%20Git).\n * @returns A promised boolean.\n * If the promise resolves to `true`, the semantic release run should be\n * cancelled immediately.\n * Otherwise, the release should proceed.\n * @todo utilize in custom plugin inserted at the beginning of `prepare`\n */\n static async IsNextVersionAlreadyPublished(\n source: string,\n packageId: string,\n nextVersion: string,\n ): Promise<boolean> {\n if (nextVersion === '')\n throw new Error('The value of nextVersion is empty');\n const stdPair = await execAsync(\n `dotnet package search --format JSON --exact-match --source ${source} --prerelease ${packageId}`,\n true,\n );\n const json = stdPair.stdout;\n const errsOrObject = this._ParseNugetSearchReturn(json);\n const _object = errsOrObject instanceof type.errors ? errsOrObject.throw() : errsOrObject;\n const results = _object.searchResult;\n const packages = results[0].packages;\n const package_ = packages.find(p => p.version === type('string.semver').from(nextVersion));\n return package_ !== undefined;\n }\n\n /**\n * !WARNING: GITHUB_OUTPUT must be the full path to an environment file.\n * The plugin \"semantic-release-output-variables\" next-release-version\n *\n * !WARNING: NuGet Source API Key mus tbe configured via `dotnet nuget add source` or `dotnet nuget update source`.\n * Some Sources (e.g. GitHub) require authentication for package searches.\n *\n * # Authenticating NuGet Package Searches\n *\n * ## GitHub NuGet Registry authentication\n * - {@link https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry#authenticating-in-a-github-actions-workflow Authenticating in a GitHub Actions workflow}\n * - {@link https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry#authenticating-with-a-personal-access-token Authenticating with a personal access token}.\n * ## For GitLab NuGet Registry authentication, see\n * - {@link https://docs.gitlab.com/ee/user/packages/nuget_repository/#add-a-source-with-the-net-cli Add a source with the .NET CLI}\n * @returns a string containing a Node.JS command line invoking {@link ./IsNextVersionAlreadyPublished.cli.ts}\n * @see {@link ./IsNextVersionAlreadyPublished.cli.ts}, {@link ./IsNextVersionAlreadyPublished.cli.js}\n */\n GetIsNextVersionAlreadyPublishedCommand(): string {\n // if GITHUB_OUTPUT unset or its file does not exist, create it. ''\n getGithubOutputSync();\n // The script will run\n return `node ${node_path.join(import.meta.dirname, './IsNextVersionAlreadyPublished.cli.js')} --packageId ${this._project.Properties.PackageId} --source ${this.source}`;\n }\n\n /*\n * Copy https://github.com/joelharkes/nuget-push when we split off our dotnet\n * modules to a semantic-release plugin.\n */\n\n /*\n * If you want a deterministic nupkg, do so with a custom MSBuild target with\n * AfterTargets=\"Pack\" to restore and execute the dotnet tool \"Kuinox.NupkgDeterministicator\" .\n */\n}\n\n// shorthand/alias for NugetRegistryInfo\nconst NRI: typeof NugetRegistryInfo = NugetRegistryInfo;\n\n/**\n * The base type for {@link NRIOpts} and related types. Extend this type while\n * overriding member types via {@link NRIOptsBase.merge}\n */\n// eslint-disable-next-line unicorn/name-replacements\nexport const NRIOptsBase: Type<{\n project: MSBuildProject | {\n readonly Items: Readonly<Required<MSBuildEvaluationOutput>['Items']>;\n readonly Properties: Readonly<NugetProjectProperties>;\n readonly Targets: readonly string[];\n readonly TargetResults: Required<MSBuildEvaluationOutput>['TargetResults'][];\n };\n source: string;\n tokenEnvVars: readonly string[];\n}> = type({\n /**\n * The environment variables whose values are tokens with permission to push a\n * package to the NuGet package registry. The array is iterated through until\n * one token is found. If none of the environment variables are defined,\n * {@link NugetRegistryInfo}'s constructor will throw an {@link Error}.\n */\n project: type\n .instanceOf(MSBuildProject)\n .or(type.instanceOf(MSBuildProject).readonly()),\n /**\n * A NuGet package registry's API endpoint URL -OR- the name assigned via the\n * client e.g. `dotnet nuget add source --name ${source} ${source's URL}`\n */\n source: type.string,\n /**\n * WARNING: If possible, set credentials via `dotnet nuget {add|update}\n * source` as recommended by Microsoft! This is more secure than exposing\n * credentials to the Node.JS runtime and all its loaded modules.\n *\n * The environment variables whose values are tokens with permission to push a\n * package to the NuGet package registry.The array is iterated through until\n * one token is found.If none of the environment variables are defined,\n * {@link NugetRegistryInfo}'s constructor will throw an {@link Error}.\n *\n * If none of these are defined in the `.env` or process environment variables (.vault.env is impractical in CI), the `--api-key/-k` argument is excluded from `dotnet nuget push` commands.\n * Instead, the NuGet client relies on credentials configured for the\n * given NuGet source. If the NuGet client does not find credentials saved for the\n * NuGet {@link NRIOptsBase.t.source source} and they are required, the command will fail.\n *\n * Use the `dotnet` CLI to configure credentials for existing NuGet sources\n * ({@link https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-update-source `dotnet nuget update source`})\n * -OR- configure credentials for non-default NuGet sources\n * ({@link https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-add-source `dotnet nuget add source`}).\\\n * Alternatively, use the `nuget.exe` CLI to add/update sources. See\n * {@link https://learn.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-sources `nuget sources` (NuGet CLI)}.\n *\n * The credentials will be validated during the `verifyConditions` step of Semantic Release.\n */\n tokenEnvVars: type.string.array().readonly(),\n});\n\n/**\n * The type of the parameter for {@link NugetRegistryInfo}'s constructor.\n */\n// eslint-disable-next-line unicorn/name-replacements\nexport const NRIOpts: Type<{\n project: MSBuildProject | {\n readonly Items: Readonly<Required<MSBuildEvaluationOutput>['Items']>;\n readonly Properties: Readonly<NugetProjectProperties>;\n readonly Targets: readonly string[];\n readonly TargetResults: Required<MSBuildEvaluationOutput>['TargetResults'][];\n };\n tokenEnvVars: Default<readonly string[], readonly ['NUGET_TOKEN']>;\n source: Default<string, string>;\n}> = NRIOptsBase.merge({\n /**\n * Defaults to {@link NugetRegistryInfo.DefaultTokenEnvVars}\n * @see {@link NRIOptsBase.t.tokenEnvVars}\n */\n tokenEnvVars: NRIOptsBase.get('tokenEnvVars').default(\n () => NugetRegistryInfo.DefaultTokenEnvVars,\n ),\n /**\n * A NuGet package registry's API endpoint URL -OR- the name assigned to it\n * via your NuGet client.\n * @default 'https://api.nuget.org/v3/index.json' (name: 'nuget.org')\n * @see {@link NRIOptsBase.t.source}\n */\n source: NRIOptsBase.get('source').default(() => defaultNugetSource),\n});\n\n// #region token censorship\n\n/**\n * Replace all occurrences of {@link token} in the {@link string} with '***'.\n * @param string The string in which a {@link token} may be found.\n * @param token The NuGet API token you definitely don't want to leak!\n * @returns A modified copy of the {@link string} with all occurrences of the\n * {@link token} replaced with '***'.\n */\nfunction _censorToken(string: string, token: string): string {\n return string.replaceAll(token, '***');\n}\n\n/**\n * Censor all occurrences of an API {@link token} in an {@link error}.\n * @param error A {@link ExecException} in which the NuGet API {@link token} may be found.\n * @param token The value of the NuGet API token\n * @returns A modified copy of the provided exception sans any occurrence of the\n * NuGet API token.\n */\nfunction _censorTokenInError(error: ExecException, token: string): ExecException {\n const text = JSON.stringify({\n ...error,\n message: error.message,\n stack: error.stack,\n });\n return Object.assign(\n error,\n JSON.parse(\n _censorToken(\n text,\n token,\n ),\n ) as ExecException,\n );\n}\n\n// #endregion token censorship\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.mts","names":[],"sources":["../../src/dotnet/helpers.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"helpers.d.mts","names":[],"sources":["../../src/dotnet/helpers.ts"],"mappings":";;;;;;;;AA6BA;;;;;;;;;;;;;;;iBAAsB,mBAAA,CACpB,iBAAA,aAA8B,cAAA,IAC9B,qBAAA,cAAmC,iBAAA,IAEnC,mBAAA,UAA6B,sBAAA,CAAuB,OAAA,GACnD,OAAA;;;AAAA;AAoQH;;;;;;;;iBAAgB,wBAAA,CACd,aAAA,EAAe,iBAAA,IAGf,iBAAA;AAAA,cAyEI,sBAAA,EAAwB,IAAA;EAE1B,WAAA,EAAa,OAAA;EACb,mBAAA;EACA,aAAA;EACA,MAAA;EACA,SAAA;EACA,sBAAA;EACA,SAAA;AAAA;EAEA,eAAA;EACA,sBAAA;AAAA;EAEA,eAAA;EACA,sBAAA;AAAA;EAEA,oBAAA;EACA,sBAAA;AAAA;EAEA,oBAAA;EACA,sBAAA;AAAA;EAEA,wBAAA;EACA,sBAAA;AAAA;EAEA,wBAAA;EACA,sBAAA;AAAA"}
|
package/mjs/dotnet/helpers.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { cwd } from "node:process";
|
|
|
5
5
|
import { type } from "arktype";
|
|
6
6
|
import * as path from "node:path";
|
|
7
7
|
//#region src/dotnet/helpers.ts
|
|
8
|
-
const
|
|
8
|
+
const ourDefaultPubDirectory = path.join(".", "publish");
|
|
9
9
|
/**
|
|
10
10
|
* Build a prepareCmd string from .NET projects.\
|
|
11
11
|
* This will include a `dotnet publish` for each project's RID and TFM permutation,\
|
|
@@ -24,9 +24,10 @@ const ourDefaultPubDir = path.join(".", "publish");
|
|
|
24
24
|
* @returns A single string of CLI commands joined by ' && '
|
|
25
25
|
*/
|
|
26
26
|
async function configurePrepareCmd(projectsToPublish, projectsToPackAndPush, dotnetNugetSignOpts) {
|
|
27
|
-
const evaluatedProjects =
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const evaluatedProjects = projectsToPublish.filter((p) => p instanceof MSBuildProject);
|
|
28
|
+
if (projectsToPackAndPush) {
|
|
29
|
+
for (const project of projectsToPackAndPush) if (project instanceof NugetRegistryInfo) evaluatedProjects.push(project.project);
|
|
30
|
+
}
|
|
30
31
|
return [
|
|
31
32
|
await formatDotnetPublish(projectsToPublish),
|
|
32
33
|
await formatDotnetPack(projectsToPackAndPush ?? []),
|
|
@@ -103,7 +104,7 @@ async function configurePrepareCmd(projectsToPublish, projectsToPackAndPush, dot
|
|
|
103
104
|
* // return array as success-chained CLI commands.
|
|
104
105
|
* return publishCmdArray.join(' && ');
|
|
105
106
|
*/
|
|
106
|
-
function
|
|
107
|
+
function getPublishArgumentsPermutations(proj) {
|
|
107
108
|
/**
|
|
108
109
|
* If the project imports PublishAll to publish for each TFM-RID
|
|
109
110
|
* permutation, return the appropriate command line.
|
|
@@ -117,14 +118,14 @@ async function configurePrepareCmd(projectsToPublish, projectsToPackAndPush, dot
|
|
|
117
118
|
else for (const RID of RIDs) tfmRidPermutations.push(`--runtime ${RID}`);
|
|
118
119
|
else if (TFMs.length > 0) for (const TFM of TFMs) tfmRidPermutations.push(`--framework ${TFM}`);
|
|
119
120
|
/** prepend each set of args with the project's path */
|
|
120
|
-
return tfmRidPermutations.map((
|
|
121
|
+
return tfmRidPermutations.map((permArguments) => `"${proj.Properties.MSBuildProjectFullPath}" ${permArguments}`);
|
|
121
122
|
}
|
|
122
123
|
const publishCmds = [];
|
|
123
124
|
/** convert {@link evaluatedPublishProjects} to sets of space-separated CLI args. */
|
|
124
|
-
const
|
|
125
|
-
for (const
|
|
126
|
-
if (typeof
|
|
127
|
-
for (const permutation of
|
|
125
|
+
const argumentsSets = evaluatedPublishProjects.map((proj) => getPublishArgumentsPermutations(proj));
|
|
126
|
+
for (const arguments_ of argumentsSets) {
|
|
127
|
+
if (typeof arguments_ === "string") throw new Error(`\`args\` should not be a string!`);
|
|
128
|
+
for (const permutation of arguments_) {
|
|
128
129
|
if (typeof permutation === "string" && permutation.length === 1) throw new Error("Something has gone terribly wrong. A `dotnet publish` argument set was split to single characters!");
|
|
129
130
|
if (/".+" -t:PublishAll -p:Configuration=Release/.test(permutation)) publishCmds.push(`dotnet msbuild ${permutation}`);
|
|
130
131
|
else publishCmds.push(`dotnet publish ${permutation}`);
|
|
@@ -144,16 +145,14 @@ async function configurePrepareCmd(projectsToPublish, projectsToPackAndPush, dot
|
|
|
144
145
|
*/
|
|
145
146
|
async function formatDotnetPack(projectsToPackAndPush) {
|
|
146
147
|
if (projectsToPackAndPush.length === 0) return void 0;
|
|
147
|
-
return await Promise.all(projectsToPackAndPush.map(async (proj) => {
|
|
148
|
+
return (await Promise.all(projectsToPackAndPush.map(async (proj) => {
|
|
148
149
|
if (proj instanceof NugetRegistryInfo) return proj;
|
|
149
|
-
const
|
|
150
|
-
if (
|
|
151
|
-
const msbp =
|
|
150
|
+
const msbpArray = await Promise.all(await MSBuildProject.PackableProjectsToMSBuildProjects([proj]));
|
|
151
|
+
if (msbpArray.length === 0 || msbpArray[0] === void 0) throw new Error("This should be impossible!");
|
|
152
|
+
const msbp = msbpArray[0];
|
|
152
153
|
evaluatedProjects.push(msbp);
|
|
153
154
|
return new NugetRegistryInfo({ project: msbp });
|
|
154
|
-
})).
|
|
155
|
-
return nriArray.map((nri) => nri.GetPackCommand(NugetRegistryInfo.PackPackagesOptionsType.from({}))).join(" && ");
|
|
156
|
-
});
|
|
155
|
+
}))).map((nri) => nri.GetPackCommand(NugetRegistryInfo.PackPackagesOptionsType.from({}))).join(" && ");
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
158
|
/**
|
|
@@ -181,30 +180,30 @@ function configureDotnetNugetPush(registryInfos, packageOutputPath = `${cwd()}/p
|
|
|
181
180
|
*/
|
|
182
181
|
function formatDotnetNugetSign(opts) {
|
|
183
182
|
if (opts === void 0) return void 0;
|
|
184
|
-
const
|
|
185
|
-
const
|
|
183
|
+
const validOptions = DotnetNugetSignOptions.from(opts);
|
|
184
|
+
const arguments_ = [
|
|
186
185
|
"--timestamper",
|
|
187
|
-
|
|
186
|
+
validOptions.timestamper,
|
|
188
187
|
"-o",
|
|
189
|
-
|
|
188
|
+
validOptions.output ?? ourDefaultPubDirectory
|
|
190
189
|
];
|
|
191
|
-
if (
|
|
192
|
-
if (
|
|
193
|
-
if (
|
|
194
|
-
if (
|
|
195
|
-
if (
|
|
196
|
-
if ("certificatePath" in
|
|
197
|
-
else if ("certificateStoreName" in
|
|
190
|
+
if (validOptions.certificatePassword) arguments_.push("---certificate-password", validOptions.certificatePassword);
|
|
191
|
+
if (validOptions.hashAlgorithm) arguments_.push("--hash-algorithm", validOptions.hashAlgorithm);
|
|
192
|
+
if (validOptions.overwrite) arguments_.push("--overwrite");
|
|
193
|
+
if (validOptions.timestampHashAlgorithm) arguments_.push("--timestamp-hash-algorithm", validOptions.timestampHashAlgorithm);
|
|
194
|
+
if (validOptions.verbosity) arguments_.push("-v", validOptions.verbosity);
|
|
195
|
+
if ("certificatePath" in validOptions) arguments_.push("--certificate-path", validOptions.certificatePath);
|
|
196
|
+
else if ("certificateStoreName" in validOptions) {
|
|
198
197
|
SetSubjectNameOrFingerprint();
|
|
199
|
-
|
|
200
|
-
} else if ("certificateStoreLocation" in
|
|
198
|
+
arguments_.push("--certificate-store-name", validOptions.certificateStoreName);
|
|
199
|
+
} else if ("certificateStoreLocation" in validOptions) {
|
|
201
200
|
SetSubjectNameOrFingerprint();
|
|
202
|
-
|
|
201
|
+
arguments_.push("--certificate-store-location", validOptions.certificateStoreLocation);
|
|
203
202
|
} else throw new Error("No code signing certificate was specified!");
|
|
204
|
-
return `dotnet nuget sign ${
|
|
203
|
+
return `dotnet nuget sign ${arguments_.join(" ")} `;
|
|
205
204
|
function SetSubjectNameOrFingerprint() {
|
|
206
|
-
if ("certificateSubjectName" in
|
|
207
|
-
else if ("certificateFingerprint" in
|
|
205
|
+
if ("certificateSubjectName" in validOptions) arguments_.push("--certificate-subject-name", validOptions.certificateSubjectName);
|
|
206
|
+
else if ("certificateFingerprint" in validOptions) arguments_.push("--certificate-fingerprint", validOptions.certificateFingerprint);
|
|
208
207
|
else throw new Error("If certificateStoreName or certificateStoreLocation is set, either certificateSubjectName or certificateFingerprint must also be set!");
|
|
209
208
|
}
|
|
210
209
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":["MSBPP"],"sources":["../../src/dotnet/helpers.ts"],"sourcesContent":["import { type, type Type } from 'arktype';\n// eslint-disable-next-line unicorn/import-style\nimport * as path from 'node:path';\nimport { cwd } from 'node:process';\nimport { MSBuildProject } from './MSBuildProject.ts';\nimport { MSBuildProjectProperties as MSBPP } from './MSBuildProjectProperties.ts';\nimport { NugetRegistryInfo } from './NugetRegistryInfo.ts';\nimport type { Default } from 'arktype/internal/attributes.ts';\n\nconst ourDefaultPubDir = path.join('.', 'publish') as `.${'/' | '\\\\'}publish`;\n\n/**\n * Build a prepareCmd string from .NET projects.\\\n * This will include a `dotnet publish` for each project's RID and TFM permutation,\\\n * `dotnet pack` for each project with output paths separated by NuGet Source and PackageId,\\\n * and `dotnet nuget sign` for each nupkg output directory.\n * @todo parse Solution files to publish all projects with default Publish parameters (as evaluated by MSBuild).\n * @param projectsToPublish An array of relative or full file paths of `.csproj`\n * projects -OR- an array of {@link MSBuildProject} objects.\n * The project paths will be passed to `dotnet publish` commands.\n * @param projectsToPackAndPush\n * Relative and/or full file paths of projects to pass to `dotnet pack`. If\n * string[], only the default NuGet Source will be used. If GitHub, GitLab,\n * etc. are also desired, pass {@link NugetRegistryInfo}[]\n * @param dotnetNugetSignOpts A {@link DotnetNugetSignOptions} object. The value\n * of the `--output` argument will be set to {@link ourDefaultPubDir} if `undefined`.\n * @returns A single string of CLI commands joined by ' && '\n */\nexport async function configurePrepareCmd(\n projectsToPublish: string[] | MSBuildProject[],\n projectsToPackAndPush?: string[] | NugetRegistryInfo[],\n dotnetNugetSignOpts?: typeof DotnetNugetSignOptions.inferIn,\n): Promise<string> {\n const evaluatedProjects: MSBuildProject[] = [];\n\n // append evaluated projects\n for (const p of projectsToPublish.filter(p => p instanceof MSBuildProject)) {\n evaluatedProjects.push(p);\n }\n if (projectsToPackAndPush) {\n for (const p of projectsToPackAndPush.filter(p => p instanceof NugetRegistryInfo)) {\n evaluatedProjects.push(p.project);\n }\n }\n\n const dotnetPublishCmd: string = await formatDotnetPublish(projectsToPublish);\n const dotnetPackCmd: string | undefined = await formatDotnetPack(projectsToPackAndPush ?? []);\n const dotnetNugetSignCmd: string | undefined = formatDotnetNugetSign(dotnetNugetSignOpts);\n\n return [\n dotnetPublishCmd,\n dotnetPackCmd,\n dotnetNugetSignCmd,\n // remove no-op commands\n ]\n .filter(v => v !== undefined)\n .join(' && ');\n\n /**\n * Create a string of CLI commands to run `dotnet publish` or the Publish\n * MSBuild target for one or more projects.\n * @async\n * @param projectsToPublish An array of one or more projects, either\n * pre-evaluated (see {@link MSBuildProject.Evaluate}) or as full file paths.\\\n * NOTE: Although `dotnet publish` allows directory or Solution file (.sln,\n * .slnx) paths, this function expects projects' full or relative file\n * paths.\n * @returns A Promise of a string. This string contains one or more `dotnet publish`\n * commands conjoined by \" && \". It may also include one or more\n * `dotnet msbuild ${...} -t:PublishAll -p:Configuration=Release` commands.\n */\n async function formatDotnetPublish(\n projectsToPublish: string[] | MSBuildProject[],\n ): Promise<string> {\n /* Fun Fact: You can define a property and get the evaluated value in the same command!\n ```pwsh\n dotnet msbuild .\\src\\HXE.csproj -property:RuntimeIdentifiers=\"\"\"place;holder\"\"\" -getProperty:RuntimeIdentifiers\n place;holder\n ```\n enclosing with \"\"\" is required in pwsh to prevent the semicolon from breaking the string.\n */\n if (!Array.isArray(projectsToPublish) || projectsToPublish.length === 0) {\n throw new Error(\n `Type of projectsToPublish (${typeof projectsToPublish}) is not allowed. Expected a string[] or MSBuildProject[] where length > 0.`,\n );\n }\n\n // each may have TargetFramework OR TargetFrameworks (plural)\n const evaluatedPublishProjects: MSBuildProject[] = await Promise.all(\n projectsToPublish.map(async (proj): Promise<MSBuildProject> => {\n if (proj instanceof MSBuildProject)\n return proj;\n\n // filter for projects whose full paths match the full path of the given string\n const filteredProjects = evaluatedProjects.filter(p =>\n p.Properties.MSBuildProjectFullPath === MSBPP.GetFullPath(proj),\n );\n\n // if no pre-existing MSBuildProject found,\n // evaluate a new one and push it\n if (filteredProjects.length === 0) {\n const _proj = await MSBuildProject.Evaluate({\n FullName: proj,\n GetProperty: MSBuildProject.MatrixProperties,\n GetItem: [],\n GetTargetResult: [],\n Property: {},\n Targets: ['Restore'],\n });\n evaluatedProjects.push(_proj);\n return _proj;\n }\n\n /**\n * Finds and returns the subjectively \"best\" project in {@link filteredProjects}\n * @returns the subjective \"best\" project in {@link filteredProjects}\n */\n function getBest() {\n let best: MSBuildProject | undefined;\n if (filteredProjects.length > 0 && (best = filteredProjects[0]) instanceof MSBuildProject)\n return best;\n throw new Error('No MSBuildProjects could be found!');\n }\n\n /*\n todo: improve filtering to select \"optimal\" instance.\n Which properties are most-needed?\n For now, we just pray the project has a well-defined publish flow e.g.\n @halospv3/hce.shared-config/dotnet/PublishAll.targets\n */\n return getBest();\n }),\n );\n\n /**\n * Returns an array of one or more `dotnet` arguments.\n * @param proj An {@link MSBuildProject} to be published for one or more\n * runtime-framework combinations.\n * @returns If {@link proj} imports {@link ../../dotnet/PublishAll.targets}...\n * ```\n * [`${proj.Properties.MSBuildProjectFullPath} -t:PublishAll -p:Configuration=Release`]\n * ```\n * Else, an array of `dotnet publish` arguments permutations e.g.\n * ```\n * [\n * 'myProj.csproj --runtime win7-x86 --framework net6.0',\n * 'myProj.csproj --runtime win7-x64 --framework net6.0'\n * ]\n * ```\n * @example\n * const publishCmdArray = [];\n * const permutations = getPublishArgsPermutations(msbuildProject);\n * for (const permutation of permutations) {\n * if (permutation[0] === 'PublishAll') {\n * // 'dotnet msbuild full/path/to/myProj.csproj t:PublishAll'\n * publishCmdArray.push(`dotnet msbuild ${permutation[1]}`)\n * }\n * else {\n * publishCmdArray.push(`dotnet publish ${permutation}`)\n * }\n * }\n * // return array as success-chained CLI commands.\n * return publishCmdArray.join(' && ');\n */\n function getPublishArgsPermutations(proj: MSBuildProject):\n ([`\"${typeof proj.Properties.MSBuildProjectFullPath}\" -t:PublishAll -p:Configuration=Release`])\n | ([`\"${typeof proj.Properties.MSBuildProjectFullPath}\"`])\n | (`\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string} --framework ${string}`)[]\n | (`\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string}`)[]\n | (`\"${typeof proj.Properties.MSBuildProjectFullPath}\" --framework ${string}`)[] {\n /**\n * If the project imports PublishAll to publish for each TFM-RID\n * permutation, return the appropriate command line.\n */\n if (proj.Targets.includes('PublishAll'))\n return [`\"${proj.Properties.MSBuildProjectFullPath}\" -t:PublishAll -p:Configuration=Release`];\n\n // #region formatFrameworksAndRuntimes\n const tfmRidPermutations: `--runtime ${string} --framework ${string}`[]\n | `--runtime ${string}`[]\n | `--framework ${string}`[]\n = []; // forEach, run dotnet [proj.Properties.MSBuildProjectFullPath,...v]\n const RIDs: string[] = proj.Properties.RuntimeIdentifiers.split(';').filter(v => v !== '');\n const TFMs: string[] = proj.Properties.TargetFrameworks.split(';').filter(v => v !== '');\n\n if (TFMs.length === 0 && RIDs.length === 0)\n return [`\"${proj.Properties.MSBuildProjectFullPath}\"`] as [`\"${string}\"`];\n\n if (RIDs.length > 0) {\n if (TFMs.length > 0) {\n for (const RID of RIDs) {\n for (const TFM of TFMs) {\n (tfmRidPermutations as `--runtime ${string} --framework ${string}`[]).push(\n `--runtime ${RID} --framework ${TFM}`,\n );\n }\n }\n }\n else {\n // assume singular TFM. No need to specify it.\n for (const RID of RIDs) {\n (tfmRidPermutations as `--runtime ${string}`[]).push(\n `--runtime ${RID}`,\n );\n }\n }\n }\n else if (TFMs.length > 0) {\n for (const TFM of TFMs) {\n (tfmRidPermutations as `--framework ${string}`[]).push(`--framework ${TFM}`);\n }\n }\n\n /** prepend each set of args with the project's path */\n return tfmRidPermutations.map(permArgs =>\n `\"${proj.Properties.MSBuildProjectFullPath}\" ${permArgs}`,\n ) as `\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string} --framework ${string}`[]\n | `\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string}`[]\n | `\"${typeof proj.Properties.MSBuildProjectFullPath}\" --framework ${string}`[];\n // #endregion formatFrameworksAndRuntimes\n }\n\n const publishCmds: (`dotnet publish \"${string}\"` | `dotnet publish \"${string}\" ${string}` | `dotnet msbuild \"${string}\" -t:PublishAll -p:Configuration=Release`)[] = [];\n /** convert {@link evaluatedPublishProjects} to sets of space-separated CLI args. */\n const argsSets = evaluatedPublishProjects.map(\n proj => getPublishArgsPermutations(proj),\n );\n for (const args of argsSets) {\n if (typeof args === 'string')\n throw new Error(`\\`args\\` should not be a string!`);\n for (const permutation of args) {\n if (typeof permutation === 'string' && permutation.length === 1)\n throw new Error('Something has gone terribly wrong. A `dotnet publish` argument set was split to single characters!');\n if (/\".+\" -t:PublishAll -p:Configuration=Release/.test(permutation))\n publishCmds.push(`dotnet msbuild ${permutation as `\"${string}\" -t:PublishAll -p:Configuration=Release`}`);\n else\n publishCmds.push(`dotnet publish ${permutation}`);\n }\n }\n\n // For each argSet, create a new exec command. Then, join all commands with ' && ' so they are executed serially, synchronously.\n // e.g. `dotnet publish project.csproj --runtime win7-x86 --framework net6.0 && dotnet publish project.csproj --runtime win-x64 --framework net8.0\n return publishCmds.join(' && ');\n }\n\n /**\n * @param projectsToPackAndPush a string[] or {@link NugetRegistryInfo}[].\n * If a string[], the string must be the platform-dependent (not file://),\n * full path(s) to one or more projects with the .NET \"Pack\" MSBuild target.\n * See {@link https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack}\n * for command line usage.\n * @returns one or more command line strings joined with ' && '.\n * Each command line comprises the `dotnet pack` command, a project file path,\n * and a hardcoded output path (`--output ${cwd()}/publish`)\n */\n async function formatDotnetPack(\n projectsToPackAndPush: string[] | NugetRegistryInfo[],\n ): Promise<string | undefined> {\n if (projectsToPackAndPush.length === 0)\n return undefined;\n return await Promise.all(\n projectsToPackAndPush.map(async (proj) => {\n if (proj instanceof NugetRegistryInfo)\n return proj;\n\n const msbpArr: MSBuildProject[] = await Promise.all(await MSBuildProject.PackableProjectsToMSBuildProjects([proj]));\n if (msbpArr.length === 0 || msbpArr[0] === undefined) {\n throw new Error('This should be impossible!');\n }\n const msbp: MSBuildProject = msbpArr[0];\n\n evaluatedProjects.push(msbp);\n\n return new NugetRegistryInfo({ project: msbp });\n }),\n ).then((nriArray: NugetRegistryInfo[]): string => {\n return nriArray\n .map((nri: NugetRegistryInfo): string =>\n nri.GetPackCommand(NugetRegistryInfo.PackPackagesOptionsType.from({})),\n ).join(' && ');\n });\n }\n}\n\n/**\n * Prepare the CLI command to push NuGet packages. This should added to the `publishCmd` option of `@semantic-release/exec`\n *\n * Ensure your verifyConditionsCmd is set to prevent releases failing due to bad tokens or packages!\n * See {@link NugetRegistryInfo#PackDummyPackage}, {@link NugetRegistryInfo#GetPushDummyCommand}\n * @param registryInfos an array of {@link NugetRegistryInfo} (or derived classes) instances.\n * @param packageOutputPath Default: `${cwd()}/publish`.\\\n * The directory at which dotnet outputs the given projects' packages. Passed to\n * `dotnet pack` via the `--output` argument.\n * @returns a string of `dotnet pack` and `dotnet push` commands, joined by ' && '.\n */\nexport function configureDotnetNugetPush(\n registryInfos: NugetRegistryInfo[],\n // Explicit type required by JSR\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n packageOutputPath: string = `${cwd()}/publish`,\n): string {\n if (registryInfos.some(registry => registry.source.trim() === ''))\n throw new Error('The URL for one of the provided NuGet registries was empty or whitespace.');\n\n const packCmds = registryInfos.map(\n (nri): string =>\n nri.GetPackCommand(\n { output: packageOutputPath },\n true,\n true,\n ),\n );\n\n const pushCmds = registryInfos.map(nri => nri.GetPushCommand({ root: packageOutputPath }, true, true));\n\n return [...packCmds, ...pushCmds].join(' && ');\n}\n\n/**\n * You should try {@link ../../dotnet/SignAfterPack.targets}!.\n * @param opts A {@link DotnetNugetSignOptions} object to be deconstructed and\n * passed to `dotnet nuget sign` as args.\n * @returns `dotnet nuget sign {...}`\n */\nfunction formatDotnetNugetSign(\n opts: typeof DotnetNugetSignOptions.inferIn | undefined,\n): string | undefined {\n if (opts === undefined)\n return undefined;\n\n const validOpts = DotnetNugetSignOptions.from(opts);\n const args: ['--timestamper', typeof validOpts.timestamper, '-o', string, ...string[]] = [\n '--timestamper', validOpts.timestamper,\n '-o', validOpts.output ?? ourDefaultPubDir,\n ];\n if (validOpts.certificatePassword)\n args.push('---certificate-password', validOpts.certificatePassword);\n if (validOpts.hashAlgorithm)\n args.push('--hash-algorithm', validOpts.hashAlgorithm);\n if (validOpts.overwrite)\n args.push('--overwrite');\n if (validOpts.timestampHashAlgorithm)\n args.push('--timestamp-hash-algorithm', validOpts.timestampHashAlgorithm);\n if (validOpts.verbosity)\n args.push('-v', validOpts.verbosity);\n\n if ('certificatePath' in validOpts)\n args.push('--certificate-path', validOpts.certificatePath);\n else if ('certificateStoreName' in validOpts) {\n SetSubjectNameOrFingerprint();\n args.push('--certificate-store-name', validOpts.certificateStoreName);\n }\n else if ('certificateStoreLocation' in validOpts) {\n SetSubjectNameOrFingerprint();\n args.push('--certificate-store-location', validOpts.certificateStoreLocation);\n }\n else throw new Error('No code signing certificate was specified!');\n\n return `dotnet nuget sign ${args.join(' ')} `;\n\n // eslint-disable-next-line jsdoc/require-jsdoc\n function SetSubjectNameOrFingerprint() {\n if ('certificateSubjectName' in validOpts)\n args.push('--certificate-subject-name', validOpts.certificateSubjectName);\n\n else if ('certificateFingerprint' in validOpts)\n args.push('--certificate-fingerprint', validOpts.certificateFingerprint);\n else throw new Error('If certificateStoreName or certificateStoreLocation is set, either certificateSubjectName or certificateFingerprint must also be set!');\n }\n}\n\nconst DotnetNugetSignOptions: Type<\n {\n timestamper: Default<string, 'https://rfc3161.ai.moda/'>;\n certificatePassword?: string | undefined;\n hashAlgorithm?: string | undefined;\n output?: string | undefined;\n overwrite?: true | undefined;\n timestampHashAlgorithm?: string | undefined;\n verbosity?: 'q' | 'quiet' | 'm' | 'minimal' | 'n' | 'normal' | 'd' | 'detailed' | 'diag' | 'diagnostic';\n } & ({\n certificatePath: string;\n certificateSubjectName: string;\n } | {\n certificatePath: string;\n certificateFingerprint: string;\n } | {\n certificateStoreName: string;\n certificateSubjectName: string;\n } | {\n certificateStoreName: string;\n certificateFingerprint: string;\n } | {\n certificateStoreLocation: string;\n certificateSubjectName: string;\n } | {\n certificateStoreLocation: string;\n certificateFingerprint: string;\n })> = type({\n /**\n * Password for the certificate, if needed. This option can be used to specify\n * the password for the certificate. The command will throw an error message\n * if certificate is password protected but password is not provided as input.\n */\n 'certificatePassword?': 'string',\n /**\n * Hash algorithm to be used to sign the package. Defaults to SHA256.\n */\n 'hashAlgorithm?': 'string | \"SHA256\"',\n /**\n * Directory where the signed package(s) should be saved. By default the\n * original package is overwritten by the signed package.\n */\n 'output?': 'string',\n /**\n * Switch to indicate if the current signature should be overwritten. By\n * default the command will fail if the package already has a signature.\n */\n 'overwrite?': 'true',\n /**\n * URL to an RFC 3161 timestamping server.\n */\n timestamper: 'string = \"https://rfc3161.ai.moda/\"',\n /**\n * Hash algorithm to be used to sign the package. Defaults to SHA256.\n */\n 'timestampHashAlgorithm?': 'string | \"SHA256\"',\n /**\n * Set the verbosity level of the command. Allowed values are q[uiet],\n * m[inimal], n[ormal], d[etailed], and diag[nostic].\n */\n 'verbosity?': '\"q\"|\"quiet\"|\"m\"|\"minimal\"|\"n\"|\"normal\"|\"d\"|\"detailed\"|\"diag\"|\"diagnostic\"',\n}).and(\n type({\n /**\n * File path to the certificate to be used while signing the package.\n */\n certificatePath: 'string',\n }).or(\n type({\n /**\n * Name of the X.509 certificate store to use to search for the\n * certificate. Defaults to \"My\", the X.509 certificate store for personal\n * certificates.\n *\n * This option should be used when specifying the certificate via\n * --certificate-subject-name or --certificate-fingerprint options.\n */\n certificateStoreName: 'string',\n }).or({\n /**\n * Name of the X.509 certificate store use to search for the\n * certificate. Defaults to \"CurrentUser\", the X.509 certificate store\n * used by the current user.\n *\n * This option should be used when specifying the certificate via\n * --certificate-subject-name or --certificate-fingerprint options.\n */\n certificateStoreLocation: 'string',\n }),\n ).and(\n type({\n /**\n * Subject name of the certificate used to search a local certificate\n * store for the certificate. The search is a case-insensitive string\n * comparison using the supplied value, which will find all certificates\n * with the subject name containing that string, regardless of other\n * subject values. The certificate store can be specified by\n * --certificate-store-name and --certificate-store-location options.\n */\n certificateSubjectName: 'string',\n }).or({\n /**\n * SHA-256, SHA-384 or SHA-512 fingerprint of the certificate used to\n * search a local certificate store for the certificate. The certificate\n * store can be specified by --certificate-store-name and\n * --certificate-store-location options.\n */\n certificateFingerprint: 'string',\n }),\n ),\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.mjs","names":["MSBPP"],"sources":["../../src/dotnet/helpers.ts"],"sourcesContent":["import { type, type Type } from 'arktype';\n// eslint-disable-next-line unicorn/import-style\nimport * as path from 'node:path';\nimport { cwd } from 'node:process';\nimport { MSBuildProject } from './MSBuildProject.ts';\nimport { MSBuildProjectProperties as MSBPP } from './MSBuildProjectProperties.ts';\nimport { NugetRegistryInfo } from './NugetRegistryInfo.ts';\nimport type { Default } from 'arktype/internal/attributes.ts';\n\nconst ourDefaultPubDirectory = path.join('.', 'publish') as `.${'/' | '\\\\'}publish`;\n\n/**\n * Build a prepareCmd string from .NET projects.\\\n * This will include a `dotnet publish` for each project's RID and TFM permutation,\\\n * `dotnet pack` for each project with output paths separated by NuGet Source and PackageId,\\\n * and `dotnet nuget sign` for each nupkg output directory.\n * @todo parse Solution files to publish all projects with default Publish parameters (as evaluated by MSBuild).\n * @param projectsToPublish An array of relative or full file paths of `.csproj`\n * projects -OR- an array of {@link MSBuildProject} objects.\n * The project paths will be passed to `dotnet publish` commands.\n * @param projectsToPackAndPush\n * Relative and/or full file paths of projects to pass to `dotnet pack`. If\n * string[], only the default NuGet Source will be used. If GitHub, GitLab,\n * etc. are also desired, pass {@link NugetRegistryInfo}[]\n * @param dotnetNugetSignOpts A {@link DotnetNugetSignOptions} object. The value\n * of the `--output` argument will be set to {@link ourDefaultPubDir} if `undefined`.\n * @returns A single string of CLI commands joined by ' && '\n */\n// eslint-disable-next-line unicorn/name-replacements\nexport async function configurePrepareCmd(\n projectsToPublish: string[] | MSBuildProject[],\n projectsToPackAndPush?: string[] | NugetRegistryInfo[],\n // eslint-disable-next-line unicorn/name-replacements\n dotnetNugetSignOpts?: typeof DotnetNugetSignOptions.inferIn,\n): Promise<string> {\n const evaluatedProjects: MSBuildProject[] = projectsToPublish.filter(p => p instanceof MSBuildProject);\n\n if (projectsToPackAndPush) {\n for (const project of projectsToPackAndPush) {\n if (project instanceof NugetRegistryInfo)\n evaluatedProjects.push(project.project);\n }\n }\n\n const dotnetPublishCommand: string = await formatDotnetPublish(projectsToPublish);\n const dotnetPackCommand: string | undefined = await formatDotnetPack(projectsToPackAndPush ?? []);\n const dotnetNugetSignCommand: string | undefined = formatDotnetNugetSign(dotnetNugetSignOpts);\n\n return [\n dotnetPublishCommand,\n dotnetPackCommand,\n dotnetNugetSignCommand,\n // remove no-op commands\n ]\n .filter(v => v !== undefined)\n .join(' && ');\n\n /**\n * Create a string of CLI commands to run `dotnet publish` or the Publish\n * MSBuild target for one or more projects.\n * @async\n * @param projectsToPublish An array of one or more projects, either\n * pre-evaluated (see {@link MSBuildProject.Evaluate}) or as full file paths.\\\n * NOTE: Although `dotnet publish` allows directory or Solution file (.sln,\n * .slnx) paths, this function expects projects' full or relative file\n * paths.\n * @returns A Promise of a string. This string contains one or more `dotnet publish`\n * commands conjoined by \" && \". It may also include one or more\n * `dotnet msbuild ${...} -t:PublishAll -p:Configuration=Release` commands.\n */\n async function formatDotnetPublish(\n projectsToPublish: string[] | MSBuildProject[],\n ): Promise<string> {\n /* Fun Fact: You can define a property and get the evaluated value in the same command!\n ```pwsh\n dotnet msbuild .\\src\\HXE.csproj -property:RuntimeIdentifiers=\"\"\"place;holder\"\"\" -getProperty:RuntimeIdentifiers\n place;holder\n ```\n enclosing with \"\"\" is required in pwsh to prevent the semicolon from breaking the string.\n */\n if (!Array.isArray(projectsToPublish) || projectsToPublish.length === 0) {\n throw new Error(\n `Type of projectsToPublish (${typeof projectsToPublish}) is not allowed. Expected a string[] or MSBuildProject[] where length > 0.`,\n );\n }\n\n // each may have TargetFramework OR TargetFrameworks (plural)\n const evaluatedPublishProjects: MSBuildProject[] = await Promise.all(\n projectsToPublish.map(async (proj): Promise<MSBuildProject> => {\n if (proj instanceof MSBuildProject)\n return proj;\n\n // filter for projects whose full paths match the full path of the given string\n const filteredProjects = evaluatedProjects.filter(p =>\n p.Properties.MSBuildProjectFullPath === MSBPP.GetFullPath(proj),\n );\n\n // if no pre-existing MSBuildProject found,\n // evaluate a new one and push it\n if (filteredProjects.length === 0) {\n const _proj = await MSBuildProject.Evaluate({\n FullName: proj,\n GetProperty: MSBuildProject.MatrixProperties,\n GetItem: [],\n GetTargetResult: [],\n Property: {},\n Targets: ['Restore'],\n });\n evaluatedProjects.push(_proj);\n return _proj;\n }\n\n /**\n * Finds and returns the subjectively \"best\" project in {@link filteredProjects}\n * @returns the subjective \"best\" project in {@link filteredProjects}\n */\n function getBest() {\n let best: MSBuildProject | undefined;\n if (filteredProjects.length > 0 && (best = filteredProjects[0]) instanceof MSBuildProject)\n return best;\n throw new Error('No MSBuildProjects could be found!');\n }\n\n /*\n todo: improve filtering to select \"optimal\" instance.\n Which properties are most-needed?\n For now, we just pray the project has a well-defined publish flow e.g.\n @halospv3/hce.shared-config/dotnet/PublishAll.targets\n */\n return getBest();\n }),\n );\n\n /**\n * Returns an array of one or more `dotnet` arguments.\n * @param proj An {@link MSBuildProject} to be published for one or more\n * runtime-framework combinations.\n * @returns If {@link proj} imports {@link ../../dotnet/PublishAll.targets}...\n * ```\n * [`${proj.Properties.MSBuildProjectFullPath} -t:PublishAll -p:Configuration=Release`]\n * ```\n * Else, an array of `dotnet publish` arguments permutations e.g.\n * ```\n * [\n * 'myProj.csproj --runtime win7-x86 --framework net6.0',\n * 'myProj.csproj --runtime win7-x64 --framework net6.0'\n * ]\n * ```\n * @example\n * const publishCmdArray = [];\n * const permutations = getPublishArgsPermutations(msbuildProject);\n * for (const permutation of permutations) {\n * if (permutation[0] === 'PublishAll') {\n * // 'dotnet msbuild full/path/to/myProj.csproj t:PublishAll'\n * publishCmdArray.push(`dotnet msbuild ${permutation[1]}`)\n * }\n * else {\n * publishCmdArray.push(`dotnet publish ${permutation}`)\n * }\n * }\n * // return array as success-chained CLI commands.\n * return publishCmdArray.join(' && ');\n */\n function getPublishArgumentsPermutations(proj: MSBuildProject):\n ([`\"${typeof proj.Properties.MSBuildProjectFullPath}\" -t:PublishAll -p:Configuration=Release`])\n | ([`\"${typeof proj.Properties.MSBuildProjectFullPath}\"`])\n | (`\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string} --framework ${string}`)[]\n | (`\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string}`)[]\n | (`\"${typeof proj.Properties.MSBuildProjectFullPath}\" --framework ${string}`)[] {\n /**\n * If the project imports PublishAll to publish for each TFM-RID\n * permutation, return the appropriate command line.\n */\n if (proj.Targets.includes('PublishAll'))\n return [`\"${proj.Properties.MSBuildProjectFullPath}\" -t:PublishAll -p:Configuration=Release`];\n\n // #region formatFrameworksAndRuntimes\n const tfmRidPermutations: `--runtime ${string} --framework ${string}`[]\n | `--runtime ${string}`[]\n | `--framework ${string}`[]\n = []; // forEach, run dotnet [proj.Properties.MSBuildProjectFullPath,...v]\n const RIDs: string[] = proj.Properties.RuntimeIdentifiers.split(';').filter(v => v !== '');\n const TFMs: string[] = proj.Properties.TargetFrameworks.split(';').filter(v => v !== '');\n\n if (TFMs.length === 0 && RIDs.length === 0)\n return [`\"${proj.Properties.MSBuildProjectFullPath}\"`] as [`\"${string}\"`];\n\n if (RIDs.length > 0) {\n if (TFMs.length > 0) {\n for (const RID of RIDs) {\n for (const TFM of TFMs) {\n (tfmRidPermutations as `--runtime ${string} --framework ${string}`[]).push(\n `--runtime ${RID} --framework ${TFM}`,\n );\n }\n }\n }\n else {\n // assume singular TFM. No need to specify it.\n for (const RID of RIDs) {\n (tfmRidPermutations as `--runtime ${string}`[]).push(\n `--runtime ${RID}`,\n );\n }\n }\n }\n else if (TFMs.length > 0) {\n for (const TFM of TFMs) {\n (tfmRidPermutations as `--framework ${string}`[]).push(`--framework ${TFM}`);\n }\n }\n\n /** prepend each set of args with the project's path */\n return tfmRidPermutations.map(permArguments =>\n `\"${proj.Properties.MSBuildProjectFullPath}\" ${permArguments}`,\n ) as `\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string} --framework ${string}`[]\n | `\"${typeof proj.Properties.MSBuildProjectFullPath}\" --runtime ${string}`[]\n | `\"${typeof proj.Properties.MSBuildProjectFullPath}\" --framework ${string}`[];\n // #endregion formatFrameworksAndRuntimes\n }\n\n const publishCmds: (`dotnet publish \"${string}\"` | `dotnet publish \"${string}\" ${string}` | `dotnet msbuild \"${string}\" -t:PublishAll -p:Configuration=Release`)[] = [];\n /** convert {@link evaluatedPublishProjects} to sets of space-separated CLI args. */\n const argumentsSets = evaluatedPublishProjects.map(\n proj => getPublishArgumentsPermutations(proj),\n );\n for (const arguments_ of argumentsSets) {\n if (typeof arguments_ === 'string')\n throw new Error(`\\`args\\` should not be a string!`);\n for (const permutation of arguments_) {\n if (typeof permutation === 'string' && permutation.length === 1)\n throw new Error('Something has gone terribly wrong. A `dotnet publish` argument set was split to single characters!');\n if (/\".+\" -t:PublishAll -p:Configuration=Release/.test(permutation))\n publishCmds.push(`dotnet msbuild ${permutation as `\"${string}\" -t:PublishAll -p:Configuration=Release`}`);\n else\n publishCmds.push(`dotnet publish ${permutation}`);\n }\n }\n\n // For each argSet, create a new exec command. Then, join all commands with ' && ' so they are executed serially, synchronously.\n // e.g. `dotnet publish project.csproj --runtime win7-x86 --framework net6.0 && dotnet publish project.csproj --runtime win-x64 --framework net8.0\n return publishCmds.join(' && ');\n }\n\n /**\n * @param projectsToPackAndPush a string[] or {@link NugetRegistryInfo}[].\n * If a string[], the string must be the platform-dependent (not file://),\n * full path(s) to one or more projects with the .NET \"Pack\" MSBuild target.\n * See {@link https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack}\n * for command line usage.\n * @returns one or more command line strings joined with ' && '.\n * Each command line comprises the `dotnet pack` command, a project file path,\n * and a hardcoded output path (`--output ${cwd()}/publish`)\n */\n async function formatDotnetPack(\n projectsToPackAndPush: string[] | NugetRegistryInfo[],\n ): Promise<string | undefined> {\n if (projectsToPackAndPush.length === 0)\n return undefined;\n const nriArray = await Promise.all(\n projectsToPackAndPush.map(async (proj) => {\n if (proj instanceof NugetRegistryInfo)\n return proj;\n\n const msbpArray: MSBuildProject[] = await Promise.all(await MSBuildProject.PackableProjectsToMSBuildProjects([proj]));\n if (msbpArray.length === 0 || msbpArray[0] === undefined) {\n throw new Error('This should be impossible!');\n }\n const msbp: MSBuildProject = msbpArray[0];\n\n evaluatedProjects.push(msbp);\n\n return new NugetRegistryInfo({ project: msbp });\n }),\n );\n\n return nriArray\n .map((nri: NugetRegistryInfo): string =>\n nri.GetPackCommand(NugetRegistryInfo.PackPackagesOptionsType.from({})),\n ).join(' && ');\n }\n}\n\n/**\n * Prepare the CLI command to push NuGet packages. This should added to the `publishCmd` option of `@semantic-release/exec`\n *\n * Ensure your verifyConditionsCmd is set to prevent releases failing due to bad tokens or packages!\n * See {@link NugetRegistryInfo#PackDummyPackage}, {@link NugetRegistryInfo#GetPushDummyCommand}\n * @param registryInfos an array of {@link NugetRegistryInfo} (or derived classes) instances.\n * @param packageOutputPath Default: `${cwd()}/publish`.\\\n * The directory at which dotnet outputs the given projects' packages. Passed to\n * `dotnet pack` via the `--output` argument.\n * @returns a string of `dotnet pack` and `dotnet push` commands, joined by ' && '.\n */\nexport function configureDotnetNugetPush(\n registryInfos: NugetRegistryInfo[],\n // Explicit type required by JSR\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n packageOutputPath: string = `${cwd()}/publish`,\n): string {\n if (registryInfos.some(registry => registry.source.trim() === ''))\n throw new Error('The URL for one of the provided NuGet registries was empty or whitespace.');\n\n const packCmds = registryInfos.map(\n (nri): string =>\n nri.GetPackCommand(\n { output: packageOutputPath },\n true,\n true,\n ),\n );\n\n const pushCmds = registryInfos.map(nri => nri.GetPushCommand({ root: packageOutputPath }, true, true));\n\n return [...packCmds, ...pushCmds].join(' && ');\n}\n\n/**\n * You should try {@link ../../dotnet/SignAfterPack.targets}!.\n * @param opts A {@link DotnetNugetSignOptions} object to be deconstructed and\n * passed to `dotnet nuget sign` as args.\n * @returns `dotnet nuget sign {...}`\n */\nfunction formatDotnetNugetSign(\n // eslint-disable-next-line unicorn/name-replacements\n opts: typeof DotnetNugetSignOptions.inferIn | undefined,\n): string | undefined {\n if (opts === undefined)\n return undefined;\n\n const validOptions = DotnetNugetSignOptions.from(opts);\n const arguments_: ['--timestamper', typeof validOptions.timestamper, '-o', string, ...string[]] = [\n '--timestamper', validOptions.timestamper,\n '-o', validOptions.output ?? ourDefaultPubDirectory,\n ];\n if (validOptions.certificatePassword)\n arguments_.push('---certificate-password', validOptions.certificatePassword);\n if (validOptions.hashAlgorithm)\n arguments_.push('--hash-algorithm', validOptions.hashAlgorithm);\n if (validOptions.overwrite)\n arguments_.push('--overwrite');\n if (validOptions.timestampHashAlgorithm)\n arguments_.push('--timestamp-hash-algorithm', validOptions.timestampHashAlgorithm);\n if (validOptions.verbosity)\n arguments_.push('-v', validOptions.verbosity);\n\n if ('certificatePath' in validOptions)\n arguments_.push('--certificate-path', validOptions.certificatePath);\n else if ('certificateStoreName' in validOptions) {\n SetSubjectNameOrFingerprint();\n arguments_.push('--certificate-store-name', validOptions.certificateStoreName);\n }\n else if ('certificateStoreLocation' in validOptions) {\n SetSubjectNameOrFingerprint();\n arguments_.push('--certificate-store-location', validOptions.certificateStoreLocation);\n }\n else throw new Error('No code signing certificate was specified!');\n\n return `dotnet nuget sign ${arguments_.join(' ')} `;\n\n // eslint-disable-next-line jsdoc/require-jsdoc\n function SetSubjectNameOrFingerprint() {\n if ('certificateSubjectName' in validOptions)\n arguments_.push('--certificate-subject-name', validOptions.certificateSubjectName);\n\n else if ('certificateFingerprint' in validOptions)\n arguments_.push('--certificate-fingerprint', validOptions.certificateFingerprint);\n else throw new Error('If certificateStoreName or certificateStoreLocation is set, either certificateSubjectName or certificateFingerprint must also be set!');\n }\n}\n\nconst DotnetNugetSignOptions: Type<\n {\n timestamper: Default<string, 'https://rfc3161.ai.moda/'>;\n certificatePassword?: string | undefined;\n hashAlgorithm?: string | undefined;\n output?: string | undefined;\n overwrite?: true | undefined;\n timestampHashAlgorithm?: string | undefined;\n verbosity?: 'q' | 'quiet' | 'm' | 'minimal' | 'n' | 'normal' | 'd' | 'detailed' | 'diag' | 'diagnostic';\n } & ({\n certificatePath: string;\n certificateSubjectName: string;\n } | {\n certificatePath: string;\n certificateFingerprint: string;\n } | {\n certificateStoreName: string;\n certificateSubjectName: string;\n } | {\n certificateStoreName: string;\n certificateFingerprint: string;\n } | {\n certificateStoreLocation: string;\n certificateSubjectName: string;\n } | {\n certificateStoreLocation: string;\n certificateFingerprint: string;\n })> = type({\n /**\n * Password for the certificate, if needed. This option can be used to specify\n * the password for the certificate. The command will throw an error message\n * if certificate is password protected but password is not provided as input.\n */\n 'certificatePassword?': 'string',\n /**\n * Hash algorithm to be used to sign the package. Defaults to SHA256.\n */\n 'hashAlgorithm?': 'string | \"SHA256\"',\n /**\n * Directory where the signed package(s) should be saved. By default the\n * original package is overwritten by the signed package.\n */\n 'output?': 'string',\n /**\n * Switch to indicate if the current signature should be overwritten. By\n * default the command will fail if the package already has a signature.\n */\n 'overwrite?': 'true',\n /**\n * URL to an RFC 3161 timestamping server.\n */\n timestamper: 'string = \"https://rfc3161.ai.moda/\"',\n /**\n * Hash algorithm to be used to sign the package. Defaults to SHA256.\n */\n 'timestampHashAlgorithm?': 'string | \"SHA256\"',\n /**\n * Set the verbosity level of the command. Allowed values are q[uiet],\n * m[inimal], n[ormal], d[etailed], and diag[nostic].\n */\n 'verbosity?': '\"q\"|\"quiet\"|\"m\"|\"minimal\"|\"n\"|\"normal\"|\"d\"|\"detailed\"|\"diag\"|\"diagnostic\"',\n}).and(\n type({\n /**\n * File path to the certificate to be used while signing the package.\n */\n certificatePath: 'string',\n }).or(\n type({\n /**\n * Name of the X.509 certificate store to use to search for the\n * certificate. Defaults to \"My\", the X.509 certificate store for personal\n * certificates.\n *\n * This option should be used when specifying the certificate via\n * --certificate-subject-name or --certificate-fingerprint options.\n */\n certificateStoreName: 'string',\n }).or({\n /**\n * Name of the X.509 certificate store use to search for the\n * certificate. Defaults to \"CurrentUser\", the X.509 certificate store\n * used by the current user.\n *\n * This option should be used when specifying the certificate via\n * --certificate-subject-name or --certificate-fingerprint options.\n */\n certificateStoreLocation: 'string',\n }),\n ).and(\n type({\n /**\n * Subject name of the certificate used to search a local certificate\n * store for the certificate. The search is a case-insensitive string\n * comparison using the supplied value, which will find all certificates\n * with the subject name containing that string, regardless of other\n * subject values. The certificate store can be specified by\n * --certificate-store-name and --certificate-store-location options.\n */\n certificateSubjectName: 'string',\n }).or({\n /**\n * SHA-256, SHA-384 or SHA-512 fingerprint of the certificate used to\n * search a local certificate store for the certificate. The certificate\n * store can be specified by --certificate-store-name and\n * --certificate-store-location options.\n */\n certificateFingerprint: 'string',\n }),\n ),\n);\n"],"mappings":"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"}
|
package/mjs/eslintConfig.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslintConfig.mjs","names":["globalIgnores","setGlobalIgnores"],"sources":["../src/eslintConfig.ts"],"sourcesContent":["import eslint from '@eslint/js';\nimport { defineConfig, globalIgnores as setGlobalIgnores } from 'eslint/config';\nimport { type Linter } from 'eslint';\nimport stylistic, { type RuleOptions } from '@stylistic/eslint-plugin';\nimport json from '@eslint/json';\nimport globals from 'globals/globals.json' with { type: 'json' };\nimport tseslint from 'typescript-eslint';\n\n// https://eslint.org/docs/latest/use/configure/migration-guide#using-eslintrc-configs-in-flat-config\n// https://www.google.com/search?q=javascript+recurse+through+object+and+remove+undefined+properties\n\nconst globalIgnores: ReturnType<typeof setGlobalIgnores> = setGlobalIgnores([\n '_tsout/**/*',\n '_tsout/*',\n '_tsout/',\n 'cjs/**/*',\n 'cjs/*/*',\n 'cjs/*',\n 'mjs/**/*',\n 'mjs/*',\n 'mjs/',\n 'node_modules/**/*',\n '**/node_modules/**/*',\n '**/*.tsbuildinfo',\n '**/bin/**/*',\n '**/obj/**/*',\n '.pnp.cjs',\n '.pnp.loader.mjs',\n '.yarn/sdks/**',\n]);\n\nconst stylisticWarn: Linter.Config = stylistic.configs.customize({\n quoteProps: 'as-needed',\n semi: true,\n indent: 2,\n severity: 'warn',\n});\nstylisticWarn.rules ??= {};\n\nstylisticWarn.rules['@stylistic/no-extra-parens'] = [\n 'warn',\n 'all',\n {\n allowParensAfterCommentPattern: '@type|@satisfies',\n nestedBinaryExpressions: false,\n },\n] satisfies Linter.RuleEntry<RuleOptions['@stylistic/no-extra-parens']>;\n\nstylisticWarn.rules['@stylistic/semi'] = [\n 'warn',\n 'always',\n {\n omitLastInOneLineBlock: false,\n omitLastInOneLineClassBody: false,\n },\n] satisfies Linter.RuleEntry<RuleOptions['@stylistic/semi']>;\n\nconst config: ReturnType<typeof defineConfig> = defineConfig(\n { ...json.configs.recommended, name: 'JSON Recommended', files: ['**/*.json'], ignores: ['**/.vscode/*.json'], language: 'json/json' },\n { name: 'JSON - Allow empty keys in package-lock.json', files: ['**/package-lock.json'], rules: { 'json/no-empty-keys': 'off' } },\n { ...json.configs.recommended, name: 'JSONC Recommended', files: ['**/*.jsonc', '**/.vscode/*.json'], language: 'json/jsonc' },\n { ...json.configs.recommended, name: 'JSON5 Recommended', files: ['**/*.json5'], language: 'json/json5' },\n {\n name: 'TSJS',\n extends: [\n eslint.configs.recommended,\n ...tseslint.configs.strictTypeChecked,\n ...tseslint.configs.stylisticTypeChecked,\n stylisticWarn,\n ],\n files: [\n '**/*.ts',\n '**/*.cts',\n '**/*.mts',\n '**/*.js',\n '**/*.cjs',\n '**/*.mjs',\n '**/*.jsx',\n '**/*.tsx',\n ],\n ignores: globalIgnores.ignores,\n languageOptions: {\n parserOptions: {\n projectService: true,\n },\n globals: globals.node,\n },\n },\n globalIgnores,\n);\nexport default config;\n"],"mappings":";;;;;;;;AAWA,MAAMA,kBAAqDC,cAAiB;CAC1E;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;
|
|
1
|
+
{"version":3,"file":"eslintConfig.mjs","names":["globalIgnores","setGlobalIgnores"],"sources":["../src/eslintConfig.ts"],"sourcesContent":["import eslint from '@eslint/js';\nimport { defineConfig, globalIgnores as setGlobalIgnores } from 'eslint/config';\nimport { type Linter } from 'eslint';\nimport stylistic, { type RuleOptions } from '@stylistic/eslint-plugin';\nimport json from '@eslint/json';\nimport globals from 'globals/globals.json' with { type: 'json' };\nimport tseslint from 'typescript-eslint';\n\n// https://eslint.org/docs/latest/use/configure/migration-guide#using-eslintrc-configs-in-flat-config\n// https://www.google.com/search?q=javascript+recurse+through+object+and+remove+undefined+properties\n\nconst globalIgnores: ReturnType<typeof setGlobalIgnores> = setGlobalIgnores([\n '_tsout/**/*',\n '_tsout/*',\n '_tsout/',\n 'cjs/**/*',\n 'cjs/*/*',\n 'cjs/*',\n 'mjs/**/*',\n 'mjs/*',\n 'mjs/',\n 'node_modules/**/*',\n '**/node_modules/**/*',\n '**/*.tsbuildinfo',\n '**/bin/**/*',\n '**/obj/**/*',\n '.pnp.cjs',\n '.pnp.loader.mjs',\n '.yarn/sdks/**',\n]);\n\nconst stylisticWarn: Linter.Config = stylistic.configs.customize({\n quoteProps: 'as-needed',\n semi: true,\n indent: 2,\n severity: 'warn',\n});\nstylisticWarn.rules ??= {};\n\nstylisticWarn.rules['@stylistic/no-extra-parens'] = [\n 'warn',\n 'all',\n {\n allowParensAfterCommentPattern: '@type|@satisfies',\n nestedBinaryExpressions: false,\n },\n] satisfies Linter.RuleEntry<RuleOptions['@stylistic/no-extra-parens']>;\n\nstylisticWarn.rules['@stylistic/semi'] = [\n 'warn',\n 'always',\n {\n omitLastInOneLineBlock: false,\n omitLastInOneLineClassBody: false,\n },\n] satisfies Linter.RuleEntry<RuleOptions['@stylistic/semi']>;\n\nconst config: ReturnType<typeof defineConfig> = defineConfig(\n { ...json.configs.recommended, name: 'JSON Recommended', files: ['**/*.json'], ignores: ['**/.vscode/*.json'], language: 'json/json' },\n { name: 'JSON - Allow empty keys in package-lock.json', files: ['**/package-lock.json'], rules: { 'json/no-empty-keys': 'off' } },\n { ...json.configs.recommended, name: 'JSONC Recommended', files: ['**/*.jsonc', '**/.vscode/*.json'], language: 'json/jsonc' },\n { ...json.configs.recommended, name: 'JSON5 Recommended', files: ['**/*.json5'], language: 'json/json5' },\n {\n name: 'TSJS',\n extends: [\n eslint.configs.recommended,\n ...tseslint.configs.strictTypeChecked,\n ...tseslint.configs.stylisticTypeChecked,\n stylisticWarn,\n ],\n files: [\n '**/*.ts',\n '**/*.cts',\n '**/*.mts',\n '**/*.js',\n '**/*.cjs',\n '**/*.mjs',\n '**/*.jsx',\n '**/*.tsx',\n ],\n ignores: globalIgnores.ignores,\n languageOptions: {\n parserOptions: {\n projectService: true,\n },\n globals: globals.node,\n },\n },\n globalIgnores,\n);\nexport default config;\n"],"mappings":";;;;;;;;AAWA,MAAMA,kBAAqDC,cAAiB;CAC1E;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,gBAA+B,UAAU,QAAQ,UAAU;CAC/D,YAAY;CACZ,MAAM;CACN,QAAQ;CACR,UAAU;AACZ,CAAC;AACD,cAAc,UAAU,CAAC;AAEzB,cAAc,MAAM,gCAAgC;CAClD;CACA;CACA;EACE,gCAAgC;EAChC,yBAAyB;CAC3B;AACF;AAEA,cAAc,MAAM,qBAAqB;CACvC;CACA;CACA;EACE,wBAAwB;EACxB,4BAA4B;CAC9B;AACF;AAEA,MAAM,SAA0C,aAC9C;CAAE,GAAG,KAAK,QAAQ;CAAa,MAAM;CAAoB,OAAO,CAAC,WAAW;CAAG,SAAS,CAAC,mBAAmB;CAAG,UAAU;AAAY,GACrI;CAAE,MAAM;CAAgD,OAAO,CAAC,sBAAsB;CAAG,OAAO,EAAE,sBAAsB,MAAM;AAAE,GAChI;CAAE,GAAG,KAAK,QAAQ;CAAa,MAAM;CAAqB,OAAO,CAAC,cAAc,mBAAmB;CAAG,UAAU;AAAa,GAC7H;CAAE,GAAG,KAAK,QAAQ;CAAa,MAAM;CAAqB,OAAO,CAAC,YAAY;CAAG,UAAU;AAAa,GACxG;CACE,MAAM;CACN,SAAS;EACP,OAAO,QAAQ;EACf,GAAG,SAAS,QAAQ;EACpB,GAAG,SAAS,QAAQ;EACpB;CACF;CACA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,SAASD,gBAAc;CACvB,iBAAiB;EACf,eAAe,EACb,gBAAgB,KAClB;EACA,SAAS,QAAQ;CACnB;AACF,GACAA,eACF"}
|
package/mjs/insertPlugins.mjs
CHANGED
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
*/
|
|
17
17
|
function insertPlugin(plugins, afterPluginsIDs, insertPluginIDs, beforePluginsIDs) {
|
|
18
18
|
const pluginIDs = plugins.map((v) => typeof v === "string" ? v : v[0]);
|
|
19
|
-
const indexOfLastAfter = afterPluginsIDs.filter((v) => pluginIDs.includes(v)).map((v) => pluginIDs.indexOf(v)).sort().find((_v,
|
|
19
|
+
const indexOfLastAfter = afterPluginsIDs.filter((v) => pluginIDs.includes(v)).map((v) => pluginIDs.indexOf(v)).sort((a, b) => a - b).find((_v, index, object) => index === object.length - 1);
|
|
20
20
|
if (void 0 === indexOfLastAfter) throw new ReferenceError("An attempt to get the last element of an array returned undefined.");
|
|
21
|
-
const indicesOfBefore = beforePluginsIDs.filter((v) => pluginIDs.includes(v)).map((v) => pluginIDs.indexOf(v)).sort();
|
|
21
|
+
const indicesOfBefore = beforePluginsIDs.filter((v) => pluginIDs.includes(v)).map((v) => pluginIDs.indexOf(v)).sort((a, b) => a - b);
|
|
22
22
|
const errors = [];
|
|
23
23
|
for (const index of indicesOfBefore) if (index <= indexOfLastAfter) errors.push(/* @__PURE__ */ new Error(`insertPlugin was instructed to insert one or more plugins after [${afterPluginsIDs.map((v) => "\"" + v + "\"").join(", ")}] and before [${beforePluginsIDs.map((v) => `"${v}"`).join(", ")}], but ${JSON.stringify(pluginIDs[indexOfLastAfter])} comes after ${JSON.stringify(pluginIDs[index])}!`));
|
|
24
24
|
if (errors.length > 0) throw new AggregateError(errors, "One or more errors occurred while inserting plugin configs into the Semantic Release config!");
|