@halospv3/hce.shared-config 3.0.0-develop.2 → 3.0.0-develop.21

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.
Files changed (188) hide show
  1. package/CHANGELOG.md +164 -0
  2. package/dotnet/.github/workflows/_unit_test.yml +0 -3
  3. package/dotnet/.github/workflows/dotnet-release.yml +0 -3
  4. package/dotnet/.github/workflows/sample-dotnet-build.yml +0 -3
  5. package/dotnet/PublishAll.targets +3 -2
  6. package/dotnet/ZipPublishDir.targets +24 -29
  7. package/mjs/CaseInsensitiveMap.d.ts +12 -0
  8. package/mjs/CaseInsensitiveMap.d.ts.map +1 -0
  9. package/mjs/CaseInsensitiveMap.mjs +33 -0
  10. package/mjs/CaseInsensitiveMap.mjs.map +1 -0
  11. package/mjs/commitlintConfig.d.ts +12 -0
  12. package/mjs/commitlintConfig.d.ts.map +1 -0
  13. package/mjs/commitlintConfig.mjs +13 -0
  14. package/mjs/commitlintConfig.mjs.map +1 -0
  15. package/mjs/debug.d.ts +6 -0
  16. package/mjs/debug.d.ts.map +1 -0
  17. package/mjs/debug.mjs +9 -0
  18. package/mjs/debug.mjs.map +1 -0
  19. package/mjs/dotnet/GithubNugetRegistryInfo.d.ts +38 -0
  20. package/mjs/dotnet/GithubNugetRegistryInfo.d.ts.map +1 -0
  21. package/mjs/dotnet/GithubNugetRegistryInfo.mjs +43 -0
  22. package/mjs/dotnet/GithubNugetRegistryInfo.mjs.map +1 -0
  23. package/mjs/dotnet/GitlabNugetRegistryInfo.d.ts +62 -0
  24. package/mjs/dotnet/GitlabNugetRegistryInfo.d.ts.map +1 -0
  25. package/mjs/dotnet/GitlabNugetRegistryInfo.mjs +99 -0
  26. package/mjs/dotnet/GitlabNugetRegistryInfo.mjs.map +1 -0
  27. package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.d.ts +2 -0
  28. package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.d.ts.map +1 -0
  29. package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.mjs +41 -0
  30. package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.mjs.map +1 -0
  31. package/mjs/dotnet/MSBuildProject.d.ts +256 -0
  32. package/mjs/dotnet/MSBuildProject.d.ts.map +1 -0
  33. package/mjs/dotnet/MSBuildProject.mjs +447 -0
  34. package/mjs/dotnet/MSBuildProject.mjs.map +1 -0
  35. package/mjs/dotnet/MSBuildProjectProperties.d.ts +170 -0
  36. package/mjs/dotnet/MSBuildProjectProperties.d.ts.map +1 -0
  37. package/mjs/dotnet/MSBuildProjectProperties.mjs +260 -0
  38. package/mjs/dotnet/MSBuildProjectProperties.mjs.map +1 -0
  39. package/mjs/dotnet/NugetProjectProperties.d.ts +379 -0
  40. package/mjs/dotnet/NugetProjectProperties.d.ts.map +1 -0
  41. package/mjs/dotnet/NugetProjectProperties.mjs +577 -0
  42. package/mjs/dotnet/NugetProjectProperties.mjs.map +1 -0
  43. package/mjs/dotnet/NugetRegistryInfo.d.ts +384 -0
  44. package/mjs/dotnet/NugetRegistryInfo.d.ts.map +1 -0
  45. package/mjs/dotnet/NugetRegistryInfo.mjs +752 -0
  46. package/mjs/dotnet/NugetRegistryInfo.mjs.map +1 -0
  47. package/mjs/dotnet/helpers.d.ts +63 -0
  48. package/mjs/dotnet/helpers.d.ts.map +1 -0
  49. package/mjs/dotnet/helpers.mjs +354 -0
  50. package/mjs/dotnet/helpers.mjs.map +1 -0
  51. package/mjs/dotnet/index.d.ts +9 -0
  52. package/mjs/dotnet/index.d.ts.map +1 -0
  53. package/mjs/dotnet/index.mjs +9 -0
  54. package/mjs/dotnet/index.mjs.map +1 -0
  55. package/mjs/dotnet.d.ts +2 -0
  56. package/mjs/dotnet.d.ts.map +1 -0
  57. package/mjs/dotnet.mjs +9 -0
  58. package/mjs/dotnet.mjs.map +1 -0
  59. package/mjs/eslintConfig.d.ts +4 -0
  60. package/mjs/eslintConfig.d.ts.map +1 -0
  61. package/mjs/eslintConfig.mjs +98 -0
  62. package/mjs/eslintConfig.mjs.map +1 -0
  63. package/mjs/index.d.ts +3 -0
  64. package/mjs/index.d.ts.map +1 -0
  65. package/mjs/index.mjs +4 -0
  66. package/mjs/index.mjs.map +1 -0
  67. package/mjs/insertPlugins.d.ts +18 -0
  68. package/mjs/insertPlugins.d.ts.map +1 -0
  69. package/mjs/insertPlugins.mjs +73 -0
  70. package/mjs/insertPlugins.mjs.map +1 -0
  71. package/mjs/semantic-release__commit-analyzer.d.mjs +2 -0
  72. package/mjs/semantic-release__commit-analyzer.d.mjs.map +1 -0
  73. package/mjs/semantic-release__exec.d.mjs +2 -0
  74. package/mjs/semantic-release__exec.d.mjs.map +1 -0
  75. package/mjs/semantic-release__git.d.mjs +2 -0
  76. package/mjs/semantic-release__git.d.mjs.map +1 -0
  77. package/mjs/semantic-release__github.d.mjs +2 -0
  78. package/mjs/semantic-release__github.d.mjs.map +1 -0
  79. package/mjs/semanticReleaseConfig.d.ts +97 -0
  80. package/mjs/semanticReleaseConfig.d.ts.map +1 -0
  81. package/mjs/semanticReleaseConfig.mjs +63 -0
  82. package/mjs/semanticReleaseConfig.mjs.map +1 -0
  83. package/mjs/semanticReleaseConfigDotnet.d.ts +109 -0
  84. package/mjs/semanticReleaseConfigDotnet.d.ts.map +1 -0
  85. package/mjs/semanticReleaseConfigDotnet.mjs +268 -0
  86. package/mjs/semanticReleaseConfigDotnet.mjs.map +1 -0
  87. package/mjs/setupGitPluginSpec.d.ts +22 -0
  88. package/mjs/setupGitPluginSpec.d.ts.map +1 -0
  89. package/mjs/setupGitPluginSpec.mjs +144 -0
  90. package/mjs/setupGitPluginSpec.mjs.map +1 -0
  91. package/mjs/utils/Exact.d.ts +20 -0
  92. package/mjs/utils/Exact.d.ts.map +1 -0
  93. package/mjs/utils/Exact.mjs +75 -0
  94. package/mjs/utils/Exact.mjs.map +1 -0
  95. package/mjs/utils/GracefulRecursion.d.mjs +2 -0
  96. package/mjs/utils/GracefulRecursion.d.mjs.map +1 -0
  97. package/mjs/utils/env.d.ts +24 -0
  98. package/mjs/utils/env.d.ts.map +1 -0
  99. package/mjs/utils/env.mjs +39 -0
  100. package/mjs/utils/env.mjs.map +1 -0
  101. package/mjs/utils/execAsync.d.ts +37 -0
  102. package/mjs/utils/execAsync.d.ts.map +1 -0
  103. package/mjs/utils/execAsync.mjs +59 -0
  104. package/mjs/utils/execAsync.mjs.map +1 -0
  105. package/mjs/utils/miscTypes.d.ts +13 -0
  106. package/mjs/utils/miscTypes.d.ts.map +1 -0
  107. package/mjs/utils/miscTypes.mjs +10 -0
  108. package/mjs/utils/miscTypes.mjs.map +1 -0
  109. package/mjs/utils/reflection/FunctionLike.d.mjs +2 -0
  110. package/mjs/utils/reflection/FunctionLike.d.mjs.map +1 -0
  111. package/mjs/utils/reflection/GetterDescriptor.d.mjs +2 -0
  112. package/mjs/utils/reflection/GetterDescriptor.d.mjs.map +1 -0
  113. package/mjs/utils/reflection/InstancePropertyDescriptorMap.d.mjs +2 -0
  114. package/mjs/utils/reflection/InstancePropertyDescriptorMap.d.mjs.map +1 -0
  115. package/mjs/utils/reflection/InstanceTypeOrSelfPropertyDescriptorMap.d.mjs +2 -0
  116. package/mjs/utils/reflection/InstanceTypeOrSelfPropertyDescriptorMap.d.mjs.map +1 -0
  117. package/mjs/utils/reflection/OwnGetterDescriptorMap.d.mjs +2 -0
  118. package/mjs/utils/reflection/OwnGetterDescriptorMap.d.mjs.map +1 -0
  119. package/mjs/utils/reflection/OwnKeyOf.d.mjs +2 -0
  120. package/mjs/utils/reflection/OwnKeyOf.d.mjs.map +1 -0
  121. package/mjs/utils/reflection/OwnPropertyDescriptorMap.d.mjs +2 -0
  122. package/mjs/utils/reflection/OwnPropertyDescriptorMap.d.mjs.map +1 -0
  123. package/mjs/utils/reflection/PropertyDescriptorMap.d.mjs +2 -0
  124. package/mjs/utils/reflection/PropertyDescriptorMap.d.mjs.map +1 -0
  125. package/mjs/utils/reflection/filterForGetters.d.ts +7 -0
  126. package/mjs/utils/reflection/filterForGetters.d.ts.map +1 -0
  127. package/mjs/utils/reflection/filterForGetters.mjs +27 -0
  128. package/mjs/utils/reflection/filterForGetters.mjs.map +1 -0
  129. package/mjs/utils/reflection/getOwnPropertyDescriptors.d.ts +22 -0
  130. package/mjs/utils/reflection/getOwnPropertyDescriptors.d.ts.map +1 -0
  131. package/mjs/utils/reflection/getOwnPropertyDescriptors.mjs +34 -0
  132. package/mjs/utils/reflection/getOwnPropertyDescriptors.mjs.map +1 -0
  133. package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.d.ts +56 -0
  134. package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.d.ts.map +1 -0
  135. package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.mjs +72 -0
  136. package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.mjs.map +1 -0
  137. package/mjs/utils/reflection/getPrototypeChainOf.d.ts +16 -0
  138. package/mjs/utils/reflection/getPrototypeChainOf.d.ts.map +1 -0
  139. package/mjs/utils/reflection/getPrototypeChainOf.mjs +55 -0
  140. package/mjs/utils/reflection/getPrototypeChainOf.mjs.map +1 -0
  141. package/mjs/utils/reflection/getPrototypeOf.d.ts +8 -0
  142. package/mjs/utils/reflection/getPrototypeOf.d.ts.map +1 -0
  143. package/mjs/utils/reflection/getPrototypeOf.mjs +10 -0
  144. package/mjs/utils/reflection/getPrototypeOf.mjs.map +1 -0
  145. package/mjs/utils/reflection/inheritance.d.ts +180 -0
  146. package/mjs/utils/reflection/inheritance.d.ts.map +1 -0
  147. package/mjs/utils/reflection/inheritance.mjs +148 -0
  148. package/mjs/utils/reflection/inheritance.mjs.map +1 -0
  149. package/mjs/utils/reflection/isConstructor.d.ts +17 -0
  150. package/mjs/utils/reflection/isConstructor.d.ts.map +1 -0
  151. package/mjs/utils/reflection/isConstructor.mjs +63 -0
  152. package/mjs/utils/reflection/isConstructor.mjs.map +1 -0
  153. package/mjs/utils/reflection/isGetterDescriptor.d.ts +9 -0
  154. package/mjs/utils/reflection/isGetterDescriptor.d.ts.map +1 -0
  155. package/mjs/utils/reflection/isGetterDescriptor.mjs +12 -0
  156. package/mjs/utils/reflection/isGetterDescriptor.mjs.map +1 -0
  157. package/mjs/utils/reflection/listOwnGetters.d.ts +26 -0
  158. package/mjs/utils/reflection/listOwnGetters.d.ts.map +1 -0
  159. package/mjs/utils/reflection/listOwnGetters.mjs +39 -0
  160. package/mjs/utils/reflection/listOwnGetters.mjs.map +1 -0
  161. package/mjs/utils/reflection.d.ts +18 -0
  162. package/mjs/utils/reflection.d.ts.map +1 -0
  163. package/mjs/utils/reflection.mjs +10 -0
  164. package/mjs/utils/reflection.mjs.map +1 -0
  165. package/package.json +17 -17
  166. package/src/debug.ts +5 -4
  167. package/src/dotnet/GithubNugetRegistryInfo.ts +17 -9
  168. package/src/dotnet/GitlabNugetRegistryInfo.ts +19 -5
  169. package/src/dotnet/IsNextVersionAlreadyPublished.cli.ts +53 -36
  170. package/src/dotnet/MSBuildProject.ts +150 -5
  171. package/src/dotnet/MSBuildProjectProperties.ts +2 -1
  172. package/src/dotnet/NugetProjectProperties.ts +3 -2
  173. package/src/dotnet/NugetRegistryInfo.ts +94 -8
  174. package/src/dotnet/helpers.ts +87 -53
  175. package/src/dotnet/index.ts +8 -0
  176. package/src/dotnet.ts +1 -0
  177. package/src/insertPlugins.ts +116 -0
  178. package/src/semantic-release__exec.d.ts +1 -1
  179. package/src/semanticReleaseConfig.ts +8 -3
  180. package/src/semanticReleaseConfigDotnet.ts +90 -88
  181. package/src/setupGitPluginSpec.ts +4 -1
  182. package/src/tsconfig.json +1 -1
  183. package/src/utils/execAsync.ts +13 -1
  184. package/src/utils/miscTypes.ts +4 -3
  185. package/src/utils/reflection/inheritance.ts +1 -1
  186. package/tsconfig.base.json +54 -0
  187. package/tsconfig.json +22 -0
  188. package/tsconfig.mjs.json +8 -0
