@twreporter-academy/api-types 0.0.30 → 0.0.32

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.
@@ -56,6 +56,10 @@ export declare const V1CourseResourceSchema: z.ZodObject<{
56
56
  description: z.ZodString;
57
57
  downloadUrl: z.ZodString;
58
58
  }, z.core.$strip>;
59
+ export declare const V1CourseResourceDownloadPathParamsSchema: z.ZodObject<{
60
+ slug: z.ZodString;
61
+ resourceId: z.ZodString;
62
+ }, z.core.$strip>;
59
63
  export declare const V1CourseFurtherReadingSchema: z.ZodObject<{
60
64
  id: z.ZodString;
61
65
  title: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"course.d.ts","sourceRoot":"","sources":["../../src/schemas/course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAavB,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,OAAO,EAAE,GACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAO/C,CAAA;AAEF,eAAO,MAAM,4BAA4B;;iBAEvC,CAAA;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;iBAI3C,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;iBAcP,CAAA;AAE1B,eAAO,MAAM,wBAAwB;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBASP,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;iBAQP,CAAA;AAE5B,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;iBAQP,CAAA;AAElC,eAAO,MAAM,oBAAoB;;;EAAuC,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,eAAO,MAAM,yBAAyB;;;EAAyB,CAAA;AAE/D,eAAO,MAAM,wBAAwB;;;;;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAIP,CAAA;AAEjC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;iBAYP,CAAA;AAE/B,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEpC,6FAA6F;AAC7F,eAAO,MAAM,2BAA2B,qBAAmB,CAAA;AAE3D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;iBAiBP,CAAA;AAEhC,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEzC,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAA;AAEF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBf,CAAA;AAE7B,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBf,CAAA"}
1
+ {"version":3,"file":"course.d.ts","sourceRoot":"","sources":["../../src/schemas/course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAavB,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,OAAO,EAAE,GACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAO/C,CAAA;AAEF,eAAO,MAAM,4BAA4B;;iBAEvC,CAAA;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;iBAI3C,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;iBAcP,CAAA;AAE1B,eAAO,MAAM,wBAAwB;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBASP,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;iBAQP,CAAA;AAE5B,eAAO,MAAM,wCAAwC;;;iBAGnD,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;iBAQP,CAAA;AAElC,eAAO,MAAM,oBAAoB;;;EAAuC,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,eAAO,MAAM,yBAAyB;;;EAAyB,CAAA;AAE/D,eAAO,MAAM,wBAAwB;;;;;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAIP,CAAA;AAEjC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;iBAYP,CAAA;AAE/B,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEpC,6FAA6F;AAC7F,eAAO,MAAM,2BAA2B,qBAAmB,CAAA;AAE3D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;iBAiBP,CAAA;AAEhC,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEzC,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAA;AAEF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBf,CAAA;AAE7B,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBf,CAAA"}
@@ -46,9 +46,13 @@ export const V1CourseResourceSchema = z.object({
46
46
  id: z.string(),
47
47
  title: z.string(),
48
48
  description: z.string(),
49
- /** GCS file URL; empty when no PDF uploaded */
49
+ /** Auth download path on content-api; empty when no file or no access */
50
50
  downloadUrl: z.string()
51
51
  }).openapi('CourseResource');
52
+ export const V1CourseResourceDownloadPathParamsSchema = z.object({
53
+ slug: z.string().min(1).max(200),
54
+ resourceId: z.string().min(1).max(50)
55
+ });
52
56
  export const V1CourseFurtherReadingSchema = z.object({
53
57
  id: z.string(),
54
58
  title: z.string(),
@@ -120,7 +124,11 @@ export const V1ClassroomBySlugResponseSchema = z.object({
120
124
  tags: z.array(V1CourseTagSchema),
121
125
  /** Trial/preview stream only; null when unconfigured or course is coming_soon */
122
126
  previewVideoId: z.string().nullable(),
123
- /** Course video Cloudflare stream id; null when unpaid or not set */
127
+ /**
128
+ * Cloudflare Stream playback token (signed JWT) for the course video when
129
+ * the member has full access; null when unpaid, coming_soon, or unset.
130
+ * Pass to the Stream player as `src` in place of the raw video UID.
131
+ */
124
132
  videoId: z.string().nullable(),
125
133
  lessons: z.array(V1CourseLessonSchema),
126
134
  instructors: z.array(V1CourseInstructorSchema),
@@ -222,7 +230,7 @@ registry.registerPath({
222
230
  method: 'get',
223
231
  path: '/v1/courses/{slug}/classroom',
224
232
  tags: ['Courses'],
225
- description: 'Classroom course detail. Optional Bearer JWT: paid members receive videoId and lesson progress; unpaid or anonymous requests get videoId null and downloadUrl redacted. When status is coming_soon, lessons, resources, furtherReading, and previewVideoId are empty/null while title, summary, tags, and instructors remain visible.',
233
+ description: 'Classroom course detail. Optional Bearer JWT: paid members receive a signed Stream playback token in videoId and lesson progress; unpaid or anonymous requests get videoId null and downloadUrl redacted. When status is coming_soon, lessons, resources, furtherReading, and previewVideoId are empty/null while title, summary, tags, and instructors remain visible.',
226
234
  request: {
227
235
  params: V1CourseSlugPathParamsSchema
228
236
  },
@@ -255,6 +263,54 @@ registry.registerPath({
255
263
  ...internalServerErrorResponse
256
264
  }
257
265
  });
266
+ registry.registerPath({
267
+ method: 'get',
268
+ path: '/v1/courses/{slug}/resources/{resourceId}/download',
269
+ tags: ['Courses'],
270
+ description: 'Download a classroom PDF. Requires Bearer JWT and paid member access. Streams the file with Cache-Control: private, no-store. Content-Disposition uses the CMS PDF title (標題).',
271
+ request: {
272
+ params: V1CourseResourceDownloadPathParamsSchema
273
+ },
274
+ responses: {
275
+ 200: {
276
+ description: 'PDF file',
277
+ content: {
278
+ 'application/pdf': {
279
+ schema: {
280
+ type: 'string',
281
+ format: 'binary'
282
+ }
283
+ }
284
+ }
285
+ },
286
+ 400: {
287
+ description: 'Bad request',
288
+ content: {
289
+ 'application/json': {
290
+ schema: RestErrorBodySchema
291
+ }
292
+ }
293
+ },
294
+ 403: {
295
+ description: 'Forbidden — member lacks access',
296
+ content: {
297
+ 'application/json': {
298
+ schema: RestErrorBodySchema
299
+ }
300
+ }
301
+ },
302
+ 404: {
303
+ description: 'Course or PDF not found',
304
+ content: {
305
+ 'application/json': {
306
+ schema: RestErrorBodySchema
307
+ }
308
+ }
309
+ },
310
+ ...unauthorizedResponse,
311
+ ...internalServerErrorResponse
312
+ }
313
+ });
258
314
  registry.registerPath({
259
315
  method: 'get',
260
316
  path: '/v1/courses/{slug}',
@@ -1 +1 @@
1
- {"version":3,"file":"course.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","CloudflareStreamVideoSchema","V1LessonProgressSchema","PhotoSchema","registry","CourseThumbnailSchema","JsonValueSchema","union","string","number","boolean","null","array","unknown","record","V1CourseSlugPathParamsSchema","object","slug","min","max","V1CourseBySlugMetaResponseSchema","ogTitle","ogDescription","ogImage","nullable","V1CourseLessonSchema","id","order","int","title","startSeconds","endSeconds","durationSeconds","progress","optional","openapi","V1CourseLessonMetaSchema","duration","V1CourseInstructorSchema","name","bio","avatar","V1CourseResourceSchema","description","downloadUrl","V1CourseFurtherReadingSchema","excerpt","thumbnail","url","V1CourseStatusSchema","enum","V1HeaderCourseBadgeSchema","V1HeaderCourseItemSchema","subtitle","badge","V1CoursesListResponseSchema","courses","V1CourseCatalogItemSchema","image","instructors","tags","status","launchAt","iso","datetime","updatedAt","V1CoursesCatalogResponseSchema","V1LearningCourseBadgeSchema","literal","V1LearningCourseItemSchema","completedLessons","nonnegative","totalLessons","progressPercent","unitTitle","describe","V1CoursesLearningListResponseSchema","V1CourseTagSchema","V1ClassroomBySlugResponseSchema","summary","previewVideoId","videoId","lessons","resources","furtherReading","V1CourseBySlugResponseSchema","estimatedDurationMinutes","trialVideos","lessonsMeta","heroImageVideo","heroImageVideoPortrait","heroImage","registerPath","method","path","responses","content","schema","request","params"],"sources":["../../src/schemas/course.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { CloudflareStreamVideoSchema } from './cloudflare-stream.js'\nimport { V1LessonProgressSchema } from './lesson-progress.js'\nimport { PhotoSchema } from './photo.js'\nimport { registry } from './registry.js'\nimport { CourseThumbnailSchema } from './tag.js'\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | unknown[]\n | Record<string, unknown>\n\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(z.unknown()),\n z.record(z.string(), z.unknown()),\n])\n\nexport const V1CourseSlugPathParamsSchema = z.object({\n slug: z.string().min(1).max(200),\n})\n\nexport const V1CourseBySlugMetaResponseSchema = z.object({\n ogTitle: z.string(),\n ogDescription: z.string(),\n ogImage: CourseThumbnailSchema.nullable(),\n})\n\nexport const V1CourseLessonSchema = z\n .object({\n id: z.string(),\n order: z.number().int(),\n title: z.string(),\n /** Segment start in the course video (seconds) */\n startSeconds: z.number().int(),\n /** Segment end in the course video (seconds) */\n endSeconds: z.number().int(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n durationSeconds: z.number().int(),\n /** Present when request includes a valid member JWT; null when no progress record */\n progress: V1LessonProgressSchema.nullable().optional(),\n })\n .openapi('CourseLesson')\n\nexport const V1CourseLessonMetaSchema = z\n .object({\n order: z.number().int().nullable(),\n title: z.string(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n duration: z.number().int(),\n })\n .openapi('CourseLessonMeta')\n\nexport const V1CourseInstructorSchema = z\n .object({\n id: z.string(),\n slug: z.string(),\n name: z.string(),\n title: z.string(),\n bio: z.string(),\n avatar: PhotoSchema.nullable(),\n })\n .openapi('CourseInstructor')\n\nexport const V1CourseResourceSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n /** GCS file URL; empty when no PDF uploaded */\n downloadUrl: z.string(),\n })\n .openapi('CourseResource')\n\nexport const V1CourseFurtherReadingSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n excerpt: z.string(),\n thumbnail: PhotoSchema.nullable(),\n url: z.string(),\n })\n .openapi('CourseFurtherReading')\n\nexport const V1CourseStatusSchema = z.enum(['published', 'coming_soon'])\nexport type V1CourseStatus = z.infer<typeof V1CourseStatusSchema>\n\nexport const V1HeaderCourseBadgeSchema = z.enum(['new', 'wip'])\n\nexport const V1HeaderCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n badge: V1HeaderCourseBadgeSchema.optional(),\n })\n .openapi('HeaderCourseItem')\n\nexport const V1CoursesListResponseSchema = z\n .object({\n courses: z.array(V1HeaderCourseItemSchema),\n })\n .openapi('CoursesListResponse')\n\nexport const V1CourseCatalogItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n image: CourseThumbnailSchema.nullable(),\n instructors: z.array(z.object({ name: z.string() })),\n tags: z.array(z.object({ slug: z.string(), name: z.string() })),\n status: V1CourseStatusSchema,\n launchAt: z.iso.datetime().nullable(),\n updatedAt: z.iso.datetime().nullable().optional(),\n })\n .openapi('CourseCatalogItem')\n\nexport const V1CoursesCatalogResponseSchema = z\n .object({\n courses: z.array(V1CourseCatalogItemSchema),\n })\n .openapi('CoursesCatalogResponse')\n\n/** Learning badge is only `new`; `wip` / coming_soon courses are excluded from this list. */\nexport const V1LearningCourseBadgeSchema = z.literal('new')\n\nexport const V1LearningCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n image: PhotoSchema.nullable(),\n badge: V1LearningCourseBadgeSchema.optional(),\n launchAt: z.iso.datetime().nullable(),\n completedLessons: z.number().int().nonnegative(),\n totalLessons: z.number().int().nonnegative(),\n progressPercent: z.number().int().min(0).max(100),\n /** Title of the most recently watched lesson (latest lastWatchedAt); falls back to next incomplete when timestamps are missing. */\n unitTitle: z\n .string()\n .describe(\n 'Title of the most recently watched lesson (latest lastWatchedAt); falls back to next incomplete when timestamps are missing.'\n ),\n })\n .openapi('LearningCourseItem')\n\nexport const V1CoursesLearningListResponseSchema = z\n .object({\n courses: z.array(V1LearningCourseItemSchema),\n })\n .openapi('CoursesLearningListResponse')\n\nexport const V1CourseTagSchema = z.object({\n slug: z.string(),\n name: z.string(),\n})\n\nexport const V1ClassroomBySlugResponseSchema = z\n .object({\n /** Course Item ID (CMS / Keystone id as string) */\n id: z.string(),\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n /** published: full payload; coming_soon: lessons/resources/furtherReading/previewVideoId stripped */\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n /** Trial/preview stream only; null when unconfigured or course is coming_soon */\n previewVideoId: z.string().nullable(),\n /** Course video Cloudflare stream id; null when unpaid or not set */\n videoId: z.string().nullable(),\n lessons: z.array(V1CourseLessonSchema),\n instructors: z.array(V1CourseInstructorSchema),\n resources: z.array(V1CourseResourceSchema),\n furtherReading: z.array(V1CourseFurtherReadingSchema),\n })\n .openapi('ClassroomDetail')\n\nexport const V1CourseBySlugResponseSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n launchAt: z.iso.datetime().nullable(),\n estimatedDurationMinutes: z.number().int().nullable(),\n /** Null when unset or the Lexical document has no content */\n description: JsonValueSchema.nullable(),\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n trialVideos: z.array(CloudflareStreamVideoSchema).nullable(),\n lessonsMeta: z.array(V1CourseLessonMetaSchema),\n instructors: z.array(V1CourseInstructorSchema),\n heroImageVideo: CloudflareStreamVideoSchema.nullable(),\n heroImageVideoPortrait: CloudflareStreamVideoSchema.nullable(),\n heroImage: PhotoSchema.nullable(),\n })\n .openapi('CourseDetail')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses',\n tags: ['Courses'],\n description: 'Header course list.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesListResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/catalog',\n tags: ['Courses'],\n description: 'Public course catalog.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesCatalogResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/meta',\n tags: ['Courses'],\n description: 'OG metadata for a course page.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugMetaResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/classroom',\n tags: ['Courses'],\n description:\n 'Classroom course detail. Optional Bearer JWT: paid members receive videoId and lesson progress; unpaid or anonymous requests get videoId null and downloadUrl redacted. When status is coming_soon, lessons, resources, furtherReading, and previewVideoId are empty/null while title, summary, tags, and instructors remain visible.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1ClassroomBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}',\n tags: ['Courses'],\n description:\n 'Public course landing page. Includes Lexical description, trial videos, lesson metadata, instructors, and hero media.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"course.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","CloudflareStreamVideoSchema","V1LessonProgressSchema","PhotoSchema","registry","CourseThumbnailSchema","JsonValueSchema","union","string","number","boolean","null","array","unknown","record","V1CourseSlugPathParamsSchema","object","slug","min","max","V1CourseBySlugMetaResponseSchema","ogTitle","ogDescription","ogImage","nullable","V1CourseLessonSchema","id","order","int","title","startSeconds","endSeconds","durationSeconds","progress","optional","openapi","V1CourseLessonMetaSchema","duration","V1CourseInstructorSchema","name","bio","avatar","V1CourseResourceSchema","description","downloadUrl","V1CourseResourceDownloadPathParamsSchema","resourceId","V1CourseFurtherReadingSchema","excerpt","thumbnail","url","V1CourseStatusSchema","enum","V1HeaderCourseBadgeSchema","V1HeaderCourseItemSchema","subtitle","badge","V1CoursesListResponseSchema","courses","V1CourseCatalogItemSchema","image","instructors","tags","status","launchAt","iso","datetime","updatedAt","V1CoursesCatalogResponseSchema","V1LearningCourseBadgeSchema","literal","V1LearningCourseItemSchema","completedLessons","nonnegative","totalLessons","progressPercent","unitTitle","describe","V1CoursesLearningListResponseSchema","V1CourseTagSchema","V1ClassroomBySlugResponseSchema","summary","previewVideoId","videoId","lessons","resources","furtherReading","V1CourseBySlugResponseSchema","estimatedDurationMinutes","trialVideos","lessonsMeta","heroImageVideo","heroImageVideoPortrait","heroImage","registerPath","method","path","responses","content","schema","request","params","type","format"],"sources":["../../src/schemas/course.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { CloudflareStreamVideoSchema } from './cloudflare-stream.js'\nimport { V1LessonProgressSchema } from './lesson-progress.js'\nimport { PhotoSchema } from './photo.js'\nimport { registry } from './registry.js'\nimport { CourseThumbnailSchema } from './tag.js'\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | unknown[]\n | Record<string, unknown>\n\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(z.unknown()),\n z.record(z.string(), z.unknown()),\n])\n\nexport const V1CourseSlugPathParamsSchema = z.object({\n slug: z.string().min(1).max(200),\n})\n\nexport const V1CourseBySlugMetaResponseSchema = z.object({\n ogTitle: z.string(),\n ogDescription: z.string(),\n ogImage: CourseThumbnailSchema.nullable(),\n})\n\nexport const V1CourseLessonSchema = z\n .object({\n id: z.string(),\n order: z.number().int(),\n title: z.string(),\n /** Segment start in the course video (seconds) */\n startSeconds: z.number().int(),\n /** Segment end in the course video (seconds) */\n endSeconds: z.number().int(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n durationSeconds: z.number().int(),\n /** Present when request includes a valid member JWT; null when no progress record */\n progress: V1LessonProgressSchema.nullable().optional(),\n })\n .openapi('CourseLesson')\n\nexport const V1CourseLessonMetaSchema = z\n .object({\n order: z.number().int().nullable(),\n title: z.string(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n duration: z.number().int(),\n })\n .openapi('CourseLessonMeta')\n\nexport const V1CourseInstructorSchema = z\n .object({\n id: z.string(),\n slug: z.string(),\n name: z.string(),\n title: z.string(),\n bio: z.string(),\n avatar: PhotoSchema.nullable(),\n })\n .openapi('CourseInstructor')\n\nexport const V1CourseResourceSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n /** Auth download path on content-api; empty when no file or no access */\n downloadUrl: z.string(),\n })\n .openapi('CourseResource')\n\nexport const V1CourseResourceDownloadPathParamsSchema = z.object({\n slug: z.string().min(1).max(200),\n resourceId: z.string().min(1).max(50),\n})\n\nexport const V1CourseFurtherReadingSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n excerpt: z.string(),\n thumbnail: PhotoSchema.nullable(),\n url: z.string(),\n })\n .openapi('CourseFurtherReading')\n\nexport const V1CourseStatusSchema = z.enum(['published', 'coming_soon'])\nexport type V1CourseStatus = z.infer<typeof V1CourseStatusSchema>\n\nexport const V1HeaderCourseBadgeSchema = z.enum(['new', 'wip'])\n\nexport const V1HeaderCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n badge: V1HeaderCourseBadgeSchema.optional(),\n })\n .openapi('HeaderCourseItem')\n\nexport const V1CoursesListResponseSchema = z\n .object({\n courses: z.array(V1HeaderCourseItemSchema),\n })\n .openapi('CoursesListResponse')\n\nexport const V1CourseCatalogItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n image: CourseThumbnailSchema.nullable(),\n instructors: z.array(z.object({ name: z.string() })),\n tags: z.array(z.object({ slug: z.string(), name: z.string() })),\n status: V1CourseStatusSchema,\n launchAt: z.iso.datetime().nullable(),\n updatedAt: z.iso.datetime().nullable().optional(),\n })\n .openapi('CourseCatalogItem')\n\nexport const V1CoursesCatalogResponseSchema = z\n .object({\n courses: z.array(V1CourseCatalogItemSchema),\n })\n .openapi('CoursesCatalogResponse')\n\n/** Learning badge is only `new`; `wip` / coming_soon courses are excluded from this list. */\nexport const V1LearningCourseBadgeSchema = z.literal('new')\n\nexport const V1LearningCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n image: PhotoSchema.nullable(),\n badge: V1LearningCourseBadgeSchema.optional(),\n launchAt: z.iso.datetime().nullable(),\n completedLessons: z.number().int().nonnegative(),\n totalLessons: z.number().int().nonnegative(),\n progressPercent: z.number().int().min(0).max(100),\n /** Title of the most recently watched lesson (latest lastWatchedAt); falls back to next incomplete when timestamps are missing. */\n unitTitle: z\n .string()\n .describe(\n 'Title of the most recently watched lesson (latest lastWatchedAt); falls back to next incomplete when timestamps are missing.'\n ),\n })\n .openapi('LearningCourseItem')\n\nexport const V1CoursesLearningListResponseSchema = z\n .object({\n courses: z.array(V1LearningCourseItemSchema),\n })\n .openapi('CoursesLearningListResponse')\n\nexport const V1CourseTagSchema = z.object({\n slug: z.string(),\n name: z.string(),\n})\n\nexport const V1ClassroomBySlugResponseSchema = z\n .object({\n /** Course Item ID (CMS / Keystone id as string) */\n id: z.string(),\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n /** published: full payload; coming_soon: lessons/resources/furtherReading/previewVideoId stripped */\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n /** Trial/preview stream only; null when unconfigured or course is coming_soon */\n previewVideoId: z.string().nullable(),\n /**\n * Cloudflare Stream playback token (signed JWT) for the course video when\n * the member has full access; null when unpaid, coming_soon, or unset.\n * Pass to the Stream player as `src` in place of the raw video UID.\n */\n videoId: z.string().nullable(),\n lessons: z.array(V1CourseLessonSchema),\n instructors: z.array(V1CourseInstructorSchema),\n resources: z.array(V1CourseResourceSchema),\n furtherReading: z.array(V1CourseFurtherReadingSchema),\n })\n .openapi('ClassroomDetail')\n\nexport const V1CourseBySlugResponseSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n launchAt: z.iso.datetime().nullable(),\n estimatedDurationMinutes: z.number().int().nullable(),\n /** Null when unset or the Lexical document has no content */\n description: JsonValueSchema.nullable(),\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n trialVideos: z.array(CloudflareStreamVideoSchema).nullable(),\n lessonsMeta: z.array(V1CourseLessonMetaSchema),\n instructors: z.array(V1CourseInstructorSchema),\n heroImageVideo: CloudflareStreamVideoSchema.nullable(),\n heroImageVideoPortrait: CloudflareStreamVideoSchema.nullable(),\n heroImage: PhotoSchema.nullable(),\n })\n .openapi('CourseDetail')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses',\n tags: ['Courses'],\n description: 'Header course list.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesListResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/catalog',\n tags: ['Courses'],\n description: 'Public course catalog.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesCatalogResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/meta',\n tags: ['Courses'],\n description: 'OG metadata for a course page.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugMetaResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/classroom',\n tags: ['Courses'],\n description:\n 'Classroom course detail. Optional Bearer JWT: paid members receive a signed Stream playback token in videoId and lesson progress; unpaid or anonymous requests get videoId null and downloadUrl redacted. When status is coming_soon, lessons, resources, furtherReading, and previewVideoId are empty/null while title, summary, tags, and instructors remain visible.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1ClassroomBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/resources/{resourceId}/download',\n tags: ['Courses'],\n description:\n 'Download a classroom PDF. Requires Bearer JWT and paid member access. Streams the file with Cache-Control: private, no-store. Content-Disposition uses the CMS PDF title (標題).',\n request: { params: V1CourseResourceDownloadPathParamsSchema },\n responses: {\n 200: {\n description: 'PDF file',\n content: {\n 'application/pdf': {\n schema: { type: 'string', format: 'binary' },\n },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — member lacks access',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course or PDF not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}',\n tags: ['Courses'],\n description:\n 'Public course landing page. Includes Lexical description, trial videos, lesson metadata, instructors, and hero media.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
@@ -43,6 +43,7 @@ export declare const V1HomeHeroCourseSlideSchema: z.ZodObject<{
43
43
  lg: z.ZodString;
44
44
  }, z.core.$strip>;
