UNPKG

@halospv3/hce.shared-config

Version:

Automate commit message quality, changelogs, and CI/CD releases. Exports a semantic-release shareable configuration deserialized from this package's '.releaserc.yml'. Shared resources for .NET projects are also distributed with this package.

578 lines (534 loc) 20.9 kB
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } import { type } from 'arktype'; import { CaseInsensitiveMap } from '../CaseInsensitiveMap.mjs'; import { tEmptyOrBooleanString, tBooleanString } from '../utils/miscTypes.mjs'; import '../utils/reflection.mjs'; import { MSBuildProjectProperties } from './MSBuildProjectProperties.mjs'; import { getPrototypesChainOf } from '../utils/reflection/getPrototypeChainOf.mjs'; import { listOwnGetters } from '../utils/reflection/listOwnGetters.mjs'; const Type_RepositoryType = type('""|"git"|"tfs"'); const Type_SymbolPackageFormat = type('"symbols.nupkg" | "snupkg"'); /** * A readonly record of a .csproj or .fsproj with NuGet configuration properties in * addition to those specified by {@link MSBuildProjectProperties}. This record * should be considered immutable. A new instance should be constructed from MSBuild's evaluation output. * @see https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#pack-target-inputs */ class NugetProjectProperties extends MSBuildProjectProperties { // #region private _isPackable; _suppressDependenciesWhenPacking; _packageVersion; _packageId; _packageDescription; _authors; _copyright; _packageRequireLicenseAcceptance; _developmentDependency; _packageLicenseExpression; _packageLicenseFile; _packageProjectUrl; _packageIcon; _packageReleaseNotes; _packageReadmeFile; _packageTags; _packageOutputPath; _includeSymbols; _includeSource; _packageType; _isTool; _repositoryUrl; _repositoryType; _repositoryCommit; _symbolPackageFormat; _noPackageAnalysis; _minClientVersion; _includeBuiltOutput; _includeContentInPack; _buildOutputTargetFolder; _contentTargetFolders; _nuspecFile; _nuspecBasePath; _nuspecProperties; _title; _company; _product; // #endregion private /** * Initialize a readonly record of an MSBuild project's properties, including those related to NuGet. * @param msbuildProjectFullPath @inheritdoc {@link NugetProjectProperties.MSBuildProjectFullPath} * @param properties The dictionary returned by MSBuild's `-getProperty:propname,...` argument */ constructor(msbuildProjectFullPath, properties) { /** * names of properties to consume in this constructor instead of its super. * These are the names of getters, lowercased. */ const keysToMoveOut = NPPGetterNames.InstanceGetters; /** Entries to remove from {@link properties} and apply to `this` after calling `super` */ const consumables = new CaseInsensitiveMap(); // move property by key from `properties` to `consumables`. The types of keys and values in `properties` do not matter here. for (const key of keysToMoveOut) { const value = NugetProjectProperties.getAndForget(properties, key); if (value !== undefined) consumables.set(key, value); } // Pass the remainder to super super(msbuildProjectFullPath, properties); /** convert values to strings */ for (const _ref of consumables.entries()) { var _ref2 = _slicedToArray(_ref, 2); const value = _ref2[0]; const key = _ref2[1]; if (typeof value !== 'string') consumables.set(key, String(value)); } const _getAndForget = key => NugetProjectProperties.getAndForget(consumables, key); let data; this._authors = _getAndForget('Authors'); this._buildOutputTargetFolder = _getAndForget('BuildOutputTargetFolder'); this._company = _getAndForget('Company'); this._contentTargetFolders = _getAndForget('ContentTargetFolders'); this._copyright = _getAndForget('Copyright'); if (tEmptyOrBooleanString.allows(data = _getAndForget('DevelopmentDependency'))) this._developmentDependency = data; if (tBooleanString.allows(data = _getAndForget('IncludeBuiltOutput'))) this._includeBuiltOutput = data; if (tBooleanString.allows(data = _getAndForget('IncludeContentInPack'))) this._includeContentInPack = data; if (tEmptyOrBooleanString.allows(data = _getAndForget('IncludeSource'))) this._includeSource = data; if (tEmptyOrBooleanString.allows(data = _getAndForget('IncludeSymbols'))) this._includeSymbols = data; if (tBooleanString.allows(data = _getAndForget('IsPackable'))) this._isPackable = data; if (tEmptyOrBooleanString.allows(data = _getAndForget('IsTool'))) this._isTool = data; this._minClientVersion = _getAndForget('MinClientVersion'); if (tEmptyOrBooleanString.allows(data = _getAndForget('NoPackageAnalysis'))) this._noPackageAnalysis = data; this._nuspecBasePath = _getAndForget('NuspecBasePath'); this._nuspecFile = _getAndForget('NuspecFile'); this._nuspecProperties = _getAndForget('NuspecProperties'); this._packageDescription = _getAndForget('PackageDescription'); this._packageIcon = _getAndForget('PackageIcon'); this._packageId = _getAndForget('PackageId'); this._packageLicenseExpression = _getAndForget('PackageLicenseExpression'); this._packageLicenseFile = _getAndForget('PackageLicenseFile'); this._packageOutputPath = _getAndForget('PackageOutputPath'); this._packageProjectUrl = _getAndForget('PackageProjectUrl'); this._packageReadmeFile = _getAndForget('PackageReadmeFile'); this._packageReleaseNotes = _getAndForget('PackageReleaseNotes'); if (tBooleanString.allows(data = _getAndForget('PackageRequireLicenseAcceptance'))) this._packageRequireLicenseAcceptance = data; this._packageTags = _getAndForget('PackageTags'); this._packageType = _getAndForget('PackageType'); this._packageVersion = _getAndForget('PackageVersion'); this._product = _getAndForget('Product'); this._repositoryCommit = _getAndForget('RepositoryCommit'); if (Type_RepositoryType.allows(data = _getAndForget('RepositoryType'))) this._repositoryType = data; this._repositoryUrl = _getAndForget('RepositoryUrl'); if (tBooleanString.allows(data = _getAndForget('SuppressDependenciesWhenPacking'))) this._suppressDependenciesWhenPacking = data; if (Type_SymbolPackageFormat.allows(data = _getAndForget('SymbolPackageFormat'))) this._symbolPackageFormat = data; this._title = _getAndForget('Title'); } /** * @returns A string-formatted boolean. If 'false', the project's `Pack` * Target (if available) will no-op. * * Default: `"true"` */ get IsPackable() { return this._isPackable ??= 'true'; } /** * @returns `"true"` or `"false"`. If "true", the package's dependencies are * excluded from the generated NuGet package. * * Default: `"false"` */ get SuppressDependenciesWhenPacking() { return this._suppressDependenciesWhenPacking ??= 'false'; } /** * @returns A semver-compatible version number in the form * Major.Minor.Patch[-Suffix], where -Suffix identifies prerelease versions. * * Default: {@link Version} * @example "1.0.0", "1.0.0-beta", "1.0.0-beta-00345" */ get PackageVersion() { return this._packageVersion ??= this.Version; } /** * @returns The ID of the resulting NuGet package. * * Default: {@link AssemblyName} */ get PackageId() { return this._packageId ??= this.AssemblyName; } /** * @returns A long description of the package for UI display. * * Default: {@link Description} */ get PackageDescription() { return this._packageDescription ??= this.Description; } /** * @returns A semicolon-separated list of the package's authors, matching the * profile names on nuget.org. These are displayed in the NuGet Gallery on * nuget.org and are used to cross-reference packages by the same authors. * * Default: {@link AssemblyName `AssemblyName`} */ get Authors() { return this._authors ??= this.AssemblyName; } /** * @returns Copyright details for the package. * * Default: `''` */ get Copyright() { return this._copyright ??= ''; } /** * @returns A string-formatted boolean. If `"true"`, the client must prompt the * consumer to accept the package license before installing the package. * * Default: `"false"` */ get PackageRequireLicenseAcceptance() { return this._packageRequireLicenseAcceptance ??= 'false'; } /** * This boolean only affects the package created from the project. * @see * {@link https://github.com/NuGet/Home/wiki/DevelopmentDependency-support-for-PackageReference DevelopmentDependency support for PackageReference} * @returns A string-formatted boolean. If `"true"`, the package is marked as * a development-only dependency and is prevented from being included as a * dependency in other packages. With PackageReference (NuGet 4.8+), this flag * also means that compile-time assets are excluded from compilation. * * Default: `''` (`false`-y) */ get DevelopmentDependency() { return this._developmentDependency ??= ''; } /** * @returns The {@link https://spdx.org/licenses/ SPDX license identifier} or * expression. * * Default: `''` * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#packing-a-license-expression-or-a-license-file Packing a license expression or a license file} * @example "Apache-2.0" */ get PackageLicenseExpression() { return this._packageLicenseExpression ??= ''; } /** * @returns The path to a license file within the package if you're using a * custom license or a license that hasn't been assigned an SPDX identifier. * * Default: `''` */ get PackageLicenseFile() { return this._packageLicenseFile ??= ''; } /** * @returns The package's project URL. * * Default: `''` */ get PackageProjectUrl() { return this._packageProjectUrl ??= ''; } /** * @returns The package icon path, relative to the root of the package. * * Default: `''` * @description You must pack the referenced icon image file. By default, it * is not packed. * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#packing-an-icon-image-file Packing an icon image file}, * {@link https://learn.microsoft.com/en-us/nuget/reference/nuspec#icon icon metadata} */ get PackageIcon() { return this._packageIcon ??= ''; } /** * @returns Release notes for the package. * * Default: `''` */ get PackageReleaseNotes() { return this._packageReleaseNotes ??= ''; } /** * @returns The path of the package's README file relative to the package's * root. * * Default: `''` * @description You must pack the referenced readme file. By default, it is * not packed. */ get PackageReadmeFile() { return this._packageReadmeFile ??= ''; } /** * @returns A semicolon-delimited list of tags that designates the package. * * Default : `''` */ get PackageTags() { return this._packageTags ??= ''; } /** * @returns A relative or absolute path determining the where the packed * package will be dropped. * * Default: {@link OutputPath} */ get PackageOutputPath() { return this._packageOutputPath ??= this.OutputPath; } /** * @returns A string-formatted boolean indicating whether the package should * create an additional symbols package when the project is packed. The * symbols package's format is controlled by the `SymbolPackageFormat` * property. * * Default: `''` (false-y) * @description When using `MSBuild -t:pack -p:IncludeSymbols=true`, the * corresponding .pdb files are copied along with other output files (.dll, * .exe, .winmd, .xml, .json, .pri). Note that setting `IncludeSymbols=true` * creates a regular package and a symbols package. * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#includesymbols IncludeSymbols} */ get IncludeSymbols() { return this._includeSymbols ??= ''; } /** * @returns A string-formatted boolean indicating whether the pack process * should create a source package. The source package contains the library's * source code as well as PDB files. Source files are put under the * `src/ProjectName` directory in the resulting package file. * * Default: `''` (false-y) * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#includesource IncludeSource} */ get IncludeSource() { return this._includeSource ??= ''; } /** * @returns A semicolon-separated list of tags indicating the package's * intended use. Custom types are allowed, but cannot be installed via Visual * Studio nor nuget.exe. See https://github.com/NuGet/Home/issues/10468. * * Package types can be version e.g. `PackageType1, 1.0.0.0;PackageType2` * * Default: `''` * @example "Dependency ", "DotnetTool", "MSBuildSdk", "Template" * @see {@link https://learn.microsoft.com/en-us/nuget/create-packages/set-package-type?tabs=dotnet Set a NuGet package type} */ get PackageType() { return this._packageType ??= ''; } /** * @returns A string-formatted boolean specifying whether all output files are * copied to the *tools* folder instead of the *lib* folder. * * Default: `''` (false-y) * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#istool IsTool} */ get IsTool() { return this._isTool ??= ''; } /** * @returns The repository URL used to clone or retrieve source code. * * Default: `''` * @example "https://github.com/NuGet/NuGet.Client.git". */ get RepositoryUrl() { return this._repositoryUrl ??= ''; } /** * @returns The repository type. * * Default: `''` * @example "git", "fts" */ get RepositoryType() { return this._repositoryType ??= ''; } /** * @returns The (optional) repository commit or changeset to indicate which * source the package was built against. {@link RepositoryUrl} must also be * specified for this property to be included. * * Default: `''` * @description This is evaluated only during the "Pack" and "Publish" * Targets. If using nuget.exe or Visual Studio, NuGet 4.7.0 or later is * required. * @example "0e4d1b598f350b3dc675018d539114d1328189ef" */ get RepositoryCommit() { return this._repositoryCommit ??= ''; } /** * @returns A string specifying the format of the symbols package. If * "symbols.nupkg", a legacy symbols package is created with a .symbols.nupkg * extension containing PDBs, DLLs, and other output files. If "snupkg", a * snupkg symbol package is created containing the portable PDBs. The default * is "symbols.nupkg". * * Default: "symbols.nupkg" * @example "symbols.nupkg", "snupkg" */ get SymbolPackageFormat() { return this._symbolPackageFormat ??= 'symbols.nupkg'; } /** * @returns A string-formatted boolean specifying that `pack` should not run * package analysis after building the package. * * Default: `''` (false-y) */ get NoPackageAnalysis() { return this._noPackageAnalysis ??= ''; } /** * @returns A string specifying the minimum version of the NuGet client that * can install this package, enforced by nuget.exe and the Visual Studio * Package Manager. * * Default: `''` */ get MinClientVersion() { return this._minClientVersion ??= ''; } /** * @returns A string-formatted boolean value specifying whether the build * output assemblies should be packed into the .nupkg file or not. * * Default: `"true"` */ get IncludeBuildOutput() { return this._includeBuiltOutput ??= 'true'; } /** * @returns A string-formatted boolean specifying whether any items that have * a type of Content are included in the resulting package automatically. * * Default: `"true"` */ get IncludeContentInPack() { return this._includeContentInPack ??= 'true'; } /** * @returns The output directory of the output assemblies relative to the root * of the package. The output assemblies (and other output files) are copied * into their respective framework folders. * * Default: `''` * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#output-assemblies Output assemblies} */ get BuildOutputTargetFolder() { return this._buildOutputTargetFolder ??= ''; } /** * @returns A semicolon-separated list of default locations of where all the * content files should go if `PackagePath` is not specified for them. * * Default: `"content;contentFiles"` * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#including-content-in-a-package Including content in a package} */ get ContentTargetFolders() { return this._contentTargetFolders ??= 'content;contentFiles'; } /** * @returns The relative or absolute path to the `*.nuspec` file being used * for packing. If specified, it's used **exclusively** for packaging * information, and any information in the projects is not used. * * Default: `''` * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#packing-using-a-nuspec-file Packing using a .nuspec} */ get NuspecFile() { return this._nuspecFile ??= ''; } /** * @returns The base path for the *.nuspec* file. * * Default: `''` * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#packing-using-a-nuspec-file Packing using a .nuspec} */ get NuspecBasePath() { return this._nuspecBasePath ??= ''; } /** * @returns A semicolon-separated list of key=value pairs. * * Default: `''` * @see * {@link https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#packing-using-a-nuspec-file Packing using a .nuspec} */ get NuspecProperties() { return this._nuspecProperties ??= ''; } /** * @returns A human-friendly title of the package, typically used in UI displays as * on nuget.org and the Package Manager in Visual Studio. * Default: {@link PackageId} */ get Title() { return this._title ??= this.PackageId; } /** * @returns Company name or information. * * Default: {@link Authors} */ get Company() { return this._company ??= this.Authors; } /** * @returns Product name or information. * * Default: {@link AssemblyName} */ get Product() { return this._product ??= this.AssemblyName; } } // eslint-disable-next-line @typescript-eslint/no-extraneous-class class NPPGetterNames { static _prototypeChain; static get PrototypeChain() { return this._prototypeChain ??= getPrototypesChainOf(NugetProjectProperties, 'classes'); } static _instanceGetters; static _instanceGettersRecursive; static _StaticGetters; static _StaticGettersRecursive; static get InstanceGetters() { return this._instanceGetters ??= listOwnGetters(NugetProjectProperties, 'Instance'); } static get InstanceGettersRecursive() { return this._instanceGettersRecursive ??= this.PrototypeChain.flatMap(proto => listOwnGetters(proto, 'Instance')); } static get StaticGetters() { return this._StaticGetters ??= listOwnGetters(NugetProjectProperties, 'Static'); } static get StaticGettersRecursive() { return this._StaticGettersRecursive ??= this.PrototypeChain.flatMap(proto => listOwnGetters(proto, 'Static')); } } /** @module NugetProjectProperties */ export { NPPGetterNames, NugetProjectProperties }; //# sourceMappingURL=NugetProjectProperties.mjs.map