schemaorg-kit 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2145 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AccommodationSchema: () => AccommodationSchema,
24
+ AggregateOfferSchema: () => AggregateOfferSchema,
25
+ AggregateRatingSchema: () => AggregateRatingSchema,
26
+ AnswerSchema: () => AnswerSchema,
27
+ ApplicationCategory: () => ApplicationCategory,
28
+ ArticleSchema: () => ArticleSchema,
29
+ BedDetailsSchema: () => BedDetailsSchema,
30
+ BedTypeEnum: () => BedTypeEnum,
31
+ BlogPostingSchema: () => BlogPostingSchema,
32
+ BookEditionSchema: () => BookEditionSchema,
33
+ BookFormatType: () => BookFormatType,
34
+ BookSchema: () => BookSchema,
35
+ BorrowActionSchema: () => BorrowActionSchema,
36
+ BroadcastEventSchema: () => BroadcastEventSchema,
37
+ CertificationSchema: () => CertificationSchema,
38
+ ClipSchema: () => ClipSchema,
39
+ ContactPointSchema: () => ContactPointSchema,
40
+ CourseInstanceSchema: () => CourseInstanceSchema,
41
+ CourseSchema: () => CourseSchema,
42
+ CreativeWorkSchema: () => CreativeWorkSchema,
43
+ DatasetSchema: () => DatasetSchema,
44
+ DayOfWeek: () => DayOfWeek,
45
+ DefinedRegionSchema: () => DefinedRegionSchema,
46
+ DiscussionForumPostingSchema: () => DiscussionForumPostingSchema,
47
+ EmployerAggregateRatingSchema: () => EmployerAggregateRatingSchema,
48
+ EmploymentType: () => EmploymentType,
49
+ EventAttendanceMode: () => EventAttendanceMode,
50
+ EventSchema: () => EventSchema,
51
+ EventStatusType: () => EventStatusType,
52
+ FAQPageSchema: () => FAQPageSchema,
53
+ GeoCoordinatesSchema: () => GeoCoordinatesSchema,
54
+ HowToSectionSchema: () => HowToSectionSchema,
55
+ HowToStepSchema: () => HowToStepSchema,
56
+ ImageObjectSchema: () => ImageObjectSchema,
57
+ ImageOrUrl: () => ImageOrUrl,
58
+ ItemAvailability: () => ItemAvailability,
59
+ ItemListSchema: () => ItemListSchema,
60
+ JobPostingSchema: () => JobPostingSchema,
61
+ LanguageSchema: () => LanguageSchema,
62
+ ListItemSchema: () => ListItemSchema,
63
+ LocalBusinessSchema: () => LocalBusinessSchema,
64
+ MathSolverSchema: () => MathSolverSchema,
65
+ MerchantReturnPolicySchema: () => MerchantReturnPolicySchema,
66
+ MonetaryAmountSchema: () => MonetaryAmountSchema,
67
+ MovieSchema: () => MovieSchema,
68
+ NewsArticleSchema: () => NewsArticleSchema,
69
+ NutritionInformationSchema: () => NutritionInformationSchema,
70
+ OfferSchema: () => OfferSchema,
71
+ OfferShippingDetailsSchema: () => OfferShippingDetailsSchema,
72
+ OpeningHoursSpecificationSchema: () => OpeningHoursSpecificationSchema,
73
+ OrganizationSchema: () => OrganizationSchema,
74
+ PersonOrOrgRef: () => PersonOrOrgRef,
75
+ PersonSchema: () => PersonSchema,
76
+ PlaceSchema: () => PlaceSchema,
77
+ PostalAddressSchema: () => PostalAddressSchema,
78
+ PriceSpecificationSchema: () => PriceSpecificationSchema,
79
+ ProductGroupSchema: () => ProductGroupSchema,
80
+ ProductSchema: () => ProductSchema,
81
+ ProfilePageSchema: () => ProfilePageSchema,
82
+ PronounceableTextSchema: () => PronounceableTextSchema,
83
+ PropertyValueSchema: () => PropertyValueSchema,
84
+ QAPageSchema: () => QAPageSchema,
85
+ QuestionSchema: () => QuestionSchema,
86
+ QuizSchema: () => QuizSchema,
87
+ RatingSchema: () => RatingSchema,
88
+ ReadActionSchema: () => ReadActionSchema,
89
+ RecipeSchema: () => RecipeSchema,
90
+ ReviewSchema: () => ReviewSchema,
91
+ SchemaGraph: () => SchemaGraph,
92
+ SchemaNode: () => SchemaNode,
93
+ ShippingDeliveryTimeSchema: () => ShippingDeliveryTimeSchema,
94
+ SoftwareApplicationSchema: () => SoftwareApplicationSchema,
95
+ SolveMathActionSchema: () => SolveMathActionSchema,
96
+ ThingSchema: () => ThingSchema,
97
+ ThreeDModelSchema: () => ThreeDModelSchema,
98
+ VacationRentalSchema: () => VacationRentalSchema,
99
+ VideoObjectSchema: () => VideoObjectSchema,
100
+ WebPageSchema: () => WebPageSchema,
101
+ WebSiteSchema: () => WebSiteSchema,
102
+ createArticle: () => createArticle,
103
+ createBlogPosting: () => createBlogPosting,
104
+ createBook: () => createBook,
105
+ createBreadcrumbList: () => createBreadcrumbList,
106
+ createCarousel: () => createCarousel,
107
+ createCorporation: () => createCorporation,
108
+ createCourse: () => createCourse,
109
+ createDataset: () => createDataset,
110
+ createDiscussionForumPosting: () => createDiscussionForumPosting,
111
+ createEvent: () => createEvent,
112
+ createFAQPage: () => createFAQPage2,
113
+ createGraph: () => createGraph,
114
+ createHotel: () => createHotel,
115
+ createImageObject: () => createImageObject,
116
+ createItemList: () => createItemList,
117
+ createJobPosting: () => createJobPosting,
118
+ createLanguage: () => createLanguage,
119
+ createLocalBusiness: () => createLocalBusiness,
120
+ createMathSolver: () => createMathSolver,
121
+ createMobileApplication: () => createMobileApplication,
122
+ createMovie: () => createMovie,
123
+ createNGO: () => createNGO,
124
+ createNewsArticle: () => createNewsArticle,
125
+ createOffer: () => createOffer,
126
+ createOnlineBusiness: () => createOnlineBusiness,
127
+ createOnlineStore: () => createOnlineStore,
128
+ createOrganization: () => createOrganization,
129
+ createPaywalledArticle: () => createPaywalledArticle,
130
+ createPaywalledWebPage: () => createPaywalledWebPage,
131
+ createPerson: () => createPerson,
132
+ createPlace: () => createPlace,
133
+ createProduct: () => createProduct,
134
+ createProductGroup: () => createProductGroup,
135
+ createProfilePage: () => createProfilePage,
136
+ createPronounceableText: () => createPronounceableText,
137
+ createQAPage: () => createQAPage,
138
+ createQuestion: () => createQuestion,
139
+ createQuiz: () => createQuiz,
140
+ createRecipe: () => createRecipe,
141
+ createRestaurant: () => createRestaurant,
142
+ createSoftwareApplication: () => createSoftwareApplication,
143
+ createVacationRental: () => createVacationRental,
144
+ createVideoObject: () => createVideoObject,
145
+ createWebApplication: () => createWebApplication,
146
+ createWebPage: () => createWebPage,
147
+ createWebSite: () => createWebSite,
148
+ extendThing: () => extendThing,
149
+ makeFactory: () => makeFactory,
150
+ schema: () => schema
151
+ });
152
+ module.exports = __toCommonJS(index_exports);
153
+
154
+ // src/core/base.ts
155
+ var import_zod = require("zod");
156
+ var SchemaNode = class {
157
+ constructor(schema2, data) {
158
+ this.schema = schema2;
159
+ this.data = data;
160
+ }
161
+ /** Returns the raw validated object */
162
+ toObject() {
163
+ return this.data;
164
+ }
165
+ /** Returns a JSON-LD ready object with @context */
166
+ toJsonLd() {
167
+ return {
168
+ "@context": "https://schema.org",
169
+ ...this.data
170
+ };
171
+ }
172
+ /** Returns a <script type="application/ld+json"> tag string */
173
+ toScript() {
174
+ return `<script type="application/ld+json">
175
+ ${JSON.stringify(this.toJsonLd(), null, 2)}
176
+ </script>`;
177
+ }
178
+ /** Returns prettified JSON string */
179
+ toString() {
180
+ return JSON.stringify(this.toJsonLd(), null, 2);
181
+ }
182
+ /** Validates and throws if invalid — useful in CI/build steps */
183
+ validate() {
184
+ this.schema.parse(this.data);
185
+ return this;
186
+ }
187
+ /** Safe validation — returns errors without throwing */
188
+ safeParse() {
189
+ return this.schema.safeParse(this.data);
190
+ }
191
+ };
192
+ function makeFactory(schema2) {
193
+ return (data) => {
194
+ const parsed = schema2.parse(data);
195
+ return new SchemaNode(schema2, parsed);
196
+ };
197
+ }
198
+
199
+ // src/types/things/Person.ts
200
+ var import_zod5 = require("zod");
201
+
202
+ // src/types/things/Thing.ts
203
+ var import_zod4 = require("zod");
204
+
205
+ // src/types/shared/ImageObject.ts
206
+ var import_zod3 = require("zod");
207
+
208
+ // src/types/shared/PersonOrOrgRef.ts
209
+ var import_zod2 = require("zod");
210
+ var PersonOrOrgRef = import_zod2.z.union([
211
+ import_zod2.z.string(),
212
+ // Accept any Person or Organization object — including full schema outputs via .toObject().
213
+ // .catchall() allows extra fields; name/url are optional to match ThingSchema's base types.
214
+ import_zod2.z.object({ "@type": import_zod2.z.literal("Person") }).catchall(import_zod2.z.unknown()),
215
+ import_zod2.z.object({ "@type": import_zod2.z.literal("Organization") }).catchall(import_zod2.z.unknown())
216
+ ]);
217
+
218
+ // src/types/shared/ImageObject.ts
219
+ var ImageObjectSchema = import_zod3.z.object({
220
+ "@type": import_zod3.z.literal("ImageObject").default("ImageObject"),
221
+ url: import_zod3.z.url(),
222
+ contentUrl: import_zod3.z.url().optional(),
223
+ width: import_zod3.z.union([
224
+ import_zod3.z.number(),
225
+ import_zod3.z.object({ "@type": import_zod3.z.literal("QuantitativeValue"), value: import_zod3.z.number(), unitCode: import_zod3.z.string().optional() })
226
+ ]).optional(),
227
+ height: import_zod3.z.union([
228
+ import_zod3.z.number(),
229
+ import_zod3.z.object({ "@type": import_zod3.z.literal("QuantitativeValue"), value: import_zod3.z.number(), unitCode: import_zod3.z.string().optional() })
230
+ ]).optional(),
231
+ caption: import_zod3.z.string().optional(),
232
+ description: import_zod3.z.string().optional(),
233
+ name: import_zod3.z.string().optional(),
234
+ // Google image metadata requirements:
235
+ creator: PersonOrOrgRef.optional(),
236
+ creditText: import_zod3.z.string().optional(),
237
+ copyrightNotice: import_zod3.z.string().optional(),
238
+ license: import_zod3.z.url().optional(),
239
+ acquireLicensePage: import_zod3.z.url().optional(),
240
+ representativeOfPage: import_zod3.z.boolean().optional(),
241
+ encodingFormat: import_zod3.z.string().optional(),
242
+ // MIME type, e.g. "image/jpeg"
243
+ uploadDate: import_zod3.z.string().optional(),
244
+ thumbnailUrl: import_zod3.z.url().optional(),
245
+ embedUrl: import_zod3.z.url().optional()
246
+ });
247
+ var ImageOrUrl = import_zod3.z.union([import_zod3.z.url(), ImageObjectSchema]);
248
+ var createImageObject = makeFactory(ImageObjectSchema);
249
+
250
+ // src/types/things/Thing.ts
251
+ var AnyThingRef = import_zod4.z.lazy(
252
+ () => import_zod4.z.object({ "@type": import_zod4.z.string() }).catchall(import_zod4.z.unknown())
253
+ );
254
+ var ThingSchema = import_zod4.z.object({
255
+ "@type": import_zod4.z.string(),
256
+ // JSON-LD node identifier — useful for @graph cross-references
257
+ "@id": import_zod4.z.string().optional(),
258
+ // Core identity
259
+ name: import_zod4.z.string().optional(),
260
+ description: import_zod4.z.string().optional(),
261
+ url: import_zod4.z.url().optional(),
262
+ identifier: import_zod4.z.union([import_zod4.z.string(), import_zod4.z.number()]).optional(),
263
+ // Media — single image or array (Google recommends multiple aspect ratios)
264
+ image: import_zod4.z.union([ImageOrUrl, import_zod4.z.array(ImageOrUrl)]).optional(),
265
+ // Discovery
266
+ sameAs: import_zod4.z.union([import_zod4.z.url(), import_zod4.z.array(import_zod4.z.url())]).optional(),
267
+ alternateName: import_zod4.z.string().optional(),
268
+ // Relationships (loose refs to avoid circular type inference)
269
+ subjectOf: AnyThingRef.optional(),
270
+ mainEntityOfPage: import_zod4.z.union([import_zod4.z.url(), AnyThingRef]).optional()
271
+ });
272
+ function extendThing(type, shape) {
273
+ return ThingSchema.extend({
274
+ "@type": import_zod4.z.literal(type).default(type),
275
+ ...shape
276
+ });
277
+ }
278
+
279
+ // src/types/things/Person.ts
280
+ var PersonSchema = extendThing("Person", {
281
+ givenName: import_zod5.z.string().optional(),
282
+ familyName: import_zod5.z.string().optional(),
283
+ email: import_zod5.z.string().email().optional(),
284
+ telephone: import_zod5.z.string().optional(),
285
+ jobTitle: import_zod5.z.string().optional(),
286
+ worksFor: import_zod5.z.lazy(() => import_zod5.z.object({ "@type": import_zod5.z.string(), name: import_zod5.z.string() })).optional(),
287
+ birthDate: import_zod5.z.string().optional(),
288
+ // ISO 8601
289
+ gender: import_zod5.z.enum(["Male", "Female", "Unknown"]).optional(),
290
+ nationality: import_zod5.z.string().optional(),
291
+ address: import_zod5.z.object({
292
+ "@type": import_zod5.z.literal("PostalAddress"),
293
+ streetAddress: import_zod5.z.string().optional(),
294
+ addressLocality: import_zod5.z.string().optional(),
295
+ addressRegion: import_zod5.z.string().optional(),
296
+ postalCode: import_zod5.z.string().optional(),
297
+ addressCountry: import_zod5.z.string().optional()
298
+ }).optional()
299
+ });
300
+ var createPerson = makeFactory(PersonSchema);
301
+
302
+ // src/types/things/Organization.ts
303
+ var import_zod11 = require("zod");
304
+
305
+ // src/types/shared/PostalAddress.ts
306
+ var import_zod6 = require("zod");
307
+ var PostalAddressSchema = import_zod6.z.object({
308
+ "@type": import_zod6.z.literal("PostalAddress").default("PostalAddress"),
309
+ streetAddress: import_zod6.z.string().optional(),
310
+ addressLocality: import_zod6.z.string().optional(),
311
+ // city
312
+ addressRegion: import_zod6.z.string().optional(),
313
+ // state/province
314
+ postalCode: import_zod6.z.string().optional(),
315
+ addressCountry: import_zod6.z.string().optional(),
316
+ // ISO 3166-1 alpha-2, e.g. "US"
317
+ postOfficeBoxNumber: import_zod6.z.string().optional()
318
+ });
319
+
320
+ // src/types/shared/ContactPoint.ts
321
+ var import_zod7 = require("zod");
322
+ var ContactPointSchema = import_zod7.z.object({
323
+ "@type": import_zod7.z.literal("ContactPoint").default("ContactPoint"),
324
+ telephone: import_zod7.z.string().optional(),
325
+ contactType: import_zod7.z.string().optional(),
326
+ // e.g. "customer support", "sales"
327
+ email: import_zod7.z.string().email().optional(),
328
+ areaServed: import_zod7.z.union([import_zod7.z.string(), import_zod7.z.array(import_zod7.z.string())]).optional(),
329
+ availableLanguage: import_zod7.z.union([import_zod7.z.string(), import_zod7.z.array(import_zod7.z.string())]).optional(),
330
+ hoursAvailable: import_zod7.z.string().optional(),
331
+ contactOption: import_zod7.z.string().optional()
332
+ // e.g. "TollFree", "HearingImpairedSupported"
333
+ });
334
+
335
+ // src/types/shared/Offer.ts
336
+ var import_zod10 = require("zod");
337
+
338
+ // src/types/shared/ShippingDetails.ts
339
+ var import_zod9 = require("zod");
340
+
341
+ // src/types/shared/OpeningHoursSpecification.ts
342
+ var import_zod8 = require("zod");
343
+ var DayOfWeek = import_zod8.z.enum([
344
+ "Monday",
345
+ "Tuesday",
346
+ "Wednesday",
347
+ "Thursday",
348
+ "Friday",
349
+ "Saturday",
350
+ "Sunday"
351
+ ]);
352
+ var OpeningHoursSpecificationSchema = import_zod8.z.object({
353
+ "@type": import_zod8.z.literal("OpeningHoursSpecification").default("OpeningHoursSpecification"),
354
+ dayOfWeek: import_zod8.z.union([DayOfWeek, import_zod8.z.array(DayOfWeek)]),
355
+ opens: import_zod8.z.string().optional(),
356
+ // "HH:MM:SS" e.g. "09:00:00"
357
+ closes: import_zod8.z.string().optional(),
358
+ // "HH:MM:SS" e.g. "17:00:00"
359
+ validFrom: import_zod8.z.string().optional(),
360
+ // ISO 8601 date — for seasonal hours
361
+ validThrough: import_zod8.z.string().optional()
362
+ // ISO 8601 date
363
+ });
364
+
365
+ // src/types/shared/ShippingDetails.ts
366
+ var DefinedRegionSchema = import_zod9.z.object({
367
+ "@type": import_zod9.z.literal("DefinedRegion").default("DefinedRegion"),
368
+ name: import_zod9.z.string().optional(),
369
+ /** ISO 3166-1 alpha-2 country code, e.g. "US", "GB" */
370
+ addressCountry: import_zod9.z.string().optional(),
371
+ /** State/province code(s) */
372
+ addressRegion: import_zod9.z.union([import_zod9.z.string(), import_zod9.z.array(import_zod9.z.string())]).optional(),
373
+ /** Postal code prefix(es) */
374
+ postalCodePrefix: import_zod9.z.union([import_zod9.z.string(), import_zod9.z.array(import_zod9.z.string())]).optional(),
375
+ /** Postal code range */
376
+ postalCodeRange: import_zod9.z.object({
377
+ postalCodeBegin: import_zod9.z.string(),
378
+ postalCodeEnd: import_zod9.z.string()
379
+ }).optional()
380
+ });
381
+ var QuantitativeDaysSchema = import_zod9.z.object({
382
+ "@type": import_zod9.z.literal("QuantitativeValue").default("QuantitativeValue"),
383
+ minValue: import_zod9.z.number().int().nonnegative().optional(),
384
+ maxValue: import_zod9.z.number().int().nonnegative().optional(),
385
+ /** Unit code — always "DAY" for delivery times */
386
+ unitCode: import_zod9.z.string().default("DAY")
387
+ });
388
+ var ShippingDeliveryTimeSchema = import_zod9.z.object({
389
+ "@type": import_zod9.z.literal("ShippingDeliveryTime").default("ShippingDeliveryTime"),
390
+ /** Days the warehouse processes orders (e.g. Mon–Fri) */
391
+ businessDays: import_zod9.z.object({
392
+ "@type": import_zod9.z.literal("OpeningHoursSpecification").default("OpeningHoursSpecification"),
393
+ dayOfWeek: import_zod9.z.union([DayOfWeek, import_zod9.z.array(DayOfWeek)])
394
+ }).optional(),
395
+ /** Order processing/packing time in days */
396
+ handlingTime: QuantitativeDaysSchema.optional(),
397
+ /** Transit time in days after dispatch */
398
+ transitTime: QuantitativeDaysSchema.optional(),
399
+ /** Cutoff time for same-day processing, ISO 8601 time, e.g. "14:00:00" */
400
+ cutoffTime: import_zod9.z.string().optional()
401
+ });
402
+ var OfferShippingDetailsSchema = import_zod9.z.object({
403
+ "@type": import_zod9.z.literal("OfferShippingDetails").default("OfferShippingDetails"),
404
+ /** Shipping cost as a MonetaryAmount (use value: 0 for free shipping) */
405
+ shippingRate: import_zod9.z.object({
406
+ "@type": import_zod9.z.literal("MonetaryAmount").default("MonetaryAmount"),
407
+ value: import_zod9.z.number(),
408
+ currency: import_zod9.z.string()
409
+ }).optional(),
410
+ /** Region(s) this shipping option applies to */
411
+ shippingDestination: import_zod9.z.union([
412
+ DefinedRegionSchema,
413
+ import_zod9.z.array(DefinedRegionSchema)
414
+ ]).optional(),
415
+ /** Expected delivery time */
416
+ deliveryTime: ShippingDeliveryTimeSchema.optional(),
417
+ /** Set to true to indicate item cannot be shipped to a destination */
418
+ doesNotShip: import_zod9.z.boolean().optional(),
419
+ /** Human-readable shipping label, e.g. "Free Shipping", "Express Delivery" */
420
+ shippingLabel: import_zod9.z.string().optional()
421
+ });
422
+
423
+ // src/types/shared/Offer.ts
424
+ var ItemAvailability = import_zod10.z.enum([
425
+ "InStock",
426
+ "OutOfStock",
427
+ "PreOrder",
428
+ "Discontinued",
429
+ "LimitedAvailability",
430
+ "SoldOut",
431
+ "OnlineOnly",
432
+ "InStoreOnly",
433
+ "BackOrder"
434
+ ]).transform((v) => `https://schema.org/${v}`);
435
+ var OfferSchema = import_zod10.z.object({
436
+ "@type": import_zod10.z.literal("Offer").default("Offer"),
437
+ price: import_zod10.z.union([import_zod10.z.number(), import_zod10.z.string()]),
438
+ priceCurrency: import_zod10.z.string().length(3),
439
+ // ISO 4217, e.g. "USD"
440
+ availability: ItemAvailability.optional(),
441
+ validFrom: import_zod10.z.string().optional(),
442
+ // ISO 8601
443
+ validThrough: import_zod10.z.string().optional(),
444
+ // ISO 8601
445
+ url: import_zod10.z.url().optional(),
446
+ seller: import_zod10.z.object({ "@type": import_zod10.z.string(), name: import_zod10.z.string() }).optional(),
447
+ category: import_zod10.z.string().optional(),
448
+ inventoryLevel: import_zod10.z.object({
449
+ "@type": import_zod10.z.literal("QuantitativeValue").default("QuantitativeValue"),
450
+ value: import_zod10.z.number()
451
+ }).optional(),
452
+ priceValidUntil: import_zod10.z.string().optional(),
453
+ // ISO 8601 date — Google Product requirement
454
+ shippingDetails: import_zod10.z.union([
455
+ OfferShippingDetailsSchema,
456
+ import_zod10.z.array(OfferShippingDetailsSchema)
457
+ ]).optional(),
458
+ hasMerchantReturnPolicy: import_zod10.z.lazy(
459
+ () => import_zod10.z.object({ "@type": import_zod10.z.string() }).catchall(import_zod10.z.unknown())
460
+ ).optional()
461
+ });
462
+ var MerchantReturnPolicySchema = import_zod10.z.object({
463
+ "@type": import_zod10.z.literal("MerchantReturnPolicy").default("MerchantReturnPolicy"),
464
+ applicableCountry: import_zod10.z.union([import_zod10.z.string(), import_zod10.z.array(import_zod10.z.string())]).optional(),
465
+ returnPolicyCategory: import_zod10.z.string().optional(),
466
+ // schema.org enum URL
467
+ merchantReturnDays: import_zod10.z.number().int().nonnegative().optional(),
468
+ returnMethod: import_zod10.z.string().optional(),
469
+ // schema.org enum URL
470
+ returnFees: import_zod10.z.string().optional(),
471
+ // schema.org enum URL
472
+ refundType: import_zod10.z.string().optional()
473
+ // schema.org enum URL
474
+ });
475
+ var createOffer = makeFactory(OfferSchema);
476
+ var AggregateOfferSchema = import_zod10.z.object({
477
+ "@type": import_zod10.z.literal("AggregateOffer").default("AggregateOffer"),
478
+ lowPrice: import_zod10.z.number().optional(),
479
+ highPrice: import_zod10.z.number().optional(),
480
+ priceCurrency: import_zod10.z.string().length(3).optional(),
481
+ // ISO 4217
482
+ offerCount: import_zod10.z.number().int().nonnegative().optional(),
483
+ offers: import_zod10.z.union([OfferSchema, import_zod10.z.array(OfferSchema)]).optional(),
484
+ availability: ItemAvailability.optional(),
485
+ url: import_zod10.z.url().optional()
486
+ });
487
+
488
+ // src/types/things/Organization.ts
489
+ var NestedOrgRef = import_zod11.z.lazy(
490
+ () => import_zod11.z.object({ "@type": import_zod11.z.string(), name: import_zod11.z.string().optional() }).catchall(import_zod11.z.unknown())
491
+ );
492
+ var OrganizationSchema = extendThing("Organization", {
493
+ legalName: import_zod11.z.string().optional(),
494
+ email: import_zod11.z.email().optional(),
495
+ telephone: import_zod11.z.string().optional(),
496
+ logo: ImageOrUrl.optional(),
497
+ foundingDate: import_zod11.z.string().optional(),
498
+ // ISO 8601 date
499
+ numberOfEmployees: import_zod11.z.object({
500
+ "@type": import_zod11.z.literal("QuantitativeValue").default("QuantitativeValue"),
501
+ value: import_zod11.z.number()
502
+ }).optional(),
503
+ address: import_zod11.z.union([import_zod11.z.string(), PostalAddressSchema]).optional(),
504
+ contactPoint: import_zod11.z.union([ContactPointSchema, import_zod11.z.array(ContactPointSchema)]).optional(),
505
+ // Google Organization requirements:
506
+ vatID: import_zod11.z.string().optional(),
507
+ iso6523Code: import_zod11.z.string().optional(),
508
+ // e.g. "0060:123456789" (DUNS)
509
+ taxID: import_zod11.z.string().optional(),
510
+ leiCode: import_zod11.z.string().optional(),
511
+ duns: import_zod11.z.string().optional(),
512
+ // Merchant-related (Google seller identity signals):
513
+ hasMerchantReturnPolicy: MerchantReturnPolicySchema.optional(),
514
+ hasShippingService: import_zod11.z.lazy(
515
+ () => import_zod11.z.object({ "@type": import_zod11.z.string() }).catchall(import_zod11.z.unknown())
516
+ ).optional(),
517
+ // Hierarchical organization (loose refs to avoid circular type inference):
518
+ subOrganization: NestedOrgRef.optional(),
519
+ parentOrganization: NestedOrgRef.optional(),
520
+ sameAs: import_zod11.z.union([import_zod11.z.url(), import_zod11.z.array(import_zod11.z.url())]).optional()
521
+ });
522
+ var createOrganization = makeFactory(OrganizationSchema);
523
+ var createNGO = makeFactory(
524
+ OrganizationSchema.extend({ "@type": import_zod11.z.literal("NGO").default("NGO") })
525
+ );
526
+ var createCorporation = makeFactory(
527
+ OrganizationSchema.extend({ "@type": import_zod11.z.literal("Corporation").default("Corporation") })
528
+ );
529
+ var createOnlineStore = makeFactory(
530
+ OrganizationSchema.extend({ "@type": import_zod11.z.literal("OnlineStore").default("OnlineStore") })
531
+ );
532
+ var createOnlineBusiness = makeFactory(
533
+ OrganizationSchema.extend({ "@type": import_zod11.z.literal("OnlineBusiness").default("OnlineBusiness") })
534
+ );
535
+
536
+ // src/types/things/Product.ts
537
+ var import_zod13 = require("zod");
538
+
539
+ // src/types/shared/Rating.ts
540
+ var import_zod12 = require("zod");
541
+ var RatingSchema = import_zod12.z.object({
542
+ "@type": import_zod12.z.literal("Rating").default("Rating"),
543
+ ratingValue: import_zod12.z.union([import_zod12.z.number(), import_zod12.z.string()]),
544
+ bestRating: import_zod12.z.union([import_zod12.z.number(), import_zod12.z.string()]).default(5),
545
+ worstRating: import_zod12.z.union([import_zod12.z.number(), import_zod12.z.string()]).default(1),
546
+ ratingExplanation: import_zod12.z.string().optional(),
547
+ reviewAspect: import_zod12.z.string().optional()
548
+ });
549
+ var AggregateRatingSchema = import_zod12.z.object({
550
+ "@type": import_zod12.z.literal("AggregateRating").default("AggregateRating"),
551
+ ratingValue: import_zod12.z.union([import_zod12.z.number(), import_zod12.z.string()]),
552
+ reviewCount: import_zod12.z.number().int().nonnegative().optional(),
553
+ ratingCount: import_zod12.z.number().int().nonnegative().optional(),
554
+ bestRating: import_zod12.z.union([import_zod12.z.number(), import_zod12.z.string()]).default(5),
555
+ worstRating: import_zod12.z.union([import_zod12.z.number(), import_zod12.z.string()]).default(1)
556
+ });
557
+ var ReviewSchema = import_zod12.z.object({
558
+ "@type": import_zod12.z.literal("Review").default("Review"),
559
+ reviewBody: import_zod12.z.string().optional(),
560
+ reviewRating: RatingSchema.optional(),
561
+ author: PersonOrOrgRef,
562
+ datePublished: import_zod12.z.string().optional(),
563
+ // ISO 8601 date
564
+ publisher: PersonOrOrgRef.optional(),
565
+ // itemReviewed: any Thing — kept loose to avoid circular imports
566
+ itemReviewed: import_zod12.z.lazy(
567
+ () => import_zod12.z.object({ "@type": import_zod12.z.string() }).passthrough()
568
+ ).optional(),
569
+ name: import_zod12.z.string().optional(),
570
+ // Review headline
571
+ url: import_zod12.z.string().url().optional()
572
+ });
573
+ var EmployerAggregateRatingSchema = AggregateRatingSchema.extend({
574
+ "@type": import_zod12.z.literal("EmployerAggregateRating").default("EmployerAggregateRating"),
575
+ itemReviewed: import_zod12.z.lazy(
576
+ () => import_zod12.z.object({ "@type": import_zod12.z.string(), name: import_zod12.z.string() }).passthrough()
577
+ ).optional()
578
+ });
579
+
580
+ // src/types/things/Product.ts
581
+ var CertificationSchema = import_zod13.z.object({
582
+ "@type": import_zod13.z.literal("Certification").default("Certification"),
583
+ name: import_zod13.z.string(),
584
+ url: import_zod13.z.url().optional(),
585
+ issuedBy: import_zod13.z.object({
586
+ "@type": import_zod13.z.literal("Organization").default("Organization"),
587
+ name: import_zod13.z.string(),
588
+ url: import_zod13.z.url().optional()
589
+ }).optional(),
590
+ certificationRatingValue: import_zod13.z.string().optional(),
591
+ certificationStatus: import_zod13.z.string().optional(),
592
+ validFrom: import_zod13.z.string().optional(),
593
+ validThrough: import_zod13.z.string().optional()
594
+ });
595
+ var ThreeDModelSchema = import_zod13.z.object({
596
+ "@type": import_zod13.z.literal("3DModel").default("3DModel"),
597
+ contentUrl: import_zod13.z.url(),
598
+ /** MIME type, e.g. "model/gltf-binary", "model/gltf+json" */
599
+ encodingFormat: import_zod13.z.string().optional(),
600
+ name: import_zod13.z.string().optional()
601
+ });
602
+ var LooseProductRef = import_zod13.z.lazy(
603
+ () => import_zod13.z.object({ "@type": import_zod13.z.string() }).catchall(import_zod13.z.unknown())
604
+ );
605
+ var LooseProductGroupRef = import_zod13.z.lazy(
606
+ () => import_zod13.z.object({ "@type": import_zod13.z.string() }).catchall(import_zod13.z.unknown())
607
+ );
608
+ var ProductSchema = extendThing("Product", {
609
+ sku: import_zod13.z.string().optional(),
610
+ // GTIN identifiers (Google Product requirement):
611
+ gtin: import_zod13.z.string().optional(),
612
+ gtin8: import_zod13.z.string().optional(),
613
+ gtin12: import_zod13.z.string().optional(),
614
+ gtin13: import_zod13.z.string().optional(),
615
+ gtin14: import_zod13.z.string().optional(),
616
+ mpn: import_zod13.z.string().optional(),
617
+ // Manufacturer Part Number
618
+ brand: import_zod13.z.union([
619
+ import_zod13.z.string(),
620
+ import_zod13.z.object({
621
+ "@type": import_zod13.z.union([import_zod13.z.literal("Brand"), import_zod13.z.literal("Organization")]),
622
+ name: import_zod13.z.string()
623
+ })
624
+ ]).optional(),
625
+ offers: import_zod13.z.union([
626
+ OfferSchema,
627
+ AggregateOfferSchema,
628
+ import_zod13.z.array(import_zod13.z.union([OfferSchema, AggregateOfferSchema]))
629
+ ]).optional(),
630
+ aggregateRating: AggregateRatingSchema.optional(),
631
+ review: import_zod13.z.union([ReviewSchema, import_zod13.z.array(ReviewSchema)]).optional(),
632
+ category: import_zod13.z.string().optional(),
633
+ color: import_zod13.z.string().optional(),
634
+ material: import_zod13.z.string().optional(),
635
+ weight: import_zod13.z.object({
636
+ "@type": import_zod13.z.literal("QuantitativeValue").default("QuantitativeValue"),
637
+ value: import_zod13.z.number(),
638
+ unitCode: import_zod13.z.string()
639
+ }).optional(),
640
+ image: import_zod13.z.union([ImageOrUrl, import_zod13.z.array(ImageOrUrl)]).optional(),
641
+ hasMerchantReturnPolicy: MerchantReturnPolicySchema.optional(),
642
+ isVariantOf: LooseProductGroupRef.optional(),
643
+ /** Certifications (CE, Energy Star, Fair Trade, etc.) */
644
+ hasCertification: import_zod13.z.union([CertificationSchema, import_zod13.z.array(CertificationSchema)]).optional(),
645
+ /** 3D models for interactive product views in Google Search/Images */
646
+ subjectOf: import_zod13.z.union([ThreeDModelSchema, import_zod13.z.array(ThreeDModelSchema)]).optional()
647
+ });
648
+ var ProductGroupSchema = extendThing("ProductGroup", {
649
+ variesBy: import_zod13.z.union([import_zod13.z.string(), import_zod13.z.array(import_zod13.z.string())]).optional(),
650
+ hasVariant: import_zod13.z.array(LooseProductRef).optional(),
651
+ productGroupID: import_zod13.z.string().optional(),
652
+ sku: import_zod13.z.string().optional(),
653
+ gtin: import_zod13.z.string().optional(),
654
+ brand: import_zod13.z.union([
655
+ import_zod13.z.string(),
656
+ import_zod13.z.object({
657
+ "@type": import_zod13.z.union([import_zod13.z.literal("Brand"), import_zod13.z.literal("Organization")]),
658
+ name: import_zod13.z.string()
659
+ })
660
+ ]).optional(),
661
+ offers: import_zod13.z.union([OfferSchema, import_zod13.z.array(OfferSchema)]).optional(),
662
+ aggregateRating: AggregateRatingSchema.optional(),
663
+ image: import_zod13.z.union([ImageOrUrl, import_zod13.z.array(ImageOrUrl)]).optional()
664
+ });
665
+ var createProduct = makeFactory(ProductSchema);
666
+ var createProductGroup = makeFactory(ProductGroupSchema);
667
+
668
+ // src/types/things/Event.ts
669
+ var import_zod15 = require("zod");
670
+
671
+ // src/types/shared/VideoObject.ts
672
+ var import_zod14 = require("zod");
673
+ var ClipSchema = import_zod14.z.object({
674
+ "@type": import_zod14.z.literal("Clip").default("Clip"),
675
+ name: import_zod14.z.string(),
676
+ startOffset: import_zod14.z.number(),
677
+ // seconds from start
678
+ endOffset: import_zod14.z.number().optional(),
679
+ // seconds from start
680
+ url: import_zod14.z.url().optional()
681
+ // URL pointing to this clip
682
+ });
683
+ var BroadcastEventSchema = import_zod14.z.object({
684
+ "@type": import_zod14.z.literal("BroadcastEvent").default("BroadcastEvent"),
685
+ isLiveBroadcast: import_zod14.z.boolean().optional(),
686
+ startDate: import_zod14.z.string().optional(),
687
+ // ISO 8601
688
+ endDate: import_zod14.z.string().optional()
689
+ });
690
+ var VideoObjectSchema = import_zod14.z.object({
691
+ "@type": import_zod14.z.literal("VideoObject").default("VideoObject"),
692
+ // Required by Google:
693
+ name: import_zod14.z.string(),
694
+ thumbnailUrl: import_zod14.z.union([import_zod14.z.url(), import_zod14.z.array(import_zod14.z.url())]),
695
+ uploadDate: import_zod14.z.string(),
696
+ // ISO 8601 date
697
+ // Recommended by Google:
698
+ description: import_zod14.z.string().optional(),
699
+ duration: import_zod14.z.string().optional(),
700
+ // ISO 8601 duration, e.g. "PT1M54S"
701
+ contentUrl: import_zod14.z.url().optional(),
702
+ embedUrl: import_zod14.z.url().optional(),
703
+ // Optional:
704
+ expires: import_zod14.z.string().optional(),
705
+ // ISO 8601 — when video is no longer available
706
+ hasPart: import_zod14.z.array(ClipSchema).optional(),
707
+ interactionStatistic: import_zod14.z.object({
708
+ "@type": import_zod14.z.literal("InteractionCounter").default("InteractionCounter"),
709
+ interactionType: import_zod14.z.literal("https://schema.org/WatchAction").default("https://schema.org/WatchAction"),
710
+ userInteractionCount: import_zod14.z.number().int().nonnegative()
711
+ }).optional(),
712
+ regionsAllowed: import_zod14.z.union([import_zod14.z.string(), import_zod14.z.array(import_zod14.z.string())]).optional(),
713
+ ineligibleRegion: import_zod14.z.union([import_zod14.z.string(), import_zod14.z.array(import_zod14.z.string())]).optional(),
714
+ requiresSubscription: import_zod14.z.boolean().optional(),
715
+ isLiveBroadcast: import_zod14.z.boolean().optional(),
716
+ publication: BroadcastEventSchema.optional(),
717
+ thumbnail: ImageOrUrl.optional()
718
+ });
719
+ var createVideoObject = makeFactory(VideoObjectSchema);
720
+
721
+ // src/types/things/Event.ts
722
+ var EventStatusType = import_zod15.z.enum([
723
+ "EventScheduled",
724
+ "EventCancelled",
725
+ "EventMovedOnline",
726
+ "EventPostponed",
727
+ "EventRescheduled"
728
+ ]).transform((v) => `https://schema.org/${v}`);
729
+ var EventAttendanceMode = import_zod15.z.enum([
730
+ "OfflineEventAttendanceMode",
731
+ "OnlineEventAttendanceMode",
732
+ "MixedEventAttendanceMode"
733
+ ]).transform((v) => `https://schema.org/${v}`);
734
+ var PlaceRef = import_zod15.z.union([
735
+ import_zod15.z.string(),
736
+ import_zod15.z.object({
737
+ "@type": import_zod15.z.literal("Place"),
738
+ name: import_zod15.z.string().optional(),
739
+ address: import_zod15.z.union([import_zod15.z.string(), PostalAddressSchema]).optional(),
740
+ url: import_zod15.z.url().optional()
741
+ }),
742
+ import_zod15.z.object({
743
+ "@type": import_zod15.z.literal("VirtualLocation"),
744
+ url: import_zod15.z.url(),
745
+ name: import_zod15.z.string().optional()
746
+ }),
747
+ PostalAddressSchema
748
+ ]);
749
+ var EventSchema = extendThing("Event", {
750
+ // Required by Google:
751
+ name: import_zod15.z.string(),
752
+ startDate: import_zod15.z.string(),
753
+ // ISO 8601
754
+ // Recommended by Google:
755
+ endDate: import_zod15.z.string().optional(),
756
+ // ISO 8601
757
+ location: PlaceRef.optional(),
758
+ eventStatus: EventStatusType.optional(),
759
+ eventAttendanceMode: EventAttendanceMode.optional(),
760
+ offers: import_zod15.z.union([OfferSchema, import_zod15.z.array(OfferSchema)]).optional(),
761
+ performer: import_zod15.z.union([PersonOrOrgRef, import_zod15.z.array(PersonOrOrgRef)]).optional(),
762
+ organizer: import_zod15.z.union([PersonOrOrgRef, import_zod15.z.array(PersonOrOrgRef)]).optional(),
763
+ image: import_zod15.z.union([ImageOrUrl, import_zod15.z.array(ImageOrUrl)]).optional(),
764
+ description: import_zod15.z.string().optional(),
765
+ previousStartDate: import_zod15.z.string().optional(),
766
+ // ISO 8601 — for rescheduled events
767
+ aggregateRating: AggregateRatingSchema.optional(),
768
+ // Sub-events:
769
+ subEvent: import_zod15.z.lazy(
770
+ () => import_zod15.z.array(import_zod15.z.object({ "@type": import_zod15.z.string() }).catchall(import_zod15.z.unknown()))
771
+ ).optional(),
772
+ superEvent: import_zod15.z.lazy(
773
+ () => import_zod15.z.object({ "@type": import_zod15.z.string() }).catchall(import_zod15.z.unknown())
774
+ ).optional(),
775
+ // Additional:
776
+ inLanguage: import_zod15.z.union([import_zod15.z.string(), import_zod15.z.object({ "@type": import_zod15.z.literal("Language"), name: import_zod15.z.string() })]).optional(),
777
+ isAccessibleForFree: import_zod15.z.boolean().optional(),
778
+ maximumAttendeeCapacity: import_zod15.z.number().int().nonnegative().optional(),
779
+ remainingAttendeeCapacity: import_zod15.z.number().int().nonnegative().optional(),
780
+ typicalAgeRange: import_zod15.z.string().optional(),
781
+ video: VideoObjectSchema.optional()
782
+ });
783
+ var createEvent = makeFactory(EventSchema);
784
+
785
+ // src/types/things/Place.ts
786
+ var import_zod17 = require("zod");
787
+
788
+ // src/types/shared/GeoCoordinates.ts
789
+ var import_zod16 = require("zod");
790
+ var GeoCoordinatesSchema = import_zod16.z.object({
791
+ "@type": import_zod16.z.literal("GeoCoordinates").default("GeoCoordinates"),
792
+ latitude: import_zod16.z.union([import_zod16.z.number(), import_zod16.z.string()]),
793
+ longitude: import_zod16.z.union([import_zod16.z.number(), import_zod16.z.string()]),
794
+ elevation: import_zod16.z.union([import_zod16.z.number(), import_zod16.z.string()]).optional()
795
+ });
796
+
797
+ // src/types/things/Place.ts
798
+ var PlaceSchema = extendThing("Place", {
799
+ address: import_zod17.z.union([import_zod17.z.string(), PostalAddressSchema]).optional(),
800
+ geo: GeoCoordinatesSchema.optional(),
801
+ hasMap: import_zod17.z.url().optional(),
802
+ photo: import_zod17.z.union([ImageOrUrl, import_zod17.z.array(ImageOrUrl)]).optional(),
803
+ telephone: import_zod17.z.string().optional(),
804
+ faxNumber: import_zod17.z.string().optional(),
805
+ openingHoursSpecification: import_zod17.z.union([
806
+ OpeningHoursSpecificationSchema,
807
+ import_zod17.z.array(OpeningHoursSpecificationSchema)
808
+ ]).optional(),
809
+ specialOpeningHoursSpecification: import_zod17.z.union([
810
+ OpeningHoursSpecificationSchema,
811
+ import_zod17.z.array(OpeningHoursSpecificationSchema)
812
+ ]).optional(),
813
+ maximumAttendeeCapacity: import_zod17.z.number().int().nonnegative().optional(),
814
+ isAccessibleForFree: import_zod17.z.boolean().optional(),
815
+ publicAccess: import_zod17.z.boolean().optional(),
816
+ amenityFeature: import_zod17.z.array(import_zod17.z.object({
817
+ "@type": import_zod17.z.literal("LocationFeatureSpecification").default("LocationFeatureSpecification"),
818
+ name: import_zod17.z.string(),
819
+ value: import_zod17.z.union([import_zod17.z.boolean(), import_zod17.z.string(), import_zod17.z.number()])
820
+ })).optional(),
821
+ containedInPlace: import_zod17.z.lazy(
822
+ () => import_zod17.z.object({ "@type": import_zod17.z.string(), name: import_zod17.z.string().optional() }).catchall(import_zod17.z.unknown())
823
+ ).optional()
824
+ });
825
+ var createPlace = makeFactory(PlaceSchema);
826
+
827
+ // src/types/things/LocalBusiness.ts
828
+ var import_zod18 = require("zod");
829
+ var LocalBusinessSchema = PlaceSchema.extend({
830
+ "@type": import_zod18.z.union([
831
+ import_zod18.z.literal("LocalBusiness"),
832
+ import_zod18.z.literal("Restaurant"),
833
+ import_zod18.z.literal("Store"),
834
+ import_zod18.z.literal("FoodEstablishment"),
835
+ import_zod18.z.literal("HealthAndBeautyBusiness"),
836
+ import_zod18.z.literal("MedicalBusiness"),
837
+ import_zod18.z.literal("FinancialService"),
838
+ import_zod18.z.literal("LegalService"),
839
+ import_zod18.z.literal("RealEstateAgent"),
840
+ import_zod18.z.literal("AutoDealer"),
841
+ import_zod18.z.literal("DaySpa"),
842
+ import_zod18.z.literal("HairSalon"),
843
+ import_zod18.z.literal("Hotel"),
844
+ import_zod18.z.literal("LodgingBusiness"),
845
+ import_zod18.z.literal("GroceryStore"),
846
+ import_zod18.z.literal("ShoppingCenter"),
847
+ import_zod18.z.literal("TravelAgency")
848
+ ]).default("LocalBusiness"),
849
+ // Business identity:
850
+ legalName: import_zod18.z.string().optional(),
851
+ email: import_zod18.z.email().optional(),
852
+ logo: ImageOrUrl.optional(),
853
+ contactPoint: import_zod18.z.union([ContactPointSchema, import_zod18.z.array(ContactPointSchema)]).optional(),
854
+ // Ratings & reviews:
855
+ aggregateRating: import_zod18.z.union([AggregateRatingSchema, EmployerAggregateRatingSchema]).optional(),
856
+ review: import_zod18.z.union([ReviewSchema, import_zod18.z.array(ReviewSchema)]).optional(),
857
+ // Pricing:
858
+ priceRange: import_zod18.z.string().optional(),
859
+ // e.g. "$$$"
860
+ currenciesAccepted: import_zod18.z.string().optional(),
861
+ paymentAccepted: import_zod18.z.string().optional(),
862
+ // Food establishment specific:
863
+ servesCuisine: import_zod18.z.union([import_zod18.z.string(), import_zod18.z.array(import_zod18.z.string())]).optional(),
864
+ hasMenu: import_zod18.z.url().optional(),
865
+ acceptsReservations: import_zod18.z.union([import_zod18.z.boolean(), import_zod18.z.url()]).optional(),
866
+ // Merchant signals:
867
+ vatID: import_zod18.z.string().optional(),
868
+ iso6523Code: import_zod18.z.string().optional(),
869
+ hasMerchantReturnPolicy: MerchantReturnPolicySchema.optional(),
870
+ sameAs: import_zod18.z.union([import_zod18.z.url(), import_zod18.z.array(import_zod18.z.url())]).optional(),
871
+ // Departments (nested LocalBusiness):
872
+ department: import_zod18.z.lazy(
873
+ () => import_zod18.z.union([
874
+ import_zod18.z.object({ "@type": import_zod18.z.string() }).catchall(import_zod18.z.unknown()),
875
+ import_zod18.z.array(import_zod18.z.object({ "@type": import_zod18.z.string() }).catchall(import_zod18.z.unknown()))
876
+ ])
877
+ ).optional(),
878
+ // Opening hours in string format (alternative to openingHoursSpecification):
879
+ openingHours: import_zod18.z.union([import_zod18.z.string(), import_zod18.z.array(import_zod18.z.string())]).optional()
880
+ });
881
+ var createLocalBusiness = makeFactory(LocalBusinessSchema);
882
+ var createRestaurant = makeFactory(
883
+ LocalBusinessSchema.extend({ "@type": import_zod18.z.literal("Restaurant").default("Restaurant") })
884
+ );
885
+ var createHotel = makeFactory(
886
+ LocalBusinessSchema.extend({ "@type": import_zod18.z.literal("Hotel").default("Hotel") })
887
+ );
888
+
889
+ // src/types/things/Movie.ts
890
+ var import_zod19 = require("zod");
891
+ var MovieSchema = extendThing("Movie", {
892
+ // Recommended by Google:
893
+ director: import_zod19.z.union([PersonOrOrgRef, import_zod19.z.array(PersonOrOrgRef)]).optional(),
894
+ actor: import_zod19.z.union([PersonOrOrgRef, import_zod19.z.array(PersonOrOrgRef)]).optional(),
895
+ author: import_zod19.z.union([PersonOrOrgRef, import_zod19.z.array(PersonOrOrgRef)]).optional(),
896
+ producer: PersonOrOrgRef.optional(),
897
+ musicBy: PersonOrOrgRef.optional(),
898
+ duration: import_zod19.z.string().optional(),
899
+ // ISO 8601, e.g. "PT2H15M"
900
+ dateCreated: import_zod19.z.string().optional(),
901
+ // ISO 8601
902
+ datePublished: import_zod19.z.string().optional(),
903
+ // ISO 8601
904
+ countryOfOrigin: import_zod19.z.string().optional(),
905
+ // ISO 3166
906
+ inLanguage: import_zod19.z.union([
907
+ import_zod19.z.string(),
908
+ import_zod19.z.object({ "@type": import_zod19.z.literal("Language"), name: import_zod19.z.string() })
909
+ ]).optional(),
910
+ aggregateRating: AggregateRatingSchema.optional(),
911
+ review: import_zod19.z.union([ReviewSchema, import_zod19.z.array(ReviewSchema)]).optional(),
912
+ trailer: VideoObjectSchema.optional(),
913
+ image: import_zod19.z.union([ImageOrUrl, import_zod19.z.array(ImageOrUrl)]).optional(),
914
+ // Classification:
915
+ contentRating: import_zod19.z.string().optional(),
916
+ // e.g. "MPAA PG-13"
917
+ genre: import_zod19.z.union([import_zod19.z.string(), import_zod19.z.array(import_zod19.z.string())]).optional(),
918
+ // For carousels: itemListElement links
919
+ sameAs: import_zod19.z.union([import_zod19.z.url(), import_zod19.z.array(import_zod19.z.url())]).optional()
920
+ });
921
+ var createMovie = makeFactory(MovieSchema);
922
+
923
+ // src/types/creative-works/Book.ts
924
+ var import_zod20 = require("zod");
925
+ var BookFormatType = import_zod20.z.enum([
926
+ "EBook",
927
+ "Hardcover",
928
+ "Paperback",
929
+ "AudioBook",
930
+ "GraphicNovel"
931
+ ]);
932
+ var EntryPointSchema = import_zod20.z.object({
933
+ "@type": import_zod20.z.literal("EntryPoint").default("EntryPoint"),
934
+ /** URL template with optional {isbn} / {id} placeholder, or a plain URL */
935
+ urlTemplate: import_zod20.z.string(),
936
+ /** MIME type of the action target */
937
+ encodingType: import_zod20.z.string().optional(),
938
+ /** HTTP method */
939
+ httpMethod: import_zod20.z.string().optional()
940
+ });
941
+ var ReadActionSchema = import_zod20.z.object({
942
+ "@type": import_zod20.z.literal("ReadAction").default("ReadAction"),
943
+ /** Where the book can be read */
944
+ target: import_zod20.z.union([EntryPointSchema, import_zod20.z.string()]),
945
+ /** Offer describing subscription / purchase required to read */
946
+ expectsAcceptanceOf: OfferSchema.optional()
947
+ });
948
+ var BorrowActionSchema = import_zod20.z.object({
949
+ "@type": import_zod20.z.literal("BorrowAction").default("BorrowAction"),
950
+ /** Library system or library lending this book */
951
+ lender: import_zod20.z.object({
952
+ "@type": import_zod20.z.union([
953
+ import_zod20.z.literal("LibrarySystem"),
954
+ import_zod20.z.literal("Library")
955
+ ]),
956
+ name: import_zod20.z.string(),
957
+ url: import_zod20.z.url().optional(),
958
+ /** Unique identifier for the library system */
959
+ "@id": import_zod20.z.string().optional()
960
+ }),
961
+ /** Where the borrow action is performed */
962
+ target: import_zod20.z.union([EntryPointSchema, import_zod20.z.string()])
963
+ });
964
+ var BookEditionSchema = import_zod20.z.object({
965
+ "@type": import_zod20.z.literal("Book").default("Book"),
966
+ /** Unique stable URL identifying this edition */
967
+ "@id": import_zod20.z.string().optional(),
968
+ /** Edition title — may differ from the work title */
969
+ name: import_zod20.z.string().optional(),
970
+ /** Physical/digital format */
971
+ bookFormat: BookFormatType.optional(),
972
+ /** BCP 47 language tag, e.g. "en", "fr" */
973
+ inLanguage: import_zod20.z.string().optional(),
974
+ /** ISBN-13 preferred; ISBN-10 also accepted */
975
+ isbn: import_zod20.z.string().optional(),
976
+ /** OCLC number (for library systems) */
977
+ sameAs: import_zod20.z.union([import_zod20.z.string(), import_zod20.z.array(import_zod20.z.string())]).optional(),
978
+ /** Edition number, e.g. "2nd" */
979
+ bookEdition: import_zod20.z.string().optional(),
980
+ /** Publication date for this edition */
981
+ datePublished: import_zod20.z.string().optional(),
982
+ /** Landing page for this edition */
983
+ url: import_zod20.z.url().optional(),
984
+ /** Authors of this edition (may differ from work author) */
985
+ author: import_zod20.z.union([PersonOrOrgRef, import_zod20.z.array(PersonOrOrgRef)]).optional(),
986
+ /** ReadAction or BorrowAction for Google Book Actions */
987
+ potentialAction: import_zod20.z.union([
988
+ ReadActionSchema,
989
+ BorrowActionSchema,
990
+ import_zod20.z.array(import_zod20.z.union([ReadActionSchema, BorrowActionSchema]))
991
+ ]).optional(),
992
+ /** Offer — purchase price */
993
+ offers: import_zod20.z.union([OfferSchema, import_zod20.z.array(OfferSchema)]).optional()
994
+ });
995
+ var BookSchema = import_zod20.z.object({
996
+ "@type": import_zod20.z.literal("Book").default("Book"),
997
+ /** Stable URL identifying this work */
998
+ "@id": import_zod20.z.string().optional(),
999
+ name: import_zod20.z.string(),
1000
+ /** Primary author(s) of the work */
1001
+ author: import_zod20.z.union([PersonOrOrgRef, import_zod20.z.array(PersonOrOrgRef)]),
1002
+ /** Canonical URL for the book's landing page */
1003
+ url: import_zod20.z.url().optional(),
1004
+ /** Cover image */
1005
+ image: import_zod20.z.union([ImageOrUrl, import_zod20.z.array(ImageOrUrl)]).optional(),
1006
+ description: import_zod20.z.string().optional(),
1007
+ /** ISBN of the primary edition */
1008
+ isbn: import_zod20.z.string().optional(),
1009
+ /** Same-as links (e.g., Open Library, WorldCat) */
1010
+ sameAs: import_zod20.z.union([import_zod20.z.string(), import_zod20.z.array(import_zod20.z.string())]).optional(),
1011
+ /** Specific editions — each may have ReadAction / BorrowAction */
1012
+ workExample: import_zod20.z.union([BookEditionSchema, import_zod20.z.array(BookEditionSchema)]).optional(),
1013
+ /** Publisher of the primary edition */
1014
+ publisher: import_zod20.z.object({
1015
+ "@type": import_zod20.z.union([import_zod20.z.literal("Organization"), import_zod20.z.literal("Person")]),
1016
+ name: import_zod20.z.string(),
1017
+ url: import_zod20.z.url().optional()
1018
+ }).optional(),
1019
+ /** Number of pages */
1020
+ numberOfPages: import_zod20.z.number().int().positive().optional(),
1021
+ /** Original publication year */
1022
+ datePublished: import_zod20.z.string().optional(),
1023
+ /** Genres */
1024
+ genre: import_zod20.z.union([import_zod20.z.string(), import_zod20.z.array(import_zod20.z.string())]).optional(),
1025
+ /** BCP 47 language tag */
1026
+ inLanguage: import_zod20.z.string().optional(),
1027
+ /** Aggregate rating across editions */
1028
+ aggregateRating: import_zod20.z.lazy(
1029
+ () => import_zod20.z.object({ "@type": import_zod20.z.string() }).catchall(import_zod20.z.unknown())
1030
+ ).optional()
1031
+ });
1032
+ var createBook = makeFactory(BookSchema);
1033
+
1034
+ // src/types/creative-works/Article.ts
1035
+ var import_zod22 = require("zod");
1036
+
1037
+ // src/types/creative-works/CreativeWork.ts
1038
+ var import_zod21 = require("zod");
1039
+ var CreativeWorkSchema = extendThing("CreativeWork", {
1040
+ author: PersonOrOrgRef.optional(),
1041
+ publisher: PersonOrOrgRef.optional(),
1042
+ datePublished: import_zod21.z.string().optional(),
1043
+ // ISO 8601
1044
+ dateModified: import_zod21.z.string().optional(),
1045
+ // ISO 8601
1046
+ headline: import_zod21.z.string().max(110).optional(),
1047
+ // Google recommends max 110 chars
1048
+ keywords: import_zod21.z.union([import_zod21.z.string(), import_zod21.z.array(import_zod21.z.string())]).optional(),
1049
+ inLanguage: import_zod21.z.union([
1050
+ import_zod21.z.string(),
1051
+ // BCP 47, e.g. "en-US"
1052
+ import_zod21.z.object({ "@type": import_zod21.z.literal("Language"), name: import_zod21.z.string() })
1053
+ ]).optional(),
1054
+ license: import_zod21.z.url().optional(),
1055
+ thumbnailUrl: import_zod21.z.url().optional(),
1056
+ isAccessibleForFree: import_zod21.z.boolean().optional(),
1057
+ image: import_zod21.z.union([ImageOrUrl, import_zod21.z.array(ImageOrUrl)]).optional(),
1058
+ // Paywalled content support:
1059
+ hasPart: import_zod21.z.array(import_zod21.z.object({
1060
+ "@type": import_zod21.z.string(),
1061
+ isAccessibleForFree: import_zod21.z.boolean().optional(),
1062
+ cssSelector: import_zod21.z.string().optional()
1063
+ })).optional(),
1064
+ // For subscription / paywalled content
1065
+ isPartOf: import_zod21.z.object({
1066
+ "@type": import_zod21.z.string(),
1067
+ name: import_zod21.z.string().optional()
1068
+ }).optional(),
1069
+ text: import_zod21.z.string().optional(),
1070
+ abstract: import_zod21.z.string().optional(),
1071
+ encodingFormat: import_zod21.z.string().optional(),
1072
+ // MIME type
1073
+ contentUrl: import_zod21.z.url().optional(),
1074
+ copyrightYear: import_zod21.z.number().int().optional(),
1075
+ copyrightHolder: PersonOrOrgRef.optional()
1076
+ });
1077
+
1078
+ // src/types/creative-works/Article.ts
1079
+ var ArticleSchema = CreativeWorkSchema.extend({
1080
+ "@type": import_zod22.z.literal("Article").default("Article"),
1081
+ articleBody: import_zod22.z.string().optional(),
1082
+ articleSection: import_zod22.z.string().optional(),
1083
+ wordCount: import_zod22.z.number().int().nonnegative().optional(),
1084
+ // Google Article requires image to be at least 1200px wide
1085
+ image: import_zod22.z.union([ImageOrUrl, import_zod22.z.array(ImageOrUrl)]).optional(),
1086
+ video: import_zod22.z.union([VideoObjectSchema, import_zod22.z.array(VideoObjectSchema)]).optional(),
1087
+ // Speakable for Article (Google Assistant)
1088
+ speakable: import_zod22.z.object({
1089
+ "@type": import_zod22.z.literal("SpeakableSpecification").default("SpeakableSpecification"),
1090
+ cssSelector: import_zod22.z.union([import_zod22.z.string(), import_zod22.z.array(import_zod22.z.string())]).optional(),
1091
+ xpath: import_zod22.z.union([import_zod22.z.string(), import_zod22.z.array(import_zod22.z.string())]).optional()
1092
+ }).optional()
1093
+ });
1094
+ var NewsArticleSchema = ArticleSchema.extend({
1095
+ "@type": import_zod22.z.literal("NewsArticle").default("NewsArticle"),
1096
+ dateline: import_zod22.z.string().optional(),
1097
+ printColumn: import_zod22.z.string().optional(),
1098
+ printEdition: import_zod22.z.string().optional(),
1099
+ printPage: import_zod22.z.string().optional(),
1100
+ printSection: import_zod22.z.string().optional()
1101
+ });
1102
+ var BlogPostingSchema = ArticleSchema.extend({
1103
+ "@type": import_zod22.z.literal("BlogPosting").default("BlogPosting"),
1104
+ sharedContent: import_zod22.z.lazy(
1105
+ () => import_zod22.z.object({ "@type": import_zod22.z.string() }).passthrough()
1106
+ ).optional()
1107
+ });
1108
+ var createArticle = makeFactory(ArticleSchema);
1109
+ var createNewsArticle = makeFactory(NewsArticleSchema);
1110
+ var createBlogPosting = makeFactory(BlogPostingSchema);
1111
+
1112
+ // src/types/creative-works/WebPage.ts
1113
+ var import_zod23 = require("zod");
1114
+ var WebPageSchema = CreativeWorkSchema.extend({
1115
+ "@type": import_zod23.z.literal("WebPage").default("WebPage"),
1116
+ breadcrumb: import_zod23.z.lazy(
1117
+ () => import_zod23.z.object({ "@type": import_zod23.z.literal("BreadcrumbList") }).catchall(import_zod23.z.unknown())
1118
+ ).optional(),
1119
+ lastReviewed: import_zod23.z.string().optional(),
1120
+ reviewedBy: PersonOrOrgRef.optional(),
1121
+ speakable: import_zod23.z.object({
1122
+ "@type": import_zod23.z.literal("SpeakableSpecification").default("SpeakableSpecification"),
1123
+ cssSelector: import_zod23.z.union([import_zod23.z.string(), import_zod23.z.array(import_zod23.z.string())]).optional(),
1124
+ xpath: import_zod23.z.union([import_zod23.z.string(), import_zod23.z.array(import_zod23.z.string())]).optional()
1125
+ }).optional(),
1126
+ significantLink: import_zod23.z.union([import_zod23.z.url(), import_zod23.z.array(import_zod23.z.url())]).optional(),
1127
+ mainContentOfPage: import_zod23.z.object({ "@type": import_zod23.z.string() }).catchall(import_zod23.z.unknown()).optional(),
1128
+ primaryImageOfPage: import_zod23.z.object({ "@type": import_zod23.z.string() }).catchall(import_zod23.z.unknown()).optional(),
1129
+ relatedLink: import_zod23.z.union([import_zod23.z.url(), import_zod23.z.array(import_zod23.z.url())]).optional()
1130
+ });
1131
+ var createWebPage = makeFactory(WebPageSchema);
1132
+
1133
+ // src/types/creative-works/WebSite.ts
1134
+ var import_zod24 = require("zod");
1135
+ var WebSiteSchema = CreativeWorkSchema.extend({
1136
+ "@type": import_zod24.z.literal("WebSite").default("WebSite"),
1137
+ url: import_zod24.z.url().optional(),
1138
+ name: import_zod24.z.string().optional(),
1139
+ /**
1140
+ * Sitelinks Searchbox via SearchAction.
1141
+ * @deprecated Google removed the Sitelinks Searchbox feature in November 2024.
1142
+ * This field is still valid JSON-LD and harmless to include, but Google no
1143
+ * longer displays a search box in branded search results.
1144
+ * See: https://developers.google.com/search/blog/2024/11/retiring-sitelinks-searchbox
1145
+ */
1146
+ potentialAction: import_zod24.z.object({
1147
+ "@type": import_zod24.z.literal("SearchAction"),
1148
+ target: import_zod24.z.union([
1149
+ import_zod24.z.string(),
1150
+ import_zod24.z.object({
1151
+ "@type": import_zod24.z.literal("EntryPoint"),
1152
+ urlTemplate: import_zod24.z.string()
1153
+ })
1154
+ ]),
1155
+ "query-input": import_zod24.z.string().optional()
1156
+ }).optional(),
1157
+ // Content language(s)
1158
+ inLanguage: import_zod24.z.union([import_zod24.z.string(), import_zod24.z.array(import_zod24.z.string())]).optional(),
1159
+ // Authorship / ownership
1160
+ publisher: PersonOrOrgRef.optional(),
1161
+ // Site-level metadata
1162
+ copyrightYear: import_zod24.z.number().int().optional(),
1163
+ // isPartOf — rarely used for WebSite itself but allowed
1164
+ isPartOf: import_zod24.z.lazy(
1165
+ () => import_zod24.z.object({ "@type": import_zod24.z.string() }).catchall(import_zod24.z.unknown())
1166
+ ).optional()
1167
+ });
1168
+ var createWebSite = makeFactory(WebSiteSchema);
1169
+
1170
+ // src/types/creative-works/Dataset.ts
1171
+ var import_zod25 = require("zod");
1172
+ var PropertyValueSchema = import_zod25.z.object({
1173
+ "@type": import_zod25.z.literal("PropertyValue").default("PropertyValue"),
1174
+ propertyID: import_zod25.z.string().optional(),
1175
+ // e.g. "DOI", "SPDX"
1176
+ name: import_zod25.z.string().optional(),
1177
+ value: import_zod25.z.union([import_zod25.z.string(), import_zod25.z.number()]),
1178
+ url: import_zod25.z.url().optional(),
1179
+ description: import_zod25.z.string().optional()
1180
+ });
1181
+ var DatasetSchema = CreativeWorkSchema.extend({
1182
+ "@type": import_zod25.z.literal("Dataset").default("Dataset"),
1183
+ // Required by Google:
1184
+ name: import_zod25.z.string(),
1185
+ description: import_zod25.z.string(),
1186
+ // Recommended by Google:
1187
+ url: import_zod25.z.url().optional(),
1188
+ sameAs: import_zod25.z.union([import_zod25.z.url(), import_zod25.z.array(import_zod25.z.url())]).optional(),
1189
+ identifier: import_zod25.z.union([
1190
+ import_zod25.z.string(),
1191
+ PropertyValueSchema,
1192
+ import_zod25.z.array(import_zod25.z.union([import_zod25.z.string(), PropertyValueSchema]))
1193
+ ]).optional(),
1194
+ keywords: import_zod25.z.union([import_zod25.z.string(), import_zod25.z.array(import_zod25.z.string())]).optional(),
1195
+ license: import_zod25.z.url().optional(),
1196
+ isAccessibleForFree: import_zod25.z.boolean().optional(),
1197
+ creator: import_zod25.z.union([PersonOrOrgRef, import_zod25.z.array(PersonOrOrgRef)]).optional(),
1198
+ citation: import_zod25.z.union([import_zod25.z.string(), import_zod25.z.array(import_zod25.z.string())]).optional(),
1199
+ variableMeasured: import_zod25.z.union([import_zod25.z.string(), import_zod25.z.array(import_zod25.z.string())]).optional(),
1200
+ measurementTechnique: import_zod25.z.union([import_zod25.z.string(), import_zod25.z.array(import_zod25.z.string())]).optional(),
1201
+ temporalCoverage: import_zod25.z.string().optional(),
1202
+ // ISO 8601 or date range string
1203
+ spatialCoverage: import_zod25.z.union([
1204
+ import_zod25.z.string(),
1205
+ import_zod25.z.object({ "@type": import_zod25.z.literal("Place"), name: import_zod25.z.string() })
1206
+ ]).optional(),
1207
+ distribution: import_zod25.z.array(import_zod25.z.object({
1208
+ "@type": import_zod25.z.literal("DataDownload").default("DataDownload"),
1209
+ encodingFormat: import_zod25.z.string(),
1210
+ // MIME type or format name
1211
+ contentUrl: import_zod25.z.url(),
1212
+ name: import_zod25.z.string().optional(),
1213
+ description: import_zod25.z.string().optional()
1214
+ })).optional(),
1215
+ includedInDataCatalog: import_zod25.z.object({
1216
+ "@type": import_zod25.z.literal("DataCatalog").default("DataCatalog"),
1217
+ name: import_zod25.z.string(),
1218
+ url: import_zod25.z.url().optional()
1219
+ }).optional(),
1220
+ datePublished: import_zod25.z.string().optional(),
1221
+ // ISO 8601
1222
+ dateModified: import_zod25.z.string().optional(),
1223
+ version: import_zod25.z.union([import_zod25.z.string(), import_zod25.z.number()]).optional()
1224
+ });
1225
+ var createDataset = makeFactory(DatasetSchema);
1226
+
1227
+ // src/types/creative-works/Recipe.ts
1228
+ var import_zod27 = require("zod");
1229
+
1230
+ // src/types/shared/HowToStep.ts
1231
+ var import_zod26 = require("zod");
1232
+ var HowToStepSchema = import_zod26.z.object({
1233
+ "@type": import_zod26.z.literal("HowToStep").default("HowToStep"),
1234
+ name: import_zod26.z.string().optional(),
1235
+ // Step title (avoid "Step 1" format per Google)
1236
+ text: import_zod26.z.string(),
1237
+ // Step description
1238
+ url: import_zod26.z.string().url().optional(),
1239
+ // Anchor link to step
1240
+ image: ImageOrUrl.optional()
1241
+ });
1242
+ var HowToSectionSchema = import_zod26.z.object({
1243
+ "@type": import_zod26.z.literal("HowToSection").default("HowToSection"),
1244
+ name: import_zod26.z.string(),
1245
+ itemListElement: import_zod26.z.array(HowToStepSchema),
1246
+ description: import_zod26.z.string().optional()
1247
+ });
1248
+
1249
+ // src/types/creative-works/Recipe.ts
1250
+ var NutritionInformationSchema = import_zod27.z.object({
1251
+ "@type": import_zod27.z.literal("NutritionInformation").default("NutritionInformation"),
1252
+ calories: import_zod27.z.string().optional(),
1253
+ // e.g. "270 calories"
1254
+ carbohydrateContent: import_zod27.z.string().optional(),
1255
+ // e.g. "20 grams"
1256
+ cholesterolContent: import_zod27.z.string().optional(),
1257
+ fatContent: import_zod27.z.string().optional(),
1258
+ fiberContent: import_zod27.z.string().optional(),
1259
+ proteinContent: import_zod27.z.string().optional(),
1260
+ saturatedFatContent: import_zod27.z.string().optional(),
1261
+ servingSize: import_zod27.z.string().optional(),
1262
+ sodiumContent: import_zod27.z.string().optional(),
1263
+ sugarContent: import_zod27.z.string().optional(),
1264
+ transFatContent: import_zod27.z.string().optional(),
1265
+ unsaturatedFatContent: import_zod27.z.string().optional()
1266
+ });
1267
+ var RecipeSchema = CreativeWorkSchema.extend({
1268
+ "@type": import_zod27.z.literal("Recipe").default("Recipe"),
1269
+ // Required by Google:
1270
+ name: import_zod27.z.string(),
1271
+ image: import_zod27.z.union([ImageOrUrl, import_zod27.z.array(ImageOrUrl)]),
1272
+ // Recommended by Google:
1273
+ author: import_zod27.z.union([PersonOrOrgRef, import_zod27.z.array(PersonOrOrgRef)]).optional(),
1274
+ datePublished: import_zod27.z.string().optional(),
1275
+ // ISO 8601 date
1276
+ description: import_zod27.z.string().optional(),
1277
+ prepTime: import_zod27.z.string().optional(),
1278
+ // ISO 8601 duration, e.g. "PT15M"
1279
+ cookTime: import_zod27.z.string().optional(),
1280
+ // ISO 8601 duration
1281
+ totalTime: import_zod27.z.string().optional(),
1282
+ // ISO 8601 duration
1283
+ recipeYield: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.number(), import_zod27.z.array(import_zod27.z.string())]).optional(),
1284
+ recipeCategory: import_zod27.z.string().optional(),
1285
+ // e.g. "Dessert", "Dinner"
1286
+ recipeCuisine: import_zod27.z.string().optional(),
1287
+ // e.g. "Italian", "French"
1288
+ recipeIngredient: import_zod27.z.array(import_zod27.z.string()).optional(),
1289
+ recipeInstructions: import_zod27.z.array(
1290
+ import_zod27.z.union([import_zod27.z.string(), HowToStepSchema, HowToSectionSchema])
1291
+ ).optional(),
1292
+ nutrition: NutritionInformationSchema.optional(),
1293
+ video: import_zod27.z.union([VideoObjectSchema, import_zod27.z.array(VideoObjectSchema)]).optional(),
1294
+ aggregateRating: AggregateRatingSchema.optional(),
1295
+ review: import_zod27.z.union([ReviewSchema, import_zod27.z.array(ReviewSchema)]).optional(),
1296
+ keywords: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.array(import_zod27.z.string())]).optional(),
1297
+ cookingMethod: import_zod27.z.string().optional(),
1298
+ suitableForDiet: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.array(import_zod27.z.string())]).optional(),
1299
+ // schema.org enum URL
1300
+ estimatedCost: import_zod27.z.string().optional()
1301
+ });
1302
+ var createRecipe = makeFactory(RecipeSchema);
1303
+
1304
+ // src/types/creative-works/Course.ts
1305
+ var import_zod28 = require("zod");
1306
+ var CourseInstanceSchema = import_zod28.z.object({
1307
+ "@type": import_zod28.z.literal("CourseInstance").default("CourseInstance"),
1308
+ courseMode: import_zod28.z.union([import_zod28.z.string(), import_zod28.z.array(import_zod28.z.string())]),
1309
+ // "online", "onsite", "blended"
1310
+ instructor: import_zod28.z.union([PersonOrOrgRef, import_zod28.z.array(PersonOrOrgRef)]).optional(),
1311
+ startDate: import_zod28.z.string().optional(),
1312
+ // ISO 8601
1313
+ endDate: import_zod28.z.string().optional(),
1314
+ // ISO 8601
1315
+ location: import_zod28.z.union([import_zod28.z.string(), PostalAddressSchema]).optional(),
1316
+ offers: import_zod28.z.union([OfferSchema, import_zod28.z.array(OfferSchema)]).optional(),
1317
+ courseWorkload: import_zod28.z.string().optional(),
1318
+ // ISO 8601 duration, e.g. "PT10H"
1319
+ courseSchedule: import_zod28.z.object({
1320
+ "@type": import_zod28.z.literal("Schedule").default("Schedule"),
1321
+ repeatFrequency: import_zod28.z.string().optional(),
1322
+ // e.g. "P1W"
1323
+ repeatCount: import_zod28.z.number().optional(),
1324
+ startDate: import_zod28.z.string().optional(),
1325
+ endDate: import_zod28.z.string().optional()
1326
+ }).optional()
1327
+ });
1328
+ var CourseSchema = CreativeWorkSchema.extend({
1329
+ "@type": import_zod28.z.literal("Course").default("Course"),
1330
+ // Required by Google:
1331
+ name: import_zod28.z.string(),
1332
+ description: import_zod28.z.string(),
1333
+ // Recommended by Google:
1334
+ provider: import_zod28.z.union([PersonOrOrgRef, import_zod28.z.array(PersonOrOrgRef)]).optional(),
1335
+ hasCourseInstance: import_zod28.z.union([CourseInstanceSchema, import_zod28.z.array(CourseInstanceSchema)]).optional(),
1336
+ // Optional:
1337
+ coursePrerequisites: import_zod28.z.union([import_zod28.z.string(), import_zod28.z.array(import_zod28.z.string())]).optional(),
1338
+ educationalCredentialAwarded: import_zod28.z.union([
1339
+ import_zod28.z.string(),
1340
+ import_zod28.z.object({
1341
+ "@type": import_zod28.z.literal("EducationalOccupationalCredential").default("EducationalOccupationalCredential"),
1342
+ name: import_zod28.z.string(),
1343
+ url: import_zod28.z.url().optional()
1344
+ })
1345
+ ]).optional(),
1346
+ occupationalCredentialAwarded: import_zod28.z.union([import_zod28.z.string(), import_zod28.z.array(import_zod28.z.string())]).optional(),
1347
+ numberOfCredits: import_zod28.z.union([
1348
+ import_zod28.z.number(),
1349
+ import_zod28.z.object({
1350
+ "@type": import_zod28.z.literal("StructuredValue").default("StructuredValue"),
1351
+ value: import_zod28.z.number()
1352
+ })
1353
+ ]).optional(),
1354
+ financialAidEligible: import_zod28.z.union([import_zod28.z.string(), import_zod28.z.boolean()]).optional(),
1355
+ aggregateRating: AggregateRatingSchema.optional(),
1356
+ image: import_zod28.z.union([ImageOrUrl, import_zod28.z.array(ImageOrUrl)]).optional(),
1357
+ offers: import_zod28.z.union([OfferSchema, import_zod28.z.array(OfferSchema)]).optional(),
1358
+ inLanguage: import_zod28.z.union([import_zod28.z.string(), import_zod28.z.array(import_zod28.z.string())]).optional(),
1359
+ syllabusSections: import_zod28.z.array(import_zod28.z.object({
1360
+ "@type": import_zod28.z.literal("Syllabus").default("Syllabus"),
1361
+ name: import_zod28.z.string(),
1362
+ description: import_zod28.z.string().optional()
1363
+ })).optional()
1364
+ });
1365
+ var createCourse = makeFactory(CourseSchema);
1366
+
1367
+ // src/types/creative-works/SoftwareApplication.ts
1368
+ var import_zod29 = require("zod");
1369
+ var ApplicationCategory = import_zod29.z.enum([
1370
+ "GameApplication",
1371
+ "SocialNetworkingApplication",
1372
+ "TravelApplication",
1373
+ "ShoppingApplication",
1374
+ "SportsApplication",
1375
+ "LifestyleApplication",
1376
+ "BusinessApplication",
1377
+ "DesignApplication",
1378
+ "DeveloperApplication",
1379
+ "DriverApplication",
1380
+ "EducationalApplication",
1381
+ "HealthApplication",
1382
+ "FinanceApplication",
1383
+ "SecurityApplication",
1384
+ "BrowserApplication",
1385
+ "CommunicationApplication",
1386
+ "DesktopEnhancementApplication",
1387
+ "EntertainmentApplication",
1388
+ "MultimediaApplication",
1389
+ "HomeApplication",
1390
+ "UtilitiesApplication",
1391
+ "ReferenceApplication"
1392
+ ]);
1393
+ var SoftwareApplicationSchema = CreativeWorkSchema.extend({
1394
+ "@type": import_zod29.z.union([
1395
+ import_zod29.z.literal("SoftwareApplication"),
1396
+ import_zod29.z.literal("MobileApplication"),
1397
+ import_zod29.z.literal("WebApplication"),
1398
+ import_zod29.z.literal("VideoGame")
1399
+ ]).default("SoftwareApplication"),
1400
+ // Required by Google:
1401
+ name: import_zod29.z.string(),
1402
+ // Recommended by Google:
1403
+ operatingSystem: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional(),
1404
+ applicationCategory: import_zod29.z.union([ApplicationCategory, import_zod29.z.string()]).optional(),
1405
+ offers: import_zod29.z.union([OfferSchema, import_zod29.z.array(OfferSchema)]).optional(),
1406
+ aggregateRating: AggregateRatingSchema.optional(),
1407
+ review: import_zod29.z.union([ReviewSchema, import_zod29.z.array(ReviewSchema)]).optional(),
1408
+ // Optional:
1409
+ softwareVersion: import_zod29.z.string().optional(),
1410
+ fileSize: import_zod29.z.string().optional(),
1411
+ downloadUrl: import_zod29.z.url().optional(),
1412
+ screenshot: import_zod29.z.union([ImageOrUrl, import_zod29.z.array(ImageOrUrl)]).optional(),
1413
+ featureList: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional(),
1414
+ installUrl: import_zod29.z.url().optional(),
1415
+ softwareRequirements: import_zod29.z.string().optional(),
1416
+ permissions: import_zod29.z.string().optional(),
1417
+ // WebApplication specific:
1418
+ browserRequirements: import_zod29.z.string().optional(),
1419
+ // MobileApplication specific:
1420
+ countriesSupported: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional(),
1421
+ countriesNotSupported: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional(),
1422
+ availableOnDevice: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional(),
1423
+ // VideoGame specific:
1424
+ gamePlatform: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional(),
1425
+ playMode: import_zod29.z.string().optional(),
1426
+ genre: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional()
1427
+ });
1428
+ var createSoftwareApplication = makeFactory(SoftwareApplicationSchema);
1429
+ var createMobileApplication = makeFactory(
1430
+ SoftwareApplicationSchema.extend({
1431
+ "@type": import_zod29.z.literal("MobileApplication").default("MobileApplication")
1432
+ })
1433
+ );
1434
+ var createWebApplication = makeFactory(
1435
+ SoftwareApplicationSchema.extend({
1436
+ "@type": import_zod29.z.literal("WebApplication").default("WebApplication")
1437
+ })
1438
+ );
1439
+
1440
+ // src/types/creative-works/MathSolver.ts
1441
+ var import_zod30 = require("zod");
1442
+ var SolveMathActionSchema = import_zod30.z.object({
1443
+ "@type": import_zod30.z.literal("SolveMathAction").default("SolveMathAction"),
1444
+ eduQuestionType: import_zod30.z.string().optional(),
1445
+ // e.g. "Algebra", "Calculus"
1446
+ mathExpression: import_zod30.z.string().optional(),
1447
+ target: import_zod30.z.object({
1448
+ "@type": import_zod30.z.literal("EntryPoint").default("EntryPoint"),
1449
+ urlTemplate: import_zod30.z.string().optional(),
1450
+ actionAccessibilityRequirement: import_zod30.z.object({
1451
+ "@type": import_zod30.z.literal("ActionAccessSpecification").default("ActionAccessSpecification"),
1452
+ requiresSubscription: import_zod30.z.boolean().optional()
1453
+ }).optional()
1454
+ }).optional()
1455
+ });
1456
+ var MathSolverSchema = CreativeWorkSchema.extend({
1457
+ "@type": import_zod30.z.literal("MathSolver").default("MathSolver"),
1458
+ name: import_zod30.z.string(),
1459
+ url: import_zod30.z.url().optional(),
1460
+ potentialAction: import_zod30.z.union([SolveMathActionSchema, import_zod30.z.array(SolveMathActionSchema)]).optional(),
1461
+ mathExpression: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional(),
1462
+ educationalLevel: import_zod30.z.string().optional(),
1463
+ teaches: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional()
1464
+ });
1465
+ var createMathSolver = makeFactory(MathSolverSchema);
1466
+
1467
+ // src/types/intangibles/Language.ts
1468
+ var import_zod31 = require("zod");
1469
+ var LanguageSchema = extendThing("Language", {
1470
+ // No additional properties beyond Thing for Language
1471
+ // But you can attach any Thing props: name, alternateName, url, etc.
1472
+ });
1473
+ var createLanguage = makeFactory(LanguageSchema);
1474
+ var PronounceableTextSchema = import_zod31.z.object({
1475
+ "@type": import_zod31.z.literal("PronounceableText").default("PronounceableText"),
1476
+ textValue: import_zod31.z.string(),
1477
+ // Accepts either a BCP 47 string like "en-US" or a full Language object
1478
+ inLanguage: import_zod31.z.union([import_zod31.z.string(), LanguageSchema]).optional(),
1479
+ phoneticText: import_zod31.z.string().optional(),
1480
+ speechToTextMarkup: import_zod31.z.string().optional()
1481
+ });
1482
+ var createPronounceableText = makeFactory(PronounceableTextSchema);
1483
+
1484
+ // src/types/intangibles/JobPosting.ts
1485
+ var import_zod33 = require("zod");
1486
+
1487
+ // src/types/shared/MonetaryAmount.ts
1488
+ var import_zod32 = require("zod");
1489
+ var MonetaryAmountSchema = import_zod32.z.object({
1490
+ "@type": import_zod32.z.literal("MonetaryAmount").default("MonetaryAmount"),
1491
+ currency: import_zod32.z.string().length(3),
1492
+ // ISO 4217, e.g. "USD"
1493
+ value: import_zod32.z.union([
1494
+ import_zod32.z.number(),
1495
+ import_zod32.z.object({
1496
+ "@type": import_zod32.z.literal("QuantitativeValue").default("QuantitativeValue"),
1497
+ value: import_zod32.z.number().optional(),
1498
+ minValue: import_zod32.z.number().optional(),
1499
+ maxValue: import_zod32.z.number().optional(),
1500
+ unitText: import_zod32.z.string().optional()
1501
+ // e.g. "HOUR", "MONTH", "YEAR"
1502
+ })
1503
+ ]).optional(),
1504
+ minValue: import_zod32.z.number().optional(),
1505
+ maxValue: import_zod32.z.number().optional()
1506
+ });
1507
+ var PriceSpecificationSchema = import_zod32.z.object({
1508
+ "@type": import_zod32.z.literal("PriceSpecification").default("PriceSpecification"),
1509
+ price: import_zod32.z.union([import_zod32.z.number(), import_zod32.z.string()]),
1510
+ priceCurrency: import_zod32.z.string().length(3),
1511
+ // ISO 4217
1512
+ minPrice: import_zod32.z.number().optional(),
1513
+ maxPrice: import_zod32.z.number().optional(),
1514
+ validFrom: import_zod32.z.string().optional(),
1515
+ // ISO 8601
1516
+ validThrough: import_zod32.z.string().optional(),
1517
+ eligibleQuantity: import_zod32.z.object({
1518
+ "@type": import_zod32.z.literal("QuantitativeValue").default("QuantitativeValue"),
1519
+ value: import_zod32.z.number().optional(),
1520
+ minValue: import_zod32.z.number().optional(),
1521
+ maxValue: import_zod32.z.number().optional()
1522
+ }).optional()
1523
+ });
1524
+
1525
+ // src/types/intangibles/JobPosting.ts
1526
+ var EmploymentType = import_zod33.z.enum([
1527
+ "FULL_TIME",
1528
+ "PART_TIME",
1529
+ "CONTRACTOR",
1530
+ "TEMPORARY",
1531
+ "INTERN",
1532
+ "VOLUNTEER",
1533
+ "PER_DIEM",
1534
+ "OTHER"
1535
+ ]);
1536
+ var HiringOrgRef = import_zod33.z.object({
1537
+ "@type": import_zod33.z.union([import_zod33.z.literal("Organization"), import_zod33.z.literal("LocalBusiness")]).default("Organization"),
1538
+ name: import_zod33.z.string(),
1539
+ sameAs: import_zod33.z.url().optional(),
1540
+ logo: ImageOrUrl.optional(),
1541
+ url: import_zod33.z.url().optional()
1542
+ });
1543
+ var JobLocationRef = import_zod33.z.object({
1544
+ "@type": import_zod33.z.literal("Place").default("Place"),
1545
+ address: import_zod33.z.union([import_zod33.z.string(), PostalAddressSchema])
1546
+ });
1547
+ var JobPostingSchema = import_zod33.z.object({
1548
+ "@type": import_zod33.z.literal("JobPosting").default("JobPosting"),
1549
+ // Required by Google:
1550
+ title: import_zod33.z.string(),
1551
+ description: import_zod33.z.string(),
1552
+ hiringOrganization: HiringOrgRef,
1553
+ jobLocation: import_zod33.z.union([JobLocationRef, import_zod33.z.array(JobLocationRef)]).optional(),
1554
+ datePosted: import_zod33.z.string(),
1555
+ // ISO 8601 date
1556
+ // Recommended by Google:
1557
+ validThrough: import_zod33.z.string().optional(),
1558
+ // ISO 8601 datetime
1559
+ employmentType: import_zod33.z.union([EmploymentType, import_zod33.z.array(EmploymentType)]).optional(),
1560
+ baseSalary: MonetaryAmountSchema.optional(),
1561
+ jobLocationType: import_zod33.z.string().optional(),
1562
+ // "TELECOMMUTE" for remote
1563
+ applicantLocationRequirements: import_zod33.z.union([
1564
+ import_zod33.z.object({ "@type": import_zod33.z.string(), name: import_zod33.z.string() }),
1565
+ import_zod33.z.array(import_zod33.z.object({ "@type": import_zod33.z.string(), name: import_zod33.z.string() }))
1566
+ ]).optional(),
1567
+ directApply: import_zod33.z.boolean().optional(),
1568
+ // Optional:
1569
+ identifier: import_zod33.z.object({
1570
+ "@type": import_zod33.z.literal("PropertyValue").default("PropertyValue"),
1571
+ name: import_zod33.z.string().optional(),
1572
+ value: import_zod33.z.union([import_zod33.z.string(), import_zod33.z.number()])
1573
+ }).optional(),
1574
+ experienceRequirements: import_zod33.z.union([
1575
+ import_zod33.z.string(),
1576
+ import_zod33.z.object({
1577
+ "@type": import_zod33.z.literal("OccupationalExperienceRequirements").default("OccupationalExperienceRequirements"),
1578
+ monthsOfExperience: import_zod33.z.number()
1579
+ })
1580
+ ]).optional(),
1581
+ educationRequirements: import_zod33.z.union([
1582
+ import_zod33.z.string(),
1583
+ import_zod33.z.object({
1584
+ "@type": import_zod33.z.literal("EducationalOccupationalCredential").default("EducationalOccupationalCredential"),
1585
+ credentialCategory: import_zod33.z.string()
1586
+ // e.g. "bachelor degree", "high school"
1587
+ })
1588
+ ]).optional(),
1589
+ experienceInPlaceOfEducation: import_zod33.z.boolean().optional(),
1590
+ qualifications: import_zod33.z.string().optional(),
1591
+ responsibilities: import_zod33.z.string().optional(),
1592
+ skills: import_zod33.z.union([import_zod33.z.string(), import_zod33.z.array(import_zod33.z.string())]).optional(),
1593
+ industry: import_zod33.z.string().optional(),
1594
+ occupationalCategory: import_zod33.z.string().optional(),
1595
+ // O*NET-SOC codes
1596
+ workHours: import_zod33.z.string().optional(),
1597
+ url: import_zod33.z.url().optional(),
1598
+ sameAs: import_zod33.z.url().optional()
1599
+ });
1600
+ var createJobPosting = makeFactory(JobPostingSchema);
1601
+
1602
+ // src/types/intangibles/QAPage.ts
1603
+ var import_zod34 = require("zod");
1604
+ var AnswerSchema = import_zod34.z.object({
1605
+ "@type": import_zod34.z.literal("Answer").default("Answer"),
1606
+ text: import_zod34.z.string(),
1607
+ dateCreated: import_zod34.z.string().optional(),
1608
+ // ISO 8601
1609
+ upvoteCount: import_zod34.z.number().int().nonnegative().optional(),
1610
+ url: import_zod34.z.url().optional(),
1611
+ author: PersonOrOrgRef.optional()
1612
+ });
1613
+ var QuestionSchema = import_zod34.z.object({
1614
+ "@type": import_zod34.z.literal("Question").default("Question"),
1615
+ name: import_zod34.z.string(),
1616
+ // The question text (also used as headline)
1617
+ text: import_zod34.z.string().optional(),
1618
+ // Extended question text
1619
+ acceptedAnswer: import_zod34.z.union([AnswerSchema, import_zod34.z.array(AnswerSchema)]).optional(),
1620
+ suggestedAnswer: import_zod34.z.union([AnswerSchema, import_zod34.z.array(AnswerSchema)]).optional(),
1621
+ answerCount: import_zod34.z.number().int().nonnegative().optional(),
1622
+ upvoteCount: import_zod34.z.number().int().nonnegative().optional(),
1623
+ author: PersonOrOrgRef.optional(),
1624
+ dateCreated: import_zod34.z.string().optional(),
1625
+ datePublished: import_zod34.z.string().optional(),
1626
+ url: import_zod34.z.url().optional()
1627
+ });
1628
+ var FAQPageSchema = WebPageSchema.extend({
1629
+ "@type": import_zod34.z.literal("FAQPage").default("FAQPage"),
1630
+ mainEntity: import_zod34.z.array(QuestionSchema)
1631
+ });
1632
+ var QAPageSchema = WebPageSchema.extend({
1633
+ "@type": import_zod34.z.literal("QAPage").default("QAPage"),
1634
+ mainEntity: QuestionSchema
1635
+ });
1636
+ var QuizSchema = CreativeWorkSchema.extend({
1637
+ "@type": import_zod34.z.literal("Quiz").default("Quiz"),
1638
+ name: import_zod34.z.string().optional(),
1639
+ educationalLevel: import_zod34.z.string().optional(),
1640
+ about: import_zod34.z.lazy(
1641
+ () => import_zod34.z.object({ "@type": import_zod34.z.string() }).catchall(import_zod34.z.unknown())
1642
+ ).optional(),
1643
+ hasPart: import_zod34.z.array(QuestionSchema).optional(),
1644
+ educationalAlignment: import_zod34.z.object({
1645
+ "@type": import_zod34.z.literal("AlignmentObject").default("AlignmentObject"),
1646
+ alignmentType: import_zod34.z.string().optional(),
1647
+ targetName: import_zod34.z.string().optional(),
1648
+ targetUrl: import_zod34.z.url().optional()
1649
+ }).optional()
1650
+ });
1651
+ var createFAQPage = makeFactory(FAQPageSchema);
1652
+ var createQAPage = makeFactory(QAPageSchema);
1653
+ var createQuiz = makeFactory(QuizSchema);
1654
+ var createQuestion = makeFactory(QuestionSchema);
1655
+
1656
+ // src/types/intangibles/DiscussionForum.ts
1657
+ var import_zod35 = require("zod");
1658
+ var DiscussionForumPostingSchema = CreativeWorkSchema.extend({
1659
+ "@type": import_zod35.z.literal("DiscussionForumPosting").default("DiscussionForumPosting"),
1660
+ // Required by Google:
1661
+ headline: import_zod35.z.string(),
1662
+ author: PersonOrOrgRef,
1663
+ // Recommended:
1664
+ text: import_zod35.z.string().optional(),
1665
+ datePublished: import_zod35.z.string().optional(),
1666
+ // ISO 8601
1667
+ url: import_zod35.z.url().optional(),
1668
+ comment: import_zod35.z.array(import_zod35.z.object({
1669
+ "@type": import_zod35.z.literal("Comment").default("Comment"),
1670
+ text: import_zod35.z.string(),
1671
+ author: PersonOrOrgRef.optional(),
1672
+ datePublished: import_zod35.z.string().optional(),
1673
+ upvoteCount: import_zod35.z.number().int().nonnegative().optional(),
1674
+ downvoteCount: import_zod35.z.number().int().nonnegative().optional(),
1675
+ url: import_zod35.z.url().optional()
1676
+ })).optional(),
1677
+ commentCount: import_zod35.z.number().int().nonnegative().optional(),
1678
+ upvoteCount: import_zod35.z.number().int().nonnegative().optional(),
1679
+ downvoteCount: import_zod35.z.number().int().nonnegative().optional(),
1680
+ image: ImageOrUrl.optional(),
1681
+ // For reposts:
1682
+ sharedContent: import_zod35.z.lazy(
1683
+ () => import_zod35.z.object({ "@type": import_zod35.z.string() }).catchall(import_zod35.z.unknown())
1684
+ ).optional(),
1685
+ interactionStatistic: import_zod35.z.array(import_zod35.z.object({
1686
+ "@type": import_zod35.z.literal("InteractionCounter").default("InteractionCounter"),
1687
+ interactionType: import_zod35.z.string(),
1688
+ userInteractionCount: import_zod35.z.number().int().nonnegative()
1689
+ })).optional()
1690
+ });
1691
+ var createDiscussionForumPosting = makeFactory(DiscussionForumPostingSchema);
1692
+
1693
+ // src/types/intangibles/ItemList.ts
1694
+ var import_zod36 = require("zod");
1695
+ var ListItemSchema = import_zod36.z.object({
1696
+ "@type": import_zod36.z.literal("ListItem").default("ListItem"),
1697
+ position: import_zod36.z.number().int().positive(),
1698
+ url: import_zod36.z.url().optional(),
1699
+ name: import_zod36.z.string().optional(),
1700
+ // item: the actual entity being listed (loose ref to any schema node)
1701
+ item: import_zod36.z.lazy(
1702
+ () => import_zod36.z.object({ "@type": import_zod36.z.string() }).catchall(import_zod36.z.unknown())
1703
+ ).optional()
1704
+ });
1705
+ var ItemListSchema = import_zod36.z.object({
1706
+ "@type": import_zod36.z.literal("ItemList").default("ItemList"),
1707
+ name: import_zod36.z.string().optional(),
1708
+ description: import_zod36.z.string().optional(),
1709
+ url: import_zod36.z.url().optional(),
1710
+ itemListOrder: import_zod36.z.enum(["Ascending", "Descending", "Unordered"]).transform((v) => `https://schema.org/ItemListOrder${v}`).optional(),
1711
+ numberOfItems: import_zod36.z.number().int().nonnegative().optional(),
1712
+ itemListElement: import_zod36.z.array(
1713
+ import_zod36.z.union([
1714
+ ListItemSchema,
1715
+ import_zod36.z.object({ "@type": import_zod36.z.string() }).catchall(import_zod36.z.unknown())
1716
+ ])
1717
+ )
1718
+ });
1719
+ var createItemList = makeFactory(ItemListSchema);
1720
+
1721
+ // src/types/intangibles/ProfilePage.ts
1722
+ var import_zod37 = require("zod");
1723
+ var ProfilePageSchema = WebPageSchema.extend({
1724
+ "@type": import_zod37.z.literal("ProfilePage").default("ProfilePage"),
1725
+ // mainEntity: the person or org this profile is about (loose ref to avoid circular imports)
1726
+ mainEntity: import_zod37.z.lazy(
1727
+ () => import_zod37.z.object({ "@type": import_zod37.z.string() }).catchall(import_zod37.z.unknown())
1728
+ ).optional(),
1729
+ // hasPart: content published by/about this profile subject
1730
+ hasPart: import_zod37.z.array(
1731
+ import_zod37.z.lazy(() => import_zod37.z.object({ "@type": import_zod37.z.string() }).catchall(import_zod37.z.unknown()))
1732
+ ).optional(),
1733
+ dateCreated: import_zod37.z.string().optional(),
1734
+ dateModified: import_zod37.z.string().optional()
1735
+ });
1736
+ var createProfilePage = makeFactory(ProfilePageSchema);
1737
+
1738
+ // src/types/lodging/VacationRental.ts
1739
+ var import_zod38 = require("zod");
1740
+ var BedTypeEnum = import_zod38.z.enum([
1741
+ "Single bed",
1742
+ "Double bed",
1743
+ "Bunk bed",
1744
+ "Queen bed",
1745
+ "King bed",
1746
+ "Sofa bed",
1747
+ "Cot",
1748
+ "Waterbed",
1749
+ "Toddler bed"
1750
+ ]);
1751
+ var BedDetailsSchema = import_zod38.z.object({
1752
+ "@type": import_zod38.z.literal("BedDetails").default("BedDetails"),
1753
+ numberOfBeds: import_zod38.z.number().int().positive().optional(),
1754
+ typeOfBed: import_zod38.z.union([BedTypeEnum, import_zod38.z.string()]).optional()
1755
+ });
1756
+ var LocationFeatureSpecificationSchema = import_zod38.z.object({
1757
+ "@type": import_zod38.z.literal("LocationFeatureSpecification").default("LocationFeatureSpecification"),
1758
+ name: import_zod38.z.string(),
1759
+ value: import_zod38.z.union([import_zod38.z.boolean(), import_zod38.z.string(), import_zod38.z.number()]).optional()
1760
+ });
1761
+ var AccommodationSchema = import_zod38.z.object({
1762
+ "@type": import_zod38.z.literal("Accommodation").default("Accommodation"),
1763
+ name: import_zod38.z.string().optional(),
1764
+ occupancy: import_zod38.z.object({
1765
+ "@type": import_zod38.z.literal("QuantitativeValue").default("QuantitativeValue"),
1766
+ value: import_zod38.z.number().int().positive().optional(),
1767
+ maxValue: import_zod38.z.number().int().positive().optional(),
1768
+ minValue: import_zod38.z.number().int().positive().optional()
1769
+ }).optional(),
1770
+ numberOfRooms: import_zod38.z.number().int().nonnegative().optional(),
1771
+ numberOfBedrooms: import_zod38.z.number().int().nonnegative().optional(),
1772
+ numberOfBathroomsTotal: import_zod38.z.number().int().nonnegative().optional(),
1773
+ floorSize: import_zod38.z.object({
1774
+ "@type": import_zod38.z.literal("QuantitativeValue").default("QuantitativeValue"),
1775
+ value: import_zod38.z.number(),
1776
+ /** "MTK" = sq metres, "FTK" = sq ft */
1777
+ unitCode: import_zod38.z.string().optional()
1778
+ }).optional(),
1779
+ bed: import_zod38.z.union([BedDetailsSchema, import_zod38.z.array(BedDetailsSchema)]).optional(),
1780
+ amenityFeature: import_zod38.z.union([
1781
+ LocationFeatureSpecificationSchema,
1782
+ import_zod38.z.array(LocationFeatureSpecificationSchema)
1783
+ ]).optional(),
1784
+ petsAllowed: import_zod38.z.union([import_zod38.z.boolean(), import_zod38.z.string()]).optional(),
1785
+ url: import_zod38.z.url().optional()
1786
+ });
1787
+ var VacationRentalSchema = LocalBusinessSchema.extend({
1788
+ "@type": import_zod38.z.literal("VacationRental").default("VacationRental"),
1789
+ // Required by Google:
1790
+ name: import_zod38.z.string(),
1791
+ // Recommended by Google:
1792
+ description: import_zod38.z.string().optional(),
1793
+ image: import_zod38.z.union([ImageOrUrl, import_zod38.z.array(ImageOrUrl)]).optional(),
1794
+ // Lodging-specific:
1795
+ petsAllowed: import_zod38.z.union([import_zod38.z.boolean(), import_zod38.z.string()]).optional(),
1796
+ checkinTime: import_zod38.z.string().optional(),
1797
+ // e.g. "15:00"
1798
+ checkoutTime: import_zod38.z.string().optional(),
1799
+ // e.g. "11:00"
1800
+ numberOfRooms: import_zod38.z.union([
1801
+ import_zod38.z.number(),
1802
+ import_zod38.z.object({
1803
+ "@type": import_zod38.z.literal("QuantitativeValue").default("QuantitativeValue"),
1804
+ value: import_zod38.z.number()
1805
+ })
1806
+ ]).optional(),
1807
+ occupancy: import_zod38.z.object({
1808
+ "@type": import_zod38.z.literal("QuantitativeValue").default("QuantitativeValue"),
1809
+ maxValue: import_zod38.z.number(),
1810
+ minValue: import_zod38.z.number().optional()
1811
+ }).optional(),
1812
+ starRating: import_zod38.z.object({
1813
+ "@type": import_zod38.z.literal("Rating").default("Rating"),
1814
+ ratingValue: import_zod38.z.number().min(0).max(5)
1815
+ }).optional(),
1816
+ offers: import_zod38.z.union([OfferSchema, import_zod38.z.array(OfferSchema)]).optional(),
1817
+ leaseLength: import_zod38.z.union([import_zod38.z.string(), import_zod38.z.object({
1818
+ "@type": import_zod38.z.literal("QuantitativeValue").default("QuantitativeValue"),
1819
+ value: import_zod38.z.number(),
1820
+ unitCode: import_zod38.z.string().optional()
1821
+ })]).optional(),
1822
+ floorSize: import_zod38.z.object({
1823
+ "@type": import_zod38.z.literal("QuantitativeValue").default("QuantitativeValue"),
1824
+ value: import_zod38.z.number(),
1825
+ unitCode: import_zod38.z.string().optional()
1826
+ // e.g. "MTK" (square meters), "FTK" (sq ft)
1827
+ }).optional(),
1828
+ numberOfBathroomsTotal: import_zod38.z.number().int().nonnegative().optional(),
1829
+ numberOfBedrooms: import_zod38.z.number().int().nonnegative().optional(),
1830
+ tourBookingPage: import_zod38.z.url().optional(),
1831
+ /** Accommodation unit(s) within the rental property — required by Google */
1832
+ containsPlace: import_zod38.z.union([AccommodationSchema, import_zod38.z.array(AccommodationSchema)]).optional()
1833
+ });
1834
+ var createVacationRental = makeFactory(VacationRentalSchema);
1835
+
1836
+ // src/core/registry.ts
1837
+ var REGISTRY = {
1838
+ // Things
1839
+ Person: PersonSchema,
1840
+ Organization: OrganizationSchema,
1841
+ Product: ProductSchema,
1842
+ ProductGroup: ProductGroupSchema,
1843
+ Event: EventSchema,
1844
+ Place: PlaceSchema,
1845
+ LocalBusiness: LocalBusinessSchema,
1846
+ Movie: MovieSchema,
1847
+ // Creative Works
1848
+ Book: BookSchema,
1849
+ Article: ArticleSchema,
1850
+ NewsArticle: NewsArticleSchema,
1851
+ BlogPosting: BlogPostingSchema,
1852
+ WebPage: WebPageSchema,
1853
+ WebSite: WebSiteSchema,
1854
+ Dataset: DatasetSchema,
1855
+ Recipe: RecipeSchema,
1856
+ Course: CourseSchema,
1857
+ SoftwareApplication: SoftwareApplicationSchema,
1858
+ MathSolver: MathSolverSchema,
1859
+ // Intangibles
1860
+ Language: LanguageSchema,
1861
+ PronounceableText: PronounceableTextSchema,
1862
+ JobPosting: JobPostingSchema,
1863
+ FAQPage: FAQPageSchema,
1864
+ QAPage: QAPageSchema,
1865
+ Quiz: QuizSchema,
1866
+ Question: QuestionSchema,
1867
+ DiscussionForumPosting: DiscussionForumPostingSchema,
1868
+ ItemList: ItemListSchema,
1869
+ ProfilePage: ProfilePageSchema,
1870
+ // Lodging
1871
+ VacationRental: VacationRentalSchema,
1872
+ // Shared types (useful in unified factory)
1873
+ ImageObject: ImageObjectSchema,
1874
+ Offer: OfferSchema,
1875
+ Review: ReviewSchema,
1876
+ VideoObject: VideoObjectSchema
1877
+ };
1878
+ function schema(type, data) {
1879
+ const zodSchema = REGISTRY[type];
1880
+ const parsed = zodSchema.parse(data);
1881
+ return new SchemaNode(zodSchema, parsed);
1882
+ }
1883
+
1884
+ // src/core/graph.ts
1885
+ var SchemaGraph = class {
1886
+ constructor() {
1887
+ this.items = [];
1888
+ }
1889
+ /**
1890
+ * Add a SchemaNode or plain object to the graph.
1891
+ * Returns `this` for fluent chaining.
1892
+ */
1893
+ add(node) {
1894
+ if (node instanceof SchemaNode) {
1895
+ this.items.push(node.toObject());
1896
+ } else {
1897
+ this.items.push(node);
1898
+ }
1899
+ return this;
1900
+ }
1901
+ /** Returns the raw array of graph items (without @context). */
1902
+ toArray() {
1903
+ return [...this.items];
1904
+ }
1905
+ /** Returns the full JSON-LD object with @context and @graph. */
1906
+ toJsonLd() {
1907
+ return {
1908
+ "@context": "https://schema.org",
1909
+ "@graph": this.items
1910
+ };
1911
+ }
1912
+ /** Returns a <script type="application/ld+json"> tag string. */
1913
+ toScript() {
1914
+ return `<script type="application/ld+json">
1915
+ ${JSON.stringify(this.toJsonLd(), null, 2)}
1916
+ </script>`;
1917
+ }
1918
+ /** Returns prettified JSON string. */
1919
+ toString() {
1920
+ return JSON.stringify(this.toJsonLd(), null, 2);
1921
+ }
1922
+ };
1923
+ function createGraph(nodes) {
1924
+ const graph = new SchemaGraph();
1925
+ for (const node of nodes) {
1926
+ graph.add(node);
1927
+ }
1928
+ return graph;
1929
+ }
1930
+
1931
+ // src/helpers/breadcrumb.ts
1932
+ var import_zod39 = require("zod");
1933
+ var BreadcrumbListSchema = import_zod39.z.object({
1934
+ "@type": import_zod39.z.literal("BreadcrumbList").default("BreadcrumbList"),
1935
+ itemListElement: import_zod39.z.array(
1936
+ import_zod39.z.object({
1937
+ "@type": import_zod39.z.literal("ListItem").default("ListItem"),
1938
+ position: import_zod39.z.number().int().positive(),
1939
+ name: import_zod39.z.string(),
1940
+ item: import_zod39.z.url().optional()
1941
+ })
1942
+ )
1943
+ });
1944
+ function createBreadcrumbList(items) {
1945
+ const data = BreadcrumbListSchema.parse({
1946
+ itemListElement: items.map((item, index) => ({
1947
+ "@type": "ListItem",
1948
+ position: index + 1,
1949
+ name: item.name,
1950
+ ...item.url ? { item: item.url } : {}
1951
+ }))
1952
+ });
1953
+ return new SchemaNode(BreadcrumbListSchema, data);
1954
+ }
1955
+
1956
+ // src/helpers/faq.ts
1957
+ function createFAQPage2(items) {
1958
+ const data = FAQPageSchema.parse({
1959
+ mainEntity: items.map(({ question, answer }) => ({
1960
+ "@type": "Question",
1961
+ name: question,
1962
+ acceptedAnswer: {
1963
+ "@type": "Answer",
1964
+ text: answer
1965
+ }
1966
+ }))
1967
+ });
1968
+ return new SchemaNode(FAQPageSchema, data);
1969
+ }
1970
+
1971
+ // src/helpers/itemlist.ts
1972
+ function createCarousel(items) {
1973
+ const elements = items.map((item, index) => {
1974
+ if (item instanceof SchemaNode) {
1975
+ return {
1976
+ "@type": "ListItem",
1977
+ position: index + 1,
1978
+ item: item.toObject()
1979
+ };
1980
+ }
1981
+ return {
1982
+ "@type": "ListItem",
1983
+ position: index + 1,
1984
+ url: item.url,
1985
+ ...item.name ? { name: item.name } : {}
1986
+ };
1987
+ });
1988
+ const data = ItemListSchema.parse({ itemListElement: elements });
1989
+ return new SchemaNode(ItemListSchema, data);
1990
+ }
1991
+
1992
+ // src/helpers/paywalled.ts
1993
+ function createPaywalledArticle(data, options) {
1994
+ return createArticle({
1995
+ ...data,
1996
+ isAccessibleForFree: false,
1997
+ hasPart: [{
1998
+ "@type": "WebPageElement",
1999
+ isAccessibleForFree: false,
2000
+ cssSelector: options.cssSelector
2001
+ }]
2002
+ });
2003
+ }
2004
+ function createPaywalledWebPage(data, options) {
2005
+ return createWebPage({
2006
+ ...data,
2007
+ isAccessibleForFree: false,
2008
+ hasPart: [{
2009
+ "@type": "WebPageElement",
2010
+ isAccessibleForFree: false,
2011
+ cssSelector: options.cssSelector
2012
+ }]
2013
+ });
2014
+ }
2015
+ // Annotate the CommonJS export names for ESM import in node:
2016
+ 0 && (module.exports = {
2017
+ AccommodationSchema,
2018
+ AggregateOfferSchema,
2019
+ AggregateRatingSchema,
2020
+ AnswerSchema,
2021
+ ApplicationCategory,
2022
+ ArticleSchema,
2023
+ BedDetailsSchema,
2024
+ BedTypeEnum,
2025
+ BlogPostingSchema,
2026
+ BookEditionSchema,
2027
+ BookFormatType,
2028
+ BookSchema,
2029
+ BorrowActionSchema,
2030
+ BroadcastEventSchema,
2031
+ CertificationSchema,
2032
+ ClipSchema,
2033
+ ContactPointSchema,
2034
+ CourseInstanceSchema,
2035
+ CourseSchema,
2036
+ CreativeWorkSchema,
2037
+ DatasetSchema,
2038
+ DayOfWeek,
2039
+ DefinedRegionSchema,
2040
+ DiscussionForumPostingSchema,
2041
+ EmployerAggregateRatingSchema,
2042
+ EmploymentType,
2043
+ EventAttendanceMode,
2044
+ EventSchema,
2045
+ EventStatusType,
2046
+ FAQPageSchema,
2047
+ GeoCoordinatesSchema,
2048
+ HowToSectionSchema,
2049
+ HowToStepSchema,
2050
+ ImageObjectSchema,
2051
+ ImageOrUrl,
2052
+ ItemAvailability,
2053
+ ItemListSchema,
2054
+ JobPostingSchema,
2055
+ LanguageSchema,
2056
+ ListItemSchema,
2057
+ LocalBusinessSchema,
2058
+ MathSolverSchema,
2059
+ MerchantReturnPolicySchema,
2060
+ MonetaryAmountSchema,
2061
+ MovieSchema,
2062
+ NewsArticleSchema,
2063
+ NutritionInformationSchema,
2064
+ OfferSchema,
2065
+ OfferShippingDetailsSchema,
2066
+ OpeningHoursSpecificationSchema,
2067
+ OrganizationSchema,
2068
+ PersonOrOrgRef,
2069
+ PersonSchema,
2070
+ PlaceSchema,
2071
+ PostalAddressSchema,
2072
+ PriceSpecificationSchema,
2073
+ ProductGroupSchema,
2074
+ ProductSchema,
2075
+ ProfilePageSchema,
2076
+ PronounceableTextSchema,
2077
+ PropertyValueSchema,
2078
+ QAPageSchema,
2079
+ QuestionSchema,
2080
+ QuizSchema,
2081
+ RatingSchema,
2082
+ ReadActionSchema,
2083
+ RecipeSchema,
2084
+ ReviewSchema,
2085
+ SchemaGraph,
2086
+ SchemaNode,
2087
+ ShippingDeliveryTimeSchema,
2088
+ SoftwareApplicationSchema,
2089
+ SolveMathActionSchema,
2090
+ ThingSchema,
2091
+ ThreeDModelSchema,
2092
+ VacationRentalSchema,
2093
+ VideoObjectSchema,
2094
+ WebPageSchema,
2095
+ WebSiteSchema,
2096
+ createArticle,
2097
+ createBlogPosting,
2098
+ createBook,
2099
+ createBreadcrumbList,
2100
+ createCarousel,
2101
+ createCorporation,
2102
+ createCourse,
2103
+ createDataset,
2104
+ createDiscussionForumPosting,
2105
+ createEvent,
2106
+ createFAQPage,
2107
+ createGraph,
2108
+ createHotel,
2109
+ createImageObject,
2110
+ createItemList,
2111
+ createJobPosting,
2112
+ createLanguage,
2113
+ createLocalBusiness,
2114
+ createMathSolver,
2115
+ createMobileApplication,
2116
+ createMovie,
2117
+ createNGO,
2118
+ createNewsArticle,
2119
+ createOffer,
2120
+ createOnlineBusiness,
2121
+ createOnlineStore,
2122
+ createOrganization,
2123
+ createPaywalledArticle,
2124
+ createPaywalledWebPage,
2125
+ createPerson,
2126
+ createPlace,
2127
+ createProduct,
2128
+ createProductGroup,
2129
+ createProfilePage,
2130
+ createPronounceableText,
2131
+ createQAPage,
2132
+ createQuestion,
2133
+ createQuiz,
2134
+ createRecipe,
2135
+ createRestaurant,
2136
+ createSoftwareApplication,
2137
+ createVacationRental,
2138
+ createVideoObject,
2139
+ createWebApplication,
2140
+ createWebPage,
2141
+ createWebSite,
2142
+ extendThing,
2143
+ makeFactory,
2144
+ schema
2145
+ });