@financial-times/content-curation-client 2.2.0 → 2.3.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.
@@ -1771,22 +1771,38 @@ declare const HomepageStructureInputSchema: z.ZodObject<{
1771
1771
  properties: z.ZodObject<{
1772
1772
  title: z.ZodString;
1773
1773
  pageId: z.ZodString;
1774
+ conceptId: z.ZodOptional<z.ZodString>;
1775
+ metaDescription: z.ZodOptional<z.ZodString>;
1776
+ pageTheme: z.ZodOptional<z.ZodString>;
1777
+ sponsorText: z.ZodOptional<z.ZodString>;
1774
1778
  } & {
1775
1779
  homepageListId: z.ZodString;
1776
1780
  }, "strip", z.ZodTypeAny, {
1777
1781
  title: string;
1778
1782
  pageId: string;
1779
1783
  homepageListId: string;
1784
+ conceptId?: string | undefined;
1785
+ metaDescription?: string | undefined;
1786
+ pageTheme?: string | undefined;
1787
+ sponsorText?: string | undefined;
1780
1788
  }, {
1781
1789
  title: string;
1782
1790
  pageId: string;
1783
1791
  homepageListId: string;
1792
+ conceptId?: string | undefined;
1793
+ metaDescription?: string | undefined;
1794
+ pageTheme?: string | undefined;
1795
+ sponsorText?: string | undefined;
1784
1796
  }>;
1785
1797
  }, "strip", z.ZodTypeAny, {
1786
1798
  properties: {
1787
1799
  title: string;
1788
1800
  pageId: string;
1789
1801
  homepageListId: string;
1802
+ conceptId?: string | undefined;
1803
+ metaDescription?: string | undefined;
1804
+ pageTheme?: string | undefined;
1805
+ sponsorText?: string | undefined;
1790
1806
  };
1791
1807
  children: ({
1792
1808
  type: "HomepageSlice";
@@ -1918,6 +1934,10 @@ declare const HomepageStructureInputSchema: z.ZodObject<{
1918
1934
  title: string;
1919
1935
  pageId: string;
1920
1936
  homepageListId: string;
1937
+ conceptId?: string | undefined;
1938
+ metaDescription?: string | undefined;
1939
+ pageTheme?: string | undefined;
1940
+ sponsorText?: string | undefined;
1921
1941
  };
1922
1942
  children: ({
1923
1943
  type: "HomepageSlice";
@@ -2916,16 +2936,28 @@ declare const HomepageStructureOutputSchema: z.ZodObject<{
2916
2936
  properties: z.ZodObject<{
2917
2937
  title: z.ZodString;
2918
2938
  pageId: z.ZodString;
2939
+ conceptId: z.ZodOptional<z.ZodString>;
2940
+ metaDescription: z.ZodOptional<z.ZodString>;
2941
+ pageTheme: z.ZodOptional<z.ZodString>;
2942
+ sponsorText: z.ZodOptional<z.ZodString>;
2919
2943
  } & {
2920
2944
  homepageListId: z.ZodString;
2921
2945
  }, "strip", z.ZodTypeAny, {
2922
2946
  title: string;
2923
2947
  pageId: string;
2924
2948
  homepageListId: string;
2949
+ conceptId?: string | undefined;
2950
+ metaDescription?: string | undefined;
2951
+ pageTheme?: string | undefined;
2952
+ sponsorText?: string | undefined;
2925
2953
  }, {
2926
2954
  title: string;
2927
2955
  pageId: string;
2928
2956
  homepageListId: string;
2957
+ conceptId?: string | undefined;
2958
+ metaDescription?: string | undefined;
2959
+ pageTheme?: string | undefined;
2960
+ sponsorText?: string | undefined;
2929
2961
  }>;
2930
2962
  }, "strip", z.ZodTypeAny, {
2931
2963
  type: "Homepage";
@@ -2933,6 +2965,10 @@ declare const HomepageStructureOutputSchema: z.ZodObject<{
2933
2965
  title: string;
2934
2966
  pageId: string;
2935
2967
  homepageListId: string;
2968
+ conceptId?: string | undefined;
2969
+ metaDescription?: string | undefined;
2970
+ pageTheme?: string | undefined;
2971
+ sponsorText?: string | undefined;
2936
2972
  };
2937
2973
  children: ({
2938
2974
  type: "HomepageSlice";
@@ -3066,6 +3102,10 @@ declare const HomepageStructureOutputSchema: z.ZodObject<{
3066
3102
  title: string;
3067
3103
  pageId: string;
3068
3104
  homepageListId: string;
3105
+ conceptId?: string | undefined;
3106
+ metaDescription?: string | undefined;
3107
+ pageTheme?: string | undefined;
3108
+ sponsorText?: string | undefined;
3069
3109
  };
3070
3110
  children: ({
3071
3111
  type: "HomepageSlice";
@@ -3755,12 +3795,24 @@ declare const PageStructureInputSchema: z.ZodObject<{
3755
3795
  properties: z.ZodObject<{
3756
3796
  title: z.ZodString;
3757
3797
  pageId: z.ZodString;
3798
+ conceptId: z.ZodOptional<z.ZodString>;
3799
+ metaDescription: z.ZodOptional<z.ZodString>;
3800
+ pageTheme: z.ZodOptional<z.ZodString>;
3801
+ sponsorText: z.ZodOptional<z.ZodString>;
3758
3802
  }, "strip", z.ZodTypeAny, {
3759
3803
  title: string;
3760
3804
  pageId: string;
3805
+ conceptId?: string | undefined;
3806
+ metaDescription?: string | undefined;
3807
+ pageTheme?: string | undefined;
3808
+ sponsorText?: string | undefined;
3761
3809
  }, {
3762
3810
  title: string;
3763
3811
  pageId: string;
3812
+ conceptId?: string | undefined;
3813
+ metaDescription?: string | undefined;
3814
+ pageTheme?: string | undefined;
3815
+ sponsorText?: string | undefined;
3764
3816
  }>;
3765
3817
  children: z.ZodArray<z.ZodDiscriminatedUnion<"type", readonly [z.ZodObject<{
3766
3818
  type: z.ZodLiteral<"HomepageSlice">;
@@ -4622,6 +4674,10 @@ declare const PageStructureInputSchema: z.ZodObject<{
4622
4674
  properties: {
4623
4675
  title: string;
4624
4676
  pageId: string;
4677
+ conceptId?: string | undefined;
4678
+ metaDescription?: string | undefined;
4679
+ pageTheme?: string | undefined;
4680
+ sponsorText?: string | undefined;
4625
4681
  };
4626
4682
  children: ({
4627
4683
  type: "HomepageSlice";
@@ -4752,6 +4808,10 @@ declare const PageStructureInputSchema: z.ZodObject<{
4752
4808
  properties: {
4753
4809
  title: string;
4754
4810
  pageId: string;
4811
+ conceptId?: string | undefined;
4812
+ metaDescription?: string | undefined;
4813
+ pageTheme?: string | undefined;
4814
+ sponsorText?: string | undefined;
4755
4815
  };
4756
4816
  children: ({
4757
4817
  type: "HomepageSlice";
@@ -4896,12 +4956,24 @@ declare const PageStructureOutputSchema: z.ZodObject<{
4896
4956
  properties: z.ZodObject<{
4897
4957
  title: z.ZodString;
4898
4958
  pageId: z.ZodString;
4959
+ conceptId: z.ZodOptional<z.ZodString>;
4960
+ metaDescription: z.ZodOptional<z.ZodString>;
4961
+ pageTheme: z.ZodOptional<z.ZodString>;
4962
+ sponsorText: z.ZodOptional<z.ZodString>;
4899
4963
  }, "strip", z.ZodTypeAny, {
4900
4964
  title: string;
4901
4965
  pageId: string;
4966
+ conceptId?: string | undefined;
4967
+ metaDescription?: string | undefined;
4968
+ pageTheme?: string | undefined;
4969
+ sponsorText?: string | undefined;
4902
4970
  }, {
4903
4971
  title: string;
4904
4972
  pageId: string;
4973
+ conceptId?: string | undefined;
4974
+ metaDescription?: string | undefined;
4975
+ pageTheme?: string | undefined;
4976
+ sponsorText?: string | undefined;
4905
4977
  }>;
4906
4978
  children: z.ZodArray<z.ZodDiscriminatedUnion<"type", readonly [z.ZodObject<{
4907
4979
  type: z.ZodLiteral<"HomepageSlice">;
@@ -5764,6 +5836,10 @@ declare const PageStructureOutputSchema: z.ZodObject<{
5764
5836
  properties: {
5765
5837
  title: string;
5766
5838
  pageId: string;
5839
+ conceptId?: string | undefined;
5840
+ metaDescription?: string | undefined;
5841
+ pageTheme?: string | undefined;
5842
+ sponsorText?: string | undefined;
5767
5843
  };
5768
5844
  children: ({
5769
5845
  type: "HomepageSlice";
@@ -5896,6 +5972,10 @@ declare const PageStructureOutputSchema: z.ZodObject<{
5896
5972
  properties: {
5897
5973
  title: string;
5898
5974
  pageId: string;
5975
+ conceptId?: string | undefined;
5976
+ metaDescription?: string | undefined;
5977
+ pageTheme?: string | undefined;
5978
+ sponsorText?: string | undefined;
5899
5979
  };
5900
5980
  children: ({
5901
5981
  type: "HomepageSlice";
@@ -1771,22 +1771,38 @@ declare const HomepageStructureInputSchema: z.ZodObject<{
1771
1771
  properties: z.ZodObject<{
1772
1772
  title: z.ZodString;
1773
1773
  pageId: z.ZodString;
1774
+ conceptId: z.ZodOptional<z.ZodString>;
1775
+ metaDescription: z.ZodOptional<z.ZodString>;
1776
+ pageTheme: z.ZodOptional<z.ZodString>;
1777
+ sponsorText: z.ZodOptional<z.ZodString>;
1774
1778
  } & {
1775
1779
  homepageListId: z.ZodString;
1776
1780
  }, "strip", z.ZodTypeAny, {
1777
1781
  title: string;
1778
1782
  pageId: string;
1779
1783
  homepageListId: string;
1784
+ conceptId?: string | undefined;
1785
+ metaDescription?: string | undefined;
1786
+ pageTheme?: string | undefined;
1787
+ sponsorText?: string | undefined;
1780
1788
  }, {
1781
1789
  title: string;
1782
1790
  pageId: string;
1783
1791
  homepageListId: string;
1792
+ conceptId?: string | undefined;
1793
+ metaDescription?: string | undefined;
1794
+ pageTheme?: string | undefined;
1795
+ sponsorText?: string | undefined;
1784
1796
  }>;
1785
1797
  }, "strip", z.ZodTypeAny, {
1786
1798
  properties: {
1787
1799
  title: string;
1788
1800
  pageId: string;
1789
1801
  homepageListId: string;
1802
+ conceptId?: string | undefined;
1803
+ metaDescription?: string | undefined;
1804
+ pageTheme?: string | undefined;
1805
+ sponsorText?: string | undefined;
1790
1806
  };
1791
1807
  children: ({
1792
1808
  type: "HomepageSlice";
@@ -1918,6 +1934,10 @@ declare const HomepageStructureInputSchema: z.ZodObject<{
1918
1934
  title: string;
1919
1935
  pageId: string;
1920
1936
  homepageListId: string;
1937
+ conceptId?: string | undefined;
1938
+ metaDescription?: string | undefined;
1939
+ pageTheme?: string | undefined;
1940
+ sponsorText?: string | undefined;
1921
1941
  };
1922
1942
  children: ({
1923
1943
  type: "HomepageSlice";
@@ -2916,16 +2936,28 @@ declare const HomepageStructureOutputSchema: z.ZodObject<{
2916
2936
  properties: z.ZodObject<{
2917
2937
  title: z.ZodString;
2918
2938
  pageId: z.ZodString;
2939
+ conceptId: z.ZodOptional<z.ZodString>;
2940
+ metaDescription: z.ZodOptional<z.ZodString>;
2941
+ pageTheme: z.ZodOptional<z.ZodString>;
2942
+ sponsorText: z.ZodOptional<z.ZodString>;
2919
2943
  } & {
2920
2944
  homepageListId: z.ZodString;
2921
2945
  }, "strip", z.ZodTypeAny, {
2922
2946
  title: string;
2923
2947
  pageId: string;
2924
2948
  homepageListId: string;
2949
+ conceptId?: string | undefined;
2950
+ metaDescription?: string | undefined;
2951
+ pageTheme?: string | undefined;
2952
+ sponsorText?: string | undefined;
2925
2953
  }, {
2926
2954
  title: string;
2927
2955
  pageId: string;
2928
2956
  homepageListId: string;
2957
+ conceptId?: string | undefined;
2958
+ metaDescription?: string | undefined;
2959
+ pageTheme?: string | undefined;
2960
+ sponsorText?: string | undefined;
2929
2961
  }>;
2930
2962
  }, "strip", z.ZodTypeAny, {
2931
2963
  type: "Homepage";
@@ -2933,6 +2965,10 @@ declare const HomepageStructureOutputSchema: z.ZodObject<{
2933
2965
  title: string;
2934
2966
  pageId: string;
2935
2967
  homepageListId: string;
2968
+ conceptId?: string | undefined;
2969
+ metaDescription?: string | undefined;
2970
+ pageTheme?: string | undefined;
2971
+ sponsorText?: string | undefined;
2936
2972
  };
2937
2973
  children: ({
2938
2974
  type: "HomepageSlice";
@@ -3066,6 +3102,10 @@ declare const HomepageStructureOutputSchema: z.ZodObject<{
3066
3102
  title: string;
3067
3103
  pageId: string;
3068
3104
  homepageListId: string;
3105
+ conceptId?: string | undefined;
3106
+ metaDescription?: string | undefined;
3107
+ pageTheme?: string | undefined;
3108
+ sponsorText?: string | undefined;
3069
3109
  };
3070
3110
  children: ({
3071
3111
  type: "HomepageSlice";
@@ -3755,12 +3795,24 @@ declare const PageStructureInputSchema: z.ZodObject<{
3755
3795
  properties: z.ZodObject<{
3756
3796
  title: z.ZodString;
3757
3797
  pageId: z.ZodString;
3798
+ conceptId: z.ZodOptional<z.ZodString>;
3799
+ metaDescription: z.ZodOptional<z.ZodString>;
3800
+ pageTheme: z.ZodOptional<z.ZodString>;
3801
+ sponsorText: z.ZodOptional<z.ZodString>;
3758
3802
  }, "strip", z.ZodTypeAny, {
3759
3803
  title: string;
3760
3804
  pageId: string;
3805
+ conceptId?: string | undefined;
3806
+ metaDescription?: string | undefined;
3807
+ pageTheme?: string | undefined;
3808
+ sponsorText?: string | undefined;
3761
3809
  }, {
3762
3810
  title: string;
3763
3811
  pageId: string;
3812
+ conceptId?: string | undefined;
3813
+ metaDescription?: string | undefined;
3814
+ pageTheme?: string | undefined;
3815
+ sponsorText?: string | undefined;
3764
3816
  }>;
3765
3817
  children: z.ZodArray<z.ZodDiscriminatedUnion<"type", readonly [z.ZodObject<{
3766
3818
  type: z.ZodLiteral<"HomepageSlice">;
@@ -4622,6 +4674,10 @@ declare const PageStructureInputSchema: z.ZodObject<{
4622
4674
  properties: {
4623
4675
  title: string;
4624
4676
  pageId: string;
4677
+ conceptId?: string | undefined;
4678
+ metaDescription?: string | undefined;
4679
+ pageTheme?: string | undefined;
4680
+ sponsorText?: string | undefined;
4625
4681
  };
4626
4682
  children: ({
4627
4683
  type: "HomepageSlice";
@@ -4752,6 +4808,10 @@ declare const PageStructureInputSchema: z.ZodObject<{
4752
4808
  properties: {
4753
4809
  title: string;
4754
4810
  pageId: string;
4811
+ conceptId?: string | undefined;
4812
+ metaDescription?: string | undefined;
4813
+ pageTheme?: string | undefined;
4814
+ sponsorText?: string | undefined;
4755
4815
  };
4756
4816
  children: ({
4757
4817
  type: "HomepageSlice";
@@ -4896,12 +4956,24 @@ declare const PageStructureOutputSchema: z.ZodObject<{
4896
4956
  properties: z.ZodObject<{
4897
4957
  title: z.ZodString;
4898
4958
  pageId: z.ZodString;
4959
+ conceptId: z.ZodOptional<z.ZodString>;
4960
+ metaDescription: z.ZodOptional<z.ZodString>;
4961
+ pageTheme: z.ZodOptional<z.ZodString>;
4962
+ sponsorText: z.ZodOptional<z.ZodString>;
4899
4963
  }, "strip", z.ZodTypeAny, {
4900
4964
  title: string;
4901
4965
  pageId: string;
4966
+ conceptId?: string | undefined;
4967
+ metaDescription?: string | undefined;
4968
+ pageTheme?: string | undefined;
4969
+ sponsorText?: string | undefined;
4902
4970
  }, {
4903
4971
  title: string;
4904
4972
  pageId: string;
4973
+ conceptId?: string | undefined;
4974
+ metaDescription?: string | undefined;
4975
+ pageTheme?: string | undefined;
4976
+ sponsorText?: string | undefined;
4905
4977
  }>;
4906
4978
  children: z.ZodArray<z.ZodDiscriminatedUnion<"type", readonly [z.ZodObject<{
4907
4979
  type: z.ZodLiteral<"HomepageSlice">;
@@ -5764,6 +5836,10 @@ declare const PageStructureOutputSchema: z.ZodObject<{
5764
5836
  properties: {
5765
5837
  title: string;
5766
5838
  pageId: string;
5839
+ conceptId?: string | undefined;
5840
+ metaDescription?: string | undefined;
5841
+ pageTheme?: string | undefined;
5842
+ sponsorText?: string | undefined;
5767
5843
  };
5768
5844
  children: ({
5769
5845
  type: "HomepageSlice";
@@ -5896,6 +5972,10 @@ declare const PageStructureOutputSchema: z.ZodObject<{
5896
5972
  properties: {
5897
5973
  title: string;
5898
5974
  pageId: string;
5975
+ conceptId?: string | undefined;
5976
+ metaDescription?: string | undefined;
5977
+ pageTheme?: string | undefined;
5978
+ sponsorText?: string | undefined;
5899
5979
  };
5900
5980
  children: ({
5901
5981
  type: "HomepageSlice";
package/dist/index.cjs CHANGED
@@ -255,7 +255,11 @@ var SliceApiOutputSchema = _zod.z.discriminatedUnion("type", [
255
255
  ]);
256
256
  var BasePagePropertiesSchema = _zod.z.object({
257
257
  title: _zod.z.string(),
258
- pageId: _zod.z.string().uuid()
258
+ pageId: _zod.z.string().uuid(),
259
+ conceptId: _zod.z.string().optional(),
260
+ metaDescription: _zod.z.string().optional(),
261
+ pageTheme: _zod.z.string().optional(),
262
+ sponsorText: _zod.z.string().optional()
259
263
  });
260
264
  var PageStructureInputSchema = _zod.z.object({
261
265
  properties: BasePagePropertiesSchema,
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/circleci/repo/packages/content-curation-client/dist/index.cjs","../src/schemas/response.ts","../src/base.ts","../src/schemas/ftpink/page/index.ts","../src/schemas/prosemirror.ts","../src/homepage.ts","../src/schemas/ftpink/legacyHubPage/index.ts","../src/page.ts","../src/client.ts"],"names":[],"mappings":"AAAA;ACAA,0BAAmC;AAK5B,IAAM,aAAA,EAAe,MAAA,CAAE,IAAA,CAAK;AAAA,EAClC,cAAA;AAAA,EACA,WAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACD,CAAC,CAAA;AAKD,IAAM,mBAAA,EAAqB,MAAA,CAAE,MAAA,CAAO;AAAA,EACnC,UAAA,EAAY,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACrB,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO;AACrB,CAAC,CAAA;AAKM,IAAM,sBAAA,EAAwB,MAAA,CACnC,MAAA,CAAO;AAAA,EACP,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EAClB,OAAA,EAAS,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC7B,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC1B,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS;AAChC,CAAC,CAAA,CACA,MAAA,CAAO,CAAA;AAOF,IAAM,uBAAA,EAAyB,kBAAA,CAAmB,MAAA,CAAO;AAAA,EAC/D,MAAA,EAAQ,MAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EACzB,KAAA,EAAO;AACR,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA;AAOH,SAAS,wBAAA,CAA+C,UAAA,EAAe;AAC7E,EAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO;AAAA,IAChC,MAAA,EAAQ,MAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,IAC3B,IAAA,EAAM;AAAA,EACP,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA;AACX;AAKO,SAAS,iBAAA,CAAwC,UAAA,EAAe;AACtE,EAAA,MAAM,cAAA,EAAgB,wBAAA,CAAyB,UAAU,CAAA;AACzD,EAAA,MAAM,YAAA,EAAc,sBAAA;AACpB,EAAA,OAAO,MAAA,CAAE,kBAAA,CAAmB,QAAA,EAAU,CAAC,aAAA,EAAe,WAAW,CAAC,CAAA;AACnE;AD5BA;AACA;AE5BO,IAAM,eAAA,EAAN,MAAA,QAA6B,MAAM;AAAA,EAMzC,WAAA,CACQ,OAAA,EACA,UAAA,EACA,SAAA,EACN;AACD,IAAA,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAJd,IAAA,IAAA,CAAA,QAAA,EAAA,OAAA;AACA,IAAA,IAAA,CAAA,WAAA,EAAA,UAAA;AACA,IAAA,IAAA,CAAA,UAAA,EAAA,SAAA;AAGP,IAAA,IAAA,CAAK,KAAA,EAAO,UAAA;AACZ,IAAA,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,UAAA,EAAY,OAAA,CAAQ,SAAA;AAAA,EAC1B;AAAA,EAhBO;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAcR,CAAA;AAuBO,IAAM,cAAA,EAAN,MAAoB;AAAA,EAChB;AAAA,EAEV,WAAA,CAAY,MAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,OAAA,EAAS;AAAA,MACb,GAAG,MAAA;AAAA,MACH,KAAA,EAAO,MAAA,CAAO,MAAA,GAAS;AAAA,IACxB,CAAA;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CAIf,MAAA,EACA,IAAA,EACA,IAAA,EAKuC;AAEvC,IAAA,IAAI,YAAA,EAAc,IAAA,CAAK,IAAA;AACvB,IAAA,GAAA,CAAI,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,KAAA,IAAS,KAAA,CAAA,EAAW;AAClD,MAAA,YAAA,EAAc,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,IAAA,EAAM,IAAI,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,IAAI,CAAA;AAG9C,IAAA,MAAM,SAAA,EAAW,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAO,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG;AAAA,MACzD,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACR,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EACb,EAAE,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,OAAO,EAAA,EAClC,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA;AACnD,MAAA;AACkD,MAAA;AAClD,IAAA;AAEgC,IAAA;AACuC,IAAA;AAE7C,IAAA;AAC4D,MAAA;AACnD,IAAA;AACzB,MAAA;AACT,QAAA;AACO,UAAA;AACG,UAAA;AACA,UAAA;AACV,QAAA;AACA,QAAA;AACW,QAAA;AACZ,MAAA;AACD,IAAA;AAEkB,IAAA;AACnB,EAAA;AAAA;AAAA;AAAA;AAQwC,EAAA;AACgB,IAAA;AACxD,EAAA;AAAA;AAAA;AAAA;AAUwC,EAAA;AACqC,IAAA;AAC7E,EAAA;AACD;AF3BsH;AACA;AG9GpG;AHgHoG;AACA;AIjHpG;AAG8D;AACtE,EAAA;AACT;AAGoC;AACd,EAAA;AACN,EAAA;AACT,IAAA;AACN,EAAA;AACD;AAGoD;AACpD,EAAA;AACoC,EAAA;AACE,EAAA;AACG,EAAA;AACH,EAAA;AACtC;AAGoC;AACd,EAAA;AACP,EAAA;AAC0B,EAAA;AACzC;AAGyC;AACd,EAAA;AACS,EAAA;AACpC;AAG8E;AAGlC;AACvB,EAAA;AAG+C,EAAA;AACpE;AJmGqH;AACA;AGtIvF;AACf,EAAA;AACiB,EAAA;AAChC;AAMkC;AACF,EAAA;AAChC;AAOsD;AACD,EAAA;AACrD;AAKwC;AAC/B,EAAA;AACJ,IAAA;AACW,MAAA;AACP,MAAA;AACA,IAAA;AACA,MAAA;AACR,IAAA;AACD,EAAA;AACiC,EAAA;AAClC;AA0BG;AAC+B,EAAA;AAML,EAAA;AACH,IAAA;AACK,IAAA;AACjB,IAAA;AACZ,EAAA;AAMqC,EAAA;AACD,IAAA;AACpC,EAAA;AAMsC,EAAA;AACb,IAAA;AACzB,EAAA;AAEkC,EAAA;AACpC;AAUwC;AAC7B,EAAA;AAC6B,EAAA;AACvC;AAK8C;AACpC,EAAA;AAC+B,EAAA;AACC,IAAA;AAAA;AACT,IAAA;AAChC,EAAA;AACD;AAK2C;AACjC,EAAA;AAC+B,EAAA;AACH,IAAA;AACrC,EAAA;AACD;AAKyC;AAC/B,EAAA;AAC2B,EAAA;AACF,IAAA;AAAA;AACE,IAAA;AAAA;AACvB,IAAA;AAAA;AACb,EAAA;AACD;AAIoC;AAC1B,EAAA;AAC2B,EAAA;AACZ,IAAA;AAAA;AACU,IAAA;AAAA;AAClC,EAAA;AACD;AAIqC;AAC3B,EAAA;AAC2B,EAAA;AACvB,IAAA;AACkB,IAAA;AAC/B,EAAA;AACD;AAImC;AACzB,EAAA;AAC2B,EAAA;AACZ,IAAA;AAAA;AACU,IAAA;AAAA;AAClC,EAAA;AACD;AAU+D;AACjD,EAAA;AACO,EAAA;AACH,EAAA;AACF,EAAA;AACL,EAAA;AACC,EAAA;AACF,EAAA;AACD;AAMuD;AAClD,EAAA;AACO,EAAA;AACH,EAAA;AACF,EAAA;AACL,EAAA;AACC,EAAA;AACF,EAAA;AACD;AAMgC;AACzB,EAAA;AACQ,EAAA;AACxB;AAOgD;AACpC,EAAA;AACyB,EAAA;AACrC;AAO2E;AAC/B,EAAA;AAAA;AAEX,IAAA;AAChC,EAAA;AACD;AAKiD;AAC3B,EAAA;AACE,EAAA;AACZ,EAAA;AAC0B,EAAA;AACtC;AAE6E;AACnD,EAAA;AACkB,EAAA;AACX,IAAA;AAChC,EAAA;AACD;AHsBqH;AACA;AK/QpE;AACoB,EAAA;AACa,IAAA;AAClF,EAAA;AAEgG,EAAA;AACnF,IAAA;AACwB,MAAA;AACC,MAAA;AACrC,IAAA;AACD,EAAA;AAKoC,EAAA;AACvB,IAAA;AACW,MAAA;AACtB,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;AL4QsH;AACA;AM/SpG;AAUyB;AACd,EAAA;AACP,EAAA;AACA,IAAA;AAAA;AACpB,EAAA;AACD;AAEsC;AACd,EAAA;AACH,EAAA;AACA,IAAA;AACU,IAAA;AAC9B,EAAA;AACD;AAEiE;AACjE,EAAA;AACA,EAAA;AACA;AAEmC;AACL,EAAA;AACV,EAAA;AACC,EAAA;AACJ,IAAA;AACkB,IAAA;AAClC,EAAA;AACD;AAEoC;AACV,EAAA;AACN,EAAA;AACC,EAAA;AACD,IAAA;AACnB,EAAA;AACD;AAEsC;AACX,EAAA;AACwB,EAAA;AAC9B,EAAA;AACO,IAAA;AACwD,IAAA;AAC9C,IAAA;AACrC,EAAA;AACD;AAEuC;AACX,EAAA;AACR,EAAA;AACC,EAAA;AACK,IAAA;AACZ,IAAA;AACc,IAAA;AAElB,IAAA;AACqB,MAAA;AAAA;AAAA;AAGW,MAAA;AAG9B,IAAA;AACX,EAAA;AACD;AAEsD;AACtD,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AAEuD;AACtB,EAAA;AACK,EAAA;AACP,EAAA;AACT,EAAA;AACtB;AN8RqH;AACA;AO1WxE;AACoB,EAAA;AACS,IAAA;AAC1E,EAAA;AAEoF,EAAA;AACS,IAAA;AAC7F,EAAA;AAKgC,EAAA;AACnB,IAAA;AACO,MAAA;AAClB,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;APuWsH;AACA;AQjYzE;AAAA;AAAA;AAAA;AAI5C,EAAA;AACA,EAAA;AAEqC,EAAA;AACxB,IAAA;AAG6B,IAAA;AACR,IAAA;AAClC,EAAA;AACD;ARgYsH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/circleci/repo/packages/content-curation-client/dist/index.cjs","sourcesContent":[null,"import { z, type ZodTypeAny } from \"zod\";\n\n/**\n * Strongly‐typed enum for all possible API error codes.\n */\nexport const ApiErrorCode = z.enum([\n\t\"UNAUTHORIZED\",\n\t\"NOT_FOUND\",\n\t\"INTERNAL_SERVER_ERROR\",\n\t\"INVALID_INPUT_DATA\",\n]);\n\n/**\n * Fields shared by both success and error envelopes (but not the discriminant).\n */\nconst BaseEnvelopeFields = z.object({\n\tstatusCode: z.number(),\n\trequestId: z.string(),\n});\n\n/**\n * Specific details carried in an error payload.\n */\nexport const ApiErrorPayloadSchema = z\n\t.object({\n\t\tcode: ApiErrorCode,\n\t\tmessage: z.string(),\n\t\tdetails: z.string().optional(),\n\t\tpath: z.string().optional(),\n\t\ttimestamp: z.string().optional(),\n\t})\n\t.strict();\n\nexport type ApiErrorPayload = z.infer<typeof ApiErrorPayloadSchema>;\n\n/**\n * Full “envelope” when the API has failed.\n */\nexport const ApiErrorResponseSchema = BaseEnvelopeFields.extend({\n\tstatus: z.literal(\"error\"),\n\terror: ApiErrorPayloadSchema,\n}).strict();\n\nexport type ApiErrorResponse = z.infer<typeof ApiErrorResponseSchema>;\n\n/**\n * Schema for a successful API response, given some data schema T.\n */\nexport function ApiSuccessResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\treturn BaseEnvelopeFields.extend({\n\t\tstatus: z.literal(\"success\"),\n\t\tdata: dataSchema,\n\t}).strict();\n}\n\n/**\n * Union of success or error envelopes, discriminated on `status`.\n */\nexport function ApiResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\tconst successSchema = ApiSuccessResponseSchema(dataSchema);\n\tconst errorSchema = ApiErrorResponseSchema;\n\treturn z.discriminatedUnion(\"status\", [successSchema, errorSchema]);\n}\n","import type { z, ZodTypeAny } from \"zod\";\nimport type { ApiErrorPayloadSchema } from \"./schemas/response\";\nimport { ApiResponseSchema } from \"./schemas/response\";\n\n/**\n * API-level error thrown when { status: 'error' } is returned\n */\nexport class ApiClientError extends Error {\n\tpublic code: string;\n\tpublic details?: string;\n\tpublic path?: string;\n\tpublic timestamp?: string;\n\n\tconstructor(\n\t\tpublic payload: z.infer<typeof ApiErrorPayloadSchema>,\n\t\tpublic statusCode: number,\n\t\tpublic requestId?: string,\n\t) {\n\t\tsuper(payload.message);\n\t\tthis.name = \"ApiError\";\n\t\tthis.code = payload.code;\n\t\tthis.details = payload.details;\n\t\tthis.path = payload.path;\n\t\tthis.timestamp = payload.timestamp;\n\t}\n}\n\n/**\n * Configuration options for the API client\n */\nexport type ApiClientConfig =\n\t| {\n\t\t\t// Standard configuration.\n\t\t\t// Intended for external clients using an API key issued via API Gateway.\n\t\t\tbaseUrl: string;\n\t\t\tapiKey: string;\n\t\t\tapiToken?: never;\n\t\t\tfetch?: typeof fetch;\n\t }\n\t| {\n\t\t\t// Alternative configuration.\n\t\t\t// Reserved for client with access to a bearer token (e.g. The e2e tests).\n\t\t\tbaseUrl: string;\n\t\t\tapiKey?: never;\n\t\t\tapiToken: string;\n\t\t\tfetch?: typeof fetch;\n\t };\n\nexport class BaseApiClient {\n\tprotected config: ApiClientConfig;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tthis.config = {\n\t\t\t...config,\n\t\t\tfetch: config.fetch || fetch,\n\t\t};\n\t\tthis.config.baseUrl = this.config.baseUrl.replace(/\\/+$/, \"\"); // strip trailing slashes\n\t}\n\n\t/**\n\t * Generic HTTP request to a JSON API\n\t */\n\tprotected async request<\n\t\tReqSchema extends ZodTypeAny | undefined,\n\t\tResponseDataSchema extends ZodTypeAny,\n\t>(\n\t\tmethod: \"GET\" | \"PUT\" | \"POST\" | \"DELETE\",\n\t\tpath: string,\n\t\topts: {\n\t\t\trequestSchema?: ReqSchema;\n\t\t\tbody?: ReqSchema extends ZodTypeAny ? z.infer<ReqSchema> : unknown;\n\t\t\tresponseDataSchema: ResponseDataSchema;\n\t\t},\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\t// Validate request body if provided\n\t\tlet bodyPayload = opts.body;\n\t\tif (opts.requestSchema && opts.body !== undefined) {\n\t\t\tbodyPayload = opts.requestSchema.parse(opts.body);\n\t\t}\n\n\t\t// Build URL + query string\n\t\tconst url = new URL(this.config.baseUrl + path);\n\n\t\t// Perform fetch\n\t\tconst response = await this.config.fetch!(url.toString(), {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...(this.config.apiKey\n\t\t\t\t\t? { \"x-api-key\": this.config.apiKey }\n\t\t\t\t\t: { Authorization: `Bearer ${this.config.apiToken}` }),\n\t\t\t},\n\t\t\tbody: bodyPayload ? JSON.stringify(bodyPayload) : undefined,\n\t\t});\n\n\t\tconst json = await response.json();\n\t\tconst parsedJson = ApiResponseSchema(opts.responseDataSchema).parse(json);\n\n\t\tif (\"error\" in parsedJson) {\n\t\t\tthrow new ApiClientError(parsedJson.error, parsedJson.statusCode, parsedJson.requestId);\n\t\t} else if (!(\"data\" in parsedJson)) {\n\t\t\tthrow new ApiClientError(\n\t\t\t\t{\n\t\t\t\t\tcode: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t\tmessage: \"Unexpected API response format\",\n\t\t\t\t\tdetails: 'Response did not contain expected \"data\" field',\n\t\t\t\t},\n\t\t\t\t500,\n\t\t\t\tparsedJson.requestId,\n\t\t\t);\n\t\t}\n\n\t\treturn parsedJson.data;\n\t}\n\n\t/**\n\t * GET convenience method inferring response type from schema\n\t */\n\tprotected get<ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"GET\", path, { responseDataSchema });\n\t}\n\n\t/**\n\t * PUT convenience method inferring both request and response types\n\t */\n\tprotected put<ReqSchema extends ZodTypeAny, ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tbody: z.infer<ReqSchema>,\n\t\trequestSchema: ReqSchema,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"PUT\", path, { body, requestSchema, responseDataSchema });\n\t}\n}\n","import { z } from \"zod\";\nimport { ProseMirrorDocSchema } from \"../../prosemirror\";\n\n//\n// 1) REUSABLE SCHEMAS FOR COMMON STRUCTURES\n//\n\n/**\n * A generic schema representing a heading used across various slices.\n * - `text`: The display text of the heading.\n * - `href`: An optional URL that the heading links to.\n */\nconst HeadingSchema = z.object({\n\ttext: z.string(),\n\thref: z.string().url().optional(),\n});\n\n/**\n * Base “properties” common to most page slices.\n * - `heading`: An optional heading object for slices that can display a title.\n */\nconst BasePageItemProps = z.object({\n\theading: HeadingSchema.optional(),\n});\n\n/**\n * Extended properties for any “graphics”-type slice.\n * In addition to base properties, these slices must specify how the graphic is displayed.\n * - `displayBehaviour`: Determines if the graphic stands alone or is associated with other content.\n */\nconst BaseGraphicsItemProps = BasePageItemProps.extend({\n\tdisplayBehaviour: z.enum([\"standalone\", \"associated\"]),\n});\n\n/**\n * A schema to validate that a string is valid JSON.\n */\nconst ValidJSONStringSchema = z.string().refine(\n\t(val) => {\n\t\ttry {\n\t\t\tJSON.parse(val);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\t{ message: \"Invalid JSON string\" },\n);\n\n//\n// 2) GENERIC HELPER TO DEFINE “SLICE” INPUT/OUTPUT SCHEMAS\n//\n\n/**\n * A union type to represent either a Zod object schema or an optional Zod object schema.\n */\ntype OptionalOrRequiredZodObject = z.AnyZodObject | z.ZodOptional<z.AnyZodObject>;\n\n/**\n * Helper function that, given:\n * - `typeName`: A string literal identifying the slice type.\n * - `propsShape`: A Zod schema describing the slice’s `properties`.\n *\n * Returns an object containing two schemas:\n * - `InputSchema`: For client-side input; `sliceId` is optional.\n * - `OutputSchema`: For server-side/output; `sliceId` is required.\n *\n * This is useful because when defining slices we often want to allow -\n * clients to submit slices without an ID (e.g., when creating new slices),\n */\nfunction defineSliceSchema<T extends string, P extends OptionalOrRequiredZodObject>(options: {\n\ttypeName: T;\n\tpropsShape: P;\n}) {\n\tconst { typeName, propsShape } = options;\n\n\t// Base schema shared by both input and output:\n\t// - `type`: Literal string identifying which slice this is.\n\t// - `hidden`: Optional flag to mark the slice as hidden.\n\t// - `properties`: The detailed properties shape for the slice.\n\tconst BaseSchema = z.object({\n\t\ttype: z.literal(typeName),\n\t\thidden: z.boolean().optional(),\n\t\tproperties: propsShape,\n\t});\n\n\t/**\n\t * Input schema: For client submissions.\n\t * - `sliceId` is optional because the client might not specify it yet.\n\t */\n\tconst InputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid().optional(),\n\t});\n\n\t/**\n\t * Output schema: For persisted or server-returned data.\n\t * - `sliceId` is required (each saved slice must have an ID).\n\t */\n\tconst OutputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid(),\n\t});\n\n\treturn { InputSchema, OutputSchema };\n}\n\n//\n// 3) DEFINE INDIVIDUAL SLICE TYPES (INPUT & OUTPUT) USING THE HELPER\n//\n\n// 3.A “HomepageSlice”\n// - A generic homepage slice that may include an optional heading.\n// - Input: Clients can pass `properties` or omit entirely.\n// - Output: Always includes a `properties` object (may be empty) and a required `sliceId`.\nconst HomepageSlice = defineSliceSchema({\n\ttypeName: \"HomepageSlice\",\n\tpropsShape: BasePageItemProps.optional(),\n});\n\n// 3.B “FlourishGraphicSlice”\n// - A slice to embed or reference a Flourish graphic by its ID.\n// - Extends graphic base properties with `flourishId`.\nconst FlourishGraphicSlice = defineSliceSchema({\n\ttypeName: \"FlourishGraphic\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tflourishDescription: z.string().optional(), // Optional description for the Flourish graphic\n\t\tflourishId: z.string().nonempty(),\n\t}),\n});\n\n// 3.C “CustomIframeSlice”\n// - A slice that renders a custom iframe.\n// - Extends graphic base properties with `iframeSrc`.\nconst CustomIframeSlice = defineSliceSchema({\n\ttypeName: \"CustomIframe\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tiframeSrc: z.string().url().nonempty(),\n\t}),\n});\n\n// 3.D “ExperimentSlice”\n// - A slice for embedding experimental content.\n// - Requires an `experimentId`, `experimentName`, and a JSON string (`contentJson`).\nconst ExperimentSlice = defineSliceSchema({\n\ttypeName: \"Experiment\",\n\tpropsShape: BasePageItemProps.extend({\n\t\texperimentId: z.string().nonempty(), // Unique ID for the experiment\n\t\texperimentName: z.string().nonempty(), // Human-readable name of the experiment\n\t\tcontentJson: ValidJSONStringSchema, // The experiment’s JSON payload as a valid JSON string\n\t}),\n});\n\n// 3.E \"Strip\"\n// - A slice that displays a strip of content.\nconst StripSlice = defineSliceSchema({\n\ttypeName: \"Strip\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the strip to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n// 3.F \"TopperSlice\"\n// - A slice that displays a topper section with description and optional strapline.\nconst TopperSlice = defineSliceSchema({\n\ttypeName: \"Topper\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tdescription: ProseMirrorDocSchema,\n\t\tstrapline: z.string().optional(),\n\t}),\n});\n\n// 3.F \"Hero\"\n// - A slice that represents a Hero on the page. It references a Spark List.\nconst HeroSlice = defineSliceSchema({\n\ttypeName: \"Hero\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the spark list to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n//\n// 4) COMPOSE DISCRIMINATED UNIONS FOR “SLICE API” INPUT & OUTPUT\n//\n\n/**\n * All possible slice inputs for the Page API.\n * This discriminated union allows Zod to pick the correct schema based on the `type` field.\n */\nexport const SliceApiInputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.InputSchema,\n\tFlourishGraphicSlice.InputSchema,\n\tCustomIframeSlice.InputSchema,\n\tExperimentSlice.InputSchema,\n\tStripSlice.InputSchema,\n\tTopperSlice.InputSchema,\n\tHeroSlice.InputSchema,\n] as const);\n\n/**\n * All possible slice outputs for the Page API.\n * The same discriminated union but with each slice requiring `sliceId`.\n */\nexport const SliceApiOutputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.OutputSchema,\n\tFlourishGraphicSlice.OutputSchema,\n\tCustomIframeSlice.OutputSchema,\n\tExperimentSlice.OutputSchema,\n\tStripSlice.OutputSchema,\n\tTopperSlice.OutputSchema,\n\tHeroSlice.OutputSchema,\n] as const);\n\n//\n// 5) WRAPPER SCHEMAS FOR THE ENTIRE PAGE STRUCTURE\n//\n\nconst BasePagePropertiesSchema = z.object({\n\ttitle: z.string(),\n\tpageId: z.string().uuid(),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const PageStructureInputSchema = z.object({\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiInputSchema),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page (title, list ID, page ID).\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const HomepageStructureInputSchema = PageStructureInputSchema.extend({\n\tproperties: BasePagePropertiesSchema.extend({\n\t\t// This is optional for the input. If clients don't send it, we generate a uuid.\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n/**\n * Page structure as stored or returned by the server.\n */\nexport const PageStructureOutputSchema = z.object({\n\ttype: z.literal(\"Page\"),\n\tschemaVersion: z.number(),\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiOutputSchema),\n});\n\nexport const HomepageStructureOutputSchema = PageStructureOutputSchema.extend({\n\ttype: z.literal(\"Homepage\"),\n\tproperties: BasePagePropertiesSchema.extend({\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n//\n// 6) EXPORT TYPES FOR CONSUMPTION IN CODE\n//\n\n/** Client-side type for page structure input */\nexport type PageStructureInput = z.infer<typeof PageStructureInputSchema>;\n\n/** Server-side type for page structure output */\nexport type PageStructureOutput = z.infer<typeof PageStructureOutputSchema>;\n\n/** Client-side type for homepage structure input */\nexport type HomepageStructureInput = z.infer<typeof HomepageStructureInputSchema>;\n\n/** Server-side type for homepage structure output */\nexport type HomepageStructureOutput = z.infer<typeof HomepageStructureOutputSchema>;\n\n/** Union of all possible slice outputs for type-checking convenience */\nexport type Slice = z.infer<typeof SliceApiOutputSchema>;\n\n/** Individual slice output types */\nexport type HomepageSliceType = z.infer<typeof HomepageSlice.OutputSchema>;\nexport type FlourishGraphicSliceType = z.infer<typeof FlourishGraphicSlice.OutputSchema>;\nexport type CustomIframeSliceType = z.infer<typeof CustomIframeSlice.OutputSchema>;\nexport type ExperimentSliceType = z.infer<typeof ExperimentSlice.OutputSchema>;\nexport type StripSliceType = z.infer<typeof StripSlice.OutputSchema>;\nexport type TopperSliceType = z.infer<typeof TopperSlice.OutputSchema>;\nexport type HeroSliceType = z.infer<typeof HeroSlice.OutputSchema>;\n\n/**\n * Union type for interactive slices (i.e., the ones rendering visual components).\n * Useful for code that cares specifically about slices with visual/interactive content.\n */\nexport type InteractiveSlice = FlourishGraphicSliceType | CustomIframeSliceType;\n","import { z } from \"zod\";\n\n/** Accept http(s) and mailto: (matches your editor config) */\nconst HrefSchema = z.string().refine((v) => /^(https?:\\/\\/|mailto:).+/.test(v), {\n\tmessage: \"Expected http(s):// or mailto: URL\",\n});\n\n/** Link mark. */\nconst ProseMirrorLinkMark = z.object({\n\ttype: z.literal(\"link\"),\n\tattrs: z.object({\n\t\thref: HrefSchema,\n\t}),\n});\n\n/** Supported text marks */\nconst ProseMirrorMark = z.discriminatedUnion(\"type\", [\n\tProseMirrorLinkMark,\n\tz.object({ type: z.literal(\"bold\") }),\n\tz.object({ type: z.literal(\"italic\") }),\n\tz.object({ type: z.literal(\"underline\") }),\n\tz.object({ type: z.literal(\"strike\") }),\n]);\n\n/** Text node */\nconst ProseMirrorTextNode = z.object({\n\ttype: z.literal(\"text\"),\n\ttext: z.string(),\n\tmarks: z.array(ProseMirrorMark).optional(),\n});\n\n/** Paragraph node — content can be empty/omitted */\nconst ProseMirrorParagraphNode = z.object({\n\ttype: z.literal(\"paragraph\"),\n\tcontent: z.array(ProseMirrorTextNode),\n});\n\n/** ProseMirror Node Union. */\nconst ProseMirrorNode = z.union([ProseMirrorParagraphNode, ProseMirrorTextNode]);\n\n/** Root node of a ProseMirror document - enforcing at least 1 paragraph */\nexport const ProseMirrorDocSchema = z.object({\n\ttype: z.literal(\"doc\"),\n\tcontent: z\n\t\t.array(ProseMirrorNode)\n\t\t.min(1, { message: \"Document must contain at least one paragraph\" }),\n});\n\n/** Rich text editor TS type. */\nexport type RichTextEditorType = z.infer<typeof ProseMirrorDocSchema>;\n\nexport {};\n","import { BaseApiClient } from \"./base\";\nimport {\n\tHomepageStructureInputSchema,\n\tHomepageStructureOutputSchema,\n\ttype HomepageStructureInput,\n\ttype HomepageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Homepage structure endpoints\n */\nexport class HomepageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<HomepageStructureOutput> {\n\t\treturn this.get(`/v1/homepage/${pageId}/structure`, HomepageStructureOutputSchema);\n\t}\n\n\tasync getStructuresByHomepageListId(homepageListId: string): Promise<HomepageStructureOutput[]> {\n\t\treturn this.get(\n\t\t\t`/v1/homepage/list/${homepageListId}/structures`,\n\t\t\tHomepageStructureOutputSchema.array(),\n\t\t);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<HomepageStructureInput, \"type\">,\n\t): Promise<HomepageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/homepage/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tHomepageStructureInputSchema,\n\t\t\tHomepageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import { z } from \"zod\";\n\n/**\n * -----------------------------------------\n * Legacy API Schemas & Types\n *\n * These schemas map to expected types for Hub Pages rendered by dotcom-pages.\n * -----------------------------------------\n */\n\nconst LegacyFlourishChildSchema = z.object({\n\tsource: z.literal(\"flourish\"),\n\tproperties: z.object({\n\t\tid: z.string().min(1), // e.g. \"visualisation/21901162\"\n\t}),\n});\n\nconst LegacyListChildSchema = z.object({\n\tsource: z.literal(\"list\"),\n\tproperties: z.object({\n\t\tid: z.string().uuid(),\n\t\tmaxItems: z.number().optional(),\n\t}),\n});\n\nconst LegacyContainerChildSchema = z.discriminatedUnion(\"source\", [\n\tLegacyFlourishChildSchema,\n\tLegacyListChildSchema,\n]);\n\nconst LegacyTopperSchema = z.object({\n\ttype: z.literal(\"topper-basic\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\ttitle: z.string(),\n\t\tsponsorText: z.string().default(\"\"),\n\t}),\n});\n\nconst LegacyInfoBoxSchema = z.object({\n\ttype: z.literal(\"info-box\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\tbodyHTML: z.string(),\n\t}),\n});\n\nconst LegacyContainerSchema = z.object({\n\ttype: z.literal(\"container\"),\n\tchildren: z.array(LegacyContainerChildSchema).min(1),\n\tproperties: z.object({\n\t\ttitle: z.string().optional(),\n\t\tdesign: z.enum([\"chart\", \"four-story\", \"freeform\", \"hero-lead\"]).default(\"freeform\"),\n\t\tbackgroundColor: z.string().optional(),\n\t}),\n});\n\nconst LegacyExperimentSchema = z.object({\n\ttype: z.literal(\"experiment\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\texperimentName: z.string(),\n\t\tid: z.string(),\n\t\ttitle: z.string().optional(),\n\t\tconfig: z\n\t\t\t.object({\n\t\t\t\tvalue: z.unknown().optional(),\n\t\t\t\t// Hub pages support experiments with HTML and Text.\n\t\t\t\t// For now we just support JSON. As we migrate pages, this may change.\n\t\t\t\tformat: z.enum([\"json\"]).default(\"json\"),\n\t\t\t})\n\t\t\t.partial()\n\t\t\t.optional(),\n\t}),\n});\n\nconst LegacyBlockSchema = z.discriminatedUnion(\"type\", [\n\tLegacyTopperSchema,\n\tLegacyInfoBoxSchema,\n\tLegacyContainerSchema,\n\tLegacyExperimentSchema,\n]);\n\nexport const LegacyPageStructureOutputSchema = z.object({\n\tblocks: z.array(LegacyBlockSchema),\n\tconceptId: z.string().uuid().optional(),\n\tthemeName: z.string().optional(),\n\tuuid: z.string().uuid(),\n});\n\nexport type LegacyPageStructureOutput = z.infer<typeof LegacyPageStructureOutputSchema>;\nexport type LegacyBlock = z.infer<typeof LegacyBlockSchema>;\n","import { BaseApiClient } from \"./base\";\nimport type { LegacyPageStructureOutput } from \"./schemas/ftpink/legacyHubPage\";\nimport { LegacyPageStructureOutputSchema } from \"./schemas/ftpink/legacyHubPage\";\nimport {\n\tPageStructureInputSchema,\n\tPageStructureOutputSchema,\n\ttype PageStructureInput,\n\ttype PageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Page structure endpoints\n */\nexport class PageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<PageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/structure`, PageStructureOutputSchema);\n\t}\n\n\tasync getLegacyHubPageStructure(pageId: string): Promise<LegacyPageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/legacyHubPageStructure`, LegacyPageStructureOutputSchema);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<PageStructureInput, \"type\">,\n\t): Promise<PageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/page/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tPageStructureInputSchema,\n\t\t\tPageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import type { ApiClientConfig } from \"./base\";\nimport { BaseApiClient } from \"./base\";\nimport { HomepageClient } from \"./homepage\";\nimport { PageClient } from \"./page\";\n\n/**\n * Main API client that provides access to all API endpoints\n */\nexport class ApiClient extends BaseApiClient {\n\t/**\n\t * Homepage API endpoints\n\t */\n\thomepage: HomepageClient;\n\tpage: PageClient;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tsuper(config);\n\n\t\t// Initialize sub-clients\n\t\tthis.homepage = new HomepageClient(config);\n\t\tthis.page = new PageClient(config);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["/home/circleci/repo/packages/content-curation-client/dist/index.cjs","../src/schemas/response.ts","../src/base.ts","../src/schemas/ftpink/page/index.ts","../src/schemas/prosemirror.ts","../src/homepage.ts","../src/schemas/ftpink/legacyHubPage/index.ts","../src/page.ts","../src/client.ts"],"names":[],"mappings":"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","file":"/home/circleci/repo/packages/content-curation-client/dist/index.cjs","sourcesContent":[null,"import { z, type ZodTypeAny } from \"zod\";\n\n/**\n * Strongly‐typed enum for all possible API error codes.\n */\nexport const ApiErrorCode = z.enum([\n\t\"UNAUTHORIZED\",\n\t\"NOT_FOUND\",\n\t\"INTERNAL_SERVER_ERROR\",\n\t\"INVALID_INPUT_DATA\",\n]);\n\n/**\n * Fields shared by both success and error envelopes (but not the discriminant).\n */\nconst BaseEnvelopeFields = z.object({\n\tstatusCode: z.number(),\n\trequestId: z.string(),\n});\n\n/**\n * Specific details carried in an error payload.\n */\nexport const ApiErrorPayloadSchema = z\n\t.object({\n\t\tcode: ApiErrorCode,\n\t\tmessage: z.string(),\n\t\tdetails: z.string().optional(),\n\t\tpath: z.string().optional(),\n\t\ttimestamp: z.string().optional(),\n\t})\n\t.strict();\n\nexport type ApiErrorPayload = z.infer<typeof ApiErrorPayloadSchema>;\n\n/**\n * Full “envelope” when the API has failed.\n */\nexport const ApiErrorResponseSchema = BaseEnvelopeFields.extend({\n\tstatus: z.literal(\"error\"),\n\terror: ApiErrorPayloadSchema,\n}).strict();\n\nexport type ApiErrorResponse = z.infer<typeof ApiErrorResponseSchema>;\n\n/**\n * Schema for a successful API response, given some data schema T.\n */\nexport function ApiSuccessResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\treturn BaseEnvelopeFields.extend({\n\t\tstatus: z.literal(\"success\"),\n\t\tdata: dataSchema,\n\t}).strict();\n}\n\n/**\n * Union of success or error envelopes, discriminated on `status`.\n */\nexport function ApiResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\tconst successSchema = ApiSuccessResponseSchema(dataSchema);\n\tconst errorSchema = ApiErrorResponseSchema;\n\treturn z.discriminatedUnion(\"status\", [successSchema, errorSchema]);\n}\n","import type { z, ZodTypeAny } from \"zod\";\nimport type { ApiErrorPayloadSchema } from \"./schemas/response\";\nimport { ApiResponseSchema } from \"./schemas/response\";\n\n/**\n * API-level error thrown when { status: 'error' } is returned\n */\nexport class ApiClientError extends Error {\n\tpublic code: string;\n\tpublic details?: string;\n\tpublic path?: string;\n\tpublic timestamp?: string;\n\n\tconstructor(\n\t\tpublic payload: z.infer<typeof ApiErrorPayloadSchema>,\n\t\tpublic statusCode: number,\n\t\tpublic requestId?: string,\n\t) {\n\t\tsuper(payload.message);\n\t\tthis.name = \"ApiError\";\n\t\tthis.code = payload.code;\n\t\tthis.details = payload.details;\n\t\tthis.path = payload.path;\n\t\tthis.timestamp = payload.timestamp;\n\t}\n}\n\n/**\n * Configuration options for the API client\n */\nexport type ApiClientConfig =\n\t| {\n\t\t\t// Standard configuration.\n\t\t\t// Intended for external clients using an API key issued via API Gateway.\n\t\t\tbaseUrl: string;\n\t\t\tapiKey: string;\n\t\t\tapiToken?: never;\n\t\t\tfetch?: typeof fetch;\n\t }\n\t| {\n\t\t\t// Alternative configuration.\n\t\t\t// Reserved for client with access to a bearer token (e.g. The e2e tests).\n\t\t\tbaseUrl: string;\n\t\t\tapiKey?: never;\n\t\t\tapiToken: string;\n\t\t\tfetch?: typeof fetch;\n\t };\n\nexport class BaseApiClient {\n\tprotected config: ApiClientConfig;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tthis.config = {\n\t\t\t...config,\n\t\t\tfetch: config.fetch || fetch,\n\t\t};\n\t\tthis.config.baseUrl = this.config.baseUrl.replace(/\\/+$/, \"\"); // strip trailing slashes\n\t}\n\n\t/**\n\t * Generic HTTP request to a JSON API\n\t */\n\tprotected async request<\n\t\tReqSchema extends ZodTypeAny | undefined,\n\t\tResponseDataSchema extends ZodTypeAny,\n\t>(\n\t\tmethod: \"GET\" | \"PUT\" | \"POST\" | \"DELETE\",\n\t\tpath: string,\n\t\topts: {\n\t\t\trequestSchema?: ReqSchema;\n\t\t\tbody?: ReqSchema extends ZodTypeAny ? z.infer<ReqSchema> : unknown;\n\t\t\tresponseDataSchema: ResponseDataSchema;\n\t\t},\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\t// Validate request body if provided\n\t\tlet bodyPayload = opts.body;\n\t\tif (opts.requestSchema && opts.body !== undefined) {\n\t\t\tbodyPayload = opts.requestSchema.parse(opts.body);\n\t\t}\n\n\t\t// Build URL + query string\n\t\tconst url = new URL(this.config.baseUrl + path);\n\n\t\t// Perform fetch\n\t\tconst response = await this.config.fetch!(url.toString(), {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...(this.config.apiKey\n\t\t\t\t\t? { \"x-api-key\": this.config.apiKey }\n\t\t\t\t\t: { Authorization: `Bearer ${this.config.apiToken}` }),\n\t\t\t},\n\t\t\tbody: bodyPayload ? JSON.stringify(bodyPayload) : undefined,\n\t\t});\n\n\t\tconst json = await response.json();\n\t\tconst parsedJson = ApiResponseSchema(opts.responseDataSchema).parse(json);\n\n\t\tif (\"error\" in parsedJson) {\n\t\t\tthrow new ApiClientError(parsedJson.error, parsedJson.statusCode, parsedJson.requestId);\n\t\t} else if (!(\"data\" in parsedJson)) {\n\t\t\tthrow new ApiClientError(\n\t\t\t\t{\n\t\t\t\t\tcode: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t\tmessage: \"Unexpected API response format\",\n\t\t\t\t\tdetails: 'Response did not contain expected \"data\" field',\n\t\t\t\t},\n\t\t\t\t500,\n\t\t\t\tparsedJson.requestId,\n\t\t\t);\n\t\t}\n\n\t\treturn parsedJson.data;\n\t}\n\n\t/**\n\t * GET convenience method inferring response type from schema\n\t */\n\tprotected get<ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"GET\", path, { responseDataSchema });\n\t}\n\n\t/**\n\t * PUT convenience method inferring both request and response types\n\t */\n\tprotected put<ReqSchema extends ZodTypeAny, ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tbody: z.infer<ReqSchema>,\n\t\trequestSchema: ReqSchema,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"PUT\", path, { body, requestSchema, responseDataSchema });\n\t}\n}\n","import { z } from \"zod\";\nimport { ProseMirrorDocSchema } from \"../../prosemirror\";\n\n//\n// 1) REUSABLE SCHEMAS FOR COMMON STRUCTURES\n//\n\n/**\n * A generic schema representing a heading used across various slices.\n * - `text`: The display text of the heading.\n * - `href`: An optional URL that the heading links to.\n */\nconst HeadingSchema = z.object({\n\ttext: z.string(),\n\thref: z.string().url().optional(),\n});\n\n/**\n * Base “properties” common to most page slices.\n * - `heading`: An optional heading object for slices that can display a title.\n */\nconst BasePageItemProps = z.object({\n\theading: HeadingSchema.optional(),\n});\n\n/**\n * Extended properties for any “graphics”-type slice.\n * In addition to base properties, these slices must specify how the graphic is displayed.\n * - `displayBehaviour`: Determines if the graphic stands alone or is associated with other content.\n */\nconst BaseGraphicsItemProps = BasePageItemProps.extend({\n\tdisplayBehaviour: z.enum([\"standalone\", \"associated\"]),\n});\n\n/**\n * A schema to validate that a string is valid JSON.\n */\nconst ValidJSONStringSchema = z.string().refine(\n\t(val) => {\n\t\ttry {\n\t\t\tJSON.parse(val);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\t{ message: \"Invalid JSON string\" },\n);\n\n//\n// 2) GENERIC HELPER TO DEFINE “SLICE” INPUT/OUTPUT SCHEMAS\n//\n\n/**\n * A union type to represent either a Zod object schema or an optional Zod object schema.\n */\ntype OptionalOrRequiredZodObject = z.AnyZodObject | z.ZodOptional<z.AnyZodObject>;\n\n/**\n * Helper function that, given:\n * - `typeName`: A string literal identifying the slice type.\n * - `propsShape`: A Zod schema describing the slice’s `properties`.\n *\n * Returns an object containing two schemas:\n * - `InputSchema`: For client-side input; `sliceId` is optional.\n * - `OutputSchema`: For server-side/output; `sliceId` is required.\n *\n * This is useful because when defining slices we often want to allow -\n * clients to submit slices without an ID (e.g., when creating new slices),\n */\nfunction defineSliceSchema<T extends string, P extends OptionalOrRequiredZodObject>(options: {\n\ttypeName: T;\n\tpropsShape: P;\n}) {\n\tconst { typeName, propsShape } = options;\n\n\t// Base schema shared by both input and output:\n\t// - `type`: Literal string identifying which slice this is.\n\t// - `hidden`: Optional flag to mark the slice as hidden.\n\t// - `properties`: The detailed properties shape for the slice.\n\tconst BaseSchema = z.object({\n\t\ttype: z.literal(typeName),\n\t\thidden: z.boolean().optional(),\n\t\tproperties: propsShape,\n\t});\n\n\t/**\n\t * Input schema: For client submissions.\n\t * - `sliceId` is optional because the client might not specify it yet.\n\t */\n\tconst InputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid().optional(),\n\t});\n\n\t/**\n\t * Output schema: For persisted or server-returned data.\n\t * - `sliceId` is required (each saved slice must have an ID).\n\t */\n\tconst OutputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid(),\n\t});\n\n\treturn { InputSchema, OutputSchema };\n}\n\n//\n// 3) DEFINE INDIVIDUAL SLICE TYPES (INPUT & OUTPUT) USING THE HELPER\n//\n\n// 3.A “HomepageSlice”\n// - A generic homepage slice that may include an optional heading.\n// - Input: Clients can pass `properties` or omit entirely.\n// - Output: Always includes a `properties` object (may be empty) and a required `sliceId`.\nconst HomepageSlice = defineSliceSchema({\n\ttypeName: \"HomepageSlice\",\n\tpropsShape: BasePageItemProps.optional(),\n});\n\n// 3.B “FlourishGraphicSlice”\n// - A slice to embed or reference a Flourish graphic by its ID.\n// - Extends graphic base properties with `flourishId`.\nconst FlourishGraphicSlice = defineSliceSchema({\n\ttypeName: \"FlourishGraphic\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tflourishDescription: z.string().optional(), // Optional description for the Flourish graphic\n\t\tflourishId: z.string().nonempty(),\n\t}),\n});\n\n// 3.C “CustomIframeSlice”\n// - A slice that renders a custom iframe.\n// - Extends graphic base properties with `iframeSrc`.\nconst CustomIframeSlice = defineSliceSchema({\n\ttypeName: \"CustomIframe\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tiframeSrc: z.string().url().nonempty(),\n\t}),\n});\n\n// 3.D “ExperimentSlice”\n// - A slice for embedding experimental content.\n// - Requires an `experimentId`, `experimentName`, and a JSON string (`contentJson`).\nconst ExperimentSlice = defineSliceSchema({\n\ttypeName: \"Experiment\",\n\tpropsShape: BasePageItemProps.extend({\n\t\texperimentId: z.string().nonempty(), // Unique ID for the experiment\n\t\texperimentName: z.string().nonempty(), // Human-readable name of the experiment\n\t\tcontentJson: ValidJSONStringSchema, // The experiment’s JSON payload as a valid JSON string\n\t}),\n});\n\n// 3.E \"Strip\"\n// - A slice that displays a strip of content.\nconst StripSlice = defineSliceSchema({\n\ttypeName: \"Strip\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the strip to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n// 3.F \"TopperSlice\"\n// - A slice that displays a topper section with description and optional strapline.\nconst TopperSlice = defineSliceSchema({\n\ttypeName: \"Topper\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tdescription: ProseMirrorDocSchema,\n\t\tstrapline: z.string().optional(),\n\t}),\n});\n\n// 3.F \"Hero\"\n// - A slice that represents a Hero on the page. It references a Spark List.\nconst HeroSlice = defineSliceSchema({\n\ttypeName: \"Hero\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the spark list to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n//\n// 4) COMPOSE DISCRIMINATED UNIONS FOR “SLICE API” INPUT & OUTPUT\n//\n\n/**\n * All possible slice inputs for the Page API.\n * This discriminated union allows Zod to pick the correct schema based on the `type` field.\n */\nexport const SliceApiInputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.InputSchema,\n\tFlourishGraphicSlice.InputSchema,\n\tCustomIframeSlice.InputSchema,\n\tExperimentSlice.InputSchema,\n\tStripSlice.InputSchema,\n\tTopperSlice.InputSchema,\n\tHeroSlice.InputSchema,\n] as const);\n\n/**\n * All possible slice outputs for the Page API.\n * The same discriminated union but with each slice requiring `sliceId`.\n */\nexport const SliceApiOutputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.OutputSchema,\n\tFlourishGraphicSlice.OutputSchema,\n\tCustomIframeSlice.OutputSchema,\n\tExperimentSlice.OutputSchema,\n\tStripSlice.OutputSchema,\n\tTopperSlice.OutputSchema,\n\tHeroSlice.OutputSchema,\n] as const);\n\n//\n// 5) WRAPPER SCHEMAS FOR THE ENTIRE PAGE STRUCTURE\n//\n\nconst BasePagePropertiesSchema = z.object({\n\ttitle: z.string(),\n\tpageId: z.string().uuid(),\n\tconceptId: z.string().optional(),\n\tmetaDescription: z.string().optional(),\n\tpageTheme: z.string().optional(),\n\tsponsorText: z.string().optional(),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const PageStructureInputSchema = z.object({\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiInputSchema),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page (title, list ID, page ID).\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const HomepageStructureInputSchema = PageStructureInputSchema.extend({\n\tproperties: BasePagePropertiesSchema.extend({\n\t\t// This is optional for the input. If clients don't send it, we generate a uuid.\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n/**\n * Page structure as stored or returned by the server.\n */\nexport const PageStructureOutputSchema = z.object({\n\ttype: z.literal(\"Page\"),\n\tschemaVersion: z.number(),\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiOutputSchema),\n});\n\nexport const HomepageStructureOutputSchema = PageStructureOutputSchema.extend({\n\ttype: z.literal(\"Homepage\"),\n\tproperties: BasePagePropertiesSchema.extend({\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n//\n// 6) EXPORT TYPES FOR CONSUMPTION IN CODE\n//\n\n/** Client-side type for page structure input */\nexport type PageStructureInput = z.infer<typeof PageStructureInputSchema>;\n\n/** Server-side type for page structure output */\nexport type PageStructureOutput = z.infer<typeof PageStructureOutputSchema>;\n\n/** Client-side type for homepage structure input */\nexport type HomepageStructureInput = z.infer<typeof HomepageStructureInputSchema>;\n\n/** Server-side type for homepage structure output */\nexport type HomepageStructureOutput = z.infer<typeof HomepageStructureOutputSchema>;\n\n/** Union of all possible slice outputs for type-checking convenience */\nexport type Slice = z.infer<typeof SliceApiOutputSchema>;\n\n/** Individual slice output types */\nexport type HomepageSliceType = z.infer<typeof HomepageSlice.OutputSchema>;\nexport type FlourishGraphicSliceType = z.infer<typeof FlourishGraphicSlice.OutputSchema>;\nexport type CustomIframeSliceType = z.infer<typeof CustomIframeSlice.OutputSchema>;\nexport type ExperimentSliceType = z.infer<typeof ExperimentSlice.OutputSchema>;\nexport type StripSliceType = z.infer<typeof StripSlice.OutputSchema>;\nexport type TopperSliceType = z.infer<typeof TopperSlice.OutputSchema>;\nexport type HeroSliceType = z.infer<typeof HeroSlice.OutputSchema>;\n\n/**\n * Union type for interactive slices (i.e., the ones rendering visual components).\n * Useful for code that cares specifically about slices with visual/interactive content.\n */\nexport type InteractiveSlice = FlourishGraphicSliceType | CustomIframeSliceType;\n","import { z } from \"zod\";\n\n/** Accept http(s) and mailto: (matches your editor config) */\nconst HrefSchema = z.string().refine((v) => /^(https?:\\/\\/|mailto:).+/.test(v), {\n\tmessage: \"Expected http(s):// or mailto: URL\",\n});\n\n/** Link mark. */\nconst ProseMirrorLinkMark = z.object({\n\ttype: z.literal(\"link\"),\n\tattrs: z.object({\n\t\thref: HrefSchema,\n\t}),\n});\n\n/** Supported text marks */\nconst ProseMirrorMark = z.discriminatedUnion(\"type\", [\n\tProseMirrorLinkMark,\n\tz.object({ type: z.literal(\"bold\") }),\n\tz.object({ type: z.literal(\"italic\") }),\n\tz.object({ type: z.literal(\"underline\") }),\n\tz.object({ type: z.literal(\"strike\") }),\n]);\n\n/** Text node */\nconst ProseMirrorTextNode = z.object({\n\ttype: z.literal(\"text\"),\n\ttext: z.string(),\n\tmarks: z.array(ProseMirrorMark).optional(),\n});\n\n/** Paragraph node — content can be empty/omitted */\nconst ProseMirrorParagraphNode = z.object({\n\ttype: z.literal(\"paragraph\"),\n\tcontent: z.array(ProseMirrorTextNode),\n});\n\n/** ProseMirror Node Union. */\nconst ProseMirrorNode = z.union([ProseMirrorParagraphNode, ProseMirrorTextNode]);\n\n/** Root node of a ProseMirror document - enforcing at least 1 paragraph */\nexport const ProseMirrorDocSchema = z.object({\n\ttype: z.literal(\"doc\"),\n\tcontent: z\n\t\t.array(ProseMirrorNode)\n\t\t.min(1, { message: \"Document must contain at least one paragraph\" }),\n});\n\n/** Rich text editor TS type. */\nexport type RichTextEditorType = z.infer<typeof ProseMirrorDocSchema>;\n\nexport {};\n","import { BaseApiClient } from \"./base\";\nimport {\n\tHomepageStructureInputSchema,\n\tHomepageStructureOutputSchema,\n\ttype HomepageStructureInput,\n\ttype HomepageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Homepage structure endpoints\n */\nexport class HomepageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<HomepageStructureOutput> {\n\t\treturn this.get(`/v1/homepage/${pageId}/structure`, HomepageStructureOutputSchema);\n\t}\n\n\tasync getStructuresByHomepageListId(homepageListId: string): Promise<HomepageStructureOutput[]> {\n\t\treturn this.get(\n\t\t\t`/v1/homepage/list/${homepageListId}/structures`,\n\t\t\tHomepageStructureOutputSchema.array(),\n\t\t);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<HomepageStructureInput, \"type\">,\n\t): Promise<HomepageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/homepage/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tHomepageStructureInputSchema,\n\t\t\tHomepageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import { z } from \"zod\";\n\n/**\n * -----------------------------------------\n * Legacy API Schemas & Types\n *\n * These schemas map to expected types for Hub Pages rendered by dotcom-pages.\n * -----------------------------------------\n */\n\nconst LegacyFlourishChildSchema = z.object({\n\tsource: z.literal(\"flourish\"),\n\tproperties: z.object({\n\t\tid: z.string().min(1), // e.g. \"visualisation/21901162\"\n\t}),\n});\n\nconst LegacyListChildSchema = z.object({\n\tsource: z.literal(\"list\"),\n\tproperties: z.object({\n\t\tid: z.string().uuid(),\n\t\tmaxItems: z.number().optional(),\n\t}),\n});\n\nconst LegacyContainerChildSchema = z.discriminatedUnion(\"source\", [\n\tLegacyFlourishChildSchema,\n\tLegacyListChildSchema,\n]);\n\nconst LegacyTopperSchema = z.object({\n\ttype: z.literal(\"topper-basic\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\ttitle: z.string(),\n\t\tsponsorText: z.string().default(\"\"),\n\t}),\n});\n\nconst LegacyInfoBoxSchema = z.object({\n\ttype: z.literal(\"info-box\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\tbodyHTML: z.string(),\n\t}),\n});\n\nconst LegacyContainerSchema = z.object({\n\ttype: z.literal(\"container\"),\n\tchildren: z.array(LegacyContainerChildSchema).min(1),\n\tproperties: z.object({\n\t\ttitle: z.string().optional(),\n\t\tdesign: z.enum([\"chart\", \"four-story\", \"freeform\", \"hero-lead\"]).default(\"freeform\"),\n\t\tbackgroundColor: z.string().optional(),\n\t}),\n});\n\nconst LegacyExperimentSchema = z.object({\n\ttype: z.literal(\"experiment\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\texperimentName: z.string(),\n\t\tid: z.string(),\n\t\ttitle: z.string().optional(),\n\t\tconfig: z\n\t\t\t.object({\n\t\t\t\tvalue: z.unknown().optional(),\n\t\t\t\t// Hub pages support experiments with HTML and Text.\n\t\t\t\t// For now we just support JSON. As we migrate pages, this may change.\n\t\t\t\tformat: z.enum([\"json\"]).default(\"json\"),\n\t\t\t})\n\t\t\t.partial()\n\t\t\t.optional(),\n\t}),\n});\n\nconst LegacyBlockSchema = z.discriminatedUnion(\"type\", [\n\tLegacyTopperSchema,\n\tLegacyInfoBoxSchema,\n\tLegacyContainerSchema,\n\tLegacyExperimentSchema,\n]);\n\nexport const LegacyPageStructureOutputSchema = z.object({\n\tblocks: z.array(LegacyBlockSchema),\n\tconceptId: z.string().uuid().optional(),\n\tthemeName: z.string().optional(),\n\tuuid: z.string().uuid(),\n});\n\nexport type LegacyPageStructureOutput = z.infer<typeof LegacyPageStructureOutputSchema>;\nexport type LegacyBlock = z.infer<typeof LegacyBlockSchema>;\n","import { BaseApiClient } from \"./base\";\nimport type { LegacyPageStructureOutput } from \"./schemas/ftpink/legacyHubPage\";\nimport { LegacyPageStructureOutputSchema } from \"./schemas/ftpink/legacyHubPage\";\nimport {\n\tPageStructureInputSchema,\n\tPageStructureOutputSchema,\n\ttype PageStructureInput,\n\ttype PageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Page structure endpoints\n */\nexport class PageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<PageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/structure`, PageStructureOutputSchema);\n\t}\n\n\tasync getLegacyHubPageStructure(pageId: string): Promise<LegacyPageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/legacyHubPageStructure`, LegacyPageStructureOutputSchema);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<PageStructureInput, \"type\">,\n\t): Promise<PageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/page/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tPageStructureInputSchema,\n\t\t\tPageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import type { ApiClientConfig } from \"./base\";\nimport { BaseApiClient } from \"./base\";\nimport { HomepageClient } from \"./homepage\";\nimport { PageClient } from \"./page\";\n\n/**\n * Main API client that provides access to all API endpoints\n */\nexport class ApiClient extends BaseApiClient {\n\t/**\n\t * Homepage API endpoints\n\t */\n\thomepage: HomepageClient;\n\tpage: PageClient;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tsuper(config);\n\n\t\t// Initialize sub-clients\n\t\tthis.homepage = new HomepageClient(config);\n\t\tthis.page = new PageClient(config);\n\t}\n}\n"]}
package/dist/index.js CHANGED
@@ -255,7 +255,11 @@ var SliceApiOutputSchema = z3.discriminatedUnion("type", [
255
255
  ]);
256
256
  var BasePagePropertiesSchema = z3.object({
257
257
  title: z3.string(),
258
- pageId: z3.string().uuid()
258
+ pageId: z3.string().uuid(),
259
+ conceptId: z3.string().optional(),
260
+ metaDescription: z3.string().optional(),
261
+ pageTheme: z3.string().optional(),
262
+ sponsorText: z3.string().optional()
259
263
  });
260
264
  var PageStructureInputSchema = z3.object({
261
265
  properties: BasePagePropertiesSchema,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/response.ts","../src/base.ts","../src/schemas/ftpink/page/index.ts","../src/schemas/prosemirror.ts","../src/homepage.ts","../src/schemas/ftpink/legacyHubPage/index.ts","../src/page.ts","../src/client.ts"],"sourcesContent":["import { z, type ZodTypeAny } from \"zod\";\n\n/**\n * Strongly‐typed enum for all possible API error codes.\n */\nexport const ApiErrorCode = z.enum([\n\t\"UNAUTHORIZED\",\n\t\"NOT_FOUND\",\n\t\"INTERNAL_SERVER_ERROR\",\n\t\"INVALID_INPUT_DATA\",\n]);\n\n/**\n * Fields shared by both success and error envelopes (but not the discriminant).\n */\nconst BaseEnvelopeFields = z.object({\n\tstatusCode: z.number(),\n\trequestId: z.string(),\n});\n\n/**\n * Specific details carried in an error payload.\n */\nexport const ApiErrorPayloadSchema = z\n\t.object({\n\t\tcode: ApiErrorCode,\n\t\tmessage: z.string(),\n\t\tdetails: z.string().optional(),\n\t\tpath: z.string().optional(),\n\t\ttimestamp: z.string().optional(),\n\t})\n\t.strict();\n\nexport type ApiErrorPayload = z.infer<typeof ApiErrorPayloadSchema>;\n\n/**\n * Full “envelope” when the API has failed.\n */\nexport const ApiErrorResponseSchema = BaseEnvelopeFields.extend({\n\tstatus: z.literal(\"error\"),\n\terror: ApiErrorPayloadSchema,\n}).strict();\n\nexport type ApiErrorResponse = z.infer<typeof ApiErrorResponseSchema>;\n\n/**\n * Schema for a successful API response, given some data schema T.\n */\nexport function ApiSuccessResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\treturn BaseEnvelopeFields.extend({\n\t\tstatus: z.literal(\"success\"),\n\t\tdata: dataSchema,\n\t}).strict();\n}\n\n/**\n * Union of success or error envelopes, discriminated on `status`.\n */\nexport function ApiResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\tconst successSchema = ApiSuccessResponseSchema(dataSchema);\n\tconst errorSchema = ApiErrorResponseSchema;\n\treturn z.discriminatedUnion(\"status\", [successSchema, errorSchema]);\n}\n","import type { z, ZodTypeAny } from \"zod\";\nimport type { ApiErrorPayloadSchema } from \"./schemas/response\";\nimport { ApiResponseSchema } from \"./schemas/response\";\n\n/**\n * API-level error thrown when { status: 'error' } is returned\n */\nexport class ApiClientError extends Error {\n\tpublic code: string;\n\tpublic details?: string;\n\tpublic path?: string;\n\tpublic timestamp?: string;\n\n\tconstructor(\n\t\tpublic payload: z.infer<typeof ApiErrorPayloadSchema>,\n\t\tpublic statusCode: number,\n\t\tpublic requestId?: string,\n\t) {\n\t\tsuper(payload.message);\n\t\tthis.name = \"ApiError\";\n\t\tthis.code = payload.code;\n\t\tthis.details = payload.details;\n\t\tthis.path = payload.path;\n\t\tthis.timestamp = payload.timestamp;\n\t}\n}\n\n/**\n * Configuration options for the API client\n */\nexport type ApiClientConfig =\n\t| {\n\t\t\t// Standard configuration.\n\t\t\t// Intended for external clients using an API key issued via API Gateway.\n\t\t\tbaseUrl: string;\n\t\t\tapiKey: string;\n\t\t\tapiToken?: never;\n\t\t\tfetch?: typeof fetch;\n\t }\n\t| {\n\t\t\t// Alternative configuration.\n\t\t\t// Reserved for client with access to a bearer token (e.g. The e2e tests).\n\t\t\tbaseUrl: string;\n\t\t\tapiKey?: never;\n\t\t\tapiToken: string;\n\t\t\tfetch?: typeof fetch;\n\t };\n\nexport class BaseApiClient {\n\tprotected config: ApiClientConfig;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tthis.config = {\n\t\t\t...config,\n\t\t\tfetch: config.fetch || fetch,\n\t\t};\n\t\tthis.config.baseUrl = this.config.baseUrl.replace(/\\/+$/, \"\"); // strip trailing slashes\n\t}\n\n\t/**\n\t * Generic HTTP request to a JSON API\n\t */\n\tprotected async request<\n\t\tReqSchema extends ZodTypeAny | undefined,\n\t\tResponseDataSchema extends ZodTypeAny,\n\t>(\n\t\tmethod: \"GET\" | \"PUT\" | \"POST\" | \"DELETE\",\n\t\tpath: string,\n\t\topts: {\n\t\t\trequestSchema?: ReqSchema;\n\t\t\tbody?: ReqSchema extends ZodTypeAny ? z.infer<ReqSchema> : unknown;\n\t\t\tresponseDataSchema: ResponseDataSchema;\n\t\t},\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\t// Validate request body if provided\n\t\tlet bodyPayload = opts.body;\n\t\tif (opts.requestSchema && opts.body !== undefined) {\n\t\t\tbodyPayload = opts.requestSchema.parse(opts.body);\n\t\t}\n\n\t\t// Build URL + query string\n\t\tconst url = new URL(this.config.baseUrl + path);\n\n\t\t// Perform fetch\n\t\tconst response = await this.config.fetch!(url.toString(), {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...(this.config.apiKey\n\t\t\t\t\t? { \"x-api-key\": this.config.apiKey }\n\t\t\t\t\t: { Authorization: `Bearer ${this.config.apiToken}` }),\n\t\t\t},\n\t\t\tbody: bodyPayload ? JSON.stringify(bodyPayload) : undefined,\n\t\t});\n\n\t\tconst json = await response.json();\n\t\tconst parsedJson = ApiResponseSchema(opts.responseDataSchema).parse(json);\n\n\t\tif (\"error\" in parsedJson) {\n\t\t\tthrow new ApiClientError(parsedJson.error, parsedJson.statusCode, parsedJson.requestId);\n\t\t} else if (!(\"data\" in parsedJson)) {\n\t\t\tthrow new ApiClientError(\n\t\t\t\t{\n\t\t\t\t\tcode: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t\tmessage: \"Unexpected API response format\",\n\t\t\t\t\tdetails: 'Response did not contain expected \"data\" field',\n\t\t\t\t},\n\t\t\t\t500,\n\t\t\t\tparsedJson.requestId,\n\t\t\t);\n\t\t}\n\n\t\treturn parsedJson.data;\n\t}\n\n\t/**\n\t * GET convenience method inferring response type from schema\n\t */\n\tprotected get<ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"GET\", path, { responseDataSchema });\n\t}\n\n\t/**\n\t * PUT convenience method inferring both request and response types\n\t */\n\tprotected put<ReqSchema extends ZodTypeAny, ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tbody: z.infer<ReqSchema>,\n\t\trequestSchema: ReqSchema,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"PUT\", path, { body, requestSchema, responseDataSchema });\n\t}\n}\n","import { z } from \"zod\";\nimport { ProseMirrorDocSchema } from \"../../prosemirror\";\n\n//\n// 1) REUSABLE SCHEMAS FOR COMMON STRUCTURES\n//\n\n/**\n * A generic schema representing a heading used across various slices.\n * - `text`: The display text of the heading.\n * - `href`: An optional URL that the heading links to.\n */\nconst HeadingSchema = z.object({\n\ttext: z.string(),\n\thref: z.string().url().optional(),\n});\n\n/**\n * Base “properties” common to most page slices.\n * - `heading`: An optional heading object for slices that can display a title.\n */\nconst BasePageItemProps = z.object({\n\theading: HeadingSchema.optional(),\n});\n\n/**\n * Extended properties for any “graphics”-type slice.\n * In addition to base properties, these slices must specify how the graphic is displayed.\n * - `displayBehaviour`: Determines if the graphic stands alone or is associated with other content.\n */\nconst BaseGraphicsItemProps = BasePageItemProps.extend({\n\tdisplayBehaviour: z.enum([\"standalone\", \"associated\"]),\n});\n\n/**\n * A schema to validate that a string is valid JSON.\n */\nconst ValidJSONStringSchema = z.string().refine(\n\t(val) => {\n\t\ttry {\n\t\t\tJSON.parse(val);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\t{ message: \"Invalid JSON string\" },\n);\n\n//\n// 2) GENERIC HELPER TO DEFINE “SLICE” INPUT/OUTPUT SCHEMAS\n//\n\n/**\n * A union type to represent either a Zod object schema or an optional Zod object schema.\n */\ntype OptionalOrRequiredZodObject = z.AnyZodObject | z.ZodOptional<z.AnyZodObject>;\n\n/**\n * Helper function that, given:\n * - `typeName`: A string literal identifying the slice type.\n * - `propsShape`: A Zod schema describing the slice’s `properties`.\n *\n * Returns an object containing two schemas:\n * - `InputSchema`: For client-side input; `sliceId` is optional.\n * - `OutputSchema`: For server-side/output; `sliceId` is required.\n *\n * This is useful because when defining slices we often want to allow -\n * clients to submit slices without an ID (e.g., when creating new slices),\n */\nfunction defineSliceSchema<T extends string, P extends OptionalOrRequiredZodObject>(options: {\n\ttypeName: T;\n\tpropsShape: P;\n}) {\n\tconst { typeName, propsShape } = options;\n\n\t// Base schema shared by both input and output:\n\t// - `type`: Literal string identifying which slice this is.\n\t// - `hidden`: Optional flag to mark the slice as hidden.\n\t// - `properties`: The detailed properties shape for the slice.\n\tconst BaseSchema = z.object({\n\t\ttype: z.literal(typeName),\n\t\thidden: z.boolean().optional(),\n\t\tproperties: propsShape,\n\t});\n\n\t/**\n\t * Input schema: For client submissions.\n\t * - `sliceId` is optional because the client might not specify it yet.\n\t */\n\tconst InputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid().optional(),\n\t});\n\n\t/**\n\t * Output schema: For persisted or server-returned data.\n\t * - `sliceId` is required (each saved slice must have an ID).\n\t */\n\tconst OutputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid(),\n\t});\n\n\treturn { InputSchema, OutputSchema };\n}\n\n//\n// 3) DEFINE INDIVIDUAL SLICE TYPES (INPUT & OUTPUT) USING THE HELPER\n//\n\n// 3.A “HomepageSlice”\n// - A generic homepage slice that may include an optional heading.\n// - Input: Clients can pass `properties` or omit entirely.\n// - Output: Always includes a `properties` object (may be empty) and a required `sliceId`.\nconst HomepageSlice = defineSliceSchema({\n\ttypeName: \"HomepageSlice\",\n\tpropsShape: BasePageItemProps.optional(),\n});\n\n// 3.B “FlourishGraphicSlice”\n// - A slice to embed or reference a Flourish graphic by its ID.\n// - Extends graphic base properties with `flourishId`.\nconst FlourishGraphicSlice = defineSliceSchema({\n\ttypeName: \"FlourishGraphic\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tflourishDescription: z.string().optional(), // Optional description for the Flourish graphic\n\t\tflourishId: z.string().nonempty(),\n\t}),\n});\n\n// 3.C “CustomIframeSlice”\n// - A slice that renders a custom iframe.\n// - Extends graphic base properties with `iframeSrc`.\nconst CustomIframeSlice = defineSliceSchema({\n\ttypeName: \"CustomIframe\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tiframeSrc: z.string().url().nonempty(),\n\t}),\n});\n\n// 3.D “ExperimentSlice”\n// - A slice for embedding experimental content.\n// - Requires an `experimentId`, `experimentName`, and a JSON string (`contentJson`).\nconst ExperimentSlice = defineSliceSchema({\n\ttypeName: \"Experiment\",\n\tpropsShape: BasePageItemProps.extend({\n\t\texperimentId: z.string().nonempty(), // Unique ID for the experiment\n\t\texperimentName: z.string().nonempty(), // Human-readable name of the experiment\n\t\tcontentJson: ValidJSONStringSchema, // The experiment’s JSON payload as a valid JSON string\n\t}),\n});\n\n// 3.E \"Strip\"\n// - A slice that displays a strip of content.\nconst StripSlice = defineSliceSchema({\n\ttypeName: \"Strip\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the strip to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n// 3.F \"TopperSlice\"\n// - A slice that displays a topper section with description and optional strapline.\nconst TopperSlice = defineSliceSchema({\n\ttypeName: \"Topper\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tdescription: ProseMirrorDocSchema,\n\t\tstrapline: z.string().optional(),\n\t}),\n});\n\n// 3.F \"Hero\"\n// - A slice that represents a Hero on the page. It references a Spark List.\nconst HeroSlice = defineSliceSchema({\n\ttypeName: \"Hero\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the spark list to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n//\n// 4) COMPOSE DISCRIMINATED UNIONS FOR “SLICE API” INPUT & OUTPUT\n//\n\n/**\n * All possible slice inputs for the Page API.\n * This discriminated union allows Zod to pick the correct schema based on the `type` field.\n */\nexport const SliceApiInputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.InputSchema,\n\tFlourishGraphicSlice.InputSchema,\n\tCustomIframeSlice.InputSchema,\n\tExperimentSlice.InputSchema,\n\tStripSlice.InputSchema,\n\tTopperSlice.InputSchema,\n\tHeroSlice.InputSchema,\n] as const);\n\n/**\n * All possible slice outputs for the Page API.\n * The same discriminated union but with each slice requiring `sliceId`.\n */\nexport const SliceApiOutputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.OutputSchema,\n\tFlourishGraphicSlice.OutputSchema,\n\tCustomIframeSlice.OutputSchema,\n\tExperimentSlice.OutputSchema,\n\tStripSlice.OutputSchema,\n\tTopperSlice.OutputSchema,\n\tHeroSlice.OutputSchema,\n] as const);\n\n//\n// 5) WRAPPER SCHEMAS FOR THE ENTIRE PAGE STRUCTURE\n//\n\nconst BasePagePropertiesSchema = z.object({\n\ttitle: z.string(),\n\tpageId: z.string().uuid(),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const PageStructureInputSchema = z.object({\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiInputSchema),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page (title, list ID, page ID).\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const HomepageStructureInputSchema = PageStructureInputSchema.extend({\n\tproperties: BasePagePropertiesSchema.extend({\n\t\t// This is optional for the input. If clients don't send it, we generate a uuid.\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n/**\n * Page structure as stored or returned by the server.\n */\nexport const PageStructureOutputSchema = z.object({\n\ttype: z.literal(\"Page\"),\n\tschemaVersion: z.number(),\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiOutputSchema),\n});\n\nexport const HomepageStructureOutputSchema = PageStructureOutputSchema.extend({\n\ttype: z.literal(\"Homepage\"),\n\tproperties: BasePagePropertiesSchema.extend({\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n//\n// 6) EXPORT TYPES FOR CONSUMPTION IN CODE\n//\n\n/** Client-side type for page structure input */\nexport type PageStructureInput = z.infer<typeof PageStructureInputSchema>;\n\n/** Server-side type for page structure output */\nexport type PageStructureOutput = z.infer<typeof PageStructureOutputSchema>;\n\n/** Client-side type for homepage structure input */\nexport type HomepageStructureInput = z.infer<typeof HomepageStructureInputSchema>;\n\n/** Server-side type for homepage structure output */\nexport type HomepageStructureOutput = z.infer<typeof HomepageStructureOutputSchema>;\n\n/** Union of all possible slice outputs for type-checking convenience */\nexport type Slice = z.infer<typeof SliceApiOutputSchema>;\n\n/** Individual slice output types */\nexport type HomepageSliceType = z.infer<typeof HomepageSlice.OutputSchema>;\nexport type FlourishGraphicSliceType = z.infer<typeof FlourishGraphicSlice.OutputSchema>;\nexport type CustomIframeSliceType = z.infer<typeof CustomIframeSlice.OutputSchema>;\nexport type ExperimentSliceType = z.infer<typeof ExperimentSlice.OutputSchema>;\nexport type StripSliceType = z.infer<typeof StripSlice.OutputSchema>;\nexport type TopperSliceType = z.infer<typeof TopperSlice.OutputSchema>;\nexport type HeroSliceType = z.infer<typeof HeroSlice.OutputSchema>;\n\n/**\n * Union type for interactive slices (i.e., the ones rendering visual components).\n * Useful for code that cares specifically about slices with visual/interactive content.\n */\nexport type InteractiveSlice = FlourishGraphicSliceType | CustomIframeSliceType;\n","import { z } from \"zod\";\n\n/** Accept http(s) and mailto: (matches your editor config) */\nconst HrefSchema = z.string().refine((v) => /^(https?:\\/\\/|mailto:).+/.test(v), {\n\tmessage: \"Expected http(s):// or mailto: URL\",\n});\n\n/** Link mark. */\nconst ProseMirrorLinkMark = z.object({\n\ttype: z.literal(\"link\"),\n\tattrs: z.object({\n\t\thref: HrefSchema,\n\t}),\n});\n\n/** Supported text marks */\nconst ProseMirrorMark = z.discriminatedUnion(\"type\", [\n\tProseMirrorLinkMark,\n\tz.object({ type: z.literal(\"bold\") }),\n\tz.object({ type: z.literal(\"italic\") }),\n\tz.object({ type: z.literal(\"underline\") }),\n\tz.object({ type: z.literal(\"strike\") }),\n]);\n\n/** Text node */\nconst ProseMirrorTextNode = z.object({\n\ttype: z.literal(\"text\"),\n\ttext: z.string(),\n\tmarks: z.array(ProseMirrorMark).optional(),\n});\n\n/** Paragraph node — content can be empty/omitted */\nconst ProseMirrorParagraphNode = z.object({\n\ttype: z.literal(\"paragraph\"),\n\tcontent: z.array(ProseMirrorTextNode),\n});\n\n/** ProseMirror Node Union. */\nconst ProseMirrorNode = z.union([ProseMirrorParagraphNode, ProseMirrorTextNode]);\n\n/** Root node of a ProseMirror document - enforcing at least 1 paragraph */\nexport const ProseMirrorDocSchema = z.object({\n\ttype: z.literal(\"doc\"),\n\tcontent: z\n\t\t.array(ProseMirrorNode)\n\t\t.min(1, { message: \"Document must contain at least one paragraph\" }),\n});\n\n/** Rich text editor TS type. */\nexport type RichTextEditorType = z.infer<typeof ProseMirrorDocSchema>;\n\nexport {};\n","import { BaseApiClient } from \"./base\";\nimport {\n\tHomepageStructureInputSchema,\n\tHomepageStructureOutputSchema,\n\ttype HomepageStructureInput,\n\ttype HomepageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Homepage structure endpoints\n */\nexport class HomepageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<HomepageStructureOutput> {\n\t\treturn this.get(`/v1/homepage/${pageId}/structure`, HomepageStructureOutputSchema);\n\t}\n\n\tasync getStructuresByHomepageListId(homepageListId: string): Promise<HomepageStructureOutput[]> {\n\t\treturn this.get(\n\t\t\t`/v1/homepage/list/${homepageListId}/structures`,\n\t\t\tHomepageStructureOutputSchema.array(),\n\t\t);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<HomepageStructureInput, \"type\">,\n\t): Promise<HomepageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/homepage/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tHomepageStructureInputSchema,\n\t\t\tHomepageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import { z } from \"zod\";\n\n/**\n * -----------------------------------------\n * Legacy API Schemas & Types\n *\n * These schemas map to expected types for Hub Pages rendered by dotcom-pages.\n * -----------------------------------------\n */\n\nconst LegacyFlourishChildSchema = z.object({\n\tsource: z.literal(\"flourish\"),\n\tproperties: z.object({\n\t\tid: z.string().min(1), // e.g. \"visualisation/21901162\"\n\t}),\n});\n\nconst LegacyListChildSchema = z.object({\n\tsource: z.literal(\"list\"),\n\tproperties: z.object({\n\t\tid: z.string().uuid(),\n\t\tmaxItems: z.number().optional(),\n\t}),\n});\n\nconst LegacyContainerChildSchema = z.discriminatedUnion(\"source\", [\n\tLegacyFlourishChildSchema,\n\tLegacyListChildSchema,\n]);\n\nconst LegacyTopperSchema = z.object({\n\ttype: z.literal(\"topper-basic\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\ttitle: z.string(),\n\t\tsponsorText: z.string().default(\"\"),\n\t}),\n});\n\nconst LegacyInfoBoxSchema = z.object({\n\ttype: z.literal(\"info-box\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\tbodyHTML: z.string(),\n\t}),\n});\n\nconst LegacyContainerSchema = z.object({\n\ttype: z.literal(\"container\"),\n\tchildren: z.array(LegacyContainerChildSchema).min(1),\n\tproperties: z.object({\n\t\ttitle: z.string().optional(),\n\t\tdesign: z.enum([\"chart\", \"four-story\", \"freeform\", \"hero-lead\"]).default(\"freeform\"),\n\t\tbackgroundColor: z.string().optional(),\n\t}),\n});\n\nconst LegacyExperimentSchema = z.object({\n\ttype: z.literal(\"experiment\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\texperimentName: z.string(),\n\t\tid: z.string(),\n\t\ttitle: z.string().optional(),\n\t\tconfig: z\n\t\t\t.object({\n\t\t\t\tvalue: z.unknown().optional(),\n\t\t\t\t// Hub pages support experiments with HTML and Text.\n\t\t\t\t// For now we just support JSON. As we migrate pages, this may change.\n\t\t\t\tformat: z.enum([\"json\"]).default(\"json\"),\n\t\t\t})\n\t\t\t.partial()\n\t\t\t.optional(),\n\t}),\n});\n\nconst LegacyBlockSchema = z.discriminatedUnion(\"type\", [\n\tLegacyTopperSchema,\n\tLegacyInfoBoxSchema,\n\tLegacyContainerSchema,\n\tLegacyExperimentSchema,\n]);\n\nexport const LegacyPageStructureOutputSchema = z.object({\n\tblocks: z.array(LegacyBlockSchema),\n\tconceptId: z.string().uuid().optional(),\n\tthemeName: z.string().optional(),\n\tuuid: z.string().uuid(),\n});\n\nexport type LegacyPageStructureOutput = z.infer<typeof LegacyPageStructureOutputSchema>;\nexport type LegacyBlock = z.infer<typeof LegacyBlockSchema>;\n","import { BaseApiClient } from \"./base\";\nimport type { LegacyPageStructureOutput } from \"./schemas/ftpink/legacyHubPage\";\nimport { LegacyPageStructureOutputSchema } from \"./schemas/ftpink/legacyHubPage\";\nimport {\n\tPageStructureInputSchema,\n\tPageStructureOutputSchema,\n\ttype PageStructureInput,\n\ttype PageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Page structure endpoints\n */\nexport class PageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<PageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/structure`, PageStructureOutputSchema);\n\t}\n\n\tasync getLegacyHubPageStructure(pageId: string): Promise<LegacyPageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/legacyHubPageStructure`, LegacyPageStructureOutputSchema);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<PageStructureInput, \"type\">,\n\t): Promise<PageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/page/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tPageStructureInputSchema,\n\t\t\tPageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import type { ApiClientConfig } from \"./base\";\nimport { BaseApiClient } from \"./base\";\nimport { HomepageClient } from \"./homepage\";\nimport { PageClient } from \"./page\";\n\n/**\n * Main API client that provides access to all API endpoints\n */\nexport class ApiClient extends BaseApiClient {\n\t/**\n\t * Homepage API endpoints\n\t */\n\thomepage: HomepageClient;\n\tpage: PageClient;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tsuper(config);\n\n\t\t// Initialize sub-clients\n\t\tthis.homepage = new HomepageClient(config);\n\t\tthis.page = new PageClient(config);\n\t}\n}\n"],"mappings":"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","names":["z","z","z","z"]}
1
+ {"version":3,"sources":["../src/schemas/response.ts","../src/base.ts","../src/schemas/ftpink/page/index.ts","../src/schemas/prosemirror.ts","../src/homepage.ts","../src/schemas/ftpink/legacyHubPage/index.ts","../src/page.ts","../src/client.ts"],"sourcesContent":["import { z, type ZodTypeAny } from \"zod\";\n\n/**\n * Strongly‐typed enum for all possible API error codes.\n */\nexport const ApiErrorCode = z.enum([\n\t\"UNAUTHORIZED\",\n\t\"NOT_FOUND\",\n\t\"INTERNAL_SERVER_ERROR\",\n\t\"INVALID_INPUT_DATA\",\n]);\n\n/**\n * Fields shared by both success and error envelopes (but not the discriminant).\n */\nconst BaseEnvelopeFields = z.object({\n\tstatusCode: z.number(),\n\trequestId: z.string(),\n});\n\n/**\n * Specific details carried in an error payload.\n */\nexport const ApiErrorPayloadSchema = z\n\t.object({\n\t\tcode: ApiErrorCode,\n\t\tmessage: z.string(),\n\t\tdetails: z.string().optional(),\n\t\tpath: z.string().optional(),\n\t\ttimestamp: z.string().optional(),\n\t})\n\t.strict();\n\nexport type ApiErrorPayload = z.infer<typeof ApiErrorPayloadSchema>;\n\n/**\n * Full “envelope” when the API has failed.\n */\nexport const ApiErrorResponseSchema = BaseEnvelopeFields.extend({\n\tstatus: z.literal(\"error\"),\n\terror: ApiErrorPayloadSchema,\n}).strict();\n\nexport type ApiErrorResponse = z.infer<typeof ApiErrorResponseSchema>;\n\n/**\n * Schema for a successful API response, given some data schema T.\n */\nexport function ApiSuccessResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\treturn BaseEnvelopeFields.extend({\n\t\tstatus: z.literal(\"success\"),\n\t\tdata: dataSchema,\n\t}).strict();\n}\n\n/**\n * Union of success or error envelopes, discriminated on `status`.\n */\nexport function ApiResponseSchema<T extends ZodTypeAny>(dataSchema: T) {\n\tconst successSchema = ApiSuccessResponseSchema(dataSchema);\n\tconst errorSchema = ApiErrorResponseSchema;\n\treturn z.discriminatedUnion(\"status\", [successSchema, errorSchema]);\n}\n","import type { z, ZodTypeAny } from \"zod\";\nimport type { ApiErrorPayloadSchema } from \"./schemas/response\";\nimport { ApiResponseSchema } from \"./schemas/response\";\n\n/**\n * API-level error thrown when { status: 'error' } is returned\n */\nexport class ApiClientError extends Error {\n\tpublic code: string;\n\tpublic details?: string;\n\tpublic path?: string;\n\tpublic timestamp?: string;\n\n\tconstructor(\n\t\tpublic payload: z.infer<typeof ApiErrorPayloadSchema>,\n\t\tpublic statusCode: number,\n\t\tpublic requestId?: string,\n\t) {\n\t\tsuper(payload.message);\n\t\tthis.name = \"ApiError\";\n\t\tthis.code = payload.code;\n\t\tthis.details = payload.details;\n\t\tthis.path = payload.path;\n\t\tthis.timestamp = payload.timestamp;\n\t}\n}\n\n/**\n * Configuration options for the API client\n */\nexport type ApiClientConfig =\n\t| {\n\t\t\t// Standard configuration.\n\t\t\t// Intended for external clients using an API key issued via API Gateway.\n\t\t\tbaseUrl: string;\n\t\t\tapiKey: string;\n\t\t\tapiToken?: never;\n\t\t\tfetch?: typeof fetch;\n\t }\n\t| {\n\t\t\t// Alternative configuration.\n\t\t\t// Reserved for client with access to a bearer token (e.g. The e2e tests).\n\t\t\tbaseUrl: string;\n\t\t\tapiKey?: never;\n\t\t\tapiToken: string;\n\t\t\tfetch?: typeof fetch;\n\t };\n\nexport class BaseApiClient {\n\tprotected config: ApiClientConfig;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tthis.config = {\n\t\t\t...config,\n\t\t\tfetch: config.fetch || fetch,\n\t\t};\n\t\tthis.config.baseUrl = this.config.baseUrl.replace(/\\/+$/, \"\"); // strip trailing slashes\n\t}\n\n\t/**\n\t * Generic HTTP request to a JSON API\n\t */\n\tprotected async request<\n\t\tReqSchema extends ZodTypeAny | undefined,\n\t\tResponseDataSchema extends ZodTypeAny,\n\t>(\n\t\tmethod: \"GET\" | \"PUT\" | \"POST\" | \"DELETE\",\n\t\tpath: string,\n\t\topts: {\n\t\t\trequestSchema?: ReqSchema;\n\t\t\tbody?: ReqSchema extends ZodTypeAny ? z.infer<ReqSchema> : unknown;\n\t\t\tresponseDataSchema: ResponseDataSchema;\n\t\t},\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\t// Validate request body if provided\n\t\tlet bodyPayload = opts.body;\n\t\tif (opts.requestSchema && opts.body !== undefined) {\n\t\t\tbodyPayload = opts.requestSchema.parse(opts.body);\n\t\t}\n\n\t\t// Build URL + query string\n\t\tconst url = new URL(this.config.baseUrl + path);\n\n\t\t// Perform fetch\n\t\tconst response = await this.config.fetch!(url.toString(), {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...(this.config.apiKey\n\t\t\t\t\t? { \"x-api-key\": this.config.apiKey }\n\t\t\t\t\t: { Authorization: `Bearer ${this.config.apiToken}` }),\n\t\t\t},\n\t\t\tbody: bodyPayload ? JSON.stringify(bodyPayload) : undefined,\n\t\t});\n\n\t\tconst json = await response.json();\n\t\tconst parsedJson = ApiResponseSchema(opts.responseDataSchema).parse(json);\n\n\t\tif (\"error\" in parsedJson) {\n\t\t\tthrow new ApiClientError(parsedJson.error, parsedJson.statusCode, parsedJson.requestId);\n\t\t} else if (!(\"data\" in parsedJson)) {\n\t\t\tthrow new ApiClientError(\n\t\t\t\t{\n\t\t\t\t\tcode: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t\tmessage: \"Unexpected API response format\",\n\t\t\t\t\tdetails: 'Response did not contain expected \"data\" field',\n\t\t\t\t},\n\t\t\t\t500,\n\t\t\t\tparsedJson.requestId,\n\t\t\t);\n\t\t}\n\n\t\treturn parsedJson.data;\n\t}\n\n\t/**\n\t * GET convenience method inferring response type from schema\n\t */\n\tprotected get<ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"GET\", path, { responseDataSchema });\n\t}\n\n\t/**\n\t * PUT convenience method inferring both request and response types\n\t */\n\tprotected put<ReqSchema extends ZodTypeAny, ResponseDataSchema extends ZodTypeAny>(\n\t\tpath: string,\n\t\tbody: z.infer<ReqSchema>,\n\t\trequestSchema: ReqSchema,\n\t\tresponseDataSchema: ResponseDataSchema,\n\t): Promise<z.infer<ResponseDataSchema>> {\n\t\treturn this.request(\"PUT\", path, { body, requestSchema, responseDataSchema });\n\t}\n}\n","import { z } from \"zod\";\nimport { ProseMirrorDocSchema } from \"../../prosemirror\";\n\n//\n// 1) REUSABLE SCHEMAS FOR COMMON STRUCTURES\n//\n\n/**\n * A generic schema representing a heading used across various slices.\n * - `text`: The display text of the heading.\n * - `href`: An optional URL that the heading links to.\n */\nconst HeadingSchema = z.object({\n\ttext: z.string(),\n\thref: z.string().url().optional(),\n});\n\n/**\n * Base “properties” common to most page slices.\n * - `heading`: An optional heading object for slices that can display a title.\n */\nconst BasePageItemProps = z.object({\n\theading: HeadingSchema.optional(),\n});\n\n/**\n * Extended properties for any “graphics”-type slice.\n * In addition to base properties, these slices must specify how the graphic is displayed.\n * - `displayBehaviour`: Determines if the graphic stands alone or is associated with other content.\n */\nconst BaseGraphicsItemProps = BasePageItemProps.extend({\n\tdisplayBehaviour: z.enum([\"standalone\", \"associated\"]),\n});\n\n/**\n * A schema to validate that a string is valid JSON.\n */\nconst ValidJSONStringSchema = z.string().refine(\n\t(val) => {\n\t\ttry {\n\t\t\tJSON.parse(val);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\t{ message: \"Invalid JSON string\" },\n);\n\n//\n// 2) GENERIC HELPER TO DEFINE “SLICE” INPUT/OUTPUT SCHEMAS\n//\n\n/**\n * A union type to represent either a Zod object schema or an optional Zod object schema.\n */\ntype OptionalOrRequiredZodObject = z.AnyZodObject | z.ZodOptional<z.AnyZodObject>;\n\n/**\n * Helper function that, given:\n * - `typeName`: A string literal identifying the slice type.\n * - `propsShape`: A Zod schema describing the slice’s `properties`.\n *\n * Returns an object containing two schemas:\n * - `InputSchema`: For client-side input; `sliceId` is optional.\n * - `OutputSchema`: For server-side/output; `sliceId` is required.\n *\n * This is useful because when defining slices we often want to allow -\n * clients to submit slices without an ID (e.g., when creating new slices),\n */\nfunction defineSliceSchema<T extends string, P extends OptionalOrRequiredZodObject>(options: {\n\ttypeName: T;\n\tpropsShape: P;\n}) {\n\tconst { typeName, propsShape } = options;\n\n\t// Base schema shared by both input and output:\n\t// - `type`: Literal string identifying which slice this is.\n\t// - `hidden`: Optional flag to mark the slice as hidden.\n\t// - `properties`: The detailed properties shape for the slice.\n\tconst BaseSchema = z.object({\n\t\ttype: z.literal(typeName),\n\t\thidden: z.boolean().optional(),\n\t\tproperties: propsShape,\n\t});\n\n\t/**\n\t * Input schema: For client submissions.\n\t * - `sliceId` is optional because the client might not specify it yet.\n\t */\n\tconst InputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid().optional(),\n\t});\n\n\t/**\n\t * Output schema: For persisted or server-returned data.\n\t * - `sliceId` is required (each saved slice must have an ID).\n\t */\n\tconst OutputSchema = BaseSchema.extend({\n\t\tsliceId: z.string().uuid(),\n\t});\n\n\treturn { InputSchema, OutputSchema };\n}\n\n//\n// 3) DEFINE INDIVIDUAL SLICE TYPES (INPUT & OUTPUT) USING THE HELPER\n//\n\n// 3.A “HomepageSlice”\n// - A generic homepage slice that may include an optional heading.\n// - Input: Clients can pass `properties` or omit entirely.\n// - Output: Always includes a `properties` object (may be empty) and a required `sliceId`.\nconst HomepageSlice = defineSliceSchema({\n\ttypeName: \"HomepageSlice\",\n\tpropsShape: BasePageItemProps.optional(),\n});\n\n// 3.B “FlourishGraphicSlice”\n// - A slice to embed or reference a Flourish graphic by its ID.\n// - Extends graphic base properties with `flourishId`.\nconst FlourishGraphicSlice = defineSliceSchema({\n\ttypeName: \"FlourishGraphic\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tflourishDescription: z.string().optional(), // Optional description for the Flourish graphic\n\t\tflourishId: z.string().nonempty(),\n\t}),\n});\n\n// 3.C “CustomIframeSlice”\n// - A slice that renders a custom iframe.\n// - Extends graphic base properties with `iframeSrc`.\nconst CustomIframeSlice = defineSliceSchema({\n\ttypeName: \"CustomIframe\",\n\tpropsShape: BaseGraphicsItemProps.extend({\n\t\tiframeSrc: z.string().url().nonempty(),\n\t}),\n});\n\n// 3.D “ExperimentSlice”\n// - A slice for embedding experimental content.\n// - Requires an `experimentId`, `experimentName`, and a JSON string (`contentJson`).\nconst ExperimentSlice = defineSliceSchema({\n\ttypeName: \"Experiment\",\n\tpropsShape: BasePageItemProps.extend({\n\t\texperimentId: z.string().nonempty(), // Unique ID for the experiment\n\t\texperimentName: z.string().nonempty(), // Human-readable name of the experiment\n\t\tcontentJson: ValidJSONStringSchema, // The experiment’s JSON payload as a valid JSON string\n\t}),\n});\n\n// 3.E \"Strip\"\n// - A slice that displays a strip of content.\nconst StripSlice = defineSliceSchema({\n\ttypeName: \"Strip\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the strip to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n// 3.F \"TopperSlice\"\n// - A slice that displays a topper section with description and optional strapline.\nconst TopperSlice = defineSliceSchema({\n\ttypeName: \"Topper\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tdescription: ProseMirrorDocSchema,\n\t\tstrapline: z.string().optional(),\n\t}),\n});\n\n// 3.F \"Hero\"\n// - A slice that represents a Hero on the page. It references a Spark List.\nconst HeroSlice = defineSliceSchema({\n\ttypeName: \"Hero\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the spark list to display\n\t\tmaxStories: z.number().int().min(1), // Maximum number of stories to display in the strip\n\t}),\n});\n\n//\n// 4) COMPOSE DISCRIMINATED UNIONS FOR “SLICE API” INPUT & OUTPUT\n//\n\n/**\n * All possible slice inputs for the Page API.\n * This discriminated union allows Zod to pick the correct schema based on the `type` field.\n */\nexport const SliceApiInputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.InputSchema,\n\tFlourishGraphicSlice.InputSchema,\n\tCustomIframeSlice.InputSchema,\n\tExperimentSlice.InputSchema,\n\tStripSlice.InputSchema,\n\tTopperSlice.InputSchema,\n\tHeroSlice.InputSchema,\n] as const);\n\n/**\n * All possible slice outputs for the Page API.\n * The same discriminated union but with each slice requiring `sliceId`.\n */\nexport const SliceApiOutputSchema = z.discriminatedUnion(\"type\", [\n\tHomepageSlice.OutputSchema,\n\tFlourishGraphicSlice.OutputSchema,\n\tCustomIframeSlice.OutputSchema,\n\tExperimentSlice.OutputSchema,\n\tStripSlice.OutputSchema,\n\tTopperSlice.OutputSchema,\n\tHeroSlice.OutputSchema,\n] as const);\n\n//\n// 5) WRAPPER SCHEMAS FOR THE ENTIRE PAGE STRUCTURE\n//\n\nconst BasePagePropertiesSchema = z.object({\n\ttitle: z.string(),\n\tpageId: z.string().uuid(),\n\tconceptId: z.string().optional(),\n\tmetaDescription: z.string().optional(),\n\tpageTheme: z.string().optional(),\n\tsponsorText: z.string().optional(),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const PageStructureInputSchema = z.object({\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiInputSchema),\n});\n\n/**\n * Page structure as submitted by clients.\n * - `properties`: Metadata about the page (title, list ID, page ID).\n * - `children`: Array of slice inputs (each with an optional `sliceId`).\n */\nexport const HomepageStructureInputSchema = PageStructureInputSchema.extend({\n\tproperties: BasePagePropertiesSchema.extend({\n\t\t// This is optional for the input. If clients don't send it, we generate a uuid.\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n/**\n * Page structure as stored or returned by the server.\n */\nexport const PageStructureOutputSchema = z.object({\n\ttype: z.literal(\"Page\"),\n\tschemaVersion: z.number(),\n\tproperties: BasePagePropertiesSchema,\n\tchildren: z.array(SliceApiOutputSchema),\n});\n\nexport const HomepageStructureOutputSchema = PageStructureOutputSchema.extend({\n\ttype: z.literal(\"Homepage\"),\n\tproperties: BasePagePropertiesSchema.extend({\n\t\thomepageListId: z.string().uuid(),\n\t}),\n});\n\n//\n// 6) EXPORT TYPES FOR CONSUMPTION IN CODE\n//\n\n/** Client-side type for page structure input */\nexport type PageStructureInput = z.infer<typeof PageStructureInputSchema>;\n\n/** Server-side type for page structure output */\nexport type PageStructureOutput = z.infer<typeof PageStructureOutputSchema>;\n\n/** Client-side type for homepage structure input */\nexport type HomepageStructureInput = z.infer<typeof HomepageStructureInputSchema>;\n\n/** Server-side type for homepage structure output */\nexport type HomepageStructureOutput = z.infer<typeof HomepageStructureOutputSchema>;\n\n/** Union of all possible slice outputs for type-checking convenience */\nexport type Slice = z.infer<typeof SliceApiOutputSchema>;\n\n/** Individual slice output types */\nexport type HomepageSliceType = z.infer<typeof HomepageSlice.OutputSchema>;\nexport type FlourishGraphicSliceType = z.infer<typeof FlourishGraphicSlice.OutputSchema>;\nexport type CustomIframeSliceType = z.infer<typeof CustomIframeSlice.OutputSchema>;\nexport type ExperimentSliceType = z.infer<typeof ExperimentSlice.OutputSchema>;\nexport type StripSliceType = z.infer<typeof StripSlice.OutputSchema>;\nexport type TopperSliceType = z.infer<typeof TopperSlice.OutputSchema>;\nexport type HeroSliceType = z.infer<typeof HeroSlice.OutputSchema>;\n\n/**\n * Union type for interactive slices (i.e., the ones rendering visual components).\n * Useful for code that cares specifically about slices with visual/interactive content.\n */\nexport type InteractiveSlice = FlourishGraphicSliceType | CustomIframeSliceType;\n","import { z } from \"zod\";\n\n/** Accept http(s) and mailto: (matches your editor config) */\nconst HrefSchema = z.string().refine((v) => /^(https?:\\/\\/|mailto:).+/.test(v), {\n\tmessage: \"Expected http(s):// or mailto: URL\",\n});\n\n/** Link mark. */\nconst ProseMirrorLinkMark = z.object({\n\ttype: z.literal(\"link\"),\n\tattrs: z.object({\n\t\thref: HrefSchema,\n\t}),\n});\n\n/** Supported text marks */\nconst ProseMirrorMark = z.discriminatedUnion(\"type\", [\n\tProseMirrorLinkMark,\n\tz.object({ type: z.literal(\"bold\") }),\n\tz.object({ type: z.literal(\"italic\") }),\n\tz.object({ type: z.literal(\"underline\") }),\n\tz.object({ type: z.literal(\"strike\") }),\n]);\n\n/** Text node */\nconst ProseMirrorTextNode = z.object({\n\ttype: z.literal(\"text\"),\n\ttext: z.string(),\n\tmarks: z.array(ProseMirrorMark).optional(),\n});\n\n/** Paragraph node — content can be empty/omitted */\nconst ProseMirrorParagraphNode = z.object({\n\ttype: z.literal(\"paragraph\"),\n\tcontent: z.array(ProseMirrorTextNode),\n});\n\n/** ProseMirror Node Union. */\nconst ProseMirrorNode = z.union([ProseMirrorParagraphNode, ProseMirrorTextNode]);\n\n/** Root node of a ProseMirror document - enforcing at least 1 paragraph */\nexport const ProseMirrorDocSchema = z.object({\n\ttype: z.literal(\"doc\"),\n\tcontent: z\n\t\t.array(ProseMirrorNode)\n\t\t.min(1, { message: \"Document must contain at least one paragraph\" }),\n});\n\n/** Rich text editor TS type. */\nexport type RichTextEditorType = z.infer<typeof ProseMirrorDocSchema>;\n\nexport {};\n","import { BaseApiClient } from \"./base\";\nimport {\n\tHomepageStructureInputSchema,\n\tHomepageStructureOutputSchema,\n\ttype HomepageStructureInput,\n\ttype HomepageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Homepage structure endpoints\n */\nexport class HomepageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<HomepageStructureOutput> {\n\t\treturn this.get(`/v1/homepage/${pageId}/structure`, HomepageStructureOutputSchema);\n\t}\n\n\tasync getStructuresByHomepageListId(homepageListId: string): Promise<HomepageStructureOutput[]> {\n\t\treturn this.get(\n\t\t\t`/v1/homepage/list/${homepageListId}/structures`,\n\t\t\tHomepageStructureOutputSchema.array(),\n\t\t);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<HomepageStructureInput, \"type\">,\n\t): Promise<HomepageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/homepage/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tHomepageStructureInputSchema,\n\t\t\tHomepageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import { z } from \"zod\";\n\n/**\n * -----------------------------------------\n * Legacy API Schemas & Types\n *\n * These schemas map to expected types for Hub Pages rendered by dotcom-pages.\n * -----------------------------------------\n */\n\nconst LegacyFlourishChildSchema = z.object({\n\tsource: z.literal(\"flourish\"),\n\tproperties: z.object({\n\t\tid: z.string().min(1), // e.g. \"visualisation/21901162\"\n\t}),\n});\n\nconst LegacyListChildSchema = z.object({\n\tsource: z.literal(\"list\"),\n\tproperties: z.object({\n\t\tid: z.string().uuid(),\n\t\tmaxItems: z.number().optional(),\n\t}),\n});\n\nconst LegacyContainerChildSchema = z.discriminatedUnion(\"source\", [\n\tLegacyFlourishChildSchema,\n\tLegacyListChildSchema,\n]);\n\nconst LegacyTopperSchema = z.object({\n\ttype: z.literal(\"topper-basic\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\ttitle: z.string(),\n\t\tsponsorText: z.string().default(\"\"),\n\t}),\n});\n\nconst LegacyInfoBoxSchema = z.object({\n\ttype: z.literal(\"info-box\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\tbodyHTML: z.string(),\n\t}),\n});\n\nconst LegacyContainerSchema = z.object({\n\ttype: z.literal(\"container\"),\n\tchildren: z.array(LegacyContainerChildSchema).min(1),\n\tproperties: z.object({\n\t\ttitle: z.string().optional(),\n\t\tdesign: z.enum([\"chart\", \"four-story\", \"freeform\", \"hero-lead\"]).default(\"freeform\"),\n\t\tbackgroundColor: z.string().optional(),\n\t}),\n});\n\nconst LegacyExperimentSchema = z.object({\n\ttype: z.literal(\"experiment\"),\n\tchildren: z.tuple([]),\n\tproperties: z.object({\n\t\texperimentName: z.string(),\n\t\tid: z.string(),\n\t\ttitle: z.string().optional(),\n\t\tconfig: z\n\t\t\t.object({\n\t\t\t\tvalue: z.unknown().optional(),\n\t\t\t\t// Hub pages support experiments with HTML and Text.\n\t\t\t\t// For now we just support JSON. As we migrate pages, this may change.\n\t\t\t\tformat: z.enum([\"json\"]).default(\"json\"),\n\t\t\t})\n\t\t\t.partial()\n\t\t\t.optional(),\n\t}),\n});\n\nconst LegacyBlockSchema = z.discriminatedUnion(\"type\", [\n\tLegacyTopperSchema,\n\tLegacyInfoBoxSchema,\n\tLegacyContainerSchema,\n\tLegacyExperimentSchema,\n]);\n\nexport const LegacyPageStructureOutputSchema = z.object({\n\tblocks: z.array(LegacyBlockSchema),\n\tconceptId: z.string().uuid().optional(),\n\tthemeName: z.string().optional(),\n\tuuid: z.string().uuid(),\n});\n\nexport type LegacyPageStructureOutput = z.infer<typeof LegacyPageStructureOutputSchema>;\nexport type LegacyBlock = z.infer<typeof LegacyBlockSchema>;\n","import { BaseApiClient } from \"./base\";\nimport type { LegacyPageStructureOutput } from \"./schemas/ftpink/legacyHubPage\";\nimport { LegacyPageStructureOutputSchema } from \"./schemas/ftpink/legacyHubPage\";\nimport {\n\tPageStructureInputSchema,\n\tPageStructureOutputSchema,\n\ttype PageStructureInput,\n\ttype PageStructureOutput,\n} from \"./schemas/ftpink/page\";\n\n/**\n * Client for Page structure endpoints\n */\nexport class PageClient extends BaseApiClient {\n\tasync getStructure(pageId: string): Promise<PageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/structure`, PageStructureOutputSchema);\n\t}\n\n\tasync getLegacyHubPageStructure(pageId: string): Promise<LegacyPageStructureOutput> {\n\t\treturn this.get(`/v1/page/${pageId}/legacyHubPageStructure`, LegacyPageStructureOutputSchema);\n\t}\n\n\tasync upsertStructure(\n\t\tpageId: string,\n\t\tdata: Omit<PageStructureInput, \"type\">,\n\t): Promise<PageStructureOutput> {\n\t\treturn this.put(\n\t\t\t`/v1/page/${pageId}/structure`,\n\t\t\tdata,\n\t\t\tPageStructureInputSchema,\n\t\t\tPageStructureOutputSchema,\n\t\t);\n\t}\n}\n","import type { ApiClientConfig } from \"./base\";\nimport { BaseApiClient } from \"./base\";\nimport { HomepageClient } from \"./homepage\";\nimport { PageClient } from \"./page\";\n\n/**\n * Main API client that provides access to all API endpoints\n */\nexport class ApiClient extends BaseApiClient {\n\t/**\n\t * Homepage API endpoints\n\t */\n\thomepage: HomepageClient;\n\tpage: PageClient;\n\n\tconstructor(config: ApiClientConfig) {\n\t\tsuper(config);\n\n\t\t// Initialize sub-clients\n\t\tthis.homepage = new HomepageClient(config);\n\t\tthis.page = new PageClient(config);\n\t}\n}\n"],"mappings":"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","names":["z","z","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/content-curation-client",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Client library for Content Curation API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",