{"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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"}