45
45
  alt: z.ZodString;
46
+ externalLink: z.ZodNullable<z.ZodString>;
46
47
  }, z.core.$strip>;
47
48
  export declare const V1HomeHeroActivitySlideSchema: z.ZodObject<{
48
49
  kind: z.ZodLiteral<"activity">;
@@ -53,6 +54,17 @@ export declare const V1HomeHeroActivitySlideSchema: z.ZodObject<{
53
54
  lg: z.ZodString;
54
55
  }, z.core.$strip>;
55
56
  alt: z.ZodString;
57
+ externalLink: z.ZodNullable<z.ZodString>;
58
+ }, z.core.$strip>;
59
+ export declare const V1HomeHeroUnspecifiedSlideSchema: z.ZodObject<{
60
+ kind: z.ZodLiteral<"unspecified">;
61
+ images: z.ZodObject<{
62
+ sm: z.ZodString;
63
+ md: z.ZodString;
64
+ lg: z.ZodString;
65
+ }, z.core.$strip>;
66
+ alt: z.ZodString;
67
+ externalLink: z.ZodNullable<z.ZodString>;
56
68
  }, z.core.$strip>;
57
69
  export declare const V1HomeHeroSlideSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
58
70
  kind: z.ZodLiteral<"course">;
@@ -68,6 +80,7 @@ export declare const V1HomeHeroSlideSchema: z.ZodDiscriminatedUnion<[z.ZodObject
68
80
  lg: z.ZodString;
69
81
  }, z.core.$strip>;
