@uipath/solution-packager 1.196.0 → 1.197.0-preview.65

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/dist/index.js CHANGED
@@ -402,8 +402,8 @@ import {
402
402
  Path as Path4,
403
403
  TargetFramework,
404
404
  TemporaryStorageService,
405
- ToolErrorCodes as ToolErrorCodes3,
406
- ToolResult as ToolResult3,
405
+ ToolErrorCodes as ToolErrorCodes4,
406
+ ToolResult as ToolResult4,
407
407
  toolsFactoryRepository,
408
408
  translate as translate3,
409
409
  ZipService
@@ -493,6 +493,18 @@ class OptionsBuilder {
493
493
  policyFileType: solutionOptions.validateOptions.governanceFileType
494
494
  };
495
495
  }
496
+ async buildProjectRestoreOptions(solutionOptions, project) {
497
+ if (!solutionOptions.outputPath) {
498
+ throw new Error(translate.t("solutionpackager.optionsBuilder.errors.outputPathRequired"));
499
+ }
500
+ return {
501
+ projectPath: this.resolveProjectPath(solutionOptions, project),
502
+ excludeConfiguredSources: solutionOptions.excludeConfiguredSources ?? false,
503
+ nuGetSourcesConfigPath: solutionOptions.nuGetSourcesConfigPath,
504
+ logLevel: solutionOptions.logLevel,
505
+ outputPath: await this.buildProjectOutputPath(solutionOptions.outputPath, project)
506
+ };
507
+ }
496
508
  resolveProjectPath(solutionOptions, project) {
497
509
  return Path.join(solutionOptions.inputPath, Path.dirname(project.ProjectRelativePath));
498
510
  }
@@ -785,10 +797,24 @@ class SolutionPackOptionsValidator extends PackagerParametersValidator {
785
797
  }
786
798
 
787
799
  // src/services/solution-pack-service.ts
800
+ import {
801
+ resolveProducedNupkgsAsync,
802
+ signNupkgsAsync
803
+ } from "@uipath/project-packager";
788
804
  import {
789
805
  ToolErrorCodes,
790
806
  ToolResult
791
807
  } from "@uipath/solutionpackager-tool-core";
