@confed/sanity-types 0.1.2 → 0.1.3-2511031831

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.
Files changed (3) hide show
  1. package/README.md +97 -41
  2. package/package.json +1 -1
  3. package/sanity.types.ts +812 -33
package/README.md CHANGED
@@ -2,31 +2,76 @@
2
2
 
3
3
  A TypeScript types package for the Confederation College Sanity CMS backend. This package provides auto-generated TypeScript definitions for all Sanity schema types, ensuring type safety across your frontend applications and API integrations.
4
4
 
5
- > 🎉 **Status: FULLY AUTOMATED** - Types are automatically regenerated on every commit via Husky pre-commit hooks!
5
+ ## Quick Start
6
6
 
7
- ## How It Works
7
+ ### Installation
8
8
 
9
- This package uses [Sanity TypeGen](https://www.sanity.io/docs/sanity-typegen) to automatically generate TypeScript definitions from your Sanity schema. The types are generated from:
9
+ ```bash
10
+ npm install @confed/sanity-types
11
+ ```
10
12
 
11
- 1. **Schema definitions** (`schema.json`) - Contains all your content type schemas
12
- 2. **GROQ queries** - Any TypeScript/JavaScript files in the `src/` directory that contain GROQ queries
13
+ ### Basic Usage
13
14
 
14
- ### Complete Workflow:
15
+ ```typescript
16
+ import type {Program, Event, Person} from '@confed/sanity-types'
15
17
 
16
- 1. **Schema Changes** You modify Sanity schemas
17
- 2. **Local Generation** Pre-commit hook generates types automatically
18
- 3. **Commit** → Types and schema changes committed together
19
- 4. **CI/CD Trigger** → GitHub Actions workflow runs on push
20
- 5. **Verification** → Types regenerated in CI for verification
21
- 6. **Publishing** → If types changed, version bumped and published to npm
22
- 7. **No Circular Commits** → CI never commits back to your repository
18
+ // Use types in your components or API functions
19
+ const program: Program = {
20
+ _id: 'program-123',
21
+ _type: 'program',
22
+ _createdAt: '2024-01-01T00:00:00Z',
23
+ _updatedAt: '2024-01-01T00:00:00Z',
24
+ _rev: 'rev-123',
25
+ name: 'Computer Programming',
26
+ slug: {_type: 'slug', current: 'computer-programming'},
27
+ // ... other required fields
28
+ }
23
29
 
24
- The generated types provide:
30
+ // Type-safe event handling
31
+ const handleEvent = (event: Event) => {
32
+ console.log(event.title) // Full IntelliSense support
33
+ console.log(event.startDate) // Type-safe date access
34
+ }
35
+ ```
25
36
 
26
- - Full type safety for all your content types
27
- - IntelliSense and autocomplete in your IDE
28
- - Compile-time error checking for content structure
29
- - Reference type safety for cross-referenced documents
37
+ ### Advanced Usage
38
+
39
+ ```typescript
40
+ // Import multiple types
41
+ import type {
42
+ Program,
43
+ School,
44
+ Campus,
45
+ Person,
46
+ SanityImageAsset,
47
+ PtBasic
48
+ } from '@confed/sanity-types'
49
+
50
+ // Use with React components
51
+ interface ProgramCardProps {
52
+ program: Program
53
+ school?: School
54
+ }
55
+
56
+ const ProgramCard: React.FC<ProgramCardProps> = ({ program, school }) => {
57
+ return (
58
+ <div>
59
+ <h2>{program.name}</h2>
60
+ {school && <p>School: {school.name}</p>}
61
+ {program.description && (
62
+ <div>{/* Portable text content */}</div>
63
+ )}
64
+ </div>
65
+ )
66
+ }
67
+
68
+ // Use with API functions
69
+ async function fetchProgram(id: string): Promise<Program | null> {
70
+ const response = await fetch(`/api/programs/${id}`)
71
+ if (!response.ok) return null
72
+ return response.json() as Promise<Program>
73
+ }
74
+ ```
30
75
 
31
76
  ## Available Types
32
77
 
@@ -77,35 +122,36 @@ The generated types provide:
77
122
  - **`Geopoint`** - Geographic coordinates
78
123
  - **`MediaTag`** - Media tagging system
79
124
 
80
- ## Installation
125
+ ## How It Works
81
126
 
82
- ```bash
83
- npm install @confed/sanity-types
84
- ```
127
+ This package uses [Sanity TypeGen](https://www.sanity.io/docs/sanity-typegen) to automatically generate TypeScript definitions from your Sanity schema. The types are generated from:
85
128
 
86
- ## Usage
129
+ 1. **Schema definitions** (`schema.json`) - Contains all your content type schemas
130
+ 2. **GROQ queries** - Any TypeScript/JavaScript files in the `src/` directory that contain GROQ queries
87
131
 
88
- ```typescript
89
- import type {Program, Event, Person} from '@confed/sanity-types'
132
+ ### Complete Workflow:
90
133
 
91
- // Use types in your components or API functions
92
- const program: Program = {
93
- _id: 'program-123',
94
- _type: 'program',
95
- _createdAt: '2024-01-01T00:00:00Z',
96
- _updatedAt: '2024-01-01T00:00:00Z',
97
- _rev: 'rev-123',
98
- name: 'Computer Programming',
99
- slug: {_type: 'slug', current: 'computer-programming'},
100
- // ... other required fields
101
- }
102
- ```
134
+ 1. **Schema Changes** You modify Sanity schemas
135
+ 2. **Local Generation** Pre-commit hook generates types automatically
136
+ 3. **Commit** → Types and schema changes committed together
137
+ 4. **CI/CD Trigger** → GitHub Actions workflow runs on push
138
+ 5. **Verification** → Types regenerated in CI for verification
139
+ 6. **Publishing** → If types changed, version bumped and published to npm
140
+ 7. **Sanity Deployment** → Separate workflow deploys Sanity Studio (handled by `.github/workflows/deploy-sanity.yml`)
141
+ 8. **No Circular Commits** → CI never commits back to your repository
142
+
143
+ The generated types provide:
144
+
145
+ - Full type safety for all your content types
146
+ - IntelliSense and autocomplete in your IDE
147
+ - Compile-time error checking for content structure
148
+ - Reference type safety for cross-referenced documents
103
149
 
104
150
  ## Keeping Types Up to Date
105
151
 
106
152
  The types in this package are automatically generated and should **never be manually edited**. This project is configured with automatic type generation on every commit, so types stay current automatically.
107
153
 
108
- **Current Status:** ✅ **FULLY AUTOMATED** - Types are regenerated on every commit via Husky pre-commit hooks, and automatically published to npm via CI/CD when changes are detected.
154
+ **Current Status:** Types are regenerated on every commit via Husky pre-commit hooks, and automatically published to npm via CI/CD when changes are detected.
109
155
 
110
156
  **Workflow:**
111
157
 
@@ -156,17 +202,27 @@ git commit -m "your message"
156
202
 
157
203
  ### 4. CI/CD Integration (Automated Publishing)
158
204
 
159
- This project has automated CI/CD that handles npm publishing when types change:
205
+ This project has automated CI/CD workflows that handle different concerns:
206
+
207
+ **Types Publishing** (`.github/workflows/publish-types.yml`):
160
208
 
161
209
  ```yaml
162
- # .github/workflows/publish-types.yml
163
210
  # Automatically runs on schema changes:
164
211
  # - Generates types in CI for verification
165
212
  # - Bumps version and publishes to npm if types changed
166
213
  # - Does NOT commit back to repository (no circular commits)
167
214
  ```
168
215
 
169
- **Note:** The CI workflow only handles publishing to npm. Type generation and commits are handled locally via pre-commit hooks.
216
+ **Sanity Studio Deployment** (`.github/workflows/deploy-sanity.yml`):
217
+
218
+ ```yaml
219
+ # Automatically deploys Sanity Studio on schema/config changes:
220
+ # - Builds the Sanity Studio
221
+ # - Deploys to Sanity hosting
222
+ # - Separate from types publishing workflow
223
+ ```
224
+
225
+ **Note:** The CI workflows are separated by concern. Type generation and commits are handled locally via pre-commit hooks.
170
226
 
171
227
  ## Configuration
172
228
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@confed/sanity-types",
3
- "version": "0.1.2",
3
+ "version": "0.1.3-2511031831",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [
package/sanity.types.ts CHANGED
@@ -13,6 +13,588 @@
13
13
  */
14
14
 
15
15
  // Source: schema.json
16
+ export type HeaderSection = {
17
+ _type: 'headerSection'
18
+ header: string
19
+ eyebrow?: string
20
+ introText?: string
21
+ options?: {
22
+ headerLevel?: 'h1' | 'h2' | 'h3' | 'h4'
23
+ backgroundColor?: 'light' | 'dark' | 'white' | 'black'
24
+ topSpacing?: 'default' | 'minimum' | 'none'
25
+ bottomSpacing?: 'none' | 'default' | 'minimum'
26
+ }
27
+ }
28
+
29
+ export type MediaTextSection = {
30
+ _type: 'mediaTextSection'
31
+ text: Array<
32
+ | {
33
+ children?: Array<{
34
+ marks?: Array<string>
35
+ text?: string
36
+ _type: 'span'
37
+ _key: string
38
+ }>
39
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
40
+ listItem?: 'bullet' | 'number'
41
+ markDefs?: Array<{
42
+ href?: string
43
+ openInNewTab?: boolean
44
+ _type: 'link'
45
+ _key: string
46
+ }>
47
+ level?: number
48
+ _type: 'block'
49
+ _key: string
50
+ }
51
+ | {
52
+ asset?: {
53
+ _ref: string
54
+ _type: 'reference'
55
+ _weak?: boolean
56
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
57
+ }
58
+ media?: unknown
59
+ hotspot?: SanityImageHotspot
60
+ crop?: SanityImageCrop
61
+ altText: string
62
+ caption?: string
63
+ _type: 'figure'
64
+ _key: string
65
+ }
66
+ | ({
67
+ _key: string
68
+ } & PtButton)
69
+ | {
70
+ url: string
71
+ title?: string
72
+ _type: 'ptYoutubeVideo'
73
+ _key: string
74
+ }
75
+ | {
76
+ body: Array<{
77
+ children?: Array<{
78
+ marks?: Array<string>
79
+ text?: string
80
+ _type: 'span'
81
+ _key: string
82
+ }>
83
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
84
+ listItem?: 'bullet' | 'number'
85
+ markDefs?: Array<{
86
+ href?: string
87
+ openInNewTab?: boolean
88
+ _type: 'link'
89
+ _key: string
90
+ }>
91
+ level?: number
92
+ _type: 'block'
93
+ _key: string
94
+ }>
95
+ kind: 'info' | 'tip' | 'important' | 'warning' | 'caution'
96
+ _type: 'note'
97
+ _key: string
98
+ }
99
+ | ({
100
+ _key: string
101
+ } & Table)
102
+ | {
103
+ title?: string
104
+ embedCode: Code
105
+ height?: number
106
+ responsive?: boolean
107
+ _type: 'embed'
108
+ _key: string
109
+ }
110
+ >
111
+ buttons?: Array<
112
+ {
113
+ _key: string
114
+ } & PtButton
115
+ >
116
+ image: {
117
+ asset?: {
118
+ _ref: string
119
+ _type: 'reference'
120
+ _weak?: boolean
121
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
122
+ }
123
+ media?: unknown
124
+ hotspot?: SanityImageHotspot
125
+ crop?: SanityImageCrop
126
+ altText: string
127
+ caption?: string
128
+ _type: 'accessibleImage'
129
+ }
130
+ options?: {
131
+ backgroundColor?: 'light' | 'dark' | 'white' | 'black'
132
+ imagePosition?: 'left' | 'right'
133
+ spacing?: 'default' | 'minimum' | 'none'
134
+ reverseOnMobile?: boolean
135
+ }
136
+ }
137
+
138
+ export type RichTextSection = {
139
+ _type: 'richTextSection'
140
+ content?: Array<
141
+ | {
142
+ children?: Array<{
143
+ marks?: Array<string>
144
+ text?: string
145
+ _type: 'span'
146
+ _key: string
147
+ }>
148
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
149
+ listItem?: 'bullet' | 'number'
150
+ markDefs?: Array<{
151
+ href?: string
152
+ openInNewTab?: boolean
153
+ _type: 'link'
154
+ _key: string
155
+ }>
156
+ level?: number
157
+ _type: 'block'
158
+ _key: string
159
+ }
160
+ | {
161
+ asset?: {
162
+ _ref: string
163
+ _type: 'reference'
164
+ _weak?: boolean
165
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
166
+ }
167
+ media?: unknown
168
+ hotspot?: SanityImageHotspot
169
+ crop?: SanityImageCrop
170
+ altText: string
171
+ caption?: string
172
+ _type: 'figure'
173
+ _key: string
174
+ }
175
+ | ({
176
+ _key: string
177
+ } & PtButton)
178
+ | {
179
+ url: string
180
+ title?: string
181
+ _type: 'ptYoutubeVideo'
182
+ _key: string
183
+ }
184
+ | {
185
+ body: Array<{
186
+ children?: Array<{
187
+ marks?: Array<string>
188
+ text?: string
189
+ _type: 'span'
190
+ _key: string
191
+ }>
192
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
193
+ listItem?: 'bullet' | 'number'
194
+ markDefs?: Array<{
195
+ href?: string
196
+ openInNewTab?: boolean
197
+ _type: 'link'
198
+ _key: string
199
+ }>
200
+ level?: number
201
+ _type: 'block'
202
+ _key: string
203
+ }>
204
+ kind: 'info' | 'tip' | 'important' | 'warning' | 'caution'
205
+ _type: 'note'
206
+ _key: string
207
+ }
208
+ | ({
209
+ _key: string
210
+ } & Table)
211
+ | {
212
+ title?: string
213
+ embedCode: Code
214
+ height?: number
215
+ responsive?: boolean
216
+ _type: 'embed'
217
+ _key: string
218
+ }
219
+ >
220
+ }
221
+
222
+ export type GallerySection = {
223
+ _type: 'gallerySection'
224
+ title?: string
225
+ introduction?: Array<
226
+ | {
227
+ children?: Array<{
228
+ marks?: Array<string>
229
+ text?: string
230
+ _type: 'span'
231
+ _key: string
232
+ }>
233
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
234
+ listItem?: 'bullet' | 'number'
235
+ markDefs?: Array<{
236
+ href?: string
237
+ openInNewTab?: boolean
238
+ _type: 'link'
239
+ _key: string
240
+ }>
241
+ level?: number
242
+ _type: 'block'
243
+ _key: string
244
+ }
245
+ | {
246
+ asset?: {
247
+ _ref: string
248
+ _type: 'reference'
249
+ _weak?: boolean
250
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
251
+ }
252
+ media?: unknown
253
+ hotspot?: SanityImageHotspot
254
+ crop?: SanityImageCrop
255
+ altText: string
256
+ caption?: string
257
+ _type: 'figure'
258
+ _key: string
259
+ }
260
+ | ({
261
+ _key: string
262
+ } & PtButton)
263
+ | {
264
+ url: string
265
+ title?: string
266
+ _type: 'ptYoutubeVideo'
267
+ _key: string
268
+ }
269
+ | {
270
+ body: Array<{
271
+ children?: Array<{
272
+ marks?: Array<string>
273
+ text?: string
274
+ _type: 'span'
275
+ _key: string
276
+ }>
277
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
278
+ listItem?: 'bullet' | 'number'
279
+ markDefs?: Array<{
280
+ href?: string
281
+ openInNewTab?: boolean
282
+ _type: 'link'
283
+ _key: string
284
+ }>
285
+ level?: number
286
+ _type: 'block'
287
+ _key: string
288
+ }>
289
+ kind: 'info' | 'tip' | 'important' | 'warning' | 'caution'
290
+ _type: 'note'
291
+ _key: string
292
+ }
293
+ | ({
294
+ _key: string
295
+ } & Table)
296
+ | {
297
+ title?: string
298
+ embedCode: Code
299
+ height?: number
300
+ responsive?: boolean
301
+ _type: 'embed'
302
+ _key: string
303
+ }
304
+ >
305
+ images?: Array<{
306
+ asset?: {
307
+ _ref: string
308
+ _type: 'reference'
309
+ _weak?: boolean
310
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
311
+ }
312
+ media?: unknown
313
+ hotspot?: SanityImageHotspot
314
+ crop?: SanityImageCrop
315
+ altText: string
316
+ caption?: string
317
+ _type: 'accessibleImage'
318
+ _key: string
319
+ }>
320
+ layout?: 'grid' | 'carousel'
321
+ }
322
+
323
+ export type StaffListSection = {
324
+ _type: 'staffListSection'
325
+ title?: string
326
+ intro?: Array<
327
+ | {
328
+ children?: Array<{
329
+ marks?: Array<string>
330
+ text?: string
331
+ _type: 'span'
332
+ _key: string
333
+ }>
334
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
335
+ listItem?: 'bullet' | 'number'
336
+ markDefs?: Array<{
337
+ href?: string
338
+ openInNewTab?: boolean
339
+ _type: 'link'
340
+ _key: string
341
+ }>
342
+ level?: number
343
+ _type: 'block'
344
+ _key: string
345
+ }
346
+ | {
347
+ asset?: {
348
+ _ref: string
349
+ _type: 'reference'
350
+ _weak?: boolean
351
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
352
+ }
353
+ media?: unknown
354
+ hotspot?: SanityImageHotspot
355
+ crop?: SanityImageCrop
356
+ altText: string
357
+ caption?: string
358
+ _type: 'figure'
359
+ _key: string
360
+ }
361
+ | ({
362
+ _key: string
363
+ } & PtButton)
364
+ | {
365
+ url: string
366
+ title?: string
367
+ _type: 'ptYoutubeVideo'
368
+ _key: string
369
+ }
370
+ | {
371
+ body: Array<{
372
+ children?: Array<{
373
+ marks?: Array<string>
374
+ text?: string
375
+ _type: 'span'
376
+ _key: string
377
+ }>
378
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
379
+ listItem?: 'bullet' | 'number'
380
+ markDefs?: Array<{
381
+ href?: string
382
+ openInNewTab?: boolean
383
+ _type: 'link'
384
+ _key: string
385
+ }>
386
+ level?: number
387
+ _type: 'block'
388
+ _key: string
389
+ }>
390
+ kind: 'info' | 'tip' | 'important' | 'warning' | 'caution'
391
+ _type: 'note'
392
+ _key: string
393
+ }
394
+ | ({
395
+ _key: string
396
+ } & Table)
397
+ | {
398
+ title?: string
399
+ embedCode: Code
400
+ height?: number
401
+ responsive?: boolean
402
+ _type: 'embed'
403
+ _key: string
404
+ }
405
+ >
406
+ staffMembers?: Array<{
407
+ _ref: string
408
+ _type: 'reference'
409
+ _weak?: boolean
410
+ _key: string
411
+ [internalGroqTypeReferenceTo]?: 'person'
412
+ }>
413
+ layout?: 'grid' | 'list' | 'cards'
414
+ displayOptions?: {
415
+ showPhotos?: boolean
416
+ showContactInfo?: boolean
417
+ showDescription?: boolean
418
+ }
419
+ }
420
+
421
+ export type FaqSection = {
422
+ _type: 'faqSection'
423
+ title?: string
424
+ intro?: Array<
425
+ | {
426
+ children?: Array<{
427
+ marks?: Array<string>
428
+ text?: string
429
+ _type: 'span'
430
+ _key: string
431
+ }>
432
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
433
+ listItem?: 'bullet' | 'number'
434
+ markDefs?: Array<{
435
+ href?: string
436
+ openInNewTab?: boolean
437
+ _type: 'link'
438
+ _key: string
439
+ }>
440
+ level?: number
441
+ _type: 'block'
442
+ _key: string
443
+ }
444
+ | {
445
+ asset?: {
446
+ _ref: string
447
+ _type: 'reference'
448
+ _weak?: boolean
449
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
450
+ }
451
+ media?: unknown
452
+ hotspot?: SanityImageHotspot
453
+ crop?: SanityImageCrop
454
+ altText: string
455
+ caption?: string
456
+ _type: 'figure'
457
+ _key: string
458
+ }
459
+ | ({
460
+ _key: string
461
+ } & PtButton)
462
+ | {
463
+ url: string
464
+ title?: string
465
+ _type: 'ptYoutubeVideo'
466
+ _key: string
467
+ }
468
+ | {
469
+ body: Array<{
470
+ children?: Array<{
471
+ marks?: Array<string>
472
+ text?: string
473
+ _type: 'span'
474
+ _key: string
475
+ }>
476
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
477
+ listItem?: 'bullet' | 'number'
478
+ markDefs?: Array<{
479
+ href?: string
480
+ openInNewTab?: boolean
481
+ _type: 'link'
482
+ _key: string
483
+ }>
484
+ level?: number
485
+ _type: 'block'
486
+ _key: string
487
+ }>
488
+ kind: 'info' | 'tip' | 'important' | 'warning' | 'caution'
489
+ _type: 'note'
490
+ _key: string
491
+ }
492
+ | ({
493
+ _key: string
494
+ } & Table)
495
+ | {
496
+ title?: string
497
+ embedCode: Code
498
+ height?: number
499
+ responsive?: boolean
500
+ _type: 'embed'
501
+ _key: string
502
+ }
503
+ >
504
+ layout?: 'accordion' | 'list' | 'twoCols'
505
+ items?: Array<
506
+ {
507
+ _key: string
508
+ } & FaqItem
509
+ >
510
+ }
511
+
512
+ export type FaqItem = {
513
+ _type: 'faqItem'
514
+ question: string
515
+ answer: Array<
516
+ | {
517
+ children?: Array<{
518
+ marks?: Array<string>
519
+ text?: string
520
+ _type: 'span'
521
+ _key: string
522
+ }>
523
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
524
+ listItem?: 'bullet' | 'number'
525
+ markDefs?: Array<{
526
+ href?: string
527
+ openInNewTab?: boolean
528
+ _type: 'link'
529
+ _key: string
530
+ }>
531
+ level?: number
532
+ _type: 'block'
533
+ _key: string
534
+ }
535
+ | {
536
+ asset?: {
537
+ _ref: string
538
+ _type: 'reference'
539
+ _weak?: boolean
540
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
541
+ }
542
+ media?: unknown
543
+ hotspot?: SanityImageHotspot
544
+ crop?: SanityImageCrop
545
+ altText: string
546
+ caption?: string
547
+ _type: 'figure'
548
+ _key: string
549
+ }
550
+ | ({
551
+ _key: string
552
+ } & PtButton)
553
+ | {
554
+ url: string
555
+ title?: string
556
+ _type: 'ptYoutubeVideo'
557
+ _key: string
558
+ }
559
+ | {
560
+ body: Array<{
561
+ children?: Array<{
562
+ marks?: Array<string>
563
+ text?: string
564
+ _type: 'span'
565
+ _key: string
566
+ }>
567
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
568
+ listItem?: 'bullet' | 'number'
569
+ markDefs?: Array<{
570
+ href?: string
571
+ openInNewTab?: boolean
572
+ _type: 'link'
573
+ _key: string
574
+ }>
575
+ level?: number
576
+ _type: 'block'
577
+ _key: string
578
+ }>
579
+ kind: 'info' | 'tip' | 'important' | 'warning' | 'caution'
580
+ _type: 'note'
581
+ _key: string
582
+ }
583
+ | ({
584
+ _key: string
585
+ } & Table)
586
+ | {
587
+ title?: string
588
+ embedCode: Code
589
+ height?: number
590
+ responsive?: boolean
591
+ _type: 'embed'
592
+ _key: string
593
+ }
594
+ >
595
+ anchorId?: Slug
596
+ }
597
+
16
598
  export type MenuItem = {
17
599
  _type: 'menuItem'
18
600
  link: Link
@@ -100,21 +682,59 @@ export type PtBasic = Array<
100
682
  _type: 'figure'
101
683
  _key: string
102
684
  }
103
- | {
104
- variant?: 'primary' | 'outlined'
105
- text: string
106
- link: string
107
- _type: 'ptButton'
685
+ | ({
108
686
  _key: string
109
- }
687
+ } & PtButton)
110
688
  | {
111
689
  url: string
112
690
  title?: string
113
691
  _type: 'ptYoutubeVideo'
114
692
  _key: string
115
693
  }
694
+ | {
695
+ body: Array<{
696
+ children?: Array<{
697
+ marks?: Array<string>
698
+ text?: string
699
+ _type: 'span'
700
+ _key: string
701
+ }>
702
+ style?: 'normal' | 'lead' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote'
703
+ listItem?: 'bullet' | 'number'
704
+ markDefs?: Array<{
705
+ href?: string
706
+ openInNewTab?: boolean
707
+ _type: 'link'
708
+ _key: string
709
+ }>
710
+ level?: number
711
+ _type: 'block'
712
+ _key: string
713
+ }>
714
+ kind: 'info' | 'tip' | 'important' | 'warning' | 'caution'
715
+ _type: 'note'
716
+ _key: string
717
+ }
718
+ | ({
719
+ _key: string
720
+ } & Table)
721
+ | {
722
+ title?: string
723
+ embedCode: Code
724
+ height?: number
725
+ responsive?: boolean
726
+ _type: 'embed'
727
+ _key: string
728
+ }
116
729
  >
117
730
 
731
+ export type PtButton = {
732
+ _type: 'ptButton'
733
+ variant?: 'primary' | 'outlined'
734
+ text: string
735
+ link: string
736
+ }
737
+
118
738
  export type Figure = {
119
739
  _type: 'figure'
120
740
  asset?: {
@@ -290,7 +910,7 @@ export type NewsArticle = {
290
910
  _type: 'accessibleImage'
291
911
  }
292
912
  body?: PtBasic
293
- categories: Array<'media' | 'students' | 'employee'>
913
+ categories: Array<'media' | 'students' | 'employee' | 'alumni'>
294
914
  dateCreated?: string
295
915
  seo?: Seo
296
916
  }
@@ -303,7 +923,48 @@ export type Webpage = {
303
923
  _rev: string
304
924
  title: string
305
925
  slug: Slug
926
+ heroDescription?: string
927
+ heroButtons?: Array<
928
+ {
929
+ _key: string
930
+ } & PtButton
931
+ >
932
+ mainImage?: {
933
+ asset?: {
934
+ _ref: string
935
+ _type: 'reference'
936
+ _weak?: boolean
937
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
938
+ }
939
+ media?: unknown
940
+ hotspot?: SanityImageHotspot
941
+ crop?: SanityImageCrop
942
+ altText: string
943
+ caption?: string
944
+ _type: 'accessibleImage'
945
+ }
946
+ introduction?: string
306
947
  body?: PtBasic
948
+ pageBuilder?: Array<
949
+ | ({
950
+ _key: string
951
+ } & MediaTextSection)
952
+ | ({
953
+ _key: string
954
+ } & HeaderSection)
955
+ | ({
956
+ _key: string
957
+ } & FaqSection)
958
+ | ({
959
+ _key: string
960
+ } & StaffListSection)
961
+ | ({
962
+ _key: string
963
+ } & GallerySection)
964
+ | ({
965
+ _key: string
966
+ } & RichTextSection)
967
+ >
307
968
  parentPage?:
308
969
  | {
309
970
  _ref: string
@@ -330,8 +991,36 @@ export type Webpage = {
330
991
  [internalGroqTypeReferenceTo]?: 'area'
331
992
  }
332
993
  pageType: 'webpage' | 'department'
994
+ departmentContactDetails?: PtBasic
333
995
  isPublished?: boolean
334
- mainImage?: {
996
+ relatedMenu?: {
997
+ _ref: string
998
+ _type: 'reference'
999
+ _weak?: boolean
1000
+ [internalGroqTypeReferenceTo]?: 'menu'
1001
+ }
1002
+ seo?: Seo
1003
+ }
1004
+
1005
+ export type Facility = {
1006
+ _id: string
1007
+ _type: 'facility'
1008
+ _createdAt: string
1009
+ _updatedAt: string
1010
+ _rev: string
1011
+ title: string
1012
+ slug: Slug
1013
+ campus: {
1014
+ _ref: string
1015
+ _type: 'reference'
1016
+ _weak?: boolean
1017
+ [internalGroqTypeReferenceTo]?: 'campus'
1018
+ }
1019
+ description?: PtBasic
1020
+ isActive?: boolean
1021
+ address?: CanadianAddress
1022
+ tourLink?: string
1023
+ image?: {
335
1024
  asset?: {
336
1025
  _ref: string
337
1026
  _type: 'reference'
@@ -345,9 +1034,33 @@ export type Webpage = {
345
1034
  caption?: string
346
1035
  _type: 'accessibleImage'
347
1036
  }
1037
+ gallery?: Array<{
1038
+ asset?: {
1039
+ _ref: string
1040
+ _type: 'reference'
1041
+ _weak?: boolean
1042
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
1043
+ }
1044
+ media?: unknown
1045
+ hotspot?: SanityImageHotspot
1046
+ crop?: SanityImageCrop
1047
+ altText: string
1048
+ caption?: string
1049
+ _type: 'accessibleImage'
1050
+ _key: string
1051
+ }>
348
1052
  seo?: Seo
349
1053
  }
350
1054
 
1055
+ export type CanadianAddress = {
1056
+ _type: 'canadianAddress'
1057
+ streetAddress: string
1058
+ city: string
1059
+ province: 'AB' | 'BC' | 'MB' | 'NB' | 'NL' | 'NT' | 'NS' | 'NU' | 'ON' | 'PE' | 'QC' | 'SK' | 'YT'
1060
+ postalCode: string
1061
+ country?: string
1062
+ }
1063
+
351
1064
  export type ProgramFile = {
352
1065
  _id: string
353
1066
  _type: 'programFile'
@@ -355,7 +1068,6 @@ export type ProgramFile = {
355
1068
  _updatedAt: string
356
1069
  _rev: string
357
1070
  title: string
358
- description?: string
359
1071
  file: {
360
1072
  asset?: {
361
1073
  _ref: string
@@ -373,6 +1085,7 @@ export type ProgramFile = {
373
1085
  | 'courseOutline'
374
1086
  | 'studentGuide'
375
1087
  | 'other'
1088
+ description?: string
376
1089
  isActive?: boolean
377
1090
  }
378
1091
 
@@ -421,10 +1134,10 @@ export type Campus = {
421
1134
  _updatedAt: string
422
1135
  _rev: string
423
1136
  title: string
424
- slug: Slug
425
1137
  code: string
1138
+ city?: string
1139
+ slug: Slug
426
1140
  isEnabled?: boolean
427
- description?: string
428
1141
  image?: {
429
1142
  asset?: {
430
1143
  _ref: string
@@ -439,6 +1152,16 @@ export type Campus = {
439
1152
  caption?: string
440
1153
  _type: 'accessibleImage'
441
1154
  }
1155
+ description?: PtBasic
1156
+ virtualTourUrl?: string
1157
+ staff?: Array<{
1158
+ _ref: string
1159
+ _type: 'reference'
1160
+ _weak?: boolean
1161
+ _key: string
1162
+ [internalGroqTypeReferenceTo]?: 'person'
1163
+ }>
1164
+ seo?: Seo
442
1165
  }
443
1166
 
444
1167
  export type Area = {
@@ -480,7 +1203,7 @@ export type ProgramIntake = {
480
1203
  [internalGroqTypeReferenceTo]?: 'program'
481
1204
  }
482
1205
  programCode: string
483
- season: 'Fall' | 'Winter' | 'Spring' | 'Summer' | 'Any Time'
1206
+ season: 'Fall' | 'Winter' | 'Spring' | 'Summer' | 'Fall, Winter, Spring' | 'Any Time'
484
1207
  duration: {
485
1208
  _ref: string
486
1209
  _type: 'reference'
@@ -575,6 +1298,21 @@ export type Program = {
575
1298
  caption?: string
576
1299
  _type: 'accessibleImage'
577
1300
  }
1301
+ gallery?: Array<{
1302
+ asset?: {
1303
+ _ref: string
1304
+ _type: 'reference'
1305
+ _weak?: boolean
1306
+ [internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
1307
+ }
1308
+ media?: unknown
1309
+ hotspot?: SanityImageHotspot
1310
+ crop?: SanityImageCrop
1311
+ altText: string
1312
+ caption?: string
1313
+ _type: 'accessibleImage'
1314
+ _key: string
1315
+ }>
578
1316
  school?: {
579
1317
  _ref: string
580
1318
  _type: 'reference'
@@ -709,12 +1447,14 @@ export type Credential = {
709
1447
  category:
710
1448
  | 'certificate'
711
1449
  | 'diploma'
712
- | 'advancedDiploma'
713
1450
  | 'degree'
1451
+ | 'apprenticeship'
714
1452
  | 'microCredential'
715
1453
  | 'recognition'
716
1454
  | 'externalCertification'
1455
+ credentialScope?: 'postsecondary' | 'vocational' | 'apprenticeship'
717
1456
  description?: string
1457
+ sortOrder: number
718
1458
  isEnabled?: boolean
719
1459
  }
720
1460
 
@@ -769,7 +1509,14 @@ export type Person = {
769
1509
  lastName: string
770
1510
  suffixes?: Array<string>
771
1511
  slug: Slug
772
- jobTitle?: string
1512
+ email?: string
1513
+ phone?: string
1514
+ mobilePhone?: string
1515
+ socialLinks?: Array<{
1516
+ platform?: string
1517
+ url?: string
1518
+ _key: string
1519
+ }>
773
1520
  image?: {
774
1521
  asset?: {
775
1522
  _ref: string
@@ -784,14 +1531,11 @@ export type Person = {
784
1531
  caption?: string
785
1532
  _type: 'accessibleImage'
786
1533
  }
787
- email?: string
788
- phone?: string
789
- socialLinks?: Array<{
790
- platform?: string
791
- url?: string
792
- _key: string
793
- }>
794
- siteRoles?: Array<'faculty' | 'staff' | 'recruitment' | 'testimonial' | 'dean'>
1534
+ jobTitle?: string
1535
+ siteRoles?: Array<
1536
+ 'faculty' | 'staff' | 'recruitment' | 'internationalRecruitment' | 'testimonial' | 'dean'
1537
+ >
1538
+ recruitmentConnectLink?: string
795
1539
  affiliations?: Array<{
796
1540
  program?: {
797
1541
  _ref: string
@@ -838,6 +1582,28 @@ export type AccessibleImage = {
838
1582
  caption?: string
839
1583
  }
840
1584
 
1585
+ export type Code = {
1586
+ _type: 'code'
1587
+ language?: string
1588
+ filename?: string
1589
+ code?: string
1590
+ highlightedLines?: Array<number>
1591
+ }
1592
+
1593
+ export type Table = {
1594
+ _type: 'table'
1595
+ rows?: Array<
1596
+ {
1597
+ _key: string
1598
+ } & TableRow
1599
+ >
1600
+ }
1601
+
1602
+ export type TableRow = {
1603
+ _type: 'tableRow'
1604
+ cells?: Array<string>
1605
+ }
1606
+
841
1607
  export type MediaTag = {
842
1608
  _id: string
843
1609
  _type: 'media.tag'
@@ -868,25 +1634,25 @@ export type SanityImagePalette = {
868
1634
 
869
1635
  export type SanityImageDimensions = {
870
1636
  _type: 'sanity.imageDimensions'
871
- height?: number
872
- width?: number
873
- aspectRatio?: number
1637
+ height: number
1638
+ width: number
1639
+ aspectRatio: number
874
1640
  }
875
1641
 
876
1642
  export type SanityImageHotspot = {
877
1643
  _type: 'sanity.imageHotspot'
878
- x?: number
879
- y?: number
880
- height?: number
881
- width?: number
1644
+ x: number
1645
+ y: number
1646
+ height: number
1647
+ width: number
882
1648
  }
883
1649
 
884
1650
  export type SanityImageCrop = {
885
1651
  _type: 'sanity.imageCrop'
886
- top?: number
887
- bottom?: number
888
- left?: number
889
- right?: number
1652
+ top: number
1653
+ bottom: number
1654
+ left: number
1655
+ right: number
890
1656
  }
891
1657
 
892
1658
  export type SanityFileAsset = {
@@ -966,14 +1732,24 @@ export type SanityAssetSourceData = {
966
1732
  }
967
1733
 
968
1734
  export type AllSanitySchemaTypes =
1735
+ | HeaderSection
1736
+ | MediaTextSection
1737
+ | RichTextSection
1738
+ | GallerySection
1739
+ | StaffListSection
1740
+ | FaqSection
1741
+ | FaqItem
969
1742
  | MenuItem
970
1743
  | Link
971
1744
  | PtBasic
1745
+ | PtButton
972
1746
  | Figure
973
1747
  | Redirect
974
1748
  | Event
975
1749
  | NewsArticle
976
1750
  | Webpage
1751
+ | Facility
1752
+ | CanadianAddress
977
1753
  | ProgramFile
978
1754
  | Testimonial
979
1755
  | Campus
@@ -988,6 +1764,9 @@ export type AllSanitySchemaTypes =
988
1764
  | School
989
1765
  | Person
990
1766
  | AccessibleImage
1767
+ | Code
1768
+ | Table
1769
+ | TableRow
991
1770
  | MediaTag
992
1771
  | SanityImagePaletteSwatch
993
1772
  | SanityImagePalette