70
82
  alt: z.ZodString;
83
+ externalLink: z.ZodNullable<z.ZodString>;
71
84
  }, z.core.$strip>, z.ZodObject<{
72
85
  kind: z.ZodLiteral<"activity">;
73
86
  link: z.ZodString;
@@ -77,6 +90,16 @@ export declare const V1HomeHeroSlideSchema: z.ZodDiscriminatedUnion<[z.ZodObject
77
90
  lg: z.ZodString;
78
91
  }, z.core.$strip>;
79
92
  alt: z.ZodString;
93
+ externalLink: z.ZodNullable<z.ZodString>;
94
+ }, z.core.$strip>, z.ZodObject<{
95
+ kind: z.ZodLiteral<"unspecified">;
96
+ images: z.ZodObject<{
97
+ sm: z.ZodString;
98
+ md: z.ZodString;
99
+ lg: z.ZodString;
100
+ }, z.core.$strip>;
101
+ alt: z.ZodString;
102
+ externalLink: z.ZodNullable<z.ZodString>;
80
103
  }, z.core.$strip>], "kind">;
81
104
  export declare const V1HomeCourseCardSchema: z.ZodObject<{
82
105
  title: z.ZodString;
@@ -187,6 +210,7 @@ export declare const V1HomePageResponseSchema: z.ZodObject<{
187
210
  lg: z.ZodString;
188
211
  }, z.core.$strip>;
189
212
  alt: z.ZodString;
213
+ externalLink: z.ZodNullable<z.ZodString>;
190
214
  }, z.core.$strip>, z.ZodObject<{
191
215
  kind: z.ZodLiteral<"activity">;
192
216
  link: z.ZodString;
@@ -196,6 +220,16 @@ export declare const V1HomePageResponseSchema: z.ZodObject<{
196
220
  lg: z.ZodString;
197
221
  }, z.core.$strip>;
198
222
  alt: z.ZodString;
223
+ externalLink: z.ZodNullable<z.ZodString>;
224
+ }, z.core.$strip>, z.ZodObject<{
225
+ kind: z.ZodLiteral<"unspecified">;
226
+ images: z.ZodObject<{
227
+ sm: z.ZodString;
228
+ md: z.ZodString;
229
+ lg: z.ZodString;
230
+ }, z.core.$strip>;
231
+ alt: z.ZodString;
232
+ externalLink: z.ZodNullable<z.ZodString>;
199
233
  }, z.core.$strip>], "kind">>;