808
+
809
+ // src/services/tool-result-helpers.ts
810
+ function hasFailedResults(results) {
811
+ return results.some((result) => !result.isSuccess);
812
+ }
813
+ function getFailedResultsMessage(results) {
814
+ return results.filter((result) => !result.isSuccess).map((r) => r.message || "Unknown error").join(", ");
815
+ }
816
+
817
+ // src/services/solution-pack-service.ts
792
818
  class SolutionPackService {
793
819
  optionsBuilder;
794
820
  toolsFactory;
@@ -796,13 +822,15 @@ class SolutionPackService {
796
822
  zipService;
797
823
  fileSystem;
798
824
  telemetry;
799
- constructor(optionsBuilder, toolsFactory, projectExecutor, zipService, fileSystem, telemetry) {
825
+ packageSignService;
826
+ constructor(optionsBuilder, toolsFactory, projectExecutor, zipService, fileSystem, telemetry, packageSignService) {
800
827
  this.optionsBuilder = optionsBuilder;
801
828
  this.toolsFactory = toolsFactory;
802
829
  this.projectExecutor = projectExecutor;
803
830
  this.zipService = zipService;
804
831
  this.fileSystem = fileSystem;
805
832
  this.telemetry = telemetry;
833
+ this.packageSignService = packageSignService;
806
834
  }
807
835
  async packAsync(parameters, solution, context, cancellationToken) {
808
836
  const solutionOptions = await this.optionsBuilder.buildSolutionPackOptions(parameters, solution);
@@ -817,8 +845,8 @@ class SolutionPackService {
817
845
  restoreResult,
818
846
  ...projectResults
819
847
  ];
820
- if (this.hasFailedResults(restoreAndPackResults)) {
821
- return ToolResult.error(ToolErrorCodes.InternalError, `Solution pack failed: ${this.getFailedResultsMessage(restoreAndPackResults)}`);
848
+ if (hasFailedResults(restoreAndPackResults)) {
849
+ return ToolResult.error(ToolErrorCodes.InternalError, `Solution pack failed: ${getFailedResultsMessage(restoreAndPackResults)}`);
822
850
  }
823
851
  const buildResult = await solutionTool.buildAsync(solutionOptions, cancellationToken);
824
852
  if (!buildResult.isSuccess) {
@@ -827,6 +855,10 @@ class SolutionPackService {
827
855
  if (!solutionOptions.outputPath) {
828
856
  return ToolResult.error(ToolErrorCodes.InternalError, "Solution output path is not defined");
829
857
  }
858
+ const signResult = await this.signProjectPackagesAsync(projectResults, parameters.signingInfo);
859
+ if (!signResult.isSuccess) {
860
+ return signResult;
861
+ }
830
862
  const archivePath = await this.compressSolutionAsync(parameters, solutionOptions.outputPath);
831
863
  return new ToolResult(ToolErrorCodes.Success, undefined, [
832
864
  archivePath
@@ -845,18 +877,27 @@ class SolutionPackService {
845
877
  async packSingleProjectAsync(parameters, project, context, cancellationToken) {
846
878
  try {
847
879
  const projectOptions = await this.optionsBuilder.buildProjectPackOptions(parameters, project);
848
- return await this.projectExecutor.packAsync(projectOptions, project, context, parameters.signingInfo, cancellationToken);
880
+ return await this.projectExecutor.packAsync(projectOptions, project, context, cancellationToken);
849
881
  } catch (error) {
850
882
  const errorMessage = error instanceof Error ? error.message : String(error);
851
883
  return ToolResult.error(ToolErrorCodes.InternalError, errorMessage);
852
884
  }
853
885
  }
854
- hasFailedResults(results) {
855
- return results.some((result) => !result.isSuccess);
856
- }
857
- getFailedResultsMessage(results) {
858
- const failedResults = results.filter((result) => !result.isSuccess);
859
- return failedResults.map((r) => r.message || "Unknown error").join(", ");
886
+ async signProjectPackagesAsync(projectResults, signingInfo) {
887
+ if (!signingInfo?.certificatePath) {
888
+ return ToolResult.success();
889
+ }
890
+ const producedPaths = projectResults.flatMap((result) => result.packages);
891
+ const resolved = await Promise.all(producedPaths.map(async (producedPath) => ({
892
+ producedPath,
893
+ nupkgs: await resolveProducedNupkgsAsync(this.fileSystem, producedPath)
894
+ })));
895
+ const unresolved = resolved.filter((entry) => entry.nupkgs.length === 0).map((entry) => entry.producedPath);
896
+ if (unresolved.length > 0) {
897
+ return ToolResult.error(ToolErrorCodes.InternalError, `Package signing was required but no .nupkg was found to sign for: ${unresolved.join(", ")}.`);
898
+ }
899
+ const nupkgsToSign = resolved.flatMap((entry) => entry.nupkgs);
900
+ return signNupkgsAsync(this.packageSignService, nupkgsToSign, signingInfo);
860
901
  }
861
902
  async compressSolutionAsync(parameters, outputPath) {
862
903
  return await this.telemetry.trackDependencyOperation("SolutionPackager.Solution.Compress" /* SolutionCompress */, "compress", async () => {
@@ -895,6 +936,48 @@ class SolutionPackService {
895
936
  }
896
937
  }
897
938
 
939
+ // src/services/solution-restore-service.ts
940
+ import {
941
+ ToolErrorCodes as ToolErrorCodes2,
942
+ ToolResult as ToolResult2
943
+ } from "@uipath/solutionpackager-tool-core";
944
+ class SolutionRestoreService {
945
+ optionsBuilder;
946
+ toolsFactory;
947
+ projectExecutor;
948
+ telemetry;
949
+ constructor(optionsBuilder, toolsFactory, projectExecutor, telemetry) {
950
+ this.optionsBuilder = optionsBuilder;
951
+ this.toolsFactory = toolsFactory;
952
+ this.projectExecutor = projectExecutor;
953
+ this.telemetry = telemetry;
954
+ }
955
+ async restoreAsync(parameters, solution, context, cancellationToken) {
956
+ const solutionOptions = await this.optionsBuilder.buildSolutionPackOptions(parameters, solution);
957
+ const solutionTool = await this.toolsFactory.createSolutionToolAsync(solution.SolutionId);
958
+ try {
959
+ return await this.telemetry.trackDependencyOperation("SolutionPackager.Solution.Restore" /* SolutionRestore */, "restore", async () => {
960
+ const restoreResults = await Promise.all([
961
+ solutionTool.restoreAsync(solutionOptions, cancellationToken),
962
+ ...solution.Projects.map(async (project) => {
963
+ const projectRestoreOptions = await this.optionsBuilder.buildProjectRestoreOptions(parameters, project);
964
+ return this.projectExecutor.restoreAsync(projectRestoreOptions, project, context, cancellationToken);
965
+ })
966
+ ]);
967
+ if (hasFailedResults(restoreResults)) {
968
+ return ToolResult2.error(ToolErrorCodes2.InternalError, `Solution restore failed: ${getFailedResultsMessage(restoreResults)}`);
969
+ }
970
+ return ToolResult2.success();
971
+ }, { solutionId: solution.SolutionId });
972
+ } finally {
973
+ const disposeResult = solutionTool.dispose();
974
+ if (disposeResult instanceof Promise) {
975
+ await disposeResult;
976
+ }
977
+ }
978
+ }
979
+ }
980
+
898
981
  // src/services/solution-validate-options-validator.ts
899
982
  import {
900
983
  PackagerParametersValidator as PackagerParametersValidator2
@@ -908,8 +991,8 @@ class SolutionValidateOptionsValidator extends PackagerParametersValidator2 {
908
991
 
909
992
  // src/services/solution-validate-service.ts
910
993
  import {
911
- ToolErrorCodes as ToolErrorCodes2,
912
- ToolResult as ToolResult2
994
+ ToolErrorCodes as ToolErrorCodes3,
995
+ ToolResult as ToolResult3
913
996
  } from "@uipath/solutionpackager-tool-core";
914
997
  class SolutionValidateService {
915
998
  optionsBuilder;
@@ -924,12 +1007,12 @@ class SolutionValidateService {
924
1007
  return await this.telemetry.trackDependencyOperation("SolutionPackager.Solution.Validate" /* SolutionValidate */, "validate", async () => {
925
1008
  const projectResults = await Promise.all(solution.Projects.map((project) => {
926
1009
  if (project.ProjectPath == null) {
927
- return Promise.resolve(ToolResult2.error(ToolErrorCodes2.InternalError, `Project '${project.Id}' has no ProjectPath; the solution loader must populate it before validation.`));
1010
+ return Promise.resolve(ToolResult3.error(ToolErrorCodes3.InternalError, `Project '${project.Id}' has no ProjectPath; the solution loader must populate it before validation.`));
928
1011
  }
929
1012
  return this.projectExecutor.validateAsync(this.optionsBuilder.buildProjectValidateOptions(parameters, project), project, context, cancellationToken);
930
1013
  }));
931
1014
  const failed = projectResults.find((r) => !r.isSuccess);
932
- return failed ?? ToolResult2.success();
1015
+ return failed ?? ToolResult3.success();
933
1016
  }, { solutionId: solution.SolutionId });
934
1017
  }
935
1018
  }
@@ -948,6 +1031,7 @@ class SolutionPackager {
948
1031
  projectExecutor;
949
1032
  solutionLoader;
950
1033
  solutionPackService;
1034
+ solutionRestoreService;
951
1035
  solutionValidateService;
952
1036
  packOptionsValidator;
953
1037
  validateOptionsValidator;
@@ -966,10 +1050,11 @@ class SolutionPackager {
966
1050
  const packageIdReader = new PackageIdReader(this.fileSystem, packService);
967
1051
  this.optionsBuilder = new OptionsBuilder(packageIdReader, packService, this.fileSystem);
968
1052
  this.toolsFactory = new ToolsFactory(this.repository, this.fileSystem);
969
- this.projectExecutor = new ProjectToolExecutor(this.toolsFactory, this.telemetryService, this.packageSignService);
1053
+ this.projectExecutor = new ProjectToolExecutor(this.toolsFactory, this.telemetryService);
970
1054
  this.solutionLoader = new SolutionLoader(this.fileSystem);
971
1055
  this.governancePolicyService = new GovernancePolicyService(this.fileSystem, this.temporaryStorage);
972
- this.solutionPackService = new SolutionPackService(this.optionsBuilder, this.toolsFactory, this.projectExecutor, this.zipService, this.fileSystem, this.telemetryService);
1056
+ this.solutionPackService = new SolutionPackService(this.optionsBuilder, this.toolsFactory, this.projectExecutor, this.zipService, this.fileSystem, this.telemetryService, this.packageSignService);
1057
+ this.solutionRestoreService = new SolutionRestoreService(this.optionsBuilder, this.toolsFactory, this.projectExecutor, this.telemetryService);
973
1058
  this.solutionValidateService = new SolutionValidateService(this.optionsBuilder, this.projectExecutor, this.telemetryService);
974
1059
  }
975
1060
  async setupAsync(input, operationId) {
@@ -1027,7 +1112,7 @@ class SolutionPackager {
1027
1112
  } catch (error) {
1028
1113
  const errorMessage = error instanceof Error ? error.message : String(error);
1029
1114
  this.logger.error(`Processing error: ${errorMessage}`);
1030
- return ToolResult3.error(ToolErrorCodes3.InternalError, `Solution pack failed: ${errorMessage}`);
1115
+ return ToolResult4.error(ToolErrorCodes4.InternalError, `Solution pack failed: ${errorMessage}`);
1031
1116
  } finally {
1032
1117
  await this.temporaryStorage.cleanup();
1033
1118
  }
@@ -1054,7 +1139,32 @@ class SolutionPackager {
1054
1139
  } catch (error) {
1055
1140
  const errorMessage = error instanceof Error ? error.message : String(error);
1056
1141
  this.logger.error(`Processing error: ${errorMessage}`);
1057
- return ToolResult3.error(ToolErrorCodes3.InternalError, `Solution validate failed: ${errorMessage}`);
1142
+ return ToolResult4.error(ToolErrorCodes4.InternalError, `Solution validate failed: ${errorMessage}`);
1143
+ } finally {
1144
+ await this.temporaryStorage.cleanup();
1145
+ }
1146
+ });
1147
+ }
1148
+ async restoreSolutionAsync(options, cancellationToken) {
1149
+ return await this.telemetryService.trackRequest("SolutionPackager.RestoreSolution" /* SolutionPackagerRestoreSolution */, async () => {
1150
+ try {
1151
+ if (!options.outputPath) {
1152
+ options.outputPath = await this.temporaryStorage.getTempSubfolderPathAsync("restore");
1153
+ }
1154
+ const loadedSolution = await this.solutionLoader.loadSolution(options.inputPath);
1155
+ const solution = this.filterSolutionProjects(loadedSolution, options.projectDesignIds);
1156
+ const context = this.createOperationContext(options, solution);
1157
+ const result = await this.solutionRestoreService.restoreAsync(options, solution, context, cancellationToken);
1158
+ if (result.isSuccess) {
1159
+ this.logger.info("Solution restore completed successfully.");
1160
+ } else {
1161
+ this.logger.error(`Solution restore failed with error code ${result.errorCode}: ${result.message}`);
1162
+ }
1163
+ return result;
1164
+ } catch (error) {
1165
+ const errorMessage = error instanceof Error ? error.message : String(error);
1166
+ this.logger.error(`Processing error: ${errorMessage}`);
1167
+ return ToolResult4.error(ToolErrorCodes4.InternalError, `Solution restore failed: ${errorMessage}`);
1058
1168
  } finally {
1059
1169
  await this.temporaryStorage.cleanup();
1060
1170
  }
@@ -1155,3 +1265,5 @@ export {
1155
1265
  LogLevel,
1156
1266
  BuildConfiguration2 as BuildConfiguration
1157
1267
  };
1268
+
1269
+ //# debugId=00A5AFB7E48A8EC764756E2164756E21
package/dist/node.js CHANGED
@@ -422,8 +422,8 @@ import {
422
422
  Path as Path4,
423
423
  TargetFramework,
424
424
  TemporaryStorageService,
425
- ToolErrorCodes as ToolErrorCodes3,
426
- ToolResult as ToolResult3,
425
+ ToolErrorCodes as ToolErrorCodes4,
426
+ ToolResult as ToolResult4,
427
427
  toolsFactoryRepository,
428
428
  translate as translate3,
429
429
  ZipService
@@ -513,6 +513,18 @@ class OptionsBuilder {
513
513
  policyFileType: solutionOptions.validateOptions.governanceFileType
514
514
  };
515
515
  }
516
+ async buildProjectRestoreOptions(solutionOptions, project) {
517
+ if (!solutionOptions.outputPath) {
518
+ throw new Error(translate.t("solutionpackager.optionsBuilder.errors.outputPathRequired"));
519
+ }
520
+ return {
521
+ projectPath: this.resolveProjectPath(solutionOptions, project),
522
+ excludeConfiguredSources: solutionOptions.excludeConfiguredSources ?? false,
523
+ nuGetSourcesConfigPath: solutionOptions.nuGetSourcesConfigPath,
524
+ logLevel: solutionOptions.logLevel,
525
+ outputPath: await this.buildProjectOutputPath(solutionOptions.outputPath, project)
526
+ };
527
+ }
516
528
  resolveProjectPath(solutionOptions, project) {
517
529
  return Path.join(solutionOptions.inputPath, Path.dirname(project.ProjectRelativePath));
518
530
  }
@@ -805,10 +817,24 @@ class SolutionPackOptionsValidator extends PackagerParametersValidator {
805
817
  }
806
818
 
807
819
  // src/services/solution-pack-service.ts
820
+ import {
821
+ resolveProducedNupkgsAsync,
822
+ signNupkgsAsync
823
+ } from "@uipath/project-packager";
808
824
  import {
809
825
  ToolErrorCodes,
810
826
  ToolResult
811
827
  } from "@uipath/solutionpackager-tool-core";
828
+
829
+ // src/services/tool-result-helpers.ts
830
+ function hasFailedResults(results) {
831
+ return results.some((result) => !result.isSuccess);
832
+ }
833
+ function getFailedResultsMessage(results) {
834
+ return results.filter((result) => !result.isSuccess).map((r) => r.message || "Unknown error").join(", ");
835
+ }
836
+
837
+ // src/services/solution-pack-service.ts
812
838
  class SolutionPackService {
813
839
  optionsBuilder;
814
840
  toolsFactory;
@@ -816,13 +842,15 @@ class SolutionPackService {
816
842
  zipService;
817
843
  fileSystem;
818
844
  telemetry;
819
- constructor(optionsBuilder, toolsFactory, projectExecutor, zipService, fileSystem, telemetry) {
845
+ packageSignService;
846
+ constructor(optionsBuilder, toolsFactory, projectExecutor, zipService, fileSystem, telemetry, packageSignService) {
820
847
  this.optionsBuilder = optionsBuilder;
821
848
  this.toolsFactory = toolsFactory;
822
849
  this.projectExecutor = projectExecutor;
823
850
  this.zipService = zipService;
824
851
  this.fileSystem = fileSystem;
825
852
  this.telemetry = telemetry;
853
+ this.packageSignService = packageSignService;
826
854
  }
827
855
  async packAsync(parameters, solution, context, cancellationToken) {
828
856
  const solutionOptions = await this.optionsBuilder.buildSolutionPackOptions(parameters, solution);
@@ -837,8 +865,8 @@ class SolutionPackService {
837
865
  restoreResult,
838
866
  ...projectResults
839
867
  ];
840
- if (this.hasFailedResults(restoreAndPackResults)) {
841
- return ToolResult.error(ToolErrorCodes.InternalError, `Solution pack failed: ${this.getFailedResultsMessage(restoreAndPackResults)}`);
868
+ if (hasFailedResults(restoreAndPackResults)) {
869
+ return ToolResult.error(ToolErrorCodes.InternalError, `Solution pack failed: ${getFailedResultsMessage(restoreAndPackResults)}`);
842
870
  }
843
871
  const buildResult = await solutionTool.buildAsync(solutionOptions, cancellationToken);
844
872
  if (!buildResult.isSuccess) {
@@ -847,6 +875,10 @@ class SolutionPackService {
847
875
  if (!solutionOptions.outputPath) {
848
876
  return ToolResult.error(ToolErrorCodes.InternalError, "Solution output path is not defined");
849
877
  }
878
+ const signResult = await this.signProjectPackagesAsync(projectResults, parameters.signingInfo);
879
+ if (!signResult.isSuccess) {
880
+ return signResult;
881
+ }
850
882
  const archivePath = await this.compressSolutionAsync(parameters, solutionOptions.outputPath);
851
883
  return new ToolResult(ToolErrorCodes.Success, undefined, [
852
884
  archivePath
@@ -865,18 +897,27 @@ class SolutionPackService {
865
897
  async packSingleProjectAsync(parameters, project, context, cancellationToken) {
866
898
  try {
867
899
  const projectOptions = await this.optionsBuilder.buildProjectPackOptions(parameters, project);
868
- return await this.projectExecutor.packAsync(projectOptions, project, context, parameters.signingInfo, cancellationToken);
900
+ return await this.projectExecutor.packAsync(projectOptions, project, context, cancellationToken);
869
901
  } catch (error) {
870
902
  const errorMessage = error instanceof Error ? error.message : String(error);
871
903
  return ToolResult.error(ToolErrorCodes.InternalError, errorMessage);
872
904
  }
873
905
  }
874
- hasFailedResults(results) {
875
- return results.some((result) => !result.isSuccess);
876
- }
877
- getFailedResultsMessage(results) {
878
- const failedResults = results.filter((result) => !result.isSuccess);
879
- return failedResults.map((r) => r.message || "Unknown error").join(", ");
906
+ async signProjectPackagesAsync(projectResults, signingInfo) {
907
+ if (!signingInfo?.certificatePath) {
908
+ return ToolResult.success();
909
+ }
910
+ const producedPaths = projectResults.flatMap((result) => result.packages);
911
+ const resolved = await Promise.all(producedPaths.map(async (producedPath) => ({
912
+ producedPath,
913
+ nupkgs: await resolveProducedNupkgsAsync(this.fileSystem, producedPath)
914
+ })));
915
+ const unresolved = resolved.filter((entry) => entry.nupkgs.length === 0).map((entry) => entry.producedPath);
916
+ if (unresolved.length > 0) {
917
+ return ToolResult.error(ToolErrorCodes.InternalError, `Package signing was required but no .nupkg was found to sign for: ${unresolved.join(", ")}.`);
918
+ }
919
+ const nupkgsToSign = resolved.flatMap((entry) => entry.nupkgs);
920
+ return signNupkgsAsync(this.packageSignService, nupkgsToSign, signingInfo);
880
921
  }
881
922
  async compressSolutionAsync(parameters, outputPath) {
882
923
  return await this.telemetry.trackDependencyOperation("SolutionPackager.Solution.Compress" /* SolutionCompress */, "compress", async () => {
@@ -915,6 +956,48 @@ class SolutionPackService {
915
956
  }
916
957
  }
917
958
 
959
+ // src/services/solution-restore-service.ts
960
+ import {
961
+ ToolErrorCodes as ToolErrorCodes2,
962
+ ToolResult as ToolResult2
963
+ } from "@uipath/solutionpackager-tool-core";
964
+ class SolutionRestoreService {
965
+ optionsBuilder;
966
+ toolsFactory;
967
+ projectExecutor;
968
+ telemetry;
969
+ constructor(optionsBuilder, toolsFactory, projectExecutor, telemetry) {
970
+ this.optionsBuilder = optionsBuilder;
971
+ this.toolsFactory = toolsFactory;
972
+ this.projectExecutor = projectExecutor;
973
+ this.telemetry = telemetry;
974
+ }
975
+ async restoreAsync(parameters, solution, context, cancellationToken) {
976
+ const solutionOptions = await this.optionsBuilder.buildSolutionPackOptions(parameters, solution);
977
+ const solutionTool = await this.toolsFactory.createSolutionToolAsync(solution.SolutionId);
978
+ try {
979
+ return await this.telemetry.trackDependencyOperation("SolutionPackager.Solution.Restore" /* SolutionRestore */, "restore", async () => {
980
+ const restoreResults = await Promise.all([
981
+ solutionTool.restoreAsync(solutionOptions, cancellationToken),
982
+ ...solution.Projects.map(async (project) => {
983
+ const projectRestoreOptions = await this.optionsBuilder.buildProjectRestoreOptions(parameters, project);
984
+ return this.projectExecutor.restoreAsync(projectRestoreOptions, project, context, cancellationToken);
985
+ })
986
+ ]);
987
+ if (hasFailedResults(restoreResults)) {
988
+ return ToolResult2.error(ToolErrorCodes2.InternalError, `Solution restore failed: ${getFailedResultsMessage(restoreResults)}`);
989
+ }
990
+ return ToolResult2.success();
991
+ }, { solutionId: solution.SolutionId });
992
+ } finally {
993
+ const disposeResult = solutionTool.dispose();
994
+ if (disposeResult instanceof Promise) {
995
+ await disposeResult;
996
+ }
997
+ }
998
+ }
999
+ }
1000
+
918
1001
  // src/services/solution-validate-options-validator.ts
919
1002
  import {
920
1003
  PackagerParametersValidator as PackagerParametersValidator2
@@ -928,8 +1011,8 @@ class SolutionValidateOptionsValidator extends PackagerParametersValidator2 {
928
1011
 
929
1012
  // src/services/solution-validate-service.ts
930
1013
  import {
931
- ToolErrorCodes as ToolErrorCodes2,
932
- ToolResult as ToolResult2
1014
+ ToolErrorCodes as ToolErrorCodes3,
1015
+ ToolResult as ToolResult3
933
1016
  } from "@uipath/solutionpackager-tool-core";
934
1017
  class SolutionValidateService {
935
1018
  optionsBuilder;
@@ -944,12 +1027,12 @@ class SolutionValidateService {
944
1027
  return await this.telemetry.trackDependencyOperation("SolutionPackager.Solution.Validate" /* SolutionValidate */, "validate", async () => {
945
1028
  const projectResults = await Promise.all(solution.Projects.map((project) => {
946
1029
  if (project.ProjectPath == null) {
947
- return Promise.resolve(ToolResult2.error(ToolErrorCodes2.InternalError, `Project '${project.Id}' has no ProjectPath; the solution loader must populate it before validation.`));
1030
+ return Promise.resolve(ToolResult3.error(ToolErrorCodes3.InternalError, `Project '${project.Id}' has no ProjectPath; the solution loader must populate it before validation.`));
948
1031
  }
949
1032
  return this.projectExecutor.validateAsync(this.optionsBuilder.buildProjectValidateOptions(parameters, project), project, context, cancellationToken);
950
1033
  }));
951
1034
  const failed = projectResults.find((r) => !r.isSuccess);
952
- return failed ?? ToolResult2.success();
1035
+ return failed ?? ToolResult3.success();
953
1036
  }, { solutionId: solution.SolutionId });
954
1037
  }
955
1038
  }
@@ -968,6 +1051,7 @@ class SolutionPackager {
968
1051
  projectExecutor;
969
1052
  solutionLoader;
970
1053
  solutionPackService;
1054
+ solutionRestoreService;
971
1055
  solutionValidateService;
972
1056
  packOptionsValidator;
973
1057
  validateOptionsValidator;
@@ -986,10 +1070,11 @@ class SolutionPackager {
986
1070
  const packageIdReader = new PackageIdReader(this.fileSystem, packService);
987
1071
  this.optionsBuilder = new OptionsBuilder(packageIdReader, packService, this.fileSystem);
988
1072
  this.toolsFactory = new ToolsFactory(this.repository, this.fileSystem);
989
- this.projectExecutor = new ProjectToolExecutor(this.toolsFactory, this.telemetryService, this.packageSignService);
1073
+ this.projectExecutor = new ProjectToolExecutor(this.toolsFactory, this.telemetryService);
990
1074
  this.solutionLoader = new SolutionLoader(this.fileSystem);
991
1075
  this.governancePolicyService = new GovernancePolicyService(this.fileSystem, this.temporaryStorage);
992
- this.solutionPackService = new SolutionPackService(this.optionsBuilder, this.toolsFactory, this.projectExecutor, this.zipService, this.fileSystem, this.telemetryService);
1076
+ this.solutionPackService = new SolutionPackService(this.optionsBuilder, this.toolsFactory, this.projectExecutor, this.zipService, this.fileSystem, this.telemetryService, this.packageSignService);
1077
+ this.solutionRestoreService = new SolutionRestoreService(this.optionsBuilder, this.toolsFactory, this.projectExecutor, this.telemetryService);
993
1078
  this.solutionValidateService = new SolutionValidateService(this.optionsBuilder, this.projectExecutor, this.telemetryService);
994
1079
  }
995
1080
  async setupAsync(input, operationId) {
@@ -1047,7 +1132,7 @@ class SolutionPackager {
1047
1132
  } catch (error) {
1048
1133
  const errorMessage = error instanceof Error ? error.message : String(error);
1049
1134
  this.logger.error(`Processing error: ${errorMessage}`);
1050
- return ToolResult3.error(ToolErrorCodes3.InternalError, `Solution pack failed: ${errorMessage}`);
1135
+ return ToolResult4.error(ToolErrorCodes4.InternalError, `Solution pack failed: ${errorMessage}`);
1051
1136
  } finally {
1052
1137
  await this.temporaryStorage.cleanup();
1053
1138
  }
@@ -1074,7 +1159,32 @@ class SolutionPackager {
1074
1159
  } catch (error) {
1075
1160
  const errorMessage = error instanceof Error ? error.message : String(error);
1076
1161
  this.logger.error(`Processing error: ${errorMessage}`);
1077
- return ToolResult3.error(ToolErrorCodes3.InternalError, `Solution validate failed: ${errorMessage}`);
1162
+ return ToolResult4.error(ToolErrorCodes4.InternalError, `Solution validate failed: ${errorMessage}`);
1163
+ } finally {
1164
+ await this.temporaryStorage.cleanup();
1165
+ }
1166
+ });
1167
+ }
1168
+ async restoreSolutionAsync(options, cancellationToken) {
1169
+ return await this.telemetryService.trackRequest("SolutionPackager.RestoreSolution" /* SolutionPackagerRestoreSolution */, async () => {
1170
+ try {
1171
+ if (!options.outputPath) {
1172
+ options.outputPath = await this.temporaryStorage.getTempSubfolderPathAsync("restore");
1173
+ }
1174
+ const loadedSolution = await this.solutionLoader.loadSolution(options.inputPath);
1175
+ const solution = this.filterSolutionProjects(loadedSolution, options.projectDesignIds);
1176
+ const context = this.createOperationContext(options, solution);
1177
+ const result = await this.solutionRestoreService.restoreAsync(options, solution, context, cancellationToken);
1178
+ if (result.isSuccess) {
1179
+ this.logger.info("Solution restore completed successfully.");
1180
+ } else {
1181
+ this.logger.error(`Solution restore failed with error code ${result.errorCode}: ${result.message}`);
1182
+ }
1183
+ return result;
1184
+ } catch (error) {
1185
+ const errorMessage = error instanceof Error ? error.message : String(error);
1186
+ this.logger.error(`Processing error: ${errorMessage}`);
1187
+ return ToolResult4.error(ToolErrorCodes4.InternalError, `Solution restore failed: ${errorMessage}`);
1078
1188
  } finally {
1079
1189
  await this.temporaryStorage.cleanup();
1080
1190
  }
@@ -1152,3 +1262,5 @@ export {
1152
1262
  SolutionPackager,
1153
1263
  SolutionPackOptions
1154
1264
  };
1265
+
1266
+ //# debugId=374EFD55C7484FC664756E2164756E21
@@ -10,9 +10,17 @@ import { type ISolutionPackager } from "./services/solution-packager.js";
10
10
  *
11
11
  * @example
12
12
  * ```typescript
13
- * // Import tools (triggers self-registration)
14
- * import '@uipath/packager-tool-connector';
15
- * import '@uipath/packager-tool-flow';
13
+ * // Register the tools you need explicitly
14
+ * import { ResourceBuilderToolFactory } from '@uipath/resource-builder-tool';
15
+ * import { ConnectorToolFactory } from '@uipath/packager-tool-connector';
16
+ * import { FlowToolFactory } from '@uipath/packager-tool-flow';
17
+ * import { toolsFactoryRepository } from '@uipath/solutionpackager-tool-core';
18
+ *
19
+ * // ResourceBuilder is essential to solution packing — register it (consumer
20
+ * // controls the @uipath/resource-builder-tool version).
21
+ * toolsFactoryRepository.registerSolutionToolFactory(new ResourceBuilderToolFactory());
22
+ * toolsFactoryRepository.registerProjectToolFactory(new ConnectorToolFactory());
23
+ * toolsFactoryRepository.registerProjectToolFactory(new FlowToolFactory());
16
24
  *
17
25
  * // Create SolutionPackager
18
26
  * const packager = await createBrowserSolutionPackager({
@@ -1,5 +1,5 @@
1
1
  import type { IPackService, UiPathProject } from "@uipath/project-packager";
2
- import { type IFileSystem, type IProjectPackOptions, type IProjectValidateOptions, type ISolutionPackOptions } from "@uipath/solutionpackager-tool-core";
2
+ import { type IFileSystem, type IProjectPackOptions, type IProjectRestoreOptions, type IProjectValidateOptions, type ISolutionPackOptions } from "@uipath/solutionpackager-tool-core";
3
3
  import type { LoadedUiPathSolution } from "../models/loaded-uipath-solution.js";
4
4
  import type { SolutionPackOptions } from "../models/solution-pack-options.js";
5
5
  import type { IPackageIdReader } from "./package-id-reader.js";
@@ -19,6 +19,10 @@ export interface IOptionsBuilder {
19
19
  * Build project validate options from solution parameters, for a specific project
20
20
  */
21
21
  buildProjectValidateOptions(options: SolutionPackOptions, project: UiPathProject): IProjectValidateOptions;
22
+ /**
23
+ * Build project restore options from solution parameters, for a specific project
24
+ */
25
+ buildProjectRestoreOptions(options: SolutionPackOptions, project: UiPathProject): Promise<IProjectRestoreOptions>;
22
26
  }
23
27
  export declare class OptionsBuilder implements IOptionsBuilder {
24
28
  private readonly packageIdReader;
@@ -33,6 +37,7 @@ export declare class OptionsBuilder implements IOptionsBuilder {
33
37
  */
34
38
  buildProjectPackOptions(solutionOptions: SolutionPackOptions, project: UiPathProject): Promise<IProjectPackOptions>;
35
39
  buildProjectValidateOptions(solutionOptions: SolutionPackOptions, project: UiPathProject): IProjectValidateOptions;
40
+ buildProjectRestoreOptions(solutionOptions: SolutionPackOptions, project: UiPathProject): Promise<IProjectRestoreOptions>;
36
41
  private resolveProjectPath;
37
42
  /**
38
43
  * Build the output path for a project
@@ -1,4 +1,4 @@
1
- import type { IProjectToolExecutor, ITelemetryService, IToolsFactory } from "@uipath/project-packager";
1
+ import { type IPackageSignService, type IProjectToolExecutor, type ITelemetryService, type IToolsFactory } from "@uipath/project-packager";
2
2
  import { type IFileSystem, type IZipService, type ProjectOperationContext, ToolResult } from "@uipath/solutionpackager-tool-core";
3
3
  import type { LoadedUiPathSolution } from "../models/loaded-uipath-solution.js";
4
4
  import type { SolutionPackOptions } from "../models/solution-pack-options.js";
@@ -19,7 +19,8 @@ export declare class SolutionPackService implements ISolutionPackService {
19
19
  private readonly zipService;
20
20
  private readonly fileSystem;
21
21
  private readonly telemetry;
22
- constructor(optionsBuilder: IOptionsBuilder, toolsFactory: IToolsFactory, projectExecutor: IProjectToolExecutor, zipService: IZipService, fileSystem: IFileSystem, telemetry: ITelemetryService);
22
+ private readonly packageSignService?;
23
+ constructor(optionsBuilder: IOptionsBuilder, toolsFactory: IToolsFactory, projectExecutor: IProjectToolExecutor, zipService: IZipService, fileSystem: IFileSystem, telemetry: ITelemetryService, packageSignService?: IPackageSignService | undefined);
23
24
  packAsync(parameters: SolutionPackOptions, solution: LoadedUiPathSolution, context: ProjectOperationContext, cancellationToken?: AbortSignal): Promise<ToolResult>;
24
25
  /**
25
26
  * Pack all projects in parallel
@@ -39,17 +40,21 @@ export declare class SolutionPackService implements ISolutionPackService {
39
40
  */
40
41
  private packSingleProjectAsync;
41
42
  /**
42
- * Check if any results in the array have failed
43
- * @param results Array of tool results
44
- * @returns True if any result has failed, false otherwise
43
+ * Sign the project .nupkg(s) produced for the solution, before zipping.
44
+ *
45
+ * Project tools write their package into the solution output tree; the
46
+ * workflow compiler reports a content *folder* rather than the .nupkg, so
47
+ * each produced path is resolved to the real .nupkg first. Unlike the
48
+ * single-project packager there's no copy/pack-from-content step here, so a
49
+ * path that resolves to nothing means the package is genuinely missing —
50
+ * fail loudly rather than zip an unsigned (or absent) package.
51
+ *
52
+ * A no-op when signing isn't requested (no signing info or no certificate).
53
+ * @param projectResults The per-project pack results, holding produced paths
54
+ * @param signingInfo Signing configuration, if signing was requested
55
+ * @returns Success, or the first signing/resolution failure
45
56
  */
46
- private hasFailedResults;
47
- /**
48
- * Get a combined error message from all failed results
49
- * @param results Array of tool results
50
- * @returns Combined error message
51
- */
52
- private getFailedResultsMessage;
57
+ private signProjectPackagesAsync;
53
58
  /**
54
59
  * Compress the solution output folder into a zip archive
55
60
  * @param parameters Solution pack parameters
@@ -39,6 +39,15 @@ export interface ISolutionPackager {
39
39
  * @returns ToolResult indicating success if every project passed validation
40
40
  */
41
41
  validateSolutionAsync(options: SolutionPackOptions, cancellationToken?: AbortSignal): Promise<ToolResult>;
42
+ /**
43
+ * Restore dependencies for every project in a solution, without packing
44
+ * or building. Resolves NuGet dependencies (including authenticated feeds
45
+ * carried by `options.connection`) so a later pack can compile offline.
46
+ * @param options Solution pack options containing all parameters
47
+ * @param cancellationToken Optional cancellation token
48
+ * @returns ToolResult indicating success if every project restored
49
+ */
50
+ restoreSolutionAsync(options: SolutionPackOptions, cancellationToken?: AbortSignal): Promise<ToolResult>;
42
51
  /**
43
52
  * Convert a successful ToolResult to a list of package streams.
44
53
  * @param result The ToolResult to convert
@@ -60,6 +69,7 @@ export declare class SolutionPackager implements ISolutionPackager {
60
69
  private readonly projectExecutor;
61
70
  private readonly solutionLoader;
62
71
  private readonly solutionPackService;
72
+ private readonly solutionRestoreService;
63
73
  private readonly solutionValidateService;
64
74
  private readonly packOptionsValidator;
65
75
  private readonly validateOptionsValidator;
@@ -91,6 +101,11 @@ export declare class SolutionPackager implements ISolutionPackager {
91
101
  * Validate all projects in a solution using the provided options.
92
102
  */
93
103
  validateSolutionAsync(options: SolutionPackOptions, cancellationToken?: AbortSignal): Promise<ToolResult>;
104
+ /**
105
+ * Restore dependencies for every project in a solution, without packing
106
+ * or building.
107
+ */
108
+ restoreSolutionAsync(options: SolutionPackOptions, cancellationToken?: AbortSignal): Promise<ToolResult>;
94
109
  /**
95
110
  * Narrow the solution's project list to the subset the caller asked for.
96
111
  * An empty or absent `projectDesignIds` is a no-op (the whole solution is
@@ -1,7 +1,9 @@
1
1
  export declare enum TelemetryNames {
2
2
  SolutionPackagerPackSolution = "SolutionPackager.PackSolution",
3
3
  SolutionPackagerValidateSolution = "SolutionPackager.ValidateSolution",
4
+ SolutionPackagerRestoreSolution = "SolutionPackager.RestoreSolution",
4
5
  SolutionPack = "SolutionPackager.Solution.Pack",
5
6
  SolutionValidate = "SolutionPackager.Solution.Validate",
7
+ SolutionRestore = "SolutionPackager.Solution.Restore",
6
8
  SolutionCompress = "SolutionPackager.Solution.Compress"
7
9
  }
@@ -1,10 +1 @@
1
- import "@uipath/packager-tool-connector";
2
- import "@uipath/packager-tool-workflowcompiler";
3
- import "@uipath/packager-tool-apiworkflow";
4
- import "@uipath/packager-tool-bpmn";
5
- import "@uipath/packager-tool-case";
6
- import "@uipath/packager-tool-flow";
7
- import "@uipath/tool-agent";
8
- import "@uipath/packager-tool-functions";
9
- import "@uipath/packager-tool-webapp";
10
- import "@uipath/resource-builder-tool";
1
+ export {};
package/package.json CHANGED
@@ -1,61 +1,38 @@
1
1
  {
2
- "name": "@uipath/solution-packager",
3
- "license": "MIT",
4
- "version": "1.196.0",
5
- "description": "UiPath Solution Packager - core library for packing UiPath solutions",
6
- "type": "module",
7
- "main": "./dist/index.js",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/src/index.d.ts",
11
- "default": "./dist/index.js"
12
- },
13
- "./node": {
14
- "types": "./dist/src/node.d.ts",
15
- "default": "./dist/node.js"
16
- }
2
+ "name": "@uipath/solution-packager",
3
+ "license": "MIT",
4
+ "version": "1.197.0-preview.65",
5
+ "description": "UiPath Solution Packager - core library for packing UiPath solutions",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/index.d.ts",
11
+ "default": "./dist/index.js"
17
12
  },
18
- "types": "./dist/src/index.d.ts",
19
- "repository": {
20
- "type": "git",
21
- "url": "https://github.com/UiPath/cli.git",
22
- "directory": "packages/packager/solution-packager"
23
- },
24
- "publishConfig": {
25
- "registry": "https://registry.npmjs.org/"
26
- },
27
- "files": [
28
- "dist",
29
- "!dist/**/*.map"
30
- ],
31
- "dependencies": {
32
- "@uipath/project-packager": "1.196.0",
33
- "@uipath/solutionpackager-tool-core": "1.196.0"
34
- },
35
- "peerDependencies": {
36
- "fflate": "^0.8.2"
37
- },
38
- "devDependencies": {
39
- "@types/node": "^25.5.2",
40
- "@uipath/common": "1.196.0",
41
- "@uipath/filesystem": "1.196.0",
42
- "@uipath/resource-builder-tool": "2025.11.0-alpha2928-3101",
43
- "@uipath/tool-agent": "^1.2.6",
44
- "@uipath/packager-tool-apiworkflow": "1.196.0",
45
- "@uipath/packager-tool-bpmn": "1.196.0",
46
- "@uipath/packager-tool-case": "1.196.0",
47
- "@uipath/packager-tool-connector": "1.196.0",
48
- "@uipath/packager-tool-flow": "1.196.0",
49
- "@uipath/packager-tool-functions": "1.196.0",
50
- "@uipath/packager-tool-webapp": "1.196.0",
51
- "@uipath/packager-tool-workflowcompiler": "1.196.0",
52
- "@vitest/browser": "^4.1.6",
53
- "@vitest/browser-playwright": "^4.1.6",
54
- "@vitest/coverage-v8": "^4.1.6",
55
- "playwright": "^1.57.0",
56
- "typescript": "^6.0.2",
57
- "vite-tsconfig-paths": "^6.1.1",
58
- "vitest": "^4.1.6"
59
- },
60
- "gitHead": "bed2b46f1ec33a47a7dcae2e6d4b7ab99bd06981"
13
+ "./node": {
14
+ "types": "./dist/src/node.d.ts",
15
+ "default": "./dist/node.js"
16
+ }
17
+ },
18
+ "types": "./dist/src/index.d.ts",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/UiPath/cli.git",
22
+ "directory": "packages/packager/solution-packager"
23
+ },
24
+ "publishConfig": {
25
+ "registry": "https://registry.npmjs.org/"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "dependencies": {
31
+ "@uipath/project-packager": "1.197.0",
32
+ "@uipath/solutionpackager-tool-core": "1.197.0"
33
+ },
34
+ "peerDependencies": {
35
+ "fflate": "^0.8.2"
36
+ },
37
+ "gitHead": "9388ccbe5e739c9578bfd9b5395980fb63e11d9c"
61
38
  }