@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.
- package/CHANGELOG.md +164 -0
- package/dotnet/.github/workflows/_unit_test.yml +0 -3
- package/dotnet/.github/workflows/dotnet-release.yml +0 -3
- package/dotnet/.github/workflows/sample-dotnet-build.yml +0 -3
- package/dotnet/PublishAll.targets +3 -2
- package/dotnet/ZipPublishDir.targets +24 -29
- package/mjs/CaseInsensitiveMap.d.ts +12 -0
- package/mjs/CaseInsensitiveMap.d.ts.map +1 -0
- package/mjs/CaseInsensitiveMap.mjs +33 -0
- package/mjs/CaseInsensitiveMap.mjs.map +1 -0
- package/mjs/commitlintConfig.d.ts +12 -0
- package/mjs/commitlintConfig.d.ts.map +1 -0
- package/mjs/commitlintConfig.mjs +13 -0
- package/mjs/commitlintConfig.mjs.map +1 -0
- package/mjs/debug.d.ts +6 -0
- package/mjs/debug.d.ts.map +1 -0
- package/mjs/debug.mjs +9 -0
- package/mjs/debug.mjs.map +1 -0
- package/mjs/dotnet/GithubNugetRegistryInfo.d.ts +38 -0
- package/mjs/dotnet/GithubNugetRegistryInfo.d.ts.map +1 -0
- package/mjs/dotnet/GithubNugetRegistryInfo.mjs +43 -0
- package/mjs/dotnet/GithubNugetRegistryInfo.mjs.map +1 -0
- package/mjs/dotnet/GitlabNugetRegistryInfo.d.ts +62 -0
- package/mjs/dotnet/GitlabNugetRegistryInfo.d.ts.map +1 -0
- package/mjs/dotnet/GitlabNugetRegistryInfo.mjs +99 -0
- package/mjs/dotnet/GitlabNugetRegistryInfo.mjs.map +1 -0
- package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.d.ts +2 -0
- package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.d.ts.map +1 -0
- package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.mjs +41 -0
- package/mjs/dotnet/IsNextVersionAlreadyPublished.cli.mjs.map +1 -0
- package/mjs/dotnet/MSBuildProject.d.ts +256 -0
- package/mjs/dotnet/MSBuildProject.d.ts.map +1 -0
- package/mjs/dotnet/MSBuildProject.mjs +447 -0
- package/mjs/dotnet/MSBuildProject.mjs.map +1 -0
- package/mjs/dotnet/MSBuildProjectProperties.d.ts +170 -0
- package/mjs/dotnet/MSBuildProjectProperties.d.ts.map +1 -0
- package/mjs/dotnet/MSBuildProjectProperties.mjs +260 -0
- package/mjs/dotnet/MSBuildProjectProperties.mjs.map +1 -0
- package/mjs/dotnet/NugetProjectProperties.d.ts +379 -0
- package/mjs/dotnet/NugetProjectProperties.d.ts.map +1 -0
- package/mjs/dotnet/NugetProjectProperties.mjs +577 -0
- package/mjs/dotnet/NugetProjectProperties.mjs.map +1 -0
- package/mjs/dotnet/NugetRegistryInfo.d.ts +384 -0
- package/mjs/dotnet/NugetRegistryInfo.d.ts.map +1 -0
- package/mjs/dotnet/NugetRegistryInfo.mjs +752 -0
- package/mjs/dotnet/NugetRegistryInfo.mjs.map +1 -0
- package/mjs/dotnet/helpers.d.ts +63 -0
- package/mjs/dotnet/helpers.d.ts.map +1 -0
- package/mjs/dotnet/helpers.mjs +354 -0
- package/mjs/dotnet/helpers.mjs.map +1 -0
- package/mjs/dotnet/index.d.ts +9 -0
- package/mjs/dotnet/index.d.ts.map +1 -0
- package/mjs/dotnet/index.mjs +9 -0
- package/mjs/dotnet/index.mjs.map +1 -0
- package/mjs/dotnet.d.ts +2 -0
- package/mjs/dotnet.d.ts.map +1 -0
- package/mjs/dotnet.mjs +9 -0
- package/mjs/dotnet.mjs.map +1 -0
- package/mjs/eslintConfig.d.ts +4 -0
- package/mjs/eslintConfig.d.ts.map +1 -0
- package/mjs/eslintConfig.mjs +98 -0
- package/mjs/eslintConfig.mjs.map +1 -0
- package/mjs/index.d.ts +3 -0
- package/mjs/index.d.ts.map +1 -0
- package/mjs/index.mjs +4 -0
- package/mjs/index.mjs.map +1 -0
- package/mjs/insertPlugins.d.ts +18 -0
- package/mjs/insertPlugins.d.ts.map +1 -0
- package/mjs/insertPlugins.mjs +73 -0
- package/mjs/insertPlugins.mjs.map +1 -0
- package/mjs/semantic-release__commit-analyzer.d.mjs +2 -0
- package/mjs/semantic-release__commit-analyzer.d.mjs.map +1 -0
- package/mjs/semantic-release__exec.d.mjs +2 -0
- package/mjs/semantic-release__exec.d.mjs.map +1 -0
- package/mjs/semantic-release__git.d.mjs +2 -0
- package/mjs/semantic-release__git.d.mjs.map +1 -0
- package/mjs/semantic-release__github.d.mjs +2 -0
- package/mjs/semantic-release__github.d.mjs.map +1 -0
- package/mjs/semanticReleaseConfig.d.ts +97 -0
- package/mjs/semanticReleaseConfig.d.ts.map +1 -0
- package/mjs/semanticReleaseConfig.mjs +63 -0
- package/mjs/semanticReleaseConfig.mjs.map +1 -0
- package/mjs/semanticReleaseConfigDotnet.d.ts +109 -0
- package/mjs/semanticReleaseConfigDotnet.d.ts.map +1 -0
- package/mjs/semanticReleaseConfigDotnet.mjs +268 -0
- package/mjs/semanticReleaseConfigDotnet.mjs.map +1 -0
- package/mjs/setupGitPluginSpec.d.ts +22 -0
- package/mjs/setupGitPluginSpec.d.ts.map +1 -0
- package/mjs/setupGitPluginSpec.mjs +144 -0
- package/mjs/setupGitPluginSpec.mjs.map +1 -0
- package/mjs/utils/Exact.d.ts +20 -0
- package/mjs/utils/Exact.d.ts.map +1 -0
- package/mjs/utils/Exact.mjs +75 -0
- package/mjs/utils/Exact.mjs.map +1 -0
- package/mjs/utils/GracefulRecursion.d.mjs +2 -0
- package/mjs/utils/GracefulRecursion.d.mjs.map +1 -0
- package/mjs/utils/env.d.ts +24 -0
- package/mjs/utils/env.d.ts.map +1 -0
- package/mjs/utils/env.mjs +39 -0
- package/mjs/utils/env.mjs.map +1 -0
- package/mjs/utils/execAsync.d.ts +37 -0
- package/mjs/utils/execAsync.d.ts.map +1 -0
- package/mjs/utils/execAsync.mjs +59 -0
- package/mjs/utils/execAsync.mjs.map +1 -0
- package/mjs/utils/miscTypes.d.ts +13 -0
- package/mjs/utils/miscTypes.d.ts.map +1 -0
- package/mjs/utils/miscTypes.mjs +10 -0
- package/mjs/utils/miscTypes.mjs.map +1 -0
- package/mjs/utils/reflection/FunctionLike.d.mjs +2 -0
- package/mjs/utils/reflection/FunctionLike.d.mjs.map +1 -0
- package/mjs/utils/reflection/GetterDescriptor.d.mjs +2 -0
- package/mjs/utils/reflection/GetterDescriptor.d.mjs.map +1 -0
- package/mjs/utils/reflection/InstancePropertyDescriptorMap.d.mjs +2 -0
- package/mjs/utils/reflection/InstancePropertyDescriptorMap.d.mjs.map +1 -0
- package/mjs/utils/reflection/InstanceTypeOrSelfPropertyDescriptorMap.d.mjs +2 -0
- package/mjs/utils/reflection/InstanceTypeOrSelfPropertyDescriptorMap.d.mjs.map +1 -0
- package/mjs/utils/reflection/OwnGetterDescriptorMap.d.mjs +2 -0
- package/mjs/utils/reflection/OwnGetterDescriptorMap.d.mjs.map +1 -0
- package/mjs/utils/reflection/OwnKeyOf.d.mjs +2 -0
- package/mjs/utils/reflection/OwnKeyOf.d.mjs.map +1 -0
- package/mjs/utils/reflection/OwnPropertyDescriptorMap.d.mjs +2 -0
- package/mjs/utils/reflection/OwnPropertyDescriptorMap.d.mjs.map +1 -0
- package/mjs/utils/reflection/PropertyDescriptorMap.d.mjs +2 -0
- package/mjs/utils/reflection/PropertyDescriptorMap.d.mjs.map +1 -0
- package/mjs/utils/reflection/filterForGetters.d.ts +7 -0
- package/mjs/utils/reflection/filterForGetters.d.ts.map +1 -0
- package/mjs/utils/reflection/filterForGetters.mjs +27 -0
- package/mjs/utils/reflection/filterForGetters.mjs.map +1 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptors.d.ts +22 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptors.d.ts.map +1 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptors.mjs +34 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptors.mjs.map +1 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.d.ts +56 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.d.ts.map +1 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.mjs +72 -0
- package/mjs/utils/reflection/getOwnPropertyDescriptorsRecursively.mjs.map +1 -0
- package/mjs/utils/reflection/getPrototypeChainOf.d.ts +16 -0
- package/mjs/utils/reflection/getPrototypeChainOf.d.ts.map +1 -0
- package/mjs/utils/reflection/getPrototypeChainOf.mjs +55 -0
- package/mjs/utils/reflection/getPrototypeChainOf.mjs.map +1 -0
- package/mjs/utils/reflection/getPrototypeOf.d.ts +8 -0
- package/mjs/utils/reflection/getPrototypeOf.d.ts.map +1 -0
- package/mjs/utils/reflection/getPrototypeOf.mjs +10 -0
- package/mjs/utils/reflection/getPrototypeOf.mjs.map +1 -0
- package/mjs/utils/reflection/inheritance.d.ts +180 -0
- package/mjs/utils/reflection/inheritance.d.ts.map +1 -0
- package/mjs/utils/reflection/inheritance.mjs +148 -0
- package/mjs/utils/reflection/inheritance.mjs.map +1 -0
- package/mjs/utils/reflection/isConstructor.d.ts +17 -0
- package/mjs/utils/reflection/isConstructor.d.ts.map +1 -0
- package/mjs/utils/reflection/isConstructor.mjs +63 -0
- package/mjs/utils/reflection/isConstructor.mjs.map +1 -0
- package/mjs/utils/reflection/isGetterDescriptor.d.ts +9 -0
- package/mjs/utils/reflection/isGetterDescriptor.d.ts.map +1 -0
- package/mjs/utils/reflection/isGetterDescriptor.mjs +12 -0
- package/mjs/utils/reflection/isGetterDescriptor.mjs.map +1 -0
- package/mjs/utils/reflection/listOwnGetters.d.ts +26 -0
- package/mjs/utils/reflection/listOwnGetters.d.ts.map +1 -0
- package/mjs/utils/reflection/listOwnGetters.mjs +39 -0
- package/mjs/utils/reflection/listOwnGetters.mjs.map +1 -0
- package/mjs/utils/reflection.d.ts +18 -0
- package/mjs/utils/reflection.d.ts.map +1 -0
- package/mjs/utils/reflection.mjs +10 -0
- package/mjs/utils/reflection.mjs.map +1 -0
- package/package.json +17 -17
- package/src/debug.ts +5 -4
- package/src/dotnet/GithubNugetRegistryInfo.ts +17 -9
- package/src/dotnet/GitlabNugetRegistryInfo.ts +19 -5
- package/src/dotnet/IsNextVersionAlreadyPublished.cli.ts +53 -36
- package/src/dotnet/MSBuildProject.ts +150 -5
- package/src/dotnet/MSBuildProjectProperties.ts +2 -1
- package/src/dotnet/NugetProjectProperties.ts +3 -2
- package/src/dotnet/NugetRegistryInfo.ts +94 -8
- package/src/dotnet/helpers.ts +87 -53
- package/src/dotnet/index.ts +8 -0
- package/src/dotnet.ts +1 -0
- package/src/insertPlugins.ts +116 -0
- package/src/semantic-release__exec.d.ts +1 -1
- package/src/semanticReleaseConfig.ts +8 -3
- package/src/semanticReleaseConfigDotnet.ts +90 -88
- package/src/setupGitPluginSpec.ts +4 -1
- package/src/tsconfig.json +1 -1
- package/src/utils/execAsync.ts +13 -1
- package/src/utils/miscTypes.ts +4 -3
- package/src/utils/reflection/inheritance.ts +1 -1
- package/tsconfig.base.json +54 -0
- package/tsconfig.json +22 -0
- 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
|
|
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
|
|
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
|
|
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
|
|
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}
|
package/src/dotnet/helpers.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
405
|
-
|
|
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
|
-
|
|
416
|
-
|
|
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
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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
|
-
|
|
438
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
@@ -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
|
|
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: [
|
|
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
|
/**
|