200
234
  topBannerText: z.ZodString;
201
235
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/schemas/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAOX,CAAA;AAEtB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBASX,CAAA;AAQ1B,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;iBAUP,CAAA;AAEjC,eAAO,MAAM,6BAA6B;;;;;;;;;iBAOP,CAAA;AAEnC,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;2BAKP,CAAA;AAE3B,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBX,CAAA;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQP,CAAA"}
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/schemas/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAOX,CAAA;AAEtB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBASX,CAAA;AAQ1B,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;iBAWP,CAAA;AAEjC,eAAO,MAAM,6BAA6B;;;;;;;;;;iBAQP,CAAA;AAEnC,eAAO,MAAM,gCAAgC;;;;;;;;;iBAOP,CAAA;AAEtC,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAMP,CAAA;AAE3B,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBX,CAAA;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQP,CAAA"}
@@ -32,15 +32,23 @@ export const V1HomeHeroCourseSlideSchema = z.object({
32
32
  name: z.string()
33
33
  })),
34
34
  images: V1HomeHeroSlideImagesSchema,
35
- alt: z.string()
35
+ alt: z.string(),
36
+ externalLink: z.string().nullable()
36
37
  }).openapi('HomeHeroCourseSlide');
37
38
  export const V1HomeHeroActivitySlideSchema = z.object({
38
39
  kind: z.literal('activity'),
39
40
  link: z.string(),
40
41
  images: V1HomeHeroSlideImagesSchema,
41
- alt: z.string()
42
+ alt: z.string(),
43
+ externalLink: z.string().nullable()
42
44
  }).openapi('HomeHeroActivitySlide');
