azure-devops-extension-api 4.245.1 → 4.247.0
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/SECURITY.md +41 -0
- package/{AdvancedSecurity.Reporting → bin/AdvancedSecurity.Reporting}/Reporting.d.ts +48 -0
- package/bin/AdvancedSecurity.Reporting/Reporting.js +32 -0
- package/bin/AdvancedSecurity.Reporting/Reporting.min.js +1 -0
- package/{Alert → bin/Alert}/Alert.d.ts +8 -8
- package/{Alert → bin/Alert}/AlertClient.d.ts +1 -1
- package/{Alert → bin/Alert}/AlertClient.js +1 -1
- package/{Contributions → bin/Contributions}/ContributionsClient.js +2 -2
- package/{Contributions → bin/Contributions}/ContributionsClient.min.js +1 -1
- package/{ExtensionManagement → bin/ExtensionManagement}/ExtensionManagementClient.js +7 -7
- package/{ExtensionManagement → bin/ExtensionManagement}/ExtensionManagementClient.min.js +1 -1
- package/{FormInput → bin/FormInput}/FormInput.d.ts +8 -0
- package/bin/LICENSE +21 -0
- package/bin/README.md +2 -0
- package/{TaskAgent → bin/TaskAgent}/TaskAgent.d.ts +12 -0
- package/{Test → bin/Test}/Test.d.ts +31 -7
- package/{TestPlan → bin/TestPlan}/TestPlan.d.ts +6 -2
- package/{TestPlan → bin/TestPlan}/TestPlanClient.d.ts +19 -0
- package/{TestPlan → bin/TestPlan}/TestPlanClient.js +84 -0
- package/{TestPlan → bin/TestPlan}/TestPlanClient.min.js +1 -1
- package/{TestResults → bin/TestResults}/TestResultsClient.d.ts +8 -0
- package/{TestResults → bin/TestResults}/TestResultsClient.js +23 -0
- package/{TestResults → bin/TestResults}/TestResultsClient.min.js +1 -1
- package/bin/package.json +37 -0
- package/buildpackage.js +80 -0
- package/package.json +1 -1
- package/src/Accounts/Accounts.ts +134 -0
- package/src/Accounts/AccountsClient.ts +83 -0
- package/src/Accounts/index.ts +2 -0
- package/src/AdvancedSecurity.Reporting/Reporting.ts +180 -0
- package/src/AdvancedSecurity.Reporting/ReportingClient.ts +47 -0
- package/src/Alert/Alert.ts +1037 -0
- package/src/Alert/AlertClient.ts +330 -0
- package/src/Boards/Boards.ts +684 -0
- package/src/Boards/BoardsClient.ts +593 -0
- package/src/Boards/index.ts +2 -0
- package/src/Build/Build.ts +3416 -0
- package/src/Build/BuildClient.ts +2740 -0
- package/src/Build/BuildServices.ts +39 -0
- package/src/Build/index.ts +3 -0
- package/src/Comments/Comments.ts +330 -0
- package/src/Comments/index.ts +1 -0
- package/src/Common/Client.ts +37 -0
- package/src/Common/CommonServices.ts +853 -0
- package/src/Common/Context.d.ts +46 -0
- package/src/Common/Fetch.ts +239 -0
- package/src/Common/RestClientBase.ts +186 -0
- package/src/Common/System.ts +36 -0
- package/src/Common/SystemData.ts +135 -0
- package/src/Common/Util/Serialization.ts +59 -0
- package/src/Common/Util/Url.ts +773 -0
- package/src/Common/index.ts +3 -0
- package/src/Contributions/Contributions.ts +708 -0
- package/src/Contributions/ContributionsClient.ts +109 -0
- package/src/Contributions/index.ts +2 -0
- package/src/Core/Core.ts +579 -0
- package/src/Core/CoreClient.ts +765 -0
- package/src/Core/index.ts +2 -0
- package/src/Dashboard/Dashboard.ts +419 -0
- package/src/Dashboard/DashboardClient.ts +370 -0
- package/src/Dashboard/WidgetConfigHelpers.ts +43 -0
- package/src/Dashboard/WidgetContracts.ts +226 -0
- package/src/Dashboard/WidgetHelpers.ts +145 -0
- package/src/Dashboard/index.ts +5 -0
- package/src/DistributedTaskCommon/DistributedTaskCommon.ts +108 -0
- package/src/DistributedTaskCommon/index.ts +1 -0
- package/src/ExtensionManagement/ExtensionManagement.ts +1205 -0
- package/src/ExtensionManagement/ExtensionManagementClient.ts +646 -0
- package/src/ExtensionManagement/index.ts +2 -0
- package/src/Favorite/Favorite.ts +136 -0
- package/src/Favorite/FavoriteClient.ts +301 -0
- package/src/FeatureAvailability/FeatureAvailability.ts +20 -0
- package/src/FeatureAvailability/FeatureAvailabilityClient.ts +153 -0
- package/src/FeatureAvailability/index.ts +2 -0
- package/src/FeatureManagement/FeatureManagement.ts +166 -0
- package/src/FeatureManagement/FeatureManagementClient.ts +246 -0
- package/src/FeatureManagement/index.ts +2 -0
- package/src/FileContainer/FileContainer.ts +205 -0
- package/src/FileContainer/FileContainerClient.ts +154 -0
- package/src/FileContainer/index.ts +2 -0
- package/src/FormInput/FormInput.ts +288 -0
- package/src/FormInput/index.ts +1 -0
- package/src/Gallery/Gallery.ts +1977 -0
- package/src/Gallery/GalleryClient.ts +2251 -0
- package/src/Gallery/index.ts +2 -0
- package/src/Git/CodeEditorTypes.ts +335 -0
- package/src/Git/Git.ts +4058 -0
- package/src/Git/GitClient.ts +4750 -0
- package/src/Git/GitServices.ts +18 -0
- package/src/Git/index.ts +4 -0
- package/src/Graph/Graph.ts +572 -0
- package/src/Graph/GraphClient.ts +846 -0
- package/src/Graph/index.ts +2 -0
- package/src/Identities/Identities.ts +261 -0
- package/src/Identities/IdentityProvider.ts +90 -0
- package/src/Identities/IdentityService.ts +89 -0
- package/src/Identities/index.ts +3 -0
- package/src/Locations/Locations.ts +165 -0
- package/src/Locations/LocationsClient.ts +220 -0
- package/src/Locations/index.ts +2 -0
- package/src/Management/Management.ts +172 -0
- package/src/Management/ManagementClient.ts +348 -0
- package/src/Notification/Notification.ts +1460 -0
- package/src/Notification/NotificationClient.ts +477 -0
- package/src/Notification/index.ts +2 -0
- package/src/Operations/Operations.ts +86 -0
- package/src/Operations/OperationsClient.ts +42 -0
- package/src/Operations/index.ts +2 -0
- package/src/Pipelines/Pipelines.ts +354 -0
- package/src/Pipelines/PipelinesClient.ts +306 -0
- package/src/Policy/Policy.ts +173 -0
- package/src/Policy/PolicyClient.ts +315 -0
- package/src/Policy/index.ts +2 -0
- package/src/Profile/Profile.ts +187 -0
- package/src/Profile/ProfileClient.ts +328 -0
- package/src/Profile/index.ts +2 -0
- package/src/ProjectAnalysis/ProjectAnalysis.ts +74 -0
- package/src/ProjectAnalysis/ProjectAnalysisClient.ts +124 -0
- package/src/ProjectAnalysis/index.ts +2 -0
- package/src/Release/Release.ts +4237 -0
- package/src/Release/ReleaseClient.ts +2450 -0
- package/src/Release/index.ts +2 -0
- package/src/ResourceUsage/ResourceUsage.ts +19 -0
- package/src/ResourceUsage/ResourceUsageClient.ts +48 -0
- package/src/ServiceEndpoint/ServiceEndpoint.ts +930 -0
- package/src/ServiceEndpoint/ServiceEndpointClient.ts +617 -0
- package/src/ServiceEndpoint/index.ts +2 -0
- package/src/ServiceHooks/ServiceHooks.ts +759 -0
- package/src/ServiceHooks/ServiceHooksClient.ts +499 -0
- package/src/ServiceHooks/index.ts +2 -0
- package/src/TaskAgent/TaskAgent.ts +3896 -0
- package/src/TaskAgent/TaskAgentClient.ts +3918 -0
- package/src/TaskAgent/index.ts +2 -0
- package/src/Test/Test.ts +5853 -0
- package/src/Test/TestClient.ts +2201 -0
- package/src/Test/index.ts +2 -0
- package/src/TestPlan/TestPlan.ts +1384 -0
- package/src/TestPlan/TestPlanClient.ts +1367 -0
- package/src/TestPlan/index.ts +2 -0
- package/{AdvancedSecurity.Reporting/Reporting.js → src/TestResults/TestResults.ts} +7 -5
- package/src/TestResults/TestResultsClient.ts +3450 -0
- package/src/TestResults/index.ts +2 -0
- package/src/Tfvc/Tfvc.ts +770 -0
- package/src/Tfvc/TfvcClient.ts +757 -0
- package/src/Tfvc/index.ts +2 -0
- package/src/WebApi/WebApi.ts +452 -0
- package/src/WebApi/index.ts +1 -0
- package/src/Wiki/Wiki.ts +352 -0
- package/src/Wiki/WikiClient.ts +712 -0
- package/src/Wiki/index.ts +2 -0
- package/src/Work/Work.ts +1367 -0
- package/src/Work/WorkClient.ts +1489 -0
- package/src/Work/index.ts +2 -0
- package/src/WorkItemTracking/WorkItemTracking.ts +2215 -0
- package/src/WorkItemTracking/WorkItemTrackingClient.ts +2032 -0
- package/src/WorkItemTracking/WorkItemTrackingServices.ts +329 -0
- package/src/WorkItemTracking/index.ts +3 -0
- package/src/WorkItemTrackingProcess/WorkItemTrackingProcess.ts +1295 -0
- package/src/WorkItemTrackingProcess/WorkItemTrackingProcessClient.ts +1455 -0
- package/src/WorkItemTrackingProcess/index.ts +2 -0
- package/src/WorkItemTrackingProcessDefinitions/WorkItemTrackingProcessDefinitions.ts +606 -0
- package/src/WorkItemTrackingProcessDefinitions/WorkItemTrackingProcessDefinitionsClient.ts +1175 -0
- package/src/WorkItemTrackingProcessDefinitions/index.ts +2 -0
- package/src/index.ts +1 -0
- package/tsconfig.json +21 -0
- package/AdvancedSecurity.Reporting/Reporting.min.js +0 -1
- /package/{Accounts → bin/Accounts}/Accounts.d.ts +0 -0
- /package/{Accounts → bin/Accounts}/Accounts.js +0 -0
- /package/{Accounts → bin/Accounts}/Accounts.min.js +0 -0
- /package/{Accounts → bin/Accounts}/AccountsClient.d.ts +0 -0
- /package/{Accounts → bin/Accounts}/AccountsClient.js +0 -0
- /package/{Accounts → bin/Accounts}/AccountsClient.min.js +0 -0
- /package/{Accounts → bin/Accounts}/index.d.ts +0 -0
- /package/{Accounts → bin/Accounts}/index.js +0 -0
- /package/{Accounts → bin/Accounts}/index.min.js +0 -0
- /package/{AdvancedSecurity.Reporting → bin/AdvancedSecurity.Reporting}/ReportingClient.d.ts +0 -0
- /package/{AdvancedSecurity.Reporting → bin/AdvancedSecurity.Reporting}/ReportingClient.js +0 -0
- /package/{AdvancedSecurity.Reporting → bin/AdvancedSecurity.Reporting}/ReportingClient.min.js +0 -0
- /package/{Alert → bin/Alert}/Alert.js +0 -0
- /package/{Alert → bin/Alert}/Alert.min.js +0 -0
- /package/{Alert → bin/Alert}/AlertClient.min.js +0 -0
- /package/{Boards → bin/Boards}/Boards.d.ts +0 -0
- /package/{Boards → bin/Boards}/Boards.js +0 -0
- /package/{Boards → bin/Boards}/Boards.min.js +0 -0
- /package/{Boards → bin/Boards}/BoardsClient.d.ts +0 -0
- /package/{Boards → bin/Boards}/BoardsClient.js +0 -0
- /package/{Boards → bin/Boards}/BoardsClient.min.js +0 -0
- /package/{Boards → bin/Boards}/index.d.ts +0 -0
- /package/{Boards → bin/Boards}/index.js +0 -0
- /package/{Boards → bin/Boards}/index.min.js +0 -0
- /package/{Build → bin/Build}/Build.d.ts +0 -0
- /package/{Build → bin/Build}/Build.js +0 -0
- /package/{Build → bin/Build}/Build.min.js +0 -0
- /package/{Build → bin/Build}/BuildClient.d.ts +0 -0
- /package/{Build → bin/Build}/BuildClient.js +0 -0
- /package/{Build → bin/Build}/BuildClient.min.js +0 -0
- /package/{Build → bin/Build}/BuildServices.d.ts +0 -0
- /package/{Build → bin/Build}/BuildServices.js +0 -0
- /package/{Build → bin/Build}/BuildServices.min.js +0 -0
- /package/{Build → bin/Build}/index.d.ts +0 -0
- /package/{Build → bin/Build}/index.js +0 -0
- /package/{Build → bin/Build}/index.min.js +0 -0
- /package/{Comments → bin/Comments}/Comments.d.ts +0 -0
- /package/{Comments → bin/Comments}/Comments.js +0 -0
- /package/{Comments → bin/Comments}/Comments.min.js +0 -0
- /package/{Comments → bin/Comments}/index.d.ts +0 -0
- /package/{Comments → bin/Comments}/index.js +0 -0
- /package/{Comments → bin/Comments}/index.min.js +0 -0
- /package/{Common → bin/Common}/Client.d.ts +0 -0
- /package/{Common → bin/Common}/Client.js +0 -0
- /package/{Common → bin/Common}/Client.min.js +0 -0
- /package/{Common → bin/Common}/CommonServices.d.ts +0 -0
- /package/{Common → bin/Common}/CommonServices.js +0 -0
- /package/{Common → bin/Common}/CommonServices.min.js +0 -0
- /package/{Common → bin/Common}/Context.d.ts +0 -0
- /package/{Common → bin/Common}/Fetch.d.ts +0 -0
- /package/{Common → bin/Common}/Fetch.js +0 -0
- /package/{Common → bin/Common}/Fetch.min.js +0 -0
- /package/{Common → bin/Common}/RestClientBase.d.ts +0 -0
- /package/{Common → bin/Common}/RestClientBase.js +0 -0
- /package/{Common → bin/Common}/RestClientBase.min.js +0 -0
- /package/{Common → bin/Common}/System.d.ts +0 -0
- /package/{Common → bin/Common}/System.js +0 -0
- /package/{Common → bin/Common}/System.min.js +0 -0
- /package/{Common → bin/Common}/SystemData.d.ts +0 -0
- /package/{Common → bin/Common}/SystemData.js +0 -0
- /package/{Common → bin/Common}/SystemData.min.js +0 -0
- /package/{Common → bin/Common}/Util/Serialization.d.ts +0 -0
- /package/{Common → bin/Common}/Util/Serialization.js +0 -0
- /package/{Common → bin/Common}/Util/Serialization.min.js +0 -0
- /package/{Common → bin/Common}/Util/Url.d.ts +0 -0
- /package/{Common → bin/Common}/Util/Url.js +0 -0
- /package/{Common → bin/Common}/Util/Url.min.js +0 -0
- /package/{Common → bin/Common}/index.d.ts +0 -0
- /package/{Common → bin/Common}/index.js +0 -0
- /package/{Common → bin/Common}/index.min.js +0 -0
- /package/{Contributions → bin/Contributions}/Contributions.d.ts +0 -0
- /package/{Contributions → bin/Contributions}/Contributions.js +0 -0
- /package/{Contributions → bin/Contributions}/Contributions.min.js +0 -0
- /package/{Contributions → bin/Contributions}/ContributionsClient.d.ts +0 -0
- /package/{Contributions → bin/Contributions}/index.d.ts +0 -0
- /package/{Contributions → bin/Contributions}/index.js +0 -0
- /package/{Contributions → bin/Contributions}/index.min.js +0 -0
- /package/{Core → bin/Core}/Core.d.ts +0 -0
- /package/{Core → bin/Core}/Core.js +0 -0
- /package/{Core → bin/Core}/Core.min.js +0 -0
- /package/{Core → bin/Core}/CoreClient.d.ts +0 -0
- /package/{Core → bin/Core}/CoreClient.js +0 -0
- /package/{Core → bin/Core}/CoreClient.min.js +0 -0
- /package/{Core → bin/Core}/index.d.ts +0 -0
- /package/{Core → bin/Core}/index.js +0 -0
- /package/{Core → bin/Core}/index.min.js +0 -0
- /package/{Dashboard → bin/Dashboard}/Dashboard.d.ts +0 -0
- /package/{Dashboard → bin/Dashboard}/Dashboard.js +0 -0
- /package/{Dashboard → bin/Dashboard}/Dashboard.min.js +0 -0
- /package/{Dashboard → bin/Dashboard}/DashboardClient.d.ts +0 -0
- /package/{Dashboard → bin/Dashboard}/DashboardClient.js +0 -0
- /package/{Dashboard → bin/Dashboard}/DashboardClient.min.js +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetConfigHelpers.d.ts +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetConfigHelpers.js +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetConfigHelpers.min.js +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetContracts.d.ts +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetContracts.js +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetContracts.min.js +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetHelpers.d.ts +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetHelpers.js +0 -0
- /package/{Dashboard → bin/Dashboard}/WidgetHelpers.min.js +0 -0
- /package/{Dashboard → bin/Dashboard}/index.d.ts +0 -0
- /package/{Dashboard → bin/Dashboard}/index.js +0 -0
- /package/{Dashboard → bin/Dashboard}/index.min.js +0 -0
- /package/{DistributedTaskCommon → bin/DistributedTaskCommon}/DistributedTaskCommon.d.ts +0 -0
- /package/{DistributedTaskCommon → bin/DistributedTaskCommon}/DistributedTaskCommon.js +0 -0
- /package/{DistributedTaskCommon → bin/DistributedTaskCommon}/DistributedTaskCommon.min.js +0 -0
- /package/{DistributedTaskCommon → bin/DistributedTaskCommon}/index.d.ts +0 -0
- /package/{DistributedTaskCommon → bin/DistributedTaskCommon}/index.js +0 -0
- /package/{DistributedTaskCommon → bin/DistributedTaskCommon}/index.min.js +0 -0
- /package/{ExtensionManagement → bin/ExtensionManagement}/ExtensionManagement.d.ts +0 -0
- /package/{ExtensionManagement → bin/ExtensionManagement}/ExtensionManagement.js +0 -0
- /package/{ExtensionManagement → bin/ExtensionManagement}/ExtensionManagement.min.js +0 -0
- /package/{ExtensionManagement → bin/ExtensionManagement}/ExtensionManagementClient.d.ts +0 -0
- /package/{ExtensionManagement → bin/ExtensionManagement}/index.d.ts +0 -0
- /package/{ExtensionManagement → bin/ExtensionManagement}/index.js +0 -0
- /package/{ExtensionManagement → bin/ExtensionManagement}/index.min.js +0 -0
- /package/{Favorite → bin/Favorite}/Favorite.d.ts +0 -0
- /package/{Favorite → bin/Favorite}/Favorite.js +0 -0
- /package/{Favorite → bin/Favorite}/Favorite.min.js +0 -0
- /package/{Favorite → bin/Favorite}/FavoriteClient.d.ts +0 -0
- /package/{Favorite → bin/Favorite}/FavoriteClient.js +0 -0
- /package/{Favorite → bin/Favorite}/FavoriteClient.min.js +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/FeatureAvailability.d.ts +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/FeatureAvailability.js +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/FeatureAvailability.min.js +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/FeatureAvailabilityClient.d.ts +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/FeatureAvailabilityClient.js +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/FeatureAvailabilityClient.min.js +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/index.d.ts +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/index.js +0 -0
- /package/{FeatureAvailability → bin/FeatureAvailability}/index.min.js +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/FeatureManagement.d.ts +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/FeatureManagement.js +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/FeatureManagement.min.js +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/FeatureManagementClient.d.ts +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/FeatureManagementClient.js +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/FeatureManagementClient.min.js +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/index.d.ts +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/index.js +0 -0
- /package/{FeatureManagement → bin/FeatureManagement}/index.min.js +0 -0
- /package/{FileContainer → bin/FileContainer}/FileContainer.d.ts +0 -0
- /package/{FileContainer → bin/FileContainer}/FileContainer.js +0 -0
- /package/{FileContainer → bin/FileContainer}/FileContainer.min.js +0 -0
- /package/{FileContainer → bin/FileContainer}/FileContainerClient.d.ts +0 -0
- /package/{FileContainer → bin/FileContainer}/FileContainerClient.js +0 -0
- /package/{FileContainer → bin/FileContainer}/FileContainerClient.min.js +0 -0
- /package/{FileContainer → bin/FileContainer}/index.d.ts +0 -0
- /package/{FileContainer → bin/FileContainer}/index.js +0 -0
- /package/{FileContainer → bin/FileContainer}/index.min.js +0 -0
- /package/{FormInput → bin/FormInput}/FormInput.js +0 -0
- /package/{FormInput → bin/FormInput}/FormInput.min.js +0 -0
- /package/{FormInput → bin/FormInput}/index.d.ts +0 -0
- /package/{FormInput → bin/FormInput}/index.js +0 -0
- /package/{FormInput → bin/FormInput}/index.min.js +0 -0
- /package/{Gallery → bin/Gallery}/Gallery.d.ts +0 -0
- /package/{Gallery → bin/Gallery}/Gallery.js +0 -0
- /package/{Gallery → bin/Gallery}/Gallery.min.js +0 -0
- /package/{Gallery → bin/Gallery}/GalleryClient.d.ts +0 -0
- /package/{Gallery → bin/Gallery}/GalleryClient.js +0 -0
- /package/{Gallery → bin/Gallery}/GalleryClient.min.js +0 -0
- /package/{Gallery → bin/Gallery}/index.d.ts +0 -0
- /package/{Gallery → bin/Gallery}/index.js +0 -0
- /package/{Gallery → bin/Gallery}/index.min.js +0 -0
- /package/{Git → bin/Git}/CodeEditorTypes.d.ts +0 -0
- /package/{Git → bin/Git}/CodeEditorTypes.js +0 -0
- /package/{Git → bin/Git}/CodeEditorTypes.min.js +0 -0
- /package/{Git → bin/Git}/Git.d.ts +0 -0
- /package/{Git → bin/Git}/Git.js +0 -0
- /package/{Git → bin/Git}/Git.min.js +0 -0
- /package/{Git → bin/Git}/GitClient.d.ts +0 -0
- /package/{Git → bin/Git}/GitClient.js +0 -0
- /package/{Git → bin/Git}/GitClient.min.js +0 -0
- /package/{Git → bin/Git}/GitServices.d.ts +0 -0
- /package/{Git → bin/Git}/GitServices.js +0 -0
- /package/{Git → bin/Git}/GitServices.min.js +0 -0
- /package/{Git → bin/Git}/index.d.ts +0 -0
- /package/{Git → bin/Git}/index.js +0 -0
- /package/{Git → bin/Git}/index.min.js +0 -0
- /package/{Graph → bin/Graph}/Graph.d.ts +0 -0
- /package/{Graph → bin/Graph}/Graph.js +0 -0
- /package/{Graph → bin/Graph}/Graph.min.js +0 -0
- /package/{Graph → bin/Graph}/GraphClient.d.ts +0 -0
- /package/{Graph → bin/Graph}/GraphClient.js +0 -0
- /package/{Graph → bin/Graph}/GraphClient.min.js +0 -0
- /package/{Graph → bin/Graph}/index.d.ts +0 -0
- /package/{Graph → bin/Graph}/index.js +0 -0
- /package/{Graph → bin/Graph}/index.min.js +0 -0
- /package/{Identities → bin/Identities}/Identities.d.ts +0 -0
- /package/{Identities → bin/Identities}/Identities.js +0 -0
- /package/{Identities → bin/Identities}/Identities.min.js +0 -0
- /package/{Identities → bin/Identities}/IdentityProvider.d.ts +0 -0
- /package/{Identities → bin/Identities}/IdentityProvider.js +0 -0
- /package/{Identities → bin/Identities}/IdentityProvider.min.js +0 -0
- /package/{Identities → bin/Identities}/IdentityService.d.ts +0 -0
- /package/{Identities → bin/Identities}/IdentityService.js +0 -0
- /package/{Identities → bin/Identities}/IdentityService.min.js +0 -0
- /package/{Identities → bin/Identities}/index.d.ts +0 -0
- /package/{Identities → bin/Identities}/index.js +0 -0
- /package/{Identities → bin/Identities}/index.min.js +0 -0
- /package/{Locations → bin/Locations}/Locations.d.ts +0 -0
- /package/{Locations → bin/Locations}/Locations.js +0 -0
- /package/{Locations → bin/Locations}/Locations.min.js +0 -0
- /package/{Locations → bin/Locations}/LocationsClient.d.ts +0 -0
- /package/{Locations → bin/Locations}/LocationsClient.js +0 -0
- /package/{Locations → bin/Locations}/LocationsClient.min.js +0 -0
- /package/{Locations → bin/Locations}/index.d.ts +0 -0
- /package/{Locations → bin/Locations}/index.js +0 -0
- /package/{Locations → bin/Locations}/index.min.js +0 -0
- /package/{Management → bin/Management}/Management.d.ts +0 -0
- /package/{Management → bin/Management}/Management.js +0 -0
- /package/{Management → bin/Management}/Management.min.js +0 -0
- /package/{Management → bin/Management}/ManagementClient.d.ts +0 -0
- /package/{Management → bin/Management}/ManagementClient.js +0 -0
- /package/{Management → bin/Management}/ManagementClient.min.js +0 -0
- /package/{Notification → bin/Notification}/Notification.d.ts +0 -0
- /package/{Notification → bin/Notification}/Notification.js +0 -0
- /package/{Notification → bin/Notification}/Notification.min.js +0 -0
- /package/{Notification → bin/Notification}/NotificationClient.d.ts +0 -0
- /package/{Notification → bin/Notification}/NotificationClient.js +0 -0
- /package/{Notification → bin/Notification}/NotificationClient.min.js +0 -0
- /package/{Notification → bin/Notification}/index.d.ts +0 -0
- /package/{Notification → bin/Notification}/index.js +0 -0
- /package/{Notification → bin/Notification}/index.min.js +0 -0
- /package/{Operations → bin/Operations}/Operations.d.ts +0 -0
- /package/{Operations → bin/Operations}/Operations.js +0 -0
- /package/{Operations → bin/Operations}/Operations.min.js +0 -0
- /package/{Operations → bin/Operations}/OperationsClient.d.ts +0 -0
- /package/{Operations → bin/Operations}/OperationsClient.js +0 -0
- /package/{Operations → bin/Operations}/OperationsClient.min.js +0 -0
- /package/{Operations → bin/Operations}/index.d.ts +0 -0
- /package/{Operations → bin/Operations}/index.js +0 -0
- /package/{Operations → bin/Operations}/index.min.js +0 -0
- /package/{Pipelines → bin/Pipelines}/Pipelines.d.ts +0 -0
- /package/{Pipelines → bin/Pipelines}/Pipelines.js +0 -0
- /package/{Pipelines → bin/Pipelines}/Pipelines.min.js +0 -0
- /package/{Pipelines → bin/Pipelines}/PipelinesClient.d.ts +0 -0
- /package/{Pipelines → bin/Pipelines}/PipelinesClient.js +0 -0
- /package/{Pipelines → bin/Pipelines}/PipelinesClient.min.js +0 -0
- /package/{Policy → bin/Policy}/Policy.d.ts +0 -0
- /package/{Policy → bin/Policy}/Policy.js +0 -0
- /package/{Policy → bin/Policy}/Policy.min.js +0 -0
- /package/{Policy → bin/Policy}/PolicyClient.d.ts +0 -0
- /package/{Policy → bin/Policy}/PolicyClient.js +0 -0
- /package/{Policy → bin/Policy}/PolicyClient.min.js +0 -0
- /package/{Policy → bin/Policy}/index.d.ts +0 -0
- /package/{Policy → bin/Policy}/index.js +0 -0
- /package/{Policy → bin/Policy}/index.min.js +0 -0
- /package/{Profile → bin/Profile}/Profile.d.ts +0 -0
- /package/{Profile → bin/Profile}/Profile.js +0 -0
- /package/{Profile → bin/Profile}/Profile.min.js +0 -0
- /package/{Profile → bin/Profile}/ProfileClient.d.ts +0 -0
- /package/{Profile → bin/Profile}/ProfileClient.js +0 -0
- /package/{Profile → bin/Profile}/ProfileClient.min.js +0 -0
- /package/{Profile → bin/Profile}/index.d.ts +0 -0
- /package/{Profile → bin/Profile}/index.js +0 -0
- /package/{Profile → bin/Profile}/index.min.js +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/ProjectAnalysis.d.ts +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/ProjectAnalysis.js +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/ProjectAnalysis.min.js +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/ProjectAnalysisClient.d.ts +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/ProjectAnalysisClient.js +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/ProjectAnalysisClient.min.js +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/index.d.ts +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/index.js +0 -0
- /package/{ProjectAnalysis → bin/ProjectAnalysis}/index.min.js +0 -0
- /package/{Release → bin/Release}/Release.d.ts +0 -0
- /package/{Release → bin/Release}/Release.js +0 -0
- /package/{Release → bin/Release}/Release.min.js +0 -0
- /package/{Release → bin/Release}/ReleaseClient.d.ts +0 -0
- /package/{Release → bin/Release}/ReleaseClient.js +0 -0
- /package/{Release → bin/Release}/ReleaseClient.min.js +0 -0
- /package/{Release → bin/Release}/index.d.ts +0 -0
- /package/{Release → bin/Release}/index.js +0 -0
- /package/{Release → bin/Release}/index.min.js +0 -0
- /package/{ResourceUsage → bin/ResourceUsage}/ResourceUsage.d.ts +0 -0
- /package/{ResourceUsage → bin/ResourceUsage}/ResourceUsage.js +0 -0
- /package/{ResourceUsage → bin/ResourceUsage}/ResourceUsage.min.js +0 -0
- /package/{ResourceUsage → bin/ResourceUsage}/ResourceUsageClient.d.ts +0 -0
- /package/{ResourceUsage → bin/ResourceUsage}/ResourceUsageClient.js +0 -0
- /package/{ResourceUsage → bin/ResourceUsage}/ResourceUsageClient.min.js +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/ServiceEndpoint.d.ts +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/ServiceEndpoint.js +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/ServiceEndpoint.min.js +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/ServiceEndpointClient.d.ts +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/ServiceEndpointClient.js +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/ServiceEndpointClient.min.js +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/index.d.ts +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/index.js +0 -0
- /package/{ServiceEndpoint → bin/ServiceEndpoint}/index.min.js +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/ServiceHooks.d.ts +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/ServiceHooks.js +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/ServiceHooks.min.js +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/ServiceHooksClient.d.ts +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/ServiceHooksClient.js +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/ServiceHooksClient.min.js +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/index.d.ts +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/index.js +0 -0
- /package/{ServiceHooks → bin/ServiceHooks}/index.min.js +0 -0
- /package/{TaskAgent → bin/TaskAgent}/TaskAgent.js +0 -0
- /package/{TaskAgent → bin/TaskAgent}/TaskAgent.min.js +0 -0
- /package/{TaskAgent → bin/TaskAgent}/TaskAgentClient.d.ts +0 -0
- /package/{TaskAgent → bin/TaskAgent}/TaskAgentClient.js +0 -0
- /package/{TaskAgent → bin/TaskAgent}/TaskAgentClient.min.js +0 -0
- /package/{TaskAgent → bin/TaskAgent}/index.d.ts +0 -0
- /package/{TaskAgent → bin/TaskAgent}/index.js +0 -0
- /package/{TaskAgent → bin/TaskAgent}/index.min.js +0 -0
- /package/{Test → bin/Test}/Test.js +0 -0
- /package/{Test → bin/Test}/Test.min.js +0 -0
- /package/{Test → bin/Test}/TestClient.d.ts +0 -0
- /package/{Test → bin/Test}/TestClient.js +0 -0
- /package/{Test → bin/Test}/TestClient.min.js +0 -0
- /package/{Test → bin/Test}/index.d.ts +0 -0
- /package/{Test → bin/Test}/index.js +0 -0
- /package/{Test → bin/Test}/index.min.js +0 -0
- /package/{TestPlan → bin/TestPlan}/TestPlan.js +0 -0
- /package/{TestPlan → bin/TestPlan}/TestPlan.min.js +0 -0
- /package/{TestPlan → bin/TestPlan}/index.d.ts +0 -0
- /package/{TestPlan → bin/TestPlan}/index.js +0 -0
- /package/{TestPlan → bin/TestPlan}/index.min.js +0 -0
- /package/{TestResults → bin/TestResults}/TestResults.d.ts +0 -0
- /package/{TestResults → bin/TestResults}/TestResults.js +0 -0
- /package/{TestResults → bin/TestResults}/TestResults.min.js +0 -0
- /package/{TestResults → bin/TestResults}/index.d.ts +0 -0
- /package/{TestResults → bin/TestResults}/index.js +0 -0
- /package/{TestResults → bin/TestResults}/index.min.js +0 -0
- /package/{Tfvc → bin/Tfvc}/Tfvc.d.ts +0 -0
- /package/{Tfvc → bin/Tfvc}/Tfvc.js +0 -0
- /package/{Tfvc → bin/Tfvc}/Tfvc.min.js +0 -0
- /package/{Tfvc → bin/Tfvc}/TfvcClient.d.ts +0 -0
- /package/{Tfvc → bin/Tfvc}/TfvcClient.js +0 -0
- /package/{Tfvc → bin/Tfvc}/TfvcClient.min.js +0 -0
- /package/{Tfvc → bin/Tfvc}/index.d.ts +0 -0
- /package/{Tfvc → bin/Tfvc}/index.js +0 -0
- /package/{Tfvc → bin/Tfvc}/index.min.js +0 -0
- /package/{WebApi → bin/WebApi}/WebApi.d.ts +0 -0
- /package/{WebApi → bin/WebApi}/WebApi.js +0 -0
- /package/{WebApi → bin/WebApi}/WebApi.min.js +0 -0
- /package/{WebApi → bin/WebApi}/index.d.ts +0 -0
- /package/{WebApi → bin/WebApi}/index.js +0 -0
- /package/{WebApi → bin/WebApi}/index.min.js +0 -0
- /package/{Wiki → bin/Wiki}/Wiki.d.ts +0 -0
- /package/{Wiki → bin/Wiki}/Wiki.js +0 -0
- /package/{Wiki → bin/Wiki}/Wiki.min.js +0 -0
- /package/{Wiki → bin/Wiki}/WikiClient.d.ts +0 -0
- /package/{Wiki → bin/Wiki}/WikiClient.js +0 -0
- /package/{Wiki → bin/Wiki}/WikiClient.min.js +0 -0
- /package/{Wiki → bin/Wiki}/index.d.ts +0 -0
- /package/{Wiki → bin/Wiki}/index.js +0 -0
- /package/{Wiki → bin/Wiki}/index.min.js +0 -0
- /package/{Work → bin/Work}/Work.d.ts +0 -0
- /package/{Work → bin/Work}/Work.js +0 -0
- /package/{Work → bin/Work}/Work.min.js +0 -0
- /package/{Work → bin/Work}/WorkClient.d.ts +0 -0
- /package/{Work → bin/Work}/WorkClient.js +0 -0
- /package/{Work → bin/Work}/WorkClient.min.js +0 -0
- /package/{Work → bin/Work}/index.d.ts +0 -0
- /package/{Work → bin/Work}/index.js +0 -0
- /package/{Work → bin/Work}/index.min.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTracking.d.ts +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTracking.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTracking.min.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTrackingClient.d.ts +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTrackingClient.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTrackingClient.min.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTrackingServices.d.ts +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTrackingServices.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/WorkItemTrackingServices.min.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/index.d.ts +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/index.js +0 -0
- /package/{WorkItemTracking → bin/WorkItemTracking}/index.min.js +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/WorkItemTrackingProcess.d.ts +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/WorkItemTrackingProcess.js +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/WorkItemTrackingProcess.min.js +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/WorkItemTrackingProcessClient.d.ts +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/WorkItemTrackingProcessClient.js +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/WorkItemTrackingProcessClient.min.js +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/index.d.ts +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/index.js +0 -0
- /package/{WorkItemTrackingProcess → bin/WorkItemTrackingProcess}/index.min.js +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/WorkItemTrackingProcessDefinitions.d.ts +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/WorkItemTrackingProcessDefinitions.js +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/WorkItemTrackingProcessDefinitions.min.js +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/WorkItemTrackingProcessDefinitionsClient.d.ts +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/WorkItemTrackingProcessDefinitionsClient.js +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/WorkItemTrackingProcessDefinitionsClient.min.js +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/index.d.ts +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/index.js +0 -0
- /package/{WorkItemTrackingProcessDefinitions → bin/WorkItemTrackingProcessDefinitions}/index.min.js +0 -0
- /package/{index.d.ts → bin/index.d.ts} +0 -0
- /package/{index.js → bin/index.js} +0 -0
- /package/{index.min.js → bin/index.min.js} +0 -0
|
@@ -0,0 +1,773 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ---------------------------------------------------------
|
|
3
|
+
* Copyright(C) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* ---------------------------------------------------------
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Key constants used by route parsing.
|
|
9
|
+
*/
|
|
10
|
+
const enum KeyCodes {
|
|
11
|
+
asterisk = 42,
|
|
12
|
+
endCurlyBrace = 125,
|
|
13
|
+
startCurlyBrace = 123
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A single query parameter entry in a Uri
|
|
18
|
+
*/
|
|
19
|
+
export interface IQueryParameter {
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Unencoded name of the query parameter
|
|
23
|
+
*/
|
|
24
|
+
name: string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Unencoded value of the query parameter
|
|
28
|
+
*/
|
|
29
|
+
value: string | null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Options for parsing a Uri string
|
|
34
|
+
*/
|
|
35
|
+
export interface IUriParseOptions {
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* If true, throw if the Uri is not absolute
|
|
39
|
+
*/
|
|
40
|
+
absoluteUriRequired?: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Type of individual entry values that can be used in Uri.addQueryParams call
|
|
45
|
+
*/
|
|
46
|
+
export type QueryParameterEntryValueType = string | boolean | number | Date | undefined;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Type of values supported by Uri.addQueryParams call
|
|
50
|
+
*/
|
|
51
|
+
export type QueryParameterValueType =
|
|
52
|
+
| QueryParameterEntryValueType
|
|
53
|
+
| Array<QueryParameterEntryValueType>
|
|
54
|
+
| { [key: string]: QueryParameterEntryValueType };
|
|
55
|
+
|
|
56
|
+
function prepareForComparison(value: string, upperCase: boolean): string {
|
|
57
|
+
return value ? (upperCase ? value.toLocaleUpperCase() : value) : "";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function stringEquals(str1: string, str2: string, ignoreCase: boolean): boolean {
|
|
61
|
+
if (str1 === str2) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return prepareForComparison(str1, ignoreCase).localeCompare(prepareForComparison(str2, ignoreCase)) === 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Class that represents a Uri and allows parsing/getting and setting of individual parts
|
|
69
|
+
*/
|
|
70
|
+
export class Uri {
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The uri scheme such as http or https
|
|
74
|
+
*/
|
|
75
|
+
public scheme: string = "";
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* If true, do not emit the "//" separator after the scheme:
|
|
79
|
+
* Set to true for schemes like mailto (e.g. mailto:foo@bar)
|
|
80
|
+
*/
|
|
81
|
+
public noSchemeSeparator: boolean = false;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The uri hostname (does not include port or scheme)
|
|
85
|
+
*/
|
|
86
|
+
public host: string = "";
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The port number of the uri as supplied in the url. 0 if left out in the url (e.g. the default port for the scheme).
|
|
90
|
+
*/
|
|
91
|
+
public port: number = 0;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The relative path of the uri
|
|
95
|
+
*/
|
|
96
|
+
public path: string = "";
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The array of query parameters in the uri
|
|
100
|
+
*/
|
|
101
|
+
public queryParameters: IQueryParameter[] = [];
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The hash string of the uri
|
|
105
|
+
*/
|
|
106
|
+
public hashString: string = "";
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Create a new Uri.
|
|
110
|
+
*
|
|
111
|
+
* @param uri Optional uri string to populate values with
|
|
112
|
+
* @param options Options for parsing the uri string
|
|
113
|
+
*/
|
|
114
|
+
constructor(uri?: string, options?: IUriParseOptions) {
|
|
115
|
+
if (uri) {
|
|
116
|
+
this._setFromUriString(uri, options);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private _setFromUriString(uriString: string, options?: IUriParseOptions) {
|
|
121
|
+
let uri = uriString;
|
|
122
|
+
|
|
123
|
+
// Parse out the hash string
|
|
124
|
+
let hashSplit = this._singleSplit(uri, "#");
|
|
125
|
+
if (hashSplit) {
|
|
126
|
+
uri = hashSplit.part1;
|
|
127
|
+
this.hashString = this._decodeUriComponent(hashSplit.part2);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.hashString = "";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Parse the query parameters
|
|
134
|
+
let querySplit = this._singleSplit(uri, "?");
|
|
135
|
+
if (querySplit) {
|
|
136
|
+
uri = querySplit.part1;
|
|
137
|
+
this.queryString = querySplit.part2;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.queryParameters = [];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
this.scheme = "";
|
|
144
|
+
this.host = "";
|
|
145
|
+
this.port = 0;
|
|
146
|
+
this.path = "";
|
|
147
|
+
|
|
148
|
+
// Parse out the scheme components of the uri
|
|
149
|
+
this.noSchemeSeparator = false;
|
|
150
|
+
const schemeSplit = this._singleSplit(uri, ":");
|
|
151
|
+
if (schemeSplit) {
|
|
152
|
+
this.scheme = schemeSplit.part1;
|
|
153
|
+
uri = schemeSplit.part2;
|
|
154
|
+
|
|
155
|
+
if (uri.substr(0, 2) === "//") {
|
|
156
|
+
uri = uri.substr(2);
|
|
157
|
+
|
|
158
|
+
// Parse out the path part of the uri
|
|
159
|
+
const pathSplit = this._singleSplit(uri, "/");
|
|
160
|
+
if (pathSplit) {
|
|
161
|
+
uri = pathSplit.part1;
|
|
162
|
+
this.path = pathSplit.part2;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
this.path = "";
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Parse out the port number
|
|
169
|
+
const portSplit = this._singleSplit(uri, ":");
|
|
170
|
+
if (portSplit) {
|
|
171
|
+
this.host = portSplit.part1;
|
|
172
|
+
this.port = parseInt(portSplit.part2);
|
|
173
|
+
|
|
174
|
+
if (isNaN(this.port)) {
|
|
175
|
+
// Segment after : was not a port, consider it part of the path
|
|
176
|
+
this.host += ":";
|
|
177
|
+
this.path = portSplit.part2 + "/" + this.path;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
this.host = uri;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// No host for schemes like mailto: just use path
|
|
186
|
+
this.noSchemeSeparator = true;
|
|
187
|
+
this.path = uri;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// Relative Url was given
|
|
192
|
+
this.path = uri;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (options && options.absoluteUriRequired && !this.scheme) {
|
|
196
|
+
throw new Error(`The uri string "${uriString}" does not represent a valid absolute uri.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private _singleSplit(value: string, separator: string): { part1: string, part2: string } | undefined {
|
|
201
|
+
const matchIndex = value.indexOf(separator);
|
|
202
|
+
if (matchIndex >= 0) {
|
|
203
|
+
return {
|
|
204
|
+
part1: value.substr(0, matchIndex),
|
|
205
|
+
part2: value.substr(matchIndex + 1)
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private _decodeUriComponent(value: string): string {
|
|
214
|
+
if (value) {
|
|
215
|
+
// Replace "+" character with %20.
|
|
216
|
+
value = value.replace(/\+/g, "%20");
|
|
217
|
+
value = decodeURIComponent(value);
|
|
218
|
+
}
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get the absolute uri string for this Uri
|
|
224
|
+
*/
|
|
225
|
+
public get absoluteUri(): string {
|
|
226
|
+
let uri = "";
|
|
227
|
+
|
|
228
|
+
if (this.scheme) {
|
|
229
|
+
uri = encodeURI(decodeURI(this.scheme)) + ":";
|
|
230
|
+
if (!this.noSchemeSeparator) {
|
|
231
|
+
uri += "//";
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (this.host) {
|
|
236
|
+
uri += encodeURI(decodeURI(this.host));
|
|
237
|
+
|
|
238
|
+
if (this.port) {
|
|
239
|
+
uri += ":" + this.port;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!this.noSchemeSeparator || this.path) {
|
|
243
|
+
uri += "/";
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (this.path) {
|
|
248
|
+
let encodedPath: string;
|
|
249
|
+
if (this.noSchemeSeparator) {
|
|
250
|
+
// Only do simple encoding for schemes like mailto: or blob: where
|
|
251
|
+
// we can't determine host versus path
|
|
252
|
+
encodedPath = encodeURI(decodeURI(this.path));
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const parts = this.path.split('/');
|
|
256
|
+
encodedPath = parts.map(p => encodeURIComponent(decodeURIComponent(p))).join("/");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (this.host) {
|
|
260
|
+
uri = combineUrlPaths(uri, encodedPath);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
uri = uri + encodedPath;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const queryString = this.queryString;
|
|
268
|
+
if (queryString) {
|
|
269
|
+
uri += "?" + queryString;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (this.hashString) {
|
|
273
|
+
const params = this._splitStringIntoParams(this.hashString);
|
|
274
|
+
const encodedString = this._getParamsAsString(params);
|
|
275
|
+
uri += "#" + encodedString;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return uri;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Set the absolute uri string for this Uri. Replaces all existing values
|
|
283
|
+
*/
|
|
284
|
+
public set absoluteUri(uri: string) {
|
|
285
|
+
this._setFromUriString(uri || "");
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Gets the effective port number, returning the default port number if omitted for the given scheme.
|
|
290
|
+
*/
|
|
291
|
+
public getEffectivePort(): number {
|
|
292
|
+
if (this.port) {
|
|
293
|
+
return this.port;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
if (stringEquals(this.scheme, "http", true)) {
|
|
297
|
+
return 80;
|
|
298
|
+
}
|
|
299
|
+
else if (stringEquals(this.scheme, "https", true)) {
|
|
300
|
+
return 443;
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
return 0;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Builds an encoded key/value pair string
|
|
310
|
+
* like query string or hash strings
|
|
311
|
+
*/
|
|
312
|
+
private _getParamsAsString(params: IQueryParameter[]): string {
|
|
313
|
+
if (params && params.length) {
|
|
314
|
+
return params.map((param) => {
|
|
315
|
+
if (param.value !== null) {
|
|
316
|
+
return encodeURIComponent(param.name) + "=" + encodeURIComponent(param.value);
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
return encodeURIComponent(param.name);
|
|
320
|
+
}
|
|
321
|
+
}).join("&");
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
return "";
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Get the query string for this Uri.
|
|
330
|
+
*/
|
|
331
|
+
public get queryString(): string {
|
|
332
|
+
return this._getParamsAsString(this.queryParameters);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Set the query string for this Uri. Replaces existing value
|
|
337
|
+
*/
|
|
338
|
+
public set queryString(queryString: string) {
|
|
339
|
+
this.queryParameters = this._splitStringIntoParams(queryString);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Coverts a key/value pair string into parameters array
|
|
344
|
+
* @param paramString String such as a=b&c=d
|
|
345
|
+
*/
|
|
346
|
+
private _splitStringIntoParams(paramString: string): IQueryParameter[] {
|
|
347
|
+
let params: IQueryParameter[] = [];
|
|
348
|
+
paramString.split('&').forEach((pair) => {
|
|
349
|
+
if (pair) {
|
|
350
|
+
const valueSplit = this._singleSplit(pair, "=");
|
|
351
|
+
if (valueSplit) {
|
|
352
|
+
params.push({
|
|
353
|
+
name: this._decodeUriComponent(valueSplit.part1),
|
|
354
|
+
value: this._decodeUriComponent(valueSplit.part2)
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
params.push({
|
|
359
|
+
name: this._decodeUriComponent(pair),
|
|
360
|
+
value: null
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
return params;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Get the value of the query parameter with the given key
|
|
371
|
+
*
|
|
372
|
+
* @param name Query parameter name
|
|
373
|
+
*/
|
|
374
|
+
public getQueryParam(name: string): string | null | undefined {
|
|
375
|
+
let value: string | undefined | null;
|
|
376
|
+
if (this.queryParameters) {
|
|
377
|
+
let matchingPairs = this.queryParameters.filter(p => stringEquals(p.name, name, true));
|
|
378
|
+
if (matchingPairs.length > 0) {
|
|
379
|
+
value = matchingPairs[0].value;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return value;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Adds a query string parameter to the current uri
|
|
387
|
+
*
|
|
388
|
+
* @param name The Query parameter name
|
|
389
|
+
* @param value The Query parameter value
|
|
390
|
+
* @param replaceExisting If true, replace all existing parameters with the same name
|
|
391
|
+
*/
|
|
392
|
+
public addQueryParam(name: string, value: string | null, replaceExisting?: boolean): void {
|
|
393
|
+
if (replaceExisting) {
|
|
394
|
+
this.removeQueryParam(name);
|
|
395
|
+
}
|
|
396
|
+
if (!this.queryParameters) {
|
|
397
|
+
this.queryParameters = [];
|
|
398
|
+
}
|
|
399
|
+
this.queryParameters.push({ name: name, value: value });
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Adds query string parameters to the current uri
|
|
404
|
+
*
|
|
405
|
+
* @param parameters Query parameters to add
|
|
406
|
+
* @param replaceExisting If true, replace all existing parameters with the same name
|
|
407
|
+
* @param keyPrefix If specified, a value to prepend to all query parameter keys
|
|
408
|
+
*/
|
|
409
|
+
public addQueryParams(parameters: { [key: string]: QueryParameterValueType }, replaceExisting?: boolean, keyPrefix?: string): void {
|
|
410
|
+
for (const key in parameters) {
|
|
411
|
+
const value = parameters[key];
|
|
412
|
+
if (value !== null && value !== undefined) {
|
|
413
|
+
const keyWithPrefix = (keyPrefix || "") + key;
|
|
414
|
+
if (value instanceof Date) {
|
|
415
|
+
this.addQueryParam(keyWithPrefix, value.toJSON(), replaceExisting);
|
|
416
|
+
} else if (Array.isArray(value)) {
|
|
417
|
+
value.forEach(v => this.addQueryParam(keyWithPrefix, "" + v, replaceExisting));
|
|
418
|
+
} else if (typeof value === "object") {
|
|
419
|
+
this.addQueryParams(value, replaceExisting, keyWithPrefix + ".");
|
|
420
|
+
} else {
|
|
421
|
+
this.addQueryParam(keyWithPrefix, "" + value, replaceExisting);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Removes a query string parameter
|
|
429
|
+
*
|
|
430
|
+
* @param name The Query parameter name
|
|
431
|
+
*/
|
|
432
|
+
public removeQueryParam(name: string): void {
|
|
433
|
+
if (this.queryParameters) {
|
|
434
|
+
this.queryParameters = this.queryParameters.filter(p => !stringEquals(p.name, name, true));
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Take url segments and join them with a single slash character. Takes care of path segements that start and/or end
|
|
441
|
+
* with a slash to ensure that the resulting URL does not have double-slashes
|
|
442
|
+
*
|
|
443
|
+
* @param paths Path segments to concatenate
|
|
444
|
+
*/
|
|
445
|
+
export function combineUrlPaths(...paths: string[]): string {
|
|
446
|
+
|
|
447
|
+
let segmentsToJoin: string[] = [];
|
|
448
|
+
|
|
449
|
+
// Trim leading and trailing slash in each segment
|
|
450
|
+
for (let i = 0, last = paths.length - 1; i <= last; i++) {
|
|
451
|
+
let path = paths[i];
|
|
452
|
+
if (path) {
|
|
453
|
+
if (path === "/" && (i === 0 || i === last)) {
|
|
454
|
+
// For a "/" segment at the beginning or end of the list, insert an empty entry to force
|
|
455
|
+
// a leading or trailing slash in the resulting URL
|
|
456
|
+
segmentsToJoin.push("");
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
if (i > 0 && path[0] === "/") {
|
|
460
|
+
// Trim leading slash in any segment except the first one
|
|
461
|
+
path = path.substr(1);
|
|
462
|
+
}
|
|
463
|
+
if (i < last && path[path.length - 1] === "/") {
|
|
464
|
+
// Trim trailing slash in any segment except the last one
|
|
465
|
+
path = path.substr(0, path.length - 1);
|
|
466
|
+
}
|
|
467
|
+
if (path) {
|
|
468
|
+
segmentsToJoin.push(path);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (segmentsToJoin.length === 1 && segmentsToJoin[0] === "") {
|
|
475
|
+
return "/";
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Join segments by slash
|
|
479
|
+
return segmentsToJoin.join("/");
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Represents a route parsed by parseRoute
|
|
484
|
+
*/
|
|
485
|
+
export interface IParsedRoute {
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Array of the segements in the route
|
|
489
|
+
*/
|
|
490
|
+
segments: IParsedRouteSegment[];
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* And individual segment of the route (fixed text or a parameter)
|
|
495
|
+
*/
|
|
496
|
+
export interface IParsedRouteSegment {
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* If present, the fixed text for this segement. Either text or paramName will be defined for a segment, never both.
|
|
500
|
+
*/
|
|
501
|
+
text?: string;
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* If present, the name of the route value parameter to substitute for this segment. Either text or paramName will be defined for a segment, never both.
|
|
505
|
+
*/
|
|
506
|
+
paramName?: string;
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* For parameters, whether or not this parameter is a wildcard (*) parameter, which means it allows multiple path segments (i.e. don't escape "/")
|
|
510
|
+
*/
|
|
511
|
+
isWildCardParam?: boolean;
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Whether the parameter is required in order for the URL to be valid.
|
|
515
|
+
*/
|
|
516
|
+
isRequiredParam?: boolean;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Parse a route template into a structure that can be used to quickly do route replacements
|
|
521
|
+
*
|
|
522
|
+
* @param routeTemplate MVC route template string (like "/foo/{id}/{*params}")
|
|
523
|
+
*/
|
|
524
|
+
export function parseRouteTemplate(routeTemplate: string): IParsedRoute {
|
|
525
|
+
|
|
526
|
+
const parsedRoute: IParsedRoute = {
|
|
527
|
+
segments: []
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
let paramStartIndex = -1;
|
|
531
|
+
let segmentStartIndex = -1;
|
|
532
|
+
let segmentPrefix = "";
|
|
533
|
+
|
|
534
|
+
for (let charIndex = 0, routeTemplateLen = routeTemplate.length; charIndex < routeTemplateLen; charIndex++) {
|
|
535
|
+
let c = routeTemplate.charCodeAt(charIndex);
|
|
536
|
+
|
|
537
|
+
if (paramStartIndex >= 0) {
|
|
538
|
+
if (c === KeyCodes.endCurlyBrace) {
|
|
539
|
+
|
|
540
|
+
let paramName = routeTemplate.substring(paramStartIndex, charIndex);
|
|
541
|
+
let isWildCardParam = false;
|
|
542
|
+
|
|
543
|
+
if (paramName.charCodeAt(0) === KeyCodes.asterisk) {
|
|
544
|
+
paramName = paramName.substr(1);
|
|
545
|
+
isWildCardParam = true;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
parsedRoute.segments.push({
|
|
549
|
+
paramName,
|
|
550
|
+
isWildCardParam
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
paramStartIndex = -1;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
if (c === KeyCodes.startCurlyBrace && routeTemplate.charCodeAt(charIndex + 1) !== KeyCodes.startCurlyBrace) {
|
|
558
|
+
// Start of a parameter
|
|
559
|
+
if (segmentPrefix || segmentStartIndex >= 0) {
|
|
560
|
+
|
|
561
|
+
// Store the previous segment
|
|
562
|
+
let segmentText = segmentPrefix;
|
|
563
|
+
if (segmentStartIndex >= 0) {
|
|
564
|
+
segmentText += routeTemplate.substring(segmentStartIndex, charIndex);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
if (segmentText) {
|
|
568
|
+
parsedRoute.segments.push({
|
|
569
|
+
text: segmentText
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
// Reset the segment tracking info
|
|
574
|
+
segmentStartIndex = -1;
|
|
575
|
+
segmentPrefix = "";
|
|
576
|
+
}
|
|
577
|
+
paramStartIndex = charIndex + 1;
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
|
|
581
|
+
// Handle double {{ or double }} as an escape sequence. This is rare. For simplicity we will
|
|
582
|
+
if ((c === KeyCodes.startCurlyBrace && routeTemplate.charCodeAt(charIndex + 1) === KeyCodes.startCurlyBrace) ||
|
|
583
|
+
(c === KeyCodes.endCurlyBrace && routeTemplate.charCodeAt(charIndex + 1) === KeyCodes.endCurlyBrace)) {
|
|
584
|
+
|
|
585
|
+
segmentPrefix = segmentPrefix + routeTemplate.substring(segmentStartIndex >= 0 ? segmentStartIndex : charIndex, charIndex + 1);
|
|
586
|
+
segmentStartIndex = -1;
|
|
587
|
+
charIndex++;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
if (segmentStartIndex < 0) {
|
|
591
|
+
segmentStartIndex = charIndex;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// Store any pending segment
|
|
598
|
+
if (segmentStartIndex >= 0 || paramStartIndex >= 0) {
|
|
599
|
+
const segmentText = segmentPrefix + routeTemplate.substring(segmentStartIndex >= 0 ? segmentStartIndex : paramStartIndex);
|
|
600
|
+
if (segmentText) {
|
|
601
|
+
parsedRoute.segments.push({
|
|
602
|
+
text: segmentText
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// Mark any param as required if it has a text segment (other than just "/") after it
|
|
608
|
+
let required = false;
|
|
609
|
+
for (let i = parsedRoute.segments.length - 1; i >= 0; i--) {
|
|
610
|
+
let segment = parsedRoute.segments[i];
|
|
611
|
+
if (segment.text && segment.text !== "/") {
|
|
612
|
+
required = true;
|
|
613
|
+
}
|
|
614
|
+
else if (required && segment.paramName) {
|
|
615
|
+
segment.isRequiredParam = true;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
return parsedRoute;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Take a set of routes and route values and form a url using the best match. The best match
|
|
624
|
+
* is the route with the highest number of replacements (of the given routeValues dictionary).
|
|
625
|
+
* In the event of a tie (same number of replacements) the route that came first wins.
|
|
626
|
+
*
|
|
627
|
+
* @param routeCollection Array of parsed routes
|
|
628
|
+
* @param routeValues Replacement values
|
|
629
|
+
*/
|
|
630
|
+
export function routeUrl(routeCollection: IParsedRoute[], routeValues: { [name: string]: string }): string {
|
|
631
|
+
|
|
632
|
+
let bestMatch = getBestRouteMatch(routeCollection, routeValues);
|
|
633
|
+
if (!bestMatch) {
|
|
634
|
+
return "";
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
let uri = new Uri(bestMatch.url);
|
|
638
|
+
for (let routeValueKey in routeValues) {
|
|
639
|
+
if (!bestMatch.matchedParameters[routeValueKey]) {
|
|
640
|
+
uri.addQueryParam(routeValueKey, routeValues[routeValueKey]);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
return uri.absoluteUri;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Take a set of routes and find the best match. The best match is the route with the highest number of replacements
|
|
649
|
+
* (of the given routeValues dictionary). In the event of a tie (same number of replacements) the route that came first wins.
|
|
650
|
+
*
|
|
651
|
+
* @param routeCollection Array of parsed routes
|
|
652
|
+
* @param routeValues Replacement values
|
|
653
|
+
*/
|
|
654
|
+
export function getBestRouteMatch(routeCollection: IParsedRoute[], routeValues: { [name: string]: string }): IRouteMatchResult | undefined {
|
|
655
|
+
|
|
656
|
+
let bestMatch: IRouteMatchResult | undefined;
|
|
657
|
+
let totalRouteValues = Object.keys(routeValues).length;
|
|
658
|
+
|
|
659
|
+
for (let route of routeCollection) {
|
|
660
|
+
let match = replaceParsedRouteValues(route, routeValues, false);
|
|
661
|
+
if (match && (!bestMatch || match.matchedParametersCount > bestMatch.matchedParametersCount)) {
|
|
662
|
+
bestMatch = match;
|
|
663
|
+
|
|
664
|
+
if (match.matchedParametersCount === totalRouteValues) {
|
|
665
|
+
// This route matched all route values. Return its url directly (no need to even add query params)
|
|
666
|
+
return bestMatch;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
return bestMatch;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Result of a call to replace route values for a parsed route
|
|
676
|
+
*/
|
|
677
|
+
export interface IRouteMatchResult {
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* Resulting URL from the template replacement. Does NOT include any query parameters that would be added from extra route values.
|
|
681
|
+
*/
|
|
682
|
+
url: string;
|
|
683
|
+
|
|
684
|
+
/**
|
|
685
|
+
* Dictionary of the route value keys that were used as replacements
|
|
686
|
+
*/
|
|
687
|
+
matchedParameters: { [key: string]: boolean };
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* The number of parameter replacements made
|
|
691
|
+
*/
|
|
692
|
+
matchedParametersCount: number;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/**
|
|
696
|
+
* Replace route values for a specific parsed route
|
|
697
|
+
*
|
|
698
|
+
* @param parsedRoute The route to evaluate
|
|
699
|
+
* @param routeValues Dictionary of route replacement parameters
|
|
700
|
+
* @param continueOnUnmatchedSegements If true, continue with replacements even after a miss. By default (false), stop replacements once a parameter is not present.
|
|
701
|
+
*/
|
|
702
|
+
export function replaceParsedRouteValues(parsedRoute: IParsedRoute, routeValues: { [name: string]: string | number | undefined }, continueOnUnmatchedSegements?: boolean): IRouteMatchResult | undefined {
|
|
703
|
+
|
|
704
|
+
let urlParts: string[] = [];
|
|
705
|
+
let matchedParameters: { [key: string]: boolean } = {};
|
|
706
|
+
let matchedParametersCount = 0;
|
|
707
|
+
|
|
708
|
+
for (let segmentIndex = 0, l = parsedRoute.segments.length; segmentIndex < l; segmentIndex++) {
|
|
709
|
+
const segment = parsedRoute.segments[segmentIndex];
|
|
710
|
+
|
|
711
|
+
if (segment.text) {
|
|
712
|
+
let segmentText = segment.text;
|
|
713
|
+
if (continueOnUnmatchedSegements) {
|
|
714
|
+
// Make sure we don't have consecutive slash (/) characters in the case of missing segments
|
|
715
|
+
if (segmentIndex > 0 && segmentText.charAt(0) === "/") {
|
|
716
|
+
if (urlParts.length === 0) {
|
|
717
|
+
// First text segment after one or more missing parameter segments. Remove the leading slash.
|
|
718
|
+
segmentText = segmentText.substr(1);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
if (segmentText) {
|
|
724
|
+
urlParts.push(segmentText);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
else {
|
|
728
|
+
const value = routeValues[segment.paramName!];
|
|
729
|
+
if (!value && value !== 0) {
|
|
730
|
+
// The route value was not supplied
|
|
731
|
+
if (!continueOnUnmatchedSegements) {
|
|
732
|
+
if (segment.isRequiredParam) {
|
|
733
|
+
// This is a required parameter. Return undefined since this route was not a match.
|
|
734
|
+
return undefined;
|
|
735
|
+
}
|
|
736
|
+
else {
|
|
737
|
+
// This is an omitted optional parameter. Return what we've computed so far.
|
|
738
|
+
break;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
else if (urlParts.length) {
|
|
742
|
+
// Unmatched segment being omitted. Remove any previously trailing slash
|
|
743
|
+
let lastSegment = urlParts[urlParts.length - 1];
|
|
744
|
+
if (lastSegment[lastSegment.length - 1] === "/") {
|
|
745
|
+
urlParts[urlParts.length - 1] = lastSegment.substr(0, lastSegment.length - 1);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
else {
|
|
750
|
+
urlParts.push(segment.isWildCardParam ? encodeURI("" + value) : encodeURIComponent("" + value));
|
|
751
|
+
matchedParameters[segment.paramName!] = true;
|
|
752
|
+
matchedParametersCount++;
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
return {
|
|
758
|
+
url: urlParts.join(""),
|
|
759
|
+
matchedParameters,
|
|
760
|
+
matchedParametersCount
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
/**
|
|
765
|
+
* Take an MVC route template (like "/foo/{id}/{*params}") and replace the templated parts with values from the given dictionary
|
|
766
|
+
*
|
|
767
|
+
* @param routeTemplate MVC route template (like "/foo/{id}/{*params}")
|
|
768
|
+
* @param routeValues Route value replacements
|
|
769
|
+
*/
|
|
770
|
+
export function replaceRouteValues(routeTemplate: string, routeValues: { [name: string]: string | number | undefined }): string {
|
|
771
|
+
let parsedRoute = parseRouteTemplate(routeTemplate);
|
|
772
|
+
return replaceParsedRouteValues(parsedRoute, routeValues, true)!.url;
|
|
773
|
+
}
|