@financial-times/content-curation-client 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -110,6 +110,41 @@ var BaseApiClient = class {
110
110
 
111
111
  // src/schemas/ftpink/page/index.ts
112
112
 
113
+
114
+ // src/schemas/prosemirror.ts
115
+
116
+ var HrefSchema = _zod.z.string().refine((v) => /^(https?:\/\/|mailto:).+/.test(v), {
117
+ message: "Expected http(s):// or mailto: URL"
118
+ });
119
+ var ProseMirrorLinkMark = _zod.z.object({
120
+ type: _zod.z.literal("link"),
121
+ attrs: _zod.z.object({
122
+ href: HrefSchema
123
+ })
124
+ });
125
+ var ProseMirrorMark = _zod.z.discriminatedUnion("type", [
126
+ ProseMirrorLinkMark,
127
+ _zod.z.object({ type: _zod.z.literal("bold") }),
128
+ _zod.z.object({ type: _zod.z.literal("italic") }),
129
+ _zod.z.object({ type: _zod.z.literal("underline") }),
130
+ _zod.z.object({ type: _zod.z.literal("strike") })
131
+ ]);
132
+ var ProseMirrorTextNode = _zod.z.object({
133
+ type: _zod.z.literal("text"),
134
+ text: _zod.z.string(),
135
+ marks: _zod.z.array(ProseMirrorMark).optional()
136
+ });
137
+ var ProseMirrorParagraphNode = _zod.z.object({
138
+ type: _zod.z.literal("paragraph"),
139
+ content: _zod.z.array(ProseMirrorTextNode)
140
+ });
141
+ var ProseMirrorNode = _zod.z.union([ProseMirrorParagraphNode, ProseMirrorTextNode]);
142
+ var ProseMirrorDocSchema = _zod.z.object({
143
+ type: _zod.z.literal("doc"),
144
+ content: _zod.z.array(ProseMirrorNode).min(1, { message: "Document must contain at least one paragraph" })
145
+ });
146
+
147
+ // src/schemas/ftpink/page/index.ts
113
148
  var HeadingSchema = _zod.z.object({
114
149
  text: _zod.z.string(),
115
150
  href: _zod.z.string().url().optional()
@@ -184,19 +219,28 @@ var SparkListSlice = defineSliceSchema({
184
219
  // Optional heading for the list slice
185
220
  })
186
221
  });
222
+ var TopperSlice = defineSliceSchema({
223
+ typeName: "Topper",
224
+ propsShape: BasePageItemProps.extend({
225
+ description: ProseMirrorDocSchema,
226
+ strapline: _zod.z.string().optional()
227
+ })
228
+ });
187
229
  var SliceApiInputSchema = _zod.z.discriminatedUnion("type", [
188
230
  HomepageSlice.InputSchema,
189
231
  FlourishGraphicSlice.InputSchema,
190
232
  CustomIframeSlice.InputSchema,
191
233
  ExperimentSlice.InputSchema,
192
- SparkListSlice.InputSchema
234
+ SparkListSlice.InputSchema,
235
+ TopperSlice.InputSchema
193
236
  ]);
194
237
  var SliceApiOutputSchema = _zod.z.discriminatedUnion("type", [
195
238
  HomepageSlice.OutputSchema,
196
239
  FlourishGraphicSlice.OutputSchema,
197
240
  CustomIframeSlice.OutputSchema,
198
241
  ExperimentSlice.OutputSchema,
199
- SparkListSlice.OutputSchema
242
+ SparkListSlice.OutputSchema,
243
+ TopperSlice.OutputSchema
200
244
  ]);
201
245
  var BasePagePropertiesSchema = _zod.z.object({
202
246
  title: _zod.z.string(),
@@ -365,5 +409,6 @@ var ApiClient = class extends BaseApiClient {
365
409
 
366
410
 
367
411
 
368
- exports.ApiClient = ApiClient; exports.ApiClientError = ApiClientError; exports.ApiErrorCode = ApiErrorCode; exports.ApiErrorPayloadSchema = ApiErrorPayloadSchema; exports.ApiErrorResponseSchema = ApiErrorResponseSchema; exports.ApiResponseSchema = ApiResponseSchema; exports.ApiSuccessResponseSchema = ApiSuccessResponseSchema; exports.HomepageClient = HomepageClient; exports.HomepageStructureInputSchema = HomepageStructureInputSchema; exports.HomepageStructureOutputSchema = HomepageStructureOutputSchema; exports.LegacyPageStructureOutputSchema = LegacyPageStructureOutputSchema; exports.PageClient = PageClient; exports.PageStructureInputSchema = PageStructureInputSchema; exports.PageStructureOutputSchema = PageStructureOutputSchema; exports.SliceApiInputSchema = SliceApiInputSchema; exports.SliceApiOutputSchema = SliceApiOutputSchema;
412
+
413
+ exports.ApiClient = ApiClient; exports.ApiClientError = ApiClientError; exports.ApiErrorCode = ApiErrorCode; exports.ApiErrorPayloadSchema = ApiErrorPayloadSchema; exports.ApiErrorResponseSchema = ApiErrorResponseSchema; exports.ApiResponseSchema = ApiResponseSchema; exports.ApiSuccessResponseSchema = ApiSuccessResponseSchema; exports.HomepageClient = HomepageClient; exports.HomepageStructureInputSchema = HomepageStructureInputSchema; exports.HomepageStructureOutputSchema = HomepageStructureOutputSchema; exports.LegacyPageStructureOutputSchema = LegacyPageStructureOutputSchema; exports.PageClient = PageClient; exports.PageStructureInputSchema = PageStructureInputSchema; exports.PageStructureOutputSchema = PageStructureOutputSchema; exports.ProseMirrorDocSchema = ProseMirrorDocSchema; exports.SliceApiInputSchema = SliceApiInputSchema; exports.SliceApiOutputSchema = SliceApiOutputSchema;
369
414
  //# sourceMappingURL=index.cjs.map
@@ -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/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\";\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 \"SparkList\"\n// - A slice that references a spark list by its ID.\nconst SparkListSlice = defineSliceSchema({\n\ttypeName: \"SparkList\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the spark list to display\n\t\theading: HeadingSchema.optional(), // Optional heading for the list slice\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\tSparkListSlice.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\tSparkListSlice.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\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 SparkListSliceType = z.infer<typeof SparkListSlice.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 { 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 \"SparkList\"\n// - A slice that references a spark list by its ID.\nconst SparkListSlice = defineSliceSchema({\n\ttypeName: \"SparkList\",\n\tpropsShape: BasePageItemProps.extend({\n\t\tlistId: z.string().uuid(), // The ID of the spark list to display\n\t\theading: HeadingSchema.optional(), // Optional heading for the list slice\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//\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\tSparkListSlice.InputSchema,\n\tTopperSlice.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\tSparkListSlice.OutputSchema,\n\tTopperSlice.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\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 SparkListSliceType = z.infer<typeof SparkListSlice.OutputSchema>;\nexport type TopperSliceType = z.infer<typeof TopperSlice.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.d.cts CHANGED
@@ -18,11 +18,14 @@ export { CustomIframeSliceType } from './_tsup-dts-rollup.cjs';
18
18
  export { ExperimentSliceType } from './_tsup-dts-rollup.cjs';
19
19
  export { HomepageSliceType } from './_tsup-dts-rollup.cjs';
20
20
  export { SparkListSliceType } from './_tsup-dts-rollup.cjs';
21
+ export { TopperSliceType } from './_tsup-dts-rollup.cjs';
21
22
  export { SliceApiInputSchema } from './_tsup-dts-rollup.cjs';
22
23
  export { SliceApiOutputSchema } from './_tsup-dts-rollup.cjs';
23
24
  export { LegacyBlock } from './_tsup-dts-rollup.cjs';
24
25
  export { LegacyPageStructureOutput } from './_tsup-dts-rollup.cjs';
25
26
  export { LegacyPageStructureOutputSchema } from './_tsup-dts-rollup.cjs';
27
+ export { ProseMirrorDocSchema } from './_tsup-dts-rollup.cjs';
28
+ export { RichTextEditorType } from './_tsup-dts-rollup.cjs';
26
29
  export { ApiErrorResponseSchema } from './_tsup-dts-rollup.cjs';
27
30
  export { ApiSuccessResponseSchema } from './_tsup-dts-rollup.cjs';
28
31
  export { ApiErrorPayloadSchema } from './_tsup-dts-rollup.cjs';
package/dist/index.d.ts CHANGED
@@ -18,11 +18,14 @@ export { CustomIframeSliceType } from './_tsup-dts-rollup.js';
18
18
  export { ExperimentSliceType } from './_tsup-dts-rollup.js';
19
19
  export { HomepageSliceType } from './_tsup-dts-rollup.js';
20
20
  export { SparkListSliceType } from './_tsup-dts-rollup.js';
21
+ export { TopperSliceType } from './_tsup-dts-rollup.js';
21
22
  export { SliceApiInputSchema } from './_tsup-dts-rollup.js';
22
23
  export { SliceApiOutputSchema } from './_tsup-dts-rollup.js';
23
24
  export { LegacyBlock } from './_tsup-dts-rollup.js';
24
25
  export { LegacyPageStructureOutput } from './_tsup-dts-rollup.js';
25
26
  export { LegacyPageStructureOutputSchema } from './_tsup-dts-rollup.js';
27
+ export { ProseMirrorDocSchema } from './_tsup-dts-rollup.js';
28
+ export { RichTextEditorType } from './_tsup-dts-rollup.js';
26
29
  export { ApiErrorResponseSchema } from './_tsup-dts-rollup.js';
27
30
  export { ApiSuccessResponseSchema } from './_tsup-dts-rollup.js';
28
31
  export { ApiErrorPayloadSchema } from './_tsup-dts-rollup.js';
package/dist/index.js CHANGED
@@ -109,18 +109,53 @@ var BaseApiClient = class {
109
109
  };
110
110
 
111
111
  // src/schemas/ftpink/page/index.ts
112
+ import { z as z3 } from "zod";
113
+
114
+ // src/schemas/prosemirror.ts
112
115
  import { z as z2 } from "zod";
113
- var HeadingSchema = z2.object({
116
+ var HrefSchema = z2.string().refine((v) => /^(https?:\/\/|mailto:).+/.test(v), {
117
+ message: "Expected http(s):// or mailto: URL"
118
+ });
119
+ var ProseMirrorLinkMark = z2.object({
120
+ type: z2.literal("link"),
121
+ attrs: z2.object({
122
+ href: HrefSchema
123
+ })
124
+ });
125
+ var ProseMirrorMark = z2.discriminatedUnion("type", [
126
+ ProseMirrorLinkMark,
127
+ z2.object({ type: z2.literal("bold") }),
128
+ z2.object({ type: z2.literal("italic") }),
129
+ z2.object({ type: z2.literal("underline") }),
130
+ z2.object({ type: z2.literal("strike") })
131
+ ]);
132
+ var ProseMirrorTextNode = z2.object({
133
+ type: z2.literal("text"),
114
134
  text: z2.string(),
115
- href: z2.string().url().optional()
135
+ marks: z2.array(ProseMirrorMark).optional()
136
+ });
137
+ var ProseMirrorParagraphNode = z2.object({
138
+ type: z2.literal("paragraph"),
139
+ content: z2.array(ProseMirrorTextNode)
140
+ });
141
+ var ProseMirrorNode = z2.union([ProseMirrorParagraphNode, ProseMirrorTextNode]);
142
+ var ProseMirrorDocSchema = z2.object({
143
+ type: z2.literal("doc"),
144
+ content: z2.array(ProseMirrorNode).min(1, { message: "Document must contain at least one paragraph" })
116
145
  });
117
- var BasePageItemProps = z2.object({
146
+
147
+ // src/schemas/ftpink/page/index.ts
148
+ var HeadingSchema = z3.object({
149
+ text: z3.string(),
150
+ href: z3.string().url().optional()
151
+ });
152
+ var BasePageItemProps = z3.object({
118
153
  heading: HeadingSchema.optional()
119
154
  });
120
155
  var BaseGraphicsItemProps = BasePageItemProps.extend({
121
- displayBehaviour: z2.enum(["standalone", "associated"])
156
+ displayBehaviour: z3.enum(["standalone", "associated"])
122
157
  });
123
- var ValidJSONStringSchema = z2.string().refine(
158
+ var ValidJSONStringSchema = z3.string().refine(
124
159
  (val) => {
125
160
  try {
126
161
  JSON.parse(val);
@@ -133,16 +168,16 @@ var ValidJSONStringSchema = z2.string().refine(
133
168
  );
134
169
  function defineSliceSchema(options) {
135
170
  const { typeName, propsShape } = options;
136
- const BaseSchema = z2.object({
137
- type: z2.literal(typeName),
138
- hidden: z2.boolean().optional(),
171
+ const BaseSchema = z3.object({
172
+ type: z3.literal(typeName),
173
+ hidden: z3.boolean().optional(),
139
174
  properties: propsShape
140
175
  });
141
176
  const InputSchema = BaseSchema.extend({
142
- sliceId: z2.string().uuid().optional()
177
+ sliceId: z3.string().uuid().optional()
143
178
  });
144
179
  const OutputSchema = BaseSchema.extend({
145
- sliceId: z2.string().uuid()
180
+ sliceId: z3.string().uuid()
146
181
  });
147
182
  return { InputSchema, OutputSchema };
148
183
  }
@@ -153,23 +188,23 @@ var HomepageSlice = defineSliceSchema({
153
188
  var FlourishGraphicSlice = defineSliceSchema({
154
189
  typeName: "FlourishGraphic",
155
190
  propsShape: BaseGraphicsItemProps.extend({
156
- flourishDescription: z2.string().optional(),
191
+ flourishDescription: z3.string().optional(),
157
192
  // Optional description for the Flourish graphic
158
- flourishId: z2.string().nonempty()
193
+ flourishId: z3.string().nonempty()
159
194
  })
160
195
  });
161
196
  var CustomIframeSlice = defineSliceSchema({
162
197
  typeName: "CustomIframe",
163
198
  propsShape: BaseGraphicsItemProps.extend({
164
- iframeSrc: z2.string().url().nonempty()
199
+ iframeSrc: z3.string().url().nonempty()
165
200
  })
166
201
  });
167
202
  var ExperimentSlice = defineSliceSchema({
168
203
  typeName: "Experiment",
169
204
  propsShape: BasePageItemProps.extend({
170
- experimentId: z2.string().nonempty(),
205
+ experimentId: z3.string().nonempty(),
171
206
  // Unique ID for the experiment
172
- experimentName: z2.string().nonempty(),
207
+ experimentName: z3.string().nonempty(),
173
208
  // Human-readable name of the experiment
174
209
  contentJson: ValidJSONStringSchema
175
210
  // The experiment’s JSON payload as a valid JSON string
@@ -178,49 +213,58 @@ var ExperimentSlice = defineSliceSchema({
178
213
  var SparkListSlice = defineSliceSchema({
179
214
  typeName: "SparkList",
180
215
  propsShape: BasePageItemProps.extend({
181
- listId: z2.string().uuid(),
216
+ listId: z3.string().uuid(),
182
217
  // The ID of the spark list to display
183
218
  heading: HeadingSchema.optional()
184
219
  // Optional heading for the list slice
185
220
  })
186
221
  });
187
- var SliceApiInputSchema = z2.discriminatedUnion("type", [
222
+ var TopperSlice = defineSliceSchema({
223
+ typeName: "Topper",
224
+ propsShape: BasePageItemProps.extend({
225
+ description: ProseMirrorDocSchema,
226
+ strapline: z3.string().optional()
227
+ })
228
+ });
229
+ var SliceApiInputSchema = z3.discriminatedUnion("type", [
188
230
  HomepageSlice.InputSchema,
189
231
  FlourishGraphicSlice.InputSchema,
190
232
  CustomIframeSlice.InputSchema,
191
233
  ExperimentSlice.InputSchema,
192
- SparkListSlice.InputSchema
234
+ SparkListSlice.InputSchema,
235
+ TopperSlice.InputSchema
193
236
  ]);
194
- var SliceApiOutputSchema = z2.discriminatedUnion("type", [
237
+ var SliceApiOutputSchema = z3.discriminatedUnion("type", [
195
238
  HomepageSlice.OutputSchema,
196
239
  FlourishGraphicSlice.OutputSchema,
197
240
  CustomIframeSlice.OutputSchema,
198
241
  ExperimentSlice.OutputSchema,
199
- SparkListSlice.OutputSchema
242
+ SparkListSlice.OutputSchema,
243
+ TopperSlice.OutputSchema
200
244
  ]);
201
- var BasePagePropertiesSchema = z2.object({
202
- title: z2.string(),
203
- pageId: z2.string().uuid()
245
+ var BasePagePropertiesSchema = z3.object({
246
+ title: z3.string(),
247
+ pageId: z3.string().uuid()
204
248
  });
205
- var PageStructureInputSchema = z2.object({
249
+ var PageStructureInputSchema = z3.object({
206
250
  properties: BasePagePropertiesSchema,
207
- children: z2.array(SliceApiInputSchema)
251
+ children: z3.array(SliceApiInputSchema)
208
252
  });
209
253
  var HomepageStructureInputSchema = PageStructureInputSchema.extend({
210
254
  properties: BasePagePropertiesSchema.extend({
211
- homepageListId: z2.string().uuid()
255
+ homepageListId: z3.string().uuid()
212
256
  })
213
257
  });
214
- var PageStructureOutputSchema = z2.object({
215
- type: z2.literal("Page"),
216
- schemaVersion: z2.number(),
258
+ var PageStructureOutputSchema = z3.object({
259
+ type: z3.literal("Page"),
260
+ schemaVersion: z3.number(),
217
261
  properties: BasePagePropertiesSchema,
218
- children: z2.array(SliceApiOutputSchema)
262
+ children: z3.array(SliceApiOutputSchema)
219
263
  });
220
264
  var HomepageStructureOutputSchema = PageStructureOutputSchema.extend({
221
- type: z2.literal("Homepage"),
265
+ type: z3.literal("Homepage"),
222
266
  properties: BasePagePropertiesSchema.extend({
223
- homepageListId: z2.string().uuid()
267
+ homepageListId: z3.string().uuid()
224
268
  })
225
269
  });
226
270
 
@@ -246,75 +290,75 @@ var HomepageClient = class extends BaseApiClient {
246
290
  };
247
291
 
248
292
  // src/schemas/ftpink/legacyHubPage/index.ts
249
- import { z as z3 } from "zod";
250
- var LegacyFlourishChildSchema = z3.object({
251
- source: z3.literal("flourish"),
252
- properties: z3.object({
253
- id: z3.string().min(1)
293
+ import { z as z4 } from "zod";
294
+ var LegacyFlourishChildSchema = z4.object({
295
+ source: z4.literal("flourish"),
296
+ properties: z4.object({
297
+ id: z4.string().min(1)
254
298
  // e.g. "visualisation/21901162"
255
299
  })
256
300
  });
257
- var LegacyListChildSchema = z3.object({
258
- source: z3.literal("list"),
259
- properties: z3.object({
260
- id: z3.string().uuid(),
261
- maxItems: z3.number().optional()
301
+ var LegacyListChildSchema = z4.object({
302
+ source: z4.literal("list"),
303
+ properties: z4.object({
304
+ id: z4.string().uuid(),
305
+ maxItems: z4.number().optional()
262
306
  })
263
307
  });
264
- var LegacyContainerChildSchema = z3.discriminatedUnion("source", [
308
+ var LegacyContainerChildSchema = z4.discriminatedUnion("source", [
265
309
  LegacyFlourishChildSchema,
266
310
  LegacyListChildSchema
267
311
  ]);
268
- var LegacyTopperSchema = z3.object({
269
- type: z3.literal("topper-basic"),
270
- children: z3.tuple([]),
271
- properties: z3.object({
272
- title: z3.string(),
273
- sponsorText: z3.string().default("")
312
+ var LegacyTopperSchema = z4.object({
313
+ type: z4.literal("topper-basic"),
314
+ children: z4.tuple([]),
315
+ properties: z4.object({
316
+ title: z4.string(),
317
+ sponsorText: z4.string().default("")
274
318
  })
275
319
  });
276
- var LegacyInfoBoxSchema = z3.object({
277
- type: z3.literal("info-box"),
278
- children: z3.tuple([]),
279
- properties: z3.object({
280
- bodyHTML: z3.string()
320
+ var LegacyInfoBoxSchema = z4.object({
321
+ type: z4.literal("info-box"),
322
+ children: z4.tuple([]),
323
+ properties: z4.object({
324
+ bodyHTML: z4.string()
281
325
  })
282
326
  });
283
- var LegacyContainerSchema = z3.object({
284
- type: z3.literal("container"),
285
- children: z3.array(LegacyContainerChildSchema).min(1),
286
- properties: z3.object({
287
- title: z3.string().optional(),
288
- design: z3.enum(["chart", "four-story", "freeform", "hero-lead"]).default("freeform"),
289
- backgroundColor: z3.string().optional()
327
+ var LegacyContainerSchema = z4.object({
328
+ type: z4.literal("container"),
329
+ children: z4.array(LegacyContainerChildSchema).min(1),
330
+ properties: z4.object({
331
+ title: z4.string().optional(),
332
+ design: z4.enum(["chart", "four-story", "freeform", "hero-lead"]).default("freeform"),
333
+ backgroundColor: z4.string().optional()
290
334
  })
291
335
  });
292
- var LegacyExperimentSchema = z3.object({
293
- type: z3.literal("experiment"),
294
- children: z3.tuple([]),
295
- properties: z3.object({
296
- experimentName: z3.string(),
297
- id: z3.string(),
298
- title: z3.string().optional(),
299
- config: z3.object({
300
- value: z3.unknown().optional(),
336
+ var LegacyExperimentSchema = z4.object({
337
+ type: z4.literal("experiment"),
338
+ children: z4.tuple([]),
339
+ properties: z4.object({
340
+ experimentName: z4.string(),
341
+ id: z4.string(),
342
+ title: z4.string().optional(),
343
+ config: z4.object({
344
+ value: z4.unknown().optional(),
301
345
  // Hub pages support experiments with HTML and Text.
302
346
  // For now we just support JSON. As we migrate pages, this may change.
303
- format: z3.enum(["json"]).default("json")
347
+ format: z4.enum(["json"]).default("json")
304
348
  }).partial().optional()
305
349
  })
306
350
  });
307
- var LegacyBlockSchema = z3.discriminatedUnion("type", [
351
+ var LegacyBlockSchema = z4.discriminatedUnion("type", [
308
352
  LegacyTopperSchema,
309
353
  LegacyInfoBoxSchema,
310
354
  LegacyContainerSchema,
311
355
  LegacyExperimentSchema
312
356
  ]);
313
- var LegacyPageStructureOutputSchema = z3.object({
314
- blocks: z3.array(LegacyBlockSchema),
315
- conceptId: z3.string().uuid().optional(),
316
- themeName: z3.string().optional(),
317
- uuid: z3.string().uuid()
357
+ var LegacyPageStructureOutputSchema = z4.object({
358
+ blocks: z4.array(LegacyBlockSchema),
359
+ conceptId: z4.string().uuid().optional(),
360
+ themeName: z4.string().optional(),
361
+ uuid: z4.string().uuid()
318
362
  });
319
363
 
320
364
  // src/page.ts
@@ -363,6 +407,7 @@ export {
363
407
  PageClient,
364
408
  PageStructureInputSchema,
365
409
  PageStructureOutputSchema,
410
+ ProseMirrorDocSchema,
366
411
  SliceApiInputSchema,
367
412
  SliceApiOutputSchema
368
413
  };