@halospv3/hce.shared-config
Version:
Automate commit message quality, changelogs, and CI/CD releases. Its `main` entry point is a Semantic Release config. Functions and classes are exposed for customization. An ESLint config, a Commitlint config, and addl. resources for .NET projects are als
1 lines • 26.5 kB
Source Map (JSON)
{"version":3,"file":"semanticReleaseConfigDotnet.mjs","names":["getEnvironmentVariableValue","debug","configurePrepareCommand"],"sources":["../src/semanticReleaseConfigDotnet.ts"],"sourcesContent":["/**\n * # Semantic-Release Config Factory (dotnet)\n * A functional Semantic-Release configuration for dotnet projects\n *\n * extends {@link baseConfig }\n *\n * <-- TABLE OF CONTENTS -->\n *\n * EASY: {@link getConfig}\n * Just provide the paths of the project file(s) and keep your API tokens ready.\n * ADVANCED: {@link SemanticReleaseConfigDotnet}\n * Allows for a hands-on customization if {@link getConfig} doesn't meet your needs.\n * Use a copy of {@link getConfig} as the starting point of a new function and make changes from there.\n * - {@link SemanticReleaseConfigDotnet#splicePlugin splicePlugin (insert/edit plugins)}\n * - {@link SemanticReleaseConfigDotnet#setupDotnetCommands setupDotnetCommands}\n * - {@link SemanticReleaseConfigDotnet#getTokenTestingCommands getTokenTestingCommands}\n */\n\nimport { inspect } from 'node:util';\nimport type { Options } from 'semantic-release';\n// @ts-types=\"./semantic-release__exec.d.ts\"\nimport type { Options as SRExecOptions } from '@semantic-release/exec';\nimport * as console from 'node:console';\nimport debug from './debug.ts';\nimport { configureDotnetNugetPush, configurePrepareCmd as configurePrepareCommand } from './dotnet/helpers.ts';\nimport { getEnvVarValue as getEnvironmentVariableValue } from './utils/env.ts';\nimport { baseConfig } from './semanticReleaseConfig.ts';\nimport { NugetRegistryInfo } from './dotnet/NugetRegistryInfo.ts';\nimport { MSBuildProject } from './dotnet/MSBuildProject.ts';\nimport { insertPlugin } from './insertPlugins.ts';\nimport { CaseInsensitiveMap } from './CaseInsensitiveMap.ts';\n\ntype UnArray<T> = T extends (infer U)[] ? U : T;\ninterface SRConfigDotnetOptions extends Omit<typeof baseConfig, 'plugins'> {\n plugins: (UnArray<typeof baseConfig.plugins> | [string, unknown])[];\n}\n\nexport class SemanticReleaseConfigDotnet {\n private readonly options: SRConfigDotnetOptions;\n private readonly _projectsToPublish: string[] | MSBuildProject[];\n private _projectsToPackAndPush: string[] | NugetRegistryInfo[];\n private readonly _evaluatedProjects: MSBuildProject[];\n\n /**\n * Creates an instance of SemanticReleaseConfigDotnet.\n * Configures {@link baseConfig} with `@semantic-release/exec` to `dotnet` publish, pack, and push.\n *\n * Note: To sign packages, create a Target in the corresponding project(s) e.g.\n * ```xml\n * <Target Name=\"SignNupkgs\" AfterTargets=\"Pack\">\n * <Exec Command=\"dotnet nuget sign $(PackageOutputPath) [remaining args]\" ConsoleToMsBuild=\"true\" />\n * </Target>\n * ```\n * Alternatively, splice your signing commands into the publishCmd string,\n * inserting them before `dotnet nuget push`.\n * If you sign different signatures depending on the NuGet registry,\n * splice your signing command (with \"overwrite signature\" enabled, if\n * desired) before the corresponding registry's `dotnet nuget push` command.\n * @param projectsToPublish An array of dotnet projects' relative paths. If\n * empty or unspecified, tries getting projects' semi-colon-separated relative\n * paths from the `PROJECTS_TO_PUBLISH` environment variable. If configured as\n * recommended, the projects' publish outputs will be zipped to '$PWD/publish'\n * for use in the `publish` semantic-release step (typically, GitHub release).\n * @param projectsToPackAndPush An array of dotnet projects' relative paths.\n * If `null`, `undefined`, or `[]`; tries getting projects' semi-colon-separated\n * relative paths from the `PROJECTS_TO_PACK_AND_PUSH` environment variable.\n * If neither is defined, no packages will be packed and pushed.\n * If configured as recommended, `dotnet pack` will output the nupkg/snupkg\n * files to `$PWD/publish` where they will be globbed by `dotnet nuget push`.\n */\n constructor(\n projectsToPublish: string[] | MSBuildProject[],\n projectsToPackAndPush?: string[] | NugetRegistryInfo[] | null,\n ) {\n this.options = baseConfig;\n /* normalize PluginSpecs to tuples */\n this.options.plugins = this.options.plugins.map(pluginSpec => typeof pluginSpec === 'string'\n ? [pluginSpec, {}]\n : pluginSpec,\n );\n\n this._projectsToPublish = projectsToPublish;\n if (this._projectsToPublish.length === 0) {\n const p = getEnvironmentVariableValue('PROJECTS_TO_PUBLISH')?.split(';');\n if (p && p.length > 0) {\n this._projectsToPublish = p;\n }\n else if (debug.enabled) {\n debug(new Error('At least one project must be published. `projectsToPackAndPush` is empty and environment variable `PROJECTS_TO_PUBLISH` is undefined or empty.'));\n }\n }\n\n this._projectsToPackAndPush = projectsToPackAndPush ?? [];\n if (this._projectsToPackAndPush.length === 0) {\n const p = getEnvironmentVariableValue('PROJECTS_TO_PACK_AND_PUSH')?.split(';');\n if (p && p.length > 0) {\n this._projectsToPackAndPush = p;\n }\n else if (debug.enabled) {\n debug('projectsToPackAndPush is undefined. dotnet-pack and dotnet-nuget-push setup will be skipped.');\n }\n }\n\n // may be zero-length array\n this._evaluatedProjects = [\n ...this._projectsToPublish.filter(v => v instanceof MSBuildProject),\n ...this._projectsToPackAndPush\n .filter(v => v instanceof NugetRegistryInfo)\n .map(v => v.project),\n ];\n }\n\n get ProjectsToPublish(): string[] | MSBuildProject[] {\n return this._projectsToPublish;\n }\n\n get ProjectsToPackAndPush(): string[] | NugetRegistryInfo[] {\n return this._projectsToPackAndPush;\n }\n\n get EvaluatedProjects(): MSBuildProject[] {\n return this._evaluatedProjects;\n }\n\n // eslint-disable-next-line jsdoc/require-param\n /** @deprecated Superseded by {@link splicePlugin} */\n insertPlugin(\n afterPluginsIDs: string[],\n insertPluginIDs: string[],\n beforePluginsIDs: string[],\n ): void {\n this.options.plugins = insertPlugin(this.options.plugins, afterPluginsIDs, insertPluginIDs, beforePluginsIDs);\n }\n\n /**\n * generate dotnet commands for \\@semantic-release/exec, appending commands with ' && ' when necessary.\n *\n * Note: All strings in {@link this.ProjectsToPackAndPush} will be converted to basic {@link NugetRegistryInfo} instances with default values.\n * If you need specific NRI settings or you need to push to GitLab-like or GitHub-like registries, instantiate them instead of passing their paths.\n * @todo change to builder method? e.g. static async SetupDotnetCommands(this: SemanticReleaseConfigDotnet): Promise<SemanticReleaseConfigDotnet>\n * @todo Add options param to allow users to enable pushing to GitLab, GitHub, NuGet.org with default settings -OR- with entirely custom settings.\n * @see https://github.com/semantic-release/exec#usage\n */\n async setupDotnetCommands(): Promise<void> {\n let srExecIndex = this.options.plugins.findIndex(\n v => v[0] === '@semantic-release/exec',\n );\n if (srExecIndex === -1) {\n const message = `\\\nUnable to find\\`['@semantic-release/exec', unknown]\\` in plugins array!\nAppending it to the end of the array...This may cause an unexpected order of operations!`;\n console.warn(message);\n this.options.plugins.push(['@semantic-release/exec', {}]);\n srExecIndex = this.options.plugins.length - 1;\n }\n\n const plugin = this.options.plugins[srExecIndex] as ['@semantic-release/exec', SRExecOptions];\n const execOptions: SRExecOptions = plugin[1];\n\n debug('Evaluating all projects with dotnet CLI...This may take a while.');\n\n const referenceCounter = new CaseInsensitiveMap<string, number>();\n const projectPromiseArrayArray = await Promise.all(\n this._projectsToPackAndPush.map(async (project) => {\n if (typeof project === 'string') {\n debug(`Evaluating path \"${project}\" with \"PackableProjectsToMSBuildProjects\"...`);\n const packableProjects = await Promise.all(\n await MSBuildProject.PackableProjectsToMSBuildProjects(\n [project],\n ),\n );\n if (packableProjects.length === 0)\n throw new Error('No MSBuildProject instances were returned!');\n this._evaluatedProjects.push(...packableProjects);\n const variant = (referenceCounter.get(project) ?? 0) + packableProjects.length;\n referenceCounter.set(\n project,\n variant,\n );\n\n debug(`Done. Path \"${project}\" evaluated for ${packableProjects.length.toString()} MSBuildProject instances for a total of ${variant.toString()} variants of the given path.`);\n\n // if the user doesn't want a defaulted NRI, they should pass their own NRI (or derived) instance.\n return packableProjects.map(project => new NugetRegistryInfo({ project }));\n }\n\n const path = project.project.Properties.MSBuildProjectFullPath;\n const variant = (referenceCounter.get(path) ?? 0) + 1;\n referenceCounter.set(path, variant);\n debug(`Done. Path \"${path}\" (variant ${variant.toString()}) is pre-evaluated. Skipping re-evaluation.`);\n return [project];\n }),\n );\n this._projectsToPackAndPush = projectPromiseArrayArray.flat();\n\n debug('[exec:verifyConditionsCmd] Packing \"Dummy\" packages and generating \"Push Dummy Package\" commands for API token tests...');\n const _pushDummyCommands = await Promise.all(\n this._projectsToPackAndPush\n .map(async (project) => {\n const path = project.project.Properties.MSBuildProjectFullPath;\n debug(`[exec:verifyConditionsCmd] Packing dummy package for \"${path}\"...`);\n await project.PackDummyPackage({});\n debug(`[exec:verifyConditionsCmd] Generating \"Push Dummy Package\" command for \"${path}\"...`);\n return project.GetPushDummyCommand({});\n }),\n );\n const verifyConditionsCommandAppendix = _pushDummyCommands.join(' && ');\n\n execOptions.verifyConditionsCmd\n = execOptions.verifyConditionsCmd && execOptions.verifyConditionsCmd.trim().length > 0\n ? `${execOptions.verifyConditionsCmd} && ${verifyConditionsCommandAppendix}`\n : verifyConditionsCommandAppendix;\n if (execOptions.verifyConditionsCmd.length === 0)\n execOptions.verifyConditionsCmd = undefined;\n debug('[exec:verifyConditionsCmd] Done');\n\n const verifyReleaseCommandAppendix\n = (this._projectsToPackAndPush satisfies NugetRegistryInfo[])\n .map(project =>\n project.GetIsNextVersionAlreadyPublishedCommand(),\n ).join(' && ');\n execOptions.verifyReleaseCmd\n = execOptions.verifyReleaseCmd && execOptions.verifyReleaseCmd.trim().length > 0\n ? `${execOptions.verifyReleaseCmd} && ${verifyReleaseCommandAppendix}`\n : verifyConditionsCommandAppendix;\n if (execOptions.verifyReleaseCmd.length === 0)\n execOptions.verifyReleaseCmd = undefined;\n debug('[exec:verifyReleaseCmd] Done');\n\n const prepareCommandAppendix = await configurePrepareCommand(\n this._projectsToPublish,\n this._projectsToPackAndPush,\n );\n\n // 'ZipPublishDir' zips each publish folder to ./publish/*.zip\n execOptions.prepareCmd\n = execOptions.prepareCmd && execOptions.prepareCmd.trim().length > 0\n ? `${execOptions.prepareCmd} && ${prepareCommandAppendix}`\n : prepareCommandAppendix;\n if (execOptions.prepareCmd.length === 0)\n execOptions.prepareCmd = undefined;\n debug('[exec:prepareCmd] Done');\n\n if (this._projectsToPackAndPush.length > 0) {\n const publishCommandAppendix: string = configureDotnetNugetPush(\n this._projectsToPackAndPush,\n );\n execOptions.publishCmd\n = execOptions.publishCmd && execOptions.publishCmd.trim().length > 0\n ? `${execOptions.publishCmd} && ${publishCommandAppendix}`\n : publishCommandAppendix;\n if (execOptions.publishCmd.length === 0)\n execOptions.publishCmd = undefined;\n }\n debug('[exec:publishCmd] Done');\n }\n\n /**\n * Insert a plugin into the plugins array.\n * @param insertAfterPluginIDs Plugins which should appear BEFORE\n * {@link insertPluginIDs}.\n * @param insertPluginIDs The plugin(s) to insert into the plugins array.\n * @param insertBeforePluginsIDs plugins which should appear AFTER the\n * inserted plugin(s).\n */\n splicePlugin(\n insertAfterPluginIDs: string[],\n insertPluginIDs: string[],\n insertBeforePluginsIDs: string[],\n ): void {\n const errors: Error[] = [];\n const pluginIDs = this.options.plugins.map(v =>\n typeof v === 'string' ? v : v[0],\n ) as (typeof this.options.plugins[number])[][0];\n\n // if any beforePluginIDs are ordered before the last afterPlugin, throw. Impossible to sort.\n\n const indexOfLastPreceding: number | undefined = insertAfterPluginIDs\n .filter(v => pluginIDs.includes(v))\n .map(v => pluginIDs.indexOf(v))\n .sort((a, b) => a - b)\n .find((_v, index, object) => index === object.length - 1);\n if (!indexOfLastPreceding)\n throw new ReferenceError(\n 'An attempt to get the last element of indexOfLastAfter returned undefined.',\n );\n\n const indicesOfBefore: number[] = insertBeforePluginsIDs\n .filter(v => pluginIDs.includes(v))\n .map(v => pluginIDs.indexOf(v))\n .sort((a, b) => a - b);\n\n for (const index of indicesOfBefore) {\n if (index > indexOfLastPreceding)\n continue;\n\n const formattedInsertIds: string\n = '[' + insertPluginIDs.map(v => `\"${v}\"`).join(', ') + ']';\n const formattedAfterIds: string\n = '[' + insertAfterPluginIDs.map(v => `\"${v}\"`).join(', ') + ']';\n const formattedBeforeIds: string\n = '[' + insertBeforePluginsIDs.map(v => `\"${v}\"`).join(', ') + ']';\n errors.push(\n new Error(\n `insertPlugin was instructed to insert ${formattedInsertIds} after ${formattedAfterIds} and before ${formattedBeforeIds}, `\n + `but ${JSON.stringify(pluginIDs[indexOfLastPreceding])} is ordered after ${JSON.stringify(pluginIDs[index])}!`,\n ),\n );\n }\n\n if (errors.length > 0)\n throw new AggregateError(errors, 'One or more errors occurred while splicing plugin-option tuples into the Semantic Release config!');\n\n this.options.plugins.splice(\n indexOfLastPreceding + 1,\n 0,\n ...insertPluginIDs.map(v => [v, {}] satisfies [string, unknown]),\n );\n }\n\n // todo: join result with dummy pack commands\n protected async getTokenTestingCommands(): Promise<string> {\n let projects;\n\n if (this._projectsToPackAndPush.every(nri => nri instanceof NugetRegistryInfo)) {\n debug('[SemanticReleaseConfigDotnet#getTokenTestingCommands] All projects already evaluated.');\n projects = this._projectsToPackAndPush.map(nri => nri.project);\n }\n else {\n debug(`[SemanticReleaseConfigDotnet#getTokenTestingCommands] Evaluating up to ${this._projectsToPackAndPush.length.toString()} projects...`);\n projects = await Promise.all(await MSBuildProject.PackableProjectsToMSBuildProjects(this._projectsToPackAndPush));\n }\n\n /** if a project is not in {@link EvaluatedProjects}, add it */\n for (const project of projects) {\n if (!this.EvaluatedProjects.includes(project))\n this.EvaluatedProjects.push(project);\n }\n\n const regInfos = projects.map(\n project => new NugetRegistryInfo({ project }),\n );\n const nupkgPaths = await Promise.all(\n regInfos.map(nri =>\n // eslint-disable-next-line unicorn/prefer-await\n nri.PackDummyPackage({}).then((nupkgs) => {\n // this is a full file path.\n const mainNupkg = nupkgs.find(nupkg =>\n new RegExp(/(?<!symbols)\\.nupkg$/).test(nupkg),\n );\n if (mainNupkg !== undefined)\n return { nri: nri, nupkgPath: mainNupkg } as const;\n throw new Error(\n 'None of the following dummy packages are non-symbol .nupkg files:\\n'\n + nupkgs.map(nupkg => ` - ${nupkg}`).join('\\n')\n + '\\nIf you intended to push only symbol packages, check if a feature request already exists (https://github.com/HaloSPV3/HCE.Shared/issues?q=push+snupkg) and, if one does not exist, create one containing the keywords \"push snupkg\".',\n );\n }),\n ),\n );\n const pushCommands = nupkgPaths.map(pair =>\n pair.nri.GetPushDummyCommand({}),\n );\n return pushCommands.join(' && ');\n }\n\n toOptions(): Options {\n return this.options;\n }\n}\n\n/**\n * Configures {@link baseConfig} with `@semantic-release/exec` to `dotnet`\n * publish, pack, and nuget-push.\n * @param projectsToPublish\n * An array of dotnet projects' relative paths -OR- an array of\n * {@link MSBuildProject} instances.\n * - If `MSBuildProject[]`, the instances will be used as-is.\n * - If `[]`, tries getting projects' semi-colon-separated relative paths from\n * the `PROJECTS_TO_PUBLISH` environment variable.\n * - If configured as recommended, the projects' publish outputs will be zipped\n * to '$PWD/publish' for use in the `publish` semantic-release step e.g. for a\n * GitHub release.\n * @param projectsToPackAndPush An array of dotnet projects' relative paths -OR-\n * an array of instances of {@link NugetRegistryInfo} and/or derived classes.\n * - If `NugetRegistryInfo[]`, no conversions or modifications will occur.\n * - If `string[]`, the project paths will be converted to\n * {@link NugetRegistryInfo} instances with default values. This may be undesired.\n * - If `[]`, `dotnet pack` and `dotnet nuget push` commands will not be configured.\n * - If `undefined`, tries getting projects' semi-colon-separated relative paths\n * from the `PROJECTS_TO_PACK_AND_PUSH` environment variable.\n * With the recommended configuration, `dotnet pack` will write the nupkg/snupkg\n * files to `$PWD/publish` where they will be globbed by `dotnet nuget push`.\n * @returns a semantic-release Options object, based on\n * `@halospv3/hce.shared-config` (our base config), with the\n * `@semantic-release/exec` plugin configured to `dotnet publish`, `pack`, and\n * `push` the specified projects.\n */\nexport async function getConfig(\n projectsToPublish: string[] | MSBuildProject[],\n projectsToPackAndPush?: string[] | NugetRegistryInfo[],\n): Promise<Options> {\n if (debug.enabled) {\n debug(\n 'hce.shared-config:\\n' + inspect(baseConfig, false, Infinity, true),\n );\n }\n\n const errors: Error[] = [];\n\n if (projectsToPublish.length === 0) {\n debug('projectsToPublish is empty. Checking PROJECTS_TO_PUBLISH...');\n const _ = getEnvironmentVariableValue('PROJECTS_TO_PUBLISH');\n if (_ === undefined)\n errors.push(\n new Error(\n 'projectsToPublish.length must be > 0 or PROJECTS_TO_PUBLISH must be defined and contain at least one path.',\n ),\n );\n else projectsToPublish = _.split(';');\n }\n debug(`${projectsToPublish.length.toString()} projects found to dotnet-publish.`);\n\n if (!projectsToPackAndPush) {\n debug('projectsToPackAndPush is empty. Checking PROJECTS_TO_PACK_AND_PUSH...');\n const _ = getEnvironmentVariableValue('PROJECTS_TO_PACK_AND_PUSH');\n if (_ === undefined)\n debug('projectsToPackAndPush and PROJECTS_TO_PACK_AND_PUSH are empty and/or undefined.');\n else projectsToPackAndPush = _.split(';');\n }\n debug(`${(projectsToPackAndPush?.length ?? 0).toString()} projects found to dotnet-pack and dotnet-nuget-push.`);\n\n if (errors.length > 0) {\n throw new AggregateError(\n errors,\n 'getConfig cannot continue. One or more errors occurred.',\n );\n }\n\n debug(`Instantiating ${SemanticReleaseConfigDotnet.name}...`);\n const config = new SemanticReleaseConfigDotnet(\n projectsToPublish,\n projectsToPackAndPush,\n );\n debug('Setting up Dotnet commands...');\n await config.setupDotnetCommands();\n\n const options: Options = config.toOptions();\n if (debug.enabled) {\n debug('modified plugins array:');\n debug(inspect(options.plugins, false, Infinity));\n }\n\n return options;\n}\n\n/**\n * @module semanticReleaseConfigDotnet\n */\n"],"mappings":"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"}