@@ -4,9 +4,9 @@ import type { SemanticReleaseConfigDotnet } from '../semanticReleaseConfigDotnet
4
4
  import type { NugetProjectProperties } from './NugetProjectProperties.js';
5
5
  /* eslint-enable @typescript-eslint/no-unused-vars */
6
6
 
7
+ import { config as configDotenv } from '@dotenvx/dotenvx';
7
8
  import { type } from 'arktype';
8
9
  import { detectFile, detectFileSync } from 'chardet';
9
- import { config as configDotenv } from '@dotenvx/dotenvx';
10
10
  import { ok } from 'node:assert/strict';
11
11
  import type { ExecException } from 'node:child_process';
12
12
  import { existsSync, writeFileSync } from 'node:fs';
@@ -20,6 +20,8 @@ import sanitizeFileName from 'sanitize-filename';
20
20
  import { getEnvVarValue } from '../utils/env.js';
21
21
  import { execAsync } from '../utils/execAsync.js';
22
22
  import { catchCsc2012, MSBuildEvaluationOutput, MSBuildProject } from './MSBuildProject.js';
23
+ import type { ObjectType } from 'arktype/internal/methods/object.ts';
24
+ import type { Default } from 'arktype/internal/attributes.ts';
23
25
 
24
26
  type TmpDirNamespace_Unix = `${ReturnType<typeof tmpdir>}/HCE.Shared/.NET/Dummies`;
