@letpeoplework/lighthouse-client 1.0.1 → 1.2.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/dist/index.js CHANGED
@@ -669,6 +669,8 @@ var requestNoContent = async (configuration, dependencies, route, requestOptions
669
669
  var getResolvedMetricsDateRange = (range) => range ?? getDefaultMetricsDateRange();
670
670
  var getMetricsDateRangeQuery = (range) => `startDate=${encodeURIComponent(range.startDate)}&endDate=${encodeURIComponent(range.endDate)}`;
671
671
  var getMetricsAsOfDateQuery = (asOfDate) => `asOfDate=${encodeURIComponent(asOfDate)}`;
672
+ var getItemIdsQuerySuffix = (itemIds) => itemIds && itemIds.length > 0 ? itemIds.map((id) => `&itemIds=${encodeURIComponent(id)}`).join("") : "";
673
+ var getViewQuerySuffix = (view) => view === "filtered" ? "&view=filtered" : "";
672
674
  var addUtcDays = (dateStr, days) => {
673
675
  const d = /* @__PURE__ */ new Date(`${dateStr}T00:00:00Z`);
674
676
  d.setUTCDate(d.getUTCDate() + days);
@@ -718,414 +720,572 @@ var deriveTotalWorkItemAgeOverTime = (startDate, endDate, wipData) => {
718
720
  daily.sort((a, b) => a.date.localeCompare(b.date));
719
721
  return { startDate, endDate, daily };
720
722
  };
721
- var createLighthouseClient = (configuration, dependencies = {}) => ({
722
- checkConnectivity: async () => {
723
- const fetchDependency = getFetchDependency(dependencies);
724
- return validateLighthouseConnectivity(
725
- configuration.connection,
726
- {
727
- fetch: fetchDependency
728
- },
729
- getRequestInit(configuration.auth)
730
- );
731
- },
732
- getVersion: async () => requestText(configuration, dependencies, "/v1/version/current"),
733
- listWorkTrackingConnections: async () => requestJson(
734
- configuration,
735
- dependencies,
736
- "/v1/worktrackingsystemconnections",
737
- {
738
- method: "GET"
739
- }
740
- ),
741
- getWorkTrackingConnection: async (connectionId) => requestJson(
742
- configuration,
743
- dependencies,
744
- `/v1/worktrackingsystemconnections/${connectionId}`,
745
- {
746
- method: "GET"
747
- }
748
- ),
749
- createWorkTrackingConnection: async (payload) => requestJson(
750
- configuration,
751
- dependencies,
752
- "/v1/worktrackingsystemconnections",
753
- {
754
- method: "POST",
755
- body: payload
756
- }
757
- ),
758
- updateWorkTrackingConnection: async (connectionId, payload) => requestJson(
759
- configuration,
760
- dependencies,
761
- `/v1/worktrackingsystemconnections/${connectionId}`,
762
- {
763
- method: "PUT",
764
- body: payload
765
- }
766
- ),
767
- deleteWorkTrackingConnection: async (connectionId) => requestNoContent(
768
- configuration,
769
- dependencies,
770
- `/v1/worktrackingsystemconnections/${connectionId}`,
771
- {
772
- method: "DELETE"
773
- }
774
- ),
775
- listTeams: async () => requestJson(configuration, dependencies, "/v1/teams", {
776
- method: "GET"
777
- }),
778
- getTeam: async (teamId) => requestJson(configuration, dependencies, `/v1/teams/${teamId}`, {
779
- method: "GET"
780
- }),
781
- createTeam: async (payload) => requestJson(configuration, dependencies, "/v1/teams", {
782
- method: "POST",
783
- body: payload
784
- }),
785
- updateTeam: async (teamId, payload) => requestJson(configuration, dependencies, `/v1/teams/${teamId}`, {
786
- method: "PUT",
787
- body: payload
788
- }),
789
- deleteTeam: async (teamId) => requestNoContent(configuration, dependencies, `/v1/teams/${teamId}`, {
790
- method: "DELETE"
791
- }),
792
- refreshTeam: async (teamId) => requestNoContent(configuration, dependencies, `/v1/teams/${teamId}`, {
793
- method: "POST"
794
- }),
795
- listPortfolios: async () => requestJson(
796
- configuration,
797
- dependencies,
798
- "/v1/portfolios",
799
- {
800
- method: "GET"
723
+ var FEATURE_REQUIRES_SERVER_NEWER_THAN = {
724
+ cumulativeStateTime: "v26.5.24.10"
725
+ };
726
+ var parseServerVersion = (raw) => {
727
+ const trimmed = raw.trim().replace(/^v/iu, "");
728
+ if (trimmed.length === 0) {
729
+ return null;
730
+ }
731
+ const segments = trimmed.split(".");
732
+ const parsed = [];
733
+ for (const segment of segments) {
734
+ if (!/^\d+$/u.test(segment)) {
735
+ return null;
801
736
  }
802
- ),
803
- getPortfolio: async (portfolioId) => requestJson(
804
- configuration,
805
- dependencies,
806
- `/v1/portfolios/${portfolioId}`,
807
- {
808
- method: "GET"
737
+ parsed.push(Number(segment));
738
+ }
739
+ return parsed.length > 0 ? parsed : null;
740
+ };
741
+ var isServerVersionNewerThan = (candidate, baseline) => {
742
+ const left = parseServerVersion(candidate);
743
+ const right = parseServerVersion(baseline);
744
+ if (left === null || right === null) {
745
+ return null;
746
+ }
747
+ const length = Math.max(left.length, right.length);
748
+ for (let index = 0; index < length; index += 1) {
749
+ const l = left[index] ?? 0;
750
+ const r = right[index] ?? 0;
751
+ if (l !== r) {
752
+ return l > r;
809
753
  }
810
- ),
811
- createPortfolio: async (payload) => requestJson(configuration, dependencies, "/v1/portfolios", {
812
- method: "POST",
813
- body: payload
814
- }),
815
- updatePortfolio: async (portfolioId, payload) => requestJson(
816
- configuration,
817
- dependencies,
818
- `/v1/portfolios/${portfolioId}`,
819
- {
820
- method: "PUT",
821
- body: payload
754
+ }
755
+ return false;
756
+ };
757
+ var createLighthouseClient = (configuration, dependencies = {}) => {
758
+ let cachedServerVersion;
759
+ const getCachedServerVersion = async () => {
760
+ if (cachedServerVersion === void 0) {
761
+ const result = await requestText(
762
+ configuration,
763
+ dependencies,
764
+ "/v1/version/current"
765
+ );
766
+ cachedServerVersion = result.ok ? result.value : null;
822
767
  }
823
- ),
824
- deletePortfolio: async (portfolioId) => requestNoContent(
825
- configuration,
826
- dependencies,
827
- `/v1/portfolios/${portfolioId}`,
828
- {
829
- method: "DELETE"
768
+ return cachedServerVersion;
769
+ };
770
+ const ensureServerSupports = async (feature) => {
771
+ const version = await getCachedServerVersion();
772
+ if (version === null) {
773
+ return null;
830
774
  }
831
- ),
832
- refreshPortfolio: async (portfolioId) => requestNoContent(
833
- configuration,
834
- dependencies,
835
- `/v1/portfolios/${portfolioId}/refresh`,
836
- {
837
- method: "POST"
775
+ const baseline = FEATURE_REQUIRES_SERVER_NEWER_THAN[feature];
776
+ const newer = isServerVersionNewerThan(version, baseline);
777
+ if (newer === null || newer) {
778
+ return null;
838
779
  }
839
- ),
840
- getTeamThroughput: async (teamId, range) => {
841
- const r = getResolvedMetricsDateRange(range);
842
- return requestJson(
780
+ return {
781
+ ok: false,
782
+ error: {
783
+ category: "misconfigured",
784
+ reason: `This Lighthouse server (${version}) does not support "${feature}" \u2014 it requires a version newer than ${baseline}. Upgrade Lighthouse to use this client feature.`
785
+ }
786
+ };
787
+ };
788
+ return {
789
+ checkConnectivity: async () => {
790
+ const fetchDependency = getFetchDependency(dependencies);
791
+ return validateLighthouseConnectivity(
792
+ configuration.connection,
793
+ {
794
+ fetch: fetchDependency
795
+ },
796
+ getRequestInit(configuration.auth)
797
+ );
798
+ },
799
+ getVersion: async () => requestText(configuration, dependencies, "/v1/version/current"),
800
+ listWorkTrackingConnections: async () => requestJson(
843
801
  configuration,
844
802
  dependencies,
845
- `/v1/teams/${teamId}/metrics/throughput?${getMetricsDateRangeQuery(r)}`,
846
- { method: "GET" }
847
- );
848
- },
849
- getTeamArrivals: async (teamId, range) => {
850
- const r = getResolvedMetricsDateRange(range);
851
- return requestJson(
803
+ "/v1/worktrackingsystemconnections",
804
+ {
805
+ method: "GET"
806
+ }
807
+ ),
808
+ getWorkTrackingConnection: async (connectionId) => requestJson(
852
809
  configuration,
853
810
  dependencies,
854
- `/v1/teams/${teamId}/metrics/arrivals?${getMetricsDateRangeQuery(r)}`,
855
- { method: "GET" }
856
- );
857
- },
858
- getTeamWipOverTime: async (teamId, range) => {
859
- const r = getResolvedMetricsDateRange(range);
860
- return requestJson(
811
+ `/v1/worktrackingsystemconnections/${connectionId}`,
812
+ {
813
+ method: "GET"
814
+ }
815
+ ),
816
+ createWorkTrackingConnection: async (payload) => requestJson(
861
817
  configuration,
862
818
  dependencies,
863
- `/v1/teams/${teamId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
864
- { method: "GET" }
865
- );
866
- },
867
- getTeamWip: async (teamId, asOfDate) => requestJson(
868
- configuration,
869
- dependencies,
870
- `/v1/teams/${teamId}/metrics/wip?${getMetricsAsOfDateQuery(asOfDate)}`,
871
- { method: "GET" }
872
- ),
873
- getTeamCycleTimePercentiles: async (teamId, range) => {
874
- const r = getResolvedMetricsDateRange(range);
875
- return requestJson(
819
+ "/v1/worktrackingsystemconnections",
820
+ {
821
+ method: "POST",
822
+ body: payload
823
+ }
824
+ ),
825
+ updateWorkTrackingConnection: async (connectionId, payload) => requestJson(
876
826
  configuration,
877
827
  dependencies,
878
- `/v1/teams/${teamId}/metrics/cycleTimePercentiles?${getMetricsDateRangeQuery(r)}`,
879
- { method: "GET" }
880
- );
881
- },
882
- getTeamCycleTimeData: async (teamId, range) => {
883
- const r = getResolvedMetricsDateRange(range);
884
- return requestJson(
828
+ `/v1/worktrackingsystemconnections/${connectionId}`,
829
+ {
830
+ method: "PUT",
831
+ body: payload
832
+ }
833
+ ),
834
+ deleteWorkTrackingConnection: async (connectionId) => requestNoContent(
885
835
  configuration,
886
836
  dependencies,
887
- `/v1/teams/${teamId}/metrics/cycleTimeData?${getMetricsDateRangeQuery(r)}`,
888
- { method: "GET" }
889
- );
890
- },
891
- getTeamPredictabilityScore: async (teamId, range) => {
892
- const r = getResolvedMetricsDateRange(range);
893
- return requestJson(
837
+ `/v1/worktrackingsystemconnections/${connectionId}`,
838
+ {
839
+ method: "DELETE"
840
+ }
841
+ ),
842
+ listTeams: async () => requestJson(
894
843
  configuration,
895
844
  dependencies,
896
- `/v1/teams/${teamId}/metrics/multiitemforecastpredictabilityscore?${getMetricsDateRangeQuery(r)}`,
897
- { method: "GET" }
898
- );
899
- },
900
- getTeamTotalWorkItemAge: async (teamId, asOfDate) => requestJson(
901
- configuration,
902
- dependencies,
903
- `/v1/teams/${teamId}/metrics/totalWorkItemAge?${getMetricsAsOfDateQuery(asOfDate)}`,
904
- { method: "GET" }
905
- ),
906
- getTeamTotalWorkItemAgeInfo: async (teamId, range) => {
907
- const r = getResolvedMetricsDateRange(range);
908
- return requestJson(
845
+ "/v1/teams",
846
+ {
847
+ method: "GET"
848
+ }
849
+ ),
850
+ getTeam: async (teamId) => requestJson(configuration, dependencies, `/v1/teams/${teamId}`, {
851
+ method: "GET"
852
+ }),
853
+ createTeam: async (payload) => requestJson(configuration, dependencies, "/v1/teams", {
854
+ method: "POST",
855
+ body: payload
856
+ }),
857
+ updateTeam: async (teamId, payload) => requestJson(configuration, dependencies, `/v1/teams/${teamId}`, {
858
+ method: "PUT",
859
+ body: payload
860
+ }),
861
+ deleteTeam: async (teamId) => requestNoContent(configuration, dependencies, `/v1/teams/${teamId}`, {
862
+ method: "DELETE"
863
+ }),
864
+ refreshTeam: async (teamId) => requestNoContent(configuration, dependencies, `/v1/teams/${teamId}`, {
865
+ method: "POST"
866
+ }),
867
+ listPortfolios: async () => requestJson(
909
868
  configuration,
910
869
  dependencies,
911
- `/v1/teams/${teamId}/metrics/totalWorkItemAgeInfo?${getMetricsDateRangeQuery(r)}`,
912
- { method: "GET" }
913
- );
914
- },
915
- getTeamWorkItemAgeOverTime: async (teamId, range) => {
916
- const r = getResolvedMetricsDateRange(range);
917
- const wipResult = await requestJson(
870
+ "/v1/portfolios",
871
+ {
872
+ method: "GET"
873
+ }
874
+ ),
875
+ getPortfolio: async (portfolioId) => requestJson(
918
876
  configuration,
919
877
  dependencies,
920
- `/v1/teams/${teamId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
921
- { method: "GET" }
922
- );
923
- if (!wipResult.ok) {
924
- return wipResult;
925
- }
926
- return {
927
- ok: true,
928
- value: deriveWorkItemAgeOverTime(r.startDate, r.endDate, wipResult.value)
929
- };
930
- },
931
- getTeamTotalWorkItemAgeOverTime: async (teamId, range) => {
932
- const r = getResolvedMetricsDateRange(range);
933
- const wipResult = await requestJson(
878
+ `/v1/portfolios/${portfolioId}`,
879
+ {
880
+ method: "GET"
881
+ }
882
+ ),
883
+ createPortfolio: async (payload) => requestJson(configuration, dependencies, "/v1/portfolios", {
884
+ method: "POST",
885
+ body: payload
886
+ }),
887
+ updatePortfolio: async (portfolioId, payload) => requestJson(
934
888
  configuration,
935
889
  dependencies,
936
- `/v1/teams/${teamId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
937
- { method: "GET" }
938
- );
939
- if (!wipResult.ok) {
940
- return wipResult;
941
- }
942
- return {
943
- ok: true,
944
- value: deriveTotalWorkItemAgeOverTime(
945
- r.startDate,
946
- r.endDate,
947
- wipResult.value
948
- )
949
- };
950
- },
951
- getPortfolioThroughput: async (portfolioId, range) => {
952
- const r = getResolvedMetricsDateRange(range);
953
- return requestJson(
890
+ `/v1/portfolios/${portfolioId}`,
891
+ {
892
+ method: "PUT",
893
+ body: payload
894
+ }
895
+ ),
896
+ deletePortfolio: async (portfolioId) => requestNoContent(
954
897
  configuration,
955
898
  dependencies,
956
- `/v1/portfolios/${portfolioId}/metrics/throughput?${getMetricsDateRangeQuery(r)}`,
957
- { method: "GET" }
958
- );
959
- },
960
- getPortfolioCycleTimePercentiles: async (portfolioId, range) => {
961
- const r = getResolvedMetricsDateRange(range);
962
- return requestJson(
899
+ `/v1/portfolios/${portfolioId}`,
900
+ {
901
+ method: "DELETE"
902
+ }
903
+ ),
904
+ refreshPortfolio: async (portfolioId) => requestNoContent(
963
905
  configuration,
964
906
  dependencies,
965
- `/v1/portfolios/${portfolioId}/metrics/cycleTimePercentiles?${getMetricsDateRangeQuery(r)}`,
966
- { method: "GET" }
967
- );
968
- },
969
- getPortfolioArrivals: async (portfolioId, range) => {
970
- const r = getResolvedMetricsDateRange(range);
971
- return requestJson(
907
+ `/v1/portfolios/${portfolioId}/refresh`,
908
+ {
909
+ method: "POST"
910
+ }
911
+ ),
912
+ getTeamThroughput: async (teamId, range, view) => {
913
+ const r = getResolvedMetricsDateRange(range);
914
+ return requestJson(
915
+ configuration,
916
+ dependencies,
917
+ `/v1/teams/${teamId}/metrics/throughput?${getMetricsDateRangeQuery(r)}${getViewQuerySuffix(view)}`,
918
+ { method: "GET" }
919
+ );
920
+ },
921
+ getTeamArrivals: async (teamId, range) => {
922
+ const r = getResolvedMetricsDateRange(range);
923
+ return requestJson(
924
+ configuration,
925
+ dependencies,
926
+ `/v1/teams/${teamId}/metrics/arrivals?${getMetricsDateRangeQuery(r)}`,
927
+ { method: "GET" }
928
+ );
929
+ },
930
+ getTeamWipOverTime: async (teamId, range) => {
931
+ const r = getResolvedMetricsDateRange(range);
932
+ return requestJson(
933
+ configuration,
934
+ dependencies,
935
+ `/v1/teams/${teamId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
936
+ { method: "GET" }
937
+ );
938
+ },
939
+ getTeamWip: async (teamId, asOfDate) => requestJson(
972
940
  configuration,
973
941
  dependencies,
974
- `/v1/portfolios/${portfolioId}/metrics/arrivals?${getMetricsDateRangeQuery(r)}`,
942
+ `/v1/teams/${teamId}/metrics/wip?${getMetricsAsOfDateQuery(asOfDate)}`,
975
943
  { method: "GET" }
976
- );
977
- },
978
- getPortfolioWipOverTime: async (portfolioId, range) => {
979
- const r = getResolvedMetricsDateRange(range);
980
- return requestJson(
944
+ ),
945
+ getTeamCycleTimePercentiles: async (teamId, range) => {
946
+ const r = getResolvedMetricsDateRange(range);
947
+ return requestJson(
948
+ configuration,
949
+ dependencies,
950
+ `/v1/teams/${teamId}/metrics/cycleTimePercentiles?${getMetricsDateRangeQuery(r)}`,
951
+ { method: "GET" }
952
+ );
953
+ },
954
+ getTeamCycleTimeData: async (teamId, range) => {
955
+ const r = getResolvedMetricsDateRange(range);
956
+ return requestJson(
957
+ configuration,
958
+ dependencies,
959
+ `/v1/teams/${teamId}/metrics/cycleTimeData?${getMetricsDateRangeQuery(r)}`,
960
+ { method: "GET" }
961
+ );
962
+ },
963
+ getTeamPredictabilityScore: async (teamId, range, view) => {
964
+ const r = getResolvedMetricsDateRange(range);
965
+ return requestJson(
966
+ configuration,
967
+ dependencies,
968
+ `/v1/teams/${teamId}/metrics/multiitemforecastpredictabilityscore?${getMetricsDateRangeQuery(r)}${getViewQuerySuffix(view)}`,
969
+ { method: "GET" }
970
+ );
971
+ },
972
+ getTeamTotalWorkItemAge: async (teamId, asOfDate) => requestJson(
981
973
  configuration,
982
974
  dependencies,
983
- `/v1/portfolios/${portfolioId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
975
+ `/v1/teams/${teamId}/metrics/totalWorkItemAge?${getMetricsAsOfDateQuery(asOfDate)}`,
984
976
  { method: "GET" }
985
- );
986
- },
987
- getPortfolioWip: async (portfolioId, asOfDate) => requestJson(
988
- configuration,
989
- dependencies,
990
- `/v1/portfolios/${portfolioId}/metrics/wip?${getMetricsAsOfDateQuery(asOfDate)}`,
991
- { method: "GET" }
992
- ),
993
- getPortfolioCycleTimeData: async (portfolioId, range) => {
994
- const r = getResolvedMetricsDateRange(range);
995
- return requestJson(
977
+ ),
978
+ getTeamTotalWorkItemAgeInfo: async (teamId, range) => {
979
+ const r = getResolvedMetricsDateRange(range);
980
+ return requestJson(
981
+ configuration,
982
+ dependencies,
983
+ `/v1/teams/${teamId}/metrics/totalWorkItemAgeInfo?${getMetricsDateRangeQuery(r)}`,
984
+ { method: "GET" }
985
+ );
986
+ },
987
+ getTeamWorkItemAgeOverTime: async (teamId, range) => {
988
+ const r = getResolvedMetricsDateRange(range);
989
+ const wipResult = await requestJson(
990
+ configuration,
991
+ dependencies,
992
+ `/v1/teams/${teamId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
993
+ { method: "GET" }
994
+ );
995
+ if (!wipResult.ok) {
996
+ return wipResult;
997
+ }
998
+ return {
999
+ ok: true,
1000
+ value: deriveWorkItemAgeOverTime(
1001
+ r.startDate,
1002
+ r.endDate,
1003
+ wipResult.value
1004
+ )
1005
+ };
1006
+ },
1007
+ getTeamTotalWorkItemAgeOverTime: async (teamId, range) => {
1008
+ const r = getResolvedMetricsDateRange(range);
1009
+ const wipResult = await requestJson(
1010
+ configuration,
1011
+ dependencies,
1012
+ `/v1/teams/${teamId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
1013
+ { method: "GET" }
1014
+ );
1015
+ if (!wipResult.ok) {
1016
+ return wipResult;
1017
+ }
1018
+ return {
1019
+ ok: true,
1020
+ value: deriveTotalWorkItemAgeOverTime(
1021
+ r.startDate,
1022
+ r.endDate,
1023
+ wipResult.value
1024
+ )
1025
+ };
1026
+ },
1027
+ getPortfolioThroughput: async (portfolioId, range) => {
1028
+ const r = getResolvedMetricsDateRange(range);
1029
+ return requestJson(
1030
+ configuration,
1031
+ dependencies,
1032
+ `/v1/portfolios/${portfolioId}/metrics/throughput?${getMetricsDateRangeQuery(r)}`,
1033
+ { method: "GET" }
1034
+ );
1035
+ },
1036
+ getPortfolioCycleTimePercentiles: async (portfolioId, range) => {
1037
+ const r = getResolvedMetricsDateRange(range);
1038
+ return requestJson(
1039
+ configuration,
1040
+ dependencies,
1041
+ `/v1/portfolios/${portfolioId}/metrics/cycleTimePercentiles?${getMetricsDateRangeQuery(r)}`,
1042
+ { method: "GET" }
1043
+ );
1044
+ },
1045
+ getPortfolioArrivals: async (portfolioId, range) => {
1046
+ const r = getResolvedMetricsDateRange(range);
1047
+ return requestJson(
1048
+ configuration,
1049
+ dependencies,
1050
+ `/v1/portfolios/${portfolioId}/metrics/arrivals?${getMetricsDateRangeQuery(r)}`,
1051
+ { method: "GET" }
1052
+ );
1053
+ },
1054
+ getPortfolioWipOverTime: async (portfolioId, range) => {
1055
+ const r = getResolvedMetricsDateRange(range);
1056
+ return requestJson(
1057
+ configuration,
1058
+ dependencies,
1059
+ `/v1/portfolios/${portfolioId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
1060
+ { method: "GET" }
1061
+ );
1062
+ },
1063
+ getPortfolioWip: async (portfolioId, asOfDate) => requestJson(
996
1064
  configuration,
997
1065
  dependencies,
998
- `/v1/portfolios/${portfolioId}/metrics/cycleTimeData?${getMetricsDateRangeQuery(r)}`,
1066
+ `/v1/portfolios/${portfolioId}/metrics/wip?${getMetricsAsOfDateQuery(asOfDate)}`,
999
1067
  { method: "GET" }
1000
- );
1001
- },
1002
- getPortfolioPredictabilityScore: async (portfolioId, range) => {
1003
- const r = getResolvedMetricsDateRange(range);
1004
- return requestJson(
1068
+ ),
1069
+ getPortfolioCycleTimeData: async (portfolioId, range) => {
1070
+ const r = getResolvedMetricsDateRange(range);
1071
+ return requestJson(
1072
+ configuration,
1073
+ dependencies,
1074
+ `/v1/portfolios/${portfolioId}/metrics/cycleTimeData?${getMetricsDateRangeQuery(r)}`,
1075
+ { method: "GET" }
1076
+ );
1077
+ },
1078
+ getPortfolioPredictabilityScore: async (portfolioId, range) => {
1079
+ const r = getResolvedMetricsDateRange(range);
1080
+ return requestJson(
1081
+ configuration,
1082
+ dependencies,
1083
+ `/v1/portfolios/${portfolioId}/metrics/multiitemforecastpredictabilityscore?${getMetricsDateRangeQuery(r)}`,
1084
+ { method: "GET" }
1085
+ );
1086
+ },
1087
+ getPortfolioTotalWorkItemAge: async (portfolioId, asOfDate) => requestJson(
1005
1088
  configuration,
1006
1089
  dependencies,
1007
- `/v1/portfolios/${portfolioId}/metrics/multiitemforecastpredictabilityscore?${getMetricsDateRangeQuery(r)}`,
1090
+ `/v1/portfolios/${portfolioId}/metrics/totalWorkItemAge?${getMetricsAsOfDateQuery(asOfDate)}`,
1008
1091
  { method: "GET" }
1009
- );
1010
- },
1011
- getPortfolioTotalWorkItemAge: async (portfolioId, asOfDate) => requestJson(
1012
- configuration,
1013
- dependencies,
1014
- `/v1/portfolios/${portfolioId}/metrics/totalWorkItemAge?${getMetricsAsOfDateQuery(asOfDate)}`,
1015
- { method: "GET" }
1016
- ),
1017
- getPortfolioTotalWorkItemAgeInfo: async (portfolioId, range) => {
1018
- const r = getResolvedMetricsDateRange(range);
1019
- return requestJson(
1092
+ ),
1093
+ getPortfolioTotalWorkItemAgeInfo: async (portfolioId, range) => {
1094
+ const r = getResolvedMetricsDateRange(range);
1095
+ return requestJson(
1096
+ configuration,
1097
+ dependencies,
1098
+ `/v1/portfolios/${portfolioId}/metrics/totalWorkItemAgeInfo?${getMetricsDateRangeQuery(r)}`,
1099
+ { method: "GET" }
1100
+ );
1101
+ },
1102
+ getPortfolioWorkItemAgeOverTime: async (portfolioId, range) => {
1103
+ const r = getResolvedMetricsDateRange(range);
1104
+ const wipResult = await requestJson(
1105
+ configuration,
1106
+ dependencies,
1107
+ `/v1/portfolios/${portfolioId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
1108
+ { method: "GET" }
1109
+ );
1110
+ if (!wipResult.ok) {
1111
+ return wipResult;
1112
+ }
1113
+ return {
1114
+ ok: true,
1115
+ value: deriveWorkItemAgeOverTime(
1116
+ r.startDate,
1117
+ r.endDate,
1118
+ wipResult.value
1119
+ )
1120
+ };
1121
+ },
1122
+ getPortfolioTotalWorkItemAgeOverTime: async (portfolioId, range) => {
1123
+ const r = getResolvedMetricsDateRange(range);
1124
+ const wipResult = await requestJson(
1125
+ configuration,
1126
+ dependencies,
1127
+ `/v1/portfolios/${portfolioId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
1128
+ { method: "GET" }
1129
+ );
1130
+ if (!wipResult.ok) {
1131
+ return wipResult;
1132
+ }
1133
+ return {
1134
+ ok: true,
1135
+ value: deriveTotalWorkItemAgeOverTime(
1136
+ r.startDate,
1137
+ r.endDate,
1138
+ wipResult.value
1139
+ )
1140
+ };
1141
+ },
1142
+ getTeamCumulativeStateTime: async (teamId, range, itemIds) => {
1143
+ const unsupported = await ensureServerSupports("cumulativeStateTime");
1144
+ if (unsupported) {
1145
+ return unsupported;
1146
+ }
1147
+ const r = getResolvedMetricsDateRange(range);
1148
+ return requestJson(
1149
+ configuration,
1150
+ dependencies,
1151
+ `/v1/teams/${teamId}/metrics/cumulativeStateTime?${getMetricsDateRangeQuery(r)}${getItemIdsQuerySuffix(itemIds)}`,
1152
+ { method: "GET" }
1153
+ );
1154
+ },
1155
+ getTeamCumulativeStateTimeItems: async (teamId, state, range, itemIds) => {
1156
+ const unsupported = await ensureServerSupports("cumulativeStateTime");
1157
+ if (unsupported) {
1158
+ return unsupported;
1159
+ }
1160
+ const r = getResolvedMetricsDateRange(range);
1161
+ return requestJson(
1162
+ configuration,
1163
+ dependencies,
1164
+ `/v1/teams/${teamId}/metrics/cumulativeStateTime/items?state=${encodeURIComponent(state)}&${getMetricsDateRangeQuery(r)}${getItemIdsQuerySuffix(itemIds)}`,
1165
+ { method: "GET" }
1166
+ );
1167
+ },
1168
+ getTeamCumulativeStateTimeCandidates: async (teamId, range) => {
1169
+ const unsupported = await ensureServerSupports("cumulativeStateTime");
1170
+ if (unsupported) {
1171
+ return unsupported;
1172
+ }
1173
+ const r = getResolvedMetricsDateRange(range);
1174
+ return requestJson(
1175
+ configuration,
1176
+ dependencies,
1177
+ `/v1/teams/${teamId}/metrics/cumulativeStateTime/candidates?${getMetricsDateRangeQuery(r)}`,
1178
+ { method: "GET" }
1179
+ );
1180
+ },
1181
+ getPortfolioCumulativeStateTime: async (portfolioId, range, itemIds) => {
1182
+ const unsupported = await ensureServerSupports("cumulativeStateTime");
1183
+ if (unsupported) {
1184
+ return unsupported;
1185
+ }
1186
+ const r = getResolvedMetricsDateRange(range);
1187
+ return requestJson(
1188
+ configuration,
1189
+ dependencies,
1190
+ `/v1/portfolios/${portfolioId}/metrics/cumulativeStateTime?${getMetricsDateRangeQuery(r)}${getItemIdsQuerySuffix(itemIds)}`,
1191
+ { method: "GET" }
1192
+ );
1193
+ },
1194
+ getPortfolioCumulativeStateTimeItems: async (portfolioId, state, range, itemIds) => {
1195
+ const unsupported = await ensureServerSupports("cumulativeStateTime");
1196
+ if (unsupported) {
1197
+ return unsupported;
1198
+ }
1199
+ const r = getResolvedMetricsDateRange(range);
1200
+ return requestJson(
1201
+ configuration,
1202
+ dependencies,
1203
+ `/v1/portfolios/${portfolioId}/metrics/cumulativeStateTime/items?state=${encodeURIComponent(state)}&${getMetricsDateRangeQuery(r)}${getItemIdsQuerySuffix(itemIds)}`,
1204
+ { method: "GET" }
1205
+ );
1206
+ },
1207
+ getPortfolioCumulativeStateTimeCandidates: async (portfolioId, range) => {
1208
+ const unsupported = await ensureServerSupports("cumulativeStateTime");
1209
+ if (unsupported) {
1210
+ return unsupported;
1211
+ }
1212
+ const r = getResolvedMetricsDateRange(range);
1213
+ return requestJson(
1214
+ configuration,
1215
+ dependencies,
1216
+ `/v1/portfolios/${portfolioId}/metrics/cumulativeStateTime/candidates?${getMetricsDateRangeQuery(r)}`,
1217
+ { method: "GET" }
1218
+ );
1219
+ },
1220
+ getFeaturesByIds: async (ids) => {
1221
+ const queryString = ids.map((id) => `ids=${encodeURIComponent(id)}`).join("&");
1222
+ return requestJson(
1223
+ configuration,
1224
+ dependencies,
1225
+ `/v1/features?${queryString}`,
1226
+ { method: "GET" }
1227
+ );
1228
+ },
1229
+ getFeaturesByReferences: async (refs) => {
1230
+ const queryString = refs.map((r) => `featureReferences=${encodeURIComponent(r)}`).join("&");
1231
+ return requestJson(
1232
+ configuration,
1233
+ dependencies,
1234
+ `/v1/features/references?${queryString}`,
1235
+ { method: "GET" }
1236
+ );
1237
+ },
1238
+ getFeatureWorkItems: async (featureId) => requestJson(
1020
1239
  configuration,
1021
1240
  dependencies,
1022
- `/v1/portfolios/${portfolioId}/metrics/totalWorkItemAgeInfo?${getMetricsDateRangeQuery(r)}`,
1241
+ `/v1/features/${featureId}/workitems`,
1023
1242
  { method: "GET" }
1024
- );
1025
- },
1026
- getPortfolioWorkItemAgeOverTime: async (portfolioId, range) => {
1027
- const r = getResolvedMetricsDateRange(range);
1028
- const wipResult = await requestJson(
1243
+ ),
1244
+ listDeliveries: async (portfolioId) => requestJson(
1029
1245
  configuration,
1030
1246
  dependencies,
1031
- `/v1/portfolios/${portfolioId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
1247
+ `/v1/deliveries/portfolio/${portfolioId}`,
1032
1248
  { method: "GET" }
1033
- );
1034
- if (!wipResult.ok) {
1035
- return wipResult;
1036
- }
1037
- return {
1038
- ok: true,
1039
- value: deriveWorkItemAgeOverTime(r.startDate, r.endDate, wipResult.value)
1040
- };
1041
- },
1042
- getPortfolioTotalWorkItemAgeOverTime: async (portfolioId, range) => {
1043
- const r = getResolvedMetricsDateRange(range);
1044
- const wipResult = await requestJson(
1249
+ ),
1250
+ createDelivery: async (portfolioId, payload) => requestJson(
1045
1251
  configuration,
1046
1252
  dependencies,
1047
- `/v1/portfolios/${portfolioId}/metrics/wipOverTime?${getMetricsDateRangeQuery(r)}`,
1048
- { method: "GET" }
1049
- );
1050
- if (!wipResult.ok) {
1051
- return wipResult;
1052
- }
1053
- return {
1054
- ok: true,
1055
- value: deriveTotalWorkItemAgeOverTime(
1056
- r.startDate,
1057
- r.endDate,
1058
- wipResult.value
1059
- )
1060
- };
1061
- },
1062
- getFeaturesByIds: async (ids) => {
1063
- const queryString = ids.map((id) => `ids=${encodeURIComponent(id)}`).join("&");
1064
- return requestJson(
1253
+ `/v1/deliveries/portfolio/${portfolioId}`,
1254
+ { method: "POST", body: payload }
1255
+ ),
1256
+ updateDelivery: async (deliveryId, payload) => requestJson(
1065
1257
  configuration,
1066
1258
  dependencies,
1067
- `/v1/features?${queryString}`,
1068
- { method: "GET" }
1069
- );
1070
- },
1071
- getFeaturesByReferences: async (refs) => {
1072
- const queryString = refs.map((r) => `featureReferences=${encodeURIComponent(r)}`).join("&");
1073
- return requestJson(
1259
+ `/v1/deliveries/${deliveryId}`,
1260
+ { method: "PUT", body: payload }
1261
+ ),
1262
+ deleteDelivery: async (deliveryId) => requestNoContent(
1074
1263
  configuration,
1075
1264
  dependencies,
1076
- `/v1/features/references?${queryString}`,
1077
- { method: "GET" }
1078
- );
1079
- },
1080
- getFeatureWorkItems: async (featureId) => requestJson(
1081
- configuration,
1082
- dependencies,
1083
- `/v1/features/${featureId}/workitems`,
1084
- { method: "GET" }
1085
- ),
1086
- listDeliveries: async (portfolioId) => requestJson(
1087
- configuration,
1088
- dependencies,
1089
- `/v1/deliveries/portfolio/${portfolioId}`,
1090
- { method: "GET" }
1091
- ),
1092
- createDelivery: async (portfolioId, payload) => requestJson(
1093
- configuration,
1094
- dependencies,
1095
- `/v1/deliveries/portfolio/${portfolioId}`,
1096
- { method: "POST", body: payload }
1097
- ),
1098
- updateDelivery: async (deliveryId, payload) => requestJson(
1099
- configuration,
1100
- dependencies,
1101
- `/v1/deliveries/${deliveryId}`,
1102
- { method: "PUT", body: payload }
1103
- ),
1104
- deleteDelivery: async (deliveryId) => requestNoContent(
1105
- configuration,
1106
- dependencies,
1107
- `/v1/deliveries/${deliveryId}`,
1108
- { method: "DELETE" }
1109
- ),
1110
- runManualForecast: async (teamId, payload) => requestJson(
1111
- configuration,
1112
- dependencies,
1113
- `/v1/forecast/manual/${teamId}`,
1114
- { method: "POST", body: payload }
1115
- ),
1116
- runBacktest: async (teamId, payload) => requestJson(
1117
- configuration,
1118
- dependencies,
1119
- `/v1/forecast/backtest/${teamId}`,
1120
- { method: "POST", body: payload }
1121
- )
1122
- });
1265
+ `/v1/deliveries/${deliveryId}`,
1266
+ { method: "DELETE" }
1267
+ ),
1268
+ runManualForecast: async (teamId, payload) => requestJson(
1269
+ configuration,
1270
+ dependencies,
1271
+ `/v1/forecast/manual/${teamId}`,
1272
+ { method: "POST", body: payload }
1273
+ ),
1274
+ runBacktest: async (teamId, payload) => requestJson(
1275
+ configuration,
1276
+ dependencies,
1277
+ `/v1/forecast/backtest/${teamId}`,
1278
+ { method: "POST", body: payload }
1279
+ )
1280
+ };
1281
+ };
1123
1282
  export {
1124
1283
  createLighthouseAuthContext,
1125
1284
  createLighthouseClient,
1126
1285
  getClientPackageContract,
1127
1286
  getDefaultMetricsDateRange,
1128
1287
  getStandaloneDiscoveryLockfilePath,
1288
+ isServerVersionNewerThan,
1129
1289
  loadStandaloneDiscoveryContract,
1130
1290
  parseStandaloneDiscoveryContract,
1131
1291
  pollCliAuthSession,