43
- export const V1HomeHeroSlideSchema = z.discriminatedUnion('kind', [V1HomeHeroCourseSlideSchema, V1HomeHeroActivitySlideSchema]).openapi('HomeHeroSlide');
45
+ export const V1HomeHeroUnspecifiedSlideSchema = z.object({
46
+ kind: z.literal('unspecified'),
47
+ images: V1HomeHeroSlideImagesSchema,
48
+ alt: z.string(),
49
+ externalLink: z.string().nullable()
50
+ }).openapi('HomeHeroUnspecifiedSlide');
51
+ export const V1HomeHeroSlideSchema = z.discriminatedUnion('kind', [V1HomeHeroCourseSlideSchema, V1HomeHeroActivitySlideSchema, V1HomeHeroUnspecifiedSlideSchema]).openapi('HomeHeroSlide');
44
52
  export const V1HomeCourseCardSchema = z.object({
45
53
  title: z.string(),
46
54
  description: z.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"home.js","names":["z","internalServerErrorResponse","V1CourseStatusSchema","PhotoSchema","registry","V1HomePostCardSchema","object","title","string","description","link","image","nullable","openapi","V1HomeActivityCardSchema","badgeText","buttonText","V1HomeHeroSlideImagesSchema","sm","md","lg","V1HomeHeroCourseSlideSchema","kind","literal","slug","subtitle","instructors","array","name","images","alt","V1HomeHeroActivitySlideSchema","V1HomeHeroSlideSchema","discriminatedUnion","V1HomeCourseCardSchema","tags","ogTitle","ogDescription","homePageImageXL","homePageImageL","homePageImageM","homePageImageS","status","launchAt","union","iso","datetime","null","V1HomePageResponseSchema","posts","activities","courses","heroSlides","topBannerText","registerPath","method","path","responses","content","schema"],"sources":["../../src/schemas/home.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { internalServerErrorResponse } from '../responses.js'\nimport { V1CourseStatusSchema } from './course.js'\nimport { PhotoSchema } from './photo.js'\n// TODO: import registry from global registry file instead of from tag.js\nimport { registry } from './registry.js'\n\nexport const V1HomePostCardSchema = z\n .object({\n title: z.string(),\n description: z.string(),\n link: z.string(),\n image: PhotoSchema.nullable(),\n })\n .openapi('PostCard')\n\nexport const V1HomeActivityCardSchema = z\n .object({\n title: z.string(),\n description: z.string(),\n link: z.string(),\n image: PhotoSchema.nullable(),\n badgeText: z.string(),\n buttonText: z.string(),\n })\n .openapi('ActivityCard')\n\nconst V1HomeHeroSlideImagesSchema = z.object({\n sm: z.string(),\n md: z.string(),\n lg: z.string(),\n})\n\nexport const V1HomeHeroCourseSlideSchema = z\n .object({\n kind: z.literal('course'),\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n instructors: z.array(z.object({ name: z.string() })),\n images: V1HomeHeroSlideImagesSchema,\n alt: z.string(),\n })\n .openapi('HomeHeroCourseSlide')\n\nexport const V1HomeHeroActivitySlideSchema = z\n .object({\n kind: z.literal('activity'),\n link: z.string(),\n images: V1HomeHeroSlideImagesSchema,\n alt: z.string(),\n })\n .openapi('HomeHeroActivitySlide')\n\nexport const V1HomeHeroSlideSchema = z\n .discriminatedUnion('kind', [\n V1HomeHeroCourseSlideSchema,\n V1HomeHeroActivitySlideSchema,\n ])\n .openapi('HomeHeroSlide')\n\nexport const V1HomeCourseCardSchema = z\n .object({\n title: z.string(),\n description: z.string(),\n slug: z.string(),\n image: PhotoSchema.nullable(),\n instructors: z.array(z.object({ name: z.string() })),\n tags: z.array(\n z.object({\n slug: z.string(),\n name: z.string(),\n ogTitle: z.string(),\n ogDescription: z.string(),\n homePageImageXL: z.string().nullable(),\n homePageImageL: z.string().nullable(),\n homePageImageM: z.string().nullable(),\n homePageImageS: z.string().nullable(),\n })\n ),\n status: V1CourseStatusSchema,\n launchAt: z.union([z.iso.datetime(), z.null()]),\n })\n .openapi('CourseCard')\n\nexport const V1HomePageResponseSchema = z\n .object({\n posts: z.array(V1HomePostCardSchema),\n activities: z.array(V1HomeActivityCardSchema),\n courses: z.array(V1HomeCourseCardSchema),\n heroSlides: z.array(V1HomeHeroSlideSchema),\n topBannerText: z.string(),\n })\n .openapi('HomePageResponse')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/home',\n tags: ['Home'],\n description: 'Get home page data.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1HomePageResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"home.js","names":["z","internalServerErrorResponse","V1CourseStatusSchema","PhotoSchema","registry","V1HomePostCardSchema","object","title","string","description","link","image","nullable","openapi","V1HomeActivityCardSchema","badgeText","buttonText","V1HomeHeroSlideImagesSchema","sm","md","lg","V1HomeHeroCourseSlideSchema","kind","literal","slug","subtitle","instructors","array","name","images","alt","externalLink","V1HomeHeroActivitySlideSchema","V1HomeHeroUnspecifiedSlideSchema","V1HomeHeroSlideSchema","discriminatedUnion","V1HomeCourseCardSchema","tags","ogTitle","ogDescription","homePageImageXL","homePageImageL","homePageImageM","homePageImageS","status","launchAt","union","iso","datetime","null","V1HomePageResponseSchema","posts","activities","courses","heroSlides","topBannerText","registerPath","method","path","responses","content","schema"],"sources":["../../src/schemas/home.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { internalServerErrorResponse } from '../responses.js'\nimport { V1CourseStatusSchema } from './course.js'\nimport { PhotoSchema } from './photo.js'\n// TODO: import registry from global registry file instead of from tag.js\nimport { registry } from './registry.js'\n\nexport const V1HomePostCardSchema = z\n .object({\n title: z.string(),\n description: z.string(),\n link: z.string(),\n image: PhotoSchema.nullable(),\n })\n .openapi('PostCard')\n\nexport const V1HomeActivityCardSchema = z\n .object({\n title: z.string(),\n description: z.string(),\n link: z.string(),\n image: PhotoSchema.nullable(),\n badgeText: z.string(),\n buttonText: z.string(),\n })\n .openapi('ActivityCard')\n\nconst V1HomeHeroSlideImagesSchema = z.object({\n sm: z.string(),\n md: z.string(),\n lg: z.string(),\n})\n\nexport const V1HomeHeroCourseSlideSchema = z\n .object({\n kind: z.literal('course'),\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n instructors: z.array(z.object({ name: z.string() })),\n images: V1HomeHeroSlideImagesSchema,\n alt: z.string(),\n externalLink: z.string().nullable(),\n })\n .openapi('HomeHeroCourseSlide')\n\nexport const V1HomeHeroActivitySlideSchema = z\n .object({\n kind: z.literal('activity'),\n link: z.string(),\n images: V1HomeHeroSlideImagesSchema,\n alt: z.string(),\n externalLink: z.string().nullable(),\n })\n .openapi('HomeHeroActivitySlide')\n\nexport const V1HomeHeroUnspecifiedSlideSchema = z\n .object({\n kind: z.literal('unspecified'),\n images: V1HomeHeroSlideImagesSchema,\n alt: z.string(),\n externalLink: z.string().nullable(),\n })\n .openapi('HomeHeroUnspecifiedSlide')\n\nexport const V1HomeHeroSlideSchema = z\n .discriminatedUnion('kind', [\n V1HomeHeroCourseSlideSchema,\n V1HomeHeroActivitySlideSchema,\n V1HomeHeroUnspecifiedSlideSchema,\n ])\n .openapi('HomeHeroSlide')\n\nexport const V1HomeCourseCardSchema = z\n .object({\n title: z.string(),\n description: z.string(),\n slug: z.string(),\n image: PhotoSchema.nullable(),\n instructors: z.array(z.object({ name: z.string() })),\n tags: z.array(\n z.object({\n slug: z.string(),\n name: z.string(),\n ogTitle: z.string(),\n ogDescription: z.string(),\n homePageImageXL: z.string().nullable(),\n homePageImageL: z.string().nullable(),\n homePageImageM: z.string().nullable(),\n homePageImageS: z.string().nullable(),\n })\n ),\n status: V1CourseStatusSchema,\n launchAt: z.union([z.iso.datetime(), z.null()]),\n })\n .openapi('CourseCard')\n\nexport const V1HomePageResponseSchema = z\n .object({\n posts: z.array(V1HomePostCardSchema),\n activities: z.array(V1HomeActivityCardSchema),\n courses: z.array(V1HomeCourseCardSchema),\n heroSlides: z.array(V1HomeHeroSlideSchema),\n topBannerText: z.string(),\n })\n .openapi('HomePageResponse')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/home',\n tags: ['Home'],\n description: 'Get home page data.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1HomePageResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twreporter-academy/api-types",
3
- "version": "0.0.30",
3
+ "version": "0.0.32",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": [