25
27
  type TmpDirNamespace_Win = `${ReturnType<typeof tmpdir>}\\HCE.Shared\\.NET\\Dummies`;
@@ -292,7 +294,27 @@ but the environment variable is empty or undefined.`);
292
294
  * {@link NRI.PackPackagesOptionsType.t.propertyOverrides `propertyOverrides`}
293
295
  * is a wrapper for MSBuild's `-property:<n>=<v>` properties override arg.
294
296
  */
295
- static readonly PackPackagesOptionsType = Object.freeze(
297
+ static readonly PackPackagesOptionsType: ObjectType<{
298
+ propertyOverrides?: Record<string, string> | undefined;
299
+ artifactsPath?: string | undefined;
300
+ configuration?: 'Release' | 'Debug' | undefined;
301
+ disableBuildServers?: boolean | undefined;
302
+ force?: boolean | undefined;
303
+ includeSource?: boolean | undefined;
304
+ includeSymbols?: boolean | undefined;
305
+ interactive?: boolean | undefined;
306
+ noBuild?: boolean | undefined;
307
+ noLogo?: boolean | undefined;
308
+ noRestore?: boolean | undefined;
309
+ output?: string | undefined;
310
+ runtime?: string | undefined;
311
+ serviceable?: boolean | undefined;
312
+ terminalLogger?: 'auto' | 'on' | 'off' | undefined;
313
+ useCurrentRuntime?: boolean | undefined;
314
+ verbosity?: 'quiet' | 'minimal' | 'normal' | 'detailed' | 'diagnostic' | undefined;
315
+ versionSuffix?: string | undefined;
316
+ '-GetItem'?: readonly string[] | string[] | undefined;
317
+ }> = Object.freeze(
296
318
  type({
297
319
  /**
298
320
  * a custom arg for handling MSBuild's `-property:<n>=<v>` argument for overriding MSBuild properties.
@@ -323,7 +345,26 @@ but the environment variable is empty or undefined.`);
323
345
  }),
324
346
  );
325
347
 
326
- public static readonly PackDummyPackagesOptionsType
348
+ public static readonly PackDummyPackagesOptionsType: ObjectType<{
349
+ propertyOverrides?: Record<string, string> | undefined;
350
+ artifactsPath?: string | undefined;
351
+ configuration?: 'Release' | 'Debug' | undefined;
352
+ disableBuildServers?: boolean | undefined;
353
+ force?: boolean | undefined;
354
+ includeSource?: boolean | undefined;
355
+ includeSymbols?: boolean | undefined;
356
+ interactive?: boolean | undefined;
357
+ noBuild?: boolean | undefined;
358
+ noLogo?: boolean | undefined;
359
+ noRestore?: boolean | undefined;
360
+ runtime?: string | undefined;
361
+ serviceable?: boolean | undefined;
362
+ terminalLogger?: 'auto' | 'on' | 'off' | undefined;
363
+ useCurrentRuntime?: boolean | undefined;
364
+ verbosity?: 'quiet' | 'minimal' | 'normal' | 'detailed' | 'diagnostic' | undefined;
365
+ versionSuffix?: string | undefined;
366
+ '-GetItem'?: readonly string[] | string[] | undefined;
367
+ }>
327
368
  = this.PackPackagesOptionsType.omit('output');
328
369
 
329
370
  /**
@@ -518,7 +559,21 @@ but the environment variable is empty or undefined.`);
518
559
  * Specific to this API:
519
560
  * If you want to use this API's default root value (\`${cwd()}/publish`), assign an empty string.
520
561
  */
521
- static readonly PushPackagesOptionsType = Object.freeze(
562
+ static readonly PushPackagesOptionsType: ObjectType<{
563
+ root: string;
564
+ apiKey?: string | undefined;
565
+ configFile?: string | undefined;
566
+ disableBuffering?: boolean | undefined;
567
+ forceEnglishOutput?: boolean | undefined;
568
+ interactive?: boolean | undefined;
569
+ noServiceEndpoint?: boolean | undefined;
570
+ noSymbols?: boolean | undefined;
571
+ skipDuplicate?: boolean | undefined;
572
+ source?: string | undefined;
573
+ symbolApiKey?: string | undefined;
574
+ symbolSource?: string | undefined;
575
+ timeout?: number | undefined;
576
+ }> = Object.freeze(
522
577
  type({
523
578
  /** If an empty string is passed, this property is overridden to `./publish` */
524
579
  root: 'string',
@@ -557,7 +612,20 @@ but the environment variable is empty or undefined.`);
557
612
  * {@link NRI.PushPackagesOptionsType} sans {@link NRI.PushPackagesOptionsType.t.root}.
558
613
  * The result of {@link getDummiesDir} is used, instead.
559
614
  */
560
- public static readonly PushDummyPackagesOptionsType
615
+ public static readonly PushDummyPackagesOptionsType: ObjectType<{
616
+ apiKey?: string | undefined;
617
+ configFile?: string | undefined;
618
+ disableBuffering?: boolean | undefined;
619
+ forceEnglishOutput?: boolean | undefined;
620
+ interactive?: boolean | undefined;
621
+ noServiceEndpoint?: boolean | undefined;
622
+ noSymbols?: boolean | undefined;
623
+ source?: string | undefined;
624
+ symbolApiKey?: string | undefined;
625
+ symbolSource?: string | undefined;
626
+ timeout?: number | undefined;
627
+ skipDuplicate: Default<true, true>;
628
+ }>
561
629
  = NugetRegistryInfo.PushPackagesOptionsType.merge({
562
630
  skipDuplicate: 'true = true',
563
631
  }).omit('root');
@@ -832,13 +900,22 @@ but the environment variable is empty or undefined.`);
832
900
  }
833
901
 
834
902
  // shorthand/alias for NugetRegistryInfo
835
- const NRI = NugetRegistryInfo;
903
+ const NRI: typeof NugetRegistryInfo = NugetRegistryInfo;
836
904
 
837
905
  /**
838
906
  * The base type for {@link NRIOpts} and related types. Extend this type while
839
907
  * overriding member types via {@link NRIOptsBase.merge}
840
908
  */
841
- export const NRIOptsBase = type({
909
+ export const NRIOptsBase: ObjectType<{
910
+ project: MSBuildProject | {
911
+ readonly Items: Readonly<Required<MSBuildEvaluationOutput>['Items']>;
912
+ readonly Properties: Readonly<NugetProjectProperties>;
913
+ readonly Targets: readonly string[];
914
+ readonly TargetResults: Required<MSBuildEvaluationOutput>['TargetResults'][];
915
+ };
916
+ source: string;
917
+ tokenEnvVars: readonly string[];
918
+ }> = type({
842
919
  /**
843
920
  * The environment variables whose values are tokens with permission to push a
844
921
  * package to the NuGet package registry. The array is iterated through until
@@ -883,7 +960,16 @@ export const NRIOptsBase = type({
883
960
  /**
884
961
  * The type of the parameter for {@link NugetRegistryInfo}'s constructor.
885
962
  */
886
- export const NRIOpts = NRIOptsBase.merge({
963
+ export const NRIOpts: ObjectType<{
964
+ project: MSBuildProject | {
965
+ readonly Items: Readonly<Required<MSBuildEvaluationOutput>['Items']>;
966
+ readonly Properties: Readonly<NugetProjectProperties>;
967
+ readonly Targets: readonly string[];
968
+ readonly TargetResults: Required<MSBuildEvaluationOutput>['TargetResults'][];
969
+ };
970
+ tokenEnvVars: Default<readonly string[], readonly ['NUGET_TOKEN']>;
971
+ source: Default<string, string>;
972
+ }> = NRIOptsBase.merge({
887
973
  /**
888
974
  * Defaults to {@link NugetRegistryInfo.DefaultTokenEnvVars}
889
975
  * @see {@link NRIOptsBase.t.tokenEnvVars}
@@ -4,6 +4,8 @@ import { cwd } from 'node:process';
4
4
  import { MSBuildProject } from './MSBuildProject.js';
5
5
  import { MSBuildProjectProperties as MSBPP } from './MSBuildProjectProperties.js';
6
6
  import { NugetRegistryInfo } from './NugetRegistryInfo.js';
7
+ import type { Default } from 'arktype/internal/attributes.ts';
8
+ import type { ObjectType } from 'arktype/internal/methods/object.ts';
7
9
 
8
10
  const ourDefaultPubDir = path.join('.', 'publish') as `.${'/' | '\\'}publish`;
9
11
 
@@ -65,7 +67,7 @@ export async function configurePrepareCmd(
65
67
  * paths.
66
68
  * @returns A Promise of a string. This string contains one or more `dotnet publish`
67
69
  * commands conjoined by " && ". It may also include one or more
68
- * `dotnet msbuild ${...} -t:PublishAll` commands.
70
+ * `dotnet msbuild ${...} -t:PublishAll -p:Configuration=Release` commands.
69
71
  */
70
72
  async function formatDotnetPublish(
71
73
  projectsToPublish: string[] | MSBuildProject[],
@@ -136,7 +138,7 @@ export async function configurePrepareCmd(
136
138
  * runtime-framework combinations.
137
139
  * @returns If {@link proj} imports {@link ../../dotnet/PublishAll.targets}...
138
140
  * ```
139
- * [`${proj.Properties.MSBuildProjectFullPath} -t:PublishAll`]
141
+ * [`${proj.Properties.MSBuildProjectFullPath} -t:PublishAll -p:Configuration=Release`]
140
142
  * ```
141
143
  * Else, an array of `dotnet publish` arguments permutations e.g.
142
144
  * ```
@@ -161,7 +163,7 @@ export async function configurePrepareCmd(
161
163
  * return publishCmdArray.join(' && ');
162
164
  */
163
165
  function getPublishArgsPermutations(proj: MSBuildProject):
164
- ([`"${typeof proj.Properties.MSBuildProjectFullPath}" -t:PublishAll`])
166
+ ([`"${typeof proj.Properties.MSBuildProjectFullPath}" -t:PublishAll -p:Configuration=Release`])
165
167
  | ([`"${typeof proj.Properties.MSBuildProjectFullPath}"`])
166
168
  | (`"${typeof proj.Properties.MSBuildProjectFullPath}" --runtime ${string} --framework ${string}`)[]
167
169
  | (`"${typeof proj.Properties.MSBuildProjectFullPath}" --runtime ${string}`)[]
@@ -171,7 +173,7 @@ export async function configurePrepareCmd(
171
173
  * permutation, return the appropriate command line.
172
174
  */
173
175
  if (proj.Targets.includes('PublishAll'))
174
- return [`"${proj.Properties.MSBuildProjectFullPath}" -t:PublishAll`];
176
+ return [`"${proj.Properties.MSBuildProjectFullPath}" -t:PublishAll -p:Configuration=Release`];
175
177
 
176
178
  // #region formatFrameworksAndRuntimes
177
179
  const tfmRidPermutations: `--runtime ${string} --framework ${string}`[]
@@ -218,7 +220,7 @@ export async function configurePrepareCmd(
218
220
  // #endregion formatFrameworksAndRuntimes
219
221
  }
220
222
 
221
- const publishCmds: (`dotnet publish "${string}"` | `dotnet publish "${string}" ${string}` | `dotnet msbuild "${string}" -t:PublishAll`)[] = [];
223
+ const publishCmds: (`dotnet publish "${string}"` | `dotnet publish "${string}" ${string}` | `dotnet msbuild "${string}" -t:PublishAll -p:Configuration=Release`)[] = [];
222
224
  /** convert {@link evaluatedPublishProjects} to sets of space-separated CLI args. */
223
225
  const argsSets = evaluatedPublishProjects.map(
224
226
  proj => getPublishArgsPermutations(proj),
@@ -229,7 +231,10 @@ export async function configurePrepareCmd(
229
231
  for (const permutation of args) {
230
232
  if (typeof permutation === 'string' && permutation.length === 1)
231
233
  throw new Error('Something has gone terribly wrong. A `dotnet publish` argument set was split to single characters!');
232
- publishCmds.push(`dotnet publish ${permutation}`);
234
+ if (/".+" -t:PublishAll -p:Configuration=Release/.test(permutation))
235
+ publishCmds.push(`dotnet msbuild ${permutation as `"${string}" -t:PublishAll -p:Configuration=Release`}`);
236
+ else
237
+ publishCmds.push(`dotnet publish ${permutation}`);
233
238
  }
234
239
  }
235
240
 
@@ -290,7 +295,9 @@ export async function configurePrepareCmd(
290
295
  */
291
296
  export function configureDotnetNugetPush(
292
297
  registryInfos: NugetRegistryInfo[],
293
- packageOutputPath = `${cwd()}/publish`,
298
+ // Explicit type required by JSR
299
+ // eslint-disable-next-line @typescript-eslint/no-inferrable-types
300
+ packageOutputPath: string = `${cwd()}/publish`,
294
301
  ): string {
295
302
  if (registryInfos.some(registry => registry.source.trim() === ''))
296
303
  throw new Error('The URL for one of the provided NuGet registries was empty or whitespace.');
@@ -362,48 +369,75 @@ function formatDotnetNugetSign(
362
369
  }
363
370
  }
364
371
 
365
- const DotnetNugetSignOptions = type({
372
+ const DotnetNugetSignOptions: ObjectType<
373
+ {
374
+ timestamper: Default<string, 'https://rfc3161.ai.moda/'>;
375
+ certificatePassword?: string | undefined;
376
+ hashAlgorithm?: string | undefined;
377
+ output?: string | undefined;
378
+ overwrite?: true | undefined;
379
+ timestampHashAlgorithm?: string | undefined;
380
+ verbosity?: 'q' | 'quiet' | 'm' | 'minimal' | 'n' | 'normal' | 'd' | 'detailed' | 'diag' | 'diagnostic';
381
+ } & ({
382
+ certificatePath: string;
383
+ certificateSubjectName: string;
384
+ } | {
385
+ certificatePath: string;
386
+ certificateFingerprint: string;
387
+ } | {
388
+ certificateStoreName: string;
389
+ certificateSubjectName: string;
390
+ } | {
391
+ certificateStoreName: string;
392
+ certificateFingerprint: string;
393
+ } | {
394
+ certificateStoreLocation: string;
395
+ certificateSubjectName: string;
396
+ } | {
397
+ certificateStoreLocation: string;
398
+ certificateFingerprint: string;
399
+ })> = type({
366
400
  /**
367
401
  * Password for the certificate, if needed. This option can be used to specify
368
402
  * the password for the certificate. The command will throw an error message
369
403
  * if certificate is password protected but password is not provided as input.
370
404
  */
371
- 'certificatePassword?': 'string',
372
- /**
373
- * Hash algorithm to be used to sign the package. Defaults to SHA256.
374
- */
375
- 'hashAlgorithm?': 'string | "SHA256"',
376
- /**
377
- * Directory where the signed package(s) should be saved. By default the
378
- * original package is overwritten by the signed package.
379
- */
380
- 'output?': 'string',
381
- /**
382
- * Switch to indicate if the current signature should be overwritten. By
383
- * default the command will fail if the package already has a signature.
384
- */
385
- 'overwrite?': 'true',
386
- /**
387
- * URL to an RFC 3161 timestamping server.
388
- */
389
- timestamper: 'string = "https://rfc3161.ai.moda/"',
390
- /**
391
- * Hash algorithm to be used to sign the package. Defaults to SHA256.
392
- */
393
- 'timestampHashAlgorithm?': 'string | "SHA256"',
394
- /**
395
- * Set the verbosity level of the command. Allowed values are q[uiet],
396
- * m[inimal], n[ormal], d[etailed], and diag[nostic].
397
- */
398
- 'verbosity?': '"q"|"quiet"|"m"|"minimal"|"n"|"normal"|"d"|"detailed"|"diag"|"diagnostic"',
399
- }).and(
400
- type({
405
+ 'certificatePassword?': 'string',
401
406
  /**
402
- * File path to the certificate to be used while signing the package.
407
+ * Hash algorithm to be used to sign the package. Defaults to SHA256.
408
+ */
409
+ 'hashAlgorithm?': 'string | "SHA256"',
410
+ /**
411
+ * Directory where the signed package(s) should be saved. By default the
412
+ * original package is overwritten by the signed package.
403
413
  */
404
- certificatePath: 'string',
405
- }).or(
414
+ 'output?': 'string',
415
+ /**
416
+ * Switch to indicate if the current signature should be overwritten. By
417
+ * default the command will fail if the package already has a signature.
418
+ */
419
+ 'overwrite?': 'true',
420
+ /**
421
+ * URL to an RFC 3161 timestamping server.
422
+ */
423
+ timestamper: 'string = "https://rfc3161.ai.moda/"',
424
+ /**
425
+ * Hash algorithm to be used to sign the package. Defaults to SHA256.
426
+ */
427
+ 'timestampHashAlgorithm?': 'string | "SHA256"',
428
+ /**
429
+ * Set the verbosity level of the command. Allowed values are q[uiet],
430
+ * m[inimal], n[ormal], d[etailed], and diag[nostic].
431
+ */
432
+ 'verbosity?': '"q"|"quiet"|"m"|"minimal"|"n"|"normal"|"d"|"detailed"|"diag"|"diagnostic"',
433
+ }).and(
406
434
  type({
435
+ /**
436
+ * File path to the certificate to be used while signing the package.
437
+ */
438
+ certificatePath: 'string',
439
+ }).or(
440
+ type({
407
441
  /**
408
442
  * Name of the X.509 certificate store to use to search for the
409
443
  * certificate. Defaults to "My", the X.509 certificate store for personal
@@ -412,8 +446,8 @@ const DotnetNugetSignOptions = type({
412
446
  * This option should be used when specifying the certificate via
413
447
  * --certificate-subject-name or --certificate-fingerprint options.
414
448
  */
415
- certificateStoreName: 'string',
416
- }).or({
449
+ certificateStoreName: 'string',
450
+ }).or({
417
451
  /**
418
452
  * Name of the X.509 certificate store use to search for the
419
453
  * certificate. Defaults to "CurrentUser", the X.509 certificate store
@@ -422,10 +456,10 @@ const DotnetNugetSignOptions = type({
422
456
  * This option should be used when specifying the certificate via
423
457
  * --certificate-subject-name or --certificate-fingerprint options.
424
458
  */
425
- certificateStoreLocation: 'string',
426
- }),
427
- ).and(
428
- type({
459
+ certificateStoreLocation: 'string',
460
+ }),
461
+ ).and(
462
+ type({
429
463
  /**
430
464
  * Subject name of the certificate used to search a local certificate
431
465
  * store for the certificate. The search is a case-insensitive string
@@ -434,15 +468,15 @@ const DotnetNugetSignOptions = type({
434
468
  * subject values. The certificate store can be specified by
435
469
  * --certificate-store-name and --certificate-store-location options.
436
470
  */
437
- certificateSubjectName: 'string',
438
- }).or({
471
+ certificateSubjectName: 'string',
472
+ }).or({
439
473
  /**
440
474
  * SHA-256, SHA-384 or SHA-512 fingerprint of the certificate used to
441
475
  * search a local certificate store for the certificate. The certificate
442
476
  * store can be specified by --certificate-store-name and
443
477
  * --certificate-store-location options.
444
478
  */
445
- certificateFingerprint: 'string',
446
- }),
447
- ),
448
- );
479
+ certificateFingerprint: 'string',
480
+ }),
481
+ ),
482
+ );
@@ -0,0 +1,8 @@
1
+ export * from './GithubNugetRegistryInfo.js';
2
+ export * from './GitlabNugetRegistryInfo.js';
3
+ export * from './helpers.js';
4
+ export * from './IsNextVersionAlreadyPublished.cli.js';
5
+ export * from './MSBuildProject.js';
6
+ export * from './MSBuildProjectProperties.js';
7
+ export * from './NugetProjectProperties.js';
8
+ export * from './NugetRegistryInfo.js';
package/src/dotnet.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './dotnet/index.js';
@@ -0,0 +1,116 @@
1
+ import type {
2
+ PluginSpec,
3
+ Options as SemanticReleaseOptions,
4
+ } from 'semantic-release';
5
+
6
+ /**
7
+ * @since 3.0.0
8
+ * @deprecated EXPERIMENTAL
9
+ */
10
+ interface PluginInsertRuleSet {
11
+ Id: string;
12
+ BeforeIds: string[];
13
+ AfterIds: string[];
14
+ }
15
+
16
+ /**
17
+ * [W.I.P. STUB]
18
+ *
19
+ * Given an array of {@link PluginInsertRuleSet}s, insert plugins into a
20
+ * {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone structured clone}
21
+ * (i.e. deep-copy) of the {@link plugins} array, sort the plugin entries, and
22
+ * return the modified array copy.
23
+ * @todo implement
24
+ * @param plugins Your {@link SemanticReleaseOptions.plugins} array.
25
+ * @param inserts An array of {@link PluginInsertRuleSet}s.
26
+ *
27
+ * If a plugin is already in the plugins array, inserting is skipped. The
28
+ * existing entry is sorted according to its ruleset.
29
+ *
30
+ * If any rulesets conflict, an error will be thrown.
31
+ * - error: A must precede B; B must precede A.
32
+ * - pass: C must precede D and E; D must precede E and follow B. Add ruleset
33
+ * interface: {Id:string, BeforeIds:string[], AfterIds:string[] }
34
+ * @returns A deep-cloned, modified copy of {@link plugins} with plugins
35
+ * inserted and sorted where needed.
36
+ * @since 3.0.0
37
+ * @deprecated EXPERIMENTAL
38
+ */
39
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
40
+ declare function insertAndSortPlugins(
41
+ plugins: Exclude<SemanticReleaseOptions['plugins'], undefined>,
42
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
43
+ inserts: PluginInsertRuleSet[]
44
+ ): PluginSpec[];
45
+
46
+ /**
47
+ * @param plugins {@link SemanticReleaseOptions.plugins}
48
+ * @param afterPluginsIDs The `string` IDs of plugins that the {@link insertPluginIDs} must follow.
49
+ * @param insertPluginIDs The `string` IDs of plugins to insert into a copy of the {@link plugins} array.
50
+ * @param beforePluginsIDs The `string` IDs of plugins that the {@link insertPluginIDs} must precede.
51
+ * @returns
52
+ * A modified copy of {@link plugins} with the given plugins inserted
53
+ * before {@link beforePluginsIDs} and after {@link afterPluginsIDs}.
54
+ *
55
+ * Inserted plugins will be a `[string, {}]` tuple.
56
+ * @throws {ReferenceError} This should never occur. One or more of the
57
+ * {@link afterPluginsIDs} had been found in {@link plugins}, but a `.find` call
58
+ * to get the highest index of the found plugins had returned `undefined`
59
+ * @throws {AggregateError} One or more error occurred when inserting plugins: `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])}!`
60
+ */
61
+ export function insertPlugin(
62
+ plugins: Exclude<PluginSpec, string>[],
63
+ afterPluginsIDs: string[],
64
+ insertPluginIDs: string[],
65
+ beforePluginsIDs: string[],
66
+ ): Exclude<PluginSpec, string>[] {
67
+ const pluginIDs = plugins.map(v =>
68
+ typeof v === 'string' ? v : v[0],
69
+ );
70
+
71
+ // if any beforePluginIDs are ordered before the last afterPlugin, throw. Impossible to sort.
72
+
73
+ const indexOfLastAfter = afterPluginsIDs
74
+ .filter(v => pluginIDs.includes(v))
75
+ .map(v => pluginIDs.indexOf(v))
76
+ .sort()
77
+ .find((_v, i, obj) => i === obj.length - 1);
78
+ if (undefined === indexOfLastAfter)
79
+ throw new ReferenceError(
80
+ 'An attempt to get the last element of an array returned undefined.',
81
+ );
82
+
83
+ const indicesOfBefore = beforePluginsIDs
84
+ .filter(v => pluginIDs.includes(v))
85
+ .map(v => pluginIDs.indexOf(v))
86
+ .sort();
87
+
88
+ // This for-of collects *all* sorting errors. The resulting AggregateError
89
+ // notifies the API user of *all* errors in the order rather than just the
90
+ // first error encountered.
91
+ const errors: Error[] = [];
92
+ for (const index of indicesOfBefore) {
93
+ if (index <= indexOfLastAfter) {
94
+ errors.push(
95
+ new Error(
96
+ `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])}!`,
97
+ ),
98
+ );
99
+ }
100
+ }
101
+ if (errors.length > 0)
102
+ throw new AggregateError(errors, 'One or more errors occurred while inserting plugin configs into the Semantic Release config!');
103
+
104
+ // insert plugin(s)
105
+
106
+ const beforeInsert = plugins.slice(0, indexOfLastAfter + 1);
107
+ const afterInsert = plugins.slice(indexOfLastAfter + 1, plugins.length + 1);
108
+
109
+ return [
110
+ ...beforeInsert,
111
+ ...insertPluginIDs.map(id =>
112
+ [id, {}] as [string, unknown],
113
+ ),
114
+ ...afterInsert,
115
+ ];
116
+ }
@@ -1,5 +1,5 @@
1
1
  declare module '@semantic-release/exec' {
2
- interface Options {
2
+ export interface Options {
3
3
  verifyConditionsCmd?: string;
4
4
  analyzeCommitsCmd?: string;
5
5
  verifyReleaseCmd?: string;
@@ -42,7 +42,12 @@ export type PluginSpecSRGithub<V extends SRGithubOptions = SRGithubOptions> = Pl
42
42
  /**
43
43
  * @satisfies { Readonly<PluginSpec[]> }
44
44
  */
45
- export const defaultPlugins = Object.freeze([
45
+ export const defaultPlugins: readonly [
46
+ '@semantic-release/commit-analyzer',
47
+ '@semantic-release/release-notes-generator',
48
+ '@semantic-release/npm',
49
+ '@semantic-release/github',
50
+ ] = Object.freeze([
46
51
  '@semantic-release/commit-analyzer',
47
52
  '@semantic-release/release-notes-generator',
48
53
  '@semantic-release/npm',
@@ -67,7 +72,7 @@ const _baseConfig = {
67
72
  ['@semantic-release/changelog', {}],
68
73
  ['@semantic-release/git', DefaultOptions],
69
74
  ['@semantic-release/exec', {}],
70
- ['@semantic-release/github', { addReleases: 'bottom', assets: [{ path: './publish/*' }] }],
75
+ ['@semantic-release/github', { addReleases: 'bottom', assets: ['./publish/*', '!./publish/.gitkeep'] }],
71
76
  ] as [
72
77
  PluginSpecSRCommitAnalyzer,
73
78
  PluginSpecExportData,
@@ -76,7 +81,7 @@ const _baseConfig = {
76
81
  PluginSpecSRGit<typeof DefaultOptions>,
77
82
  PluginSpecSRExec,
78
83
  PluginSpecSRGithub<{ addReleases: 'bottom'; assets: [{ path: './publish/*' }] }>,
79
- ] | PluginSpec[],
84
+ ] | Exclude<PluginSpec, string>[],
80
85
  };
81
86
 
82
87
  /**